/* =====================================================================
   WANDKALENDER
   ===================================================================== */


/* =====================================================================
   FONTS
   ===================================================================== */

   @font-face {

    font-family:
      "GT-Standard-L-Standard-Heavy";
  
    src:
      url("../fonts/GT-Standard-L-Standard-Heavy.woff2")
      format("woff2");
  
    font-weight:
      700;
  
    font-style:
      normal;
  
    font-display:
      swap;
  
  }
  
  
  @font-face {
  
    font-family:
      "JaliLatin-Regular";
  
    src:
      url("../fonts/JaliLatin-Regular.woff2")
      format("woff2");
  
    font-weight:
      400;
  
    font-style:
      normal;
  
    font-display:
      swap;
  
  }
  
  
  @font-face {
  
    font-family:
      "JaliLatin-SemiBoldItalic";
  
    src:
      url("../fonts/JaliLatin-SemiBoldItalic.woff2")
      format("woff2");
  
    font-weight:
      600;
  
    font-style:
      italic;
  
    font-display:
      swap;
  
  }
  
  
  /* =====================================================================
     VARIABLES
     ===================================================================== */
  
  :root {
  
    --ink:
      #3689d5;
  
    --accent:
      #3689d5;
  
    --ink-line:
      #000000;
  
    --paper:
      #ffffff;
  

    /*
     * Bewusst hier statt auf .hud--bc: die Pop-ups werden per JS an
     * <body> umgehängt (siehe main.js) — eine nur lokal auf .hud--bc
     * definierte Variable wäre dort nicht mehr geerbt worden
     * (CSS-Vererbung folgt der tatsächlichen DOM-Position, nicht der
     * ursprünglichen HTML-Quelltextposition). Das war die Ursache
     * für das transparent wirkende Impressum-Pop-up.
     */

    --imprint-color:
      #9aa1ad;
  

    /* Hauptschrift */
  
    --font:
      "GT-Standard-L-Standard-Heavy",
      sans-serif;
  
    --font-size:
      36px;
  
  
    /* Schrift für Info / Impressum */
  
    --info-font:
      "JaliLatin-Regular",
      sans-serif;
  
    --info-font-size:
      36px;
  
  
    /* Zeichenabstand */
  
    --letter-spacing:
      /* -0.025em; */
          -0.01em;
  
  
    /* Abstand zum Fensterrand */
  
    --hud-pad:
      clamp(20px, 3.2vw, 40px);
  
  
    /* Abstand des Posters */
  
    --stage-pad-top:
      clamp(90px, 12svh, 140px);
  
    --stage-pad-bottom:
      clamp(90px, 12svh, 140px);
  
    --stage-pad-x:
      clamp(40px, 9vw, 280px);
  
  
    /* Poster */
  
    --poster-gap:
      40px;
  
  
    color-scheme:
      light;
  
  }
  
  
  /* =====================================================================
     RESET
     ===================================================================== */
  
  *,
  *::before,
  *::after {
  
    box-sizing:
      border-box;
  
  }
  
  
  html {
  
    -webkit-text-size-adjust:
      100%;
  
    /*
     * Verhindert den elastischen "Bounce"-Effekt am Scroll-Ende
     * (Gummiband-Nachfedern), der den Seiteninhalt kurz verschiebt.
     */

    overscroll-behavior-y:
      none;
  
    /*
     * Zuverlässigere, native Ergänzung zu den JS-Handlern in main.js
     * (disablePinchZoom): erlaubt nur vertikales Scrollen. Pinch- UND
     * Doppeltipp-Zoom sind damit gar nicht erst im erlaubten
     * Gesten-Set enthalten — deutlich robuster als das Abfangen
     * einzelner Touch-Events, gerade auf iOS Safari.
     */

    touch-action:
      pan-y;
  
  }
  
  
  body {
  
    margin:
      0;
  
    font-family:
      var(--font);
  
    font-size:
      var(--font-size);
  
    font-weight:
      400;
  
    color:
      var(--ink);
  
    background:
      #ffffff;
  
    overflow-x:
      hidden;
  
    overscroll-behavior-y:
      none;
  
    touch-action:
      pan-y;
  
    -webkit-font-smoothing:
      antialiased;
  
  }
  
  
  /* =====================================================================
     SCREENREADER
     ===================================================================== */
  
  .sr-only {
  
    position:
      absolute;
  
    width:
      1px;
  
    height:
      1px;
  
    margin:
      -1px;
  
    padding:
      0;
  
    overflow:
      hidden;
  
    clip-path:
      inset(50%);
  
    white-space:
      nowrap;
  
  }
  
  
  /* =====================================================================
     BACKGROUND
     ===================================================================== */
  
  .backdrop {
  
    position:
      fixed;
  
    inset:
      0;
  
    z-index:
      0;
  
    background:
      #ffffff;
  
  }
  
  
  .backdrop::after {
  
    content:
      "";
  
    position:
      absolute;
  
    inset:
      0;
  
    pointer-events:
      none;
  
  }
  
  
  /* =====================================================================
     MAIN / SCROLL
     ===================================================================== */
  
  main {
  
    position:
      relative;

    /*
     * Erzeugt einen eigenen Stapelkontext — fängt dadurch .stage
     * (siehe dort) ein: ein z-index dort wirkte bisher nur INNERHALB
     * von main, nie gegen .hud (z-index 20) auf der äußeren Ebene.
     * Das war der eigentliche Grund, warum die Badges beim
     * Hochfahren weiterhin hinter "coming soon"/Datum verschwanden.
     * Jetzt selbst über .hud gesetzt.
     */

    z-index:
      21;

    /*
     * main deckt durch .scroll-track (480svh) praktisch die gesamte
     * Seite ab. Jetzt, wo main über den HUD-Buttons liegt, würde es
     * sonst deren Klicks abfangen (obwohl es visuell transparent
     * ist) — genau das hat eben "peu à peu" und alle Buttons
     * lahmgelegt. pointer-events:none lässt Klicks ungehindert
     * durch; die beiden Badges (einzige klickbare Elemente hier
     * drin) holen sich ihre Klickbarkeit gezielt zurück.
     */

    pointer-events:
      none;
  
  }
  
  
  .scroll-track {
  
    height:
      480svh;
  
  }
  
  
  /* =====================================================================
     STAGE
     ===================================================================== */
  
  .stage {
  
    position:
      sticky;
  
    top:
      0;

    /*
     * position:sticky erzeugt einen eigenen Stapelkontext. Der
     * z-index hier wirkt aber nur INNERHALB von main (siehe dort) —
     * main selbst muss über .hud (z-index 20) liegen, sonst
     * verlieren die Badges beim Hochfahren (siehe updatePetitReveal
     * in main.js) immer gegen "Wandkalender"/Datum oben rechts, egal
     * welchen z-index sie selbst oder .stage haben.
     */

    z-index:
      21;

    height:
      100svh;
  
    padding:
      var(--stage-pad-top)
      var(--stage-pad-x)
      var(--stage-pad-bottom);
  
    container-type:
      size;
  
    display:
      flex;
  
    align-items:
      center;
  
    justify-content:
      center;
  
  }
  
  
  /* =====================================================================
     POSTER
     ===================================================================== */
  
  .poster {
  
    position:
      relative;
  
    margin:
      0;
  
    flex:
      none;
  
    height:
      min(
        calc(100cqh - 20px),
        calc(100cqw * 841 / 594)
      );
  
    width:
      auto;
  
    aspect-ratio:
      594 / 841;
  
    transform:
      translateZ(0);
  
  }
  
  
  .layer {
  
    position:
      absolute;
  
    inset:
      0;
  
    display:
      block;
  
  }
  
  
  /* =====================================================================
     PETIT-PLAKAT (A2) — ÜBERLAPPEND AUF DEM HAUPTPLAKAT
     ===================================================================== */
  
  /*
   * DIN A2 ist linear exakt Faktor 420/594 ≈ 0,7071 kleiner als
   * DIN A1 (halbe Fläche, gleiches Seitenverhältnis). Als Kind von
   * #poster positioniert und in Prozent von dessen eigener Box
   * skaliert, bleibt das Verhältnis bei jeder Bildschirmgröße exakt
   * erhalten. Steht zwar im DOM vor den Haupt-Layern, bekommt aber
   * bewusst ein eigenes z-index, um DAVOR (statt dahinter) zu liegen —
   * an der vorherigen Position (unten rechts überstehend) ragte es
   * sonst bis ins Impressum hinein. Jetzt vertikal mittig, leicht
   * schräg gestellt, nur rechts knapp überstehend.
   */
  
  .petit-poster {
  
    position:
      absolute;
  
    inset:
      auto;
  
    height:
      70.7%;
  
    width:
      auto;
  
    aspect-ratio:
      594 / 841;
  
    top:
      -3%;
  
    right:
      -6%;
  
    z-index:
      1;
  
    transform:
      rotate(7deg);
  
    flex:
      initial;
  
  }
  
  
  .petit-poster .layer--paper {
  
    box-shadow:
      0 0 1px rgba(20, 22, 26, 0.15),
      0 0 20px rgba(20, 22, 26, 0.14),
      0 10px 22px -10px rgba(20, 22, 26, 0.38);
  
  }
  
  
  /* =====================================================================
     RUNDES BADGE — "NEW SIZE: PETIT | A2"
     ===================================================================== */
  
  /*
   * Auf Mobile blendet der Browser beim Antippen standardmäßig ein
   * graues/schwarzes Tap-Highlight-Rechteck ein (bei den gedrehten,
   * runden Badges sichtbar wie ein kurz aufblitzender schwarzer
   * Rahmen um die eigentlich rechteckige Button-Fläche). Hier gezielt
   * unterdrückt — der :focus-visible-Rahmen bleibt für
   * Tastatur-Bedienung trotzdem erhalten (erscheint nur bei Tab,
   * nicht bei Maus-/Touch-Klick).
   */

  .petit-badge,
  .landing-badge {

    -webkit-tap-highlight-color:
      transparent;

    outline:
      none;

  }


  .petit-badge:focus-visible,
  .landing-badge:focus-visible {

    outline:
      2px solid currentColor;

    outline-offset:
      4px;

  }


  .petit-badge {
  
    position:
      absolute;
  
    z-index:
      2;

    /*
     * Elternelement main ist jetzt pointer-events:none (siehe dort)
     * — hier gezielt wieder aktiviert, da dieses Badge klickbar sein
     * soll (dreht auf Klick um, siehe main.js).
     */

    pointer-events:
      auto;

    top:
      -2%;
  
    right:
      -10%;
  
    width:
      30%;
  
    aspect-ratio:
      1;

    /*
     * Erlaubt cqw-Einheiten (Container-Query-Breite) für den Text
     * relativ zur EIGENEN Badge-Breite statt zum Viewport — dadurch
     * skaliert die Schrift beim Verkleinern des Fensters exakt im
     * selben Verhältnis wie das Badge selbst (wie bei einer
     * statischen Grafik). Vorher folgte die Schrift --info-font-size
     * (Viewport-Skalierung), das Badge selbst aber der Plakatgröße
     * (Container-Skalierung) — beide liefen bei manchen
     * Fenstergrößen auseinander, wodurch der Text über den Rand
     * hinausragen konnte.
     */

    container-type:
      inline-size;

    display:
      flex;
  
    align-items:
      center;
  
    justify-content:
      center;
  
    text-align:
      center;
  
    padding:
      6%;
  
    color:
      #ffffff;
  
    /*
     * translateZ(0) + backface-visibility erzwingen eine eigene
     * GPU-Kompositierungsebene — behebt in vielen Browsern
     * Rendering-Nähte, die bei rotierten Elementen mit
     * filter:drop-shadow() (siehe .petit-badge__shape) sonst
     * auftreten können.
     */

    transform:
      rotate(-9deg)
      translateZ(0);

    backface-visibility:
      hidden;

    /*
     * Jetzt ein <button> statt eines <div> (anklickbar, dreht auf
     * Klick um) — Standard-Button-Optik zurücksetzen, damit es
     * weiterhin wie zuvor aussieht.
     */

    appearance:
      none;

    background:
      none;

    border:
      none;

    font:
      inherit;

    cursor:
      pointer;

  }
  
  
  .petit-badge__shape {
  
    position:
      absolute;
  
    inset:
      0;
  
    width:
      100%;
  
    height:
      100%;
  
    /*
     * Die Zackenform folgt automatisch der Jahresfarbe (--ink) —
     * dieselbe Variable, die auch Buttons und den gezeichneten Pfad
     * einfärbt.
     */

    fill:
      var(--ink);

    /*
     * Der Zacken-Pfad besteht aus 48 einzelnen Kurvensegmenten — an
     * den Nahtstellen kann der Browser beim Rasterisieren
     * hauchdünne Lücken erzeugen, durch die kurz der Hintergrund
     * durchscheint (wirkt wie dünne Linien, v. a. bei Rotation +
     * drop-shadow-Filter). Eine unsichtbar dünne Kontur in exakt
     * derselben Farbe wie die Füllung überdeckt diese Nähte, ohne
     * die Form sichtbar zu verändern.
     */

    stroke:
      var(--ink);

    stroke-width:
      1px;

    filter:
      drop-shadow(0 8px 14px rgba(0, 0, 0, 0.22));

  }


  /*
   * Umgedreht (Rückseite): Farben invertiert — weißer Untergrund,
   * Text/Rand in der Jahresfarbe.
   */

  .petit-badge.is-flipped {

    color:
      var(--ink);

  }


  .petit-badge.is-flipped .petit-badge__shape {

    fill:
      #ffffff;

    stroke:
      #ffffff;

  }
  
  
  .petit-badge span {
  
    position:
      relative;
  
    z-index:
      1;
  
    /*
     * Schriftgröße jetzt relativ zur EIGENEN Badge-Breite (cqw)
     * statt zum Viewport (--info-font-size) — skaliert dadurch beim
     * Verkleinern des Fensters exakt im selben Verhältnis wie das
     * Badge selbst, wie bei einer statischen Grafik. --badge-scale
     * wird per JS (main.js, loadBadgeText) anhand der längsten Zeile
     * von content/badge.txt gesetzt: kurzer Text bleibt bei voller
     * Größe, längerer Text wird proportional kleiner, damit er im
     * Kreis bleibt.
     */

    font-family:
      var(--font);
  
    font-size:
      calc(40cqw * var(--badge-scale, 1));
  
    line-height:
      1;
  
    letter-spacing:
      var(--letter-spacing);
  
  }
  
  
  .petit-poster[hidden],
  .petit-badge[hidden] {
  
    display:
      none;
  
  }
  

  /* =====================================================================
     LANDING-BADGE — RUND, MITTIG, ZEIGT content/infos.txt
     ===================================================================== */

  /*
   * Anders als das gezackte Petit-Badge (Sticker-Optik) bewusst ein
   * schlichter Kreis — dieselbe Größen- und Schrift-Logik wie das
   * Petit-Badge (30 % der Plakatbreite, --info-font-size mit
   * --badge-scale), nur mittig statt in der Ecke positioniert und
   * relativ zum Plakat (#poster) statt zum Viewport. Erscheint
   * automatisch beim Laden der Landing Page (2026), verschwindet
   * nach 2 s von selbst und lässt sich über den "Infos"-Button
   * jederzeit erneut einblenden (siehe main.js).
   */

  .landing-badge {

    /*
     * Exakt dieselbe Position, Größe und Schräge wie .petit-badge —
     * bewusst kein border-radius mehr für die Form, sondern ein
     * eigenes rundes SVG (.landing-badge__shape), analog zum
     * gezackten SVG des Petit-Badges. Verschwindet beim Scrollen
     * genauso (siehe updatePetitReveal in main.js) — deshalb bewusst
     * OHNE Opacity-Übergang, nur die Position bewegt sich.
     */

    position:
      absolute;

    z-index:
      2;

    /*
     * Elternelement main ist jetzt pointer-events:none (siehe dort)
     * — hier gezielt wieder aktiviert, da dieses Badge klickbar sein
     * soll (dreht auf Klick um, siehe main.js).
     */

    pointer-events:
      auto;

    top:
      -2%;

    right:
      -10%;

    width:
      30%;

    aspect-ratio:
      1;

    /*
     * Dieselbe Container-Query-Kopplung wie .petit-badge: Text
     * skaliert dadurch mit der eigenen Badge-Breite, nicht mit dem
     * Viewport — bleibt so bei jeder Fenstergröße proportional zum
     * Badge, wie bei einer statischen Grafik.
     */

    container-type:
      inline-size;

    display:
      flex;

    align-items:
      center;

    justify-content:
      center;

    text-align:
      center;

    padding:
      6%;

    color:
      #ffffff;

    /*
     * Siehe .petit-badge: eigene GPU-Ebene gegen mögliche
     * Rendering-Nähte bei Rotation + drop-shadow-Filter.
     */

    transform:
      rotate(-9deg)
      translateZ(0);

    backface-visibility:
      hidden;

    /*
     * Jetzt ein <button> statt eines <div> — Standard-Button-Optik
     * zurücksetzen, damit es weiterhin wie zuvor aussieht.
     */

    appearance:
      none;

    background:
      none;

    border:
      none;

    font:
      inherit;

    cursor:
      pointer;

  }


  .landing-badge__shape {

    position:
      absolute;

    inset:
      0;

    width:
      100%;

    height:
      100%;

    fill:
      var(--ink);

    filter:
      drop-shadow(0 8px 14px rgba(0, 0, 0, 0.22));

  }


  /*
   * Umgedreht (Rückseite): Farben invertiert — weißer Untergrund,
   * Text/Rand in der Jahresfarbe.
   */

  .landing-badge.is-flipped {

    color:
      var(--ink);

  }


  .landing-badge.is-flipped .landing-badge__shape {

    fill:
      #ffffff;

  }


  .landing-badge span {

    position:
      relative;

    z-index:
      1;

    /*
     * Exakt dieselbe Formel wie .petit-badge span: gleiche Schrift
     * (GT-Standard), gleiche cqw-Kopplung an die eigene Badge-Breite
     * statt an den Viewport — skaliert dadurch proportional mit dem
     * Badge, wie bei einer statischen Grafik. --badge-scale wird für
     * Vorder- und Rückseite gemeinsam berechnet (main.js), damit das
     * Badge beim Umdrehen nicht springt.
     */

    font-family:
      var(--font);

    font-size:
      calc(40cqw * var(--badge-scale, 1));

    line-height:
      1.15;

    letter-spacing:
      var(--letter-spacing);

  }


  .landing-badge[hidden] {

    display:
      none;

  }


  /* =====================================================================
     POSTER — PAPIER
     ===================================================================== */
  
  .layer--paper {
  
    background:
      var(--paper);
  
    border-radius:
      2px;
  
    /*
     * Erste Ebene ohne Versatz sorgt für eine dezente Kontur ringsum
     * (vorher nur unten sichtbar, Plakat ging auf hellem Hintergrund
     * seitlich/oben leicht unter). Die übrigen Ebenen wie zuvor,
     * nur etwas kräftiger für mehr Tiefe.
     */

    box-shadow:
      0 0 1px rgba(20, 22, 26, 0.12),
      0 0 26px rgba(20, 22, 26, 0.10),
      0 1px 2px rgba(20, 22, 26, 0.08),
      0 10px 20px -10px rgba(20, 22, 26, 0.17),
      0 28px 50px -26px rgba(20, 22, 26, 0.46);
  
  }
  
  
  /* =====================================================================
     POSTER — LAYOUT
     ===================================================================== */
  
  .layer--layout {
  
    width:
      100%;
  
    height:
      100%;
  
    object-fit:
      contain;
  
  }
  
  
  /* =====================================================================
     POSTER — PFAD
     ===================================================================== */
  
  .layer--path svg {
  
    width:
      100%;
  
    height:
      100%;
  
    display:
      block;
  
    overflow:
      visible;
  
  }
  
  
  .layer--path path,
  .layer--path polyline,
  .layer--path polygon {
  
    fill:
      none;
  
    stroke:
      var(--ink-line);
  
    stroke-width:
      5;
  
    stroke-linecap:
      round;
  
    stroke-linejoin:
      round;
  
  }
  
  
  /* =====================================================================
     STIFT / HALO
     ===================================================================== */
  
  .pen-halo {
  
    fill:
      var(--ink-line);
  
    opacity:
      0.18;
  
    transform-box:
      fill-box;
  
    transform-origin:
      center;
  
    animation:
      pen-breathe
      2.6s
      ease-in-out
      infinite;
  
  }
  
  
  @keyframes pen-breathe {
  
    0%,
    100% {
  
      transform:
        scale(1);
  
      opacity:
        0.18;
  
    }
  
    50% {
  
      transform:
        scale(1.35);
  
      opacity:
        0.10;
  
    }
  
  }
  
  
  /* =====================================================================
     HUD — FIXE ECKEN
     ===================================================================== */
  
  .hud {
  
    position:
      fixed;
  
    z-index:
      20;
  
    margin:
      0;
  
    font-family:
      var(--font);
  
    font-size:
      var(--font-size);
  
    font-weight:
      400;
  
    color:
      var(--ink);
  
  }
  
  
  .hud p {
  
    margin:
      0;
  
  }
  
  
/* =====================================================================
   POSITIONEN — UNTEN LINKS / UNTEN RECHTS
   ===================================================================== */

   .hud--tl {

    position: fixed;
  
    top:
      var(--hud-pad);
  
    left:
      var(--hud-pad);
  
  }
  
  
  .hud--tr {
  
    position: fixed;
  
    top:
      var(--hud-pad);
  
    right:
      var(--hud-pad);
  
  }
  
  
  /* ---------------------------------------------------------------------
     IMPRESSUM — IMMER UNTEN LINKS
     --------------------------------------------------------------------- */
  
  .hud--bl {
  
    position: fixed;

    /*
     * Höher als main (z-index 21, siehe dort) — sonst gewinnt in der
     * Überlappungszone mit dem Plakat (bei schmalen Fenstern) jetzt
     * das Plakat statt des Buttons, der Kreis wirkt dadurch
     * "durchsichtig" (die Plakatkante wird darübergemalt). Nur diese
     * beiden unteren Ecken brauchen das — oben (peu à peu, Datum)
     * soll main ja bewusst weiterhin gewinnen, damit die
     * hochfahrenden Badges darüber sichtbar sind.
     */

    z-index:
      22;
  
    /*
     * env(safe-area-inset-bottom) hält den Abstand zum unteren Rand
     * konstant, unabhängig davon, ob iOS Safari die Tabs unten oder
     * oben anzeigt (das ändert den sicheren Bereich am unteren Rand
     * und ließ Buttons/Impressum sonst je nach Einstellung
     * unterschiedlich weit nach unten rutschen).
     */

    bottom:
      calc(
        var(--hud-pad) +
        env(safe-area-inset-bottom, 0px)
      );
  
    left:
      var(--hud-pad);
  
    right:
      auto;
  
    top:
      auto;
  
  }
  
  
  /* ---------------------------------------------------------------------
     KAUFEN — IMMER UNTEN RECHTS
     --------------------------------------------------------------------- */
  
  .hud--br {
  
    position: fixed;

    /*
     * Siehe .hud--bl: höher als main (z-index 21), damit der Button
     * bei Überlappung mit dem Plakat immer gewinnt.
     */

    z-index:
      22;
  
    bottom:
      calc(
        var(--hud-pad) +
        env(safe-area-inset-bottom, 0px)
      );
  
    right:
      var(--hud-pad);
  
    left:
      auto;
  
    top:
      auto;

    display:
      flex;

    align-items:
      center;

    gap:
      8px;
  
  }
  
  
  /* ---------------------------------------------------------------------
     IMPRESSUM — IMMER UNTEN MITTIG
     --------------------------------------------------------------------- */
  
  .hud--bc {
  
    position: fixed;

    /*
     * .hud--bc hat ein eigenes transform (siehe unten) — das erzeugt
     * einen eigenen Stapelkontext. Der z-index auf .imprint-popup
     * weiter unten wirkt dadurch nur INNERHALB von .hud--bc, nie
     * gegen main (z-index 21) auf der äußeren Ebene — exakt dasselbe
     * Problem wie zuvor bei main/.stage. Deshalb hier direkt gesetzt.
     */

    z-index:
      22;
  
    bottom:
      calc(
        var(--hud-pad) +
        env(safe-area-inset-bottom, 0px)
      );
  
    left:
      50%;
  
    /*
     * Bündig mit der Unterkante der anderen Buttons (kein
     * vertikaler Ausgleich mehr) — dieselbe "bottom"-Basis wie
     * .hud--bl/.hud--br.
     */

    transform:
      translateX(-50%);
  
    right:
      auto;
  
    top:
      auto;
  
    display:
      flex;
  
    align-items:
      center;
  
    flex-wrap:
      nowrap;
  
    gap:
      8px;
  
  }


  /*
   * Zweite Reihe (Widerruf, AGB, Versand — nur spaet.shop) sitzt
   * exakt wie die erste (Impressum, Datenschutz), nur mit größerem
   * Abstand zur Unterkante, damit sie darüber schwebt.
   */

  .hud--bc-row2 {

    bottom:
      calc(
        var(--hud-pad) +
        env(safe-area-inset-bottom, 0px) +
        20px
      );

  }


  /*
   * Ohne diese Regel überschreibt .hud--bc's display:flex das native
   * [hidden]-Verhalten (Autoren-Styles schlagen UA-Styles immer,
   * unabhängig von der Spezifität).
   */

  .hud--bc-row2[hidden] {

    display:
      none;

  }
  
  
  
  /* =====================================================================
     TITEL / DATUM
     ===================================================================== */
  
  .site-title {
  
    /*
     * "peu à peu" ist ein <button> (display:inline-block per
     * Browser-Standard), "Wandkalender"/Datum ist ein <p>
     * (display:block) — dieser Unterschied allein reicht, um die
     * beiden vertikal leicht gegeneinander zu verschieben. Hier
     * vereinheitlicht, damit beide exakt gleich sitzen.
     */

    display:
      block;

    margin:
      0;
  
    font-family:
      var(--font);
  
    font-size:
      var(--font-size);
  
    font-weight:
      400;
  
    line-height:
      1;
  
    letter-spacing:
      var(--letter-spacing);
  
    color:
      var(--ink);
  
    white-space:
      nowrap;
  
  }


  /*
   * "peu à peu" oben links ist jetzt ein <button> (dauerhafter Link
   * zur Landing Page, siehe main.js), soll aber optisch weiterhin
   * wie reiner Text wirken.
   */

  .site-title--home {

    appearance:
      none;

    background:
      none;

    border:
      none;

    padding:
      0;

    cursor:
      pointer;

    /*
     * Derselbe Tap-Highlight/Fokusrahmen wie bei den Badges (siehe
     * dort) — "peu à peu" ist ebenfalls ein <button>.
     */

    -webkit-tap-highlight-color:
      transparent;

    outline:
      none;

  }


  .site-title--home:focus-visible {

    outline:
      2px solid currentColor;

    outline-offset:
      4px;

  }


  /* =====================================================================
     INFO / IMPRESSUM / KAUFEN BEREICH
     ===================================================================== */
  
  .info-area {
  
    position:
      fixed;
  
    display:
      flex;
  
    flex-direction:
      column;
  
    align-items:
      flex-start;
  
  }
  
  
  /* =====================================================================
     BUTTONS
     ===================================================================== */
  
  .info-button {
  
    appearance:
      none;
  
    display:
      inline-flex;
  
    align-items:
      center;
  
    justify-content:
      center;
  
    padding:
      11px 18px;
  
    border:
      1.5px solid var(--ink);
  
    border-radius:
      999px;
  
    background:
      transparent;
  
    box-shadow:
      none;
  
    color:
      var(--ink);
  
    font-family:
      var(--info-font);
  
    font-size:
      var(--info-font-size);
  
    font-weight:
      400;
  
    line-height:
      1;
  
    letter-spacing:
      var(--letter-spacing);
  
    cursor:
      pointer;
  
    transition:
      background-color 0.2s ease,
      color 0.2s ease;

    /*
     * Betrifft alle .info-button-Varianten (Jahres-Pfeile, Instagram/
     * Mail, Impressum, Infos …) — ohne das zeigen mobile Browser beim
     * Antippen kurz ein graues/schwarzes Tap-Highlight-Rechteck. Der
     * :focus-visible-Rahmen weiter unten bleibt für Tastatur-Bedienung
     * trotzdem erhalten.
     */

    -webkit-tap-highlight-color:
      transparent;

    outline:
      none;
  
  }
  
  
  /*
   * Ohne diese Regel überschreibt die obige display:inline-flex das
   * native [hidden]-Verhalten (Autoren-Styles schlagen UA-Styles immer,
   * unabhängig von der Spezifität) — Buttons blieben sonst trotz
   * hidden-Attribut sichtbar.
   */
  
  .info-button[hidden] {
  
    display:
      none;
  
  }
  
  
  /* =====================================================================
     HOVER — INVERTIERT
     ===================================================================== */
  
  /*
   * In @media (hover: hover) gekapselt: Touch-Geräte "hovern" beim Tap
   * technisch kurz, ohne dass danach ein echtes mouseleave folgt — die
   * invertierte Farbe blieb dadurch auf Mobile teilweise hängen. Echte
   * Zeigegeräte (Maus/Trackpad) sind von dieser Einschränkung nicht
   * betroffen.
   */
  
  @media (hover: hover) {
  
    .info-button:hover {
  
      background:
        var(--ink);
  
      color:
        #ffffff;
  
    }
  
  }
  
  
  /*
   * Feste Breite/Höhe für die Jahres-Navigations-Buttons — sie
   * sollen immer gleich groß bleiben, unabhängig von der Ziffernzahl.
   */

  .nav-button {

    /*
     * Kreisform statt Pille: Breite und Höhe teilen sich dieselbe
     * Formel, direkt an --info-font-size gekoppelt — bleibt dadurch
     * bei jeder Bildschirmgröße automatisch ein echter Kreis, ohne
     * eigene Breakpoint-Overrides. Icons/Pfeile bleiben unverändert
     * groß (siehe .nav-icon weiter unten), nur der Button selbst.
     * 1.8 statt der ursprünglichen 2.2 — sonst überlagerte der
     * Button bei schmalen Fenstern das Plakat um ca. 20px.
     */

    width:
      calc(var(--info-font-size) * 1.8);

    height:
      calc(var(--info-font-size) * 1.8);

    border-radius:
      999px;

    /*
     * Keine Kontur, transparenter Hintergrund. Bei Hover invertiert
     * die Seite bereits generisch über .info-button:hover (weiter
     * unten) — Icon/Pfeil folgt über currentColor automatisch mit.
     * Instagram/Mail bleiben davon unberührt: .info-button--filled
     * überschreibt Hintergrund/Farbe dauerhaft, unabhängig von Hover.
     */

    border:
      none;

    background:
      transparent;

  }


  /*
   * Instagram/Mail lösen eine andere Aktion aus als die normale
   * Jahres-Navigation (externer Link bzw. Mail-Programm statt
   * Jahreswechsel) — deshalb bereits im Ruhezustand invertiert
   * (gefüllt), nicht erst bei Hover/Klick.
   */

  .info-button--filled {

    background:
      var(--ink);

    color:
      #ffffff;

  }


  /*
   * Icon statt Text in Instagram-/Mail-Zustand — Größe relativ zur
   * festen Button-Box, unabhängig von der Jahreszahl-Schriftgröße.
   */

  /*
   * Icons (Instagram, Mail, Jahres-Pfeile) füllen den Button jetzt
   * jeweils allein aus — dieselbe Höhe wie eine Jahreszahl wie
   * "2026" im selben Button.
   */

  .nav-button {

    gap:
      6%;

  }


  .nav-button .nav-icon {

    /*
     * Direkt an --info-font-size gekoppelt statt an einen Prozentsatz
     * der Button-Box — so entspricht die Icon-Höhe exakt der
     * Schrifthöhe einer Jahreszahl wie "2026" im selben Button.
     */

    width:
      var(--info-font-size);

    height:
      var(--info-font-size);

    flex-shrink:
      0;

  }


  /*
   * "buy" jetzt zusammen mit dem Icon im selben Button — überschreibt
   * die feste Kreisform von .nav-button (dort width = height) durch
   * eine Pill-Form: Breite richtet sich nach dem Inhalt, dieselbe
   * Höhe wie die runden Buttons daneben, border-radius:999px (von
   * .info-button geerbt) rundet dadurch automatisch beide Enden ab.
   */

  .buy-button {

    width:
      auto;

    padding:
      0 20px;

    gap:
      8px;

  }


  .buy-button span {

    font-family:
      var(--font);

    font-size:
      calc(var(--info-font-size) * 0.5);

    white-space:
      nowrap;

  }
  
  
  /* =====================================================================
     GEÖFFNET — INVERTIERT
     ===================================================================== */
  
  .info-button[aria-expanded="true"] {
  
    background:
      var(--ink);
  
    color:
      #ffffff;
  
  }
  
  
  /* =====================================================================
     FOKUS
     ===================================================================== */
  
  .info-button:focus-visible {
  
    outline:
      2px solid var(--ink);
  
    outline-offset:
      4px;
  
  }
  
  
  
  /* =====================================================================
     IMPRESSUM — IMMER GRAU, HALBE GRÖSSE
     ===================================================================== */

  /*
   * Bewusst fest verdrahtet statt über --ink: das Impressum soll auch
   * bei einem Jahreswechsel (blau/orange/grün) unverändert neutral
   * grau bleiben.
   */


  /* =====================================================================
     "SPAET"-LOGO + TRENNSTRICH VOR DEM IMPRESSUM-BUTTON
     ===================================================================== */

  .spaet-logo {

    font-family:
      "JaliLatin-SemiBoldItalic";

    font-size:
      calc(var(--info-font-size) * 0.38);

    color:
      var(--imprint-color);

    text-decoration:
      none;

    /*
     * Illustrator-Laufweite -30 entspricht -30 / 1000 em.
     */

    letter-spacing:
      -0.03em;

  }


  /* =====================================================================
     ICON-LINKS (INSTAGRAM, MAIL) IN DER MITTLEREN ZEILE
     ===================================================================== */

  .icon-link {

    display:
      inline-flex;

    align-items:
      center;

    justify-content:
      center;

    width:
      calc(var(--info-font-size) * 0.6);

    height:
      calc(var(--info-font-size) * 0.6);

    color:
      var(--imprint-color);

  }


  .icon-link svg {

    width:
      100%;

    height:
      100%;

  }


  @media (hover: hover) {

    .icon-link:hover {

      color:
        var(--ink);

    }

  }


  /* =====================================================================
     PAYPAL-WARENKORB (NUR SPAET.SHOP)
     ===================================================================== */

  /*
   * Ohne Gegenmaßnahme übernimmt PayPals Widget-Inhalt (kein
   * eigenständiges iframe, sondern normales HTML) unsere globalen
   * Seiten-Styles — u. a. die große, blaue Überschriften-Schrift für
   * Produktdetails/Preis. Hier gezielt auf normale Fließtext-Werte
   * zurückgesetzt.
   */

  .paypal-buy-button,
  .paypal-buy-button * {

    font-family:
      -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
      Helvetica, Arial, sans-serif !important;

    font-size:
      14px !important;

    color:
      #1a1a1a !important;

    line-height:
      normal !important;

    letter-spacing:
      normal !important;

  }


  .paypal-buy-button {

    display:
      block;

    max-width:
      100%;

  }


  /*
   * "In den Warenkorb" (großer Produkt-Umfang: Bild, Preis,
   * Beschreibung, Mengenauswahl) steckt jetzt in einem echten,
   * zentrierten Pop-up statt direkt in der Button-Zeile — dort hätte
   * es (wie im ersten Versuch sichtbar) unkontrolliert über die
   * ganze Seite wachsen können. Öffnet sich nur über den eigenen,
   * von uns kontrollierten "Kaufen"-Button (siehe .nav-icon-Icon in
   * index.html), der bei 2027 den Mail-Button ersetzt.
   */

  .paypal-modal-backdrop {

    position:
      fixed;

    inset:
      0;

    z-index:
      50;

    display:
      flex;

    align-items:
      center;

    justify-content:
      center;

    padding:
      20px;

    background:
      rgba(0, 0, 0, 0.4);

  }


  .paypal-modal-backdrop[hidden] {

    display:
      none;

  }


  .paypal-modal {

    position:
      relative;

    width:
      min(360px, 100%);

    max-height:
      85vh;

    overflow:
      auto;

    padding:
      32px 20px 20px;

    border-radius:
      12px;

    background:
      #ffffff;

    box-shadow:
      0 20px 50px rgba(0, 0, 0, 0.3);

  }


  .paypal-modal__close {

    position:
      absolute;

    top:
      8px;

    right:
      10px;

    appearance:
      none;

    background:
      none;

    border:
      none;

    padding:
      4px 8px;

    margin:
      0;

    color:
      #1a1a1a;

    font-family:
      -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
      Helvetica, Arial, sans-serif;

    font-size:
      22px;

    line-height:
      1;

    cursor:
      pointer;

    -webkit-tap-highlight-color:
      transparent;

    outline:
      none;

  }


  .paypal-modal__close:focus-visible {

    outline:
      2px solid #1a1a1a;

    outline-offset:
      2px;

  }


  @media (hover: hover) {

    .paypal-modal__close:hover {

      opacity:
        0.6;

    }

  }


  /*
   * Trennt das Warenkorb-Widget optisch vom Kaufen-Widget darüber.
   */

  /*
   * .paypal-modal wird hier für einen zweiten, inhaltlich anderen
   * Zweck wiederverwendet (Rechtstexte statt PayPal-Widget) —
   * dieselbe Modal-Optik (zentriert, Schließen-Kreuz), aber eigene
   * Textformatierung statt der PayPal-Schrift-Zurücksetzung. Eine
   * gemeinsame Klasse statt einzelner IDs, da jetzt vier Rechtstexte
   * (Widerruf, Datenschutz, AGB, Versand) dasselbe Modal-Muster
   * nutzen.
   */

  .legal-modal-content {

    font-family:
      -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
      Helvetica, Arial, sans-serif;

    font-size:
      14px;

    line-height:
      1.5;

    color:
      #1a1a1a;

    /*
     * Lange, umbruchlose Strings (v. a. URLs wie der PayPal-Link)
     * sprengten sonst die Breite des Pop-ups und erzeugten einen
     * horizontalen Scrollbalken — bricht sie jetzt bei Bedarf
     * mitten im Wort um.
     */

    overflow-wrap:
      anywhere;

  }


  .legal-modal-content p {

    margin:
      0 0 14px;

  }


  .legal-modal-content p:last-child {

    margin-bottom:
      0;

  }


  /*
   * Digitale Widerrufsmöglichkeit — eigenes Formular unter dem
   * Rechtstext im Widerruf-Modal.
   */

  .widerruf-form {

    margin-top:
      24px;

    padding-top:
      20px;

    border-top:
      1px solid #e5e5e5;

    font-family:
      -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
      Helvetica, Arial, sans-serif;

  }


  .widerruf-form h3 {

    margin:
      0 0 14px;

    font-size:
      15px;

    font-weight:
      600;

    color:
      #1a1a1a;

  }


  .widerruf-form label {

    display:
      block;

    margin:
      12px 0 4px;

    font-size:
      12px;

    color:
      #6b6b6b;

  }


  .widerruf-form input {

    display:
      block;

    width:
      100%;

    padding:
      8px 10px;

    box-sizing:
      border-box;

    border:
      1px solid #cccccc;

    border-radius:
      6px;

    background:
      #ffffff;

    color:
      #1a1a1a;

    font-family:
      inherit;

    font-size:
      14px;

  }


  .widerruf-form input:focus-visible {

    outline:
      2px solid #1a1a1a;

    outline-offset:
      1px;

  }


  .widerruf-form__error {

    margin:
      12px 0 0;

    color:
      #c0392b;

    font-size:
      13px;

  }


  .widerruf-form__submit {

    display:
      block;

    width:
      100%;

    margin-top:
      16px;

    padding:
      10px;

    appearance:
      none;

    border:
      none;

    border-radius:
      6px;

    background:
      #1a1a1a;

    color:
      #ffffff;

    font-family:
      inherit;

    font-size:
      14px;

    cursor:
      pointer;

    -webkit-tap-highlight-color:
      transparent;

    outline:
      none;

  }


  .widerruf-form__submit:focus-visible {

    outline:
      2px solid #1a1a1a;

    outline-offset:
      2px;

  }


  @media (hover: hover) {

    .widerruf-form__submit:hover {

      opacity:
        0.85;

    }

  }


  .paypal-modal__cart-widget {

    margin-top:
      20px;

    padding-top:
      20px;

    border-top:
      1px solid #e5e5e5;

  }


  .imprint-divider {

    font-family:
      var(--info-font);

    font-size:
      calc(var(--info-font-size) * 0.38);

    color:
      var(--imprint-color);

    opacity:
      0.6;

  }


  .imprint-text-button {

    /*
     * Bewusst kein Pill-Button mehr: schlichter, anklickbarer Text
     * statt eines optisch gleichwertigen dritten Buttons neben den
     * Jahres-/Mail-Buttons — das Impressum soll zurückhaltend bleiben.
     */

    border:
      none;

    background:
      none;

    box-shadow:
      none;

    padding:
      4px 2px;

    border-radius:
      2px;

    color:
      var(--imprint-color);

    font-size:
      calc(var(--info-font-size) * 0.38);

  }


  @media (hover: hover) {

    .imprint-text-button:hover {

      background:
        none;

      color:
        var(--imprint-color);

      text-decoration:
        underline;

      text-underline-offset:
        2px;

    }

  }


  .imprint-text-button[aria-expanded="true"] {

    background:
      none;

    color:
      var(--imprint-color);

    text-decoration:
      underline;

    text-underline-offset:
      2px;

  }


  /* =====================================================================
     MOBILE
     ===================================================================== */
  
  @media (max-width: 860px) {
  
    :root {
  
      --hud-pad:
        18px;
  
      --stage-pad-top:
        70px;
  
      --stage-pad-bottom:
        80px;
  
      --stage-pad-x:
        30px;
  
      --poster-gap:
        30px;
  
    }
  
  
    .info-button {
  
      padding:
        10px 16px;
  
    }
  
  }
  
  
  /* =====================================================================
     SEHR KLEINE DISPLAYS
     ===================================================================== */
  
  @media (max-width: 500px) {
  
    :root {
  
      --hud-pad:
        16px;
  
      --font-size:
        24px;
  
      --info-font-size:
        30px;
  
      --stage-pad-top:
        64px;
  
      --stage-pad-bottom:
        76px;
  
      --stage-pad-x:
        20px;
  
      --poster-gap:
        24px;
  
    }
  
  
    .info-button {
  
      padding:
        9px 14px;
  
    }


    /*
     * Auf Mobile eigener, größerer Faktor statt der Desktop-Formel
     * (1.8× — dort bewusst kleiner gehalten, siehe .nav-button oben,
     * um Überlappung mit dem Plakat bei schmalen Desktop-Fenstern zu
     * vermeiden). Mobile hat dieses Überlappungsrisiko praktisch
     * nicht, deshalb hier eigenständig etwas großzügiger.
     */

    /*
     * :not(.buy-button) — sonst würde diese später stehende Regel
     * die Pill-Breite von .buy-button (siehe oben) auf Mobile wieder
     * zu einem Kreis zwingen (gleiche Spezifität, aber später im
     * Stylesheet).
     */

    .nav-button:not(.buy-button) {

      width:
        calc(var(--info-font-size) * 2);

      height:
        calc(var(--info-font-size) * 2);

    }


    /*
     * Der "buy"-Button unten rechts überschneidet sich auf schmalen
     * Bildschirmen sonst mit "Versand" in der Zeile darüber — hier
     * horizontal enger: kleinerer Abstand zwischen den Rechtstext-
     * Buttons/Trennstrichen und weniger Innenabstand im Pill-Button.
     */

    .hud--bc {

      gap:
        4px;

    }

    .imprint-text-button {

      padding:
        4px 0;

    }

    .buy-button {

      padding:
        0 12px;

    }

    .hud--br {

      gap:
        4px;

    }

  }
  
  
  /* =====================================================================
     REDUZIERTE BEWEGUNG
     ===================================================================== */
  
  @media (prefers-reduced-motion: reduce) {
  
    .pen-halo {
  
      animation:
        none;
  
    }
  
  
    .info-button {
  
      transition:
        none;
  
    }
  
  }
  
  
  /* =====================================================================
     LOGO — UNTEN MITTIG
     ===================================================================== */
  
  .site-logo {
  
    position:
      fixed;
  
    left:
      50%;
  
    bottom:
      calc(
        var(--hud-pad) +
        (var(--font-size) + 14px) / 2
      );
  
    z-index:
      20;
  
    transform:
      translateX(-50%);
  
    display:
      flex;
  
    align-items:
      center;
  
    justify-content:
      center;
  
    pointer-events:
      none;
  
  }
  
  
  .site-logo img {
  
    display:
      block;
  
    width:
      60px;
  
    height:
      auto;
  
    max-width:
      20vw;
  
    filter:
      grayscale(100%);
  
    opacity:
      0;
  
  }
  
  
  /* =====================================================================
     LOGO — MOBILE
     ===================================================================== */
  
  @media (max-width: 860px) {
  
    .site-logo {
  
      bottom:
        calc(
          var(--hud-pad) +
          (var(--font-size) + 12px) / 2
        );
  
    }
  
  }
  
  
  @media (max-width: 500px) {
  
    .site-logo {
  
      bottom:
        calc(
          var(--hud-pad) +
          (var(--font-size) + 12px) / 2
        );
  
    }
  
  }
  