﻿:root{--bg:#0a0e1a;--panel:#0f1525;--panel-border:#1a2340;--text:#f1f5f9;--text-secondary:#94a3b8;--muted:#6b7c94;--teal:#0f8578;--teal-dim:rgba(20,184,166,0.15);--blue:#3b82f6;--blue-dim:rgba(59,130,246,0.12);--purple:#8b5cf6;--purple-dim:rgba(145,71,181,0.12);--berry-dim:rgba(168,51,106,0.12);--red:#ef4444;--red-dim:rgba(239,68,68,0.12);--amber:#f59e0b;--amber-dim:rgba(245,158,11,0.12);--green:#10b981;--radius:10px;--shadow:0 1px 4px rgba(0,0,0,.3);--radius-sm:6px;--circadian-filter:none;--soft-warn:#b8860b;--soft-warn-dim:rgba(184,134,11,0.12);--system-notice:#8b5cf6;--system-notice-dim:rgba(139,92,246,0.12);--undo-bg:#1e293b;--undo-text:#e2e8f0;--prog-highlight:rgba(20,184,166,0.08);--team-gold:#fbbf24;--team-gold-dim:rgba(251,191,36,0.15);--complete-glow:0 0 20px rgba(20,184,166,0.3);--green-dim:rgba(16,185,129,0.12);--gray-dim:rgba(138,146,155,0.12);--radius-lg:16px;--radius-xs:3px;--sp-1:4px;--sp-2:8px;--sp-3:12px;--sp-4:16px;--sp-5:24px;--sp-6:32px;--z-sticky:10;--z-dropdown:20;--z-sidebar:30;--z-modal:40;--z-toast:50;--z-critical:100000;--hairline:rgba(241,245,249,0.06);--shift-buero:#0369a1;--shift-sitzung:#7e22ce}
/* Night-shift circadian overrides: reduced blue, warmer tones */
.nightshift{--circadian-filter:sepia(0.3) hue-rotate(-10deg) brightness(0.85);--blue:#6366f1;--blue-dim:rgba(99,102,241,0.10);--teal:#1b8477;--teal-dim:rgba(45,212,191,0.10);--gray-dim:rgba(138,146,155,0.10);--text:#d4d4d8;--text-secondary:#a1a1aa;--muted:#7a7a83;--panel-border:#27272a}.light{--bg:#f0f4f8;--panel:#ffffff;--panel-border:#dce4ed;--text:#0f172a;--text-secondary:#475569;--muted:#5d718d;--teal:#0c857b;--teal-dim:rgba(13,148,136,0.1);--blue:#2563eb;--blue-dim:rgba(37,99,235,0.08);--red:#dc2626;--red-dim:rgba(220,38,38,0.08);--amber:#d97706;--amber-dim:rgba(217,119,6,0.08);--gray-dim:rgba(138,146,155,0.08);--green:#059669;--shadow:0 1px 3px rgba(0,0,0,.08);--undo-bg:#ffffff;--undo-text:#1e293b}.preset-rose{--bg:#1a0f14;--panel:#1f1519;--panel-border:#2e1a24;--text:#fce7f3;--text-secondary:#f9a8d4;--muted:#a86482;--teal:#d946ef;--teal-dim:rgba(217,70,239,0.15);--blue:#e879f9;--blue-dim:rgba(232,121,249,0.12);--purple:#c084fc;--red:#fb7185;--red-dim:rgba(251,113,133,0.12);--amber:#fbbf24;--amber-dim:rgba(251,191,36,0.12);--gray-dim:rgba(138,146,155,0.12);--green:#f472b6;--shadow:0 1px 4px rgba(0,0,0,.4)}.preset-rose.light{--bg:#fdf2f8;--panel:#ffffff;--panel-border:#fbcfe8;--text:#831843;--text-secondary:#9d174d;--muted:#d32371;--teal:#c026d3;--teal-dim:rgba(192,38,211,0.1);--blue:#a21caf;--blue-dim:rgba(162,28,175,0.08);--red:#be123c;--red-dim:rgba(190,18,60,0.08);--amber:#b45309;--amber-dim:rgba(180,83,9,0.08);--gray-dim:rgba(138,146,155,0.08);--green:#be185d;--shadow:0 1px 3px rgba(0,0,0,.06)}*{margin:0;padding:0;box-sizing:border-box}body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,sans-serif;background:var(--bg);color:var(--text);min-height:100vh;transition:background .3s,color .3s;font-size:13px;line-height:1.5}::-webkit-scrollbar{width:4px;height:4px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--panel-border);border-radius:2px}.btn{display:inline-flex;align-items:center;gap:6px;padding:10px 24px;border-radius:24px;font-size:12px;font-weight:700;cursor:pointer;border:none;text-transform:uppercase;letter-spacing:.04em;transition:all .2s;text-decoration:none}.btn-primary{background:var(--teal);color:#fff}.btn-primary:hover{transform:translateY(-1px);box-shadow:0 4px 20px rgba(216,50,0,.3)}.btn-outline{background:transparent;border:1px solid var(--panel-border);color:var(--text)}.btn-outline:hover{border-color:var(--teal);color:var(--teal)}.btn-small{padding:6px 14px;font-size:var(--fs-12)}.btn-danger{background:var(--red);color:#fff}.btn-danger:hover{transform:translateY(-1px);box-shadow:0 4px 20px rgba(239,68,68,.3)}.btn-amber{background:var(--amber);color:#fff}.btn-amber:hover{transform:translateY(-1px);box-shadow:0 4px 20px rgba(245,158,11,.3)}.feature-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:16px;max-width:1000px;margin:0 auto}.feature-card{background:var(--panel);border:1px solid var(--panel-border);border-radius:var(--radius);padding:20px;text-align:center;transition:all .2s}.feature-card:hover{transform:translateY(-2px);border-color:var(--teal);box-shadow:0 4px 16px rgba(20,184,166,.1)}.feature-card .icon{font-size:28px;margin-bottom:10px;display:block}.feature-card h3{font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;margin-bottom:6px;color:var(--teal)}.feature-card p{font-size:var(--fs-12);color:var(--text-secondary);line-height:1.6}.demo-section{background:var(--panel);border-top:1px solid var(--panel-border);border-bottom:1px solid var(--panel-border);padding:60px 24px}.demo-frame{max-width:800px;margin:0 auto;background:var(--bg);border-radius:12px;border:1px solid var(--panel-border);overflow:hidden;box-shadow:0 8px 40px rgba(0,0,0,.3)}.demo-frame-top{display:flex;gap:6px;padding:10px 14px;background:var(--panel);border-bottom:1px solid var(--panel-border)}.demo-dot{width:10px;height:10px;border-radius:50%}.demo-dot:nth-child(1){background:#ef4444}.demo-dot:nth-child(2){background:#f59e0b}.demo-dot:nth-child(3){background:#10b981}.demo-screen{padding:0;display:block;min-height:280px}#productVideo{width:100%;height:auto;display:block;border-radius:0;background:#0a0e1a}.canvas-controls{display:flex;justify-content:center;gap:8px;padding:8px;background:var(--panel)}.stats-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:16px;max-width:800px;margin:0 auto}.stat-card{text-align:center;padding:24px 16px;background:var(--panel);border-radius:var(--radius);border:1px solid var(--panel-border)}.stat-card .number{font-size:28px;font-weight:900;color:var(--teal)}.stat-card .desc{font-size:var(--fs-12);color:var(--muted);margin-top:4px;text-transform:uppercase;letter-spacing:.04em}#appContent{display:none;width:100%}#appContent.active{display:block}.topbar{position:sticky;top:0;z-index:100;background:var(--panel);border-bottom:1px solid var(--panel-border);padding:10px 16px;display:flex;align-items:center;justify-content:space-between;gap:12px;backdrop-filter:blur(12px)}.topbar-left{display:flex;align-items:center;gap:12px}.topbar-logo{font-size:14px;font-weight:900;letter-spacing:-.02em}.topbar-logo span{color:var(--teal)}.topbar-center{display:flex;flex-wrap:wrap;gap:4px;overflow-x:auto;flex:1;justify-content:center}.topbar-center .tab-btn{padding:6px 14px;border-radius:20px;font-size:var(--fs-12);font-weight:700;text-transform:uppercase;letter-spacing:.04em;border:1px solid transparent;background:transparent;color:var(--muted);cursor:pointer;transition:all .15s;white-space:nowrap}.topbar-center .tab-btn:hover{color:var(--text);border-color:var(--panel-border)}.topbar-center .tab-btn.active{background:var(--teal-dim);border-color:rgba(20,184,166,.3);color:var(--teal)}.topbar-right{display:flex;align-items:center;gap:8px}.topbar-right .user-badge{font-size:var(--fs-12);padding:4px 10px;border-radius:12px;background:var(--teal-dim);color:var(--teal);font-weight:600;white-space:nowrap}.topbar-right .icon-btn{background:transparent;border:none;color:var(--muted);cursor:pointer;padding:4px;border-radius:6px;font-size:14px;transition:all .15s;width:28px;height:28px;display:flex;align-items:center;justify-content:center}.topbar-right .icon-btn:hover{background:var(--teal-dim);color:var(--teal)}.tab-content{display:none;padding:16px;max-width:1200px;margin:0 auto}.tab-content.active{display:block}.dashboard-grid{display:grid;grid-template-columns:2fr 1fr;gap:14px}@media(max-width:800px){.dashboard-grid{grid-template-columns:1fr}}.card{background:var(--panel);border:1px solid var(--panel-border);border-radius:var(--radius);box-shadow:var(--shadow);overflow:hidden}.card-head{padding:10px 14px;border-bottom:1px solid var(--panel-border);display:flex;justify-content:space-between;align-items:center}.card-title{font-size:var(--fs-12);font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--text)}.card-body{padding:14px}.kpi-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:10px;margin-bottom:14px}.kpi-item{background:var(--bg);border-radius:var(--radius-sm);padding:10px 12px;border:1px solid var(--panel-border)}.kpi-item .kpi-value{font-size:18px;font-weight:900;margin-top:2px}.kpi-item .kpi-value.teal{color:var(--teal)}.kpi-item .kpi-value.blue{color:var(--blue)}.kpi-item .kpi-value.red{color:var(--red)}.kpi-item .kpi-value.amber{color:var(--amber)}.shift-calendar{display:grid;grid-template-columns:repeat(7,1fr);gap:4px;margin-top:10px}.cal-day{background:var(--bg);border-radius:var(--radius-sm);padding:8px;text-align:center;border:1px solid var(--panel-border);cursor:pointer;transition:all .15s;min-height:60px;position:relative}.cal-day:hover{border-color:var(--teal)}.cal-day .day-num{font-size:16px;font-weight:800;margin:2px 0}.cal-day .day-status.ok{background:var(--teal-dim);color:var(--teal)}.cal-day .day-status.warn{background:var(--amber-dim);color:var(--amber)}.cal-day .day-status.critical{background:var(--red-dim);color:var(--red)}.cal-day.today{border-color:var(--teal);box-shadow:0 0 0 1px var(--teal)}.cal-day .cal-employees{display:flex;flex-wrap:wrap;gap:2px;justify-content:center;margin-top:4px}.cal-day .cal-vacation{font-size:12px;margin-top:2px}.bounty-list{display:flex;flex-direction:column;gap:6px}.bounty-item{display:flex;align-items:center;justify-content:space-between;padding:10px 12px;background:var(--bg);border-radius:var(--radius-sm);border:1px solid var(--panel-border);transition:all .15s}.bounty-item:hover{border-color:var(--teal)}.bounty-item .bounty-info{flex:1}.bounty-item .bounty-info .title{font-size:var(--fs-12);font-weight:600}.bounty-item .bounty-info .meta{font-size:var(--fs-12);color:var(--muted);margin-top:2px}.bounty-item .bounty-bonus{font-size:13px;font-weight:800;color:var(--teal)}.bounty-item .bounty-action{padding:4px 12px;border-radius:12px;font-size:var(--fs-12);font-weight:700;border:none;cursor:pointer;background:var(--teal);color:#fff;transition:all .15s}.bounty-item .bounty-action:hover{transform:scale(1.05)}.intern-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px}@media(max-width:800px){.intern-grid{grid-template-columns:1fr}}.osint-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px}@media(max-width:800px){.osint-grid{grid-template-columns:1fr}}.osint-status-bar{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:12px}.osint-status-item{display:flex;align-items:center;gap:6px;font-size:var(--fs-12);color:var(--text-secondary)}.osint-status-dot{width:8px;height:8px;border-radius:50%}.osint-status-dot.idle{background:var(--muted)}.osint-status-dot.active{background:var(--teal);animation:pulse 2s infinite}.osint-status-dot.error{background:var(--red)}.signal-list{max-height:400px;overflow-y:auto;display:flex;flex-direction:column;gap:4px}.signal-item{padding:8px 10px;background:var(--bg);border-radius:var(--radius-sm);border-left:2px solid var(--teal);font-size:var(--fs-12)}.signal-item .signal-title{font-weight:600;color:var(--text);margin-bottom:2px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.signal-item .signal-meta .tag{padding:1px 6px;border-radius:4px;background:var(--teal-dim);color:var(--teal)}.signal-item .severity-low{border-left-color:var(--teal)}.signal-item .severity-medium{border-left-color:var(--amber)}.signal-item .severity-high{border-left-color:var(--red)}.signal-item .severity-critical{border-left-color:var(--red);background:var(--red-dim)}.disease-alert{display:flex;align-items:center;gap:12px;padding:12px 16px;border-radius:var(--radius-sm);margin-bottom:10px;border:1px solid}.disease-alert.info{background:var(--teal-dim);border-color:rgba(20,184,166,.2)}.disease-alert.warning{background:var(--amber-dim);border-color:rgba(245,158,11,.2)}.disease-alert.critical{background:var(--red-dim);border-color:rgba(239,68,68,.2)}.disease-alert .alert-icon{font-size:24px}.disease-alert .alert-text{flex:1}.disease-alert .alert-text .alert-title{font-weight:700;font-size:var(--fs-12)}.disease-alert .alert-text .alert-desc{font-size:var(--fs-12);color:var(--text-secondary);margin-top:2px}.staff-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:10px}.staff-card{background:var(--panel);border:1px solid var(--panel-border);border-radius:var(--radius);padding:14px;transition:all .15s;position:relative;cursor:pointer}.staff-card:hover{border-color:var(--teal);transform:translateY(-1px)}.staff-card .staff-header{display:flex;align-items:center;gap:10px;margin-bottom:8px}.staff-card .staff-avatar{width:36px;height:36px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:13px;font-weight:800;color:#fff;flex-shrink:0}.staff-card .staff-name-block{flex:1;min-width:0}.staff-card .staff-name-block .name{font-size:12px;font-weight:700}.staff-card .staff-name-block .vorname{font-size:var(--fs-12);color:var(--text-secondary)}.staff-card .staff-role{font-size:var(--fs-12);color:var(--muted);margin-bottom:6px;text-transform:uppercase;letter-spacing:.03em}.staff-card .staff-meta{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:6px}.staff-card .staff-meta span{padding:2px 8px;border-radius:10px;font-size:var(--fs-12);font-weight:600}.staff-card .staff-status-aktiv{background:var(--teal-dim);color:var(--teal)}.staff-card .staff-status-inaktiv{background:var(--amber-dim);color:var(--amber)}.staff-card .staff-status-krank{background:var(--red-dim);color:var(--red)}.staff-card .staff-pct{font-size:var(--fs-12);font-weight:600;color:var(--text-secondary)}.staff-card .staff-actions{display:flex;gap:4px;margin-top:8px;justify-content:flex-end}.staff-card .staff-actions button{padding:4px 10px;border-radius:10px;font-size:var(--fs-12);font-weight:700;border:none;cursor:pointer;transition:all .15s}.staff-card .staff-actions .edit-btn{background:var(--blue-dim);color:var(--blue)}.staff-card .staff-actions .edit-btn:hover{background:var(--blue);color:#fff}.staff-card .staff-actions .del-btn{background:var(--red-dim);color:var(--red)}.staff-card .staff-actions .del-btn:hover{background:var(--red);color:#fff}.staff-card .staff-details{display:none;margin-top:8px;padding-top:8px;border-top:1px solid var(--panel-border);font-size:var(--fs-12);color:var(--text-secondary)}.staff-card .staff-details.open{display:block}.staff-card .staff-details .detail-row{display:flex;justify-content:space-between;padding:3px 0;border-bottom:1px solid var(--panel-border)}.staff-card .staff-details .detail-row:last-child{border-bottom:none}.staff-card .staff-details .detail-label{color:var(--muted)}.staff-card .staff-details .detail-value{font-weight:600;color:var(--text);text-align:right;max-width:60%;word-break:break-word}.staff-card .staff-details .detail-section-title{font-size:var(--fs-12);font-weight:700;color:var(--teal);text-transform:uppercase;letter-spacing:.04em;margin-top:8px;padding-top:6px;border-top:1px solid var(--panel-border);margin-bottom:4px}.team-badge{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:10px;font-size:var(--fs-12);font-weight:700}.modal-overlay{display:none;position:fixed;inset:0;z-index:300;background:rgba(0,0,0,.7);backdrop-filter:blur(8px);align-items:center;justify-content:center;padding:20px}.modal-overlay.active{display:flex}.modal-box{background:var(--panel);border:1px solid var(--panel-border);border-radius:16px;padding:24px;max-width:560px;width:100%;max-height:80vh;overflow-y:auto;box-shadow:0 20px 60px rgba(0,0,0,.4);animation:fadeScale .25s ease-out;position:relative}.modal-box.wide{max-width:700px}.modal-box h3{font-size:15px;margin-bottom:16px;padding-right:36px}.modal-box .modal-close{position:absolute;top:14px;right:14px;background:transparent;border:none;color:var(--muted);cursor:pointer;font-size:18px;padding:4px;line-height:1;border-radius:4px;transition:color .15s;display:flex;align-items:center;justify-content:center}.modal-box .modal-close:hover{color:var(--text);background:var(--panel-border)}.form-group{margin-bottom:12px}.form-group label{display:block;font-size:var(--fs-12);font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);margin-bottom:4px}.form-group input,.form-group select,.form-group textarea{width:100%;padding:9px 11px;border-radius:var(--radius-sm);border:1px solid var(--panel-border);background:var(--bg);color:var(--text);font-size:12px;outline:none;transition:border .15s;font-family:inherit}.form-group input:focus,.form-group select:focus,.form-group textarea:focus{border-color:var(--teal)}.form-group textarea{min-height:60px;resize:vertical}.form-group .form-row{display:grid;grid-template-columns:1fr 1fr;gap:10px}.form-group input[type="color"]{height:36px;padding:2px;cursor:pointer}.form-group input[type="file"]{padding:6px;font-size:var(--fs-12)}.messages-layout{display:grid;grid-template-columns:280px 1fr;gap:14px;height:calc(100vh - 140px);min-height:400px}@media(max-width:800px){.messages-layout{grid-template-columns:1fr;height:auto}}.conversation-list{background:var(--panel);border:1px solid var(--panel-border);border-radius:var(--radius);overflow:hidden;display:flex;flex-direction:column}.conversation-list .conv-head{padding:10px 14px;border-bottom:1px solid var(--panel-border);font-size:var(--fs-12);font-weight:700;text-transform:uppercase;letter-spacing:.05em}.conversation-list .conv-search{padding:8px;border-bottom:1px solid var(--panel-border)}.conversation-list .conv-search input{width:100%;padding:6px 10px;border-radius:var(--radius-sm);border:1px solid var(--panel-border);background:var(--bg);color:var(--text);font-size:var(--fs-12);outline:none}.conversation-list .conv-search input:focus{border-color:var(--teal)}.conv-item{padding:10px 14px;border-bottom:1px solid var(--panel-border);cursor:pointer;transition:all .1s;display:flex;align-items:center;gap:8px}.conv-item:hover{background:var(--teal-dim)}.conv-item.active{background:var(--teal-dim);border-left:2px solid var(--teal)}.conv-item .conv-avatar{width:28px;height:28px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:var(--fs-12);font-weight:700;color:#fff;flex-shrink:0}.conv-item .conv-info{flex:1;min-width:0}.conv-item .conv-info .conv-name{font-size:var(--fs-12);font-weight:600}.conv-item .conv-info .conv-preview{font-size:var(--fs-12);color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.conv-item .conv-badge{width:18px;height:18px;border-radius:50%;background:var(--teal);color:#fff;font-size:var(--fs-12);font-weight:700;display:flex;align-items:center;justify-content:center;flex-shrink:0}.chat-view{background:var(--panel);border:1px solid var(--panel-border);border-radius:var(--radius);display:flex;flex-direction:column;overflow:hidden}.chat-view .chat-head{padding:10px 14px;border-bottom:1px solid var(--panel-border);font-size:var(--fs-12);font-weight:700}.chat-view .chat-messages{flex:1;overflow-y:auto;padding:14px;display:flex;flex-direction:column;gap:8px}.chat-msg{max-width:80%;padding:8px 12px;border-radius:12px;font-size:var(--fs-12);line-height:1.5;position:relative}.chat-msg.sent{background:var(--teal);color:#fff;align-self:flex-end;border-bottom-right-radius:4px}.chat-msg.received{background:var(--bg);color:var(--text);align-self:flex-start;border:1px solid var(--panel-border);border-bottom-left-radius:4px}.chat-msg .msg-meta{font-size:var(--fs-12);opacity:.6;margin-top:4px;display:flex;justify-content:space-between;gap:8px}.chat-msg .msg-attachment{display:block;margin-top:6px;padding:4px 8px;border-radius:6px;background:rgba(255,255,255,.1);font-size:var(--fs-12);text-decoration:none;color:inherit}.chat-view .chat-input{display:flex;gap:8px;padding:10px 14px;border-top:1px solid var(--panel-border);flex-wrap:wrap}.chat-view .chat-input .recipient-panel{width:100%;display:flex;flex-wrap:wrap;gap:4px;padding:6px 8px;background:var(--bg);border-radius:var(--radius-sm);border:1px solid var(--panel-border);margin-bottom:4px}.chat-view .chat-input .recipient-panel .rec-label{font-size:var(--fs-12);font-weight:600;color:var(--muted);margin-right:6px;display:flex;align-items:center}.chat-view .chat-input .recipient-panel .rec-chip{display:inline-flex;align-items:center;gap:3px;padding:2px 8px;border-radius:10px;font-size:var(--fs-12);font-weight:600;cursor:pointer;border:1px solid var(--panel-border);background:var(--panel);transition:all .1s}.chat-view .chat-input .recipient-panel .rec-chip.selected{background:var(--teal-dim);border-color:var(--teal);color:var(--teal)}.chat-view .chat-input .recipient-panel .rec-count{font-size:var(--fs-12);color:var(--muted);margin-left:auto;display:flex;align-items:center}.chat-view .chat-input .recipient-panel .rec-dot{width:8px;height:8px;border-radius:50%;display:inline-block;margin-right:2px}.chat-view .chat-input select{flex:0 0 auto;padding:8px;border-radius:var(--radius-sm);border:1px solid var(--panel-border);background:var(--bg);color:var(--text);font-size:var(--fs-12);outline:none;max-width:120px}.chat-view .chat-input input[type="text"]{flex:1;padding:8px 12px;border-radius:var(--radius-sm);border:1px solid var(--panel-border);background:var(--bg);color:var(--text);font-size:var(--fs-12);outline:none;min-width:80px}.chat-view .chat-input input[type="text"]:focus{border-color:var(--teal)}.chat-view .chat-input .send-btn{padding:8px 16px;border-radius:var(--radius-sm);background:var(--teal);color:#fff;font-size:var(--fs-12);font-weight:700;border:none;cursor:pointer}.job-portal-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:10px;margin-bottom:16px}.portal-card{background:var(--bg);border:1px solid var(--panel-border);border-radius:var(--radius-sm);padding:12px}.portal-card .portal-name{font-size:var(--fs-12);font-weight:700;margin-bottom:8px;color:var(--teal)}.portal-card .portal-field{margin-bottom:6px}.portal-card .portal-field input{width:100%;padding:5px 8px;border-radius:4px;border:1px solid var(--panel-border);background:var(--panel);color:var(--text);font-size:var(--fs-12);outline:none}.portal-card .portal-field input:focus{border-color:var(--teal)}.portal-card .portal-checkboxes{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:8px}.portal-card .portal-checkboxes input[type="checkbox"]{width:auto}.job-list{display:flex;flex-direction:column;gap:6px;margin-top:12px}.job-item{display:flex;align-items:center;justify-content:space-between;padding:10px 12px;background:var(--bg);border-radius:var(--radius-sm);border:1px solid var(--panel-border)}.job-item .job-info{flex:1}.job-item .job-info .job-title{font-size:var(--fs-12);font-weight:600}.job-item .job-status.draft{background:var(--amber-dim);color:var(--amber)}.job-item .job-status.published{background:var(--teal-dim);color:var(--teal)}.job-item .job-actions{display:flex;gap:4px;margin-left:8px}#loginOverlay{display:flex;position:fixed;inset:0;z-index:200;background:rgba(0,0,0,.7);backdrop-filter:blur(8px);align-items:center;justify-content:center;overflow-y:auto;padding:24px 12px}#loginOverlay.hidden{display:none}.hidden{display:none!important}[hidden]{display:none!important}.login-box{background:var(--panel);border:1px solid var(--panel-border);border-radius:16px;padding:30px;max-width:380px;width:90%;text-align:center;box-shadow:0 20px 60px rgba(0,0,0,.4);margin:auto}.login-box h2{font-size:18px;margin-bottom:4px}.login-box .login-sub{font-size:var(--fs-12);color:var(--text-secondary);margin-bottom:20px}.login-box .form-group{margin-bottom:14px;text-align:left}.login-box .form-group label{display:block;font-size:var(--fs-12);font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);margin-bottom:4px}.login-box .form-group input,.login-box .form-group select{width:100%;padding:10px 12px;border-radius:var(--radius-sm);border:1px solid var(--panel-border);background:var(--bg);color:var(--text);font-size:13px;outline:none;transition:border .15s}.login-box .form-group input:focus,.login-box .form-group select:focus{border-color:var(--teal)}.login-box .login-btn{width:100%;padding:12px;border:none;border-radius:var(--radius-sm);background:var(--teal);color:#fff;font-size:13px;font-weight:700;cursor:pointer;transition:all .15s;margin-top:4px}.login-box .login-btn:hover{transform:translateY(-1px);box-shadow:0 4px 16px rgba(20,184,166,.3)}.login-box .login-divider{display:flex;align-items:center;gap:10px;margin:16px 0;color:var(--muted);font-size:var(--fs-12)}.login-box .login-divider::before,.login-box .login-divider::after{content:'';flex:1;height:1px;background:var(--panel-border)}.login-box .passkey-btn{width:100%;padding:10px;border-radius:var(--radius-sm);border:1px solid var(--panel-border);background:transparent;color:var(--text);font-size:12px;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:8px;transition:all .15s}.login-box .passkey-btn:hover{border-color:var(--teal);color:var(--teal)}#welcomeOverlay{display:none;position:fixed;inset:0;z-index:190;background:rgba(0,0,0,.8);backdrop-filter:blur(12px);align-items:center;justify-content:center}#welcomeOverlay.active{display:flex}.welcome-box{background:var(--panel);border:1px solid var(--panel-border);border-radius:20px;padding:40px 32px;max-width:440px;width:90%;text-align:center;box-shadow:0 20px 60px rgba(0,0,0,.5);animation:fadeScale .4s ease-out}@keyframes fadeScale{0%{opacity:0;transform:scale(.9)}100%{opacity:1;transform:scale(1)}}.welcome-box .welcome-icon{font-size:48px;margin-bottom:12px}.welcome-box h2{font-size:20px;font-weight:800;margin-bottom:8px}.welcome-box h2 span{color:var(--teal)}.welcome-box .welcome-sub{font-size:12px;color:var(--text-secondary);margin-bottom:16px;line-height:1.6}.welcome-box .welcome-motivation{padding:16px;background:var(--teal-dim);border-radius:var(--radius-sm);margin-bottom:20px;font-size:13px;line-height:1.6;color:var(--text);border-left:3px solid var(--teal)}.welcome-box .welcome-btn{padding:10px 32px;border:none;border-radius:24px;background:var(--teal);color:#fff;font-size:13px;font-weight:700;cursor:pointer;transition:all .15s}.welcome-box .welcome-btn:hover{transform:translateY(-1px);box-shadow:0 4px 16px rgba(20,184,166,.3)}.voice-rec-btn{padding:8px 10px;border-radius:var(--radius-sm);border:1px solid var(--panel-border);background:var(--bg);color:var(--muted);cursor:pointer;font-size:14px;transition:all .15s;display:inline-flex;align-items:center;gap:6px;flex-shrink:0}.voice-rec-btn:hover{border-color:var(--teal);color:var(--teal)}.voice-rec-btn.recording{background:var(--red-dim);border-color:var(--red);color:var(--red);animation:pulse 1s infinite}.voice-rec-indicator{display:none;align-items:center;gap:6px;padding:4px 10px;border-radius:var(--radius-sm);background:var(--red-dim);color:var(--red);font-size:var(--fs-12);font-weight:600;flex-shrink:0}.voice-rec-indicator.active{display:inline-flex}.voice-rec-dot{width:8px;height:8px;border-radius:50%;background:var(--red);animation:pulse 1s infinite}.voice-listen-btn:hover{background:var(--teal);color:#fff}.voice-listen-btn.speaking{background:var(--red-dim);color:var(--red);animation:pulse 1.5s infinite}.pattern-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:12px}.pattern-card{background:var(--panel);border:1px solid var(--panel-border);border-radius:var(--radius);padding:16px}.pattern-card .pc-header{display:flex;align-items:center;gap:10px;margin-bottom:10px}.pattern-card .pc-avatar{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:800;color:#fff}.pattern-card .pc-name{font-size:12px;font-weight:700}.pattern-card .pc-favorite{font-size:var(--fs-12);color:var(--teal);margin-bottom:8px;font-weight:600}.pattern-card .pc-chart{display:flex;flex-direction:column;gap:4px;margin-bottom:10px}.pattern-card .pc-bar-row .pc-bar-label{width:90px;flex-shrink:0;color:var(--muted)}.pattern-card .pc-bar-row .pc-bar-track{flex:1;height:14px;background:var(--bg);border-radius:7px;overflow:hidden;position:relative}.pattern-card .pc-bar-row .pc-bar-fill{height:100%;border-radius:7px;transition:width .5s ease-out;min-width:0}.pattern-card .pc-bar-row .pc-bar-pct{width:36px;text-align:right;color:var(--text-secondary);font-weight:600}.pattern-card .pc-pattern-badge.good{background:var(--teal-dim);color:var(--teal)}.pattern-card .pc-pattern-badge.warn{background:var(--amber-dim);color:var(--amber)}.pattern-card .pc-pattern-badge.bad{background:var(--red-dim);color:var(--red)}.pattern-card .pc-admin{display:none;margin-top:8px;padding-top:8px;border-top:1px solid var(--panel-border)}.pattern-card .pc-admin.open{display:block}.pattern-card .pc-restrict-row{display:flex;flex-wrap:wrap;gap:4px;margin-bottom:6px}.pattern-card .pc-restrict-toggle{padding:3px 8px;border-radius:8px;font-size:var(--fs-12);font-weight:600;border:1px solid var(--panel-border);background:var(--bg);color:var(--text);cursor:pointer;transition:all .15s}.pattern-card .pc-restrict-toggle.locked{background:var(--red-dim);border-color:var(--red);color:var(--red)}.pattern-card .pc-restrict-toggle:hover{border-color:var(--teal)}.pc-fav-select{width:100%;padding:5px 8px;border-radius:6px;border:1px solid var(--panel-border);background:var(--bg);color:var(--text);font-size:var(--fs-12);outline:none;cursor:pointer}.feed-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px}@media(max-width:800px){.feed-grid{grid-template-columns:1fr}}.feed-list{max-height:500px;overflow-y:auto;display:flex;flex-direction:column;gap:4px}.feed-item{padding:8px 10px;background:var(--bg);border-radius:var(--radius-sm);border-left:2px solid var(--teal);font-size:var(--fs-12)}.feed-item .feed-source.bag{background:var(--blue-dim);color:var(--blue)}.feed-item .feed-source.gdelt{background:var(--purple);color:#fff}.feed-item .feed-source.google{background:var(--amber-dim);color:var(--amber)}.feed-item .feed-title{font-weight:600;color:var(--text);margin-bottom:2px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.feed-item .feed-title a{color:var(--text);text-decoration:none}.feed-item .feed-title a:hover{color:var(--teal);text-decoration:underline}.osint-feed-panel{max-height:250px;overflow-y:auto;display:flex;flex-direction:column;gap:4px}.ideas-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px}@media(max-width:800px){.ideas-grid{grid-template-columns:1fr}}.suggestion-card{background:var(--panel);border:1px solid var(--panel-border);border-radius:var(--radius);padding:14px;margin-bottom:8px}.suggestion-card .sc-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}.suggestion-card .sc-title{font-size:12px;font-weight:700}.suggestion-card .sc-category{padding:2px 8px;border-radius:8px;font-size:var(--fs-12);font-weight:600;background:var(--teal-dim);color:var(--teal)}.suggestion-card .sc-status{padding:2px 8px;border-radius:8px;font-size:var(--fs-12);font-weight:700}.suggestion-card .sc-status.eingereicht{background:var(--amber-dim);color:var(--amber)}.suggestion-card .sc-status.in_pruefung{background:var(--blue-dim);color:var(--blue)}.suggestion-card .sc-status.umgesetzt{background:var(--teal-dim);color:var(--teal)}.suggestion-card .sc-status.abgelehnt{background:var(--red-dim);color:var(--red)}.suggestion-card .sc-desc{font-size:var(--fs-12);color:var(--text-secondary);margin-bottom:6px}.suggestion-card .sc-meta{display:flex;gap:8px;font-size:var(--fs-12);color:var(--muted)}.suggestion-card .sc-merkle{font-size:var(--fs-12);color:var(--muted);margin-top:4px;font-family:monospace;cursor:help}.suggestion-card .sc-admin-notes{margin-top:8px;padding-top:8px;border-top:1px solid var(--panel-border)}.suggestion-card .sc-admin-notes textarea{width:100%;padding:6px 8px;border-radius:6px;border:1px solid var(--panel-border);background:var(--bg);color:var(--text);font-size:var(--fs-12);outline:none;resize:vertical;min-height:40px;font-family:inherit}.suggestion-card .sc-admin-notes textarea:focus{border-color:var(--teal)}.suggestion-card .sc-admin-notes .lock-icon{font-size:var(--fs-12);color:var(--muted);display:inline-block;margin-bottom:2px}.vulgarity-warning{padding:8px 12px;border-radius:8px;background:var(--red-dim);border:1px solid var(--red);color:var(--red);font-size:var(--fs-12);margin-bottom:8px;display:none}.vulgarity-warning.active{display:block}.vulgarity-warning .vw-item{display:flex;align-items:center;gap:6px;margin-top:4px}.vulgarity-warning .vw-orig{text-decoration:line-through;opacity:.7}.vulgarity-warning .vw-suggest{color:var(--teal);font-weight:600}.qms-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px}@media(max-width:800px){.qms-grid{grid-template-columns:1fr}}.qms-doc-item{display:flex;align-items:center;justify-content:space-between;padding:10px 12px;background:var(--bg);border-radius:var(--radius-sm);border:1px solid var(--panel-border);margin-bottom:4px}.qms-doc-item .qms-info{flex:1}.qms-doc-item .qms-info .qms-title{font-size:var(--fs-12);font-weight:600}.qms-doc-item .qms-actions{display:flex;gap:4px}.qms-doc-item .qms-actions .qms-replace{background:var(--blue-dim);color:var(--blue)}.qms-doc-item .qms-actions .qms-delete{background:var(--red-dim);color:var(--red)}.qms-doc-item .qms-actions .qms-listen{background:var(--teal-dim);color:var(--teal)}.qms-access-list{max-height:200px;overflow-y:auto;display:flex;flex-direction:column;gap:4px}.qms-access-item input[type="checkbox"]{width:auto;cursor:pointer}.qms-status-badge.active{background:var(--teal-dim);color:var(--teal)}.qms-status-badge.replaced{background:var(--amber-dim);color:var(--amber)}.vacation-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px}@media(max-width:800px){.vacation-grid{grid-template-columns:1fr}}.vacation-card{background:var(--panel);border:1px solid var(--panel-border);border-radius:var(--radius);padding:14px;margin-bottom:8px}.vacation-card .vc-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}.vacation-card .vc-employee{font-size:var(--fs-12);font-weight:700;display:flex;align-items:center;gap:6px}.vacation-card .vc-dates{font-size:var(--fs-12);color:var(--text-secondary);margin-bottom:4px}.vacation-card .vc-notes{font-size:var(--fs-12);color:var(--muted);margin-bottom:4px}.vacation-card .vc-status{padding:2px 8px;border-radius:8px;font-size:var(--fs-12);font-weight:700}.vacation-card .vc-status.eingereicht{background:var(--amber-dim);color:var(--amber)}.vacation-card .vc-status.genehmigt{background:var(--teal-dim);color:var(--teal)}.vacation-card .vc-status.abgelehnt{background:var(--red-dim);color:var(--red)}.vacation-card .vc-admin-notes{margin-top:6px;padding-top:6px;border-top:1px solid var(--panel-border);font-size:var(--fs-12);color:var(--muted)}.calendar-nav{display:flex;align-items:center;gap:8px;margin-bottom:10px;flex-wrap:wrap}.calendar-nav .nav-btn{padding:4px 10px;border-radius:12px;font-size:var(--fs-12);font-weight:700;border:1px solid var(--panel-border);background:var(--bg);color:var(--text);cursor:pointer;transition:all .15s;white-space:nowrap}.calendar-nav .nav-btn:hover{border-color:var(--teal);color:var(--teal)}.calendar-nav .nav-label{font-size:13px;font-weight:800;color:var(--text);min-width:120px;text-align:center}.calendar-nav .zoom-btn{padding:4px 10px;border-radius:12px;font-size:var(--fs-12);font-weight:600;border:1px solid var(--panel-border);background:var(--bg);color:var(--muted);cursor:pointer;transition:all .15s}.calendar-nav .zoom-btn:hover{border-color:var(--teal)}.calendar-nav .zoom-btn.active{background:var(--teal-dim);border-color:var(--teal);color:var(--teal)}.livestream-panel{background:var(--bg);border-radius:var(--radius-sm);padding:10px;max-height:300px;overflow-y:auto;display:flex;flex-direction:column;gap:4px;border:1px solid var(--panel-border);margin-top:8px}.ls-item .ls-arrow{color:var(--muted);margin:0 4px}.mobbing-alert-card{padding:10px;border:1px solid var(--red);border-radius:var(--radius-sm);background:var(--red-dim);margin-bottom:6px}.mobbing-alert-card .ma-severity-bar{height:4px;border-radius:2px;background:var(--panel);overflow:hidden;margin-top:4px}.mobbing-alert-card .ma-severity-bar .fill{height:100%;border-radius:2px;background:var(--red)}.team-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:12px}.team-card{background:var(--panel);border:1px solid var(--panel-border);border-radius:var(--radius);padding:16px}.team-card .tc-header{display:flex;align-items:center;gap:8px;margin-bottom:10px}.team-card .tc-color{width:14px;height:14px;border-radius:50%;flex-shrink:0}.team-card .tc-name{font-size:12px;font-weight:700;flex:1}.team-card .tc-desc{font-size:var(--fs-12);color:var(--text-secondary);margin-bottom:8px}.team-card .tc-members .tc-member{display:flex;align-items:center;gap:6px}.team-card .tc-actions{display:flex;gap:4px;margin-top:8px;justify-content:flex-end}.team-card .tc-actions button{padding:3px 8px;border-radius:6px;font-size:var(--fs-12);font-weight:600;border:none;cursor:pointer;transition:all .15s}.password-toggle-btn{background:transparent;border:none;color:var(--muted);cursor:pointer;position:absolute;right:8px;top:50%;transform:translateY(-50%);font-size:12px;padding:2px 6px;border-radius:4px}.password-toggle-btn:hover{color:var(--text)}.password-wrap{position:relative}@media(max-width:600px){.topbar{padding:8px 10px;flex-wrap:wrap}.topbar-center{order:3;width:100%;justify-content:flex-start}.topbar-center .tab-btn{font-size:var(--fs-12);padding:4px 10px}.tab-content{padding:10px}.kpi-row{grid-template-columns:repeat(2,1fr)}.shift-calendar{grid-template-columns:repeat(4,1fr)}.login-box{padding:20px}.login-box .form-group input,.login-box .form-group select{font-size:16px}.messages-layout{grid-template-columns:1fr}.staff-grid{grid-template-columns:1fr}.form-group .form-row{grid-template-columns:1fr}.vacation-grid{grid-template-columns:1fr}.intern-grid{grid-template-columns:1fr}}@media print{/* Rosie Print: nur #_rpContent sichtbar */body>*{display:none!important}#_rp{display:block!important;position:static!important;overflow:visible!important;-webkit-print-color-adjust:exact!important;print-color-adjust:exact!important}#_rp *{-webkit-print-color-adjust:exact!important;print-color-adjust:exact!important}#_rpBtns{display:none!important}#_rpHeader{border-bottom:2px solid #14b8a6!important}table{page-break-inside:auto}tr{page-break-inside:avoid;page-break-after:auto}td,th{border:1px solid #94a3b8!important}@page{size:A4 landscape;margin:10mm}}@keyframes pulse{0%,100%{opacity:1}50%{opacity:.3}}.leaderboard-card{display:flex;align-items:center;gap:10px;padding:8px 12px;background:var(--teal-dim);border-radius:var(--radius-sm);margin-bottom:6px}.leaderboard-rank{font-size:16px;font-weight:800;width:24px;text-align:center;color:var(--teal)}.leaderboard-name{flex:1;font-size:var(--fs-12)}.leaderboard-points{font-size:12px;font-weight:700;color:var(--amber)}.template-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:10px;margin-top:10px}.template-card{background:var(--panel);border:1px solid var(--panel-border);border-radius:var(--radius);padding:12px;transition:border-color .2s}.template-card:hover{border-color:var(--teal)}.template-card .tc-name{font-size:var(--fs-12);font-weight:700;margin-bottom:4px;display:flex;align-items:center;gap:6px}.template-card .tc-actions{display:flex;gap:4px;margin-top:8px}.agent-request-card{background:var(--panel);border:1px solid var(--panel-border);border-radius:var(--radius);padding:10px;margin-bottom:8px}.agent-request-card .ar-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:4px}.agent-request-card .ar-title{font-weight:700;font-size:var(--fs-12)}.priority-niedrig{background:var(--green-dim);color:var(--green)}.priority-mittel{background:var(--amber-dim);color:var(--amber)}.priority-hoch{background:var(--red-dim);color:var(--red)}.priority-kritisch{background:var(--red-dim);color:var(--red);animation:pulse 1s infinite}@keyframes pulse{0%,100%{opacity:1}50%{opacity:.5}}.wish-badge{display:inline-flex;align-items:center;gap:3px;font-size:var(--fs-12);padding:1px 6px;border-radius:8px;background:var(--amber-dim);color:var(--amber)}.wish-block{opacity:0.5;border:1px dashed var(--amber)}.wish-block:hover{opacity:0.8}.final-block{opacity:1;border:1px solid var(--panel-border)}.plan-table{width:100%;border-collapse:collapse;font-size:var(--fs-12);margin-top:8px}.plan-table th,.plan-table td{padding:6px 8px;text-align:left;border-bottom:1px solid var(--panel-border)}.plan-row-accepted{background:var(--green-dim)}.plan-row-wish{background:var(--blue-dim)}.plan-row-new{background:var(--amber-dim)}.scheduler-badge{display:inline-flex;align-items:center;gap:4px;font-size:var(--fs-12);padding:2px 10px;border-radius:10px;background:var(--purple);color:#fff;font-weight:600}.wish-form{display:flex;gap:8px;flex-wrap:wrap;align-items:end;padding:12px;background:var(--panel);border:1px solid var(--panel-border);border-radius:var(--radius);margin-bottom:12px}.admin-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:12px;padding:8px 0}.wish-form .form-group{margin-bottom:0}.chatbot-msg{font-size:var(--fs-12);line-height:1.5;white-space:pre-wrap}.chatbot-msg.bot{background:var(--bg)}.chatbot-msg.user{background:var(--teal-dim)}#chatbotContainer *{font-family:inherit}
.sq-grid{display:grid;gap:4px;font-size:var(--fs-12);overflow-x:auto}
.sq-header{display:grid;grid-template-columns:140px 80px 60px 1fr;gap:4px;padding:6px 8px;background:var(--panel-border);border-radius:var(--radius-sm);font-weight:700;color:var(--muted)}
.sq-row{display:grid;grid-template-columns:140px 80px 60px 1fr;gap:4px;padding:5px 8px;border-radius:var(--radius-sm);background:var(--teal-dim);align-items:center;transition:background .2s}
.sq-row:hover{background:var(--blue-dim)}
.sq-row.sick{background:var(--red-dim);opacity:.7}
.sq-row.inactive{opacity:.5}
.sq-shifts{display:flex;gap:3px;flex-wrap:wrap}.sq-shift-fruehdienst{background:#05966922;color:#34d399;border:1px solid #05966944}
.sq-shift-spaetschicht{background:#d9770622;color:#fbbf24;border:1px solid #d9770644}
.sq-shift-nachtwache{background:#7c3aed22;color:#a78bfa;border:1px solid #7c3aed44}
/* W3-01 (WCAG 2.4.7): sichtbarer Focus-Ring auf der per Tastatur fokussierten Roster-Tageszelle.
   Bewusst :focus (nicht nur :focus-visible) — programmatischer .focus() bei Pfeil-Navigation
   triggert :focus-visible in WebKit/Safari nicht zuverlässig; :focus garantiert den Ring cross-browser. */
#sqGrid td[data-sqid][role="gridcell"]:focus{outline:2px solid var(--teal);outline-offset:-2px;box-shadow:inset 0 0 0 2px var(--teal);position:relative;z-index:6}
/* W3-03: visuell verstecktes, aber für Screenreader lesbares Live-Region-Pattern. */
.sr-only{position:absolute!important;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
/* W3-14 (WCAG 2.5.5/2.5.8): auf Touch-/Schmal-Viewports Mindest-Tap-Fläche 44×44px für die kleinen
   ICON-ONLY-Buttons (vorher ~28-32px). min-* statt fixer Höhe (kein Clipping); inline-flex zentriert
   das Icon. Desktop-Layout bleibt unverändert. Die Text-Tabs (.tab-btn) sind mit ~145px Breite
   flächenmäßig gross und vom Flex-Topbar in der Höhe gebunden — ein 44px-Erzwingen erforderte einen
   Topbar-Umbau und ist hier bewusst ausgeklammert. */
@media (pointer: coarse), (max-width: 768px){
  .modal-close, .alert-bell, .icon-btn, .password-toggle-btn, .smart-date-cal-btn, .nav-btn, .paint-tool{
    min-height:44px; min-width:44px; display:inline-flex; align-items:center; justify-content:center;
  }
  /* QW-9: kritische Action-Buttons touch-tauglich */
  .btn-small{min-height:44px}
  .tab-btn{min-height:44px}
  /* FN-67 F-4 (AU-9.4): .topbar-right select (rosie.css @media(max-width:768px)
     weiter unten) hatte kein min-height — winzige 8px-Schrift + 1px-Padding ergaben
     ein Touch-Ziel weit unter 44px, dem einzigen Sprachauswahl-Element der Topbar. */
  .topbar-right select{min-height:44px}
}
.sq-name{font-weight:600;display:flex;align-items:center;gap:4px}.sq-status.aktiv{color:var(--green)}
.sq-status.krank{color:var(--red)}
.sq-status.inaktiv{color:var(--muted)}
.preset-filters{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:10px;align-items:end}
.preset-filters .form-group{margin-bottom:0}
.preset-list{display:flex;flex-direction:column;gap:6px}
.preset-item{padding:8px 10px;background:var(--teal-dim);border-radius:var(--radius-sm);display:flex;align-items:center;gap:6px;flex-wrap:wrap;font-size:var(--fs-12)}
.preset-item.active{border-left:3px solid var(--teal)}
.preset-item .name{font-weight:700;flex:1;min-width:100px}
.preset-item .meta{font-size:var(--fs-12);color:var(--muted)}
.preset-item .actions{display:flex;gap:4px;margin-left:auto}
.preset-modal{position:fixed;inset:0;background:rgba(0,0,0,.6);display:flex;align-items:center;justify-content:center;z-index:999}
.preset-modal-inner{background:var(--panel);border:1px solid var(--panel-border);border-radius:var(--radius);padding:16px;max-width:700px;width:90%;max-height:80vh;overflow-y:auto}
.preset-modal-inner h3{margin:0 0 10px;font-size:12px}
.preset-assign-grid{display:flex;flex-direction:column;gap:3px;margin:8px 0}
.preset-assign-row{display:grid;grid-template-columns:1fr 80px 80px 60px;gap:4px;padding:4px 6px;background:var(--bg);border-radius:3px;font-size:var(--fs-12);align-items:center}
.preset-assign-row select{font-size:var(--fs-12);padding:2px 4px}
/* --- Alert Bell --- */
.alert-bell{position:relative;font-size:16px;cursor:pointer;background:none;border:none;color:var(--text);padding:4px;line-height:1;margin-right:2px}
/* FN-89: Begleit-Fix zur Schrift-Anhebung 7px→12px. Der alte 14px-Fixkreis (width/height:14px,
   border-radius:50%) konnte 12px-Ziffern nicht fassen — zweistellige Zähler ("12", "99") liefen
   sichtbar über den roten Kreis hinaus (im Browser verifiziert). Statt fixer Breite jetzt
   min-width:18px + padding: einstellig bleibt es ein Kreis, ab zwei Stellen wächst es zur Pille
   (border-radius:9px = halbe Höhe hält die runden Enden). top/right um je 2px nachgezogen, damit
   die Badge relativ zum Glocken-Icon gleich positioniert bleibt. */
.alert-bell .badge{position:absolute;top:-4px;right:-6px;background:var(--red);color:#fff;font-size:var(--fs-12);font-weight:700;border-radius:9px;min-width:18px;height:18px;padding:0 4px;box-sizing:border-box;display:flex;align-items:center;justify-content:center}
/* FN-307/1b — Ungelesen-Badge am Meldungen-Tab, identisches Muster wie .alert-bell .badge oben
   (position:relative auf dem Anker, absolut positionierter Zähler-Pill). */
#tabMessagesBtn{position:relative}
#tabMessagesBtn .badge{position:absolute;top:-4px;right:-4px;background:var(--red);color:#fff;font-size:var(--fs-12);font-weight:700;border-radius:9px;min-width:16px;height:16px;padding:0 4px;box-sizing:border-box;display:flex;align-items:center;justify-content:center;line-height:1}
.alert-panel{position:fixed;top:48px;right:10px;width:320px;max-height:400px;overflow-y:auto;background:var(--panel);border:1px solid var(--panel-border);border-radius:var(--radius);box-shadow:0 4px 20px rgba(0,0,0,.5);z-index:999;display:none;padding:8px}
.alert-panel.active{display:block}
.alert-item{padding:8px 10px;border-bottom:1px solid var(--panel-border);font-size:var(--fs-12);cursor:pointer;transition:background .2s}
.alert-item:last-child{border-bottom:none}
.alert-item:hover{background:var(--teal-dim)}
.alert-item.unread{border-left:3px solid var(--teal)}
.alert-item .atitle{font-weight:700;margin-bottom:2px}
.alert-item .ameta{font-size:var(--fs-12);color:var(--muted)}
/* --- Mobile / Responsive --- */
@media(max-width:768px){
.topbar{flex-wrap:wrap;padding:6px 8px;gap:4px}
.topbar-left{flex:0 0 auto;text-align:left;margin-bottom:0}
.topbar-center{order:3;flex:0 0 100%;overflow-x:auto;display:flex;gap:2px;padding:2px 0;-webkit-overflow-scrolling:touch}
.topbar-center::-webkit-scrollbar{display:none}
.topbar-center .tab-btn{white-space:nowrap;font-size:var(--fs-12);padding:4px 8px;flex-shrink:0}
.topbar-right{flex:1;justify-content:flex-end;gap:3px}
.topbar-right select{font-size:var(--fs-12)!important;padding:1px 3px!important}
.icon-btn{font-size:12px!important;padding:3px}
.card{margin:0 0 10px!important;border-radius:8px}
.card-head{flex-wrap:wrap;gap:4px;padding:8px 10px}
.card-head .btn-small{font-size:var(--fs-12);padding:3px 6px}
.card-body{padding:8px 10px}
.kpi-row{display:grid;grid-template-columns:1fr 1fr;gap:6px}
.kpi-item{padding:8px}
.kpi-value{font-size:14px}.sq-header span:nth-child(3),.sq-row .sq-team{display:none}
.sq-shifts{flex-wrap:wrap;gap:2px}
.preset-filters{flex-direction:column;gap:4px}
.preset-filters .form-group{width:100%}
.preset-filters select{width:100%}
.preset-item{flex-direction:column;align-items:start;gap:4px;padding:6px 8px}
.preset-item .actions{width:100%;justify-content:flex-end;margin-top:2px}
.staff-grid{grid-template-columns:1fr!important}
.calendar-nav{gap:4px}
.calendar-nav .nav-btn{font-size:var(--fs-12);padding:4px 6px}
.shift-calendar{font-size:var(--fs-12);overflow-x:auto;-webkit-overflow-scrolling:touch}
.form-row{flex-direction:column;gap:6px}
.form-row>div{width:100%!important}
.modal-box.wide{width:95%;margin:10px;padding:12px}
.alert-panel{width:calc(100vw - 20px);right:5px;top:44px;max-height:60vh}
.preset-assign-row{grid-template-columns:1fr 60px;gap:2px;font-size:var(--fs-12)}
.preset-modal-inner{padding:12px;width:95%}
.intern-grid{grid-template-columns:1fr!important}
#presetList .preset-item .actions{display:flex;flex-wrap:wrap}}
/* ── Admin Grid: Screen-Dynamic Responsive Layout ── */
.admin-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(340px,1fr));gap:10px;margin-bottom:8px}
.admin-grid .card{background:var(--panel);border:1px solid var(--panel-border);border-radius:var(--radius);overflow:hidden;margin:0}
.admin-grid .card .card-head{display:flex;align-items:center;gap:8px;padding:10px 14px;background:var(--bg);border-bottom:1px solid var(--panel-border)}
.admin-grid .card .card-title{font-size:12px;font-weight:700;color:var(--text)}
.admin-grid .card .card-body{padding:12px 14px}
.admin-grid .card-full-width{grid-column:1/-1}
#adminSettingsTabs{overflow-x:auto;scrollbar-width:thin;-webkit-overflow-scrolling:touch;padding-bottom:2px}
#adminSettingsTabs::after{content:'';position:sticky;right:0;width:24px;flex-shrink:0;background:linear-gradient(to right,transparent,var(--panel));pointer-events:none}
#adminSettingTabContent{max-width:100%;overflow-x:auto}
/* ── Topbar: Logo overflow prevention + tab scrolling ── */
.topbar-logo{font-size:12px;white-space:nowrap;flex-shrink:0;max-width:50vw;overflow:hidden}
.topbar-center{overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;min-width:0}
.topbar-center::-webkit-scrollbar{display:none}
.topbar-right{gap:2px!important}
/* FN-89(d) (2026-07-24, Flo-Entscheid: Breite erhöhen statt belassen): 50px liess bei
   allen 4 Optionen (🇨🇭 DE/🇫🇷 FR/🇮🇹 IT/🇬🇧 EN) nur noch die Flagge sichtbar, der
   Sprachcode-Text war komplett abgeschnitten (nicht nur "A…" — leerer Rest). Per
   iframe-Messung mit dem echten ausgelieferten rosie.css (Desktop-Breakpoint, >768px,
   font-size 12px): natürliche Breite aller 4 Optionen identisch bei 60px scrollWidth
   (Flagge+Leerzeichen+2 Buchstaben+nativer Dropdown-Pfeil). 70px lässt jede Option
   vollständig lesbar, mit kleinem Puffer für Browser-/OS-Emoji-Rendering-Varianz. */
.topbar-right select{max-width:70px;text-overflow:ellipsis;font-size:var(--fs-12)!important;padding:2px 4px!important}
.topbar-right .user-badge{font-size:var(--fs-12);padding:2px 8px}
@media(max-width:1024px){.topbar-right .user-badge{display:none}}
/* ── Live Browser Sidebar (rechts, overlay) ── */
#liveBrowserSidebar{position:fixed;top:52px;right:0;left:auto;width:340px;height:calc(100vh - 52px);z-index:101;background:var(--panel);border-left:1px solid var(--panel-border);box-shadow:-2px 0 20px rgba(0,0,0,.15);transform:translateX(100%);transition:transform .28s cubic-bezier(.4,0,.2,1);overflow-y:auto;padding:0}
#liveBrowserSidebar.open{transform:translateX(0)}
#liveBrowserSidebar .sidebar-head{position:sticky;top:0;z-index:5;display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:var(--bg);border-bottom:1px solid var(--panel-border);font-size:var(--fs-12);font-weight:700;color:var(--text)}
#liveBrowserSidebar .sidebar-body{padding:10px 12px}
@media(max-width:1024px){
  #liveBrowserSidebar{width:280px}
}
@media(max-width:600px){
  #liveBrowserSidebar{width:100vw}
}
/* Live-Browser offen: Dashboard nach links schieben */
.tab-content.live-sidebar-active #shiftDashboard,
.tab-content.live-sidebar-active #statusQuoSection{
  margin-right:340px;transition:margin .28s cubic-bezier(.4,0,.2,1)
}
@media(max-width:1024px){
  .tab-content.live-sidebar-active #shiftDashboard,
  .tab-content.live-sidebar-active #statusQuoSection{margin-right:280px}
}
@media(max-width:600px){
  .tab-content.live-sidebar-active #shiftDashboard,
  .tab-content.live-sidebar-active #statusQuoSection{margin-right:0}
}

/* ── Alarm-Center Sidebar (links, overlay) ── */
#alarmSidebar{position:fixed;top:52px;left:0;right:auto;width:380px;height:calc(100vh - 52px);z-index:101;background:var(--panel);border-right:1px solid var(--panel-border);box-shadow:2px 0 20px rgba(0,0,0,.15);transform:translateX(-100%);transition:transform .28s cubic-bezier(.4,0,.2,1);overflow-y:auto;padding:0}
#alarmSidebar.open{transform:translateX(0)}
#alarmSidebar .sidebar-head{position:sticky;top:0;z-index:5;display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:var(--bg);border-bottom:1px solid var(--panel-border);font-size:var(--fs-12);font-weight:700;color:var(--text)}
#alarmSidebar .sidebar-body{padding:10px 12px}
#alarmSidebar .alarm-tabs{display:flex;gap:3px;margin-bottom:8px;flex-wrap:wrap}#alarmSidebar .alarm-tab:hover{border-color:var(--teal)}
#alarmSidebar .alarm-tab.active{background:var(--teal);color:#fff;border-color:var(--teal)}#alarmSidebar .alarm-tab.active .alarm-badge{background:#fff;color:var(--red)}
#alarmSidebar .alarm-section{display:none}
#alarmSidebar .alarm-section.active{display:block}
#alarmSidebar .alarm-summary{display:grid;grid-template-columns:repeat(4,1fr);gap:4px;margin-bottom:8px}
#alarmSidebar .alarm-summary .pill{padding:4px 6px;background:var(--bg);border-radius:6px;text-align:center;border:1px solid var(--panel-border)}
#alarmSidebar .alarm-summary .pill .lbl{font-size:var(--fs-12);color:var(--muted);text-transform:uppercase;letter-spacing:.4px}
#alarmSidebar .alarm-summary .pill .val{font-size:14px;font-weight:800}
@media(max-width:1024px){
  #alarmSidebar{width:320px}
}
@media(max-width:600px){
  #alarmSidebar{width:100vw}
}
/* Alarm-Sidebar offen: Dashboard nach rechts schieben */
.tab-content.alarm-sidebar-active #shiftDashboard,
.tab-content.alarm-sidebar-active #statusQuoSection{
  margin-left:380px;transition:margin .28s cubic-bezier(.4,0,.2,1)
}
@media(max-width:1024px){
  .tab-content.alarm-sidebar-active #shiftDashboard,
  .tab-content.alarm-sidebar-active #statusQuoSection{margin-left:320px}
}
@media(max-width:600px){
  .tab-content.alarm-sidebar-active #shiftDashboard,
  .tab-content.alarm-sidebar-active #statusQuoSection{margin-left:0}
}
/* Beide Sidebars offen: Inhalt zwischen beiden zentrieren */
.tab-content.alarm-sidebar-active.live-sidebar-active #shiftDashboard,
.tab-content.alarm-sidebar-active.live-sidebar-active #statusQuoSection{
  margin-left:380px;margin-right:340px
}
@media(max-width:1024px){
  .tab-content.alarm-sidebar-active.live-sidebar-active #shiftDashboard,
  .tab-content.alarm-sidebar-active.live-sidebar-active #statusQuoSection{margin-left:320px;margin-right:280px}
}
@media(max-width:600px){
  .tab-content.alarm-sidebar-active.live-sidebar-active #shiftDashboard,
  .tab-content.alarm-sidebar-active.live-sidebar-active #statusQuoSection{margin-left:0;margin-right:0}
}
@media(max-width:1024px){
  .admin-grid{grid-template-columns:1fr;gap:8px}
  .admin-grid .card .card-body{padding:8px 10px}
}
@media(max-width:480px){
.topbar-center .tab-btn{padding:3px 6px;font-size:var(--fs-12)}
.kpi-row{grid-template-columns:1fr 1fr;gap:4px}
.kpi-item{padding:6px}
.kpi-value{font-size:12px}}
/* --- Voice to Action --- */
.voice-btn{width:44px;height:44px;border-radius:50%;background:var(--teal);color:#fff;border:2px solid transparent;display:flex;align-items:center;justify-content:center;font-size:20px;cursor:pointer;box-shadow:0 4px 12px rgba(20,184,166,.4);transition:all .3s}
.voice-btn.active{background:var(--red);border-color:#fff;animation:voicePulse 1s infinite;box-shadow:0 0 20px rgba(239,68,68,.6)}
@keyframes voicePulse{0%{transform:scale(1);box-shadow:0 0 20px rgba(239,68,68,.6)}50%{transform:scale(1.1);box-shadow:0 0 30px rgba(239,68,68,.8)}100%{transform:scale(1);box-shadow:0 0 20px rgba(239,68,68,.6)}}
.voice-modal{position:fixed;bottom:70px;right:16px;width:300px;background:var(--panel);border:1px solid var(--panel-border);border-radius:var(--radius);box-shadow:0 8px 32px rgba(0,0,0,.5);z-index:9998;display:none;padding:12px;overflow:hidden}
.voice-modal.active{display:block}
.voice-status{text-align:center;padding:16px;font-size:var(--fs-12)}
.voice-wave{display:flex;align-items:center;justify-content:center;gap:3px;height:40px;margin:8px 0}
.voice-wave span{width:4px;height:20px;background:var(--teal);border-radius:2px;animation:waveAnim .8s ease-in-out infinite}
.voice-wave span:nth-child(2){animation-delay:.1s;height:30px}
.voice-wave span:nth-child(3){animation-delay:.2s;height:40px}
.voice-wave span:nth-child(4){animation-delay:.3s;height:30px}
.voice-wave span:nth-child(5){animation-delay:.4s;height:20px}
@keyframes waveAnim{0%,100%{transform:scaleY(.5);opacity:.5}50%{transform:scaleY(1);opacity:1}}
.voice-transcript{background:var(--bg);border-radius:var(--radius-sm);padding:8px;font-size:var(--fs-12);margin:8px 0;min-height:24px;text-align:center;color:var(--text-secondary)}
.voice-actions{display:flex;gap:4px;justify-content:center;flex-wrap:wrap}
.voice-actions .tag{padding:4px 8px;border-radius:12px;background:var(--teal-dim);font-size:var(--fs-12);color:var(--teal)}
/* --- Camera OCR --- */
.camera-btn{width:44px;height:44px;border-radius:50%;background:var(--purple);color:#fff;border:none;display:flex;align-items:center;justify-content:center;font-size:20px;cursor:pointer;box-shadow:0 4px 12px rgba(139,92,246,.4);transition:all .3s}
.camera-btn:active{transform:scale(.9)}
.ocr-modal{position:fixed;inset:0;background:rgba(0,0,0,.7);display:flex;align-items:center;justify-content:center;z-index:9999}
.ocr-modal-inner{background:var(--panel);border:1px solid var(--panel-border);border-radius:var(--radius);padding:16px;max-width:600px;width:92%;max-height:85vh;overflow-y:auto}
.ocr-modal-inner h3{margin:0 0 10px;font-size:13px}
.ocr-preview{width:100%;max-height:240px;object-fit:contain;border-radius:var(--radius-sm);margin-bottom:8px;background:var(--bg)}
.ocr-progress{height:4px;background:var(--panel-border);border-radius:2px;margin:8px 0;overflow:hidden}
.ocr-progress-bar{height:100%;background:var(--teal);border-radius:2px;transition:width .3s;width:0%}.ocr-med-card{padding:8px 10px;background:var(--teal-dim);border-radius:var(--radius-sm);margin-bottom:6px;font-size:var(--fs-12)}
.ocr-med-card .label{font-size:var(--fs-12);color:var(--muted);font-weight:600;text-transform:uppercase}
.ocr-med-card .value{font-weight:600;margin-bottom:4px}.ocr-badge.med{background:var(--blue-dim);color:var(--blue)}
.ocr-badge.pflege{background:var(--teal-dim);color:var(--teal)}
.ocr-badge.dosis{background:var(--amber-dim);color:var(--amber)}
@media(max-width:768px){
.voice-modal{width:calc(100vw - 32px);right:8px;bottom:64px}
.ocr-modal-inner{padding:12px;width:95%}
}
/* --- Holidays & Weekends --- */
.cal-day.weekend{background:var(--blue-dim)!important;border-color:var(--blue)44!important}
.cal-day.holiday{background:var(--amber-dim)!important;border-color:var(--amber)!important}
.cal-day .holiday-label{font-size:var(--fs-12);color:var(--amber);font-weight:700;margin-top:1px;text-transform:uppercase}
/* --- Block Dates --- */
.bd-grid{display:flex;flex-direction:column;gap:4px}
.bd-item{padding:8px 10px;background:var(--bg);border-radius:var(--radius-sm);border-left:3px solid var(--purple);font-size:var(--fs-12)}
.bd-item .bd-dates{font-weight:700;color:var(--purple)}
.bd-item .bd-reason{font-size:var(--fs-12);color:var(--text-secondary)}
.bd-item .bd-meta{font-size:var(--fs-12);color:var(--muted);margin-top:2px}
.bd-form{display:grid;grid-template-columns:1fr 1fr;gap:6px;padding:10px;background:var(--bg);border-radius:var(--radius-sm);margin-bottom:8px}
.bd-form .full{grid-column:1/-1}.sick-self-btn:hover{background:var(--red);color:#fff}
/* --- Login Redesign --- */
.login-mode-bar{display:flex;gap:4px;margin:14px 0 12px;background:var(--bg);border-radius:var(--radius-sm);padding:3px}
.login-mode-btn{flex:1;padding:7px 6px;border:none;border-radius:5px;font-size:var(--fs-12);font-weight:600;cursor:pointer;background:transparent;color:var(--muted);transition:all .2s;text-align:center;line-height:1.3}
.login-mode-btn.active{background:var(--teal-dim);color:var(--teal);box-shadow:0 0 0 1px var(--teal)}
.login-mode-btn:hover:not(.active){background:var(--panel-border);color:var(--text-secondary)}
.login-header{text-align:center;margin-bottom:4px}
.login-sub{font-size:var(--fs-12);color:var(--muted);margin:4px 0 0}
.admin-quick-grid{display:grid;grid-template-columns:1fr 1fr;gap:5px;margin-bottom:10px}.admin-quick-btn:hover{background:var(--teal);color:#fff;transform:translateY(-1px)}
.admin-quick-btn .name{display:block;font-size:var(--fs-12)}
.admin-quick-btn .email{display:block;font-size:var(--fs-12);color:var(--muted);margin-top:1px}
.admin-quick-btn:hover .email{color:rgba(255,255,255,0.7)}.free-info-box b{color:var(--teal)}
/* --- Modular Shift Dashboard (Legacy) ENTFERNT v9.9 --- */
.paint-palette{position:fixed;bottom:16px;right:76px;z-index:9998;display:none;flex-direction:row;flex-wrap:wrap;align-content:flex-start;justify-content:flex-end;gap:6px;width:184px;max-height:80vh;overflow-y:auto;background:var(--panel);border:1px solid var(--panel-border);border-radius:var(--radius);padding:8px;box-shadow:0 4px 16px rgba(0,0,0,.3)}.paint-tool{width:36px;height:36px;border-radius:8px;border:2px solid transparent;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:16px;transition:all .15s;background:var(--bg);flex:0 0 auto}.paint-tool:hover{transform:scale(1.1);border-color:var(--teal)}.paint-tool.active{border-color:var(--amber);background:var(--amber-dim);transform:scale(1.15);box-shadow:0 0 12px var(--amber)}.paint-tool.cursor-tool{font-size:14px}.sq-cell-painted{animation:paintPop .3s ease-out}.sq-cell-error{animation:paintError .4s ease-in-out}@keyframes paintPop{0%{transform:scale(.5);opacity:0}50%{transform:scale(1.2)}100%{transform:scale(1);opacity:1}}@keyframes paintError{0%,100%{transform:translateX(0);background:rgba(239,68,68,.25)}25%{transform:translateX(-3px)}75%{transform:translateX(3px)}}
/* a11y: Touch-Target 44px (WCAG 2.5.5) auf Mobile, Desktop-Optik unveraendert */
@media(max-width:768px){.paint-tool{width:44px;height:44px}}
/* ── Shift Type Touch Slider ── */
.assignShiftSlider{-webkit-appearance:none;appearance:none;width:100%;height:8px;border-radius:4px;background:linear-gradient(to right,#14b8a6,#f59e0b,#6366f1,#8b5cf6);outline:none;cursor:pointer;flex:1;min-width:50px;margin:0 4px}
.assignShiftSlider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:28px;height:28px;border-radius:50%;background:var(--teal);border:2px solid #fff;cursor:pointer;box-shadow:0 2px 6px rgba(0,0,0,.25);transition:transform .1s}
.assignShiftSlider::-webkit-slider-thumb:hover{transform:scale(1.2)}
.assignShiftSlider::-moz-range-thumb{width:28px;height:28px;border-radius:50%;background:var(--teal);border:2px solid #fff;cursor:pointer;box-shadow:0 2px 6px rgba(0,0,0,.25)}
.assignShiftSlider::-moz-range-thumb:hover{transform:scale(1.2)}

/* ═══════════════════════════════════════════════════════════════════════ */
/* PHASE 6-7: MULTI-ROLE SELECTOR + PRIMARY/SECONDARY ROLLEN ANZEIGE */
/* ═══════════════════════════════════════════════════════════════════════ */

/* Staff-Edit Modal: Rollen-Checkbox-Liste */
#staffEditRolesList{display:flex;flex-direction:column;gap:4px}
#staffEditRolesList label{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:4px;cursor:pointer;transition:background .15s;font-size:var(--fs-12)}
#staffEditRolesList label:hover{background:var(--panel-border)}
#staffEditRolesList input[type="checkbox"]{width:16px;height:16px;cursor:pointer;accent-color:var(--teal)}
.staff-role-checkbox-icon{display:inline-flex;align-items:center;width:24px;height:24px;border-radius:4px;background:var(--bg);color:var(--teal);font-size:12px;font-weight:600;flex-shrink:0}
#staffEditRolesList label:has(input:checked) .staff-role-checkbox-icon{background:var(--teal);color:#fff;box-shadow:0 0 8px var(--teal)}

/* Rollen-Beschreibungen (unter Checkboxen) */
#staffEditRoleDescriptions{border-left:2px solid var(--teal);padding-left:8px;line-height:1.4;color:var(--text-secondary)}
.role-desc-primary{font-weight:600;color:var(--teal);margin-bottom:2px}
/* Kalender-Display: Primary + Secondary Rollen */
.staff-role-primary{font-size:var(--fs-12);font-weight:600;color:var(--teal);display:flex;align-items:center;gap:4px}
.staff-role-primary::before{content:'🟢';font-size:var(--fs-12)}
.staff-role-secondary{font-size:var(--fs-12);color:var(--muted);margin-top:2px;display:flex;align-items:center;gap:3px;padding-left:12px}
.staff-role-secondary::before{content:'📋 + '}
.staff-roles-container{display:flex;flex-direction:column;gap:1px}
.staff-single-role{font-size:var(--fs-12);color:var(--text-secondary);font-weight:500}.audit-role-change .audit-detail{color:var(--text-secondary);margin-top:2px}/* Staff-Card: Verbesserte Rollen-Anzeige */
.staff-role{line-height:1.6;padding:2px 0}
.staff-role-list{display:flex;flex-wrap:wrap;gap:4px;margin-top:2px}.staff-role-badge.primary{background:var(--teal);color:#fff;font-weight:700}
.staff-role-badge.secondary{background:var(--blue-dim);color:var(--blue);border-color:var(--blue)}

/* Responsive: Mobile Anpassungen */
@media(max-width:600px){
  #staffEditRolesList{max-height:120px}
  .staff-role-primary{font-size:var(--fs-12)}
  .staff-role-secondary{font-size:var(--fs-12);padding-left:8px}}

/* =====================================================   SPRINT 8: MOBILE-FIRST POLISH
   ============================================================ */

/* iOS Safe-Area-Support */
@supports (padding: env(safe-area-inset-bottom)) {
  body { padding-bottom: env(safe-area-inset-bottom); }
}

/* Mobile-Politur (<768px) */
@media (max-width: 768px) {
  /* Padding fuer Mobile-Optimierung */
  .tab-content {
    padding: 6px 8px !important;
  }
  /* KPI-Row Mobile: 2-Spalten statt 4 */
  .kpi-row {
    display: grid !important;
    grid-template-columns: repeat(2, 1fr) !important;
    gap: 6px !important;
  }
  /* Modals Vollbild auf Mobile */
  .modal-box {
    max-width: 96vw !important;
    max-height: 92vh !important;
    margin: 0 8px !important;
    border-radius: 12px !important;
  }
  .modal-box.wide {
    max-width: 96vw !important;
  }
  /* Bessere Touch-Targets */
  .btn, .tab-btn, button, select, input[type="checkbox"], input[type="radio"] {
    min-height: 36px;
  }
  .btn-small {
    min-height: 30px;
    padding: 6px 10px !important;
  }
  /* W3-23: Die frühere `input,select,textarea{font-size:16px!important}` stand HIER, war aber TOT —
     die globale Basis-Regel `input,select,textarea{font-size:var(--fs-13)!important}` (gleiche Spezifität,
     SPÄTERE Source-Order) gewann den !important-Gleichstand und hielt Mobile-Inputs bei 13px → iOS-Zoom.
     Der wirksame Fix steht jetzt am Datei-ENDE (späteste Source-Order, nur Text-Inputs, select ausgenommen). */
}

/* PWA Install Banner */
.pwa-install-banner {
  position: fixed;
  bottom: calc(20px + env(safe-area-inset-bottom, 0px));
  left: 50%;
  transform: translateX(-50%);
  background: var(--panel);
  border: 1px solid var(--teal);
  border-radius: 12px;
  padding: 12px 16px;
  max-width: 380px;
  z-index: 99998;
  box-shadow: 0 4px 20px rgba(0,0,0,.3);
}

/* Touch-Gesten Visualisierung */
.swipe-hint {
  position: fixed;
  top: 50%;
  pointer-events: none;
  font-size: 32px;
  opacity: 0;
  transition: opacity .2s, transform .2s;
  z-index: 99999;
}
.swipe-hint.show { opacity: 0.7; }

/* Pull-to-Refresh Spinner */
.ptr-spinner {
  position: fixed;
  top: -40px;
  left: 50%;
  transform: translateX(-50%);
  width: 36px;
  height: 36px;
  border: 3px solid var(--teal-dim);
  border-top-color: var(--teal);
  border-radius: 50%;
  z-index: 99997;
  transition: top .3s, opacity .3s;
  opacity: 0;
}
.ptr-spinner.active {
  top: 16px;
  opacity: 1;
  animation: ptrSpin 0.8s linear infinite;
}
@keyframes ptrSpin {
  to { transform: translateX(-50%) rotate(360deg); }
}

/* Auto-Dark-Mode bei prefers-color-scheme - aktiv nur wenn User es so will */
@media (prefers-color-scheme: light) {
  :root.auto-theme.light { /* Light-Mode aktiv */ }
}

/* Reduced Motion fuer User mit Vestibular-Issues */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }
}

/* Touch-Action verhindert ungewollte Browser-Gesten */
.calendar-day, .vacation-card, .bounty-card, .conversation-item {
  touch-action: pan-y;
}

/* Schoeneres Scroll-Verhalten auf iOS */
.modal-box, .tab-content {
  -webkit-overflow-scrolling: touch;
}

/* =====================================================   PHASE 9-10: MUTATIONS UI STYLES (988 LINES)
   ============================================================ */

.mutation-form-container{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.5);display:flex;align-items:center;justify-content:center;z-index:1000;animation:fadeIn .2s ease}@keyframes slideUp{from{transform:translateY(100%)}to{transform:translateY(0)}}.mutation-form-container:not([hidden]){display:flex}.mutation-form-container[hidden]{display:none}/* Powered-by Shimmer */
.powered-by-card{position:relative;overflow:hidden}.powered-by-shimmer{position:absolute;top:0;left:-100%;width:55%;height:100%;background:linear-gradient(90deg,transparent,rgba(255,255,255,0.18),rgba(255,255,255,0.08),transparent);animation:shimmer 2.8s ease-in-out infinite;pointer-events:none}@keyframes shimmer{0%{left:-55%}60%{left:110%}100%{left:110%}}.powered-by-card::after{content:'';position:absolute;inset:-1px;border-radius:14px;background:linear-gradient(135deg,rgba(74,222,128,0.2),rgba(20,184,166,0.2),rgba(59,130,246,0.2));z-index:-1;opacity:0;transition:opacity .4s ease;animation:glowPulse 4s ease-in-out infinite}@keyframes glowPulse{0%,100%{opacity:0.3}50%{opacity:0.8}}.powered-by-card:hover::after{opacity:1}
/* Login powered-by */
.login-powered-by{position:relative;margin-top:18px;padding-top:14px;border-top:1px solid var(--panel-border);text-align:center;z-index:10}.login-powered-by .login-partner{display:inline-flex;align-items:center;gap:8px;padding:7px 16px;background:rgba(255,255,255,0.04);border-radius:10px;border:1px solid rgba(20,184,166,0.12);font-size:12px;font-weight:700;color:var(--text-secondary);backdrop-filter:blur(8px);letter-spacing:0.2px}.login-powered-by .login-partner svg{opacity:0.9}
/* =====================================================   V8: Animations + UndoToast + FadeIn + Login-Box
   ============================================================ */
@keyframes fadeIn{from{opacity:0;transform:scale(0.97)}to{opacity:1;transform:scale(1)}}
@keyframes undoToastIn{from{opacity:0;transform:translateY(14px) scale(0.96)}to{opacity:1;transform:translateY(0) scale(1)}}
#undoBar{color:var(--undo-text,#e2e8f0)}
.light #undoBar{color:#1e293b}
.login-box{position:relative!important}


/* =====================================================   HELP PANEL - Slide-in, FAQ Accordion, Chat, Chips
   ============================================================ */
.help-panel-overlay{position:fixed;inset:0;z-index:9989;background:rgba(0,0,0,.28);opacity:0;pointer-events:none;transition:opacity .25s ease}
.help-panel-overlay.open{opacity:1;pointer-events:auto}
.help-panel{position:fixed;top:0;right:0;bottom:0;width:390px;max-width:calc(100vw - 20px);background:var(--panel);border-left:1px solid var(--panel-border);z-index:9990;transform:translateX(100%);transition:transform .28s cubic-bezier(0.4,0,0.2,1);display:flex;flex-direction:column;overflow:hidden;box-shadow:-4px 0 32px rgba(0,0,0,.18)}
.help-panel.open{transform:translateX(0)}
.help-panel-header{display:flex;align-items:center;gap:10px;padding:14px 16px;background:var(--teal-dim);border-bottom:1px solid var(--panel-border);flex-shrink:0}
.help-panel-title{flex:1;font-size:13px;font-weight:700;color:var(--teal)}
.help-panel-close{background:none;border:none;cursor:pointer;color:var(--muted);font-size:18px;padding:2px 6px;border-radius:4px;transition:color .15s}
.help-panel-close:hover{color:var(--text)}
.help-panel-body{flex:1;overflow-y:auto;padding:0}
.help-bullets{padding:12px 16px;background:var(--bg);border-bottom:1px solid var(--panel-border)}.help-bullet{display:flex;align-items:flex-start;gap:6px;margin-bottom:5px;font-size:var(--fs-12);color:var(--text-secondary)}.help-faq{border-bottom:1px solid var(--panel-border)}.help-faq-item{border-top:1px solid var(--panel-border)}
.help-faq-q{display:flex;justify-content:space-between;align-items:center;padding:10px 16px;font-size:var(--fs-12);font-weight:600;color:var(--text);cursor:pointer;user-select:none;transition:background .1s}
.help-faq-q:hover{background:var(--bg)}
.help-faq-q .help-faq-arrow{color:var(--muted);font-size:var(--fs-12);transition:transform .2s;flex-shrink:0}
.help-faq-item.open .help-faq-arrow{transform:rotate(90deg)}.help-faq-item.open .help-faq-a{display:block}
.help-chat{display:flex;flex-direction:column}.help-chat-messages{padding:8px 16px;display:flex;flex-direction:column;gap:8px;min-height:80px;max-height:200px;overflow-y:auto}
.help-msg-bot{background:var(--bg);border:1px solid var(--panel-border);border-radius:0 10px 10px 10px;padding:8px 12px;font-size:var(--fs-12);color:var(--text);line-height:1.6;align-self:flex-start;max-width:92%}
.help-msg-user{background:var(--teal-dim);border:1px solid var(--teal-dim);border-radius:10px 0 10px 10px;padding:8px 12px;font-size:var(--fs-12);color:var(--text);align-self:flex-end;max-width:82%;font-weight:600}
.help-msg-thinking{padding:8px 12px;font-size:var(--fs-12);color:var(--muted);font-style:italic;align-self:flex-start}
@keyframes helpDots{0%,100%{opacity:.3}50%{opacity:1}}
.help-msg-thinking{animation:helpDots 1.2s infinite}
.help-chips{display:flex;flex-wrap:wrap;gap:6px;padding:8px 16px;border-top:1px solid var(--panel-border)}.help-chip:hover{background:var(--teal-dim);border-color:var(--teal);color:var(--teal)}
.help-chat-input{display:flex;gap:6px;padding:10px 16px;border-top:1px solid var(--panel-border);background:var(--panel);flex-shrink:0}
.help-chat-input input{flex:1;padding:7px 10px;border-radius:8px;border:1px solid var(--panel-border);background:var(--bg);color:var(--text);font-size:var(--fs-12);outline:none;transition:border-color .15s}
.help-chat-input input:focus{border-color:var(--teal)}
.help-chat-send{padding:7px 12px;border-radius:8px;background:var(--teal);color:#fff;border:none;cursor:pointer;font-size:12px;font-weight:700;transition:opacity .15s}
.help-chat-send:hover{opacity:0.85}

/* =====================================================   ZULAGEN CARD SYSTEM
   ============================================================ */
.zulagen-header{padding:12px 0 14px;border-bottom:1px solid var(--panel-border);margin-bottom:14px}
.zulagen-ctrl-row{display:flex;align-items:center;gap:10px;margin-bottom:8px;flex-wrap:wrap}
.zulagen-ctrl-label{font-size:var(--fs-12);font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.5px;min-width:90px}
.zulagen-mode-pills{display:flex;gap:4px}
.zulagen-mode-pill{padding:4px 10px;border-radius:10px;border:1px solid var(--panel-border);background:var(--bg);color:var(--text-secondary);font-size:var(--fs-12);font-weight:600;cursor:pointer;transition:all .15s}
.zulagen-mode-pill.active{background:var(--teal);border-color:var(--teal);color:#fff}
.zulagen-ctrl-check{font-size:var(--fs-12);color:var(--text-secondary);display:flex;align-items:center;gap:6px}
.zulagen-cards{display:flex;flex-direction:column;gap:10px}
.zulagen-card{background:var(--panel);border:1px solid var(--panel-border);border-radius:var(--radius);overflow:hidden;transition:box-shadow .2s}
.zulagen-card:hover{box-shadow:0 4px 16px rgba(0,0,0,.12)}
.zulagen-card-header{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;background:var(--bg);border-bottom:1px solid var(--panel-border)}
.zulagen-card-title{display:flex;align-items:center;gap:8px}
.zulagen-card-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0}
.zulagen-card-name{font-size:var(--fs-12);font-weight:700;background:none;border:none;color:var(--text);outline:none;cursor:text;padding:2px 4px;border-radius:3px}
.zulagen-card-name:focus{background:var(--bg);box-shadow:0 0 0 2px var(--teal)}
.zulagen-card-actions{display:flex;align-items:center;gap:6px}
.zulagen-toggle{font-size:var(--fs-12);padding:3px 8px;border-radius:8px;border:1px solid var(--panel-border);background:var(--bg);color:var(--muted);cursor:pointer;transition:all .15s;font-weight:600}
.zulagen-toggle.on{background:var(--teal-dim);border-color:var(--teal);color:var(--teal)}
.zulagen-delete-btn{background:none;border:none;color:var(--muted);cursor:pointer;font-size:16px;padding:0 4px;border-radius:4px;line-height:1;transition:color .15s}
.zulagen-delete-btn:hover{color:var(--red)}
.zulagen-card-body{padding:12px 14px;display:flex;flex-direction:column;gap:10px}
.zulagen-section-label{font-size:var(--fs-12);font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.5px;margin-bottom:4px}
.zulagen-pills{display:flex;flex-wrap:wrap;gap:4px}
.zulagen-day-pill,.zulagen-shift-pill{padding:3px 8px;border-radius:8px;border:1px solid var(--panel-border);background:var(--bg);color:var(--text-secondary);font-size:var(--fs-12);font-weight:600;cursor:pointer;transition:all .15s}
.zulagen-day-pill.active{background:var(--teal);border-color:var(--teal);color:#fff}
.zulagen-day-pill.holiday.active{background:var(--purple);border-color:var(--purple);color:#fff}
.zulagen-shift-pill.active{background:var(--blue-dim);border-color:var(--blue);color:var(--blue)}
.zulagen-timebar{margin:4px 0}
.zulagen-bar-slots{display:flex;height:16px;border-radius:4px;overflow:hidden;background:var(--bg);border:1px solid var(--panel-border)}
.zulagen-bar-slot{flex:1;border-right:1px solid var(--panel-border);transition:background .2s}
.zulagen-bar-slot:last-child{border-right:none}
.zulagen-bar-labels{display:flex;justify-content:space-between;font-size:var(--fs-12);color:var(--muted);padding:0 2px;margin-top:2px}
.zulagen-rates-row{display:flex;gap:10px}
.zulagen-rate-field{flex:1}
.zulagen-rate-field label{font-size:var(--fs-12);color:var(--muted);display:block;margin-bottom:3px}
.zulagen-rate-field input{width:100%;font-size:var(--fs-12);padding:4px 8px;border:1px solid var(--panel-border);border-radius:var(--radius-sm);background:var(--bg);color:var(--text)}
.zulagen-add-btn{width:100%}

/* =====================================================   AUTONOMY SLIDER — Locked State
   ============================================================ */
.autonomy-slider{accent-color:var(--teal)}
.autonomy-slider.locked{accent-color:var(--red);opacity:.8}

/* =====================================================   IMPORT/EXPORT PANEL
   ============================================================ */
.impexp-panel{display:flex;flex-direction:column;gap:12px}
.impexp-card{background:var(--panel);border:1px solid var(--panel-border);border-radius:var(--radius);padding:16px}
.impexp-card.impexp-disabled{opacity:.6}
.impexp-card-header{display:flex;align-items:flex-start;gap:12px}
.impexp-card-icon{font-size:24px;flex-shrink:0}
.impexp-card-title{font-size:13px;font-weight:700;color:var(--text);margin-bottom:3px}.impexp-filters{margin-top:12px;display:flex;flex-direction:column;gap:8px}
.impexp-filter-row{display:flex;gap:8px;flex-wrap:wrap}
.impexp-filter-group{flex:1;min-width:100px}.impexp-btn-row{display:flex;gap:8px}

/* =====================================================   ONBOARDING WIZARD
   ============================================================ */
.wizard-overlay{position:fixed;inset:0;z-index:10000;background:rgba(0,0,0,.6);display:flex;align-items:center;justify-content:center;padding:16px;backdrop-filter:blur(4px)}
.wizard-box{background:var(--panel);border-radius:16px;width:100%;max-width:640px;max-height:90vh;overflow-y:auto;box-shadow:0 24px 64px rgba(0,0,0,.4)}
.wizard-header{display:flex;align-items:center;justify-content:space-between;padding:18px 24px 0}
.wizard-title{font-size:14px;font-weight:700;color:var(--teal)}
.wizard-close{background:none;border:none;font-size:18px;cursor:pointer;color:var(--muted);padding:4px;border-radius:6px;transition:color .15s}
.wizard-close:hover{color:var(--text)}
.wizard-progress{display:flex;align-items:center;padding:16px 24px 0}
.wizard-step-dot{width:28px;height:28px;border-radius:50%;background:var(--bg);border:2px solid var(--panel-border);display:flex;align-items:center;justify-content:center;font-size:var(--fs-12);font-weight:700;color:var(--muted);flex-shrink:0;transition:all .2s}
.wizard-step-dot.active{background:var(--teal);border-color:var(--teal);color:#fff;box-shadow:0 0 0 4px rgba(20,184,166,.2)}
.wizard-step-dot.done{background:var(--green);border-color:var(--green);color:#fff}
.wizard-step-line{flex:1;height:2px;background:var(--panel-border);transition:background .2s}
.wizard-step-line.done{background:var(--green)}
.wizard-body{padding:20px 24px 24px}
.wizard-nav{display:flex;gap:8px;margin-top:20px;padding-top:16px;border-top:1px solid var(--panel-border)}
.wizard-nav .btn{min-width:100px}
.wizard-nav .btn:last-child{margin-left:auto}

/* DSG Briefing */
.wizard-dsg{display:flex;flex-direction:column;gap:10px}
.wizard-dsg-header{text-align:center;margin-bottom:4px}
.wizard-dsg-icon{font-size:32px;display:block;margin-bottom:8px}
.wizard-dsg-header h2{font-size:16px;color:var(--text);margin-bottom:4px}.wizard-dsg-block{background:var(--bg);border:1px solid var(--panel-border);border-radius:var(--radius-sm);padding:10px 12px}
.wizard-dsg-block.wizard-dsg-yes{border-color:var(--green);background:rgba(16,185,129,.06)}
.wizard-dsg-block.wizard-dsg-no{border-color:var(--red);background:var(--red-dim)}.wizard-dsg-confirm{display:flex;align-items:flex-start;gap:8px;font-size:var(--fs-12);color:var(--text);padding:12px;background:var(--teal-dim);border-radius:var(--radius-sm);cursor:pointer;margin-top:4px;border:1px solid var(--teal)}
/* Import modes */
.wizard-import-modes{display:flex;flex-direction:column;gap:8px}
.wizard-mode-card{display:flex;align-items:flex-start;gap:10px;padding:12px;background:var(--bg);border:2px solid var(--panel-border);border-radius:var(--radius);cursor:pointer;transition:all .15s}
.wizard-mode-card.selected,.wizard-mode-card:has(input:checked){border-color:var(--teal);background:var(--teal-dim)}
.wizard-upload-zone{border:2px dashed var(--panel-border);border-radius:var(--radius);padding:24px;text-align:center;cursor:pointer;font-size:var(--fs-12);color:var(--muted);transition:all .2s}
.wizard-upload-zone:hover{border-color:var(--teal);color:var(--teal);background:var(--teal-dim)}

/* =====================================================   MODE PILLS
   ============================================================ */
.mode-pills{display:flex;gap:1px;background:var(--panel-border);border-radius:8px;padding:2px;flex-shrink:0;margin-right:2px}
.mode-pill{background:none;border:none;cursor:pointer;width:26px;height:26px;border-radius:6px;font-size:13px;display:flex;align-items:center;justify-content:center;opacity:.45;transition:all .18s cubic-bezier(0.4,0,0.2,1);line-height:1}
.mode-pill.active{background:var(--panel);opacity:1;box-shadow:0 1px 4px rgba(0,0,0,.18)}
.mode-pill:hover:not(.active){opacity:.75;background:var(--teal-dim)}
@media(max-width:768px){.mode-pill{width:44px;height:44px}}

/* =====================================================   FN-89(b) — ROSTER ZOOM PILLS
   Bewusst EIGENE Klassen statt Wiederverwendung von .mode-pills/.mode-pill (identisches
   visuelles Muster, aber semantisch unabhängig — eine künftige Farbmodus-spezifische
   Anpassung an .mode-pill soll nicht versehentlich die Zoom-Pillen mitverändern).
   ============================================================ */
.roster-zoom-pills{display:flex;gap:1px;background:var(--panel-border);border-radius:8px;padding:2px;flex-shrink:0}
.roster-zoom-pill{background:none;border:none;cursor:pointer;width:22px;height:22px;border-radius:6px;font-size:13px;font-weight:700;display:flex;align-items:center;justify-content:center;opacity:.45;transition:all .18s cubic-bezier(0.4,0,0.2,1);line-height:1;color:var(--text)}
.roster-zoom-pill.active{background:var(--panel);opacity:1;box-shadow:0 1px 4px rgba(0,0,0,.18);color:var(--teal)}
.roster-zoom-pill:hover:not(.active){opacity:.75;background:var(--teal-dim)}
@media(max-width:768px){.roster-zoom-pill{width:38px;height:38px}}
/* Skaliert das gesamte Grid (inkl. sticky Spalten, empirisch verifiziert — s. Kopfkommentar
   setRosterZoom in shiftsTabGrid.js) rein visuell. KEIN Effekt auf deklarierte font-size
   (bleibt ≥12px, R-32/FN-89) — check-font-size.mjs prüft Deklarationen, nicht `zoom`. */
.roster-zoom-compact{zoom:.85}
.roster-zoom-comfort{zoom:1.15}

/* =====================================================   FN-275 — IST/SOLL-SPALTE EIN-/AUSBLENDBAR (Mobile-Platzsparen)
   `.sq-col-istsoll` markiert BEIDE Stellen (Header-<th> UND jede Zeilen-<td>, s.
   _renderRosterTableHeader/renderStatusQuoRow in shiftsTabGrid.js) — eine einzige Regel
   trifft dadurch alle betroffenen Zellen gleichzeitig (Tabellen-Spalten-Verstecken-
   Standardtechnik). `display:none` entfernt die Zellen automatisch auch aus dem
   Accessibility-Tree (kein separates aria-hidden-Handling nötig). Die unabhängig
   positionierte SALDO-Spalte (right:0) ist von dieser Regel NICHT betroffen — sie hängt
   nicht an IST/SOLLs Position (s. Kommentar bei _renderRosterTableHeader in
   shiftsTabGrid.js), bleibt beim Ausblenden also unverändert am rechten Rand stehen. */
.roster-hide-istsoll .sq-col-istsoll{ display:none; }
/* Aktiv-Zustand des Toggle-Buttons (shiftsTabIstSollToggle.js `toggleRosterIstSoll()`
   toggelt diese Klasse per JS, KEIN Re-Render) — bewusst eigene Klasse statt Wieder-
   verwendung von .roster-zoom-pill.active (andere Baseline: ein einzelner .btn.btn-outline
   statt einer Pillen-Gruppe). */
.roster-istsoll-toggle.active{ background:var(--teal-dim); border-color:var(--teal); color:var(--teal); }

/* =====================================================   FN-304 (Paket 12) — DRAG-MALEN: LIVE-VORSCHAU
   Markiert jede vom Pinsel-Zug überstrichene Zelle WÄHREND des Ziehens — bewusst KEINE
   neue Farbe: exakt dasselbe teal/teal-dim-Auswahl-Paar, das der aktive Pinsel-Chip
   (renderBrushBar()) UND .roster-zoom-pill.active bereits für "aktiv/ausgewählt"
   verwenden (s.o.). `outline` statt `border`, damit die bestehende 1px-Zellrandlinie
   (role="gridcell" inline-style) unangetastet bleibt — kein Reflow der Spaltenbreiten
   während des Ziehens (AK "Vorschau ohne Layout-Thrash"). `!important` auf background
   nötig: die Zelle trägt bereits einen INLINE `background:...` (renderDayCell(),
   shiftsTabGrid.js) für ihren fachlichen Zustand (Ferien/Absenz/Frei/…) — die
   Drag-Vorschau muss diesen sichtbar überlagern, exakt dieselbe Technik wie
   `.roster-hide-istsoll .sq-col-istsoll{display:none}` bereits gegen ein Inline-`style`
   durchsetzen musste (s. FN-277-Historie). */
.sq-drag-preview{ outline:2px solid var(--teal); outline-offset:-2px; background:var(--teal-dim) !important; }
/* Während eines aktiven Zugs wird Scrollen der Matrix unterdrückt (shiftsTabBrushDrag.js
   setzt/entfernt diese Klasse auf dem role="region"-Scroll-Wrapper, s. loadStatusQuo()) —
   OHNE aktiven Zug bleibt normales Scrollen (auch Touch) unverändert möglich. */
.sq-drag-scroll-lock{ touch-action:none; }

/* =====================================================   FN-304 (Paket 12b) — UNDO/REDO-LEISTE
   Zwei dauerhafte Buttons in der bestehenden Matrix-Toolbar (Muster: der direkt
   daneben liegende IST/SOLL-Toggle-Button, s.o. — identische .btn.btn-small.btn-outline-
   Baseline, keine neue Button-Optik). `.invalidated` markiert einen Stack-Eintrag, dessen
   Undo-Token(s) serverseitig ungültig geworden sind (8s-TTL abgelaufen ODER Monat
   inzwischen versiegelt) — AUSGEGRAUT statt aus dem Stack entfernt (Konzept-Vorgabe). */
.roster-undoredo-btn[disabled]{ opacity:.35; cursor:not-allowed; }
.roster-undoredo-btn.invalidated{ opacity:.5; }

/* =====================================================   GUIDED TOUR ENGINE
   ============================================================ */
/* Overlay (gedimmt, aber Highlight-Ring übernimmt Spotlight) */
.tour-overlay{position:fixed;inset:0;z-index:99990;cursor:default}

/* Highlight-Ring Pulse Animation */
@keyframes tourRingPulse{0%,100%{box-shadow:0 0 0 4000px rgba(0,0,0,.62),0 0 0 rgba(20,184,166,.6)}50%{box-shadow:0 0 0 4000px rgba(0,0,0,.65),0 0 22px 4px rgba(20,184,166,.8)}}

/* Tour Card */
.tour-card{
  position:fixed;z-index:99993;
  width:320px;max-width:calc(100vw - 32px);
  background:var(--panel);border:1.5px solid var(--teal);
  border-radius:14px;padding:18px;
  box-shadow:0 16px 48px rgba(0,0,0,.5),0 0 0 1px rgba(20,184,166,.2);
  animation:fadeIn .2s ease;
}
.tour-card-header{display:flex;align-items:center;gap:8px;margin-bottom:12px}
.tour-progress-bar{flex:1;height:4px;background:var(--panel-border);border-radius:2px;overflow:hidden}
.tour-progress-fill{height:100%;background:var(--teal);border-radius:2px;transition:width .3s ease}.tour-card-title{font-size:14px;font-weight:800;color:var(--text);margin-bottom:8px;letter-spacing:-.01em}
.tour-card-text{font-size:12px;color:var(--text-secondary);line-height:1.7;margin-bottom:14px}
.tour-card-actions{display:flex;gap:6px;align-items:center}
.tour-btn{padding:7px 14px;border-radius:8px;font-size:var(--fs-12);font-weight:700;cursor:pointer;border:none;transition:all .15s}
.tour-btn-primary{background:var(--teal);color:#fff;margin-left:auto}
.tour-btn-primary:hover{background:#0d9488}
.tour-btn-outline{background:transparent;border:1px solid var(--panel-border);color:var(--text-secondary)}
.tour-btn-outline:hover{border-color:var(--teal);color:var(--teal)}
.tour-btn-ghost{background:none;color:var(--muted);padding:7px 8px}
.tour-btn-ghost:hover{color:var(--red)}

/* Tour section in help panel */
.help-tour-section{border-top:1px solid var(--panel-border)}

/* =====================================================   MUTATIONS WIDGET v9.8 — Schicht-Tausch-System
   ============================================================ */
.mutation-item {
  animation: mutationSlideIn 0.3s ease-out;
}
@keyframes mutationSlideIn {
  from { opacity: 0; transform: translateY(-8px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* ============================================================ */
/* Rollen-basierte Sichtbarkeit (Migration 026)                  */
/* Elemente mit data-requires="scheduler" werden für Nicht-Planer */
/* via .role-hidden ausgeblendet.                                */
/* ============================================================ */
.role-hidden { display: none !important; }
body.role-employee .ai-only,
body.role-employee [data-requires="scheduler"] { display: none !important; }
body.role-employee .wunsch-slider-panel { display: block; }
body.role-planner  .wunsch-slider-panel { display: none; }
.wunsch-slider-panel {
  background: var(--panel);
  border: 1px solid var(--teal);
  border-radius: var(--radius);
  padding: 12px;
  margin-bottom: 12px;
  box-shadow: var(--shadow);
}
.wunsch-mode-tabs {
  display: flex;
  gap: 4px;
  flex-wrap: wrap;
  margin-bottom: 10px;
}
.wunsch-mode-tab {
  flex: 1;
  min-width: 84px;
  padding: 6px 10px;
  border: 1px solid var(--panel-border);
  background: var(--bg);
  color: var(--text-secondary);
  border-radius: var(--radius-sm);
  cursor: pointer;
  font-size:var(--fs-12);
  text-align: center;
}
.wunsch-mode-tab.active {
  background: var(--teal-dim);
  border-color: var(--teal);
  color: var(--teal);
  font-weight: 700;
}
.wunsch-slider-row {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-top: 8px;
  font-size:var(--fs-12);
}
.wunsch-slider-row input[type=range] {
  flex: 1;
  accent-color: var(--teal);
}
.wunsch-help {
  font-size:var(--fs-12);
  color: var(--muted);
  margin-top: 6px;
  line-height: 1.5;
}

/* === Smart-Date-Input (direkte Datumseingabe TT.MM.JJJJ + Kalender) === */
.smart-date { display: flex; gap: 6px; align-items: stretch; position: relative; }
.smart-date .smart-date-text { flex: 1; min-width: 0; }
.smart-date .smart-date-cal-btn {
  flex: 0 0 auto; width: 40px; border: 1px solid var(--panel-border);
  border-radius: var(--radius-sm, 8px); background: var(--bg); color: var(--text);
  cursor: pointer; font-size: 15px; line-height: 1; padding: 0;
}
.smart-date .smart-date-cal-btn:hover { border-color: var(--teal); }
.smart-date .smart-date-native {
  position: absolute; right: 0; bottom: 0; width: 1px; height: 1px;
  opacity: 0; pointer-events: none; border: 0; padding: 0; margin: 0;
}

/* === Chat / Nachrichten — WhatsApp-Look (Feature 3) === */
.chat-msg .msg-sender { font-size:var(--fs-12); color: var(--teal); font-weight: 700; margin-bottom: 2px; }
.chat-msg .msg-subject { font-size:var(--fs-12); color: var(--muted); font-weight: 600; margin-bottom: 2px; }
.chat-msg .msg-text { white-space: pre-wrap; word-break: break-word; }
.chat-msg .msg-meta { align-items: center; justify-content: flex-end; gap: 4px; }
.chat-msg .msg-time { font-size:var(--fs-12); }
.chat-msg .msg-tick { font-size:var(--fs-12); opacity: .85; }
.chat-msg .msg-trans { font-size:var(--fs-12); padding: 0 3px; background: transparent; border: none; cursor: pointer; opacity: .7; }
.chat-msg .msg-trans:hover { opacity: 1; }
.chat-msg .msg-media {
  display: block; max-width: 260px; max-height: 260px; width: 100%;
  border-radius: 10px; margin: 2px 0 4px; cursor: pointer; object-fit: cover; background: #000;
}
.chat-msg.has-media { padding: 4px; }
.chat-msg.has-media .msg-meta { padding: 0 6px 2px; }
.chat-msg .msg-audio { display: block; max-width: 240px; margin: 2px 0 4px; }
.chat-msg .msg-file {
  display: flex; align-items: center; gap: 8px; margin: 2px 0 4px; padding: 8px 10px;
  border-radius: 10px; background: rgba(0,0,0,.12); text-decoration: none; color: inherit; max-width: 260px;
}
.chat-msg.received .msg-file { background: var(--teal-dim); }
.chat-msg .msg-file-icon { font-size: 20px; flex-shrink: 0; }
.chat-msg .msg-file-meta { display: flex; flex-direction: column; min-width: 0; flex: 1; }
.chat-msg .msg-file-name { font-size:var(--fs-12); font-weight: 700; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.chat-msg .msg-file-size { font-size:var(--fs-12); opacity: .75; }
.chat-msg .msg-file-dl { font-size: 13px; flex-shrink: 0; }

/* Anhang-Vorschau im Eingabefeld (vor dem Senden) */
.chat-pending { width: 100%; margin-bottom: 6px; }
.chat-pending-inner {
  display: flex; align-items: center; gap: 8px; padding: 6px 9px;
  border: 1px solid var(--teal); border-radius: 10px; background: var(--teal-dim);
}
.chat-pending-name { font-size:var(--fs-12); font-weight: 700; color: var(--text); flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }.chat-pending-x { border: none; background: transparent; color: var(--red); font-size: 13px; cursor: pointer; padding: 2px 4px; flex-shrink: 0; }

/* Vollbild-Lightbox für Bilder/Videos */
.media-lightbox {
  position: fixed; inset: 0; z-index: 100050; background: rgba(0,0,0,.92);
  display: flex; align-items: center; justify-content: center;
}
.media-lightbox-close {
  position: absolute; top: 14px; right: 16px; width: 38px; height: 38px; border-radius: 50%;
  border: none; background: rgba(255,255,255,.14); color: #fff; font-size: 17px; cursor: pointer;
}
.media-lightbox-close:hover { background: rgba(255,255,255,.28); }

/* =====================================================   v9.9 Mobile-UX (Feedback 2026-06-13)
   #4 Alarm-/Live-Sidebar unter der ECHTEN Topbar-Hoehe verankern, damit der
      Close-Button nie vom (mobil mehrzeiligen, ~139px hohen) Header ueberdeckt
      wird. --topbar-h wird per JS gesetzt (updateTopbarMetrics()).
   #3 Tab-Leiste: bei Ueberlauf scrollbar + sichtbare Rechts-Fade-Affordance und
      justify-content:flex-start (sonst klippt zentrierter Overflow den 1. Reiter).
   #2 Filter-/Control-Dropdowns stapeln auf schmalen Screens sauber (statt 2+1).
   ============================================================ */

/* #4 — Sidebars dynamisch unter der Topbar */
#alarmSidebar, #liveBrowserSidebar{
  top: var(--topbar-h, 52px);
  height: calc(100vh - var(--topbar-h, 52px));
}
@supports (height: 100dvh){
  #alarmSidebar, #liveBrowserSidebar{ height: calc(100dvh - var(--topbar-h, 52px)); }
}
/* groessere, sicher erreichbare Close-Trefferflaeche auf Mobile (inline-Style ueberschreiben) */
@media(max-width:600px){
  #alarmSidebar .sidebar-head button, #liveBrowserSidebar .sidebar-head button{
    font-size:16px!important; padding:7px 12px!important; min-width:40px; min-height:34px;
  }
  #alarmSidebar .sidebar-head, #liveBrowserSidebar .sidebar-head{ padding:10px 12px; }
}

/* #3 — Tab-Leiste Scroll-Affordance (Klasse via updateTopbarMetrics()) */
.topbar-center.tabs-scrollable{
  justify-content: flex-start;
  -webkit-mask-image: linear-gradient(to right, #000 calc(100% - 20px), transparent 100%);
          mask-image: linear-gradient(to right, #000 calc(100% - 20px), transparent 100%);
}

/* #2 — Dropdown-Leisten auf schmalen Screens sauber stapeln */
@media(max-width:600px){
  #shiftSharedFilters, #maWuenscheFilters{
    flex-direction: column; align-items: stretch; gap: 6px;
  }
  #shiftSharedFilters > select, #maWuenscheFilters > select{
    width: 100%; min-width: 0; flex: 1 1 auto;
  }
  #publishBar .card-body{ flex-direction: column; align-items: stretch; gap: 6px; }
  #publishBar .card-body > select, #publishBar .card-body > button{ width: 100%; }
}

/* v9.9 Per-User Kachel-Anordnung (Dienstplan) — Drag-to-Reorder, nur Desktop/Admin/Planer */
#tabShifts.tiles-reordering .card[draggable="true"]{
  cursor: move;
  outline: 2px dashed var(--teal);
  outline-offset: 2px;
  position: relative;
}
#tabShifts.tiles-reordering .card[draggable="true"]::before{
  content: "⠿ ziehen";
  position: absolute; top: 6px; right: 8px;
  font-size:var(--fs-12); font-weight: 700; color: #fff;
  background: var(--teal); padding: 1px 7px; border-radius: 6px;
  pointer-events: none; z-index: 3; opacity: .92;
}
#tabShifts .card.tile-dragging{ opacity: .45; }
/* Anordnen NUR am PC: Leiste mobil hart ausblenden (JS blendet zusätzlich aus, Anwendung läuft weiter) */
@media (max-width: 768px){ #shiftReorderBar{ display: none !important; } }

/* ════════════════════════════════════════════════════════════════════
   v9.9 — Landing-Refresh & idiotensicheres Login (2026-06-13)
   Neue Feature-Badges, Story-„Moving Picture", Login-Redesign + klar
   getrennter Demo-Modus. (Das ursprünglich hier geplante AZI-Logo-Drop-in
   + Login-Partner-Badge wurde nie ans Live-Login verdrahtet — 0 Treffer
   für azi-logo, azi-has-img, login-partner und lp-partner-card im ganzen
   App-Shell — komplett tot, 2026-07-24 mit FN-89-Folgearbeiten gelöscht,
   s. BACKLOG.md FN-89.)
   ════════════════════════════════════════════════════════════════════ */

/* ── Skip-Link (a11y): nur bei Fokus sichtbar — ersetzt inline onfocus/onblur (CSP) ──── */
.skip-link:focus{left:8px !important}

/* ════════ LOGIN — idiotensicher + Demo klar getrennt ════════════════ */
.login-back{position:absolute;top:12px;left:12px;width:30px;height:30px;border-radius:9px;border:1px solid var(--panel-border);background:var(--bg);color:var(--text-secondary);font-size:16px;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .15s;z-index:5}
.login-back:hover{color:var(--teal);border-color:var(--teal)}
.login-logo-emoji{font-size:28px;margin-bottom:4px;line-height:1;display:none}
.login-help{font-size:var(--fs-12);color:var(--muted);line-height:1.5;margin:0 0 14px;text-align:center}
.login-forgot{font-size:var(--fs-12);color:var(--teal);text-decoration:none;font-weight:600}
.login-forgot:hover{text-decoration:underline}
.login-switch-hint{font-size:var(--fs-12);color:var(--muted);text-align:center;margin-top:14px}
.login-switch-hint a{color:var(--teal);font-weight:700;text-decoration:none}
.login-switch-hint a:hover{text-decoration:underline}

/* Demo-Tab + Demo-CTA: bewusst violett = „Spielwiese", klar vom echten Login getrennt */
.login-mode-btn--demo.active{background:rgba(139,92,246,.14);color:#a78bfa;box-shadow:0 0 0 1px rgba(139,92,246,.55)}
.login-box .login-btn--demo{background:linear-gradient(135deg,#8b5cf6,#6366f1)}
.login-box .login-btn--demo:hover{box-shadow:0 4px 16px rgba(139,92,246,.4)}
.login-demo-banner{font-size:var(--fs-12);line-height:1.55;color:var(--text-secondary);background:rgba(139,92,246,.10);border:1px solid rgba(139,92,246,.28);border-radius:10px;padding:10px 12px;margin-bottom:14px;text-align:left}
.login-demo-banner b{color:#a78bfa}
.login-box--demo{box-shadow:0 20px 60px rgba(0,0,0,.4),0 0 0 2px rgba(139,92,246,.38)}

/* ════════════════════════════════════════════════════════════════════
   v9.9 r24 (Punkt 2): Kalender — kompakte, farbcodierte Kategorie-Badges
   pro Tageszelle (Absenz · Ferien · Sperre · Sitzung). Eine Reihe, umbruch-
   fähig, klar lesbar. Klick auf den Tag öffnet die Tages-Detailansicht.
   ════════════════════════════════════════════════════════════════════ */
.cal-day .cal-badges{display:flex;flex-wrap:wrap;gap:3px;justify-content:center;align-items:center;margin:3px 0 1px;line-height:1.3}
.cal-day .cal-badges>div{margin:0!important}.cal-day .cal-vacation{font-size:var(--fs-12);font-weight:700;color:var(--blue)}
.cal-day{cursor:pointer}
.cal-day:hover{box-shadow:0 0 0 1px var(--teal);transition:box-shadow .12s}

/* ════════════════════════════════════════════════════════════════════
   v9.9 r24 (Punkt 3): Alarm-Center — zentraler Posteingang. Eine Karte je
   offener Eingang mit Vorfall, Name und konsistenter Aktionsleiste.
   ════════════════════════════════════════════════════════════════════ */
.alarm-entry{border:1px solid var(--panel-border);border-radius:8px;padding:8px 9px;margin-bottom:7px;background:var(--bg)}
.alarm-entry-head{display:flex;align-items:flex-start;gap:8px}
.alarm-entry-icon{font-size:16px;line-height:1.2;flex-shrink:0}
.alarm-entry-title{font-size:var(--fs-12);font-weight:700;color:var(--text);line-height:1.3;word-break:break-word}.alarm-entry-actions{display:flex;flex-wrap:wrap;gap:5px;margin-top:8px}
.alarm-entry-actions .btn{font-size:var(--fs-12);padding:4px 8px}

/* ════════════════════════════════════════════════════════════════════
   ROSIE — VISION 2028 DESIGN LAYER (r26)
   Reine Override-Schicht (gleiche Selektoren, neuer Look). Original-Styles
   bleiben oben erhalten + in rosie.legacy.css. Keine Logik/Funktion betroffen.
   ════════════════════════════════════════════════════════════════════ */

/* ── 1) Token-Layer: Skalen + neue Variablen (vererben pro Theme) ── */
:root{
  --ease:cubic-bezier(.2,.7,.2,1);
  --brand-2:#0b8295;
  /* FLO-DIREKTIVE-2026-08-24-NACHZUG (s. Erklärblock am Dateiende): erster
     Stop kommt jetzt aus --brand-1 (Coral/Plum-Familie) statt --teal —
     --teal bleibt als geteilte, breit genutzte Variable unangetastet. */
  --grad-primary:linear-gradient(135deg,var(--brand-1,var(--heute-coral)),var(--brand-2,var(--heute-plum)));
  --radius:12px;--radius-sm:8px;--radius-lg:16px;--radius-xl:22px;--radius-pill:999px;
  --green-dim:rgba(16,185,129,.16);
  --hairline:rgba(148,163,184,.16);
  --surface-2:rgba(148,163,184,.06);
  --shadow:0 8px 24px -16px rgba(0,0,0,.55),0 2px 6px -3px rgba(0,0,0,.4);
  --e1:0 1px 2px rgba(0,0,0,.4);
  --e2:0 12px 30px -16px rgba(0,0,0,.6),0 3px 8px -4px rgba(0,0,0,.45);
  --e3:0 28px 64px -22px rgba(0,0,0,.72);
  --ring:rgba(34,211,238,.40);
  --btn-glow:0 12px 26px -10px rgba(20,184,166,.55);
}
.light{
  --brand-2:#07819f;
  --panel-border:#e6ecf4;
  --green-dim:rgba(5,150,105,.12);
  --hairline:rgba(15,23,42,.08);
  --surface-2:rgba(15,23,42,.03);
  --shadow:0 10px 30px -18px rgba(15,23,42,.22),0 2px 6px -3px rgba(15,23,42,.08);
  --e1:0 1px 2px rgba(15,23,42,.06);
  --e2:0 14px 34px -20px rgba(15,23,42,.20),0 3px 8px -5px rgba(15,23,42,.08);
  --e3:0 34px 72px -28px rgba(15,23,42,.28);
  --ring:rgba(13,148,136,.28);
  --btn-glow:0 12px 26px -12px rgba(13,148,136,.42);
}
.nightshift{--brand-2:#0f8578;--green-dim:rgba(16,185,129,.14);--btn-glow:0 12px 26px -10px rgba(45,212,191,.5);--ring:rgba(45,212,191,.4);--hairline:rgba(161,161,170,.18);--surface-2:rgba(161,161,170,.06)}
.preset-rose{--brand-2:#f0abfc;--green-dim:rgba(244,114,182,.16);--btn-glow:0 12px 26px -10px rgba(217,70,239,.5);--ring:rgba(217,70,239,.4);--hairline:rgba(249,168,212,.18);--surface-2:rgba(249,168,212,.06)}
.preset-rose.light{--brand-2:#c814e3;--green-dim:rgba(190,24,93,.12);--btn-glow:0 12px 26px -12px rgba(192,38,211,.4);--ring:rgba(192,38,211,.28);--hairline:rgba(157,23,77,.12);--surface-2:rgba(157,23,77,.04)}

/* ── 2) Basis ── */
body{font-size:13px;line-height:1.55}

/* ── 3) Schattierte Buttons (Hover-Lift, Active, Focus-Ring) ── */
.btn{font-size:12px;font-weight:600;text-transform:none;letter-spacing:0;border-radius:var(--radius);padding:10px 18px;transition:transform .16s var(--ease),box-shadow .16s var(--ease),background .16s,border-color .16s,color .16s,filter .16s}
.btn:focus-visible{outline:none;box-shadow:0 0 0 3px var(--ring)}
/* UI-1b (ARBEITSAUFTRAG-2026-08-27_PERSONALBEDARF-KI-PLANUNG.md §8) — Flo-Rücknahme des
   Zweifarb-Verlaufs ("Instagram-like") auf .btn-primary. EIN einheitlicher Flächenton für
   alle vier Themes: dunkles Teal/Petrol #0D8478, bewusst nah am bestehenden --teal-Token
   (:root #0f8578 / .light #0d8478), also keine neue Markenfarbe. --grad-primary/--brand-1/
   --brand-2 bleiben definiert (evtl. anderweitig referenziert / historische Doku), nur die
   .btn-primary-Basisregel wechselt auf den festen Token. Kontrast #0D8478 vs. #fff = 4.58:1
   (AA-Text), vs. jeden --bg der vier Themes >= 4.0:1 (AA-UI). Die 4–5 lokalen .btn-primary-
   Overrides mit background:var(--heute-coral) (cockpit-inbox / #staffAdminBtnRow / .conv-head
   / #alertEditorCard / #tabIdeas #ideaForm) sind bewusst NICHT Teil dieses Pakets — eigener
   kleiner Folgeauftrag, s. §8 „AUSSER SCOPE". */
:root{--btn-primary-bg:#0D8478}
.btn-primary{background:var(--btn-primary-bg);color:#fff;box-shadow:var(--btn-glow),inset 0 1px 0 rgba(255,255,255,.18)}
.btn-primary:hover{transform:translateY(-2px);filter:brightness(1.1)}
.btn-primary:active{transform:translateY(0) scale(.985);filter:brightness(.97)}
.btn-outline{background:var(--surface-2);border:1px solid var(--panel-border);color:var(--text);box-shadow:var(--e1)}
.btn-outline:hover{border-color:var(--teal);color:var(--teal);transform:translateY(-1px);box-shadow:var(--e2)}
.btn-outline:active{transform:translateY(0) scale(.985)}
.btn-danger{box-shadow:0 12px 24px -10px rgba(239,68,68,.5)}
.btn-danger:hover{transform:translateY(-2px);filter:brightness(1.05)}
.btn-amber{box-shadow:0 12px 24px -10px rgba(245,158,11,.5)}
.btn-amber:hover{transform:translateY(-2px);filter:brightness(1.05)}
.btn-small{font-size:var(--fs-12);padding:7px 13px;border-radius:var(--radius-sm);min-height:36px;display:inline-flex;align-items:center;justify-content:center;gap:4px}

/* ── 4) Navigation / Tabs ── */
.topbar{border-bottom-color:var(--hairline);box-shadow:var(--e1)}
.topbar-logo{font-size:15px}
.topbar-center .tab-btn{font-size:var(--fs-12);padding:7px 14px;letter-spacing:.03em;transition:all .16s var(--ease)}
.topbar-center .tab-btn:hover{color:var(--text);background:var(--surface-2);border-color:var(--panel-border)}
.topbar-center .tab-btn.active{background:var(--teal-dim);border-color:var(--teal);color:var(--teal);box-shadow:var(--e1)}
.topbar-right .user-badge{font-size:var(--fs-12);padding:5px 12px;border-radius:var(--radius-pill)}
.topbar-right .icon-btn{width:32px;height:32px;font-size:15px;border-radius:var(--radius-sm)}

/* ── 5) Cards (Kacheln) + Elevation ── */
.card{border-radius:var(--radius-lg);box-shadow:var(--e2);border-color:var(--hairline)}
.card-head{padding:13px 16px;border-bottom-color:var(--hairline)}
.card-title{font-size:12px;letter-spacing:.04em;color:var(--text)}
.card-body{padding:16px}
.feature-card,.stat-card,.pattern-card,.team-card,.suggestion-card,.vacation-card,.template-card,.portal-card{border-radius:var(--radius-lg);box-shadow:var(--e2);border-color:var(--hairline)}
.feature-card:hover,.template-card:hover{transform:translateY(-2px);box-shadow:var(--e3)}
.staff-card{border-radius:var(--radius-lg);box-shadow:var(--e1);border-color:var(--hairline)}
.staff-card:hover{border-color:var(--teal);transform:translateY(-2px);box-shadow:var(--e2)}
/* Progressive Disclosure: Actions nur bei Hover/Focus sichtbar */
.staff-card .staff-actions{opacity:0;transform:translateY(4px);transition:opacity .15s,transform .15s;pointer-events:none}
.staff-card:hover .staff-actions,.staff-card:focus-within .staff-actions{opacity:1;transform:translateY(0);pointer-events:auto}
@media(hover:none){.staff-card .staff-actions{opacity:1;transform:none;pointer-events:auto}}

/* ── 6) Modals (Glas + Elevation) ── */
.modal-overlay{background:rgba(2,6,16,.62);backdrop-filter:blur(14px)}
.light .modal-overlay{background:rgba(15,23,42,.36)}
.modal-box{border-radius:var(--radius-xl);box-shadow:var(--e3);padding:26px;border-color:var(--hairline)}
.modal-box h3{font-size:16px}
/* Modal-Size-System: konsistente Breiten via CSS-Klasse statt Inline-Style */
.modal-box.modal-sm{max-width:380px}
.modal-box.modal-md{max-width:480px}
.modal-box.modal-lg{max-width:640px}
.modal-box.modal-xl{max-width:860px}
@media(max-width:600px){
  .modal-box{width:calc(100vw - 32px)!important;max-width:none!important;margin:0 auto}
}
.login-box,.welcome-box{box-shadow:var(--e3);border-color:var(--hairline)}

/* ── R-30: <dialog>-Primitive (app-shell/ui-dialog.js) ──────────────────────
   Natives <dialog> statt eines separaten .modal-overlay-Divs: .modal-box/.confirm-box/
   .prompt-box werden DIREKT auf das <dialog>-Element gesetzt (identisches visuelles
   Ergebnis, s. o.), die frühere Overlay-Dimmung wird zu ::backdrop. Bare-Tag-Selektor
   (Spezifität 0,0,1) — verliert IMMER gegen jede Klassen-Regel, unabhängig von der
   Reihenfolge im Stylesheet, daher unkritisch platzierbar. UA-Defaults für <dialog>
   (color:CanvasText, border:solid, padding:1em) werden hier zurückgesetzt, weil .modal-
   box/.confirm-box/.prompt-box selbst keinen color/border/padding-Reset vorsehen (sie
   waren nie für den Einsatz als <dialog>-Wurzel gedacht — border/padding setzen sie
   ohnehin explizit, nur color+margin fehlten). */
dialog{margin:auto;color:inherit}
dialog.modal-box::backdrop{background:rgba(2,6,16,.62);backdrop-filter:blur(14px)}
.light dialog.modal-box::backdrop{background:rgba(15,23,42,.36)}
dialog.confirm-box::backdrop,dialog.prompt-box::backdrop{background:rgba(0,0,0,.55);backdrop-filter:blur(6px)}
/* Familie-B-Ad-hoc-Modals (adminTab*.js/shiftsTabGrid.js/vacationsTab.js) hatten je
   nach Stelle leicht unterschiedliche Backdrop-Werte (kein gemeinsames .modal-overlay) —
   3 Varianten reichen, um jede Stelle visuell IDENTISCH zu halten (kein Redesign). */
dialog.rz-bd-a::backdrop{background:rgba(0,0,0,.6);backdrop-filter:blur(6px)}
dialog.rz-bd-b::backdrop{background:rgba(0,0,0,.6)}
dialog.rz-bd-c::backdrop{background:rgba(0,0,0,.75);backdrop-filter:blur(8px)}
/* videoModal.js/messagesTab.js-Lightbox: .modal-overlay lebt (wie bisher als Div) DIREKT auf
   dem <dialog>-Element selbst — die Dimmung/Blur kommt hier weiterhin aus der bereits
   bestehenden .modal-overlay-Klasse (position:fixed;inset:0;background;backdrop-filter, s.o.),
   NICHT aus ::backdrop. Transparent halten, damit kein UA-Default-::backdrop-Dim zusätzlich
   HINTER dem ohnehin blickdichten, viewport-füllenden .modal-overlay-Element durchscheint. */
dialog.modal-overlay::backdrop{background:transparent}

/* ── 7) Formular-Elemente (Fokus-Ring) ── */
.form-group label{font-size:var(--fs-12);letter-spacing:.03em;color:var(--text-secondary)}
.form-group input,.form-group select,.form-group textarea{border-radius:var(--radius-sm);padding:10px 12px;font-size:13px}
/* #3 FIX: kompakte, lesbare Zeit-Eingabefelder (Schicht-/Bürotag-/Sitzungs-Editor). Spinner-Pfeile ausgeblendet, zentriert, breit genug für 2-stellige Zahlen. */
input.sd-time,.form-group input.sd-time{width:54px;min-width:54px;max-width:56px;padding:5px 4px;font-size:14px;text-align:center;-moz-appearance:textfield;appearance:textfield}
input.sd-time::-webkit-outer-spin-button,input.sd-time::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
.form-group input:focus,.form-group select:focus,.form-group textarea:focus{border-color:var(--teal);box-shadow:0 0 0 3px var(--ring)}

/* ── 8) Pills / KPI / Badges (Mikro-Typo-Fix: 7–8px → lesbar) ── */
.pill{border-radius:var(--radius-sm);padding:6px 8px}
.pill .lbl{font-size:var(--fs-12)}
.pill .val{font-size:15px}
.kpi-item{border-radius:var(--radius-sm);border-color:var(--hairline);box-shadow:var(--e1)}
.kpi-item .kpi-label{font-size:var(--fs-12)}
.wish-badge{font-size:var(--fs-12);padding:2px 8px;border-radius:var(--radius-sm)}

/* ── 9) Pilot Dienstplanung: Karten-Inhalte (klassenbasiert) ── */
.bounty-item{border-radius:var(--radius-sm);border-color:var(--hairline);transition:all .16s var(--ease)}
.bounty-item:hover{border-color:var(--teal);transform:translateY(-1px);box-shadow:var(--e1)}
.bounty-item .bounty-info .title{font-size:12px}
.bounty-item .bounty-info .meta{font-size:var(--fs-12)}
.bounty-item .bounty-action{border-radius:var(--radius-sm);padding:7px 14px;font-size:var(--fs-12);box-shadow:var(--btn-glow)}
.bounty-item .bounty-action:hover{transform:translateY(-1px);filter:brightness(1.05)}
.wish-form{border-radius:var(--radius-lg);box-shadow:var(--e1);border-color:var(--hairline);padding:14px;gap:10px}
.signal-item,.feed-item{border-radius:var(--radius-sm)}
.wish-row{display:flex;align-items:center;gap:8px;padding:8px 10px;background:var(--bg);border:1px solid var(--hairline);border-left:3px solid var(--amber);border-radius:var(--radius-sm);margin-bottom:6px;font-size:12px;flex-wrap:wrap;transition:all .16s var(--ease)}
.wish-row:hover{box-shadow:var(--e1)}
.wish-row-name{min-width:120px;font-weight:600}
.wish-row-date{color:var(--text-secondary)}
.wish-row-prio{font-size:var(--fs-12);color:var(--muted)}
.wish-row-note{font-size:var(--fs-12);color:var(--text-secondary);flex:1}

/* ── 10) Alarm-Center-Einträge (leichter Lesbarkeits-Bump) ── */
.alarm-entry-title{font-size:var(--fs-12)}
.alarm-entry-sub{font-size:var(--fs-12)}
.alarm-entry-actions .btn{font-size:var(--fs-12);padding:5px 10px}

/* ── 11) Welle 2: Kalender (Tageszellen, Badges, Dots, Nav) ── */
.shift-calendar{gap:6px}
.cal-day{min-height:80px;padding:8px 6px;border-color:var(--hairline);border-radius:var(--radius-sm);transition:transform .14s var(--ease),box-shadow .14s,border-color .14s}
.cal-day:hover{border-color:var(--teal);transform:translateY(-2px);box-shadow:var(--e2)}
.cal-day.today{border-color:var(--teal);box-shadow:0 0 0 2px var(--teal-dim),var(--e1)}
.cal-day .day-name{font-size:var(--fs-12);font-weight:600;letter-spacing:.04em}
.cal-day .day-num{font-size:17px;font-weight:700}
.cal-day .day-status{font-size:var(--fs-12);font-weight:600;padding:1px 8px;border-radius:var(--radius-pill)}.cal-abs,.cal-meet,.cal-block{font-size:var(--fs-12);border-radius:var(--radius-sm);padding:1px 6px}
.cal-vacation{font-size:13px}
.calendar-nav .nav-btn,.calendar-nav .zoom-btn{font-size:var(--fs-12);border-radius:var(--radius-sm);border-color:var(--hairline);transition:all .14s var(--ease)}
.calendar-nav .nav-btn:hover,.calendar-nav .zoom-btn:hover{transform:translateY(-1px)}
.calendar-nav .nav-label{font-size:15px}

/* ── 12) Welle 2: Alarm-Center / Posteingang ── */
.alarm-entry{border-color:var(--hairline);border-radius:var(--radius);box-shadow:var(--e1);transition:transform .14s var(--ease),box-shadow .14s,border-color .14s}
.alarm-entry:hover{border-color:var(--teal);transform:translateY(-1px);box-shadow:var(--e2)}
.alarm-entry-icon{font-size:18px}
.alarm-entry-title{font-size:var(--fs-12);font-weight:600}
.alarm-entry-sub{font-size:var(--fs-12)}
.alarm-summary .pill{padding:6px 8px;border-radius:var(--radius-sm);border-color:var(--hairline)}
.alarm-tab{font-size:var(--fs-12);padding:6px 8px;border-radius:var(--radius-sm);border-color:var(--hairline);transition:all .14s var(--ease)}
.alarm-tab:hover{border-color:var(--teal);color:var(--teal)}
.alarm-tab.active{background:var(--teal-dim);border-color:var(--teal);color:var(--teal)}
/* ── 13) Welle 3: restliche App-Screens — Mikro-Typo lesbar (7-9px auf 10px) ── */
/* (Landing-Mockups lp- und landing- bewusst ausgenommen) */
.staff-card .staff-role,.staff-card .staff-details .detail-section-title,.staff-role-badge,.staff-role-secondary,.team-badge,.team-card .tc-members,
.pattern-card .pc-role,.pattern-card .pc-bar-row,.pattern-card .pc-pattern-badge,.pattern-card .pc-restrict-toggle,
.vacation-card .vc-status,.vacation-card .vc-admin-notes,.suggestion-card .sc-category,.suggestion-card .sc-status,.suggestion-card .sc-meta,.suggestion-card .sc-admin-notes .lock-icon,
.qms-doc-item .qms-info .qms-meta,.qms-access-item,.qms-status-badge,
.preset-item .meta,.preset-assign-row,.template-card .tc-type,.template-card .tc-preview,.points-badge,
.conv-item .conv-info .conv-preview,.conv-item .conv-badge,.chat-msg .msg-meta,
.chat-view .chat-input .recipient-panel .rec-chip,.chat-view .chat-input .recipient-panel .rec-count,.chat-view .chat-input .recipient-panel .rec-label,
.feed-item .feed-meta,.feed-item .feed-snippet,.feed-item .feed-source,.feed-item .feed-meta .feed-tag,
.signal-item .signal-meta,.ocr-badge,.ocr-med-card .label,.ocr-result,.voice-actions .tag,.voice-listen-btn,.ls-item,.ls-item .ls-meta,
.job-item .job-info .job-meta,.job-item .job-status,.bd-item .bd-meta,.bd-item .bd-reason,
.mobbing-alert-card .ma-head,.mobbing-alert-card .ma-text,.mobbing-alert-card .ma-meta,
.agent-request-card .ar-desc,.agent-request-card .ar-meta,.priority-badge,.scheduler-badge,.consent-badge,.badge-icon,
.kpi-item .kpi-sub,.zulagen-section-label,.zulagen-toggle,.zulagen-shift-pill,.zulagen-mode-pill,.zulagen-ctrl-label,.zulagen-ctrl-check,
.impexp-card-desc,.help-chip,.help-faq-a,.help-faq-title,.help-bullets-title,.help-chat-title,.tour-card-count,.sick-self-btn,.free-info-box,.role-desc-secondary,
.admin-quick-btn,.audit-role-change,.audit-role-change .audit-timestamp,.audit-role-badge-new,.audit-role-badge-old,.wizard-dsg-block-title,.wizard-dsg-items,.alert-item .ameta{font-size:var(--fs-12)}

/* Status-Quo-Grid (dicht → konservativ) */
.sq-status{font-size:var(--fs-12)}
.sq-team{font-size:var(--fs-12)}
.sq-num{font-size:var(--fs-12)}.sq-grid{font-size:var(--fs-12)}

/* Elevation für restliche Listen/Container */
.conversation-list,.chat-view,.job-item,.qms-doc-item,.bd-item,.agent-request-card,.mobbing-alert-card,.leaderboard-card{border-color:var(--hairline);box-shadow:var(--e1)}
.paint-palette{box-shadow:var(--e3);border-radius:var(--radius-lg);border:1px solid var(--hairline)}
.paint-tool{transition:transform .14s var(--ease)}
.paint-tool:hover{transform:translateY(-2px)}
/* ════════════════ Ende VISION 2028 DESIGN LAYER ════════════════ */

/* ════════════════ ROSIE v10 — FOUNDATION (Inter · Typo · Tooltip · Icon) ════════════════ */
/* Inter selbst gehostet (CSP font-src 'self'); SF Pro = nativer Apple-Fallback.
   Bestehende Tokens (--e1/e2/e3/--hairline/--ease/--radius*) werden WIEDERVERWENDET,
   nicht überschrieben (keine app-weite Schatten-Regression). Alles theme-agnostisch
   über Tokens + currentColor → bright (Default)/nightshift/rosé gleichermaßen. */
@font-face{font-family:'Inter';font-style:normal;font-weight:100 900;font-display:swap;src:url('fonts/inter-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+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'Inter';font-style:normal;font-weight:100 900;font-display:swap;src:url('fonts/inter-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}
/* Paket 5 (Heute-Hub) — Fredoka, self-gehostet (identisches Muster wie Inter oben, SEC-SC2/SC4-
   Disziplin: kein externer Font-CDN-Load, s. brand/rosie-brand/ui/fonts.css-Kopfkommentar
   "Variante A: Google Fonts — Für Self-Hosting siehe @fontsource"). NUR Gewicht 600/Latin
   (der einzige hier gebrauchte Schnitt, s. `.heute-hub-card-title` unten) — kein app-weiter
   Font-Wechsel, dieser Hub ist der einzige Fredoka-Konsument. Dieselbe Datei lebt AUCH unter
   public/app-shell/rosie.css (die build:app-shell-pilot-Pipeline kopiert public/rosie.css beim
   Build 1:1 nach app-shell/dist/rosie.css → public/app-shell/rosie.css — ein direktes Editieren
   der app-shell-Kopie wird beim nächsten Build kommentarlos überschrieben, s.
   app-shell/vite.config.js closeBundle()-Hook). */
@font-face{font-family:'Fredoka';font-style:normal;font-weight:600;font-display:swap;src:url('fonts/fredoka-600.woff2') format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+2000-206F,U+20AC}
:root{--font-sans:'Inter','SF Pro Text',-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,sans-serif;--num-feat:"tnum" 1,"cv05" 1,"ss01" 1;--noise:rgba(148,163,184,.06)}
/* R-32 (2026-07-15): --fs-2xs/-xs/-sm/-md/-lg/-xl/-2xl/-display (die zweite,
   konkurrierende Font-Skala) hier entfernt — auf die weiter unten definierte
   --fs-9…--fs-32-Skala (Zeile ~2241, benannt nach Pixelwert) konsolidiert, die
   im File bereits deutlich mehr Verwendungsstellen hatte. Die 4 einzigen realen
   Nutzstellen (#rtip/.tt-title/.tt-body/.tt-more) wurden auf --fs-12 migriert
   (2 davon zugleich von 11px auf 12px angehoben, s. BACKLOG R-32). */
/* FN-89 Etappe 2a (2026-07-20): Fortsetzung von R-32 unterhalb 10px. Von den 199
   font-size-Deklarationen unter 12px in dieser Datei wurden 72 auf var(--fs-12) angehoben —
   das sind genau die, deren Selektor-Klassen im LEBENDEN Code (app-shell/, shared/, src/,
   worker.js) tatsächlich vorkommen.

   DIE ÜBRIGEN 127 WURDEN ZUNÄCHST BEWUSST NICHT ANGEFASST — sie waren toter Ballast:
     • ~92 hingen an Selektoren, die es NUR im eingefrorenen public/rosie.js bzw.
       public/index.html gab (beide in .monolith-frozen-manifest.json, s. Regel 6);
     • ~35 kamen NIRGENDS vor, weder lebend noch eingefroren (z.B. .cal-day, .sq-shift,
       .admin-quick-btn, .staff-role-badge, .zoom-btn, .tool-badge, .ki-chip, .p4-badge,
       #p10FlowBadge, .p10-num);
     • dazu gehörte der komplette .lp-*-Landingpage-Block (Landing v1). Die LIVE-Landingpage
       ist Landing v2 mit lp2-*-Klassen in app-shell/auth/landing.js — .lp-* existiert dort
       nicht, und public/index.html wird von keinem Prod-Host mehr ausgeliefert
       (worker.js APP_SHELL_HOSTS, s. scripts/check-monolith-frozen.mjs).

   FN-89 OFFEN(c) (2026-07-22): der komplette .lp-*-Block wurde jetzt gelöscht statt nur
   dokumentiert — 234 Regeln, deren Selektoren AUSSCHLIESSLICH aus .lp-*-Klassen bestehen
   (0 Treffer in app-shell/, shared/, src/, worker.js, tests/, e2e/), plus 38 verwaiste
   Section-Header-Kommentare und 7 dadurch verwaiste @keyframes (cellReveal, publishPulse,
   notifSlide, aziAurora, aziDust, aziRing, aziBreathe — jeweils exakt 1 Definition + 1
   Nutzstelle, beide jetzt weg) sowie 5 leergewordene @media-Hüllen. 14 Regeln blieben damals
   bewusst stehen (Skript-Kriterium: JEDER Teil-Selektor muss rein .lp-* sein) und die ~92/~35
   NICHT-lp-präfigierten toten Deklarationen ebenfalls.

   FN-89(c) ABGESCHLOSSEN (2026-07-24): beide Reste jetzt bereinigt.
     • Die 108 <12px-Deklarationen, die nach Etappe 2b (App-Shell) noch in font-size-
       baseline.json standen, waren exakt diese ~92/~35 toten Stellen (u.a. .cal-day,
       .sq-shift, .admin-quick-btn, .staff-role-badge, .zoom-btn, .tool-badge, .ki-chip,
       .p4-badge, #p10FlowBadge, .p10-num) — je einzeln gegen app-shell/shared/src/worker.js/
       tests/e2e (Wortgrenzen-Grep, nicht nur CSS-Selektor-Form, damit class="…"-Nutzung in
       Views nicht durchrutscht) UND gegen den eingefrorenen public/rosie.js/index.html
       geprüft: 104 Selektoren (108 Regeln, 4 Selektoren doppelt) waren zu 100% tot, ganze
       Regeln gelöscht. font-size-baseline.json ist jetzt LEER (0 Fundstellen repoweit).
     • Die 14 damals zurückgestellten .lp-*-Mischregeln einzeln entschieden: `.lp-btn-primary`
       (4×, mit `.btn-primary` gemischt) → nur den toten `.lp-btn-primary`-Teil aus der
       Komma-Liste entfernt, `.btn-primary` bleibt (live). `.lp-partner-card`/`.login-partner`
       + azi-has-img/azi-logo/azi-text/login-partner (die im Original als klärungsbedürftig
       markierten Tokens) sind NIRGENDS live — ganze „Powered-by-Card"-Feature-Gruppe (4
       Regeln + erklärender Kommentar) gelöscht. `.lp-particles .landing-particle`,
       `.lp-reveal.visible`, `.lp-app-tab.active`, `.lp-section-label`, `.lp-headline-sub`
       waren einzeln (nicht komma-gemischt) und vollständig tot → gelöscht. `.lp-app-logo-img`
       war mit `.topbar-logo-img` (live) und `.topbar-tenant-badge` (ebenfalls tot, 0 Treffer)
       in einer prefers-reduced-motion-Regel gemischt — nur `.topbar-logo-img` bleibt; die
       eigenständige `.topbar-tenant-badge`-Regel + ihr alleiniger Verbraucher
       `@keyframes rosie-logo-breathe-soft` gleich mitgelöscht (sonst hätte die reduced-
       motion-Regel eine tote Klasse ohne zugehörige „aus"-Regel zurückgelassen).
   NACHTRAG (2026-07-24, gleicher Tag): der oben als "eigenes kleines Aufräum-Item" notierte
   Fund gleich mit erledigt. Die BARE `.landing`/`.landing-particles`/`.landing-particle`-
   Regeln + `@keyframes float` (Landing-Hero-Relikt VOR sowohl `.lp-*` als auch `lp2-*` — ein
   Zwischenstand, der Buttons `.btn`/`.btn-primary`/`.btn-outline`/`.btn-small`/`.btn-danger`/
   `.btn-amber` in derselben Kaskaden-Region enthielt: NUR die `.landing*`-Teile gelöscht, die
   `.btn*`-Basis-Klassen — live in jeder View — unverändert gelassen) sowie das komplette,
   nie verdrahtete AZI-Logo-Drop-in/Login-Partner-Feature (`.azi-logo`, `.azi-logo-svg`,
   `.azi-logo-img`, `.azi-logo--lg`, `.azi-logo--sm`, `.azi-has-img .azi-text`,
   `.azi-has-img .azi-logo--lg`/`--sm` — 0 Treffer für JEDE dieser Klassen im ganzen
   App-Shell, nicht nur die `azi-has-img`-Zustandsvariante) sind jetzt gelöscht. Ein zweites,
   ebenfalls dead `.landing{…}` (Zeile ~577, unter dem Header "LANDING PAGE V2") war ein
   Relikt aus einer frühen `lp2`-Bauphase — der tatsächliche Live-Wrapper heisst `.lp2`
   (`app-shell/auth/landing.js:336`, eigene vollständige `position:fixed`-Basisregel),
   `.landing` selbst hatte 0 Verwendungsstellen. Damit ist FN-89(c) inklusive aller
   Neben-/Folgefunde vollständig abgeschlossen.

   ACHTUNG für den nächsten Durchgang — Kaskaden-Falle: viele der 72 angehobenen Deklarationen
   waren bereits durch spätere 12px-Regeln aus R-32 überschrieben und damit wirkungslos. Real
   zu klein gerendert haben (im Browser gemessen, 375px + 1280px) nur 21 Selektoren. Eine reine
   Textsuche nach "font-size:9px" überschätzt das Nutzerproblem also deutlich; umgekehrt bleibt
   jede solche Deklaration eine Zeitbombe, die beim nächsten Umbau der Kaskade wieder scharf
   wird — deshalb wurden sie trotzdem alle angehoben. */
.light{--noise:rgba(15,23,42,.045)}
body{font-family:var(--font-sans);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility}
button,input,select,textarea,.btn{font-family:var(--font-sans)}
.r-num{font-variant-numeric:tabular-nums;font-feature-settings:var(--num-feat);letter-spacing:-.01em}
.ric{width:1.15em;height:1.15em;display:inline-block;vertical-align:-.18em;flex-shrink:0;color:currentColor}
.ric path,.ric circle,.ric rect,.ric ellipse,.ric line{vector-effect:non-scaling-stroke}
/* Emoji→SVG-Iconizer (2026-07-07): .ric-e = Icon, das ein Emoji im Textfluss ersetzt.
 * Exakt 1 Zeichen-Breite anpeilen, damit Layouts/Buttons nicht springen. */
.ric-e{width:1.08em;height:1.08em;vertical-align:-.17em;margin:0 .04em}
/* Auf farbigen Flächen (Toast-Gradients, Primär-/Gefahr-Buttons) würden die semantischen
 * Icon-Farben unlesbar — dort erzwingen wir Kontextfarbe (Weiss). !important schlägt
 * bewusst die inline style="color:…" der Icons. */
.rosie-toast-alive .ric-e,.btn-primary .ric-e,.btn-danger .ric-e,.btn-teal .ric-e{color:currentColor!important}
/* E1.2 (2026-07-16, Icon-Konzept final abgenommen) — Status-Badges (STATUS_BADGE_ICONS,
 * src/modules/icons.js) sind .ric-e-SVGs, deren Groesse per Design ambient (1.08em) an die
 * umgebende font-size gekoppelt ist. In der Status-Quo-/Roster-Grid-Zelle (Desktop: Container
 * #sqGrid, s. app-shell/views/shiftsTab.js Zeile ~181 → darin <table role="grid"><td
 * role="gridcell">, s. app-shell/views/shiftsTabGrid.js renderDayCell) UND in der mobilen
 * Roster-Karten-Zeile (.sq-mrow/.sq-mrow-status, ersetzt dieselbe #sqGrid-Table auf Mobile,
 * s. dieselbe Datei _renderRosterMobileCards) ist die Ambient-Font bewusst winzig (Status-Quo-
 * Tabelle 9px dicht, s. Kommentar "Sehr kleine 6-8px Schriften ... bleiben unveraendert" weiter
 * unten — NICHT anfassen, Datendichte ist Absicht) — dadurch waeren die Badges dort unter 11px,
 * weit unter dem abgenommenen 16px-Minimum. Hier NUR die Icon-Groesse selbst anheben (Zelltext
 * bleibt unveraendert), 20px Standard/Desktop, nie unter 16px, per clamp() (gleiches Muster wie
 * die bestehenden clamp()-Groessen weiter unten in dieser Datei). !important noetig gegen die
 * inline-gesetzte font-size auf <table role="grid"> (Wildwuchs-Anker-Muster wie .card-title
 * weiter unten). #sqGrid statt table[role="grid"] als Anker (deckungsgleich mit der
 * bestehenden — aktuell toten, s. Zeile 18 — [data-sqid]-Geschwisterregel). */
#sqGrid td[role="gridcell"] .ric-e,
.sq-mrow .ric-e,
/* 2i (Bauplan „Icon-Grössen vereinheitlichen", Flo: „exakt dieselbe Grösse ... in der Matrix
 * und in der Legende/Brush-Kombi") — dieselbe clamp()-Regel wie oben, nur auf die zwei
 * zusätzlichen Container ausgeweitet: Brush-Chips (shiftsTabBrush.js, erbten bisher nur
 * var(--fs-12) ≈13px vom Button) und Legende-Glyphen (shiftsTabGrid.js renderPlanLegendHtml(),
 * bisher 13px hartkodiert/var(--fs-12)). !important nötig aus demselben Grund wie oben — die
 * Badges liegen in beiden Fällen innerhalb eines Elements, das selbst eine eigene font-size
 * setzt (Button bzw. umschliessender <span>). */
.sq-brush-bar .ric-e,
.plan-legend .ric-e{font-size:clamp(16px,2vw,20px)!important}
/* FN-383 (K-17/B5) — Chip-Grössen-Parität: .plan-type-chip ist die gemeinsame Klasse der
 * farbcodierten Diensttyp-Kürzel-Badges (die TEXT-Pendants zu den .ric-e-Icon-Glyphen oben),
 * gesetzt auf shiftsTabGrid.js renderPlanLegendHtml()/chipLbl()/renderDayCell() UND
 * shiftsTabBrush.js renderBrushBar() (Kürzel-<b> im Pinsel-Chip). Vorher überall hartkodiert
 * var(--fs-12) (≈13px) — dieselbe clamp()-Regel wie .ric-e, damit Buchstaben-Kürzel und
 * SVG-Icon-Badges innerhalb derselben drei Oberflächen (Matrix/Legende/Pinsel) optisch gleich
 * gross wirken. !important aus demselben Grund wie bei .ric-e — jedes Element trägt weiterhin
 * seine eigene inline font-size:var(--fs-12) (unverändert belassen, keine Verhaltensänderung
 * für ältere/gemockte Konsumenten, die die Klasse noch nicht kennen). */
.plan-type-chip{font-size:clamp(16px,2vw,20px)!important}
/* Zellenmasse nur für Zellen MIT Badge anheben (:has()) — leere Zellen bleiben komplett leer,
 * kein Platzhalter/keine Mindesthoehe ausserhalb des Zeilenrasters. padding 6px/8px + Icon
 * (>=16px) ergeben >=32px Zeilenhoehe; !important noetig gegen die inline style="padding:1px"
 * auf <td role="gridcell"> (s.o.). .sq-mrow erreicht min-height:44px/padding:8px 12px bereits
 * über die bestehende Regel weiter unten — hier keine zusätzliche Anhebung nötig. */
#sqGrid td[role="gridcell"]:has(.ric-e){padding:6px 8px!important;line-height:1;min-height:32px}
/* Wiederverwendbarer Groessen-Anker fuer STATUS_BADGE_ICONS-Badges ausserhalb der Grid-Zelle
 * (z.B. Warteschlangen-/Alert-Karten wie a1SubstChainCard, s. shiftsTabQueues.js) — ersetzt
 * dort hartcodierte inline style="font-size:16px" (Wildwuchs-Anker-Muster wie .card-title
 * weiter unten). 16px = --fs-16 = abgenommenes Icon-Konzept-Minimum. */
.status-badge-16{font-size:var(--fs-16)}
/* Keycap-Emojis (1️⃣…) → nummerierte Schritt-Badges */
.ric-step{display:inline-flex;align-items:center;justify-content:center;min-width:1.35em;height:1.35em;border-radius:50%;background:var(--teal,#0d9488);color:#fff;font-size:.78em;font-weight:800;vertical-align:-.2em;line-height:1}
#rtip{position:fixed;z-index:10050;max-width:300px;background:var(--panel);color:var(--text);border:1px solid var(--hairline);border-radius:12px;box-shadow:var(--e3);padding:11px 13px;font-size:var(--fs-12);line-height:1.55;opacity:0;transform:translateY(4px);transition:opacity .14s var(--ease),transform .14s var(--ease);pointer-events:none}
#rtip.show{opacity:1;transform:translateY(0)}
#rtip .tt-title{display:flex;align-items:center;gap:7px;font-weight:800;font-size:var(--fs-12);margin-bottom:4px;color:var(--text)}
#rtip .tt-title .ric{width:16px;height:16px;color:var(--teal)}
#rtip .tt-body{color:var(--text-secondary);font-size:var(--fs-12);line-height:1.6}
#rtip .tt-more{display:flex;gap:6px;margin-top:8px;padding-top:8px;border-top:1px solid var(--hairline);font-size:var(--fs-12);color:var(--teal);font-weight:600}
#rtip .tt-more .ric{width:14px;height:14px;flex-shrink:0;margin-top:1px}
#rtip .tt-arrow{position:absolute;width:10px;height:10px;background:var(--panel);border:0 solid var(--hairline);transform:rotate(45deg)}
/* ════════════════ Ende ROSIE v10 FOUNDATION ════════════════ */

/* ════════════════ ROSIE v10 — Einheitliche Controls (Kriterium 6) ════════════════ */
/* Globales, VERHALTENSNEUTRALES Restyle aller nativen Checkboxen/Radios → ein
   konsistenter, moderner Look app-weit (Einstellungen + restliches UI). Nur die
   Optik ändert sich; checked/indeterminate/change-Events bleiben nativ. width/height
   !important schlägt das verbreitete inline style="width:auto" (war nur zum Aufheben
   der width:100%-Form-Vererbung — mit appearance:none gegenstandslos).
   Opt-out je Element via [data-native]. Token-/currentColor-basiert → alle Themes. */
input[type="checkbox"]:not([data-native]),input[type="radio"]:not([data-native]){appearance:none;-webkit-appearance:none;width:18px!important;height:18px!important;border:1.5px solid var(--panel-border);background:var(--bg);cursor:pointer;position:relative;vertical-align:-4px;flex:0 0 auto;margin:0 4px 0 0;transition:background .15s var(--ease),border-color .15s var(--ease),box-shadow .15s var(--ease)}
input[type="checkbox"]:not([data-native]){border-radius:6px}
input[type="radio"]:not([data-native]){border-radius:50%}
input[type="checkbox"]:not([data-native]):hover,input[type="radio"]:not([data-native]):hover{border-color:var(--teal)}
input[type="checkbox"]:not([data-native]):checked{background:var(--teal);border-color:var(--teal)}
input[type="checkbox"]:not([data-native]):checked::after{content:"";position:absolute;left:5px;top:1px;width:5px;height:9px;border:solid #fff;border-width:0 2px 2px 0;transform:rotate(45deg)}
input[type="checkbox"]:not([data-native]):indeterminate{background:var(--teal);border-color:var(--teal)}
input[type="checkbox"]:not([data-native]):indeterminate::after{content:"";position:absolute;left:3px;top:6.5px;width:10px;height:2.5px;border-radius:1px;background:#fff}
input[type="radio"]:not([data-native]):checked{border-color:var(--teal)}
input[type="radio"]:not([data-native]):checked::after{content:"";position:absolute;left:50%;top:50%;width:10px;height:10px;border-radius:50%;background:var(--teal);transform:translate(-50%,-50%)}
input[type="checkbox"]:not([data-native]):focus-visible,input[type="radio"]:not([data-native]):focus-visible{box-shadow:0 0 0 3px var(--teal-dim);outline:none}
input[type="checkbox"]:not([data-native]):disabled,input[type="radio"]:not([data-native]):disabled{opacity:.45;cursor:not-allowed}
/* width:auto-Scopes überschreiben (sonst Kollaps unter appearance:none) */
.portal-card .portal-checkboxes input[type="checkbox"],.qms-access-item input[type="checkbox"]{width:18px!important;height:18px!important}
/* ════════════════ Ende ROSIE v10 Controls ════════════════ */

/* ════════════════ ROSIE v10 — r106: DnD-Mikrointeraktionen + taktile Flächen ════════════════ */
/* Kriterium 2 — lebendiges Drag&Drop: Lift-Schatten beim Anheben, flüssiges Einrasten (Snap),
   Farbstatus an der Datei-Drop-Zone (gültig=teal / ungültiger Typ=rot). Verhaltensneutral. */
#tabShifts.tiles-reordering .card[draggable="true"]{transition:transform .16s var(--ease),box-shadow .16s var(--ease),outline-color .16s}
#tabShifts .card.tile-dragging{opacity:.97;box-shadow:var(--e3);transform:scale(1.025) rotate(-.6deg);cursor:grabbing;z-index:6;outline-color:var(--teal)!important}
@keyframes rTileSnap{0%{transform:scale(1.05)}55%{transform:scale(.985)}100%{transform:scale(1)}}
#tabShifts .card.tile-snap{animation:rTileSnap .3s var(--ease)}
#tabShifts.tiles-reordering{background-image:radial-gradient(var(--noise) .7px,transparent .7px);background-size:7px 7px;border-radius:var(--radius-lg)}
/* W3-10: Tastatur-/Klick-Alternative zum Drag — ↑/↓-Buttons je Kachel, nur im Reorder-Modus sichtbar. */
.tile-move-controls{display:none}
.tiles-reordering .card{position:relative}
.tiles-reordering .tile-move-controls{display:flex;flex-direction:column;gap:4px;position:absolute;top:8px;right:8px;z-index:7}
.tile-move-btn{width:30px;height:30px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--panel-border);border-radius:8px;background:var(--panel);color:var(--text);font-size:14px;font-weight:700;line-height:1;cursor:pointer;box-shadow:var(--shadow);transition:background .12s,border-color .12s}
.tile-move-btn:hover{background:var(--teal-dim);border-color:var(--teal)}
.tile-move-btn:focus-visible{outline:2px solid var(--teal);outline-offset:2px}
.tiles-reordering .card[tabindex="0"]:focus-visible{outline:2px solid var(--teal);outline-offset:2px}
.wizard-upload-zone{transition:border-color .16s var(--ease),background .16s var(--ease),color .16s var(--ease),box-shadow .16s var(--ease)}
.wizard-upload-zone.wz-dragover{border-style:solid;border-color:var(--teal);background:var(--teal-dim);color:var(--teal);box-shadow:inset 0 0 0 2px var(--teal),var(--e2);transform:translateY(-1px)}
.wizard-upload-zone.wz-invalid{border-color:var(--red);background:var(--red-dim);color:var(--red);animation:rShake .32s}
@keyframes rShake{0%,100%{transform:translateX(0)}25%{transform:translateX(-5px)}75%{transform:translateX(5px)}}
/* Kriterium 3 — subtile taktile Noise-Textur (background-image liegt HINTER dem Inhalt → kein
   z-index/Overflow-Risiko, GPU-günstig). Token --noise ist theme-spezifisch (.06 dunkel / .045 hell). */
.card,.feature-card,.stat-card,.pattern-card,.team-card,.suggestion-card,.vacation-card,.template-card,.portal-card,.staff-card,.bounty-item,.modal-box,.login-box,.welcome-box{background-image:radial-gradient(var(--noise) .6px,transparent .6px);background-size:5px 5px}
/* Funktionszonen-Akzent OHNE harte Linien: offene/auszuschreibende Schichten = amber. */
.bounty-item{border-left:3px solid var(--amber)}
/* ════════════════ Ende ROSIE v10 r106 ════════════════ */

/* ════════════════ ROSIE v10 — r108: Progressive Offenlegung (Kriterium 5) ════════════════ */
/* Wiederverwendbare einklappbare Sektion: Zusammenfassung (Icon+Label+Anzahl) immer sichtbar,
   Detail erst auf Klick/Tastatur. Header ist ein echtes <button> → tastatur-/screenreader-tauglich. */
.r-disc-head{display:flex;align-items:center;gap:8px;width:100%;background:transparent;border:none;padding:5px 0;cursor:pointer;text-align:left;font:inherit;color:var(--text)}
.r-disc-head:focus-visible{outline:none;box-shadow:0 0 0 2px var(--teal-dim);border-radius:6px}
.r-disc-title{flex:1;font-size:var(--fs-12);font-weight:700;display:flex;align-items:center;gap:6px}
.r-disc-chev{color:var(--muted);transition:transform .2s var(--ease);display:inline-flex}
.r-disc-chev .ric{width:14px;height:14px}
.r-disc.open .r-disc-chev{transform:rotate(180deg)}
.r-disc-body{display:none}
.r-disc.open .r-disc-body{display:block;animation:rDiscReveal .22s var(--ease)}
@keyframes rDiscReveal{from{opacity:0;transform:translateY(-3px)}to{opacity:1;transform:none}}
/* ════════════════ Ende ROSIE v10 r108 ════════════════ */

/* ════════════════════════════════════════════════════════════════
   ROSIE Brand Kit r127 — Markenfarben, 3 Modi, Logo-CSS, Calendar
   ──────────────────────────────────────────────────────────────── */

/* ── 1. Brand Color Tokens (alle Modi) ─────────────────────────── */
:root{
  --rosie-teal:#2E9494;
  --rosie-gold:#E8C040;
  --rosie-orange:#F07830;
  --rosie-pink:#D87890;
  --rosie-green:#8CBE44;
  --rosie-outline:#484860;
  --rosie-cream:#F5F0EB;
  --rosie-digital:#14B8A6;
  --rosie-dark:#0A0E1A;
  --rosie-rose:#EC4899;
  /* Coverage-Stufen für Kalender */
  --cov-empty:transparent;
  --cov-start:rgba(240,120,48,.18);
  --cov-mid:rgba(232,192,64,.22);
  --cov-late:rgba(46,148,148,.25);
  --cov-done:rgba(29,158,117,.28);
}

/* ── 2. Bright Neutral Mode (DEFAULT) ──────────────────────────── */
html.light{
  --bg:#FAF8F4;
  --panel:#FFFFFF;
  --panel-border:#E5E0D7;
  --text:#1A1F2E;
  --text-secondary:#5A6478;
  --muted:#5d6b7d;
  --teal:#0d8478;
  --teal-dim:rgba(13,132,120,.10);
  --blue:#1E5A9E;
  --blue-dim:rgba(30,90,158,.08);
  --red:#A32D2D;
  --red-dim:rgba(163,45,45,.08);
  --amber:#b35a04;
  --amber-dim:rgba(179,90,4,.10);
  --green:#03866b;
  --green-dim:rgba(3,134,107,.10);
  --shadow:0 1px 3px rgba(72,72,96,.06),0 2px 8px rgba(72,72,96,.04);
}

/* ── 3. Rose Mode (feminin, warm) ──────────────────────────────── */
html.preset-rose.light{
  --bg:#FDF2F8; /* Bauplan 2b (2026-08-23): exakter Prototyp-Wert (war #FFF5F7, minimale Drift) */
  --panel:#FFFFFF;
  --panel-border:#F5D5DE;
  --text:#3F1E2A;
  --text-secondary:#7A4258;
  --muted:#B07686;
  --teal:#D6447C;          /* Primary = Rose */
  --teal-dim:rgba(214,68,124,.10);
  --blue:#A23E7A;
  --blue-dim:rgba(162,62,122,.08);
  --red:#B81C44;
  --red-dim:rgba(184,28,68,.08);
  --amber:#C97A1F;
  --amber-dim:rgba(201,122,31,.10);
  --green:#1D9E75;
  --green-dim:rgba(29,158,117,.10);
  --shadow:0 1px 3px rgba(216,120,144,.10),0 2px 8px rgba(216,120,144,.06);
}

/* ── 4. Dark Mode — Brand-überarbeitet ─────────────────────────── */
/* Bauplan 2b (2026-08-23): kein eigenes `--bg` mehr hier — liess `.nightshift{--bg:#161028}`
   (weiter unten, D-R5-Block) wegen höherer Selektor-Spezifität (`html:not(.light)` = Element+
   Pseudoklasse ggü. `.nightshift`s einfacher Klasse) nie zum Zug kommen, obwohl `.nightshift`
   IMMER gemeinsam mit fehlendem `.light` gesetzt wird (s. main.js `setAppMode()`), der
   Dark-Mode-Body-Hintergrund also faktisch nie den D-R5-Ruhe-Farbton zeigte. */
html:not(.light){
  --panel:#0F1525;
  --panel-border:#1E2640;
  --text:#F1F5F9;
  --text-secondary:#A0AEC0;
  --muted:#64748B;
  --teal:#14B8A6;
  --teal-dim:rgba(20,184,166,.18);
  --green:#10B981;
  --green-dim:rgba(16,185,129,.14);
  --shadow:0 1px 4px rgba(0,0,0,.4),0 8px 24px rgba(0,0,0,.25);
}

/* Topbar: vereinfachte ROSIE-Wortmarke (rosie-mark.png) — klein, kompakt,
   raubt keinen Platz von den Tabs. */
.topbar-logo{
  display:inline-flex;
  align-items:center;
  cursor:pointer;
  padding:2px 4px;
  border-radius:6px;
  transition:background .15s;
  flex-shrink:0;
}
.topbar-logo:hover{background:var(--teal-dim)}
.topbar-logo-img{
  height:36px;
  width:auto;
  display:block;
  border-radius:6px;
  filter:drop-shadow(0 1px 3px rgba(72,72,96,.10));
  transition:transform .15s, filter .15s;
}
.topbar-logo:hover .topbar-logo-img{
  filter:drop-shadow(0 2px 6px rgba(59,42,99,.25));
  transform:scale(1.03);
}
@media(max-width:768px){
  .topbar-logo-img{height:30px}
}
@media(max-width:480px){
  .topbar-logo-img{height:24px}
}

/* ── 6. Login-Logo voll responsive ─────────────────────────────── */
/* Neues Logo ist optisch nahezu zentriert — keine Verschiebungskorrektur nötig. */
.login-rosie-logo{
  width:min(220px,80%);
  max-width:100%;
  height:auto;
  margin:0 auto 10px;
  display:block;
  filter:drop-shadow(0 3px 12px rgba(46,148,148,.20));
}
@media(max-width:380px){
  .login-rosie-logo{width:min(180px,70%);margin-bottom:8px}
}
.login-box{padding-top:24px;padding-bottom:24px}
@media(max-width:380px){.login-box{padding:18px 16px}}

/* ── 7. Brand-Akzente an UI-Elementen ──────────────────────────── */
/* FLO-DIREKTIVE-2026-08-24-NACHZUG: die vier .btn-primary-Overrides, die
   hier bis dahin standen (html.light .btn-primary{background:var(
   --rosie-teal)}/html.preset-rose.light .btn-primary{background:var(
   --rosie-rose)} + je ein :hover-Zwilling mit hartcodiertem Teal-/Pink-
   Glow), sind ersatzlos entfernt — Spezifität (0,2,1) bzw. (0,3,1) schlug
   die schwächere .btn-primary{background:var(--grad-primary)}-Basisregel
   (0,1,0) und hätte den Coral/Plum-Retint (s. Erklärblock am Dateiende)
   in genau Light+Rose wirkungslos gemacht — live im Browser bestätigt
   (vorher: Teal/Pink; nachher: Coral/Gold bzw. Coral/Beere). --rosie-teal/
   --rosie-rose selbst bewusst NICHT umgefärbt (Brand-Kit-r127-Konstanten,
   viele weitere themenunabhängige Konsumenten anderswo in dieser Datei —
   derselbe Blast-Radius-Grund wie bei --teal). .btn-primary fällt jetzt
   in JEDEM Theme auf dieselbe Basisregel zurück. */

/* ── 8. Mode-Switcher Mini-UI (3 Knöpfe) ───────────────────────── */
.mode-switcher{
  display:inline-flex;
  align-items:center;
  gap:2px;
  padding:2px;
  border-radius:14px;
  background:var(--panel-border);
  margin-left:6px;
}
.mode-switcher button{
  width:28px;
  height:24px;
  border-radius:12px;
  border:none;
  background:transparent;
  color:var(--muted);
  font-size:var(--fs-12);
  cursor:pointer;
  display:inline-flex;
  align-items:center;
  justify-content:center;
  transition:all .15s;
}
.mode-switcher button:hover{color:var(--text)}
.mode-switcher button.active{
  background:var(--panel);
  color:var(--teal);
  box-shadow:0 1px 2px rgba(0,0,0,.08);
}

/* ── 9. KALENDER — Tag-Tile Planungsfortschritt ────────────────── */
/*
 * Variable --cov (0..1) wird per inline-style pro Tag-Zelle gesetzt.
 * Vertikale Füllung von unten nach oben via CSS-Custom-Property.
 * Farbverlauf folgt Planungsfortschritt:
 *   0%     leer           transparent
 *   1–30%  angefangen     orange-dim
 *   31–70% in Arbeit      gold-dim
 *   71–99% fast fertig    teal-dim
 *   100%   komplett       success-dim + ✓ Marker
 */
.cal-day{
  position:relative;
  overflow:hidden;
  isolation:isolate;
}
.cal-day::before{
  content:'';
  position:absolute;
  left:0; right:0; bottom:0;
  height:calc(var(--cov,0) * 100%);
  background:var(--cov-color,var(--cov-empty));
  z-index:-1;
  transition:height .35s cubic-bezier(.4,0,.2,1),background .25s;
  border-radius:0 0 var(--radius-sm) var(--radius-sm);
}
.cal-day[data-cov-band="start"]{ --cov-color:var(--cov-start); }
.cal-day[data-cov-band="mid"]  { --cov-color:var(--cov-mid);   }
.cal-day[data-cov-band="late"] { --cov-color:var(--cov-late);  }
.cal-day[data-cov-band="done"] { --cov-color:var(--cov-done);  }
/* Pulse für Tag mit 0 Coverage in der Vergangenheit (überfällig) */
.cal-day.cov-overdue{
  border-color:var(--red);
  background:var(--red-dim);
}

/* Coverage-Mini-Bar oben (alternative/zusätzliche Visualisierung) */
.cal-cov-bar{
  position:absolute;
  top:0; left:0; right:0;
  height:3px;
  background:transparent;
  z-index:1;
}
.cal-cov-bar > i{
  display:block;
  height:100%;
  background:var(--teal);
  width:calc(var(--cov,0) * 100%);
  border-radius:0 0 2px 0;
  transition:width .35s cubic-bezier(.4,0,.2,1);
}
.cal-day[data-cov-band="start"] .cal-cov-bar > i{ background:var(--rosie-orange); }
.cal-day[data-cov-band="mid"]   .cal-cov-bar > i{ background:var(--rosie-gold); }
.cal-day[data-cov-band="late"]  .cal-cov-bar > i{ background:var(--rosie-teal); }
.cal-day[data-cov-band="done"]  .cal-cov-bar > i{ background:var(--green); }

/* Coverage-Tooltip auf Hover */
.cal-day[data-cov-tip]:hover::before{
  content:attr(data-cov-tip);
  position:absolute;
  bottom:100%;
  left:50%;
  transform:translateX(-50%);
  background:var(--panel);
  color:var(--text);
  padding:4px 8px;
  border-radius:6px;
  font-size:var(--fs-12);
  white-space:nowrap;
  border:1px solid var(--panel-border);
  box-shadow:var(--shadow);
  z-index:10;
  pointer-events:none;
  height:auto;
}

/* ════════════════════════════════════════════════════════════════
   Body-Hintergrund — Flachfarbe (Bauplan 2b, 2026-08-23)
   ──────────────────────────────────────────────────────────────── */

/* Historie: r135/r141/r172 + die FLO-DIREKTIVE-2026-08-21-Korrektur (s. git-Historie dieser
   Datei) bauten hier einen 5-Stop-Vollflächen-Verlauf, zuerst Teal/Mint/Navy, dann auf die
   Marken-Farbfamilie (Plum/Gold/Coral) umgefärbt. Beide freigegebenen HTML-Prototypen
   (ROSIE-DESKTOP-FINAL-RUHE-EBENEN_2026-08-20.html / ROSIE-MOBILE-FINAL-V1PLUS_2026-08-19.html)
   haben aber gar KEINEN Body-Gradienten — nur eine flache `background:var(--bg)`, `--grad` ist
   dort ausschliesslich für `.side` (die Sidebar) reserviert. Der body-weite `!important`-Verlauf
   dominierte die Seite optisch anders als der Prototyp — ersetzt durch dieselbe Flachfarbe, die
   `--bg` für den jeweiligen Modus ohnehin schon definiert (kein `!important` mehr nötig, `body`
   hat keine konkurrierende `background`-Deklaration höherer Spezifität). */
html.light body{background:var(--bg)}
html.preset-rose.light body{background:var(--bg)}
html:not(.light) body{background:var(--bg)}

/* ── Hero-Tools (Alarm-Center + Live-Browser) — prominent ──────── */
.rosie-hero-tools{
  display:grid;
  grid-template-columns:repeat(auto-fit,minmax(220px,1fr));
  gap:10px;
  margin-bottom:12px;
}
.rosie-hero-btn{
  display:flex;
  align-items:center;
  gap:12px;
  padding:14px 16px;
  border-radius:14px;
  border:1.5px solid transparent;
  background:var(--panel);
  cursor:pointer;
  text-align:left;
  position:relative;
  transition:transform .15s, box-shadow .15s, border-color .15s;
  box-shadow:0 1px 3px rgba(72,72,96,.04),0 2px 8px rgba(72,72,96,.03);
  font-family:inherit;
}
.rosie-hero-btn:hover{
  transform:translateY(-1px);
  box-shadow:0 4px 12px rgba(72,72,96,.10),0 6px 24px rgba(72,72,96,.06);
}
.rosie-hero-btn .rht-icon{
  width:42px;height:42px;
  border-radius:11px;
  display:inline-flex;align-items:center;justify-content:center;
  font-size:22px;
  flex-shrink:0;
}
.rosie-hero-btn .rht-icon .ric{width:22px;height:22px}
.rosie-hero-btn .rht-text{display:flex;flex-direction:column;gap:1px;flex:1;min-width:0}
.rosie-hero-btn .rht-title{font-size:14px;font-weight:600;color:var(--text);line-height:1.2}
.rosie-hero-btn .rht-sub{font-size:var(--fs-12);color:var(--text-secondary);line-height:1.3}
.rosie-hero-btn .rht-badge{
  background:var(--red);color:#fff;border-radius:11px;
  padding:2px 8px;font-size:var(--fs-12);font-weight:700;
  margin-left:auto;flex-shrink:0;
}
.rosie-hero-btn .rht-chev{
  color:var(--muted);font-size:18px;line-height:1;
  margin-left:auto;flex-shrink:0;transition:transform .15s,color .15s;
}
.rosie-hero-btn:hover .rht-chev{transform:translateX(2px);color:var(--teal)}

/* Alarm-Variante: Orange-Akzent (Brand-Logo) */
.rosie-hero-btn--alarm{border-color:rgba(240,120,48,.20)}
.rosie-hero-btn--alarm .rht-icon{background:rgba(240,120,48,.12);color:var(--rosie-orange)}
.rosie-hero-btn--alarm:hover{border-color:var(--rosie-orange);box-shadow:0 4px 12px rgba(240,120,48,.18),0 6px 24px rgba(240,120,48,.10)}
.rosie-hero-btn--alarm:hover .rht-title{color:var(--rosie-orange)}

/* Browser-Variante: Teal-Akzent (Brand-Digital) */
.rosie-hero-btn--browser{border-color:rgba(46,148,148,.20)}
.rosie-hero-btn--browser .rht-icon{background:rgba(46,148,148,.12);color:var(--rosie-teal)}
.rosie-hero-btn--browser:hover{border-color:var(--rosie-teal);box-shadow:0 4px 12px rgba(46,148,148,.18),0 6px 24px rgba(46,148,148,.10)}
.rosie-hero-btn--browser:hover .rht-title{color:var(--rosie-teal)}

/* Rose-Mode-Overrides für Hero-Buttons */
html.preset-rose.light .rosie-hero-btn--alarm .rht-icon{background:rgba(216,120,144,.14);color:var(--rosie-pink)}
html.preset-rose.light .rosie-hero-btn--alarm{border-color:rgba(216,120,144,.22)}
html.preset-rose.light .rosie-hero-btn--alarm:hover{border-color:var(--rosie-pink)}
html.preset-rose.light .rosie-hero-btn--alarm:hover .rht-title{color:var(--rosie-pink)}
html.preset-rose.light .rosie-hero-btn--browser .rht-icon{background:rgba(236,72,153,.10);color:#C026D3}
html.preset-rose.light .rosie-hero-btn--browser{border-color:rgba(236,72,153,.18)}
html.preset-rose.light .rosie-hero-btn--browser:hover{border-color:#C026D3}

/* Dark-Mode-Overrides — Glow-Akzent */
html:not(.light) .rosie-hero-btn{box-shadow:0 1px 3px rgba(0,0,0,.4),0 4px 16px rgba(0,0,0,.20)}
html:not(.light) .rosie-hero-btn:hover{box-shadow:0 1px 3px rgba(0,0,0,.4),0 6px 24px rgba(20,184,166,.18)}

/* ──────────────────────────────────────────────────────────────
   r136 P5: Sidebars dynamisch — Hauptcontent schiebt sich beiseite
   statt überlagert zu werden. So bleibt der Dienstplan immer voll
   bedienbar, auch wenn Alarm-Center oder Live-Browser geöffnet sind.
   Auf schmalen Viewports fällt der Push weg (Sidebar überlagert
   wie bisher — auf Mobile kein Platz für beides).
   ────────────────────────────────────────────────────────────── */
@media(min-width:1024px){
  #tabShifts.alarm-sidebar-active{ padding-left:390px; transition:padding-left .28s cubic-bezier(.4,0,.2,1); }
  #tabShifts.live-sidebar-active{ padding-right:350px; transition:padding-right .28s cubic-bezier(.4,0,.2,1); }
  #tabShifts.alarm-sidebar-active.live-sidebar-active{ padding-left:390px; padding-right:350px; }
}
#tabShifts{ transition:padding .28s cubic-bezier(.4,0,.2,1); }

/* ── Hero-Buttons: aktiver Zustand klar markieren (wenn Sidebar offen) ── */
.rosie-hero-btn.is-active{
  background:var(--teal-dim);
  border-color:var(--teal);
}
.rosie-hero-btn--alarm.is-active{ background:rgba(240,120,48,.10); border-color:var(--rosie-orange); }
.rosie-hero-btn--alarm.is-active .rht-title{ color:var(--rosie-orange); }
.rosie-hero-btn--browser.is-active{ background:rgba(46,148,148,.10); border-color:var(--rosie-teal); }
.rosie-hero-btn--browser.is-active .rht-title{ color:var(--rosie-teal); }

/* ── r142: Dienstplan-Karten-Kopf — uniforme Filter & Aktionen ─────── */
.shift-card-head{ gap:10px; row-gap:8px; }
.shift-card-head .card-title{ flex:0 0 auto; }
.shift-head-filters{
  display:flex; gap:6px; flex-wrap:wrap; align-items:center;
  flex:1 1 auto; min-width:0;
}
.shift-head-actions{
  display:flex; gap:6px; flex-wrap:wrap; align-items:center;
  margin-left:auto; flex:0 0 auto;
}
.shift-head-select{
  height:28px; line-height:1; padding:0 8px;
  font-size:var(--fs-12); font-weight:500;
  border-radius:var(--radius-sm,6px);
  border:1px solid var(--panel-border);
  background:var(--bg); color:var(--text);
  cursor:pointer; transition:border-color .15s, box-shadow .15s;
  min-width:0;
}
.shift-head-select:hover{ border-color:var(--teal); }
.shift-head-select:focus{ outline:none; border-color:var(--teal); box-shadow:0 0 0 2px var(--teal-dim); }
.shift-head-actions .btn-small{
  height:28px; padding:0 10px; font-size:var(--fs-12);
  display:inline-flex; align-items:center; gap:4px;
  border-radius:var(--radius-sm,6px);
}

/* ── r136 P4: Profil-Berechtigungen — einheitliche Liste ─────────────── */
.staff-login-block{
  border-top:1px solid var(--panel-border);
  padding:14px 0 6px;
  margin-top:14px;
}
.staff-login-head{
  font-size:13px;font-weight:600;color:var(--rosie-teal);
  margin-bottom:10px;display:inline-flex;align-items:center;gap:6px;
}
.staff-perm-list{
  display:flex;flex-direction:column;gap:8px;
  padding:14px 0 6px;
  border-top:1px solid var(--panel-border);
  margin-top:14px;
}
.staff-perm-item{
  display:grid;
  grid-template-columns:auto 1fr;
  column-gap:10px;row-gap:2px;
  align-items:center;
  padding:10px 12px;
  background:var(--bg);
  border:1px solid var(--panel-border);
  border-radius:10px;
  cursor:pointer;
  transition:border-color .15s, background .15s;
  font-size:13px;
}
.staff-perm-item:hover{border-color:var(--rosie-teal)}
.staff-perm-item input[type="checkbox"]{
  width:18px;height:18px;cursor:pointer;
  grid-row:span 2;align-self:center;accent-color:var(--rosie-teal);
}
.staff-perm-item .spi-label{
  font-size:13px;font-weight:600;color:var(--text);line-height:1.2;
}
.staff-perm-item .spi-hint{
  font-size:var(--fs-12);color:var(--text-secondary);line-height:1.4;
}

/* ── r136 P6: Tools-Ansicht — einheitliche Cards ───────────────────── */
.tools-intro{
  display:flex;align-items:center;gap:12px;
  padding:14px 16px;
  background:var(--bg);
  border:1px solid var(--panel-border);
  border-radius:12px;
  margin-bottom:16px;
}
.tools-intro-icon{
  width:40px;height:40px;border-radius:10px;
  background:var(--teal-dim);color:var(--rosie-teal);
  display:flex;align-items:center;justify-content:center;
  flex-shrink:0;
}
.tools-intro-text{font-size:12px;color:var(--text-secondary);line-height:1.6}

.tools-grid{
  /* r161: Responsive Grid — Kacheln nebeneinander UND untereinander.
     Auto-fill nutzt den ganzen Screen, Mindestbreite 280px pro Kachel. */
  display:grid;
  grid-template-columns:repeat(auto-fill,minmax(280px,1fr));
  gap:14px;
  align-items:stretch;
}
.tool-card{
  padding:14px 16px;
}

.tool-card{
  background:var(--panel);
  border:1px solid var(--panel-border);
  border-radius:14px;
  padding:14px 16px;
  display:flex;flex-direction:column;
  gap:10px;
  transition:border-color .15s, box-shadow .15s, transform .15s;
}
.tool-card:hover{
  border-color:var(--rosie-teal);
  box-shadow:0 4px 12px rgba(46,148,148,.10);
  transform:translateY(-1px);
}
.tool-card.is-active{border-color:var(--rosie-teal);background:var(--teal-dim)}
.tool-card.tool-card--locked{opacity:.88}
.tool-card.is-test{border-color:#d97706}

.tool-card-head{display:flex;align-items:center;gap:12px}
.tool-card-icon{
  width:44px;height:44px;border-radius:11px;
  background:var(--bg);
  display:flex;align-items:center;justify-content:center;
  font-size:24px;
  flex-shrink:0;
}
.tool-card.is-active .tool-card-icon,
.tool-card:not(.tool-card--locked) .tool-card-icon{background:var(--teal-dim)}
.tool-card-meta{flex:1;min-width:0}
.tool-card-title{
  font-size:13px;font-weight:600;color:var(--text);
  line-height:1.3;margin-bottom:4px;
}
.tool-card-status{display:flex;gap:4px;flex-wrap:wrap}.tool-badge--ok{background:var(--teal-dim);color:var(--rosie-teal)}
.tool-badge--test{background:rgba(217,119,6,.14);color:#92400e}
.tool-badge--locked{background:var(--bg);color:var(--muted);border:1px solid var(--panel-border)}
.tool-badge--beta{background:var(--amber-dim);color:var(--amber)}

.tool-card-desc{
  font-size:12px;color:var(--text-secondary);
  line-height:1.55;
  flex:1;
}
.tool-card-details{font-size:var(--fs-12)}
.tool-card-compliance{font-size:var(--fs-12)}
.tool-card-action{margin-top:auto}

/* ════════════════════════════════════════════════════════════════
   r140 — Dark-Mode-Lesbarkeit + Schrift-Vereinheitlichung
   ──────────────────────────────────────────────────────────────── */

/* ── P2a: Hero-Buttons (Alarm + Live-Browser) im Dark-Mode lesbar ─ */
html:not(.light) .rosie-hero-btn .rht-title{ color:#F1F5F9 }
html:not(.light) .rosie-hero-btn .rht-sub{ color:#A0AEC0 }
html:not(.light) .rosie-hero-btn .rht-chev{ color:#A0AEC0 }
/* Active-State im Dark — hellere Brand-Töne damit lesbar bleibt */
html:not(.light) .rosie-hero-btn--alarm.is-active{
  background:rgba(240,120,48,.20);
  border-color:#F07830;
}
html:not(.light) .rosie-hero-btn--alarm.is-active .rht-title{ color:#FDBA74 }
html:not(.light) .rosie-hero-btn--browser.is-active{
  background:rgba(20,184,166,.22);
  border-color:#14B8A6;
}
html:not(.light) .rosie-hero-btn--browser.is-active .rht-title{ color:#5EEAD4 }
html:not(.light) .rosie-hero-btn--browser .rht-icon{
  background:rgba(20,184,166,.20);
  color:#5EEAD4;
}
html:not(.light) .rosie-hero-btn--alarm .rht-icon{
  background:rgba(240,120,48,.18);
  color:#FDBA74;
}

/* ── P2b: Schrift-Vereinheitlichung — Inter überall, klare Skala ─── */
/* Inter wird via fonts/inter-latin.woff2 geladen; CSS-Variable für
   konsistente Verwendung — keine inline font-family-Strings mehr nötig. */
:root{
  --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, system-ui, sans-serif;
  --font-mono: ui-monospace, 'SF Mono', Consolas, Monaco, monospace;
  /* Schrift-Skala (rem-basiert, 16px Body) */
  /* FN-89: --fs-9/--fs-10/--fs-11 sind DEPRECATED — nicht mehr verwenden.
     Sie liegen unter der Konvention "Grundschrift ≥ 12px" (R-32 Etappe 1, r372) und haben
     im gesamten lebenden Code NULL var()-Referenzen (verifiziert gegen public/rosie.css,
     app-shell/, shared/, src/, worker.js). Ausgerechnet der Kommentar "Mikro-Labels" an
     --fs-9 hat in Reviews wiederholt den Eindruck erzeugt, 9px sei eine bewusst gepflegte
     Stufe — tatsächlich sind alle 9px-Stellen Literale, das Token wurde nie benutzt.
     Sie bleiben vorerst definiert (Löschen ist ein eigenes Cleanup-Item mit eigenem Review),
     dürfen aber nicht als Freibrief für neue Schrift unter 12px dienen. Das CI-Gate
     scripts/check-font-size.mjs macht neue Fundstellen unter 12px rot. Untergrenze = --fs-12. */
  --fs-9:  9px;   /* DEPRECATED — nicht verwenden (s.o.) */
  --fs-10: 10px;  /* DEPRECATED — nicht verwenden (s.o.) */
  --fs-11: 11px;  /* DEPRECATED — nicht verwenden (s.o.) */
  --fs-12: 12px;  /* Body-S, Buttons-S — kleinste zulässige Grundschrift */
  --fs-13: 13px;  /* Body-Default */
  --fs-14: 14px;  /* Body-L, Card-Titel */
  --fs-16: 16px;  /* H3 */
  --fs-20: 20px;  /* H2 */
  --fs-24: 24px;  /* H1 */
  --fs-32: 32px;  /* Display */
}
html, body, button, input, select, textarea, .btn{
  font-family: var(--font-sans);
  font-feature-settings: 'cv02','cv03','cv04','cv11'; /* Inter Stilset */
}
body{ font-size: var(--fs-13); line-height: 1.5 }

/* Heading-Skala vereinheitlichen — alle h1-h6 nutzen die Token */
h1{ font-size: var(--fs-24); font-weight: 600; line-height: 1.25 }
h2{ font-size: var(--fs-20); font-weight: 600; line-height: 1.3 }
h3{ font-size: var(--fs-16); font-weight: 600; line-height: 1.4 }
h4{ font-size: var(--fs-14); font-weight: 600; line-height: 1.4 }
h5, h6{ font-size: var(--fs-13); font-weight: 600 }

/* Konsistente kleine Schriftgrössen-Anker — verhindert Wildwuchs in Inline-Styles */
.card-title{ font-size: var(--fs-13) !important; font-weight: 600 }
.card-head{ padding: 10px 14px }
.btn{ font-family: var(--font-sans) !important; font-weight: 500 }
.btn-small{ font-size: var(--fs-12) !important }
.form-group label{ font-size: var(--fs-12) !important; letter-spacing:.02em }
input, select, textarea{ font-size: var(--fs-13) !important }

/* Code/Mono-Stellen normieren */
code, pre, .mono{ font-family: var(--font-mono); font-size: var(--fs-12) }

/* Sehr kleine 6-8px Schriften aus Status-Quo-Tabelle bleiben unverändert (Datendichte) */

/* ════════════════ r144: UX-Tuning Mobile + Spacing ════════════════ */

/* Tenant-Badge (Entität) — vorher Inline-Style in JS, jetzt Klasse. Erscheint
   in .topbar-left (links neben Logo) für alle Viewports. */
.topbar-tenant-badge{
  background:linear-gradient(135deg,#0EA5E9,#0284C7);
  color:#fff;
  padding:4px 10px;
  border-radius:6px;
  font-size:var(--fs-12);
  font-weight:700;
  display:inline-flex;
  align-items:center;
  gap:4px;
  box-shadow:0 2px 8px rgba(14,165,233,0.3);
  white-space:nowrap;
  max-width:50vw;
  overflow:hidden;
  text-overflow:ellipsis;
}

/* Dienstplan-Karten-Kopf mobil zentrieren + Filter kompakter. Greift unter
   768px für die einzige Schicht-View (.shift-card-head). */
@media(max-width:768px){
  .shift-card-head{
    flex-direction:column;
    align-items:center;
    text-align:center;
    gap:8px;
  }
  .shift-card-head .card-title{
    width:100%;
    text-align:center;
    justify-content:center;
    display:flex;
  }
  .shift-head-filters{
    width:100%;
    justify-content:center;
    gap:4px;
  }
  .shift-head-filters .shift-head-select{
    height:26px;
    font-size:var(--fs-12);
    padding:0 6px;
    max-width:32vw;
    flex:0 1 auto;
  }
  .shift-head-actions{
    width:100%;
    justify-content:center;
    margin-left:0;
    gap:4px;
  }
  /* Calendar-Nav (Jahr/Monat) mobil zentrieren. Die spacer-span im DOM mit
     style="flex:1" wird neutralisiert, damit der Nav nicht links klebt. */
  .calendar-nav{
    justify-content:center;
    flex-wrap:wrap;
  }
  .calendar-nav > span[style*="flex:1"]{
    display:none;
  }
}

/* FN-64(f) (2026-07-13): Wrapper-Klasse fürs Dienstplan-Grid-Pattern (shiftsTabGrid.js
   loadStatusQuo(), inline overflow-x:auto) extrahiert — Bounty/AdminOps/Absenzen-Tabellen
   hatten bislang KEINEN Scroll-Container, liefen also bei schmalen Viewports über den
   Bildschirmrand hinaus statt selbst zu scrollen. Bewusst nicht media-gated: auf breiten
   Viewports ohne Overflow bleibt die Klasse unsichtbar (kein Scrollbalken). */
.table-scroll-wrap{ overflow-x:auto; }

/* FN-64(d) (2026-07-13): zwei Admin-CSS-Grids (adminTabUnternehmen.js Sollzeiten-Rechner
   6 Spalten, adminTabStrukturen.js Rollen-Grid 9 Spalten) waren bei 7-8px Schrift ohne
   Umbruch — unter 600px auf gestapelte label:value-Zeilen umschalten, Header ausblenden
   (Labels sitzen dann als ::before-Content direkt an der Zelle). data-label-Attribute
   kommen aus dem jeweiligen View-Modul, s. dortige Kommentare.
   FN-277 (2026-08-11, Live-Mobile-Fund): `.admin-grid-header{display:none}` fehlte hier das
   `!important`, das `.admin-grid-row` direkt darunter korrekt hat. Der Header-Zeilen-<div>
   selbst trägt in adminTabUnternehmen.js EIN Inline-`style="display:grid;..."` (anders als
   `.admin-grid9-head`, dessen einzelne Zellen-<div>s KEIN Inline-`display` tragen — dort
   funktioniert die Regel darum bereits ohne `!important`, geprüft) — ein Inline-Style schlägt
   IMMER eine Stylesheet-Regel ohne `!important`, unabhängig von der Media-Query. Der Header
   blieb dadurch auf jedem Viewport <600px sichtbar UND als 6-spaltiges CSS-Grid gerendert
   (`grid-template-columns:2fr 1fr 1fr 1fr 1fr 1fr`), das auf 375px jede Spalte auf ~30-45px
   quetscht — Labels wie „Pensum"/„Tag (h)" überlappten sich sichtbar (genau das gemeldete
   Symptom: "unter dem Button Unternehmen zu unterst ... Auflistungen nicht korrekt angezeigt").
   Live gegen einen frisch signup'ten Testtenant + echten Mitarbeiter-Datensatz auf 375px
   verifiziert: mit `!important` verschwindet der Header korrekt, nur die gestapelte
   label:value-Zeile bleibt sichtbar. */
@media(max-width:600px){
  .admin-grid-header{ display:none !important; }
  .admin-grid-row{ display:flex !important; flex-direction:column; gap:2px; padding:8px 10px !important; }
  .admin-grid-row > span[data-label]::before{ content:attr(data-label) ": "; font-weight:600; color:var(--muted); }

  .admin-grid9{ grid-template-columns:1fr !important; }
  .admin-grid9-head{ display:none; }
  .admin-grid9 > div[data-label]::before{ content:attr(data-label) ": "; font-weight:600; color:var(--muted); margin-right:4px; }
}

/* Mobile-Topbar — 2 Reihen:
   Reihe 1: Logo links (.topbar-left) + Icons rechts (.topbar-right).
   Reihe 2: Scrollbare Tabs (.topbar-center, order:3).
   Fund 2026-07-07 (Flo): .topbar-right hatte hier bewusst flex-wrap:nowrap, damit
   alle 7 Controls (Sprache/Modus-Pills/Hilfe/Profil/Logout/Glocke) in Reihe 1 bleiben
   — auch mit max-width:52px auf #langSelect passen sie bei schmalen Phones (<400px)
   nicht in den verfügbaren Platz. Da nur #langSelect schrumpfen darf (die übrigen sind
   flex-shrink:0), rechnet Flexbox es dabei in negative X-Koordinaten statt es sichtbar
   zu lassen — es rendert dann links unter dem Logo und wirkt wie vom Logo überdeckt
   (kein Logo-Bug). flex-wrap:wrap lässt den Überschuss in eine eigene Zeile fallen,
   statt ihn unsichtbar zu verschieben. */
@media(max-width:768px){
  .topbar{
    flex-wrap:wrap;
    padding:6px 10px;
    gap:4px;
    align-items:center;
  }
  .topbar-left{
    flex:0 0 auto;
    display:flex;
    align-items:center;
    margin-bottom:0;
    text-align:left;
  }
  .topbar-left .topbar-logo{
    margin-left:0;
    max-width:none;
  }
  .topbar-right{
    flex:1;
    justify-content:flex-end;
    flex-wrap:wrap;
    row-gap:4px;
    gap:4px;
    min-width:0;
  }
  .topbar-right .user-badge{ display:none; }
  .topbar-right select{ max-width:52px;flex-shrink:1; }
  .topbar-right .mode-pills,.topbar-right .icon-btn,.topbar-right .alert-bell{ flex-shrink:0; }
  .topbar-center{
    order:3;
    flex:0 0 100%;
    overflow-x:auto;
    display:flex;
    flex-wrap:nowrap;
    gap:2px;
    padding:2px 0;
    justify-content:flex-start;
    scrollbar-width:none;
  }
  .topbar-center::-webkit-scrollbar{ display:none; }
  .topbar-center .tab-btn{ flex-shrink:0; white-space:nowrap; font-size:var(--fs-12); padding:4px 10px; }
}

/* Globaler Atem: Kacheln/Karten bekommen mehr Luft (Top-Level-Cards in
   Tab-Inhalten). Greift nur auf direkte Karten-Kinder, damit Grid-Layouts
   (admin-grid etc.) ihre eigenen Gaps behalten. */
.tab-content > .card,
.tab-content > #shiftViewContainer > .card,
.tab-content > #shiftViewContainer > div > .card{
  margin-bottom:18px;
}
.tab-content{ padding:22px; }
.shift-card-head{ padding:14px 16px; }
.card-body{ padding:18px; }

@media(max-width:1024px){
  .tab-content{ padding:16px; }
  .tab-content > .card,
  .tab-content > #shiftViewContainer > .card,
  .tab-content > #shiftViewContainer > div > .card{
    margin-bottom:14px;
  }
}
@media(max-width:600px){
  .tab-content{ padding:12px; }
  .tab-content > .card,
  .tab-content > #shiftViewContainer > .card,
  .tab-content > #shiftViewContainer > div > .card{
    margin-bottom:12px;
  }
  .card-body{ padding:12px; }
}


/* ════════════════ r145: 11-Punkte UX-Feinschliff ════════════════ */

/* P11: MA-Ansichten (role-employee) im Dienstplanungs- und Ideen-Tab balancieren.
   Wenn Admin-/Planer-Karten fehlen, sieht der MA-Tab leer aus → Kacheln werden
   zentriert + auf max-Width gecappt → angenehme Lesbarkeit auf grossen Screens. */
body.role-employee #tabIdeas .ideas-grid{
  display:grid;
  grid-template-columns:repeat(auto-fit, minmax(280px, 1fr));
  gap:18px;
  max-width:920px;
  margin:0 auto;
}
body.role-employee #tabIdeas .ideas-grid > .card{
  align-self:start;
}
/* Wenn nur eine Karte sichtbar ist (admin-card via .role-hidden weg),
   zentriert sie sich → keine einsame Linksbündigkeit. */
body.role-employee #tabIdeas .ideas-grid > .card:only-of-type{
  grid-column:1 / -1;
  max-width:640px;
  margin-left:auto;
  margin-right:auto;
}
/* Dienstplanung — MA: grosszügigere Mittenbreite, balanciertes Spacing.
   MA hat Kalender + (evtl.) eigene Karten — kein 4-Spalten-Grid-Gefühl mehr. */
body.role-employee #tabShifts{
  max-width:1400px;
  margin:0 auto;
}
body.role-employee #tabShifts > .card,
body.role-employee #tabShifts #shiftViewContainer > .card{
  margin-left:auto;
  margin-right:auto;
}
/* Hero-Tools die für MA leer wären, kollabieren */
body.role-employee #shiftAdminTools.rosie-hero-tools{ display:none !important; }

/* P7: Kachel-Tops bekommen eine leichte, brand-passende Tönung + subtile diagonale
   Schraffur. Reduziert kognitive Last durch klarere visuelle Hierarchie zwischen
   Karten-Kopf und Karten-Body. Inspiriert von Linear/Stripe/Notion-Pattern.
   Light: dezente Teal-Tönung. Dark: heller Teal-Hauch über Panel-Hintergrund.
   Schraffur: nur 2% Opazität → wahrnehmbar, nicht aufdringlich. */
.card-head{
  position:relative;
  background:
    repeating-linear-gradient(135deg,
      rgba(20,184,166,.025) 0 8px,
      transparent 8px 16px),
    linear-gradient(180deg,
      var(--teal-dim) 0%,
      transparent 100%);
  border-bottom:1px solid var(--panel-border);
  border-top-left-radius:inherit;
  border-top-right-radius:inherit;
}
.card-head .card-title{
  font-weight:700;
  letter-spacing:.01em;
}
/* Akzent-Linie links — wie ein subtiler Tab-Indikator */
.card-head::before{
  content:'';
  position:absolute;
  left:0; top:10%; bottom:10%;
  width:3px;
  background:linear-gradient(180deg, var(--teal) 0%, transparent 100%);
  border-radius:0 2px 2px 0;
  opacity:.6;
}
/* Im Dark stärker tönen, weil sonst kaum sichtbar */
:root:not(.light) .card-head{
  background:
    repeating-linear-gradient(135deg,
      rgba(20,184,166,.04) 0 8px,
      transparent 8px 16px),
    linear-gradient(180deg,
      rgba(20,184,166,.10) 0%,
      transparent 100%);
}
/* Rose-Preset: Magenta statt Teal in der Schraffur */
.preset-rose .card-head{
  background:
    repeating-linear-gradient(135deg,
      rgba(217,70,239,.035) 0 8px,
      transparent 8px 16px),
    linear-gradient(180deg,
      var(--teal-dim) 0%,
      transparent 100%);
}

/* P4: Darkmode-Kontrast überall anheben.
   Wirkt auf alle dunklen Theme-Varianten (default = dark, ohne .light Klasse).
   Hebt --text-secondary, --muted, --panel-border so weit an, dass WCAG-AA
   für Label-Text gegen Panel/BG erfüllt ist. .light-Modi bleiben unverändert. */
:root:not(.light){
  --text-secondary:#cbd5e1;
  --muted:#a3aab4;
  --panel-border:#3a3a42;
  --hairline:#2a2a30;
}
.preset-rose:not(.light){
  --text-secondary:#fbcfe8;
  --muted:#e2a7c1;
  --panel-border:#4a2a38;
}
.nightshift:not(.light){
  --text-secondary:#cbd5e1;
  --muted:#9ca3af;
  --panel-border:#3a3a42;
}
/* Buttons: Outline-Border + Hover-Kontrast im Dark */
:root:not(.light) .btn-outline{ border-color:var(--panel-border); color:var(--text); }
:root:not(.light) .btn-outline:hover{ border-color:var(--teal); color:var(--teal); }
/* Inputs/Selects: heller Rand im Dark, damit Felder klar abgrenzen.
   B-04 (Beta-Feedback Welle 3, FN-365): background-color ergänzt — die Regel setzte
   bislang Rand+Schrift, aber KEINEN Hintergrund; ein Select AUSSERHALB `.form-group`
   (die einzige Stelle, die bisher `background:var(--bg)` beisteuerte) blieb dadurch
   im Dark-Mode weiss auf hell-Rand-Schwarzschrift statt dunkel auf dunkel — s.
   Kopfkommentar am Dateiende für den vollen B-04-Befund. */
:root:not(.light) input, :root:not(.light) select, :root:not(.light) textarea{
  border-color:var(--panel-border) !important;
  color:var(--text) !important;
  background-color:var(--bg) !important;
}
:root:not(.light) input::placeholder, :root:not(.light) textarea::placeholder{
  color:var(--muted) !important; opacity:.85;
}
/* Card-Heads bekommen klare Trennung */
:root:not(.light) .card-head{ border-bottom-color:var(--panel-border); }
/* Tabellen-Linien sichtbarer */
:root:not(.light) table, :root:not(.light) th, :root:not(.light) td{ border-color:var(--panel-border); }

/* P5: Logo-„breathing"-Effekt — entschärft das „reingeschnitten"-Gefühl.
   Subliminales Pulsen via drop-shadow + sanftes Up-/Down-Scale (nur Topbar-Logo).
   Respektiert prefers-reduced-motion. */
@keyframes rosie-logo-breathe{
  0%,100%{ filter:drop-shadow(0 1px 3px rgba(72,72,96,.10)) drop-shadow(0 0 0 rgba(59,42,99,0)); transform:scale(1); }
  50%    { filter:drop-shadow(0 2px 6px rgba(72,72,96,.14)) drop-shadow(0 0 10px rgba(59,42,99,.28)); transform:scale(1.015); }
}
.topbar-logo-img{ animation:rosie-logo-breathe 4.5s ease-in-out infinite; }

@media (prefers-reduced-motion:reduce){
  .topbar-logo-img{ animation:none !important; }
}

/* P9: Brush-Palette darf den Dienstplan nicht verdecken.
   Bei offener Palette (body.paint-mode-active) erhält der Dienstplan-Bereich
   Padding rechts, damit die gesamte Tabelle ohne Überlappung sichtbar bleibt. */
@media(min-width:769px){
  body.paint-mode-active #tabShifts{ padding-right:210px; transition:padding-right .18s ease; }
}
@media(max-width:768px){
  /* Mobile: Palette ist klein und dockt unten — nur kleiner Bottom-Abstand. */
  body.paint-mode-active #tabShifts{ padding-bottom:160px; }
  .paint-palette{ right:8px; left:8px; bottom:8px; width:auto; max-width:none; max-height:38vh; justify-content:flex-start; }
}

/* P6: Desktop-Kalendernav zentrieren (mobile war schon in r144 zentriert). */
.calendar-nav{ justify-content:center; }
.calendar-nav > span[style*="flex:1"]{ display:none; }

/* P2: Topbar-Sprung beim Settings-Tab-Wechsel.
   (a) .btn-outline hat 1px Border, .btn-primary keinen → 2px Layout-Shift beim Active-Toggle.
   (b) Bei Tab-Wechsel ändert sich die Content-Höhe — wenn der vertikale Scrollbar
       auftaucht/verschwindet, ändert sich die verfügbare Viewport-Breite → Topbar reflowt. */
.btn-primary{ border:1px solid transparent; }
html{ scrollbar-gutter:stable; }
#adminSettingsTabs{ scroll-behavior:auto; }
#adminSettingsTabs button{ flex-shrink:0; }

/* ════════════════ Ende r145 ════════════════ */

/* ════════════════ r146: Schicht-Tasks (Phase 1) ════════════════ */
/* Brief: ROSIE-SchichtTasks-KI-Engineering-Brief.md §6 */

/* Kalender-Grid für Aufgaben — sticky linke Spalte (MA-Name) */
.tasks-grid{
  display:grid;
  width:100%;
  font-size:var(--fs-12);
  border-collapse:separate;
  background:var(--panel);
}
.tasks-grid-header{
  display:contents;
}
.tasks-grid-header > div{
  position:sticky; top:0;
  background:var(--panel);
  padding:6px 4px;
  border-bottom:1px solid var(--panel-border);
  font-weight:700;
  text-align:center;
  font-size:var(--fs-12);
  z-index:2;
}
.tasks-grid-header > div:first-child{
  position:sticky; left:0; z-index:3;
}
.tasks-row{
  display:contents;
}
.tasks-row > .tasks-staffcell{
  position:sticky; left:0;
  background:var(--panel);
  padding:6px 8px;
  border-right:1px solid var(--panel-border);
  border-bottom:1px solid var(--hairline);
  font-weight:600;
  white-space:nowrap;
  overflow:hidden;
  text-overflow:ellipsis;
  z-index:1;
  max-width:180px;
}
.tasks-cell{
  border-right:1px solid var(--hairline);
  border-bottom:1px solid var(--hairline);
  padding:4px 2px;
  text-align:center;
  cursor:pointer;
  transition:background .12s;
  min-height:36px;
  position:relative;
}
.tasks-cell:hover{ background:var(--teal-dim); }
.tasks-cell.has-tasks{ background:rgba(20,184,166,.08); }
/* Dienstplan-Projektion (2026-07-06): publizierte Schicht tönt die ganze Zelle
   transluzent in der Schichtfarbe (--tc-proj aus tasksTab.js). background-image
   layert ÜBER die background-color-Regeln (weekend/has-tasks) und lässt die
   box-shadow-Marker (is-today/is-selected) unangetastet. */
.tasks-cell.has-shift{ background-image:linear-gradient(var(--tc-proj), var(--tc-proj)); }
.tasks-cell .tc-shift{ font-weight:700; color:var(--text); }
.tasks-cell .tc-count{
  display:inline-block;
  min-width:16px; height:16px; line-height:16px;
  padding:0 4px; border-radius:8px;
  background:var(--teal); color:#fff;
  font-size:var(--fs-12); font-weight:700;
  margin-top:2px;
}
.tasks-cell .tc-count.tc-done{ background:#10b981; }
.tasks-cell .tc-count.tc-returned{ background:#f59e0b; }
.tasks-cell.is-weekend{ background:rgba(0,0,0,.02); }
:root:not(.light) .tasks-cell.is-weekend{ background:rgba(255,255,255,.02); }
.tasks-cell.is-today{ box-shadow:inset 0 0 0 2px var(--teal); }
.tasks-cell.is-selected{ box-shadow:inset 0 0 0 2px var(--amber); background:var(--amber-dim); }

/* Side-Panel: feste Position rechts, slide-in */
.tasks-side-panel{
  position:fixed;
  top:0; right:-460px; bottom:0;
  width:420px; max-width:90vw;
  background:var(--panel);
  border-left:1px solid var(--panel-border);
  box-shadow:-4px 0 18px rgba(0,0,0,.18);
  z-index:9990;
  display:flex; flex-direction:column;
  transition:right .22s ease;
  overflow:hidden;
}
.tasks-side-panel.is-open{ right:0; }
.tasks-side-panel[aria-hidden="false"]{ right:0; }
.tasks-side-head{
  display:flex; align-items:center; gap:8px;
  padding:12px 14px;
  border-bottom:1px solid var(--panel-border);
  background:linear-gradient(180deg, var(--teal-dim) 0%, transparent 100%);
}
.tasks-side-body{
  flex:1; overflow-y:auto;
  padding:12px 14px;
}
.task-card{
  background:var(--bg);
  border:1px solid var(--panel-border);
  border-radius:8px;
  padding:8px 10px;
  font-size:12px;
}
.task-card .tc-title{ font-weight:700; }
.task-card .tc-meta{ font-size:var(--fs-12); color:var(--muted); margin-top:2px; }
.task-card[data-status="done"]{ opacity:.65; }
.task-card[data-status="returned"]{ border-color:var(--amber); background:var(--amber-dim); }
.task-card[data-status="in_progress"]{ border-left:3px solid var(--teal); }
.task-card .tc-actions{ display:flex; gap:4px; margin-top:6px; flex-wrap:wrap; }
.task-prio-urgent{ color:#dc2626; font-weight:700; }
.task-prio-high  { color:#f59e0b; font-weight:700; }
.task-prio-low   { color:var(--muted); }

@media(max-width:768px){
  .tasks-side-panel{ width:96vw; right:-100vw; }
  .tasks-side-panel.is-open, .tasks-side-panel[aria-hidden="false"]{ right:0; }
}

/* ──── r147 P2: Task-Detail-View + Messages-Thread ──── */
.task-detail-head{ display:flex; gap:10px; align-items:flex-start; margin-bottom:10px; }
.task-detail-head .td-prio{ font-size:22px; line-height:1; }
.td-title{ font-weight:700; font-size:14px; line-height:1.3; word-wrap:break-word; }
.td-meta{ font-size:var(--fs-12); color:var(--muted); margin-top:4px; display:flex; flex-wrap:wrap; gap:6px; align-items:center; }
.td-chip{
  display:inline-flex; align-items:center; gap:3px;
  padding:2px 6px; border-radius:10px;
  background:var(--teal-dim); color:var(--text-secondary);
  font-size:var(--fs-12);
}
.td-desc{
  background:var(--bg);
  border-left:3px solid var(--teal);
  padding:8px 10px; border-radius:0 6px 6px 0;
  font-size:12px; line-height:1.5;
  margin-bottom:10px;
  white-space:pre-wrap;
}
.td-return-reason{
  background:var(--amber-dim);
  border:1px solid var(--amber);
  padding:8px 10px; border-radius:6px;
  font-size:12px; margin-bottom:10px;
  color:var(--text);
}
.td-actions{ display:flex; gap:6px; flex-wrap:wrap; margin-bottom:14px; }
.td-thread-head{
  font-size:var(--fs-12); font-weight:700;
  color:var(--text-secondary);
  margin-bottom:6px; display:flex; align-items:center; gap:6px;
  padding-top:8px; border-top:1px solid var(--panel-border);
}
.td-thread-count{
  display:inline-block; min-width:16px; height:16px; line-height:16px;
  padding:0 5px; border-radius:8px;
  background:var(--teal); color:#fff;
  font-size:var(--fs-12); font-weight:700;
}
.td-thread{
  max-height:280px;
  overflow-y:auto;
  display:flex; flex-direction:column; gap:6px;
  padding:4px; margin-bottom:10px;
  background:var(--bg);
  border-radius:6px;
  border:1px solid var(--hairline);
}
.td-msg{
  background:var(--panel);
  border:1px solid var(--panel-border);
  border-radius:8px;
  padding:6px 9px;
  font-size:12px; line-height:1.4;
}
.td-msg-head{ font-size:var(--fs-12); color:var(--muted); margin-bottom:2px; font-weight:600; }
.td-msg-body{ word-wrap:break-word; white-space:pre-wrap; }
.td-msg-mine{ background:var(--teal-dim); border-color:var(--teal); }
.td-msg-mine .td-msg-head{ color:var(--teal); }
.td-msg-sys{
  background:rgba(0,0,0,.04); font-style:italic;
  border-style:dashed;
}
:root:not(.light) .td-msg-sys{ background:rgba(255,255,255,.03); }
.td-compose{ display:flex; gap:6px; align-items:flex-end; }
.td-compose textarea{
  flex:1;
  font-size:12px; padding:8px 10px;
  border-radius:6px; border:1px solid var(--panel-border);
  background:var(--bg); color:var(--text);
  resize:vertical; min-height:36px; max-height:160px;
}
.td-compose textarea:focus{ outline:none; border-color:var(--teal); box-shadow:0 0 0 2px var(--teal-dim); }
.td-compose .btn{ flex:0 0 auto; }

/* ──── r147 P3.3: KI-Panel (Autonomie + Suggestions + Templates) ──── */
.tasks-ai-panel{ width:480px; max-width:92vw; }
@media(max-width:768px){ .tasks-ai-panel{ width:96vw; } }
.ki-section{
  margin-bottom:18px;
  padding-bottom:14px;
  border-bottom:1px dashed var(--panel-border);
}
.ki-section:last-child{ border-bottom:0; }
.ki-section-head{
  font-size:12px; font-weight:700; margin-bottom:8px;
  display:flex; align-items:center; gap:6px;
  color:var(--text);
}
.ki-section-icon{ font-size:14px; }
.ki-count{
  display:inline-block; min-width:18px; padding:0 5px;
  background:var(--teal); color:#fff;
  border-radius:9px; font-size:var(--fs-12); font-weight:700;
  text-align:center; margin-left:auto;
}
.ki-slider-wrap{
  display:grid; grid-template-columns:repeat(4, 1fr);
  gap:4px; padding:4px;
  background:var(--bg);
  border-radius:10px;
  border:1px solid var(--panel-border);
}
.ki-slider-pos{
  background:transparent; border:none;
  padding:8px 6px; border-radius:8px;
  cursor:pointer; text-align:center;
  transition:background .15s, transform .12s;
  display:flex; flex-direction:column; gap:2px; align-items:center;
}
.ki-slider-pos:hover{ background:var(--teal-dim); }
.ki-slider-pos.is-active{
  background:var(--teal); color:#fff;
  box-shadow:0 2px 6px rgba(20,184,166,.35);
}
.ki-slider-pos.is-active .ki-slider-pos-hint{ color:rgba(255,255,255,.85); }
.ki-slider-pos-label{ font-size:var(--fs-12); font-weight:700; }.ki-card{
  background:var(--bg);
  border:1px solid var(--panel-border);
  border-radius:8px;
  padding:10px 12px;
  margin-bottom:8px;
}
.ki-card-title{ font-weight:700; font-size:12px; margin-bottom:4px; }
.ki-card-meta{ display:flex; gap:4px; flex-wrap:wrap; margin-bottom:4px; }.ki-card-stats{ font-size:var(--fs-12); color:var(--muted); margin-bottom:6px; }
.ki-card-actions{ display:flex; gap:4px; }
.ki-tmpl{
  padding:6px 8px;
  background:var(--bg);
  border:1px solid var(--panel-border);
  border-radius:6px;
}
.ki-tmpl[data-locked="1"]{ border-color:var(--amber); background:var(--amber-dim); }
.ki-tmpl[data-active="0"]{ opacity:.6; }

/* ──── r147 P4.1: Wochen- + Tagesansicht ──── */
.tasks-cell-week{ min-height:60px; padding:6px 4px; display:flex; flex-direction:column; align-items:center; justify-content:flex-start; gap:2px; }
.tasks-cell-week .tc-shift{ font-size:14px; }
.tasks-cell-week .tc-count{ margin-top:4px; }
.tc-progress{
  width:80%; height:3px;
  background:var(--hairline); border-radius:2px;
  margin-top:4px; overflow:hidden;
}
.tc-progress-bar{
  height:100%; background:var(--teal);
  transition:width .3s ease;
}
.tasks-day-view{ padding:14px; display:flex; flex-direction:column; gap:16px; }
.day-group-head{
  font-size:13px; font-weight:700; margin-bottom:8px;
  padding:6px 10px;
  background:var(--teal-dim); color:var(--teal);
  border-radius:6px;
  display:flex; align-items:center; gap:8px;
}
.day-group-body{
  display:grid;
  grid-template-columns:repeat(auto-fill, minmax(220px, 1fr));
  gap:10px;
}
.day-staff-card{
  background:var(--bg);
  border:1px solid var(--panel-border);
  border-radius:10px;
  padding:10px 12px;
  transition:transform .12s, box-shadow .12s;
}
.day-staff-card:hover{
  transform:translateY(-1px);
  box-shadow:0 4px 14px rgba(20,184,166,.18);
  border-color:var(--teal);
}
.dsc-head{ display:flex; align-items:baseline; justify-content:space-between; }
.dsc-name{ font-weight:700; font-size:12px; }
.dsc-meta{ font-size:var(--fs-12); color:var(--muted); font-weight:600; }
.dsc-progress{
  height:4px; background:var(--hairline);
  border-radius:2px; margin-top:6px; overflow:hidden;
}
.dsc-progress-bar{
  height:100%;
  background:linear-gradient(90deg, var(--teal) 0%, var(--green) 100%);
  transition:width .3s ease;
}
.dsc-task-list{
  display:flex; flex-direction:column; gap:3px;
  margin-top:8px;
  border-top:1px dashed var(--hairline);
  padding-top:6px;
}
.dsc-task{ font-size:var(--fs-12); line-height:1.3; color:var(--text); }
.dsc-task-more{ color:var(--muted); font-style:italic; }

/* ──── r147 P4.2: Audit-Panel ──── */
.tasks-audit-panel{ width:520px; max-width:96vw; }
@media(max-width:768px){ .tasks-audit-panel{ width:96vw; } }
.audit-filters{
  display:flex; gap:6px; flex-wrap:wrap;
  margin-bottom:12px;
  padding-bottom:10px;
  border-bottom:1px solid var(--panel-border);
}
.audit-verify{
  padding:8px 12px;
  border-radius:8px;
  margin-bottom:10px;
  font-size:12px; font-weight:700;
  text-align:center;
}
.audit-verify-ok{ background:rgba(16,185,129,.12); color:#10b981; border:1px solid #10b981; }
.audit-verify-fail{ background:var(--amber-dim); color:var(--amber); border:1px solid var(--amber); }
.audit-list{ display:flex; flex-direction:column; gap:4px; }
.audit-item{
  background:var(--bg);
  border:1px solid var(--panel-border);
  border-radius:6px;
  font-size:var(--fs-12);
}
.audit-item summary{
  display:grid;
  grid-template-columns:auto 1fr auto;
  gap:8px;
  padding:6px 10px;
  cursor:pointer;
  list-style:none;
  align-items:center;
}
.audit-item summary::-webkit-details-marker{ display:none; }
.audit-type{
  font-weight:700; color:var(--teal); font-size:var(--fs-12);
  padding:2px 6px; background:var(--teal-dim); border-radius:4px;
}
.audit-actor{ color:var(--text-secondary); font-size:var(--fs-12); }
.audit-time{ color:var(--muted); font-size:var(--fs-12); }
.audit-detail{
  padding:6px 10px 10px;
  border-top:1px dashed var(--hairline);
  font-size:var(--fs-12);
  color:var(--text-secondary);
}
.audit-detail code{
  background:var(--panel);
  padding:1px 4px; border-radius:3px;
  font-family:'SF Mono', 'Consolas', monospace;
  font-size:var(--fs-12);
}
.audit-payload{
  background:var(--panel);
  border:1px solid var(--hairline);
  border-radius:4px;
  padding:6px;
  font-family:'SF Mono', 'Consolas', monospace;
  font-size:var(--fs-12);
  line-height:1.4;
  margin-top:4px;
  overflow-x:auto;
  white-space:pre-wrap;
  word-break:break-word;
}

/* ──── r148 Polish 3: Wochen-View Pagination ──── */
.tasks-pagination{
  display:flex; gap:8px; align-items:center;
  padding:10px 14px;
  background:var(--panel);
  border-top:1px solid var(--panel-border);
  font-size:var(--fs-12); color:var(--muted);
  position:sticky; bottom:0;
}
.tasks-pagination > span{ flex:1; }

/* ──── r148 Polish 2: Audit Date-Range-Picker ──── */
.audit-date-range{
  display:flex; gap:6px; align-items:center;
  flex-basis:100%;
  padding-top:4px;
  border-top:1px dashed var(--hairline);
  margin-top:4px;
}
.audit-date-range label{
  display:inline-flex; align-items:center; gap:4px;
  font-size:var(--fs-12); color:var(--text-secondary);
}
.audit-date-range input[type="date"]{
  font-size:var(--fs-12);
  padding:3px 5px;
  border-radius:4px;
  border:1px solid var(--panel-border);
  background:var(--bg);
  color:var(--text);
  font-family:inherit;
}
.audit-date-range input[type="date"]:focus{
  outline:none;
  border-color:var(--teal);
  box-shadow:0 0 0 2px var(--teal-dim);
}

/* ──── r148 Polish: Template-Edit-Form (Details-basiert) ──── */
.ki-tmpl{
  padding:0;
  background:var(--bg);
  border:1px solid var(--panel-border);
  border-radius:6px;
}
.ki-tmpl[open]{ background:var(--panel); border-color:var(--teal); }
.ki-tmpl-summary{
  display:flex; align-items:center; gap:6px;
  padding:6px 8px;
  cursor:pointer;
  list-style:none;
}
.ki-tmpl-summary::-webkit-details-marker{ display:none; }.ki-tmpl[open] > .ki-tmpl-summary::before{ transform:rotate(90deg); }
.ki-tmpl-edit{
  padding:8px 10px 10px;
  border-top:1px dashed var(--panel-border);
  display:flex; flex-direction:column; gap:4px;
}
.ki-edit-input{
  font-size:var(--fs-12);
  padding:4px 6px;
  border-radius:4px;
  border:1px solid var(--panel-border);
  background:var(--bg);
  color:var(--text);
  width:100%;
  font-family:inherit;
}
.ki-edit-input:focus{
  outline:none;
  border-color:var(--teal);
  box-shadow:0 0 0 2px var(--teal-dim);
}
.ki-edit-input:disabled{ opacity:0.5; cursor:not-allowed; }
.ki-edit-input[type="checkbox"]{ width:auto; }
.ki-edit-input[type="time"]{ width:auto; }

/* ════════════════ Ende r147 P4 ════════════════ */
/* ════════════════ Ende r147 P3 ════════════════ */
/* ════════════════ Ende r147 P2 ════════════════ */
/* ════════════════ Ende r146 ════════════════ */
/* ════════════════ Ende Brand Kit r127/r128/r135/r136/r140 ════════════════ */

/* ════════════════════════════════════════════════════════════════════════════ */
/* r150: Lebendige UX — Organic Animations, Healthcare Colors, Ambient       */
/* Gated behind body.rosie-alive — user can toggle off in profile             */
/* ════════════════════════════════════════════════════════════════════════════ */

:root{
  --sage:#7c9a82;--sage-dim:rgba(124,154,130,.12);
  --terracotta:#c4704b;--terracotta-dim:rgba(196,112,75,.12);
  --sand:#d4c5a9;--sand-dim:rgba(212,197,169,.12);
  --ocean:#2d6a7f;--ocean-dim:rgba(45,106,127,.12);
  --ease-bounce:cubic-bezier(.34,1.56,.64,1);
  --ease-silk:cubic-bezier(.25,.8,.25,1);
  --ease-decel:cubic-bezier(0,0,.2,1);
  --crc-tint:transparent;--crc-opacity:0
}

/* ── prefers-reduced-motion: suppress all living animation ── */
@media(prefers-reduced-motion:reduce){
  body.rosie-alive *,body.rosie-alive *::before,body.rosie-alive *::after{
    animation-duration:.001s!important;transition-duration:.001s!important}
}

/* ── Circadian Ambient Lens (overlay, pointer-events:none) ── */
#crcLens{position:fixed;inset:0;z-index:99990;pointer-events:none;
  background:var(--crc-tint);opacity:var(--crc-opacity);
  mix-blend-mode:soft-light;transition:background 120s linear,opacity 120s linear}

/* ── Organic Easing on Core Elements ── */
body.rosie-alive .card{
  transition:transform .35s var(--ease-bounce),box-shadow .35s var(--ease-silk),border-color .2s var(--ease-silk)}
body.rosie-alive .card:hover{transform:translateY(-2px);box-shadow:0 8px 28px rgba(0,0,0,.1)}
body.rosie-alive .btn{transition:all .25s var(--ease-bounce)}
body.rosie-alive .btn:active{transform:scale(.95)!important;transition-duration:.1s}
body.rosie-alive .btn-primary:active{box-shadow:0 0 0 4px var(--teal-dim)}
body.rosie-alive .tab-btn{transition:all .2s var(--ease-silk)}
body.rosie-alive .staff-card{transition:transform .3s var(--ease-bounce),box-shadow .3s var(--ease-silk),border-color .2s var(--ease-silk)}
body.rosie-alive .staff-card:hover{transform:translateY(-3px) scale(1.01)}

/* ── Elastic Overscroll ── */
body.rosie-alive .sq-grid,
body.rosie-alive .staff-grid,
body.rosie-alive .chat-messages,
body.rosie-alive .feed-list,
body.rosie-alive .signal-list,
body.rosie-alive .alarm-section,
body.rosie-alive .conv-item + .conv-item{
  scroll-behavior:smooth}
body.rosie-alive{overscroll-behavior-y:contain;-webkit-overflow-scrolling:touch}

/* ── Modal Entrance (organic bounce) ── */
body.rosie-alive .modal-box{animation:aliveModalIn .4s var(--ease-bounce)}
@keyframes aliveModalIn{
  0%{opacity:0;transform:scale(.92) translateY(12px)}
  60%{transform:scale(1.02) translateY(-2px)}
  100%{opacity:1;transform:scale(1) translateY(0)}
}

/* ── Sidebar Slide (organic) ── */
body.rosie-alive #liveBrowserSidebar{transition:transform .35s var(--ease-bounce)}
body.rosie-alive #alarmSidebar{transition:transform .35s var(--ease-bounce)}

/* ── Toast Alive (replaces inline styles) ── */
.rosie-toast-alive{
  position:fixed;bottom:80px;left:50%;z-index:99999;
  padding:12px 22px;border-radius:14px;
  font-size:13px;font-weight:600;
  box-shadow:0 8px 32px rgba(0,0,0,.2);
  max-width:88vw;text-align:center;pointer-events:none;
  animation:toastIn .5s var(--ease-bounce) forwards}
.rosie-toast-alive.toast-out{animation:toastOut .4s var(--ease-silk) forwards}
.rosie-toast-alive.toast-success{background:linear-gradient(135deg,#0f766e,#14b8a6);color:#fff}
.rosie-toast-alive.toast-error{background:linear-gradient(135deg,#92400e,#b8860b);color:#fff}
.rosie-toast-alive.toast-info{background:linear-gradient(135deg,#1e3a5f,#3b82f6);color:#fff}
/* FN-307/1a — Gold-Soft-Warndarstellung (vorher: 'warning' lief unsichtbar als '.toast-info').
   Hintergrund-Token bewusst wiederverwendet statt neu erfunden: --soft-warn/--rosie-gold tragen
   im Rest dieser Datei bereits exakt diese Bedeutung ("warm amber statt aggressivem Rot", s.
   .sq-cell-error-Konfliktanimation) und sind — wie bei den 3 Geschwister-Toasts oben, die
   ebenfalls literale statt themenabhängige Werte nutzen — in JEDEM der 3 Farbmodi identisch
   definiert (kein .light/.nightshift/.preset-rose-Override). Textfarbe bewusst NICHT var(--bg)
   (das wäre in .light hell auf hell — --bg wechselt dort auf #f0f4f8) — literal dunkel für
   stabilen Kontrast (≥6:1 gegen beide Gradient-Enden) unabhängig vom Farbmodus. */
.rosie-toast-alive.toast-warning{background:linear-gradient(135deg,var(--soft-warn),var(--rosie-gold));color:#241a00}
@keyframes toastIn{
  0%{transform:translateX(-50%) translateY(20px) scale(.9);opacity:0}
  100%{transform:translateX(-50%) translateY(0) scale(1);opacity:1}
}
@keyframes toastOut{
  0%{transform:translateX(-50%) translateY(0) scale(1);opacity:1}
  100%{transform:translateX(-50%) translateY(-10px) scale(.95);opacity:0}
}

/* ── Transparency Gate (v9.2, revDSG Art. 6 Informed Consent) ── */
.transparency-step{display:none}
.transparency-step.active{display:block}

/* ── Celebration Pulse (on success) ── */
@keyframes celebratePulse{
  0%{box-shadow:0 0 0 0 rgba(20,184,166,.4)}
  50%{box-shadow:0 0 0 12px rgba(20,184,166,0)}
  100%{box-shadow:0 0 0 0 rgba(20,184,166,0)}
}
.rosie-celebrate{animation:celebratePulse .8s var(--ease-bounce)}

/* ── Success Glow (brief flash on element) ── */
@keyframes successGlow{
  0%{outline:2px solid transparent;outline-offset:0}
  40%{outline:2px solid var(--teal);outline-offset:4px}
  100%{outline:2px solid transparent;outline-offset:0}
}
body.rosie-alive .rosie-glow{animation:successGlow .6s var(--ease-silk)}

/* ── Soft Conflict (warm amber statt aggressivem Rot) ── */
body.rosie-alive .sq-cell-error{animation:softConflict .5s var(--ease-silk)}
@keyframes softConflict{
  0%{background:var(--soft-warn-dim);transform:translateX(0)}
  25%{transform:translateX(-2px)}
  75%{transform:translateX(2px)}
  100%{background:transparent;transform:translateX(0)}
}

/* ── KPI Card Staggered Appear ── */
body.rosie-alive .kpi-item{animation:kpiAppear .4s var(--ease-bounce) both}
@keyframes kpiAppear{
  0%{opacity:0;transform:translateY(8px) scale(.97)}
  100%{opacity:1;transform:translateY(0) scale(1)}
}
body.rosie-alive .kpi-item:nth-child(1){animation-delay:.05s}
body.rosie-alive .kpi-item:nth-child(2){animation-delay:.1s}
body.rosie-alive .kpi-item:nth-child(3){animation-delay:.15s}
body.rosie-alive .kpi-item:nth-child(4){animation-delay:.2s}
body.rosie-alive .kpi-item:nth-child(5){animation-delay:.25s}
body.rosie-alive .kpi-item:nth-child(6){animation-delay:.3s}

/* ── Calendar Day Hover (organic lift) ── */
body.rosie-alive .cal-day{transition:all .2s var(--ease-silk)}
body.rosie-alive .cal-day:hover{transform:translateY(-1px) scale(1.02);box-shadow:0 4px 12px rgba(0,0,0,.08)}

/* ── Tab Content Fade ── */
body.rosie-alive .tab-content.active{animation:tabFadeIn .3s var(--ease-decel)}
@keyframes tabFadeIn{0%{opacity:.6;transform:translateY(4px)}100%{opacity:1;transform:translateY(0)}}

/* ── Feierabend Card ── */
.feierabend-card{
  background:linear-gradient(135deg,var(--ocean),var(--sage),var(--terracotta));
  background-size:200% 200%;
  border-radius:16px;padding:24px 28px;color:#fff;text-align:center;
  margin:16px auto;max-width:480px;
  box-shadow:0 8px 32px rgba(0,0,0,.15);
  animation:feierabendShift 6s ease-in-out infinite alternate}
.feierabend-card h3{font-size:20px;font-weight:800;margin-bottom:6px;text-shadow:0 1px 4px rgba(0,0,0,.15)}
.feierabend-card p{font-size:13px;opacity:.9;line-height:1.6}
@keyframes feierabendShift{0%{background-position:0% 50%}100%{background-position:100% 50%}}

/* ── UX-Alive Toggle (Profile) ── */
.ux-alive-toggle,.sound-toggle{display:flex;align-items:center;gap:12px;padding:10px 12px;
  background:var(--bg);border-radius:var(--radius-sm);border:1px solid var(--panel-border);
  margin-bottom:8px;cursor:pointer;transition:opacity .2s}
.ux-alive-toggle:hover,.sound-toggle:hover{border-color:var(--teal)}
.toggle-track{width:36px;height:20px;border-radius:10px;flex-shrink:0;
  background:var(--panel-border);position:relative;transition:background .3s var(--ease-bounce)}
.toggle-track.on{background:var(--teal)}
.toggle-thumb{width:16px;height:16px;border-radius:50%;
  background:#fff;position:absolute;top:2px;left:2px;
  transition:left .3s var(--ease-bounce);box-shadow:0 1px 3px rgba(0,0,0,.2)}
.toggle-track.on .toggle-thumb{left:18px}
.toggle-label{font-size:var(--fs-12);font-weight:600;color:var(--text)}
/* ── Bounty Item Pulse (on new bounty) ── */
body.rosie-alive .bounty-item{transition:all .25s var(--ease-silk)}
body.rosie-alive .bounty-item:hover{transform:translateX(4px)}

/* ── Healthcare Accent (subtle in Admin grids) ── */
body.rosie-alive .admin-grid .card{transition:transform .3s var(--ease-bounce),border-color .2s}
body.rosie-alive .admin-grid .card:hover{transform:translateY(-2px);border-color:var(--sage)}

/* ── Paint Tool Magnetic Snap Feel ── */
body.rosie-alive .paint-tool{transition:all .2s var(--ease-bounce)}
body.rosie-alive .paint-tool:hover{transform:scale(1.15);box-shadow:0 0 16px var(--teal-dim)}

/* ════════════════ Ende r150: Lebendige UX ════════════════ */

/* ════════════════ TimeFlow v2 (2026-07-06): Tagesablauf-Panorama ════════════════
 * Kompletter Neubau der r157/r159-Schicht-Flow-Grafik (Mandat Flo): foto-
 * realistisch anmutende Alpen-Szene (SVG-Panorama aus tasksTab.js: Bergkämme,
 * See-Spiegelung, Talnebel, Chalet, prozedurale Sterne) + Tagesablauf-Zeitleiste
 * mit klickbaren Task-Punkten + Ansicht-Umschalter für Admin/Planer/Verantwortliche.
 * Alles CSS/SVG, keine Bild-Assets. Reduced-Motion deaktiviert alle Loops. */
.task-flow-card{position:relative;border:none;border-radius:16px;
  box-shadow:0 18px 60px rgba(4,10,30,.28), 0 6px 16px rgba(4,10,30,.14);
  min-height:400px}

/* ── Himmel: 9 Tagesphasen, feiner abgestufte Verläufe (Rayleigh-Look) ── */
.tf-sky{position:absolute;inset:0;z-index:0;overflow:hidden;border-radius:16px;
  background:linear-gradient(180deg,#1a2540 0%,#2b3a6a 35%,#3d5294 60%,#5e74b8 90%,#8b9dcf 100%);
  transition:background 1.5s ease}
.tf-sky.is-dawn      {background:linear-gradient(180deg,#1f2a5e 0%,#3a3474 18%,#6c4b6e 38%,#a8636a 55%,#d88a62 70%,#f2ae6e 84%,#ffd9a0 100%)}
.tf-sky.is-morning   {background:linear-gradient(180deg,#3a62a4 0%,#4a73b0 22%,#6a98cc 45%,#8fb6df 65%,#c5dcef 84%,#ffedc9 100%)}
.tf-sky.is-day       {background:linear-gradient(180deg,#2f6fb0 0%,#3c7fb8 20%,#5b9bd2 42%,#82b6df 64%,#b4d4ec 86%,#e8f4fa 100%)}
.tf-sky.is-noon      {background:linear-gradient(180deg,#1f64a2 0%,#2b6ea6 18%,#4a8dc5 40%,#7eb4df 62%,#c0dbef 85%,#fef9e0 100%)}
.tf-sky.is-afternoon {background:linear-gradient(180deg,#33629a 0%,#3c6da0 20%,#5a8dc4 42%,#94b3da 62%,#d9b58a 84%,#f6cf92 100%)}
.tf-sky.is-evening   {background:linear-gradient(180deg,#1c2450 0%,#29325b 16%,#5d3e6d 34%,#a85572 52%,#d97954 70%,#f3a256 85%,#ffca7a 100%)}
.tf-sky.is-dusk      {background:linear-gradient(180deg,#0b0f30 0%,#11163a 18%,#2c2b5b 38%,#5a3268 56%,#95425e 74%,#c66c4d 90%,#e8935e 100%)}
.tf-sky.is-night     {background:linear-gradient(180deg,#030614 0%,#050a1f 22%,#0d1a3a 45%,#1a2d5a 68%,#243d75 88%,#345494 100%)}
.tf-sky.is-deep-night{background:linear-gradient(180deg,#000004 0%,#000007 24%,#050a1f 48%,#0a1535 70%,#0f1f4a 90%,#18306a 100%)}

/* ── Prozeduraler Sternenhimmel (SVG aus JS) + Milchstrasse ── */
.tf-stars-svg{position:absolute;inset:0;width:100%;height:100%;z-index:1;
  pointer-events:none;opacity:0;transition:opacity 2s ease}
.tf-sky.is-night ~ .tf-stars-svg, .tf-sky.is-deep-night ~ .tf-stars-svg{opacity:1}
.tf-sky.is-dusk ~ .tf-stars-svg{opacity:.7}
.tf-sky.is-dawn ~ .tf-stars-svg{opacity:.3}
.tf-star-tw{animation:tf-twinkle 4s ease-in-out infinite}
@keyframes tf-twinkle{0%,100%{opacity:.25} 50%{opacity:1}}

/* ── Panorama-Szene (SVG aus JS) ── */
.tf-scene-svg{position:absolute;inset:0;width:100%;height:100%;z-index:2;
  pointer-events:none;border-radius:16px}
.tf-cloud-g{animation:tf-drift2 46s ease-in-out infinite alternate;will-change:transform}
.tf-cloud-g.tf-cloud-b{animation-duration:64s;animation-delay:-18s}
.tf-cloud-g.tf-cloud-c{animation-duration:82s;animation-delay:-40s}
@keyframes tf-drift2{from{transform:translateX(-46px)} to{transform:translateX(46px)}}
.tf-waves path{animation:tf-shimmer 7s ease-in-out infinite}
.tf-waves path:nth-child(2){animation-delay:-2.4s}
.tf-waves path:nth-child(3){animation-delay:-4.1s}
.tf-waves path:nth-child(4){animation-delay:-5.6s}
@keyframes tf-shimmer{0%,100%{opacity:.16} 50%{opacity:.55}}
.tf-rays{animation:tf-rays-breathe 9s ease-in-out infinite}
@keyframes tf-rays-breathe{0%,100%{opacity:.10} 50%{opacity:.22}}

/* ── Sonne & Mond (fotorealistischere Körper, wandern auf dem Bogen) ── */
.tf-celestial{position:absolute;width:88px;height:88px;z-index:4;pointer-events:none;
  transition:left 2s cubic-bezier(.4,0,.2,1), top 2s cubic-bezier(.4,0,.2,1);
  animation:tf-celestial-sway 9s ease-in-out infinite}
@keyframes tf-celestial-sway{0%,100%{transform:translate(-50%,-50%) translateY(0)} 50%{transform:translate(-50%,-50%) translateY(4px)}}
.tf-sun{width:100%;height:100%;border-radius:50%;position:relative;
  background:radial-gradient(circle at 34% 32%, #fffdf2 0%, #fff3c4 18%, #ffe28e 40%, #ffc554 66%, #ff9d2e 86%, #ff861c 100%);
  box-shadow:
    0 0 34px 6px rgba(255,224,140,.95),
    0 0 90px 22px rgba(255,190,80,.6),
    0 0 170px 60px rgba(255,150,50,.34),
    0 0 300px 120px rgba(255,120,40,.16),
    inset -10px -12px 26px rgba(224,110,20,.45),
    inset 6px 8px 18px rgba(255,255,240,.65);
  animation:tf-sun-pulse 4s ease-in-out infinite}
@keyframes tf-sun-pulse{0%,100%{filter:brightness(1) saturate(1)} 50%{filter:brightness(1.07) saturate(1.12)}}
.tf-sun::before{content:'';position:absolute;inset:-34%;border-radius:50%;z-index:-1;
  background:conic-gradient(from 0deg,
    transparent 0deg, rgba(255,224,150,.32) 8deg, transparent 13deg,
    transparent 30deg, rgba(255,224,150,.26) 38deg, transparent 43deg,
    transparent 60deg, rgba(255,224,150,.32) 68deg, transparent 73deg,
    transparent 90deg, rgba(255,224,150,.26) 98deg, transparent 103deg,
    transparent 120deg, rgba(255,224,150,.32) 128deg, transparent 133deg,
    transparent 150deg, rgba(255,224,150,.26) 158deg, transparent 163deg,
    transparent 180deg, rgba(255,224,150,.32) 188deg, transparent 193deg,
    transparent 210deg, rgba(255,224,150,.26) 218deg, transparent 223deg,
    transparent 240deg, rgba(255,224,150,.32) 248deg, transparent 253deg,
    transparent 270deg, rgba(255,224,150,.26) 278deg, transparent 283deg,
    transparent 300deg, rgba(255,224,150,.32) 308deg, transparent 313deg,
    transparent 330deg, rgba(255,224,150,.26) 338deg, transparent 343deg, transparent 360deg);
  animation:tf-rays-rotate 30s linear infinite}
@keyframes tf-rays-rotate{from{transform:rotate(0deg)} to{transform:rotate(360deg)}}
.tf-sun::after{content:'';position:absolute;inset:14%;border-radius:50%;
  background:radial-gradient(circle at 40% 36%, rgba(255,255,250,.85) 0%, rgba(255,244,200,.25) 45%, transparent 70%)}
.tf-moon{width:100%;height:100%;border-radius:50%;position:relative;overflow:hidden;
  background:radial-gradient(circle at 36% 30%, #fffef8 0%, #f4efdb 24%, #ddd6ba 48%, #b3ac93 72%, #837d67 92%, #5f5a48 100%);
  box-shadow:
    0 0 26px 4px rgba(240,236,205,.75),
    0 0 70px 18px rgba(205,214,255,.42),
    0 0 150px 50px rgba(160,180,240,.24),
    inset -12px -14px 30px rgba(52,52,64,.55),
    inset 5px 6px 14px rgba(255,255,248,.5);
  animation:tf-moon-drift 22s ease-in-out infinite}
@keyframes tf-moon-drift{0%,100%{transform:rotate(-2deg)} 50%{transform:rotate(2deg)}}
.tf-moon-crater{position:absolute;border-radius:50%;
  background:radial-gradient(circle at 38% 34%, rgba(120,118,96,.4), rgba(84,82,64,.22) 60%, transparent 100%);
  box-shadow:inset 1.5px 1.5px 4px rgba(44,44,36,.4), inset -1px -1px 2px rgba(255,255,240,.18)}
.tf-moon-crater.c1{width:20px;height:20px;top:20%;left:54%}
.tf-moon-crater.c2{width:12px;height:12px;top:60%;left:26%}
.tf-moon-crater.c3{width:9px;height:9px;top:42%;left:14%}
.tf-moon-crater.c4{width:14px;height:14px;top:68%;left:60%}

/* ── Tagesablauf-Zeitleiste (Bogen + Zeiten + Task-Punkte) ── */
.tf-tl-arc{position:absolute;inset:0;width:100%;height:100%;z-index:3;pointer-events:none}
.tf-tl-arc path{fill:none;stroke-linecap:round}
.tf-tl-arc-rest{stroke:rgba(255,255,255,.30);stroke-width:2px;stroke-dasharray:.2 2.2}
.tf-tl-arc-done{stroke:rgba(255,232,170,.95);stroke-width:2.5px;
  filter:drop-shadow(0 0 5px rgba(255,215,120,.8))}
.tf-tl-time{position:absolute;z-index:5;font-size:var(--fs-12);font-weight:700;color:#fff;
  background:rgba(6,12,30,.42);border:1px solid rgba(255,255,255,.22);
  backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);
  padding:2px 8px;border-radius:10px;letter-spacing:.4px;
  text-shadow:0 1px 3px rgba(0,0,0,.5);pointer-events:none}
.tf-tl-start{left:calc(6% - 16px);top:calc(66% + 12px)}
.tf-tl-end{left:calc(94% - 26px);top:calc(66% + 12px)}
.tf-tl-dot{position:absolute;z-index:6;width:16px;height:16px;border-radius:50%;
  border:2px solid rgba(255,255,255,.9);background:rgba(255,255,255,.28);
  backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);
  cursor:pointer;padding:0;display:flex;align-items:center;justify-content:center;
  box-shadow:0 0 10px rgba(255,255,255,.55), 0 2px 6px rgba(0,0,0,.35);
  transition:transform .18s var(--ease-bounce, cubic-bezier(.34,1.56,.64,1))}
.tf-tl-dot:hover,.tf-tl-dot:focus{transform:scale(1.45);outline:none;z-index:7}
.tf-tl-dot span{width:6px;height:6px;border-radius:50%;background:#fff;display:block}
.tf-tl-dot.is-done{border-color:rgba(140,235,170,.95);background:rgba(48,160,90,.55)}
.tf-tl-dot.is-done span{background:#bdf5cf}
.tf-tl-dot.is-in_progress{border-color:rgba(150,205,255,.95);background:rgba(60,130,220,.5)}
.tf-tl-dot.is-in_progress span{background:#cde6ff;animation:tf-dot-pulse 1.8s ease-in-out infinite}
.tf-tl-dot.is-returned{border-color:rgba(255,170,150,.95);background:rgba(200,80,60,.5)}
.tf-tl-dot.is-open span{animation:tf-dot-pulse 2.6s ease-in-out infinite}
@keyframes tf-dot-pulse{0%,100%{transform:scale(1);opacity:1} 50%{transform:scale(1.5);opacity:.7}}

/* ── Kopf: Titel + (Alles-Seher) Ansicht-Umschalter + Fortschritt ── */
.tf-header{position:absolute;left:16px;top:12px;right:16px;z-index:8;
  color:#fff;text-shadow:0 1px 6px rgba(0,0,0,.55), 0 0 12px rgba(0,0,0,.35);
  display:flex;justify-content:space-between;align-items:flex-start;gap:12px;flex-wrap:wrap}
.tf-shift-title{font-size:16px;font-weight:800;line-height:1.2;letter-spacing:.2px}
.tf-shift-sub{font-size:var(--fs-12);opacity:.94;margin-top:2px;font-weight:500}
.tf-header-right{display:flex;flex-direction:column;align-items:flex-end;gap:6px}
.tf-progress-box{background:rgba(6,12,30,.40);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);
  border:1px solid rgba(255,255,255,.20);padding:6px 12px;border-radius:14px;font-size:var(--fs-12);font-weight:600}
.tf-progress-bar{width:130px;height:5px;background:rgba(255,255,255,.2);border-radius:3px;overflow:hidden;margin-top:4px}
.tf-progress-fill{height:100%;background:linear-gradient(90deg,#ffd76b,#ff8533);border-radius:3px;transition:width 1s ease}
.tf-filterbar{display:flex;gap:6px;align-items:center;flex-wrap:wrap;justify-content:flex-end;
  pointer-events:auto}
.tf-filterbar .tf-filter-select{font-size:var(--fs-12);font-weight:600;color:#fff;
  background:rgba(6,12,30,.46);border:1px solid rgba(255,255,255,.26);border-radius:12px;
  padding:5px 9px;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);
  cursor:pointer;max-width:180px;text-overflow:ellipsis}
.tf-filterbar .tf-filter-select:hover,.tf-filterbar .tf-filter-select:focus{
  border-color:rgba(255,255,255,.55);outline:none;background:rgba(10,18,42,.6)}
.tf-filterbar .tf-filter-select option{color:#1a1f3a;background:#fff}
/* Standalone-Position (Leer-/Prompt-Zustände ohne .tf-header) */
.task-flow-card > .tf-filterbar{position:absolute;top:12px;right:16px;z-index:9}

/* ── Task-Karten (Glass, klickbar, Prioritäts-Kante, Chips) ── */
.tf-tasks{position:absolute;right:18px;top:64px;bottom:26px;width:min(52%, 380px);z-index:7;
  display:flex;flex-direction:column;gap:8px;overflow:hidden;padding-right:4px}
.tf-tasks.tf-tasks-wide{width:min(58%, 430px)}
.tf-task{background:rgba(255,255,255,.20);backdrop-filter:blur(16px) saturate(1.5);
  -webkit-backdrop-filter:blur(16px) saturate(1.5);
  border:1px solid rgba(255,255,255,.30);border-left:3px solid rgba(255,255,255,.35);
  border-radius:12px;padding:9px 12px;color:#fff;font-size:12px;line-height:1.35;
  box-shadow:0 8px 28px rgba(2,8,24,.28), inset 0 1px 0 rgba(255,255,255,.28);
  text-shadow:0 1px 3px rgba(0,0,0,.4);
  display:flex;align-items:center;gap:10px;cursor:pointer;
  transition:transform .16s ease, background .16s ease;
  animation:tf-pop 0.7s cubic-bezier(.34,1.56,.64,1) both;position:relative}
.tf-task:hover{transform:translateX(-3px);background:rgba(255,255,255,.30)}
.tf-task.tf-task-empty{cursor:default;text-align:center;display:block;font-size:var(--fs-12)}
.tf-task.tf-task-empty:hover{transform:none;background:rgba(255,255,255,.20)}
.tf-sky.is-day ~ .tf-tasks .tf-task, .tf-sky.is-noon ~ .tf-tasks .tf-task, .tf-sky.is-morning ~ .tf-tasks .tf-task{
  background:rgba(255,255,255,.34);color:#14203a;text-shadow:none;border-color:rgba(255,255,255,.55)}
.tf-sky.is-day ~ .tf-tasks .tf-task:hover, .tf-sky.is-noon ~ .tf-tasks .tf-task:hover, .tf-sky.is-morning ~ .tf-tasks .tf-task:hover{
  background:rgba(255,255,255,.46)}
.tf-task.is-prio-urgent{border-left-color:#ff5c5c}
.tf-task.is-prio-high{border-left-color:#ffb020}
.tf-task.is-prio-low{border-left-color:rgba(160,190,255,.7)}
.tf-task .tf-task-icon{width:24px;height:24px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:13px;flex-shrink:0;
  background:rgba(255,255,255,.22);box-shadow:inset 0 1px 2px rgba(255,255,255,.3)}
.tf-task .tf-task-body{flex:1;min-width:0;overflow:hidden}
.tf-task .tf-task-title{font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tf-task .tf-task-meta{font-size:var(--fs-12);opacity:.82;margin-top:1px}
.tf-task .tf-task-shiftchip{flex-shrink:0;min-width:20px;height:20px;border-radius:6px;
  display:flex;align-items:center;justify-content:center;padding:0 5px;
  font-size:var(--fs-12);font-weight:800;color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.45);
  box-shadow:0 1px 4px rgba(0,0,0,.3)}
.tf-task .tf-task-assignee{flex-shrink:0;width:24px;height:24px;border-radius:50%;
  display:flex;align-items:center;justify-content:center;
  font-size:var(--fs-12);font-weight:800;letter-spacing:.3px;
  background:rgba(6,12,30,.45);border:1px solid rgba(255,255,255,.4);color:#fff;text-shadow:none}
.tf-sky.is-day ~ .tf-tasks .tf-task .tf-task-assignee, .tf-sky.is-noon ~ .tf-tasks .tf-task .tf-task-assignee, .tf-sky.is-morning ~ .tf-tasks .tf-task .tf-task-assignee{
  background:rgba(20,32,58,.75)}
.tf-task.is-done{opacity:.45;text-decoration:line-through;animation:tf-fade-down 0.8s ease forwards}
.tf-task.is-new{animation:tf-pop-bounce 0.9s cubic-bezier(.34,1.56,.64,1) both}
.tf-task.is-current{border-color:rgba(255,200,90,.7);box-shadow:0 8px 30px rgba(255,170,60,.45), inset 0 1px 0 rgba(255,255,255,.35);
  animation:tf-glow 2.5s ease-in-out infinite}
.tf-more-hint{color:#fff;text-align:center;font-size:var(--fs-12);opacity:.75;text-shadow:0 1px 3px rgba(0,0,0,.4)}
@keyframes tf-pop{0%{opacity:0;transform:translateY(-20px) scale(.85)} 100%{opacity:1;transform:translateY(0) scale(1)}}
@keyframes tf-pop-bounce{
  0%{opacity:0;transform:translateY(-32px) scale(.7)}
  50%{opacity:1;transform:translateY(4px) scale(1.04)}
  70%{transform:translateY(-2px) scale(.99)}
  100%{transform:translateY(0) scale(1)}
}
@keyframes tf-fade-down{0%{opacity:.7;transform:translateY(0)} 100%{opacity:.2;transform:translateY(12px) scale(.95)}}
@keyframes tf-glow{
  0%,100%{box-shadow:0 8px 30px rgba(255,170,60,.45), inset 0 1px 0 rgba(255,255,255,.35)}
  50%   {box-shadow:0 8px 40px rgba(255,200,90,.7), inset 0 1px 0 rgba(255,255,255,.55)}
}

/* ── Leer-/Prompt-Zustand ── */
.tf-empty{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;
  text-align:center;color:#fff;z-index:6;padding:20px;text-shadow:0 2px 8px rgba(0,0,0,.5)}
.tf-empty .tf-empty-icon{font-size:48px;margin-bottom:8px;filter:drop-shadow(0 4px 12px rgba(0,0,0,.4))}
.tf-empty .tf-empty-title{font-size:16px;font-weight:700;margin-bottom:4px}
.tf-empty .tf-empty-sub{font-size:12px;opacity:.88;max-width:360px}

/* ── Lebendige Layer (r159 übernommen: Vögel/Blitz-Sterne/Sternschnuppe) ── */
.tf-stars-flash{position:absolute;inset:0;pointer-events:none;z-index:1;opacity:0;transition:opacity 2s ease}
.tf-sky.is-night ~ .tf-stars-flash, .tf-sky.is-deep-night ~ .tf-stars-flash, .tf-sky.is-dusk ~ .tf-stars-flash{opacity:1}
.tf-stars-flash .tf-flash{position:absolute;width:3px;height:3px;border-radius:50%;background:#fff;
  box-shadow:0 0 4px #fff, 0 0 10px rgba(255,255,255,.7);animation:tf-flash 6s ease-in-out infinite;opacity:0}
@keyframes tf-flash{
  0%,40%,60%,100%{opacity:0;transform:scale(.4)}
  48%,52%{opacity:1;transform:scale(1.6)}
}
.tf-birds{position:absolute;inset:0;pointer-events:none;z-index:3;opacity:0;transition:opacity 2s ease}
.tf-sky.is-morning ~ .tf-birds, .tf-sky.is-day ~ .tf-birds, .tf-sky.is-noon ~ .tf-birds, .tf-sky.is-afternoon ~ .tf-birds, .tf-sky.is-dawn ~ .tf-birds{opacity:.75}
.tf-bird{position:absolute;width:24px;height:14px;left:0;animation:tf-bird-fly 75s linear infinite;will-change:transform}
.tf-bird svg{width:100%;height:100%;display:block;transform-origin:center;animation:tf-bird-flap .45s ease-in-out infinite alternate}
@keyframes tf-bird-fly{
  0%   {transform:translate(-12vw,0)}
  45%  {transform:translate(40vw,-8px)}
  60%  {transform:translate(58vw,4px)}
  100% {transform:translate(112vw,-3px)}
}
@keyframes tf-bird-flap{0%{transform:scaleY(1)} 100%{transform:scaleY(.55)}}
.tf-shootingstar{position:absolute;width:90px;height:2px;z-index:2;border-radius:2px;opacity:0;pointer-events:none;
  background:linear-gradient(90deg, transparent, rgba(255,255,255,.95), transparent);
  filter:drop-shadow(0 0 4px rgba(255,255,255,.7));
  animation:tf-shoot 18s ease-in infinite}
.tf-sky.is-night ~ .tf-shootingstar, .tf-sky.is-deep-night ~ .tf-shootingstar{display:block}
.tf-sky:not(.is-night):not(.is-deep-night) ~ .tf-shootingstar{display:none}
@keyframes tf-shoot{
  0%,82%,100%{opacity:0;transform:translate(-15vw,-2vh) rotate(-22deg)}
  84%{opacity:1}
  92%{opacity:1;transform:translate(45vw,22vh) rotate(-22deg)}
  100%{opacity:0;transform:translate(70vw,35vh) rotate(-22deg)}
}

/* ── Datums-Navigation + Swipe-Hinweis ── */
.tf-datenav{position:absolute;left:14px;bottom:12px;z-index:8;
  display:flex;align-items:center;gap:6px;
  background:rgba(6,12,30,.40);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);
  border:1px solid rgba(255,255,255,.2);
  border-radius:14px;padding:4px 6px;font-size:var(--fs-12);color:#fff;
  text-shadow:0 1px 3px rgba(0,0,0,.45)}
.tf-datenav button{background:rgba(255,255,255,.16);border:1px solid rgba(255,255,255,.22);
  color:#fff;width:24px;height:24px;border-radius:8px;font-size:13px;line-height:1;
  cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0;
  font-family:inherit;transition:background .15s ease}
.tf-datenav button:hover, .tf-datenav button:focus{background:rgba(255,255,255,.3);outline:none}
.tf-datenav .tf-datelabel{padding:0 6px;font-weight:600;min-width:96px;text-align:center;white-space:nowrap;letter-spacing:.2px}
.tf-datenav .tf-today-btn{padding:2px 10px;width:auto;font-size:var(--fs-12);border-radius:10px;font-weight:600;margin-left:2px}
.tf-swipe-hint{position:absolute;right:18px;bottom:14px;z-index:8;
  font-size:var(--fs-12);color:rgba(255,255,255,.75);text-shadow:0 1px 3px rgba(0,0,0,.5);
  pointer-events:none;letter-spacing:.4px}

/* ════════════════ Bauplan Paket 6 (6b): AMBIENT-BAND ════════════════
   Default-Ansicht (docs/konzepte/DRAFT_UI-UX-GESAMTKONZEPT_v2_2026-08-12.md §1.2, Flo-
   Entscheid E6): kompaktes ~120px-Band statt der vollen Panorama-Szene. Himmel-Verlauf ist
   der FIXE Marken-Farbweg Gold→Coral→Plum (s. tasksTabAmbientBand.js-Kopfkommentar für die
   Begründung, warum als SVG-Literal statt CSS-Variable) — hier nur die UMLIEGENDE UI
   (Scrim/Label/Hint/Kollaps-Button + das re-themte Kopf/Task/Datumsnav darunter). */
.task-flow-card .tf-amb{all:unset;display:block;position:relative;width:100%;height:120px;
  border-radius:16px;overflow:hidden;cursor:pointer;box-shadow:0 8px 24px rgba(36,22,64,.22);
  -webkit-tap-highlight-color:transparent}
.task-flow-card .tf-amb:focus-visible{outline:3px solid var(--teal, #14b8a6);outline-offset:2px}
.tf-amb-svg{display:block;width:100%;height:100%}
/* Text-Kontrast-Schutzband (Auftragspunkt 5) — palettenunabhängig, deckt die Label-Zeile
   unabhängig davon ab, wo genau Sonne/Mond/Silhouette gerade liegen. */
.tf-amb-scrim{position:absolute;left:0;right:0;bottom:0;height:56%;pointer-events:none;
  background:linear-gradient(to top, rgba(10,8,24,.62), rgba(10,8,24,0))}
.tf-amb-label{position:absolute;left:14px;bottom:10px;right:78px;color:#fff;font-weight:600;
  font-size:13px;line-height:1.3;text-shadow:0 1px 6px rgba(0,0,0,.55);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tf-amb-hint{position:absolute;right:12px;bottom:10px;color:#fff;font-size:var(--fs-12);
  font-weight:600;background:rgba(10,8,24,.42);border:1px solid rgba(255,255,255,.28);
  border-radius:999px;padding:3px 10px;text-shadow:none;pointer-events:none;white-space:nowrap}
.tf-amb-celestial{transition:transform 2s cubic-bezier(.4,0,.2,1)}
/* Kollaps-Button (Panorama-Modus) — läuft im .tf-datenav-Flexrow mit (s. tasksTabTimeflow.js
   _tfDateNavHtml extraHtml), identisches Styling wie das dortige .tf-today-btn-Pendant. */
.tf-amb-collapse-btn{padding:2px 10px;width:auto;font-size:var(--fs-12);border-radius:10px;
  font-weight:600;margin-left:2px;background:rgba(255,255,255,.16);
  border:1px solid rgba(255,255,255,.22);color:#fff;cursor:pointer;font-family:inherit}
.tf-amb-collapse-btn:hover,.tf-amb-collapse-btn:focus{background:rgba(255,255,255,.3);outline:none}

/* ── Band-Modus: Kopf/Task-Liste/Datumsnav sind hier NORMALER DOKUMENT-FLUSS unterhalb
   des Bandes (statt Panorama-Overlay) — dieselben Bausteine (contentHtml, s.
   tasksTabTimeflow.js), nur re-themt auf die App-Tokens statt Glas-über-Foto-Optik, weil
   sie jetzt auf der normalen Karten-Fläche statt auf dem Himmel-SVG sitzen. Der Karten-
   Rahmen selbst bekommt hier — anders als im Panorama-Modus, wo `.tf-sky` die komplette
   Fläche füllt — die ganz normale `.card`-Optik des restlichen App-Shells (panel/border),
   damit Kopf/Task-Liste nicht wie freischwebender Text auf der Seiten-Hintergrundfarbe
   wirken. Das Band selbst verliert dabei seinen eigenen Radius/Schatten (sitzt flächenbündig
   oben in diesem Rahmen statt als separat schwebende Kachel). */
.task-flow-card.tf-mode-band{min-height:0;box-shadow:var(--shadow);background:var(--panel);
  border:1px solid var(--panel-border);border-radius:16px;overflow:hidden}
.task-flow-card.tf-mode-band .tf-amb{border-radius:0;box-shadow:none}
.tf-band-content{position:relative}
.task-flow-card.tf-mode-band .tf-header{position:static;color:var(--text);text-shadow:none;
  padding:12px 14px 0;flex-direction:column;align-items:stretch;gap:8px}
.task-flow-card.tf-mode-band .tf-header-right{flex-direction:row;justify-content:space-between;
  align-items:center;width:100%}
.task-flow-card.tf-mode-band .tf-progress-box{background:var(--bg);border:1px solid var(--panel-border);
  color:var(--text)}
.task-flow-card.tf-mode-band .tf-progress-bar{background:var(--panel-border)}
.task-flow-card.tf-mode-band .tf-filterbar .tf-filter-select{background:var(--bg);
  border:1px solid var(--panel-border);color:var(--text)}
.task-flow-card.tf-mode-band .tf-filterbar .tf-filter-select option{color:var(--text);background:var(--panel)}
.task-flow-card.tf-mode-band .tf-tasks{position:static;width:auto;right:auto;bottom:auto;top:auto;
  padding:10px 14px 4px;gap:8px;max-height:none;overflow:visible}
.task-flow-card.tf-mode-band .tf-task{background:var(--bg);color:var(--text);text-shadow:none;
  border-color:var(--panel-border);backdrop-filter:none;-webkit-backdrop-filter:none;box-shadow:none}
.task-flow-card.tf-mode-band .tf-task:hover{transform:none;background:var(--panel)}
.task-flow-card.tf-mode-band .tf-task .tf-task-icon{background:var(--panel)}
.task-flow-card.tf-mode-band .tf-task .tf-task-assignee{background:var(--panel-border);color:var(--text)}
.task-flow-card.tf-mode-band .tf-empty{position:static;color:var(--text);text-shadow:none;
  padding:20px 14px;min-height:0}
.task-flow-card.tf-mode-band .tf-empty .tf-empty-icon{filter:none}
.task-flow-card.tf-mode-band .tf-empty .tf-empty-sub{color:var(--muted)}
.task-flow-card.tf-mode-band .tf-datenav{position:static;width:auto;margin:0 14px 12px;
  justify-content:space-between;background:var(--bg);border:1px solid var(--panel-border);
  color:var(--text);text-shadow:none}
.task-flow-card.tf-mode-band .tf-datenav button{background:var(--panel);border-color:var(--panel-border);color:var(--text)}
.task-flow-card.tf-mode-band .tf-swipe-hint{display:none} /* für den Overlay-Kontext designt, im Band-Flow ohne Sinn */
/* ════════════════ Ende Ambient-Band ════════════════ */

/* ════════════════ Bauplan Paket M-C (2026-08-20): Aufgaben-Tab V1-Kartenstil ════════════════
   NUR CSS. `tasksTabAmbientBand.js`/`tasksTabScene.js`/`tasksTabTimeflow.js` bleiben laut
   Bauplan §4/§10 „PIXELGENAU"/byte-identisch — das bereits bestehende .tf-mode-band-Re-Theming
   (Paket 6b, oben) liefert exakt die DOM-Struktur/Klassen, die hier nur visuell auf den
   V1-Kartenstil (Icon-Kreis mit Marken-Akzent aus dem --heute-*-Namespace, ruhigere Radien/
   Abstände) gehoben wird — mobile-only (html.view-mobile), Desktop bleibt Pixel für Pixel
   unangetastet. Bewusst NICHT die bestehenden Emoji (⏰/📄/✨/🌙/☀️/🏥/🔭) aus
   tasksTabTimeflow.js entfernt, obwohl §1.2 das für „bestehende Emoji-Reste im Mobile-Pfad"
   generell verlangt — diese Datei gehört zu den drei explizit geschützten, ein Textänderung
   wäre keine byte-identische Datei mehr. Scope-Ausnahme dokumentiert, s. BACKLOG-Nachtrag
   „Paket M-C". Ebenso bewusst NICHT `.tf-sky`/`.tf-scene-svg`/`.tf-celestial` (Panorama-Modus)
   angefasst — das IST die geschützte Ambient-Band-Szene selbst, nicht die Aufgabenliste. */
html.view-mobile .task-flow-card.tf-mode-band{border-radius:var(--radius-lg)}
html.view-mobile .task-flow-card.tf-mode-band .tf-tasks{gap:9px}
html.view-mobile .task-flow-card.tf-mode-band .tf-task{
  border-radius:var(--radius);border-width:1px;padding:10px 12px;gap:11px;
  transition:transform .16s ease, background .16s ease, box-shadow .16s ease;
}
html.view-mobile .task-flow-card.tf-mode-band .tf-task:hover,
html.view-mobile .task-flow-card.tf-mode-band .tf-task:active{
  background:var(--heute-mist);border-color:var(--heute-coral);
}
html.view-mobile .task-flow-card.tf-mode-band .tf-task .tf-task-icon{
  width:30px;height:30px;background:var(--heute-mist);color:var(--heute-plum);font-size:15px;
}
html.view-mobile .task-flow-card.tf-mode-band .tf-task.is-current .tf-task-icon{
  background:rgba(255,106,61,.16);color:var(--heute-coral);
}
html.view-mobile .task-flow-card.tf-mode-band .tf-task.is-prio-urgent{border-left-color:var(--heute-coral)}
html.view-mobile .task-flow-card.tf-mode-band .tf-task.is-prio-high{border-left-color:var(--heute-gold)}
html.view-mobile .task-flow-card.tf-mode-band .tf-task .tf-task-assignee{
  background:var(--heute-mist);color:var(--heute-plum);border-color:transparent;
}
html.view-mobile .task-flow-card.tf-mode-band .tf-datenav .tf-today-btn{
  background:var(--heute-coral);color:#fff;border-color:var(--heute-coral);
}
/* ── Planer/Admin: reines Farb-/Akzent-Restyling der bestehenden Zeitplan-Matrix
   (tasksTab.js renderTasksCalendar/_renderTasksWeekView/_renderTasksDayView) — keine
   Struktur-Änderung, kein JS-Touch nötig (Bauplan §4: „genügt reines V1-Restyling"). */
html.view-mobile .tasks-cell:hover{background:var(--heute-mist)}
html.view-mobile .tasks-cell.has-tasks{background:rgba(255,106,61,.08)}
html.view-mobile .tasks-cell.is-today{box-shadow:inset 0 0 0 2px var(--heute-coral)}
html.view-mobile .tasks-cell .tc-count{background:var(--heute-coral)}
html.view-mobile .tasks-cell .tc-count.tc-returned{background:var(--heute-gold);color:var(--heute-plum-deep)}
/* ════════════════ Ende Paket M-C ════════════════ */

/* ── Responsive ── */
@media (max-width: 768px){
  .task-flow-card{min-height:400px}
  .tf-celestial{width:62px;height:62px}
  /* Kopf stapelt: Titel-Zeile, darunter Umschalter+Fortschritt nebeneinander —
     sonst überlappte die Filterbar die Task-Karten (Mobile-Verifikation 2026-07-07) */
  .tf-header{flex-direction:column;align-items:stretch;gap:6px}
  .tf-header-right{flex-direction:row;justify-content:space-between;align-items:center;width:100%;flex-wrap:wrap;gap:6px}
  .tf-progress-box{padding:4px 8px;font-size:var(--fs-12)}
  .tf-tasks, .tf-tasks.tf-tasks-wide{width:auto;left:18px;right:18px;top:186px;bottom:60px}
  .tf-task{font-size:var(--fs-12);padding:7px 10px}
  .tf-shift-title{font-size:13px}
  .tf-progress-bar{width:80px}
  .tf-header-right{align-items:flex-end}
  .tf-filterbar .tf-filter-select{max-width:140px;font-size:var(--fs-12)}
  .tf-tl-time{font-size:var(--fs-12)}
  .tf-swipe-hint{font-size:var(--fs-12);right:14px;bottom:11px}
  .tf-datenav{left:10px;bottom:9px;font-size:var(--fs-12)}
  .tf-datenav .tf-datelabel{min-width:78px;padding:0 4px}
  .tf-datenav button{width:22px;height:22px;font-size:12px}
  .tf-bird{width:18px;height:11px}
  /* Bauplan Paket 6 (6b) — Band bleibt weit über der 44px-Touch-Ziel-Norm, wird auf sehr
     schmalen Viewports aber etwas kompakter (Label/Hint-Text hätten sonst kaum Platz).
     Paket 6/3-Nachzug (2026-08-18, R-32/FN-89-Fund): .tf-amb-hint blieb hier unter der
     12px-Mindestschrift (Grundschrift-Konvention, Pflegepersonal-Lesbarkeit auf Mobil-
     geräten) — auf 12px korrigiert (identisch zum Default var(--fs-12) UND zum
     Geschwister .tf-amb-label direkt darüber, das im selben Block bereits korrekt bei
     12px steht), nur das Padding bleibt kompakter. */
  .task-flow-card .tf-amb{height:96px}
  .tf-amb-label{font-size:12px;right:66px}
  .tf-amb-hint{font-size:12px;padding:2px 8px}
}
@media (prefers-reduced-motion: reduce){
  .tf-celestial, .tf-moon, .tf-sun, .tf-sun::before,
  .tf-bird, .tf-bird svg, .tf-shootingstar, .tf-stars-flash .tf-flash,
  .tf-star-tw, .tf-cloud-g, .tf-waves path, .tf-rays,
  .tf-tl-dot span, .tf-task.is-current{animation:none !important}
  .tf-amb-celestial{transition:none !important}
}
/* ════════════════ Ende TimeFlow v2 ════════════════ */

/* ════════════════ r160: Task-Presets + QMS-Rebuild ════════════════
   Silicon-Valley-Pass — durchgängige Tokens (CSS-Variablen), klare Hierarchie,
   keyboard-tauglich, mobile-first. Modal nutzt Backdrop-Blur + ESC-Close.
   QMS-Viewer ist Fullscreen mit dunklem Backdrop, paged via Browser-PDF-Viewer
   (PDF) bzw. nativem Scroll-Container (DOCX/mammoth.js). */
.r160-preset-list{display:flex;flex-direction:column}
.r160-preset-row{display:flex;align-items:center;gap:12px;padding:10px 14px;border-top:1px solid var(--panel-border);transition:background .15s ease}
.r160-preset-row:first-child{border-top:none}
.r160-preset-row:hover{background:var(--bg)}
.r160-preset-main{flex:1;min-width:0}
.r160-preset-title{font-size:13px;font-weight:600;color:var(--text);display:flex;align-items:center;gap:6px;line-height:1.3}
.r160-preset-desc{font-size:var(--fs-12);color:var(--muted);margin-top:2px;line-height:1.4;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
.r160-preset-meta{display:flex;gap:8px;align-items:center;margin-top:4px;flex-wrap:wrap}
.r160-preset-meta:empty{display:none}
.r160-preset-actions{display:flex;gap:4px;flex-shrink:0}
.r160-meta{font-size:var(--fs-12);color:var(--muted)}
.r160-prio{display:inline-flex;width:18px;height:18px;align-items:center;justify-content:center;border-radius:50%;font-size:var(--fs-12);flex-shrink:0}
.r160-prio-urgent{background:rgba(239,68,68,.15);color:#dc2626}
.r160-prio-high{background:rgba(245,158,11,.15);color:#d97706}
.r160-prio-normal{background:var(--teal-dim);color:var(--teal)}
.r160-prio-low{background:rgba(148,163,184,.15);color:#64748b}

/* Preset-Editor Modal */
.r160-modal-overlay{position:fixed;inset:0;background:rgba(15,23,42,.55);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);z-index:9000;display:flex;align-items:center;justify-content:center;padding:20px;animation:r160-fade-in .18s ease}
@keyframes r160-fade-in{from{opacity:0}to{opacity:1}}
.r160-modal{background:var(--panel);border:1px solid var(--panel-border);border-radius:14px;box-shadow:0 24px 60px rgba(0,0,0,.35);width:100%;max-width:580px;max-height:90vh;display:flex;flex-direction:column;animation:r160-pop-in .22s cubic-bezier(.34,1.56,.64,1)}
@keyframes r160-pop-in{from{opacity:0;transform:translateY(8px) scale(.97)}to{opacity:1;transform:translateY(0) scale(1)}}
.r160-modal-head{display:flex;align-items:center;gap:12px;padding:14px 18px;border-bottom:1px solid var(--panel-border)}
.r160-modal-title{font-size:15px;font-weight:700;color:var(--text);flex:1;display:flex;align-items:center;gap:8px}
.r160-modal-close{background:transparent;border:none;color:var(--muted);font-size:18px;cursor:pointer;padding:4px 10px;border-radius:8px;line-height:1}
.r160-modal-close:hover{background:var(--bg);color:var(--text)}
.r160-modal-body{padding:16px 18px;overflow-y:auto;flex:1}
.r160-modal-foot{display:flex;gap:8px;padding:12px 18px;border-top:1px solid var(--panel-border);justify-content:flex-end}
.r160-lbl{display:block;font-size:var(--fs-12);font-weight:600;color:var(--text-secondary,#475569);margin:8px 0 4px}
.r160-input{width:100%;font-size:12px;padding:7px 10px;border-radius:6px;border:1px solid var(--panel-border);background:var(--bg);color:var(--text);font-family:inherit;box-sizing:border-box}
.r160-input:focus{outline:2px solid var(--teal);outline-offset:-1px;border-color:transparent}
textarea.r160-input{resize:vertical;min-height:60px;line-height:1.45}
.r160-row{display:flex;gap:10px;align-items:flex-end;flex-wrap:wrap;margin-bottom:4px}
.r160-row > div{min-width:0}

/* QMS-Doc Picker im Preset-Editor */
.r160-doc-picker{display:flex;flex-wrap:wrap;gap:6px;margin-top:4px}
.r160-doc-pick{display:inline-flex;align-items:center;gap:6px;padding:6px 10px;background:var(--bg);border:1px solid var(--panel-border);border-radius:6px;font-size:var(--fs-12);cursor:pointer;transition:background .12s ease,border-color .12s ease}
.r160-doc-pick:hover{background:var(--teal-dim);border-color:var(--teal)}
.r160-doc-pick.is-on{background:var(--teal-dim);border-color:var(--teal);color:var(--teal);font-weight:600}
.r160-doc-pick input{margin:0}

/* Verlinkte Docs im Task-Editor */
.r160-doc-chip{display:inline-flex;align-items:center;gap:4px;padding:3px 8px;background:var(--teal-dim);color:var(--teal);border:1px solid var(--teal);border-radius:14px;font-size:var(--fs-12);cursor:pointer;margin:2px 4px 2px 0;transition:transform .12s ease}
.r160-doc-chip:hover{transform:translateY(-1px)}
.r160-doc-chip.is-missing{background:var(--bg);color:var(--muted);border-color:var(--panel-border);cursor:default}

/* QMS-Tab */
.r160-qms-upload{margin:0;padding:24px;border-bottom:1px solid var(--panel-border);background:linear-gradient(180deg, var(--bg) 0%, var(--panel) 100%);transition:background .15s ease,border-color .15s ease;text-align:center}
.r160-qms-upload.is-drag{background:var(--teal-dim);border-color:var(--teal)}
.r160-qms-upload-inner{max-width:380px;margin:0 auto}
.r160-qms-upload-icon{font-size:32px;color:var(--teal);margin-bottom:6px;opacity:.8}
.r160-qms-list{display:flex;flex-direction:column}
.r160-qms-row{display:flex;align-items:center;gap:12px;padding:14px 18px;border-top:1px solid var(--panel-border);transition:background .12s ease}
.r160-qms-row:hover{background:var(--bg)}
.r160-qms-main{flex:1;min-width:0}
.r160-qms-title{font-size:14px;font-weight:600;color:var(--text);line-height:1.3;display:flex;align-items:center;gap:6px}
.r160-qms-desc{font-size:var(--fs-12);color:var(--muted);margin-top:3px;line-height:1.4}
.r160-qms-meta{display:flex;gap:8px;align-items:center;margin-top:4px;flex-wrap:wrap}
.r160-qms-actions{display:flex;gap:6px;flex-shrink:0}

/* QMS-Viewer (Fullscreen) */
.qms-viewer-overlay{position:fixed;inset:0;background:rgba(8,12,24,.92);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);z-index:9500;display:none;align-items:stretch;justify-content:center;padding:24px}
.qms-viewer-overlay.is-open{display:flex;animation:r160-fade-in .2s ease}
.qms-viewer-shell{background:var(--panel);border-radius:14px;box-shadow:0 32px 80px rgba(0,0,0,.5);width:100%;max-width:1100px;display:flex;flex-direction:column;overflow:hidden;border:1px solid rgba(255,255,255,.08)}
.qms-viewer-head{display:flex;align-items:center;gap:12px;padding:14px 20px;border-bottom:1px solid var(--panel-border);background:var(--panel)}
.qms-viewer-title{font-size:15px;font-weight:700;color:var(--text);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.qms-viewer-meta{font-size:var(--fs-12);color:var(--muted);margin-right:12px;white-space:nowrap}
.qms-viewer-close{background:rgba(0,0,0,.25);border:1px solid var(--panel-border);color:var(--text);width:32px;height:32px;border-radius:8px;font-size:14px;cursor:pointer;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:background .12s ease}
.qms-viewer-close:hover{background:rgba(239,68,68,.2);color:#dc2626}
.qms-viewer-body{flex:1;overflow:auto;background:#1a1f2e;min-height:0}
.qms-viewer-iframe{width:100%;height:100%;min-height:600px;border:none;display:block;background:#fff}
.qms-viewer-docx{padding:32px 48px;background:#fff;color:#1a1f2e;max-width:820px;margin:24px auto;font-family:'Segoe UI',Tahoma,sans-serif;line-height:1.55;font-size:13px;border-radius:8px;box-shadow:0 4px 20px rgba(0,0,0,.3)}
.qms-viewer-docx p{margin:0 0 8px}
.qms-viewer-docx h1,.qms-viewer-docx h2,.qms-viewer-docx h3{color:#1a1f2e;font-weight:700;margin:18px 0 10px}
.qms-viewer-docx table{border-collapse:collapse;margin:10px 0;width:100%}
.qms-viewer-docx table td,.qms-viewer-docx table th{border:1px solid #ccc;padding:6px 10px;text-align:left}
.qms-viewer-docx img{max-width:100%;height:auto}
.qms-viewer-loading,.qms-viewer-error{padding:48px 24px;text-align:center;color:#94a3b8;font-size:13px}
.qms-viewer-error{color:#fca5a5}
.qms-viewer-foot{padding:10px 18px;border-top:1px solid var(--panel-border);display:flex;gap:8px;justify-content:flex-end;background:var(--panel)}
.qms-viewer-foot:empty{display:none}

@media (max-width:768px){
  .r160-modal{max-width:none;max-height:100vh;border-radius:0;height:100%}
  .r160-modal-overlay{padding:0;align-items:stretch}
  .qms-viewer-overlay{padding:0}
  .qms-viewer-shell{border-radius:0;max-width:none}
  .qms-viewer-iframe{min-height:0;height:calc(100vh - 100px)}
  .qms-viewer-docx{padding:18px 16px;margin:12px 0}
  .r160-preset-actions{flex-direction:column}
  .r160-qms-row{flex-direction:column;align-items:stretch}
  .r160-qms-actions{justify-content:flex-end}
}
@media (prefers-reduced-motion: reduce){
  .r160-modal-overlay,.r160-modal,.qms-viewer-overlay{animation:none}
}
/* ════════════════ Ende r160 ════════════════ */

/* ════════════════════════════════════════════════════════════════
   r261 — Bug 3 FIX: r161-Ausblendung der KI/Audit-Side-Panels entfernt.
   Der alte r161-Patch versteckte `#tabTasks #tasksAiSidePanel` /
   `#tasksAuditSidePanel` (+ die beiden Header-Buttons) mit
   `display:none !important`. Dadurch wechselte `openTasksAiPanel()`
   zwar korrekt auf den Aufgaben-Tab und `renderKiPanel()` füllte den
   Panel-Body — das Panel blieb aber unsichtbar (0×0). Symptom: „KI-Panel
   leitet nur auf Aufgaben weiter, ohne eigene Funktion."
   Die Panels sind voll implementiert (renderKiPanel / renderTaskAuditPanel)
   → Buttons + Panels wieder freigeben, Funktion wiederhergestellt.
   Die Buttons tragen weiterhin data-requires="scheduler" (für MA via
   `body.role-employee [data-requires="scheduler"]` ausgeblendet).
   ──────────────────────────────────────────────────────────────── */

/* ────────────────────────────────────────────────────────────────
   r171: Wunsch-eintragen Formular — strukturierte Sektionen,
   3-Spalten-Grid für Details, klares Toggle-Pair, volle Lesbarkeit.
   Ersetzt die alte .wish-form (flex-wrap mit gemischten Breiten).
   ──────────────────────────────────────────────────────────────── */
.wish-form-v2{
  display:flex;flex-direction:column;gap:14px;
  padding:16px;
  background:var(--panel);
  border:1px solid var(--panel-border);
  border-radius:var(--radius-lg,12px);
  margin-bottom:14px;
}
.wish-form-v2 .wish-section{
  border:none;
  padding:0;
  margin:0;
  display:flex;
  flex-direction:column;
  gap:8px;
}
.wish-form-v2 .wish-section + .wish-section{
  padding-top:14px;
  border-top:1px dashed var(--panel-border);
}
.wish-form-v2 .wish-section > legend{
  font-size:var(--fs-12);
  font-weight:700;
  text-transform:uppercase;
  letter-spacing:.06em;
  color:var(--muted);
  padding:0;
  margin:0 0 4px 0;
}
.wish-form-v2 .wish-legend-hint{
  font-weight:500;
  text-transform:none;
  letter-spacing:0;
  color:var(--muted);
  margin-left:4px;
}

/* Toggle-Pair für Eigen-/Fremdwunsch */
.wish-form-v2 .wish-toggle-row{
  display:grid;
  grid-template-columns:1fr 1fr;
  gap:8px;
}
.wish-form-v2 .wish-toggle-btn{
  display:flex;
  align-items:center;
  justify-content:center;
  gap:8px;
  padding:12px 14px;
  border-radius:10px;
  border:2px solid var(--panel-border);
  background:var(--bg);
  color:var(--text);
  font-size:13px;
  font-weight:600;
  cursor:pointer;
  transition:transform .12s,border-color .15s,background .15s;
  min-height:48px;
}
.wish-form-v2 .wish-toggle-btn:hover{
  border-color:var(--teal);
  background:var(--teal-dim);
}
.wish-form-v2 .wish-toggle-btn.is-active{
  border-color:var(--teal);
  background:var(--teal-dim);
  color:var(--teal);
  box-shadow:inset 0 0 0 1px var(--teal);
}
.wish-form-v2 .wish-toggle-emoji{
  font-size:18px;
  line-height:1;
}
.wish-form-v2 .wish-toggle-label{
  font-weight:600;
}

/* Kolleg:in-Picker */
.wish-form-v2 .wish-fremd-select{
  width:100%;
  padding:10px 12px;
  font-size:13px;
  border-radius:8px;
  border:1px solid var(--panel-border);
  background:var(--bg);
  color:var(--text);
}

/* Info-Hinweis bei Fremdwunsch */
.wish-form-v2 .wish-info-note{
  font-size:12px;
  line-height:1.5;
  color:var(--text);
  padding:10px 12px;
  background:var(--amber-dim);
  border-left:3px solid var(--amber);
  border-radius:6px;
}

/* 3-Spalten-Grid für Datum / Schichttyp / Priorität */
.wish-form-v2 .wish-grid-3{
  display:grid;
  grid-template-columns:repeat(3,1fr);
  gap:10px;
}
@media(max-width:600px){
  .wish-form-v2 .wish-grid-3{ grid-template-columns:1fr; }
}
.wish-form-v2 .wish-field{
  display:flex;
  flex-direction:column;
  gap:4px;
}
.wish-form-v2 .wish-field > label{
  font-size:var(--fs-12);
  font-weight:600;
  color:var(--text-secondary,var(--muted));
  letter-spacing:.02em;
}
.wish-form-v2 .wish-field > input,
.wish-form-v2 .wish-field > select{
  width:100%;
  padding:10px 12px;
  font-size:13px;
  border-radius:8px;
  border:1px solid var(--panel-border);
  background:var(--bg);
  color:var(--text);
  min-height:40px;
}
.wish-form-v2 .wish-field > input:focus,
.wish-form-v2 .wish-field > select:focus,
.wish-form-v2 .wish-fremd-select:focus,
.wish-form-v2 .wish-note-input:focus{
  outline:none;
  border-color:var(--teal);
  box-shadow:0 0 0 3px var(--teal-dim);
}
.wish-form-v2 .wish-allowance{
  font-size:var(--fs-12);
  color:var(--muted);
  margin-top:2px;
  padding:4px 6px;
  border-radius:4px;
  display:none;
}

/* Notiz (Vollbreite) */
.wish-form-v2 .wish-note-input{
  width:100%;
  padding:10px 12px;
  font-size:13px;
  border-radius:8px;
  border:1px solid var(--panel-border);
  background:var(--bg);
  color:var(--text);
  min-height:40px;
}

/* Conflict-Warnung */
.wish-form-v2 .wish-conflict-warn{
  padding:10px 12px;
  border-radius:8px;
  background:var(--amber-dim);
  border:1px solid var(--amber);
  font-size:12px;
  color:var(--text);
  line-height:1.5;
}
/* Paket M-D (§5, „Konflikt-Hinweis rot/Coral") — Coral ist im Bauplan-Wortlaut bewusst
   zugleich Warnfarbe UND Aktionsfarbe, kein zweiter Namespace. `#wishConflictWarn` lebt
   im Desktop-Formular `#shiftWishForm`, das `renderWishCalendar()` unter Mobile per JS
   `display:none` verdeckt (Desktop-Freeze) — hier trotzdem mit-restyled, damit KEIN toter/
   inkonsistenter Sonderfall entsteht, falls das Formular je wieder sichtbar wird; Desktop
   selbst bleibt unangetastet (dort greift `html.view-mobile` nicht). */
html.view-mobile .wish-form-v2 .wish-conflict-warn{
  background:rgba(255,106,61,.10);
  border-color:var(--heute-coral);
}

/* Submit-Button */
.wish-form-v2 .wish-submit-btn{
  width:100%;
  padding:12px 16px;
  font-size:14px;
  font-weight:700;
  border-radius:10px;
  margin-top:2px;
}

/* Liste eigener Wünsche */
#myWishList.wish-list-box{
  margin:0;
  padding:14px 16px;
  background:var(--panel);
  border:1px solid var(--panel-border);
  border-radius:var(--radius-lg,12px);
  font-size:12px;
}
.wish-list-header{
  font-weight:700;
  margin-bottom:10px;
  font-size:13px;
  color:var(--text);
}
.wish-list-items{
  display:flex;
  flex-direction:column;
  gap:6px;
}

/* ────────────────────────────────────────────────────────────────
   r171: QMS-Upload — größere, prominentere Progress-Bar + bessere
   Drop-Zone + persistente Erfolgs-Bestätigung.
   ──────────────────────────────────────────────────────────────── */
.r160-qms-upload .qms-progress-shell{
  height:14px;
  background:var(--panel-border);
  border-radius:7px;
  overflow:hidden;
  margin:8px 0 4px;
  position:relative;
}
.r160-qms-upload .qms-progress-fill{
  height:100%;
  background:linear-gradient(90deg,var(--teal),var(--blue,var(--teal)));
  transition:width .25s ease-out;
  border-radius:7px;
}
.r160-qms-upload .qms-progress-label{
  font-size:12px;
  font-weight:700;
  color:var(--teal);
  text-align:center;
  margin-top:4px;
}
.qms-upload-success-banner{
  display:flex;
  align-items:center;
  gap:10px;
  padding:12px 14px;
  margin:0 0 12px 0;
  background:linear-gradient(135deg,rgba(16,185,129,.15),rgba(16,185,129,.05));
  border:1px solid var(--green,#10b981);
  border-left:4px solid var(--green,#10b981);
  border-radius:8px;
  font-size:13px;
  color:var(--text);
  animation:qmsSuccessSlide .3s ease-out;
}
.qms-upload-success-banner .qms-banner-icon{
  font-size:22px;
  line-height:1;
}
.qms-upload-success-banner .qms-banner-text{
  flex:1;
  line-height:1.5;
}
.qms-upload-success-banner .qms-banner-text b{
  display:block;
  font-weight:700;
  margin-bottom:2px;
}
.qms-upload-success-banner .qms-banner-close{
  background:none;
  border:none;
  color:var(--muted);
  cursor:pointer;
  font-size:16px;
  padding:4px 8px;
  border-radius:4px;
}
.qms-upload-success-banner .qms-banner-close:hover{
  background:var(--panel-border);
  color:var(--text);
}
@keyframes qmsSuccessSlide{
  from{ opacity:0; transform:translateY(-8px); }
  to{ opacity:1; transform:translateY(0); }
}

/* r174: Error-Banner (rot, mit Schließen-Button) — bei Upload-Fehler persistent */
.qms-upload-error-banner{
  display:flex;
  align-items:center;
  gap:10px;
  padding:12px 14px;
  margin:0 0 12px 0;
  background:linear-gradient(135deg,rgba(220,38,38,.12),rgba(220,38,38,.04));
  border:1px solid var(--red);
  border-left:4px solid var(--red);
  border-radius:8px;
  font-size:13px;
  color:var(--text);
  animation:qmsSuccessSlide .3s ease-out;
}
.qms-upload-error-banner .qms-banner-icon{ font-size:22px; line-height:1; }
.qms-upload-error-banner .qms-banner-text{ flex:1; line-height:1.5; }
.qms-upload-error-banner .qms-banner-text b{ display:block; font-weight:700; margin-bottom:2px; color:var(--red); }
.qms-upload-error-banner .qms-banner-close{
  background:none; border:none; color:var(--muted); cursor:pointer;
  font-size:16px; padding:4px 8px; border-radius:4px;
}
.qms-upload-error-banner .qms-banner-close:hover{ background:var(--panel-border); color:var(--text); }

/* r174: Load-Error-Banner (orange, mit Reload-Button) — wenn Server beim Listen-Laden fehlschlägt */
.qms-load-error-banner{
  display:flex;
  align-items:center;
  gap:10px;
  padding:12px 14px;
  margin:0 0 12px 0;
  background:linear-gradient(135deg,rgba(245,158,11,.12),rgba(245,158,11,.04));
  border:1px solid var(--amber);
  border-left:4px solid var(--amber);
  border-radius:8px;
  font-size:13px;
  color:var(--text);
  animation:qmsSuccessSlide .3s ease-out;
}
.qms-load-error-banner .qms-banner-icon{ font-size:22px; line-height:1; }
.qms-load-error-banner .qms-banner-text{ flex:1; line-height:1.5; }
.qms-load-error-banner .qms-banner-text b{ display:block; font-weight:700; margin-bottom:2px; color:var(--amber); }

/* W3-22: Mobile-Roster — Tages-Karten unter 600px. Ersetzt die dichte Staff×Tage-Matrix durch pro
   Tag eine Karte mit lesbarer Dienst-Liste (Zeiten SICHTBAR statt title-Hover, 44px Touch-Targets,
   Light-Mode-First). Wird vom JS-Render (_renderRosterMobileCards) erzeugt; CSS macht's bedienbar. */
.sq-mobile{ display:flex; flex-direction:column; gap:8px; padding:2px 0; }
.sq-mcard{ border:1px solid var(--panel-border); border-radius:10px; background:var(--panel); overflow:hidden; }
.sq-mcard.is-weekend{ background:var(--bg); }
.sq-mcard.is-holiday{ border-color:var(--teal); }
.sq-mcard-head{ display:flex; align-items:center; gap:8px; padding:8px 12px; background:var(--bg); border-bottom:1px solid var(--panel-border); font-weight:700; font-size:0.8125rem; color:var(--text); }
.sq-mcard-day{ flex:0 0 auto; }
.sq-mcard-hol{ font-size:var(--fs-12); color:var(--teal); font-weight:600; }
.sq-mcard-count{ margin-left:auto; font-size:var(--fs-12); font-weight:600; color:var(--text-secondary); background:var(--panel); border:1px solid var(--panel-border); border-radius:10px; padding:1px 8px; min-width:22px; text-align:center; }
.sq-mcard-empty{ padding:8px 12px; font-size:0.75rem; color:var(--text-secondary); }
.sq-mrow{ display:flex; align-items:center; justify-content:space-between; gap:8px; width:100%; min-height:44px; padding:8px 12px; border:none; border-top:1px solid var(--panel-border); background:transparent; text-align:left; font:inherit; color:var(--text); cursor:pointer; }
.sq-mrow:first-of-type{ border-top:none; }
.sq-mrow:active{ background:var(--teal-dim); }
.sq-mrow:focus-visible{ outline:2px solid var(--teal); outline-offset:-2px; }
.sq-mrow-name{ display:flex; align-items:center; gap:6px; font-size:0.8125rem; font-weight:600; flex:1 1 auto; min-width:0; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.sq-mrow .sq-dot{ display:inline-block; width:8px; height:8px; border-radius:50%; flex:0 0 auto; }
.sq-mrow-shift{ display:flex; align-items:center; gap:6px; flex:0 0 auto; font-size:0.75rem; color:var(--text-secondary); }
.sq-mrow-lbl{ font-weight:700; color:var(--text); }
.sq-mrow-time{ font-variant-numeric:tabular-nums; color:var(--text); }
/* W3-22: Zeit-Override (actual_start_time) — Amber 3.19:1 verfehlte AA. Statt Farbe ein NICHT-Farb-Cue
   (gepunktete Unterstreichung) + voller --text-Kontrast → AA-konform und farbenblind-robust. */
.sq-mrow-time.is-override{ color:var(--text); font-weight:700; text-decoration:underline; text-decoration-style:dotted; text-underline-offset:2px; }
.sq-mrow-spr, .sq-mrow-mtg{ font-size:var(--fs-12); color:var(--text-secondary); white-space:nowrap; }
/* W3-22: Tages-Zustand (Absenz/Ferien/Sperre/krank) als nicht-interaktive Zeile — Parität zur Desktop-Zelle. */
.sq-mrow--status{ cursor:default; }
.sq-mrow--status:active{ background:transparent; }
.sq-mrow-status{ font-size:0.75rem; font-weight:600; color:var(--text-secondary); white-space:nowrap; }
/* Fix: freie (unbelegte) Tage — jetzt antippbar fürs Brushtool (Parität zur leeren Desktop-Zelle), optisch gedämpft */
.sq-mrow--free{ opacity:.55; }
.sq-mrow--free:hover, .sq-mrow--free:focus-visible{ opacity:1; background:var(--teal-dim); }
.sq-mrow--free .sq-mrow-status{ font-weight:400; font-style:italic; }

/* W3-23 (iOS-Zoom-on-Focus): iOS Safari zoomt beim Fokus auf TEXT-Eingabefelder mit font-size < 16px
   hinein (und re-zoomt nicht zurück). Fix: auf Touch-Geräten bzw. schmalen Viewports alle Text-Inputs +
   Textareas auf >=16px zwingen. !important + Datei-Ende → gewinnt die Cascade über die kompakten Desktop-
   Dichte-Grössen (8–14px) UND über die zuvor von der Basis-Regel überschattete Mobile-Regel (der gemeldete
   :395-vs-:2233-Konflikt). <select> löst KEINEN Zoom aus (öffnet nativen Picker) → ausgenommen, damit die
   kompakten Filter-/Topbar-Selects ihre Grösse behalten. Nicht-Text-Inputs (checkbox/radio/range/color/
   button/submit/reset/image/file) ausgenommen. KEIN maximum-scale-Hack → Pinch-Zoom bleibt erlaubt (WCAG 1.4.4). */
@media (pointer: coarse), (max-width: 768px) {
  input:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="color"]):not([type="button"]):not([type="submit"]):not([type="reset"]):not([type="image"]):not([type="file"]),
  textarea {
    font-size: 16px !important;
  }
}

/* W3-24: Styled confirmDialog() — ersetzt das native confirm(). Self-contained Overlay (NICHT .modal-overlay,
   damit das globale Modal-System nicht eingreift). Light-Mode-First, 44px Touch-Targets, dangerous=rot. */
.confirm-overlay{ position:fixed; inset:0; z-index:10060; display:flex; align-items:center; justify-content:center; padding:20px; background:rgba(0,0,0,.55); backdrop-filter:blur(6px); animation:fadeScale .18s ease-out; }
.confirm-box{ background:var(--panel); border:1px solid var(--panel-border); border-radius:16px; padding:22px; width:100%; max-width:400px; box-shadow:0 20px 60px rgba(0,0,0,.35); }
.confirm-box.is-dangerous{ border-top:3px solid var(--red); }
.confirm-title{ font-size:1rem; font-weight:700; color:var(--text); margin-bottom:10px; }
.confirm-body{ font-size:0.875rem; line-height:1.55; color:var(--text-secondary); margin-bottom:20px; white-space:pre-line; }
.confirm-actions{ display:flex; gap:10px; justify-content:flex-end; }
.confirm-actions .btn{ min-height:44px; padding:0 18px; border-radius:10px; font-size:0.875rem; font-weight:600; cursor:pointer; border:1px solid var(--panel-border); }
.confirm-cancel{ background:var(--bg); color:var(--text); }
.confirm-cancel:hover{ background:var(--panel-border); }
.confirm-ok.is-danger{ background:var(--red); color:#fff; border-color:var(--red); }
.confirm-ok.is-danger:hover{ filter:brightness(0.93); }
.confirm-actions .btn:focus-visible{ outline:2px solid var(--teal); outline-offset:2px; }


/* W3-26: Loading-Skeletons (Shimmer) — ersetzen „Laden…"/leere Zustände, bis async-Daten geladen sind.
   Theme-aware (Tokens); respektiert prefers-reduced-motion (statisch statt Shimmer). */
.skeleton-rows{ display:flex; flex-direction:column; gap:8px; padding:10px 8px; }
.skeleton-line{ height:12px; border-radius:6px; background:linear-gradient(90deg,var(--bg) 25%,var(--panel-border) 37%,var(--bg) 63%); background-size:400% 100%; animation:skeletonShimmer 1.4s ease infinite; }
@keyframes skeletonShimmer{ 0%{ background-position:100% 50% } 100%{ background-position:0 50% } }
@media (prefers-reduced-motion: reduce){ .skeleton-line{ animation:none; background:var(--panel-border); opacity:.5; } }

/* W1-04: Peer-Schicht-Tausch UI — theme-aware (Light-Mode via Tokens), 2028-Standard.
   Klare Karten, minimale kognitive Last, 44px-Touch-Targets über .btn-Konvention. */
.swap-section-title{ font-size:var(--fs-12); font-weight:700; color:var(--text-secondary); text-transform:uppercase; letter-spacing:.03em; margin:14px 0 6px; }
.swap-section-title:first-child{ margin-top:0; }
/* Karten-Header rechts: Untertitel + „?"-Hilfe-Button gruppiert (sonst zerreisst card-head:space-between den Untertitel) */
.swap-head-right{ display:flex; align-items:center; gap:8px; }
.swap-card{ border:1px solid var(--panel-border); border-radius:var(--radius-sm,8px); background:var(--panel); padding:10px 12px; margin-bottom:8px; transition:border-color .2s ease, box-shadow .2s ease; }
.swap-card:hover{ border-color:var(--teal); box-shadow:var(--shadow); }
.swap-card-muted{ opacity:.72; }
.swap-card-main{ font-size:12px; color:var(--text); margin-bottom:6px; }
.swap-card-detail{ display:flex; flex-wrap:wrap; align-items:center; gap:6px; font-size:12px; color:var(--text); }
.swap-leg{ background:var(--bg); border:1px solid var(--panel-border); border-radius:6px; padding:3px 8px; }
.swap-leg-mine{ border-color:var(--teal); color:var(--teal); font-weight:600; }
.swap-arrow{ color:var(--muted); font-weight:700; }
.swap-card-reason{ font-size:var(--fs-12); color:var(--text-secondary); font-style:italic; margin-top:6px; }
.swap-card-foot{ display:flex; align-items:center; justify-content:space-between; gap:8px; margin-top:8px; flex-wrap:wrap; }
.swap-card-actions{ display:flex; gap:8px; margin-top:10px; flex-wrap:wrap; }
.swap-card-actions .btn{ flex:1; min-width:120px; min-height:40px; justify-content:center; }
.swap-badge{ font-size:var(--fs-12); font-weight:600; display:inline-flex; align-items:center; gap:4px; }
.swap-badge--wait{ color:var(--amber); }
.swap-badge--review{ color:var(--blue); }
.swap-badge--ok{ color:var(--green); }
.swap-badge--no{ color:var(--red); }
.swap-badge--off{ color:var(--muted); }
@media (max-width:600px){ .swap-card-actions .btn{ flex:1 1 100%; } }

/* W3-24d: promptDialog — gestyltes Eingabe-Modal (ersetzt natives prompt()). Theme-aware Tokens,
   Light-Mode-Default, 44px-Touch-Targets. Eigenständig (kein .modal-*), analog .confirm-*. */
.prompt-overlay{ position:fixed; inset:0; z-index:10060; display:flex; align-items:center; justify-content:center; padding:20px; background:rgba(0,0,0,.55); backdrop-filter:blur(6px); animation:fadeScale .18s ease-out; }
.prompt-box{ background:var(--panel); border:1px solid var(--panel-border); border-radius:16px; padding:22px; width:100%; max-width:420px; box-shadow:0 20px 60px rgba(0,0,0,.35); }
.prompt-title{ font-size:1rem; font-weight:700; color:var(--text); margin-bottom:10px; }
.prompt-body{ font-size:0.875rem; line-height:1.55; color:var(--text-secondary); margin-bottom:14px; white-space:pre-line; }
.prompt-field{ margin-bottom:20px; }
.prompt-input{ width:100%; min-height:44px; padding:10px 12px; border-radius:10px; border:1px solid var(--panel-border); background:var(--bg); color:var(--text); font-size:0.9375rem; font-family:inherit; box-sizing:border-box; }
textarea.prompt-input{ resize:vertical; line-height:1.5; }
.prompt-input:focus{ outline:none; border-color:var(--teal); box-shadow:0 0 0 3px var(--teal-dim); }
.prompt-input--err{ border-color:var(--red); box-shadow:0 0 0 3px var(--red-dim); }
.prompt-actions{ display:flex; gap:10px; justify-content:flex-end; }
.prompt-actions .btn{ min-height:44px; padding:0 18px; border-radius:10px; font-size:0.875rem; font-weight:600; cursor:pointer; border:1px solid var(--panel-border); }
.prompt-cancel{ background:var(--bg); color:var(--text); }
.prompt-cancel:hover{ background:var(--panel-border); }
.prompt-actions .btn:focus-visible{ outline:2px solid var(--teal); outline-offset:2px; }

/* P-2: Mitarbeiter-Liste Such-Toolbar + inkrementelles Rendern. Theme-aware Tokens, Light-Mode,
   44px-Touch-Target, Suchfeld mit führendem Icon. */
.staff-toolbar{ position:relative; margin:0 0 12px; }
.staff-toolbar .staff-search-ico{ position:absolute; left:12px; top:50%; transform:translateY(-50%); display:inline-flex; color:var(--muted); pointer-events:none; }
.staff-toolbar .staff-search-ico svg{ width:18px; height:18px; }
.staff-search{ width:100%; min-height:44px; padding:10px 14px 10px 40px; border-radius:10px; border:1px solid var(--panel-border); background:var(--panel); color:var(--text); font-size:0.9375rem; font-family:inherit; box-sizing:border-box; transition:border-color .15s, box-shadow .15s; }
.staff-search::placeholder{ color:var(--muted); }
.staff-search:focus{ outline:none; border-color:var(--teal); box-shadow:0 0 0 3px var(--teal-dim); }
.staff-more{ grid-column:1/-1; display:flex; flex-direction:column; align-items:center; gap:8px; padding:14px 0 4px; }
.staff-more-count{ font-size:12px; color:var(--text-secondary); }
.staff-more-btn{ min-height:44px; padding:0 20px; }

/* ════════════════ Messaging-Tab Mobile 2-Screen-Nav ════════════════ */
/* Desktop: grid nebeneinander (280px Liste + 1fr Chat) bleibt unverändert.
   Mobile (≤768px): Slide-Navigation — Liste und Chat je fullscreen,
   .conv-open-Klasse (via JS) schaltet zwischen den Screens. */
@media(max-width:768px){
  .messages-layout{display:block;position:relative;overflow:hidden;height:calc(100vh - 140px)}
  .conversation-list,.chat-view{position:absolute;inset:0;transition:transform .28s cubic-bezier(.4,0,.2,1);border-radius:var(--radius)}
  .conversation-list{z-index:2;transform:translateX(0)}
  .chat-view{z-index:1;transform:translateX(100%)}
  .messages-layout.conv-open .conversation-list{transform:translateX(-100%)}
  .messages-layout.conv-open .chat-view{transform:translateX(0)}
  .chat-back-btn{display:inline-flex;align-items:center;gap:4px;background:none;border:none;color:var(--teal);cursor:pointer;font-size:12px;font-weight:600;padding:0 6px 0 0;margin-right:2px;vertical-align:middle}
}
/* FN-64 Fund 5 (2026-07-13): dvh-Fallback analog zu #alarmSidebar/#liveBrowserSidebar
   oben (Z.999) — 100vh zählt auf iOS-Safari die kollabierende URL-Leiste mit, wodurch
   das Chat-Eingabefeld am unteren Rand verdeckt werden kann. */
@supports (height: 100dvh){
  @media(max-width:768px){
    .messages-layout{height:calc(100dvh - 140px)}
  }
}
@media(min-width:769px){
  .chat-back-btn{display:none}
}

/* ════════════════════════════════════════════════════════════
   QW-4 — Publish Celebration Confetti (r294)
   ════════════════════════════════════════════════════════════ */
@keyframes _rosieConfettiFall {
  0%   { transform: translateY(-8px) rotate(0deg) scale(1);   opacity: 1; }
  65%  { opacity: 0.9; }
  100% { transform: translateY(220px) rotate(580deg) scale(0.3); opacity: 0; }
}
.rosie-confetti-stage {
  position: fixed; top: 56px; left: 50%; transform: translateX(-50%);
  z-index: 99998; pointer-events: none; width: 0; height: 0; overflow: visible;
}
.rosie-confetti-p {
  position: absolute;
  animation: _rosieConfettiFall var(--dur,1.2s) var(--delay,0s) ease-in forwards;
}

/* ════════════════════════════════════════════════════════════
   QW-2 — Minimum Font-Size 13px (r294)
   Hebt alle strukturellen UI-Elemente auf mindestens 10–12px.
   Intentionell AUSGENOMMEN: .sq-* (Grid-Dichte), .ls-* (Ticker),
   Merkle-Hashes (.sc-merkle), Badge-Zähler (<14px Kreise).
   ════════════════════════════════════════════════════════════ */

/* --- Buttons & Interaktive Elemente --- */
.btn-small{font-size:var(--fs-12)}
.sick-self-btn{font-size:var(--fs-12)}
.admin-quick-btn{font-size:var(--fs-12)}
.admin-quick-btn .name{font-size:var(--fs-12)}
.bounty-item .bounty-action{font-size:var(--fs-12)}
.help-chip{font-size:var(--fs-12)}
.voice-actions .tag{font-size:var(--fs-12)}

/* --- KPI & Dashboard --- */
.kpi-item .kpi-label{font-size:var(--fs-12)}
.kpi-item .kpi-sub{font-size:var(--fs-12)}
.card-title{font-size:var(--fs-12)}

/* --- Status-Badges & Tags --- */
.vc-status{font-size:var(--fs-12)}
.sc-status,.sc-category{font-size:var(--fs-12)}
.job-item .job-status{font-size:var(--fs-12)}
.job-item .job-actions button{font-size:var(--fs-12)}
.qms-status-badge{font-size:var(--fs-12)}
.wish-badge{font-size:var(--fs-12)}
.priority-badge{font-size:var(--fs-12)}
.scheduler-badge{font-size:var(--fs-12)}
.points-badge{font-size:var(--fs-12)}
.staff-role-badge{font-size:var(--fs-12)}
.team-badge{font-size:var(--fs-12)}

/* --- Mitarbeiter-Karten --- */
.staff-card .staff-meta span{font-size:var(--fs-12)}
.staff-card .staff-actions button{font-size:var(--fs-12)}
.staff-card .staff-role{font-size:var(--fs-12)}
.staff-card .staff-name-block .vorname{font-size:var(--fs-12)}
.staff-card .staff-pct{font-size:var(--fs-12)}
.staff-card .staff-details{font-size:var(--fs-12)}
.staff-card .staff-details .detail-section-title{font-size:var(--fs-12)}
.staff-single-role{font-size:var(--fs-12)}
.role-desc-secondary{font-size:var(--fs-12)}
.staff-role-primary{font-size:var(--fs-12)}
.audit-role-change{font-size:var(--fs-12)}

/* --- Formulare & Labels --- */
.form-group label{font-size:var(--fs-12)}
.preset-assign-row{font-size:var(--fs-12)}
.preset-assign-row select{font-size:var(--fs-12)}
.preset-item .meta{font-size:var(--fs-12)}

/* --- Benachrichtigungen & Alerts --- */
.alert-item{font-size:var(--fs-12)}
.alert-item .ameta{font-size:var(--fs-12)}
.bd-item{font-size:var(--fs-12)}
.bd-item .bd-reason{font-size:var(--fs-12)}
.bd-item .bd-meta{font-size:var(--fs-12)}

/* --- Hilfe-Panel --- */
.help-bullets-title{font-size:var(--fs-12)}
.help-bullet{font-size:var(--fs-12)}
.help-faq-title{font-size:var(--fs-12)}
.help-faq-a{font-size:var(--fs-12)}
.help-faq-q{font-size:var(--fs-12)}

/* --- OCR & Voice --- */
.ocr-result{font-size:var(--fs-12)}
.ocr-med-card .label{font-size:var(--fs-12)}
.ocr-badge{font-size:var(--fs-12)}
.voice-transcript{font-size:var(--fs-12)}

/* --- Login & Onboarding --- */
.login-sub{font-size:var(--fs-12)}
.login-mode-btn{font-size:var(--fs-12)}
.free-info-box{font-size:var(--fs-12)}

/* --- Team & Struktur-Karten --- */
.team-card .tc-desc{font-size:var(--fs-12)}
.team-card .tc-members{font-size:var(--fs-12)}
.team-card .tc-actions button{font-size:var(--fs-12)}

/* --- Suggestion / Ideas --- */
.suggestion-card .sc-desc{font-size:var(--fs-12)}
.suggestion-card .sc-meta{font-size:var(--fs-12)}
.suggestion-card .sc-admin-notes textarea{font-size:var(--fs-12)}

/* --- Vacation-Karten --- */
.vacation-card .vc-dates{font-size:var(--fs-12)}
.vacation-card .vc-notes{font-size:var(--fs-12)}
.vacation-card .vc-admin-notes{font-size:var(--fs-12)}

/* --- QMS --- */
.qms-doc-item .qms-info .qms-meta{font-size:var(--fs-12)}
.qms-doc-item .qms-actions button{font-size:var(--fs-12)}
.qms-access-item{font-size:var(--fs-12)}

/* --- Chat & Nachrichten --- */
.chat-msg{font-size:12px}
.conv-item .conv-info .conv-preview{font-size:var(--fs-12)}

/* --- Mobile Topbar: minimal von 8px auf 9px --- */
@media(max-width:600px){
  .topbar-center .tab-btn{font-size:var(--fs-12)}
  .card-head .btn-small{font-size:var(--fs-12)}
}
@media(max-width:768px){
  .topbar-center .tab-btn{font-size:var(--fs-12)}
}
.staff-empty{ grid-column:1/-1; text-align:center; padding:24px; color:var(--muted); font-size:12px; }

/* ════════════════════════════════════════════════════════════
   QW-7 — ROSIE Betriebsradar (r294)
   ════════════════════════════════════════════════════════════ */
.br-ampel{display:flex;align-items:center;gap:10px;border:1px solid var(--teal);border-radius:8px;padding:8px 12px;margin-bottom:10px;background:var(--teal-dim)}
.br-ampel-text{display:flex;flex-direction:column;gap:1px;font-size:var(--fs-12);color:var(--text)}
.br-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px}
@media(max-width:600px){.br-grid{grid-template-columns:1fr}}
.br-section{background:var(--panel);border:1px solid var(--panel-border);border-radius:8px;padding:8px 10px}
.br-section-title{font-size:var(--fs-12);font-weight:700;color:var(--text);margin-bottom:6px;display:flex;align-items:center;gap:4px}.br-badge--warn{background:#fef3c7;color:#d97706}
.br-row{display:flex;align-items:center;gap:5px;padding:3px 0;border-bottom:1px solid var(--panel-border);font-size:var(--fs-12);min-height:24px}
.br-row:last-child{border-bottom:none}
.br-icon{font-size:var(--fs-12);flex-shrink:0;width:14px;text-align:center}
.br-name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text)}.br-empty{font-size:var(--fs-12);color:var(--muted);padding:4px 0;font-style:italic}

/* ════════════════════════════════════════════════════════════
   P-6 — Daily Briefing Overlay
   ════════════════════════════════════════════════════════════ */
@keyframes p6In  { from{opacity:0;transform:scale(.9) translateY(16px)} to{opacity:1;transform:scale(1) translateY(0)} }
@keyframes p6Out { from{opacity:1;transform:scale(1)}                   to{opacity:0;transform:scale(.93)} }
.p6-stat     { padding:10px 8px; border-radius:10px; text-align:center; }
.p6-stat-val { font-size:22px; font-weight:800; line-height:1.1; }.p6-good     { background:var(--teal-dim);  border:1px solid var(--teal);  }
.p6-good  .p6-stat-val { color:var(--teal);  }
.p6-warn     { background:var(--amber-dim); border:1px solid var(--amber); }
.p6-warn  .p6-stat-val { color:var(--amber); }
.p6-bad      { background:var(--red-dim);   border:1px solid var(--red);   }
.p6-bad   .p6-stat-val { color:var(--red);   }
.p6-neutral  { background:var(--bg);        border:1px solid var(--panel-border); }
.p6-neutral .p6-stat-val { color:var(--text); }

/* ════════════════════════════════════════════════════════════
   P-7 — Legal Engine Badge + Grid Annotation
   ════════════════════════════════════════════════════════════ */
#p7LegalBadge { display:none; align-items:center; gap:3px; padding:3px 8px; border-radius:8px;
  font-size:var(--fs-12); font-weight:700; background:var(--teal-dim);
  border:1px solid rgba(20,184,166,.35); color:var(--teal);
  cursor:default; margin-right:4px; white-space:nowrap; }
/* ════════════════════════════════════════════════════════════
   P-4 — KI Explain Decision Panel
   ════════════════════════════════════════════════════════════ */
.p4-shift-label { font-size:14px; font-weight:800; color:var(--text); margin-bottom:10px; }
.p4-info-grid   { display:flex; flex-direction:column; gap:5px; margin-bottom:10px; }
.p4-row         { display:flex; align-items:baseline; gap:6px; font-size:var(--fs-12);
                  padding:5px 8px; border-radius:6px;
                  background:var(--bg); border:1px solid var(--panel-border); }.p4-val         { color:var(--text); flex:1; font-size:var(--fs-12); }
.p4-ok          { background:var(--teal-dim);  border-color:rgba(20,184,166,.25); }
.p4-ok  .p4-val { color:var(--teal);  font-weight:600; }
.p4-warn        { background:var(--amber-dim); border-color:rgba(245,158,11,.25); }
.p4-warn .p4-val{ color:var(--amber); font-weight:600; }
.p4-err         { background:var(--red-dim);   border-color:rgba(239,68,68,.25); }
.p4-err  .p4-val{ color:var(--red);   font-weight:600; }.p4-badge-ki    { background:var(--teal-dim); color:var(--teal);
                  border:1px solid rgba(20,184,166,.3); }
.p4-badge-manual{ background:var(--bg); color:var(--muted);
                  border:1px solid var(--panel-border); }#p10FlowBadge:hover { background:rgba(20,184,166,.25); }#p10Count { font-size:var(--fs-12); font-weight:800; }

#p10Panel { position:fixed; z-index:9998; width:300px;
  background:var(--panel); border:1px solid var(--panel-border);
  border-radius:14px; box-shadow:0 8px 32px rgba(0,0,0,.4);
  animation:p10In .18s ease-out; overflow:hidden; }
@keyframes p10In { from{opacity:0;transform:translateY(-8px)} to{opacity:1;transform:translateY(0)} }

.p10-panel-head { display:flex; align-items:center; gap:8px; padding:12px 14px 10px;
  font-size:var(--fs-12); font-weight:700; border-bottom:1px solid var(--panel-border); }
.p10-panel-head>span:first-child { flex:1; }
.p10-close { background:transparent; border:none; color:var(--muted); cursor:pointer;
  font-size:14px; padding:0 2px; line-height:1; border-radius:4px; transition:color .15s; }
.p10-close:hover { color:var(--text); }

.p10-progress-bar  { height:3px; background:var(--bg); }
.p10-progress-fill { height:100%; border-radius:0 3px 3px 0;
  background:linear-gradient(90deg,var(--teal),var(--blue));
  transition:width .4s ease-out; }

.p10-steps  { padding:8px; display:flex; flex-direction:column; gap:4px; }
.p10-step   { display:flex; align-items:center; gap:8px; padding:7px 10px;
  border-radius:8px; border:1px solid var(--panel-border); background:var(--bg); }
.p10-step.p10-done    { background:var(--teal-dim); border-color:rgba(20,184,166,.2); opacity:.75; }.p10-step.p10-done .p10-num { background:var(--teal); color:#fff; }
.p10-step-label { flex:1; font-size:var(--fs-12); color:var(--text-secondary); }
.p10-step.p10-done .p10-step-label { color:var(--teal); font-weight:600; }/* ─── A-2: Profilvollständigkeits-Score ───────────────────────────────────── */
.a2-score-wrap    { display:flex; align-items:center; gap:6px; padding:5px 10px 4px; border-top:1px solid var(--panel-border); }
.a2-score-bar     { flex:1; height:4px; border-radius:2px; background:var(--panel-border); overflow:hidden; }
.a2-score-fill    { height:100%; border-radius:2px; transition:width .4s ease-out; }.a2-complete .a2-score-fill { background:var(--teal); }
.a2-complete .a2-score-lbl  { color:var(--teal); }
.a2-partial  .a2-score-fill { background:var(--blue); }
.a2-partial  .a2-score-lbl  { color:var(--blue); }
.a2-low      .a2-score-fill { background:var(--amber); }
.a2-low      .a2-score-lbl  { color:var(--amber); }

/* ─── QW-5: Command Palette ───────────────────────────────────────────────── */
#qw5Backdrop  { position:fixed; inset:0; z-index:11000; background:rgba(0,0,0,.5); backdrop-filter:blur(4px); display:flex; align-items:flex-start; justify-content:center; padding-top:15vh; animation:qw5In .12s ease-out; }
@keyframes qw5In { from{opacity:0;transform:translateY(-6px)} to{opacity:1;transform:translateY(0)} }
#qw5Panel     { width:560px; max-width:calc(100vw - 32px); background:var(--panel); border:1px solid var(--panel-border); border-radius:14px; box-shadow:0 24px 64px rgba(0,0,0,.5); overflow:hidden; }
#qw5InputWrap { display:flex; align-items:center; gap:10px; padding:14px 16px; border-bottom:1px solid var(--panel-border); }
.qw5-search-icon { color:var(--muted); flex-shrink:0; display:flex; }
#qw5Input     { flex:1; background:none; border:none; outline:none; font-size:15px; color:var(--text); font-family:inherit; }
#qw5Input::placeholder { color:var(--muted); }#qw5List      { max-height:340px; overflow-y:auto; padding:6px; }
.qw5-empty    { padding:16px; text-align:center; font-size:12px; color:var(--muted); }
.qw5-row      { display:flex; align-items:center; justify-content:space-between; gap:10px; padding:9px 12px; border-radius:8px; cursor:pointer; transition:background .07s; }
.qw5-row.qw5-active { background:var(--teal-dim); }
.qw5-label    { font-size:13px; color:var(--text); font-weight:500; }
.qw5-hint     { font-size:var(--fs-12); color:var(--muted); white-space:nowrap; }

/* ─── P-1: Care Command Center ────────────────────────────────────────────── */
#p1Widget.p1-widget   { margin-bottom:10px; }
.p1-head  { display:flex; align-items:center; gap:8px; padding:10px 14px; border-bottom:1px solid var(--panel-border); }
.p1-ampel { font-size:16px; flex-shrink:0; transition:color .4s; }
.p1-title { flex:1; font-size:var(--fs-12); font-weight:700; color:var(--text); letter-spacing:.5px; text-transform:uppercase; }
.p1-clock { font-size:var(--fs-12); color:var(--muted); font-variant-numeric:tabular-nums; }
.p1-rows  { padding:4px 8px 6px; display:flex; flex-direction:column; gap:1px; }
.p1-empty { padding:10px 14px; font-size:var(--fs-12); color:var(--muted); }
.p1-row   { display:flex; align-items:center; gap:8px; padding:6px 8px; border-radius:7px; }
.p1-row:hover { background:var(--bg); }
.p1-row-dot  { font-size:var(--fs-12); flex-shrink:0; width:14px; text-align:center; }
.p1-row-lbl  { flex:1; font-size:var(--fs-12); color:var(--text-secondary); }
.p1-row-lbl strong { color:var(--text); font-weight:600; }.p1-green { color:var(--teal); }
.p1-amber { color:var(--amber); }
.p1-red   { color:var(--red); }
.p1-muted { color:var(--muted); }
.p1-badge-green { background:var(--teal-dim);  color:var(--teal);  }
.p1-badge-amber { background:var(--amber-dim); color:var(--amber); }
.p1-badge-red   { background:var(--red-dim);   color:var(--red);   }

/* ── QW-1: Staff Add Wizard ── */
.staff-wiz-progress{display:flex;align-items:center;justify-content:center;gap:0;margin-bottom:6px}
.staff-wiz-dot{width:28px;height:28px;border-radius:50%;background:var(--panel-border);color:var(--muted);font-size:12px;font-weight:700;display:flex;align-items:center;justify-content:center;transition:background .2s,box-shadow .2s;flex-shrink:0}
.staff-wiz-dot.active{background:var(--teal);color:#fff;box-shadow:0 0 0 3px var(--teal-dim)}
.staff-wiz-dot.done{background:var(--green,#10b981);color:#fff}
.staff-wiz-line{flex:1;height:2px;background:var(--panel-border);max-width:48px;transition:background .2s}
.staff-wiz-line.done{background:var(--green,#10b981)}
.staff-wiz-title{text-align:center;font-size:14px;font-weight:700;color:var(--text)}
.staff-wiz-subtitle{text-align:center;font-size:var(--fs-12);color:var(--muted);margin-top:2px;margin-bottom:12px}
#staffWizNav .btn{min-height:44px}

/* ══════════════════════════════════════════════════════════════════════════
 * LANDING PAGE v2 (.lp2-*) — App-Shell-Landing (auth/landing.js, 2026-07-07)
 * Eigenes, theme-UNABHÄNGIGES Design-System (Produktseite): warme helle
 * Flächen + dunkles Compliance-Band, grosse Typo, Glass-Nav, animiertes
 * Dienstplan-Mockup. Liegt UNTER dem Login-Overlay (99990 < 100000).
 * ══════════════════════════════════════════════════════════════════════════ */
.lp2{position:fixed;inset:0;z-index:99990;overflow-y:auto;overflow-x:hidden;background:#fafaf8;color:#1d1d1f;font-family:var(--font-sans);-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;line-height:1.5}
.lp2 *{box-sizing:border-box}

/* ── Glass-Nav ── */
.lp2-nav{position:sticky;top:0;z-index:10;display:flex;align-items:center;justify-content:space-between;height:58px;padding:0 clamp(16px,4vw,40px);background:rgba(250,250,248,.72);backdrop-filter:blur(20px) saturate(1.8);-webkit-backdrop-filter:blur(20px) saturate(1.8);border-bottom:1px solid rgba(0,0,0,.06)}
.lp2-nav-logo{height:26px;width:auto;display:block}
.lp2-nav-links{display:flex;align-items:center;gap:22px}
/* FN-56: Menü-Container (Desktop: inline; <640px: Burger-Dropdown, s. Mobile-Block unten) */
.lp2-nav-menu{display:flex;align-items:center;gap:22px}
.lp2-nav-burger{display:none;background:none;border:0;cursor:pointer;padding:10px;margin:-6px -8px -6px -4px;color:#1d1d1f;line-height:0}
.lp2-nav-burger svg{width:22px;height:22px}
.lp2-nav-link{background:none;border:0;padding:6px 2px;font:inherit;font-size:13px;font-weight:500;color:#3c3c43;cursor:pointer;transition:color .15s}
.lp2-nav-link:hover{color:#0d9488}

/* ── Sprachauswahl (2026-07-11) — bewusst EIGENE Klasse, NICHT .lp2-nav-link: die ist per
   @media(max-width:640px) auf mobile ausgeblendet, die Sprachauswahl soll dort sichtbar
   bleiben (s. app-shell/auth/langSwitch.js-Kopfkommentar). ── */
.lp2-lang-switch{display:flex;align-items:center;gap:2px;background:rgba(0,0,0,.04);border-radius:999px;padding:3px}
/* FN-65(c) (AU-9.2 F-5, 2026-07-13): unsichtbare Hit-Area via ::before statt
   sichtbarer Grössenänderung (Design bleibt wie es ist) — hebt die vertikale
   Tap-Fläche deutlich an. Horizontal bewusst nur 1px (statt symmetrisch grösser):
   die 4 Sprach-Buttons sitzen mit nur 2px gap nebeneinander (.lp2-lang-switch)
   — eine grössere horizontale Hit-Area würde sich mit dem Nachbar-Button
   überlappen und Fehl-Taps auf die falsche Sprache provozieren. */
.lp2-lang-btn{position:relative;background:none;border:0;padding:4px 9px;font:inherit;font-size:var(--fs-12);font-weight:700;letter-spacing:.02em;color:#6e6e73;cursor:pointer;border-radius:999px;transition:color .15s,background .15s}
.lp2-lang-btn::before{content:'';position:absolute;inset:-11px -1px}
.lp2-lang-btn:hover{color:#1d1d1f}
.lp2-lang-btn--active{background:#fff;color:#0d9488;box-shadow:0 1px 2px rgba(16,24,40,.08)}

/* ── Buttons ── */
.lp2-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;border:0;cursor:pointer;font-family:inherit;font-weight:600;border-radius:999px;transition:transform .18s cubic-bezier(.34,1.4,.64,1),box-shadow .18s,background .18s;text-decoration:none}
.lp2-btn--nav{background:#1d1d1f;color:#fff;font-size:13px;padding:8px 18px}
.lp2-btn--nav:hover{background:#0d9488}
.lp2-btn--primary{background:linear-gradient(135deg,#0d9488,#0f766e);color:#fff;font-size:16px;padding:14px 32px;box-shadow:0 10px 30px rgba(13,148,136,.35)}
.lp2-btn--primary:hover{transform:translateY(-2px);box-shadow:0 16px 40px rgba(13,148,136,.45)}
.lp2-btn--xl{font-size:18px;padding:17px 44px}
.lp2-btn--ghost{background:none;color:#0d9488;font-size:16px;padding:14px 18px}
.lp2-btn--ghost:hover{transform:translateX(2px)}

/* ── Typo ── */
.lp2-eyebrow{font-size:13px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:#0d9488;margin:0 0 18px}
.lp2-eyebrow--light{color:#2dd4bf}
.lp2-h1{font-size:clamp(42px,7.4vw,84px);font-weight:800;letter-spacing:-.035em;line-height:1.02;margin:0 0 24px}
.lp2-h1-grad{background:linear-gradient(92deg,#0d9488 10%,#7c3aed 90%);-webkit-background-clip:text;background-clip:text;color:transparent}
.lp2-h2{font-size:clamp(30px,4.6vw,52px);font-weight:800;letter-spacing:-.025em;line-height:1.08;margin:0;text-align:center}
.lp2-h2--light{color:#f5f5f7}
.lp2-h2-muted{color:#86868b}
.lp2-lead{font-size:clamp(17px,2.1vw,21px);color:#6e6e73;max-width:640px;margin:0 auto;font-weight:400}
.lp2-lead--light{color:#a1a1a6;margin-top:22px}

/* ── Hero ── */
.lp2-hero{max-width:1020px;margin:0 auto;padding:clamp(56px,9vh,110px) 24px 56px;text-align:center}
.lp2-hero-cta{display:flex;align-items:center;justify-content:center;gap:14px;margin:34px 0 0;flex-wrap:wrap}

/* ── Produkt-Screenshots (2026-07-11, R-58-Folge): echte App-Shell-Screenshots
 * (public/app-shell/marketing/*.jpg, erzeugt via scripts/capture-landing-screenshots.mjs
 * — kein CSS-Mockup mehr) in einem Browser-Fenster-Rahmen, Auto-Slide zwischen 3 Aufnahmen
 * (Dienstplan hell/dunkel, Aufgaben). Fenster-Chrome-Klassen (.lp2-frame-*) bewusst generisch
 * benannt (kein "-mock-" mehr — die Screenshots sind real, keine Attrappe). ── */
.lp2-shots{max-width:960px;margin:64px auto 0;text-align:left}
.lp2-shots-frame{background:#fff;border:1px solid rgba(0,0,0,.07);border-radius:20px;box-shadow:0 34px 90px rgba(16,24,40,.14);overflow:hidden}
.lp2-frame-titlebar{display:flex;align-items:center;gap:7px;padding:12px 16px;border-bottom:1px solid rgba(0,0,0,.06);background:#fbfbfa}
.lp2-frame-dot{width:10px;height:10px;border-radius:50%;background:#e4e4e2}
.lp2-frame-dot:nth-child(1){background:#ff5f57}.lp2-frame-dot:nth-child(2){background:#febc2e}.lp2-frame-dot:nth-child(3){background:#28c840}
.lp2-frame-title{margin-left:10px;font-size:12px;font-weight:700;color:#3c3c43}
.lp2-shots-viewport{position:relative;aspect-ratio:16/10;background:#f4f4f2}
.lp2-shots-img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:top center;opacity:0;transition:opacity .7s ease}
.lp2-shots-img.is-active{opacity:1}
.lp2-shots-dots{display:flex;justify-content:center;gap:8px;margin:18px 0 0}
/* FN-65(c) (AU-9.2 F-5, 2026-07-13): unsichtbare Hit-Area via ::before hebt die
   Tap-Fläche an, ohne die 8px-Dot-Optik zu ändern. -6px statt der vollen 24px-
   Zielgrösse, weil die Dots nur 8px gap haben — grössere Insets würden sich mit
   den Hit-Areas der Nachbar-Dots überlappen (Fehl-Taps auf den falschen Slide). */
.lp2-shots-dot{position:relative;width:8px;height:8px;border-radius:50%;background:rgba(0,0,0,.14);border:0;padding:0;cursor:pointer;transition:width .25s,background .25s}
.lp2-shots-dot::before{content:'';position:absolute;inset:-6px}
.lp2-shots-dot.is-active{background:#0d9488;width:22px;border-radius:5px}
.lp2-shots-caption{font-size:13px;color:#86868b;margin:14px auto 0;max-width:560px;text-align:center;min-height:1.6em}
.lp2-shots-cap{display:none}
.lp2-shots-cap.is-active{display:inline}

/* ── Werbevideo-CTA + Lightbox (2026-07-11) ── */
.lp2-video-cta{display:inline-flex;align-items:center;gap:8px;margin:22px auto 0;padding:10px 20px;border-radius:999px;border:1px solid rgba(0,0,0,.1);background:#fff;color:#1d1d1f;font-size:14px;font-weight:600;cursor:pointer;transition:transform .2s,box-shadow .2s}
.lp2-video-cta:hover{transform:translateY(-2px);box-shadow:0 8px 24px rgba(16,24,40,.10)}
.lp2-video-cta-icon{display:inline-flex;width:20px;height:20px;border-radius:50%;background:#0d9488;color:#fff;align-items:center;justify-content:center}
.lp2-video-cta-icon .ric{width:11px;height:11px}
.lp2-video-player{max-width:90vw;max-height:85vh;width:auto;height:auto;border-radius:12px;box-shadow:0 20px 70px rgba(0,0,0,.5);background:#000}

/* ── Sektionen / Feature-Grid ── */
.lp2-section{padding:clamp(72px,10vh,120px) 24px;max-width:1120px;margin:0 auto}
.lp2-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:20px;max-width:1080px;margin:52px auto 0}
.lp2-grid--3{grid-template-columns:repeat(auto-fit,minmax(260px,1fr))}
.lp2-card{background:#fff;border:1px solid rgba(0,0,0,.06);border-radius:18px;padding:30px 28px;box-shadow:0 4px 24px rgba(16,24,40,.05);transition:transform .25s cubic-bezier(.34,1.3,.64,1),box-shadow .25s}
.lp2-card:hover{transform:translateY(-5px);box-shadow:0 18px 44px rgba(16,24,40,.10)}
.lp2-card h3{font-size:18px;font-weight:750;letter-spacing:-.01em;margin:16px 0 8px}
.lp2-card p{font-size:14.5px;color:#6e6e73;margin:0;line-height:1.55}
.lp2-card-icon{width:44px;height:44px;border-radius:12px;display:inline-flex;align-items:center;justify-content:center}
.lp2-card-icon .ric{width:23px;height:23px}
.lp2-tone-violet{background:rgba(124,58,237,.1);color:#7c3aed}
.lp2-tone-indigo{background:rgba(79,70,229,.1);color:#4f46e5}
.lp2-tone-teal{background:rgba(13,148,136,.1);color:#0d9488}
.lp2-tone-blue{background:rgba(37,99,235,.1);color:#2563eb}
.lp2-tone-green{background:rgba(22,163,74,.1);color:#16a34a}
.lp2-tone-orange{background:rgba(234,88,12,.1);color:#ea580c}
.lp2-tone-slate{background:rgba(100,116,139,.12);color:#475569}
.lp2-tone-pink{background:rgba(219,39,119,.1);color:#db2777}

/* ── Dunkles Compliance-Band ── */
.lp2-dark{background:#101014;color:#f5f5f7;padding:clamp(80px,12vh,130px) 24px;text-align:center}
.lp2-stats{display:flex;flex-wrap:wrap;justify-content:center;gap:clamp(32px,6vw,72px);margin-top:64px}
.lp2-stat{display:flex;flex-direction:column;gap:8px;min-width:150px}
.lp2-stat-v{font-size:clamp(34px,4.6vw,54px);font-weight:800;letter-spacing:-.03em;background:linear-gradient(92deg,#2dd4bf,#a78bfa);-webkit-background-clip:text;background-clip:text;color:transparent;font-variant-numeric:tabular-nums}
.lp2-stat-l{font-size:13px;color:#86868b;max-width:190px;margin:0 auto}

/* ── Story / CTA / Footer ── */
.lp2-story{max-width:600px;margin:72px auto 0;text-align:center;font-size:16px;color:#6e6e73;padding-top:40px;border-top:1px solid rgba(0,0,0,.08)}
.lp2-cta-band{padding:clamp(80px,12vh,130px) 24px;text-align:center;background:linear-gradient(180deg,#fafaf8,#f0faf8)}
.lp2-cta-band .lp2-btn{margin-top:34px}
.lp2-footer{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:26px clamp(16px,4vw,40px) calc(26px + env(safe-area-inset-bottom));border-top:1px solid rgba(0,0,0,.07);font-size:12px;color:#86868b;flex-wrap:wrap}
.lp2-footer-link{background:none;border:0;padding:0;font:inherit;color:#0d9488;font-weight:600;cursor:pointer}

/* ── Responsive / Motion ── */
/* FN-65(a) (AU-9.2 F-3, 2026-07-13): der Burger-Mechanismus (FN-56) griff nur unter
   640px — im Band 641-760px (Tablet-Portrait/schmale Laptops/Split-Screen) blieb die
   volle Desktop-Nav (Logo+Links+Sprache+Anmelden, kein flex-wrap) stehen und lief bei
   .lp2{overflow-x:hidden} rechts aus dem sichtbaren Bereich (Anmelden abgeschnitten).
   Fix: derselbe, bereits getestete Burger-Mechanismus greift jetzt ab 820px — eigener
   Media-Query-Block, damit die UNVERÄNDERTE 640px-Grenze für Hero-CTA-Stacking/
   Sprachauswahl-Kompaktierung unten nicht mitverschoben wird. */
@media (max-width:820px){
  .lp2-nav-burger{display:inline-flex;align-items:center;justify-content:center;min-width:44px;min-height:44px}
  .lp2-nav-menu{display:none}
  .lp2-nav-menu.is-open{display:flex;flex-direction:column;align-items:stretch;gap:0;position:absolute;top:58px;left:0;right:0;background:rgba(250,250,248,.97);backdrop-filter:blur(20px) saturate(1.8);-webkit-backdrop-filter:blur(20px) saturate(1.8);border-bottom:1px solid rgba(0,0,0,.08);padding:6px 12px 10px;box-shadow:0 12px 30px rgba(0,0,0,.08)}
  .lp2-nav-menu.is-open .lp2-nav-link{display:block;text-align:left;font-size:15px;padding:12px 8px;min-height:44px}
  .lp2-nav-back{display:inline-block}
}
@media (max-width:640px){
  .lp2-hero-cta{flex-direction:column}
  /* Sprachauswahl bleibt auf mobile sichtbar (anders als .lp2-nav-link oben) — kompakter, damit
     sie neben dem primären Nav-CTA-Button auf schmalen Viewports nicht umbricht/überläuft. */
  .lp2-nav-links{gap:8px}
  .lp2-lang-switch{padding:2px}
  .lp2-lang-btn{padding:3px 6px;font-size:var(--fs-12)}
  /* FN-65(b) (AU-9.2 F-4, 2026-07-13): Rechner-/Lead-Inputs waren 14px — unter
     iOS-Safaris 16px-Zoomschwelle, jeder Fokus liess die Seite hineinzoomen. */
  .rechner-field input[type=number]{font-size:16px}
  .rechner-lead-row input[type=email]{font-size:16px}
}
@media (prefers-reduced-motion:reduce){
  .lp2-shots-img{transition:none}
  .lp2-shots-dot{transition:none}
  .lp2-btn,.lp2-card{transition:none}
}

/* ══════════════════════════════════════════════════════════════════════════
 * R-58 (2026-07-10) — Value-Rechner (/rechner), app-shell/auth/valueCalculator.js.
 * Erbt die .lp2-Designsprache (Landing v2: hell, teal #0d9488, Pill-Buttons,
 * .lp2-card) — bewusst KEIN neues visuelles System (Design bleibt wie es ist).
 * ══════════════════════════════════════════════════════════════════════════ */
.rechner-hero{max-width:760px;margin:0 auto;padding:clamp(40px,7vh,72px) 24px 8px;text-align:center}
.rechner-h1{font-size:clamp(30px,4.2vw,44px);font-weight:800;letter-spacing:-.025em;line-height:1.1;margin:10px 0 14px}

.rechner-grid{display:grid;grid-template-columns:1fr 1fr;gap:20px;max-width:1080px;margin:32px auto 0;padding:0 24px;align-items:start}
.rechner-card{padding:26px 26px 24px;text-align:left}
.rechner-card-title{font-size:13px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:#0d9488;margin:0 0 18px;display:flex;align-items:center;gap:8px}
.rechner-tag{display:inline-block;font-size:var(--fs-12);font-weight:700;color:#0d9488;background:rgba(13,148,136,.1);border-radius:6px;padding:2px 7px;letter-spacing:.03em;text-transform:none}

.rechner-field{margin-bottom:18px}
.rechner-field label{display:flex;justify-content:space-between;align-items:center;font-size:13.5px;font-weight:600;color:#3c3c43;margin-bottom:7px}
.rechner-field--inline label{justify-content:flex-start;gap:8px}
.rechner-val{color:#1d1d1f;font-weight:700;font-variant-numeric:tabular-nums}
.rechner-field input[type=range]{width:100%;accent-color:#0d9488;height:5px}
.rechner-field input[type=number]{width:110px;padding:7px 9px;border:1px solid rgba(0,0,0,.12);border-radius:8px;font:inherit;font-size:14px;text-align:right;color:#1d1d1f}
.rechner-field select{width:100%;padding:9px 10px;border:1px solid rgba(0,0,0,.12);border-radius:8px;font:inherit;font-size:14px;background:#fff;color:#1d1d1f}
.rechner-hint{font-size:var(--fs-12);color:#86868b;margin-top:5px;line-height:1.5}

.rechner-locked{background:rgba(13,148,136,.05);border:1px solid rgba(13,148,136,.15);border-radius:14px;padding:16px 18px;margin-top:22px}
.rechner-locked-title{font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:#0f766e;display:flex;align-items:center;gap:6px;margin-bottom:12px}
.rechner-locked-title .ric{width:14px;height:14px}
.rechner-locked-grid{display:flex;gap:10px;flex-wrap:wrap}
.rechner-locked-item{flex:1;min-width:110px;background:#fff;border:1px solid rgba(0,0,0,.06);border-radius:10px;padding:10px 12px;text-align:center}
.rechner-locked-n{display:block;font-size:19px;font-weight:800;color:#1d1d1f;font-variant-numeric:tabular-nums}
.rechner-locked-d{display:block;font-size:var(--fs-12);color:#86868b;margin-top:2px}
.rechner-locked-note{font-size:var(--fs-12);color:#86868b;margin-top:10px;line-height:1.6}

.rechner-row{display:flex;justify-content:space-between;align-items:center;padding:9px 0;border-bottom:1px dashed rgba(0,0,0,.08);font-size:14px;color:#3c3c43}
.rechner-row:last-of-type{border-bottom:none}
.rechner-amt{font-weight:700;color:#1d1d1f;font-variant-numeric:tabular-nums}
.rechner-total{display:flex;justify-content:space-between;align-items:center;background:rgba(13,148,136,.06);border-radius:10px;padding:12px 14px;margin-top:6px;font-weight:700;color:#0f766e}
.rechner-total .rechner-amt{color:#0f766e}

.rechner-price-hero{background:linear-gradient(135deg,#0d1420,#1d3a4a);color:#fff;border-radius:16px;padding:22px 24px;margin-top:18px}
.rechner-price-k{font-size:12px;opacity:.85;text-transform:uppercase;letter-spacing:.06em}
.rechner-price-big{font-size:38px;font-weight:800;margin:4px 0;font-variant-numeric:tabular-nums}
.rechner-price-big small{font-size:16px;font-weight:600;opacity:.75}
.rechner-price-band{display:flex;gap:12px;margin-top:12px;flex-wrap:wrap}
.rechner-chip{background:rgba(255,255,255,.12);border-radius:10px;padding:9px 13px;font-size:13px}
.rechner-chip b{font-size:17px;display:block;margin-top:1px}
.rechner-chip-free{color:#5eead4}
.rechner-roi{font-size:14px;margin-top:12px;color:#cbe8e4}

.rechner-verdict{margin-top:14px;border-radius:12px;padding:13px 15px;font-size:13.5px;font-weight:600;line-height:1.5}
.rechner-verdict--ok{background:rgba(22,163,74,.08);color:#15803d;border:1px solid rgba(22,163,74,.2)}
.rechner-verdict--warn{background:rgba(245,158,11,.1);color:#946200;border:1px solid rgba(245,158,11,.25)}

.rechner-compare{margin-top:22px}
.rechner-compare-title{font-size:13px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:#0d9488;margin:0 0 12px}
.rechner-bar-row{display:grid;grid-template-columns:110px 1fr 88px;align-items:center;gap:10px;margin:9px 0;font-size:13px;color:#3c3c43}
.rechner-bar-track{background:#f0f0ee;border-radius:8px;height:24px;overflow:hidden}
.rechner-bar-fill{height:100%;border-radius:8px;display:flex;align-items:center;justify-content:flex-end;padding-right:8px;color:#fff;font-weight:700;font-size:var(--fs-12);transition:width .35s ease;white-space:nowrap}
.rechner-bar-fill--rosie{background:#0d9488}
.rechner-bar-fill--seat{background:#c05555}
.rechner-bar-amt{text-align:right;font-weight:700;color:#1d1d1f;font-variant-numeric:tabular-nums}
.rechner-fairness{background:rgba(22,163,74,.06);border:1px solid rgba(22,163,74,.18);border-radius:12px;padding:13px 15px;margin-top:14px;font-size:13.5px;color:#14532d;line-height:1.55}

.rechner-lead{max-width:1080px;margin:36px auto 0;padding:0 24px}
.rechner-lead-card{max-width:none}
.rechner-lead-row{display:flex;gap:10px;flex-wrap:wrap}
.rechner-lead-row input[type=email]{flex:1;min-width:220px;padding:11px 14px;border:1px solid rgba(0,0,0,.12);border-radius:10px;font:inherit;font-size:14px}
.rechner-consent{display:flex;align-items:flex-start;gap:8px;margin-top:12px;font-size:12.5px;color:#6e6e73;line-height:1.5;cursor:pointer}
.rechner-consent input{margin-top:2px}
.rechner-lead-status{font-size:12.5px;margin-top:8px;min-height:1.4em}
.rechner-lead-status--ok{color:#15803d;font-weight:600}
.rechner-lead-status--error{color:#b02a2a;font-weight:600}
.rechner-honeypot{position:absolute!important;left:-9999px!important;width:1px;height:1px;overflow:hidden}

@media (max-width:820px){
  .rechner-grid{grid-template-columns:1fr}
}
@media (max-width:640px){
  .rechner-bar-row{grid-template-columns:82px 1fr 74px}
}

/* ═══════════════════════════════════════════════════════════════════════
   Bauplan Paket 3 — Bottom-Nav + Topbar-Diät (E8) + Ansicht-Umschalter (E18)
   ─────────────────────────────────────────────────────────────────────────
   DESKTOP-FREEZE (Bauplan-Regel 8, nicht verhandelbar): dieser gesamte Block
   ist ausschliesslich unter `html.view-mobile` sichtbar (gesetzt von
   app-shell/viewMode.js). Ohne diese Klasse — der Default, solange JS noch
   nicht gelaufen ist ODER `resolveViewMode()` 'desktop' liefert — ist jede
   hier definierte Fläche unsichtbar; die Topbar/Top-Tabs bleiben exakt wie
   zuvor. Bewusst KEINE reine `@media(max-width:768px)`-Steuerung (anders als
   der Rest dieser Datei): E18 verlangt, dass eine explizite Nutzer-Einstellung
   ("Desktop erzwingen") die physische Gerätebreite überstimmen kann (Stations-
   Tablets/Admin unterwegs) — eine Klasse auf <html> ist der einzige Hebel,
   der das leistet. */
html.view-mobile #tabContainer{display:none}
html.view-mobile #topbarUserBadge{display:none}

.bottom-nav{display:none}
html.view-mobile .bottom-nav{
  display:flex;position:fixed;left:0;right:0;bottom:0;z-index:998;
  background:var(--panel);border-top:1px solid var(--panel-border);
  padding:6px 2px calc(6px + env(safe-area-inset-bottom));
  box-shadow:0 -4px 14px rgba(0,0,0,.12);
}
/* Bug: die letzte Zeile/der letzte Personen-Name der Dienstplan-Matrix liess sich auf Mobile
   nicht ganz nach unten scrollen — verdeckt vom fixierten .bottom-nav (Höhe ~61px: 48px
   .bn-btn-Inhalt + 12px vertikales Padding + 1px Border-Top, s. Regel direkt oberhalb; der
   env(safe-area-inset-bottom)-Anteil kürzt sich heraus, da die bestehende
   `body{padding-bottom:env(safe-area-inset-bottom)}`-Regel [s. oben in dieser Datei] den
   iOS-Home-Indicator bereits separat abdeckt, aber NICHT die Bottom-Nav-Höhe selbst). Bewusst
   `html.view-mobile` statt `@media(max-width:768px)` gescoped (identisches Prinzip wie der
   gesamte Bauplan-Paket-3-Block oben) — E18 erlaubt eine explizite "Desktop erzwingen"-
   Einstellung auf schmalem Viewport, bei der das Bottom-Nav unsichtbar bleibt; eine reine
   Breiten-Media-Query würde dieses Padding dann fälschlich trotzdem anwenden. Kein zusätzlicher
   env(safe-area-inset-bottom)-Term hier (würde mit der bestehenden body-Regel doppelt zählen). */
html.view-mobile #tabShifts{ padding-bottom:64px; }
.bn-btn{
  flex:1;min-width:0;min-height:48px;display:flex;flex-direction:column;align-items:center;
  justify-content:center;gap:2px;background:transparent;border:none;color:var(--muted);
  font:inherit;font-size:var(--fs-12);font-weight:600;padding:4px 2px;position:relative;cursor:pointer;
}
.bn-btn .bn-ic{font-size:19px;line-height:1;display:block}
.bn-btn .bn-label{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.bn-btn.active{color:var(--teal)}
.bn-btn .bn-badge{
  position:absolute;top:2px;right:calc(50% - 20px);background:var(--red,#dc2626);color:#fff;
  font-size:var(--fs-12);font-weight:800;border-radius:999px;padding:0 5px;min-width:16px;text-align:center;
}

.more-panel{display:none}
html.view-mobile .more-panel.active{
  display:flex;position:fixed;inset:0;z-index:999;align-items:flex-end;justify-content:center;
  background:rgba(0,0,0,.35);
}
.more-sheet{
  width:100%;max-width:520px;max-height:82vh;overflow-y:auto;background:var(--panel);
  border-radius:16px 16px 0 0;padding:10px 14px calc(14px + env(safe-area-inset-bottom));
  box-shadow:0 -8px 32px rgba(0,0,0,.28);
}
.more-sheet-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px;padding:4px 2px}
.more-sheet-title{font-weight:700;font-size:15px}
.more-card{background:var(--bg);border:1px solid var(--panel-border);border-radius:12px;padding:10px 12px;margin-bottom:10px}
.more-card-title{font-weight:700;font-size:12.5px;margin-bottom:6px}
.more-card-sub{font-size:var(--fs-12);color:var(--muted);margin:8px 0 4px;text-transform:uppercase;letter-spacing:.04em}
.more-row{display:flex;align-items:center;gap:10px;min-height:44px;width:100%;background:transparent;border:none;color:inherit;font:inherit;text-align:left;padding:6px 2px;cursor:pointer}
.more-row-btn:hover{background:var(--mist,rgba(0,0,0,.03))}
.more-row-ic{font-size:16px;flex-shrink:0;width:22px;text-align:center}
.more-row-label{flex:1;font-size:13px}
.more-row-slot{flex-shrink:0}
.more-row-slot select{max-width:120px}
.more-toggle-row{display:flex;align-items:center;gap:8px;font-size:12.5px;margin-top:10px;cursor:pointer;line-height:1.4}
.more-toggle-row input{flex-shrink:0}
.vm-pills{display:flex;gap:6px;flex-wrap:wrap}
.vm-pill{border:1.5px solid var(--panel-border);background:transparent;color:var(--text);border-radius:999px;padding:6px 12px;font:inherit;font-size:12px;font-weight:600;cursor:pointer}
.vm-pill.active{background:var(--teal);border-color:var(--teal);color:#fff}
/* Farbmodus-Pillen (#appModePills, aus der Topbar hierher verschoben — s. bottomNav.js) im
   Mehr-Panel-Kontext etwas grosszügiger als das winzige Topbar-Original. */
#moreSlot_mode .mode-pills{display:flex;gap:6px}
/* `.vm-anchor`-Marker (index.html): unsichtbare 0×0-Platzhalter, s. bottomNav.js
   Kopfkommentar „RELOCATE STATT REBUILD" — dürfen nie eigenes Layout einnehmen. */
.vm-anchor{display:inline-block;width:0;height:0;overflow:hidden}

/* Paket 4d (E19, shiftsTabAusfallFlow.js) — Ausfall-Sofort-Flow: Trigger-Button NUR mobile
   (Desktop-Freeze, s. ARBEITSAUFTRAG-2026-08-13...§0/FN-313) — identisches html.view-mobile-
   Gating-Muster wie .bottom-nav/.more-panel oben, hier direkt auf der ID statt einer neuen
   Klasse (einziger Konsument). Id-Selektor (Spezifität 1,0,0) reicht als Basis-„aus"-Regel,
   die Mobile-Regel gewinnt per Selektor-Kombination (1,1,1) — kein !important nötig. */
#ausfallFlowTriggerBtn{display:none}
html.view-mobile #ausfallFlowTriggerBtn{display:inline-flex}
/* D1-STOPGAP (Desktop-Konzept §2.1, shiftsTabDeskBereiche.js): a1SubstChainCardWrap landet mit D1
   im "ausfall"-Bereich der neuen Sekundär-Leiste — ohne diese Ergänzung wäre der Ausfall-Melden-
   Einstieg dort auf Desktop funktionslos versteckt (der Trigger war bislang NUR mobile sichtbar,
   s. Regel direkt oberhalb). Bewusster, günstiger Stopgap bis eine vollwertige Desktop-Panel-
   Variante existiert (spätere Etappe, s. BACKLOG D1-Nachtrag) — der Flow selbst (Bottom-Sheet)
   funktioniert inhaltlich unverändert, nur der Eintrittspunkt wird auf Desktop zusätzlich
   erreichbar. Die bestehende Mobile-Regel bleibt unangetastet. */
html.view-desktop #ausfallFlowTriggerBtn{display:inline-flex}
/* Bottom-anchored Sheet nach dem Vorbild von .more-sheet (s.o.), aber DIREKT auf dem
   <dialog>-Element (openDialog()-Konvention, s. shiftsTabArgOverride.js) statt der
   .more-panel-Singleton-DOM-Instanz (die hat einen eigenen, unabhängigen Fokus-Trap-
   Mechanismus, bewusst nicht wiederverwendet, s. Kopfkommentar shiftsTabAusfallFlow.js). */
dialog.ausfall-sheet{
  position:fixed;left:50%;bottom:0;top:auto;right:auto;transform:translateX(-50%);
  margin:0;width:100%;max-width:560px;max-height:88vh;overflow-y:auto;
  border:none;border-radius:16px 16px 0 0;background:var(--panel);color:var(--text);
  padding:14px 16px calc(14px + env(safe-area-inset-bottom));box-shadow:0 -8px 32px rgba(0,0,0,.28);
}
dialog.ausfall-sheet::backdrop{background:rgba(0,0,0,.35)}
@media(max-width:600px){dialog.ausfall-sheet{width:100%;max-width:none;left:0;transform:none}}

/* FN-369 (B-08, 2026-08-24) — Weiterbildungs-Stundenberechnung-Sheet
   (askWeiterbildungDayValueMode(), shiftsTabUtils.js) — dasselbe Bottom-anchored-Sheet-Muster
   wie dialog.ausfall-sheet direkt oberhalb (s. dortiger Kommentar für die volle Begründung),
   bewusst eine EIGENE, kleinere Klasse (kein Formular, nur 3 Radio-artige Auswahl-Optionen,
   deutlich schmaler/niedriger als das Ausfall-Sheet). `.wbdv-sheet-opt` ist BEWUSST kein
   `.btn btn-outline` (anders als `.wish-cal-sheet-opt`) — die aktive/Vorauswahl-Option braucht
   einen dritten visuellen Zustand (gefüllter vs. leerer Punkt + Marken-Rahmen), den die
   generische Button-Klasse nicht kennt. */
dialog.wbdv-sheet{
  position:fixed;left:50%;bottom:0;top:auto;right:auto;transform:translateX(-50%);
  margin:0;width:100%;max-width:420px;max-height:60vh;overflow-y:auto;
  border:none;border-radius:16px 16px 0 0;background:var(--panel);color:var(--text);
  padding:14px 16px calc(14px + env(safe-area-inset-bottom));box-shadow:0 -8px 32px rgba(0,0,0,.28);
}
dialog.wbdv-sheet::backdrop{background:rgba(0,0,0,.35)}
@media(max-width:600px){dialog.wbdv-sheet{width:100%;max-width:none;left:0;transform:none}}
.wbdv-sheet-head{margin-bottom:10px}
.wbdv-sheet-title{font-size:15px;font-weight:700;color:var(--text)}
.wbdv-sheet-body{display:flex;flex-direction:column;gap:6px}
.wbdv-sheet-opt{display:flex;align-items:center;gap:10px;width:100%;text-align:left;background:var(--bg);border:1px solid var(--panel-border);border-radius:8px;padding:10px 12px;font:inherit;font-size:14px;color:var(--text);cursor:pointer}
.wbdv-sheet-opt:hover{border-color:var(--heute-plum)}
/* `--heute-plum-deep` statt vererbtem `--text` — Kontrast-Lehre aus `.conv-item` weiter unten in
   dieser Datei (dortiger Kommentar: deckendes `--heute-mist` + theme-abhängiger Text bricht im
   Dunkel-Modus real auf 1.1:1 ein). `--heute-mist`/`--heute-plum-deep` sind BEIDE fixe, nicht
   theme-abhängige Werte — dieselbe Kombination wie `.wish-badge`/`.planung-segment.active`
   u.a., dort bereits etabliert sicher. */
.wbdv-sheet-opt--active{border-color:var(--heute-plum);background:var(--heute-mist);color:var(--heute-plum-deep);font-weight:600}
/* BEWUSST kein eigener `color`-Wert — der Punkt erbt `currentColor` vom umschliessenden
   `.wbdv-sheet-opt` (Default `--text` auf `--bg`, im aktiven Zustand `--heute-plum-deep` auf
   `--heute-mist`, s. Kommentar oben) statt selbst `--heute-plum` direkt gegen den
   theme-abhängigen `--bg` zu setzen — genau das wäre im Dunkel-Modus dieselbe Kontrastfalle
   (beide Farben dunkel, ~1.5:1 gemessen). */
.wbdv-sheet-opt-dot{font-size:14px;flex-shrink:0}

/* D1 (Desktop-Konzept §2.1, shiftsTabDeskBereiche.js) — Sekundär-Leiste Dienste-Tab. Sichtbarkeit
   ist AUSSCHLIESSLICH JS-gesteuert (_deskBereicheGateActive(): _canPlan()&&Desktop) — bewusst
   KEINE @media-Regel hier (Rolle ist CSS unbekannt, s. Dateikopfkommentar). `--topbar-h` wird im
   App-Shell-Runtime NIE per JS gesetzt (nur der eingefrorene Monolith tut das, s. Kommentar weiter
   oben in dieser Datei "wird per JS gesetzt (updateTopbarMetrics())") — der 52px-Fallback ist damit
   hier der praktisch wirksame Wert, exakt wie bei den bereits bestehenden `var(--topbar-h, 52px)`-
   Stellen oben in dieser Datei (identisches, etabliertes Muster, nicht neu erfunden). */
#shiftsDeskBereicheBar{position:sticky;top:var(--topbar-h, 52px);z-index:5;background:var(--bg)}
.shift-desk-bereiche-tabs{display:flex;gap:6px;flex-wrap:wrap;padding:8px 0 12px;margin-bottom:10px;border-bottom:1px solid var(--panel-border)}
.shift-desk-bereich-btn{display:inline-flex;align-items:center;gap:6px;background:none;border:1.5px solid var(--panel-border);border-radius:999px;padding:6px 14px;font:inherit;font-size:var(--fs-12);font-weight:600;color:var(--text-secondary);cursor:pointer;transition:all .18s cubic-bezier(0.4,0,0.2,1)}
.shift-desk-bereich-btn svg{width:15px;height:15px;flex-shrink:0}
.shift-desk-bereich-btn:hover{border-color:var(--heute-plum)}
.shift-desk-bereich-btn.active{background:var(--heute-plum);border-color:var(--heute-plum);color:var(--heute-cream)}
/* Paket 4c (Planer-Cockpit, shiftsTabCockpit.js/shiftsTabCockpitInbox.js) — Mobile-Pendant zu
   D1 direkt oberhalb, identisches Sichtbarkeits-Prinzip (JS-gesteuert über
   _cockpitGateActive(): _canPlan()&&Mobile, KEINE @media-Regel hier). Segment-Pillen
   wiederverwenden .shift-desk-bereiche-tabs/.shift-desk-bereich-btn (D1 hat sie bereits
   pixelgetreu für exakt dieses Pillen-Muster gebaut) — nur die NEUEN Bausteine hier:
   Werkzeuge-Reihe + Inbox-Filter-Chips + Inbox-Zeilen. */
#shiftsCockpitBar{position:sticky;top:var(--topbar-h, 52px);z-index:5;background:var(--bg)}
.shift-cockpit-tools{display:flex;gap:6px;flex-wrap:wrap;padding:0 0 12px}
.cockpit-inbox-chips{display:flex;gap:6px;flex-wrap:wrap;padding:8px 0 12px;margin-bottom:10px;border-bottom:1px solid var(--panel-border)}
.cockpit-inbox-chip{display:inline-flex;align-items:center;gap:4px;background:none;border:1.5px solid var(--panel-border);border-radius:999px;padding:5px 12px;font:inherit;font-size:var(--fs-12);font-weight:600;color:var(--text-secondary);cursor:pointer;transition:all .18s cubic-bezier(0.4,0,0.2,1)}
.cockpit-inbox-chip:hover{border-color:var(--heute-plum-light)}
.cockpit-inbox-chip-count{font-weight:700;opacity:.85}
.cockpit-inbox-list{display:flex;flex-direction:column;gap:6px}
.cockpit-inbox-row-main{display:flex;flex-direction:column;gap:2px;min-width:0}
.cockpit-inbox-row-title{font-size:var(--fs-12);font-weight:700}
.cockpit-inbox-row-meta{font-size:var(--fs-12);color:var(--muted)}
/* ═══════════════════════════════════════════════════════════════════════
   Desktop-Bauplan «Ruhe · Ebenen», PAKET D-R4 — "Zu erledigen"-Inbox
   (ARBEITSAUFTRAG-2026-08-20_DESKTOP-RUHE-EBENEN-BAUPLAN.md §5,
   app-shell/views/shiftsTabCockpitInbox.js)
   ─────────────────────────────────────────────────────────────────────────
   Reines Restyling — 0 Endpunkt-/Handler-Änderung, s. dortiger Kopfkommentar. Kein
   `html.view-mobile`-Scope nötig: `renderCockpitInbox()` togglet `#shiftsCockpitInboxWrap`
   bereits vollständig per JS (`_canPlan()&&resolveViewMode()==='mobile'`, s. dortiger
   Kommentar) — identisches Prinzip wie D1/Wunsch-Kalender/Heute-Hub (JS-gesteuerte
   Sichtbarkeit statt @media, s. deren Kopfkommentare). Farben ausschliesslich die bereits
   etablierten `--heute-*`-Marken-Token — Coral bleibt die EINE Aktionsfarbe („Genehmigen"),
   der aktive Filter-Chip nutzt wie `.dr3-seg-btn.active`/`.planung-segment.active` den
   ruhigeren Mist/Plum-Akzent statt Coral (Chips sind Filter, keine Aktionen). „Ablehnen"
   bleibt bewusst zurückhaltend — das bestehende `.btn-outline`+`var(--red)`-Muster
   (Repo-Konvention, s. u.a. shiftsTabQueues.js/adminTabAusfallBounty.js) ist bereits ein
   Kontur- statt Flächenknopf und tritt damit von selbst hinter dem neuen Coral-CTA zurück —
   zwei gleich auffällige Aktionen nebeneinander wären sonst schlechte Praxis. `.btn-primary`
   selbst bleibt UNANGETASTET (Flo-Entscheid, dessen globaler Teal→Coral-Retint ist bewusst
   ein eigenes, späteres Item) — der Coral-Ton gilt nur INNERHALB dieser Karten-Aktionsleiste
   (höhere Selektor-Spezifität, kein `!important` nötig, identisches Muster wie D-R5s
   `.rs-sidebar .mode-pill.active`). */
.cockpit-inbox-chip.active{background:var(--heute-mist);border-color:transparent;color:var(--heute-plum-deep)}
.cockpit-inbox-row{
  display:flex;flex-direction:column;gap:8px;background:var(--panel);border:1px solid var(--panel-border);
  border-radius:var(--radius);padding:10px 12px;box-shadow:var(--e1);
}
.cockpit-inbox-row-head{display:flex;align-items:flex-start;gap:10px}
.cockpit-inbox-row-head .cockpit-inbox-row-main{flex:1}
.cockpit-inbox-row-icon{
  display:flex;align-items:center;justify-content:center;flex-shrink:0;
  width:32px;height:32px;border-radius:50%;background:var(--heute-mist);color:var(--heute-plum);
}
.cockpit-inbox-row-icon .ric{width:16px;height:16px}
.cockpit-inbox-row-actions{display:flex;gap:6px;flex-shrink:0;flex-wrap:wrap;padding-left:42px}
.cockpit-inbox-row-actions .btn-primary{
  background:var(--heute-coral);box-shadow:0 8px 18px -8px rgba(255,106,61,.5),inset 0 1px 0 rgba(255,255,255,.18);
}
.cockpit-inbox-row-actions .btn-primary:hover{filter:brightness(1.05)}
.cockpit-inbox-empty{
  display:flex;flex-direction:column;align-items:center;gap:6px;text-align:center;padding:28px 16px;
  color:var(--muted);font-size:var(--fs-12);background:var(--panel);border:1px solid var(--panel-border);
  border-radius:var(--radius);
}
/* ═══════════════════════════════════════════════════════════════════════
   Paket 5 — Heute-Hub (shiftsTabHeuteHub.js/shiftsTabMyRequests.js), MA-Mobile-Pendant zu
   D1/Paket-4c direkt oberhalb (dritte, orthogonale Rolle×Viewport-Kombination, s. dortige
   Kopfkommentare). Segmented Control wiederverwendet BEWUSST .shift-desk-bereiche-tabs/
   .shift-desk-bereich-btn (D1/Cockpit haben sie bereits für exakt dieses Pillen-Muster
   gebaut) — nur die NEUEN Bausteine hier. `--heute-*`-Tokens sind Marken-Konstanten (Plum-
   Verlauf/Cream/Gold aus brand/rosie-brand/ui/tokens.css) — bewusst NUR auf bare :root, NIE in
   .light/.preset-rose überschrieben: die Heute-Karte bleibt in JEDEM Farbmodus identisch (kein
   funktionales UI-Token wie --bg/--panel, das mit dem Modus wechseln müsste).
   Paket M-A (ARBEITSAUFTRAG-2026-08-19_MOBILE-V1PLUS-BAUPLAN.md §2/§1) erweitert dasselbe
   `--heute-*`-Namespace additiv um --heute-coral/--heute-mist (fehlende Werte aus
   brand/rosie-brand/colors.css, bytegleiche Hex-Werte) statt einen zweiten Marken-Namespace
   einzuführen — bewusst NICHT `brand/rosie-brand/colors.css` direkt importiert: dessen
   `--rosie-gold`/`--rosie-cream` kollidieren mit bereits andersfarbig definierten
   Gleichnamigen in diesem File (rosie.css:1338-1347, „Brand Kit r127", Plan-Legende/
   Coverage-Bar) — s. FN-342/M-A-Scoping-Nachtrag docs/audit/BACKLOG.md. */
:root{
  --heute-plum:#3B2A63; --heute-plum-deep:#241640; --heute-plum-light:#4F3A82;
  --heute-gradient:linear-gradient(135deg,#4F3A82 0%,#241640 100%);
  --heute-cream:#FBF1E7; --heute-gold:#FFC24A; --heute-coral:#FF6A3D; --heute-mist:#ECE8F5;
}
.heute-hub-card{background:var(--heute-gradient);color:var(--heute-cream);border-radius:var(--radius);padding:14px 16px;margin-bottom:10px;cursor:pointer;border:none;border-left:4px solid var(--heute-coral)}
.heute-hub-card--free{cursor:default;border-left-color:transparent}
.heute-hub-card-label{font-size:var(--fs-12);opacity:.82;letter-spacing:.06em;font-weight:700;text-transform:uppercase}
.heute-hub-card-title{font-family:'Fredoka',var(--font-sans,inherit);font-weight:600;font-size:18px;margin-top:4px}
.heute-hub-card-countdown{font-size:var(--fs-12);font-weight:700;color:var(--heute-gold);margin-top:6px}
.heute-hub-nextrow{display:flex;gap:8px;margin-bottom:10px}
.heute-hub-nextday{flex:1;background:var(--panel);border:1px solid var(--panel-border);border-radius:var(--radius-sm);padding:7px 8px;font-size:var(--fs-12);color:var(--muted)}
a.heute-hub-nextday[data-click],.heute-hub-nextday[data-click]{cursor:pointer}
.heute-hub-nextday-label{font-weight:600;color:var(--text-secondary)}
.heute-hub-nextday-val{font-weight:700;color:var(--text);margin-top:2px}
.heute-hub-section-title{font-weight:700;font-size:var(--fs-12);color:var(--muted);margin:12px 0 6px;text-transform:uppercase;letter-spacing:.04em}
.heute-hub-section-title--sub{opacity:.75}
/* M-A: Wochenkarte als 7er-Chip-Grid (statt Zeilenliste) + Heute-Ring (rosie.css war bislang
   .heute-hub-week-row/-list, s. §2 „Wochenkarte (7 Tage, Kürzel-Chips, Heute-Ring)"). */
.heute-hub-week-list{display:grid;grid-template-columns:repeat(7,1fr);gap:5px}
.heute-hub-week-row{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;background:var(--panel);border:1px solid var(--panel-border);border-radius:var(--radius-sm);padding:6px 2px;font-size:var(--fs-12);cursor:pointer;text-align:center;min-height:52px}
.heute-hub-week-row--free{cursor:default;color:var(--muted)}
.heute-hub-week-row--today{border-color:var(--heute-coral);border-width:2px;box-shadow:0 0 0 1px var(--heute-coral) inset}
.heute-hub-week-row-day{font-weight:600;color:var(--text-secondary);font-size:var(--fs-12);text-transform:uppercase}
.heute-hub-week-row-val{font-weight:700;color:var(--text);font-size:var(--fs-12);line-height:1.2}
.heute-hub-week-row--free .heute-hub-week-row-val{color:var(--muted);font-weight:500}
.heute-hub-week-dot{color:var(--amber);font-size:var(--fs-12);display:block}
.heute-hub-week-actions{display:flex;gap:8px;margin:10px 0}
.heute-hub-week-actions .btn{flex:1}
/* FN-372 Etappe B-09e (2026-08-25, ARBEITSAUFTRAG-2026-08-24_BETA-FEEDBACK-WELLE-3.md) —
   Jubiläums-Karte, s. shiftsTabAnniversaryCard.js. Marken-Gold-/Plum-Palette (--heute-*,
   theme-INVARIANT — nur EINE :root-Deklaration je Token, s. dortigen Kopfkommentar, darum
   identisch in allen 3 Farbmodi, per WCAG-Formel gegen beide Gradient-Stopps geprüft: cream
   8.34:1/14.91:1, gold 5.78:1/10.34:1 — beide weit über AA 4.5:1). Gold statt Coral-Kante
   (`.heute-hub-card` direkt darüber) macht sie optisch unterscheidbar von der Heute-Karte,
   kein Standard-Kartenrahmen (Auftragstext). */
.anniversary-card{background:var(--heute-gradient);color:var(--heute-cream);border-radius:var(--radius);padding:16px;margin-bottom:10px;border:none;border-left:4px solid var(--heute-gold)}
.anniversary-card-head{display:flex;align-items:center;gap:12px;margin-bottom:8px}
.anniversary-card-icon{width:40px;height:40px;flex:0 0 auto;background:var(--heute-cream);border-radius:50%;padding:6px;box-sizing:border-box}
.anniversary-card-icon svg{width:100%;height:100%}
.anniversary-card-title{font-family:'Fredoka',var(--font-sans,inherit);font-weight:600;font-size:18px}
.anniversary-card-subtitle{font-size:var(--fs-14,14px);opacity:.9;margin-bottom:10px}
.anniversary-card-status{font-size:var(--fs-14,14px);opacity:.92}
.anniversary-card-options{display:flex;flex-direction:column;gap:8px;margin:10px 0}
.anniversary-card-option{display:flex;align-items:center;gap:8px;background:rgba(255,255,255,.08);border:1px solid rgba(255,255,255,.18);border-radius:var(--radius-sm);padding:10px 12px;cursor:pointer;text-align:left;color:var(--heute-cream);font:inherit;width:100%}
.anniversary-card-option.selected{border-color:var(--heute-gold);background:rgba(255,194,74,.16)}
.anniversary-card-option-label{flex:1}
.anniversary-card-actions{display:flex;gap:8px;margin-top:10px;flex-wrap:wrap}
.anniversary-card-days-list{list-style:none;margin:8px 0;padding:0;display:flex;flex-direction:column;gap:4px}
.anniversary-card-days-list li{background:rgba(255,255,255,.08);border-radius:var(--radius-sm);padding:6px 10px;font-size:var(--fs-14,14px)}
.anniversary-card-days-row{display:flex;align-items:center;gap:8px;margin-bottom:6px}
.anniversary-card-days-row input[type="date"]{flex:1;min-width:0}
.heute-hub-sheet-actions{display:flex;gap:8px;margin:10px 0}
.heute-hub-stc-form{border-top:1px dashed var(--panel-border);padding-top:10px;margin-top:4px}
.heute-hub-stc-pending{border-top:1px dashed var(--panel-border);padding-top:10px;margin-top:4px;font-size:var(--fs-12);color:var(--amber)}
.myreq-row{display:flex;justify-content:space-between;align-items:center;gap:8px;flex-wrap:wrap;background:var(--bg);border:1px solid var(--panel-border);border-radius:8px;padding:8px 10px;margin-bottom:6px}
.myreq-row--muted{opacity:.72}
.myreq-row-main{display:flex;flex-direction:column;gap:2px;min-width:0}
.myreq-row-title{font-size:var(--fs-12);font-weight:700}
.myreq-row-meta{font-size:var(--fs-12);color:var(--muted)}
.myreq-row-actions{display:flex;gap:4px;align-items:center;flex-shrink:0;flex-wrap:wrap}
.myreq-badge{font-size:var(--fs-12);font-weight:600;display:inline-flex;align-items:center;gap:4px;color:var(--muted)}
/* ═══════════════════════════════════════════════════════════════════════
   DESKTOP-BAUPLAN «RUHE · EBENEN», PAKET D-R1 — Seitenleiste
   (ARBEITSAUFTRAG-2026-08-20_DESKTOP-RUHE-EBENEN-BAUPLAN.md §2, app-shell/sidebar.js)
   ─────────────────────────────────────────────────────────────────────────
   Ersetzt auf `html.view-desktop` die Topbar-Tab-Leiste (#tabContainer) + das Logo
   (.topbar-left) durch die Sidebar — Gegenstück zur bereits bestehenden Mobile-Regel
   `html.view-mobile #tabContainer{display:none}` weiter oben in dieser Datei. Mobile
   bleibt dadurch byte-identisch unangetastet (Desktop-Freeze, umgekehrte Richtung wie
   beim D2-Block direkt unterhalb). Farben: AUSSCHLIESSLICH die bereits etablierten
   `--heute-*`-Marken-Konstanten (s. „Heute-Hub"-Block oben, bytegleich zu
   brand/rosie-brand/colors.css) — kein dritter Marken-Namespace. `--rs-side-grad` ist
   die EINE Ausnahme (Bauplan §6 verlangt einen JE-MODUS unterschiedlichen Verlauf für
   die Seitenleiste selbst — Rosé bekommt einen Beeren- statt Plum-Verlauf; --heute-* ist
   bewusst modus-invariant und darf dafür nicht herhalten, s. dortiger Kopfkommentar). */
html.view-desktop #appContent.active{display:flex}
.rs-main-col{flex:1;min-width:0}
html.view-desktop #tabContainer{display:none}
html.view-desktop .topbar-left{display:none}
html.view-desktop #topbarUserBadge{display:none}
html.view-desktop .topbar-right{margin-left:auto}
/* Bauplan §2: „die D1-Leiste im Inhalt ENTFÄLLT, ihre vier Ziele werden Seitenleisten-
   Einträge" — D1 (shiftsTabDeskBereiche.js, Desktop-Konzept §2.4) bleibt als Modul
   unangetastet (dieselbe Datenquelle speist weiterhin die Sidebar-Badges, s. sidebar.js),
   nur seine EIGENE Pillen-Leiste im Content-Bereich wird jetzt redundant. */
html.view-desktop #shiftsDeskBereicheBar{display:none}

:root{
  --rs-width:232px; --rs-rail:64px;
  --rs-side-grad:var(--heute-gradient);
}
.nightshift .rs-sidebar{--rs-side-grad:linear-gradient(180deg,#1C1235 0%,#120B22 100%)}
.preset-rose .rs-sidebar{--rs-side-grad:linear-gradient(180deg,#831843 0%,#4C0519 100%)}

.rs-sidebar{width:var(--rs-width);background:var(--rs-side-grad);color:var(--heute-cream);display:flex;flex-direction:column;padding:16px 12px;position:sticky;top:0;height:100vh;flex-shrink:0;overflow:visible;z-index:101;transition:width .24s cubic-bezier(.4,0,.2,1)}
.rs-sidebar[hidden]{display:none}
.rs-inner{display:flex;flex-direction:column;flex:1;min-height:0;overflow:hidden}

.rs-edge{position:absolute;right:-13px;top:22px;width:26px;height:26px;border-radius:50%;background:var(--panel);border:1px solid var(--panel-border);box-shadow:0 4px 12px -4px rgba(36,22,64,.35);display:flex;align-items:center;justify-content:center;color:var(--heute-plum-light);cursor:pointer;z-index:50;transition:transform .24s cubic-bezier(.4,0,.2,1),box-shadow .15s}
.rs-edge:hover{box-shadow:0 6px 16px -4px rgba(36,22,64,.5)}
.rs-edge .rs-ic svg{width:14px;height:14px;transition:transform .24s cubic-bezier(.4,0,.2,1)}
.rs-collapsed .rs-edge .rs-ic svg{transform:rotate(180deg)}

.rs-brand{display:flex;align-items:center;gap:10px;padding:0 6px 14px;min-height:46px}
.rs-brand-slot{flex:1;min-width:0;display:flex;align-items:center;overflow:hidden}
.rs-brand-slot .topbar-logo{display:flex;align-items:center}
.rs-rail-mark{display:none;border-radius:9px;flex-shrink:0}
.rs-collapsed .rs-brand-slot{display:none}
.rs-collapsed .rs-rail-mark{display:block}
.rs-sidebar.rs-collapsed:not(.rs-pinned):hover .rs-brand-slot{display:flex}
.rs-sidebar.rs-collapsed:not(.rs-pinned):hover .rs-rail-mark{display:none}
.rs-pinbtn{width:28px;height:28px;border-radius:8px;display:flex;align-items:center;justify-content:center;color:rgba(251,241,231,.55);cursor:pointer;background:none;border:none;transition:background .15s,color .15s,transform .2s;flex-shrink:0}
.rs-pinbtn:hover{background:rgba(251,241,231,.1);color:#fff}
.rs-pinbtn.on{color:var(--heute-gold)}
.rs-pinbtn:not(.on){transform:rotate(45deg);opacity:.7}
.preset-rose .rs-pinbtn.on{color:#F9A8D4}

.rs-pinhint{font-size:var(--fs-12);font-weight:700;letter-spacing:.4px;color:rgba(251,241,231,.45);padding:2px 12px 6px;white-space:nowrap}
.rs-sidebar.rs-pinned .rs-pin-off,.rs-sidebar:not(.rs-pinned) .rs-pin-onn{display:none}

.rs-navwrap{position:relative;overflow:hidden;flex-shrink:0}
.rs-nav{display:flex;flex-direction:column;gap:2px}
.rs-item{display:flex;align-items:center;gap:12px;padding:10px 11px;border-radius:10px;color:rgba(251,241,231,.72);font-size:13.5px;font-weight:600;cursor:pointer;white-space:nowrap;background:none;border:none;text-align:left;width:100%;font-family:inherit}
.rs-item:hover{background:rgba(251,241,231,.08)}
.rs-item.active{background:rgba(251,241,231,.14);color:#fff}
.rs-item.active .rs-ic{color:var(--heute-gold)}
.preset-rose .rs-item.active{color:#F9A8D4}
.preset-rose .rs-item.active .rs-ic{color:#F9A8D4}
.rs-ic{width:18px;height:18px;flex-shrink:0;display:flex;align-items:center;justify-content:center}
.rs-ic svg{width:18px;height:18px}
.rs-lbl{overflow:hidden;text-overflow:ellipsis}
.rs-cnt{margin-left:auto;background:var(--heute-coral);color:#fff;font-size:var(--fs-12);font-weight:800;min-width:21px;height:21px;border-radius:999px;display:flex;align-items:center;justify-content:center;padding:0 5px;flex-shrink:0}
.rs-divider{height:1px;background:rgba(251,241,231,.12);margin:10px 8px}

.rs-spacer{flex:1}
/* D-R5 (2026-08-21 nachgezogen): `display:flex` ergänzt — dieser Slot trägt jetzt zwei
   Geschwister-Kinder (die relocateten `#appModePills` + das `.rs-mode-label`, s. dortiger
   Block unten) in EINER Zeile, exakt wie der Prototyp `.modeswitch`. */
.rs-modeslot{padding:2px 12px 8px;display:flex;align-items:center;gap:6px}
.rs-modeslot:empty{display:none}

.rs-ucard{display:flex;align-items:center;gap:10px;padding:9px 10px;border-radius:12px;background:rgba(251,241,231,.08);white-space:nowrap;overflow:hidden;cursor:pointer;border:none;width:100%;text-align:left;font-family:inherit;color:inherit}
.rs-avatar{width:34px;height:34px;border-radius:50%;background:var(--heute-mist);color:var(--heute-plum);font-weight:700;font-size:13px;display:flex;align-items:center;justify-content:center;flex-shrink:0}
.rs-uinfo{display:flex;flex-direction:column;overflow:hidden;min-width:0}
.rs-uname{font-size:13px;font-weight:700;color:#fff;overflow:hidden;text-overflow:ellipsis}
.rs-urole{font-size:var(--fs-12);color:rgba(251,241,231,.6);overflow:hidden;text-overflow:ellipsis}

/* Rail-Zustand (64px): nur Icons — Bauplan §2 */
.rs-sidebar.rs-collapsed{width:var(--rs-rail)}
.rs-collapsed .rs-lbl,.rs-collapsed .rs-cnt,.rs-collapsed .rs-pinhint,.rs-collapsed .rs-modeslot,.rs-collapsed .rs-uinfo,.rs-collapsed .rs-pinbtn,.rs-collapsed .rs-admlabel{display:none}
.rs-collapsed .rs-item{justify-content:center;padding:10px 0}
.rs-collapsed .rs-brand{justify-content:center;padding-left:0;padding-right:0}
.rs-collapsed .rs-ucard{justify-content:center;background:none;padding:6px 0}

/* Hover-Aufklappen (nicht fixiert): Leiste wächst IM LAYOUT wieder auf (position:sticky,
   NIEMALS position:fixed-Overlay — Bauplan §2 „Flo-Beanstandung «überlagert andere
   Elemente»"). */
.rs-sidebar.rs-collapsed:not(.rs-pinned):hover{width:var(--rs-width)}
.rs-collapsed:not(.rs-pinned):hover .rs-edge .rs-ic svg{transform:rotate(0deg)}
.rs-collapsed:not(.rs-pinned):hover .rs-lbl,.rs-collapsed:not(.rs-pinned):hover .rs-cnt,.rs-collapsed:not(.rs-pinned):hover .rs-pinhint,.rs-collapsed:not(.rs-pinned):hover .rs-modeslot,.rs-collapsed:not(.rs-pinned):hover .rs-uinfo,.rs-collapsed:not(.rs-pinned):hover .rs-pinbtn,.rs-collapsed:not(.rs-pinned):hover .rs-admlabel{display:block}
.rs-collapsed:not(.rs-pinned):hover .rs-cnt{display:flex}
/* D-R5: die geteilte Regel oben schaltet `.rs-modeslot` nur auf `display:block` — der Slot
   trägt seit D-R5 zwei Geschwister-Kinder in EINER Zeile (s. `.rs-modeslot{display:flex}`
   oben), identisches Override-Muster wie `.rs-cnt` direkt darüber. */
.rs-collapsed:not(.rs-pinned):hover .rs-modeslot{display:flex}
.rs-collapsed:not(.rs-pinned):hover .rs-item{justify-content:flex-start;padding:10px 11px}
.rs-collapsed:not(.rs-pinned):hover .rs-brand{justify-content:flex-start}
.rs-collapsed:not(.rs-pinned):hover .rs-ucard{justify-content:flex-start;background:rgba(251,241,231,.08);padding:9px 10px}

@media (prefers-reduced-motion:reduce){
  .rs-sidebar,.rs-edge .rs-ic svg{transition:none!important}
}
/* ═══════════════════════════════════════════════════════════════════════
   PAKET D-R5 — Darstellungs-Umschalter (app-shell/sidebar.js)
   (ARBEITSAUFTRAG-2026-08-20_DESKTOP-RUHE-EBENEN-BAUPLAN.md §6)
   ─────────────────────────────────────────────────────────────────────────
   KEIN neues Farbmodus-System: `#appModePills` (die BESTEHENDEN 3 `setAppMode()`-Knöpfe, s.
   app-shell/index.html `.mode-pills`/`.mode-pill`) wird von sidebar.js NUR relocated
   (appendChild, dieselben DOM-Knoten/ids/Klick-Handler wie in der Topbar/im Mobile-„Mehr"-
   Panel) — hier ausschliesslich die NEUE, kreisförmige Prototyp-Optik für den Fall, dass die
   Pillen gerade innerhalb `.rs-sidebar` sitzen (`#sbModeSlot`). Bewusst NICHT `.mode-pills`/
   `.mode-pill` selbst umdefiniert (Bauplan §1.1 „additive CSS-Variablen, bestehende Token nicht
   umdefinieren" + würde sonst auch die Topbar-/Mobile-„Mehr"-Panel-Optik derselben Klassen
   mitverändern, Desktop-Freeze-Analogon) — jede neue Regel ist unter `.rs-sidebar` gescoped und
   gewinnt dort rein durch höhere Selektor-Spezifität (kein `!important` nötig). */
.rs-sidebar .mode-pills{gap:6px;background:none;border-radius:0;padding:0;margin-right:0}
.rs-sidebar .mode-pill{width:30px;height:30px;border-radius:50%;background:none;border:1.5px solid transparent;color:rgba(251,241,231,.55);opacity:1;box-shadow:none;transition:color .15s,border-color .15s,background .15s}
.rs-sidebar .mode-pill:hover{background:rgba(251,241,231,.1);color:#fff;opacity:1}
.rs-sidebar .mode-pill.active{background:none;color:var(--heute-gold);border-color:var(--heute-gold);box-shadow:none;opacity:1}
.preset-rose .rs-sidebar .mode-pill.active{color:#F9A8D4;border-color:#F9A8D4}
.rs-sidebar .mode-pill .ric{width:15px;height:15px}
.rs-mode-label{font-size:var(--fs-12);font-weight:700;letter-spacing:.4px;color:rgba(251,241,231,.45);margin-left:2px;white-space:nowrap}
/* ═══════════════════════════════════════════════════════════════════════
   PAKET D-R2 — Admin-„Ebenen"-Effekt in der Seitenleiste
   (ARBEITSAUFTRAG-2026-08-20_DESKTOP-RUHE-EBENEN-BAUPLAN.md §3, app-shell/sidebar.js)
   ─────────────────────────────────────────────────────────────────────────
   `.rs-navwrap` (D-R1, bereits `position:relative;overflow:hidden;flex-shrink:0`) trägt jetzt
   ZWEI übereinanderliegende Panes: `.rs-navmain` (normaler Fluss) + `.rs-navadmin`
   (`position:absolute;inset:0`, Prototyp-Muster `.navmain`/`.navadmin`). Klick auf „Admin"
   (`asideEl.classList.add('rs-adminmode')`, s. sidebar.js `_enterAdminMode()`) lässt die
   Haupt-Navigation zurücktreten (scale/Opacity/Blur) und die Admin-Ebene als Karte mit
   Überschwinger von unten hochfedern (Bauplan-Bezier `(.3,1.35,.45,1)`) — exakt der Prototyp-
   Effekt B «Ebenen» (docs/konzepte/ROSIE-DESKTOP-FINAL-RUHE-EBENEN_2026-08-20.html
   `body.fx-ebenen`-Block), hier auf `--rs-*`/`--heute-*`-Marken-Token übertragen statt der
   Prototyp-Hex-Werte (`var(--rs-side-grad)` statt eines fest verdrahteten zweiten Verlaufs —
   dieselbe Variable, die D-R1 bereits je Modus [Hell/Dunkel/Rosé] unterschiedlich befüllt).
   Rail-Zustand (nur Icons): die bereits bestehenden `.rs-collapsed .rs-lbl{display:none}`-
   Regeln (Block oberhalb) greifen für `.rs-admitem`/`.rs-backrow`/`.rs-admgrp-head` automatisch
   (dieselbe `.rs-lbl`/`.rs-item`-Konvention) — nur `.rs-admlabel` folgt NICHT dieser Konvention
   und wurde darum direkt in die bestehenden Rail-Regeln aufgenommen (s. oben). */
.rs-navpane{display:flex;flex-direction:column}
.rs-navmain{transition:transform .34s ease,opacity .34s;transform-origin:top center}
/* `.rs-navwrap` (D-R1) hat KEIN `flex-grow` — seine Höhe bleibt immer die der Haupt-Navigation
   (~10 Einträge), unabhängig von der Fensterhöhe. Die 6 Admin-Gruppen (bis zu 15 Sub-Tab-Items
   insgesamt) sind zusammengenommen deutlich HÖHER als das — `overflow-y:auto` (statt eines
   harten `overflow:hidden`) hält deshalb JEDE Einstellung erreichbar (scrollbar innerhalb der
   Ebene), `overflow-x:hidden` behält den abgerundeten Karten-Look ohne horizontale Scrollbar. */
.rs-navadmin{position:absolute;inset:0;overflow-y:auto;overflow-x:hidden;pointer-events:none;transform:translateY(106%);
  transition:transform .42s cubic-bezier(.3,1.35,.45,1);border-top:1px solid rgba(251,241,231,.15);
  background:var(--rs-side-grad);border-radius:14px 14px 0 0;box-shadow:0 -14px 34px -18px rgba(0,0,0,.6);
  padding-top:6px}
.rs-sidebar.rs-adminmode .rs-navadmin{pointer-events:auto;transform:none}
.rs-sidebar.rs-adminmode .rs-navmain{transform:scale(.94) translateY(-4px);opacity:.18;filter:blur(1px)}

.rs-backrow{color:var(--heute-gold);font-weight:800;font-size:13px;margin-bottom:4px}
.preset-rose .rs-backrow{color:#F9A8D4}
.rs-admlabel{font-size:var(--fs-12);font-weight:800;letter-spacing:.06em;text-transform:uppercase;
  color:rgba(251,241,231,.4);padding:6px 12px 6px;white-space:nowrap}
.rs-admgrp{margin-bottom:6px}
.rs-admgrp-head{display:flex;align-items:center;gap:10px;padding:6px 11px 4px;font-size:var(--fs-12);
  font-weight:700;color:rgba(251,241,231,.5)}
.rs-admgrp-head .rs-ic{width:16px;height:16px}
.rs-admgrp-head .rs-ic svg{width:16px;height:16px}
.rs-admitem{font-size:12.5px;letter-spacing:0}

/* Rail-Zustand: Gruppen-Kopf zentriert sich wie jedes andere Icon-only-Element (kein
   `.rs-item`-Button, deshalb kein automatischer Treffer für die bestehende
   `.rs-collapsed .rs-item{justify-content:center}`-Regel oben). */
.rs-collapsed .rs-admgrp-head{justify-content:center;padding:6px 0 4px}

@media (prefers-reduced-motion:reduce){
  /* Bauplan §1.6: „Ebenen-Effekt … zu simplem Ein-/Ausblenden (keine Transform-Fahrten)" —
     identisches Muster wie D-R1s eigene `.rs-sidebar`-Reduced-Motion-Regel oben: die
     End-Zustände (scale/Opacity/Blur/Position) bleiben unverändert, nur der ANIMIERTE Übergang
     dorthin entfällt. */
  .rs-navmain,.rs-navadmin{transition:none!important}
}
/* ═══════════════════════════════════════════════════════════════════════
   D2 — Admin-Gruppen-Sidebar + Suche (Desktop-Konzept §2.4, docs/konzepte/
   DESKTOP-UI-AUFRAEUMUNG_2026-08-13.md) — app-shell/views/adminTab.js
   ─────────────────────────────────────────────────────────────────────────
   DESKTOP-FREEZE, umgekehrte Richtung zum Bauplan-Paket-3-Block oben (dort
   erscheint mobile Chrome NUR unter html.view-mobile — hier verschwindet die
   bestehende Pillenleiste NUR unter html.view-desktop): auf Mobile/„Automatisch
   (schmal)" bleibt alles byte-identisch zum Vor-D2-Stand (Pillenleiste
   sichtbar, kein Grid, die Sidebar startet unsichtbar als Ausgangszustand vor
   jeder view-desktop-Klasse — auch bevor viewMode.js gelaufen ist).
   `.admin-tabbar` trägt SELBST ein Inline-`style="display:flex;…"`
   (adminTab.js _panelHtml()) — eine Stylesheet-Regel OHNE `!important` verliert
   gegen Inline-Styles IMMER (identische, bereits dokumentierte Fehlerklasse
   wie FN-277, s. `.admin-grid-header`-Block weiter oben in dieser Datei).

   ⚠️ Paket D-R2 (2026-08-20/21) — die Gruppen-SPALTE wandert auf Desktop zusätzlich aus
   diesem Content-Bereich in die neue Sidebar-Admin-Ebene (Block "PAKET D-R2" oberhalb,
   `adminTab.js sidebarGroupsData()`/`sidebar.js _refreshAdminGroups()` — „verschoben, nicht
   dupliziert", Bauplan §3). Die beiden `html.view-desktop`-Regeln direkt unter diesem Kommentar
   sind entsprechend GEÄNDERT gegenüber dem historischen D2-Stand (kein Grid/keine Spalte mehr,
   `.admin-sidebar-group`/`#adminSidebarNoResults` ausgeblendet) — NUR das Suchfeld
   (`.admin-sidebar-search`) bleibt auf Desktop sichtbar ("«Einstellung suchen» bleibt oben im
   Inhalt", Bauplan §3 wörtlich) und filtert seitdem zusätzlich die verschobene Sidebar-Kopie
   (Bridge über `H.sidebarFilterAdminGroups()`, s. adminTab.js `_adminSidebarFilter()`). Die
   MOBILE Regeln direkt darunter (Bauplan Paket 8/E11) sind von diesem Paket NICHT betroffen —
   dort zeigt `.admin-sidebar` weiterhin die volle Gruppen+Suche-Spalte wie am 2026-08-13/19
   gebaut, byte-identisch unangetastet (Desktop-Freeze in dieser Richtung: ein Desktop-Redesign
   darf Mobile nicht mitziehen). */
.admin-sidebar{display:none}
html.view-desktop .admin-tabbar{display:none!important}
html.view-desktop .admin-shell{display:block}
html.view-desktop .admin-sidebar{display:block;margin-bottom:10px}
html.view-desktop .admin-sidebar-group,html.view-desktop .admin-sidebar-no-results{display:none}
.admin-sidebar-search{
  width:100%;box-sizing:border-box;padding:7px 10px;margin-bottom:6px;font:inherit;font-size:12.5px;
  border:1px solid var(--panel-border);border-radius:8px;background:var(--panel);color:var(--text);
}
.admin-sidebar-group{display:flex;flex-direction:column;gap:2px;margin-bottom:10px}
.admin-sidebar-group-head{font-size:var(--fs-12);font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);padding:4px 6px 2px}
.admin-sidebar-item{width:100%;text-align:left;justify-content:flex-start;font-size:12.5px}
.admin-sidebar-no-results{font-size:12px;color:var(--muted);padding:8px 6px}
/* Bauplan Paket 8 (E11) — MOBILE-GEGENSTÜCK zu D2 direkt oberhalb: dieselbe Gruppen-Sidebar
   +Suche (`_sidebarHtml()`/`_adminSidebarFilter()`, adminTab.js — beide bereits view-mode-
   neutral, reines DOM/CSS-Toggle) ersetzt jetzt auch unter `html.view-mobile` die flache
   15-Pillen-Leiste (`.admin-tabbar`), exakt spiegelbildlich zur bestehenden Desktop-Regel.
   KEIN Grid nötig (anders als Desktop, kein `.admin-shell{display:grid}` hier) — `.admin-
   shell` behält seinen normalen Block-Fluss (nur das inline `padding:4px 2px` aus
   `_panelHtml()`), Sidebar+Content stapeln sich einfach vertikal, identisch zur bisherigen
   Pillenleiste+Content-Anordnung. `position:sticky`/`220px`-Spalte sind bewusst NICHT
   übernommen (kein Platz auf schmalem Viewport, volle Breite statt fixer Spalte). Touch-
   Zielgrösse der `.admin-sidebar-item`-Buttons ist bereits generisch abgedeckt (`.btn-small`
   unter `@media(pointer:coarse),(max-width:768px)` weiter oben in dieser Datei, min-
   height:44px) — nur das Suchfeld (kein `.btn`) bekommt hier zusätzlich explizit 44px,
   Muster `.staff-search`, aber bewusst NUR unter `view-mobile` (Desktop-Freeze — die
   Suchbox-Höhe auf Desktop bleibt unverändert). */
html.view-mobile .admin-tabbar{display:none!important}
html.view-mobile .admin-sidebar{display:flex;flex-direction:column;gap:4px}
html.view-mobile .admin-sidebar-search{min-height:44px}
/* ═══════════════════════════════════════════════════════════════════════
   Bauplan Paket 7 — Wunsch-Kalender (app-shell/views/vacationsTabCalendar.js).
   MOBILE-ONLY (Desktop-Freeze, s. dortiger Kopfkommentar) — kein `html.view-mobile`-Selektor
   nötig, das Modul togglet #shiftWishForm/#wishCalendarWrap selbst per JS (resolveViewMode()),
   identisches Prinzip wie D1/Cockpit/Heute-Hub (JS-gesteuerte Sichtbarkeit statt @media). */
.wish-cal-nav{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px}
.wish-cal-month-label{font-weight:700;font-size:14px}
/* Paket M-D (§5) — Kachel-Restyle: Icon-Kreis (Marken-Token, reine Deko — NICHT die Status-
   Anzeige, s. Kopfkommentar _budgetHtml()) + Text statt der vorherigen schlichten Info-Zeile. */
.wish-cal-budget{display:flex;align-items:center;gap:10px;font-size:var(--fs-12);color:var(--text-secondary);background:var(--panel);border:1px solid var(--panel-border);border-radius:var(--radius);padding:10px 12px;margin-bottom:8px}
.wish-cal-budget-icon{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:50%;background:var(--heute-mist);color:var(--heute-plum-deep);flex-shrink:0}
.wish-cal-budget-icon .ric{width:15px;height:15px}
.wish-cal-budget-text{font-weight:600}
/* Paket M-D (§5) — CTA "Neuen Wunsch erfassen": Bauplan §1 Regel 4 (Coral = einzige
   Aktionsfarbe), exakt die Prototyp-Spezifikation `.cta` (docs/konzepte/ROSIE-MOBILE-FINAL-
   V1PLUS_2026-08-19.html Z. 57) — Marken-Token statt Prototyp-Hex, sonst 1:1. */
.wish-cal-new-wish-cta{display:flex;align-items:center;justify-content:center;gap:8px;width:100%;min-height:44px;background:var(--heute-coral);color:#fff;font-weight:800;font-size:15px;border:none;border-radius:var(--radius);padding:14px;box-shadow:0 12px 26px -10px rgba(255,106,61,.55);cursor:pointer;margin-top:2px}
.wish-cal-new-wish-cta:hover{filter:brightness(1.05)}
.wish-cal-grid{margin-bottom:10px}
.wish-cal-weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:4px}
.wish-cal-weekday{text-align:center;font-size:var(--fs-12);font-weight:600;color:var(--muted)}
.wish-cal-days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}
.wish-cal-day{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;min-height:40px;padding:4px 2px;border-radius:8px;background:var(--bg);border:1px solid var(--panel-border);color:var(--text);font:inherit;font-size:12px;cursor:pointer}
.wish-cal-day:hover{border-color:var(--teal)}
.wish-cal-day--pad{opacity:.45}
.wish-cal-day--today{border-color:var(--teal);border-width:2px}
.wish-cal-day--holiday{color:var(--red)}
.wish-cal-day--vacation{background:var(--blue-dim)}
.wish-cal-day--conflict{box-shadow:inset 0 0 0 1px var(--amber)}
.wish-cal-day-num{font-weight:600}
.wish-cal-day-dots{display:flex;gap:2px;height:5px}
.wish-cal-dot{width:5px;height:5px;border-radius:50%;display:inline-block;flex-shrink:0}
.wish-cal-dot--final{background:var(--teal)}
.wish-cal-dot--wish{background:var(--amber)}
.wish-cal-dot--vacation{background:var(--blue)}
.wish-cal-legend{display:flex;flex-wrap:wrap;gap:10px;margin-bottom:10px;font-size:var(--fs-12);color:var(--muted)}
.wish-cal-legend-item{display:inline-flex;align-items:center;gap:4px}
.wish-cal-legend-item--holiday{color:var(--red)}
.wish-cal-sheet-note{padding:8px 10px;border-radius:8px;background:var(--panel);border:1px solid var(--panel-border);font-size:var(--fs-12);margin-bottom:8px}
.wish-cal-sheet-note--holiday{color:var(--red);border-color:var(--red)}
/* Paket M-D (§5, „Konflikt-Hinweis rot/Coral") — Coral als Warnfarbe (Bauplan-Wortlaut
   selbst: dieselbe Farbe in zwei Rollen, Warn- UND Aktionsfarbe). Kein `html.view-mobile`-
   Präfix nötig (dasselbe Prinzip wie der übrige Wunsch-Kalender-Block oben: JS-gesteuerte
   Sichtbarkeit, keine Desktop-Konsumentin dieser Klasse). */
.wish-cal-conflict-warn{padding:10px 12px;border-radius:8px;background:rgba(255,106,61,.10);border:1px solid var(--heute-coral);font-size:12px;color:var(--text);line-height:1.5;margin-bottom:8px}
.wish-cal-sheet-options{display:flex;flex-direction:column;gap:6px}
.wish-cal-sheet-opt{width:100%;justify-content:flex-start}
/* Bottom-anchored Sheet — dasselbe Muster wie dialog.ausfall-sheet (s. dortiger Kommentar für
   die volle Begründung), bewusst eine EIGENE Klasse statt Wiederverwendung (thematisch getrennte
   Features, unabhängig weiterentwickelbar). */
dialog.wish-cal-day-sheet{
  position:fixed;left:50%;bottom:0;top:auto;right:auto;transform:translateX(-50%);
  margin:0;width:100%;max-width:560px;max-height:88vh;overflow-y:auto;
  border:none;border-radius:16px 16px 0 0;background:var(--panel);color:var(--text);
  padding:14px 16px calc(14px + env(safe-area-inset-bottom));box-shadow:0 -8px 32px rgba(0,0,0,.28);
}
dialog.wish-cal-day-sheet::backdrop{background:rgba(0,0,0,.35)}
@media(max-width:600px){dialog.wish-cal-day-sheet{width:100%;max-width:none;left:0;transform:none}}
/* Fixwünsche-Karte-Status (renderMyWishes(), vacationsTabWishes.js) — "offen"/"übernommen". */
.wish-status-badge{font-size:var(--fs-12);font-weight:600;padding:1px 6px;border-radius:8px}
.wish-status-badge--open{background:var(--amber-dim);color:var(--amber)}
.wish-status-badge--adopted{background:var(--teal-dim);color:var(--teal)}
/* ═══════════════════════════════════════════════════════════════════════
   Paket M-D (§5) — Wunschliste (#myWishListItems, renderMyWishes() vacationsTabWishes.js).
   Zeilen sind INLINE-STYLE-`<div>`s ohne eigenen Klassennamen am Wrapper (s. dortiger
   Kopfkommentar) — strukturelle Selektoren + `!important` NUR auf den Properties, die den
   Inline-Stil überschreiben MÜSSEN (identisches, bereits etabliertes Muster wie FN-277
   `.admin-grid-header`, s. dortiger Kommentar für die volle Begründung: ein Inline-`style`-
   Attribut schlägt eine externe Regel ohne `!important` immer). `renderMyWishes()`s JS-Code
   selbst bleibt unangetastet (Bauplan-Vorgabe „reine Verschiebung/Restyling"). */
html.view-mobile #myWishListItems > div{
  background:var(--panel) !important;
  border:1px solid var(--panel-border) !important;
  border-radius:var(--radius) !important;
  padding:10px 12px !important;
  box-shadow:var(--e1);
}
/* `.wish-badge` ist eine APP-WEITE Klasse (Admin-Job-Listen u.a., mehrfach definiert weiter
   oben in dieser Datei) — Marken-Umfärbung deshalb eng auf den Wünsche-Tab-Kontainer gescopt,
   kein globaler Eingriff. `.wish-status-badge--open/--adopted` bleiben bewusst UNANGETASTET
   (Status-Farbe amber/teal, keine Marken-Aktionsfarbe — identisches Prinzip wie Paket M-C
   `.tc-count.tc-done`). */
html.view-mobile #myWishListItems .wish-badge{background:var(--heute-mist);color:var(--heute-plum-deep)}
/* FZ-B4 (Etappe 1) — feldgebundene Validierungsfehler, s. app-shell/a11y-form.js. Denselben
   Farbwert wie das bestehende #loginError/.prompt-input--err-Muster (var(--red), 12px) — kein
   neuer, ungeprüfter Kontrastwert. Höhere Selektor-Spezifität als `.form-group input`
   (0,2,1 statt 0,1,1), damit die rote Randfarbe unabhängig von der Reihenfolge im Stylesheet
   IMMER gewinnt, auch nach künftigen Umsortierungen. */
.field-error-text{display:block;margin-top:4px;font-size:var(--fs-12);color:var(--red);line-height:1.4}
.form-group input[aria-invalid="true"],.form-group select[aria-invalid="true"],.form-group textarea[aria-invalid="true"],
input[aria-invalid="true"],select[aria-invalid="true"],textarea[aria-invalid="true"]{border-color:var(--red)}

/* ══════════════════════════════════════════════════════════════════════════
   PAKET M-B Teil 1 (2026-08-20) — Planer-Sicht „Planung" (mobil, Planer/Admin)
   ARBEITSAUFTRAG-2026-08-19_MOBILE-V1PLUS-BAUPLAN.md §3 + §1 (Brand-Kit/V1 „Klar").
   Markup: app-shell/views/vacationsTabPlanung.js.

   DESKTOP-FREEZE: JEDE Regel dieses Blocks ist unter `html.view-mobile` gescopt — auf
   Desktop existiert der Container `#vacPlanungWrap` zwar im DOM, ist dort aber leer und
   display:none (s. vacationsTab.js PANEL_HTML); keine dieser Klassen greift je auf Desktop.

   FARBEN ausschliesslich aus dem bereits vorhandenen `--heute-*`-Marken-Namespace (Paket M-A,
   s. dortiger Block) — Coral = einzige Aktionsfarbe (CTA/Warn-Akzent), Plum = Struktur,
   Mist = ruhige Fläche. Keine neuen Token, keine Farb-Hardcodes (§1 Regel 1/4). Alle drei
   Farbmodi ziehen automatisch mit, weil ausschliesslich Token verwendet werden.
   ══════════════════════════════════════════════════════════════════════════ */
html.view-mobile #vacPlanungWrap{display:flex;flex-direction:column;gap:10px}
html.view-mobile .planung-head{display:flex;align-items:center;justify-content:space-between;gap:8px}
html.view-mobile .planung-head-title{font-size:17px;font-weight:800;color:var(--text)}

/* Segmented Control (§3a) — dieselbe Form wie der bereits etablierte 4c-Cockpit-Umschalter
   (.shift-desk-bereich-btn), nur im V1-Marken-Akzent statt der generischen Panel-Farben. */
html.view-mobile .planung-segments{display:flex;gap:6px;background:var(--panel);border:1px solid var(--panel-border);border-radius:var(--radius);padding:4px}
html.view-mobile .planung-segment{flex:1;display:flex;align-items:center;justify-content:center;gap:6px;min-height:44px;padding:8px 6px;border:none;border-radius:calc(var(--radius) - 3px);background:transparent;color:var(--text-secondary);font-size:var(--fs-12);font-weight:700;cursor:pointer}
html.view-mobile .planung-segment .ric{width:15px;height:15px;flex-shrink:0}
html.view-mobile .planung-segment.active{background:var(--heute-mist);color:var(--heute-plum-deep)}

/* KPI-Zeile (§3b) */
html.view-mobile .planung-kpis{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}
html.view-mobile .planung-kpi{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;background:var(--panel);border:1px solid var(--panel-border);border-radius:var(--radius);padding:10px 6px;text-align:center}
html.view-mobile .planung-kpi-value{font-size:19px;font-weight:800;color:var(--heute-plum);line-height:1.15}
html.view-mobile .planung-kpi-value--text{font-size:var(--fs-12);font-weight:800}
html.view-mobile .planung-kpi-label{font-size:var(--fs-12);color:var(--text-secondary);line-height:1.25}
html.view-mobile .planung-kpi--warn{border-color:var(--heute-coral);background:rgba(255,106,61,.08)}
html.view-mobile .planung-kpi--warn .planung-kpi-value{color:var(--heute-coral)}

/* KW-/Monats-Navigation (§3c) */
html.view-mobile .planung-range{display:flex;align-items:center;gap:8px;flex-wrap:wrap;background:var(--panel);border:1px solid var(--panel-border);border-radius:var(--radius);padding:6px 8px}
html.view-mobile .planung-range-nav{display:flex;align-items:center;justify-content:center;width:44px;min-height:44px;border:none;background:transparent;color:var(--heute-plum);cursor:pointer;border-radius:8px}
html.view-mobile .planung-range-nav .ric{width:18px;height:18px}
html.view-mobile .planung-range-label{flex:1;text-align:center;font-size:15px;font-weight:800;color:var(--text)}
html.view-mobile .planung-range-modes{display:flex;gap:4px}
html.view-mobile .planung-range-mode{min-height:44px;padding:8px 12px;border:1px solid var(--panel-border);background:transparent;color:var(--text-secondary);border-radius:999px;font-size:var(--fs-12);font-weight:700;cursor:pointer}
html.view-mobile .planung-range-mode.active{background:var(--heute-mist);border-color:transparent;color:var(--heute-plum-deep)}

/* Container für TEIL 2 (dichte Matrix + Werkzeugleiste, §3d/e) — bewusst ohne eigene Optik. */
html.view-mobile .planung-matrix-wrap{display:block}

/* Karten / Hinweise / CTA */
html.view-mobile .planung-card{background:var(--panel);border:1px solid var(--panel-border);border-radius:var(--radius);padding:12px 14px;font-size:var(--fs-12);color:var(--text);line-height:1.5}
html.view-mobile .planung-card-title{font-size:15px;font-weight:800;margin-bottom:4px}
html.view-mobile .planung-card-text{color:var(--text-secondary)}
html.view-mobile .planung-hint{display:flex;align-items:flex-start;gap:8px}
html.view-mobile .planung-hint-ic{flex-shrink:0;color:var(--heute-plum)}
html.view-mobile .planung-hint-ic .ric{width:16px;height:16px}
html.view-mobile .planung-empty{display:flex;align-items:center;gap:8px;color:var(--text-secondary)}
html.view-mobile .planung-empty .ric{width:16px;height:16px;color:var(--teal)}
html.view-mobile .planung-cta{display:flex;align-items:center;justify-content:center;gap:8px;width:100%;min-height:44px;background:var(--heute-coral);color:#fff;font-weight:800;font-size:15px;border:none;border-radius:var(--radius);padding:14px;box-shadow:0 12px 26px -10px rgba(255,106,61,.55);cursor:pointer}
html.view-mobile .planung-cta .ric{width:17px;height:17px}

/* „Zu erledigen"-Kurzliste — LESEND (die Entscheidungs-Aktionen bleiben im Dienste-Tab, volle
   Begründung im Kopfkommentar von vacationsTabPlanung.js). */
html.view-mobile .planung-todo-list{display:flex;flex-direction:column;gap:6px}
html.view-mobile .planung-todo-row{display:flex;align-items:center;gap:10px;background:var(--panel);border:1px solid var(--panel-border);border-left:3px solid var(--heute-plum-light);border-radius:var(--radius);padding:10px 12px}
html.view-mobile .planung-todo-kind{flex-shrink:0;font-size:var(--fs-12);font-weight:700;color:var(--heute-plum-deep);background:var(--heute-mist);border-radius:999px;padding:3px 9px}
html.view-mobile .planung-todo-main{display:flex;flex-direction:column;gap:2px;min-width:0}
html.view-mobile .planung-todo-title{font-size:var(--fs-12);font-weight:700;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
html.view-mobile .planung-todo-meta{font-size:var(--fs-12);color:var(--text-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* ══════════════════════════════════════════════════════════════════════════
   PAKET M-B Teil 2 (2026-08-20) — Planung: dichte Matrix · Werkzeugleiste · Sheets
   ARBEITSAUFTRAG-2026-08-19_MOBILE-V1PLUS-BAUPLAN.md §3d/e/f + §1 (Brand-Kit/V1 „Klar").
   Markup: app-shell/views/vacationsTabPlanungMatrix.js · -Toolbar.js · -BrushSheet.js.

   DESKTOP-FREEZE: jede Regel unter `html.view-mobile` gescopt — auf Desktop ist
   `#vacPlanungWrap` leer und display:none (vacationsTab.js PANEL_HTML), keine dieser Klassen
   greift dort je. Die WIEDERVERWENDETEN Klassen `.roster-zoom-*` und `.roster-hide-istsoll`
   (weiter oben in dieser Datei, für die Desktop-Matrix) sind bewusst NICHT angefasst — die
   Planung-Tabelle trägt sie zusätzlich, damit Zoom/IST-SOLL EIN Begriff bleiben.

   FARBEN ausschliesslich aus dem `--heute-*`-Marken-Namespace (Paket M-A) + den bestehenden
   Zustandsfarben (--red/--amber/--teal) für Ampel-Semantik. Coral ist die einzige
   AKTIONS-/Warnfarbe (§1 Regel 4), Plum die Struktur, Mist die ruhige Fläche.
   ══════════════════════════════════════════════════════════════════════════ */

/* ── Werkzeugleiste (§3e) — genau 5 sichtbare Werkzeuge, 44 px Touch-Ziel ──── */
html.view-mobile .planung-toolbar-wrap{display:block}
html.view-mobile .planung-tools{display:grid;grid-template-columns:repeat(5,1fr);gap:6px;background:var(--panel);border:1px solid var(--panel-border);border-radius:var(--radius);padding:5px}
html.view-mobile .planung-tool{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;min-height:44px;padding:6px 2px;border:none;border-radius:calc(var(--radius) - 3px);background:transparent;color:var(--text-secondary);cursor:pointer}
html.view-mobile .planung-tool .ric,html.view-mobile .planung-tool svg{width:18px;height:18px;flex-shrink:0}
html.view-mobile .planung-tool-lbl{font-size:var(--fs-12);font-weight:700;line-height:1.1;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
html.view-mobile .planung-tool.active{background:var(--heute-mist);color:var(--heute-plum-deep)}

/* ── Dichte Matrix (§3d) ─────────────────────────────────────────────────── */
html.view-mobile .planung-matrix-wrap{display:block}
html.view-mobile .planung-matrix-scroll{overflow-x:auto;overflow-y:visible;-webkit-overflow-scrolling:touch;background:var(--panel);border:1px solid var(--panel-border);border-radius:var(--radius)}
/* Während einer Zieh-Geste darf der Container nicht mitscrollen (sonst „rutscht" die Auswahl).
   Die Klasse setzt vacationsTabPlanungMatrix.js bereits in `pointerdown` — NICHT erst bei der
   Promotion zum Zug: `touch-action` wird laut Pointer-Events-Spec beim Gesten-START ausgewertet,
   eine Änderung mitten in der Geste käme für dieselbe Geste zu spät (identisches Vorgehen wie
   `.sq-drag-scroll-lock` / shiftsTabBrushDrag.js `_lockScroll(true)` weiter oben). */
html.view-mobile .planung-matrix-scroll.pm-dragging{touch-action:none;overscroll-behavior:contain}
/* Zweite, spec-sichere Ebene: ist ein Pinsel aktiv, gehört der Zell-Touch dem Malen — die
   Entscheidung fällt beim RENDERN (Klasse am Container), also garantiert vor jedem Gesten-Start.
   Kopfzeile, Namensspalte und der Cursor-Modus bleiben normal scrollbar. */
html.view-mobile .planung-matrix-scroll.pm-tool-active td[data-pm-cell]{touch-action:none}
html.view-mobile table.planung-matrix{border-collapse:separate;border-spacing:0;width:max-content;min-width:100%;font-size:var(--fs-12)}
html.view-mobile table.planung-matrix th,html.view-mobile table.planung-matrix td{border-bottom:1px solid var(--panel-border);border-right:1px solid var(--panel-border)}
html.view-mobile .pm-name{position:sticky;left:0;z-index:3;background:var(--panel);text-align:left;font-weight:700;white-space:nowrap;padding:4px 8px;min-width:104px;max-width:132px}
html.view-mobile thead .pm-name{z-index:4;color:var(--text-secondary);font-weight:800}
html.view-mobile .pm-name-txt{display:inline-block;max-width:104px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle}
html.view-mobile .pm-dot{display:inline-block;width:7px;height:7px;border-radius:50%;margin-right:5px;vertical-align:middle}
html.view-mobile .pm-day{min-width:36px;padding:4px 2px;text-align:center;background:var(--panel);color:var(--text-secondary);line-height:1.15}
html.view-mobile .pm-day-wd{display:block;font-size:var(--fs-12);font-weight:700}
html.view-mobile .pm-day-num{display:block;font-size:var(--fs-12);font-weight:800;color:var(--text)}
html.view-mobile .pm-day-cov{display:block;font-size:var(--fs-12);color:var(--text-secondary);opacity:.8}
html.view-mobile .pm-day--gap{background:rgba(255,106,61,.12)}
/* Heatmap (Overflow-Schalter) — dieselbe Drei-Stufen-Semantik wie die Desktop-Kopfzeile. */
html.view-mobile .pm-heat-low{background:var(--red-dim)}
html.view-mobile .pm-heat-mid{background:var(--amber-dim)}
html.view-mobile .pm-heat-ok{background:var(--teal-dim)}
/* „!"-Knopf: Lücken-Kennzeichnung in Coral, Tap öffnet den bestehenden E19-Ausfall-Flow. */
html.view-mobile .pm-gap-btn{display:block;margin:2px auto 0;min-width:24px;min-height:24px;border:none;border-radius:8px;background:var(--heute-coral);color:#fff;font-size:var(--fs-12);font-weight:900;line-height:1;cursor:pointer}
html.view-mobile .pm-cell{min-width:36px;height:38px;padding:1px;text-align:center;vertical-align:middle;cursor:pointer;background:var(--panel)}
html.view-mobile .pm-cell svg,html.view-mobile .pm-cell .ric{width:15px;height:15px}
html.view-mobile .pm-chip{display:inline-block;min-width:20px;padding:2px 5px;border-radius:4px;color:#fff;font-size:var(--fs-12);font-weight:800;line-height:1.15}
html.view-mobile .pm-stack{display:inline-flex;flex-direction:column;gap:1px;align-items:center}
html.view-mobile .pm-cell--abs{background:var(--red-dim)}
html.view-mobile .pm-cell--vac{background:var(--teal-dim)}
html.view-mobile .pm-cell--block{background:var(--purple)}
html.view-mobile .pm-cell--wish{background:var(--amber-dim)}
/* K-06/FN-368 Nachbesserung — Vor Anstellungsbeginn/Nach Austritt, spiegelt shiftsTabGrid.js
   renderDayCell (Desktop). Kein Klick-Handler (data-click fehlt bewusst), daher `cursor:default`. */
html.view-mobile .pm-cell--entrylock{background:repeating-linear-gradient(45deg,var(--gray-dim) 0 4px,transparent 4px 8px);cursor:default}
html.view-mobile .pm-wish{display:inline-block;width:8px;height:8px;border-radius:50%;background:var(--amber)}
/* Unterdeckter Tag, Zelle noch leer → dezenter Coral-Hinweis, wo Füllen am meisten hilft. */
html.view-mobile .pm-cell--gap{background:rgba(255,106,61,.07)}
html.view-mobile .pm-cell--picked{box-shadow:inset 0 0 0 2px var(--heute-coral)}
html.view-mobile .pm-cell--drag{box-shadow:inset 0 0 0 2px var(--heute-gold)}
html.view-mobile .pm-istsoll{position:sticky;right:0;z-index:3;background:var(--panel);min-width:74px;padding:3px 6px;text-align:center;font-size:var(--fs-12);font-weight:700;white-space:nowrap}
/* Bauplan 2d (Punkt 2, Rollen-Gliederung) — kompakte Gruppen-Trennzeile zwischen den
   Personal-Blöcken (Muster .dr3-group-row der Desktop-Matrix, aber leichter/schmaler passend
   zur Zelldichte dieser Matrix — keine eigene Hintergrundfarbe je Gruppe nötig, nur ein
   Text-Trenner). */
html.view-mobile .pm-group-row{background:var(--bg)}
html.view-mobile .pm-group-td{padding:2px 8px;font-size:var(--fs-12);font-weight:600;color:var(--muted);border-top:1px solid var(--panel-border);white-space:nowrap}
html.view-mobile thead .pm-istsoll{z-index:4;color:var(--text-secondary);font-weight:800}
html.view-mobile .pm-is-ok{color:var(--teal)}
html.view-mobile .pm-is-mid{color:var(--amber)}
html.view-mobile .pm-is-low{color:var(--red)}
html.view-mobile .pm-is-muted{color:var(--muted)}

/* ── Auswahl-Modus-Leiste ────────────────────────────────────────────────── */
html.view-mobile .planung-selbar{display:flex;align-items:center;gap:8px;background:var(--heute-mist);border-radius:var(--radius);padding:8px 10px}
html.view-mobile .planung-selbar-txt{flex:1;font-size:var(--fs-12);font-weight:700;color:var(--heute-plum-deep)}
html.view-mobile .planung-selbar-btn{min-height:44px;padding:8px 14px;border:1px solid var(--panel-border);background:var(--panel);color:var(--text);border-radius:999px;font-size:var(--fs-12);font-weight:700;cursor:pointer}
html.view-mobile .planung-selbar-btn--primary{background:var(--heute-coral);border-color:transparent;color:#fff}
html.view-mobile .planung-selbar-btn[disabled]{opacity:.5;cursor:default}

/* ── Bottom-Sheets (Filter · Overflow · Publizieren · Pinsel) ────────────────
   Muster + Geometrie 1:1 wie `dialog.ausfall-sheet` (s. dortiger Kommentar weiter oben für
   die volle Begründung), bewusst eigene Klasse statt Wiederverwendung — thematisch getrennte
   Features bleiben unabhängig weiterentwickelbar (identische Abwägung wie bei
   `dialog.wish-cal-day-sheet`, Paket 7). */
html.view-mobile dialog.planung-sheet{
  position:fixed;left:50%;bottom:0;top:auto;right:auto;transform:translateX(-50%);
  margin:0;width:100%;max-width:560px;max-height:88vh;overflow-y:auto;
  border:none;border-radius:16px 16px 0 0;background:var(--panel);color:var(--text);
  padding:14px 16px calc(14px + env(safe-area-inset-bottom));box-shadow:0 -8px 32px rgba(0,0,0,.28);
}
html.view-mobile dialog.planung-sheet::backdrop{background:rgba(0,0,0,.35)}
@media(max-width:600px){html.view-mobile dialog.planung-sheet{width:100%;max-width:none;left:0;transform:none}}
html.view-mobile .planung-sheet-head{display:flex;align-items:center;gap:8px;margin-bottom:10px}
html.view-mobile .planung-sheet-title{flex:1;font-size:17px;font-weight:800}
html.view-mobile .planung-sheet-close{display:flex;align-items:center;justify-content:center;width:44px;height:44px;border:none;background:transparent;color:var(--text-secondary);cursor:pointer;border-radius:10px}
html.view-mobile .planung-sheet-close .ric,html.view-mobile .planung-sheet-close svg{width:18px;height:18px}
html.view-mobile .planung-sheet-sub{font-size:var(--fs-12);font-weight:800;color:var(--text-secondary);margin:12px 0 6px}
html.view-mobile .planung-sheet-row{display:flex;align-items:center;gap:10px;width:100%;min-height:44px;padding:10px 12px;margin-bottom:6px;border:1px solid var(--panel-border);border-radius:var(--radius);background:var(--panel);color:var(--text);text-align:left;cursor:pointer}
html.view-mobile .planung-sheet-row[disabled]{opacity:.5;cursor:default}
html.view-mobile .planung-sheet-row-ic{display:flex;align-items:center;justify-content:center;width:30px;height:30px;flex-shrink:0;border-radius:50%;background:var(--heute-mist);color:var(--heute-plum)}
html.view-mobile .planung-sheet-row-ic .ric,html.view-mobile .planung-sheet-row-ic svg{width:16px;height:16px}
html.view-mobile .planung-sheet-row-main{display:flex;flex-direction:column;gap:2px;min-width:0}
html.view-mobile .planung-sheet-row-lbl{font-size:var(--fs-12);font-weight:700}
html.view-mobile .planung-sheet-row-sub{font-size:var(--fs-12);color:var(--text-secondary);line-height:1.35}
html.view-mobile .planung-sheet-more{display:flex;align-items:center;justify-content:center;gap:8px;width:100%;min-height:44px;margin-top:8px;border:1px solid var(--panel-border);border-radius:var(--radius);background:var(--panel);color:var(--heute-plum);font-size:var(--fs-12);font-weight:700;cursor:pointer}
html.view-mobile .planung-sheet-more .ric,html.view-mobile .planung-sheet-more svg{width:16px;height:16px}

/* ── Filter-Chips ────────────────────────────────────────────────────────── */
html.view-mobile .planung-filter-chips{display:flex;flex-wrap:wrap;gap:6px}
html.view-mobile .planung-filter-chip{min-height:44px;padding:8px 14px;border:1px solid var(--panel-border);border-radius:999px;background:var(--panel);color:var(--text-secondary);font-size:var(--fs-12);font-weight:700;cursor:pointer}
html.view-mobile .planung-filter-chip.active{background:var(--heute-mist);border-color:transparent;color:var(--heute-plum-deep)}

/* ── Pinsel-Sheet ───────────────────────────────────────────────────────── */
html.view-mobile .planung-brush-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:6px}
html.view-mobile .planung-brush-chip{display:flex;align-items:center;gap:8px;min-height:44px;padding:8px 10px;border:1px solid var(--panel-border);border-radius:var(--radius);background:var(--panel);color:var(--text);text-align:left;cursor:pointer}
html.view-mobile .planung-brush-chip.active{border-color:var(--heute-coral);background:rgba(255,106,61,.10)}
html.view-mobile .planung-brush-chip--erase.active{border-color:var(--red)}
html.view-mobile .planung-brush-ic{display:flex;align-items:center;justify-content:center;width:26px;height:26px;flex-shrink:0}
html.view-mobile .planung-brush-ic .ric,html.view-mobile .planung-brush-ic svg{width:16px;height:16px}
html.view-mobile .planung-brush-sw{display:inline-flex;align-items:center;justify-content:center;min-width:24px;height:22px;padding:0 5px;border-radius:5px;color:#fff;font-size:var(--fs-12);font-weight:800}
html.view-mobile .planung-brush-lbl{font-size:var(--fs-12);font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
html.view-mobile .planung-brush-foot{display:flex;align-items:center;gap:8px;margin-top:14px;padding-top:10px;border-top:1px solid var(--panel-border)}
html.view-mobile .planung-brush-foot-lbl{flex:1;font-size:var(--fs-12);color:var(--text-secondary)}
html.view-mobile .planung-undoredo{display:inline-flex;gap:6px}
html.view-mobile .planung-undoredo .btn{min-width:44px;min-height:44px}

/* ── Publizieren-Sheet ──────────────────────────────────────────────────── */
html.view-mobile .planung-pub-state{display:flex;align-items:center;gap:8px;flex-wrap:wrap;background:var(--heute-mist);border-radius:var(--radius);padding:10px 12px;margin-bottom:10px}
html.view-mobile .planung-pub-month{font-size:15px;font-weight:800;color:var(--heute-plum-deep)}
html.view-mobile .planung-pub-scope{flex:1;font-size:var(--fs-12);color:var(--heute-plum);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
html.view-mobile .planung-pub-badge{font-size:var(--fs-12);font-weight:800;color:var(--text-secondary);background:var(--panel);border-radius:999px;padding:3px 10px}
html.view-mobile .planung-pub-badge.is-pub{background:var(--teal);color:#fff}
html.view-mobile .planung-pub-actions{display:flex;gap:8px;align-items:center;margin-top:10px}
html.view-mobile .planung-pub-actions .planung-sheet-more{flex:1;margin-top:0}
html.view-mobile .planung-pub-actions .planung-cta{flex:1}

/* ════════ Bauplan Paket M-F (2026-08-20): Team-Tab „V1 Klar" ════════
   Bauplan §7/§1. Markup: app-shell/views/staffTab.js (+ staffTabBackLink.js; die drei
   Companion-Module Mutterschutz/ICS/Austritt rendern in DENSELBEN `#staffDetailBody` und
   erben die Politur unten automatisch). Volle Herleitung + die bewusst NICHT gemachten
   Dinge (Emoji-Sweep in staffTab.js — Desktop+Mobile geteiltes Markup, FN-279-Klasse):
   docs/audit/BACKLOG.md „Paket M-F". Gate: tests/paket-m-f-team-tab-restyle.test.js.

   REGELN (wie M-C/M-D/M-E): (1) DESKTOP-FREEZE — jede Regel `html.view-mobile`-gescopt;
   einzige Ausnahme ist `.staff-back-more{display:none}`, die das neue Element VERSTECKT
   und damit den Freeze selbst herstellt. (2) Anker nur staffTab-eigene Klassen/IDs — ein
   blankes `.btn`/`.detail-row` hätte app-weit gegriffen. (3) `!important` NUR gegen echte
   Inline-`style`-Werte (FN-277-Muster). (4) `--heute-*` ist nicht theme-abhängig: nur als
   fixes Paar (mist-Grund + plum-Text) oder translucente Lavur, nie deckend unter fremdem
   Text (M-E-Lehre). (5) STATUS-Farben unangetastet: `.staff-status-*` (teal/red/amber),
   `.staff-pk-reminder` (Art. 12 ArGV 2 / FN-126 — amber ist dort eine RECHTLICHE
   Warnstufe, bekommt nur Form) und `.del-btn` (destruktiv). */

/* ── (0) Rückweg ins «Mehr»-Overlay (staffTabBackLink.js, Bauplan §7). ── */
.staff-back-more{display:none}
html.view-mobile .staff-back-more{
  display:inline-flex;align-items:center;gap:6px;min-height:44px;padding:0 14px 0 10px;
  margin:0 0 10px;border:1px solid var(--panel-border);border-radius:999px;
  background:var(--panel);color:var(--text);font:inherit;font-size:var(--fs-12);
  font-weight:700;cursor:pointer;
}
html.view-mobile .staff-back-more:hover,
html.view-mobile .staff-back-more:active{border-color:var(--heute-coral)}
html.view-mobile .staff-back-more .staff-back-more-ico{display:inline-flex;align-items:center}
html.view-mobile .staff-back-more .ric{width:16px;height:16px}

/* ── (1) Mein-Profil-Karte (§7) — schon seit Paket 9 `.heute-hub-card`, hier nur
   V1-Feinschliff. Ihr Avatar war UNGESTYLT (die Grössen-Regel im Repo ist auf
   `.staff-card` gescopt, die Profil-Karte ist keine) — der Kreis fiel auf Textgrösse
   zusammen. ── */
html.view-mobile #staffMyProfileCard{border-radius:var(--radius-lg)}
html.view-mobile #staffMyProfileCard .staff-avatar{
  width:44px;height:44px;border-radius:50%;display:flex;align-items:center;
  justify-content:center;font-size:15px;font-weight:800;color:#fff;flex-shrink:0;
  box-shadow:0 0 0 2px rgba(251,241,231,.35);
}
html.view-mobile #staffMyProfileCard .ric{width:18px;height:18px;opacity:.8;flex-shrink:0}

/* ── (2) Kopfzeile (Admin) + Suche ── */
html.view-mobile #staffAdminBtnRow .btn{min-height:44px;border-radius:12px}
html.view-mobile #staffAdminBtnRow .btn-primary{
  background:var(--heute-coral);border-color:var(--heute-coral);color:#fff;font-weight:800;
}
html.view-mobile #staffAdminBtnRow .btn-primary:hover{filter:brightness(1.05)}
html.view-mobile .staff-search{border-radius:12px}
html.view-mobile .staff-search:focus{
  border-color:var(--heute-coral);box-shadow:0 0 0 3px rgba(255,106,61,.18);
}

/* ── (3) MA-Karten-Liste (§7) ── */
html.view-mobile .staff-card{border-radius:var(--radius-lg);padding:12px 14px}
html.view-mobile .staff-card:hover,
html.view-mobile .staff-card:active{border-color:var(--heute-coral);transform:none}
html.view-mobile .staff-card .staff-avatar{
  width:40px;height:40px;font-size:14px;box-shadow:0 0 0 2px var(--heute-mist);
}
html.view-mobile .staff-card .staff-name-block .name{font-size:13px}
html.view-mobile .staff-card .staff-role{color:var(--text-secondary)}
/* Touch-Ziele: die Aktions-Knöpfe sassen bei 4px/10px Padding unter 44px. */
html.view-mobile .staff-card .staff-actions{gap:8px}
html.view-mobile .staff-card .staff-actions button{
  min-width:44px;min-height:44px;display:inline-flex;align-items:center;
  justify-content:center;padding:0;border-radius:12px;
}
/* Coral = einzige Aktionsfarbe (Regel 4). `!important`, weil Bearbeiten-/Einladen-Knopf
   ihre Farbe im Inline-`style` tragen. `.del-btn` bleibt rot (Regel 5). */
html.view-mobile .staff-card .staff-actions .edit-btn{
  background:rgba(255,106,61,.14);color:var(--heute-coral) !important;
}
html.view-mobile .staff-card .staff-actions .edit-btn:hover{
  background:var(--heute-coral);color:#fff !important;
}
/* „Nachricht"-Knopf der Kollegen-Karte — Höhe/Radius sitzen im Inline-Stil. */
html.view-mobile .staff-card .btn.btn-outline{
  min-height:44px !important;padding:0 12px !important;border-radius:12px;
}
html.view-mobile .staff-empty{
  background:var(--panel);border:1px dashed var(--panel-border);
  border-radius:var(--radius-lg);padding:20px;
}
html.view-mobile .staff-more-btn{border-radius:12px}

/* ── (4) Compliance-Hinweise (§7) — beide Zeilen tragen ihr Styling inline, daher
   `!important` (Regel 3). Unvollständig-Hinweis wird Marken-Kachel (mist+plum, Regel 4);
   der Personenkreis-Banner behält amber und bekommt nur Form (Regel 5). ── */
html.view-mobile .staff-reminder-row{
  background:var(--heute-mist) !important;color:var(--heute-plum) !important;
  border-radius:var(--radius-lg);padding:9px 12px !important;
}
html.view-mobile .staff-reminder-row .ric{width:15px;height:15px;flex-shrink:0}
html.view-mobile .staff-pk-reminder{
  border-radius:var(--radius-lg) !important;border-left-width:4px !important;
  padding:10px 12px !important;
}
html.view-mobile .staff-pk-reminder .ric{width:15px;height:15px;flex-shrink:0}

/* ── (5) Rollen-Zeilen: die beiden CSS-Emoji (`content:'🟢'`/`content:'📋 + '`, oben in
   dieser Datei) mobil durch gezeichnete Punkte ersetzt (§1 Regel 2). `currentColor` statt
   eigenem Farbwert — folgt der Rollen-Farbe, kontrastrichtig in allen 3 Modi. ── */
html.view-mobile .staff-role-primary::before{
  content:'';width:7px;height:7px;border-radius:50%;background:currentColor;flex-shrink:0;
}
html.view-mobile .staff-role-secondary::before{
  content:'';width:5px;height:5px;border-radius:50%;background:currentColor;
  flex-shrink:0;opacity:.7;
}

/* ── (6) Detail-Ansicht (§7) — die `.detail-*`-Klassen hatten im Modal GAR KEINE Regel
   (das Repo stylt sie nur unter `.staff-card .staff-details`, und das Modal ist keine
   `.staff-card`). Anker `#staffDetailBody`: eng genug für die app-weiten Klassennamen,
   breit genug, dass Mutterschutz/ICS/Austritt automatisch mitziehen. ── */
html.view-mobile #staffDetailBody .detail-row{
  display:flex;justify-content:space-between;align-items:baseline;gap:12px;padding:9px 0;
  border-bottom:1px solid var(--panel-border);font-size:var(--fs-12);
}
html.view-mobile #staffDetailBody .detail-row:last-child{border-bottom:none}
html.view-mobile #staffDetailBody .detail-label{
  color:var(--muted);display:inline-flex;align-items:center;gap:6px;flex-shrink:0;
}
html.view-mobile #staffDetailBody .detail-label .ric{width:14px;height:14px}
html.view-mobile #staffDetailBody .detail-value{
  font-weight:700;color:var(--text);text-align:right;word-break:break-word;
}
html.view-mobile #staffDetailBody .detail-section-title{
  display:flex;align-items:center;gap:6px;margin:14px 0 6px;padding:6px 10px;
  border-radius:999px;background:var(--heute-mist);color:var(--heute-plum-deep);
  font-size:var(--fs-12);font-weight:800;text-transform:uppercase;letter-spacing:.04em;
}
html.view-mobile #staffDetailBody .detail-section-title .ric{width:14px;height:14px}
html.view-mobile #staffDetailBody .btn{min-height:44px}
/* ════════════════ Ende Paket M-F ════════════════ */

/* ════════ Bauplan Paket M-E (2026-08-20): Meldungen-Tab „V1 Klar" ════════
   Bauplan §6/§1. REINES CSS — `app-shell/views/messagesTab.js` ist byte-identisch:
   die Datei rendert EIN Markup für Desktop+Mobile (kein Breakpoint-Fork) UND hat 0 Zeilen
   Kopfraum in anti-monolith-baseline.json. Muster wie M-C/M-D.
   REGELN dieses Blocks: (1) alles `html.view-mobile`-gescopt (Desktop-Freeze); (2) Anker nur
   messagesTab-eigene Klassen bzw. `#alertEditorCard` — der Alert-Editor nutzt app-weite
   Klassen (.card/.btn-primary), ein blanker Selektor träfe die ganze App; (3) `!important`
   nur gegen echte Inline-`style`-Werte (FN-277-Muster); (4) `--heute-*` ist NICHT
   theme-abhängig — Marken-Farbe nur als FIXES Paar (mist/cream-Grund + plum-Text) oder als
   translucente Lavur, nie deckend unter fremdem Text. Gate: tests/paket-m-e-messages-
   restyle.test.js. Volle Herleitung: docs/audit/BACKLOG.md „Paket M-E".
   `#alertEditorCard` behält `data-requires="scheduler"` unverändert. */

/* ── Konversationsliste — `display:flex` aktiviert nebenbei das im Markup längst
   vorhandene `margin-left:auto` des „Neue"-Buttons (bisher wirkungslos). ── */
html.view-mobile .conversation-list{border-radius:var(--radius-lg)}
html.view-mobile .conversation-list .conv-head{
  display:flex;align-items:center;gap:8px;min-height:44px;
  background:var(--heute-mist);color:var(--heute-plum-deep);border-bottom-color:transparent;
}
html.view-mobile .conversation-list .conv-head > .ric{
  box-sizing:content-box;width:15px;height:15px;padding:6px;border-radius:50%;
  background:var(--heute-plum-deep);color:var(--heute-cream);flex-shrink:0;
}
html.view-mobile .conversation-list .conv-head .btn-primary{
  background:var(--heute-coral);border-color:var(--heute-coral);color:#fff;
}
html.view-mobile .conversation-list .conv-search input{border-radius:999px;padding:9px 12px;min-height:38px}
html.view-mobile .conversation-list .conv-search input:focus{border-color:var(--heute-coral)}
html.view-mobile .conv-item{min-height:56px;padding:10px 12px;gap:10px}
/* Lavur statt deckendem `--heute-mist`: der Zeilentext ist theme-abhängig und brach darauf
   im Dunkel-Modus real auf 1.1:1 ein (live gemessen). Lavur = 13.8:1. Muster wie M-C. */
html.view-mobile .conv-item:hover,
html.view-mobile .conv-item:active{background:rgba(255,106,61,.10)}
html.view-mobile .conv-item.active{background:rgba(255,106,61,.14);border-left:3px solid var(--heute-coral)}
/* `--muted` hat auf einer getönten Zeile kaum Reserve (gemessen 4.3:1, Hell) — auf der
   hervorgehobenen Zeile deshalb eine Stufe kräftiger. Gilt schon für die Bestands-Tönung
   (`--teal-dim`), ist also eine Verbesserung gegenüber vorher, keine Kompensation. */
html.view-mobile .conv-item.active .conv-preview{color:var(--text-secondary)}
html.view-mobile .conv-item .conv-avatar{width:38px;height:38px}
/* Ungelesen: Gewicht statt Farbe — eine Marken-Textfarbe wäre auf dem theme-abhängigen
   Zeilengrund nicht in allen drei Modi lesbar (s. Farbregel im Kopf). */
html.view-mobile .conv-item.has-unread .conv-info .conv-name{font-weight:800}
/* Zähler-Pille: Coral (§1 Regel 4) statt `--red`, das im Brand-Kit nicht vorkommt.
   `!important` nur auf `background` — nur dieser Wert steht inline im Markup. */
html.view-mobile .conv-item > .badge{
  background:var(--heute-coral) !important;color:#fff;
  display:inline-flex;align-items:center;justify-content:center;
  min-width:20px;height:20px;padding:0 6px;border-radius:999px;
  font-size:var(--fs-12);font-weight:800;
}
/* Archivieren-Knopf auf Daumengrösse (Bauplan §1/AK-Cleanup-Präzedenz Paket 6). */
html.view-mobile .conv-item > button.btn{min-width:44px;min-height:44px;justify-content:center}

/* ── Chat-Ansicht — `> span` hebt die direkten Kinder auf Plum (eines trägt inline
   `--muted`, auf dem Marken-Band zu schwach); NUR direkte Kinder, damit der
   Zurück-`<button>` seine Coral-Akzentfarbe behält. ── */
html.view-mobile .chat-view{border-radius:var(--radius-lg)}
html.view-mobile .chat-view .chat-head{
  display:flex;align-items:center;gap:6px;min-height:44px;
  background:var(--heute-mist);color:var(--heute-plum-deep);border-bottom-color:transparent;
}
html.view-mobile .chat-view .chat-head > span{color:var(--heute-plum) !important}
html.view-mobile .chat-back-btn{color:var(--heute-coral);min-width:44px;min-height:44px;justify-content:center;padding:0;margin-right:0}
html.view-mobile .chat-view .chat-messages{padding:12px;gap:9px}
html.view-mobile .chat-msg{border-radius:14px;max-width:84%}
/* Plum+Cream = 11:1 in allen drei Modi, statt theme-abhängigem `--teal`+`#fff`
   (im Hell-Modus nur knapp über AA) — Lesbarkeitsgewinn, nicht nur Farbwechsel. */
html.view-mobile .chat-msg.sent{background:var(--heute-plum);color:var(--heute-cream);border-bottom-right-radius:5px}
html.view-mobile .chat-msg.received{border-bottom-left-radius:5px}

/* ── Anhänge — `_renderMsgAttachment()` setzt Rahmen/Radius/Grund vollständig inline,
   daher `!important` genau auf diesen Properties. ── */
html.view-mobile .chat-msg .msg-media{border-radius:12px !important}
html.view-mobile .chat-msg .msg-audio{width:100%}
html.view-mobile .chat-msg .msg-file{
  border-radius:12px !important;background:var(--panel) !important;
  border-color:var(--panel-border) !important;min-height:44px;
}
html.view-mobile .chat-msg .msg-media-pending{
  border-radius:12px !important;background:var(--heute-mist) !important;
  border-color:transparent !important;color:var(--heute-plum) !important;
}

/* ── Eingabe + Empfänger-Leiste. Die Leiste behält bewusst ihren theme-abhängigen
   `--bg`-Grund: ihr Inhalt ist fremdgerendert (Chips + inline-`--muted`-Leerzustand),
   ein Marken-Band hätte dort keine abgeschlossene Kinderliste zum Nachfärben. ── */
html.view-mobile .chat-view .chat-input{padding:10px 12px}
html.view-mobile .chat-view .chat-input .recipient-panel{border-radius:var(--radius)}
html.view-mobile .chat-view .chat-input .recipient-panel .rec-chip{border-radius:999px;min-height:28px}
html.view-mobile .chat-view .chat-input .recipient-panel .rec-chip.selected{
  background:var(--heute-plum);border-color:var(--heute-plum);color:var(--heute-cream);
}
html.view-mobile .chat-view .chat-input input[type="text"],
html.view-mobile .chat-view .chat-input textarea{border-radius:14px}
html.view-mobile .chat-view .chat-input input[type="text"]:focus,
html.view-mobile .chat-view .chat-input textarea:focus{border-color:var(--heute-coral)}
/* Anhang-/Sprache-Knopf: `:not(.recipient-panel)` grenzt die Aktionszeile von der
   Empfänger-Leiste ab (beide sind Flex-Kinder von `.chat-input`, nur letztere hat eine
   eigene Klasse) — ohne das würde auch „+ Empfänger" auf 44px Höhe aufgeblasen. */
html.view-mobile .chat-view .chat-input > div:not(.recipient-panel) > .btn-outline{
  min-width:44px;min-height:44px;justify-content:center;border-radius:14px;
}
/* Senden = die eine Aktion dieses Bildschirms → Coral (§1 Regel 4). `background` per
   `!important` gegen den inline gesetzten `--teal`-Wert im Markup. */
html.view-mobile .chat-view .chat-input .send-btn{
  background:var(--heute-coral) !important;color:#fff;
  border-radius:14px;min-height:44px;font-weight:800;
  box-shadow:0 10px 22px -12px rgba(255,106,61,.6);
}

/* ── Alert-Editor (nur Planer/Admin, Gate unverändert). `.card-head` trägt app-weit eine
   Teal-Tönung + `::before`-Linie (P7) — hier nur innerhalb dieser ID auf die Marke
   umgestellt, als Lavur, damit `--text`/`--muted` darauf in allen Modi lesbar bleiben.
   Der Icon-Kreis sitzt direkt auf dem `<svg class="ric">`: `sweepIconPlaceholders()`
   ERSETZT den `<span data-ric>`, ein Wrapper-Selektor existiert danach nicht mehr. ── */
html.view-mobile #alertEditorCard{border-radius:var(--radius-lg);border-left:3px solid var(--heute-coral)}
html.view-mobile #alertEditorCard .card-head{
  background:linear-gradient(180deg,rgba(79,58,130,.14) 0%,transparent 100%);
}
html.view-mobile #alertEditorCard .card-head::before{
  background:linear-gradient(180deg,var(--heute-coral) 0%,transparent 100%);opacity:.9;
}
html.view-mobile #alertEditorCard .card-title > .ric{
  box-sizing:content-box;width:14px;height:14px;padding:6px;border-radius:50%;
  background:var(--heute-mist);color:var(--heute-plum-deep);vertical-align:-.75em;
}
html.view-mobile #alertEditorCard .form-group input,
html.view-mobile #alertEditorCard .form-group select,
html.view-mobile #alertEditorCard .form-group textarea{border-radius:var(--radius-sm)}
html.view-mobile #alertEditorCard .btn-primary{
  background:var(--heute-coral);border-color:var(--heute-coral);color:#fff;
  min-height:44px;font-weight:800;
}
html.view-mobile #alertEditorCard .btn-primary:hover{filter:brightness(1.05)}
/* ════════════════ Ende Paket M-E ════════════════ */
/* ═══════════════════════════════════════════════════════════════════════
   DESKTOP-BAUPLAN «RUHE · EBENEN», PAKET D-R3 — Dienstplan-Ansicht
   (ARBEITSAUFTRAG-2026-08-20_DESKTOP-RUHE-EBENEN-BAUPLAN.md §4,
   app-shell/views/shiftsTabDesktopMatrix.js + shiftsTabGrid.js + shiftsTab.js)
   ─────────────────────────────────────────────────────────────────────────
   Rein additiv, konsequent `html.view-desktop`-gescoped (Mobile-Freeze) — bestehende
   Matrix-Zell-/Zeilen-/Kopf-Markup bleibt UNVERÄNDERT, diese Regeln fügen nur eine neue
   optische Schicht hinzu (neue Klassen, s. shiftsTabGrid.js-Diff) bzw. blenden auf Desktop
   REDUNDANT gewordene Alt-Elemente aus (nie entfernt — s. Kopfkommentare dort, `!important`
   nur wo ein Inline-`style` sonst gewinnen würde, identische, bereits etablierte Fehlerklasse
   wie FN-277/D2 oben in dieser Datei). Farben ausschliesslich `--heute-*`-Marken-Token (§1.1) —
   Coral bleibt die EINE Aktionsfarbe (Publizieren), Gold der Aktiv-/Highlight-Akzent. */

/* ── Kopf: Status-Badge + Segmented KW|Monat|Heatmap (§4 „Kopf") ── */
.dr3-status-badge{
  display:none; /* Default: leer/mobil-unsichtbar, s. shiftsTabPublish.js _updateDesktopStatusBadge() */
  align-items:center;font-size:var(--fs-12);font-weight:800;padding:3px 10px;border-radius:999px;
  white-space:nowrap;margin-left:2px;
}
html.view-desktop .dr3-status-badge:not(:empty){display:inline-flex}
html.view-desktop .dr3-status-badge.is-draft{background:var(--heute-mist);color:var(--heute-plum-deep)}
html.view-desktop .dr3-status-badge.is-published{background:rgba(20,184,166,.16);color:var(--teal)}

.dr3-segmented{display:none}
html.view-desktop .dr3-segmented{
  display:inline-flex;align-items:center;gap:2px;background:var(--heute-mist);border-radius:999px;
  padding:2px;margin-left:6px;
}
html.view-desktop .dr3-seg-btn{
  border:none;background:none;color:var(--heute-plum-deep);font-size:var(--fs-12);font-weight:700;
  padding:4px 12px;border-radius:999px;cursor:pointer;min-height:26px;transition:background .14s,color .14s;
}
html.view-desktop .dr3-seg-btn:hover{background:rgba(59,42,99,.1)}
html.view-desktop .dr3-seg-btn.active{background:var(--heute-plum);color:var(--heute-cream)}
.preset-rose html.view-desktop .dr3-seg-btn.active,
html.view-desktop .preset-rose .dr3-seg-btn.active{background:var(--muted);color:var(--heute-cream)}

/* ── #sqPublishSlot (Relocate-Ziel, s. shiftsTabDesktopMatrix.js _syncPublishWrapPosition()) —
   der Coral-CTA selbst kommt unverändert aus shiftsTabPublish.js renderPublishControl(), hier
   nur die Kopf-Positionierung. Leer auf Mobile (Slot bleibt dort ungenutzt). ── */
html.view-desktop #sqPublishSlot:not(:empty){display:inline-flex;align-items:center;gap:6px;margin-left:auto}
html.view-desktop #sqPublishWrap:not(:empty){display:inline-flex !important} /* Inline-style="display:none" der Grundform überschreiben, sobald relocated+befüllt (FN-277-Muster) — `:not(:empty)`-Guard wie die Zeile darüber: renderPublishControl() (shiftsTabPublish.js) setzt für Nicht-Planer-Rollen sowohl display:none ALS AUCH innerHTML='' — ohne diesen Guard hätte der !important-Zwang die JS-seitige Rollen-Sperre strukturell überschrieben, sobald das leere Element je Rahmen/Hintergrund bekäme */

/* ── Card-Kopf: auf Desktop verhindert flex-wrap ein hässliches Umbrechen zwischen Titel/
   Badge/Segmented/Filtern/Publish-CTA bei normaler Fensterbreite (>1280px) — bei sehr schmalem
   Desktop-Fenster (Rail-Start-Schwelle, s. sidebar.js DESKTOP_RAIL_START_WIDTH) darf es wie
   gehabt umbrechen, deshalb keine harte `nowrap`-Regel, nur ein grosszügigerer `gap`. ── */
html.view-desktop .shift-card-head{row-gap:8px}
/* D-R3: die 4 Alt-Aktionsbuttons (Reload/PDF/JPG/ICS) leben auf Desktop im neuen Overflow-Menü
   (s.u.) — hier nur ausgeblendet, NICHT entfernt (Mobile bleibt byte-identisch, s.
   shiftsTab.js-Kopfkommentar an dieser Stelle). */
html.view-desktop .shift-head-actions{display:none}
/* D-R3: Jahr-Sprünge wandern ins Overflow-Menü — dieselbe Ausblend-statt-Entfernen-Disziplin. */
html.view-desktop .calendar-nav .dr3-year-nav{display:none}

/* ── EINE Werkzeugzeile: Kompakt-KPIs + Overflow-Trigger (§4) ──
   2c-Konsolidierung: `.dr3-kpi-overflow-row` ist keine eigene, gestapelte zweite Zeile mehr —
   shiftsTabGrid.js setzt sie jetzt per String-Replace AN DAS RECHTE ENDE der EINEN bestehenden
   Titel-/Werkzeugzeile ein (die selbst bereits `display:flex;justify-content:flex-end` ist),
   darum hier nur noch `inline-flex` als EIN Flex-Item unter Geschwistern, kein eigener
   Block-Rhythmus (margin/padding) mehr nötig. Leichter Hinweistext-Stil (`.hint` im
   Desktop-Prototyp nutzt `font-size:11.5px`, aber R-32/FN-89 verbietet Schrift < 12px
   repo-weit — `var(--fs-12)` ist die kleinste zulässige Stufe, optisch kaum unterscheidbar)
   statt der vormaligen „schweren" Pills (Hintergrund/Padding/border-radius) — exakt Flos
   Vorgabe „gleiche Grösse wie im Prototyp", innerhalb der Lesbarkeits-Konvention. `.dr3-kpi`
   deckt sowohl `<span>` (Abdeckung/IST/Saldo/Speicherstand) als auch das neue klickbare
   `<button>` (Lücken, s. renderDesktopKpiRow()) ab — Browser-Default-Button-Chrome wird darum
   explizit zurückgesetzt (border/background/padding/font). */
.dr3-kpi-overflow-row{display:none}
html.view-desktop .dr3-kpi-overflow-row{display:inline-flex;align-items:center;flex-wrap:wrap;gap:6px 10px}
.dr3-kpi-row{display:flex;align-items:center;flex-wrap:wrap;gap:4px 8px}
.dr3-kpi{
  font:inherit;font-size:var(--fs-12);color:var(--muted);white-space:nowrap;
  background:none;border:none;padding:0;margin:0;cursor:default;
}
.dr3-kpi--warn{color:var(--heute-coral)}
.dr3-kpi-gap-btn{cursor:pointer;text-decoration:underline;text-decoration-style:dotted;text-underline-offset:2px}
.dr3-kpi-gap-btn:hover,.dr3-kpi-gap-btn:focus-visible{color:var(--heute-coral)}
.dr3-kpi-savestate{color:var(--muted)}
.dr3-kpi-savestate.is-pending{color:var(--heute-coral)}
@media (prefers-reduced-motion:no-preference){
  .dr3-kpi-savestate.is-pending{animation:dr3-savestate-pulse 1.4s ease-in-out infinite}
}
@keyframes dr3-savestate-pulse{0%,100%{opacity:1}50%{opacity:.55}}

/* ── Overflow-„⋯"-Menü ── */
.dr3-overflow-wrap{position:relative;display:inline-flex}
.dr3-overflow-trigger{font-size:15px;font-weight:900;line-height:1;padding:3px 10px;border-radius:999px}
.dr3-overflow-panel{
  position:absolute;top:calc(100% + 4px);right:0;z-index:40;min-width:220px;
  background:var(--panel);border:1px solid var(--panel-border);border-radius:var(--radius);
  box-shadow:0 14px 34px -16px rgba(36,22,64,.32);padding:6px;display:flex;flex-direction:column;gap:1px;
}
.dr3-overflow-group-label{font-size:var(--fs-12);font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);padding:6px 8px 2px}
.dr3-overflow-item{
  display:block;width:100%;text-align:left;background:none;border:none;border-radius:8px;
  padding:7px 8px;font-size:var(--fs-12);color:var(--text);cursor:pointer;white-space:nowrap;
}
.dr3-overflow-item:hover{background:var(--heute-mist)}
.dr3-overflow-item.active{background:var(--heute-mist);color:var(--heute-plum-deep);font-weight:700}
.dr3-overflow-sep{height:1px;background:var(--panel-border);margin:4px 2px}
.dr3-overflow-hint{font-size:var(--fs-12);color:var(--muted);padding:6px 8px 2px;line-height:1.4;max-width:210px}

/* ── Matrix: Wochenend-Tint + Heute-Spalte (§4 „Wochenend-Tint, Heute-Markierung") — additive
   Klassen auf ansonsten UNVERÄNDERTEN <td>s (s. shiftsTabGrid.js renderDayCell()-Diff). Wirkt
   NUR auf Zellen ohne eigenes semantisches Inline-`background` (Absenz/Ferien/Zuweisung/
   Feiertag gewinnen immer gegen eine reine Klassenregel — Spezifität, kein !important nötig,
   identisches Prinzip wie der bestehende Header-`hasBg`-Zweig). Heute = Randmarkierung statt
   Fläche (eine Fläche würde echten Zellinhalt/-Status unlesbar überlagern). ── */
html.view-desktop .dr3-td-we{background:var(--heute-mist)}
html.view-desktop .dr3-td-today{box-shadow:inset 0 0 0 2px var(--heute-coral)}
/* Gruppen-Trennzeilen (§4) — reine Typografie-Verfeinerung, Farben bleiben die bestehenden
   Tenant-/Team-Farben (Regel §1.3 „Dienstfarben nie Theme-Farben" gilt sinngemäss auch hier:
   eine Bereichs-/Team-Eigenfarbe ist KEINE Theme-Farbe). */
html.view-desktop .dr3-group-td{text-transform:uppercase;letter-spacing:.03em}

/* ── Sticky-Kopf/-Spalte-Politur (bereits FUNKTIONAL sticky seit FN-89/FN-243, s.
   shiftsTabGrid.js _renderRosterTableHeader()-Kopfkommentar — hier NUR die visuelle
   Randmarkierung, die eine sticky-Kante auf Desktop lesbarer macht). ── */
html.view-desktop #sqGridScroll thead tr{box-shadow:0 2px 0 0 var(--heute-plum-light)}
html.view-desktop #sqGridScroll td[role="rowheader"]{box-shadow:2px 0 0 0 rgba(79,58,130,.14)}

@media (prefers-reduced-motion:reduce){
  .dr3-seg-btn,.dr3-kpi-savestate.is-pending{transition:none!important;animation:none!important}
}

/* ── D-R3/B2-Fix — Undo/Redo-Toolbar-Button „Wird gespeichert…"-Zustand (s.
   shiftsTabUndoRedo.js renderUndoRedoBar()-Kopfkommentar für den vollen Befund). Gilt für
   Mobile UND Desktop gleichermassen — kein `html.view-desktop`-Scope, der B2-Bug betraf
   beide Viewports identisch, die Leiste selbst existierte schon vor D-R3. ── */
.roster-undoredo-btn.pending{opacity:.75;cursor:progress}
@media (prefers-reduced-motion:no-preference){
  .roster-undoredo-btn.pending{animation:dr3-savestate-pulse 1.4s ease-in-out infinite}
}
@media (prefers-reduced-motion:reduce){
  .roster-undoredo-btn.pending{animation:none!important}
}
/* ═══════════════════════════════════════════════════════════════════════
   FLO-DIREKTIVE 2026-08-21 — „Farbe, Formen, alles muss von den HTML
   umgesetzt werden; die PWA muss 1:1 so aussehen wie in den Vorlagen —
   nur eben mit allen Funktionen."
   ─────────────────────────────────────────────────────────────────────────
   Root-Cause-Korrektur für D-R1/D-R2/D-R3/D-R5 + M-A…M-F: die bisherigen
   Pakete verwendeten die BESTEHENDEN generischen Neutral-Token (--text/
   --muted/--panel-border/--hairline/--shadow/--radius) unter der Annahme,
   sie seien bereits markenkonform — tatsächlich weichen ihre WERTE vom
   Prototyp ab (kühles Blaugrau statt warmem Violettgrau, ein flacher 1px-
   Schatten statt des satten, farbig getönten Ambient-Schattens, teils
   falscher Radius) — das ist die Ursache von Flos Beanstandung „ich sehe
   kaum optische Änderungen, weder mobile noch desktop". Werte hier 1:1 aus
   den beiden Referenz-Prototypen übernommen (docs/konzepte/ROSIE-DESKTOP-
   FINAL-RUHE-EBENEN_2026-08-20.html + ROSIE-MOBILE-FINAL-V1PLUS_2026-08-19.
   html — beide definieren IDENTISCHE Neutral-Werte, nur der Sidebar-
   Verlauf unterscheidet sich in der Achse zwischen Desktop/Mobile). Bewusst
   NICHT angetastet: die funktionalen Status-Token (--teal/--blue/--red/
   --amber/--green/--purple) — dafür hat der Prototyp kein Äquivalent, sie
   sind ausserhalb des Bauplan-Scopes (reine Marken-Neutrale, keine
   Semantik-Farben). Bewusst als spät im Cascade angehängter, eigener Block
   statt Bearbeitung der verstreuten Alt-Regeln: gleiche Selektor-
   Spezifität gewinnt automatisch durch Quellreihenfolge (`.light`/
   `.nightshift` einfache Klassen, `.preset-rose.light` bleibt durch die
   höhere Spezifität [zwei Klassen] auch nach diesem Block korrekt
   vorrangig für --text/--muted, die dort bereits korrekt waren). */
.light{
  --text:#241640; --muted:#6b6480;
  --hairline:rgba(36,22,64,.10); --panel-border:rgba(36,22,64,.10);
  --shadow:0 10px 30px -18px rgba(36,22,64,.22),0 2px 6px -3px rgba(36,22,64,.08);
  --radius:12px; --radius-lg:16px;
}
.nightshift{
  --bg:#161028; --panel:#211A38;
  --text:#F2EDFF; --muted:#A79FC2;
  --hairline:rgba(240,235,255,.10); --panel-border:rgba(240,235,255,.10);
  --shadow:0 10px 30px -18px rgba(0,0,0,.65),0 2px 6px -3px rgba(0,0,0,.4);
  --radius:12px; --radius-lg:16px;
}
.preset-rose.light{
  --hairline:rgba(157,23,77,.14); --panel-border:rgba(157,23,77,.14);
  --shadow:0 10px 30px -18px rgba(36,22,64,.22),0 2px 6px -3px rgba(36,22,64,.08);
  --radius:12px; --radius-lg:16px;
}
:root{--radius:12px; --radius-lg:16px}
/* Seitenleisten-Verlauf (D-R1/§6): je Modus ein eigener Verlauf — Rosé stimmte
   bereits exakt mit dem Prototyp überein; Hell/Dunkel bezogen ihn bislang
   fälschlich aus `--heute-gradient` (135°, für die MOBILE Topbar gedacht,
   falscher Start-Farbton für die Desktop-Seitenleiste). */
.light:not(.preset-rose) .rs-sidebar{--rs-side-grad:linear-gradient(180deg,#3B2A63 0%,#241640 100%)}
.nightshift .rs-sidebar{--rs-side-grad:linear-gradient(180deg,#241640 0%,#120B22 100%)}
/* ═══════════════════════════════════════════════════════════════════════
   B-03 (Beta-Feedback Welle 3, FN-364) — Scrollbars breiter + im Kontrast
   klar sichtbar. Kundenmeldung: der bestehende 4px-Balken (Dateianfang,
   `::-webkit-scrollbar{width:4px;height:4px}` + `-thumb{background:
   var(--panel-border)}`) war im Dunkelmodus (--panel-border bei 10%
   Deckkraft auf fast-schwarzem --bg) faktisch unsichtbar; Firefox bekam
   VOR diesem Block gar kein Styling (0 `scrollbar-color`-Treffer im
   gesamten Repo).
   Eigenes Token statt `--panel-border` (das wird an 15 Stellen im File
   quer neu definiert — jede künftige Änderung dort hätte sonst wieder
   ein Unsichtbarkeits-Risiko für den Balken importiert, ohne dass jemand
   an Scrollbars gedacht hätte): `--scrollbar-thumb`/`-hover`, aus der
   Marken-Plum-/Coral-Familie (`--heute-*`, s. Block weiter oben) — Plum
   für die beiden HELLEN Themes (Bright/Rose, ≥11:1 gegen --bg UND
   --panel), Coral für die beiden DUNKLEN (Standard/Nightshift, ≥6.3:1).
   Bewusst KEIN einzelner Farbton für alle vier: Plum fällt auf den
   dunklen Hintergründen unter 2.1:1 (zu nah an --bg/--panel), Coral auf
   den hellen unter 3:1 (2.6–2.85:1) — beide Werte mit der EXAKT gleichen
   WCAG-Formel wie scripts/check-contrast.mjs nachgerechnet (relative
   Luminanz + Kontrastverhältnis, s. tests/fn364-scrollbar-contrast-
   token.test.js), nicht geschätzt. Alle 8 geprüften Paare (4 Themes ×
   {--bg,--panel}) liegen weit über der 3:1-UI-Komponenten-Schwelle
   (WCAG 1.4.11 — der Thumb ist eine Bedienkomponente, kein Fliesstext).
   Bewusst PLAIN `:root`/`.light`/`.nightshift`/`.preset-rose.light`
   (NICHT `:root:not(.light)`): Letzteres hätte für dieses NEUE Tokenpaar
   höhere Spezifität als `.nightshift` (Element+Pseudoklasse vs. einfache
   Klasse) und die Nightshift-Zeile unten IMMER überstimmt, unabhängig
   von der Quellreihenfolge — dieselbe Kaskaden-Logik wie im FLO-
   DIREKTIVE-Block direkt oberhalb (plain `:root` als Standard-Fallback,
   gleich spezifische Klassen gewinnen per Quellreihenfolge danach,
   `.preset-rose.light` gewinnt durch echte höhere Spezifität [zwei
   Klassen] ohnehin immer). `.nightshift` bekommt trotz identischem Wert
   eine EIGENE Zeile (nicht nur implizite Vererbung von `:root`), damit
   die Kopplung an die dunkle Familie im Diff/Devtools sichtbar bleibt.
   `.topbar-center::-webkit-scrollbar{display:none}` (Zeilen 79/122/2089)
   bleibt UNANGETASTET — eigene, spezifischere Regel, der Balken dort ist
   dort bewusst versteckt, das ändert dieser Block nicht.
   Touch-Geräte (pointer:coarse — auch die mobile Matrix html.view-mobile
   .planung-matrix-scroll, Zeile ~5083) behalten den System-Overlay-
   Balken: die 12px-Regel + Firefox-Umschaltung laufen deshalb nur unter
   `@media(pointer:fine)`, sonst würde ein dauerhaft sichtbarer 12px-
   Balken auf Touch-Geräten Inhalt verdecken statt (wie beim Overlay-
   Balken üblich) nur beim aktiven Scrollen kurz einzublenden — die
   bestehende schmale 4px-Basisregel (Dateianfang) bleibt für genau
   diesen Fall unverändert als Fallback stehen.
   `#sqGridScroll` (Dienstplan-Matrix, app-shell/views/shiftsTabGrid.js)
   ist der wichtigste scrollende Container der App und war rein inline
   gestylt, ohne eigene CSS-Regel — die globale `::-webkit-scrollbar`-
   Regel (kein Präfix-Selektor, greift bereits universell) deckt ihn zwar
   ohnehin ab, die neue `.sq-grid-scroll`-Klasse macht das aber explizit
   statt nur implizit über Vererbung. */
/* UI-1a (ARBEITSAUFTRAG-2026-08-27_PERSONALBEDARF-KI-PLANUNG.md §8) — Flo-Rücknahme des
   "Anthropic-Orange"-Scrollbar-Thumbs im Dark Mode. NUR die beiden Dark-Themes (:root,
   .nightshift) wechseln von --heute-coral (#FF6A3D) auf ein neutrales helles Blaugrau aus
   der bereits genutzten Slate-Palette; die beiden Light-Themes (--heute-plum) waren nie
   betroffen und bleiben unverändert. Der historische B-03/FN-364-Kommentarblock oben bleibt
   bewusst stehen (Repo-Konvention). Kontrast gegen --bg/--panel je Theme 11–13:1, weit über
   der WCAG-1.4.11-Schwelle 3:1 — fn364-scrollbar-contrast-token.test.js rechnet das nach. */
:root{
  --scrollbar-thumb:#CBD5E1;
  --scrollbar-thumb-hover:#94A3B8;
}
.light{
  --scrollbar-thumb:var(--heute-plum);
  --scrollbar-thumb-hover:#302251;
}
.nightshift{
  --scrollbar-thumb:#CBD5E1;
  --scrollbar-thumb-hover:#94A3B8;
}
.preset-rose.light{
  --scrollbar-thumb:var(--heute-plum);
  --scrollbar-thumb-hover:#302251;
}
@media (pointer: fine){
  html{ scrollbar-width:auto; scrollbar-color:var(--scrollbar-thumb) transparent; }
  ::-webkit-scrollbar{ width:12px; height:12px; }
  ::-webkit-scrollbar-track{ background:transparent; }
  ::-webkit-scrollbar-thumb{
    background:var(--scrollbar-thumb);
    border-radius:6px;
    border:3px solid transparent;
    background-clip:padding-box;
  }
  ::-webkit-scrollbar-thumb:hover{ background:var(--scrollbar-thumb-hover); }
  .sq-grid-scroll::-webkit-scrollbar{ width:12px; height:12px; }
  .sq-grid-scroll::-webkit-scrollbar-thumb{
    background:var(--scrollbar-thumb);
    border-radius:6px;
    border:3px solid transparent;
    background-clip:padding-box;
  }
}
/* ═══════════════════════════════════════════════════════════════════════
   B-04 (Beta-Feedback Welle 3, FN-365) — Dropdowns im Dunkelmodus: weisse
   Balken beheben. Kundenmeldung: geöffnete `<select>`-Popups zeigten nur
   weisse Balken statt lesbarer Optionen.
   Ursachenkette (alle drei Teile nötig, keiner allein reicht):
   (1) `color-scheme` fehlte als CSS-Property komplett — nur ein statisches
       `<meta name="color-scheme" content="dark light">` existiert
       (public/index.html/app-shell/index.html). ROSIE schaltet Themes über
       CSS-KLASSEN (html.light/html.nightshift), nicht über die System-
       einstellung — ein statisches Meta-Tag weiss davon nichts, der
       Browser rendert das native Options-Popup deshalb im hellen UA-
       Default, selbst wenn die App gerade dunkel ist. Property (unten)
       ergänzt das Meta-Tag um den LAUFENDEN Zustand — das Meta-Tag selbst
       bleibt unangetastet (es ist der Startwert vor dem ersten Rendern).
   (2) Die einzige Dark-Mode-Regel für input/select/textarea (Zeile ~2238,
       oben in diesem File) setzte Rand+Schrift, aber KEINEN Hintergrund —
       dort direkt nachgezogen (s. Kommentar dort), nicht hier dupliziert.
   (3) `<option>`/`<optgroup>` hatten VOR diesem Block nur zwei eng auf die
       Task-Flow-Karte gescopte Regeln (`.tf-filterbar .tf-filter-select
       option`, s. Kopfkommentar dort) — jedes andere Select im Repo erbte
       für seine Optionen `color:var(--text)` (im Dark-Mode nahezu weiss)
       OHNE jeden Hintergrund → weisse Schrift auf weissem UA-Popup =
       genau die gemeldeten "weissen Balken".
   Reihenfolge/Spezifität bewusst gewahrt: die neue globale `option,
   optgroup`-Regel ist ABSICHTLICH ohne `!important`, damit die beiden
   bestehenden, spezifischeren Task-Flow-Regeln weiterhin gewinnen (höhere
   Selektor-Spezifität reicht, kein Konflikt). Die neue nackte `select`-
   Basisregel ist ebenso absichtlich ohne `!important` und niedrigst-
   spezifisch (Typselektor) — `.form-group select` UND die Landingpage-
   Rechner-Regel `.rechner-field select` (bewusst IMMER hell, kein
   Theme-Bezug) bleiben davon unberührt und gewinnen unverändert. */
:root:not(.light){ color-scheme:dark; }
html.light{ color-scheme:light; }
option, optgroup{ background-color:var(--panel); color:var(--text); }
option:hover, option:focus, option:checked{ background-color:var(--teal-dim); color:var(--text); }
select{
  background:var(--bg);
  color:var(--text);
  border:1px solid var(--panel-border);
  border-radius:var(--radius-sm);
}
/* ═══════════════════════════════════════════════════════════════════════
   FLO-DIREKTIVE-2026-08-24-NACHZUG — .btn-primary Coral/Plum-Retint
   (zurückgestellter Rest aus dem FLO-DIREKTIVE-2026-08-21-Block oben:
   „die globale .btn-primary-Klasse ist bewusst NICHT angetastet — zu
   grosser App-weiter Blast-Radius").
   ─────────────────────────────────────────────────────────────────────────
   ROOT CAUSE: --grad-primary (EINZIGE Definition, s. :root oben) mischte
   var(--teal) + var(--brand-2,var(--blue)) — die Vision-2028-Override-
   Schicht liess .btn-primary dadurch weiterhin Teal/Blau statt der
   Prototyp-Coral/Plum-Familie zeigen. --teal SELBST bewusst NICHT
   angetastet (geteilte Variable, Dutzende weitere Konsumenten, s. R-31-
   Kontrast-Historie in scripts/check-contrast.mjs) — stattdessen ein
   neuer, NUR für --grad-primary bestimmter erster Gradient-Stop
   --brand-1 (analog zum bereits bestehenden --brand-2) je der 3 lebenden
   Theme-Klassen (.light/.nightshift/.preset-rose.light, s.
   app-shell/main.js setAppMode()) eingeführt.
   KONTRAST: alle Werte per WCAG-Formel (identisch scripts/check-
   contrast.mjs) gegen weisse Schrift verifiziert, jeder ≥4.5:1 (R-31-
   Pflicht für normalen Text — .btn trägt 12px/600, unter der
   Grossschrift-Schwelle). Reiner Hue/Sat-erhaltender Lightness-Nudge, wo
   der rohe --heute-*-Wert (fürs Akzent-Icon gedacht, nie als volle
   Button-Fläche) durchfiel: --heute-coral #FF6A3D allein nur 2.845:1 →
   auf #D83200 nachgedunkelt (4.8:1); --heute-gold #FFC24A allein nur
   1.607:1 → auf #9C6700 nachgedunkelt (4.8:1). --heute-plum-light
   (#4F3A82, 9.29:1) und die bereits etablierten preset-rose.light-Farben
   --red/--text-secondary (#be123c/6.29:1, #9d174d/7.89:1) brauchten keine
   Korrektur, direkt übernommen statt neu erfunden — dieselbe Farblogik
   wie oben: Coral→Gold im Hellen, Coral→Plum-Light im Dunkeln, an Rose
   angepasste Coral→Beere-Variante im Rose-Modus. Standard-Theme (bare
   :root, tot laut setAppMode() — s. check-contrast.mjs-Kopfkommentar)
   bekommt --brand-1 ebenfalls explizit gesetzt (mirrort das bereits
   bestehende --brand-2 an derselben Stelle) statt sich auf den var()-
   Fallback zu verlassen — der Fallback (var(--heute-coral)) bleibt
   dadurch wie --brand-2s var(--blue)-Fallback bewusst totes
   Sicherheitsnetz, nie ausgeführt.
   ⚠️ ZWEITER, beim Recherchieren gefundener echter Fund (nicht in der
   Auftragsbeschreibung genannt): eine höher spezifische Layer weiter
   oben in dieser Datei ("── 7. Brand-Akzente an UI-Elementen ──") setzte
   .btn-primary in .light/.preset-rose.light per html.light .btn-primary/
   html.preset-rose.light .btn-primary (Spezifität 0,2,1 bzw. 0,3,1)
   AUSSCHLIESSLICH auf var(--rosie-teal)/var(--rosie-rose) — schlägt die
   schwächere .btn-primary{background:var(--grad-primary)}-Basisregel
   (0,1,0) in genau den beiden von diesem Retint betroffenen Modi. Ohne
   Entfernung dieser Schicht hätte der --grad-primary-Fix in Light/Rose
   NULL sichtbare Wirkung gehabt — live im Browser bestätigt (vorher/
   nachher). Dort ersatzlos entfernt statt --rosie-teal/--rosie-rose
   selbst umzufärben (Brand-Kit-r127-Konstanten mit vielen weiteren,
   themenunabhängigen Konsumenten anderswo — derselbe Blast-Radius-Grund
   wie bei --teal).
   Bewusst NICHT angetastet: .btn-outline/.btn-danger/.btn-amber (andere
   Klassen, ausserhalb des Auftrags-Scopes „die globale .btn-primary-
   Klasse"); .tour-btn-primary (eigene, unabhängige Klasse trotz
   ähnlichem Namen); die drei bereits Coral-nutzenden Paket-M-A/M-E/M-F-
   Mobile-Overrides (html.view-mobile #staffAdminBtnRow/.conversation-list
   .conv-head/#alertEditorCard .btn-primary{background:var(--heute-
   coral)}) — vorbestehend, ausserhalb des Kontrast-Gate-Scopes (ID-/
   Nachfahren-Selektoren, s. check-contrast.mjs-Kopfkommentar „kein
   vollständiger CSS-Auditor"), reiner rohes-heute-coral-2.845:1-Kontrast-
   fund UNABHÄNGIG von diesem Retint — Folgeitem, nicht hier mitgefixt;
   body.rosie-alive .btn-primary:active{box-shadow:...var(--teal-dim)}
   (Active-Zustand, ausserhalb des Auftragswortlauts „Grundzustand +
   Hover + --btn-glow"), minimaler Restbefund für ein Folgeitem.
   ═══════════════════════════════════════════════════════════════════════ */
:root{--brand-1:#D83200}
.light{--brand-1:#D83200; --brand-2:#9C6700; --btn-glow:0 12px 26px -12px rgba(216,50,0,.42)}
.nightshift{--brand-1:#D83200; --brand-2:var(--heute-plum-light); --btn-glow:0 12px 26px -10px rgba(216,50,0,.5)}
.preset-rose.light{--brand-1:#be123c; --brand-2:#9d174d; --btn-glow:0 12px 26px -12px rgba(190,18,60,.4)}
/* ═══════════════════════════════════════════════════════════════════════
   DESKTOP-BAUPLAN «RUHE · EBENEN», PAKET D-R4 — Ideen
   (ARBEITSAUFTRAG-2026-08-20_DESKTOP-RUHE-EBENEN-BAUPLAN.md §5,
   app-shell/views/ideasTab.js)
   ─────────────────────────────────────────────────────────────────────────
   Rein additiv, `html.view-desktop`-gescoped. `ideasTab.js` ist bereits seit
   Bauplan Paket 9/E9 DESKTOP-ONLY (Mobile hat einen eigenen Dialog, s. dortiger
   Datei-Kopfkommentar) — die Scoping ist trotzdem PFLICHT, nicht nur Vorsicht:
   `adminTabKommunikation.js` (MOBILE-Ideen-Verwaltung) rendert seine eigene
   Liste mit exakt denselben Klassen (.suggestion-card/.sc-head/.sc-title/
   .sc-category/.sc-status/.sc-desc/.sc-meta/.sc-merkle/.sc-admin-notes) — ein
   ungescoptes Überschreiben hier hätte dort mitgelaufen (Mobile-Freeze-
   Verstoss). Zeilen-/Icon-Werte 1:1 aus dem Referenz-Prototyp
   (docs/konzepte/ROSIE-DESKTOP-FINAL-RUHE-EBENEN_2026-08-20.html, Sektion
   #v-ideen: `.rrow`/`.ric`/`.tag`) übernommen. Bestehende Handler/Daten
   unverändert — die Karten-Struktur (Formular-Karte + Listen-Karte) bleibt
   wie zuvor, nur die Zeilen-Innendarstellung wechselt von „gestapelte
   Einzelkarte mit Schatten" auf „eine Liste mit Hairline-Trennern", identisch
   zum Prototyp. KEINE „Stimmen"-Zählung — die existiert nicht im
   Datenmodell (`improvement_suggestions` hat kein Vote-Feld) und wird nicht
   erfunden; der Tag rechts zeigt weiterhin den echten `sc-status`-Wert. */

/* ── Card-Kopf-Icon (beide Karten dieser Seite: Formular + Liste) — derselbe
   abgerundete Quadrat-Chip wie die Zeilen-Icons unten, für optische Parität
   zwischen den beiden Karten dieser Seite. `svg.ric` statt einer eigenen
   Klasse, da die Spans hier ohne `class`-Attribut in den Sweep gehen (s.
   sweepIconPlaceholders()/rosieIcon() in src/modules/icons.js — das
   Original-`class`-Attribut wird 1:1 auf das SVG übertragen, ist hier leer). */
html.view-desktop #tabIdeas .card-head .card-title{display:flex;align-items:center;gap:10px}
html.view-desktop #tabIdeas .card-head .card-title svg.ric{
  width:16px;height:16px;padding:10px;box-sizing:content-box;flex-shrink:0;
  border-radius:10px;background:var(--heute-mist);color:var(--heute-plum);
}

/* ── Liste: eine gemeinsame Karte mit Hairline-getrennten Zeilen statt
   gestapelter Einzelkarten mit eigenem Schatten (Prototyp `.rrow`). Die
   Klasse `.suggestion-card` bleibt (Bestandsschutz für
   adminTabKommunikation.js/bestehende Tests), wird auf Desktop hier zur
   reinen Listenzeile umgestylt. ── */
html.view-desktop #tabIdeas .suggestion-card{
  background:none;border:none;box-shadow:none;border-radius:0;
  padding:13px 4px;margin-bottom:0;border-bottom:1px solid var(--hairline);
}
html.view-desktop #tabIdeas .suggestion-card:last-child{border-bottom:none}
html.view-desktop #tabIdeas .idea-row-head{display:flex;align-items:flex-start;gap:12px}
html.view-desktop #tabIdeas .idea-row-ic{
  width:16px;height:16px;padding:10px;box-sizing:content-box;flex-shrink:0;
  border-radius:10px;background:var(--heute-mist);color:var(--heute-plum);
}
html.view-desktop #tabIdeas .idea-row-body{flex:1;min-width:0}
html.view-desktop #tabIdeas .suggestion-card .sc-title{
  display:block;font-size:13.5px;font-weight:700;color:var(--text);line-height:1.35;
}
html.view-desktop #tabIdeas .idea-row-sub{font-size:var(--fs-12);color:var(--muted);margin-top:1px}
html.view-desktop #tabIdeas .suggestion-card .sc-desc{margin-top:6px;margin-left:28px}
html.view-desktop #tabIdeas .suggestion-card .sc-admin-notes,
html.view-desktop #tabIdeas .suggestion-card .sc-merkle{margin-left:28px}

/* ── Status-„Tag" (Prototyp `.tag`: Pille statt 8px-Rundung, Marken-Neutral
   als Default). Die zwei generischen Alt-Akzente Teal(umgesetzt)/
   Blau(in_pruefung) weichen echten App-weiten Status-Semantiken — Grün =
   erledigt/positiv wie überall sonst im Betrieb (`.sq-status.aktiv`,
   `.swap-badge--ok`), Gold = aktiv/in Bearbeitung (Bauplan §1.1 „Gold =
   Aktiv-/Highlight-Akzent", Prototyp `.tag.gold`-Wert 1:1 übernommen).
   Amber(eingereicht)/Rot(abgelehnt) bleiben UNANGETASTET — echte App-weite
   Warn-/Fehler-Semantik, kein „alter Akzent", s. Kopfkommentar oben. ── */
html.view-desktop #tabIdeas .suggestion-card .sc-status{
  border-radius:999px;font-weight:800;padding:3px 10px;flex-shrink:0;
  background:var(--heute-mist);color:var(--heute-plum);
}
html.view-desktop #tabIdeas .suggestion-card .sc-status.umgesetzt{background:var(--green-dim);color:var(--green)}
html.view-desktop #tabIdeas .suggestion-card .sc-status.in_pruefung{background:rgba(255,194,74,.22);color:#8a6100}
html.view-desktop.nightshift #tabIdeas .suggestion-card .sc-status.in_pruefung{background:rgba(255,194,74,.18);color:#FFD98A}

/* ── EIN Coral-CTA dieser Ansicht (Bauplan §1.1) — der bereits bestehende
   Submit-Button des Einreich-Formulars, keine neue Aktion. Die vier kleinen
   Admin-Status-Buttons (updateSuggestionStatus) bleiben bewusst neutrale
   Kleinbuttons — sie sind Alternativ-Aktionen einer Gruppe, keine „die
   eine" primäre CTA dieser Seite. ── */
html.view-desktop #tabIdeas #ideaForm button[type="submit"].btn-primary{
  background:var(--heute-coral);border-color:var(--heute-coral);color:#fff;
}
html.view-desktop #tabIdeas #ideaForm button[type="submit"].btn-primary:hover{filter:brightness(1.05)}
@media (prefers-reduced-motion:reduce){
  html.view-desktop #tabIdeas #ideaForm button[type="submit"].btn-primary{transition:none!important}
}
/* ═══════════════════════════════════════════════════════════════════════
   DESKTOP-BAUPLAN «RUHE · EBENEN», PAKET D-R4 — Reiter «Wünsche»
   (ARBEITSAUFTRAG-2026-08-20_DESKTOP-RUHE-EBENEN-BAUPLAN.md §5,
   app-shell/views/vacationsTabWishes.js + vacationsTabPreferences.js)
   ─────────────────────────────────────────────────────────────────────────
   Reines Restyling, `html.view-desktop`-gescoped (Mobile-Freeze — die
   MOBILE Fassung dieser Karten hat bereits ihre eigene, unabhängige
   Restyle-Schicht aus Paket M-D bekommen, s. dortiger Block weiter oben in
   dieser Datei; hier NICHTS davon angefasst). 0 JS-Änderungen an
   vacationsTab.js/vacationsTabWishes.js/vacationsTabPreferences.js nötig —
   identisches Muster wie Paket M-C («null JS-Änderungen, nur additive CSS-
   Klassen»): jede hier verwendete ID/Klasse existiert bereits im Markup
   (`vacationsTab.js` PANEL_HTML + den beiden Render-Funktionen), `!important`
   ausschliesslich dort, wo ein Inline-`style`-Attribut sonst gewinnen würde
   (identisches, bereits etabliertes Muster wie FN-277/Paket M-D
   `#myWishListItems`, s. dortiger Kommentar für die volle Begründung).
   Coral bleibt die EINE Aktionsfarbe dieser Ansicht («Wunsch eintragen»,
   der einzige primäre CTA der Karte — es gibt in diesem Datei-Scope KEINE
   Admin-Genehmigungsliste, s. u.), Gold der Aktiv-/Highlight-Akzent.
   ⚠️ BEWUSSTE SCOPE-GRENZE (dokumentiert statt übersehen): die Bauplan-
   Tabellenzeile nennt zusätzlich «Genehmigungsliste» — die existiert im
   zugewiesenen Datei-Scope NICHT: die Ferien-Genehmigung (approveVacation/
   rejectVacation, `.vacation-grid`) lebt HANDLER- und MARKUP-seitig
   vollständig in `vacationsTab.js` selbst (ausserhalb der beiden hier
   zugewiesenen Dateien) und ist deshalb kein Teil dieses Pakets — bleibt
   eine künftige D-R4-Nachbesserung (`.vacation-grid`-Karten), sobald sie
   explizit beauftragt wird. Ebenso bewusst NICHT gebaut: eine «Guthaben-
   Übersicht je Person» (Tabelle über ALLE Mitarbeitenden) — `getWishBudget
   Status()` ist rein `staffId`-skalar und wird von KEINEM bestehenden
   Aufrufer über die ganze Belegschaft iteriert; das wäre neue Darstellungs-
   logik über bislang unbenutzte Daten hinweg, kein reines Restyling einer
   bestehenden Ansicht — die Kachel unten bleibt bewusst bei der bereits
   vorhandenen, EINEN Guthaben-Zeile (eigene bzw. Proxy-Zielperson, s.
   updateWishAllowanceIndicator()). */

/* ── Karten-Schale: der generische `.card`-Schatten (`--e2`) ist NICHT der
   von der FLO-DIREKTIVE korrigierte, warm getönte Wert (`--shadow`) — exakt
   dieselbe Fehlerklasse, hier für die beiden Wünsche-Karten geschlossen
   (identisches Prinzip wie D-R3s `.dr3-*`-Kartenrahmen). Bewusst eng auf die
   beiden Karten-IDs gescopt statt `.card` global umzustellen — der Blast-
   Radius auf die restliche App (alle anderen Tabs nutzen `.card` ebenfalls)
   bleibt ausserhalb des D-R4-Scopes für diesen Reiter. ── */
html.view-desktop #myPreferencesCard,
html.view-desktop #meineWuenscheCard{
  box-shadow:var(--shadow);
}

/* ── Coral-CTA: „Wunsch eintragen" ist die primäre Aktion dieser Karte —
   `.btn-primary` liefert weiterhin Teal/Blau (bewusst zurückgestellter
   App-weiter Retint, s. CLAUDE.md „.btn-primary-Retint … explizit
   zurückgestellt"), darum hier EXPLIZIT wie Paket M-D
   `.wish-cal-new-wish-cta` (identische Schattenwerte, 1:1 aus dem Prototyp
   übernommen) statt sich auf `.btn-primary` zu verlassen. ── */
html.view-desktop #meineWuenscheCard .wish-submit-btn{
  background:var(--heute-coral);
  color:#fff;
  box-shadow:0 12px 26px -10px rgba(255,106,61,.55);
}
html.view-desktop #meineWuenscheCard .wish-submit-btn:hover{filter:brightness(1.05)}

/* ── Konflikt-Hinweis — Desktop-Nachzug zu Paket M-D §5 (dort bewusst NUR
   `html.view-mobile` gescoped, „Desktop selbst bleibt unangetastet", s.
   dortiger Kommentar direkt darüber in dieser Datei). Identischer Coral-
   Warnfarbwert wie mobil (Bauplan-Wortlaut: Coral zugleich Warn- UND
   Aktionsfarbe, kein zweiter Namespace). ── */
html.view-desktop .wish-form-v2 .wish-conflict-warn{
  background:rgba(255,106,61,.10);
  border-color:var(--heute-coral);
}

/* ── Gold-Akzent (Aktiv-/Highlight, §1.1): Eigen-/Fremdwunsch-Umschalter —
   identisches Chip-Aktiv-Muster wie D-R3 `.dr3-overflow-item.active`
   (Mist-Fläche + Plum-Deep-Text statt einer soliden Marken-Fläche — dort
   bereits ohne Rosé-Sonderfall produktiv: ein durchscheinender, hellvioletter
   Farbfleck auf einem kleinflächigen Chip klasht anders als D-R3s
   grossflächiges `.dr3-seg-btn.active`, das deshalb einen eigenen
   Rosé-Zweig braucht). ── */
html.view-desktop #meineWuenscheCard .wish-toggle-btn:hover{
  border-color:var(--heute-gold);
  background:var(--heute-mist);
  color:var(--heute-plum-deep);
}
html.view-desktop #meineWuenscheCard .wish-toggle-btn.is-active{
  border-color:var(--heute-gold);
  background:var(--heute-mist);
  color:var(--heute-plum-deep);
  box-shadow:inset 0 0 0 1px var(--heute-gold);
}

/* ── Guthaben-Kachel (§5 „Guthaben-Übersicht"): `updateWishAllowanceIndicator()`
   setzt Hintergrund/Textfarbe weiterhin per Inline-Style (rot/amber/teal je
   Auslastung) — hier NUR Rahmen/Radius/Abstand, keine Kollision, da der
   Inline-Style ausschliesslich `background`/`color` trifft. ── */
html.view-desktop #wishAllowanceIndicator:not(:empty){
  border:1px solid var(--panel-border);
  border-radius:var(--radius);
  padding:8px 10px;
  font-weight:600;
}

/* ── Wunschliste (#myWishListItems, renderMyWishes() — geteilt zwischen
   Mobile[Paket M-D]/Desktop, s. dortiger Kopfkommentar „bewusst NICHT per
   JS angefasst"): 1:1 dieselbe Regel wie Paket M-D oben in dieser Datei,
   nur unter `html.view-desktop` statt `html.view-mobile` — Inline-Style-
   `<div>`s ohne Klassennamen, `!important` NUR auf den überschriebenen
   Properties. ── */
html.view-desktop #myWishListItems > div{
  background:var(--panel) !important;
  border:1px solid var(--panel-border) !important;
  border-radius:var(--radius) !important;
  padding:10px 12px !important;
  box-shadow:var(--e1);
}
html.view-desktop #myWishListItems .wish-badge{background:var(--heute-mist);color:var(--heute-plum-deep)}
/* „Übernommen"-Wünsche (bereits vom Solver zu einer echten Zuweisung
   geführt, s. renderMyWishes()-Kopfkommentar in vacationsTabWishes.js) sind
   der einzige inhaltlich «hervorgehobene» Eintrags-Zustand dieser Liste —
   Gold-Rand statt einer neuen JS-Klasse: `:has()` liest den bereits
   bestehenden `.wish-status-badge--adopted`-Marker, 0 JS-Änderung nötig
   (bereits an 4 Stellen in dieser Datei etabliert). */
html.view-desktop #myWishListItems > div:has(.wish-status-badge--adopted){
  border-left:3px solid var(--heute-gold) !important;
}

/* ── Fixwünsche & Arbeitspräferenzen-Karte (§5): Wochentags-Zeilen
   (`#weekdayPreferences > div`, renderMyPreferences()) bekommen etwas mehr
   Luft + ein kräftigeres Label-Gewicht statt einer flächigen Marken-
   Einfärbung — sieben durchgehend eingefärbte Zeilen widersprächen der
   «Ruhe»-Grundidee (Chip-Flächen bleiben echten Aktiv-/Auswahl-Zuständen
   vorbehalten, s. Toggle-Buttons oben). ── */
html.view-desktop #myPreferencesCard #weekdayPreferences > div{
  padding:4px 2px !important;
}
html.view-desktop #myPreferencesCard #weekdayPreferences > div span{
  font-weight:600 !important;
}
/* ═══════════════════════════════════════════════════════════════════════
   DESKTOP-BAUPLAN «RUHE · EBENEN», PAKET D-R4 — Reiter «Meldungen»
   (ARBEITSAUFTRAG-2026-08-20_DESKTOP-RUHE-EBENEN-BAUPLAN.md §5,
   app-shell/views/messagesTab.js)
   ─────────────────────────────────────────────────────────────────────────
   Reines Restyling, `html.view-desktop`-gescoped (Mobile-Freeze). Kein
   `html.view-mobile`-Block existiert für diese Klassen in DIESEM Worktree
   (die parallele Paket-M-E-Bahn, die `messagesTab.js` mobil restylte, lief
   in einem anderen Worktree/Merge-Zeitpunkt — hier zum Auftragsstart nicht
   vorhanden). 0 JS-Änderungen an messagesTab.js nötig — jede hier verwendete
   ID/Klasse existiert bereits im Markup (PANEL_HTML + renderConversations()/
   renderChat()). `#alertEditorCard` behält `data-requires="scheduler"`
   unverändert.

   ⚠️ Auftragstext ging von „0 Treffer für .messages-layout in rosie.css" aus
   — das war unvollständig: eine UNSCOPTE `.messages-layout{display:grid;
   grid-template-columns:280px 1fr}`-Regel existiert bereits seit langem
   (wirkt ab >800px Breite, unabhängig vom `html.view-desktop`/
   `html.view-mobile`-Klassensystem) — sie wird hier NICHT dupliziert, nur die
   Spaltenbreite auf die Prototyp-Proportion (340px) gebracht. Bewusste,
   dokumentierte Scope-Grenze: die parallele `@media(max-width:768px)`-Regel
   weiter oben in dieser Datei (Mobile-2-Screen-Slide-Nav, „Messaging-Tab
   Mobile 2-Screen-Nav") ist reine Viewport-Breite, NICHT `html.view-mobile`-
   gescoped — bei „Desktop erzwingen" (Paket D-R5) auf einem schmalen Fenster
   würde `display:block` dort strukturell weiter gewinnen (spätere, gleich
   spezifische Regel im Cascade, s. dortiger Kommentar). Vorbestehend, nicht
   durch diesen Restyle verursacht, hier NICHT gefixt (Breakpoint-/Logik-Frage,
   ausserhalb des reinen Restyling-Auftrags) — `grid-template-columns` hat in
   diesem Randfall dann ohnehin keine Wirkung mehr (display ist nicht mehr
   grid), also kein zusätzliches Risiko durch die Spaltenbreiten-Regel unten.

   Farben ausschliesslich `--heute-*`-Marken-Token (§1.1). Coral bleibt die
   EINE Aktionsfarbe des Chat-Hauptbereichs (Senden-Button, identisch zum
   Prototyp-`.sendbtn`) plus dem Ungelesen-Zähler (Prototyp-`.tag.hot` „neu"
   ist ebenfalls Coral — reiner Dringlichkeits-Indikator, kein anklickbares
   Element, kein Verstoss gegen „genau EIN Coral-CTA"). „Aktiv"/Hover-Zustände
   (ausgewählte Konversation, Fokus-Ringe) nutzen GOLD (§1.1 „Gold = Aktiv-/
   Highlight-Akzent") statt Coral — die Prototyp-Zeile selbst zeigt für die
   aktive Konversation eine flache `background:var(--mist)`-Fläche, die im
   Prototyp-eigenen Token-System JE Modus umdefiniert wird; `--heute-mist` ist
   in ROSIE dagegen bewusst NICHT theme-adaptiv (nur EINE `:root`-Deklaration,
   s. Paket-5-Kopfkommentar weiter oben in dieser Datei „bewusst NUR auf bare
   :root, NIE in .light/.preset-rose überschrieben") — eine deckende feste
   Fläche unter theme-abhängigem `--text`/`--muted` bräche im Dunkel-Modus
   (nachweisbares Kontrast-Muster, s. u.a. FZ-U-Sicherheitslehren in diesem
   Repo). Darum hier translucente Gold-Lavur statt der Prototyp-Fläche — sicher
   in allen 3 Modi, gleiche visuelle Aussage („diese Zeile ist ausgewählt").
   Chat-Bubbles umgehen dieselbe Falle über FESTE Text/Grund-PAARE (mist+
   plum-deep / plum+cream), nie eine feste Fläche unter theme-abhängigem Text. */

/* ── Layout: Spaltenbreite näher an den Prototyp (340px) bringen, `display`
   selbst unverändert (s. Kopfkommentar). ── */
html.view-desktop .messages-layout{grid-template-columns:340px 1fr}

/* ── Konversationsliste + Chat — beide Spalten bekommen den «Ruhe»-
   Kartenrahmen (FLO-DIREKTIVE-`--shadow` + `--radius-lg`, identisch zu
   `.card` im Prototyp; die App nutzt hier bewusst KEINE generische `.card`-
   Klasse, darum direkt an den beiden Spalten-Containern). ── */
html.view-desktop .conversation-list,
html.view-desktop .chat-view{
  border-radius:var(--radius-lg);
  box-shadow:var(--shadow);
  border-color:var(--hairline);
}

/* ── Konversationsliste-Kopf: `display:flex` aktiviert nebenbei das im
   Markup längst vorhandene `margin-left:auto` des „Neue"-Buttons (bisher
   wirkungslos — die Basisregel setzt keinen Flex-Kontext). Icon-Kreis wie
   D-R4 Ideen (`.card-head .card-title svg.ric`), hier an die eigene
   `.conv-head`-Struktur angelehnt (kein `.card-head`-Wrapper vorhanden).
   Gross-/Kleinschreibung + Buchstabenabstand der Alt-Etikette bleiben
   unverändert (reine Struktur-/Icon-Ergänzung, keine Typografie-Änderung). ── */
html.view-desktop .conversation-list .conv-head{
  display:flex;align-items:center;gap:8px;
  border-bottom-color:var(--hairline);
}
html.view-desktop .conversation-list .conv-head > .ric{
  width:16px;height:16px;padding:10px;box-sizing:content-box;flex-shrink:0;
  border-radius:10px;background:var(--heute-mist);color:var(--heute-plum);
}
html.view-desktop .conversation-list .conv-search{border-bottom-color:var(--hairline)}
html.view-desktop .conversation-list .conv-search input:focus{border-color:var(--heute-gold)}

/* ── Zeilen — Hairline statt `--panel-border`, Avatar leicht grosszügiger
   (Prototyp-`.avatar` ist 34px, aktueller Wert 28px — moderate Annäherung
   ohne Layout-Sprung). Aktiv-Zeile: Gold-Lavur + Gold-Randlinie statt
   deckender Fläche (s. WCAG-Lehre im Kopfkommentar). ── */
html.view-desktop .conv-item{border-bottom-color:var(--hairline)}
html.view-desktop .conv-item:hover,
html.view-desktop .conv-item:active{background:rgba(255,194,74,.10)}
html.view-desktop .conv-item.active{
  background:rgba(255,194,74,.14);
  border-left:3px solid var(--heute-gold);
}
html.view-desktop .conv-item.active .conv-preview{color:var(--text-secondary)}
html.view-desktop .conv-item .conv-avatar{width:32px;height:32px}
/* Ungelesen: Gewicht statt Farbe — eine Marken-Textfarbe wäre auf dem
   theme-abhängigen Zeilengrund nicht in allen drei Modi lesbar (identisches
   Prinzip wie bei den bereits bestehenden Mobile-Paketen dieses Repos). */
html.view-desktop .conv-item.has-unread .conv-info .conv-name{font-weight:800}
/* Ungelesen-Zähler: Coral statt `--red` (im Brand-Kit nicht vorhanden) —
   reiner Dringlichkeits-Indikator, spiegelt Prototyp `.tag.hot` „neu".
   `!important` gegen den inline gesetzten `--red`-Wert im Markup
   (renderConversations(): `style="...background:var(--red);..."`). */
html.view-desktop .conv-item > .badge{
  background:var(--heute-coral) !important;color:#fff;
}

/* ── Chat-Ansicht — Kopf bleibt neutral/marken-frei (Prototyp zeigt für den
   Chat-Header kein eigenes Marken-Band, nur fetten Text „A. Heider ·
   Pflegefachkraft, WG 1"). ── */
html.view-desktop .chat-view .chat-head{
  font-weight:800;border-bottom-color:var(--hairline);
}
html.view-desktop .chat-view .chat-messages{padding:16px;gap:9px}
/* Bubbles — feste Marken-PAARE statt theme-abhängigem `--teal`+`#fff` bzw.
   `--bg`+Rahmen (Prototyp: `.bubble{background:var(--mist);color:var(--ink)}`
   / `.bubble.me{background:var(--plum);color:var(--cream)}`). `--heute-mist`+
   `--heute-plum-deep` bzw. `--heute-plum`+`--heute-cream` sind je ein festes
   Paar — keine deckende Fläche unter theme-abhängigem Text, s. Kopfkommentar. */
html.view-desktop .chat-msg{border-radius:14px}
html.view-desktop .chat-msg.sent{background:var(--heute-plum);color:var(--heute-cream);border-bottom-right-radius:4px}
html.view-desktop .chat-msg.received{background:var(--heute-mist);color:var(--heute-plum-deep);border:none;border-bottom-left-radius:4px}
/* `.msg-sender` (Absendername) rendert laut renderChat() AUSSCHLIESSLICH in
   empfangenen Nachrichten (`showSender = !isSent && …`) — nie in `.sent`,
   darum hier ohne Kontrast-Risiko auf die kräftigere Plum-Stufe gehoben. */
html.view-desktop .chat-msg.received .msg-sender{color:var(--heute-plum)}

/* ── Anhänge — `_renderMsgAttachment()` setzt Rahmen/Radius/Grund teils
   inline, `!important` genau auf diesen Properties (identisches Muster wie
   an den bereits bestehenden Mobile-Paketen dieses Repos). ── */
html.view-desktop .chat-msg .msg-media{border-radius:12px !important}
html.view-desktop .chat-msg .msg-file{
  border-radius:12px !important;background:var(--panel) !important;
  border-color:var(--panel-border) !important;
}
html.view-desktop .chat-msg .msg-media-pending{
  border-radius:12px !important;background:var(--heute-mist) !important;
  border-color:transparent !important;color:var(--heute-plum) !important;
}

/* ── Eingabe + Empfänger-Leiste. ── */
html.view-desktop .chat-view .chat-input{border-top-color:var(--hairline)}
html.view-desktop .chat-view .chat-input .recipient-panel{border-radius:var(--radius)}
html.view-desktop .chat-view .chat-input .recipient-panel .rec-chip{border-radius:999px}
html.view-desktop .chat-view .chat-input .recipient-panel .rec-chip.selected{
  background:var(--heute-plum);border-color:var(--heute-plum);color:var(--heute-cream);
}
html.view-desktop .chat-view .chat-input input[type="text"]:focus,
html.view-desktop .chat-view .chat-input textarea:focus{border-color:var(--heute-gold)}
/* Senden = die eine Coral-CTA des Chat-Hauptbereichs (§1.1 „genau EIN
   Coral-CTA pro Ansicht"), identisch zum Prototyp-`.sendbtn`. `!important`
   gegen den inline gesetzten `--teal`-Wert im Markup (PANEL_HTML) —
   `border-radius` bleibt bewusst unangetastet (ebenfalls inline gesetzt,
   6px ist bereits nah an `--radius-sm`, kein Kontrast-/Lesbarkeits-Gewinn
   durch einen weiteren `!important`-Eingriff auf eine rein kosmetische
   Rundung). */
html.view-desktop .chat-view .chat-input .send-btn{
  background:var(--heute-coral) !important;color:#fff;font-weight:800;
  box-shadow:0 10px 22px -12px rgba(255,106,61,.6);
}
html.view-desktop .chat-view .chat-input .send-btn:hover{filter:brightness(1.05)}
@media (prefers-reduced-motion:reduce){
  html.view-desktop .chat-view .chat-input .send-btn{transition:none!important}
}

/* ── Alert-Editor (nur Planer/Admin, Gate unverändert) — nutzt die app-weiten
   `.card`/`.card-head`/`.card-title`-Klassen, darum eng auf `#alertEditorCard`
   gescopt (ein blanker Selektor träfe die ganze App, identische Begründung
   wie D-R4 Ideen). Beide `.btn-primary`-Aktionen dieser Karte (Senden + Plan-
   Publizieren) werden Coral — beide sind gleichrangige „jetzt versenden"-
   Aktionen einer eigenständigen, rollen-gegateten Teilkarte (nur Planer/
   Admin sehen sie überhaupt) — kein Widerspruch zur „EIN Coral-CTA pro
   Ansicht"-Regel des Chat-Hauptbereichs oben, da diese Karte eine eigene
   kleine Ansicht bildet. ── */
html.view-desktop #alertEditorCard{border-radius:var(--radius-lg);box-shadow:var(--shadow)}
html.view-desktop #alertEditorCard .card-head{border-bottom-color:var(--hairline)}
html.view-desktop #alertEditorCard .card-head .card-title{display:flex;align-items:center;gap:10px}
html.view-desktop #alertEditorCard .card-head .card-title svg.ric{
  width:16px;height:16px;padding:10px;box-sizing:content-box;flex-shrink:0;
  border-radius:10px;background:var(--heute-mist);color:var(--heute-plum);
}
html.view-desktop #alertEditorCard .btn-primary{
  background:var(--heute-coral);border-color:var(--heute-coral);color:#fff;
}
html.view-desktop #alertEditorCard .btn-primary:hover{filter:brightness(1.05)}
@media (prefers-reduced-motion:reduce){
  html.view-desktop #alertEditorCard .btn-primary:hover{transition:none!important}
}
/* ════════════════ Ende Paket D-R4 — Meldungen ════════════════ */
/* ═══════════════════════════════════════════════════════════════════════
   DESKTOP-BAUPLAN «RUHE · EBENEN», PAKET D-R4 — Vorlagen & Automatik
   (ARBEITSAUFTRAG-2026-08-20_DESKTOP-RUHE-EBENEN-BAUPLAN.md §5,
   app-shell/views/shiftsTab.js #kiPlanCardWrap/#shiftPresetsCardWrap,
   app-shell/views/shiftsTabPresets.js renderPresets())
   ─────────────────────────────────────────────────────────────────────────
   Reines Restyling — 0 Endpunkt-/Handler-/API-Änderung. `html.view-desktop`-
   Scope ist hier PFLICHT, nicht nur Vorsicht (Muster wie PAKET D-R4 — Ideen
   oben): `#kiPlanCardWrap`/`#shiftPresetsCardWrap` sind DIESELBEN DOM-Knoten
   wie im D1-Sekundärleisten-Bereich „vorlagen" — Paket 4c (shiftsTabCockpit.js)
   zeigt sie über `data-cockpit-segment="plan"` UNVERÄNDERT auch im Mobile-
   Planer-Cockpit; ein ungescoptes Überschreiben hier liefe dort mit
   (Mobile-Freeze-Verstoss). Icon-Kreis-Werte 1:1 aus dem bereits etablierten
   Muster (s. PAKET D-R4 — Ideen, `.idea-row-ic`/`svg.ric`-Grösse) — kein
   neuer Wert erfunden.

   Kein `Bounty-Auto-Eskalation`-Schalter gebaut (Bauplan-Zeile §5 fordert das
   NUR, falls das Feature existiert) — verifiziert (Grep über shared/*.mjs auf
   `auto_escalat|autoEscalat`): 0 Treffer, es gibt keinen solchen Automatik-
   Schalter. `backgroundOptimization` (AP-05, der einzige echte Presets-nahe
   Automatik-Schalter) lebt bereits in `adminTabAutonomie.js` — kein Duplikat
   hier gebaut. */

/* ── Card-Kopf-Icon (beide Karten dieser Ansicht), identisches Muster wie
   PAKET D-R4 — Ideen. ── */
html.view-desktop #kiPlanCardWrap .card-head .card-title,
html.view-desktop #shiftPresetsCardWrap .card-head .card-title{display:flex;align-items:center;gap:10px}
html.view-desktop #kiPlanCardWrap .card-head .card-title svg.ric,
html.view-desktop #shiftPresetsCardWrap .card-head .card-title svg.ric{
  width:16px;height:16px;padding:10px;box-sizing:content-box;flex-shrink:0;
  border-radius:10px;background:var(--heute-mist);color:var(--heute-plum);
}

/* ── KI-Plan-Karte: EIN Coral-CTA (Bauplan §1.1) ist bereits die bestehende
   `.btn-primary`-Klasse von „Automatik-Dienstplan erstellen" (globaler
   Coral-Retint, s. Dateikopf-Konvention dieses Pakets) — keine Custom-Farbe
   nötig. „Automatik-Vorschlag" bleibt bewusst `.btn-outline` (Alternativ-
   Aktion derselben Gruppe, keine zweite primäre CTA). ── */

/* ── Vorlagen-Liste: „Preset-Karten" (Bauplan-Wortlaut §5) statt der alten
   flachen `--teal-dim`-Pille — Muster wie `.cockpit-inbox-row` (PAKET D-R4 —
   Zu erledigen): eigene Karte pro Zeile statt gestapelter Farbflächen. ── */
html.view-desktop #shiftPresetsCardWrap .preset-list{gap:8px}
html.view-desktop #shiftPresetsCardWrap .preset-item{
  background:var(--panel);border:1px solid var(--panel-border);
  border-radius:var(--radius);padding:10px 12px;box-shadow:var(--e1);
}

/* ── Automatik-Basis-Umschalter (`togglePresetKiMandatory`, per-Zeile) ist
   ein STATE-TOGGLE, keine primäre Aktion — hätte als zweite `.btn-primary`
   NEBEN „In Planung übernehmen" (bleibt DIE eine Coral-CTA-Wiederholung
   dieser Ansicht, identisches Prinzip wie das mehrfach wiederholte
   „Genehmigen" in PAKET D-R4 — Zu erledigen) zwei gleichzeitig sichtbare
   Coral-Aktionstypen ergeben — verstösst gegen §1.1. Demotion auf denselben
   Mist/Plum-deep-Zustandschip-Akzent wie `.cockpit-inbox-chip.active`/
   `.shift-desk-bereich-btn.active` (Filter-/Zustands-Chips dieses Bauplans),
   NICHT Gold — für einen gefüllten Button ist der etablierte Gold-Ton
   [`.rs-pinbtn.on`/`.rs-item.active .rs-ic`] bislang ausschliesslich
   Text-/Icon-Farbe auf transparentem Grund, nie ein Flächenfüllwert (Kontrast-
   Risiko bei Weiss-auf-Gold ungeprüft — hier bewusst der bereits kontrast-
   geprüfte Chip-Akzent verwendet). Reiner `[data-click]`-Attribut-Selektor —
   0 neue CSS-Klasse, 0 JS-Änderung nötig. ── */
html.view-desktop #shiftPresetsCardWrap .preset-item .actions [data-click="togglePresetKiMandatory"].btn-primary{
  background:var(--heute-mist);color:var(--heute-plum-deep);border-color:transparent;
}
html.view-desktop #shiftPresetsCardWrap .preset-item .actions [data-click="togglePresetKiMandatory"].btn-primary:hover{filter:none}

/* ── Leer-Zustand (0 Presets / 0 Treffer nach Filter) als eigene Karte statt
   reinem Fliesstext — Muster `.cockpit-inbox-empty`. `:only-child` trifft
   NUR den Leer-Fall (der einzige Kind-`div` von `#presetList` in diesem
   Zustand) — bei vorhandenen Presets sind das mehrere `.preset-item`-
   Geschwister, `:only-child` matcht dann keinen von ihnen. Kein `!important`
   nötig: der Leer-Zustand-`div` trägt zwar Inline-`style`, aber keine
   `background`/`border`/`border-radius`-Deklaration darin (nur text-align/
   padding/color/font-size) — eine externe Regel gewinnt hier ohne jeden
   Konflikt. ── */
html.view-desktop #shiftPresetsCardWrap #presetList > div:only-child{
  background:var(--panel);border:1px solid var(--panel-border);border-radius:var(--radius);
}
/* ═══════════════════════════════════════════════════════════════════════
   DESKTOP-BAUPLAN «RUHE · EBENEN», PAKET D-R4 — Reiter «Team»
   (ARBEITSAUFTRAG-2026-08-20_DESKTOP-RUHE-EBENEN-BAUPLAN.md §5,
   app-shell/views/staffTab.js)
   ─────────────────────────────────────────────────────────────────────────
   Reines Restyling, `html.view-desktop`-gescoped (Mobile-Freeze — die MOBILE
   Fassung derselben Klassen hat bereits ihre eigene, unabhängige Restyle-
   Schicht aus Paket M-F bekommen, s. dortiger Block weiter oben in dieser
   Datei; hier NICHTS davon angefasst, nur dieselbe visuelle Sprache
   [Kartenrahmen/Icon-Punkte/Farb-Token] für Desktop übertragen). **0 JS-
   Änderungen an staffTab.js** — anders als einige frühere D-R4-Reiter (die
   bei Bedarf kleine Markup-Ergänzungen machten) ist diese Datei mit ~1894
   Zeilen weit über dem Anti-Monolith-Budget (800 Z.) — jede hier verwendete
   ID/Klasse existiert deshalb bewusst bereits 1:1 im Markup (PANEL_HTML +
   renderStaff()/_adminCard()/_colleagueCard()/renderStaffRolesForCalendar()),
   keine neue Klasse wird erfunden. `!important` ausschliesslich dort, wo ein
   Inline-`style`-Attribut sonst gewinnen würde (identisches, bereits
   etabliertes Muster wie FN-277/Paket M-F `.staff-reminder-row`/
   `.staff-pk-reminder`, s. dortiger Kommentar für die volle Begründung).

   Farben ausschliesslich `--heute-*`-Marken-Token (§1.1). `.staff-card{box-
   shadow:var(--e1)}` ist derselbe Fehlerklasse-Fall wie D-R4 Wünsche
   `#myPreferencesCard`/`#meineWuenscheCard` — `--e1`/`--e2` sind NICHT der
   von der FLO-DIREKTIVE korrigierte, warm getönte Wert (`--shadow`) — hier
   für die Basis-Kartenfläche geschlossen (die separate Hover-Elevation
   `--e2` bewusst unangetastet gelassen — kein etablierter Präzedenzfall für
   einen eigenen erhöhten `--shadow`-Wert, ausserhalb des reinen
   Fehlerklasse-Fixes).

   ⚠️ EIN Coral-CTA dieser Ansicht (§1.1): der Prototyp (docs/konzepte/
   ROSIE-DESKTOP-FINAL-RUHE-EBENEN_2026-08-20.html, Sektion #v-team) zeigt
   NUR EINEN Button — „Einladen" (`#inviteStaffBtn`, `staff.invite_btn`,
   bestehender `openStaffInviteModal`-Flow, s. Bauplan-Tabellenzeile
   „Einladen = bestehender Invite-Flow"). `#addStaffBtn` ("Neu", manuelles
   Anlegen — im Prototyp gar nicht vorhanden) ist seit der FLO-DIREKTIVE-
   2026-08-24-NACHZUG-Korrektur (`--grad-primary`, s. Block weiter oben in
   dieser Datei) bereits automatisch GLOBAL Coral/Plum-graduiert
   (`.btn-primary`) — ohne Eingriff hätte dieser Kopf dadurch ZWEI
   coral-anmutende Buttons nebeneinander gezeigt. Identisches Demotions-/
   Promotions-Muster wie D-R4 Vorlagen & Automatik `togglePresetKiMandatory`
   (Mist/Plum-deep-Chip statt Coral-Fläche für die NICHT-primäre Aktion):
   `#addStaffBtn` wird hier demotet, `#inviteStaffBtn` (bisher `.btn-outline`,
   unauffällig) wird stattdessen zur EINEN Coral-CTA — exakt der im
   Prototyp gezeigte, tatsächlich primäre Weg, ein Teammitglied
   hinzuzufügen. Eng auf `#staffAdminBtnRow` gescopt (kein Blast-Radius auf
   `.btn-primary`/`.btn-outline` anderswo).

   ⚠️ BEWUSSTE SCOPE-GRENZE (Bauplan-Zeile „Compliance-Banner (Art. 12
   ArGV 2) + Personen-Karten-Raster; Einladen" — dokumentiert statt
   übersehen): Detail-Ansicht (`#staffDetailBody`) und die „Mein Profil"-
   Karte (`#staffMyProfileCard`, Paket 9/M-F) sind NICHT Teil dieser
   Bauplan-Zeile — bleiben unangetastet, künftige Nachbesserung falls
   explizit beauftragt. `.team-badge`/`.scheduler-badge`/`.observer-badge`
   (Tenant-/Rollen-Eigenfarben) und `.del-btn` (destruktiv) bleiben
   ebenfalls unangetastet — dieselbe „STATUS-Farben unangetastet"-Disziplin
   wie Paket M-F Regel 5. */

/* ── Kopfzeile + Suche (§5 „Personen-Karten-Raster", Einstieg) — EIN
   Coral-CTA, s. Kopfkommentar oben. ── */
html.view-desktop #staffAdminBtnRow #addStaffBtn.btn-primary{
  background:var(--heute-mist);color:var(--heute-plum-deep);border-color:transparent;
}
html.view-desktop #staffAdminBtnRow #addStaffBtn.btn-primary:hover{filter:none}
html.view-desktop #staffAdminBtnRow #inviteStaffBtn.btn-outline{
  background:var(--heute-coral);border-color:var(--heute-coral);color:#fff;font-weight:800;
}
html.view-desktop #staffAdminBtnRow #inviteStaffBtn.btn-outline:hover{filter:brightness(1.05)}
@media (prefers-reduced-motion:reduce){
  html.view-desktop #staffAdminBtnRow #addStaffBtn.btn-primary,
  html.view-desktop #staffAdminBtnRow #inviteStaffBtn.btn-outline{transition:none!important}
}
html.view-desktop .staff-search{border-radius:12px}
html.view-desktop .staff-search:focus{
  border-color:var(--heute-coral);box-shadow:0 0 0 3px rgba(255,106,61,.18);
}

/* ── Compliance-Hinweise (§5 „Compliance-Banner (Art. 12 ArGV 2)") — beide
   Zeilen tragen ihr Styling inline, daher `!important` (s. Kopfkommentar).
   Unvollständig-Hinweis wird Marken-Kachel (mist+plum); der Personenkreis-
   Banner behält amber (FN-126 — rechtliche Warnstufe, bekommt nur Form),
   identisch zu Paket M-F. ── */
html.view-desktop .staff-reminder-row{
  background:var(--heute-mist) !important;color:var(--heute-plum) !important;
  border-radius:var(--radius-lg);padding:9px 12px !important;
}
html.view-desktop .staff-reminder-row .ric{width:15px;height:15px;flex-shrink:0}
html.view-desktop .staff-pk-reminder{
  border-radius:var(--radius-lg) !important;border-left-width:4px !important;
  padding:10px 12px !important;
}
html.view-desktop .staff-pk-reminder .ric{width:15px;height:15px;flex-shrink:0}

/* ── Personen-Karten-Raster (§5) — Kartenschale/Hover/Avatar-Grösse 1:1 aus
   dem Prototyp (`.pcard`/`.avatar.lg`, 42px/15px). ── */
html.view-desktop .staff-card{box-shadow:var(--shadow)}
html.view-desktop .staff-card:hover{border-color:var(--heute-coral)}
html.view-desktop .staff-card .staff-avatar{width:42px;height:42px;font-size:15px}
html.view-desktop .staff-card .staff-name-block .name{font-size:13px}
html.view-desktop .staff-card .staff-role{color:var(--text-secondary)}
html.view-desktop .staff-empty{
  background:var(--panel);border:1px dashed var(--panel-border);
  border-radius:var(--radius-lg);padding:20px;
}
html.view-desktop .staff-more-btn{border-radius:12px}
/* Aktions-Icon „Bearbeiten" = Coral (§1.1, identisches Muster wie Paket
   M-F/D-R4 Zu-erledigen „Genehmigen" — eine je Kartenzeile wiederholte
   Aktion, keine zweite Seiten-CTA). `!important` gegen `.edit-btn`s
   app-weite Blau-Klassenfarbe, eng auf `.staff-card` gescopt (kein
   Blast-Radius auf `.edit-btn` anderswo im Repo). */
html.view-desktop .staff-card .staff-actions .edit-btn{
  background:rgba(255,106,61,.14);color:var(--heute-coral) !important;
}
html.view-desktop .staff-card .staff-actions .edit-btn:hover{
  background:var(--heute-coral);color:#fff !important;
}

/* ── Rollen-Zeilen: die beiden CSS-Emoji (`content:'🟢'`/`content:'📋 + '`,
   oben in dieser Datei) werden auf Desktop — genau wie bereits auf Mobile
   (Paket M-F §7 Regel 5) — durch gezeichnete Punkte ersetzt. `currentColor`
   statt eigenem Farbwert — folgt der (unveränderten) Rollen-Farbe. ── */
html.view-desktop .staff-role-primary::before{
  content:'';width:7px;height:7px;border-radius:50%;background:currentColor;flex-shrink:0;
}
html.view-desktop .staff-role-secondary::before{
  content:'';width:5px;height:5px;border-radius:50%;background:currentColor;
  flex-shrink:0;opacity:.7;
}
/* ════════════════ Ende Paket D-R4 — Team ════════════════ */
/* ═══════════════════════════════════════════════════════════════════════
   DESKTOP-BAUPLAN «RUHE · EBENEN», PAKET D-R4 — Admin-Inhalt
   (ARBEITSAUFTRAG-2026-08-20_DESKTOP-RUHE-EBENEN-BAUPLAN.md §5,
   app-shell/views/adminTab*.js — NUR der Inhalt rechts neben der D-R2-
   Sidebar-Gruppierung; die Gruppierung selbst [§3] ist bereits gebaut und
   NICHT Teil dieser Lane)
   ─────────────────────────────────────────────────────────────────────────
   Vorab-Recherche statt Annahme (Auftrags-Vorgabe): über alle 22
   adminTab*.js-Dateien gemessen, welche generische CSS-Klasse WIRKLICH
   geteilt wird. `.form-group` (84 Treffer über ~14 Dateien — Standard-
   Zeilen-Wrapper Label+Feld) UND die `.card`/`.card-head`/`.card-body`/
   `.card-title`-Familie (je 10 Treffer, aber nur in GENAU 3 Dateien —
   adminTabAusfallBounty.js/adminTabToolsRegio.js/adminTabTools.js) sind
   die einzigen echten Treffer. Die übrigen ~19 Sub-Tabs (Unternehmen/
   Absenzen/Strukturen/Sicherheit/Autonomie/System/Wünsche/Arbeitsrecht/
   Dienste/Zulagen/Kommunikation/Importexport/ModuleVisibility …) rendern
   ihre Abschnittsüberschriften als reine, je Datei eigene inline-gestylte
   <div>s ohne gemeinsame Klasse — ein CSS-only-Pass (0 JS-Zeilen-Wachstum,
   Auftrags-Vorgabe) kann diese bewusst NICHT erreichen, ohne in jeder
   Datei einzeln Markup zu ändern. Bewusste, hier dokumentierte
   Scope-Grenze statt eines unverhältnismässigen Einzeldatei-Sweeps.
   Scope-Anker ist `#adminSettingTabContent` (die eine, für alle 15
   Sub-Tabs gemeinsame `<div role="tabpanel">`-Mount-Stelle, s.
   adminTab.js `_renderSub()`), nicht `#tabAdmin` selbst — letzteres
   umschliesst auf Mobile weiterhin die eigenständige D2-Sidebar-Spalte,
   die unter `html.view-mobile` lebt und hier nicht angefasst wird.

   `.card` bekommt hier den wärmeren, violett-getönten `--shadow`-Token
   statt des app-weiten `--e2` (Vision-2028-Elevation-Layer, rosie.css
   Z. 940: `rgba(15,23,42,…)` — kühles Blaugrau, exakt die von Flos
   FLO-DIREKTIVE weiter oben in dieser Datei bereits für `--shadow`
   korrigierte Fehlerklasse, hier additiv auf `.card` übertragen statt
   `--e2` selbst umzudefinieren [würde jeden anderen `.card`-Konsumenten
   app-weit mitverändern] — `border-radius:var(--radius-lg)` stimmt via
   der Vision-2028-Regel [rosie.css Z. 977] bereits). Icon-Kreis nur für
   `.card-title svg.ric` (der einzige Ort, an dem ein Icon bereits Teil
   einer wiederverwendeten Komponente ist) — exaktes Muster wie die
   bereits bestehenden `.rs-avatar`/`.wish-cal-budget-icon`-Icon-Badges
   [--heute-mist/--heute-plum(-deep)]; bewusst NICHT als volle
   `.card-head`-Flächenfarbe übertragen — anders als eine kleine
   Icon-Badge-Fläche würde ein `--heute-mist`-Vollton im Dunkelmodus als
   heller Fremdkörper auf dem dunklen Panel wirken (--heute-* ist laut
   eigenem Kopfkommentar bewusst modus-invariant, kein Theme-Token).

   KEIN Coral-CTA hier: die ursprüngliche Auftrags-Annahme „.btn-primary
   ist bereits global auf Coral/Plum umgestellt" wurde vor dem Schreiben
   dieses Blocks verifiziert und ist FALSCH — `.btn-primary` nutzt
   weiterhin `--grad-primary` (Teal→Blau, rosie.css Z. 920+955); selbst
   der D-R3-eigene „Publizieren"-Button (die dort dokumentierte EINE
   Aktionsfarbe) hat bislang KEINE Coral-Überschreibung (0 Treffer auf
   `sqPublishWrap`/`sqPublishSlot` kombiniert mit `heute-coral` in dieser
   Datei). Der `.btn-primary`-Retint ist bereits als eigenes, bewusst
   zurückgestelltes App-weites Item verankert (docs/audit/BACKLOG.md,
   „hunderte Buttons app-weit") — ein nur-hier gescopter Coral-Fix würde
   eine NEUE Inkonsistenz erzeugen (Admin-Speichern coral, Dienstplan-
   Publizieren weiterhin teal) statt eine zu lösen; bewusst NICHT
   umgesetzt, s. Auftragstext „sonst .btn-primary global bereits Coral,
   keine weitere Aktion nötig" — die Prämisse trifft nicht zu, die
   Konsequenz (keine Aktion) bleibt trotzdem richtig. */
html.view-desktop #adminSettingTabContent .card{
  box-shadow:var(--shadow);
}
html.view-desktop #adminSettingTabContent .card-title{
  display:inline-flex;align-items:center;gap:8px;
}
html.view-desktop #adminSettingTabContent .card-title svg.ric{
  width:14px;height:14px;padding:6px;box-sizing:content-box;flex-shrink:0;
  border-radius:50%;background:var(--heute-mist);color:var(--heute-plum-deep);
}
/* Fokus-Ring-Politur auf den einzigen echten Zeilen-Wrapper — `:not([aria-
   invalid="true"])`-Guard ist PFLICHT: `.form-group input[aria-invalid=
   "true"]` (rosie.css, FZ-B4-Block) hat absichtlich erhöhte Spezifität
   (0,2,1, s. dortiger Kommentar "damit die rote Randfarbe … IMMER
   gewinnt"), das reicht aber nur gegen andere (0,2,1)-Regeln — die
   #adminSettingTabContent-ID hier würde die rote Fehler-Randfarbe
   OHNE diesen Guard bei jedem Fokus-Klick silently überschreiben. */
html.view-desktop #adminSettingTabContent .form-group input:focus:not([aria-invalid="true"]),
html.view-desktop #adminSettingTabContent .form-group select:focus:not([aria-invalid="true"]),
html.view-desktop #adminSettingTabContent .form-group textarea:focus:not([aria-invalid="true"]){
  border-color:var(--heute-plum-light);
  box-shadow:0 0 0 3px rgba(79,58,130,.22);
}
