/* =========================================================================
   Munich Metal Underground — Gestaltung
   =========================================================================

   Leitidee: kritische Ausgabe. Die Seite ist ein Verzeichnis, kein Magazin,
   und zwei Drittel der Bandseiten tragen keine Kurzvorstellung. Legte man
   das gestalterische Gewicht auf den Fliesstext, saehen 230 von 343 Seiten
   aus wie ein Fehler. Also traegt der APPARAT die Seite — Datenkarte,
   Belege, Statusvermerke — und die Prosa ist die Zutat. Eine Bandseite ohne
   Portraet ist dann vollstaendig und nicht lueckenhaft.

   Daraus folgt die eine Struktur, die sich durch alles zieht:

       [ Register 9.5rem ][ Spalte 36rem ]
        WAS ES IST         WAS ES SAGT

   Bezeichner, Ueberschriften und Fussnotenziffern stehen links im Register,
   die Werte rechts in der Spalte. Datenkarte, Quellenblock und
   Konzertliste benutzen dasselbe Raster — deshalb wirkt die Seite ruhig,
   obwohl sie dicht ist.

   Haerte kommt aus Kontrast und Kante: Haarlinien, keine Schatten, keine
   runden Ecken, kein Verlauf. */

/* -------------------------------------------------------------------------
   1. Merkmale
   -------------------------------------------------------------------------
   Die Farben kommen aus theme.json und stehen dort als WordPress-Merkmale
   bereit. Die Rueckfallwerte sind KEINE Zierde: Sie halten dieses Stylesheet
   allein lauffaehig — in einer statischen Entwurfsdatei, im Editor, und
   falls theme.json einmal nicht greift. Zwei Wahrheiten entstehen dadurch
   nicht, weil beide Seiten denselben Wert tragen. */
:root {
  /* ⚠️ Die Seite meldet ihre Farbgebung an. Ohne diese Zeile dunkeln
     mobile Browser sie von sich aus ab — Chrome auf Android nennt das
     „Automatisches dunkles Design fuer Webinhalte" und wendet es auf jede
     Seite an, die sich nicht aeussert.

     Solange die Seite selbst dunkel war (bis 18.08.2026), fiel das nicht
     auf. Nach der Umkehrung auf hellen Grund meldete der Betreiber am
     19.08.2026: „auf dem Handy ist die Seite immer noch dunkel" — obwohl
     Server, Stylesheet und Versionsstempel nachweislich hell auslieferten.
     Das Telefon drehte sie zurueck.

     `dark` und nicht `light dark`: Die Seite hat genau eine Fassung, und
     die ist seit dem 30.09.2026 wieder dunkel. `light dark` behauptete eine
     helle Variante, die es nicht gibt.

     ⚠️ Der Grund fuer diese Zeile bleibt derselbe wie 2026 auf hellem Grund,
     nur andersherum: Eine Seite, die sich nicht aeussert, wird vom Browser
     behandelt. Dass die Angabe jetzt zur Lage passt, macht sie nicht
     entbehrlich. */
  color-scheme: dark;

  --mmu-grund:   var(--wp--preset--color--grund,   #000000);
  --mmu-flaeche: var(--wp--preset--color--flaeche, #0f0f15);
  --mmu-tafel:   var(--wp--preset--color--tafel,   #000000);
  --mmu-text:    var(--wp--preset--color--text,    #e8e8ea);
  /* ⚠️ ZURUECK AUF DUNKEL am 30.09.2026: schwarzer Grund, helle Schrift.
     Zwischen dem 18.08. und dem 30.09.2026 war die Seite hell.

     🔴 Das ist die ZWEITE Umkehrung, und sie hebt die erste auf. Wer hier
     etwas aendert, sollte beide Vorgeschichten kennen — die von 2026/08 steht
     gleich darunter und ist NICHT erledigt, nur ueberstimmt.

     Anlass: Betreiberentscheidung vom 30.09.2026 zur Umsetzung des
     Zeitungsoptik-Handoffs ("Version 2"), der durchgehend fuer dunklen Grund
     gezeichnet ist — bis hin zu den neuen Papier-Flaechen (#ece8df), die
     ihren Reiz nur auf dunklem Grund entfalten. Die Entscheidung fiel auf
     Vorlage, in der das Handy-Leseproblem von 2026/08 ausdruecklich als
     Folge benannt war.

     Wie es dazu kam, steht in der Vorgeschichte, und sie ist lehrreich:
     Am selben Tag wurde zweimal nachgebessert, weil der Betreiber die Seite
     auf dem Handy schlecht lesen konnte. Erst --mmu-gedimmt von #a0a0a8 auf
     #b4b4bc, dann --mmu-text von #e8e8ea auf #ffffff — bis zu 21:1 auf
     reinem Schwarz, dem theoretischen WCAG-Maximum. Es half nicht: „der
     Hintergrund ist auf dem Handy zu dunkel". Der Kontrast war nie das
     Problem, die Grundhelligkeit war es. Ein Bildschirm bei Tageslicht
     gewinnt gegen jedes Verhaeltnis, wenn die Flaeche selbst dunkel bleibt.

     Gemessen nach der Rueckkehr (30.09.2026):
       Text #e8e8ea     auf Grund #000000  17,16:1   auf Kachel #0f0f15  15,61:1
       Gedimmt #a0a0a8  auf Grund           8,09:1   auf Kachel           7,36:1

     --mmu-gedimmt haelt damit auf BEIDEN Gruenden AAA (7:1) fuer Fliesstext —
     dieselbe bindende Bedingung wie bei der ersten Umkehrung, und sie geht
     mit 8,09 gegen 8,10 praktisch unveraendert durch. Die beiden Farbwelten
     sind darin gleichwertig; der Unterschied lag nie im Verhaeltnis, sondern
     in der Grundhelligkeit — siehe oben.

     ⚠️ Der Text verliert gegenueber der hellen Fassung (17,16 statt 21,00).
     Das ist kein Mangel: 21:1 ist das theoretische Maximum und war hier ein
     Nebenprodukt von reinem Schwarz auf reinem Weiss. Der Handoff setzt
     #e8e8ea statt #ffffff mit Absicht — reines Weiss auf Schwarz blendet und
     laesst Serifenschrift ausfransen.

     ⚠️ Der Wert steht ZWEIMAL: hier als Notfassung und in theme.json als
     WordPress-Preset. Das Preset gewinnt. Wer nur hier aendert, aendert
     nichts — beide muessen mit. */
  --mmu-gedimmt: var(--wp--preset--color--gedimmt, #a0a0a8);
  --mmu-akzent:  var(--wp--preset--color--akzent,  #c0392b);
  --mmu-kante:   var(--wp--preset--color--kante,   #6a6a72);
  --mmu-linie:   var(--wp--preset--color--linie,   #26262c);

  /* ⚠️ ZWEI Akzentfarben, und die Trennung ist eine Kontrastfrage.
     Zeitungsoptik-Entwurf, 17.08.2026. Die ROLLEN HABEN ZWEIMAL GETAUSCHT:
     am 18.08.2026 von Schwarz auf Weiss, am 30.09.2026 wieder zurueck.

     Das ist der unscheinbarste und gefaehrlichste Teil der Umkehrung: Auf
     dunklem Grund traegt die HELLERE Variante den Text, auf hellem die
     DUNKLERE. Gemessen:

                    auf Schwarz (heute)  auf Weiss
       #c0392b            3,86:1               5,44:1
       #d9604b            5,73:1               3,67:1
       #a5301f            2,93:1               6,90:1

     Die Tabelle liest sich in beide Richtungen, und das ist ihr Zweck: Jede
     der drei Farben faellt auf EINEM der beiden Gruende durch. Wer den Grund
     tauscht und die Roettoene stehen laesst, macht ausgerechnet die Links
     unlesbar — beim ersten Mal (2026/08) haette es #d9604b getroffen, beim
     zweiten (2026/09) traf es #a5301f mit 2,93:1.

     --mmu-akzent (#c0392b) bleibt in beiden Welten unveraendert und traegt
     auf Schwarz 3,86:1. Das genuegt fuer Striche und Rahmen (WCAG 1.4.11:
     3:1), NICHT fuer Text (1.4.3: 4,5:1) — auf Weiss war es fuer beides
     tauglich. Es ist hier also reine Flaechen- und Kantenfarbe.

     --mmu-akzent-text (#d9604b) traegt 5,73:1 auf dem Grund und 5,21:1 auf
     der Kachelflaeche. Es traegt alles, was gelesen wird — Links, Fokusring,
     Beschriftungen, Ziffern.

     ⚠️ Als FLAECHE gilt weiterhin --mmu-akzent: Weisser Text darauf steht
     bei 5,44:1. Wer stattdessen die dunklere nimmt, muss den Text darauf
     nachrechnen.

     Wer eine der beiden Farben aendert, rechnet beide Richtungen nach —
     als Schrift UND als Flaeche. */
  --mmu-akzent-text: var(--wp--preset--color--akzent-text, #d9604b);

  /* Schrift AUF der Akzentflaeche — nicht daneben.
     --mmu-akzent-text ist fuer Akzentschrift auf dem GRUND gedacht; auf dem
     Akzent selbst stuende sie Rot auf Rot. Handoff v3 fuehrt mit dem
     „Neu"-Block die erste solche Flaeche ein, und die Gummistempel der
     Eintrittskarten werden die zweite.

     📏 Weiss auf --mmu-akzent (#c0392b) ergibt 5,44:1 — AA, nicht AAA. Wer
     das anhebt, aendert die Akzentflaeche mit, nicht diesen Wert: Heller als
     Weiss geht nicht.

     ⚠️ Als Token und nicht als `#ffffff` an der Fundstelle: Reines Weiss in
     der dunklen Welt ist genau das Muster, nach dem test/farbwelt.test.mjs
     sucht, um Reste der hellen Welt zu finden. Eine harte Farbe waere dort
     ein Fund gewesen, den niemand von einem echten unterscheiden kann —
     benannt sagt sie, dass sie gemeint ist. */
  --mmu-auf-akzent: #ffffff;

  /* Die Logotafel als Klecks statt als Rechteck. Betreiberwunsch vom
     18.08.2026, nachdem der Wechsel auf hellen Seitengrund die vorher
     unsichtbare schwarze Flaeche zu einem harten Kasten gemacht hat.

     🔴 SEIN ANLASS IST AM 30.09.2026 ENTFALLEN: Auf schwarzem Grund ist die
     schwarze Flaeche wieder unsichtbar, ein Rechteck faellt nicht mehr auf.
     Der Klecks bleibt trotzdem stehen — er war ein ausdruecklicher
     Betreiberwunsch, und ihn stillschweigend zu entfernen hiesse, eine
     Entscheidung durch eine andere zu ersetzen, ohne zu fragen. Vorgelegt
     am 30.09.2026; bis zur Antwort gilt der Wunsch.

     Eine MASKE, kein Hintergrundbild: Der schwarze Grund steckt bei 157 von
     179 Logos fest im Bild und laesst sich nicht hinterlegen, nur
     beschneiden.

     ⚠️ Die Mitte der Form ist voll deckend. Der unregelmaessige Rand greift
     hoechstens 9 % der Hoehe und 4 % der Breite nach innen — beides liegt
     innerhalb des Innenabstands, damit kein Logo angeschnitten wird. Wer den
     Innenabstand verkleinert, schneidet Logos an; wer die Form aendert, muss
     diese Reserve nachrechnen.

     `preserveAspectRatio='none'`: Die Form wird mit dem Element gedehnt. Bei
     einem breiten Logo wird der Klecks entsprechend breit — gewollt, sonst
     saesse eine quadratische Form auf einem 3:1-Logo. */
  /* -----------------------------------------------------------------------
     Papier (Handoff v2, "Neue Tokens")
     -----------------------------------------------------------------------
     Die zweite Materialebene der Seite. Alles, was man anfassen koennen soll
     — Flyer an der Pinnwand, Eintrittskarten, die Merkliste, das Eselsohr
     unter jeder Seite — liegt auf Papier statt auf dem Zeitungsgrund.

     🎯 Das ist der Grund, warum die Rueckkehr auf dunklen Grund (30.09.2026)
     fuer Version 2 noetig war: Auf weissem Grund waere Papier #ece8df kaum
     vom Grund zu unterscheiden gewesen. Auf Schwarz steht es bei 17,17:1 und
     hebt sich wie ein aufgelegtes Blatt ab.

     Gemessen (WCAG), auf Papier #ece8df:
       Papier-Text  #17171b   14,62:1   Fliesstext AAA
       Akzent       #a93226    5,42:1   Text AA
       Kante hell   #b9b3a6    1,71:1   ⚠️ siehe unten
       Kante dunkel #8d887d    2,89:1   ⚠️ siehe unten

     ⚠️ Die beiden KANTEN unterschreiten die 3:1 aus WCAG 1.4.11, und das ist
     kein Mangel: Die Regel gilt fuer bedeutungstragende grafische Elemente
     und die Grenzen von Bedienelementen. Diese Kanten umranden eine Flaeche,
     die selbst 17:1 gegen den Grund traegt — das Papier ist auch ohne sie
     zweifelsfrei zu sehen, sie geben ihm nur Rand und Schatten. Wer eine
     Kontrastpruefung ueber diese Tokens baut, muss Dekoration ausnehmen,
     sonst erzeugt sie Fehlalarme und wird bald ueberlesen. */
  --mmu-papier:        #ece8df;
  --mmu-papier-kante:  #b9b3a6;
  --mmu-papier-falz:   #8d887d;
  --mmu-papier-text:   #17171b;
  --mmu-papier-akzent: #a93226;

  /* 🔴 LEISE SCHRIFT AUF PAPIER — und der Grund, warum es sie geben muss:

     Am 30.09.2026 live gemessen, nach der Auslieferung um 19:52:

       --mmu-papier-falz  (#8d887d) auf Papier   2,89:1   <- unter AA
       --mmu-papier-kante (#b9b3a6) auf Papier   1,71:1
       --mmu-papier-text  (#17171b) auf Papier  14,62:1

     Ich hatte --mmu-papier-falz an vier Stellen als TEXTFARBE benutzt:
     die Zahl im Register-Reiter, die Beschriftungen auf den Vereins-
     zetteln, der Ort im Schriftplakat und eine vierte.

     Der Name sagt, was es ist — ein FALZ, und ein Falz ist DEKORATION.
     Er trennt nichts, was man sonst nicht unterscheiden koennte: Das
     Eselsohr nennt seine Richtung zusaetzlich als Wort („Vorige Seite" /
     „Naechste Seite"), und das Schriftplakat grenzt sich durch seinen
     Papiergrund ab, nicht durch den Rahmen. Fuer Dekoration gilt keine
     Kontrastgrenze — WCAG 1.4.11 nimmt sie ausdruecklich aus.

     ⚠️ HIER STAND ZUERST ETWAS ANDERES, und es trug nicht: „Eine
     Linienfarbe muss 3:1 halten (WCAG 1.4.11)." Das waere ein Argument
     gewesen, wenn 2,89 die 3:1 hielte — tut es aber auch nicht. In beiden
     Lesarten ging der Satz daneben: Waere der Falz bedeutungstragend,
     waere die Behebung unvollstaendig; da er Dekoration ist, war die
     Begruendung ueberfluessig und als Regel irrefuehrend. (Befund der
     Orte-Sitzung, 30.09.2026, mit dem Hinweis auf ihren eigenen Fall vom
     selben Morgen: Ihr Pruefskript meldete eine dekorative Trennlinie mit
     1,40:1 als Durchfaller.)

     🎯 Die Unterscheidung ist NICHT messbar, sondern eine Entscheidung
     ueber die Rolle des Elements. Eine Kontrastpruefung, die Dekoration
     nicht ausnimmt, erzeugt Fehlalarme; eine, die zu grosszuegig
     ausnimmt, uebersieht echte Maengel.

     Als SCHRIFT dagegen gilt 4,5:1, und 2,89 faellt durch. Der Token war
     richtig gewaehlt und falsch verwendet.

     ⚠️ Das ist die vierte Fundstelle desselben Tages in der Papierwelt,
     aber eine andere Ursache als die drei davor: Dort wurde eine Farbe
     GEERBT, die nicht gemeint war. Hier wurde eine gesetzt, die gemeint
     war und nicht taugt. Ein Kontrastwert gehoert gemessen, auch wenn
     die Farbe aus der richtigen Welt kommt.

     📏 #615d55 ergibt 5,36:1 — leise genug, um neben --mmu-papier-text
     zurueckzutreten, und ueber der Textgrenze. */
  --mmu-papier-leise: #615d55;

  /* Die Feder aus dem Handoff, als Token statt zwanzigmal abgeschrieben:
     "cubic-bezier(.2,1.5,.4,1), leichtes Ueberschwingen, 250-500ms". */
  --mmu-feder: cubic-bezier(.2, 1.5, .4, 1);

  --mmu-klecks: url("data:image/svg+xml,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%20200%2080'%20preserveAspectRatio%3D'none'%20fill%3D'%23000'%3E%3Cpath%20d%3D'M8%2C18%20C12%2C8%2026%2C4%2042%2C5%20C56%2C1%2074%2C4%2092%2C3%20C112%2C1%20134%2C5%20152%2C4%20C170%2C3%20186%2C7%20192%2C15%20C198%2C23%20199%2C40%20196%2C52%20C193%2C64%20184%2C74%20168%2C76%20C150%2C79%20130%2C75%20110%2C77%20C88%2C79%2066%2C76%2048%2C77%20C30%2C78%2014%2C74%208%2C64%20C2%2C53%203%2C29%208%2C18%20Z'%2F%3E%3C%2Fsvg%3E");

  /* Die Schriften des Zeitungsentwurfs. Alle vier liegen lokal als WOFF2
     (§5.2: nichts von fremden Servern) und sind in theme.json angemeldet;
     die Tokens hier machen sie im Stylesheet greifbar, ohne dass jede
     Regel den ganzen Stapel wiederholt. */
  --schrift-ui:     var(--wp--preset--font-family--grundschrift, "IBM Plex Sans", system-ui, sans-serif);
  --schrift-prosa:  var(--wp--preset--font-family--serifenschrift, "IBM Plex Serif", Georgia, serif);
  --schrift-mono:   var(--wp--preset--font-family--schreibmaschine, "IBM Plex Mono", ui-monospace, monospace);
  --schrift-titel:  var(--wp--preset--font-family--titelschrift, "UnifrakturCook", "IBM Plex Serif", serif);

  /* Der Seitengrund IST das Schwarz der Logos, nicht ein dunkles Grau
     daneben. Damit verschwindet die Logotafel vollstaendig — 130 der 158
     undurchsichtigen Logos tragen reines Schwarz am Rand, sie gehen
     nahtlos in die Seite ueber.

     --mmu-tafel bleibt trotzdem ein eigenes Merkmal, obwohl es jetzt
     denselben Wert traegt: Es haelt die Zusage fest, dass Logos auf reinem
     Schwarz sitzen. Wuerde der Seitengrund je aufgehellt, schuetzt die
     Tafel die Logos weiterhin, ohne dass jemand den Zusammenhang neu
     entdecken muss.

     Flaeche und Linie sind mitgezogen: Auf einem dunkleren Grund wirkt
     jede Aufhellung staerker. #1b1b1f stand 1.099:1 ueber dem alten
     Grund, #0f0f15 stand ueber Schwarz bei denselben 1.099:1 — die
     Abstufung blieb also genau so leise wie vorher, statt sich
     ungewollt zu verschaerfen. Fuer die Linie ebenso: 1.400 -> 1.396.

     ⚠️ Historisch, gilt fuer die dunkle Fassung bis 18.08.2026. Seither
     ist der Grund weiss: Kachel #f4f4f6 steht bei 1.075:1 darunter, die
     Linie #d5d5da bei 1.457:1. Dasselbe Prinzip, dieselbe Groessenordnung,
     nur andersherum — die Kachel ist jetzt minimal DUNKLER als der Grund
     statt heller. */

  /* Zwei Linienstaerken, und das ist eine Zugaenglichkeitsfrage, keine
     Geschmacksfrage: Eine Trennlinie in einer Liste ist Zierde und darf
     leise sein (1.40:1). Der Umriss eines Bedienelements muss nach
     WCAG 1.4.11 mindestens 3:1 erreichen — --mmu-kante liegt bei 3.52:1.
     Das alte, einheitliche #444 lag bei 1.94:1 und trug beides. */

  --mmu-register: 9.5rem;   /* Bezeichnerspalte */
  --mmu-spalte:   36rem;    /* Lesespalte: rund 75 Zeichen in Plex Sans */
  --mmu-luecke:   1.5rem;
  --mmu-rahmen:   72rem;    /* Aussenmass, deckungsgleich mit alignwide */
  --mmu-rand:     clamp(1rem, 4vw, 2rem);

  --t-mikro: 0.75rem;
  --t-klein: 0.8125rem;
  --t-neben: 0.875rem;
  --t-prosa: 1.0625rem;
  --t-gross: 1.375rem;

  --raum-1: 0.25rem;
  --raum-2: 0.5rem;
  --raum-3: 0.75rem;
  --raum-4: 1rem;
  --raum-5: 1.5rem;
  --raum-6: 2rem;
  --raum-7: 3rem;
}

/* -------------------------------------------------------------------------
   2. Der Seitenrahmen
   -------------------------------------------------------------------------
   Gemessen am 11.08.2026: <main> steht direkt unter <body>, ausserhalb
   jedes begrenzten Containers — ohne Innenabstand, ueber die volle
   Fensterbreite. Der Kopfbereich sitzt dagegen in einer 72rem-Spalte. Auf
   einem breiten Schirm klebte die Bandliste an der Fensterkante, waehrend
   die Navigation darueber ordentlich eingerueckt war.

   Die Rechnung mit calc() ist der Punkt: alignwide im Kopfbereich ist
   72rem OHNE Innenabstand. Ein blosses max-width:72rem hier ergaebe 72rem
   INKLUSIVE Abstand — Kopf und Inhalt saessen um zweimal --mmu-rand
   versetzt. Deshalb wird der Abstand aufgeschlagen. */
main[class^="mmu-"],
main[class*=" mmu-"],
.mmu-kopf,
.mmu-fuss,
/* .mmu-ticker haengt direkt unter <body>, wie <main> — ohne ihn hier waere
   er das einzige Seitenelement ohne Spaltenbegrenzung: "NEU" begaenne bei
   x = 0, waehrend Kopf, Rubrikenleiste und <main> eingerueckt sitzen. */
.mmu-ticker {
  /* Den Randabstand NICHT selbst erfinden, sondern den des Themes
     uebernehmen. Gemessen: Ein eigener Wert (clamp(1rem,4vw,2rem) = 32px)
     setzte den Inhalt 16px links neben den Kopfbereich, der bei 48px
     begann — sichtbar als Versatz zwischen Navigation und Liste.

     WordPress legt --wp--style--root--padding-right auf BODY ab, nicht auf
     :root. Deshalb steht die Zuweisung hier und nicht oben bei den
     Merkmalen: In :root ist die Variable nicht sichtbar, der Rueckfallwert
     haette immer gegriffen. */
  --mmu-rand: var(--wp--style--root--padding-right, clamp(1rem, 4vw, 2rem));

  max-width: calc(var(--mmu-rahmen) + 2 * var(--mmu-rand));
  margin-inline: auto;
  padding-inline: var(--mmu-rand);
  box-sizing: border-box;
}

main[class^="mmu-"],
main[class*=" mmu-"] {
  padding-block: var(--raum-6) var(--raum-7);
}

/* -------------------------------------------------------------------------
   2a. Die Grundgroesse gehoert dieser Seite, nicht dem Elterntheme
   -------------------------------------------------------------------------
   Twenty Twenty-Five setzt `body { font-size: var(--wp--preset--font-size--
   large); font-weight: 300 }`. Die GEERBTE Groesse war damit 22px, nicht die
   16, gegen die die Skala unten gebaut ist. Alle rem-Werte stimmten
   trotzdem, weil rem an <html> haengt (16px) — aber jedes Element OHNE
   gesetzte Groesse erbte 22px.

   Gemessen auf der Bandseite, bevor diese Regel stand:

       Bandname          34px
       Datenkartenwert   22px   <- geerbt
       Konzertzeile      22px   <- geerbt
       Kurzvorstellung   17px   <- gesetzt (--t-prosa)
       Quellenangabe     14px
       Bezeichner        13px

   Der Lesetext war also KLEINER als die Metadaten daneben, und der
   Datenkarten-Bezeichner stand mit 13px neben einem 22px-Wert. Eine Skala,
   die nur fuer die Haelfte der Seite gilt, ist keine.

   font-weight ebenso: Der Body deklariert 300, ausgeliefert werden 400 und
   600. Der Browser waehlt dann 400 — sichtbar richtig, aber nur zufaellig.
   Kaeme je eine 300er-Datei dazu, wuerde die ganze Seite duenner, ohne dass
   jemand etwas geaendert haette. */
main[class^="mmu-"],
main[class*=" mmu-"],
.mmu-kopf,
/* 📏 Entwurf: 0.8125rem auf #a0a0a8. Gemessen waren 1rem in der Textfarbe --
   der Fuss sprach damit so laut wie der Inhalt. Er traegt Rechtliches und
   einen Satz ueber fremde Server; beides darf leiser stehen. */
.mmu-fuss {
  font-size: 0.8125rem;
  font-weight: 400;
  color: var(--mmu-gedimmt);
}

/* -------------------------------------------------------------------------
   2b. Die zwei Blockseiten gehoeren dazu
   -------------------------------------------------------------------------
   /ueber/ und /impressum/ laufen ueber Block-Vorlagen und tragen kein
   main.mmu-*. Die Regel darueber erreichte sie deshalb nicht, und weil die
   Navigation beide Typen nebeneinander auffuehrt, sprang beim Wechsel die
   halbe Seite. Vom Betreiber in der Bedienung bemerkt, am 12.08.2026
   nachgemessen:

                        /bands/     /ueber/
       Kopfzeile          57          57      (stimmte schon)
       Inhalt beginnt     57         345      <- 288px Sprung
       Grundschrift     16px        22px      <- geerbt von Twenty Twenty-Five

   Beide Haelften stammen aus dieser Arbeit: Die Grundgroesse wurde in
   Abschnitt 2a nur fuer die Plugin-Seiten geradegerueckt, und contentSize
   ging von 44rem auf 36rem — was die Blockseiten schmaler machte, ohne dass
   sie den 72rem-Rahmen der Plugin-Seiten bekommen haetten.

   Der Einzug: Das Blockthema zentriert die Inhaltsspalte per
   `margin-inline: auto`. Auf einer Seite, deren ganzes Raster an einer
   linken Registerkante haengt, ist zentrierter Text der Fremdkoerper —
   nicht umgekehrt. Deshalb linksbuendig statt zentriert, und die Lesespalte
   bleibt bei 36rem: Prosa darf schmaler laufen als eine Bandliste, das ist
   kein Widerspruch, sondern derselbe Wert wie in der Lesespalte der
   Bandseite.

   Ausgenommen bleibt, was der Site-Editor ausdruecklich anders ausrichtet
   (alignwide, alignfull, alignleft, alignright) — sonst braeche diese Regel
   jede spaetere Gestaltung im Editor. */
main.wp-block-group {
  /* Denselben Rahmen wie die Plugin-Seiten, sonst beginnt der Text bei 50px
     statt bei 57: Dort sorgt max-width plus margin:auto dafuer, dass der
     Inhalt mittig im Fenster sitzt und dadurch um wenige Pixel einrueckt.
     Ohne diese zwei Zeilen bliebe ein Restsprung von 7px gegen Kopf und
     Fuss — klein, aber genau die Art Unruhe, um die es hier geht. */
  --mmu-rand: var(--wp--style--root--padding-right, clamp(1rem, 4vw, 2rem));
  max-width: calc(var(--mmu-rahmen) + 2 * var(--mmu-rand));
  margin-inline: auto;

  font-size: 1rem;
  font-weight: 400;
}
/* Die zentrierten Elemente sind NICHT die direkten Kinder von <main>. Der
   Aufbau der Blockseite ist dreistufig, und die mittleren Ebenen sind selbst
   alignfull:

       main.is-layout-constrained
       └─ div.wp-block-group.alignfull.has-global-padding
          ├─ h1.wp-block-post-title              <- zentriert
          └─ div.entry-content.alignfull
             ├─ h2.wp-block-heading              <- zentriert
             └─ p.wp-block-paragraph             <- zentriert

   Ein Selektor, der nur am <main> ansetzt, trifft davon nichts — die
   direkten Kinder sind gerade die alignfull-Container, die ausgenommen
   gehoeren. Deshalb greift die Regel auf JEDEN begrenzten Container
   innerhalb von <main>, egal wie tief.

   Auf main beschraenkt, damit Kopf- und Fussbereich unberuehrt bleiben:
   Deren Gruppen sind ebenfalls is-layout-constrained, und dort ist die
   Zentrierung richtig. */
/* !important, und zwar nachgewiesen noetig, nicht vorsorglich: Ein
   margin-left:0 direkt am Element (inline, also staerker als jede
   Autorenregel) bewegte den Absatz NICHT — erst mit Vorrang sprang er an die
   linke Kante. Es existiert also eine !important-Regel im Blocklayout. In den
   auslesbaren Stylesheets ist sie nicht zu finden; document.styleSheets
   liefert sie nicht. Gegen eine unauffindbare Vorrangregel hilft nur Vorrang.

   Geprueft, dass es nichts anderes mitreisst: Kopf- und Fussbereich bleiben
   unveraendert bei 57px, kein waagerechter Ueberlauf. */
main.is-layout-constrained
  > :not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright),
main .is-layout-constrained
  > :not(.alignwide):not(.alignfull):not(.alignleft):not(.alignright) {
  margin-left: 0 !important;
  margin-right: auto !important;
}

/* =========================================================================
   2c. Der Zeitungskopf
   =========================================================================
   Steht bei Abschnitt 2, weil er die OBERE KANTE desselben Rahmens ist: Er
   teilt die 72rem-Spalte und das Randmass der Regel oben, sonst saesse der
   Titel neben der Liste darunter statt ueber ihr.

   Zwei Haelften, und die Trennung ist keine Willkuer:

       .mmu-kopf          Zeichen, Name, Unterzeile, Datumszeile — aus
                          header.php, weil es gerechnete Angaben sind
       Rubrikenleiste     die Navigation des Site-Editors, hier nur neu
                          gestaltet — kein neues Menue

   Der Entwurf setzt den Namen als h1. Hier ist er ein Absatz: Jede Seite
   fuehrt bereits eine eigene h1 (Bandname, Archivtitel), und eine zweite auf
   760 Seiten waere ein Rangfehler. Die Groesse macht die Gestaltung. */
.mmu-kopf { padding-top: 1.25rem; }

/* Der Doppelstrich als erzeugter Inhalt, nicht als leeres <div>: 3px Linie,
   4px Luft, 1px Linie. Er ist Zierde und hat im Markup nichts verloren. */
.mmu-kopf::before {
  content: "";
  display: block;
  height: 4px;
  border-top: 3px solid var(--mmu-text);
  border-bottom: 1px solid var(--mmu-text);
}

.mmu-kopf-titel {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--raum-5);
  padding: 1.75rem 0 1.25rem;
}
/* Das Zeichen darf nicht schrumpfen, wenn der Name lang wird. */
.mmu-zeichen { flex: none; }

.mmu-kopf-name {
  margin: 0;
  font-family: var(--schrift-titel);
  font-weight: 700;
  font-size: clamp(2.5rem, 7vw, 4.5rem);
  /* UnifrakturCook traegt hohe Oberlaengen. Ohne feste Zeilenhoehe reisst
     die Vorgabe des Browsers den Kopf bei 4.5rem sichtbar auseinander. */
  line-height: 1.1;
  letter-spacing: 0.01em;
  color: var(--mmu-text);
}

/* Handoff v3: Serif KURSIV statt gesperrter Versalien.
   „München rockt und zwar gewaltig" ist ein Zuruf, kein Rubrikenetikett —
   die Versalien liessen ihn wie eine Beschriftung aussehen.

   📏 Kontrast steigt dabei mit: --mmu-text auf dem Grund ergibt 17,16:1
   statt der 8,09:1 von --mmu-gedimmt. Beides war AAA, aber die Zeile ist
   jetzt groesser und soll gelesen werden, nicht nur dastehen.

   ⚠️ Mit den Versalien faellt auch die Sperrung weg — und mit ihr der
   `text-indent`, der nur ihren Ueberhang hinter dem letzten Zeichen
   ausglich. Die Ausrichtung auf die Wortmarke weiter unten bleibt dagegen:
   Die haengt am Zeichen links, nicht an der Schrift. */
.mmu-kopf-unterzeile {
  margin: 0 0 0.9rem;
  text-align: center;
  font-family: var(--schrift-prosa);
  font-style: italic;
  font-size: clamp(1rem, 2.4vw, 1.25rem);
  color: var(--mmu-text);

  /* Ausrichtung auf die WORTMARKE, nicht auf die Seitenmitte (17.08.2026).
     .mmu-kopf-titel zentriert Zeichen UND Wortmarke als Gruppe. Die Mitte
     der Wortmarke liegt dadurch um die halbe Breite von Zeichen + Abstand
     rechts der Seitenmitte — die Unterzeile stand um genau diesen Betrag zu
     weit links, sichtbar als schiefer Kopf.

     Der Einzug halbiert sich: Er verkuerzt die Zeilenbreite am Anfang, die
     zentrierte Zeile rueckt danach um die HAELFTE nach rechts. Deshalb steht
     hier die volle Summe und nicht ihre Haelfte — dieselbe Rechnung, die
     schon hinter dem 0.22em darueber steckt.

     ⚠️ Die 64px sind kein freier Wert: Sie stehen in functions.php als
     mmu_zeichen_svg( 64 ). Wer die Zeichengroesse dort aendert, muss sie
     hier mitfuehren, sonst steht die Unterzeile wieder schief. */
  padding-inline-start: calc(64px + var(--raum-5));
}

/* Rechts aussen das Gebiet, wo eine Zeitung ihren Preis traegt.
   ⚠️ Bewusst OHNE Zahl: Die Mitte derselben Zeile zaehlt die Landkreise
   bereits (gemessen ueber die Taxonomie, mit hide_empty). Eine zweite Zahl
   rechts waere eine zweite Wahrheit — und sie veraltete bei der naechsten
   Gebietserweiterung still. Betreiberentscheidung 30.09.2026, Variante B. */
.mmu-kopf-gebiet {
  white-space: nowrap;
}

.mmu-kopf-daten {
  display: flex;
  justify-content: space-between;
  gap: var(--raum-4);
  padding: 0.4rem var(--raum-1);
  border-top: 1px solid var(--mmu-kante);
  border-bottom: 1px solid var(--mmu-kante);
  font-size: var(--t-klein);
  color: var(--mmu-gedimmt);
}
.mmu-kopf-bestand { text-align: center; }

/* -------------------------------------------------------------------------
   Der Logo-Tritt (Handoff v2, Interaktion 1)
   -------------------------------------------------------------------------
   „Hover → Fuss hebt sich (translateY -8px, rotate -12deg, Feder). Klick →
   Stauchung (scaleY .82, 70ms), Kopfbereich ruckt 4px nach unten, an
   zufaelliger Stelle ein grosser Abdruck."

   Die Hebung steckt HIER und nicht im Skript: Sie braucht kein JavaScript,
   und eine Seite, deren Skript nicht laedt, soll trotzdem reagieren. Das
   Skript (assets/logo-tritt.js) macht nur, was CSS allein nicht kann — den
   Klick abfangen, den Abdruck setzen, danach navigieren.

   ⚠️ @media (hover: hover): Auf einem Touchgeraet gibt es kein Verlassen mit
   der Maus. Der zuletzt beruehrte Link bliebe im Hover-Zustand haengen, und
   das Logo stuende schief, bis man woanders hintippt. */
@media (hover: hover) {
  .mmu-kopf-link .mmu-zeichen {
    /* Die Feder aus dem Handoff: „cubic-bezier(.2,1.5,.4,1), leichtes
       Ueberschwingen". Der Fuss schnellt also ein Stueck ueber seine
       Endlage hinaus und faellt zurueck — das macht die Bewegung
       koerperlich statt mechanisch. */
    transition: transform 320ms cubic-bezier(.2, 1.5, .4, 1);
  }
  .mmu-kopf-link:hover .mmu-zeichen {
    transform: translateY(-8px) rotate(-12deg);
  }
}

/* Die Tastaturbedienung bekommt dieselbe Hebung, und zwar AUSSERHALB der
   hover-Abfrage: Wer mit der Tabulatortaste auf dem Logo landet, soll sehen,
   dass es sich um dasselbe Element handelt — auch auf einem Touchgeraet mit
   angestecktem Keyboard, wo (hover: hover) nicht greift. */
.mmu-kopf-link:focus-visible .mmu-zeichen {
  transform: translateY(-8px) rotate(-12deg);
  transition: transform 320ms cubic-bezier(.2, 1.5, .4, 1);
}

/* Der Tritt selbst. transform-origin unten, sonst staucht der Fuss um seine
   Mitte und sieht aus, als schrumpfe er — er soll auf den Boden treten. */
.mmu-kopf-link.mmu-tritt .mmu-zeichen {
  transform: scaleY(0.82);
  transform-origin: 50% 100%;
  transition-duration: 70ms;
}

/* Der Ruck des Kopfes. 4px, wie im Handoff — genug, um den Aufschlag zu
   spueren, zu wenig, um den Satz zu verschieben. */
.mmu-kopf {
  transition: transform 90ms cubic-bezier(.2, 1.5, .4, 1);
}
.mmu-kopf.mmu-kopf-geruckt {
  transform: translateY(4px);
}

/* Der Abdruck. position: fixed und pointer-events: none — er liegt ueber
   der Seite, aber er faengt keinen Klick ab: Wer waehrend des Tritts auf
   einen Link zielt, soll ihn treffen und nicht den Abdruck.

   🔴 Das Element ist rein dekorativ und traegt aria-hidden (im Skript).
   Es steht am Ende von <body>, ausserhalb jeder Landmarke. */
.mmu-abdruck {
  position: fixed;
  z-index: 60;
  pointer-events: none;
  opacity: 0.2;
  fill: var(--mmu-text);
  transform: rotate(var(--mmu-abdruck-dreh, 0deg)) scale(1);
  /* Von 1.6 auf 1, wie der Handoff es zeichnet: Der Abdruck faellt auf die
     Seite, statt auf ihr zu wachsen. */
  animation: mmu-abdruck-setzen 420ms cubic-bezier(.2, 1.5, .4, 1);
}
.mmu-abdruck-weg {
  opacity: 0;
  transition: opacity 400ms linear;
}
@keyframes mmu-abdruck-setzen {
  from { opacity: 0;   transform: rotate(var(--mmu-abdruck-dreh, 0deg)) scale(1.6); }
  to   { opacity: 0.2; transform: rotate(var(--mmu-abdruck-dreh, 0deg)) scale(1); }
}

/* -------------------------------------------------------------------------
   Der Logo-Tritt, Stufen 1 bis 3 (Handoff v3)
   -------------------------------------------------------------------------
   1. Beim Laden laeuft eine Spur von Hufabdruecken ueber den Schirm.
   2. Beim Klick springt der Huf brennend davon, schlaegt ein und brennt ein
      Loch in die Seite.
   3. Danach schiebt ein Mensch einen Scheinwerfer ins Bild und wirft den
      Huf als Signal an den Himmel.

   ⚠️ Alles hier ist Zier und traegt aria-hidden (im Skript). Die Elemente
   stehen am Ende von <body>, ausserhalb jeder Landmarke. */

/* Die Spur beim Laden: dieselbe Gestalt wie der einzelne Abdruck, nur
   etwas blasser — es sind viele auf einmal. */
.mmu-abdruck-spur { opacity: 0.16; }

/* 🔴 Die Feuer-Leinwand liegt UEBER der Seite, aber UNTER dem Signal
   (z-index 79 gegen 75 … 80). Sie nimmt keine Klicks an und raeumt sich
   selbst weg, sobald kein Teilchen mehr lebt. */
.mmu-feuer {
  position: fixed;
  inset: 0;
  width: 100vw;
  height: 100vh;
  pointer-events: none;
  z-index: 79;
}

/* Der fliegende Huf. Der Schein um ihn herum sind drei gestaffelte
   Schlagschatten — innen gelb, aussen das Rot des Hauses. */
.mmu-huf-flug {
  position: fixed;
  left: 0;
  top: 0;
  pointer-events: none;
  z-index: 80;
  will-change: transform;
}
.mmu-huf-flug .mmu-zeichen {
  width: 100%;
  height: 100%;
  display: block;
  /* ⚠️ --mmu-text statt #fff: Das Stylesheet hat eine eigene Zusage gegen
     harte Farben aus der Gegenwelt, und sie hat zu Recht angeschlagen. Der
     Huf im Kopf erbt dieselbe Farbe — der fliegende soll derselbe sein. */
  fill: var(--mmu-text);
  filter:
    drop-shadow(0 0 4px #ffb040)
    drop-shadow(0 0 14px #e0501a)
    drop-shadow(0 0 30px rgb(192 57 43 / 0.8));
}

/* ⚠️ Waehrend der Huf fliegt, ist der im Kopf unsichtbar — sonst waere er
   zweimal da. `visibility` und nicht `display`: Der Platz bleibt stehen,
   und die Kopfzeile springt nicht. */
.mmu-kopf-link.mmu-huf-weg .mmu-zeichen { visibility: hidden; }

/* Das eingebrannte Loch. Es liegt ABSOLUT (nicht fixed): Es gehoert zur
   Seite und soll mit ihr scrollen — ein Brandloch wandert nicht mit dem
   Blick. */
.mmu-brandloch {
  position: absolute;
  pointer-events: none;
  z-index: 30;
}
.mmu-brandloch .mmu-glutrand {
  filter: drop-shadow(0 0 7px #ff7a1a) drop-shadow(0 0 14px #c0392b);
}

/* ── Das Batsignal ───────────────────────────────────────────────────── */
.mmu-signal {
  position: fixed;
  inset: 0;
  pointer-events: none;
  z-index: 75;
  overflow: hidden;
}

/* 🔴 `screen`: Licht ADDIERT sich, es deckt nicht ab. Ohne das laege ein
   milchiges Dreieck ueber der Seite statt eines Strahls. */
.mmu-signal-strahl {
  position: absolute;
  inset: 0;
  opacity: 0;
  mix-blend-mode: screen;
  overflow: visible;
}

/* Die Signalscheibe am Himmel: ein Lichtkreis mit dem Huf als Schattenriss.
   Der Verlauf laeuft nach aussen ins Nichts, damit keine Kante entsteht. */
.mmu-signal-scheibe {
  position: absolute;
  left: 0;
  top: 0;
  opacity: 0;
  border-radius: 50%;
  background: radial-gradient(ellipse at center,
    rgb(255 248 220 / 0.96) 0%,
    rgb(255 238 178 / 0.9) 42%,
    rgb(255 214 130 / 0.5) 62%,
    rgb(255 190 90 / 0.12) 70%,
    rgb(255 190 90 / 0) 74%);
  display: flex;
  align-items: center;
  justify-content: center;
  will-change: transform, opacity;
}

/* ⚠️ Der Huf IM Signal ist schwarz, nicht weiss: Er ist der Schatten in der
   Lampe, nicht das Licht. Der leichte Weichzeichner nimmt ihm die Schaerfe,
   die eine Projektion ueber diese Entfernung nicht haette. */
.mmu-signal-huf {
  width: 46%;
  height: 56%;
  filter: blur(0.6px);
  opacity: 0.9;
}

/* 🔴 DIE GRUPPE IM SVG, nicht nur das SVG. Das Zeichen bringt sein eigenes
   fill-ATTRIBUT mit (filter.php: `<g fill="var(--mmu-text)">`). Ein
   Praesentationsattribut verliert zwar gegen jede CSS-Regel — aber nur
   gegen eine, die DIESES Element trifft. Eine Regel am <svg> darueber
   nuetzt nichts: Die Gruppe erbt nicht, weil sie selbst etwas sagt.

   📏 Gemessen: <svg> auf rgb(0,0,0), die Pfade darin auf rgb(232,232,234).
   Der Huf stand hell im hellen Licht und war kaum zu sehen.

   🎯 Schwarz, nicht gedimmt: Er ist der Schatten IN der Lampe. Je dunkler,
   desto klarer hebt er sich vom Lichtkreis ab. */
.mmu-signal-huf g,
.mmu-signal-huf path {
  fill: #000;
}

.mmu-signal-trupp {
  position: absolute;
  left: 0;
  bottom: 0;
  overflow: visible;
}


/* ⚠️ Der Ausschalter, und er gehoert zu jeder Bewegung dieser Seite:
   „prefers-reduced-motion: reduce → Wackeln, Umblaettern, Abriss- und
   Stempelanimation aus" (Handoff v2).

   Das Skript meldet sich dann gar nicht erst an; diese Regeln fangen den
   Rest — den reinen Hover-Effekt, der ohne Skript auskommt. Beide Haelften
   sind noetig: Ein Skript, das schweigt, nimmt die CSS-Bewegung nicht mit. */
@media (prefers-reduced-motion: reduce) {
  .mmu-kopf-link .mmu-zeichen,
  .mmu-kopf-link:hover .mmu-zeichen,
  .mmu-kopf-link:focus-visible .mmu-zeichen,
  .mmu-kopf-link.mmu-tritt .mmu-zeichen,
  .mmu-kopf,
  .mmu-kopf.mmu-kopf-geruckt {
    transform: none;
    transition: none;
  }
  .mmu-abdruck { display: none; }
}

/* -------------------------------------------------------------------------
   Die Rubrikenleiste
   -------------------------------------------------------------------------
   Gestaltet wird, was der Site-Editor liefert. Der Zugriff laeuft ueber
   :has(> .wp-block-site-title), weil der Vorlagenteil KEINE eigene Klasse
   traegt — gemessen am 17.08.2026 rendert er als blosses
   div.wp-block-group.alignfull, und darauf lassen sich Regeln nicht
   verlaesslich haengen. Der Seitentitel dagegen hat eine stabile Blockklasse
   und steht genau einmal im Dokument. */
.wp-block-group:has(> .wp-block-site-title) {
  justify-content: center;
  border-bottom: 3px double var(--mmu-kante);
  /* !important, und nachgewiesen noetig: Der Vorlagenteil setzt die
     Innenabstaende ALS INLINE-STIL (padding-top/-bottom aus spacing|30).
     Inline schlaegt jeden Selektor; ohne Vorrang bliebe die Leiste rund
     dreimal so hoch wie der Entwurf sie zeichnet. */
  padding-block: 0.35rem !important;
}

/* Der Name steht schon gross im Kopf darueber. Ein zweites Mal klein daneben
   waere eine Dopplung — aber nur DORT, wo der Kopf tatsaechlich steht: Auf
   einer Blockseite ohne [mmu_kopf] bliebe sonst eine Seite voellig ohne
   Namen. Die Regel loest sich von selbst auf, sobald der Vorlagenteil den
   Shortcode traegt. */
body:has(.mmu-kopf) .wp-block-site-title { display: none; }

/* ⚠️ Der lange Selektor ist gemessen, nicht vorsorglich. WordPress liefert
   fuer den Navigationsblock diese Regel aus:

       .wp-block-navigation .wp-block-navigation-item__content.wp-block-
       navigation-item__content { color: inherit }

   Die Klasse steht ZWEIMAL darin — der Kern erhoeht damit absichtlich auf
   0-3-0, um Themes zu ueberstimmen. Der kurze Selektor (0-2-0) verlor
   dagegen, und der Link erbte die Farbe des Vorlagenteils: gemessen am
   17.08.2026 stand die inaktive Rubrik auf rgb(232,232,234) statt gedimmt,
   und die AKTIVE trug dieselbe Farbe wie die uebrigen — die Leiste sagte
   also nicht, wo man ist.

   Statt !important hier die echte Struktur als Selektor: nav > li > a ergibt
   0-3-3 und gewinnt unabhaengig von der Ladereihenfolge. !important waere
   der kuerzere Weg und der schlechtere — es gaebe der naechsten Regel keinen
   Ausweg mehr. */
/* 🔴 DER MESSRAHMEN FÜR DIE SCHRIFTGRÖSSE DER LEISTE. Ohne diese eine
   Zeile ist `cqi` weiter unten ungültig, und die Leiste bleibt klein.

   ⚠️ UND SIE DARF NIRGENDS SONST STEHEN. `container-type: inline-size`
   setzt `contain: inline-size`: Der Inhalt trägt dann nicht mehr zur
   Breite bei. Fünf Ebenen weiter innen wurde das am 03.10.2026 gemessen,
   und alle fünf fielen auf 0 px (Nullprobe im selben Lauf: 1024 px):

     __responsive-container-content   1024 → 0
     __responsive-dialog              1024 → 0
     __responsive-close               1024 → 0
     __responsive-container           1024 → 0
     nav.wp-block-navigation          1024 → 0

   Der Grund ist die Regel weiter oben, die `min-width: 0` an genau diese
   Kette schreibt — erlaubt zu schrumpfen UND kein Inhaltsbeitrag ergibt
   0. `width: 100%` und `flex: 1 1 100%` heilen es NICHT, beides geprüft.
   Die alignwide-Hülle steht als einzige nicht in jener Kette.

   🔵 Warum `cqi` und nicht `vw`: Die Hülle wächst mit dem Fenster nur
   bis 1152px und steht dann still. Ihr Anteil am Fenster fällt dabei von
   0,900 auf 0,641 (gemessen bei 620 bis 1600px) — eine Schriftgröße in
   `vw` trifft deshalb entweder die schmalen oder die breiten Fenster,
   nie beide. `cqi` misst den Platz, den es wirklich gibt. */
.wp-block-group.alignwide:has(nav.wp-block-navigation) {
  container-type: inline-size;
}

nav.wp-block-navigation li.wp-block-navigation-item > a.wp-block-navigation-item__content {
  display: flex;
  align-items: center;
  /* 40px Trefferflaeche, wie jede Bedienflaeche dieser Seite. */
  min-height: 40px;
  /* 🔴 `em`, NICHT `rem` — und das ist der Kern, nicht Feinschliff. Ein
     festes Polster verschiebt sich gegen eine mitwachsende Schrift: Mit
     `0.45rem` traf ein einzelner cqi-Wert nur eine Fensterbreite und war
     bei den anderen zu gross. Gemessen am 03.10.2026, Füllung der Zeile:

              Fenster   1366    1024     880     760
       rem (fest)       99,6 %  102,3 %  104,4 %  106,4 %   ← rollt
       em  (mitwachsend) 98,5 %   98,5 %   98,5 %   98,9 %

     Mit `em` ist die ganze Leiste ein Vielfaches der Schriftgrösse, und
     das Verhältnis bleibt über jede Breite dasselbe. */
  padding-inline: 0.3em;
  font-family: var(--schrift-ui);
  /* 🔴 DIE LEISTE FÜLLT DIE ZEILE AUS — Betreiberanweisung vom
     03.10.2026 („so groß dass die gesamte Zeile ausgefüllt wird und
     bündig abschließt").

     Vorher stand hier `var(--t-neben)` (14px) fest. Gemessen füllte die
     Leiste damit bei 1366px nur 77,3 % der Zeile — und bei 1024px rollte
     sie trotzdem, weil der Platz in die Lücken ging statt in die Wörter.

     🔵 Die Untergrenze IST `--t-neben`, nicht nur zufällig gleich: Unter
     etwa 760px Fensterbreite reicht die Zeile nicht mehr für acht
     Rubriken, und dann rollt die Leiste weiter (Betreiberentscheidung
     vom 01.10.2026, Regel weiter unten). Die Schrift dort mitschrumpfen
     zu lassen hätte das Rollen abgeschafft und die Leiste unlesbar
     gemacht — bei 620px wären es 10,8px gewesen.

     ⚠️ Die Obergrenze 1.6rem wird im Normalfall NIE erreicht: Bei der
     gedeckelten Hülle von 1152px ergibt 2.04cqi 23,5px, also 1,47rem.
     Sie ist das Netz für den Fall, dass `:has()` oder die
     Containerabfrage fehlen — dann fällt `cqi` auf das Fenster zurück
     und würde sonst über die Zeile hinauswachsen.

     📏 Füllung der Zeile, gemessen am 03.10.2026 (Nullprobe im selben
     Lauf, dieselbe Messung ohne die Regel):

       Fenster   Hülle   Schrift   neu       vorher
        1600px   1152    23,5px    98,5 %    77,3 %
        1366px   1152    23,5px    98,5 %    77,3 %
        1024px    909    18,5px    98,5 %    98,0 %  (rollte)
         880px    777    15,9px    98,5 %   114,6 %  (rollte)
         760px    684    14,0px    98,9 %   130,2 %  (rollte)
         620px    558    14,0px   121,2 %   159,6 %  (rollt weiter)

     Kopfhöhe (54px), Trefferfläche (40px) und Seitenfluss blieben in
     jeder Zeile unverändert. */
  font-size: clamp(var(--t-neben), 2.04cqi, 1.6rem);
  /* ⚠️ 600 UND NICHT 700, obwohl der Betreiber am 03.10.2026 „in fetter
     Schrift" verlangt hat. Der Schnitt ist nicht da: theme.json lädt für
     IBM Plex Sans genau 400, 400 italic und 600 — eine Bold-Datei gibt es
     weder im Theme noch im Entwurfsordner (gesucht). `font-weight: 700`
     wäre deshalb wirkungslos und nicht bloss ungenau: Gemessen ergaben
     400/600/700/800 die Textbreiten 875/891/891/891px — ab 600 ändert
     sich nichts mehr, der Browser nimmt 600 und synthetisiert nicht.
     Eine Regel, die nichts tut, sieht beim nächsten Lesen wie eine
     erfüllte Anweisung aus.

     🔵 ENTSCHEIDUNG DES BETREIBERS vom 03.10.2026: bei 600 bleiben. Zur
     Wahl stand, IBM Plex Sans Bold (OFL) zu beschaffen, auf den
     Zeichenvorrat zu kürzen und in theme.json einzubinden — rund 30 bis
     40 KB mehr beim ersten Aufruf. Abgelehnt; die Leiste wirkt durch die
     um 68 % gewachsene Schrift ohnehin deutlich kräftiger.

     ⚠️ Das Fehlen von „fett" ist damit KEIN offener Punkt mehr. Wer hier
     eine Bold-Datei nachrüstet, hebt eine Betreiberentscheidung auf. */
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--mmu-gedimmt);
  text-decoration: none;
}
nav.wp-block-navigation li.wp-block-navigation-item > a.wp-block-navigation-item__content:hover {
  color: var(--mmu-text);
}

/* Die aktive Rubrik traegt die HELLERE Akzentfarbe. #c0392b laege bei
   3,86:1 und damit unter den 4,5:1, die WCAG 1.4.3 fuer Text verlangt —
   ausgerechnet an dem Wort, das den Ort angibt. */
nav.wp-block-navigation li.wp-block-navigation-item > a[aria-current="page"] {
  color: var(--mmu-akzent-text);
}

/* Auf schmalen Geraeten QUERSCROLLEN statt umbrechen (Handoff v3).
   Mit acht Rubriken brach die Leiste sonst auf zwei, auf sehr schmalen
   Geraeten auf drei Zeilen um — der Kopf wuchs dadurch auf Kosten des
   Inhalts, und eine zweizeilige Rubrikenleiste liest sich nicht mehr als
   eine Reihe.

   🔴 `safe center` und nicht `center` — das ist der Kern und kein Feinschliff.
   Bei `justify-content: center` zentriert der Browser den Inhalt AUCH dann,
   wenn er breiter ist als der Kasten: Der Ueberhang verteilt sich auf beide
   Seiten, und was links hinausragt, liegt vor dem Scrollanfang. Es ist dann
   durch Scrollen NICHT erreichbar — die erste Rubrik („Start") waere auf
   schmalen Geraeten unerreichbar gewesen. `safe` faellt bei Ueberlauf auf
   flex-start zurueck und gibt genau diesen Fall frei.

   ⚠️ `flex: none` an den Eintraegen muss dazu: Flex-Kinder schrumpfen sonst
   unter ihre Inhaltsbreite, statt einen Ueberlauf zu erzeugen — es gaebe
   nichts zu scrollen, die Woerter wuerden nur enger. */
/* 🔴 KEIN `>` — die Regel hat bis zum 01.10.2026 NICHTS getan. WordPress
   schiebt zwischen <nav> und <ul> vier Huellen ein, sobald das Menue als
   Overlay konfiguriert ist:

     NAV.is-responsive
       DIV.wp-block-navigation__responsive-container
         DIV.wp-block-navigation__responsive-close
           DIV.wp-block-navigation__responsive-dialog
             DIV.wp-block-navigation__responsive-container-content
               UL.wp-block-navigation__container        <- hier

   Das Kindkombinator-Zeichen traf damit nie. Live gemessen bei 600 px:
   `flex-wrap: wrap`, zwei Zeilen Rubriken, kein Rollbereich — genau der
   Umbruch, den der Handoff v3 ausschliesst („Auf schmalen Screens
   horizontal scrollbar statt Umbruch").
   ⚠️ Die dritte Regel unten (`flex: none`) hat die ganze Zeit gegriffen,
   weil sie ein Nachfahrenselektor ist. Zwei Regeln, die zusammengehoeren,
   mit verschiedenen Kombinatoren geschrieben — und nur eine wirkte. */
/* 🔴 OHNE DIESE ZEILEN SCROLLT NICHTS, ES WAECHST NUR. `overflow-x: auto`
   kann erst beschneiden, wenn der Kasten schmaler ist als sein Inhalt — und
   ein Flex-Element schrumpft von sich aus NIE unter seine Inhaltsbreite
   (`min-width: auto` ist die Vorgabe). Gemessen nach dem ersten Anlauf:
   Die ganze Kette vom <nav> bis zum <ul> stand auf 997 px in einem 720 px
   breiten Fenster, und der Ueberstand der Seite stieg von 65 auf 139 px.
   🎯 Die Behebung war also schlimmer als der Fehler — dieselbe Falle wie
   bei den Startseiten-Spalten, nur eine Ebene tiefer verschachtelt. */
/* ⚠️ Die Gruppe UM das <nav> gehoert dazu, und sie ist die entscheidende.
   Ohne sie bleibt alles beim Alten: `max-width: 100%` misst sich am
   Elternteil, und wenn DER schon aufgeblaeht ist, begrenzt es nichts.
   Gemessen stand die Kette auf 997 px, waehrend die Gruppe darueber 647 px
   hatte — dazwischen lag genau dieses eine Element mit `min-width: auto`. */
.wp-block-group:has(> nav.wp-block-navigation),
nav.wp-block-navigation,
nav.wp-block-navigation [class*="wp-block-navigation__responsive"],
nav.wp-block-navigation ul.wp-block-navigation__container {
  min-width: 0;
  max-width: 100%;
}
/* 🔴 AUF DEM HANDY BLEIBT DAS ÜBERLAGERUNGSMENÜ — Betreiberentscheidung
   vom 02.10.2026 („auf dem handy bleiben").

   ⚠️ DER ENTWURF SAGT ETWAS ANDERES, und das ist der Grund für diesen
   Vermerk. In der v3-Vorlage gibt es gar kein Hamburger-Menü: Dort steht
   die Rubrikenleiste auch auf schmalen Geräten und rollt seitwärts
   (`overflow-x:auto; scrollbar-width:none`, Zeile 40 des Prototyps). Wer
   den Entwurf liest und das Menü sieht, hält es für eine Abweichung — es
   ist eine Entscheidung.

   📏 Vorgelegt wurde sie mit dieser Messung (375 px, Overlay probeweise
   abgeschaltet):

     Leiste      315 px sichtbar von 1025 px  →  710 px verborgen (69 %)
     Rubriken    8 gesamt, 2 ganz sichtbar (Start, Bands)
     Seitenfluss unverändert, kein Überlauf

   Zum Vergleich der Wert, auf dem die Rollentscheidung vom 01.10. beruhte:
   bei 600 px waren es 47 % verborgen und 4 von 8 sichtbar. Auf dem Handy
   also deutlich weniger — zwei Rubriken sind keine Leiste mehr.

   🔵 Technisch hängt das an der Klasse `is-responsive` am <nav>, die aus
   der Blockeinstellung „Overlay-Menü: mobil" kommt. Sie steht in der
   Datenbank, nicht hier — eine CSS-Regel, die das Overlay abschaltet, wäre
   der falsche Ort und würde beim nächsten Blockumbau still wirkungslos.

   ⚠️ Was dazugehört: Solange das Menü offen ist, trägt kein Element einen
   `view-transition-name` (Regel weiter unten). Ohne das legt sich der
   Seiteninhalt darüber, und kein z-index hilft dagegen. */
/* 🔴 DIE LEISTE ROLLT, UND IHR RAND LÄUFT WEICH AUS — Betreiberanweisung
   vom 01.10.2026 („die rubriken sollen scrollen" / „und mit weichem rand").

   ⚠️ CHRONOLOGIE, damit niemand den Lauf von 08:00 für einen Fehler hält:
   Vorgelegt wurden drei Wege — weicher Rand (meine Empfehlung), so lassen,
   oder umbrechen. Zuerst fiel die Entscheidung auf **umbrechen**, und genau
   das stand eine halbe Stunde lang live. Dann wurde sie revidiert, in zwei
   Sätzen nacheinander: erst „scrollen", dann „mit weichem Rand".

   📏 Die Messung, die der Entscheidung zugrunde lag (600 px):

     Leiste      540 px sichtbar von 1025 px  →  485 px verborgen (47 %)
     Rubriken    8 gesamt, 4 ganz sichtbar
     verborgen   Venues · Rockbars · Vereine · Sonstiges
     Tastatur    alle 8 erreichbar

   🎯 Der weiche Rand schließt genau diese Lücke: Es wird gerollt, UND man
   sieht, dass dort noch etwas ist.

   🔴 `safe center` MUSS mit dem Rollen zurück. Bei schlichtem `center` und
   Überlauf liegt der linke Überhang VOR dem Scrollanfang und ist nicht
   erreichbar — die erste Rubrik wäre weg. Beim Umbruch war die Zusicherung
   gegenstandslos geworden, mit dem Rollen ist sie wieder tragend.

   🔴 Ebenso `flex: none` an den Kindern (weiter unten): Ein Flex-Element
   schrumpft nie unter seine Inhaltsbreite — ohne das entsteht gar kein
   Überlauf, die Wörter stehen nur enger, und `overflow-x` hat nichts zu
   beschneiden.

   ⚠️ UND `min-width: 0` an der Kette oben BLEIBT. Ohne sie wächst die
   Kette vom <nav> abwärts über das Fenster hinaus, statt zu rollen —
   gemessen 997 px in einem 720-px-Fenster, Überstand 65 → 139 px. */
nav.wp-block-navigation ul.wp-block-navigation__container {
  flex-wrap: nowrap;
  /* 🔴 KEIN Abstand mehr zwischen den Rubriken — der Platz gehört den
     Wörtern (Betreiber 03.10.2026). WordPress setzt hier von sich aus
     1.2rem, und das waren bei acht Rubriken 133px: Genau daran lag es,
     dass die Leiste schon „randvoll" aussah, während die Schrift klein
     blieb. Die Trefferflächen stossen nicht aneinander — dafür ist das
     `padding-inline: 0.3em` oben da, das mit der Schrift mitwächst. */
  gap: 0;
  /* 🔵 `safe center` BLEIBT und ist mit der grossen Schrift nicht
     gegenstandslos geworden: Unter etwa 760px rollt die Leiste weiter
     (Messung an der Schriftregel oben), und dort trägt die Zusicherung
     wie zuvor. Am 03.10.2026 gegengeprüft, erste Rubrik bei 480px Breite:

       justify-content   linke Kante   erreichbar
       safe center             0 px     ja
       center               -272 px     NEIN   ← die Falle
       space-between           0 px     ja
       flex-start              0 px     ja

     `space-between` wäre für „bündig" also erlaubt gewesen. Es ist
     trotzdem nicht eingebaut, weil es nichts tut: Die Liste schmiegt
     sich an ihren Inhalt, es gibt keinen freien Platz zu verteilen. Die
     Bündigkeit kommt daher, dass der Inhalt die Zeile füllt. */
  justify-content: safe center;
  overflow-x: auto;
  /* Die Leiste ist 40px hoch; ein Rollbalken darunter naehme ein Viertel
     davon und zeigte eine Bedienung, die niemand greifen muss. Der weiche
     Rand unten tritt an seine Stelle. */
  scrollbar-width: none;
  /* Grundzustand und zugleich Rückfallebene: rechts weich, links hart —
     das ist richtig, solange noch nicht gerollt wurde. */
  mask-image: linear-gradient(to right,
    #000 0, #000 calc(100% - 2rem), transparent 100%);
}
nav.wp-block-navigation ul.wp-block-navigation__container::-webkit-scrollbar {
  display: none;
}

/* 🔴 DER RAND FOLGT DEM ROLLSTAND, er steht nicht fest. Ein starrer Verlauf
   rechts behauptet „es geht weiter" auch am Ende der Leiste, und links
   fehlt er, obwohl dort nach dem ersten Rollen etwas verborgen ist.

   Die Rollzeitachse macht daraus eine Blende ohne eine Zeile JavaScript:
   bei `scrollLeft: 0` ist nur rechts weich, am Ende nur links, dazwischen
   beides.

   ⚠️ `@supports` ist hier kein Zierrat: Wo die Rollzeitachse fehlt, läuft
   die Animation gar nicht, und es bleibt beim Grundzustand oben — rechts
   weich. Das ist die richtige Rückfallebene, weil die Leiste beim Laden
   immer am Anfang steht. Ein Fallback, der schlechter wäre als gar nichts,
   gibt es hier also nicht. */
@supports (animation-timeline: scroll(self inline)) {
  @keyframes mmu-rubrikrand {
    from {
      mask-image: linear-gradient(to right,
        #000 0, #000 calc(100% - 2rem), transparent 100%);
    }
    to {
      mask-image: linear-gradient(to right,
        transparent 0, #000 2rem, #000 100%);
    }
  }
  nav.wp-block-navigation ul.wp-block-navigation__container {
    animation: mmu-rubrikrand linear both;
    animation-timeline: scroll(self inline);
  }
}

/* ⚠️ Bewegungsempfindliche bekommen hier KEINE Ausnahme, und das ist
   Absicht: Der Verlauf ist keine Bewegung, sondern eine Anzeige des
   Rollstands. Ihn abzuschalten nähme die Auskunft weg, die er gibt. Die
   globale `prefers-reduced-motion`-Regel weiter unten setzt
   `animation-duration` auf 0.01ms — bei einer Rollzeitachse hat die Dauer
   keine Wirkung, die Blende folgt weiterhin dem Rollstand. Geprüft. */
nav.wp-block-navigation li.wp-block-navigation-item { flex: none; }

/* -------------------------------------------------------------------------
   Das Umblaettern (Handoff v2, Interaktion 2)
   -------------------------------------------------------------------------
   Ueber die View-Transitions-API, und zwar CROSS-DOCUMENT: Die Seiten bleiben
   echte Adressen, der Browser blendet zwischen zwei Dokumenten ueber. Der
   Handoff verlangt genau das („Seiten bleiben echte Routen").

   🎯 Der ganze Effekt steht in CSS, ohne eine Zeile JavaScript. Das ist nicht
   Sparsamkeit, sondern der Grund, warum er gefahrlos ist: Ein Browser, der
   @view-transition nicht kennt, navigiert schlicht normal. Kein Skript, das
   einen Klick abfangen und die Navigation nachholen muesste — und damit auch
   keine Seite, die haengen bleibt, wenn etwas schiefgeht. Der Logo-Tritt
   (Interaktion 1) braucht dieses Geruest, weil er einen Abdruck setzen muss;
   hier gibt es nichts nachzuholen.

   ⚠️ Stand 09/2026 beherrschen das nicht alle Browser. Das ist eingeplant und
   kein Mangel: Wo es fehlt, wechselt die Seite ohne Animation, also genau so
   wie heute. Ein Effekt, dessen Ausfall der bisherige Zustand ist, braucht
   keine Ersatzloesung. */
@view-transition {
  navigation: auto;
}

/* 🔴 KOPF UND FUSS STEHEN STILL, NUR DER INHALT BLAETTERT.

   📏 So macht es der Entwurf, nachgelesen am 01.10.2026 in
   docs/handoff-v3/teufelstritt-zeitung-v3.dc.html:

       Zeile  55   </header>                             ← davor, dreht nicht
       Zeile  57   <div style="perspective:1800px">      ← die Huelle
       Zeile  58   <div style="transform:rotateY(…)">    ← das Blatt
       …           <main>, die Blaetter-Navigation       ← dreht mit
       Zeile 556   </div></div>
       Zeile 558   <footer>                              ← danach, dreht nicht

   ⚠️ Am 01.10.2026 stand hier das Gegenteil: „DIE GANZE SEITE IST DAS BLATT",
   mit der Begruendung, ein Blatt mit klebendem Oberrand sehe nicht nach
   Umblaettern aus. Die Begruendung klingt plausibel und war trotzdem falsch —
   sie war MEINE, nicht die des Entwurfs. Der Betreiber sagte „Buchseite", und
   der Prototyp, der dieselbe Sprache spricht, setzt es anders um: Der Einband
   bleibt stehen, das Blatt wendet sich darin.

   🎯 Wer hier etwas aendern will, liest erst den Prototyp. Eine eigene
   Begruendung ersetzt keine Vorlage.

   ⚠️ Das Logo flackert dabei nicht: Die Schnappschuesse von Kopf und Fuss
   stehen still, es gibt also nichts zu ueberblenden. */
.mmu-kopf   { view-transition-name: mmu-kopf; }
.mmu-ticker { view-transition-name: mmu-ticker; }
.mmu-fuss   { view-transition-name: mmu-fuss; }
.wp-block-group:has(> .wp-block-site-title) { view-transition-name: mmu-rubriken; }

/* Das Blatt: der Inhalt und die Blaetter-Navigation darunter — im Prototyp
   liegt sie innerhalb der Huelle und dreht mit.

   ⚠️ Zwei Namen und nicht einer: Beide sind direkte Kinder von <body>, es gibt
   keinen gemeinsamen Elternteil, dem man einen Namen geben koennte. Zwei
   Elemente duerfen sich keinen Namen teilen — der Browser bricht die ganze
   Transition ab, wenn doch. */
main           { view-transition-name: mmu-blatt; }
.mmu-blaettern { view-transition-name: mmu-blattnav; }

/* 🔴 SOLANGE DAS MENUE OFFEN IST, TRAEGT NIEMAND EINEN NAMEN.

   `view-transition-name` hebt ein Element in einen eigenen Stapelkontext —
   und zwar in einen, den der z-index eines Nachbarn nicht mehr erreicht. Das
   Ueberlagerungsmenue hat `z-index: 100000` und lag trotzdem UNTER dem
   Seiteninhalt, sobald der einen Namen trug.

   📏 Live gemessen am 02.10.2026, 375x812, offenes Menue, elementFromPoint
   an fuenf Punkten — was liegt obenauf?

     ohne Ruecknahme                  h1, section, img   (3 von 5)
     view-transition-name: none       immer das Menue    (5 von 5)
     z-index 2147483647 am Menue      h1                 hilft NICHT
     main mit z-index: 0              h1                 hilft nicht
     isolation: isolate am body       h1                 hilft nicht
     contain: paint am main           h1                 hilft nicht

   ⚠️ Nur die Ruecknahme wirkt. Ein hoeherer z-index ist hier kein Mittel —
   wer das annimmt, dreht lange an der falschen Schraube.

   🔵 Was es kostet: Wer IM offenen Menue auf eine Rubrik klickt, bekommt
   den Wechsel ohne Blattdrehung (nur die Ueberblendung von root). Das ist
   der kleinere Verlust — ein Menue, durch das die Seite scheint, ist ein
   Fehler, eine entfallende Drehung beim Menueklick eine Nuance.

   🔴 WER HIER EINEN NAMEN ERGAENZT, ERGAENZT IHN AUCH OBEN. Eine Zusage
   haelt beide Listen gegeneinander (test/umblaettern-buchseite.test.mjs) —
   ohne sie faellt genau der neue Name durch und legt sich wieder ueber das
   Menue, waehrend alles andere richtig aussieht. */
html.has-modal-open .mmu-kopf,
html.has-modal-open .mmu-ticker,
html.has-modal-open .mmu-fuss,
html.has-modal-open .wp-block-group:has(> .wp-block-site-title),
html.has-modal-open main,
html.has-modal-open .mmu-blaettern {
  view-transition-name: none;
}

/* 🔴 DIE PERSPEKTIVE GEHOERT AN DAS IMAGE-PAIR, NICHT AN DIE GRUPPE.

   Die Pseudo-Element-Hierarchie einer View Transition hat vier Ebenen:

       ::view-transition
        └ ::view-transition-group(name)
           └ ::view-transition-image-pair(name)      ← HIER
              ├ ::view-transition-old(name)          ← die drehen
              └ ::view-transition-new(name)

   `perspective` wirkt nur auf die DIREKTEN Kinder eines Elements. An der
   Gruppe erreicht sie also das image-pair und nicht die Blaetter.

   📏 Am 01.10.2026 mit echten Elementen in derselben Hierarchie gemessen,
   885x914-Schirm, rotateY(-60deg), Hoehe der Huellbox:

       perspective nirgends                   300   flach
       perspective an der GRUPPE              300   flach — genau wie ohne
       perspective am image-pair            371.5   Tiefe

   ⚠️ Die Drehung lief also von Anfang an OHNE Tiefe: eine reine
   Breitenstauchung, die wie ein Zusammenschieben aussieht statt wie ein
   kippendes Blatt. Der Fehler stand schon in der ersten Fassung vom
   30.09.2026 (`::view-transition-group(mmu-blatt)`) und hat den Umbau vom
   01.10. unbeschadet ueberlebt, weil beide Fassungen dieselbe falsche Ebene
   trafen. Dieselbe Datei nennt die Regel an anderer Stelle richtig
   („perspective wirkt auf die KINDER eines Elements") — gewusst und doch
   falsch angewandt.

   🔴 `perspective-origin: 50% 50vh` statt des Standards `50% 50%`: Der
   Schnappschuss von <main> ist so hoch wie der Inhalt, hier 3242 px. Sein
   Mittelpunkt liegt damit weit unter dem Schirm, und die Drehung lief nach
   oben aus dem Bild.

   📏 Rechte Blattkante auf halber Schirmhoehe, bei rotateY(-39deg):

       Blatt = Schirmhoehe (914)            y =  457   richtig
       Blatt = volle Hoehe (3242)           y =  -65   aus dem Schirm
       volle Hoehe + perspective-origin 50vh  y =  457   richtig

   🎯 `50vh` ist in beiden Faellen richtig — auch wenn der Schnappschuss
   schirmhoch waere, denn dann ist 50vh gerade die Elementmitte. Damit haengt
   die Darstellung nicht an einer Annahme ueber die Schnappschussgroesse, die
   im verborgenen Browser-Pane nicht messbar war.

   1800px wie im Entwurf: weit genug, dass die Drehung nicht fischaeugig wird.
   📏 Bei 800px waere die Huellbox auf 11136 px gewachsen (Schirm 914). */
::view-transition-image-pair(mmu-blatt),
::view-transition-image-pair(mmu-blattnav) {
  perspective: 1800px;
  perspective-origin: 50% 50vh;
}

/* ⚠️ Beide Schnappschuesse liegen im selben Rahmen uebereinander. Ohne
   Stapelreihenfolge legte der Browser das neue Blatt unter das alte, und man
   saehe das Wegdrehen kaum. */
::view-transition-old(mmu-blatt),
::view-transition-old(mmu-blattnav) {
  animation: mmu-blatt-weg 280ms cubic-bezier(.55, 0, .85, .35) both;
  transform-origin: left center;
  z-index: 1;
  /* ⚠️ Fuer das eingebaute Ueberblenden setzt der Browser auf beide
     Schnappschuesse „mix-blend-mode: plus-lighter" — die Farben ADDIEREN sich
     dann dort, wo die Bilder uebereinanderliegen. Bei einer Ueberblendung ist
     das gewollt (sie bleibt gleichmaessig hell); bei einer Drehung, wo beide
     Blaetter gleichzeitig sichtbar sind, gaebe es einen hellen Blitz ueber die
     halbe Seite. Auf dem schwarzen Grund dieser Seite besonders. */
  mix-blend-mode: normal;
}
::view-transition-new(mmu-blatt),
::view-transition-new(mmu-blattnav) {
  animation: mmu-blatt-her 420ms cubic-bezier(.2, 1.2, .35, 1) both;
  transform-origin: left center;
  z-index: 2;
  mix-blend-mode: normal;
}

/* Die stehenden Teile: kein Ueberblenden, kein Verschieben. Ohne diese Zeilen
   blendet der Browser sie ineinander — bei gleichem Bild unsichtbar, bei
   verschiedener Hoehe (Rubrikenleiste bricht auf zwei Zeilen um) ein Zucken. */
::view-transition-old(mmu-kopf),
::view-transition-new(mmu-kopf),
::view-transition-old(mmu-ticker),
::view-transition-new(mmu-ticker),
::view-transition-old(mmu-rubriken),
::view-transition-new(mmu-rubriken),
::view-transition-old(mmu-fuss),
::view-transition-new(mmu-fuss) {
  animation: none;
}

/* Um die LINKE Kante weg, wie eine aufgeschlagene Seite. -78deg und nicht
   -90: Bei 90 Grad steht das Blatt exakt auf der Kante und verschwindet zu
   einem Strich — der Abgang wirkt dann wie ein Schnitt. Die fehlenden zwoelf
   Grad lassen es als Blatt enden. */
@keyframes mmu-blatt-weg {
  from { transform: rotateY(0) translateX(0);      opacity: 1; }
  to   { transform: rotateY(-78deg) translateX(0); opacity: 0.15; }
}
@keyframes mmu-blatt-her {
  from { transform: rotateY(10deg) translateX(24px); opacity: 0.2; }
  to   { transform: rotateY(0) translateX(0);        opacity: 1; }
}


/* ⚠️ Der Ausschalter, und er ist hier besonders wichtig: Eine Drehung im
   Raum ist genau die Art Bewegung, die bei Vestibularstoerungen Uebelkeit
   ausloest — mehr als ein Ein- oder Ausblenden. Handoff v2: „Wackeln,
   Umblaettern, Abriss- und Stempelanimation aus."

   "animation: none" auf beiden Schnappschuessen laesst die View Transition
   sofort durchschalten; die Navigation selbst bleibt unberuehrt. */
@media (prefers-reduced-motion: reduce) {
  /* ⚠️ Muss DIESELBEN Gruppen treffen wie oben. Stand hier ein Name, den es
     nicht mehr gibt, waere der Ausschalter still wirkungslos — der Selektor
     traefe ins Leere und die Drehung liefe trotz prefers-reduced-motion
     weiter. Genau das ist am 01.10.2026 beim Umbau auf `root` passiert und
     nur deshalb nicht aufgefallen, weil der Umbau beide Stellen anfasste. */
  ::view-transition-old(mmu-blatt),
  ::view-transition-new(mmu-blatt),
  ::view-transition-old(mmu-blattnav),
  ::view-transition-new(mmu-blattnav) {
    animation: none;
  }
  ::view-transition-image-pair(mmu-blatt),
  ::view-transition-image-pair(mmu-blattnav) {
    perspective: none;
  }
}

/* -------------------------------------------------------------------------
   3. Typografie
   ------------------------------------------------------------------------- */
/* ⚠️ Zeitungsoptik-Entwurf, 17.08.2026: Ueberschriften wechseln auf
   IBM Plex Serif, 700 statt 600 — der Entwurf zeigt seine Seitentitel
   ("Bandverzeichnis", "Konzertkalender", "Örtlichkeiten") durchgehend so.
   Die fluide Groesse bleibt UNVERAENDERT: Sie landet bei ueblichen
   Fensterbreiten ohnehin nahe am Entwurfswert (2rem fest) — 1.9rem bei
   800px, 2.125rem (Obergrenze) ab rund 990px — und faellt zugleich auf
   schmalen Schirmen zurueck, was der Entwurf nicht kennt ("im Prototyp
   nicht ausgefuehrt"). Sie zu ersetzen haette eine funktionierende
   Reaktionsfaehigkeit gegen eine feste Zahl getauscht, fuer einen kaum
   sichtbaren Unterschied bei den ueblichen Breiten. */
main[class^="mmu-"] h1,
main[class*=" mmu-"] h1 {
  font-family: var(--schrift-prosa);
  font-size: clamp(1.5rem, 1.2rem + 1.4vw, 2.125rem);
  font-weight: 700;
  line-height: 1.15;
  letter-spacing: -0.01em;
  margin: 0 0 var(--raum-5);
  max-width: calc(var(--mmu-register) + var(--mmu-luecke) + var(--mmu-spalte));
}

/* Abschnittsueberschriften sind laufende Kolumnentitel, keine Rufe. Klein,
   versal, gesperrt, gedimmt — sie benennen den Abschnitt und draengen sich
   nicht vor die Sache. Versalien NUR fuer feste Beschriftungen, nie fuer
   Inhalt: ein Bandname in Versalien waere eine Behauptung ueber seine
   Schreibweise, und "STRASSE" fuer "Straße" waere schlicht falsch. */
.mmu-quellen > h2,
.mmu-bandgigs > h2,
.mmu-kanaele > h2,
.mmu-registertitel {
  font-size: var(--t-klein);
  font-weight: 600;
  letter-spacing: 0.09em;
  text-transform: uppercase;
  color: var(--mmu-gedimmt);
  margin: 0;
  padding-top: 0.2em;   /* setzt die Versalhoehe auf die Grundlinie daneben */
  line-height: 1.4;
}

p { margin: 0 0 var(--raum-4); }

/* -------------------------------------------------------------------------
   4. Zustaende: Fokus, Auswahl, Links
   -------------------------------------------------------------------------
   Der Fokusring ist ueberall derselbe und wird nie entfernt. :focus-visible
   statt :focus, damit ein Mausklick keinen Ring hinterlaesst, die
   Tastaturbedienung aber immer einen bekommt. */
:where(a, button, input, select, summary, [tabindex]):focus-visible {
  outline: 2px solid var(--mmu-akzent-text);
  outline-offset: 2px;
  border-radius: 1px;
}

main[class^="mmu-"] a,
main[class*=" mmu-"] a {
  color: var(--mmu-akzent-text);
  text-decoration-thickness: 1px;
  text-underline-offset: 0.18em;
}
main[class^="mmu-"] a:hover,
main[class*=" mmu-"] a:hover {
  color: var(--mmu-text);
  text-decoration-color: var(--mmu-akzent-text);
}

::selection { background: var(--mmu-akzent-text); color: var(--mmu-grund); }

/* -------------------------------------------------------------------------
   5. Die Logotafel
   -------------------------------------------------------------------------
   Gemessen am 11.08.2026 ueber alle 173 Dateien: 130 tragen REINES SCHWARZ
   am Rand (Helligkeit 0-2), 12 fast schwarz, 11 sind echt transparent —
   und KEIN EINZIGES hat weissen Grund.

   Seit dem 11.08.2026 ist der Seitengrund selbst reines Schwarz. Die Tafel
   ist damit unsichtbar geworden, und genau das ist ihr Zweck: Das Logo
   sitzt auf der Seite, ohne dass ein Rechteck es umgibt. Vorher lag der
   Grund bei Helligkeit 17 gegen 2.5 der Logos — 91 Prozent erschienen als
   dunkleres Rechteck.

   Unsichtbar heisst nicht ueberfluessig. Die Tafel leistet weiter zweierlei:
   Sie gibt jeder der 343 Bandseiten denselben Logoplatz, unabhaengig vom
   Seitenverhaeltnis, und object-fit:scale-down garantiert, dass nichts
   beschnitten und nichts hochgerechnet wird — die Verhaeltnisse reichen von
   0.54 (hochformatiges Wappen) bis 12.26 (Schriftzug).

   Kein Rahmen, keine Ecken: die Tafel ist eine Flaeche, kein Kasten. */

/* Zeitungsoptik-Entwurf, 17.08.2026: der Breadcrumb — fehlte bisher
   vollstaendig auf der Bandseite. Klein und gedimmt, wie jede Nebenangabe
   dieser Seite (§4, §14): Er orientiert, er ruft nicht. */
.mmu-breadcrumb {
  margin: 0 0 var(--raum-4);
  font-size: var(--t-klein);
  color: var(--mmu-gedimmt);
}

/* Die Tafel ist eine feste Platte, in die das Logo eingerechnet wird.
   Zurueck dazu am 01.10.2026 (Betreiberentscheidung „Feste Platte 7rem,
   wie v3"); dazwischen, vom 18.08. bis dahin, legte sie sich ums Logo.

   🔴 Die Umstellung von damals war nicht falsch, ihre VORAUSSETZUNG ist
   entfallen. Sie geschah „mit dem Wechsel auf hellen Seitengrund", weil
   die feste Platte dort ein sichtbarer schwarzer Kasten wurde, der zu
   zwei Dritteln leer war. Die Seite ist seither wieder schwarz —
   gemessen am 01.10.2026 auf /bands/bloodline/: body rgb(0, 0, 0) — und
   der Entwurf steht ebenfalls auf Schwarz. Damit gilt wieder, was im
   selben Kommentar stand: Auf schwarzem Grund geht die leere Flaeche
   nahtlos in die Seite ueber.

   📐 Handoff v3, „Bandseite": Logo-Tafel 7rem, object-fit: scale-down.
   Werte aus docs/handoff-v3/teufelstritt-zeitung-v3.dc.html Zeile 252.

   ⚠️ Die Tafel selbst kann NICHT weg, und das haengt nicht an der
   Grundfarbe. Am 18.08.2026 ueber alle 179 Logodateien gemessen: 157
   tragen ihren dunklen Grund fest eingebrannt (114 graustufig, 43
   farbig), 19 sind ueberwiegend transparent, 3 haben hellen Grund. Die
   Tafel verursacht den Kasten also nicht, sie verdeckt ihn — ohne sie
   saehe man denselben Rand, nur ungewollt.

   ⚠️ Und eine CSS-Umkehrung (`filter: invert`) ist weiterhin keine
   Loesung: Sie wuerde die 114 graustufigen sauber drehen und die 43
   farbigen in ihre Komplementaerfarbe kippen.

   🔵 NEU gegenueber der Platte vor dem 18.08. ist der Rahmen. Auf
   schwarzem Grund ist eine schwarze Tafel unsichtbar; der Rahmen macht
   sie zu einem erkennbaren Element statt zu einem Loch. Der Entwurf hat
   ihn, die alte Fassung hatte ihn nicht. */
.mmu-logo {
  display: block;
  background: var(--mmu-tafel);
  border: 1px solid var(--mmu-kante);
  width: 20rem;
  /* ⚠️ 20rem sind 320 px, also genau die Breite eines schmalen Schirms.
     Ohne diese Grenze raegte die Tafel samt Seitenpolster heraus. */
  max-width: 100%;
  height: 7rem;
  /* scale-down und nicht contain: Ein kleines Logo soll nicht auf
     Tafelgroesse hochgerechnet und dabei unscharf werden. */
  object-fit: scale-down;
  padding: var(--raum-3) var(--raum-4);
  /* ⚠️ border-box und nicht content-box: Die Tafel soll 20rem x 7rem
     MESSEN, nicht 20rem plus Innenabstand. object-fit rechnet das Logo
     in den verbleibenden Inhaltsbereich ein. */
  box-sizing: border-box;
  margin: 0 0 var(--raum-5);
}

/* -------------------------------------------------------------------------
   6. Die Datenkarte
   -------------------------------------------------------------------------
   Das am haeufigsten gesehene Element der Seite — sie steht auf jeder
   Bandseite. Sie soll ein Dutzend Feld-Wert-Paare zeigen, ohne wie ein
   Formular auszusehen. Deshalb: keine Rahmen, keine Flaechen, keine
   Doppelpunkte. Nur eine Haarlinie je Zeile und der Groessen- und
   Farbunterschied zwischen Bezeichner und Wert.

   Das dl bringt die Registerstruktur schon mit: dt ist der Bezeichner,
   dd der Wert. Das Raster macht daraus die durchgehende Kante. */
.mmu-datenkarte {
  display: grid;
  grid-template-columns: var(--mmu-register) minmax(0, var(--mmu-spalte));
  column-gap: var(--mmu-luecke);
  margin: 0 0 var(--raum-6);
}

.mmu-datenkarte dt,
.mmu-datenkarte dd {
  padding: var(--raum-2) 0;
  border-top: 1px solid var(--mmu-linie);
  margin: 0;
}
.mmu-datenkarte dt:first-of-type,
.mmu-datenkarte dt:first-of-type + dd { border-top: 0; }

.mmu-datenkarte dt {
  font-size: var(--t-klein);
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--mmu-gedimmt);
  line-height: 1.7;   /* haelt die Versalien auf der Grundlinie des Werts */
}
.mmu-datenkarte dd { color: var(--mmu-text); }

/* -------------------------------------------------------------------------
   7. Kanaele
   -------------------------------------------------------------------------
   Schaltflaechen mit echtem Umriss (3.52:1). Sie fuehren auf fremde Seiten,
   aber erst nach dem Klick — geladen wird von dort nichts. */
.mmu-kanaele {
  display: grid;
  grid-template-columns: var(--mmu-register) minmax(0, var(--mmu-spalte));
  column-gap: var(--mmu-luecke);
  align-items: start;
  margin: 0 0 var(--raum-6);
}
.mmu-kanaele > h2 { grid-column: 1; }
.mmu-kanaele-gruppe,
.mmu-kanaele > :not(h2) { grid-column: 2; }

/* Folgt der Kanalblock direkt auf die Datenkarte, liest er als deren letzte
   Zeile: Der Abstand dazwischen faellt weg, und dieselbe Haarlinie wie
   zwischen zwei Datenkartenzeilen traegt ihn. Wo die Band herkommt und wo
   man sie hoert, ist derselbe Stammdatensatz — die Kanaele sind ein Feld
   wie das Label, keine Fussnote.
   :has() statt einer festen Regel, weil nicht jede Band Kanaele hat: Ohne
   Nachfolger behaelt die Datenkarte ihren normalen Abstand nach unten. */
.mmu-datenkarte:has(+ .mmu-kanaele) { margin-bottom: 0; }
.mmu-datenkarte + .mmu-kanaele {
  border-top: 1px solid var(--mmu-linie);
  padding-top: var(--raum-3);
}

.mmu-kanaele a,
.mmu-ortsymbole a.mmu-kanal {
  display: inline-block;
  border: 1px solid var(--mmu-kante);
  padding: var(--raum-2) var(--raum-4);
  margin: 0 var(--raum-2) var(--raum-2) 0;
  font-size: var(--t-neben);
  text-decoration: none;
  color: var(--mmu-text);
}
.mmu-kanaele a:hover,
.mmu-ortsymbole a.mmu-kanal:hover,
.mmu-ortsymbole a.mmu-kanal:focus-visible,
.mmu-kanaele a:focus-visible {
  border-color: var(--mmu-akzent);
  color: var(--mmu-akzent-text);
}

/* Kanal MIT Symbol: quadratische Schaltflaeche statt Wortschild. 2.5rem
   Inhaltsflaeche PLUS je 1px Rahmen (content-box, kein box-sizing hier)
   ergeben 42px Aussenmass — bereits das Mass des Zeitungsoptik-Entwurfs,
   ohne dass diese Zeile sich aendern muesste. Nachgemessen: Ein erster
   Versuch, hier auf 2.625rem zu erhoehen, "damit es 42px sind", uebersah
   den Rahmen und waere auf 44px Aussenmass gelandet — und haette die am
   selben Tag (ab2e126) gerade erst auf 42px-Knoepfe nachgerechnete
   Symbolspaltenbreite bei den Oertlichkeiten (12.5rem, §11 unten) wieder
   gesprengt.

   Betreiberentscheidung 17.08.2026: SVG-Symbole bleiben, keine Textkuerzel
   (WEB/IG/BC/ANF) wie im Entwurf. Bis dahin stand hier die vorlaeufige,
   risikoaermere Vorgabe ohne eingeholte Entscheidung — jetzt bestaetigt,
   nicht mehr offen. */
.mmu-kanaele a.mmu-kanal,
.mmu-ortsymbole a.mmu-kanal {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 2.5rem;
  height: 2.5rem;
  padding: 0;
  color: var(--mmu-gedimmt);
}
.mmu-kanalsymbol { display: block; }

/* Ruhend gedimmt, beim Ueberfahren die Marke in ihrer Farbe. So bleibt die
   Seite still — fuenf Markenfarben nebeneinander waeren auf einer Bandseite
   lauter als der Bandname darueber — und die Wiedererkennung kommt trotzdem,
   sobald jemand hinzeigt. Die Kante wechselt mit, damit auch bei
   Tastaturbedienung sichtbar ist, welches Feld gemeint ist. */
.mmu-kanaele a.mmu-kanal:hover,
.mmu-ortsymbole a.mmu-kanal:hover,
.mmu-ortsymbole a.mmu-kanal:focus-visible,
.mmu-kanaele a.mmu-kanal:focus-visible { color: var(--mmu-text); border-color: currentColor; }
.mmu-kanal-facebook:hover,  .mmu-kanal-facebook:focus-visible  { color: #1877f2 !important; }
.mmu-kanal-youtube:hover,   .mmu-kanal-youtube:focus-visible   { color: #ff3d3d !important; }
.mmu-kanal-instagram:hover, .mmu-kanal-instagram:focus-visible { color: #f0679a !important; }
.mmu-kanal-spotify:hover,   .mmu-kanal-spotify:focus-visible   { color: #1ed760 !important; }
.mmu-kanal-bandcamp:hover,  .mmu-kanal-bandcamp:focus-visible  { color: #7fb3c4 !important; }
.mmu-kanal-website:hover,   .mmu-kanal-website:focus-visible   { color: var(--mmu-akzent-text) !important; }

/* Beschriftung nur fuer Vorlesehilfen. Sie steht IM Markup und nicht als
   aria-label, damit sie auch dann dasteht, wenn das SVG einmal ausfaellt. */
.mmu-nurvorlesen {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

/* Faellt der Kanaele-Nav ohne Ueberschrift an (heutiger Markup-Stand),
   soll er trotzdem in der Lesespalte beginnen und nicht im Register. */
.mmu-kanaele:not(:has(> h2)) {
  display: block;
  margin-left: calc(var(--mmu-register) + var(--mmu-luecke));
}

/* -------------------------------------------------------------------------
   8. Belegtypografie
   -------------------------------------------------------------------------
   Der Charakter der Seite. Praesent und ruhig — nicht versteckt, nicht
   schreiend.

   Die Auszeichnung kommt aus dem Sync (src/transform/markdown.mjs) und ist
   fest: <sup id="verweis-N"><a href="#quelle-N">N</a></sup> im Text,
   <li id="quelle-N"> im Block. Keine eigene Klasse, deshalb wird hier ueber
   die Struktur gegriffen. Wer markdown.mjs aendert, muss hier nachziehen. */
.mmu-portraet {
  margin-left: calc(var(--mmu-register) + var(--mmu-luecke));
  max-width: var(--mmu-spalte);
  /* Zeitungsoptik-Entwurf: "Ueberschriften & Prosa" traegt Serifenschrift.
     Die Datenkarte daneben bleibt bewusst in der Grundschrift — sie ist
     eine Liste (DESIGN-BRIEFING: "UI, Listen, Navigation"), keine Prosa;
     dieselbe Unterscheidung wie beim Bandverzeichnis (§11), wo nur die
     Kurzvorstellung, nicht die Tabelle, Serifenschrift traegt. */
  font-family: var(--schrift-prosa);
  font-size: var(--t-prosa);
  line-height: 1.6;
  margin-bottom: var(--raum-6);
}
/* Die Kurzvorstellung ist eine Liste von Befunden, kein Fliesstext: hoechstens
   fuenf Spiegelstriche, der erste ist der staerkste (er dient auch als Auszug
   im Verzeichnis). Der Aufzaehlungspunkt haengt links ausserhalb der Spalte,
   damit die Textkante der Registerkante folgt und die Liste nicht eingerueckt
   neben allem anderen steht. */
.mmu-portraet ul,
.mmu-kurzvorstellung {
  list-style: none;
  padding-left: 0;
  margin: 0 0 var(--raum-5);
}

/* Der Vorstellungstext der Band (Frontmatter `vorstellung`, seit 20.08.2026).
   Steht zwischen der Kurzvorstellung und dem Quellenblock und ist im
   Gegensatz zu beiden Fliesstext — deshalb die Prosaschrift, wie sie auch
   der Aufmacher der Startseite verwendet. */
.mmu-bandtext {
  margin: 0 0 var(--raum-5);
  font-family: var(--schrift-prosa);
}

/* Die Initiale steht im ersten Absatz und wird vom Text umlaufen — dieselbe
   Regel wie im Vorspann der Startseite (.mmu-initiale). Hier muss der Absatz
   den Float einschliessen, sonst ragt der Buchstabe bei sehr kurzem Text in
   den naechsten hinein. */
.mmu-bandtext > p:first-of-type {
  overflow: hidden;
}

.mmu-bandtext > p {
  margin: 0 0 var(--raum-3);
}

.mmu-bandtext > p:last-child {
  margin-bottom: 0;
}

/* Bandfoto ueber dem Portraet (seit 20.08.2026).
   ⚠️ KEIN erzwungenes Seitenverhaeltnis mehr: Ein Zwischenstand vom selben Tag
   setzte `aspect-ratio: 3/2` mit `object-fit: cover`, um zwei nebeneinander
   liegende Bilder auf eine Hoehe zu bringen — das beschnitt die Aufnahmen
   sichtbar. Seit die Startseite das erste und die Bandseite das zweite Bild
   zeigt, steht hier in aller Regel nur eines, und es behaelt seine Proportion.
   Bei mehreren bleibt das Raster; ungleiche Hoehen sind der ehrlichere Preis
   gegenueber einem Beschnitt am Bild der Band. */
/* Das Bandfoto steht in der Lesespalte, nicht in voller Seitenbreite.
   Zwei Anlaeufe am 20.08.2026 waren daneben: erst lief es ueber die ganze
   Breite ("zu gross"), dann stand es auf 28rem gedeckelt linksbuendig zur
   Seite statt zum Text ("zu klein und schief zum Text"). Richtig ist,
   dieselben zwei Werte wie .mmu-portraet zu nehmen — dann faellt die
   Bildkante mit der Textkante zusammen und die Breite ergibt sich aus der
   Lesespalte, statt geraten zu werden.
   Ein Zuschnitt kommt weiterhin nicht in Frage: Die Fotos stammen von den
   Bands selbst und behalten ihr Seitenverhaeltnis (height:auto). */
.mmu-band-fotos {
  display: grid;
  /* 🔴 18rem = 288 px, verfuegbar sind auf einem 320-px-Schirm 245.
     `auto-fit` nimmt Spalten weg, wenn der Platz nicht reicht — unter die
     Mindestbreite der LETZTEN geht es aber nicht. `min(18rem, 100%)`
     schon. */
  grid-template-columns: repeat(auto-fit, minmax(min(18rem, 100%), 1fr));
  gap: var(--raum-3);
  margin: 0 0 var(--raum-5);
  align-items: start;
  margin-left: calc(var(--mmu-register) + var(--mmu-luecke));
  max-width: var(--mmu-spalte);
}

.mmu-band-fotos figure {
  margin: 0;
}

.mmu-band-fotos img {
  display: block;
  width: 100%;
  height: auto;
}

/* Die Diskografie steht unter dem Portraet und ist eine Werkliste, keine
   Datenkarte — deshalb dieselbe Prosaschrift wie der Bandtext. */
.mmu-diskografie {
  margin: var(--raum-5) 0 0;
}

.mmu-diskografie table {
  width: 100%;
  border-collapse: collapse;
  /* 🔴 `table-layout: fixed` — ohne das richtet sich eine Tabelle nach der
     Breite ihres laengsten Zelleninhalts und ignoriert `width: 100%`, sobald
     der Inhalt mehr braucht. Auf einem 320-px-Schirm sprengte die
     Diskografie ihre 245 px um 34. Mit `fixed` teilt sie den vorhandenen
     Platz auf und ueberlaesst dem Text das Umbrechen. */
  table-layout: fixed;
}
/* Albumtitel sind fremde Namen und manchmal ein einziges langes Wort. */
.mmu-diskografie td { overflow-wrap: anywhere; }

.mmu-diskografie th,
.mmu-diskografie td {
  text-align: left;
  padding: 0.35em 0.75em 0.35em 0;
  border-bottom: 1px solid var(--mmu-linie, #26262c);
}
.mmu-portraet li,
.mmu-kurzvorstellung > li {
  position: relative;
  padding-left: 1.1em;
  margin-bottom: var(--raum-4);
}
.mmu-portraet li::before,
.mmu-kurzvorstellung > li::before {
  content: "–";           /* Halbgeviertstrich, deutsche Aufzaehlung */
  position: absolute;
  left: 0;
  color: var(--mmu-gedimmt);
}

/* Die Ziffer ist ein Zeiger, kein Text: klein, in der Akzentfarbe, mit
   genug Klickflaeche. sup allein waere fuer den Finger zu wenig. */
.mmu-portraet sup {
  /* Grundschrift, nicht geerbte Serifenschrift des Fliesstexts — dieselbe
     Unterscheidung wie im Entwurf, dessen Quellenziffern trotz serifiger
     Umgebung ausdruecklich 'IBM Plex Sans' tragen. Eine Fussnotenziffer ist
     ein Zeiger, keine Prosa. */
  font-family: var(--schrift-ui);
  font-size: var(--t-mikro);
  line-height: 0;
  vertical-align: super;
}
.mmu-portraet sup a {
  text-decoration: none;
  padding: 0 0.15em;
  font-variant-numeric: tabular-nums;
}
.mmu-portraet sup a:hover { text-decoration: underline; }

/* Angesprungene Quelle kurz hervorheben — sonst sucht man in acht Eintraegen
   den, auf den man geklickt hat. */
.mmu-quellen li:target { color: var(--mmu-text); }
.mmu-quellen li:target::marker { color: var(--mmu-akzent-text); }

.mmu-quellen {
  display: grid;
  /* 🔴 Die zweite Spalte war auf `--mmu-spalte` festgenagelt und konnte
     nicht nachgeben: Auf einer 320-px-Bandseite brauchte die Liste 373 px
     in 260 und riss die Seite 83 px auf. Zweite Fundstelle derselben
     Bauart nach den Vereinskarten — eine feste Registerspalte neben einem
     festen Satzspiegel, beide aus der Desktop-Fassung.
     🔵 `minmax(0, 1fr)` statt `--mmu-spalte`: Wo Platz ist, ist das Maß
     dasselbe (der Satzspiegel IST die verbleibende Breite); wo keiner ist,
     gibt die Spalte nach. */
  grid-template-columns: var(--mmu-register) minmax(0, 1fr);
  column-gap: var(--mmu-luecke);
  margin: var(--raum-6) 0;
  font-size: var(--t-neben);
  color: var(--mmu-gedimmt);
}
.mmu-quellen > h2 { grid-column: 1; }
.mmu-quellen > ol {
  grid-column: 2;
  margin: 0;
  padding-left: 1.6em;
}
.mmu-quellen li { margin-bottom: var(--raum-3); line-height: 1.5; }
.mmu-quellen li::marker { font-variant-numeric: tabular-nums; }

/* Der Quellenblock kommt aus dem post_content — der Sync haengt ihn in
   src/transform/markdown.mjs an den Fliesstext an. Seit dem 12.08.2026
   trennt single-mmu_band.php beides und setzt den Beleg ans Seitenende,
   hinter die Konzerte; er ist damit ein direktes Kind von <main> und sitzt
   ohne Zutun auf der Registerkante.

   Die frueher noetige Ausbruchsregel (.mmu-portraet > .mmu-quellen mit
   negativem Rand) ist deshalb entfallen. Wer die Trennung im Template
   rueckgaengig macht, braucht sie wieder — sonst beginnt der Beleg als
   einziges Element der Seite bei 400px statt bei 224px. */
.mmu-quellen { margin-top: var(--raum-7); }

/* Der ehrliche Zustand, nicht der Fehlerfall. Kursiv und gedimmt sagt
   "redaktionelle Anmerkung"; der Strich links bindet ihn an die Lesespalte,
   ohne ihn zu einem Warnkasten zu machen. Ein Rahmen oder eine Farbflaeche
   waere hier falsch — die Seite ist vollstaendig, es fehlt nur das
   Optionale. */
.mmu-kein-portraet {
  margin-left: calc(var(--mmu-register) + var(--mmu-luecke));
  max-width: var(--mmu-spalte);
  border-left: 2px solid var(--mmu-linie);
  padding-left: var(--raum-4);
  font-family: var(--schrift-prosa);
  color: var(--mmu-gedimmt);
  font-style: italic;
  margin-bottom: var(--raum-6);
}

/* .mmu-herkunft ist am 12.08.2026 entfallen: Der Herkunftsblock am Ende der
   Bandseite wiederholte auf 343 Seiten, was auf /ueber/ steht. Die
   bandbezogene Angabe daraus (Genre-Quelle) steht jetzt als Zeile in der
   Datenkarte. Kein Markup traegt die Klasse mehr, deshalb sind ihre Regeln
   hier gestrichen — sie stehen in der Git-Historie, falls ein spaeterer
   Seitentyp wieder eine Herkunftsfusszeile braucht. */

/* -------------------------------------------------------------------------
   9. Konzertliste
   -------------------------------------------------------------------------
   Das Raster sitzt am <ul>, nicht am <li>: Sonst spannt jede Zeile ihr
   eigenes Raster auf und rechnet die Spaltenbreiten aus ihrem eigenen
   Inhalt — dann steht nichts untereinander. display:contents gibt die
   Zellen der <li> an das Raster der Liste durch. Das setzt voraus, dass
   jede Zeile gleich viele Zellen liefert; dafuer sorgt mmu_gig_zeile().

   align-items:stretch, NICHT baseline. Die Trennlinie haengt an jeder Zelle
   (das <li> ist display:contents und kann selbst nichts zeichnen). Bei
   baseline ist jede Zelle nur so hoch wie ihr Inhalt — die Ortszelle mit
   Haus UND Ortschaft ist zweizeilig, die Bandzelle einzeilig — und jede
   Linie endet auf anderer Hoehe. */
.mmu-gigliste {
  list-style: none;
  padding: 0;
  margin: 0 0 var(--raum-6);
  display: grid;
  /* ⚠️ Datum und Vermerk mit FESTER Breite, nicht max-content.
     Der Kalender hat NICHT ein Raster, sondern eines je Monat: Jede
     Monatsueberschrift beginnt ein neues <ul>, und jedes rechnet seine
     Spalten aus seinem eigenen Inhalt. Mit max-content heisst das, dass die
     Spalten von Monat zu Monat wandern.

     Gemessen am 12.08.2026 ueber sechs Monatslisten: Die Datumsspalte war
     mal 72, mal 76 Pixel breit — je nachdem, ob der laengste Wochentag des
     Monats "Mo" oder "Mi" hiess. Schlimmer beim Vermerk: Hat ein Monat kein
     einziges "ohne Gewaehr", wird seine vierte Spalte NULL breit, und alle
     drei Spalten davor ruecken nach rechts. Genau das sah der Betreiber —
     der August stand um Dutzende Pixel versetzt neben dem Oktober.

     Feste Breiten sind hier die einzige Loesung ohne Markup-Eingriff: Ein
     gemeinsames Raster ueber alle Monate braeuchte alle Zeilen in EINEM
     <ul>, und die Monatsueberschrift muesste ein Listenpunkt werden.

     5rem fasst das breiteste Datum (76px, "Di, 01.09."), 5.5rem den
     breitesten Vermerk (76px, "ohne Gewaehr") mit Luft fuer einen zweiten
     darueber. */
  /* Die Mindestbreiten tragen den engsten Fall, nicht den bequemen.
     Nachgerechnet knapp oberhalb des Umbruchpunkts (641px Fenster, 577px
     Inhalt): Mit 12rem und 9rem braucht das Raster mindestens
     88 + 192 + 144 + 76 + 72 Luecken = 572px — fuenf Pixel Rest. Das ist
     kein Spielraum, denn font-display:swap laesst die beiden
     max-content-Spalten (Datum, Vermerk) zuerst mit Segoe-Metriken
     rechnen, bevor Plex geladen ist, und die fallen anders aus.

     Mit 11rem und 8rem sinkt das Minimum auf 540px und der Rest waechst
     auf 37px. Sichtbar aendert sich oberhalb nichts: Die fr-Anteile
     verteilen den Platz wie zuvor, die Mindestwerte greifen nur ganz
     unten. Den Umbruchpunkt dafuer heraufzusetzen waere der schlechtere
     Weg gewesen — er haette 100 Verzeichniseintraege auf je vier Zeilen
     aufgeblaeht, obwohl das Verzeichnisraster (Minimum 265px) nie eng war. */
  /* 8rem statt 5.5rem seit dem 13.08.2026: Das Auswahlkaestchen sitzt in der
     Datumszelle, nicht in einer eigenen Spalte (siehe mmu_gig_zeile()). Eine
     vierte Spalte waere der naheliegende Weg gewesen und haette die beiden
     anderen Listen, die dieselbe Zeile benutzen, aus dem Raster geworfen.

     Gerechnet: 24px Kaestchen (WCAG 2.5.8) + 8px Abstand + 76px fuer das
     breiteste Datum ("Mo, 14.09.") = 108px. Mit 7rem blieben 4px Reserve —
     und genau davor warnt der Absatz oben: Vor dem Laden von Plex rechnet
     der Browser mit Segoe-Metriken, die anders ausfallen. 8rem gibt 20px. */
  grid-template-columns:
    8rem
    minmax(11rem, 2.2fr)
    minmax(8rem, 1.4fr);
  column-gap: var(--mmu-luecke);
  align-items: stretch;
}
/* Das Auswahlkaestchen. Es steht vor dem Datum in derselben Zelle; der
   Umriss kommt aus --mmu-kante, weil es ein Bedienelement ist und nach
   WCAG 1.4.11 mindestens 3:1 braucht (§3). accent-color faerbt den Haken im
   Akzentrot, ohne dass ein eigenes Bild noetig waere. */
.mmu-gigwahl {
  margin-right: var(--raum-2);
  vertical-align: baseline;
  accent-color: var(--mmu-akzent);
  /* ⚠️ 1.5rem = 24px, nicht die 16px der Browservorgabe. GESTALTUNG §8 fuehrt
     "Beruehrflaechen unter 24 px: keine" als geprueft — WCAG 2.5.8 verlangt
     genau das. Die Vorgabe des Browsers unterschreitet es, und ein Kaestchen
     in einer 200-Zeilen-Liste ist der Ort, an dem das wehtut. */
  width: 1.5rem;
  height: 1.5rem;
}

/* Der Knopf und sein Hinweis. "Die Auswahl gilt fuer diese Seite" steht
   ausdruecklich da: Der Kalender blaettert, und ohne JavaScript ueberlebt
   eine Auswahl den Seitenwechsel nicht. Das zu verschweigen waere die
   Variante, bei der jemand zweimal ankreuzt und einmal etwas verliert. */
/* Der Preisrechner unter dem Kalender (18.08.2026).

   Als eigene Zeile unter den Knoepfen, nicht daneben: Der Satz nennt fast
   immer zwei Zahlen ("Summe: 30,00 € aus 2 Terminen — 8 ohne Preisangabe"),
   und neben zwei Knoepfen gequetscht braeche er auf drei Zeilen um.

   ⚠️ Keine Hervorhebung, kein Kasten. Der Rechner kennt heute 5 von 306
   kuenftigen Preisen; eine Summe, die sich optisch wichtig macht, waere eine
   Behauptung ueber die Vollstaendigkeit der Daten. */
.mmu-preisrechner {
  /* An den rechten Rand der Knopfzeile (Betreiberwunsch 18.08.2026).
     margin-left: auto wirkt nur, wenn das Element als LETZTES in der
     Flexzeile steht — deshalb liegt es in der Vorlage hinter beiden
     Knoepfen und nicht davor. */
  margin-left: auto;
  font-weight: 700;
  color: var(--mmu-text);
  font-size: var(--t-neben);
}

/* Die Export-Leiste (Kalenderdatei) stand bis zum 20.08.2026 unter der
   Liste und hiess deshalb `-fuss`. Auf Betreiberwunsch steht sie jetzt
   ueber der Liste; der Name ist mitgezogen, weil ein Element namens "Fuss"
   am Kopf jeden spaeteren Leser in die Irre fuehrt. */
.mmu-kalenderwahl-leiste {
  display: flex;
  flex-wrap: wrap;
  /* `center`, nicht `baseline`. Betreibermeldung 20.08.2026: "Die Knoepfe
     und die Schrift stehen nicht auf einer Hoehe."

     Gemessen: Knoepfe oben 619 / unten 660 (Mitte 639,5), Erklaertext oben
     628 / unten 674 (Mitte 651) — elf Pixel tiefer. `baseline` richtet die
     Grundlinien der ERSTEN ZEILE aus, und das war rechnerisch korrekt. Aber
     die Knoepfe sind Kaesten mit Rahmen und Innenabstand, und der Text
     bricht daneben auf zwei Zeilen um: Das Auge vergleicht die Mitte des
     Kastens mit dem ganzen Textblock, nicht zwei Grundlinien.

     Wo verschieden hohe Dinge nebeneinander stehen, richtet `center` sie
     danach aus, wie sie gesehen werden. */
  align-items: center;
  gap: var(--raum-2) var(--raum-4);
  margin: 0 0 var(--raum-5);
}

/* Vorbehalt links, Preissortierung rechts, in einer Zeile.
   Betreiberwunsch 20.08.2026: Der Vorbehalt "Alle Angaben ohne Gewaehr"
   fuellt die Flaeche, die neben der rechtsbuendigen Sortierung frei blieb.

   ⚠️ Die gemeinsame Huelle ist noetig, weil .mmu-preissortierung `hidden`
   traegt und erst vom Skript freigegeben wird. Steckte der Vorbehalt darin,
   verschwaende er mit ihr — er soll aber immer stehen. So traegt die Zeile
   ihn allein, solange nicht sortiert wurde, und die Sortierung tritt
   daneben, sobald es sie gibt. */
.mmu-listenkopf {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--raum-2) var(--raum-4);
  margin: 0 0 var(--raum-4);
}
.mmu-listenkopf .mmu-legende {
  flex: 1 1 18rem;
}
.mmu-listenkopf .mmu-preissortierung {
  margin: 0;
  flex: 0 1 auto;
}

/* Preissortierung der Konzertliste (18.08.2026), oberhalb der Monatslisten.
   Dieselbe umrissene Schaltflaeche wie .mmu-kalender-wechsel a — zwei
   gleichrangige Knoepfe, keine Hervorhebung fuer die "aktive" Richtung, weil
   die Sortierung sich nicht am Zustand der Seite ablesen laesst (sie wirkt
   nur auf das Markup, kein Filterwert traegt sie).

   Die Knoepfe sitzen rechts (Betreiberwunsch): .mmu-preissort-knoepfe traegt
   margin-left:auto und wirkt nur, wenn es das LETZTE Kind der Flexzeile ist —
   dasselbe Muster wie .mmu-preisrechner in .mmu-kalenderwahl-leiste. */
/* Die ganze Zeile steht rechts, Etikett und Knoepfe beieinander.
   Betreiberwunsch 20.08.2026: "Sortieren nach Preis: weiter nach rechts
   setzen".

   Vorher klebte das Etikett am linken Rand, weil .mmu-preissort-knoepfe
   ein `margin-left: auto` trug — das schob nur die Knoepfe nach rechts und
   liess dazwischen eine Lücke von der halben Seitenbreite stehen. */
.mmu-preissortierung {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: flex-end;
  gap: var(--raum-2) var(--raum-3);
  margin: 0 0 var(--raum-5);
  color: var(--mmu-gedimmt);
  font-size: var(--t-neben);
}
.mmu-preissort-knoepfe {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: var(--raum-3);
  /* Kein `margin-left: auto` mehr — das trennte Etikett und Knoepfe.
     Rechts steht jetzt die ganze Zeile, siehe .mmu-preissortierung. */
}
/* Zwei Gruppen nebeneinander — "je Monat" und "gesamt" (Betreiberwunsch:
   beide Umfaenge gleichzeitig anwaehlbar, nicht nacheinander ausprobiert). */
.mmu-preissort-gruppe {
  display: flex;
  align-items: baseline;
  gap: var(--raum-1);
}
.mmu-preissort-bezeichner {
  font-size: var(--t-klein);
  color: var(--mmu-gedimmt);
}
.mmu-preissort-gruppe button {
  /* Schmaler als "Zurücksetzen" daneben — die Beschriftung ist nur ein Pfeil. */
  padding-inline: var(--raum-2);
}
.mmu-preissortierung button {
  border: 1px solid var(--mmu-kante);
  background: transparent;
  padding: var(--raum-1) var(--raum-3);
  font-size: var(--t-neben);
  font-family: inherit;
  color: var(--mmu-text);
  cursor: var(--mmu-zeiger-klick);
  cursor: var(--mmu-zeiger-klick-hidpi);
}
.mmu-preissortierung button:hover,
.mmu-preissortierung button:focus-visible {
  border-color: var(--mmu-akzent);
  color: var(--mmu-akzent-text);
}
.mmu-kalenderwahl-leiste span {
  font-size: var(--t-neben);
  color: var(--mmu-gedimmt);
  max-width: var(--mmu-spalte);
}

/* Die Musikrichtung hinter dem Bandnamen. Gedimmt und in normaler Staerke:
   Sie ordnet ein, sie ruft nicht — dieselbe Gewichtung wie beim Ort in der
   Vereinsliste. Steht sie in derselben Huelle wie die Namen, traegt sie den
   Durchstrich bei abgesagten Konzerten mit, und das ist richtig so: Abgesagt
   ist der ganze Auftritt, nicht nur der Name. */
.mmu-bandgenre {
  color: var(--mmu-gedimmt);
  font-weight: 400;
  font-size: var(--t-neben);
}

/* 🔴 `:not(.mmu-gigkarte)` — sonst verliert die Eintrittskarte ihre Box.
   `.mmu-gigliste li` ist (0,1,1), `.mmu-gigkarte` nur (0,1,0): Die
   Kartenregel kam spaeter im Stylesheet und hat trotzdem verloren, denn
   Spezifitaet schlaegt Reihenfolge. `display: contents` erzeugt keine Box,
   ein Element ohne Box malt keinen Hintergrund — das Papier war gesetzt und
   unsichtbar, und die Papiertinte stand auf dem schwarzen BODY (1,17:1).
   ⚠️ Herausnehmen statt ueberschreiben: Wer stattdessen die Kartenregel auf
   `.mmu-gigliste li.mmu-gigkarte` (0,2,1) anhebt, schlaegt damit auch den
   Mobilblock `.mmu-gigkarte { grid-template-columns }` (0,1,0) — die Karte
   bliebe auf schmalen Geraeten dreispaltig. */
.mmu-gigliste li:not(.mmu-gigkarte) { display: contents; }
/* Ebenso die Zellenraender: Auf der Karte waere `--mmu-linie` eine Linie
   der dunklen Welt quer ueber das Papier. */
.mmu-gigliste li:not(.mmu-gigkarte) > * {
  padding: var(--raum-3) 0;
  border-top: 1px solid var(--mmu-linie);
}

/* Das Datum ist der Anker der Zeile. Tabellenziffern, damit die Spalte
   steht, und gedimmt statt hell: Es ordnet, es ruft nicht. */
.mmu-gigdatum {
  font-variant-numeric: tabular-nums;
  color: var(--mmu-gedimmt);
  white-space: nowrap;
}

/* ⚠️ KEIN Spalten-Flexbehaelter. Die Zelle sah so aus:

       .mmu-gigbands { display: flex; flex-direction: column; }

   und in einem Flexbehaelter wird JEDES Kind zum eigenen Element in der
   Reihe — auch ein blosser Textknoten. mmu_gig_zeile() setzt die Bandnamen
   als <a>, getrennt durch ", " als reinen Text. Bei einer Band faellt das
   nicht auf; bei dreien stand auf der Seite:

       Mornir
       ,
       Flame or Redemption
       , Eclipse Of Empathy

   Vier Zeilen, zwei davon ein einzelnes Komma. Vom Betreiber gemeldet,
   gemessen am 12.08.2026: die Zelle war 135px hoch statt einer Zeile.

   Als Block fliessen die Bandnamen und ihre Trennzeichen wieder inline; nur
   die Zusatzangabe darunter bekommt ihre eigene Zeile, und zwar dadurch,
   dass SIE ein Block ist — nicht dadurch, dass die Zelle eine Spalte waere. */
.mmu-gigbands { display: block; }

/* Die Ortszelle traegt zwei Dinge nebeneinander: links Haus und Ortschaft,
   rechts den Eintritt (Betreiberwunsch 18.08.2026, „dass der Preis dort steht
   und Fett" — mit dem Finger auf den freien Platz rechts in dieser Zelle).

   ⚠️ KEINE vierte Rasterspalte, und das ist gemessen, nicht bequem: Die
   Spaltenbreiten dieses Kalenders sind fest, weil jeder Monat ein eigenes
   <ul> ist. Eine vierte Spalte war schon einmal da (der Vermerk „ohne
   Gewaehr", bis 12.08.2026) und wurde in Monaten OHNE Werte null breit —
   dann verrutschten alle Spalten davor, und genau das ist dem Betreiber
   damals aufgefallen. Dazu benutzt single-mmu_place.php dieselbe Zeile, und
   das nachgerechnete Breitenbudget hat knapp oberhalb des Umbruchpunkts
   37px Rest — eine weitere Spalte passt dort nicht hinein.

   Innerhalb der Zelle kostet es nichts: Sie ist 1.4fr breit, ein Hausname
   wie „Quax" fuellt sie nie aus. */
.mmu-gigort {
  display: flex;
  /* 🔴 `flex-end` und nicht `space-between` (Betreiber 03.10.2026): Der
     Ortsname ist seit dem Umbau das LETZTE Kind und soll an der
     Abrisskante kleben.

     ⚠️ Heute ist der Unterschied NICHT sichtbar, und das ist der Grund,
     warum die Zeile hier begruendet steht: Die Zelle ist im Raster mit
     `auto` bemessen, also genau so breit wie ihr Inhalt — es gibt keinen
     freien Platz zu verteilen, und `space-between` verhielte sich wie
     `flex-start`. Sobald die Zelle einmal breiter wird als ihr Inhalt
     (eine Mindestbreite, eine andere Rasterspalte), faellt die
     Entscheidung auseinander: `space-between` risse Preis und Ortsname
     an die beiden Raender, `flex-end` haelt beide rechts zusammen. */
  justify-content: flex-end;
  align-items: baseline;
  gap: var(--raum-2);
}
/* 🔴 `overflow-wrap: anywhere` an den Stellen, die FREMDE Namen tragen.
   „Glockenbachwerkstatt" ist ein Wort von 20 Zeichen; in einer 228-px-Zelle
   bei 320 px Fensterbreite passt es nicht, und ohne Bruchstelle schiebt es
   die Karte auf. Live gemessen: 292 px Bedarf in 228 px Platz.
   ⚠️ `anywhere` und nicht `break-word`: Letzteres bricht erst, wenn das
   Wort allein in einer Zeile steht — in einer Flexzelle mit Nachbarn ist
   das zu spaet.
   🔵 Nur hier und bei den Quellen: Ein Dokument, das ueberall mitten im
   Wort bricht, liest sich schlecht. Diese beiden tragen Namen und Slugs,
   die niemand von uns waehlt. */
.mmu-gigortname { display: block; overflow-wrap: anywhere; }
.mmu-gigort { min-width: 0; }
.mmu-quellen ol,
.mmu-quellen li { overflow-wrap: anywhere; }

/* Fett, auf Wunsch des Betreibers. Nicht gedimmt wie die Stadtzeile: Der
   Preis ist hier die Angabe, die gesucht wird, nicht die Beigabe.
   white-space: nowrap, damit „18,00 €" nie zwischen Zahl und Zeichen
   umbricht. */
.mmu-gigpreis {
  font-weight: 700;
  white-space: nowrap;
}
/*
 * Herkunft des Preises — sichtbar erst beim Ueberfahren oder Anklicken
 * (Betreiberentscheidung 23.08.2026). Der Betrag steht allein.
 *
 * Vorher stand die Quelle als zweite Zeile unter JEDEM Preis. In einer Liste
 * mit hundert Zeilen wiegt dieselbe Domain hundertmal schwerer als der Preis,
 * den sie belegt.
 */
.mmu-gigpreis {
  position: relative;
}
/* Der Betrag bleibt ein Betrag: kein Knopfaussehen, nur der Hilfe-Zeiger. */
.mmu-preisknopf {
  font: inherit;
  color: inherit;
  background: none;
  border: 0;
  padding: 0;
  cursor: help;
  text-decoration: underline dotted;
  text-underline-offset: 0.2em;
}
.mmu-preisquelle {
  position: absolute;
  right: 0;
  top: calc(100% + 0.2rem);
  z-index: 5;
  width: max-content;
  max-width: 16rem;
  padding: 0.3rem 0.5rem;
  border: 1px solid var(--mmu-linie, #26262c);
  background: var(--mmu-grund, #000);
  color: var(--mmu-gedimmt);
  font-size: var(--t-klein);
  font-weight: 400;
  /* Der Elternteil traegt nowrap — ohne dieses normal bricht der Vermerk nie um. */
  white-space: normal;
  text-align: left;
  visibility: hidden;
  opacity: 0;
}
/*
 * :hover fuer die Maus, :focus-within fuer Tastatur UND Beruehrung — ein Tipp
 * auf den Knopf setzt den Fokus, damit erscheint der Vermerk auch dort, wo es
 * kein Ueberfahren gibt.
 */
.mmu-gigpreis:hover .mmu-preisquelle,
.mmu-gigpreis:focus-within .mmu-preisquelle {
  visibility: visible;
  opacity: 1;
}
@media (prefers-reduced-motion: no-preference) {
  .mmu-preisquelle { transition: opacity 0.12s ease; }
}
.mmu-gigbands a { text-decoration: none; }
.mmu-gigbands a:hover { text-decoration: underline; }
.mmu-gigevent,
.mmu-gigstadt {
  display: block;
  margin-top: 0.15rem;
  color: var(--mmu-gedimmt);
  font-size: var(--t-klein);
}

/* Musikrichtung des Abends. Steht UEBER der Veranstaltungsreihe und direkt
   unter den Namen, weil sie die Frage beantwortet, mit der ein Besucher die
   Liste ueberfliegt: Ist das meine Musik? Die Reihe beantwortet erst die
   zweite Frage, welcher Abend das ist.

   Etwas heller als die uebrigen Nebenangaben und leicht gesperrt: Sie soll
   sich beim Ueberfliegen vom Reihennamen unterscheiden lassen, ohne mit den
   Bandnamen zu konkurrieren. Kein Versal — Genrenamen sind Eigennamen
   ("Melodic Black Metal"), und Versalien waeren eine Behauptung ueber ihre
   Schreibweise.

   Noch ohne Daten: siehe den Kommentar an mmu_gig_zeile(). */
.mmu-giggenres {
  display: block;
  margin-top: 0.2rem;
  font-size: var(--t-klein);
  letter-spacing: 0.02em;
  color: var(--mmu-text);
  opacity: 0.75;
}


/* Die Erklaerung zum Zeichen, einmal je Ansicht. Eigene Zeile und gedimmt:
   Sie gehoert zur Liste darunter, nicht zum Satz davor — im Fliesstext
   gelesen klaenge sie wie eine Einschraenkung des ganzen Verzeichnisses. */
.mmu-legende {
  display: block;
  margin-top: var(--raum-3);
  font-size: var(--t-neben);
  color: var(--mmu-gedimmt);
}

/* Abgesagt: der Durchstrich ist die Aussage, die Abdunklung verstaerkt sie.
   Der Termin bleibt lesbar — er ist belegt, er faellt nur aus.

   Durchgestrichen werden Datum, Namen und Veranstaltungsreihe, NICHT die
   ganze Zelle: Der Status steht als eigene Zeile darunter, und ein
   durchgestrichenes "ABGESAGT" waere eine Aussage, die sich selbst aufhebt.
   text-decoration laesst sich von einem Kind nicht zuruecknehmen — deshalb
   traegt sie hier die Namenshuelle statt der Zelle. */
.mmu-abgesagt .mmu-gigdatum,
.mmu-abgesagt .mmu-gignamen,
.mmu-abgesagt .mmu-gigevent { text-decoration: line-through; }
.mmu-abgesagt .mmu-gignamen,
.mmu-abgesagt .mmu-gigort { color: var(--mmu-gedimmt); }

/* Der Vermerk steht UNTER dem Konzert, nicht daneben — Wunsch des
   Betreibers, und die richtige Stelle: Er gehoert zur Zeile, nicht in eine
   eigene Spalte, und unter dem durchgestrichenen Namen ist er unuebersehbar. */
.mmu-gigstatus {
  display: block;
  margin-top: 0.15rem;
  font-size: var(--t-klein);
  font-weight: 600;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--mmu-akzent-text);
}

/* "ohne Gewaehr" ist kein Warnschild, sondern eine Offenlegung. Deshalb
   gedimmt, nicht rot: Die Seite gibt zu, was sie nicht geprueft hat, und das
   ist ein Qualitaetsmerkmal, kein Mangel.

   In der Kalenderzeile gibt es die Klasse seit dem 12.08.2026 nicht mehr —
   dort trug das Datum bis zum 18.08.2026 ein eigenes Zeichen; es ist auf
   Betreiberwunsch entfernt. Geblieben ist
   der ganze Satz auf der Konzert-Einzelseite, wo Platz dafuer ist. */
p.mmu-unverifiziert {
  border-left: 2px solid var(--mmu-linie);
  padding-left: var(--raum-4);
  max-width: var(--mmu-spalte);
  font-size: var(--t-neben);
  font-style: italic;
  margin: var(--raum-5) 0;
}


/* Ausverkauft — dieselbe Form wie ein Gigstatus, aber gedimmt statt im
   Akzent (Betreiberentscheidung 02.09.2026).

   🎯 Der Unterschied traegt eine Aussage: `abgesagt` und `verschoben` sind
   Eingriffe in den Termin und stehen im Akzent; `ausverkauft` ist eine
   Auskunft ueber die Karten — der Abend findet statt. Wer die Liste
   ueberfliegt, soll den Unterschied ohne Lesen sehen.

   Kein Durchstrich, keine `mmu-abgesagt`-Klasse: Kontingente werden
   nachgelegt, Ruecklaeufer freigegeben. Ein durchgestrichener Abend waere
   eine staerkere Behauptung, als die Quelle deckt. */
/* Dasselbe auf der Festivaluebersicht und der Festivalseite
   (Betreiberauftrag 24.09.2026). Eigene Klasse statt gemeinsamer Selektorliste:
   Die Gig-Fassung ist ein Block mit eigenem Abstand ueber der Zeile, hier steht
   das Wort im Statusblock neben dem Termin. Gleiche Anmutung, andere Lage. */
.mmu-eventausverkauft {
  font-size: var(--t-klein);
  font-weight: 600;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--mmu-gedimmt);
}

.mmu-gigausverkauft {
  display: block;
  margin-top: 0.15rem;
  font-size: var(--t-klein);
  font-weight: 600;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--mmu-gedimmt);
}

/* Auf der Gig-Seite steht das Wort hinter dem Ticketlink, in der Zeile — dort
   also NICHT als Block, sonst reisst es den Link vom Vermerk. */
.mmu-ausverkauft {
  color: var(--mmu-gedimmt);
  font-weight: 600;
}

.mmu-gigstatus-banner {
  border-left: 3px solid var(--mmu-akzent);
  background: var(--mmu-flaeche);
  color: var(--mmu-text);
  padding: var(--raum-4) var(--raum-5);
  margin: 0 0 var(--raum-5);
  font-weight: 600;
}

/* ⚠️ Zeitungsoptik-Entwurf, 17.08.2026: Monatsueberschriften gliedern den
   Kalender — bis dahin klein, gesperrt und gedimmt wie ein Kolumnentitel
   (Marken im Strom, keine Kapitel). Der Entwurf zeigt sie stattdessen als
   Zwischenueberschrift mit rechts fuellender Doppellinie, wie die
   Bezirksueberschriften bei den Oertlichkeiten (§14) — dasselbe Vokabular,
   hier auf den Kalender angewandt. Weiterhin <h2>, nicht <h3> wie im
   Entwurf: Dort traegt bereits ein <h2> den Seitentitel ("Konzertkalender"),
   hier ist das die echte <h1> — die Rangfolge dieser Seite bleibt also
   korrekt, nur die Optik wechselt. */
.mmu-kalender h2 {
  display: flex;
  align-items: center;
  gap: var(--raum-4);
  margin: var(--raum-6) 0 var(--raum-2);
  font-family: var(--schrift-prosa);
  font-weight: 700;
  font-size: var(--t-gross);
  color: var(--mmu-text);
}
.mmu-kalender h2:first-of-type { margin-top: var(--raum-4); }

/* Eigenstaendig statt an .mmu-kalender h2 gebunden: Dieselbe Zierde traegt
   auch die Bezirksueberschrift der Oertlichkeiten (§14, .mmu-lage) — eine
   Regel fuer beide, statt sie zu verdoppeln. */
.mmu-fuellstrich {
  flex: 1;
  border-top: 3px double var(--mmu-kante);
}

/* -------------------------------------------------------------------------
   10. Livehistorie der Bandseite
   ------------------------------------------------------------------------- */
.mmu-bandgigs {
  display: grid;
  grid-template-columns: var(--mmu-register) minmax(0, var(--mmu-spalte));
  column-gap: var(--mmu-luecke);
  margin: 0 0 var(--raum-6);
}
.mmu-bandgigs > h2 { grid-column: 1; }
.mmu-bandgigs > ul {
  grid-column: 2;
  list-style: none;
  margin: 0;
  padding: 0;
}
.mmu-bandgigs li {
  padding: var(--raum-2) 0;
  border-top: 1px solid var(--mmu-linie);
  font-variant-numeric: tabular-nums;
}
.mmu-bandgigs li:first-child { border-top: 0; }

/* Vergangene Konzerte stehen AB NEUN Terminen in einem <details>, darunter
   direkt im Grid (Betreiberregel 31.08.2026: "wenn es mehr als 8 Konzerte in
   der Vergangenheit waren, wird es eine ausklappbare Liste"). Die offene
   Fassung braucht hier keine eigene Regel — die Sektion traegt beide Klassen,
   also greift `.mmu-bandgigs > ul` von oben. Nur der Aufklapper ist Sonderfall. */
.mmu-bandgigs-archiv > details {
  grid-column: 2;
}
.mmu-bandgigs-archiv > details > ul {
  list-style: none;
  margin: var(--raum-2) 0 0;
  padding: 0;
}
/* 🔴 Das summary TRAEGT die Ueberschrift (Handoff v3, „Bandseite"):
   links „Bisherige Konzerte" klein und gesperrt, rechts die Zahl in
   Serifenschrift und Akzentfarbe, darunter eine Haarlinie.
   Werte aus dem Entwurf (v3.dc.html Zeile 314 ff.). */
.mmu-bandgigs-archiv > details > summary {
  cursor: var(--mmu-zeiger-klick);
  cursor: var(--mmu-zeiger-klick-hidpi);
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: var(--raum-3);
  min-height: 44px;
  padding-bottom: 0.4rem;
  border-bottom: 1px solid var(--mmu-kante);
  color: var(--mmu-gedimmt);
}
/* Die Ueberschrift im summary traegt keine eigenen Abstaende mehr — das
   summary setzt sie. Sonst stuende die Haarlinie weit unter dem Text. */
.mmu-bandgigs-archiv > details > summary > h2 {
  display: contents;
  font-size: var(--t-klein);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  font-weight: 400;
}
/* 🔴 Die Zahl im Aufklapper traegt die Entwurfswerte, nicht die
   allgemeine Gestaltung von .mmu-gigzahl: Serifenschrift, fett,
   1.125rem, Akzentfarbe (v3.dc.html Zeile 316).
   ⚠️ Gezielt NUR im summary. Dieselbe Klasse traegt die Zahl auch in der
   offenen Fassung derselben Ueberschrift (Bands mit hoechstens acht
   Terminen) und auf der Ortsseite — dort bleibt sie klein und gedimmt.
   ⚠️ margin: 0, weil die allgemeine Regel margin-top setzt: Dort steht
   die Zahl UNTER der Ueberschrift, hier daneben. */
.mmu-bandgigs-archiv > details > summary .mmu-gigzahl {
  display: inline;
  margin: 0;
  font-family: var(--schrift-prosa);
  font-weight: 700;
  font-size: 1.125rem;
  color: var(--mmu-akzent-text);
  letter-spacing: normal;
  text-transform: none;
}
.mmu-bandgigs-archiv > details[open] > summary {
  margin-bottom: var(--raum-2);
}

/* 🔴 DIE ANIMATION: grid-template-rows 0fr -> 1fr ueber 450 ms, wie der
   Entwurf sie vorgibt. Das Raster aussen und das overflow:hidden innen
   gehoeren zusammen — ohne das innere Element springt die Liste, weil ihr
   Inhalt die Zeile aufhaelt.

   ⚠️ WAS DAS NICHT KANN, offen benannt: <details> rendert seinen Inhalt
   nur im Zustand [open]. Die Animation laeuft deshalb beim OEFFNEN; beim
   Schliessen verschwindet der Inhalt sofort und springt. Der Entwurf
   schaltet mit JavaScript und hat das Problem nicht — hier ist alles ohne
   JavaScript bedienbar (§7), und das ist der Preis dafuer.
   🔵 Browser mit ::details-content koennen beide Richtungen; der
   @supports-Block darunter nimmt das mit, wo es da ist. */
.mmu-klapp-schub {
  display: grid;
  grid-template-rows: 0fr;
  transition: grid-template-rows 450ms cubic-bezier(0.3, 1.1, 0.5, 1);
}
.mmu-bandgigs-klapp[open] > .mmu-klapp-schub {
  grid-template-rows: 1fr;
}
.mmu-klapp-schub > div {
  overflow: hidden;
}

@supports selector(details::details-content) {
  /* Hier traegt der Browser den Inhalt auch im geschlossenen Zustand, die
     Liste gleitet also in BEIDE Richtungen. */
  .mmu-bandgigs-klapp::details-content {
    block-size: 0;
    overflow: hidden;
    transition: block-size 450ms cubic-bezier(0.3, 1.1, 0.5, 1), content-visibility 450ms allow-discrete;
  }
  .mmu-bandgigs-klapp[open]::details-content {
    block-size: auto;
  }
}

/* ⚠️ Wer Bewegung abgestellt hat, bekommt die Liste sofort. Die Auskunft
   steckt im Inhalt, nicht im Weg dorthin. */
@media (prefers-reduced-motion: reduce) {
  .mmu-klapp-schub { transition: none; }
}

/* Dasselbe auf der Ortsseite: "Bisherige Konzerte" stehen ab neun Terminen in
   einem <details> (Betreiberwunsch 24.09.2026, Schwelle wie auf der Bandseite).
   Eigene Regeln statt gemeinsamer Selektorliste — .mmu-bandgigs-archiv traegt
   `grid-column: 2`, das am Seitenraster der Bandseite haengt; die Ortsseite
   hat dieses Raster nicht, und die Regel schoebe die Liste dort in eine Spalte,
   die es nicht gibt. Die Liste selbst ist .mmu-gigliste wie oben auf der Seite,
   ihr Vierspaltenraster greift im <details> unveraendert. */
.mmu-ortgigs-archiv > details > summary {
  cursor: var(--mmu-zeiger-klick);
  cursor: var(--mmu-zeiger-klick-hidpi);
  color: var(--mmu-gedimmt);
  font-size: var(--t-mikro);
}
.mmu-ortgigs-archiv > details[open] > summary {
  margin-bottom: var(--raum-2);
}

/* Die Zahl steht neben der Ueberschrift, nicht darunter — sie ist eine
   Angabe zur Liste, keine eigene Zeile. Im Register bricht sie um. */
.mmu-gigzahl {
  display: block;
  margin-top: var(--raum-1);
  color: var(--mmu-gedimmt);
  font-size: var(--t-mikro);
  font-weight: 400;
  letter-spacing: 0;
  text-transform: none;
}

/* -------------------------------------------------------------------------
   11. Bandverzeichnis
   ------------------------------------------------------------------------- */
/* .mmu-liste tragen ZWEI Verzeichnisse mit verschieden vielen Zellen:
   Bandzeilen haben vier (Name, Genre, Ort, Jahr), Ortszeilen zwei (Name,
   Anfahrt-Symbol). Ein gemeinsames Vierspaltenraster setzte das
   Anfahrt-Symbol in die zweite Spalte — gemessen 317px neben den Namen,
   mitten in die leere Zeile. Deshalb erbt hier nur, was beide teilen; das
   Raster haengt am Hauptelement, das die Ansicht ohnehin unterscheidet
   (.mmu-archiv gegen .mmu-orte). Kein Markup-Eingriff noetig. */
.mmu-liste { list-style: none; padding: 0; margin: 0 0 var(--raum-6); }
.mmu-liste li {
  display: grid;
  gap: var(--mmu-luecke);
  padding: var(--raum-3) 0;
  border-top: 1px solid var(--mmu-linie);
  align-items: baseline;
}
/* :where() traegt NICHTS zur Spezifitaet bei — und das ist hier der ganze
   Punkt, nicht Kosmetik. Ohne es waere dieser Selektor 0-2-1 und schluege die
   Stapelregel `.mmu-liste li` im 40rem-Block (0-1-1), weil Media Queries die
   Spezifitaet NICHT erhoehen. Gemessen bei 412px: Das Verzeichnis blieb
   vierspaltig — 160 / 73 / 37 / 33 Pixel, die Genre-Spalte auf zwei Zeilen
   gebrochen, der Ort auf 37px gequetscht. Es lief nicht ueber, es war nur
   unlesbar.
   Mit :where() liegen beide Regeln bei 0-1-1, und der spaeter stehende
   40rem-Block gewinnt. Gefunden hat den Fehlertyp die TP5-Sitzung an der
   Vereinsliste; er steckte im selben Muster hier. */
/* Fuenf Zellen seit dem 12.08.2026 (Status dazu), nicht mehr vier. Wer hier
   eine Spalte ergaenzt, muss BEIDE Stellen anfassen: die Zeile im Template
   und diese Zuordnung. Sonst wandern die Zellen in fremde Spalten — genau
   die Falle, die GESTALTUNG §9 fuer eine vierte Liste beschreibt.

   ⚠️ Die beiden rechten Spalten haben FESTE Breiten, nicht max-content —
   derselbe Fehler wie im Kalender (§9a) und aus demselben Grund: Jedes <li>
   ist ein EIGENES Raster, also rechnet jede Zeile ihre max-content-Spalten
   aus ihrem eigenen Inhalt. Bei den Jahreszahlen fiel das nie auf, weil alle
   vier Ziffern haben. Mit dem Status brach es sofort auf: gemessen wanderte
   die Spaltenkante zwischen 1151 und 1179 px, je nachdem ob die Zeile
   "aktiv" oder "aufgeloest" trug. Es lief nicht ueber, es stand nur nichts
   untereinander.

   5,5rem traegt "aufgeloest" bei 0,875rem Schriftgroesse; 2,75rem traegt
   vier Ziffern. Wer hier einen laengeren Statuswert einfuehrt, muss das Mass
   nachziehen. */
/* 🔴 DIE SPALTEN STEHEN IN EINER VARIABLEN, seit die Zeilen aufklappbar sind
   (Handoff v3, 30.09.2026). Das Raster liegt jetzt an ZWEI Elementen: an der
   Kopfzeile (ein gewoehnliches <li>) und am <summary> der Datenzeilen. Zwei
   Zahlenreihen dafuer waeren genau die Falle, vor der der Kommentar darueber
   warnt — beide muessten bei jeder Spaltenaenderung mitwandern, und eine
   bliebe zurueck. Mit der Variablen gibt es weiterhin EINE Zuordnung. */
.mmu-archiv {
  --mmu-bandspalten: minmax(10rem, 2fr) minmax(0, 2fr) minmax(0, 1fr) 2.75rem 5.5rem;
}
:where(.mmu-archiv) .mmu-liste li {
  grid-template-columns: var(--mmu-bandspalten);
}

/* Der Doppelstrich des Entwurfs eroeffnet die Tabelle, wie er im
   Konzertkalender und bei den Oertlichkeiten einen Abschnitt eroeffnet —
   dasselbe Vokabular. NUR auf .mmu-archiv (Bandverzeichnis): .mmu-liste
   ist eine geteilte Klasse, und bei den Oertlichkeiten traegt schon die
   Bezirksueberschrift ihre eigene Doppellinie (§14) — ein zweiter Strich
   direkt am Listenanfang stuende ihr redundant im Nacken. */
.mmu-archiv .mmu-liste { border-top: 3px double var(--mmu-kante); }

/* Die Kopfzeile des Entwurfs: klein, versal, gesperrt — dieselbe Sprache
   wie jeder andere Kolumnentitel dieser Seite (§3). Rein visuell
   (aria-hidden im Markup), deshalb ohne eigene Begruendung fuer
   Vorlesehilfen noetig.

   border-top:0 nimmt die duenne Linie zurueck, die .mmu-liste li
   allgemein traegt — direkt unter dem 3px-Doppelstrich waere sie ein
   zweiter, ueberfluessiger Strich im Abstand von wenigen Pixeln.
   border-bottom in der kraeftigeren --mmu-kante (statt der leisen
   --mmu-linie zwischen den Datenzeilen) trennt die Kopfzeile sichtbar vom
   Inhalt, wie der Entwurf es mit seiner eigenen border-bottom-Farbe tut. */
/* .mmu-liste .mmu-liste-kopf statt nur .mmu-liste-kopf: Zwei Klassen gegen
   die eine Klasse plus Element von ".mmu-liste li" (Spezifitaet 0-2-0 gegen
   0-1-1) — sonst gewinnt border-top:1px der Basisregel trotz spaeterer
   Position, exakt derselbe Fehlertyp wie zuvor bei .mmu-maxime. Gemessen:
   Die Kopfzeile trug die duenne Linie beider Regeln uebereinander statt nur
   den kraeftigeren border-bottom. */
.mmu-liste .mmu-liste-kopf {
  /* Kein eigenes grid-template-columns: Als <li> mit dieser Klasse erbt sie
     das Spaltenmass bereits von ":where(.mmu-archiv) .mmu-liste li" oben —
     eine zweite, identische Deklaration waere totes Gewicht. */
  border-top: 0;
  border-bottom: 1px solid var(--mmu-kante);
  padding-bottom: var(--raum-2);
  /* 📏 0.6875rem und 0.14em nach dem Entwurf. Eine Spaltenbeschriftung
     darf kleiner und weiter gesperrt stehen als der Inhalt -- sie wird
     einmal gelesen, nicht mitgelesen. */
  font-size: 0.6875rem;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--mmu-gedimmt);
}
/* Die naechste Datenzeile braucht ihre eigene Linie nicht doppelt gegen
   die Kopfzeile — .mmu-liste-kopf traegt die Trennung bereits ueber ihren
   eigenen border-bottom. */
.mmu-liste-kopf + li { border-top: 0; }
/* Ortszeile: Name links, Anfahrt rechts als eigene Spalte — das ergibt eine
   ruhige Symbolkante am rechten Rand statt eines Symbols, das je nach
   Namenslaenge wandert.

   ABSICHTLICH ohne :where(), anders als beim Verzeichnis darueber: Diese
   Zeile soll auch auf schmalen Schirmen zweispaltig BLEIBEN. Name und
   Anfahrtssymbol gehoeren nebeneinander; gestapelt saesse das Symbol allein
   auf einer eigenen Zeile unter dem Namen. Die hoehere Spezifitaet haelt die
   Stapelregel hier bewusst ab, und beide Spalten haben keine harte
   Mindestbreite, laufen also nicht ueber. Wer das "vereinheitlicht", macht
   es kaputt. */
.mmu-orte .mmu-liste li {
  /* ⚠️ FESTE Namensspalte, nicht 1fr.
     Mit minmax(0, 1fr) nahm der Name die ganze Zeilenbreite und schob das
     Anfahrtssymbol an den aeussersten Rand: gemessen am 13.08.2026 bei
     1280px Fenster im Mittel 1011 Pixel Leere zwischen Name und Symbol, bei
     1152px Zeilenbreite. Die "ruhige Symbolkante", die der Absatz unten
     begruendet, war richtig gedacht — nur lag sie einen Bildschirm weit weg
     von dem, worauf sie sich bezieht.

     16rem = 256px traegt den laengsten Namen des Bestands ("Vereinsheim Country
     Gringos", gemessen 211px) mit 45px Luft — genug fuer die Segoe-Metriken,
     mit denen der Browser vor dem Laden von Plex rechnet (§9a).
     Die Kante bleibt damit ruhig — sie steht bei jeder Zeile gleich —, nur
     eben neben dem Namen statt am Fensterrand. Ein laengerer Name bricht
     um, statt die Kante zu verschieben; max-content haette sie von Zeile zu
     Zeile wandern lassen, weil jedes <li> sein eigenes Raster ist (§9a). */
  /* ⚠️ Die mittlere Spalte muss VIER Symbole tragen, nicht drei.
     Sie stand bis zum 17.08.2026 auf 11.5rem = 184px. Gebraucht werden
     4 × 42px Feld + 3 × 8px Luecke = 192px — acht Pixel zu wenig. Die zwei
     Zeilen des Bestands mit vier Symbolen (Szenerie Drehleier, Born to Rock)
     brachen deshalb um und massen 117px statt 67px.

     12.5rem = 200px gibt der Gruppe die 192px und acht Pixel Reserve. Wer die
     Feldgroesse (§6a, 2.5rem) oder --raum-2 aendert, rechnet hier nach; wer
     ein FUENFTES Symbol einfuehrt, braucht 250px. */
  grid-template-columns: 16rem 12.5rem minmax(0, 1fr);
  align-items: center;
}

/* Der Zeitenblock beginnt auf HOEHE DES NAMENS, nicht darunter
   (Betreiberwunsch 17.08.2026: "das soll auf gleicher Hoehe sein").

   Warum er tiefer stand: Die Zeile hat drei Spalten, aber vier Kinder, und
   `.mmu-ortslage` ist per `grid-column: 1` fest in die erste Spalte gesetzt.
   Damit steht der Name allein in Zeile 1, und Lage, Symbole und Zeiten
   landen in Zeile 2. Der Zeitenblock begann also eine Zeile zu tief — der
   Abstand war keine Marotte des Abstands, sondern eine ganze Rasterzeile.

   `grid-row: 1 / span 2` statt `1 / -1`: Das Raster hat keine EXPLIZITEN
   Zeilen, und -1 zeigt auf die letzte explizite Linie — bei nur impliziten
   Zeilen ist das Linie 1, die Angabe liefe also ins Leere. Genau diese
   Falle steht schon einmal weiter unten im Stylesheet dokumentiert.

   `align-self: start` ueberstimmt das `align-items: center` der Zeile: Ohne
   es saesse der Block mittig zwischen beiden Zeilen und stuende bei kurzen
   Zeitenlisten wieder woanders als der Name. */
/* 🔴 Der Schub beim Darueberfahren (Handoff v3, „Venues"):
   „Hover schiebt die Zeile 6 px nach rechts."
   Werte aus dem Entwurf uebernommen (v3.dc.html Zeile 483):
   translateX(6px), 250ms, cubic-bezier(.2,1.5,.4,1).
   ⚠️ :focus-within steht daneben, weil die Zeile bis zu fuenf Links
   traegt (Name, ANF, WEB, IG, FB). Wer mit der Tastatur hindurchgeht,
   bekaeme sonst keine Rueckmeldung, welche Zeile gerade dran ist —
   und das ist genau die Auskunft, die der Schub gibt. */
.mmu-orte .mmu-liste li {
  transition: transform 250ms cubic-bezier(0.2, 1.5, 0.4, 1);
}
.mmu-orte .mmu-liste li:hover,
.mmu-orte .mmu-liste li:focus-within {
  transform: translateX(6px);
}
/* ⚠️ Der Schub ist Zierde, keine Auskunft, die nur er geben kann: Die
   Zeile hebt sich auch ohne ihn durch den Fokusrahmen ab. Wer Bewegung
   abgestellt hat, braucht ihn nicht. */
@media (prefers-reduced-motion: reduce) {
  .mmu-orte .mmu-liste li { transition: none; }
  .mmu-orte .mmu-liste li:hover,
  .mmu-orte .mmu-liste li:focus-within { transform: none; }
}

.mmu-orte .mmu-oeffnungszeiten {
  grid-column: 3;
  grid-row: 1 / span 2;
  align-self: start;
}

/* Die Oeffnungszeiten als DRITTE Spalte, nicht als zweite Zeile.
   (Betreiberwunsch 16.08.2026: "eleganter, wenn die Oeffnungszeiten hier
   stehen" — gemeint war der freie Platz rechts neben den Symbolen.)

   ⚠️ Vorher trug die Zeile drei Kinder in einem ZWEIspaltigen Raster. Das
   dritte fiel damit in Zeile zwei, Spalte eins — also unter den NAMEN, in die
   16rem breite Spalte. Die X-Bar-Zeile brach dort auf drei Zeilen um, obwohl
   rechts daneben die halbe Zeilenbreite leer stand. Kein Fehler, keine
   Meldung: Ein Raster mit zu wenig Spalten wirft nichts weg, es klappt um.

   ⚠️ FESTE Symbolspalte, 11.5rem — und das ist die zweite Fassung. Die erste
   nahm `auto` mit der Begruendung, die Zeiten sollten direkt an der
   Symbolgruppe beginnen. Das Ergebnis war genau die wandernde Kante, die der
   Absatz oben fuer den Namen schon einmal abgestellt hat, nur von der
   anderen Seite: Die Gruppe traegt zwischen einem und vier Symbolen, also
   begann jede Zeile woanders. Gemessen am 16.08.2026 auf /rockbars/ standen
   die Zeiten in zwei Kolonnen — RAW, Schwarzer Hahn und Abseits (zwei
   Symbole) rund 100 Pixel weiter links als Tumult und Crash (vier).

   `auto` war nicht zu wenig durchdacht, sondern am falschen Bezugspunkt
   gedacht: Es haelt den Abstand zwischen Symbolen und Zeit konstant. Konstant
   sein muss aber die Kante ueber die Zeilen hinweg, nicht der Abstand
   innerhalb einer Zeile.

   Das Mass ist gerechnet, nicht geschaetzt: vier Felder à 2.5rem plus drei
   Luecken à --raum-2 (0.5rem) = 11.5rem. Vier ist das Maximum, das eine Zeile
   tragen kann — Anfahrt, Website, Instagram, Facebook. Kaeme ein fuenfter
   Kanal dazu, gehoerte diese Zahl mit ihm angepasst. */
.mmu-oeffnungszeiten {
  color: var(--mmu-gedimmt);
  font-size: var(--t-neben);
  line-height: 1.4;
}
/* Die zerlegte Fassung: Tag links, Zeit rechts, eine Zeile je Regel.
   -------------------------------------------------------------------------
   Vorher stand alles als EIN Band ("Di & Mi 20:00–02:00, Do 20:00–03:00, Fr &
   Sa 20:00–04:00, So 20:00–02:00 · Mo Ruhetag") und lief ueber die halbe
   Zeilenbreite um. Wer wissen wollte, ob heute offen ist, musste einen Satz
   lesen statt eine Zeile zu finden.

   `max-content` fuer die Tagesspalte, nicht ein festes Mass: Die
   Tagesangaben sind zwischen zwei ("Mo") und elf Zeichen ("Fr & Sa") lang.
   Ein festes Mass muesste sich am laengsten richten und liesse bei allen
   anderen eine Luecke; max-content nimmt je Bar genau so viel, wie diese Bar
   braucht. Die Kante bleibt trotzdem ruhig, weil sie INNERHALB einer Bar
   gilt — und zwischen Bars steht ohnehin eine Trennlinie.

   Die Ziffern laufen auf tabellarischen Stellen, damit "20:00–02:00" und
   "19:00–01:00" untereinander dieselbe Breite haben. Sonst zittert die
   Spalte, obwohl in jeder Zeile gleich viele Zeichen stehen. */
div.mmu-oeffnungszeiten {
  display: grid;
  grid-template-columns: max-content minmax(0, 1fr);
  gap: 0.15rem var(--raum-3);
  align-items: baseline;
}
.mmu-zeit-tage { white-space: nowrap; }
.mmu-zeit-wert { font-variant-numeric: tabular-nums; }
/* Saison und Hinweis gehoeren zur ganzen Bar, nicht in eine der Spalten.
   Der Abstand nach oben trennt sie vom Block darueber — beim Tumult stossen
   sonst zwei Jahreszeiten ohne Luft aneinander. */
.mmu-zeit-saison,
.mmu-zeit-hinweis { grid-column: 1 / -1; }
.mmu-zeit-saison {
  font-size: var(--t-klein);
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--mmu-text);
  margin-top: var(--raum-2);
}
.mmu-zeit-saison:first-child { margin-top: 0; }
.mmu-zeit-hinweis {
  margin-top: var(--raum-1);
  font-style: italic;
}

/* "Laut Angabe gerade offen" bzw. "öffnet in drei Stunden".
   -------------------------------------------------------------------------
   Vom Skript eingesetzt (assets/jetzt-offen.js), nie vom Server — die Seite
   kommt aus dem Zwischenspeicher, ein dort gesetztes "offen" waere beim
   naechsten Besucher falsch.

   Die Marke ist bewusst als solche erkennbar — Rahmen, Rundung, eigener
   Punkt (Betreiberwunsch 16.08.2026: "damit der Besucher merkt dass hier
   auch was passiert"). Sie ist die einzige Angabe der Seite, die sich
   waehrend des Lesens aendern kann; das darf man ihr ansehen.

   ⚠️ Der Wortlaut haelt trotzdem Abstand zur Gewissheit. Ueber der Liste
   steht "Stand <Datum>, vor dem Hingehen bitte selbst nachsehen" — deshalb
   "laut Angabe offen", kein gefuellter Knopf, keine grosse Flaeche und ein
   Puls von zweieinhalb Sekunden statt eines Blinkens. Auffallen ja,
   draengen nein.

   🔵 Eine erste Fassung verzichtete ganz auf Ampelfarben und blieb im
   Grundton der Zeile. Auf Betreiberentscheidung tragen Rot und Gruen jetzt
   den Zustand — als Zusatz zum Text, nicht an seiner Stelle; siehe unten. */
.mmu-jetzt {
  grid-column: 1 / -1;
  /* Ohne justify-self zoege der Rahmen ueber die ganze Zeilenbreite und
     saehe aus wie ein Kasten, nicht wie eine Marke. */
  justify-self: start;
  display: inline-flex;
  align-items: center;
  gap: 0.5em;
  margin-bottom: var(--raum-2);
  padding: 0.25em 0.7em 0.3em;
  border: 1px solid var(--mmu-linie);
  border-radius: 999px;
  font-size: var(--t-klein);
  letter-spacing: 0.05em;
  text-transform: uppercase;
  font-weight: 600;
  color: var(--mmu-gedimmt);
}
/* Der Punkt leuchtet rot oder gruen (Betreiberwunsch 16.08.2026).
   -------------------------------------------------------------------------
   ⚠️ Die Farbe ist ZUSATZ, nie der einzige Traeger. Direkt daneben steht
   "laut Angabe offen bis 02:00" bzw. "oeffnet morgen ab 20:00" — wer Rot und
   Gruen nicht unterscheidet (rund acht Prozent der Maenner), verliert dadurch
   keine Angabe. Eine Ampel ohne Beschriftung waere hier ein Fehler; eine mit
   ist eine Abkuerzung.

   ⚠️ Nicht der Akzentton der Seite (#e0614a) fuer "zu": Er ist rotorange und
   liegt neben dem Gruen zu dicht am Grenzfall. Das Rot hier ist dunkler und
   gesaettigter, damit die beiden Zustaende auch nebeneinander in einer Liste
   auseinanderfallen.

   Der Schein ist ein weicher Schatten in derselben Farbe, keine zweite
   Flaeche — er soll den Punkt heben, nicht die Zeile fuellen. */
/* ⚠️ Beide Werte sind fuer DUNKLEN Grund gerechnet (30.09.2026). Der Punkt
   ist kein Text, also gilt WCAG 1.4.11 mit 3:1 — nicht 4,5:1.

     zu    #e8756a   7,18:1 auf Schwarz   6,53:1 auf der Kachel
     offen #46a862   7,04:1               6,40:1

   Die alten Werte fuer hellen Grund (#c8443a 4,83:1 / #2a8442 4,69:1) fielen
   auf Schwarz auf 4,34 und 4,48 — beides haelt die 3:1 noch, aber das Gruen
   war eigens fuer Weiss abgedunkelt worden und sah auf Schwarz stumpf aus.

   Das Gruen stand bis dahin auf #4fb862. Auf schwarzem Grund waren das
   8,37:1, auf weissem nur noch 2,51:1 — der Punkt haette die Grenze
   unterschritten, waehrend das Rot mit 4,83:1 durchging. Ein Auf-Zu-Signal,
   bei dem nur eine Seite sichtbar ist, ist schlimmer als keines.

   Die beiden liegen jetzt fast gleichauf. Das ist Absicht: Beide Zustaende
   sollen dasselbe Gewicht tragen. Wer einen aendert, rechnet den anderen
   nach. */
.mmu-jetzt {
  --mmu-ampel: var(--wp--preset--color--ampel-zu, #e8756a);
}
.mmu-jetzt-offen {
  --mmu-ampel: var(--wp--preset--color--ampel-offen, #46a862);
}
.mmu-jetzt::before {
  content: "";
  width: 0.5em;
  height: 0.5em;
  flex: none;
  border-radius: 50%;
  background: var(--mmu-ampel);
  box-shadow: 0 0 0.45em var(--mmu-ampel);
}
/* Der Rahmen nimmt den Zustand nur ANGEDEUTET auf. Ein voll eingefaerbter
   Rahmen je Zeile ergaebe an einem Montagvormittag sieben rote Marken
   untereinander — die Liste saehe nach Stoerung aus, dabei ist "zu" der
   Normalfall einer Metal-Bar um zehn Uhr morgens. */
.mmu-jetzt-offen {
  color: var(--mmu-text);
  border-color: var(--mmu-kante);
}
.mmu-jetzt-offen::before {
  /* Ein langsamer Puls, damit erkennbar ist, dass diese Angabe LEBT und
     nicht wie der Rest der Zeile aus dem Vault kommt (Betreiberwunsch
     16.08.2026: "damit der Besucher merkt dass hier auch was passiert").

     ⚠️ Bewusst traege: 2,4 Sekunden, kein Blinken, keine Groessenaenderung.
     Ein schnelles Signal neben einer Angabe, die ausdruecklich "bitte selbst
     nachsehen" sagt, wuerde eine Sicherheit behaupten, die es nicht gibt.
     Der Punkt soll auffallen, nicht draengen.

     ⚠️ Es atmet der SCHEIN, nicht der Punkt. Eine erste Fassung liess die
     Deckkraft pendeln — damit verschwand zwischendurch auch die Farbe, und
     die traegt hier die Aussage. Der Punkt bleibt deckend, nur sein Hof
     wird enger und weiter.

     Der globale prefers-reduced-motion-Block weiter unten schaltet die
     Bewegung ab; eine eigene Ausnahme braucht es hier nicht. */
  animation: mmu-jetzt-puls 2.4s ease-in-out infinite;
}
@keyframes mmu-jetzt-puls {
  0%, 100% { box-shadow: 0 0 0.55em var(--mmu-ampel); }
  50%      { box-shadow: 0 0 0.1em var(--mmu-ampel); }
}

/* Anfahrt und Kanaele als eine Gruppe, links buendig direkt hinter dem Namen.
   Die feste Namensspalte gibt ihr eine gleichbleibende Anfangskante — das ist
   die "ruhige Symbolkante", die der Absatz oben meint, nur eben neben dem
   Namen statt am Fensterrand. Nach rechts darf die Gruppe unterschiedlich
   weit reichen: Dort richtet sich nichts aus. */
.mmu-ortsymbole {
  display: flex;
  flex-wrap: wrap;
  gap: var(--raum-2);
  align-items: center;
}
/* Das Anfahrtssymbol war fuer sich allein gebaut und mass 30x30, die
   Kanalfelder messen 42x42. Nebeneinander in einer Reihe ist das unruhig —
   §6a begruendet fuer die Kanaele ausdruecklich, dass alle Felder gleich
   gross sein muessen. In DIESER Gruppe zieht die Anfahrt deshalb mit; auf
   der Ortsseite, wo sie allein im Titel steht, bleibt sie wie sie war. */
.mmu-ortsymbole .mmu-anfahrt {
  width: 2.5rem;
  height: 2.5rem;
  padding: 0;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  margin: 0;
}
/* ⚠️ Die Kanalfelder brauchen denselben Reset — und zwar aus demselben Grund,
   aus dem §9j die Kanalregeln ueberhaupt auf diesen Behaelter ausgedehnt hat.

   Mitgekommen ist dabei "margin: 0 var(--raum-2) var(--raum-2) 0" (Abschnitt
   6a). Der Rand gehoert zur Kanalreihe auf Band- und Ortsseiten, wo die
   Knoepfe UMBRECHEN und ihren Abstand selbst mitbringen muessen. Diese Gruppe
   arbeitet dagegen mit gap — also addierte sich beides.

   Gemessen am 14.08.2026, vorher: zwischen Anfahrt und Website 8 px, zwischen
   Website und Instagram 16 px, weil nur die Kanalfelder einen rechten Rand
   tragen. Und der untere Rand machte die Gruppe 50 statt 42 px hoch: Zeilen
   mit einem Symbol waren 67 px hoch, Zeilen mit zwei bis vier 75 px. Die
   Symbolreihen benachbarter Zeilen standen damit auf verschiedenen Hoehen.

   Kein Fehler, kein Ueberlauf, keine Meldung — nur eine Liste, die von Zeile
   zu Zeile atmet. */
.mmu-ortsymbole a.mmu-kanal { margin: 0; }
/* ⚠️ `summary > a` MUSS dazu, seit die Bandzeilen aufklappbar sind (Handoff
   v3, 30.09.2026): Der Bandname liegt nicht mehr direkt im <li>, sondern im
   <summary> darin. Ohne die zweite Zeile verloeren die Bandnamen ihre
   Auszeichnung — sie stuenden unterstrichen und normal gewichtet da, waehrend
   die Namen in Orte-, Vereins- und Festivalliste unveraendert bleiben. Das
   Kind-Zeichen `>` macht den Selektor stumpf gegen Umbauten wie diesen; es
   steht hier trotzdem, weil es Links IM aufgeklappten Bereich draussen
   haelt (die tragen ihre eigene Gestaltung). */
.mmu-liste li > a,
.mmu-liste summary > a { text-decoration: none; font-weight: 600; }
.mmu-liste li > a:hover,
.mmu-liste summary > a:hover { text-decoration: underline; }

/* Der Stadtbezirk an der Rockbar-Zeile.
   Seit dem 18.08.2026 ist /rockbars/ EINE nach Oeffnung sortierte Liste statt
   Gruppen je Bezirk — die Lage steht deshalb an der Zeile.

   ⚠️ `grid-column: 1` ist nicht Kosmetik. Die Zeile ist ein Grid mit zwei
   Spalten (Name | Symbole und Zeiten). Ohne diese Angabe landete die Lage in
   Spalte 2 und schoebe die Symbolgruppe aus ihrer Kante — genau die Kante, die
   am 13.08.2026 gegen 1011px Leere zwischen Name und Symbol erkaempft wurde.
   So sitzt sie in einer neuen Zeile UNTER dem Namen, wo sie hingehoert.

   Nicht ueber `.mmu-orte` eingegrenzt: Die Klasse entsteht nur dort, wo die
   Vorlage sie setzt, und das ist ausschliesslich die Rockbar-Liste. */
.mmu-liste li > .mmu-ortslage {
  grid-column: 1;
  font-size: 0.8125rem;
  color: var(--mmu-gedimmt);
}

/* „Zuerst, was jetzt offen ist" — steht per `hidden` im Markup und wird erst
   vom Skript freigegeben, weil es ohne Skript nicht stimmt. */
.mmu-sortierhinweis {
  margin: 0 0 0.75rem;
  font-size: 0.8125rem;
  color: var(--mmu-gedimmt);
}

/* Sprungmarken zu den Staedten auf /rockbars/ (22.09.2026). Eine Zeile aus
   Links, keine Auswahlliste: Ohne Skript springt ein Anker, ein <select>
   nicht.

   🔴 HIER STAND `flex-wrap: wrap`, „damit aus der Zeile auf schmalen
   Geraeten ein Block wird, statt dass sie seitlich hinauslaeuft". Das war
   richtig, solange die Leiste im Fluss stand. Seit dem 30.09.2026 KLEBT sie
   (`position: sticky` im Papier-Abschnitt weiter unten) — und was klebt,
   darf nicht wachsen: Live gemessen nahm die umbrechende Leiste bei 375px
   111 von 812 Pixeln ein, und die Hoehe waechst linear mit jeder Stadt.

   ⚠️ DESHALB STEHT `nowrap` HIER UND NICHT NUR UNTEN. Der Papier-Abschnitt
   setzte es zuerst allein; beide Bloecke haben dieselbe Spezifitaet, also
   gewann der spaetere — die Behebung haengte damit allein an der
   REIHENFOLGE im Stylesheet. Wer die Bloecke zusammenlegt, verschiebt oder
   den Papier-Abschnitt nach oben zieht, kippt das Verhalten lautlos
   zurueck. (Befund der Orte-Sitzung, 30.09.2026.)

   🎯 Eine Regel, die nur durch Reihenfolge stimmt, ist eine, die beim
   naechsten Umbau faellt — und eine Begruendung, die das Gegenteil dessen
   sagt, was gilt, faellt mit ihr. */
.mmu-stadtwahl {
  display: flex;
  flex-wrap: nowrap;
  align-items: baseline;
  gap: 0.35rem 0.9rem;
  margin: 0 0 1.25rem;
  font-size: 0.875rem;
}
.mmu-stadtwahl-titel {
  color: var(--mmu-gedimmt);
  text-transform: uppercase;
  letter-spacing: 0.08em;
  font-size: 0.75rem;
}
.mmu-stadtwahl-zahl {
  color: var(--mmu-gedimmt);
  font-variant-numeric: tabular-nums;
}
/* Die Ueberschrift der Stadt traegt jetzt eine Sprungmarke. Ohne Abstand nach
   oben verschwaende sie unter der Kopfleiste, wenn jemand dorthin springt. */
.mmu-lage[id] {
  scroll-margin-top: 1.5rem;
}
.mmu-liste .mmu-ort,
.mmu-liste .mmu-jahr,
.mmu-liste .mmu-bandstatus {
  color: var(--mmu-gedimmt);
  font-size: var(--t-neben);
}

/* 🔴 DIE STILRICHTUNG STEHT IN DER AKZENTFARBE -- Betreiberentscheidung vom
   01.10.2026 am Soll-Bild der Bandliste.

   ⚠️ Das weicht BEWUSST vom Entwurfs-HTML ab, das hier color:#a0a0a8 setzt
   wie bei Ort, Jahr und Status. Vorgelegt wurde die Abweichung, weil zwei
   Bilder desselben Betreibers sich widersprachen: im einen grau, im anderen
   rot. Die Entscheidung ist rot.

   🔵 Die Stilrichtung ist die Auskunft, nach der in dieser Liste gesucht
   wird -- die Stempel darueber filtern nach nichts anderem. Ort, Jahr und
   Status bleiben gedimmt: Sie beschreiben die Band, sie sortieren sie nicht.

   ⚠️ Sie ist dadurch kein Link. Wer sie anklickbar macht, muss den Stempel
   darueber setzen, nicht nur die Farbe erklaeren. */
.mmu-liste .mmu-genre {
  color: var(--mmu-akzent-text);
  font-size: var(--t-neben);
}
.mmu-liste .mmu-jahr { font-variant-numeric: tabular-nums; text-align: right; }

/* -------------------------------------------------------------------------
   Das Stilregister ueber dem Bandverzeichnis
   -------------------------------------------------------------------------
   Markup von der SEO-Redaktion (Genre-Schritt 3): eine Linkliste der
   Stilrichtungen mit ihrer Bandzahl, oberhalb der Trefferzeile.

   Gestaltet als REGISTER, nicht als Knopfreihe: Es ist ein Inhaltsverzeichnis
   zum Bestand, kein Filterwerkzeug — den Filter gibt es im Kasten darueber
   bereits. Ein Register laeuft im Textfluss weiter und darf umbrechen; eine
   Knopfreihe verlangte gleiche Hoehen und feste Abstaende und saehe bei
   fuenfzehn Eintraegen nach einer Bedienleiste aus, die sie nicht ist.

   ⚠️ Die spaetere Genre-Auswahl des Kalenders (Handoff v2, Interaktion 4:
   „Genre-Stempel", Mehrfachauswahl mit gestricheltem Rand) ist etwas
   ANDERES und bekommt eigene Regeln. Wer beide zusammenlegt, macht aus dem
   Verzeichnis ein Bedienelement. */
.mmu-stilliste {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: var(--raum-1) var(--raum-3);
  margin: var(--raum-5) 0 var(--raum-2);
  padding-bottom: var(--raum-2);
  border-bottom: 1px solid var(--mmu-linie);
  font-family: var(--schrift-ui);
  font-size: var(--t-neben);
}

/* Der Bezeichner traegt dieselbe Versalienschrift wie die Kopfzeilen der
   Listen (Abschnitt 11) — er benennt eine Spalte, nur waagerecht. */
.mmu-stilliste-bezeichner {
  font-size: var(--t-mikro);
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--mmu-gedimmt);
}

.mmu-stilliste a {
  color: var(--mmu-text);
  text-decoration: none;
  /* 🔴 Die Zahl in der Klammer gehoert zum Linktext und laesst sich nicht
     eigens auszeichnen — sie kommt als blosser Text aus der Vorlage. Der
     ganze Eintrag bleibt deshalb einfarbig; die Unterscheidung macht die
     Stellung, nicht die Farbe.

     ⚠️ Kein white-space: nowrap auf dem Link: „Doom/Stoner (23)" darf
     umbrechen, wenn das Fenster schmal wird. Ein Register, das eine
     Querleiste erzeugt, ist schlimmer als eines mit einem Umbruch. */
  padding-block: 0.2rem;
}
.mmu-stilliste a:hover,
.mmu-stilliste a:focus-visible {
  color: var(--mmu-akzent-text);
  text-decoration: underline;
}

/* Die Stilrichtung, auf der man gerade steht. Dieselbe Behandlung wie die
   aktive Rubrik in der Kopfleiste — ein Register, das nicht sagt, wo man
   ist, ist eine Liste. */
.mmu-stilliste a[aria-current="page"] {
  color: var(--mmu-akzent-text);
  font-weight: 600;
}

@media (prefers-reduced-motion: reduce) {
  .mmu-stilliste a { transition: none; }
}

/* 🔴 "376 Bands" ist die UEBERSCHRIFT der Liste, nicht ihre Fussnote.
   Der Entwurf setzt sie in Serifenschrift, fett, 1.25rem -- bis zum
   01.10.2026 stand sie hier in 0.875rem Sans, gedimmt, und las sich wie
   eine Nebenauskunft ueber die Filterung. Sie sagt aber, was jetzt kommt. */
.mmu-treffer {
  color: var(--mmu-text);
  font-family: var(--schrift-prosa);
  font-size: 1.25rem;
  font-weight: 700;
  margin: var(--raum-5) 0 var(--raum-2);
}

/* -------------------------------------------------------------------------
   11a. Vereinsliste (TP5)
   -------------------------------------------------------------------------
   Dieselbe Zeilenstruktur wie das Bandverzeichnis (Abschnitt 11), nur zwei
   statt vier Spalten: Es gibt hier nichts zu filtern und nichts zu
   sortieren.
   Beide Spalten OHNE harte Mindestbreite, wie bei .mmu-orte und .mmu-archiv:
   .mmu-vereine .mmu-liste li (0-2-1) schlaegt die Stapelregel im 40rem-Block
   (0-1-1) unabhaengig von der Reihenfolge — Media Queries erhoehen die
   Spezifitaet nicht. Mit harten rem-Mindestbreiten (vormals minmax(12rem,
   1fr) minmax(8rem, auto), zusammen 20,25rem mit Luecke) blieb die Liste auf
   schmalen Schirmen (320px) zweispaltig und lief seitlich ueber.

   /sonstiges/ (14.08.2026) traegt dieselbe Zeile und steht deshalb in
   denselben Regeln, statt sie zu wiederholen. Das ist die Bruchkante aus
   GESTALTUNG.md 9: .mmu-liste fuehrt Verzeichnisse mit verschieden vielen
   Zellen, unterschieden ueber die Hauptklasse — eine vierte Liste OHNE
   eigene Zuordnung erbt die vierspaltige des Bandverzeichnisses, und ihre
   Zellen wandern in fremde Spalten. */
/* ⚠️ Die Ortsspalte hat eine feste Obergrenze, kein `auto`.

   Mit minmax(0, auto) rechnet jede Zeile ihre zweite Spalte aus dem EIGENEN
   Inhalt — und jedes <li> ist ein eigenes Raster (§9a). Gemessen am
   17.08.2026 ueber die sechs Vereinszeilen wanderte die Ortskante zwischen
   874 und 951 px, also um 77 Pixel: "Muenchen" ist kuerzer als "Pfaffenhofen
   a. d. Ilm". Genau der Fehler, den §9a im Kalender und §9f im
   Bandverzeichnis schon zweimal hatte; er laeuft nie ueber, es steht nur
   nichts untereinander.

   9.5rem = 152px traegt den laengsten Ort des Bestands ("Pfaffenhofen a. d.
   Ilm", gemessen 134px) mit 18px Luft — genug fuer die Segoe-Metriken, mit
   denen der Browser vor dem Laden von Plex rechnet (§9a).

   minmax(0, …) statt einer harten Breite, weil die Zeile auf schmalen
   Schirmen NICHT stapelt (siehe oben): Die Spalte darf schrumpfen, sonst
   laeuft die Liste bei 320px seitlich ueber — genau daran ist die Fassung
   mit minmax(8rem, auto) gescheitert. Wer einen laengeren Ort einfuehrt,
   zieht die 9.5rem nach. */
.mmu-vereine .mmu-liste li,
.mmu-sonstiges .mmu-liste li { grid-template-columns: minmax(0, 1fr) minmax(0, 9.5rem); }

/* Vereinslogo links neben der Zeile (Betreiberwunsch 16.08.2026).
   -------------------------------------------------------------------------
   ⚠️ Alles hier haengt an `:has(.mmu-vereinslogo)` — die Liste bleibt exakt
   wie vorher, solange KEIN Verein ein Logo traegt. Beim Bau war das der Fall
   (kein einziges Vereinslogo im Vault), und eine dauerhaft leere 4rem-Spalte
   fuer ein Bild, das es nicht gibt, waere eine Einrueckung ohne Grund.

   Die Bedingung sitzt am <ul>, nicht am <li>: Sobald EIN Verein ein Logo
   hat, ruecken ALLE Zeilen ein. Sonst haetten Zeilen mit und ohne Logo
   verschiedene linke Kanten, und die Liste saehe kaputt aus statt
   unvollstaendig. Eine gemeinsame Kante liest sich als Gestaltung, eine
   ausgefranste als Fehler.

   ⚠️ Das Logo steht NICHT im Raster, sondern absolut daneben — zweite
   Fassung, 16.08.2026 (Betreiberwunsch: "setzt die Logos bitte da hin",
   gemeint war die leere Flaeche links neben den Angaben).

   Die erste Fassung setzte es als Rasterzelle in Zeile 1, Spalte 1. Damit
   sass es oben am Namen und liess die ganze Hoehe darunter leer, waehrend
   der Eintrag daneben ueber drei Zeilen lief. Ueber alle Zeilen spannen ging
   nicht: `grid-row: 1 / -1` bezieht sich auf das EXPLIZITE Raster, und das
   hat hier keine Zeilen — die Angabenliste und die Kanalleiste erzeugen
   implizite. `span 3` haette bei einem Verein ohne Angaben zwei leere Zeilen
   Hoehe erzwungen.

   Absolute Lage loest beides auf einmal: Das Logo haengt nicht mehr an der
   Zeilenstruktur, sitzt senkrecht mittig zum ganzen Eintrag, und der Platz
   dafuer kommt aus einem padding-left am <li> statt aus einer Rasterspalte.
   Die Zellen darin brauchen dann auch keine ausdrueckliche Spaltenzuweisung
   mehr — sie liegen alle rechts vom Logo, weil das Polster sie dorthin
   schiebt. */
.mmu-vereine .mmu-liste:has(.mmu-vereinslogo) li {
  position: relative;
  padding-left: 7.5rem;
}

.mmu-vereinslogo {
  position: absolute;
  left: 0;
  top: 50%;
  transform: translateY(-50%);
}
/* Dieselbe Tafel wie das Bandlogo (Abschnitt 5): Die Logos sind ganz
   ueberwiegend mit schwarzem Grund eingebrannt statt transparent — ohne
   Tafel saesse jedes in einem sichtbaren Kasten aus seinem eigenen Bild.
   `--mmu-tafel` traegt deshalb reines Schwarz und bleibt auch nach der
   Umkehrung auf hellen Seitengrund (18.08.2026) unveraendert schwarz: Nur
   so setzt sich der eingebrannte Grund nahtlos in der Tafel fort.

   Seit dem 18.08.2026 traegt sie zusaetzlich die Klecksmaske, damit aus dem
   Kasten eine Form wird — siehe `--mmu-klecks`.

   scale-down statt contain, mit derselben Begruendung wie dort: Ein kleines
   Logo soll nicht auf Tafelgroesse hochgerechnet und dabei unscharf werden. */
/* 6.5rem statt der urspruenglichen 3.25rem: Bei 52 Pixeln war von einer
   Wortmarke wie "Bavarian Battle" oder "METAL CREW" nichts zu lesen — die
   Kachel zeigte, DASS ein Logo da ist, nicht welches. Der Platz ist da, der
   Eintrag ist ohnehin drei Zeilen hoch.

   Nicht quadratisch: Die Logos des Bestands reichen von 500x232 (MetalCrew,
   breit) bis 387x551 (United Metalheadz, hochkant). Ein quadratischer Rahmen
   liesse bei beiden mehr als die Haelfte leer. Die Breite steht fest, damit
   die Textkante rechts davon gleich bleibt; die Hoehe folgt dem Bild bis zu
   einer Grenze. */
.mmu-vereinslogo img {
  display: block;
  width: 6.5rem;
  height: auto;
  max-height: 6.5rem;
  background: var(--mmu-tafel);
  object-fit: scale-down;
  /* Zurueck auf raum-1: raum-3 war die Reserve fuer den Klecksrand, und den
     traegt hier nur noch die helle Variante (siehe unten). Die Breite bleibt
     bei 6.5rem, damit die Textkante rechts daneben steht. */
  padding: var(--raum-1);
  box-sizing: border-box;
}
/* Helle Tafel fuer Logos mit DUNKLER Zeichnung — gesteuert ueber
   `logo_grund: hell` im Vault, nicht geraten.

   ⚠️ Das ist kein Sonderwunsch, sondern Sichtbarkeit. Am 16.08.2026 auf die
   vier verbliebenen Vereinslogos gerechnet: [[BB Events]], [[Metality]] und
   [[Metal Maniacs Schrobenhausen]] tragen helle Flaechen und stehen auf
   Schwarz richtig; [[MetalCrew Kultur]] hat als einziges Bild ein schwarzes
   Piktogramm auf transparentem Grund — auf der schwarzen Tafel waere davon
   NICHTS zu sehen, und zwar ohne Fehlermeldung und ohne Luecke im Layout.
   Eine Kachel, die aussieht wie ein Logo und keines zeigt, ist schlechter
   als eine leere. */
/* 🔴 HIER bleibt der Klecks, und nur hier (Betreiberentscheidung
   30.09.2026). Eine weisse Tafel auf schwarzem Seitengrund ist genau der
   harte Kasten, gegen den die Maske am 18.08.2026 gebaut wurde — damals auf
   hellem Grund gegen eine schwarze Tafel, heute umgekehrt. Dieselbe Form,
   derselbe Zweck, vertauschte Farben.

   Die Randreserve (raum-3 statt raum-1) muss deshalb hier mitwandern: Sie
   war nie Zierde, sondern der Abstand, ohne den der unregelmaessige Rand ins
   Logo schneidet. Er greift hoechstens 9 % der Hoehe und 4 % der Breite nach
   innen — wer den Abstand verkleinert, schneidet Logos an.

   ⚠️ Dass hier gerade KEIN Verein steht, macht die Regel nicht ueberfluessig:
   `logo_grund: hell` ist im Vault vorgesehen und im Sync verdrahtet
   (src/org.mjs), es hat nur zur Zeit niemand gesetzt. Gemessen am 30.09.2026
   sind alle sechs Vereinslogos hell genug fuer die schwarze Tafel (mittlere
   Helligkeit 122 bis 255). Faellt das naechste dunkel aus, greift diese
   Regel — und dann soll die Form schon stimmen. */
.mmu-vereinslogo-hell img {
  background: #fff;
  padding: var(--raum-3);
  -webkit-mask-image: var(--mmu-klecks);
  mask-image: var(--mmu-klecks);
  -webkit-mask-size: 100% 100%;
  mask-size: 100% 100%;
  -webkit-mask-repeat: no-repeat;
  mask-repeat: no-repeat;
}

/* Die Abschnittsueberschriften auf /sonstiges/ haben dieselbe Aufgabe wie die
   Monatsmarken im Kalender (Abschnitt 9): Sie gliedern einen Strom, sie
   eroeffnen kein Kapitel. Deshalb dasselbe Mass statt eines neuen. */
.mmu-sonstiges h2 {
  font-size: var(--t-klein);
  font-weight: 600;
  letter-spacing: 0.09em;
  text-transform: uppercase;
  color: var(--mmu-gedimmt);
  margin: var(--raum-6) 0 var(--raum-2);
  padding-bottom: var(--raum-2);
  border-bottom: 1px solid var(--mmu-kante);
}
.mmu-sonstiges h2:first-of-type { margin-top: var(--raum-4); }

/* Der Name traegt dasselbe Gewicht wie ein Bandname im Verzeichnis
   (Abschnitt 11 setzt es dort ueber .mmu-liste li > a). Hier ist der Name
   ein span und kein Link — Vereine haben keine Einzelseite —, deshalb
   greift jene Regel nicht, und der Name stand in normaler Staerke neben
   einem betont gedimmten Ort. Das kehrte die Gewichtung um: Die Nebenangabe
   wirkte bestimmter als die Hauptsache. */
.mmu-vereinsname { font-weight: 600; }
.mmu-vereinsort { color: var(--mmu-gedimmt); font-size: var(--t-neben); }

/* Wofuer der Verein bekannt ist und wofuer er sich einsetzt. Dasselbe
   Register wie die Datenkarte auf Band- und Ortsseiten (Abschnitt 1):
   Bezeichner links, Wert rechts, eine gelernte Kante. Deshalb hier auch
   dieselben Merkmale und kein eigenes Mass.

   grid-column: 1 / -1, weil die Zeile ueber Name UND Ort laeuft — sie
   gehoert zum Verein, nicht in eine der beiden Spalten darueber. */
.mmu-vereinsangaben {
  grid-column: 1 / -1;
  display: grid;
  /* 🔴 GESTAPELT, NICHT ZWEISPALTIG — eine Vereinskarte ist zu schmal fuer
     eine Bezeichnerspalte. Mit der festen `--mmu-register` (9,5rem =
     152 px) rechnete das Raster bei drei Karten nebeneinander
     `152px 0.33px`: Der Wert „Live-Musik in Muenchen" brauchte 57 px und
     bekam 2, die Zelle sprengte ihre Reihe, und ganz oben wurden daraus
     101 px waagerechter Seitenueberstand.

     ⚠️ Am Schreibtisch, nicht auf dem Handy: bei 1085 px (drei Karten)
     101 px, bei 1265 px (ebenfalls drei) noch 39 px. Bei 885 und 985 px
     stehen nur zwei Karten nebeneinander, dort war nie etwas zu sehen —
     der Fehler sitzt genau dort, wo die Karten am schmalsten sind, und das
     ist NICHT die schmalste Fensterbreite.

     🎯 `minmax(0, var(--mmu-register))` half nicht und ist deshalb wieder
     draussen: Ein Grid gibt der ersten Spalte ihren Platz zuerst, die
     Obergrenze aendert daran nichts. Die zweite Spalte bekam weiterhin
     0,33 px. Gemessen, nicht geschlossen — die Fassung mit minmax stand
     schon im Baum und zeigte in der Probe exakt dieselben Werte.

     🔵 Gestapelt passt ausserdem zur Sache: Auf einem angepinnten Zettel
     steht die Beschriftung ueber der Angabe, nicht in einer Registerspalte
     daneben. Der Handoff v3 nennt fuer die Vereine nur die Felder, kein
     Nebeneinander. */
  grid-template-columns: minmax(0, 1fr);
  min-width: 0;
  gap: var(--raum-1) var(--mmu-luecke);
  margin: var(--raum-3) 0 0;
  max-width: calc(var(--mmu-register) + var(--mmu-luecke) + var(--mmu-spalte));
}
.mmu-vereinsangaben dt {
  font-size: var(--t-klein);
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--mmu-gedimmt);
  line-height: 1.5;
}
.mmu-vereinsangaben dd {
  margin: 0;
  font-size: var(--t-neben);
  color: var(--mmu-text);
  line-height: 1.5;
}
.mmu-vereine .mmu-kanaele,
.mmu-sonstiges .mmu-kanaele {
  grid-column: 1 / -1;
  margin-block: var(--raum-2) 0;
  /* Abschnitt 7 schiebt .mmu-kanaele OHNE h2-Kind per margin-left um
     --mmu-register + --mmu-luecke (11rem) ein — gedacht fuer die
     Register-Spalte-Seiten, wo dem Block sonst die Ueberschrift im Register
     fehlt. Seit dem 11.08.2026 tragen Band- und Ortsseite dort selbst ein
     h2, fuer sie ist die Regel also totes CSS; nur das ueberschriftslose
     span hier in der Vereinsliste loest sie noch aus. Ohne den Reset
     staenden die Kanal-Links 11rem eingerueckt statt an der linken
     Spaltenkante der Liste. */
  margin-left: 0;
}

/* -------------------------------------------------------------------------
   11b. Festivalliste (/festivals/, 22.08.2026)
   -------------------------------------------------------------------------
   Betreiberwunsch: "so aufgebaut wie bei Rockbars" — Name/Ort links, Symbole
   (Anfahrt/Website/Instagram/Facebook) als eigene Gruppe, Termin und
   Countdown rechts als Marke. Vier Kinder je <li>
   (archive-mmu_event.php): <a>Name</a>, .mmu-festivalort, .mmu-ortsymbole,
   .mmu-festivalstatus.

   ⚠️ ANDERS als bei den Rockbars (§9j) mit EXPLIZITEN grid-column/grid-row
   je Kind, nicht ueber Reihenfolge + Auto-Flow. Die Rockbar-Zeile verlaesst
   sich darauf, dass genau vier Kinder in genau dieser Reihenfolge auf ein
   Dreispalten-Raster treffen und "von selbst" umbrechen (§9j-Kommentar
   dokumentiert das ausfuehrlich als Fallstrick). Explizite Zuweisung ist
   hier robuster: Ein spaeter ergaenztes fuenftes Kind (oder ein fehlendes,
   z. B. ohne Kanaele) verschiebt nichts unbeabsichtigt.

   Spaltenmasse uebernommen, nicht neu geschaetzt: 12.5rem fuer die
   Symbolspalte ist exakt das Mass, das §9j fuer "bis zu vier Symbole"
   herleitet (Anfahrt + Website + Instagram + Facebook — genau die vier, die
   ein Festival tragen kann) — dieselbe Rechnung gilt hier unveraendert. */
.mmu-festivals .mmu-liste li {
  grid-template-columns: minmax(0, 1fr) 12.5rem minmax(10rem, 14rem);
  align-items: start;
}
.mmu-festivalname { font-weight: 600; }

/* Das Plakat der laufenden Ausgabe (Betreiberwunsch 22.08.2026).
   -------------------------------------------------------------------------
   ⚠️ Die Spalte kommt NUR mit .mmu-mit-plakaten dazu, also nur wenn
   mindestens ein Festival der Liste ein Blatt traegt (siehe die Begruendung
   in archive-mmu_event.php). Ohne die Klasse bleibt das Raster oben
   unveraendert dreispaltig — kein leerer Streifen vor jeder Zeile.

   6rem ist bewusst klein: "in klein" war die Vorgabe. Ein Hochkantblatt
   baut darin je nach Seitenverhaeltnis rund 10rem Hoehe und macht die Zeile
   damit hoeher als die drei Textzeilen daneben (gemessen 23.08.2026: 183px
   statt 143px). Das ist hingenommen, nicht uebersehen — ein Plakat, das man
   auf 143px zwingt, waere so klein, dass es nichts mehr zeigt. Wer die
   Zeilenhoehe zurueckholen will, deckelt hier die Hoehe und nimmt dafuer
   einen Beschnitt in Kauf; beides zusammen geht nicht. */
.mmu-festivals .mmu-mit-plakaten li {
  grid-template-columns: 6rem minmax(0, 1fr) 12.5rem minmax(10rem, 14rem);
}
/* ⚠️ `li > a` verlangt, dass der Name DIREKTES Kind des <li> bleibt. Am
   24.08.2026 lag er kurzzeitig in einem Wrapper (fuer ein inzwischen wieder
   entferntes „unbestätigt"-Kennzeichen); der Selektor griff nicht mehr, der
   Name landete in der 6rem schmalen Plakatspalte und brach auf drei Zeilen
   um. Wer hier wieder etwas neben den Namen setzt, prueft diese Regel mit. */
.mmu-festivals .mmu-mit-plakaten li > a:not(.mmu-plakat),
.mmu-festivals .mmu-mit-plakaten .mmu-festivalort,
.mmu-festivals .mmu-mit-plakaten .mmu-festivalgenre {
  grid-column: 2;
}
.mmu-festivals .mmu-mit-plakaten .mmu-ortsymbole { grid-column: 3; }
.mmu-festivals .mmu-mit-plakaten .mmu-festivalstatus { grid-column: 4; }
.mmu-festivals .mmu-plakat {
  grid-column: 1;
  grid-row: 1 / span 3;
  align-self: start;
}
/* Kein fester Rahmen und keine Rundung: Das Blatt ist gestaltetes Material
   mit eigenem Rand, und ein zweiter Rahmen darum sieht nach Bilderrahmen
   aus. Nur eine feine Linie, damit ein Plakat mit weissem Rand nicht in der
   Seite verschwimmt. */
.mmu-plakat img {
  display: block;
  width: 100%;
  height: auto;
  border: 1px solid var(--mmu-linie);
}
.mmu-plakat:focus-visible { outline: 2px solid var(--mmu-akzent-text); }

/* Auf der Einzelseite steht das Blatt gross genug, um lesbar zu sein, aber
   begrenzt — ein Plakat in voller Breite draengt die Datenkarte unter den
   Falz. Zum Vergroessern ist der Klick da. */
.mmu-event > .mmu-plakat {
  display: block;
  max-width: 18rem;
  margin-block: var(--raum-2);
}

/* Das Blatt gross, ueber der Seite (assets/plakat.js).
   -------------------------------------------------------------------------
   Das <dialog> ist leer im Markup und bekommt sein Bild erst beim Oeffnen —
   ohne Skript existiert es gar nicht, und der Link fuehrt schlicht auf die
   Bilddatei.

   max-height statt fester Groesse: Ein Hochkantplakat soll ganz zu sehen
   sein, ohne dass man im Overlay scrollen muss. */
.mmu-plakat-gross {
  max-width: min(92vw, 48rem);
  max-height: 92vh;
  padding: 0;
  border: none;
  background: none;
  overflow: visible;
}
.mmu-plakat-gross img {
  display: block;
  width: 100%;
  height: auto;
  max-height: 92vh;
  object-fit: contain;
}
.mmu-plakat-gross::backdrop {
  /* Dunkel und deckend genug, dass das Blatt und nicht die Liste dahinter
     die Aufmerksamkeit traegt. */
  background: rgb(0 0 0 / 0.8);
}

/* Genre-Zeile (Betreiberwunsch 22.08.2026, "wofuer das Festival bekannt
   ist"): eigene Zeile unter dem Namen, vor dem Ort — drei statt zwei Zeilen
   in Spalte 1. Symbole und Status-Block spannen deshalb drei Rasterzeilen,
   sonst blieben sie auf halber Zeilenhoehe stehen, sobald ein Festival ein
   Genre fuehrt. (Die anfangs zusaetzlich geplante Headliner-Zeile wurde
   noch am selben Tag wieder verworfen — Betreiberurteil "funktioniert
   nicht" — deshalb nur noch drei, nicht vier Zeilen.) */
.mmu-festivalort {
  grid-column: 1;
  grid-row: 2;
  color: var(--mmu-gedimmt);
  font-size: var(--t-neben);
}
.mmu-festivalgenre {
  grid-column: 1;
  grid-row: 3;
  color: var(--mmu-gedimmt);
  font-size: var(--t-neben);
}
.mmu-festivals .mmu-ortsymbole {
  grid-column: 2;
  grid-row: 1 / span 3;
  align-self: center;
}
.mmu-festivalstatus {
  grid-column: 3;
  grid-row: 1 / span 3;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--raum-1);
}
.mmu-festivals .mmu-eventtermin {
  font-size: var(--t-neben);
  color: var(--mmu-gedimmt);
}
/* Bezeichnung und Datum auf zwei Zeilen (Betreiberwunsch 22.08.2026: "in der
   naechsten Zeile das Datum") — vorher lief beides in EINEM Textfluss und
   brach nur zufaellig um, je nachdem wie lang der Zeitraum war. Gilt auch
   auf der Einzelseite (single-mmu_event.php), deshalb ohne .mmu-festivals
   -Praefix. */
.mmu-eventtermin {
  display: flex;
  flex-direction: column;
}
.mmu-eventtermin-label { font-weight: 600; }

/* Der Link zur Veranstaltungsseite im Statusblock, unter dem Termin —
   Betreiberbefund 22.08.2026: "die ganzen Links fehlen mir". Ein sichtbarer
   Textlink, nicht ueber mmu_kanal_link()/.mmu-ortsymbole: Er hat kein eigenes
   Symbol (siehe die Begruendung oben bei $kanaele) und braucht deshalb eine
   eigene, lesbare Zeile statt eines unsichtbaren Icon-Feldes.

   🔵 Hiess bis 23.08.2026 .mmu-festivaltickets und fuehrte zum Vorverkauf.
   Betreiberentscheidung: "ich moechte nicht dass der VVK verlinkt wird,
   stattdessen soll auf die Veranstaltungsseite verlinkt werden." */
.mmu-festivalseite {
  font-size: var(--t-neben);
  font-weight: 600;
}


/* Die Countdown-Marke: gleiche Sprache wie .mmu-jetzt bei den Rockbars
   (Rahmen, Rundung, Punkt — Betreiberwunsch dort war "damit der Besucher
   merkt dass hier auch was passiert", dieselbe Absicht passt hier). Kein
   Ampelrot/-gruen: Ein Countdown ist keine Ja/Nein-Aussage, deshalb ein
   einzelner Akzentton statt zweier Zustandsfarben.
   --mmu-akzent-text statt --mmu-akzent: Beide sind fuer HELLEN Grund
   gerechnet (18./19.08.2026), und -text ist die dunklere, kontrastreichere
   Fassung — hier steht die Farbe an einem Punkt UND am Text, nicht nur an
   einer Flaeche. */
.mmu-countdown {
  display: inline-flex;
  align-items: center;
  gap: 0.5em;
  padding: 0.25em 0.7em 0.3em;
  border: 1px solid var(--mmu-linie);
  border-radius: 999px;
  font-size: var(--t-klein);
  letter-spacing: 0.05em;
  text-transform: uppercase;
  font-weight: 600;
  color: var(--mmu-akzent-text);
  border-color: currentColor;
}
.mmu-countdown::before {
  content: "";
  width: 0.5em;
  height: 0.5em;
  flex: none;
  border-radius: 50%;
  background: currentColor;
  box-shadow: 0 0 0.45em currentColor;
}
/* "Läuft gerade" (Betreiberwunsch 22.08.2026): Ausnahme von der Begruendung
   oben — hier IST der Countdown eine Ja/Nein-Aussage ("laeuft das Festival
   heute"), deshalb dieselbe Ampelfarbe wie .mmu-jetzt-offen bei den
   Rockbars, statt des einzelnen Akzenttons. Nur `color` wechselt — Rahmen
   und Punkt haengen ueber currentColor bereits daran. Vom Skript gesetzt
   (assets/countdown.js), nie vom Server, aus demselben Cache-Grund wie bei
   .mmu-jetzt-offen. */
/* ⚠️ Der Wert steht ZWEIMAL — hier und bei .mmu-jetzt-offen (§ Rockbars).
   Beide muessen denselben Ton tragen, sonst heisst "offen" an zwei Orten
   zweierlei. Bei der Rueckkehr auf dunklen Grund am 30.09.2026 wurde diese
   Stelle zunaechst uebersehen; gefunden hat sie die Gegenprobe auf Reste der
   hellen Welt, nicht die Aenderung selbst.

   🔴 Und hier faerbt die Ampel TEXT, nicht nur einen Punkt: Es gilt WCAG
   1.4.3 mit 4,5:1, nicht die 3:1 fuer grafische Elemente. Das alte #2a8442
   stand auf Schwarz bei 4,48:1 und waere als einziger Wert der ganzen
   Umstellung wirklich durchgefallen. #46a862 traegt 7,04:1. */
.mmu-countdown-laeuft {
  color: var(--wp--preset--color--ampel-offen, #46a862);
}

.mmu-festivals .mmu-kanaele {
  margin-block: var(--raum-2) 0;
  /* Reset wie bei der Vereinsliste (§11a): Ohne h2-Kind schoebe §7 die
     Kanal-Links sonst 11rem ein. */
  margin-left: 0;
}

/* -------------------------------------------------------------------------
   12. Filter und Suche
   -------------------------------------------------------------------------
   Zwei Wege nebeneinander, keiner Bedingung des anderen: Wer den Bandnamen
   kennt, tippt ihn; wer stoebert, filtert. Die Trennlinie sagt, dass hier
   ein zweiter Weg beginnt und nicht die zweite Haelfte desselben. */
/* Die Filterleiste: FELDER im Raster, Knopfzeile daneben.
   Gemessen am 14.08.2026, vorher: fuenf Felder mit fuenf verschiedenen
   Breiten (150 · 150 · 202 · 169 · 158 px), weil jedes so breit war wie sein
   Inhalt. Mit auto-fit stehen sie gleich breit und ihre Kanten untereinander. */
/* ⚠️ Zeitungsoptik-Entwurf, 17.08.2026: der "Filterkasten" — Flaeche und
   Rahmen um das GANZE Formular, nicht nur um die einzelnen Felder. Bis
   dahin sass die Filterzeile ohne eigene Flaeche auf dem Seitengrund; der
   Entwurf grenzt sie sichtbar vom Rest der Seite ab, wie er es auch bei
   den Platzhalterkaesten des Aushangs tut. Gilt fuer Bandverzeichnis UND
   Konzertkalender, da beide dieselbe Klasse benutzen. */
.mmu-filter {
  display: flex;
  flex-direction: column;
  gap: var(--raum-4);
  padding: var(--raum-4);
  background: var(--mmu-flaeche);
  border: 1px solid var(--mmu-linie);
  margin: 0 0 var(--raum-5);
}

/* ⚠️ Das Raster umfasst NUR die Felder, nicht die Knopfzeile.
   auto-fit laesst leere Spalten zusammenfallen und verteilt ihren Platz auf
   die gefuellten — aber nur, wenn wirklich keine drin steht. Solange die
   Knopfzeile mit grid-column: 1 / -1 ueber ALLE Spalten spannte, war keine
   leer, keine fiel zusammen, und die Felder behielten ihre Mindestbreite.

   Gemessen am 17.08.2026, als VON und BIS aus dem Kalender fielen:

   | Leiste            | Felder | leer rechts |
   |-------------------|--------|-------------|
   | /konzerte/        |      4 |     389,3px |
   | /konzerte/archiv/ |      6 |           0 |
   | /bands/           |      3 |       584px |

   Die naheliegende Abhilfe waere gewesen, die Mindestbreite zu erhoehen, bis
   genau vier Spalten passen. Sie haette den Kalender gerichtet und das
   Archiv verdorben, das mit sechs Feldern schon voll sass — eine feste Zahl
   passt immer nur zu einer Feldzahl. Seit die Knopfzeile ausserhalb steht,
   fuellt jede Leiste ihre Zeile von selbst. */
.mmu-filter-felder {
  display: grid;
  /* 🔴 `min(10rem, 100%)` statt `10rem`: Bei 211 px verfuegbarer Breite
     ist eine Mindestbreite von 10rem (160 px) zwar erfuellbar, der Inhalt
     der Felder (Auswahlknoepfe mit Beschriftung) braucht aber 229 px und
     sprengt die Spalte. Mit `100%` als Obergrenze der Mindestbreite gibt
     die Spalte nach, statt die Seite zu schieben. */
  /* 🔴 14rem und nicht 10rem: Mit 10rem packte auto-fit bei 211 px zwei
     Spalten zu je 99,5 px — und ein Auswahlfeld, dessen laengste Option
     „Landkreis Muenchen" heisst, ist 229 px breit. Zwei zu enge Spalten
     sind schlechter als eine passende.
     🔴 Und KEIN min(14rem, 100%): Der Prozentwert in minmax bezieht sich
     auf die Spaltengroesse selbst und ist damit zirkulaer. Bei 320 px
     loeste der Browser ihn klein auf und packte wieder zwei zu enge
     Spalten (gemessen 107 px) — also genau das, was die 14rem verhindern
     sollen. Fuer schmale Schirme sorgt die Medienabfrage unter 30rem.
     ⚠️ Dass hier bei weiter Ansicht "551px 551px 0px 0px" steht, ist
     KEIN Fehler: auto-fit legt ueberzaehlige Spuren auf 0 zusammen, und
     das Raster hat zwei Kinder bei Platz fuer vier Spuren. */
  grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr));
  gap: var(--raum-4);
  align-items: end;
}
.mmu-suche {
  display: flex;
  flex-wrap: wrap;
  gap: var(--raum-4);
  align-items: end;
  margin: 0 0 var(--raum-5);
  padding-top: var(--raum-5);
  border-top: 1px solid var(--mmu-linie);
}

/* Die Knopfzeile steht unter den Feldern, aber NICHT mehr im Raster.
   Im Raster waere ein Knopf eine Spalte breit wie ein Auswahlfeld — er ist
   aber kein Feld, sondern das, was mit den Feldern geschieht. Sie zu spannen
   war der naheliegende Weg dahin und hielt die leeren Spalten am Leben
   (siehe oben); daneben zu stehen leistet dasselbe ohne diesen Preis. */
.mmu-filter-knoepfe {
  display: flex;
  flex-wrap: wrap;
  gap: var(--raum-4);
  align-items: center;
  margin: 0;
}

.mmu-filter label,
.mmu-filter .mmu-filterfeld,
.mmu-suchfeld {
  display: flex;
  flex-direction: column;
  gap: var(--raum-1);
}
.mmu-filter label > span,
.mmu-filterbezeichner,
.mmu-suchfeld > span {
  font-size: var(--t-klein);
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--mmu-gedimmt);
}

/* ⚠️ box-sizing und height gehoeren zusammen, und beides muss hier stehen.

   Bis zum 14.08.2026 stand hier nur min-height: 2.25rem — und die Regel
   bedeutete dreimal etwas anderes, weil die Elemente drei Box-Modelle haben:
   <input> ist von Haus aus content-box, <select> und <button> sind
   border-box. Gemessen ergab dieselbe Zeile 54 px beim Datumsfeld (36 px
   Inhalt PLUS 16 px Innenabstand PLUS 2 px Rahmen), 38 px beim Auswahlfeld
   und 40,4 px beim Knopf. Genau derselbe Fehler wie beim Flyerbild in §9c.

   Eine feste Hoehe statt min-height, weil "mindestens" bei drei verschiedenen
   Eigenhoehen wieder drei Ergebnisse liefert. 2,5 rem, weil der Knopf mit
   seiner Zeilenhoehe von selbst auf 40,4 px kam — die Leiste richtet sich
   nach ihrem groessten Element, nicht umgekehrt. */
.mmu-filter select,
.mmu-filter input,
.mmu-suche input {
  font: inherit;
  /* 📏 44 px wie jede Bedienflaeche dieser Seite und wie im Entwurf;
     gemessen waren 40. Der Statusschieber daneben ist 44 hoch -- in einer
     Zeile mit `align-items: end` standen sie dadurch auf Stoss, aber
     unterschiedlich hoch. */
  min-height: 44px;
  font-size: var(--t-neben);
  color: var(--mmu-text);
  background: var(--mmu-flaeche);
  border: 1px solid var(--mmu-kante);
  border-radius: 0;
  padding: var(--raum-2) var(--raum-3);
  box-sizing: border-box;
  height: 2.5rem;
  /* Ein Auswahlfeld ist so breit wie sein laengster Eintrag, wenn man es
     laesst — die Rasterspalte gaebe es dann auf. Venue traegt Namen wie
     "Backstage Werk", die Spalte bliebe darunter. */
  min-width: 0;
}
.mmu-suche input { min-width: 16rem; }
/* Der Kalender, den der Browser zu einem Datumsfeld aufklappt, ist ein
   Bedienelement des Systems — Stylesheets erreichen ihn nicht, nur
   `color-scheme` schaltet ihn um. Bis zum 18.08.2026 stand hier `dark`,
   damit er zur dunklen Seite passte. Mit der Umkehrung auf hellen Grund
   waere er als einziges Element dunkel geblieben.

   Berichtigt am 19.08.2026. Die Zeile war beim Umstellen uebersehen worden,
   weil die Suche nach `color-scheme` nur ueber das Theme lief und nicht
   ueber dieses Stylesheet. */
.mmu-filter input[type="date"] { color-scheme: light; }

/* -------------------------------------------------------------------------
   Genre-Mehrfachauswahl (14.08.2026)
   -------------------------------------------------------------------------
   Zwoelf Oberbegriffe passen in kein Feld der Rasterzeile. Die Liste legt
   sich deshalb UEBER die Leiste (position: absolute), statt sie
   aufzublaehen — die Zeile behaelt ihre Hoehe, und die Konzertliste
   darunter rutscht beim Aufklappen nicht weg.

   Die Zusammenfassung sieht aus wie ein Auswahlfeld und muss dieselben zwei
   Eigenschaften tragen wie <select> oben: box-sizing UND height. Ohne beide
   steht sie neben den anderen Feldern um Millimeter versetzt — derselbe
   Fehler, der die Leiste am 14.08. dreimal verschieden hoch gemacht hat. */
.mmu-genrewahl { position: relative; }

.mmu-genrewahl > summary {
  font-size: var(--t-neben);
  color: var(--mmu-text);
  background: var(--mmu-flaeche);
  border: 1px solid var(--mmu-kante);
  padding: var(--raum-2) var(--raum-3);
  box-sizing: border-box;
  /* min-height statt height — Begruendung bei .mmu-kalenderwahl-leiste button. */
  min-height: 2.5rem;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--raum-2);
  cursor: var(--mmu-zeiger-klick);
  cursor: var(--mmu-zeiger-klick-hidpi);
  overflow: hidden;
  white-space: nowrap;
  min-width: 0;
}
/* display: flex nimmt dem <summary> in einigen Browsern das Dreieck, in
   anderen bleibt zusaetzlich das eigene Zeichen stehen. Beide Marker
   abschalten und einen eigenen zeichnen — CSS-Rahmen statt Grafik, damit
   nichts nachgeladen wird. */
.mmu-genrewahl > summary { list-style: none; }
.mmu-genrewahl > summary::-webkit-details-marker { display: none; }
.mmu-genrewahl > summary::after {
  content: "";
  flex: none;
  border: 0.3em solid transparent;
  border-top-color: currentColor;
  margin-top: 0.3em;
}
.mmu-genrewahl[open] > summary::after {
  border-top-color: transparent;
  border-bottom-color: currentColor;
  margin-top: -0.3em;
}

/* ⚠️ NUR die Reihe IM Aufklappkasten, nicht jede Stempelreihe. Der Kasten
   legt sich ueber die Filterleiste, damit sie ihre Hoehe behaelt — das
   Bandverzeichnis zeigt seine Stempel dagegen offen (Handoff v3), und dort
   waere `position: absolute` ein Kasten, der ueber der Bandliste schwebt.
   Beim Zusammenlegen der Stempel-Selektoren am 30.09.2026 hatte diese Regel
   die gemeinsame Klasse zunaechst mitbekommen. */
.mmu-genrewahl > .mmu-stempelreihe {
  position: absolute;
  z-index: 2;
  left: 0;
  margin: 0;
  padding: var(--raum-3);
  border: 1px solid var(--mmu-kante);
  border-top: 0;
  background: var(--mmu-flaeche);
  display: grid;
  /* Zwei Spalten, sobald der Platz reicht: Zwoelf Eintraege untereinander
     ergaben einen Kasten ueber die halbe Seite. Der Kasten darf breiter sein
     als seine Rasterzelle (min-width) — die Zelle ist rund 10 rem, ein
     lesbarer Genrename braucht mehr. */
  grid-template-columns: repeat(auto-fill, minmax(9rem, 1fr));
  gap: var(--raum-1) var(--raum-4);
  min-width: max(100%, 20rem);
  max-width: 90vw;
  max-height: 60vh;
  overflow-y: auto;
}
/* Der Absendeknopf im Kasten steht ueber die ganze Breite unter den
   Kaestchen — dort, wo man nach dem Ankreuzen hinsieht. */
.mmu-genrewahl-filtern {
  grid-column: 1 / -1;
  justify-self: start;
  margin-top: var(--raum-2);
}

/* -------------------------------------------------------------------------
   Die Genre-Stempel (Handoff v2, Interaktion 4)
   -------------------------------------------------------------------------
   „Mehrfachauswahl-Chips, inaktiv gestrichelter Rand, aktiv 2.5px
   Akzentrahmen + leicht gedreht."

   🔴 ES BLEIBEN ECHTE CHECKBOXEN. Das ist die ganze Bauart: Die Auswahl
   laeuft weiter ueber <input type="checkbox" name="genre[]"> in einem
   <fieldset> mit <legend>, abgesendet wird mit dem Knopf daneben. Ohne
   JavaScript funktioniert der Filter unveraendert — es aendert sich nur,
   wie die Kaestchen AUSSEHEN.

   Ein nachgebautes Chip aus <div> und Klick-Zuhoerer haette dasselbe Bild
   ergeben und drei Dinge verloren: die Tastaturbedienung, die Ansage als
   EINE Frage durch Vorlesehilfen, und den Filter ohne Skript. Nichts davon
   ist im Entwurf gezeichnet, weil man es auf einem Bild nicht sieht.

   ⚠️ Deshalb auch KEIN aria-pressed, obwohl der Handoff es nennt: Eine
   Checkbox sagt ihren Zustand ueber ihr checked-Merkmal, und aria-pressed
   daneben waere eine zweite, widersprechende Auskunft. Der Handoff
   beschreibt einen Chip aus button; wir haben etwas Besseres. */

/* Aus zwei Spalten wird ein Fluss: Stempel sind verschieden breit, ein
   Raster zwaenge „Rock" und „Doom/Stoner" in dieselbe Spaltenbreite. */
.mmu-stempelreihe {
  display: flex;
  flex-wrap: wrap;
  gap: var(--raum-2);
}

/* 📏 KEINE Breitenbegrenzung mehr. Bis zum 01.10.2026 stand hier
   `max-width: min(34rem, 92vw)` -- 544 px in einem Filterkasten, der bei
   1436 px Fensterbreite 1152 px breit ist. Die fuenfzehn Stempel brachen
   dadurch auf FUENF Reihen um; der Entwurf zeigt drei, und der Kasten war
   464 statt rund 300 px hoch.

   ⚠️ Die Begrenzung war nicht falsch gedacht: Eine Stempelreihe ueber die
   volle Breite eines sehr breiten Fensters laeuft auseinander. Nur steht
   sie hier in einem Kasten, der seine Breite ohnehin vom Inhaltsbereich
   nimmt -- die Begrenzung begrenzte also gegen etwas, das schon begrenzt war.

   🔵 Der Aufklappkasten des Konzertkalenders behaelt seine eigene:
   `.mmu-genrewahl > .mmu-stempelreihe` ist (0,2,0) und setzt max-width
   90vw. Dort schwebt der Kasten ueber der Leiste und braucht sie. */

.mmu-stempel {
  display: inline-flex;
  align-items: center;
  /* 44px Trefferflaeche, wie jede Bedienflaeche dieser Seite.
     ⚠️ Mit border-box, sonst legt sich der 1.5px-Rahmen oben drauf: gemessen
     46 px am 01.10.2026. Dieselbe Falle wie beim Statusschieber -- die 44
     sind die Flaeche, die der Finger trifft, und die misst man von aussen. */
  min-height: 44px;
  box-sizing: border-box;
  padding: 0 var(--raum-3);
  cursor: var(--mmu-zeiger-klick);
  cursor: var(--mmu-zeiger-klick-hidpi);
  user-select: none;
  font-size: var(--t-neben);
  color: var(--mmu-gedimmt);
  /* Inaktiv gestrichelt: ein Stempel, der noch nicht gesetzt ist. */
  border: 1.5px dashed var(--mmu-kante);
  background: none;
  transition: color 160ms ease, border-color 160ms ease,
              rotate 220ms var(--mmu-feder), scale 180ms var(--mmu-feder);
}

/* 🔴 Die Checkbox wird versteckt, aber NICHT display:none — damit bliebe sie
   fuer die Tastatur unerreichbar und der Fokus spraenge ueber den ganzen
   Kasten hinweg. Sie behaelt ihre Flaeche von einem Pixel und liegt unter
   dem Stempel. */
.mmu-stempel input[type="checkbox"] {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: 0;
  opacity: 0;
  pointer-events: none;
}

/* Der gesetzte Stempel: voller Rahmen, Akzentfarbe, leicht schief.
   :has() traegt hier die ganze Umschaltung — ohne eine Zeile JavaScript. */
.mmu-stempel:has(input:checked) {
  color: var(--mmu-akzent-text);
  border: 2.5px solid var(--mmu-akzent);
  border-style: solid;
}

/* Die Neigung ist FEST je Platz, nicht zufaellig: Ein Stempel, der bei jedem
   Seitenaufbau anders steht, sieht nach Zittern aus statt nach Handarbeit.
   Drei Winkel reichen, das Auge erkennt die Wiederholung bei zwoelf
   Eintraegen nicht. */
.mmu-stempel:has(input:checked):nth-of-type(3n+1) { rotate: -2.5deg; }
.mmu-stempel:has(input:checked):nth-of-type(3n+2) { rotate: 1.5deg; }
.mmu-stempel:has(input:checked):nth-of-type(3n)   { rotate: 3deg; }

/* 🔴 Der Fokusrahmen gehoert an den STEMPEL, nicht an die versteckte
   Checkbox — sonst bedient man mit der Tastatur etwas Unsichtbares. */
.mmu-stempel:has(input:focus-visible) {
  outline: 2px solid var(--mmu-akzent-text);
  outline-offset: 3px;
}
.mmu-stempel:hover { color: var(--mmu-text); border-color: var(--mmu-text); }

/* Der Stempelschlag. Die Klasse setzt pinnwand-artig ein kleines Skript
   (assets/genre-stempel.js) und nimmt sie nach der Bewegung wieder weg —
   eine CSS-Animation an :checked liefe sonst beim LADEN fuer jeden bereits
   gewaehlten Stempel los, und zwoelf gleichzeitig zuckende Chips waeren
   kein Effekt, sondern ein Fehler. */
@keyframes mmu-stempelschlag {
  0%   { scale: 1;    rotate: var(--mmu-stempel-ruhe, 0deg); }
  45%  { scale: 1.35; rotate: -12deg; }
  100% { scale: 1;    rotate: var(--mmu-stempel-ruhe, 0deg); }
}
.mmu-stempel.mmu-stempel-schlag {
  animation: mmu-stempelschlag 180ms var(--mmu-feder);
}

@media (prefers-reduced-motion: reduce) {
  .mmu-stempel { transition: none; rotate: 0deg !important; }
  .mmu-stempel.mmu-stempel-schlag { animation: none; }
}

/* -------------------------------------------------------------------------
   Die Filterleiste des Bandverzeichnisses (Handoff v3)
   -------------------------------------------------------------------------
   Drei Felder, drei Bedienformen: Genre als offene Stempelreihe mit
   Mehrfachauswahl, Status als Schieber, Landkreis als Auswahlliste.

   🔴 Die Stempel teilen ihre Optik mit dem Konzertkalender (.mmu-stempel,
   oben). Der Unterschied ist die HUELLE: Dort liegen sie in einem <details>,
   das sich ueber die Leiste legt; hier stehen sie offen. Deshalb traegt nur
   die Kalenderfassung `position: absolute` — siehe die Regel dort. */

/* ⚠️ `flex-direction: row` MUSS hier stehen, und zwar aus demselben Grund wie
   bei `.mmu-genrewahl label` weiter oben: `.mmu-filter label` setzt column,
   weil bei den uebrigen Filterfeldern die Beschriftung ueber dem Feld steht.
   Meine Stempel liegen ebenfalls in form.mmu-filter — ohne diese Zeile
   stuende die (unsichtbare) Checkbox ueber dem Genrenamen und die Zahl
   darunter, fuenfzehnmal untereinander. `display: inline-flex` an
   `.mmu-stempel` setzt die Richtung NICHT zurueck; sie ist eine eigene
   Eigenschaft. Am 14.08.2026 im Kalender aufgefallen, hier vorweggenommen.

   🔴 UND DIE ABWEHR REICHTE NICHT, bis zum 01.10.2026: Die Beobachtung
   oben stimmt, aber `.mmu-filter label` ist (0,1,1) und `.mmu-stempel`
   nur (0,1,0). Spezifitaet schlaegt Position -- column gewann trotz der
   spaeteren Zeile, und mit ihr `gap: var(--raum-1)`. Live stand der
   Genrename ueber seiner Zahl, fuenfzehnmal.

   🎯 Ein Stempel IST ein <label>. `label.mmu-stempel` ist damit auch
   (0,1,1) und steht spaeter -- bei gleicher Spezifitaet entscheidet die
   Position. Kein !important, kein kuenstlich verdoppelter Selektor. */
label.mmu-stempel {
  flex-direction: row;
  /* 0.45rem im Entwurf; --raum-2 sind 0.5rem. Die 0.8 px Unterschied sind
     ein Token wert -- eine krumme Sonderzahl waere hier die groessere
     Abweichung vom Haus. */
  gap: var(--raum-2);
  /* Handoff v3: Schreibmaschinenschrift, gesperrt, Versalien — ein Stempel
     traegt Schrift, die gestempelt aussieht, keine Fliesstextschrift. */
  font-family: var(--schrift-mono);
  /* 📏 0.75rem nach dem Entwurf; --t-klein waeren 0.8125rem. Ein Stempel
     traegt eine kleine Schrift -- er ist eine Marke, keine Ueberschrift. */
  font-size: var(--t-mikro);
  letter-spacing: 0.05em;
  text-transform: uppercase;
}

/* Die Bandzahl im Stempel. Gedimmt, damit sie den Namen nicht ueberstimmt —
   sie ist die Nebenauskunft, nicht der Filterwert. */
.mmu-stempel-zahl {
  font-variant-numeric: tabular-nums;
  opacity: 0.7;
}
/* Im gesetzten Stempel erbt die Zahl die Akzentfarbe und braucht ihre
   Daempfung nicht mehr — sonst sieht der gesetzte Stempel blasser aus als
   der ungesetzte. */
.mmu-stempel:has(input:checked) .mmu-stempel-zahl { opacity: 1; }

/* Das offene Stempelfeld. Ein <fieldset> ohne Rahmen: Die Gruppe ist fuer
   Vorlesehilfen da, nicht fuers Auge. */
.mmu-stempelfeld {
  margin: 0;
  padding: 0;
  border: 0;
}

/* Status und Landkreis nebeneinander, darunter umbrechend. Der Status
   bekommt mehr Platz — er traegt fuenf Beschriftungen, der Landkreis eine. */
.mmu-filter-zeile {
  display: flex;
  flex-wrap: wrap;
  gap: var(--raum-4);
  align-items: end;
}
.mmu-statusschieber { flex: 2 1 22rem; margin: 0; padding: 0; border: 0; }
.mmu-filter-zeile .mmu-filterfeld { flex: 1 1 12rem; }
/* 🔵 Das Suchfeld ist das dritte Feld der Zeile (Handoff v3, „Bands").
   14rem und nicht 12rem wie der Landkreis: Der Entwurf gibt ihm
   flex: 1 1 14rem, und es traegt den laengsten Platzhalter. */
.mmu-filter-zeile .mmu-suchfeld { flex: 1 1 14rem; }

/* 🔴 Beide spannen die GANZE Breite des Filterrasters.
   Ohne das legt `auto-fit` sie bei weiter Ansicht nebeneinander in zwei
   Spalten zu je 551 px, und die Zeile bricht in ihrer halben Spalte um:
   Status und Landkreis standen uebereinander (gemessen y=660 und y=742).
   Der Entwurf hat hier einen EINSPALTIGEN Kasten mit einer flex-Zeile
   darin — Stempel oben ueber die volle Breite, die Felder darunter.
   ⚠️ Darum steht die Regel an den KINDERN und nicht am Container: Auf
   /konzerte/ traegt derselbe Container vier einzelne Felder, die dort
   vierspaltig nebeneinander gehoeren (gemessen 267.5px x4). Ein
   `grid-template-columns: 1fr` am Container haette die gestapelt.
   Diese beiden Klassen gibt es nur auf /bands/ — auf /konzerte/ gemessen,
   dass die Regel dort Spalten und Lagen unveraendert laesst. */
/* 🔴 Die zwei Schalter (Handoff v3, „Konzerte"). Masse aus dem Entwurf
   (v3.dc.html Zeile 362): Leiste 52x28, Knopf 20x20 auf 3px Abstand,
   Papierfarbe, Uebergang 260ms cubic-bezier(.3,1.6,.5,1).
   ⚠️ Es sind LINKS, keine Schaltknoepfe — ohne JavaScript bedienbar,
   siehe die Begruendung in archive-mmu_gig.php. Darum auch :any-link:
   `main[class^="mmu-"] a` hat (0,1,2) und schlueg eine reine
   Klassenregel. Dieselbe Falle ist in diesem Blatt schon dreimal
   zugeschlagen. */
.mmu-filter-schalter {
  grid-column: 1 / -1;
  display: flex;
  flex-wrap: wrap;
  gap: 0.75rem 2rem;
}
a.mmu-schalter:any-link {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  min-height: 44px;
  color: var(--mmu-text);
  font-size: 0.875rem;
  text-decoration: none;
}
.mmu-schalter-leiste {
  position: relative;
  flex: none;
  width: 52px;
  height: 28px;
  border: 1px solid var(--mmu-kante);
  background: transparent;
  transition: background 200ms;
}
.mmu-schalter-knopf {
  position: absolute;
  top: 3px;
  left: 3px;
  width: 20px;
  height: 20px;
  background: var(--mmu-papier);
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.5);
  transition: left 260ms cubic-bezier(0.3, 1.6, 0.5, 1);
}
/* 50px Innenbreite minus 20px Knopf minus 3px Abstand = 27px. */
.mmu-schalter-an .mmu-schalter-leiste { background: var(--mmu-akzent); }
.mmu-schalter-an .mmu-schalter-knopf { left: 27px; }
/* ⚠️ Ohne Bewegung springt der Knopf, statt zu gleiten. Die Auskunft
   steckt in der Stellung, nicht im Weg dorthin. */
@media (prefers-reduced-motion: reduce) {
  .mmu-schalter-leiste,
  .mmu-schalter-knopf { transition: none; }
}

.mmu-stempelfeld,
.mmu-filter-zeile { grid-column: 1 / -1; }



/* -------------------------------------------------------------------------
   Aufklappbare Bandzeilen (Handoff v2 Interaktion 7, v3 „Bands")
   -------------------------------------------------------------------------
   „Zeile ist Button (aria-expanded), klappt auf; offene Zeile hebt sich ab.
   Nur eine Zeile gleichzeitig offen."

   🔴 Beides kann HTML selbst: <details> setzt aria-expanded, und ein
   gemeinsames `name` macht daraus ein Akkordeon. Kein Skript, kein
   nachgebauter Knopf. Wo `name` fehlt (vor 2024), bleiben mehrere Zeilen
   offen — der harmloseste denkbare Rueckfall. */

/* Das <li> wird zur blossen Huelle: Das Raster wandert ans <summary>, weil
   das <details> dazwischensteht. Die Trennlinie bleibt am <li> — sie trennt
   Zeilen, nicht Zusammenklappbares. */
.mmu-archiv .mmu-liste li:has(> details) {
  display: block;
  padding: 0;
}

.mmu-archiv .mmu-liste summary {
  display: grid;
  grid-template-columns: var(--mmu-bandspalten);
  gap: var(--mmu-luecke);
  padding: var(--raum-3) 0;
  align-items: baseline;
  cursor: var(--mmu-zeiger-klick);
  cursor: var(--mmu-zeiger-klick-hidpi);
  /* Den Vorgabe-Pfeil weg: Die Zeile ist fuenfspaltig, ein Dreieck davor
     verschoebe alle Spalten gegen die Kopfzeile. Dass sie aufklappt, zeigt
     der Zeiger und das Aufklappen selbst. */
  list-style: none;
}
.mmu-archiv .mmu-liste summary::-webkit-details-marker { display: none; }

/* 🔴 Der Fokusrahmen gehoert an die ZEILE. Ohne diese Regel bekaeme das
   summary den Vorgaberahmen des Browsers um seinen ganzen Kasten — bei einem
   Raster ueber die volle Breite sieht das aus wie eine Auswahl, nicht wie
   ein Fokus. */
.mmu-archiv .mmu-liste summary:focus-visible {
  outline: 2px solid var(--mmu-akzent-text);
  outline-offset: -2px;
}
.mmu-archiv .mmu-liste summary:hover { background: var(--mmu-flaeche); }

/* Die offene Zeile hebt sich ab (Handoff: „Flaeche #0f0f15, Schatten"). */
.mmu-archiv .mmu-liste details[open] {
  background: var(--mmu-flaeche);
  box-shadow: 0 6px 18px rgb(0 0 0 / 0.45);
}

.mmu-bandzeile-mehr {
  padding: 0 var(--raum-3) var(--raum-4);
  font-size: var(--t-neben);
}
.mmu-bandzeile-mehr dl { margin: 0; }
/* Beschriftung links, Wert rechts — dieselbe Form wie die Rueckseite der
   Anschlaege auf der Pinnwand. */
.mmu-bandzeile-mehr dl > div {
  display: grid;
  grid-template-columns: 8rem minmax(0, 1fr);
  gap: var(--raum-3);
  padding: var(--raum-1) 0;
  border-bottom: 1px solid var(--mmu-linie);
}
.mmu-bandzeile-mehr dt { color: var(--mmu-gedimmt); }
.mmu-bandzeile-mehr dd { margin: 0; }

.mmu-bandzeile-termine { list-style: none; margin: 0; padding: 0; }
.mmu-bandzeile-termine li + li { margin-top: var(--raum-1); }
.mmu-bandzeile-termine a {
  display: flex;
  flex-wrap: wrap;
  gap: var(--raum-2);
  color: inherit;
}
.mmu-bandzeile-termine time {
  font-family: var(--schrift-mono);
  color: var(--mmu-akzent-text);
  white-space: nowrap;
}
/* ⚠️ „keine kommenden Termine" ist eine Auskunft, kein Fehlen. Die meisten
   dieser Bands haben eine lange Livehistorie — sie steht auf der Bandseite. */
.mmu-bandzeile-mehr .mmu-leer { color: var(--mmu-gedimmt); font-style: italic; }

.mmu-bandzeile-link { margin: var(--raum-3) 0 0; }
.mmu-bandzeile-link a { color: var(--mmu-akzent-text); }
.mmu-bandzeile-link a::after { content: " →"; }

@media (prefers-reduced-motion: reduce) {
  .mmu-archiv .mmu-liste summary { transition: none; }
}

/* -------------------------------------------------------------------------
   Die Seitennummerierung (Handoff v3)
   -------------------------------------------------------------------------
   „1 2 … 4 Nächste als 44-px-Kästchen, aktuelle Seite auf Papier."

   Bei 376 Bands und 100 je Seite sind das vier Seiten. Das Markup kommt von
   the_posts_pagination(); gestaltet wird, was WordPress liefert. */
.mmu-archiv .navigation.pagination {
  margin: var(--raum-5) 0;
}
/* Die Ueberschrift „Beiträge-Navigation" ist fuer Vorlesehilfen da und steht
   im Entwurf nicht — sie bleibt, nur unsichtbar. */
.mmu-archiv .pagination .screen-reader-text {
  position: absolute;
  width: 1px;
  height: 1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
}
.mmu-archiv .pagination .nav-links {
  display: flex;
  flex-wrap: wrap;
  gap: var(--raum-2);
  align-items: center;
}
.mmu-archiv .pagination .page-numbers {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  /* 44px, wie jede Bedienflaeche dieser Seite. */
  min-width: 44px;
  min-height: 44px;
  padding: 0 var(--raum-2);
  border: 1px solid var(--mmu-kante);
  color: var(--mmu-gedimmt);
  text-decoration: none;
  font-variant-numeric: tabular-nums;
  transition: color 160ms ease, border-color 160ms ease;
}
.mmu-archiv .pagination a.page-numbers:hover {
  color: var(--mmu-text);
  border-color: var(--mmu-text);
}
/* 🔴 Die aktuelle Seite und die Auslassung stehen NICHT mehr hier.
   Bis zum 01.10.2026 standen sie an dieser Stelle, an `.mmu-archiv`
   gebunden — und damit nicht im Kalender, der kein Archiv ist. Gemessen:
   /bands/ Papier, /konzerte/ transparent.
   Dazu kam ein zweiter Fehler: Eine gleich spezifische Regel weiter unten
   (.navigation.pagination …) setzte dieselbe Zahl noch einmal und gewann
   bei Gleichstand, weil sie spaeter steht. Der Hintergrund kam durch, die
   Schriftfarbe nicht — Akzentrot auf Papier, Kontrast 3,00:1 statt der
   14,62:1, die hier ausgerechnet standen.
   Beides ist zu EINER Regel zusammengelegt; sie steht beim uebrigen
   Nummerierungsblock. Suchbegriff: .page-numbers.current */

/* Der Querverweis vom Bandarchiv zu den Konzerten derselben Stilrichtung
   (Genre-Auftrag Schritt 6, Website-&-SEO-Sitzung). Er steht ueber der
   Trefferzahl und fuehrt aus dem Verzeichnis in den Kalender.

   ⚠️ Kein Knopf: Es ist ein Angebot, keine Handlung an der Liste darunter.
   Ein Knopf neben einer Trefferzahl laese sich als "Filter anwenden" lesen. */
.mmu-querverweis {
  margin: 0 0 var(--raum-3);
  font-family: var(--schrift-prosa);
  font-size: var(--t-neben);
}
.mmu-querverweis a {
  color: var(--mmu-akzent-text);
  text-decoration-thickness: 1px;
  text-underline-offset: 3px;
}
/* Der Pfeil gehoert zum Link und nicht in die Vorlage: So steht er auch
   dann richtig, wenn der Linktext aus einer anderen Quelle kommt. */
.mmu-querverweis a::after { content: " →"; }

/* -------------------------------------------------------------------------
   Der Status-Schieber (Handoff v3, Interaktion 5)
   -------------------------------------------------------------------------
   „4-teiliger Schieber, Papier-Knopf gleitet mit Feder, role=radiogroup."
   Hier fuenfteilig: alle / aktiv / inaktiv / pausiert / aufgeloest.

   🔴 ES BLEIBEN ECHTE RADIOS, wie bei den Stempeln echte Checkboxen bleiben.
   Der Entwurf zeigt <button role="radio"> — das braeuchte JavaScript, um zu
   filtern. Radios in einem Formular tun es ohne. Die Gruppe ist ein
   <fieldset> mit <legend>; ein eigenes role="radiogroup" waere daneben eine
   zweite, schwaechere Auskunft ueber dasselbe.

   ⚠️ KEIN aria-checked: Ein Radio sagt seinen Zustand selbst. */
.mmu-schieber {
  position: relative;
  display: grid;
  /* 🔴 `minmax(0, 1fr)` UND NICHT `1fr`. Ein `1fr` schrumpft nie unter die
     Inhaltsbreite seiner Spalte — die Beschriftung „aufgeloest" braucht
     79 px, fuenf Stufen also 284, und bei 320 px Fensterbreite schob der
     Schieber die ganze Seite um 130 px nach rechts.
     ⚠️ Das ist dieselbe Falle wie bei den Flex-Elementen: Die Vorgabe ist
     „so breit wie noetig", nicht „so breit wie moeglich". `minmax(0, 1fr)`
     erlaubt der Spalte, kleiner zu werden; die Schrift bricht dann um,
     statt die Seite zu sprengen. */
  grid-template-columns: repeat(5, minmax(0, 1fr));
  height: 44px;
  /* ⚠️ Ohne border-box kommt der Rahmen OBEN DRAUF: gemessen 46 px statt
     44. Die 44 sind die Trefferflaeche, und die misst man von aussen. */
  box-sizing: border-box;
  border: 1px solid var(--mmu-kante);
  background: var(--mmu-grund);
}

/* Der gleitende Papierknopf. Er liegt UNTER den Beschriftungen (z-index 0
   gegen 1), damit die Schrift darauf lesbar bleibt. */
.mmu-schieber-knopf {
  position: absolute;
  top: 3px;
  bottom: 3px;
  left: 0;
  width: calc(20% - 6px);
  margin-left: 3px;
  background: var(--mmu-papier);
  box-shadow: 0 2px 6px rgb(0 0 0 / 0.6);
  transition: left 320ms var(--mmu-feder);
}

/* 🔴 Die Position kommt aus dem GEWAEHLTEN Radio, ohne eine Zeile
   JavaScript. `:has()` liest den Zustand eines Nachfahren und faerbt den
   Vorfahren — genau der Fall, fuer den es gemacht ist.
   `label:nth-of-type(n)` zaehlt nur die <label>, nicht den <span> davor:
   nth-of-type zaehlt je Elementtyp. */
.mmu-schieber:has(label:nth-of-type(1) input:checked) .mmu-schieber-knopf { left: 0%; }
.mmu-schieber:has(label:nth-of-type(2) input:checked) .mmu-schieber-knopf { left: 20%; }
.mmu-schieber:has(label:nth-of-type(3) input:checked) .mmu-schieber-knopf { left: 40%; }
.mmu-schieber:has(label:nth-of-type(4) input:checked) .mmu-schieber-knopf { left: 60%; }
.mmu-schieber:has(label:nth-of-type(5) input:checked) .mmu-schieber-knopf { left: 80%; }

.mmu-schieber-stufe {
  position: relative;
  z-index: 1;
  display: flex;
  /* Auch hier gegen `.mmu-filter label { flex-direction: column }`. */
  flex-direction: row;
  align-items: center;
  justify-content: center;
  cursor: var(--mmu-zeiger-klick);
  cursor: var(--mmu-zeiger-klick-hidpi);
  user-select: none;
  font-size: var(--t-neben);
  font-weight: 600;
  color: var(--mmu-gedimmt);
  transition: color 200ms ease;
}
.mmu-schieber-stufe:hover { color: var(--mmu-text); }

/* Dasselbe Muster wie beim Stempel: Das Radio bleibt bedienbar, nur
   unsichtbar. display:none naehme es der Tastatur. */
.mmu-schieber-stufe input[type="radio"] {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: 0;
  opacity: 0;
  pointer-events: none;
}

/* Die gewaehlte Stufe steht auf Papier und braucht Papierschrift.
   📏 Gemessen: --mmu-papier-text auf --mmu-papier ergibt 14,62:1 (AAA). */
.mmu-schieber-stufe:has(input:checked) { color: var(--mmu-papier-text); }

/* 🔴 Der Fokusrahmen gehoert an die STUFE, nicht an das versteckte Radio. */
.mmu-schieber-stufe:has(input:focus-visible) {
  outline: 2px solid var(--mmu-akzent-text);
  outline-offset: -3px;
}

/* ⚠️ RUECKFALL OHNE :has(). Dann gleitet der Knopf nicht — er bliebe auf
   „alle" stehen, waehrend eine andere Stufe gewaehlt ist, und zeigte damit
   etwas Falsches. Lieber gar kein Knopf: Die gewaehlte Stufe traegt dann
   den Papiergrund selbst. Getragen wird die Auskunft ohnehin vom Radio. */
@supports not selector(:has(*)) {
  .mmu-schieber-knopf { display: none; }
  /* Die gewaehlte Stufe ueber den Nachbarschafts-Selektor: 
     kommt ohne :has() aus, weil das Radio unmittelbar vor der Beschriftung
     steht. Kein Papier, aber die Auskunft bleibt sichtbar. */
  .mmu-schieber-stufe input:checked + span { color: var(--mmu-text); text-decoration: underline; text-underline-offset: 4px; }
  .mmu-schieber-stufe:focus-within { outline: 2px solid var(--mmu-akzent-text); outline-offset: -3px; }
}

@media (prefers-reduced-motion: reduce) {
  .mmu-schieber-knopf { transition: none; }
  .mmu-schieber-stufe { transition: none; }
}

/* ⚠️ Der Absendeknopf stand im Raster ueber alle Spalten. Im Fluss braucht
   er eine eigene Zeile, sonst reiht er sich zwischen die Stempel. */
.mmu-genrewahl-filtern {
  flex: 1 0 100%;
}
/* ⚠️ flex-direction MUSS hier stehen. `.mmu-filter label` weiter oben setzt
   column — fuer die Filterfelder richtig, wo die Beschriftung ueber dem Feld
   steht. Beide Regeln haben dieselbe Spezifitaet (0-1-1), meine steht spaeter
   und gewinnt also; nur setzt `display: flex` die Richtung NICHT zurueck. Sie
   ist eine eigene Eigenschaft und blieb auf column: Das Kaestchen stand ueber
   dem Genrenamen statt daneben, zwoelfmal untereinander. Am 14.08.2026 im
   Browser aufgefallen, nicht im Quelltext. */
.mmu-genrewahl label {
  display: flex;
  flex-direction: row;
  align-items: center;
  gap: var(--raum-2);
  font-size: var(--t-neben);
  cursor: var(--mmu-zeiger-klick);
  cursor: var(--mmu-zeiger-klick-hidpi);
  /* Trefferflaeche: Ein Kaestchen allein ist rund 13 px hoch und damit
     unter jeder Empfehlung. Die Hoehe kommt aus dem Innenabstand, NICHT aus
     line-height — das vergroessert nur den Zeilenkasten, nicht das Ziel. */
  padding-block: var(--raum-1);
  min-height: 1.75rem;
}
.mmu-genrewahl input[type="checkbox"] {
  /* accent-color faerbt das Kaestchen ohne eigene Grafik. */
  accent-color: var(--mmu-akzent);
  width: 1rem;
  height: 1rem;
  flex: none;
}

/* ⚠️ Zeitungsoptik-Entwurf, 17.08.2026: dieselben umrissenen Primaer-/
   Sekundaer-Knoepfe wie bei Filtern/Suchen (§12). Der Fuss traegt genau die
   zwei Knoepfe des Entwurfs — "Angekreuzte als .ics" (primaer) und "Alle X
   als .ics" (sekundaer) —, nur mit anderer Beschriftung
   ("Auswahl als Kalenderdatei" / "Alle N exportieren").
   Unterschieden ueber [name="mmu_alle"], das archive-mmu_gig.php dem
   zweiten Knopf ohnehin schon mitgibt (fuer den Server, der die
   Exportart erkennt) — keine zusaetzliche Klasse noetig. */
.mmu-kalenderwahl-leiste button {
  font: inherit;
  font-size: var(--t-neben);
  font-weight: 600;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  background: none;
  border-radius: 0;
  padding: var(--raum-2) var(--raum-5);
  box-sizing: border-box;
  /* ⚠️ min-height, NICHT height. Eine feste Hoehe kann zweizeiligen Text
     nicht aufnehmen: Er quillt aus dem Knopf heraus und legt sich ueber das
     naechste Element.

     Am 19.08.2026 vom Betreiber auf dem Handy gemeldet und danach
     nachgestellt. Die Beschriftung "Auswahl als Kalenderdatei" bricht um,
     sobald die Systemschrift vergroessert ist:

       Wurzelschrift   Knopfhoehe   Text braucht
       16px            40px         38px          passt
       20px            50px         66px          laeuft ueber
       24px            60px         79px          laeuft ueber

     Die Hoehe wuchs mit (2.5rem bleibt 2.5rem), der Text aber staerker.
     min-height haelt das Mass bei einzeiliger Beschriftung unveraendert und
     laesst den Knopf nur dann wachsen, wenn er muss.

     Dieselbe Aenderung an .mmu-filter button, .mmu-suche button und
     .mmu-genrewahl > summary. NICHT an .mmu-suche input (kann nicht
     umbrechen) und nicht an .mmu-ortsymbole .mmu-anfahrt (quadratischer
     Symbolknopf, dort ist das feste Mass ausdruecklich gewollt). */
  min-height: 2.5rem;
  cursor: var(--mmu-zeiger-klick);
  cursor: var(--mmu-zeiger-klick-hidpi);
}
.mmu-kalenderwahl-leiste button:not([name]) {
  color: var(--mmu-akzent-text);
  border: 1px solid var(--mmu-akzent);
}
.mmu-kalenderwahl-leiste button:not([name]):hover {
  background: var(--mmu-akzent-text);
  color: var(--mmu-grund);
}
.mmu-kalenderwahl-leiste button[name] {
  color: var(--mmu-text);
  border: 1px solid var(--mmu-kante);
}
.mmu-kalenderwahl-leiste button[name]:hover {
  border-color: var(--mmu-akzent);
  color: var(--mmu-akzent-text);
}

/* ⚠️ Zeitungsoptik-Entwurf, 17.08.2026: umrissene statt gefuellte Knoepfe.
   DESIGN-BRIEFING "Interactions & Behavior": "Buttons: transparente
   Flaeche, 1px Rahmen; primaer #c0392b-Rahmen mit #d9604b-Text, sekundaer
   #6a6a72-Rahmen." (Zitat im Wortlaut. #d9604b ist seit der Umkehrung auf
   hellen Grund am 18.08.2026 durch #a5301f ersetzt — der Code nimmt die
   Variable, nicht den Zahlenwert aus dem Briefing.) "Filtern" ist die primaere Handlung der Leiste (sie
   AENDERT die Liste), "Suchen" bleibt sekundaer — dieselbe Rangfolge wie
   der Filterkasten ueber der leiseren Suchzeile im Entwurf. */
.mmu-filter button {
  font: inherit;
  font-size: var(--t-neben);
  font-weight: 600;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--mmu-akzent-text);
  background: none;
  border: 1px solid var(--mmu-akzent);
  border-radius: 0;
  padding: var(--raum-2) var(--raum-5);
  box-sizing: border-box;
  /* min-height statt height — Begruendung bei .mmu-kalenderwahl-leiste button. */
  min-height: 2.5rem;
  cursor: var(--mmu-zeiger-klick);
  cursor: var(--mmu-zeiger-klick-hidpi);
}
.mmu-filter button:hover {
  background: var(--mmu-akzent-text);
  color: var(--mmu-grund);
}
.mmu-suche button {
  font: inherit;
  font-size: var(--t-neben);
  font-weight: 600;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--mmu-text);
  background: none;
  border: 1px solid var(--mmu-kante);
  border-radius: 0;
  padding: var(--raum-2) var(--raum-5);
  box-sizing: border-box;
  /* min-height statt height — Begruendung bei .mmu-kalenderwahl-leiste button. */
  min-height: 2.5rem;
  cursor: var(--mmu-zeiger-klick);
  cursor: var(--mmu-zeiger-klick-hidpi);
}
.mmu-suche button:hover {
  border-color: var(--mmu-akzent);
  color: var(--mmu-akzent-text);
}

/* "zuruecksetzen" erscheint nur, wenn ein Filter aktiv ist — es ist der
   sichtbare Beleg dafuer, dass die Liste gerade eingeschraenkt ist. */
.mmu-filter-knoepfe a,
.mmu-suche > a {
  font-size: var(--t-neben);
  align-self: center;
}

.mmu-suchfeld { position: relative; }
#mmu-suche-liste {
  position: absolute;
  top: 100%;
  left: 0;
  right: 0;
  z-index: 20;
  list-style: none;
  margin: var(--raum-1) 0 0;
  padding: 0;
  background: var(--mmu-flaeche);
  border: 1px solid var(--mmu-kante);
  max-height: 18rem;
  overflow-y: auto;
}
#mmu-suche-liste li { border-top: 1px solid var(--mmu-linie); }
#mmu-suche-liste li:first-child { border-top: 0; }
#mmu-suche-liste a {
  display: block;
  padding: var(--raum-2) var(--raum-3);
  text-decoration: none;
  color: var(--mmu-text);
}
/* ⚠️ Die EINZIGE Stelle im Stylesheet, an der der Fokusring abgeschaltet
   wird — und zwar begruendet, nicht aus Bequemlichkeit.

   Der Ring ist akzentfarben. Der hervorgehobene Vorschlag ist es auch: Ein
   akzentfarbener Ring auf akzentfarbenem Grund waere unsichtbar. An seine
   Stelle tritt der Farbwechsel der ganzen Zeile, und der ist der staerkere
   Hinweis. Nachgemessen am 12.08.2026:

       Hervorhebung gegen Listengrund   5.44:1   (gefordert 3:1, WCAG 1.4.11)
       Text auf der Hervorhebung        5.98:1   (gefordert 4.5:1)

   Dieselbe Auszeichnung traegt die Tastaturmarkierung (.mmu-markiert), die
   das Suchskript setzt — wer mit den Pfeiltasten durch die Vorschlaege geht,
   sieht also genau das, was ein Fokus zeigen wuerde.

   Wer diese drei Zeilen entfernt, weil "outline:none nie richtig ist",
   bekommt einen unsichtbaren Ring zurueck und verliert nichts Sichtbares. */
#mmu-suche-liste li.mmu-markiert > a,
#mmu-suche-liste a:hover,
#mmu-suche-liste a:focus {
  background: var(--mmu-akzent-text);
  color: var(--mmu-grund);
  outline: none;
}

/* -------------------------------------------------------------------------
   13. Kalenderwechsel
   ------------------------------------------------------------------------- */
/* Die Einladung an die Bands ueber der Filterleiste (/bands/, 18.08.2026).
   ⚠️ NICHT .mmu-mitmachen. Diese Klasse gibt es seit dem 10.08.2026 und sie ist
   ein KASTEN — Rahmenstrich links, abgesetzte Flaeche, eigene Ueberschrift; sie
   steht als <aside> am FUSS des Konzertkalenders ("Fehlt ein Termin?"). Hier
   steht die Einladung dagegen oben, ueber der Filterleiste, und ein Kasten an
   dieser Stelle stritte mit den Filtern um dieselbe Aufmerksamkeit — die
   braucht, wer wirklich etwas sucht.
   Deshalb dieselbe gedaempfte Farbe wie die Einleitungen der Uebersichten: ein
   Hinweis, kein Aufruf. */
/* 📏 Entwurf: 0.9375rem auf #c8c8cc. Gemessen waren 1rem auf --mmu-gedimmt
   (#a0a0a8) -- einen Hauch zu gross und zu leise zugleich. Die Zeile lockt
   zum Mitmachen; sie darf gelesen werden. */
.mmu-einladung {
  font-size: 0.9375rem;
  color: #c8c8cc;
  color: var(--mmu-gedimmt);
  max-width: var(--mmu-spalte);
  margin: 0 0 var(--raum-5);

  /* ⚠️ KEIN Einzug um das Register. Betreiberentscheidung 18.08.2026,
     nachdem er ihn gesehen hat: "Ziehe das buendig nach links".

     Der Einzug stand kurzzeitig hier (Commit 1c6f6b9, parallele Sitzung,
     ohne Begruendung in der Nachricht). Er stellte die Einladung auf die
     Fluchtlinie der Datenkarten — konsequent gedacht, an dieser Stelle aber
     falsch: Ueberschrift und Filterleiste stehen buendig links, die
     Einladung dazwischen sprang als einziges Element ein. Wer das erneut
     aendert, aendert eine Entscheidung, nicht ein Versehen. */
  padding-left: 0;
}

/* Der Verweis auf eine eigene Zeile (dieselbe Entscheidung). Als Fortsetzung
   des Satzes brach er mitten im Titel um — "6(66) Fakten ueber deine" /
   "Band →" —, und ein Titel, der in zwei Zeilen zerfaellt, liest sich nicht
   mehr als Titel. Als eigener Block bleibt er zusammen, solange die Spalte
   reicht. */
.mmu-einladung a {
  display: block;
}

.mmu-kalender-einleitung {
  color: var(--mmu-gedimmt);
  max-width: var(--mmu-spalte);
  margin: 0 0 var(--raum-5);
}
.mmu-kalender-wechsel {
  display: flex;
  flex-wrap: wrap;
  gap: var(--raum-2);
  margin: 0 0 var(--raum-5);
}
.mmu-kalender-wechsel a {
  border: 1px solid var(--mmu-kante);
  padding: var(--raum-2) var(--raum-4);
  font-size: var(--t-neben);
  text-decoration: none;
  color: var(--mmu-text);
}
.mmu-kalender-wechsel a:hover,
.mmu-kalender-wechsel a:focus-visible {
  border-color: var(--mmu-akzent);
  color: var(--mmu-akzent-text);
}

/* -------------------------------------------------------------------------
   14. Orte
   ------------------------------------------------------------------------- */
/* ⚠️ Zeitungsoptik-Entwurf, 17.08.2026: dieselbe Zwischenueberschrift wie
   die Monatsueberschrift im Kalender (§9, .mmu-kalender h2) — Serifenschrift
   700, rechts fuellender Doppelstrich (.mmu-fuellstrich, dort erklaert).

   KEIN text-transform, anders als die uebrigen Kolumnentitel dieser Seite,
   und das bleibt auch im neuen Stil so: .mmu-lage traegt INHALT —
   "München · 12 – Schwabing-Freimann" ist ein Ortsname, keine feste
   Beschriftung. Versalien waeren eine Behauptung ueber seine Schreibweise,
   und bei einem Bezirk wie Großhadern machte der Browser daraus
   GROSSHADERN. Serifenschrift und Gewicht tragen die Hierarchie jetzt,
   nicht mehr Groesse und Gedimmtheit allein. */
.mmu-lage {
  display: flex;
  align-items: center;
  gap: var(--raum-4);
  font-family: var(--schrift-prosa);
  font-weight: 700;
  font-size: var(--t-gross);
  color: var(--mmu-text);
  margin: var(--raum-6) 0 var(--raum-2);
}

/* Gastronomie ist der volatilste Teil des Bestands. Der Stand-Vermerk sagt,
   wann zuletzt jemand hingesehen hat — dezent, nicht alarmierend. */
.mmu-stand {
  font-style: italic;
  color: var(--mmu-gedimmt);
  font-size: var(--t-neben);
}

/* Eingebettetes SVG, kein Bild von einem fremden Server; der Link fuehrt
   erst nach dem Klick zu Google. */
.mmu-anfahrt {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 1.75rem;
  height: 1.75rem;
  border: 1px solid var(--mmu-kante);
  color: var(--mmu-gedimmt);
  text-decoration: none;
  vertical-align: middle;
}
.mmu-anfahrt:hover,
.mmu-anfahrt:focus-visible {
  color: var(--mmu-akzent-text);
  border-color: var(--mmu-akzent);
}
.mmu-place h1 .mmu-anfahrt { margin-left: var(--raum-3); }

/* -------------------------------------------------------------------------
   15. Startseite
   -------------------------------------------------------------------------
   ⚠️ Zeitungsoptik-Entwurf, 17.08.2026: Hier stand, die Zahl der Kacheln
   solle NICHT gross und allein stehen. Der Entwurf will das Gegenteil —
   "grosse Serifenzahlen" im Bereichsraster (§9 der Uebergabe) — und diese
   Fassung folgt ihm: Die Ziffer fuehrt jetzt, der Titel bleibt der Link.
   Nichts geht dabei verloren: Titel, Einheitswort und Beschreibung bleiben
   alle im Markup, nur die Ziffer tritt hervor. */
/* 🔴 Der Aufmacher der Startseite traegt die Groesse des Entwurfs:
   clamp(1.9rem, 5vw, 3rem) — bei 1476 px sind das 48 px. Die allgemeine
   Regel 'main[class*=" mmu-"] h1' deckelt bei 2.125rem (34 px), und das
   gilt fuer JEDE Seite. v3 gibt die 3rem nur hier an; die Ueberschriften
   der anderen Seiten bleiben kleiner.
   📏 Gemessen am 01.10.2026: live 34 px gegen 48 px im Entwurf.
   🔵 text-wrap: balance wie im Entwurf — die Zeile soll nicht mit einem
   einzelnen Wort enden. */
/* ⚠️ main[class*=" mmu-"] davor, und das ist kein Schnoerkel: Die
   allgemeine Ueberschriftenregel hat (0,1,2) — das Attribut zaehlt wie eine
   Klasse, dazu zwei Elemente. Eine reine ".mmu-start-intro h1" haette
   (0,1,1) und verloere, obwohl sie spaeter im Blatt steht. Gemessen am
   01.10.2026: 34px statt 48px. */
main[class^="mmu-"] .mmu-start-intro h1,
main[class*=" mmu-"] .mmu-start-intro h1 {
  margin-bottom: var(--raum-4);
  font-size: clamp(1.9rem, 5vw, 3rem);
  line-height: 1.1;
  text-wrap: balance;
  /* 🔴 max-width: none gegen die allgemeine Regel. Die begrenzt jede h1 auf
     die Textspaltenbreite (Register + Luecke + Spalte = 752 px) — richtig
     fuer eine linksbuendige Seitenueberschrift ueber einem Flusstext,
     falsch fuer den ZENTRIERTEN Aufmacher: Dort brach er die Zeile bei
     48 px Schriftgroesse mittendurch, waehrend der Entwurf sie einzeilig
     setzt. Gemessen am 01.10.2026: h1 752 px in einem 1152 px breiten
     Abschnitt. */
  max-width: none;
}

/* 🔴 DER AUFMACHER STEHT SEIT DEM 30.09.2026 ZENTRIERT (Handoff v3).

   Hier stand ein zweispaltiges Raster: Einleitung links, Neuigkeiten rechts,
   beide auf einer Schriftlinie. Das war ein Betreiberwunsch vom 16.08.2026
   („Ueberschrift und Neuigkeiten sollen auf einer Linie stehen"), und er ist
   mit v3 ueberstimmt — die Neuigkeiten stehen jetzt weiter unten neben der
   Vorstellung.

   ⚠️ Die Klasse .mmu-start-intro-zweispaltig wird im Markup nicht mehr
   gesetzt. Ihre Regel ist deshalb ganz entfernt statt stehengelassen: Eine
   Regel, die auf nichts mehr zutrifft, sieht bei der naechsten Suche aus wie
   eine, die wirkt. */
/* 📐 Der Entwurf schliesst den Aufmacher mit einer Linie ab (1px #26262c)
   und polstert ihn 2rem/1.5rem -- so steht er als eigener Abschnitt ueber
   dem Schaufenster. Gemessen: border-bottom 0px. Nicht falsch gesetzt,
   sondern nie gesetzt. */
/* 📐 Der Aufmacher rueckt unter das Laufband, statt auf Abstand dazu zu
   stehen (Betreiber 01.10.2026: „zieh es weiter nach oben").

   `main` bringt var(--raum-6) Polster mit; davon nimmt der negative Rand
   den groesseren Teil zurueck.

   ⚠️ Ein negativer Rand ist hier das mildere Mittel: Das Polster von main
   gilt fuer JEDE Seite, und es fuer eine zu aendern haette alle anderen
   mitverschoben. */
.mmu-start-intro {
  margin-block-start: calc(-1 * var(--raum-5));
  text-align: center;
  /* 📏 OBEN KEIN EIGENES POLSTER. `main` bringt bereits var(--raum-6) mit,
     und zwei Polster uebereinander ergaben 64 px zwischen Laufband und
     Ueberschrift. Der Entwurf setzt am Aufmacher 2rem oben -- aber dort
     steht die Ansicht direkt im Container, ohne das Polster von main.
     (Betreiber: "Es ist zuviel freier platz nach oben.") */
  padding-block: 0 var(--raum-5);
  border-bottom: 1px solid var(--mmu-linie);
  /* 🔴 KEINE Breitenbegrenzung mehr am Abschnitt. Sie stand hier mit
     richtigem Ziel an falscher Stelle: Sie sollte die EINLEITUNG schmal
     halten ("zentrierter Text ueber 100 Zeichen je Zeile ist schwerer zu
     lesen"), begrenzte aber auch die Ueberschrift — die brach dadurch bei
     48 px Schriftgroesse auf zwei Zeilen, waehrend der Entwurf sie
     einzeilig setzt (gemessen 752 px statt der vollen Inhaltsbreite).
     Der Lesespalten-Gedanke bleibt: Er sitzt jetzt an .mmu-start-intro p,
     mit den 40rem des Entwurfs. */
  margin-inline: auto;
}

/* -------------------------------------------------------------------------
   Die rechte Spalte der Startseite (Handoff v3)
   -------------------------------------------------------------------------
   Neuigkeiten und „Weitere Vorstellungen", zusammen neben der Vorstellung.
   Beide standen bis zum 30.09.2026 woanders: die Neuigkeiten neben der
   Ueberschrift, die aelteren Vorstellungen IN der Vorstellung. */
.mmu-start-spalte {
  display: flex;
  flex-direction: column;
  gap: var(--raum-5);
}

/* ⚠️ 56rem und nicht 60rem: Der Umbruch haengt jetzt an den
   Basisbreiten (48,5rem plus Seitenraender, also rund 852 px), nicht an
   dieser Zahl. Sie muss nur sicher DARUEBER liegen, damit die Kante nie an
   einem gestapelten Kasten haengt. 56rem = 896 px hat diesen Abstand.
   🔵 Was bleibt: Zwischen 1088 und 1120 px stehen die Spalten nebeneinander
   OHNE Kante. Das ist eine fehlende Trennlinie, kein Bruch — und die
   Gegenrichtung (Kante an einem gestapelten Kasten) waere sichtbar
   falsch. CSS kann nicht abfragen, ob ein Flexbau umgebrochen ist. */
@media (min-width: 70rem) {
  /* 🔴 Die Kante gehoert an die SPALTE, nicht mehr an die Neuigkeiten.

     Bis zum 30.09.2026 trug sie  — damals stand dort nur die eine
     Liste, und die Kante trennte sie vom Einleitungstext daneben. Jetzt
     stehen zwei Kaesten untereinander in der Spalte: Eine Kante nur am
     oberen saehe aus, als gehoerte der untere nicht dazu.

     Erst ab 60rem, denn darunter stapeln die Spalten — eine linke Kante an
     einem gestapelten Kasten waere keine Trennung mehr, nur ein Strich ohne
     Zweck. */
  .mmu-start-spalte {
    border-left: 1px solid var(--mmu-linie);
    padding-left: var(--raum-5);
  }
}

/* Kein Laufband: still, als Liste. Ein Ticker, der sich bewegt, braeuchte
   JavaScript, eine Ausnahme fuer prefers-reduced-motion und einen Weg fuer
   Vorlesehilfen — fuer vier Zeilen Text. */
.mmu-news > h2 {
  /* 📏 0.18em wie die uebrigen Abschnittsmarken. Mit 0.09em stand "NEUIGKEITEN"
     halb so weit gesperrt neben "VORSTELLUNG" -- in einer Zeile nebeneinander
     sichtbar, in einer Einzelmessung nie. */
  font-size: var(--t-klein);
  font-weight: 600;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--mmu-gedimmt);
  margin: 0 0 var(--raum-3);
  padding-bottom: var(--raum-2);
  border-bottom: 1px solid var(--mmu-kante);
}
.mmu-news ul { list-style: none; padding: 0; margin: 0; display: grid; /* Einspaltig (Betreiberwunsch 18.08.2026) — nimmt 2b7ba69 zurueck. */
  /* raum-4 statt raum-6, und Innenabstand raum-1 statt raum-2 (19.08.2026):
     Die Einleitung links ist kuerzer als die Neuigkeiten rechts, darunter
     blieb eine leere Flaeche. Gemessen bei 1280px Fensterbreite: Block
     417px, Einleitung 211px, also 206px leer.

     Der Abstand zwischen den Eintraegen war mit 32px der groesste Posten —
     dreimal 32 sind 96px, mehr als ein Eintrag selbst hoch ist. 16px lassen
     die Liste weiterhin atmen.

     ⚠️ Die Trefferflaeche der Links bleibt unberuehrt: Sie haengt an
     `.mmu-news li a { padding-block: 2px }` weiter unten, nicht am
     Innenabstand der Zeile. */
  grid-template-columns: 1fr; gap: var(--raum-4); }
.mmu-news li {
  padding: var(--raum-1) 0;
  border-top: 1px solid var(--mmu-linie);
  font-size: var(--t-neben);
  /* 1.6 statt 1.4: Damit werden die Links 22px hoch statt 18 — dasselbe Mass
     wie die Textlinks in Fusszeile und Kacheln. WCAG 2.5.8 nimmt Links im
     Fliesstext von der 24px-Regel aus, die §8 fuer Bedienelemente fuehrt;
     unter dem eigenen Hausmass zu bleiben waere trotzdem schlampig. */
  line-height: 1.6;
}
.mmu-news li:first-child { border-top: 0; }
/* n+2, nicht n+3: Bei ZWEI Spalten bildeten die ersten beiden Eintraege die
   erste Reihe und brauchten keine Linie. Einspaltig ist schon der zweite
   Eintrag eine neue Zeile. */
.mmu-news li:nth-child(n+2) { border-top: 1px solid var(--mmu-linie); }
/* Der Innenabstand, nicht die Zeilenhoehe, vergroessert die Trefferflaeche
   eines Inline-Links: Seine Hoehe kommt aus Schriftgroesse und Padding, die
   line-height wirkt nur auf den Zeilenkasten. Gemessen waren es 18px, mit
   2px oben und unten sind es 22 — dasselbe Mass wie die Textlinks in
   Fusszeile und Kacheln. */
/* 🔴 DIE MELDUNGEN SIND KEINE LINKLISTE. Im Entwurf stehen sie in heller
   Serifenschrift und werden erst beim Darueberfahren rot
   (style-hover="color:var(--mmu-akzent-text)"). Live standen sie rot und
   unterstrichen da — die Spalte las sich wie eine Linksammlung statt wie
   Nachrichten.
   📏 Entwurf (v3.dc.html Zeile 99): 1rem Serif, line-height 1.4,
   color #e8e8ea, keine Unterstreichung.
   ⚠️ ':any-link' ist Notwehr: 'main[class^="mmu-"] a' hat (0,1,2) und
   schlaegt eine reine Klassenregel. */
.mmu-news li a:any-link {
  padding-block: 2px;
  font-family: var(--schrift-prosa);
  font-size: 1rem;
  line-height: 1.4;
  color: var(--mmu-text);
  text-decoration: none;
}
.mmu-news li a:any-link:hover,
.mmu-news li a:any-link:focus-visible {
  color: var(--mmu-akzent-text);
}
/* Das Datum ordnet, es ruft nicht — dieselbe Behandlung wie im Kalender:
   Tabellenziffern, gedimmt, eigene Zeile ueber der Meldung. */
/* 📏 Entwurf: 0.75rem in Schreibmaschinenschrift. Die Mono-Ziffern sind
   nicht Zierde — untereinander stehende Daten sind nur mit ihnen auf
   gleicher Breite, und genau das ordnet die Spalte. */
.mmu-news time {
  display: block;
  font-family: var(--schrift-mono);
  font-size: var(--t-mikro);
  color: var(--mmu-gedimmt);
  font-variant-numeric: tabular-nums;
}
/* 📏 Werte aus dem Entwurf (v3.dc.html Zeile 65): 1.125rem auf 40rem
   Spaltenbreite, Zeilenabstand 1.55, und eine eigene, ruhigere Textfarbe.
   Live gemessen war es 1.375rem auf 36rem in voller Textfarbe — groesser
   und schmaler zugleich, wodurch die Einleitung vier Zeilen brauchte,
   wo der Entwurf drei setzt. */
/* 🔴 `margin-inline: auto` -- OHNE DAS IST NUR DER TEXT ZENTRIERT, NICHT
   DER BLOCK.

   📏 Gemessen: 640 px breit in einem 782 px breiten Abschnitt, mit
   margin-inline 0/0. Der Absatz klebte links, die 142 px Rest lagen alle
   rechts -- und weil der Text darin mittig steht, sah die ganze Gruppe
   schief aus, ohne dass eine Zeile falsch ausgerichtet war.

   ⚠️ Eine Pruefung auf `text-align: center` haette das NIE gefunden: Die
   stand die ganze Zeit richtig. Der Entwurf schreibt `margin: 0.8rem auto
   0` -- das auto ist die halbe Miete, und es stand hier nicht. */
/* 📏 44rem UND NICHT 40rem (Betreiber 01.10.2026: "mach 2 zeilen daraus").

   Live durchgemessen, wo der Umbruch kippt:

     40rem   3 Zeilen   472 / 416 / 404
     42rem   2 Zeilen   655 / 641     <- Kippgrenze
     48rem   2 Zeilen   655 / 641
     50rem   2 Zeilen   passt nicht mehr in den Abschnitt (782 px)

   42rem waere die Grenze; 44 gibt zwei Zeichen Puffer, falls der Satz sich
   aendert, und bleibt weit genug vom Rand des Abschnitts.

   ⚠️ Der Entwurf setzt hier 40rem. Das ist die Lesespaltenbreite fuer
   Fliesstext, und als solche richtig -- dieser Aufmacher ist aber ein
   Zweizeiler, kein Absatz zum Lesen. Bewusst abgewichen.

   ⚠️ Auf schmalen Schirmen werden es wieder mehr Zeilen. Das ist richtig:
   Die Breite ist eine Obergrenze, kein Festmass. */
.mmu-start-intro p {
  max-width: 44rem;
  margin-inline: auto;
  /* ⚠️ Knapper Abstand zwischen den beiden Saetzen: Ein voller
     Absatzabstand risse den Aufmacher auseinander, und er ist zu kurz,
     um das zu tragen. Der erste Absatz steht mit 0.8rem unter der
     Ueberschrift (Entwurf), die folgenden ruecken enger nach. */
  /* 📐 Enger an die Ueberschrift: Der Entwurf setzt 0.8rem, der Betreiber
     wollte es am 01.10.2026 noch weiter oben ("zieh es weiter nach oben"). */
  margin-block: 0.45rem 0;
  font-family: var(--schrift-prosa);
  font-size: 1.125rem;
  line-height: 1.55;
  color: #c8c8cc;
  /* 🔴 `balance` UND NICHT `pretty` — daran lag der ganze Streit um die
     beiden Saetze.

     `pretty` verhindert nur Wortwaisen am Absatzende; die Zeilen davor
     bleiben so lang wie moeglich, und die letzte faellt kurz aus. Genau
     das sah der Betreiber zweimal: erst eine Satzgrenze mitten in Zeile 2,
     dann (nach der Trennung in zwei Absaetze) eine halb leere Zeile 2 mit
     dem Hinweis „haeng das da noch dran".

     🎯 Beide Male war es DERSELBE Mangel, nicht zwei verschiedene: ein
     Umbruch an der falschen Stelle. `balance` verteilt die Zeilen gleich
     lang. Es gilt nur bis zu wenigen Zeilen — Browser begrenzen es, meist
     auf vier bis sechs — und das passt: ein Aufmacher, kein Fliesstext.

     ⚠️ Der alte Vermerk bleibt als Begruendung stehen, warum `pretty`
     hier NICHT mehr steht:
     text-wrap:pretty verhindert nur einzelne Wortwaisen am Absatzende; auf
     einer 36rem-Spalte in 1.375rem faellt das eher auf als in Fliesstext,
     der schon schmaler gesetzt ist. Kein Schaden, wo der Browser es nicht
     kennt — dann bleibt es beim gewoehnlichen Umbruch. */
  text-wrap: balance;
}

/* ⚠️ HIER STAND EINE REGEL FUER EINEN ZWEITEN ABSATZ, und sie ist weg,
   weil es ihn nicht mehr gibt: Die beiden Saetze stehen seit dem
   01.10.2026 wieder in einem Absatz, und der Umbruch sitzt jetzt ueber
   `text-wrap: balance` richtig.

   Eine Regel fuer ein Element, das es nicht gibt, sieht aus wie
   Verdrahtung und ist keine. */

/* Die Fraktur-Initiale. float statt Grid/Flex, weil genau DAS den
   Zeitungseffekt macht: Der Fliesstext umlaeuft den Buchstaben, statt
   daneben zu stehen. line-height:0.8 zieht ihn an die Kopflinie der ersten
   Zeile heran — bei 1 (normal) haette er sichtbar zu tief gehangen. */
.mmu-initiale {
  float: left;
  font-family: var(--schrift-titel);
  font-size: 2.2em;
  line-height: 0.8;
  padding: 0.08em 0.12em 0 0;
  color: var(--mmu-akzent-text);
}

/* Die Kernzusage (DESIGN-BRIEFING §1), als eigener Satz statt im
   Fliesstext versteckt. Kursiv UND gedimmt, nicht nur eins von beiden:
   Kursiv allein liesse sie wie eine gewoehnliche Betonung wirken, gedimmt
   allein wie eine Randbemerkung — zusammen liest sie sich als das, was sie
   ist: ein Motto, kein Haupttext. */
/* .mmu-start-intro .mmu-maxime statt nur .mmu-maxime: Zwei Klassen gegen
   die eine Klasse plus Element von ".mmu-start-intro p" (Spezifitaet 0-2-0
   gegen 0-1-1) — sonst gewinnt die allgemeine Regel trotz spaeterer Position
   im Stylesheet, und die gedimmte Farbe griff nachweislich nicht (Text blieb
   auf --mmu-text statt --mmu-gedimmt). */
.mmu-start-intro .mmu-maxime {
  margin-top: var(--raum-4);
  font-family: var(--schrift-prosa);
  font-style: italic;
  font-size: var(--t-prosa);
  color: var(--mmu-gedimmt);
}
/* Der Aushang. Kein Beschnitt an keiner Stelle: Die Blaetter behalten ihr
   eigenes Seitenverhaeltnis — die ersten vier des Bestands reichen von 0,71
   bis 1,00. Auf einem Konzertflyer stehen Preis und Uhrzeit oft in der
   letzten Zeile; ein Raster, das beschneidet, wirft genau die Angaben weg,
   wegen derer jemand hinsieht. Gleiche Ueberlegung wie bei der Logotafel
   (GESTALTUNG §6). */
.mmu-aushang { margin-top: var(--raum-7); }
/* ⚠️ Bis zum 17.08.2026 stand hier derselbe kleine Kolumnentitel-Stil wie
   bei "Neuigkeiten" (klein, Versalien, gesperrt). Der Entwurf fuehrt "Der
   Aushang" dagegen als eigene grosse Zwischenueberschrift — Rang einer
   Abschnittsueberschrift, nicht einer Randnotiz. Die Ueberschrift im Markup
   heisst seither ebenso ("Der Aushang" statt "Aushang"), damit Text und
   Gestaltung zusammenpassen. */
.mmu-aushang > h2 {
  margin: 0 0 var(--raum-5);
  font-family: var(--schrift-prosa);
  font-weight: 700;
  font-size: 1.75rem;
  color: var(--mmu-text);
}
/* Einer fuehrt. Das ist eine Aussage ueber Rang, nicht ueber Format — das
   grosse Blatt steht links, weil es der erste Eintrag der Liste ist, nicht
   weil es das hochformatigste waere. */
.mmu-aushang-wand {
  display: grid;
  grid-template-columns: minmax(0, 1.05fr) minmax(0, 1fr);
  gap: var(--raum-6);
  align-items: start;
}
.mmu-aushang-neben {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: var(--raum-4);
  align-items: start;
}
.mmu-flyer { display: block; text-decoration: none; color: inherit; }
.mmu-flyer img {
  display: block;
  width: 100%;
  height: auto;
  /* border-box, sonst addiert der Rahmen auf width:100% und das Blatt ist
     2px breiter als seine Rasterzelle — gemessen 317px in einer 315px-Zelle.
     Der Seitenrand schluckt das, bis ihn jemand wegnimmt. */
  box-sizing: border-box;
  border: 1px solid var(--mmu-linie);
  /* Wie die Logotafel: Das Blatt sitzt auf reinem Schwarz, damit ein dunkler
     Flyerrand nahtlos in die Seite uebergeht. */
  background: var(--mmu-tafel);
}
.mmu-flyer:hover img,
.mmu-flyer:focus-visible img { border-color: var(--mmu-akzent); }
.mmu-flyer-bu {
  display: block;
  font-size: var(--t-neben);
  color: var(--mmu-gedimmt);
  line-height: 1.35;
  margin-top: var(--raum-2);
  padding-top: var(--raum-2);
  border-top: 1px solid var(--mmu-linie);
}
.mmu-aushang-neben .mmu-flyer-bu { font-size: var(--t-klein); }

/* -------------------------------------------------------------------------
   Das Datumsschild am Anschlag
   -------------------------------------------------------------------------
   Handoff: "echte Flyer (Bild vorne, Datumsschild unten links)".

   🔴 Bis zum 01.10.2026 stand hier eine ZEILE UNTER dem Plakat, mit Datum
   und Bandnamen. Das Soll-Bild zeigt etwas anderes: ein kleines weisses
   Schild, das unten links AUF dem Blatt liegt und ueber seine Kante
   hinausragt -- wie ein aufgeklebter Zettel.

   ⚠️ Nur im Aushang. Neben der Konzertliste (.mmu-aushang-neben) bleibt
   die Bildunterschrift, was sie war: dort ist sie die einzige Auskunft. */
.mmu-anschlag .mmu-flyer-bu {
  position: absolute;
  /* 📐 RECHTS OBEN (Betreiber 01.10.2026: "da wird nichts wichtiges
     ueberschrieben"). Unten links lag es auf dem Plakat -- bei vielen
     Flyern stehen dort Preis, Einlass und Adresse. Oben rechts ist in der
     Regel Rand oder Hintergrund. */
  right: -0.4rem;
  top: 0.9rem;
  margin: 0;
  padding: 0.2rem 0.5rem;
  border: 0;
  background: var(--mmu-papier);
  color: var(--mmu-papier-text);
  font-family: var(--schrift-mono);
  font-size: var(--t-klein);
  line-height: 1.3;
  box-shadow: 0 2px 6px rgb(0 0 0 / 0.5);
}
/* Das Datum IST der Schildtext -- es braucht keine eigene Auszeichnung mehr. */
.mmu-anschlag .mmu-flyer-bu strong {
  display: inline;
  color: inherit;
  font-weight: 400;
}
/* 🔵 Die Bandzeile faellt weg: redundant zum aria-label des Blattes und zur
   Rueckseite, und im Soll-Bild steht sie nicht da. */
.mmu-anschlag .mmu-flyer-zeile { display: none; }

/* 🔴 DER BROWSER DARF DAS BLATT NICHT SELBST ZIEHEN.

   Bilder und Links sind von Haus aus ziehbar (draggable). Beim Griff aufs
   Plakat startete deshalb das native Drag-and-Drop: Der Browser nimmt das
   Bild als Datei auf und zeigt sein eigenes Schattenbild, waehrend das
   pointermove der Pinnwand nicht mehr ankommt.

   📏 Gemessen: img.draggable true, a.draggable true, -webkit-user-drag auto.

   ⚠️ Zweite Ursache am selben Symptom. Die erste war eine zu breite
   closest('a')-Ausnahme im pointerdown; danach ging das Ziehen, aber nur
   kurz und langsam -- wer weiter zog, loeste das native Drag aus.

   ⚠️ Das reicht allein NICHT: -webkit-user-drag kennt Firefox nicht. Dort
   greift der dragstart-Riegel in pinnwand.js. Beide zusammen, weil der
   CSS-Weg Firefox stehen liesse und der JS-Weg in Chrome das
   Schattenbild kurz aufblitzen laesst. */
.mmu-anschlag,
.mmu-anschlag a,
.mmu-anschlag img {
  -webkit-user-drag: none;
}
.mmu-flyer-bu strong {
  display: block;
  color: var(--mmu-text);
  font-weight: 600;
  font-variant-numeric: tabular-nums;
}
.mmu-start-weiter { font-size: var(--t-neben); margin: 0 0 var(--raum-4); }

/* Vier Kacheln, also zwei oder vier Spalten — nie drei. auto-fit mit
   minmax(15rem,1fr) ergab bei 850px Inhaltsbreite genau DREI Spalten und
   liess die vierte Kachel allein in einer zweiten Reihe stehen; das Raster
   sah aus wie ein Fehler. Feste Teilung statt Rechnung: Bei vier gleich
   wichtigen Einstiegen gibt es keinen Grund, die Spaltenzahl dem Zufall der
   Fensterbreite zu ueberlassen. */
.mmu-start-einstiege {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  /* 🔴 1rem Abstand und KEIN Gitter mehr. Bis zum 01.10.2026 standen hier
     gap: 1px auf der Linienfarbe und ein Rahmen ums Ganze — die Kacheln
     teilten sich Kanten wie die Felder einer Tabelle.
     Der Entwurf setzt sie freistehend (v3.dc.html Zeile 147): 1rem Abstand,
     jede Kachel mit eigenem Rahmen, dazwischen Seitengrund. Im Soll-Bild
     des Betreibers ist das deutlich zu sehen. */
  gap: 1rem;
  /* Der Doppelstrich des Entwurfs markiert den Beginn des Bereichsrasters,
     wie er im Kopf und vor jeder Monatsueberschrift den Beginn eines
     Abschnitts markiert — dasselbe Vokabular, hier angewandt. Als Langform
     NACH dem Kurzwert `border`, sonst wuerde die Kurzform sie ueberschreiben
     (beide setzen border-top, und die spaetere Deklaration gewinnt). */
  border-top: 3px double var(--mmu-kante);
  /* Nur oben: `main` traegt schon padding-bottom, der Fuss darunter schon
     margin-top (beide var(--raum-7)). Ein drittes margin-bottom hier addierte
     sich zu 144px Leerraum vor dem Fuss — sichtbar groesser als jeder andere
     Abstand der Seite, ohne dass irgendeine einzelne Regel "zu viel" war. */
  margin: var(--raum-7) 0 0;
}
/* Die Kacheln teilen sich Kanten, statt jede einen eigenen Rahmen zu
   tragen: ein Raster, kein Kartenstapel. Der 1px-Zwischenraum auf der
   Linienfarbe erzeugt das Gitter. */
/* 🔴 align-items: start am Raster: Ein Raster streckt seine Felder
   sonst auf die Hoehe der hoechsten Kachel der Reihe. Im Entwurf endet
   jede Kachel dort, wo ihr Text endet — „Rockbars" mit einer Textzeile ist
   sichtbar niedriger als „Konzerte" mit zweizeiliger Aussage.
   Gemessen live: alle vier Kacheln der ersten Reihe 231–233 px. */
.mmu-start-einstiege { align-items: start; }

.mmu-einstieg {
  display: flex;
  flex-direction: column;
  gap: var(--raum-1);
  /* 📏 --mmu-flaeche ist #0f0f15 und damit genau der Kachelgrund des
     Entwurfs. Vorher stand hier --mmu-grund (#000000), also der Grund der
     Seite selbst — die Kachel hob sich nur durch ihren Rahmen ab. */
  background: var(--mmu-flaeche);
  padding: var(--raum-5);
  /* 🔴 OHNE RAHMEN IST ES KEINE KACHEL, sondern ein Textblock. Der Grund
     der Kachel ist derselbe wie der der Seite — erst der Rahmen macht
     daraus einen Kasten. Im Entwurf hebt sich jede Kachel sichtbar ab;
     live standen sie bis zum 01.10.2026 ohne jede Begrenzung da, und die
     Drehung (die es gibt) fiel dadurch gar nicht auf: Ein gedrehter
     Textblock ohne Kanten sieht aus wie schief gesetzter Text. */
  /* 📏 --mmu-linie ist #26262c, der Rahmen des Entwurfs. --mmu-kante
     (#6a6a72) war deutlich heller und ließ die Kacheln als Kästen
     hervortreten, statt sie ruhig abzusetzen. */
  border: 1px solid var(--mmu-linie);
}
/* Beim Darüberfahren hebt sich die Kachel vom eigenen Grund ab. */
.mmu-einstieg:hover { background: var(--mmu-grund); }
/* 🔴 DER RUBRIKNAME IST DIE VORZEILE, nicht die Aussage. Im Entwurf
   steht „BANDVERZEICHNIS" klein und gedimmt oben, darunter gross und rot
   „376 Bands" — die Zahl ist das, was die Kachel sagt. Bis zum 01.10.2026
   war es umgekehrt, und damit stand die Kachel auf dem Kopf.
   🔵 Das order: -1 wandert deshalb vom Zahlenblock zum Titel. Das Markup
   bleibt unberuehrt: Der Rubrikname ist weiterhin der Link, und ein
   Vorleser liest ihn weiterhin zuerst. */
/* ⚠️ `a.…:any-link` und nicht nur die Klasse: Der Rubrikname IST ein Link,
   und die Grundregel dieser Datei (Zeile 956) faerbt jeden Link im Inhalt
   mit `main[class^="mmu-"] a` — das ist (0,1,2) und schlaegt die blosse
   Klasse (0,1,0). Die Vorzeile stand dadurch rot statt gedimmt.
   Dritte Fundstelle derselben Falle nach der Stadtwahl und den Ortslinks
   der Eintrittskarte. */
a.mmu-einstieg-titel:any-link,
.mmu-einstieg-titel {
  order: -1;
  color: var(--mmu-gedimmt);
  font-size: var(--t-klein);
  /* 📏 600 und 0.1em nach dem Entwurf (v3.dc.html Zeile 150). Mit 400 und
     0.06em stand die Vorzeile zu leise über einer Zahl, die ruft. */
  font-weight: 600;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  text-decoration: none;
  line-height: 1.2;
}
.mmu-einstieg-zahl {
  color: var(--mmu-akzent-text);
  /* 📏 1.5rem nach dem Entwurf; --t-gross sind 1.375rem. */
  font-size: 1.5rem;
  font-variant-numeric: tabular-nums;
}
/* Die grosse Serifenzahl des Entwurfs — ein Kind von .mmu-einstieg-zahl,
   das dessen kleine, gedimmte Versalienschrift ueberschreibt. Die Einheit
   daneben (.mmu-einstieg-einheit) erbt sie unveraendert; nur die Ziffer
   selbst tritt hervor. */
/* ⚠️ display: inline und nicht block: Im Entwurf steht „376 Bands"
   auf EINER Zeile. Mit block stand die Ziffer allein und die Einheit
   darunter — zwei Zeilen, wo eine gemeint ist. */
.mmu-einstieg-ziffer {
  display: inline;
  font-family: var(--schrift-prosa);
  font-weight: 700;
  line-height: 1.15;
  letter-spacing: normal;
  text-transform: none;
}
.mmu-einstieg-einheit {
  display: inline;
  font-family: var(--schrift-prosa);
  font-weight: 700;
}
.mmu-einstieg-text {
  /* 📏 #c8c8cc nach dem Entwurf (v3.dc.html Zeile 151), nicht die gedimmte
     Farbe (#a0a0a8). Der Satz unter der Zahl erklaert den Bereich — er ist
     Text, keine Beschriftung, und darf so hell sein wie Fliesstext.
     Dieselbe Farbe traegt die Einleitung des Aufmachers. */
  color: #c8c8cc;
  font-size: var(--t-neben);
  line-height: 1.45;
  margin-top: var(--raum-1);
}
.mmu-einstieg-zusatz { font-size: var(--t-neben); margin-top: var(--raum-2); }

/* Die Playlist-Kachel fuellt, was in der letzten Rasterzeile frei bleibt —
   wie viel das ist, rechnet front-page.php aus und gibt es als
   --mmu-playlist-spalten mit (siehe Media Query am Dateiende).
   Sie traegt bewusst dieselbe
   Kachelsprache wie die Bereiche daneben und unterscheidet sich nur durch das
   Spotify-Zeichen in der Vorzeile — sie ist eine Empfehlung, kein sechster
   Bereich, aber kein Grund fuer ein zweites Gestaltungsvokabular.

   Vorgabe span 1 deckt beide schmalen Faelle ab: Bei zwei Spalten steht sie
   neben "Vereine", bei einer darunter. Nur im Viererraster spannt sie. */
.mmu-playlist {
  grid-column: span 1;
  /* Hervorgehoben, aber im Vokabular der Seite: Strich und abgesetzte Flaeche
     sind genau das, was .mmu-mitmachen seit dem 10.08.2026 tut — nur dort in
     Grau, hier im Akzent. Kein Schatten, keine runde Ecke, kein Verlauf;
     §1 laesst dafuer Kontrast und Kante.

     Der Strich liegt OBEN ueber die volle Breite, nicht links
     (Betreiberentscheidung 13.08.2026). Links waeren es 3 Pixel am Rand einer
     862 Pixel breiten Kachel gewesen — richtig im Vokabular, aber zu leise
     fuer die Flaeche, die es zu markieren gilt. Oben laeuft er dort, wo
     ohnehin die Rasterlinie sitzt: Dieselbe Kante, nur in Rot, und damit
     genau die Aussage "dieser Abschnitt ist anders".

     Die 3px wachsen der Zeile zu; das Raster streckt "Vereine" mit, beide
     bleiben gleich hoch. */
  background: var(--mmu-flaeche);
  border-top: 3px solid var(--mmu-akzent);
}
/* Die Kachelregel darueber setzt beim Ueberfahren die Flaeche — hier ist sie
   schon da, das waere wirkungslos. Stattdessen kehrt sich der Grund um: Die
   Kachel tritt beim Zeigen hervor, statt sich anzugleichen. */
.mmu-playlist:hover { background: var(--mmu-grund); }
/* Das Zeichen traegt den Akzent, nicht das Grau der Vorzeile. Ein Punkt
   Farbe in einer sonst gedimmten Zeile sagt "hier ist etwas anderes", ohne
   dass die Kachel schreit. Die Markenfarbe von Spotify bleibt aussen vor —
   §6a haelt fest, dass Kanalzeichen ruhend einfarbig sind. */
.mmu-playlist .mmu-kanalsymbol { color: var(--mmu-akzent-text); }
/* 🔴 Die Reihe mit dem Symbol sitzt am TITEL, nicht mehr an der Zahl: Seit
   dem 01.10.2026 steht die Vorzeile („Playlist") im Titel, und das
   Spotify-Zeichen gehoert zu ihr — es sagt, wohin der Link fuehrt. Die Zahl
   traegt jetzt den Playlist-Namen in Fraktur und braucht keine Reihe. */
.mmu-playlist .mmu-einstieg-titel {
  display: inline-flex;
  align-items: center;
  gap: var(--raum-2);
}
/* Das Zeichen sitzt in einer gesperrten Versalzeile — ohne Ausgleich stuende
   es auf der Grundlinie und liefe optisch nach unten weg. */
.mmu-playlist .mmu-kanalsymbol { flex: none; }

/* -------------------------------------------------------------------------
   16. Mitmachen und Fuss
   ------------------------------------------------------------------------- */
.mmu-mitmachen {
  margin-top: var(--raum-7);
  padding: var(--raum-5);
  border-left: 3px solid var(--mmu-kante);
  background: var(--mmu-flaeche);
  max-width: calc(var(--mmu-register) + var(--mmu-luecke) + var(--mmu-spalte));
}
.mmu-mitmachen h2 {
  margin: 0 0 var(--raum-2);
  font-size: var(--t-prosa);
  font-weight: 600;
}
.mmu-mitmachen p { margin: 0; color: var(--mmu-gedimmt); }

/* Der Fussbereich traegt die Pflichtlinks nach § 5 DDG. Deshalb ruhig, aber
   nicht versteckt — ein Impressum, das niemand findet, erfuellt seinen
   Zweck nicht. Volle Textfarbe, nicht gedimmt. */
/* -------------------------------------------------------------------------
   Die Pinnwand (Handoff v2, Interaktion 3)
   -------------------------------------------------------------------------
   Betreiberentscheidung 30.09.2026: "Pinnwand bauen, Karussell ersetzen".

   🔴 ZWEI ZUSTAENDE, und der erste ist der wichtigere:

     .mmu-pinnwand          eine Liste. So sieht sie ohne JavaScript aus,
                            und so kommt sie aus dem Markup.
     .mmu-pinnwand-aktiv    die Wand. Die Klasse setzt pinnwand.js.

   Wer die zweite Regelgruppe entfernt, bekommt eine brauchbare Liste. Wer
   die erste entfernt, bekommt bei abgeschaltetem JavaScript einen Haufen
   uebereinanderliegender Bilder — deshalb steht die Liste zuerst und die
   Wand ueberschreibt sie, nicht umgekehrt. */
.mmu-pinnwand {
  display: grid;
  gap: var(--raum-5);
  margin-top: var(--raum-4);
}

/* ── Der Anschlag, in beiden Zustaenden ───────────────────────────────── */
.mmu-anschlag {
  position: relative;
  background: var(--mmu-papier);
  color: var(--mmu-papier-text);
  border: 1px solid var(--mmu-papier-kante);
  padding: var(--raum-3);
  box-shadow: 0 6px 14px rgb(0 0 0 / 0.55);
}

/* Der Klebestreifen. Ein schmales, halbdurchsichtiges Rechteck ueber der
   oberen Kante, leicht schief — wie ein Stueck Kreppband.

   ⚠️ pointer-events: none, sonst faengt er den Griff nach dem Blatt ab und
   das Ziehen begaenne nicht, wenn man genau dort anfasst. */
.mmu-anschlag::before {
  content: "";
  position: absolute;
  top: -0.55rem;
  left: 50%;
  width: 4.5rem;
  height: 1.1rem;
  transform: translateX(-50%) rotate(-2deg);
  background: rgb(236 232 223 / 0.55);
  border: 1px solid rgb(185 179 166 / 0.5);
  pointer-events: none;
}

.mmu-anschlag img {
  display: block;
  width: 100%;
  height: auto;
}

.mmu-anschlag-rueck h3 {
  margin: 0 0 var(--raum-2);
  font-family: var(--schrift-prosa);
  font-size: var(--t-gross);
  line-height: 1.2;
}
.mmu-anschlag-rueck dl {
  display: grid;
  grid-template-columns: 4.5rem 1fr;
  gap: 0.2rem var(--raum-3);
  margin: 0 0 var(--raum-3);
  font-size: var(--t-neben);
}
.mmu-anschlag-rueck dt {
  font-family: var(--schrift-ui);
  font-size: var(--t-mikro);
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--mmu-papier-leise);
  align-self: baseline;
}
.mmu-anschlag-rueck dd { margin: 0; }

/* ⚠️ `a.…:any-link` wie bei der Vorzeile oben: `main[class^="mmu-"] a` ist
   (0,1,2) und schlug die blosse Klasse (0,1,0). Gemessen am 03.10.2026,
   nach echtem Umdrehen eines Plakats: rgb(217,96,75) statt #a93226 auf
   Papier, 3,00:1 bei 14 px — AA verlangt 4,5. */
a.mmu-anschlag-mehr:any-link,
.mmu-anschlag-mehr {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  padding-inline: var(--raum-3);
  border: 1px solid var(--mmu-papier-akzent);
  color: var(--mmu-papier-akzent);
  font-family: var(--schrift-ui);
  font-size: var(--t-neben);
  font-weight: 600;
  text-decoration: none;
}
/* 📏 Der Hover brauchte `:any-link:hover` (0,3,1): main[…] a:hover ist
   (0,2,2) und haette (0,2,1) noch geschlagen. Gemessen stand hier
   --mmu-text statt --mmu-papier — auf dem roten Grund beides fast weiss
   (5,41 gegen 5,42), also unsichtbar falsch. Mitgenommen, weil zwei
   Farben, die heute zufaellig gleich aussehen, beim naechsten Wechsel
   auseinanderlaufen. */
a.mmu-anschlag-mehr:any-link:hover,
a.mmu-anschlag-mehr:any-link:focus-visible,
.mmu-anschlag-mehr:hover,
.mmu-anschlag-mehr:focus-visible { background: var(--mmu-papier-akzent); color: var(--mmu-papier); }

/* ── Den Anschlag merken ─────────────────────────────────────────────── */
/* 🔴 Betreiberwunsch 03.10.2026: „ich möchte dass man die Poster im Aushang
   auch auf die Merkliste setzen kann."

   Der Fuss haelt beide Wege nebeneinander: „Zum Konzert" fuehrt weg, das
   Kaestchen behaelt den Termin hier. `wrap`, weil die Rueckseite auf dem
   Telefon nur gut 100 px breit ist — dort stehen sie untereinander. */
.mmu-anschlag-fuss {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--raum-2);
}

/* 📏 PAPIERFARBEN, und das ist an diesem Tag dreimal schiefgegangen: Die
   Rueckseite ist eine Papierflaeche (gemessen rgb(236, 232, 223)). Wer hier
   --mmu-text nimmt (#e8e8ea), schreibt fast weiss auf fast weiss — genau so
   verschwand der Teilknopf der Merkliste und die Playlist-Vorzeile. */
.mmu-anschlag-merken {
  display: inline-flex;
  align-items: center;
  gap: var(--raum-2);
  min-height: 44px;
  padding-inline: var(--raum-2);
  color: var(--mmu-papier-text);
  font-family: var(--schrift-ui);
  font-size: var(--t-neben);
  cursor: pointer;
  /* Der Text soll nicht mitwandern, wenn jemand das Blatt zieht. Das Blatt
     traegt user-select: none; hier steht es nur zur Sicherheit noch einmal,
     weil ein label sonst beim Ziehen eine Auswahl aufzieht. */
  user-select: none;
}

/* 🔵 Das Kaestchen selbst traegt die Akzentfarbe des Papiers, nicht die der
   dunklen Seite. `accent-color` faerbt den Haken ohne Nachbau — ein
   selbstgebautes Kaestchen muesste Tastaturfokus, Zwischenzustand und
   Vorlesesoftware alle von Hand nachstellen. */
.mmu-anschlag-merken input {
  inline-size: 1.1rem;
  block-size: 1.1rem;
  accent-color: var(--mmu-papier-akzent);
  cursor: pointer;
}

/* Gemerkt: Das Wort wird zur Bestaetigung, nicht nur der Haken. Ein Haken
   allein ist auf einem 110 px breiten Blatt leicht zu uebersehen. */
.mmu-anschlag-merken:has(input:checked) {
  color: var(--mmu-papier-akzent);
  font-weight: 600;
}

/* ⚠️ Der Fokusrahmen MUSS hier stehen. Das Blatt selbst ist ein
   Bedienelement mit eigenem Fokus; ohne diese Regel saehe man nicht, ob der
   Rahmen dem Blatt oder dem Kaestchen gilt. */
.mmu-anschlag-merken:has(input:focus-visible) {
  outline: 2px solid var(--mmu-papier-akzent);
  outline-offset: 2px;
}

/* ── Und jetzt die Wand ───────────────────────────────────────────────── */
.mmu-pinnwand-aktiv {
  display: block;
  position: relative;
  /* Handoff: clamp(440px, 95vw, 600px) */
  height: clamp(440px, 95vw, 600px);
  /* 📏 #0b0b10 ist dunkler als --mmu-flaeche (#0f0f15): Die Wand liegt
     HINTER allem anderen, auch hinter den Kacheln. Der Rahmen ist die
     Linienfarbe, nicht die hellere Kante. */
  background: #0b0b10;
  border: 1px solid var(--mmu-linie);
  /* ⚠️ EIN Radialverlauf, nicht zwei. Der Entwurf setzt ein einfaches
     Punktraster in #1c1c22 auf 18px -- zwei versetzte Lagen ergaben ein
     doppelt so dichtes Muster, das bei 22px zusaetzlich groeber steht. */
  background-image: radial-gradient(#1c1c22 1px, transparent 1px);
  background-size: 18px 18px;
  overflow: hidden;

  /* 🔴 DIE PERSPEKTIVE GEHOERT HIERHER, nicht an den Anschlag.
     perspective wirkt auf die KINDER eines Elements. Sass sie am Anschlag
     selbst, beschrieb sie die Tiefe seiner Vorder- und Rueckseite — nicht
     die Tiefe, in der sich der Anschlag dreht. Zusammen mit
     transform-style: preserve-3d am selben Element hat das dazu gefuehrt,
     dass backface-visibility nicht griff: Unter jedem Flyer schaute die
     Rueckseite hervor. Gesehen am Bild, nicht am CSS. */
  perspective: 1000px;
}

.mmu-pinnwand-aktiv .mmu-anschlag {
  position: absolute;
  /* 📏 380 px, und das ist das MAXIMUM -- live durchgemessen, wo die Blaetter
     aus der Wand laufen (1152 x 602 px, Fenster 1467):

       Breite   Hoehe   Ueberstand unten / rechts   Ueberlappungen
        300      394          -94 / -51                  0
        340      447          -65 / -30                  0
        380      499          -36 /  -9                  2   <- gewaehlt
        420      551           -7 / +12  🔴               2
        460      604          +22 / +33  🔴               2

     Ab 420 ragt das rechte Blatt heraus, ab 460 auch das untere. Bei 380
     ueberlappen sich bereits zwei Paare -- ausdruecklich erwuenscht
     (Betreiber 01.10.2026: "duerfen sich auch gerne ein bisschen
     ueberlappen").

     ⚠️ Der Deckel ist die wirksame Zahl, nicht der Prozentwert: 33 % der
     Wand sind bei 1152 px genau 380 px. Erst auf breiteren Schirmen greift
     der Deckel wirklich -- davor begrenzt der Prozentwert.

     🔴 DIE UNTERGRENZE IST 8rem, UND SIE STAMMT AUS DEM ENTWURF.
     Der Prototyp setzt `width: f.w + '%'` (22 bis 27 %) mit
     `min-width: 8rem` — 128 px. Der Prozentwert ist auf 33 % erhoeht
     (Betreiber 01.10.2026: „noch groesser"), die Untergrenze blieb dabei
     unberuehrt bei 128.

     ⚠️ Hier stand bis zum 02.10.2026 `170px`, mit der Begruendung „auf
     schmalen Schirmen soll das Plakat lesbar bleiben". Die Begruendung
     klingt richtig und war MEINE, nicht die des Entwurfs — und sie
     machte den Aushang auf dem Handy unbrauchbar.

     📏 Gemessen, wie viele der drei Plakate ganz in der Wand liegen:

       Wandbreite      mit 170px          mit 8rem
          315 px     185 px,  1 von 3   140 px,  1 von 3  (12 px ueber)
          420 px     185 px,  1 von 3   151 px,  3 von 3
          515 px     185 px,  3 von 3   185 px,  3 von 3

     Ab 515 px sind beide gleich — dort greift ohnehin der Prozentwert.
     Darunter ist 8rem gleich gut oder besser, nie schlechter.

     🔵 Bei 315 px bleiben 12 px Ueberstand an einem Blatt. Das ist
     Absicht und kein Rest: Ein Plakat, das ueber den Rand haengt, sieht
     nach Pinnwand aus. Eine Untergrenze von 6rem brachte alle drei ganz
     hinein, liess sie aber auf 113 px schrumpfen — dann ist das Plakat
     ein Daumennagel. */
  /* 🔴 MAL DEM FAKTOR (Betreiberwunsch 03.10.2026: „ich möchte das man die
     Flyer im Anhang vergrößern und verkleinern kann"). Ohne Skript und vor
     der ersten Aenderung ist er 1, dann steht hier genau der alte Wert.

     📏 Die Grenzen stehen NICHT hier, sondern in pinnwand.mjs
     (`neueGroesse`): Sie haengen an der gemessenen Wandbreite und an der
     Grundbreite des Blattes, und beide schwanken zwischen Telefon und
     Breitbild um das Dreifache. Ein fester Bereich im Stylesheet waere auf
     einem der beiden Enden immer falsch.

     ⚠️ Die Breite und nicht `scale`: scale ist hier schon vergeben (das
     Anheben beim Ziehen) und wuerde auch Schatten, Rand und Anschnitt
     mitziehen.

     🔴 HIER STAND BIS ZUM 12.10.2026 die Begruendung „Gewollt ist ein
     groesseres BLATT, auf dem mehr Platz ist — nicht eine Lupe ueber
     allem." **Das war eine Auslegung der umsetzenden Sitzung, keine
     Betreiberaussage** — der Wunsch vom 03.10. lautete nur „vergrößern und
     verkleinern". Am 12.10.2026 hat der Betreiber sie verworfen: „Ich hätte
     gerne, dass die Schrift nicht immer kleiner wird, wenn man das Blatt
     größer macht." Die Breite bleibt trotzdem der Weg; die Schrift zieht
     jetzt ueber `--mmu-schriftfaktor` mit (siehe Rueckseite, weiter unten).
     ⚠️ Wer hier etwas aendert, prueft dort mit. */
  width: calc(clamp(8rem, 33%, 380px) * var(--mmu-anschlag-gross, 1));
  padding: 0;
  /* Die Mitte des Blattes liegt auf der gespeicherten Stelle, nicht seine
     linke obere Ecke — sonst wandert ein Blatt beim Drehen der Wand. */
  translate: -50% -50%;
  rotate: var(--mmu-anschlag-dreh, 0deg);
  cursor: grab;
  /* 🔴 touch-action NUR hier, und nur weil dieses Element wirklich gezogen
     wird: Ohne die Zeile scrollt das Telefon die Seite, statt das Blatt zu
     bewegen. Auf der Wand selbst duerfte sie nicht stehen — dann kaeme man
     an der Pinnwand vorbei nicht mehr weiter. */
  touch-action: none;
  user-select: none;
  transition: rotate 320ms var(--mmu-feder), scale 200ms var(--mmu-feder),
              box-shadow 200ms var(--mmu-feder), transform 650ms var(--mmu-feder);

  /* 🔴 DAS BLATT DREHT SICH ALS GANZES, nicht seine beiden Seiten einzeln.
     Das ist das bewaehrte Muster und der Grund, warum es jetzt funktioniert:
     Ein Element mit preserve-3d dreht sich, seine Kinder liegen vorn und
     hinten, und backface-visibility entscheidet, welches man sieht.

     ⚠️ Die NEIGUNG (das schiefe Anpinnen) laeuft ueber die Eigenschaft
     rotate, das UMDREHEN ueber transform. Zwei getrennte Eigenschaften, die
     der Browser nacheinander anwendet — deshalb koennen sie sich nicht
     ueberschreiben, und das Blatt bleibt beim Umdrehen schief. Laege beides
     in transform, muesste jede Regel die andere kennen. */
  transform-style: preserve-3d;
}

/* Die Drehung bleibt als Bewegung, entscheidet aber nicht mehr ueber die
   Sichtbarkeit — siehe unten. Wo sie der Browser ausfuehrt, dreht sich das
   Blatt; wo nicht, wechselt der Inhalt trotzdem. */
.mmu-pinnwand-aktiv .mmu-anschlag-umgedreht {
  transform: rotateY(180deg);
}
/* ⚠️ Der Inhalt der Rueckseite wird mitgedreht und stuende spiegelverkehrt,
   wenn die Drehung greift. Die Gegendrehung haelt ihn lesbar. */
.mmu-pinnwand-aktiv .mmu-anschlag-umgedreht .mmu-anschlag-rueck > * {
  transform: rotateY(180deg);
}

.mmu-pinnwand-aktiv .mmu-anschlag:focus-visible {
  outline: 2px solid var(--mmu-akzent-text);
  outline-offset: 4px;
}

.mmu-pinnwand-aktiv .mmu-anschlag-gezogen {
  cursor: grabbing;
  scale: 1.06;
  box-shadow: 0 28px 44px rgb(0 0 0 / 0.85);
  /* Waehrend des Ziehens KEIN Uebergang auf die Drehung: Sie soll der
     Bewegung folgen, nicht ihr hinterherlaufen. */
  transition: scale 200ms var(--mmu-feder), box-shadow 200ms var(--mmu-feder);
}

/* ── Vorder- und Rueckseite ───────────────────────────────────────────── */
/* 🔴 DER WECHSEL LAEUFT UEBER SICHTBARKEIT, nicht ueber die Drehung — und
   das ist eine Behebung, kein Entwurf.

   Die erste Fassung verliess sich darauf, dass der Anschlag sich dreht:
   Beide Seiten trugen backface-visibility: hidden, die Rueckseite zusaetzlich
   eine eigene 180-Grad-Drehung. Solange der Elternteil sich nicht dreht, ist
   sie damit DAUERHAFT unsichtbar. Das Umdrehen setzte brav seine Klasse und
   bewirkte nichts.

   ⚠️ Das Tueckische daran: Es gab keine Fehlermeldung, keinen sichtbaren
   Unterschied und keinen roten Test. Die Pinnwand sah fertig aus, und die
   Rueckseite mit Datum, Ort und Bands war schlicht nicht erreichbar.

   Warum die Drehung nicht griff, ist ungeklaert. Gemessen ist nur, dass ein
   eigenstaendiger Pruefaufbau mit rotateY(180deg) im selben Browser eine
   korrekte matrix3d ergibt — 3D geht also, und der Fehler lag hier.

   🎯 Die Lehre, die bleibt: Ein Effekt, der auf einer anderen Eigenschaft
   AUFBAUT, faellt lautlos aus, wenn diese nicht wirkt. Die Sichtbarkeit
   haengt jetzt an der Klasse und an nichts sonst. */
.mmu-pinnwand-aktiv .mmu-anschlag-rueck {
  position: absolute;
  inset: 0;
  padding: var(--raum-3);
  overflow: auto;
  background: var(--mmu-papier);
  visibility: hidden;
}
.mmu-pinnwand-aktiv .mmu-anschlag-umgedreht .mmu-anschlag-rueck {
  visibility: visible;
}
/* ⚠️ Die Vorderseite muss WEICHEN, nicht nur ueberdeckt werden: Sie ist
   hoeher als ihr Bild (die Bildunterschrift haengt darunter) und schaute
   sonst unten hervor. */
.mmu-pinnwand-aktiv .mmu-anschlag-umgedreht .mmu-anschlag-blatt {
  visibility: hidden;
}

/* 🔴 Das umgedrehte Blatt WAECHST, und das ist keine Zierde: Ein Flyer ist
   schmal (clamp bis 210px), die Rueckseite traegt Titel, Datum, Ort, Bands
   und einen Knopf. Bei Flyerbreite brach der Titel nach zwei Woertern um und
   der Rest verschwand hinter einem Rollbalken — lesbar nur fuer den, der
   auf einem 150px breiten Papierschnipsel scrollt.

   Es entspricht auch der Bewegung: Man nimmt das Blatt auf, um es zu lesen. */
.mmu-pinnwand-aktiv .mmu-anschlag-umgedreht {
  /* 🔴 AUCH HIER DER FAKTOR. Diese Regel hat dieselbe Spezifitaet wie die
     Grundbreite oben (beide 0,2,0) und steht spaeter — sie gewinnt also,
     sobald das Blatt umgedreht ist.

     📏 Live gemessen am 03.10.2026: Der Faktor stand auf 1,15, die
     Variable war am Element sichtbar, und die Breite blieb bei 252 px.
     Wer ein Blatt umdreht und dann vergroessert, sah nichts geschehen.

     ⚠️ Vierter Fall desselben Musters an diesem Tag: Eine Regel steht da
     und gewinnt nicht. Wer die Grundbreite aendert, muss diese hier
     mitaendern — die Zusage „jede Breite des Anschlags nimmt den Faktor
     auf" prueft beide. */
  width: calc(clamp(190px, 38%, 300px) * var(--mmu-anschlag-gross, 1));
  min-height: 15rem;
  z-index: 40;
}
.mmu-pinnwand-aktiv .mmu-anschlag-umgedreht .mmu-anschlag-rueck {
  overflow: auto;
}
/* 🔴 DIE SCHRIFT WAECHST MIT DEM BLATT (Betreiberwunsch 12.10.2026: „Ich
   hätte gerne, dass die Schrift nicht immer kleiner wird, wenn man das
   Blatt größer macht").

   ⚠️ Das kehrt eine Auslegung vom 03.10.2026 um, nicht eine Entscheidung.
   Der Betreiberwunsch lautete damals nur „ich möchte das man die Flyer im
   Anhang vergrößern und verkleinern kann"; die Umsetzung waehlte `width`
   statt `scale` und begruendete das mit „Gewollt ist ein groesseres BLATT,
   auf dem mehr Platz ist — nicht eine Lupe ueber allem" (Kommentar weiter
   oben, bei der Breite). **Dieses „gewollt" war eine Annahme der
   umsetzenden Sitzung.** Der Betreiber wollte die Lupe.

   📏 Gemessen am 12.10.2026 auf der Live-Seite, vorher:

       Faktor   Blatt      Schrift (Blatt / h3 / dt / dd)
          1     418 px     13 / 17 / 12 / 13 px
          2     835 px     13 / 17 / 12 / 13 px   ← unveraendert

   Das Blatt verdoppelt sich, die Schrift steht still und halbiert sich
   dadurch im Verhaeltnis.

   🔴 NUR NACH OBEN, und das ist der Grund fuer `max(1, …)`: `neueGroesse()`
   in pinnwand.mjs laesst den Faktor bis **0,5** fallen (`Math.max(0.5,
   90/grundBreite)`). Proportional mitgezogen waere die Grundschrift dort
   6,5 px — unlesbar. Unterhalb der Grundgroesse bleibt die Schrift
   deshalb, wie sie heute ist; verschlechtert wird nichts, was jetzt
   funktioniert. Nach oben deckelt `neueGroesse()` bei 3.

   ⚠️ Die Bezeichnerspalte muss mit: Waechst die Schrift und die Spalte
   nicht, bricht „DATUM" in zwei Zeilen. */
.mmu-pinnwand-aktiv .mmu-anschlag {
  --mmu-schriftfaktor: max(1, var(--mmu-anschlag-gross, 1));
}
/* Auf der Rueckseite ist Platz knapp: eine Stufe kleiner als im Fliesstext,
   und die Bezeichnerspalte schmaler. */
.mmu-pinnwand-aktiv .mmu-anschlag-rueck h3 {
  font-size: calc(var(--t-prosa) * var(--mmu-schriftfaktor, 1));
}
.mmu-pinnwand-aktiv .mmu-anschlag-rueck dl {
  grid-template-columns: calc(3.4rem * var(--mmu-schriftfaktor, 1)) 1fr;
  font-size: calc(var(--t-klein) * var(--mmu-schriftfaktor, 1));
}
/* 🔴 Die folgenden Regeln stehen hier und nicht bei den Grundregeln weiter
   oben: Dort gelten sie auch ausserhalb der Pinnwand, wo es keinen Faktor
   gibt. */
.mmu-pinnwand-aktiv .mmu-anschlag-rueck dt {
  font-size: calc(var(--t-mikro) * var(--mmu-schriftfaktor, 1));
}
/* 🔴 `a…:any-link` MUSS hier stehen, und das ist gemessen, nicht gelesen:
   Eine erste Fassung schrieb schlicht `.mmu-pinnwand-aktiv
   .mmu-anschlag-mehr` — (0,2,0) — und die Schrift des Knopfes blieb bei
   14 px stehen, waehrend h3, dt und dd sauber mitwuchsen. Der Grund steht
   weiter oben bei der Grundregel: `a.mmu-anschlag-mehr:any-link` ist
   **(0,2,1)**, die Pseudoklasse zaehlt wie eine Klasse mit. Erst mit
   `a…:any-link` und dem Pinnwand-Kontext wird daraus (0,3,1).

   ⚠️ `.mmu-anschlag-merken` braucht das NICHT — das ist ein `label` ohne
   `:any-link`-Regel, dort genuegt (0,2,0) gegen (0,1,0). Beide Zeilen
   zusammenzufassen waere also falsch: Der Knopf braucht mehr Gewicht als
   das Kaestchen, und ein gemeinsamer Selektor haette entweder zu wenig
   davon oder beim Kaestchen mehr als noetig. */
.mmu-pinnwand-aktiv a.mmu-anschlag-mehr:any-link {
  font-size: calc(var(--t-neben) * var(--mmu-schriftfaktor, 1));
}
.mmu-pinnwand-aktiv .mmu-anschlag-merken {
  font-size: calc(var(--t-neben) * var(--mmu-schriftfaktor, 1));
}

.mmu-pinnwand-aufraeumen {
  margin-top: var(--raum-3);
  min-height: 44px;
  padding-inline: var(--raum-4);
  background: none;
  border: 1px solid var(--mmu-kante);
  /* 📏 Nach dem Entwurf: Textfarbe statt gedimmt, 0.8125rem, 600,
     0.08em gesperrt, Versalien. Gemessen waren 0.875rem, 400, ungesperrt
     -- der Knopf las sich wie ein Hinweis statt wie eine Schaltflaeche. */
  color: var(--mmu-text);
  font-family: var(--schrift-ui);
  font-size: var(--t-klein);
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  cursor: var(--mmu-zeiger-klick);
  cursor: var(--mmu-zeiger-klick-hidpi);
}
.mmu-pinnwand-aufraeumen:hover,
.mmu-pinnwand-aufraeumen:focus-visible { color: var(--mmu-text); border-color: var(--mmu-text); }

/* ⚠️ Bei reduzierter Bewegung meldet sich das Skript gar nicht erst an, die
   Wand entsteht also nicht. Diese Regel fasst den Fall, dass die Klasse aus
   anderem Grund dasteht — etwa weil jemand sie im Editor gesetzt hat. */
@media (prefers-reduced-motion: reduce) {
  .mmu-pinnwand-aktiv .mmu-anschlag { transition: none; rotate: 0deg; }
  /* ⚠️ Das Umdrehen selbst bleibt moeglich — nur ohne Uebergang. Wer
     Bewegung abbestellt hat, soll die Rueckseite trotzdem lesen koennen;
     sie traegt Datum, Ort und Bands. */
  .mmu-pinnwand-aktiv .mmu-anschlag-umgedreht { transition: none; }
}

/* -------------------------------------------------------------------------
   Die Blaetter-Navigation mit Eselsohr (Handoff v2, Interaktion 2)
   -------------------------------------------------------------------------
   "Unter jeder Seite Blaetter-Navigation mit Eselsohr-Ecke (Verlauf Papier →
   Schwarz) fuer vor/zurueck."

   Die Ecke ist keine Zierde, sie ist die Richtungsangabe: Beim
   Vorwaertsblaettern knickt die Ecke rechts unten, beim Zurueckblaettern
   links unten — dort, wo der Daumen das Blatt anhebt. Wer nur die Form
   sieht und den Text nicht liest, weiss trotzdem, wohin es geht.

   ⚠️ Deshalb steht die Richtung ZUSAETZLICH als Wort da ("Vorige Seite" /
   "Nächste Seite"). Eine geknickte Ecke ist eine hübsche Andeutung und keine
   Beschriftung; sie allein waere fuer eine Vorlesesoftware gar nichts.

   Auf Seiten ohne Rubrik gibt mmu_blaetter_html() nichts aus — dort greift
   keine dieser Regeln, und der Fuss schliesst an wie bisher. */
.mmu-blaettern {
  display: flex;
  justify-content: space-between;
  gap: var(--raum-4);
  margin-top: var(--raum-7);
}

/* Der leere Platzhalter haelt die verbleibende Seite an ihrem Ort. Ohne ihn
   ruetschte der einzelne Link am Anfang und am Ende des Hefts nach links,
   und der Leser haette den Eindruck, es habe sich etwas verschoben. */
.mmu-blaettern-leer {
  flex: 1 1 0;
}

.mmu-blaettern a {
  flex: 1 1 0;
  max-width: 22rem;
  display: flex;
  /* 📐 Ecke und Text stehen NEBENeinander und sitzen auf einer Grundlinie
     unten -- die Ecke ist ein umgeknicktes Blatt, kein Symbol ueber der
     Schrift. Bis zum 01.10.2026 stand hier column, und die Ecke war ein
     Hintergrund, der gar keinen Platz brauchte. */
  align-items: flex-end;
  gap: 0.6rem;
  /* Trefferflaeche ueber dem Mindestmass von 44px (Handoff v2). */
  min-height: 3.5rem;
  color: var(--mmu-gedimmt);
  text-decoration: none;

  /* 🔴 KEIN PAPIERKASTEN. Im Entwurf (Bildschirmfotos vom 01.10.2026)
     steht die Blaetter-Navigation dezent auf dem Seitengrund: graue
     Vorzeile, Seitenname darunter, daneben ein helles Dreieck als
     umgeknickte Blattecke. Bis dahin war sie ein heller Papierkasten
     ueber die volle Breite — gut gebaut, aber nicht der Entwurf.

     🔵 Das Eselsohr bleibt, nur umgekehrt: Vorher nahm ein Dreieck in der
     Grundfarbe dem Papier die Ecke weg; jetzt LIEGT das Dreieck als
     helle Flaeche auf dem dunklen Grund. Dieselbe Technik (zwei
     Verlaufslagen statt clip-path, damit nur die Flaeche eine Ecke
     bekommt und nicht der Text beschnitten wird), andere Richtung. */
  background: none;
  border: 0;
  transition: transform 260ms var(--mmu-feder), box-shadow 260ms var(--mmu-feder);
}

/* 🔴 DIE PAPIERECKE. Drei Stufen, nicht eine Farbe: Papier an der
   Aussenkante, die Papierkante als schmaler Grat bei 49 %, ab 50 % der
   Seitengrund. Das liest sich als umgeknickte Blattecke, bei der man auf
   die Rueckseite des Papiers sieht -- eine einfarbige Flaeche waere ein
   Dreieck, kein Knick.

   ⚠️ Der harte Sprung bei 49/50 % ist Absicht. Ein weicher Verlauf ueber
   die ganze Flaeche ergaebe einen Farbkeil; die Knickkante braucht eine
   Kante. */
.mmu-blaettern-ecke {
  flex: none;
  width: 44px;
  height: 44px;
  background: linear-gradient(45deg,
    var(--mmu-papier) 0, var(--mmu-papier-kante) 49%, var(--mmu-grund) 50%);
}

/* Der Text steht als Raster: Vorzeile ueber dem Namen, ohne Abstand. */
.mmu-blaettern-text { display: grid; }

/* Zurueck steht links und liest sich von links. */
.mmu-blaettern-zurueck { text-align: left; }

/* 🔵 Vorwaerts ist das groessere Blatt: 52 statt 44 px, mit Schatten nach
   oben links. Der Entwurf hebt die Richtung hervor, in die man weiterliest
   -- dasselbe Mittel wie bei der Rubrikenleiste, nur leiser. */
.mmu-blaettern-vor {
  text-align: right;
  justify-content: flex-end;
}
.mmu-blaettern-vor .mmu-blaettern-ecke {
  width: 52px;
  height: 52px;
  background: linear-gradient(315deg,
    var(--mmu-papier) 0, var(--mmu-papier-kante) 49%, var(--mmu-grund) 50%);
  box-shadow: -3px -3px 8px rgb(0 0 0 / 0.6);
}

/* ⚠️ Die Vorzeile ist GEDIMMT, nicht rot. Sie beschriftet die Richtung;
   der Seitenname darunter ist die Auskunft. Bis zum 01.10.2026 stand sie
   in der Papier-Akzentfarbe und rief lauter als ihr eigener Gegenstand. */
.mmu-blaettern-richtung {
  font-family: var(--schrift-ui);
  font-size: 0.6875rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--mmu-gedimmt);
}
/* 📏 1.0625rem und 700 nach dem Entwurf; --t-gross waeren 1.375rem. */
.mmu-blaettern-ziel {
  font-family: var(--schrift-prosa);
  font-size: 1.0625rem;
  font-weight: 700;
  line-height: 1.15;
  color: var(--mmu-text);
}

/* Das Blatt hebt sich an, wenn man danach greift. Der Schatten aus dem
   Handoff ("ruhend 0 6px 14px rgba(0,0,0,.55), angehoben 0 14px 26px"). */
.mmu-blaettern a:hover,
.mmu-blaettern a:focus-visible {
  transform: translateY(-3px);
  box-shadow: 0 14px 26px rgb(0 0 0 / 0.7);
}

@media (prefers-reduced-motion: reduce) {
  .mmu-blaettern a { transition: none; }
  .mmu-blaettern a:hover,
  .mmu-blaettern a:focus-visible { transform: none; }
}

/* Unter rund 34rem stehen die beiden Seiten uebereinander — nebeneinander
   blieben fuer zwei Rubriknamen zu wenig Zeichen. */
@media (max-width: 34rem) {
  .mmu-blaettern { flex-direction: column; }
  .mmu-blaettern-leer { display: none; }
  .mmu-blaettern a { max-width: none; }
}

/* 📐 Der Entwurf setzt 1.5rem Abstand und 0.75rem Polster oben: Der Fuss
   haengt am Doppelstrich, er steht nicht als eigener Block darunter.
   Gemessen waren 48 px Abstand und 24 px Polster. Unten bleibt Luft,
   damit die Merkliste nicht auf dem letzten Link klebt. */
.mmu-fuss {
  margin-top: 1.5rem;
  padding-block: 0.75rem var(--raum-7);

  /* Zeitungsdesign (Handoff, Abschnitt "Fusszeile"): 3px double statt der
     einfachen Linie — dieselbe Trennung wie unter der Rubrikenleiste. Der
     Fuss schliesst den Satzspiegel damit so ab, wie der Kopf ihn oeffnet. */
  border-top: 3px double var(--mmu-kante);

  /* Grundsatz links, Rechtslinks rechts; bei schmalem Fenster untereinander.
     flex-wrap statt fester Spalten — der Handoff verlangt fuer v2
     durchgehende Responsivitaet ohne feste Spaltenzahlen. */
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--raum-2) var(--raum-6);
}

/* ⚠️ Der Satz traegt einen DOPPELPUNKT, keinen Geviertstrich. Der Handoff
   schreibt "teufelstritt.de — ohne fremde Server" vor; der Strich ist seit
   dem 25.09.2026 aus der ganzen Seite verbannt (schema.md 6.9), und eine
   Design-Vorgabe hebt eine Betreiberentscheidung nicht auf.
   Betreiberentscheidung 30.09.2026: "und der Doppelpunkt setzen". */
.mmu-fuss-grundsatz {
  margin: 0;
  font-size: var(--t-neben);
  color: var(--mmu-gedimmt);
}

.mmu-fuss-nav {
  display: flex;
  flex-wrap: wrap;
  gap: var(--raum-2) var(--raum-6);
  font-size: var(--t-neben);
}
.mmu-fuss a { color: var(--mmu-text); text-underline-offset: 0.18em; }
.mmu-fuss a:hover { color: var(--mmu-akzent-text); }

/* -------------------------------------------------------------------------
   17. Blaettern
   ------------------------------------------------------------------------- */
.wp-block-query-pagination,
.navigation.pagination {
  margin: var(--raum-6) 0;
  font-size: var(--t-neben);
  border-top: 1px solid var(--mmu-linie);
  padding-top: var(--raum-4);
}
.navigation.pagination .nav-links { display: flex; flex-wrap: wrap; gap: var(--raum-2); }
.navigation.pagination .page-numbers {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  /* 🔴 44px UND NICHT 2.25rem (36px). Der Handoff v3 verlangt für die
     Seitennummerierung ausdrücklich „44-px-Kästchen", und 44px ist die
     Mindest-Trefferfläche jeder Bedienfläche dieser Seite.

     ⚠️ Es gibt zwei Regeln für dieselben Kästchen, und beide haben
     Spezifität (0,3,0):
       Zeile 3710  .mmu-archiv .pagination .page-numbers   44px
       hier        .navigation.pagination .page-numbers    36px
     Bei gleicher Spezifität entscheidet die Position — und diese steht
     1270 Zeilen später. Die v3-Regel sah richtig aus und verlor.
     Live gemessen: 38px (36 plus zweimal 1px Rahmen).

     🔵 Hier geändert und nicht oben: Diese Regel ist die allgemeine, sie
     greift auch auf Seiten ohne `.mmu-archiv`. Eine Trefferfläche von
     36px ist dort genauso zu klein. */
  min-width: 44px;
  min-height: 44px;
  padding: 0 var(--raum-2);
  border: 1px solid var(--mmu-linie);
  text-decoration: none;
  /* 🔵 Die Zahlen sind LINKS und tragen die Akzentfarbe wie jeder andere.
     Gedimmt sahen sie aus wie abgeschaltet -- und die aktive Seite, die
     auf Papier steht, hebt sich auch gegen Rot deutlich genug ab. */
  color: var(--mmu-akzent-text);
  font-variant-numeric: tabular-nums;
}
.navigation.pagination .page-numbers:hover { border-color: var(--mmu-kante); }
/* 🔴 Die aktuelle Seite steht auf Papier — dieselbe Sprache wie der Knopf
   des Status-Schiebers. Fuer JEDE Seitenart, nicht nur im Archiv: Die
   Vorlage („Seitennummerierung … aktuelle Seite auf Papier") macht da
   keinen Unterschied, und /konzerte/ zeigte bis zum 01.10.2026 gar kein
   Papier, weil die Regel an `.mmu-archiv` hing.

   ⚠️ DIESE REGEL IST DIE EINZIGE FUER DEN ZUSTAND, und das ist Absicht.
   Vorher gab es zwei mit gleicher Spezifitaet (je 0,4,0), die einander
   teilweise ueberschrieben: Der Hintergrund kam aus der frueheren, die
   Schriftfarbe aus der spaeteren. Das Ergebnis war Akzentrot auf Papier.
   📏 Gemessen am 01.10.2026 auf /bands/: rgb(217,96,75) auf
   rgb(236,232,223) = 3,00:1 — waehrend der Kommentar daneben 14,62:1
   auswies. Die Rechnung stimmte, nur kamen die beiden Werte nie zusammen.
   📏 --mmu-papier-text auf --mmu-papier ergibt die 14,62:1 wirklich. */
.navigation.pagination .page-numbers.current {
  background: var(--mmu-papier);
  border-color: var(--mmu-papier-kante);
  color: var(--mmu-papier-text);
  font-weight: 700;
}
/* Die Auslassung ist keine Bedienflaeche: kein Rahmen, kein Zeiger. */
.navigation.pagination .page-numbers.dots {
  border-color: transparent;
  min-width: auto;
}
.navigation.pagination .screen-reader-text {
  position: absolute;
  width: 1px; height: 1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
}

/* =========================================================================
   18. Schmale Schirme
   =========================================================================
   Zwei Umbruchpunkte statt einem. Bei 60rem faellt das Register weg — das
   betrifft Bandseite und Belegapparat. Bei 40rem stapeln die Rasterlisten
   zu Bloecken. Ein einziger Punkt fuer beides hiesse, das vierspaltige
   Konzertraster bis 40rem zu quetschen. */

@media (max-width: 60rem) {
  /* Das grosse Blatt nimmt die volle Breite, die kleine Reihe rutscht
     darunter. Die Rangfolge bleibt, sie liegt nur nicht mehr daneben. */
  .mmu-aushang-wand { grid-template-columns: 1fr; }

  /* Wie die Datenkarte: Das Register wandert ueber den Wert, statt eine
     9,5rem-Spalte neben zwei Woertern zu halten. */
  .mmu-vereinsangaben { grid-template-columns: 1fr; gap: 0; }
  .mmu-vereinsangaben dt { margin-top: var(--raum-2); }
  .mmu-vereinsangaben dt:first-of-type { margin-top: 0; }

  /* Das Register wandert ueber den Inhalt: aus zwei Spalten wird eine
     Folge aus Bezeichner und Wert. Die Struktur bleibt lesbar, sie liegt
     nur nicht mehr nebeneinander. */
  .mmu-datenkarte,
  .mmu-quellen,
  .mmu-kanaele,
  .mmu-bandgigs {
    display: block;
  }

  .mmu-datenkarte dt {
    border-top: 1px solid var(--mmu-linie);
    padding-bottom: 0;
  }
  .mmu-datenkarte dt:first-of-type { border-top: 0; }
  .mmu-datenkarte dd {
    border-top: 0;
    padding-top: 0;
    padding-bottom: var(--raum-3);
  }

  .mmu-quellen > h2,
  .mmu-bandgigs > h2,
  .mmu-kanaele > h2 { margin-bottom: var(--raum-3); }
  .mmu-quellen > ol { padding-left: 1.4em; }

  .mmu-portraet,
  .mmu-kein-portraet,
  .mmu-band-fotos,
  .mmu-kanaele:not(:has(> h2)) { margin-left: 0; }

  .mmu-gigzahl { display: inline; margin-left: var(--raum-3); }

  /* Zurueck auf zwei Spalten: Die dritte Spalte lohnt sich nur, solange
     wirklich Platz neben den Symbolen bleibt. Gerechnet bei 60rem = 960px:
     16rem Name (256px) plus bis zu vier Symbole (rund 190px) lassen dem
     laengsten Zeitenband des Bestands — dem der [[X-Bar]] mit 88 Zeichen —
     zu wenig Breite; es zerfiele in vier kurze Zeilen und machte die Zeile
     hoeher als die Symbole.

     Die Zeiten ruecken deshalb unter die SYMBOLE (Spalte 2), nicht unter den
     Namen: Ohne diese Zuweisung faenden sie von selbst in Spalte 1 und
     stuenden wieder in der schmalsten Spalte der Zeile — genau der Zustand,
     den die dritte Spalte oben abgeloest hat.

     ⚠️ Unter 40rem stapelt die Zeile einspaltig (Regel weiter unten) — dort
     muss `grid-column: 2` ausdruecklich zurueckgenommen werden. Es waere
     sonst KEINE wirkungslose Anweisung: In einem einspaltigen Raster legt
     Grid fuer Spalte 2 eine implizite Spalte an, und die Zeiten saessen als
     schmale Saeule NEBEN dem gestapelten Rest statt darunter. Die
     Ruecknahme steht im 40rem-Block. */
  .mmu-orte .mmu-liste li { grid-template-columns: 16rem minmax(0, 1fr); }
  /* ⚠️ `grid-row` MUSS hier mit zurueckgenommen werden, nicht nur die Spalte.
     Die Regel oben laesst den Block ueber beide Zeilen laufen, damit er auf
     Hoehe des Namens beginnt. Bliebe das hier stehen, traefe er in Spalte 2
     auf die Symbole, die dort in Zeile 2 sitzen — zwei Elemente in derselben
     Zelle, sichtbar als uebereinandergedruckte Zeiten. Dieselbe Sorte Fehler
     wie beim `grid-column: 2` im 40rem-Block darunter: eine Anweisung, die
     ihren Bezugsrahmen verloren hat und trotzdem weiterwirkt. */
  .mmu-orte .mmu-oeffnungszeiten { grid-column: 2; grid-row: auto; align-self: auto; }

  /* -----------------------------------------------------------------------
     Festivalliste (§11b) — hier und nicht bei 40rem.
     -----------------------------------------------------------------------
     Diese Liste bricht bei 60rem um, NICHT bei den 40rem der uebrigen —
     und das ist gemessen, nicht geschaetzt. Die vier Spalten aus §11b brauchen zusammen
     96px Blatt + 200px Symbole + 224px Status + Abstaende; was uebrig bleibt,
     faellt der Namensspalte zu, und die traegt minmax(0, 1fr), schrumpft also
     bis auf null. Gemessen ueber die Breite (Playwright, teufelstritt.de):

       641px → Namensspalte   0px, Name auf 3 Zeilen
       700px →               38px, 3 Zeilen
       760px →               92px, 2 Zeilen
       820px →              146px, 2 Zeilen
       880px →              200px, 1 Zeile

     Bei 40rem (640px) umzuschalten haette den Fehler also nur um einen Pixel
     verschoben. Ab 880px traegt die Namensspalte wieder eine Zeile — bei 900px
     sind es 218px, und darin bricht KEINER der 27 Namen um, auch nicht „Pure
     Fucking Metal Festevil“ (nachgemessen ueber alle .mmu-festivalname).

     Genommen ist trotzdem 60rem und nicht die gemessenen 56rem: „Keine neuen
     Umbruchpunkte“ ist Hausregel (GESTALTUNG.md), 60rem gibt es schon, und
     zwischen 897px und 960px ist der Unterschied Informationsdichte, nicht
     Lesbarkeit — beide Fassungen stehen dort sauber. Ein Umbruchpunkt
     weniger ist der Wartung mehr wert als vier Spalten auf einem schmalen
     Notebook.
  */
  /* Die Festivalliste stapelt NICHT von selbst — sie braucht diesen Block.
     -----------------------------------------------------------------------
     ⚠️ Genau die Falle, die der Kommentar bei ":where(.mmu-archiv)
     .mmu-liste li" oben beschreibt, nur diesmal eingetreten: Die Regeln in
     §11b tragen 0-2-1 und schlagen damit die allgemeine Stapelregel
     `.mmu-liste li` im 40rem-Block (0-1-1) — eine Media Query erhoeht die
     Spezifitaet nicht. §11b hat sie deshalb ueberfahren, und deshalb steht
     hier jede Zuweisung noch einmal ausdruecklich.

     Gemessen am 24.08.2026 auf Betreibermeldung "Sieht auf dem Handy nicht
     gut aus", Playwright bei 390px: Das Raster loeste sich zu
     "96px 0px 200px 160px" auf. Die NAMENSSPALTE stand auf null — jedes
     Wort brach auf eine eigene Zeile ("Metal / im / Woid") —, und die Seite
     baute 498px statt 390px, wodurch der Statusblock rechts abgeschnitten
     war. /venues/ und /bands/ standen daneben sauber auf einer Spalte; der
     Fehler war allein in §11b.

     Gewaehlt: EINE Textspalte, das Plakat als schmale Spalte links daneben.
     Nicht ganz stapeln (Plakat oben, Text darunter) — das Blatt bekaeme
     dann die volle Breite und draengte den Text um eine halbe Telefonhoehe
     nach unten, bei 27 Festivals in der Liste. Nicht schmaler als 6rem: Das
     ist dasselbe Mass wie am grossen Schirm, und ein Klick vergroessert es
     ohnehin.

     ⚠️ Die Zuweisungen aus §11b muessen einzeln zurueckgenommen werden, nicht
     nur die Spaltenzahl — sonst stuenden die Kinder weiter in Spalte 3 und 4
     eines Rasters, das nur noch zwei hat. `grid-row: auto` laesst sie
     stattdessen der Reihe nach fliessen; die drei festen Zeilen aus §11b
     (Name/Ort/Genre) gelten hier nicht mehr, weil bis zu fuenf Kinder
     untereinander stehen. */
  .mmu-festivals .mmu-liste li { grid-template-columns: minmax(0, 1fr); }
  .mmu-festivals .mmu-mit-plakaten li { grid-template-columns: 6rem minmax(0, 1fr); }
  .mmu-festivals .mmu-liste li > *,
  .mmu-festivals .mmu-mit-plakaten li > * { grid-column: 1; grid-row: auto; }
  /* 0-3-1 — muss `.mmu-festivals .mmu-mit-plakaten .mmu-festivalstatus`
     (0-3-0, §11b, Spalte 4) schlagen, deshalb das :not() und nicht ein
     zweiter Klassenselektor. */
  .mmu-festivals .mmu-mit-plakaten li > *:not(.mmu-plakat) { grid-column: 2; }
  /* span 5: mehr Kinder kann ein <li> nicht haben (Name, Ort, Genre,
     Symbole, Statusblock — siehe archive-mmu_event.php). Ueberzaehlige
     gespannte Zeilen bleiben leer und 0 hoch; zu WENIG gespannte liessen
     das Blatt auf Zeile eins schrumpfen. */
  .mmu-festivals .mmu-mit-plakaten .mmu-plakat { grid-column: 1; grid-row: 1 / span 5; }
}

@media (min-width: 60rem) {
  .mmu-start-einstiege { grid-template-columns: repeat(4, minmax(0, 1fr)); }
  /* 🔴 DIE PLAYLIST SPANNT NICHT MEHR — sie steht wie jede andere Kachel in
     EINER Spalte, und die letzte Position der Reihe bleibt leer. So zeigt
     es der Entwurf (Bildschirmfoto des Betreibers, 01.10.2026): vier
     Kacheln oben, drei unten, rechts daneben nichts.

     ⚠️ Bis dahin rechnete front-page.php aus, wie viele Zellen frei
     bleiben, und gab es als --mmu-playlist-spalten mit — bei sechs
     Bereichen und vier Spalten waren das zwei. Die Rechnung war richtig
     und loeste ein Problem, das der Entwurf gar nicht kennt: Er laesst die
     Luecke stehen.

     🔵 Die Variable wird nicht mehr gelesen; die Rechnung in der Vorlage
     ist mit entfernt worden. Eine Zahl, die niemand liest, waere sonst
     beim naechsten Lesen eine Suche wert. */
}

@media (max-width: 40rem) {
  .mmu-start-einstiege { grid-template-columns: 1fr; }

  /* Die Datumszeile stapelt, statt drei Spalten zu quetschen. Gemessen bei
     375px: 78 / 135 / 63 Pixel, jede der drei Angaben brach mehrzeilig um
     und die Zeile stand 77 Pixel hoch — aus einer ruhigen Zeitungszeile
     wurde ein Block.

     Kein neuer Umbruchpunkt, sondern der vorhandene: Der Entwurf fuehrt
     ueberhaupt kein Mobilverhalten aus, der Bestand stapelt bei 40rem.
     Zentriert statt linksbuendig, weil der ganze Kopf zentriert ist. */
  .mmu-kopf-daten { display: block; text-align: center; }
  .mmu-kopf-daten > span { display: block; }

  /* Die Ausrichtung auf die Wortmarke faellt hier weg. Der Versatz betraegt
     88px und ist NICHT von der Fensterbreite abhaengig — bei 375px waeren
     das ein knappes Viertel der Zeile. Die Unterzeile ist dort rund 300px
     breit und liefe rechts aus dem Bild, statt bloss schief zu stehen.
     Zwischen "leicht ausser Mitte" und "abgeschnitten" ist die Wahl leicht. */
  .mmu-kopf-unterzeile { padding-inline-start: 0; }

  /* Der fuellende Doppelstrich verschwindet bei langen Ueberschriften.
     Gemessen bei 375px an "München · 1 – Altstadt-Lehel": Der Name allein
     braucht die volle Zeilenbreite und bricht auf zwei Zeilen um, der
     Fuellstrich daneben wird auf 0px zusammengedrueckt — unsichtbar, aber
     nicht entfernt, ein totes Element in einer ohnehin schon zweizeiligen
     Ueberschrift. Ein einzelner Bezirksname wie "München · 2 –
     Ludwigsvorstadt-Isarvorstadt" ist NICHT kuerzer zu erwarten, der Punkt
     gilt fuer jede Bezirksueberschrift, nicht nur die gemessene.

     Statt einer verschwindenden Linie: Block-Layout mit eigenem
     border-bottom, wie der Kolumnentitel es vor der Zeitungsoptik schon
     tat. Betrifft .mmu-lage UND .mmu-kalender h2, die sich beide den
     Fuellstrich teilen — kein neuer Umbruchpunkt, der vorhandene 40rem-Punkt
     dieses Abschnitts. */
  .mmu-lage,
  .mmu-kalender h2 {
    display: block;
    padding-bottom: var(--raum-2);
    border-bottom: 1px solid var(--mmu-kante);
  }
  .mmu-lage .mmu-fuellstrich,
  .mmu-kalender h2 .mmu-fuellstrich { display: none; }

  /* ⚠️ Die Ortsliste stapelt hier jetzt DOCH — der Absatz bei
     .mmu-orte .mmu-liste li begruendet das Gegenteil, und diese Begruendung
     ist seit dem 13.08.2026 ueberholt: Damals trug die Zeile einen Namen und
     EIN Anfahrtssymbol, die nebeneinander bequem passten. Jetzt tragen bis zu
     vier Symbole daneben. Gemessen bei 375px: Die feste Namensspalte liess
     der Gruppe 55 Pixel, sie stapelte senkrecht und die Zeile wurde 81 Pixel
     hoch.

     Gleiche Spezifitaet wie die Regel oben (0-2-1), aber spaeter im
     Stylesheet — deshalb gewinnt sie. Das :where() der Bandliste braucht es
     hier nicht. */
  .mmu-orte .mmu-liste li {
    grid-template-columns: 1fr;
    gap: var(--raum-2);
    align-items: start;
  }

  /* Ruecknahme der Spaltenzuweisung aus dem 60rem-Block. Ohne sie legte Grid
     hier eine implizite zweite Spalte an, und die Oeffnungszeiten stuenden
     als schmale Saeule neben dem gestapelten Rest — die Zeile waere breiter
     als der Schirm. */
  .mmu-orte .mmu-oeffnungszeiten { grid-column: auto; }

  /* Vereinsliste mit Logo: kleineres Logo, schmaleres Polster. Bei 375px
     blieben von 7.5rem Einzug nur rund 255px fuer den Eintrag — ein Name wie
     "Metal Maniacs Schrobenhausen" zerfiele in vier Zeilen. 4.5rem Polster
     und ein 3.5rem breites Logo lassen 303px stehen.

     Die absolute Lage bleibt: Das Logo neben dem Eintrag ist auf dem Telefon
     genauso richtig wie auf dem Schirm, es braucht nur weniger Platz. */
  .mmu-vereine .mmu-liste:has(.mmu-vereinslogo) li { padding-left: 4.5rem; }
  .mmu-vereinslogo img { width: 3.5rem; max-height: 3.5rem; }

  /* Zweispaltig statt dreispaltig, und das ist eine Lesbarkeitsfrage, keine
     Geschmacksfrage: Bei 375 px blieben dreispaltig rund 96 px je Blatt —
     auf einem Metal-Flyer ist darin weder ein Bandname noch ein Datum zu
     erkennen, das Plakat waere zur Marke geschrumpft. Zweispaltig sind es
     gemessene 149,5 px (315 px Inhalt, 16 px Abstand), und das Bild traegt
     wieder. Der Preis ist die Luecke neben einem vierten Blatt in Zeile
     zwei; sie ist gewollt. Wer das "vereinheitlicht", macht die Blaetter
     unlesbar. */
  .mmu-aushang-neben { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .mmu-liste li { grid-template-columns: 1fr; gap: var(--raum-1); }
  /* ⚠️ Die aufklappbaren Bandzeilen tragen ihr Raster am <summary>, nicht am
     <li>. Die Zeile darueber erreicht sie deshalb NICHT — ohne die naechste
     bliebe das Verzeichnis auf dem Telefon fuenfspaltig, waehrend jede andere
     Liste stapelt. Ueber die Variable, damit es eine Zuordnung bleibt. */
  .mmu-archiv { --mmu-bandspalten: 1fr; }
  .mmu-archiv .mmu-liste summary { gap: var(--raum-1); }
  .mmu-liste .mmu-jahr { text-align: left; }


  /* Die Kopfzeile ist eine Spaltenbeschriftung — gestapelt gibt es keine
     Spalten mehr, die sie beschriften koennte. Ungefiltert wuerde die
     Regel darueber sie ebenfalls einspaltig stapeln: fuenf Woerter
     ("Name", "Genre", "Ort", "Gegr.", "Status") ohne die Werte daneben,
     die ihnen erst einen Sinn geben. Sie ist ohnehin aria-hidden — eine
     Vorlesehilfe verliert nichts.

     .mmu-liste .mmu-liste-kopf, nicht nur .mmu-liste-kopf: ".mmu-liste li"
     setzt display:grid mit dem Element im Selektor (0-1-1); die eine
     Klasse allein (0-1-0) haette gegen display:none verloren, wieder
     dieselbe Falle wie bei .mmu-maxime und der Kopfzeilen-Randfarbe oben. */
  .mmu-liste .mmu-liste-kopf { display: none; }

  /* Kein Raster mehr: display:contents wird zurueckgenommen, damit die
     Zeile als Block stapelt statt vier Spalten zu quetschen. */
  .mmu-gigliste { display: block; }
  /* Auch hier die Karte aussparen: Sie bringt ihr eigenes Raster mit
     (weiter unten, `grid-template-columns: minmax(0,1fr)`), und ein
     `display: block` von hier aus wuerde es abraeumen. */
  .mmu-gigliste li:not(.mmu-gigkarte) {
    display: block;
    padding: var(--raum-3) 0;
    border-top: 1px solid var(--mmu-linie);
  }
  /* 🔴 Auch die Zuruecksetz-Regel muss die Karte aussparen. Sie ist (0,1,1)
     und schlaegt `.mmu-gigabriss` (0,1,0) — sie loeschte die waagerechte
     Perforation, die der Mobilblock der Karte unten gibt. Eine Regel, die
     "nur zuruecksetzt", ist nicht harmlos: Sie setzt auch das zurueck, was
     eine andere Regel absichtlich gesetzt hat. */
  .mmu-gigliste li:not(.mmu-gigkarte) > * { padding: 0; border-top: 0; }

  /* Gestapelt fuehrt das Datum die Zeile an und darf nicht mehr gedimmt
     sein — es ist hier die Ueberschrift des Blocks, nicht eine Spalte
     neben anderen. */
  .mmu-gigdatum {
    display: block;
    color: var(--mmu-text);
    font-weight: 600;
    margin-bottom: var(--raum-1);
  }

  /* Zwei Spalten statt einer. Sechs volle Zeilen ergaeben eine 520 px hohe
     Leiste, bevor das erste Konzert kommt — mehr als eine halbe Telefonhoehe.
     Zu zweit sind es drei Zeilen, und weil Von und Bis am Ende stehen, fallen
     sie von selbst nebeneinander. Kein neuer Umbruchpunkt: 40 rem gab es
     schon. */
  /* ⚠️ minmax(0, 1fr), nicht 1fr.

     "1fr" ist die Kurzform von "minmax(auto, 1fr)", und bei einer Untergrenze
     von auto gilt die inhaltsbasierte Mindestbreite des RASTERFELDS. Das Feld
     ist hier das <label>, und dessen Mindestbreite ist die des laengsten
     Venue-Eintrags. Gemessen am 14.08.2026: Das Raster loeste sich zu
     "202px 182px" auf — 400 px in einem 315 px breiten Behaelter, 51 px
     Ueberlauf der ganzen Seite. Ein min-width: 0 am <select> half nicht, denn
     das <select> ist nicht das Rasterfeld.

     Bei 1280 px trat der Fehler NICHT auf: Dort steht minmax(10rem, 1fr), und
     eine ausdrueckliche Untergrenze schaltet die Regel ab. Ein Umbruchpunkt
     war also heil, der andere nicht — messbar nur, wenn man beide misst. */
  .mmu-filter-felder { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .mmu-filter,
  .mmu-filter-felder,
  .mmu-suche { gap: var(--raum-3); }
  .mmu-filter-knoepfe { gap: var(--raum-3); }
  .mmu-suchfeld { flex: 1 1 100%; }
  .mmu-suche input { min-width: 0; width: 100%; }
  .mmu-filter button,
  .mmu-suche button { flex: 1 1 auto; }
}

/* =========================================================================
   18a. Zeitungsoptik: Startseite (Vorstellung + Karussel)
   ========================================================================= */

/* Logo als Link */
.mmu-kopf-link {
  display: inline-block;
  text-decoration: none;
  color: inherit;
}

/* Startseite: 2-Spalten-Layout (Vorstellung | Karussel)
 *
 * ⚠️ Hiess bis zum 17.08.2026 .mmu-start-intro — derselbe Name, den die
 * EINLEITUNG oben in Abschnitt 17 traegt (.mmu-start-intro h1 / p / .mmu-maxime,
 * Zeile 2176 ff.). Solange die Einleitung von der Startseite verschwunden war,
 * fiel die Doppelbelegung nicht auf: Die Regeln dort liefen ins Leere, weil es
 * kein h1 und keinen Einleitungsabsatz mehr gab.
 *
 * Beim Zurueckholen der Einleitung waeren beide aufeinandergetroffen — das
 * Editorial haette das Schaufenster-Raster bekommen (36rem + 1fr) und die
 * Neuigkeiten waeren in die falsche Spalte gerutscht. Der Name gehoert der
 * Einleitung, sie trug ihn zuerst; das Schaufenster heisst jetzt, was es ist. */
.mmu-start-schaufenster {
  /* 🔴 FLEX-WRAP UND NICHT GRID (Handoff v3: „Zweispaltig (flex-wrap)").
     Das Grid quetschte die rechte Spalte zwischen 640 und ~850 px auf
     46 px zusammen, statt sie umbrechen zu lassen — der Inhalt lief 52 px
     aus dem Fenster und die ganze Seite bekam einen waagerechten
     Rollbalken.
     🎯 Ein Flexbau bricht um, sobald die Basisbreiten nicht mehr
     nebeneinander passen. Er braucht dafuer KEINE Pixelgrenze, die bei der
     naechsten Textaenderung wieder falsch liegt — das war der Fehler:
     Die Umbruchgrenze stand bei 40rem, gequetscht wurde schon ab 53rem. */
  display: flex;
  flex-wrap: wrap;
  align-items: flex-start;
  gap: 2.5rem;
  /* Oben kleiner als unten (Betreiberwunsch 26.08.2026, "Vorstellung soll
     ein wenig nach oben ruecken") — unten bleibt der Abstand zum naechsten
     Abschnitt (Konzertliste) unangetastet, darum ging es nicht. */
  padding: 1rem 0 2rem;
  border-bottom: 1px solid var(--mmu-linie);
}

/* Die Basisbreiten bestimmen, WANN umgebrochen wird: Sobald
   28 + 2,5 + 18 = 48,5rem nicht mehr nebeneinander passen, rutscht die
   Spalte unter die Vorstellung. Die Vorstellung waechst dabei dreimal so
   schnell wie die Spalte, damit das Bandfoto den Platz bekommt.
   ⚠️ min-width: 0 an beiden: Ohne das weigert sich ein Flex-Element,
   unter die Breite seines laengsten Wortes zu schrumpfen — bei einem
   Bandnamen wie „Metalheadz Village Festival" ist das genau der Grund,
   aus dem eine Spalte aus dem Fenster ragt. */
.mmu-start-schaufenster > .mmu-vorstellung {
  /* 📏 `2 1 30rem` nach dem Entwurf; hier stand `3 1 28rem`. Die
     Begruendung darunter rechnet mit 3:1 und nennt als Ziel 1,85:1 --
     der Entwurf selbst setzt 2:1 gegen 1:1 und kommt damit auf dasselbe
     Verhaeltnis, ohne es ueber eine zu grosse Zahl zu erzwingen. */
  flex: 2 1 30rem;
  min-width: 0;
  /* 🔴 KEINE max-width. Die 36rem stammen aus der v1-Fassung
     (2-Spalten-Grid, minmax(0,36rem) / 1fr) und sind beim Umbau auf
     flex-wrap mitgewandert. Sie deckeln die Vorstellung bei 576 px,
     wodurch beide Spalten fast gleich breit werden (1,07 : 1).
     📏 Der Entwurf zeigt rund 1,85 : 1 — 740 zu 400 bei 1354 px Fenster.
     Genau das ergibt flex: 3 1 28rem gegen 1 1 18rem, wenn nichts
     deckelt: 730 zu 382. */
}
/* 🔴 DIE TRENNLINIE FEHLTE GANZ. Der Entwurf setzt die Seitenspalte mit
   einer senkrechten Linie vom Hauptteil ab (1px #26262c) und ruekt ihren
   Inhalt um 1.5rem ein -- so entsteht die Spalte einer Zeitung. Ohne sie
   stehen zwei Textbloecke nebeneinander, zwischen denen nur Luft ist.

   📏 Gemessen: border-left 0px, padding-left 0px. Nicht falsch gesetzt,
   sondern nie gesetzt -- und darum in keinem Pruefer. */
.mmu-start-schaufenster > .mmu-start-spalte {
  flex: 1 1 16rem;
  min-width: 0;
  border-left: 1px solid var(--mmu-linie);
  padding-left: var(--raum-5);
  row-gap: var(--raum-6);
}

.mmu-vorstellung-aeltere {
  margin-top: var(--raum-5, 1.5rem);
}

/* ⚠️ MIT Trennlinie wie ihre Geschwister. "Vorstellung" und
   "Neuigkeiten" tragen eine, "Weitere Vorstellungen" nicht -- und damit
   sah dieselbe Sorte Marke zweimal verschieden aus. Der Entwurf setzt sie
   bei allen dreien (v3.dc.html, Elemente 6/24/29). */
.mmu-vorstellung-aeltere-label {
  margin: 0 0 var(--raum-3, 0.75rem);
  font-size: 0.8125rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--mmu-gedimmt);
  border-bottom: 1px solid var(--mmu-kante);
  padding-bottom: 0.4rem;
}

.mmu-vorstellung-aeltere ul {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  gap: 0.5rem;
}

.mmu-vorstellung-aeltere li a {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  color: var(--mmu-text);
  text-decoration: none;
}

.mmu-vorstellung-aeltere li a:hover {
  color: var(--mmu-akzent-text);
}

/* Dieselbe Falle wie beim Haupt-Logo weiter oben: 130 von 158 Logos tragen
   ihren Hintergrund SCHWARZ eingebrannt, nur 11 sind transparent. Ohne die
   Tafel dahinter stuende hier ein schwarzer Kasten auf hellem Grund.

   Derselbe geerbte Rand, derselbe Fehler wie bei .mmu-vorstellung-kopf
   .mmu-logo weiter unten: .mmu-logo bringt `margin: 0 0 var(--raum-5)` mit,
   Flex zentriert nur die Randbox, nicht das sichtbare Logo — ohne margin: 0
   sitzt das Logo ueber der Mittellinie des Bandnamens.

   --mmu-klecks ist die unregelmaessige Maske fuers grosse Hauptlogo; auf
   einer 2rem-Kachel gequetscht ergibt sie nur einen kleinen gezackten Fleck
   statt einer sauberen Kante. Bei dieser Groesse abgeschaltet, statt den
   Innenabstand fuer die Maske nachzurechnen. */
/* 📏 Entwurf (v3.dc.html Zeile 106): 4.5rem im Quadrat, object-fit: cover,
   3px Papierrand, rotate -3deg. Live waren es 2rem mit contain — ein
   Drittel der Groesse, und im Bild des Betreibers der auffaelligste
   Unterschied dieser Spalte.
   ⚠️ cover und nicht contain: Bei 4.5rem im Quadrat laesst contain bei
   einem breiten Logo zwei Drittel der Flaeche leer. */
.mmu-vorstellung-aeltere li .mmu-logo {
  width: 4.5rem;
  height: 4.5rem;
  object-fit: cover;
  background: var(--mmu-tafel);
  padding: 0.2rem;
  flex: none;
  margin: 0;
  -webkit-mask-image: none;
  mask-image: none;
}

/* Vorstellung — bis zum 18.08.2026 "Band des Monats" (Betreiberentscheidung).
   Alte Uebergaben und docs/UEBERGABE-2026-08-17-zeitungsoptik-fase1.md nennen
   noch den alten Namen samt Klasse .mmu-band-des-monats. */
.mmu-vorstellung {
  display: grid;
  gap: 1rem;
}

.mmu-vorstellung h2 {
  font-size: 0.8125rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--mmu-gedimmt);
  border-bottom: 1px solid var(--mmu-kante);
  padding-bottom: 0.4rem;
  margin: 0;
}

.mmu-vorstellung-foto {
  margin: 0;
  overflow: hidden;
}

.mmu-vorstellung-foto img {
  width: 100%;
  height: auto;
  display: block;
}

/* 📏 1.75rem nach dem Entwurf; hier standen 1.375rem. Der Bandname ist
   die Ueberschrift des Aufmachers -- er darf so gross stehen wie "Der
   Aushang" eine Reihe tiefer. */
.mmu-vorstellung h3 {
  margin: 0;
  font-size: 1.75rem;
  font-family: var(--schrift-prosa);
  font-weight: 700;
}

.mmu-vorstellung h3 a {
  color: var(--mmu-text);
  text-decoration: none;
}

.mmu-vorstellung h3 a:hover {
  color: var(--mmu-akzent-text);
}

/* Kopfzeile des Aufmachers: Logo links, Kanalsymbole rechts, auf einer Linie
   (seit 20.08.2026). Vorher standen beide in eigenen Zeilen unter dem Namen —
   drei Zeilen ohne Gruppierung. `space-between` haelt die Symbole am rechten
   Rand, `wrap` bricht auf schmalen Flaechen sauber um. */
.mmu-vorstellung-kopf {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--raum-3);
  margin: var(--raum-2) 0 var(--raum-4);
}

/* Das Logo trat hier doppelt auf Abstand: .mmu-logo bringt selbst
   `margin: 0 0 var(--raum-5)` mit, dazu kam der des Rahmens. In der Kopfzeile
   regelt `gap` die Abstaende — der eigene Rand muss weg, sonst sitzt das Logo
   nicht auf der Mittellinie der Symbole. */
/* 📏 3.5rem nach dem Entwurf; hier stand max-height: 4rem (64 px).
   Der Unterschied ist klein, aber das Logo steht neben dem Bandnamen --
   zwei Groessen, die aufeinander abgestimmt sind. */
/* 📐 Logo und Name als EINE Gruppe links, die Kanalsymbole rechts.
   Die Kopfzeile selbst verteilt mit space-between -- ohne diese Gruppe
   waeren Logo, Name und Symbole drei gleichrangige Dinge, und der Name
   lande in der Mitte zwischen Logo und Symbolen. */
.mmu-vorstellung-marke {
  display: flex;
  align-items: center;
  gap: var(--raum-4);
  min-width: 0;
}
/* ⚠️ Die Ueberschrift bringt aus der Blockgestaltung einen oberen Abstand
   mit. In einer Zeile neben dem Logo saesse sie damit zu tief. */
.mmu-vorstellung-marke h3 { margin: 0; }

.mmu-vorstellung-kopf .mmu-logo {
  margin: 0;
  max-height: 3.5rem;
  padding: var(--raum-2) var(--raum-3);
}

.mmu-vorstellung-logo {
  display: flex;
}

/* 🔴 ZWEISPALTIG MIT SPALTENLINIE -- und live lief der Text EINSPALTIG,
   obwohl `columns: 2` gesetzt war.

   🎯 Der Grund ist die zweite Zahl: `columns: 2 22rem` heisst nicht
   "zwei Spalten", sondern "zwei Spalten, jede mindestens 22rem breit".
   Bei 352 px Mindestbreite braucht es 736 px plus Abstand, und so breit
   wird die Vorstellung selten. Der Entwurf setzt 17rem (272 px) -- dann
   entstehen die zwei Spalten tatsaechlich.

   ⚠️ Und die Textfarbe: --mmu-gedimmt (#a0a0a8) ist die Farbe fuer
   Nebenauskuenfte. Das Bandportraet IST der Inhalt dieses Abschnitts;
   der Entwurf setzt #dcdce0, fast Textfarbe. */
.mmu-vorstellung-interview {
  margin: 0;
  /* ⚠️ KEINE columns hier. Dieselbe Klasse wird 286 Zeilen weiter unten
     noch einmal definiert und setzt sie dort -- bei gleicher Spezifitaet
     gewinnt die spaetere. Ein zweiter Satz Werte an dieser Stelle waere
     wirkungslos und saehe trotzdem nach Verdrahtung aus. */
  font-family: var(--schrift-prosa);
  font-size: 1.0625rem;
  line-height: 1.6;
  color: #dcdce0;
}

/* Der Vorstellungstext kommt aus wpautop() und bringt eigene Absaetze mit.
   Ohne diese Regel traegt der erste Absatz den Abstand des Browsers und
   schiebt den Text von der Ueberschrift weg; der letzte erzeugt eine Luecke
   vor den Kanalsymbolen. */
.mmu-vorstellung-interview > p {
  margin: 0 0 0.75em;
}

.mmu-vorstellung-interview > p:last-child {
  margin-bottom: 0;
}

.mmu-band-kanäle {
  display: flex;
  gap: 0.5rem;
}

.mmu-band-kanäle a {
  width: 42px;
  height: 42px;
  border: 1px solid var(--mmu-kante);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  color: var(--mmu-text);
  text-decoration: none;
}

.mmu-band-kanäle a:hover {
  border-color: var(--mmu-akzent-text);
  color: var(--mmu-akzent-text);
}

.mmu-vorstellung-mehr {
  margin: 0;
}

/* 🔴 EIN KNOPF, KEIN NACKTER LINK. Der Entwurf setzt einen Rahmen in der
   Akzentfarbe, 44px Trefferflaeche, gesperrte Versalien -- das Gegenstueck
   zu "Aufraeumen" daneben. Live stand dort ein kleiner roter Fliesstext,
   der am Ende eines langen Portraets kaum als Weg zu erkennen war. */
.mmu-vorstellung-mehr a {
  display: inline-flex;
  align-items: center;
  margin-top: var(--raum-2);
  min-height: 44px;
  padding-inline: 1.1rem;
  border: 1px solid var(--mmu-akzent);
  color: var(--mmu-akzent-text);
  font-size: var(--t-klein);
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  text-decoration: none;
  transition: background 150ms ease, color 150ms ease;
}

/* Beim Darueberfahren fuellt sich der Knopf -- wie die Kanalsymbole
   darueber, die dasselbe tun. Ein Unterstrich waere hier die Geste eines
   Textlinks und widerspraeche der Knopfform. */
.mmu-vorstellung-mehr a:hover,
.mmu-vorstellung-mehr a:focus-visible {
  background: var(--mmu-akzent);
  color: var(--mmu-papier);
}

/* Flyer-Karussel */
.mmu-flyerkiste {
  display: grid;
  gap: 1rem;
}

.mmu-flyerkiste h2 {
  font-size: 0.8125rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--mmu-gedimmt);
  border-bottom: 1px solid var(--mmu-kante);
  padding-bottom: 0.4rem;
  margin: 0;
}



/* Responsive: Startseite 1-spaltig unter 40rem */
@media (max-width: 39.9999em) {
  /* Kein grid-template-columns mehr — das Schaufenster ist seit dem
     30.09.2026 ein Flexbau und bricht von selbst um. Hier bleibt nur der
     engere Abstand fuer schmale Geraete. */
  .mmu-start-schaufenster {
    gap: 1.5rem;
  }
}

/* =========================================================================
   19. Sonderfaelle der Ausgabe
   ========================================================================= */

/* Wer Bewegung reduziert haben will, bekommt keine. */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    transition-duration: 0.01ms !important;
  }
}

/* ── Ticker der Neuzugaenge (Startseite) ─────────────────────────────────
   Betreiberauftrag 24.08.2026. Zehn zuletzt hinzugekommene Konzerte DER
   REGION, durchlaufend unter der Rubrikenleiste.

   🔴 An der Neuigkeiten-Spalte weiter oben steht die gegenteilige
   Entscheidung ("Kein Laufband: still, als Liste"). Sie gilt DORT weiter —
   fuer vier Zeilen Text lohnte der Aufwand nicht. Hier hat der Betreiber
   anders entschieden, und die drei Einwaende von damals sind einzeln
   ausgeraeumt: kein JavaScript (reines CSS), ein eigener
   prefers-reduced-motion-Block (unten), aria-hidden an der Laufkopie
   (im Markup, inc/ticker.php).

   Die Technik: Zwei identische Listen liegen nebeneinander im Band. Das Band
   wandert um genau eine Kopienbreite (-50 %) und springt dann zurueck — in
   dem Augenblick steht die zweite Kopie genau dort, wo die erste begann.
   Deshalb wirkt der Umlauf lueckenlos, ohne dass etwas nachgeladen wird. */
.mmu-ticker {
  display: flex;
  align-items: center;
  gap: var(--raum-3);
  border-bottom: 1px solid var(--mmu-linie);
  padding-block: var(--raum-2);
  font-size: var(--t-klein);
}

/* Die Marke steht AUSSERHALB des Laufbands und bleibt stehen. Ohne sie waere
   die Leiste eine Reihe von Konzerten ohne Aussage darueber, warum gerade
   diese dort stehen.

   Handoff v3: roter Label-BLOCK, nicht mehr nur roter Text.

   📏 Kontrast gemessen: Weiss auf --mmu-akzent (#c0392b) ergibt 5,44:1.
   ⚠️ Das ist AA (4,5:1) und NICHT AAA (7:1) — der einzige Wert im neuen
   Kopf unterhalb der sonst hier ueblichen Stufe. Zum Vergleich traegt die
   Unterzeile daneben 17,16:1. Der Handoff schreibt Weiss auf Akzent vor;
   wer das anhebt, aendert die Akzentfarbe der ganzen Seite mit. Bewusst so
   gelassen und hier vermerkt, damit es nicht als Versehen gelesen wird. */
.mmu-ticker-marke {
  flex: none;
  display: flex;
  align-items: center;
  padding-inline: var(--raum-3);
  background: var(--mmu-akzent);
  color: var(--mmu-auf-akzent);
  font-weight: 600;
  letter-spacing: 0.16em;
  text-transform: uppercase;
}

/* Die weichen Raender: Eintraege sollen am Rand aus- und einblenden statt
   an einer harten Kante abzureissen. Zwei Schreibweisen, weil WebKit die
   ungepraefixte Fassung erst spaet bekommen hat. */
.mmu-ticker-fenster {
  flex: 1;
  min-width: 0;
  overflow: hidden;
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 2rem, #000 calc(100% - 2rem), transparent);
  mask-image: linear-gradient(90deg, transparent, #000 2rem, #000 calc(100% - 2rem), transparent);
}

/* 🔴 KEINE CSS-Animation mehr (Handoff v3). Hier stand
   `animation: mmu-ticker-lauf 60s linear infinite` — eine feste DAUER. Die
   Geschwindigkeit ergab sich daraus als Bandbreite geteilt durch 60s, und
   die Bandbreite haengt daran, wie lang die Bandnamen der letzten zehn
   Konzerte sind: Ein Abend mit drei langen Namen liess das Band spuerbar
   schneller laufen als einer mit zwei kurzen. v3 verlangt konstant 42 px/s,
   und eine GESCHWINDIGKEIT kann CSS allein nicht halten.

   Den Lauf setzt jetzt assets/ticker-lauf.js per transform, die Rechnung
   steht geprueft in ticker-lauf.mjs (test/ticker-lauf.test.mjs).

   ⚠️ Ohne JavaScript steht das Band still — und das ist in Ordnung: Die
   zehn Konzerte stehen lesbar im Markup, sie wandern nur nicht. Die
   Anhaltepflicht aus WCAG 2.2.2 erfuellt jetzt das Skript (Zeiger und
   Tastaturfokus), nicht mehr animation-play-state. */
.mmu-ticker-band {
  display: flex;
  width: max-content;
  will-change: transform;
}

.mmu-ticker-liste {
  display: flex;
  gap: var(--raum-4);
  list-style: none;
  margin: 0;
  padding: 0 var(--raum-4) 0 0;
}

.mmu-ticker-eintrag { flex: none; white-space: nowrap; }
.mmu-ticker-eintrag a { color: inherit; text-decoration: none; }
.mmu-ticker-eintrag a:hover,
.mmu-ticker-eintrag a:focus-visible { text-decoration: underline; }

/* 🔴 Diese Ausnahme ist PFLICHT, nicht Kuer. Sie stammt aus der Zeit der
   CSS-Animation: Der globale Block weiter oben setzt jede Animation auf
   0.01ms, das Laufband spraenge damit sofort an sein Ende, und die erste
   Kopie waere aus dem Bild geschoben.

   ⚠️ Sie bleibt noetig, obwohl die Animation weg ist — nur aus einem
   ANDEREN Grund, und der ist wichtiger: Jetzt setzt JavaScript das transform
   als Inline-Stil. `transform: none !important` schlaegt den Inline-Stil,
   CSS-Spezifitaet allein taete das nicht. Das Skript haelt zwar selbst an
   (matchMedia in ticker-lauf.js) — aber es raeumt seinen letzten Stand nur
   auf, wenn es laeuft. Bricht es vorher ab, bliebe das Band stehen, wo es
   gerade war: mittendrin abgeschnitten, fuer genau die Leute, die es still
   brauchen. Zwei Wege zum selben Ziel, und keiner haengt am anderen.

   Hier wird aus dem Band eine ruhende, umbrechende Liste. Die Laufkopie
   faellt weg — sie traegt nur den Umlauf, und ohne Bewegung gibt es nichts
   umzulaufen. */
@media (prefers-reduced-motion: reduce) {
  /* ⚠️ `width: max-content` aus der Grundregel MUSS hier zurueck: Es ist per
     Definition die Breite, bei der nichts umbricht — `flex-wrap` haette daneben
     keine Wirkung, und die Leiste liefe als eine Zeile aus der Seite heraus.
     `display: block` nimmt zugleich den Flex-Zusammenhang weg; die Laufkopie
     ist ausgeblendet, es bleibt ohnehin nur eine Liste. */
  .mmu-ticker-band {
    animation: none !important;
    transform: none !important;
    display: block;
    width: auto;
  }
  .mmu-ticker-fenster { overflow: visible; }
  .mmu-ticker-liste { flex-wrap: wrap; }
  .mmu-ticker-liste[aria-hidden="true"] { display: none; }
  /* ⚠️ `flex: none` aus der Grundregel MUSS hier zurueck. Ein nicht
     schrumpfbarer Flex-Eintrag wird auf max-content bemessen — `white-space:
     normal` bliebe wirkungslos, der Eintrag braeche nie um, und weil das
     Fenster hier `overflow: visible` traegt, bekaeme das GANZE Dokument
     unterhalb von rund 630px einen Querlauf. Derselbe Fehlertyp wie bei
     `width: max-content` am Band — dort behoben, hier stehen geblieben. */
  .mmu-ticker-eintrag { white-space: normal; flex: 0 1 auto; min-width: 0; }
}

/* Papier ist hell. Die Belegstruktur ist der Zweck des Ausdrucks, also
   bleibt sie — die Logotafel faellt weg, weil ein schwarzer Kasten auf
   Papier nur Farbe kostet. */

/* -------------------------------------------------------------------------
   Die Startseite in Papier (Handoff v3)
   -------------------------------------------------------------------------
   v3 fuehrt die Papierwelt, die bisher Pinnwand und Eintrittskarten
   vorbehalten war, in die Startseite ein: Das Bandfoto liegt als Abzug auf
   dem Tisch, die Bereichskacheln liegen leicht schief, und die Playlist
   steht auf Papier. Alles mit denselben Tokens wie die Anschlaege — es ist
   dieselbe Welt, nicht eine zweite. */

/* Das Bandfoto als Papierabzug: heller Rand rundum, leicht schief gelegt,
   richtet sich unter dem Zeiger auf.

   ⚠️ `rotate` und nicht `transform: rotate(…)`: Die Eigenschaft ist einzeln
   animierbar und kollidiert nicht mit einem `transform`, das spaeter jemand
   fuer etwas anderes setzt. Dieselbe Wahl wie bei den Genre-Stempeln. */
.mmu-vorstellung-foto {
  background: var(--mmu-papier);
  padding: 0.55rem;
  rotate: -0.8deg;
  box-shadow: 0 4px 14px rgb(0 0 0 / 0.4);
  transition: rotate 240ms var(--mmu-feder);
}
.mmu-vorstellung-foto:hover { rotate: 0deg; }

/* 📐 DER BESCHRIFTETE RAND. Der Entwurf setzt `padding: 0.55rem 0.55rem
   1.8rem` -- unten dreimal so viel wie an den anderen Kanten. Das ist
   kein Zufall, sondern der Platz fuer die Unterschrift darunter.

   📏 Gemessen waren 8.8px rundum: Der Rand sah unten genauso schmal aus
   wie oben, und die Beschriftung fehlte ganz. */
.mmu-vorstellung-foto {
  position: relative;
  padding-bottom: 1.8rem;
}

/* ⚠️ Absolut auf dem Rand, nicht im Fluss darunter: Sonst waere der breite
   Rand unten doppelt so hoch -- einmal Polster, einmal Textzeile. */
.mmu-vorstellung-foto figcaption {
  position: absolute;
  left: 0.8rem;
  bottom: 0.35rem;
  font-family: var(--schrift-mono);
  font-size: 0.6875rem;
  line-height: 1.3;
  color: #55525a;
}

/* Der Teasertext zweispaltig, mit Spaltenlinie — der Satz einer Zeitung.

   ⚠️ `columns` erst ab genug Breite: Zwei Spalten auf einem Telefon waeren
   je rund 150px breit, und darin bricht jeder laengere Bandname um. Die
   zweite Zahl ist die Untergrenze, unterhalb derer der Text einspaltig
   weiterlaeuft -- ohne eigene Abfrage.

   🔴 17rem UND NICHT 22rem, und der Unterschied entscheidet ueber ALLES:
   Bei 22rem je Spalte braucht der Satz 2 x 352 + 24 = 728 px. Die
   Vorstellung ist 714 px breit (gemessen bei 1546 px Fenster) -- der Text
   lief dadurch IMMER einspaltig, auf jedem Bildschirm. Der Entwurf setzt
   17rem; dann sind es 2 x 272 + 32 = 576 px, und die zweite Spalte
   entsteht tatsaechlich.

   🎯 `columns: 2` war die ganze Zeit gesetzt, und eine Messung darauf
   bestaetigt es brav. Die SpaltenZAHL ist aber nur ein Hoechstwert --
   wirksam ist die BREITE. (Betreiber am 01.10.2026 am Bildschirmfoto:
   der Text steht einspaltig.) */
.mmu-vorstellung-interview {
  columns: 2 17rem;
  column-gap: var(--raum-6);
  column-rule: 1px solid var(--mmu-linie);
}

/* 🔴 Die Fraktur-Initiale ueber ::first-letter, NICHT ueber ein eigenes
   Element. Der Text kommt aus dem Vault als fertiges HTML (siehe
   front-page.php: „Das Feld traegt seit dem 20.08.2026 fertiges HTML aus dem
   Sync"). Ein <span class="mmu-initiale"> muesste dort hinein — also in die
   Vault-Daten, fuer eine reine Darstellungsfrage. ::first-letter braucht
   keine Aenderung an den Daten und greift auch, wenn der Text neu
   uebertragen wird.

   ⚠️ NUR im ersten Absatz: ::first-letter an .mmu-vorstellung-interview
   selbst traefe zwar auch nur den ersten, aber sobald der Text mit einem
   Bild oder einer Liste beginnt, waere die Wirkung unbestimmt. Der
   Elementselektor sagt, was gemeint ist. */
.mmu-vorstellung-interview > p:first-of-type::first-letter {
  float: left;
  font-family: var(--schrift-titel);
  font-size: 2.2em;
  line-height: 0.8;
  padding: 0.08em 0.12em 0 0;
  color: var(--mmu-akzent-text);
}

/* Die Thumbnails unter „Weitere Vorstellungen": kleine Abzuege, leicht
   schief. Dieselbe Sprache wie das grosse Foto darueber, nur leiser. */
/* 📏 Entwurf: 3px Papierrand und rotate -3deg. Der Rand steht als border
   da und nicht als padding, weil er bei object-fit: cover sonst vom Bild
   ueberdeckt wuerde. */
.mmu-vorstellung-aeltere img {
  background: var(--mmu-papier);
  border: 3px solid var(--mmu-papier);
  rotate: -3deg;
  transition: rotate 200ms var(--mmu-feder);
}
.mmu-vorstellung-aeltere a:hover img { rotate: 0deg; }

/* Die Bereichskacheln liegen leicht schief und richten sich beim Zeigen auf.

   Die Neigung ist FEST je Platz, nicht zufaellig — dieselbe Begruendung wie
   bei den Genre-Stempeln und den Anschlaegen der Pinnwand: Ein Stapel, der
   bei jedem Seitenaufbau anders liegt, sieht nach Zittern aus statt nach
   Handarbeit. Vier Winkel bei sechs Kacheln, das Auge erkennt die
   Wiederholung nicht. */
.mmu-einstieg {
  transition: rotate 240ms var(--mmu-feder), translate 240ms var(--mmu-feder),
              box-shadow 240ms ease, background 160ms ease;
}
.mmu-einstieg:nth-of-type(4n+1) { rotate: -0.7deg; }
.mmu-einstieg:nth-of-type(4n+2) { rotate: 0.5deg; }
.mmu-einstieg:nth-of-type(4n+3) { rotate: -0.4deg; }
.mmu-einstieg:nth-of-type(4n)   { rotate: 0.8deg; }
/* „Hover hebt an und richtet gerade." */
.mmu-einstieg:hover,
.mmu-einstieg:focus-within {
  rotate: 0deg;
  translate: 0 -3px;
  box-shadow: 0 8px 22px rgb(0 0 0 / 0.45);
}

/* Die Playlist-Kachel auf Papier, mit Fraktur-Titel.

   📏 Gemessen, nicht geschaetzt: --mmu-papier-text auf --mmu-papier ergibt
   14,62:1 (AAA). --mmu-papier-akzent auf --mmu-papier ergibt 5,42:1 — AA,
   nicht AAA. Der Titel steht bei 1,375rem (22px) und ist damit KEIN grosser
   Text im Sinne von WCAG (dafuer braeuchte er 24px oder 18,66px fett); es
   gilt also die Textgrenze von 4,5:1.
   ⚠️ Bewusst so: Die Akzentfarbe gehoert zur Papierwelt, die Anschlaege der
   Pinnwand tragen sie ebenso. Wer sie anhebt, aendert die ganze Papierwelt
   mit — vermerkt, damit es nicht als Versehen gelesen wird. */
.mmu-playlist {
  background: var(--mmu-papier);
  color: var(--mmu-papier-text);
  border-color: var(--mmu-papier-kante);
}
/* 🔴 Die Fraktur sitzt am NAMEN, und der steht seit dem 01.10.2026 in
   .mmu-einstieg-zahl. Vorher trug ihn .mmu-einstieg-titel — dort, wo bei
   jeder anderen Kachel die kleine gesperrte Vorzeile steht. Die Kachel
   stand damit auf dem Kopf.
   ⚠️ Die Vorzeile („Playlist") bekommt die Papier-Akzentfarbe, aber keine
   Fraktur: Sie ist eine Beschriftung, kein Name. */
/* ⚠️ `.mmu-playlist a.…:any-link` und nicht die blosse Klasse: Die Vorzeile
   IST ein Link, und zwei breitere Regeln greifen nach ihr.

   📏 GEMESSEN am 03.10.2026 auf teufelstritt.de, 375 px:
     Ruhe    .mmu-playlist .mmu-einstieg-titel  (0,2,0)
             verliert gegen a.mmu-einstieg-titel:any-link (0,2,1)
             → rgb(160,160,168) auf Papier = 2,12:1
     Hover   es gab gar keine eigene Regel; main[…] a:hover (0,2,2) setzte
             --mmu-text → rgb(232,232,234) auf Papier = 1,00:1 — das Wort
             verschwand vollstaendig.

   🎯 Dieselbe Bauart wie der Teilknopf der Merkliste (02.10.) und die
   Eintrittskarte (30.09.): Die Regel stand da, der Kommentar daneben war
   richtig, und sie GEWANN nicht. Spezifitaet schlaegt Reihenfolge. */
.mmu-playlist a.mmu-einstieg-titel:any-link,
.mmu-playlist .mmu-einstieg-titel {
  color: var(--mmu-papier-akzent);
}
/* Auf Papier wird der Link beim Darueberfahren DUNKLER, nicht heller: Die
   dunkle Seite hellt auf (--mmu-text), das Papier ist die Umkehrung. */
.mmu-playlist a.mmu-einstieg-titel:any-link:hover,
.mmu-playlist a.mmu-einstieg-titel:any-link:focus-visible {
  color: var(--mmu-papier-text);
}
.mmu-playlist .mmu-einstieg-zahl {
  font-family: var(--schrift-titel);
}
/* 🔴 Zahl und Text MUESSEN mit auf Papierfarben. Ohne diese Regel erben sie
   --mmu-gedimmt (#a0a0a8) und stuenden auf dem Papier bei GEMESSENEN 2,12:1
   — unlesbar, und weit unter jeder Stufe.

   ⚠️ Das ist derselbe Fehlertyp, den test/farbwelt.test.mjs im Stylesheet
   sucht, nur von der anderen Seite: Dort findet er harte Farben aus der
   Gegenwelt. Hier entsteht er durch eine GEERBTE Farbe, die im Stylesheet
   voellig richtig dasteht — und die Pruefung kann ihn nicht finden, weil
   nirgends eine falsche Farbe geschrieben steht. Vererbung ueber eine
   Weltgrenze hinweg ist von aussen unsichtbar. */
.mmu-playlist .mmu-einstieg-zahl,
.mmu-playlist .mmu-einstieg-text {
  color: var(--mmu-papier-text);
}

/* ⚠️ Und der Hover-Grund MUSS zurueckgenommen werden: 
   setzt --mmu-flaeche (#0f0f15). Auf der Papierkachel waere das ein Sprung
   von hell nach fast schwarz, waehrend die Schrift dunkel bleibt. */
.mmu-playlist:hover,
.mmu-playlist:focus-within { background: var(--mmu-papier); }

@media (prefers-reduced-motion: reduce) {
  .mmu-vorstellung-foto,
  .mmu-vorstellung-aeltere img,
  .mmu-einstieg { transition: none; rotate: 0deg !important; }
  .mmu-einstieg:hover,
  .mmu-einstieg:focus-within { translate: none; }
}


/* -------------------------------------------------------------------------
   Die Bandseite in Papier (Handoff v3)
   -------------------------------------------------------------------------
   v3 verlangt hier zwei Dinge, die noch fehlten: das Bandfoto als Abzug und
   das Portraet im zweispaltigen Zeitungssatz. Alles Uebrige stand schon —
   Logotafel mit object-fit, Steckbrief, beschriftete Kanalknoepfe, die
   Fraktur-Initiale, die Diskografie als Tabelle (sie kommt als Markdown-
   Tabelle aus dem Vault) und der Aufklapper fuer die bisherigen Konzerte. */

/* Das Bandfoto als Papierabzug — dieselbe Sprache wie auf der Startseite.
   Zwei Fotos liegen nebeneinander, deshalb wechselnde Neigung: gleich
   geneigte Abzuege sehen gedruckt aus, nicht gelegt. */
.mmu-band-fotos figure {
  background: var(--mmu-papier);
  padding: 0.5rem;
  box-shadow: 0 4px 14px rgb(0 0 0 / 0.4);
  transition: rotate 240ms var(--mmu-feder);
}
.mmu-band-fotos figure:nth-of-type(odd)  { rotate: -0.8deg; }
.mmu-band-fotos figure:nth-of-type(even) { rotate: 0.9deg; }
.mmu-band-fotos figure:hover { rotate: 0deg; }

/* ⚠️ Die Bildunterschrift steht AUF dem Papier und braucht Papierschrift.
   Ohne diese Regel erbt sie --mmu-gedimmt und stuende bei gemessenen 2,12:1
   — derselbe Fall wie bei der Playlist-Kachel auf der Startseite, und
   wieder einer, den keine Farbpruefung im Stylesheet finden kann: Die Farbe
   ist geerbt, nicht geschrieben. */
.mmu-band-fotos figcaption {
  color: var(--mmu-papier-text);
  padding: var(--raum-2) var(--raum-1) 0;
  font-size: var(--t-klein);
}

/* 🔴 DAS PORTRAET IM ZEITUNGSSATZ — und dazu muss die Lesespalte breiter
   werden. Das ist der Zielkonflikt, und er ist es wert, benannt zu werden.

   --mmu-spalte ist 36rem, begruendet mit „rund 75 Zeichen in Plex Sans" —
   dem Richtwert fuer EINE Spalte. v3 verlangt `columns: min(18rem, 100%)`; zwei Spalten
   zu 18rem plus Abstand passen in 36rem NICHT, die Regel bliebe wirkungslos
   und das Portraet einspaltig.

   ⚠️ Die 75-Zeichen-Begruendung gilt fuer einspaltigen Satz. Bei zwei
   Spalten ist die Zeile ohnehin halbiert — rund 40 Zeichen, und das ist
   genau die Laenge, fuer die Zeitungssatz gemacht ist. Die Grenze wird
   deshalb hier angehoben und nicht gebrochen: 44rem ergibt zwei Spalten zu
   rund 21rem.

   NUR der Bandtext wird breiter, nicht die ganze Seitenspalte: Datenkarte,
   Kanaele und Quellen bleiben in ihrer Breite, sonst verschoebe sich die
   Registerkante der ganzen Seite. */
.mmu-bandtext {
  max-width: 44rem;
  columns: min(18rem, 100%);
  column-gap: var(--raum-5);
  column-rule: 1px solid var(--mmu-linie);
}

/* ⚠️ Die Ueberschrift gehoert NICHT in den Spaltensatz. Ohne diese Zeile
   stuende „Bandportraet" in der ersten Spalte und der Text liefe daneben
   weiter — eine Ueberschrift, die nur ein Drittel ihres Abschnitts
   ueberschreibt. */
.mmu-bandtext > h2 {
  column-span: all;
}

/* ⚠️ Und der erste Absatz darf den Float der Initiale NICHT mehr
   einschliessen. `overflow: hidden` (eine Zeile weiter oben im Stylesheet)
   erzeugt einen eigenen Block-Formatierungskontext — in einem Mehrspalten-
   satz bricht der Absatz dann nicht mehr ueber die Spaltengrenze um,
   sondern bleibt als Klotz in einer Spalte stehen. Die Initiale braucht den
   Einschluss nur bei sehr kurzem Text; im Spaltensatz waere der Preis eine
   Spalte, die halb leer bleibt. */
.mmu-bandtext > p:first-of-type {
  overflow: visible;
}

@media (prefers-reduced-motion: reduce) {
  .mmu-band-fotos figure {
    transition: none;
    rotate: 0deg !important;
  }
}


/* -------------------------------------------------------------------------
   Die Register-Reiter der Örtlichkeiten (Handoff v3, „Venues")
   -------------------------------------------------------------------------
   „Klebende Register-Reiter-Leiste (Papier, trapezförmig, sticky) springt
   zum Stadtbezirk/Ort."

   Die Leiste gab es schon als flache Linkzeile; sie wird zum Registerrand
   einer Akte — dieselbe Papierwelt wie Pinnwand, Eintrittskarten und
   Schieberknopf. */
.mmu-stadtwahl {
  position: sticky;
  /* ⚠️ `top: 0` und nicht mehr: Darueber steht kein fester Kopf, der
     verdecken koennte. Ein Wert „auf Verdacht" liesse die Leiste schweben. */
  top: 0;
  z-index: 3;
  /* Der Grund MUSS gesetzt sein. Eine klebende Leiste ohne eigenen
     Hintergrund laesst den Inhalt darunter durchscheinen, sobald sie
     haengenbleibt — die Reiter stuenden dann in den Ortszeilen. */
  background: var(--mmu-grund);
  padding-block: var(--raum-2);
  border-bottom: 1px solid var(--mmu-linie);

  /* 🔴 QUERSCROLLEN STATT UMBRECHEN — dasselbe Muster wie die Rubrikenleiste
     im Kopf, und aus demselben Grund, nur hier dringender.

     📏 Live gemessen (Orte-Sitzung, 30.09.2026, 375px): Die Leiste brach auf
     mehrere Zeilen um und nahm 111 von 812 Pixeln ein — 14 % der
     Bildschirmhoehe. Bei vier Staedten ist das verschmerzbar; die Hoehe
     waechst aber LINEAR mit jeder weiteren, und eine klebende Leiste, die
     mitwaechst, frisst den Inhalt von oben auf. Genau das unterscheidet sie
     von einer gewoehnlichen Linkzeile: Was klebt, darf nicht wachsen.

     ⚠️ Ich hatte das im Kopf gebaut und hier vergessen — dieselbe Leiste,
     dieselbe Frage, zwei Antworten. Der Befund kam aus dem Browser, nicht
     aus dem Stylesheet: Im Quelltext sieht `flex-wrap: wrap` richtig aus. */
  flex-wrap: nowrap;
  overflow-x: auto;
  /* Die Leiste ist 44px hoch; ein Rollbalken darunter naehme ein Viertel
     davon und zeigte eine Bedienung, die niemand greifen muss. */
  scrollbar-width: none;
}
.mmu-stadtwahl::-webkit-scrollbar { display: none; }

/* ⚠️ Ohne `flex: none` schrumpfen Titel und Reiter unter ihre Inhaltsbreite,
   statt einen Ueberlauf zu erzeugen — es gaebe dann nichts zu scrollen, die
   Woerter wuerden nur enger stehen. Dieselbe Zeile steht aus demselben Grund
   an den Rubriken im Kopf. */
.mmu-stadtwahl > * { flex: none; }

/* Der einzelne Reiter: Papier, oben schmaler als unten. */
/* 🔴 `a:any-link` UND NICHT NUR `a` — eine Spezifitaetsfalle, live gemessen.

   Die Grundregel dieser Datei (Zeile 956) setzt
   `main[class^="mmu-"] a { color: var(--mmu-akzent-text) }`.
   Das ist 0-1-2 (ein Attributselektor zaehlt wie eine Klasse, dazu zwei
   Elemente). `.mmu-stadtwahl a` ist nur 0-1-1 und VERLIERT — die Reiter
   trugen nach der Auslieferung um 19:52 die Akzentfarbe auf Papier und
   damit gemessene 3,00:1 statt der gesetzten 14,62:1.

   `:any-link` hebt auf 0-2-1 und gewinnt, ohne den Selektor unlesbar zu
   machen. Dieselbe Bauart wie bei der Rubrikenleiste weiter oben, wo aus
   demselben Grund die volle Struktur als Selektor steht.

   ⚠️ Im Stylesheet SAH die Regel richtig aus. Erst die Messung am
   gerenderten Element zeigte, dass sie nicht greift — ein Wert, den man
   setzt, ist nicht derselbe wie einer, der gilt. */
.mmu-stadtwahl a:any-link {
  /* 🔴 Trapez ueber clip-path, nicht ueber gedrehte Pseudoelemente. Der
     Entwurf zeigt eine schraege Kante links und rechts; mit zwei gedrehten
     ::before/::after waere sie bei jeder Schriftgroesse neu zu rechnen. */
  clip-path: polygon(0.45rem 0, calc(100% - 0.45rem) 0, 100% 100%, 0 100%);
  display: inline-flex;
  align-items: center;
  /* 44px Trefferflaeche, wie jede Bedienflaeche dieser Seite. */
  min-height: 44px;
  padding: 0 var(--raum-4);
  background: var(--mmu-papier);
  color: var(--mmu-papier-text);
  text-decoration: none;
  transition: translate 160ms var(--mmu-feder), background 160ms ease;
}
/* ⚠️ Die Zahl in Klammern erbt --mmu-gedimmt und staende auf dem Papier bei
   gemessenen 2,12:1. Dritter Fall dieser Art an einem Tag — wer eine
   Papierflaeche anlegt, muss JEDEN Text darauf mitnehmen. Die Vererbung
   folgt dem Dokumentbaum, nicht der Farbwelt. */
.mmu-stadtwahl a .mmu-stadtwahl-zahl { color: var(--mmu-papier-leise); }

/* Ein Reiter, den man zieht, kommt ein Stueck heraus. */
.mmu-stadtwahl a:hover,
.mmu-stadtwahl a:focus-visible { translate: 0 -2px; }

/* -------------------------------------------------------------------------
   Die Vereine als angepinnte Zettel (Handoff v3, „Vereine")
   -------------------------------------------------------------------------
   „Angepinnte Papierzettel (Pinnnadel oben, leicht gedreht, Hover richtet
   auf): Logo oder Fraktur-Initiale, Name, Ort, ‚Bekannt für', ‚Setzt sich
   ein für', Kanal-Knöpfe in dunkler Tinte."

   ⚠️ Aus einer LISTE werden KARTEN, und das Markup bleibt eine Liste. Das
   ist Absicht: Eine Liste sagt Vorlesehilfen, wie viele Eintraege kommen,
   und behaelt ihre Reihenfolge. Was sich aendert, ist allein die
   Darstellung. */
/* ⚠️ Die 18rem Mindestbreite sind 288 px und passen auf einem 320-px-Schirm
   NICHT: Dort bleiben nach dem Seitenpolster 260 px, und 'auto-fill' legt
   trotzdem eine Spur in Mindestbreite — gemessen 2 px Dokument-Ueberstand.
   Die Medienabfrage unter 24rem setzt deshalb eine Spalte; sie steht weiter
   unten im Blatt.
   🔴 KEIN 'min(18rem, 100%)' hier. Der Prozentwert in minmax bezieht sich
   auf die Spaltengroesse selbst und ist zirkulaer — beim Filterraster hat
   er am 01.10.2026 zwei zu enge Spalten erzeugt statt einer passenden. */
.mmu-vereine .mmu-liste {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(18rem, 1fr));
  gap: var(--raum-6) var(--raum-5);
  border-top: 0;
}

.mmu-vereine .mmu-liste li {
  /* Das Raster der Listenzeile zuruecknehmen — hier ist jede Zeile eine
     eigene Karte, kein Teil einer Tabelle. */
  display: block;
  position: relative;
  padding: var(--raum-6) var(--raum-4) var(--raum-4);
  border-top: 0;
  background: var(--mmu-papier);
  color: var(--mmu-papier-text);
  box-shadow: 0 5px 16px rgb(0 0 0 / 0.45);
  transition: rotate 240ms var(--mmu-feder), translate 240ms var(--mmu-feder);
}

/* Feste Neigung je Platz, nicht zufaellig — dieselbe Begruendung wie bei
   Stempeln, Anschlaegen und Bereichskacheln: Ein Stapel, der bei jedem
   Seitenaufbau anders liegt, sieht nach Zittern aus statt nach Handarbeit. */
.mmu-vereine .mmu-liste li:nth-of-type(3n+1) { rotate: -1.1deg; }
.mmu-vereine .mmu-liste li:nth-of-type(3n+2) { rotate: 0.8deg; }
.mmu-vereine .mmu-liste li:nth-of-type(3n)   { rotate: -0.5deg; }
.mmu-vereine .mmu-liste li:hover,
.mmu-vereine .mmu-liste li:focus-within { rotate: 0deg; translate: 0 -3px; }

/* Die Pinnnadel. Rein dekorativ, deshalb ein Pseudoelement und kein Bild:
   Sie traegt keine Auskunft, die jemandem fehlen wuerde. */
.mmu-vereine .mmu-liste li::before {
  content: "";
  position: absolute;
  top: 0.55rem;
  left: 50%;
  translate: -50% 0;
  width: 0.7rem;
  height: 0.7rem;
  border-radius: 50%;
  background: var(--mmu-akzent);
  box-shadow: 0 2px 4px rgb(0 0 0 / 0.5), inset 0 -2px 3px rgb(0 0 0 / 0.35);
}

/* 🔴 ALLE Schrift auf dem Zettel in dunkler Tinte. Name, Ort, die
   Beschriftungen der Angaben und die Kanalknoepfe erben sonst die Farben der
   dunklen Welt und stuenden hell auf hellem Papier. */
.mmu-vereine .mmu-liste li .mmu-vereinsname,
.mmu-vereine .mmu-liste li .mmu-vereinsort,
.mmu-vereine .mmu-liste li dd { color: var(--mmu-papier-text); }
.mmu-vereine .mmu-liste li dt { color: var(--mmu-papier-leise); }

.mmu-vereine .mmu-vereinsname {
  display: block;
  font-family: var(--schrift-prosa);
  font-size: var(--t-gross);
  font-weight: 700;
}
.mmu-vereine .mmu-vereinsort { display: block; margin-bottom: var(--raum-3); }

/* Die Kanalknoepfe in dunkler Tinte statt in heller Kante. */
.mmu-vereine .mmu-liste li a.mmu-kanal,
.mmu-vereine .mmu-liste li .mmu-ortsymbole a {
  border-color: var(--mmu-papier-kante);
  color: var(--mmu-papier-text);
}
.mmu-vereine .mmu-liste li a.mmu-kanal:hover,
.mmu-vereine .mmu-liste li .mmu-ortsymbole a:hover {
  border-color: var(--mmu-papier-akzent);
  color: var(--mmu-papier-akzent);
}

/* Das Logo auf dem Zettel: ein aufgeklebter Abzug. */
.mmu-vereine .mmu-vereinslogo {
  display: block;
  margin-bottom: var(--raum-3);
}

/* 🔴 Die Fraktur-Initiale ersetzt ein fehlendes Logo — `:not(:has(…))`
   trifft genau die Zettel ohne Bild. Der Buchstabe kommt aus dem Attribut
   data-initiale, das die Vorlage setzt: CSS kann keinen Text aus einem
   Knoten ziehen, `attr()` aber schon.

   ⚠️ aria-hidden waere hier falsch und ist auch nicht noetig: Ein
   ::before-Inhalt steht in keinem Barrierefreiheitsbaum, den Vorlesehilfen
   verlaesslich lesen. Der Name steht ohnehin als Text daneben. */
.mmu-vereine .mmu-liste li:not(:has(.mmu-vereinslogo))::after {
  content: attr(data-initiale);
  display: block;
  margin-bottom: var(--raum-2);
  font-family: var(--schrift-titel);
  font-size: 2.6rem;
  line-height: 1;
  color: var(--mmu-papier-akzent);
}
/* ⚠️ ::after steht im Quelltext NACH dem Inhalt und erschiene unten. Das
   Raster dreht es an seinen Platz, ohne das Markup anzufassen. */
.mmu-vereine .mmu-liste li:not(:has(.mmu-vereinslogo)) {
  display: flex;
  flex-direction: column;
}
.mmu-vereine .mmu-liste li:not(:has(.mmu-vereinslogo))::after { order: -1; }

@media (prefers-reduced-motion: reduce) {
  .mmu-stadtwahl a,
  .mmu-vereine .mmu-liste li { transition: none; rotate: 0deg !important; }
  .mmu-stadtwahl a:hover,
  .mmu-stadtwahl a:focus-visible,
  .mmu-vereine .mmu-liste li:hover,
  .mmu-vereine .mmu-liste li:focus-within { translate: none; }
}


/* -------------------------------------------------------------------------
   Die Plakatwand der Festivals (Handoff v3, „Festivals")
   -------------------------------------------------------------------------
   „Plakatwand: Karten 3:4, leicht gedreht, Hover hebt an. Mit Plakat → Klick
   öffnet Lightbox. Ohne Plakat → gesetztes Schriftplakat."

   Die Lightbox gab es schon (assets/plakat.js, <dialog>), ebenso die
   Plakatausgabe. Neu ist die WAND: aus der Liste mit Plakatspalte wird eine
   Reihe hängender Plakate.

   ⚠️ Das Markup bleibt eine <ul> — wie bei den Vereinen und aus demselben
   Grund: Eine Liste sagt Vorlesehilfen, wie viele Einträge kommen. */
.mmu-festivals .mmu-liste.mmu-mit-plakaten {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(15rem, 1fr));
  gap: var(--raum-6) var(--raum-5);
  border-top: 0;
  /* 🔴 Die Plakate haengen nebeneinander, nicht in gleich hohen Kaesten.
     Ohne `align-items: start` streckt das Raster jede Karte auf die Hoehe
     der hoechsten ihrer Reihe — gemessen bei 1440 px endeten alle vier bei
     1074, ihr Inhalt aber bei 1074 / 1045 / 1046 / 1023. Unter dem Text
     standen bis zu 52 px Leerraum, und die Knopfreihen lagen auf
     verschiedenen Hoehen in einem Kasten, der ueberall gleich tief war.
     Im Entwurf endet jede Karte an ihrem Text. */
  align-items: start;
}

.mmu-festivals .mmu-mit-plakaten li {
  /* Das Spaltenraster der Listenzeile zuruecknehmen: Hier ist jede Zeile
     ein eigenes Plakat, keine Zeile einer Tabelle. */
  display: flex;
  flex-direction: column;
  gap: var(--raum-1);
  padding: 0;
  border-top: 0;
  transition: rotate 240ms var(--mmu-feder), translate 240ms var(--mmu-feder);
}

/* Feste Neigung je Platz — dieselbe Begruendung wie bei Stempeln,
   Anschlaegen, Kacheln und Vereinszetteln. */
.mmu-festivals .mmu-mit-plakaten li:nth-of-type(4n+1) { rotate: -1.2deg; }
.mmu-festivals .mmu-mit-plakaten li:nth-of-type(4n+2) { rotate: 0.9deg; }
.mmu-festivals .mmu-mit-plakaten li:nth-of-type(4n+3) { rotate: -0.6deg; }
.mmu-festivals .mmu-mit-plakaten li:nth-of-type(4n)   { rotate: 1.3deg; }
.mmu-festivals .mmu-mit-plakaten li:hover,
.mmu-festivals .mmu-mit-plakaten li:focus-within { rotate: 0deg; translate: 0 -4px; }

/* 🔴 3:4 UND `object-fit: cover`, damit die Wand eine Wand ist.
   Plakate kommen in allen Seitenverhaeltnissen; ohne festes Mass staende
   jedes Blatt anders hoch und die Reihe saehe nach Zufall aus statt nach
   Aushang. `cover` beschneidet — bei einem Plakat ist der Rand der
   verzichtbare Teil, die Mitte traegt Namen und Datum. */
.mmu-festivals .mmu-mit-plakaten .mmu-plakat,
.mmu-festivals .mmu-mit-plakaten .mmu-schriftplakat {
  aspect-ratio: 3 / 4;
  width: 100%;
  box-shadow: 0 6px 18px rgb(0 0 0 / 0.5);
}
/* 🔴 overflow haelt das Verhaeltnis, nicht aspect-ratio allein: Ein Block
   WAECHST ueber sein aspect-ratio hinaus, sobald der Inhalt groesser ist.
   Gemessen am 01.10.2026 ueber alle 56 Karten bei 1440 px: Die Plakate
   standen auf 270x387 statt 270x360, also 0,698 statt 0,750. Vier von fuenf
   vorkommenden Verhaeltniswerten verfehlten 3:4, nur einer traf zufaellig.
   Die Schriftplakate daneben trafen alle exakt 0,750 - sie tragen keinen
   Inhalt, der sie aufdrueckt.
   ⚠️ Die naheliegende Diagnose war falsch und steht hier, damit sie niemand
   noch einmal stellt: Der 1px-Rahmen am Bild erklaert nur 3 der 27 falschen
   Pixel. box-sizing allein brachte 387 auf 384 - eine Verbesserung, die wie
   eine Behebung aussieht.
   ⚠️ box-sizing trotzdem noetig: Ohne es ist das Bild durch den Rahmen
   272 statt 270 breit und raegt heraus. Mit overflow allein waere das
   unsichtbar und trotzdem falsch - und niemand faende es wieder. */
.mmu-festivals .mmu-mit-plakaten .mmu-plakat {
  overflow: hidden;
}
.mmu-festivals .mmu-mit-plakaten .mmu-plakat img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  box-sizing: border-box;
}

/* Das gesetzte Schriftplakat: doppelter Rahmen, Fraktur, rote Linie, Ort in
   Schreibmaschinenschrift. Papier, weil es ein gedrucktes Blatt ist. */
.mmu-schriftplakat {
  /* 🔴 Ohne das rechnen Rahmen und Innenabstand OBEN DRAUF: Gemessen bei
     805 px stand das Plakat 388 px breit in einem 354 px breiten Platz und
     schob die Seite 6 px aus dem Fenster — 3 px Rahmen und 16 px Abstand,
     beidseitig.
     ⚠️ Dieses Stylesheet setzt `box-sizing` NIRGENDS global — jede Stelle
     setzt es einzeln, und wer eine neue Kachel mit Rahmen oder Innenabstand
     baut, muss daran denken.
     ⚠️ Und KEINE geschweiften Klammern in diesen Kommentar. Die Pruefer
     lesen einen Regelblock, indem sie ab dem Selektor alles bis zur ersten
     schliessenden Klammer nehmen — eine Klammer im Kommentar schneidet den
     halben Block ab, und der Pruefer meldet eine Eigenschaft als fehlend,
     die dasteht. Genau daran ist „doppelter Rahmen" hier zweimal rot
     geworden: beim zweiten Mal, weil dieser Hinweis das Regex-Muster noch
     woertlich zitierte. */
  box-sizing: border-box;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: var(--raum-3);
  padding: var(--raum-4);
  background: var(--mmu-papier);
  /* Der doppelte Rahmen des Entwurfs: aussen die Kante, innen der Abstand. */
  border: 3px double var(--mmu-papier-falz);
  outline: 1px solid var(--mmu-papier-kante);
  outline-offset: -0.55rem;
  text-align: center;
}
.mmu-schriftplakat-name {
  font-family: var(--schrift-titel);
  /* Lange Festivalnamen muessen hineinpassen, ohne die Karte zu sprengen. */
  font-size: clamp(1.1rem, 2.4vw, 1.6rem);
  line-height: 1.15;
  color: var(--mmu-papier-text);
  overflow-wrap: anywhere;
}
.mmu-schriftplakat-linie {
  width: 55%;
  height: 2px;
  background: var(--mmu-papier-akzent);
}
.mmu-schriftplakat-ort {
  font-family: var(--schrift-mono);
  font-size: var(--t-klein);
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--mmu-papier-leise);
}

/* 🔴 Der „ausverkauft"-Stempel liegt QUER AUF dem Plakat, nicht daneben.
   Dieselbe Gummistempel-Sprache, die v3 für die Eintrittskarten vorgibt:
   doppelter Rahmen, Schreibmaschine, Versalien, schräg.

   ⚠️ `mix-blend-mode: multiply` lässt das Motiv durchscheinen — ein
   deckender Kasten verdeckte genau die Mitte, auf der Name und Datum stehen.
   Bei reduzierter Bewegung bleibt er; er bewegt sich nicht, er steht nur
   schief. */
.mmu-festivals .mmu-mit-plakaten li { position: relative; }

/* 🔴 DER COUNTDOWN LIEGT AUF DEM PLAKAT — Betreiberanweisung vom
   03.10.2026 („Bei den Festivals, setze den Countdown über die Plakate";
   auf Rückfrage präzisiert: AUF das Plakat, nicht darüber). Vorher stand
   er unten im Statusblock, hinter Name, Ort, Genre und den Symbolen.

   🔵 NUR OPTISCH VERSETZT, nicht im Markup verschoben — und das ist
   Absicht. Im Quelltext bleibt er im Statusblock neben „Nächste Ausgabe",
   wo er inhaltlich hingehört: Eine Vorlesehilfe liest „noch 6 Tage,
   nächste Ausgabe: Freitag, 09. Oktober 2026" statt die Zahl ohne Bezug
   vorneweg. `position: absolute` nimmt ihn aus dem Fluss, die übrigen
   Zeilen rücken nach.

   ⚠️ Ins Plakat HINEIN durfte er nicht: Das Plakat ist ein <a>, und ein
   Countdown darin würde Teil des Linktextes („noch 6 Tage, groß
   anzeigen"). Der Bezugsrahmen ist deshalb das <li> darüber — dasselbe,
   das schon der „ausverkauft"-Stempel nutzt.

   🔴 DER DECKENDE GRUND IST PFLICHT, NICHT ZIERDE. Der Countdown steht in
   #d9604b, und das Plakat darunter ist beliebig hell oder dunkel.
   Gemessen am 03.10.2026:

     auf dem Schriftplakat (#ece8df)   3,00 : 1   ← unter der Grenze
     auf Weiß                          3,67 : 1   ← unter der Grenze
     auf --mmu-flaeche (#0f0f15)       5,21 : 1   ✅

   WCAG 1.4.3 verlangt 4,5:1. Ohne eigenen Grund wäre die Angabe auf 29
   von 42 Karten (den Schriftplakaten) nicht lesbar — und auf echten
   Plakaten unvorhersehbar. Halbdurchsichtig genügt deshalb auch nicht:
   Dann hinge der Kontrast wieder am Motiv.

   📏 Der Platz reicht auf jeder Breite, über alle 42 Karten mit Countdown
   gemessen (13 mit Bild, 29 mit Schriftplakat):

     Fenster   Plakatbreite   Countdown   passt nicht
      1100px     317 - 322      123px          0
       600px     262 - 266      123px          0
       380px     324 - 330      123px          0

   🔵 Keine Kollision mit dem „ausverkauft"-Stempel: Der liegt bei 28 %
   der Plakathöhe (rund 120px), der Countdown endet bei rund 41px. */
.mmu-festivals .mmu-mit-plakaten .mmu-countdown {
  position: absolute;
  top: var(--raum-2);
  left: var(--raum-2);
  z-index: 2;
  background: var(--mmu-flaeche);
}
.mmu-festivals .mmu-mit-plakaten .mmu-eventausverkauft {
  position: absolute;
  top: 28%;
  left: 50%;
  translate: -50% 0;
  rotate: -11deg;
  z-index: 2;
  padding: 0.2em 0.6em;
  border: 3px double var(--mmu-papier-akzent);
  color: var(--mmu-papier-akzent);
  background: rgb(236 232 223 / 0.72);
  mix-blend-mode: multiply;
  font-family: var(--schrift-mono);
  font-size: var(--t-klein);
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  pointer-events: none;
}

@media (prefers-reduced-motion: reduce) {
  .mmu-festivals .mmu-mit-plakaten li {
    transition: none;
    rotate: 0deg !important;
  }
  .mmu-festivals .mmu-mit-plakaten li:hover,
  .mmu-festivals .mmu-mit-plakaten li:focus-within { translate: none; }
  /* ⚠️ Der Stempel behaelt seine Neigung: Sie ist keine Bewegung, sondern
     die Form der Sache. */
}


/* -------------------------------------------------------------------------
   Der Konzertkalender in Papiersprache (Handoff v3, „Konzerte")
   -------------------------------------------------------------------------
   🔴 WAS HIER STEHT UND WAS NICHT — die Grenze ist eine Strukturfrage,
   keine Zeitfrage:

   v3 verlangt „Eintrittskarte je Termin" mit Abrissabschnitt. Die Gigliste
   ist aber EIN Raster, in dem sich jede Zeile per `display: contents`
   aufloest, damit ihre Zellen zu Rasterfeldern werden (`.mmu-gigliste li`
   weiter oben). Ein Element mit `display: contents` hat KEINE Box — also
   auch keinen Positionierungskontext, auf dem ein Gummistempel quer liegen
   koennte, und keinen Rand fuer eine Perforation.

   ⚠️ Hinzu kommt: `.mmu-gigliste` traegt auch die Konzertlisten der
   BANDSEITEN. Ein Umbau zu Karten traefe sie mit, und v3 nennt die Karten
   ausdruecklich fuer den Kalender.

   Gebaut ist deshalb, was die Karte SPRICHT, ohne sie zu sein: Datum in
   Serifenschrift und Akzent, Preis in Schreibmaschinenschrift,
   Verzeichnisbands rot unterstrichen, abgesagte Termine zurueckgenommen.
   Der Kartenumbau samt Abrissabschnitt braucht ein eigenes Raster und die
   Merkliste (Interaktion 9) und ist als solcher vorgelegt. */

/* „Datum (Serif, #a93226)". Die Ziffern bleiben tabellarisch — untereinander
   stehende Daten sind der Grund, warum die Spalte lesbar ist. */
.mmu-gigliste .mmu-gigdatum {
  font-family: var(--schrift-prosa);
  color: var(--mmu-akzent-text);
}

/* „Preis (Mono)". Ein Betrag ist eine Zahl, keine Prosa. */
.mmu-gigpreis {
  font-family: var(--schrift-mono);
  font-variant-numeric: tabular-nums;
}

/* „Veranstaltungs-/Tourname kursiv" — er ist der Titel des Abends, nicht
   sein Inhalt. */
.mmu-gigevent { font-style: italic; }

/* 🔴 „Bands aus dem Verzeichnis unterstrichen (rote Unterstreichung, 2px,
   offset 3px) und verlinkt."

   Das ist die einzige Stelle im Kalender, an der die Unterscheidung
   SICHTBAR wird: Auf den Konzerten stehen ueberwiegend auswaertige Namen
   (gemessen 13.08.2026: 596 Namen, davon 51 aus dem Verzeichnis). Wer einen
   unterstrichenen Namen sieht, weiss, dass dahinter eine Seite liegt — und
   wer keinen sieht, sucht nicht vergeblich.

   ⚠️ `text-decoration` statt `border-bottom`: Eine Unterstreichung folgt
   dem Zeilenumbruch, ein Rahmen nicht. Bei „Thy Art Is Murder" ueber zwei
   Zeilen liefe der Rahmen quer durch den Kasten. */
.mmu-gignamen a {
  text-decoration: underline;
  text-decoration-color: var(--mmu-akzent-text);
  text-decoration-thickness: 2px;
  text-underline-offset: 3px;
}
.mmu-gignamen a:hover,
.mmu-gignamen a:focus-visible { text-decoration-color: var(--mmu-text); }

/* „Abgesagte Karten mit 72 % Deckkraft."

   ⚠️ Der Durchstrich BLEIBT. Er steht seit dem 17.08.2026 mit eigener
   Begruendung im Stylesheet („Abgesagt ist kein Nebenumstand"), und die
   Deckkraft ersetzt ihn nicht: Sie nimmt zurueck, er widerspricht. Ein
   Termin, der nur blasser dasteht, liest sich wie ein alter — einer mit
   Durchstrich wie ein abgesagter.

   Nicht auf `.mmu-abgesagt` selbst, sondern auf seine Zellen: Das <li>
   traegt `display: contents` und hat keine Box, auf die `opacity` wirken
   koennte.

   🔴 `:not(.mmu-gigkarte)` — DIE KARTE HAT EINE BOX und traegt ihre
   Deckkraft selbst (0.85, weiter unten). Ohne die Ausnahme bekaeme sie
   BEIDE, und verschachtelte Deckkraft multipliziert sich:
   0,85 x 0,72 = 0,61. Live gemessen fielen dadurch sechs Elemente durch,
   die bei 0,85 allein halten — `.mmu-gigstatus` auf 3,59 und
   `.mmu-preisquelle` auf 3,52.
   ⚠️ Gefunden erst, nachdem der Pruefer die KUMULATIVE Deckkraft ueber
   die Elternkette rechnete. Wer nur `getComputedStyle(el).opacity` liest,
   sieht 1 am Kind und 0,85 an der Karte und haelt beides fuer den
   Wirkwert. */
.mmu-gigliste .mmu-abgesagt:not(.mmu-gigkarte) > * { opacity: 0.72; }


/* -------------------------------------------------------------------------
   Die Eintrittskarte (Handoff v3, „Konzerte" · v2 Interaktion 8)
   -------------------------------------------------------------------------
   „Papierkarten, minimal gedreht, Hover richtet gerade und hebt an. Rechts
   perforierter Abschnitt (gestrichelte Kante, Stanzlöcher oben/unten)."

   🔴 WO ES SIE GIBT. Die Karte haengt an `.mmu-gigkarte`, und die setzt
   `mmu_gig_zeile()` nur bei `$auswahl` — im Kalender, auf den 19
   Stil-Seiten, die sich die Vorlage teilen, und seit dem 03.10.2026 bei
   den KOMMENDEN Konzerten jeder Band- UND Ortsseite (Betreiberwunsch,
   erst die Bands, dann „das gleiche bitte auch bei den Venues"). Die
   beiden Konzertarchive rufen dieselbe Funktion ohne Auswahl und behalten
   ihre Liste: Was vorbei ist, kann man nicht mehr vormerken.

   ⚠️ Hier stand bis zum 03.10.2026 „NUR IM KALENDER". Das war eine
   Beschreibung des Ist-Zustands und wurde zur Grenze gelesen — dabei ist
   die Karte gerade so gebaut, dass sie ueberall traegt: Das <ul> erkennt
   sie per `:has()`, und sie belegt ihre Farben fuer Papier selbst um.

   ⚠️ Deshalb greift jede Regel hier ueber `.mmu-gigkarte` und nicht ueber
   `.mmu-gigliste li`: Dieselbe Liste traegt beide Formen. */

/* Aus dem Spaltenraster wird ein Stapel Karten.
   `:has()` statt einer Klasse am <ul>: Das Markup der Monatslisten entsteht
   an mehreren Stellen, und eine Klasse muesste ueberall mitgepflegt werden —
   die Karten sagen selbst, was sie sind. */
.mmu-gigliste:has(> .mmu-gigkarte) {
  display: flex;
  flex-direction: column;
  gap: var(--raum-4);
}

.mmu-gigkarte {
  /* ⚠️ `display: contents` aus der Grundregel MUSS hier zurueck. Ohne eigene
     Box gibt es keinen Positionierungskontext fuer den Gummistempel und
     keinen Rand fuer die Perforation — genau daran ist der Umbau im ersten
     Anlauf gescheitert. */
  /* 🔴 DIE KARTE IST EINE HELLE INSEL IN EINER DUNKLEN SEITE, und sie
     belegt ihre Farben deshalb selbst um. Drei Fundstellen standen live
     falsch — Ortslinks 3,00:1, der Preisvermerk brachte seinen eigenen
     schwarzen Grund mit (3,21:1), abgesagte Orte 2,12:1 — und alle drei
     hatten dieselbe Ursache: Sie erben Farben, die fuer Schwarz gewaehlt
     wurden.
     🎯 Variablen statt drei Flicken: Was kuenftig in der Karte dazukommt,
     erbt von selbst die Papierwerte. Ein Flicken je Fundstelle haette nur
     die drei geschlossen, die jemand gefunden hat. */
  --mmu-text: var(--mmu-papier-text);        /* 14,62:1 */
  --mmu-gedimmt: var(--mmu-papier-leise);    /*  5,36:1 */
  --mmu-akzent-text: var(--mmu-papier-akzent); /* 5,42:1 */
  --mmu-grund: var(--mmu-papier);
  --mmu-linie: var(--mmu-papier-kante);

  display: grid;
  /* 🔴 VIER SPALTEN, nicht drei: Datum, Bands, Ort -- und der Abriss.

     Bis zum 01.10.2026 standen hier drei. Der Abriss ist das VIERTE Kind
     und fiel damit in die zweite Zeile unter das Datum: ein Stueck
     perforiertes Papier mitten in der Karte, links unten. (Betreiber am
     Bildschirmfoto: "das mit dem abreissen ist rechts und sieht so
     ueberhaupt nicht gut aus.")

     🎯 Eine Eintrittskarte reisst man am RAND ab. Die vierte Spalte ist
     `auto` -- sie nimmt genau die Breite des Abschnitts, und die drei
     Inhaltsspalten teilen sich den Rest wie bisher. */
  grid-template-columns: minmax(6rem, auto) minmax(0, 1fr) auto auto;
  align-items: center;
  gap: var(--raum-2) var(--raum-4);
  position: relative;
  padding: var(--raum-4);
  border-top: 0;
  background: var(--mmu-papier);
  color: var(--mmu-papier-text);
  box-shadow: 0 4px 14px rgb(0 0 0 / 0.4);
  transition: rotate 240ms var(--mmu-feder), translate 240ms var(--mmu-feder);
}

/* „Minimal gedreht" — feste Neigung je Platz, wie bei Stempeln, Anschlaegen,
   Kacheln, Zetteln und Plakaten. Hier sehr klein: Ein Stapel Karten
   untereinander verzeiht weniger als eine Wand. */
.mmu-gigkarte:nth-of-type(3n+1) { rotate: -0.25deg; }
.mmu-gigkarte:nth-of-type(3n+2) { rotate: 0.2deg; }
.mmu-gigkarte:nth-of-type(3n)   { rotate: -0.15deg; }
.mmu-gigkarte:hover,
.mmu-gigkarte:focus-within { rotate: 0deg; translate: 0 -2px; }

/* 🔴 ALLE Schrift auf der Karte in Papiertinte — vierte Fundstelle dieser
   Art heute. Datum, Bands, Ort, Preis und die Genrezeile erben sonst die
   Farben der dunklen Welt und stuenden hell auf hellem Papier. */
/* 🔴 `a:any-link` UND NICHT NUR `a` — dieselbe Spezifitaetsfalle wie bei
   der Stadtwahl (weiter oben). Die Grundregel dieser Datei (Zeile 956)
   setzt `main[class^="mmu-"] a`,
   das ist (0,1,2) und schlaegt jede Regel ueber `.mmu-gigort a` (0,1,1);
   die Umbelegung der Variablen oben erreicht den Link deshalb nicht — er
   bekommt seine Farbe direkt, nicht ueber `color: inherit`.
   `.mmu-gigkarte a:any-link` ist (0,2,1) und gewinnt in der Klassenspalte.
   ⚠️ Live gemessen: 200 von 200 Karten trugen 3,00:1. */
.mmu-gigkarte a:any-link { color: var(--mmu-papier-akzent); }

.mmu-gigkarte .mmu-gigdatum { color: var(--mmu-papier-akzent); }
.mmu-gigkarte .mmu-gignamen,
.mmu-gigkarte .mmu-gigortname,
.mmu-gigkarte .mmu-gigevent { color: var(--mmu-papier-text); }
.mmu-gigkarte .mmu-giggenres,
.mmu-gigkarte .mmu-gigstadt,
.mmu-gigkarte .mmu-gigpreis,
.mmu-gigkarte .mmu-bandgenre,
.mmu-gigkarte .mmu-preisquelle { color: var(--mmu-papier-leise); }

/* 🔴 DIE GENREZEILE BRINGT IHRE EIGENE DECKKRAFT MIT (0.75, Zeile 1797) —
   und auf Papier kippt sie damit auf 3,22:1. Vierter Fall derselben
   Bauart: eine Regel der dunklen Welt, die auf der hellen Insel nicht
   mehr trägt.
   📏 Warum es dort unschaedlich ist und hier nicht: Auf den Ortsseiten
   steht dieselbe Zeile hell auf Schwarz, nominal 17,16 — 0,75 davon sind
   immer noch 9,48. Auf Papier zieht dieselbe Deckkraft von 5,36 ab, und
   dann bleibt nichts uebrig. Eine Deckkraft ist nur so harmlos wie der
   Abstand, von dem sie abzieht.
   ✅ Geprueft, dass es die EINZIGE ist: In der Karte tragen sonst nur
   `.mmu-preisquelle` und `.mmu-gigwahl` eine eigene Deckkraft, beide 0 —
   der versteckte Preisvermerk und das unsichtbare Kaestchen. Beide
   Absicht, beide kein Mangel. */
.mmu-gigkarte .mmu-giggenres { opacity: 1; }

/* Die Verzeichnisbands bleiben unterstrichen, nur in Papierrot — die
   Akzentfarbe der dunklen Welt haelt auf Papier nur 3,00:1. */
.mmu-gigkarte .mmu-gignamen a {
  color: var(--mmu-papier-text);
  text-decoration-color: var(--mmu-papier-akzent);
}
.mmu-gigkarte .mmu-gignamen a:hover,
.mmu-gigkarte .mmu-gignamen a:focus-visible {
  text-decoration-color: var(--mmu-papier-text);
}

/* Das Datum gross und in Serifenschrift — es ist die Kopfzeile der Karte. */
.mmu-gigkarte .mmu-gigdatum {
  font-family: var(--schrift-prosa);
  font-size: var(--t-gross);
  line-height: 1.15;
}

/* ── Der Abrissabschnitt ────────────────────────────────────────────────── */

/* „Rechts perforierter Abschnitt (gestrichelte Kante, Stanzlöcher oben und
   unten)." Die gestrichelte Kante ist ein Rahmen, die Stanzloecher sind zwei
   Kreise, die den Papiergrund durchbrechen. */
.mmu-gigabriss {
  /* 📐 Die letzte Spalte, ueber ALLE Zeilen. Ohne `grid-row` endete der
     Abschnitt an der Hoehe seiner eigenen Zeile und die Perforation
     waere eine halbe Linie. Eine Karte reisst man ganz durch. */
  grid-column: -2;
  grid-row: 1 / -1;
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: var(--raum-1);
  align-self: stretch;
  /* 44px Trefferflaeche, wie jede Bedienflaeche dieser Seite. */
  min-width: 5.5rem;
  min-height: 44px;
  padding: var(--raum-3) var(--raum-2);
  border-left: 2px dashed var(--mmu-papier-falz);
  cursor: var(--mmu-zeiger-klick);
  cursor: var(--mmu-zeiger-klick-hidpi);
  user-select: none;
  font-family: var(--schrift-mono);
  font-size: var(--t-klein);
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--mmu-papier-leise);
  transition: color 160ms ease;
}

/* Die Stanzloecher: oben und unten auf der Perforationslinie. Sie zeigen
   den Seitengrund, als waere das Papier durchbrochen. */
/* 🔴 DIE STANZLOECHER BRAUCHEN DEN SEITENGRUND, NICHT --mmu-grund.

   Bis zum 01.10.2026 stand hier `var(--mmu-grund)` -- und die Karte
   belegt genau diese Variable um (`--mmu-grund: var(--mmu-papier)`),
   damit alles in ihr die Papierwerte erbt. Die Loecher erbten mit:
   gemessen rgb(236, 232, 223), also exakt die Kartenfarbe. Ein Loch in
   Kartenfarbe auf der Karte ist kein Loch. (Betreiber: "Die Loecher sind
   auch nicht da.")

   🎯 Ein Stanzloch zeigt, was HINTER der Karte liegt. Es braucht den
   echten Seitengrund -- die WordPress-Vorgabe, die die Karte nicht
   anfasst. Der Rueckfallwert #000 gilt, wenn das Theme keine Palette
   liefert; dasselbe Muster wie bei der Grunddefinition oben.

   ⚠️ Sie sitzen um ihren halben Durchmesser nach aussen versetzt und
   liegen damit AUF der Perforationskante -- so sieht es aus, als waere
   das Papier dort durchstossen, nicht als klebten zwei Punkte daneben. */
.mmu-gigabriss::before,
.mmu-gigabriss::after {
  content: "";
  position: absolute;
  left: -0.3rem;
  width: 0.6rem;
  height: 0.6rem;
  border-radius: 50%;
  background: var(--wp--preset--color--grund, #000);
}
.mmu-gigabriss::before { top: -0.3rem; }
.mmu-gigabriss::after { bottom: -0.3rem; }

/* 🔴 Das Kaestchen bleibt bedienbar, nur unsichtbar — dasselbe Muster wie
   bei Stempeln und Schieber. `display: none` naehme es der Tastatur. */
.mmu-gigabriss .mmu-gigwahl {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: 0;
  opacity: 0;
  pointer-events: none;
}

/* Gemerkt: Der Abschnitt faerbt sich, das Wort wechselt. */
/* Das kleine Wort unter "Merken" -- die Anleitung auf dem Abschnitt. */
.mmu-gigabriss-tun {
  font-size: var(--t-mikro);
  letter-spacing: 0.04em;
  text-transform: none;
  opacity: 0.75;
}

/* 🔴 DER ABGERISSENE ABSCHNITT IST EIN STEMPEL, keine gefaerbte Flaeche.

   Bis zum 01.10.2026 blieb der Abschnitt stehen und fuellte sich mit der
   Akzentfarbe. Das Soll-Bild zeigt etwas anderes: Der Abschnitt ist WEG --
   abgerissen eben -- und an seiner Stelle steht ein schraeg aufgedrueckter
   Stempel "Gemerkt · zurücklegen".

   📏 Werte aus dem Entwurf: 1.5px Rahmen in der Papier-Akzentfarbe,
   Schrift in derselben Farbe, kein Grund, 0.6875rem, 600, 0.1em gesperrt,
   Versalien, -4 Grad.

   ⚠️ Die Drehung steht in der Einzeleigenschaft `rotate` und nicht in
   `transform`: Die Karte selbst traegt bereits eine Drehung, und eine
   zweite in `transform` wuerde sie ueberschreiben statt sich zu addieren.
   Hier ist es der Abschnitt, nicht die Karte -- aber dieselbe Regel gilt
   fuer die Abrissbewegung unten, die beides braucht. */
.mmu-gigabriss-gemerkt {
  display: none;
  font-size: 0.6875rem;
  font-weight: 600;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  text-align: center;
  text-wrap: balance;
  /* ⚠️ Eigene Zeilenhoehe: Die Karte gibt 1.55 vor (Fliesstext), und der
     11px-Stempel wurde damit 30 px hoch -- der Stempel insgesamt 50 statt 36.
     Ein Stempelabdruck hat keinen Zeilenabstand. */
  line-height: 1.2;
}

.mmu-gigabriss:has(.mmu-gigwahl:checked) {
  /* Der Abschnitt gibt seine Abschnittsform auf: keine Perforation mehr,
     keine Stanzloecher, kein eigener Rand zum Kartenkoerper. */
  border-left: 0;
  /* 📏 `padding: 0 0.7rem` nach dem Entwurf -- KEIN senkrechtes Polster.
     Mit --raum-2 oben und unten plus content-box mass der Stempel 68 statt
     36 px: dritter Fall derselben Falle an diesem Tag (Statusschieber,
     Genre-Stempel, hier). Die 36 sind die Gesamthoehe. */
  padding: 0 0.7rem;
  min-height: 36px;
  box-sizing: border-box;
  /* 🔴 UND SEINE ABSCHNITTSMASSE. Der Abriss spannt sich ueber die ganze
     Kartenhoehe (align-self: stretch) und haelt eine Mindestbreite von
     5.5rem -- beides richtig fuer einen Abschnitt am Kartenrand, falsch
     fuer einen Stempel. Gemessen blieb er sonst 68 px hoch und brach den
     Text um; im Entwurf ist es ein kleiner, einzeiliger Knopf, der schraeg
     auf dem Papier liegt. */
  align-self: center;
  min-width: 0;
  white-space: nowrap;
  border: 1.5px solid var(--mmu-papier-akzent);
  color: var(--mmu-papier-akzent);
  background: none;
  rotate: -4deg;
}
/* Die Stanzloecher gehoeren zur Perforation und verschwinden mit ihr. */
.mmu-gigabriss:has(.mmu-gigwahl:checked)::before,
.mmu-gigabriss:has(.mmu-gigwahl:checked)::after {
  display: none;
}
/* Ein Wort ist sichtbar, nie zwei. */
.mmu-gigabriss:has(.mmu-gigwahl:checked) .mmu-gigabriss-wort,
.mmu-gigabriss:has(.mmu-gigwahl:checked) .mmu-gigabriss-tun {
  display: none;
}
.mmu-gigabriss:has(.mmu-gigwahl:checked) .mmu-gigabriss-gemerkt {
  display: block;
}
.mmu-gigabriss:hover { color: var(--mmu-papier-text); }

/* -------------------------------------------------------------------------
   Der abgerissene Zettel faellt
   -------------------------------------------------------------------------
   Handoff: "Tippen → Abschnitt reisst ab (faellt schraeg weg, 420ms) und
   landet in der Merkliste."

   🎯 Es faellt eine KOPIE. Das Original wird im selben Augenblick zum
   Stempel -- so sieht man beides: den Zettel, der faellt, und die Karte,
   die ihn los ist. Wuerde das Original selbst fallen, waere die Karte
   waehrend der Bewegung ohne Abschnitt und ohne Stempel.

   ⚠️ Die Kopie liegt UEBER der Karte (z-index) und nimmt keine Klicks an:
   Sie ist ein Bild, kein Bedienelement. Ihre Checkbox entfernt das Skript,
   sonst stuende derselbe Name zweimal im Formular.

   ⚠️ §7: Ohne JavaScript entsteht keine Kopie, und der Abschnitt wechselt
   ohne Bewegung zum Stempel -- genau wie bisher. Die Bewegung ist Zierde,
   das Merken ist Funktion. */
.mmu-abriss-faellt {
  position: absolute;
  z-index: 5;
  pointer-events: none;
  margin: 0;
  animation: mmu-abriss-weg 420ms cubic-bezier(0.35, 0, 0.75, 0.4) forwards;
  transform-origin: top left;
}

/* Der Zettel kippt um seine obere Ecke weg und faellt dabei -- die
   Bewegung einer Hand, die ihn abreisst und loslaesst. Die Drehung steht
   in `rotate`, der Weg in `translate`: zwei Einzeleigenschaften, damit
   sich nichts gegenseitig ueberschreibt. */
@keyframes mmu-abriss-weg {
  from {
    translate: 0 0;
    rotate: 0deg;
    opacity: 1;
  }
  to {
    translate: 1.4rem 4.5rem;
    rotate: 16deg;
    opacity: 0;
  }
}

/* ⚠️ Bei reduzierter Bewegung faellt nichts. Der Handoff nennt die
   Abrissanimation ausdruecklich unter dem, was dann aus bleibt. Das
   Merken selbst ist davon nicht beruehrt. */
@media (prefers-reduced-motion: reduce) {
  .mmu-abriss-faellt { display: none; }
}

/* 🔴 Der Fokusrahmen gehoert an den ABSCHNITT, nicht an das versteckte
   Kaestchen — sonst bedient man mit der Tastatur etwas Unsichtbares. */
.mmu-gigabriss:has(.mmu-gigwahl:focus-visible) {
  outline: 2px solid var(--mmu-papier-akzent);
  outline-offset: 2px;
}

/* ── Der Gummistempel ──────────────────────────────────────────────────── */

/* „Status ausverkauft / abgesagt / verschoben als Gummistempel quer über der
   Karte (3px double, −11°, Mono, Versalien, multiply)."

   ⚠️ Dieselbe Sprache wie auf den Festivalplakaten — es ist dieselbe Welt.
   `multiply` laesst die Karte durchscheinen; ein deckender Kasten verdeckte
   die Bandnamen darunter. */
.mmu-gigkarte .mmu-gigausverkauft,
.mmu-gigkarte .mmu-gigstatus {
  position: absolute;
  top: 50%;
  left: 50%;
  translate: -50% -50%;
  rotate: -11deg;
  z-index: 2;
  padding: 0.2em 0.6em;
  border: 3px double var(--mmu-papier-akzent);
  background: rgb(236 232 223 / 0.55);
  color: var(--mmu-papier-akzent);
  mix-blend-mode: multiply;
  font-family: var(--schrift-mono);
  font-size: var(--t-klein);
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  white-space: nowrap;
  /* Ein Stempel ist keine Bedienflaeche. */
  pointer-events: none;
}

/* „Abgesagte Karten mit 72 % Deckkraft." Auf der Karte sitzt sie am
   Element selbst — anders als in der Listenform, wo das <li> keine Box hat. */
/* 🔴 0.85 UND NICHT 0.72 — die Deckkraft senkt BEIDE Seiten des
   Kontrasts. Das Papier mischt sich mit dem schwarzen Grund darunter, der
   Text wird ebenfalls blasser, und der Abstand schrumpft doppelt. Live
   gemessen fielen die abgesagten Karten damit unter AA:

     alpha   Datum   Ort/Abriss   Namen
     0,72     4,18       4,11      7,86   <- war live, faellt durch
     0,80     4,60       4,54      9,64   haelt, aber 0,04 Reserve
     0,85     4,79       4,75     10,69   <- hier

   ⚠️ Nicht auf 0,80 senken, auch wenn es rechnerisch genuegt: Wer spaeter
   einen Papierton um eine Nuance verschiebt, kippt die Karte unter AA,
   ohne es zu merken. Bei einer Farbaenderung rechnet niemand die
   Deckkraft nach.
   ⚠️ Und die schwachen Toene entscheiden, nicht die kraeftigen: Die
   Bandnamen (#17171b) halten selbst bei 0,72 noch 7,86. Durch fallen
   Datum und Ortszeile, die nominal ohnehin nur bei 5,4 liegen. */
.mmu-gigkarte.mmu-abgesagt { opacity: 0.85; }

/* 🔴 VERSCHOBEN STREICHT NUR DAS DATUM (Betreiberentscheidung 30.09.2026).
   Der Abend findet statt, nur nicht an diesem Tag — der Durchstrich sagt
   genau das, wenn er allein auf dem Datum liegt. Bandnamen und Ort bleiben
   lesbar, und die Karte tritt NICHT zurueck: keine Deckkraft, denn sie
   gilt noch.
   ⚠️ Damit bleibt der volle Durchstrich das Zeichen fuer „faellt aus". Zwei
   Zustaende, zwei Zeichen. */
.mmu-verschoben .mmu-gigdatum { text-decoration: line-through; }

@media (max-width: 40rem) {
  /* Auf schmalen Geraeten klappt der Abriss von der rechten Kante nach
     OBEN: Drei Spalten mit einem 5,5rem breiten Abschnitt liessen fuer die
     Bandnamen zu wenig.

     ⚠️ Hier stand bis zum 02.10.2026 „wandert der Abriss UNTER den
     Inhalt". Das war nie so. `.mmu-gigabriss` traegt `grid-row: 1 / -1`;
     in einem einspaltigen Raster ohne eigene Zeilendefinition wird daraus
     `1 / 2`, und der Abschnitt steht in der ERSTEN Zeile — vor Datum,
     Bands und Ort. 📏 Gemessen am 02.10.2026, 375x812: Abriss bei y=1744,
     Datum bei 1822. Ein Kommentar, der eine Absicht beschreibt statt des
     Ergebnisses, ist schlimmer als keiner: Er sieht aus wie eine Messung. */
  .mmu-gigkarte {
    grid-template-columns: minmax(0, 1fr);
  }

  /* 🔴 DER STRICH GEHOERT UNTER DEN ABSCHNITT (Betreiber, 02.10.2026:
     „Wenn dann sollte der Strich unter dem Abbreissen sein").

     Er stand oben — und trennte damit den KARTENRAND vom Abschnitt statt
     den Abschnitt vom Inhalt. Eine Eintrittskarte reisst man zwischen
     Abschnitt und Karte durch, nicht am Rand entlang. Auf dem Desktop
     stimmt es: Dort sitzt der Abschnitt rechts, und `border-left` liegt
     genau zwischen ihm und dem Inhalt. Beim Klappen nach oben wurde aus
     der linken Kante die obere statt der unteren.

     📐 `padding-bottom` statt `-top`: Der Text braucht Luft zur
     Perforation, nicht zum Kartenrand. Den Abstand nach oben setzt
     ohnehin das Kartenpolster (16 px, gemessen). */
  .mmu-gigabriss {
    flex-direction: row;
    border-left: 0;
    border-bottom: 2px dashed var(--mmu-papier-falz);
    padding-top: var(--raum-1);
    padding-bottom: var(--raum-3);
  }

  /* Die Stanzloecher wandern mit — auf die waagerechte Perforation, und
     die liegt jetzt UNTEN. ⚠️ `top: auto` muss dabeistehen: Die Grundregel
     setzt `top` fuer die senkrechte Lage, und ohne Ruecknahme zoege das
     Loch an beiden Kanten gleichzeitig. */
  .mmu-gigabriss::before { top: auto; bottom: -0.3rem; left: -0.3rem; }
  .mmu-gigabriss::after { top: auto; bottom: -0.3rem; left: auto; right: -0.3rem; }
}

@media (prefers-reduced-motion: reduce) {
  .mmu-gigkarte { transition: none; rotate: 0deg !important; }
  .mmu-gigkarte:hover,
  .mmu-gigkarte:focus-within { translate: none; }
}


/* 🔴 DIE BEDIENFELDER DUERFEN SCHRUMPFEN. Drei Dinge halten sie sonst auf
   ihrer Inhaltsbreite, und alle drei muessen weg, sonst wirkt keines:

     1. ein <select> ist so breit wie seine laengste Option — hier 229 px
        („Landkreis Muenchen"), unabhaengig von jeder Spaltenbreite
     2. Flex- und Rasterkinder haben die Vorgabe min-width: auto und
        gehen nie unter ihre Inhaltsbreite
     3. der Statusschieber trug min-width: min-content, was dasselbe
        ausdruecklich festschreibt

   Live gemessen bei 320 px: 83 px waagerechter Ueberstand auf /bands/,
   nachdem der Schieber selbst schon behoben war. Eine Behebung, die nur
   eine der drei Ursachen trifft, aendert nichts — das ist der Grund,
   warum hier drei Regeln auf einmal stehen. */
.mmu-filter select,
.mmu-filter input[type="text"],
.mmu-filter input[type="search"] {
  max-width: 100%;
}
.mmu-filter-felder > *,
.mmu-filter-zeile > * {
  min-width: 0;
}
.mmu-statusschieber { min-width: 0; }

/* 🔴 AUF SCHMALEN SCHIRMEN EINE SPALTE, ausdruecklich und nicht gerechnet.

   `repeat(auto-fit, minmax(min(14rem, 100%), 1fr))` loest den Ueberlauf,
   aber es packte live trotzdem ZWEI Spalten zu je 107 px: Der Prozentwert
   in `minmax` bezieht sich auf die Spaltengroesse selbst und ist damit
   zirkulaer — der Browser loest ihn zu etwas Kleinem auf, und `auto-fit`
   nimmt sich dann zwei.

   ⚠️ 107 px sind fuer ein Auswahlfeld unbrauchbar. Der Ueberstand war
   null, die Bedienbarkeit dahin — eine Behebung, die das Mass senkt,
   loest das eine Problem und schafft ein anderes, das kein
   Ueberlauf-Pruefer sieht. Deshalb hier eine Grenze, die dasteht, statt
   einer Rechnung, die man nachvollziehen muss.

   🔵 30rem = 480 px: Darunter passt neben einem Auswahlfeld ohnehin
   nichts mehr, darueber bleiben zwei Spalten sinnvoll. */
@media (max-width: 30rem) {
  .mmu-filter-felder { grid-template-columns: 1fr; }

  /* 🔴 DAS GENRE-PANEL DARF NICHT BREITER SEIN ALS DER SCHIRM.

     Die Grundregel gibt ihm `min-width: max(100%, 20rem)` — 20rem sind
     320 px, und das ist mit Rand mehr, als ein 320-px-Schirm hergibt.
     Live gemessen: Panel 346 px breit, rechter Rand bei 393, und weil es
     `position: absolute` traegt, erzeugt es dabei KEINEN Seitenueberstand.

     🔴 Die Folge war schlimmer als ein Ueberstand: NEUN der neunzehn
     Genre-Stempel lagen ausserhalb des Schirms, und keine Ebene der Kette
     war rollbar (`scrollWidth == clientWidth` ueberall). Sie waren damit
     nicht nur unsichtbar, sondern unerreichbar — weder durch Wischen noch
     durch Rollen.

     ⚠️ Und der Ueberstand-Pruefer meldete 0. Ein absolut positionierter
     Kasten schiebt die Seite nicht; er verschwindet einfach. Wer nur den
     Seitenueberstand misst, sieht hier nichts.

     🔵 Eine Spalte statt zweier: Bei 226 px Platz packte
     `repeat(auto-fill, minmax(9rem, 1fr))` zwei Spalten zu je 144 px und
     wuchs damit auf 346. Untereinander ist die Liste laenger, aber ganz
     da. Gefunden von der Sitzung „Kanäle, Termine, Spielstätten prüfen". */
  .mmu-genrewahl > .mmu-stempelreihe {
    min-width: 100%;
    max-width: 100%;
    grid-template-columns: 1fr;
  }

  /* 🔴 DIE STUFEN DES SCHIEBERS BRAUCHEN IHRE BESCHRIFTUNG.

     Nachdem seine Breite behoben war, blieben fuenf Zellen zu je 45 px —
     und drei Beschriftungen passen da nicht hinein:

       alle 33 px ✅   aktiv 42 ✅   inaktiv 59 🔴   pausiert 68 🔴
       aufgeloest 79 🔴

     Mit `overflow: visible` ragten sie in die Nachbarstufe und
     ueberlagerten sich. Die Breite war behoben, die Lesbarkeit nicht —
     derselbe Fall wie bei den Filterfeldern eine Stunde zuvor.

     🔵 Umbruch statt Verkleinerung: Eine Stufenleiste lebt davon, dass
     man die Stufen LESEN kann. „auf-gelöst" in zwei Zeilen ist lesbar,
     „aufgelöst" in 8-px-Schrift nicht. Dafuer muss die feste Hoehe weg. */
  .mmu-schieber {
    height: auto;
    min-height: 44px;
  }
  .mmu-schieber-stufe {
    hyphens: auto;
    overflow-wrap: anywhere;
    line-height: 1.15;
    padding-block: var(--raum-1);
  }
}

/* -------------------------------------------------------------------------
   Die Merkliste (Handoff v2, Interaktion 9)
   -------------------------------------------------------------------------
   „Fest unten rechts, auf allen Seiten. Papierstapel-Optik (Schatten-Lagen
   je nach Anzahl), Zähler-Badge, kurzer Hüpfer bei neuem Eintrag."

   🔴 Der Kasten traegt `hidden` im Markup und wird vom Skript freigegeben.
   Ohne JavaScript gibt es ihn nicht — und das ist richtig: Die
   Grundfunktion (ankreuzen, absenden, Kalenderdatei bekommen) liegt im
   Kalenderformular und arbeitet ohne Skript. */
.mmu-merkliste {
  position: fixed;
  right: var(--raum-4);
  bottom: var(--raum-4);
  z-index: 40;
  max-width: min(22rem, calc(100vw - 2 * var(--raum-4)));
  background: var(--mmu-papier);
  color: var(--mmu-papier-text);
  /* Der Papierstapel: eine Grundlage plus so viele Lagen, wie merkliste.mjs
     ueber lagen() ausrechnet. Jede Lage ist ein weiterer, leicht versetzter
     Schatten — kein zweites Element. */
  box-shadow:
    0 6px 18px rgb(0 0 0 / 0.5),
    /* Lage 1 */ 3px 3px 0 -1px var(--mmu-papier-kante),
    4px 4px 0 -1px rgb(0 0 0 / 0.35);
}
/* Ab zwei Lagen kommt eine zweite Kante dazu. Die Schatten stehen fest im
   Stylesheet; das Attribut sagt nur, wie viele sichtbar sind.

   ⚠️ UEBER `data-lagen` UND NICHT ueber `[style*="--mmu-merk-lagen: 2"]`.
   Ein Attributvergleich auf den style-Text haengt daran, wie der Browser
   ihn schreibt — mit oder ohne Leerzeichen nach dem Doppelpunkt, in welcher
   Reihenfolge bei mehreren Eigenschaften. Das ist keine Zusicherung,
   sondern eine Wette auf eine Serialisierung. */
.mmu-merkliste[data-lagen="2"],
.mmu-merkliste[data-lagen="3"] {
  box-shadow:
    0 6px 18px rgb(0 0 0 / 0.5),
    3px 3px 0 -1px var(--mmu-papier-kante),
    4px 4px 0 -1px rgb(0 0 0 / 0.35),
    6px 6px 0 -2px var(--mmu-papier-kante),
    7px 7px 0 -2px rgb(0 0 0 / 0.3);
}

.mmu-merkliste summary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--raum-3);
  /* 44px Trefferflaeche, wie jede Bedienflaeche dieser Seite. */
  min-height: 44px;
  padding: 0 var(--raum-4);
  cursor: var(--mmu-zeiger-klick);
  cursor: var(--mmu-zeiger-klick-hidpi);
  font-family: var(--schrift-mono);
  font-size: var(--t-klein);
  letter-spacing: 0.08em;
  text-transform: uppercase;
  /* Den Vorgabe-Pfeil weg: Die Zahl rechts ist der Anker fuers Auge. */
  list-style: none;
}
.mmu-merkliste summary::-webkit-details-marker { display: none; }
.mmu-merkliste summary:focus-visible {
  outline: 2px solid var(--mmu-papier-akzent);
  outline-offset: -2px;
}

/* Der Zaehler als Marke. */
.mmu-merkliste-zahl {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 1.6rem;
  height: 1.6rem;
  padding: 0 0.3rem;
  border-radius: 999px;
  background: var(--mmu-papier-akzent);
  /* 📏 Gemessen: --mmu-auf-akzent (#ffffff) auf --mmu-papier-akzent
     (#a93226) ergibt 6,62:1. AA fuer Text (4,5) haelt, AAA (7) nicht —
     dieselbe Lage wie bei der Marke des Laufbands im Kopf, und aus
     demselben Grund: Die Akzentfarbe ist gesetzt, und heller als Weiss
     wird keine Schrift.

     ⚠️ DER TOKEN, NICHT `#ffffff` AN DER FUNDSTELLE. Genau das hat mein
     eigener Pruefer von heute Vormittag hier gefangen
     (test/farbwelt.test.mjs, „keine harte Farbe aus der Gegenwelt"):
     Reines Weiss in der dunklen Welt ist das Muster, nach dem er Reste der
     hellen Welt sucht. Benannt sagt die Farbe, dass sie gemeint ist — und
     der Token stand schon da, angelegt fuer genau diesen Fall. */
  color: var(--mmu-auf-akzent);
  font-variant-numeric: tabular-nums;
  font-weight: 700;
}
/* Leer ist die Marke leiser — eine rote Null fordert Aufmerksamkeit fuer
   nichts. */
.mmu-merkliste[data-leer="ja"] .mmu-merkliste-zahl {
  background: var(--mmu-papier-kante);
  color: var(--mmu-papier-text);
}

.mmu-merkliste-leer,
.mmu-merkliste-liste,
.mmu-merkliste [data-merkliste-form] {
  padding: 0 var(--raum-4) var(--raum-4);
}
.mmu-merkliste-leer {
  margin: 0;
  font-size: var(--t-klein);
  color: var(--mmu-papier-leise);
}

.mmu-merkliste-liste {
  list-style: none;
  margin: 0;
  /* Viele gemerkte Termine duerfen die Seite nicht ueberwachsen. */
  max-height: min(50vh, 20rem);
  overflow-y: auto;
}
.mmu-merkliste-liste li {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--raum-3);
  padding: var(--raum-2) 0;
  border-bottom: 1px solid var(--mmu-papier-kante);
  font-size: var(--t-klein);
}
.mmu-merkliste-titel { min-width: 0; overflow-wrap: anywhere; }

.mmu-merkliste-weg {
  flex: none;
  /* 44px, auch wenn das Zeichen klein ist. */
  width: 44px;
  height: 44px;
  border: 0;
  background: none;
  cursor: var(--mmu-zeiger-klick);
  cursor: var(--mmu-zeiger-klick-hidpi);
  color: var(--mmu-papier-leise);
  font-size: 1.25rem;
  line-height: 1;
}
.mmu-merkliste-weg:hover { color: var(--mmu-papier-akzent); }
.mmu-merkliste-weg:focus-visible {
  outline: 2px solid var(--mmu-papier-akzent);
  outline-offset: -4px;
}

/* 🔴 EINE REGEL FUER BEIDE KNOEPFE (Betreiber 03.10.2026: „das soll genauso
   wie ‚als .ics herunterladen‘ aussehen").

   ⚠️ Derselbe Selektor und nicht dieselben Werte: Kopierte Werte laufen
   auseinander, sobald jemand einen davon aendert — und niemand merkt es,
   weil beide Knoepfe fuer sich richtig aussehen.

   📏 Der Grund, warum es vorher nicht gleich war: Die Merkliste ist eine
   PAPIERFLAECHE (gemessen rgb(236, 232, 223)), der Teilknopf hatte aber die
   Farben der dunklen Seite. Beim Darueberfahren wurde er --mmu-text
   (#e8e8ea) — auf Papier praktisch unsichtbar. Er verschwand also nicht,
   er wurde weiss auf fast weiss. */
.mmu-merkliste [data-merkliste-form] button,
.mmu-merkliste-teilknopf {
  width: 100%;
  min-height: 44px;
  border: 1px solid var(--mmu-papier-falz);
  background: none;
  cursor: var(--mmu-zeiger-klick);
  cursor: var(--mmu-zeiger-klick-hidpi);
  color: var(--mmu-papier-text);
  font: inherit;
}
.mmu-merkliste [data-merkliste-form] button:hover,
.mmu-merkliste-teilknopf:hover,
.mmu-merkliste-teilknopf:focus-visible {
  border-color: var(--mmu-papier-akzent);
  color: var(--mmu-papier-akzent);
}

/* ⚠️ Im privaten Fenster laesst sich nichts speichern. Dann sagt der Kasten
   es, statt eine Dauerhaftigkeit vorzutaeuschen, die er nicht hat. */
.mmu-merkliste[data-fluechtig="ja"] .mmu-merkliste-liste::after {
  content: "Diese Liste hält nur bis zum Schließen des Fensters.";
  display: block;
  padding-top: var(--raum-2);
  font-size: var(--t-klein);
  color: var(--mmu-papier-leise);
}

/* „Kurzer Hüpfer bei neuem Eintrag." */
@keyframes mmu-merk-huepft {
  0%, 100% { translate: 0 0; }
  40%      { translate: 0 -6px; }
}
.mmu-merkliste-huepft { animation: mmu-merk-huepft 260ms var(--mmu-feder); }

@media (prefers-reduced-motion: reduce) {
  .mmu-merkliste-huepft { animation: none; }
}

@media print {
  .mmu-merkliste { display: none; }
}

@media print {
  :root {
    --mmu-grund: #fff;
    --mmu-flaeche: #fff;
    --mmu-text: #000;
    --mmu-gedimmt: #444;
    --mmu-akzent: #000;
    --mmu-kante: #666;
    --mmu-linie: #ccc;
  }
  /* Ohne Tafel gibt es nichts zu formen — und die Maske wuerde das Logo
     selbst beschneiden, weil sie auf dem Bild liegt, nicht dahinter. */
  .mmu-logo,
  .mmu-vereinslogo img { background: none; -webkit-mask-image: none; mask-image: none; }
  /* Die "gerade offen"-Marke faellt weg. Sie gilt fuer den Augenblick des
     Aufrufs; auf Papier waere sie spaetestens am naechsten Tag eine falsche
     Auskunft, die aussieht wie eine gedruckte Tatsache. Die Tabelle mit den
     Zeiten darunter bleibt und traegt alles Bleibende. */
  .mmu-jetzt { display: none; }
  .mmu-filter, .mmu-suche, .mmu-kalender-wechsel, .navigation.pagination { display: none; }
  .mmu-portraet a::after { content: " (" attr(href) ")"; font-size: 0.8em; }
  /* Der Ticker faellt weg. Er zeigt einen Ausschnitt, der vom Augenblick des
     Aufrufs abhaengt — auf Papier waere das ein eingefrorener, mittendrin
     abgeschnittener Streifen ohne Aussage. */
  .mmu-ticker { display: none; }
}
/* -------------------------------------------------------------------------
   Die Papierzettel auf schmalen Schirmen
   -------------------------------------------------------------------------
   🔴 24rem = 384 px. Darueber bleiben nach dem Seitenpolster rund 324 px,
   und die 18rem Mindestbreite der Zettelspalte passt. Darunter nicht:
   Auf einem 320-px-Schirm sind 260 px verfuegbar, die Spur wird trotzdem
   288 px breit, und die Seite schob um 2 px.

   📏 Gemessen auf /vereine/ bei 320 px, am ausgelieferten Stand:
        ul.mmu-liste   offsetWidth 260, scrollWidth 292
        Spalte         288px
        Dokument       2 px Ueberstand   ->  nachher 0
        Spalte nachher 270px, Inhalt 182 px bei 144 px Namensbreite

   ⚠️ Zwei naheliegende Ursachen habe ich vorher am lebenden Objekt
   WIDERLEGT, damit sie hier nicht noch einmal vermutet werden:
     `box-sizing: border-box` am li aendert nichts — die `width: 200px`
     stammt aus keiner Regel, sie ist der berechnete Wert IN der Spur.
     Die Drehung (`rotate`, nicht `transform`) erzeugt 3 bis 6 px
     Huellbox-Differenz bei getBoundingClientRect, aber der Ueberstand
     steht auch in offsetWidth — er ist echt.

   ⚠️ Offen: `ul.scrollWidth` liegt danach mit 274 noch 14 px ueber der
   eigenen Breite. Aus der SEITE faellt nichts (Dokumentwert 0), und das
   ist das Kriterium — woher die 14 px kommen, ist nicht geklaert. */
@media (max-width: 24rem) {
  .mmu-vereine .mmu-liste,
  .mmu-sonstiges .mmu-liste { grid-template-columns: 1fr; }
}
/* 🔴 DER HELLE FLECK UNTER DEM LOGO, nur wo er gebraucht wird
   (Betreiberentscheidung 01.10.2026). Zwei Sorten brauchen ihn:
     A  ein deckender farbiger Grund, der auf der schwarzen Tafel als
        Kasten sichtbar wird (8 Logos)
     B  ein DUNKLES Logo auf Transparenz, das auf der Tafel verschwindet
        (2 Logos; Blackened Halo deckt 24 % auf Schwarz gegen 99 % auf Weiss)

   📏 WARUM NICHT UEBERALL: Von 180 Logodateien sind 136 JPG und bringen
   ihren Grund eingebrannt mit, 125 davon exakt #000000. Die liegen auf der
   schwarzen Tafel unsichtbar — auf einem weissen Fleck stuenden sie als
   schwarzer Kasten mittendrin. Ein Fleck fuer alle haette 125 Seiten
   verschlechtert, um 10 zu verbessern.

   🔵 Die Maske ist dieselbe unregelmaessige Form, die das Blatt schon
   fuehrt (--mmu-klecks). Eine gerade Kante machte aus dem Kasten des
   Logos nur einen zweiten Kasten; die unregelmaessige Form nimmt ihm die
   Rechteckigkeit.

   ⚠️ `.mmu-logo.mmu-logo-fleck` und nicht nur `.mmu-logo-fleck`: Beide
   haetten (0,1,0), und dann entschiede die Position im Blatt. Genau daran
   ist am 01.10.2026 die Schriftfarbe der Seitenzahl gescheitert. */
.mmu-logo.mmu-logo-fleck {
  background: #fff;
  -webkit-mask-image: var(--mmu-klecks);
  mask-image: var(--mmu-klecks);
  -webkit-mask-size: 100% 100%;
  mask-size: 100% 100%;
  -webkit-mask-repeat: no-repeat;
  mask-repeat: no-repeat;
}
/* -------------------------------------------------------------------------
   Der Kopf des Aushangs
   -------------------------------------------------------------------------
   📐 Der Entwurf (v3.dc.html Zeile 114) setzt Ueberschrift, Bedienhinweis
   und "Aufraeumen" in EINE Zeile ueber der Pinnwand. Im Markup stehen sie
   als drei Geschwister, und der Knopf kommt zuletzt — gemessen lag er
   684 px unter der Ueberschrift, naemlich unter der ganzen Wand.

   🎯 Das Raster holt ihn nach oben, ohne das Markup umzubauen. Die
   Reihenfolge im Quelltext bleibt damit die, die ohne CSS Sinn ergibt:
   erst die Ueberschrift, dann die Flyer, dann der Knopf, der sie
   aufraeumt. */
.mmu-flyerkiste {
  display: grid;
  grid-template-columns: 1fr auto auto;
  grid-template-areas:
    "titel hinweis knopf"
    "wand  wand    wand";
  align-items: baseline;
  column-gap: var(--raum-4);
}
.mmu-flyerkiste > h2 { grid-area: titel; }
.mmu-aushang-hinweis { grid-area: hinweis; }
.mmu-flyerkiste > .mmu-pinnwand-aufraeumen { grid-area: knopf; }
.mmu-flyerkiste > .mmu-pinnwand { grid-area: wand; }

/* 🔴 Die Ueberschrift ist hier KEIN Kolumnentitel. Sie trug die kleine,
   gesperrte Versalienform der Abschnittsmarken ("VORSTELLUNG",
   "NEUIGKEITEN") — der Entwurf setzt sie als eigene Ueberschrift in
   1.75rem Serifenschrift, fett. Gemessen war sie 0.8125rem in Plex Sans. */
.mmu-flyerkiste > h2 {
  font-family: var(--schrift-prosa);
  font-size: 1.75rem;
  font-weight: 700;
  letter-spacing: normal;
  text-transform: none;
  color: var(--mmu-text);
  margin: 0 0 var(--raum-3);
}

/* Der Hinweis ordnet sich unter: Er sagt, was moeglich ist, und ruft nicht. */
.mmu-aushang-hinweis {
  font-size: var(--t-klein);
  color: var(--mmu-gedimmt);
}

/* ⚠️ Auf schmalen Schirmen passen drei Spalten nicht nebeneinander. Dann
   steht alles untereinander — der Hinweis bleibt lesbar, statt auf
   zwanzig Pixel gequetscht zu werden. */
@media (max-width: 40rem) {
  .mmu-flyerkiste {
    grid-template-columns: 1fr;
    grid-template-areas: "titel" "hinweis" "knopf" "wand";
    justify-items: start;
  }

  /* 🔴 DIE WAND MUSS SICH STRECKEN, SONST IST SIE ZWEI PIXEL BREIT.

     `justify-items: start` oben laesst jedes Rasterfeld seine
     INHALTSBREITE nehmen — richtig fuer Titel, Hinweis und Knopf, und
     verhaengnisvoll fuer die Wand: Ihre Plakate liegen alle
     `position: absolute`, sie hat also gar keinen Inhalt im Fluss.
     Inhaltsbreite null.

     📏 Live gemessen am 02.10.2026, 375x812 (Betreiber: „Der Aushang
     funktioniert auf dem Handy nicht"):

       Rasterspalte            315 px
       h2                      178 px   (Textbreite)
       .mmu-pinnwand             2 px   🔴  = 0 + 2x1 px Rahmen
       .mmu-aushang-hinweis    285 px
       Knopf                   122 px

     Die neun Plakate waren da und 180 px breit — `overflow: hidden`
     schnitt sie auf zwei Pixel zu. Im Bild blieb eine senkrechte Linie.

     ⚠️ Nicht `width: 100%`: Die Wand rechnet in `content-box`, der
     Rahmen kaeme oben drauf und sie stuende 2 px ueber (gemessen: 317
     statt 315). `justify-self` fuellt das Rasterfeld genau aus. */
  .mmu-flyerkiste > .mmu-pinnwand { justify-self: stretch; }
}

/* -------------------------------------------------------------------------
   Die Pommesgabel als Mauszeiger (Handoff v3, eigener Abschnitt)
   -------------------------------------------------------------------------
   „Rechte Hand von der Rückseite, Zeige- und kleiner Finger gestreckt, weiß
   mit schwarzem Pixelrand und 1-px-Schatten in #c0392b. Hotspot:
   Zeigefingerspitze, 3 1; Fallback pointer. Einsatz wie die normale
   Zeigehand: nur auf klickbaren Elementen."

   🔴 NUR AUF KLICKBAREM, nicht auf der ganzen Seite. Eine erste Fassung
   setzte den Zeiger auf `body` — dann steht die Hand ueberall, und die
   Auskunft „hier kannst du klicken" ist weg. Der Handoff sagt es
   ausdruecklich, und die Variante fuer die ganze Seite steht dort nur als
   auskommentierter Nachsatz.

   📐 Die Dateien liegen bei (assets/cursor/), zwei Aufloesungen fuer
   normale und hochaufloesende Schirme. Selbst gezeichnet hatte ich die Form
   vorher als SVG — Pixelrand und roter Schatten lassen sich so aber kaum
   nachbauen, und eine gelieferte Vorlage braucht niemand nachzuzeichnen.

   ⚠️ ZWEI DEKLARATIONEN HINTEREINANDER, und das ist Absicht: Wo `image-set`
   fehlt (aeltere Browser), gilt die erste; wo es da ist, ueberschreibt die
   zweite. Ein Browser, der die zweite nicht versteht, wirft sie weg und
   behaelt die erste — der uebliche Weg, wenn es keine @supports-Abfrage
   gibt.

   ⚠️ Der Rueckfall `pointer` nach dem Komma ist Pflicht: Wo das Bild nicht
   laedt, stuende sonst GAR kein Zeiger. */
:root {
  --mmu-zeiger-klick: url("cursor/pommesgabel-glut.png") 3 1, pointer;
  --mmu-zeiger-klick-hidpi: image-set(
      url("cursor/pommesgabel-glut.png") 1x,
      url("cursor/pommesgabel-glut-2x.png") 2x) 3 1, pointer;
}

a:any-link,
button,
[role="button"],
label,
summary,
select {
  cursor: var(--mmu-zeiger-klick);
  cursor: var(--mmu-zeiger-klick-hidpi);
}

/* 🔵 Ziehbares behaelt Greifhand und Faust (Handoff: „Ziehbare Elemente
   behalten grab"). Dort IST der Zeiger die Auskunft — „du kannst das Blatt
   nehmen" / „du haeltst es" —, und eine Pommesgabel daneben waere eine
   Auskunft weniger, nicht mehr. */
.mmu-anschlag,
.mmu-anschlag a,
.mmu-anschlag img { cursor: grab; }
.mmu-anschlag-gezogen,
.mmu-anschlag-gezogen a,
.mmu-anschlag-gezogen img { cursor: grabbing; }

/* Abgeschaltetes bleibt abgeschaltet erkennbar. */
button:disabled,
input:disabled,
select:disabled { cursor: not-allowed; }
/* -------------------------------------------------------------------------
   Weitersagen (Betreiberwunsch 02.10.2026)
   -------------------------------------------------------------------------
   🔴 Keine Dienstfarben, keine Logos. Facebook-Blau und WhatsApp-Gruen
   rissen ein Loch in die Zeitungsoptik, und die Logos sind geschuetzt —
   die Symbole hier sind eigene Strichzeichnungen in der Textfarbe.

   ⚠️ Die Knoepfe sehen aus wie die Rubrikenleiste: Monospace, gesperrt,
   Versalien. Sie sind Bedienung, nicht Inhalt.  */
.mmu-teilen {
  margin-top: var(--raum-5);
  padding-top: var(--raum-4);
  border-top: 1px solid var(--mmu-linie);
}

.mmu-teilen-titel {
  margin: 0 0 var(--raum-3);
  font-family: var(--schrift-mono);
  font-size: var(--t-klein);
  font-weight: 600;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--mmu-gedimmt);
}

.mmu-teilen-wege {
  display: flex;
  flex-wrap: wrap;
  gap: var(--raum-2);
  margin: 0;
  padding: 0;
  list-style: none;
}

/* ⚠️ `display: contents` am <li>: Die Liste soll die Knoepfe nicht
   zusaetzlich einrahmen — das Flex-Raster oben ordnet sie direkt. */
.mmu-teilen-weg { display: contents; }

/* 🔴 UND DIE RUECKNAHME, SONST WIRKT `hidden` NICHT MEHR.

   Die Browser-Vorgabe ist `[hidden] { display: none }` mit Spezifitaet
   (0,1,0). Die Regel darueber hat dieselbe und steht spaeter — sie gewinnt,
   und `display: contents` zeigt das Element samt Inhalt an.

   📏 Live gefunden am 02.10.2026: Der Geraetemenue-Knopf trug `hidden` und
   stand trotzdem da, 102x62 px, auf einem Browser mit
   `navigator.share === false`. Also genau der tote Knopf, den das `hidden`
   verhindern sollte.

   ⚠️ Die Quelltext-Zusage fand das nicht: Sie prueft, DASS `hidden` im
   Markup steht, nicht OB es wirkt. Das entscheidet die Kaskade, und die
   kennt nur der Browser. */
.mmu-teilen-weg[hidden] { display: none; }

/* 📏 44 px Trefferflaeche wie jede Bedienflaeche dieser Seite. Das steht
   hier ausdruecklich und nicht nur als Folge der Polsterung: Wer die
   Schriftgroesse aendert, soll die Grenze sehen. */
.mmu-teilen-knopf {
  display: inline-flex;
  align-items: center;
  gap: var(--raum-2);
  min-height: 44px;
  padding: var(--raum-2) var(--raum-3);
  border: 1px solid var(--mmu-kante);
  background: none;
  color: var(--mmu-gedimmt);
  font-family: var(--schrift-mono);
  font-size: var(--t-klein);
  letter-spacing: 0.08em;
  text-transform: uppercase;
  text-decoration: none;
  cursor: var(--mmu-zeiger-klick);
  cursor: var(--mmu-zeiger-klick-hidpi);
  transition: color 160ms ease, border-color 160ms ease;
}

.mmu-teilen-knopf:hover,
.mmu-teilen-knopf:focus-visible {
  color: var(--mmu-text);
  border-color: var(--mmu-text);
}

/* ⚠️ Die Rueckmeldung („Kopiert") faerbt den Knopf, statt ein Fenster
   aufzureissen. Sie steht im Wort selbst — eine Vorlesehilfe liest die
   Aenderung mit, weil der Knopfinhalt sich aendert. */
.mmu-teilen-knopf.mmu-teilen-gemeldet {
  color: var(--mmu-akzent-text);
  border-color: var(--mmu-akzent-text);
}

.mmu-teilen-symbol {
  flex: none;
  width: 1.15em;
  height: 1.15em;
}

/* 🔵 Die Adresse zum Abschreiben. Ohne Skript ist sie der einzige Weg, den
   Link von Hand weiterzugeben; mit Skript blendet teilen.js sie aus. */
.mmu-teilen-adresse {
  margin: var(--raum-3) 0 0;
  font-size: var(--t-klein);
  color: var(--mmu-gedimmt);
}
.mmu-teilen-adresse-wort { font-family: var(--schrift-mono); letter-spacing: 0.06em; }
.mmu-teilen-adresse code {
  font-family: var(--schrift-mono);
  /* 🔴 `anywhere`, nicht `break-word`: Eine Gig-Adresse ist ein einziges
     langes Wort ohne Trennstelle (…/2026-11-21-kveldulf-buergerzentrum-
     friesenhalle/) und schoebe die Seite sonst auf dem Handy auf. */
  overflow-wrap: anywhere;
}

@media (prefers-reduced-motion: reduce) {
  .mmu-teilen-knopf { transition: none; }
}
/* ── Die Merkliste weitersagen ───────────────────────────────────────── */
/* 🔴 Betreiberwunsch 02.10.2026: „zusätzlich soll die merkliste geteilt
   werden können". Entschieden: als LINK, der die Liste beim Empfaenger
   oeffnet (/konzerte/?merkliste=…).

   ⚠️ DAS AUSSEHEN STEHT NICHT HIER, sondern oben bei der .ics-Regel: Beide
   Knoepfe teilen sich einen Selektor (Betreiberwunsch 03.10.2026). Hier
   bleibt nur, was den Teilknopf wirklich unterscheidet. */
/* 🔴 DASSELBE POLSTER WIE DAS FORMULAR DARUEBER — Betreiber 03.10.2026:
   „ich möchte um »Auswahl teilen« genauso ein Quadrat wie um »als ics
   herunterladen«".

   ⚠️ DER RAHMEN WAR SCHON DA, und das ist der Kern dieses Vermerks: Beide
   Knöpfe tragen dieselbe Regel (`.mmu-merkliste [data-merkliste-form]
   button, .mmu-merkliste-teilknopf`), also beide `1px solid
   var(--mmu-papier-falz)`. Nur sass der Teilknopf in einem Absatz OHNE
   seitliches Polster, waehrend der ics-Knopf im Formular steht, das
   `padding: 0 var(--raum-4) var(--raum-4)` hat. Sein Rahmen lag damit
   genau auf der Kante des Merkkastens und war als Rahmen nicht mehr zu
   erkennen — er sah aus wie ein Abschnitt, nicht wie ein Knopf.

   📏 Gemessen am 03.10.2026, Abstand zum Rand des Merkkastens:

                    Breite   links   rechts   unten
     ics-Knopf        320      16      16      —
     Teilknopf vorher 352       0       0       0
     Teilknopf jetzt  320      16      16      16

   🔵 Die Variable ist bewusst dieselbe wie im Formular: Wer den Abstand
   dort aendert, soll ihn hier nicht nachziehen muessen. Ein abgetippter
   Wert waere beim ersten solchen Umbau wieder auseinandergelaufen. */
.mmu-merkliste-teilen {
  margin: var(--raum-2) 0 0;
  padding: 0 var(--raum-4) var(--raum-4);
}

/* Die Rueckmeldung („Link kopiert") steht im Wort selbst — eine
   Vorlesehilfe liest die Aenderung mit, weil der Knopfinhalt wechselt.

   📏 --mmu-papier-akzent und nicht --mmu-akzent-text: Der Knopf steht auf
   Papier (rgb(236, 232, 223)), und die dunklen Seitenfarben verschwinden
   darauf. Genau daran ist die erste Fassung gescheitert. */
.mmu-merkliste-teilknopf.mmu-merkliste-gemeldet {
  color: var(--mmu-papier-akzent);
  border-color: var(--mmu-papier-akzent);
}
