/* Additions on top of the legacy theme stylesheet (public/css/app.css).
   The templates reuse the theme's original class names (.post, .format-video,
   .category-store, .wp-block-image), so app.css does the heavy lifting.
   What remains here is (a) Font Awesome, which lived inside the old webpack
   bundle rather than in app.css, and (b) the handful of rules the site used to
   get from WordPress' block-library stylesheet. */

/* --- social icons -------------------------------------------------------
   Mirrors Font Awesome's fa-stack from the old bundle:
     .fa-stack    { height: 2em; width: 2.5em; position: relative }
     .fa-stack-2x { the fa-circle, inherits colour (#000) }
     .fa-stack-1x { the glyph }
     .fa-inverse  { color: #fff }
   FA sized glyphs by HEIGHT (1em) and derived the width from the viewBox
   (.fa-w-10 = .625em, .fa-w-20 = 1.25em, ...). Forcing them square distorts
   them, so height is set and width is left to the intrinsic aspect ratio.
   app.css turns the glyph black on hover and sizes the header set via
   `#nav-content .fa-stack { font-size: 1.2rem }`. */
.icon-stack {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  position: relative;
  width: 2.5em;
  height: 2em;
  vertical-align: middle;
}
#nav-content .icon-stack { font-size: 1.2rem; }
.icon-stack .icon-bg {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: 2em;
  height: 2em;
  fill: currentColor;
}
.icon-stack .icon-glyph {
  position: relative;
  height: 1em;
  width: auto;
  fill: #fff;
}
.social-links-item:hover .icon-glyph { fill: #000; }

/* mobile menu button — app.css scales it 1.7x and recolours it via
   `body.nav-open #nav-toggle { color: #ffe100 }`, so use currentColor. */
.nav-toggle__dot {
  display: block;
  width: 2em;
  height: 2em;
  fill: currentColor;
}

/* --- from WordPress' block-library stylesheet ---------------------------- */
/* content images filled the column width ... */
.post-content img { width: 100%; height: auto; display: block; }
/* ... but press photos only scale *down* (block-library used max-width),
   so the portrait shot stays at its own size instead of being blown up. */
.wp-block-image img { max-width: 100%; height: auto; display: block; }
figcaption { margin-top: .5em; }

/* --- news --------------------------------------------------------------- */
/* `.post { margin-bottom: 4rem }` in app.css handles the spacing. */
.news-item.is-hidden { display: none; }
/* WordPress wrapped post images in a gallery <figure> that added 16px below
   the image; flow-root keeps the margin from collapsing out of .post-content. */
#news .post-content { display: flow-root; }
#news .post-content > img { margin-bottom: 1rem; }

/* --- shows --------------------------------------------------------------
   The old page rendered the (empty) "Shows" page title as a paragraph above
   the widget — 27px line + 16px margin. Reproduced so the Bandsintown widget
   sits where it does on the live site. */
#shows > p { padding-top: 27px; }   /* 27px line; the 16px margin follows */

/* --- downloads ----------------------------------------------------------
   The old page had an empty <p>&nbsp;</p> between the note and the first
   press photo (27px line + 16px margin). Padding reproduces it without
   collapsing into the figure's own 100px / 4rem margin. */
.photo-note { padding-bottom: 43px; }

/* --- store -------------------------------------------------------------- */
.post.category-store .post-thumbnail-container img { width: 100%; height: auto; display: block; }

/* --- info ---------------------------------------------------------------
   The old page marked Booking/Asia up as <h5> (margin:0, so no gap between
   them) and separated the blocks with empty <p>&nbsp;</p> spacers worth 43px
   each. The Bard field emits <p>, so the type and the spacing are restored
   here rather than by carrying empty paragraphs into the CMS. */
.info-booking p {
  font-family: Helvetica, Arial;
  font-size: 24px;
  line-height: 28px;
  font-weight: 700;
  margin-bottom: 0;
}
.info-contact { margin-top: 59px; }   /* 43px spacer + 16px paragraph margin */
.info-contact h5 { margin-top: 43px; }
.supporters { margin-top: 43px; }
/* Die Logos stehen untereinander mit gleichem Abstand. Der haengt bewusst an
   den Bildern, nicht an den Links: nur Foerderer mit URL bekommen im Template
   ein <a>, Landis & Gyr hat keine — vorher ergab das 8px hier und 14.7px dort.
   Die <br> aus dem Template braucht es nicht mehr, den Umbruch macht
   display:block; als Zeilenboxen wuerden sie den Abstand nur verfaelschen.
   Die margins der Blocks fallen zusammen, der Abstand bleibt also 24px statt
   sich zu addieren — auch zwischen Einleitung und erstem Logo. */
.supporters br { display: none; }
.supporters .supporter-link { display: block; margin: 0; }
.supporters .supporter-logo { display: block; margin-top: 24px; }

/* the live page closed the Info section with one more empty <p> (16px margin) */
#info { padding-bottom: 16px; }

/* anchors must clear the sticky nav */
.scrollspy { scroll-margin-top: var(--nav-offset, 0px); }

/* ======================================================================
   Neues Design (Entwurf "Vorschlag Gevibed"), Schritt fuer Schritt.
   Bisher umgesetzt: Grundfarbe, Parallax-Formen, Wortmarke als Schrift,
   Hamburger, Favicon-Farbe. Der Rest des Entwurfs folgt spaeter.
   ====================================================================== */

:root {
  /* Grundfarbe. app.css referenziert sie an den fuenf Stellen, an denen
     frueher #ffe100 stand (body, .main, .nav.stuck, aktiver Nav-Link,
     Hamburger im offenen Zustand). */
  --brand: #00acd4;
}

/* --- Wortmarke -----------------------------------------------------------
   Ersetzt stm-logo.png (574x42, einzeilig) und stm-logo-sm.png (768x379,
   dreizeilig). app.css bindet unter dem Namen "Helvetica" HelveticaNeueBold
   ein (font-weight 700) — dieselbe Schrift, die Nav und Headings benutzen.
   Die Groesse liegt als --logo-fs auf :root, weil sich der Hamburger daran
   ausrichtet (siehe unten). */
:root { --logo-fs: clamp(1.5rem, 11.5vw, 4.5rem); }
@media (min-width: 1024px) {
  :root { --logo-fs: clamp(1.75rem, 4.4vw, 2.9rem); }
}

.logo-type {
  display: block;
  font-family: Helvetica, Arial, sans-serif;
  font-weight: 700;
  text-transform: uppercase;
  text-decoration: none;
  font-size: var(--logo-fs);
  line-height: 1.05;
  letter-spacing: -0.005em;
  hyphens: none;
}
.logo-type span { display: inline; }

/* Unter 1024px dreizeilig wie das alte Mobile-Logo. "SCHNELLER" ist die
   laengste Zeile; rechts bleibt Platz fuer den Hamburger. */
@media (max-width: 1023px) {
  .logo-type span { display: block; }
  .logo-type { padding-right: 3rem; }
}

/* --- Hamburger -----------------------------------------------------------
   Loest den gefuellten Punkt (.nav-toggle__dot) ab: drei Balken, die im
   offenen Zustand zum X werden.

   Sitzt auf der ersten Zeile der Wortmarke. Deren Zeilenmitte liegt bei
   `py-4` (1rem Innenabstand des Nav-Containers) + einer halben Zeilenhoehe,
   also 1rem + 0.525 * --logo-fs; translateY(-50%) zentriert den Hamburger
   darauf. Dadurch wandert er automatisch mit, wenn die Wortmarke skaliert. */
.nav-toggle-slot {
  position: fixed;
  right: clamp(14px, 4.5vw, 28px);
  top: calc(1rem + var(--logo-fs) * 0.525);
  transform: translateY(-50%);
}

.nav-toggle { display: block; color: #000; }

/* app.css skaliert den Button zwischen 768 und 1023px um das 1.7-fache
   (Ueberbleibsel des Punkts). Die Groesse kommt jetzt aus --burger-w. */
#nav-toggle { transform: none; margin-top: 0; }

.nav-toggle__bars {
  --burger-w: clamp(26px, 7.7vw, 44px);
  display: block;
  position: relative;
  width: var(--burger-w);
  height: calc(var(--burger-w) * 0.74);
}
.nav-toggle__bar {
  position: absolute;
  left: 0;
  width: 100%;
  height: calc(var(--burger-w) / 6);   /* fett, nicht haarfein */
  background: currentColor;
  transition: transform .25s ease, opacity .2s ease;
}
.nav-toggle__bar:nth-child(1) { top: 0; }
.nav-toggle__bar:nth-child(2) { top: calc(50% - var(--burger-w) / 12); }
.nav-toggle__bar:nth-child(3) { bottom: 0; }

/* offen: oberer und unterer Balken kreuzen sich, der mittlere verschwindet */
body.nav-open .nav-toggle__bar:nth-child(1) {
  top: calc(50% - var(--burger-w) / 12);
  transform: rotate(45deg);
}
body.nav-open .nav-toggle__bar:nth-child(2) { opacity: 0; }
body.nav-open .nav-toggle__bar:nth-child(3) {
  bottom: auto;
  top: calc(50% - var(--burger-w) / 12);
  transform: rotate(-45deg);
}

/* app.css faerbt den Toggle im offenen Zustand in die Grundfarbe — das war
   beim gelben Punkt auf Weiss schon knapp und waere in Blau auf Weiss noch
   schwaecher. Ein Schliesskreuz muss man sehen: bleibt schwarz. */
body.nav-open #nav-toggle { color: #000; }

@media (prefers-reduced-motion: reduce) {
  .nav-toggle__bar { transition: none; }
}

/* --- Sticky-Nav ----------------------------------------------------------
   app.css schaltet #nav-container ab 1024px auf position:fixed, sobald
   site.js .stuck setzt; die Position kommt von dort als --nav-stuck-top.
   Frueher schrieb das Script `top` direkt per !important ins style-Attribut,
   und zwar auf allen Breiten — auch dort, wo .stuck gar nichts bewirkt.
   Als Custom Property greift der Wert nur noch da, wo diese Regel gilt. */
@media (min-width: 1024px) {
  .nav.stuck #nav-container { top: var(--nav-stuck-top, 0px); }

  /* Zweite Sicherung, ohne Messung: der obere Balken malt zwei Pixel seiner
     Hintergrundfarbe unter sich weiter. Was an der Naht trotz Ueberlappung je
     aufginge, zeigt dann die Grundfarbe statt des Bandfotos, das als
     body-background darunterliegt. Nur im .stuck-Zustand — am Seitenanfang
     laege der Streifen sonst sichtbar auf dem Foto. */
  .nav.stuck #nav-container-top { box-shadow: 0 2px 0 var(--brand); }
}

/* --- Parallax-Formen -----------------------------------------------------
   Zwei Ebenen ueber die volle Hoehe von <main>, wie im Entwurf: --back liegt
   hinter dem Inhalt, --front darueber. Die Formen sind blau geflutete
   Linienzeichnungen in der Grundfarbe — auf dem blauen Grund bleibt nur die
   schwarze Linie stehen, die Flaeche deckt ab, was dahinterliegt. Genau davon
   lebt die vordere Ebene: sie schneidet sichtbar in den Inhalt.

   Beide Ebenen sind pointer-events:none. Verdeckt wird also nur optisch —
   Links und Bilder darunter bleiben anklickbar, so wie im Entwurf.

   Positioniert wird ueber --x/--y (Prozent der Seitenhoehe), die Groesse ueber
   --w. site.js setzt beim Scrollen --shift/--drift/--spin. */
.shape-field {
  position: absolute;
  inset: 0;
  overflow: hidden;
  pointer-events: none;
}
/* Die Ebenen spannen die ganze Seite, darum muss <body> der Bezugsrahmen sein. */
body.body { position: relative; }

/* Hinten liegt ueber dem Hintergrund von .main (das ist eine Ebene tiefer, weil
   .main nicht positioniert ist) und ueber dem Bandfoto, das als body-background
   ganz unten liegt — die Formen sind damit auch im Startbereich zu sehen.
   Unter dem Inhalt bleibt sie trotzdem: die Sektionen halten ebenfalls z-index 1
   und stehen im Dokument spaeter, bei gleichem z-index entscheidet die
   Baumreihenfolge. Und unter der Navigation, die 40 bzw. 50 haelt. */
.shape-field--back  { z-index: 1; }
/* 60 liegt ueber allem im <nav>: die obere Leiste haelt z-40, der gepinnte
   Linkbalken und der Hamburger halten z-50. Die vordere Ebene schneidet damit
   auch in die Navigation hinein, und zwar von der ersten Bildschirmhoehe an. */
.shape-field--front { z-index: 60; }

.shape {
  position: absolute;
  top: var(--y);
  left: var(--x);
  width: calc(var(--w) * var(--shape-scale, 1));
  will-change: transform;
  transform: translate(-50%, -50%)
             translate3d(var(--drift, 0px), var(--shift, 0px), 0)
             rotate(var(--spin, 0deg));
}
.shape img {
  display: block;
  width: 100%;
  height: auto;
}

/* Die Sektionen liegen zwischen den beiden Ebenen. So bleibt die
   Inhaltsstruktur unangetastet — kein Wrapper noetig. */
.main > * { position: relative; z-index: 1; }

/* Ausnahme: das mobile Startfoto. Auf Desktop ist das Startbild der
   body-Hintergrund und liegt damit unter allem — die Formen laufen darueber.
   Auf Mobile ist es ein <img> in <main> und erbt die Regel oben, stand also
   ueber der hinteren Ebene. Hier eine Stufe tiefer, damit es sich wie das
   Desktop-Pendant verhaelt. Ueber dem Hintergrund von .main bleibt es. */
@media (max-width: 767px) {
  .main > img:first-of-type { z-index: 0; }
}

/* --- Formen im offenen Mobile-Menue --------------------------------------
   Das Menue ist ein fixer Vollbild-Layer: app.css setzt body.nav-open auf
   height:100vh und blendet <main> aus. Hier laesst sich nicht wegscrollen —
   was ein Menuepunkt an Form abbekommt, bleibt fuer immer darauf liegen.
   Also raus damit.

   (Bis die Ebenen Geschwister von <main> wurden, verschwanden sie mit
   `body.nav-open main { display: none }` von selbst. Als Kinder von <body>
   tun sie das nicht mehr.)

   Eine Form bleibt als Dekoration stehen, fix in der unteren rechten Ecke,
   wo keine Menuepunkte stehen — position:fixed, weil <body> im offenen
   Zustand auf 100vh schrumpft und die Ebene mit ihm. */
body.nav-open .shape { display: none; }

body.nav-open .shape-field--back .shape:last-child {
  display: block;
  position: fixed;
  top: auto;
  left: auto;
  right: -20vw;
  bottom: -10vh;
  width: 85vw;
  transform: none;   /* Parallax-Variablen hier bewusst ignorieren */
}

/* Und die Menuepunkte liegen in jedem Fall darueber: #nav-container ist
   ohnehin position:sticky, es braucht nur den z-index. Damit bliebe der
   Text selbst dann lesbar, wenn die Dekoration doch einmal hineinragt. */
body.nav-open #nav-container { z-index: 2; }

/* Auf Mobile stehen dieselben Formen wie am Desktop — gleiche Dichte, nur
   groesser: der Entwurf laesst sie in Naturgroesse (1600px) stehen, auf einem
   390px-Schirm also als grosses Fragment statt als verkleinerte ganze Form.
   --shape-scale bildet das nach, ohne die --w-Werte im Template anzufassen. */
@media (max-width: 767px) {
  .shape { --shape-scale: 2.2; }

  /* Die erste Form kleiner als die uebrigen: sie liegt auf dem Startfoto, und
     in voller Groesse deckte sie es zu weit zu. 1.6 ist ausgemessen — ueber je
     10 Aufrufe verdeckt sie im Schnitt 3.5% der Fotoflaeche und trifft es bei
     8 von 10. Groesser heisst nicht linear mehr: bei 1.55 sind es zwar nur
     2.1%, dafuer bleibt das Foto bei der Haelfte der Aufrufe ganz frei. */
  .shape-field--back .shape:first-child { --shape-scale: 1.6; }
}
