/* ============================================================
   css/04-layout.css
   Raster -- welche Spalte wie breit, Reihenfolge auf Mobile

   Vierte der fünf CSS-Dateien, nach 01-reset, 02-variables,
   03-typography, vor 05-components. Wird asynchron nachgeladen;
   was beim ersten Bild sichtbar ist, steht zusätzlich in
   partials/critical.css (Abschnitte 5, 10 und 11).

   REGELN

   - Hier steht nur das Raster: Spaltenbreiten, Platzierung,
     Reihenfolge auf Mobile. Aussehen der Kästen und Bausteine
     gehört in 05-components.css.
   - WAS IN partials/critical.css STEHT, MUSS HIER GENAUSO STEHEN.
     Neues Raster = drei Stellen: hier, critical.css Abschnitt 10
     (Desktop) und, falls nötig, Abschnitt 11 (Mobile).
   - Neues Seitenraster: eigene Variante .page-layout--<seite> im
     Block @media (min-width: 992px), mit Kommentar (Seite, Datum,
     Spaltenbreiten in Zwölfteln).

   Stand 01.11.2026.

   GLIEDERUNG
   Zum Springen den Abschnittstitel suchen.

    1. CONTAINER + RESTBESTAND DES ALTEN RASTERS
    2. SEITEN-GRID (<main>)   artist | contact | agentur | start
                              | agenda | footer
    3. KÜNSTLERSEITE: REIHENFOLGE AUF MOBILE
    4. KONTAKTSEITE: REIHENFOLGE AUF MOBILE
    5. KALENDERSEITE: REIHENFOLGE AUF MOBILE
   ============================================================ */


/* ============================================
   CONTAINER + RESTBESTAND DES ALTEN RASTERS

   Seiteninhalt und Footer laufen seit dem Umbau ueber das
   Seiten-Grid weiter unten. Vom alten Bootstrap-Raster ist nichts
   mehr uebrig: .row, .row--gutter, .col-1 bis .col-12 und alle
   .col-md-* sind entfallen.

   Zuletzt hing nur noch die Agenda-Liste an .row -- allerdings
   ohne Wirkung: .event-list setzt in 05-components.css sowohl
   display: block als auch margin: 0 und hat damit beides
   ueberschrieben, was .row beigesteuert haette.
   ============================================ */

/* --grid-gutter  = Seitenrand des Containers (bleibt immer)
   --col-gutter   = Abstand zwischen den Spalten (auf Mobile 0) */
:root {
    --col-gutter: var(--grid-gutter);
}

@media (max-width: 767px) {
    :root {
        --col-gutter: 0px;
    }
}

.container {
    margin-right: auto;
    margin-left: auto;
    padding-left: var(--grid-gutter);
    padding-right: var(--grid-gutter);
    max-width: var(--container-max-width);
}

.container-fluid {
    margin-right: auto;
    margin-left: auto;
    padding-left: var(--grid-gutter);
    padding-right: var(--grid-gutter);
    width: 100%;
}

/* Utility Classes */
@media (max-width: 991px) {
    .d-md-block { display: none !important; }
}

@media (min-width: 992px) {
    .d-md-block { display: block !important; }
    .d-md-inline { display: inline !important; }
    .d-md-flex { display: flex !important; }
}


/* ============================================================
   ============================================================
   SEITEN-GRID (<main>)

   Ersetzt .row/.col-md-* für den Seiteninhalt. Ein Grid-Container,
   die Spalten sind direkte Kinder -- kein Wrapper-<div> mehr pro
   Spalte.

   Spaltenbreiten wie vorher, gerechnet in Zwölfteln:
     Künstlerseite   2 | 3 | 5 | 2
     Kontaktseite    2 | 7 | 3
     Agentur-Seiten  2 | 7 | 3
     Startseite      2 | 5 | 3 | 2   (01.11., Berichte angeglichen 06.11.)

   gap ist bewusst 0 und die negativen Aussenabstände bleiben:
   zusammen ergibt das exakt die alte Optik -- die weissen Boxen
   liegen Kante an Kante, die äusseren ragen einen halben Gutter
   über das Container-Padding hinaus.
   ============================================================
   ============================================================ */

.page-layout {
    display: grid;
    grid-template-columns: 1fr;        /* Mobile: alles untereinander */
    margin-left: calc(var(--col-gutter) * -0.5);
    margin-right: calc(var(--col-gutter) * -0.5);
}

.page-layout > * {
    min-width: 0;   /* sonst sprengt ein langes Wort die Spur */
}

@media (min-width: 992px) {
    /* --- Künstlerseite: Navi | Inhalt (Bio + Shows) | Spotlight/Agenda --- */
    .page-layout--artist {
        grid-template-columns: 2fr 8fr 2fr;
    }

    /* Der Inhaltsblock teilt sich intern in Bio (3) und Shows (5).
       Beide bleiben eigene Boxen -- zwei unterschiedlich hohe
       Spalten lassen sich mit vollständig flachem DOM nicht bündig
       stapeln (CSS kennt kein Masonry).

       Für Safari Reader ist das kein Problem: entscheidend ist
       nicht, dass Bio und Shows Geschwister sind, sondern dass sie
       sich EINEN Elternknoten teilen, in dem sonst nichts
       Linklastiges steht. Genau dafür gibt es .artist-content --
       Künstler-Navi und Agenda liegen bewusst ausserhalb. */
    .artist-content {
        display: grid;
        grid-template-columns: 3fr 5fr;
    }

    .artist-content > * {
        min-width: 0;
    }

    /* --- Kontaktseite: Navi | Titel+Formular | Direktkontakt ---
       Spalte 2 besteht aus zwei Elementen (Begruessung, Formular),
       damit auf Mobile die Direkt-Karte dazwischen passt. Auf
       Desktop werden sie deshalb ausdruecklich platziert: Navi und
       Direkt-Karte ueberspannen beide Zeilen. Beide sind kuerzer
       als Begruessung + Formular zusammen, darum verteilt das Grid
       hier keine Ueberhoehe auf die Zeilen. */
    .page-layout--contact {
        grid-template-columns: 2fr 7fr 3fr;
    }

    .page-layout--contact > .artist-sidebar   { grid-column: 1; grid-row: 1 / span 2; }
    .page-layout--contact > .contact-intro    { grid-column: 2; grid-row: 1; }
    .page-layout--contact > .contact-form-col { grid-column: 2; grid-row: 2; }
    .page-layout--contact > .contact-info-col { grid-column: 3; grid-row: 1 / span 2; }

    /* Naht: Begruessung und Formular sollen wie ein durchgehender
       Kasten wirken -- gemeinsame Aussenkante, keine Trennlinie,
       kein Abstand dazwischen. Die 50px Luft unter dem Lead-Absatz
       kommen weiterhin aus dessen eigenem margin-bottom und bleiben
       INNERHALB des Kastens: Grid-Items sind eigene
       Formatierungskontexte, da faellt kein Rand heraus.
       Zwei Klassen (0,2,0) -- schlaegt .grid-box (0,1,0). */
    .page-layout--contact > .contact-intro {
        margin-bottom: 0;
        padding-bottom: 0;
        border-bottom: 0;
        border-radius: var(--border-radius-sm) var(--border-radius-sm) 0 0;
    }
    .page-layout--contact > .contact-form-col {
        padding-top: 0;
        border-top: 0;
        border-radius: 0 0 var(--border-radius-sm) var(--border-radius-sm);
    }

    /* --- Agentur-Seiten: Navi | Inhalt | Direkt (22.10.) ---
       nathalie-buchli.html, ueber-uns.html, freunde-familie.html,
       angebote.html. Gleiche Breiten wie
       Kontakt, aber nur drei Kinder in DOM-Reihenfolge -- das
       Grid fuellt sie von selbst ein, keine Platzierung noetig.
       Mobile: untereinander, Navi ausgeblendet; dafuer braucht es
       weder order noch eine eigene Regel. */
    .page-layout--agentur {
        grid-template-columns: 2fr 7fr 3fr;
    }

    /* --- Startseite: Navi | Bericht gross | Bericht klein | Aktuell
       (01.11.) ---  2 | 5 | 3 | 2 (06.11.: grosse Spalte 6 → 5, kleine 2 → 3). Rechte Spalte so schmal wie
       Spalte 4 der Kuenstlerseiten; die alte Seite hatte 2 | 5 | 2
       plus ein leeres Zwoelftel vor der rechten Spalte, das jetzt
       dem kleinen Bericht zugute kommt. Die Einfuehrung ueber beiden
       Berichten bleibt gleich breit (5 + 3 = 6 + 2).
       Fuenf Kinder, ausdruecklich platziert wie auf der Kontaktseite:
       der Einfuehrungstext steht in Zeile 1 ueber BEIDEN Berichten,
       die Navi ueberspannt beide Zeilen, die rechte Spalte (Aktuell,
       Termine) beginnt wie die Berichte in Zeile 2 -- rechts neben
       der Einfuehrung bleibt frei, wie auf der alten Seite.
       Die Einfuehrung ist kein Kasten (transparent, Rahmen
       unsichtbar): so steht sie frei wie auf der alten Seite, ihr
       Text aber buendig mit dem Text der Berichte darunter.

       grid-template-rows: auto 1fr -- Zeile 1 so hoch wie die
       Einfuehrung, sonst nichts. Ohne diese Angabe verteilt das Grid
       die Hoehe der Navi (sie ueberspannt beide Zeilen) auch auf
       Zeile 1, und unter der Einfuehrung klafft eine Luecke --
       so geschehen, als die rechte Spalte noch beide Zeilen
       ueberspannte (01.11.). */
    .page-layout--start {
        grid-template-columns: 2fr 5fr 3fr 2fr;
        grid-template-rows: auto 1fr;
    }

    .page-layout--start > .artist-sidebar { grid-column: 1;          grid-row: 1 / span 2; }
    .page-layout--start > .start-intro    { grid-column: 2 / span 2; grid-row: 1; }
    .page-layout--start > .start-haupt    { grid-column: 2;          grid-row: 2; }
    .page-layout--start > .start-zweit    { grid-column: 3;          grid-row: 2; }
    .page-layout--start > .start-side     { grid-column: 4;          grid-row: 2;          }

    /* --- Kalenderseite: Filter | Termine ---
       Links die Filterknoepfe, rechts die Termine.

       Die Aufteilung ist keine Geschmacksfrage: .event-list ist in
       05-components.css ein container-type: inline-size, und die
       grosse Agenda-Ansicht (Tageszahl 36px, Titel in
       --font-size-big) greift erst ab 720px Containerbreite.
       9/12 von 1460px sind rund 1095px -- auf einem 1280er-Laptop
       bleiben noch rund 900px, die grosse Ansicht ist also ueberall
       sicher.

       Volle Breite waere technisch auch in Ordnung, nur liefe der
       Veranstaltungstitel dann ueber 1400px Zeilenlaenge, und die
       Filter haetten keinen festen Platz. */
    /* --- Kalenderseite: Filter | Titel + Termine ---
       Gebaut wie .page-layout--contact weiter oben, und zwar
       ausdruecklich so: die drei Elemente werden PLATZIERT, nicht
       der Reihe nach eingefuellt.

       Der Unterschied ist nicht kosmetisch. Bei automatischer
       Platzierung wandert jedes Element, das aus seinem Kasten
       faellt, in die naechste freie Zelle -- Datumsmarker und
       Terminblock landen dann abwechselnd links und rechts. Mit
       fester Platzierung kann das nicht passieren, und die
       Auffangregel darunter faengt selbst unerwartete Kinder in
       Spalte 2 ab.

       Spaltenbreiten in Zwoelfteln: 2 | 10. Die Terminspalte ist
       damit rund 1200px breit -- .event-list ist ein
       container-type: inline-size, und die grosse Agenda-Ansicht
       braucht 720px Containerbreite. */
    .page-layout--agenda {
        grid-template-columns: 2fr 10fr;
    }

    /* Auffangregel: alles landet in Spalte 2, solange es nicht
       ausdruecklich woanders platziert ist. Ein Selektor (0,1,0)
       plus Universalselektor -- die drei Regeln darunter (0,2,0)
       schlagen ihn. */
    .page-layout--agenda > * {
        grid-column: 2;
    }

    .page-layout--agenda > .agenda-filter-box { grid-column: 1; grid-row: 1 / span 2; }
    .page-layout--agenda > .agenda-intro      { grid-column: 2; grid-row: 1; }
    .page-layout--agenda > .agenda-list-col   { grid-column: 2; grid-row: 2; }

    /* Naht wie auf der Kontaktseite: Titelblock und Liste sollen
       wie ein durchgehender Kasten wirken -- gemeinsame
       Aussenkante, keine Trennlinie, kein Abstand dazwischen. */
    .page-layout--agenda > .agenda-intro {
        margin-bottom: 0;
        padding-bottom: 0;
        border-bottom: 0;
        border-radius: var(--border-radius-sm) var(--border-radius-sm) 0 0;
    }

    .page-layout--agenda > .agenda-list-col {
        padding-top: 0;
        border-top: 0;
        border-radius: 0 0 var(--border-radius-sm) var(--border-radius-sm);
    }

    /* Die Filterspalte ist nur Laufstrecke, der Kasten sitzt im
       <aside> darin -- genau wie die Kuenstler-Navi. Ein Element
       in voller Zeilenhoehe kann nicht kleben, es hat ja keinen
       Weg zu gehen; deshalb klebt das Kind, nicht die Spalte.
       Styles des Kastens: 05-components.css, Abschnitt 9. */
    .agenda-filter-box.grid-box {
        height: auto;
        align-self: stretch;
        background: transparent;
        border: none;
        padding: 0;
        margin-bottom: 0;
    }

    /* --- Footer: Kontakt | Newsletter bzw. Karte | Karten-Apps ---
       Vorher col-md-7 + col-md-4 = nur 11 Zwoelftel; rechts blieb
       ein Zwoelftel leer. Jetzt 7 + 5, damit die rechte Spalte
       buendig mit dem Container abschliesst.
       (Wer lieber die linke Spalte verbreitert: 8fr 4fr.) */
    .page-layout--footer {
        grid-template-columns: 7fr 5fr;
    }
}

/* Die Footer-Spalten brauchen die seitliche Polsterung, die
   frueher von den .col-*-Klassen kam -- sonst klebt der Inhalt
   am negativen Aussenabstand des Rasters. */
.page-layout--footer > * {
    padding-left: calc(var(--col-gutter) * 0.5);
    padding-right: calc(var(--col-gutter) * 0.5);
}


/* ============================================================
   KÜNSTLERSEITE: REIHENFOLGE AUF MOBILE

   Gewünscht (unverändert gegenüber heute):
     Bio -> Spotlight -> Preise -> Shows -> Bisheriges
     -> Website -> Agenda

   .artist-content, .artist-col-bio und .artist-col-side werden
   per display: contents aufgelöst, damit ihre Kinder direkte
   Grid-Items von .page-layout werden und order greift.
   display: contents wirkt dabei über mehrere Ebenen: auch die
   Enkel von .artist-content landen so direkt im Grid.

   .artist-col-shows wird ABSICHTLICH nicht aufgelöst: die fünf
   Show-Artikel sollen zwischen 768 und 991px weiterhin in einer
   gemeinsamen weissen Box stehen, so wie heute. Als ein Item
   bleiben sie ausserdem garantiert beieinander.

   WICHTIG: keine losen Elemente (Spacer o.ä.) direkt in die
   aufgelösten Container legen -- sie bekämen order: 0 und
   rutschten ganz nach oben.
   ============================================================ */
@media (max-width: 991px) {
    .artist-content,
    .artist-col-bio,
    .artist-col-side {
        display: contents;
    }

    .bio-block            { order: 2; }
    .spotlight-box        { order: 3; }
    .artist-awards-box    { order: 4; }
    .artist-col-shows     { order: 5; }
    .previous-credits-box { order: 6; }
    .artist-website       { order: 7; }
    .agenda-block         { order: 8; }

    /* Abstand zwischen den aufgelösten Blöcken. Früher kam er von
       .col-bio > * / #agenda-container > * -- diese Container gibt
       es nicht mehr. */
    .page-layout--artist > *,
    .artist-content > *,
    .artist-col-bio > *,
    .artist-col-side > * {
        margin-top: 0;
        margin-bottom: 20px;
    }
}


/* ============================================================
   KONTAKTSEITE: REIHENFOLGE AUF MOBILE

   Titel und Begruessung, dann der Direktkontakt, dann das
   Formular -- wer unterwegs auf die Seite kommt, will meist
   schnell die Nummer, soll aber wissen, wo er gelandet ist.
   Die Künstler-Navi ist auf Mobile ohnehin ausgeblendet
   (05-components.css).

   Bewusst nur ueber order und nur in dieser Media Query: das
   Markup bleibt unveraendert, Desktop platziert die drei Spalten
   weiterhin nach DOM-Reihenfolge (2fr 7fr 3fr).

   ACHTUNG Tastatur: die Tab-Reihenfolge folgt dem DOM, nicht dem
   order. Auf Mobile springt der Fokus also zuerst ins Formular
   und erst danach in die Direkt-Karte, obwohl die optisch
   darueber steht. Bei drei Links in der Karte vertretbar --
   sauber vermeiden liesse es sich nur, indem die Karte auch im
   Markup nach vorn wandert. Dann stuende das h2 "Direkt"
   allerdings vor dem h1 "Kontakt".
   ============================================================ */
@media (max-width: 991px) {
    .contact-intro    { order: 2; }
    .contact-info-col { order: 3; }
    .contact-form-col { order: 4; }

    .page-layout--contact > * {
        margin-bottom: 20px;
    }

    /* Auf Desktop trennen die 50px unter dem Lead die Begruessung
       vom Formular. Auf Mobile folgt stattdessen die Direkt-Karte,
       und die bringt ihren eigenen Abstand mit -- sonst stuenden
       50 + 20 = 70px dazwischen. Wer die Luft behalten will,
       loescht diese eine Regel. */
    .contact-intro .inquiry-lead { margin-bottom: 0; }
}

/* ============================================================
   KALENDERSEITE: REIHENFOLGE AUF MOBILE

   Gewuenscht:  Titel + Trefferzahl -> Filter -> Termine

   Im Markup steht der Filter vorn, damit er auf Desktop die linke
   Spalte fuellen kann. Auf Mobile dreht order das um: die Knoepfe
   stehen direkt unter "27 Termine", wo man sie sucht, und laufen
   mit der Seite mit -- keine klebende Leiste, kein waagrechtes
   Scrollen mehr.

   Wer weiter unten in der Liste ist, kommt ueber den Filter-Knopf
   der Sticky-Bar an dieselben Knoepfe: 08-agenda-filter.js haengt
   die Leiste dann in einen Dialog und danach wieder hierher
   zurueck. Deshalb gibt es sie nur einmal im Markup.

   ACHTUNG Tastatur: die Tab-Reihenfolge folgt dem DOM, nicht dem
   order. Der Fokus springt also zuerst in den Filter und erst
   danach in den Titelblock -- wie auf der Kontaktseite. Bei vier
   Knoepfen vertretbar; sauber vermeiden liesse es sich nur, indem
   der Filter auch im Markup nach hinten wandert, dann braeuchte
   Desktop eine ausdrueckliche Platzierung in Zeile 1.
   ============================================================ */
@media (max-width: 991px) {
    .page-layout--agenda > * {
        margin-bottom: 12px;
    }

    .page-layout--agenda > .agenda-intro      { order: 1; margin-bottom: 0; }
    .page-layout--agenda > .agenda-filter-box { order: 2; }
    .page-layout--agenda > .agenda-list-col   { order: 3; }

    /* Der Kopf der Seite wird kompakter -- Titel kleiner,
       Teasertext auf Grundgroesse, engere Abstaende. Das stand
       frueher hier, eingegrenzt auf .page-layout--agenda, und gilt
       jetzt fuer ALLE Seiten: die Groessen kommen aus der
       Ueberschriften-Skala in 02-variables.css, die Abstaende aus
       05-components.css. Deshalb ist an dieser Stelle nichts mehr
       noetig.

       Der Grund fuer die Verkleinerung bleibt derselbe: auf einem
       Telefon bleiben unter der Navi rund 740px, und Titel plus
       Teaser plus Filter haben davon gut die Haelfte gebraucht --
       der erste Termin stand unter der Falz. */

    /* Der Filter schliesst optisch an den Titelblock an: gemeinsame
       Kante, keine Trennlinie dazwischen. Dieselbe Naht wie auf
       Desktop zwischen Titel und Liste. */
    .agenda-filter-box.grid-box {
        height: auto;
        padding-top: 0;
        border-top: 0;
        border-radius: 0 0 var(--border-radius-sm) var(--border-radius-sm);
    }

    .page-layout--agenda > .agenda-intro {
        padding-bottom: 8px;
        border-bottom: 0;
        border-radius: var(--border-radius-sm) var(--border-radius-sm) 0 0;
    }

    /* "Filter" als Ueberschrift braucht es hier nicht -- die
       Knoepfe stehen unter dem Teasertext und erklaeren sich.
       Gleiche Regel wie .sr-only. */
    .agenda-filter-box .event-list-title {
        position: absolute;
        width: 1px;
        height: 1px;
        padding: 0;
        margin: -1px;
        overflow: hidden;
        clip: rect(0, 0, 0, 0);
        border: 0;
    }
}

/* Video/Audio Embed Wrapper (Cookie Consent) -> siehe 05-components.css */