/* Inhaltsbausteine der Modulseiten.
   Diese Klassen kamen bisher aus app.css, das jede Modulseite über
   app_base.html zusammen mit einem EIGENEN Header geladen hat. Der Header ist
   jetzt global (_header.html), deshalb wandern hier nur die reinen
   Inhaltsklassen mit — ohne :root/body/.site-header/.nav/.brand/.site-footer,
   die aus ui/00..30 kommen. So bleibt die Optik der Modulseiten erhalten,
   ohne die globale Kopf-/Fusszeile zu überschreiben. */
/* Eine Karte ist eine Karte: gleicher Rahmen, gleicher Radius, gleicher
   Innenabstand - egal, welche Seite sie benutzt. `.section-card` stand bisher
   in drei Vorlagen, hatte aber nirgends eine Regel; die Kaesten waren dort
   randlos, und eine Hervorhebung lief unmittelbar am Text entlang. */
.panel,.card,.section-card{border:1px solid var(--border);border-radius:var(--radius-lg);background:var(--surface);box-shadow:var(--shadow)}
.panel{padding:clamp(1.35rem,4vw,2.25rem)}
.card,.section-card{padding:clamp(1rem,3vw,1.5rem)}
.section{margin-top:1.75rem}
.grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1rem}

/* Kinder eines Rasters duerfen schrumpfen.
   Ohne diese Regel gilt fuer sie `min-width:auto`, also ihre Min-Content-
   Breite. Eine Karte mit einer Tabelle (`table{min-width:47.5rem}`) ist
   damit mindestens 760px breit und sprengt auf Tablets den Viewport - der
   Track selbst ist unschuldig, `minmax(0,1fr)` allein behebt es nicht.
   Das Scrollen uebernimmt weiterhin `.table-wrap`, wo es hingehoert. */
.grid>*{min-width:0}
.eyebrow{margin:0 0 .6rem;color:var(--brand);font-size:.78rem;font-weight:800;letter-spacing:.13em;text-transform:uppercase}
.muted{color:var(--muted)}
.empty{color:var(--muted);padding:.6rem 0}
.metric{font-size:2rem;font-weight:900;margin:.5rem 0 0}
.status-dot{display:inline-block;width:10px;height:10px;border-radius:50%;background:var(--warning);margin-right:.5rem}
.status-dot.ok{background:var(--success);box-shadow:0 0 0 5px rgba(135,217,143,.10)}
.btn.danger{background:transparent;border-color:color-mix(in srgb,var(--danger) 45%,transparent);color:#ffd4d1}
/* Zurueckhaltende Zweitaktion (Abbrechen, Zuruecksetzen). Ohne diese Regel
   sah ein `btn ghost` aus wie die Hauptaktion daneben. */
.btn.ghost{background:transparent;border-color:var(--border);color:var(--muted);font-weight:700}
.btn.ghost:hover{color:var(--text);border-color:var(--brand)}
.btn:disabled{opacity:.55;cursor:wait}
.field{display:grid;gap:.45rem}
.compact-form{margin-top:.9rem}
.toolbar{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap;margin-bottom:.9rem}
.actions{display:flex;flex-wrap:wrap;gap:.5rem}
.role-list{display:flex;flex-wrap:wrap;gap:.5rem;min-height:2.25rem;align-items:center}
.detail-divider{height:1px;background:var(--border);margin:1.75rem 0}
.member-session{margin-top:1.1rem;padding:1rem;border:1px solid var(--border);border-radius:var(--radius-md);background:rgba(255,255,255,.025)}
.member-session .toolbar{margin-bottom:0}
.event-list{display:grid;gap:.9rem}
.event-card,.duty-admin-card{border:1px solid var(--border);border-radius:var(--radius-md);background:rgba(255,255,255,.025);padding:1.1rem}
.event-card h2,.event-card h3,.duty-admin-card h3{margin-top:.25rem}
.event-time{color:var(--success);font-weight:800;font-size:.9rem}
.duty-list{display:grid;gap:.5rem;margin-top:1rem}
.duty-row{display:grid;grid-template-columns:1fr auto;gap:.9rem;align-items:center;padding:.75rem 0;border-top:1px solid var(--border)}
.duty-summary{display:flex;gap:.5rem;flex-wrap:wrap;margin-top:.75rem}
.assignment-list{display:flex;flex-wrap:wrap;gap:.5rem;margin:.9rem 0}
.assignment-chip{display:inline-flex;align-items:center;gap:.45rem;padding:.45rem .62rem;border:1px solid var(--border);border-radius:var(--radius-pill);background:var(--brand-soft)}
.assignment-chip.waitlisted{background:rgba(241,187,78,.11);border-color:rgba(241,187,78,.38);color:#ffe5a3}
.assignment-chip button{border:0;background:transparent;color:var(--text);cursor:pointer;font-size:1.05rem;line-height:1;padding:0}
#duty-panel,#member-detail-panel{scroll-margin-top:6.25rem}
/* Betrag rechts, Bezeichnung links - fuer jede Preisaufstellung.
   Der Betrag bricht nie um, die Bezeichnung darf. */
.price-list{display:grid;margin:0 0 .4rem;padding:0;list-style:none}
.price-row{display:flex;align-items:baseline;justify-content:space-between;gap:1rem;padding:.55rem 0;border-top:1px solid var(--border)}
.price-row:first-child{border-top:0}
.price-row>span:first-child{min-width:0}
.price-row small{display:block;color:var(--muted);font-size:.78rem;font-weight:400}
.price-amount{flex:0 0 auto;font-weight:800;white-space:nowrap}
/* Aufzaehlung mit Haken statt Punkt. */
.check-list{display:grid;gap:.4rem;margin:0;padding:0;list-style:none}
.check-list li{position:relative;padding-left:1.4rem}
.check-list li::before{content:"\2713";position:absolute;left:0;color:var(--brand);font-weight:900}
/* Zwei gleichwertige Karten nebeneinander. Bricht von selbst um, sobald es
   zu eng wird - deshalb ohne eigenen Breakpoint. */
.card-pair{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,22rem),1fr));gap:1rem}
.table-wrap{overflow-x:auto;border:1px solid var(--border);border-radius:var(--radius-md)}
table{width:100%;border-collapse:collapse;min-width:47.5rem}
th,td{padding:.8rem .9rem;text-align:left;border-bottom:1px solid var(--border);vertical-align:top}
th{color:var(--muted);font-size:.78rem;text-transform:uppercase;letter-spacing:.06em;background:rgba(255,255,255,.025)}
tr:last-child td{border-bottom:0}
/* Modulraster einspaltig. Eine eigene Stufe neben den 700px des Kopfes:
   hier geht es um Inhalt, nicht um die Kopfleiste. Drei Karten
   nebeneinander brauchen mehr Platz als der Kopf, deshalb bricht das
   Raster frueher. `.grid` und `.info-grid` kommen in keiner Vorlage
   gemeinsam vor - es gibt also keinen Zustand, in dem zwei Kartenraster
   unterschiedlich brechen. */
@media(max-width:820px){.grid,.duty-row{grid-template-columns:1fr}}
