  :root{
    --forest-950:#0a130f;
    --forest-900:#0f1c15;
    --forest-800:#182a20;
    --forest-700:#22392c;
    --paper:#f4f1e6;
    --paper-dim:#d9d4c2;
    --lime:#c8f169;
    --lime-dim:#9fce4a;
    --amber:#ff8a3d;
    --mist:#8fb39e;
    --line: rgba(244,241,230,0.14);

    --font-display: 'Fraunces', serif;
    --font-body: 'Inter', sans-serif;
    --font-mono: 'JetBrains Mono', monospace;

    --ease: cubic-bezier(.16,.8,.24,1);

    /* ---------- Zeiger: eine kleine Taschenlampe ----------
     * Passend zum Lichtkegel, der dem Cursor ohnehin folgt (.page-glow), haelt
     * man jetzt auch die Lampe selbst in der Hand. Der Griff ist bewusst leicht
     * krumm gezeichnet (Q-Kurven statt Geraden), die Strahlen sind
     * unterschiedlich lang – im selben handgemachten Ton wie die Jahresringe.
     *
     * Kopf und Griff sind gleich breit, ein durchgehender Stab. Getrennt werden
     * sie nur ueber die Farbe: vorne das Licht, hinten das Gehaeuse.
     *
     * Jede Form steht zweimal drin: erst dick in Waldschwarz als Kontur, dann
     * duenner in Limette darueber. Ohne die Kontur verschwaende der helle Zeiger
     * auf der limettenen CTA-Flaeche.
     *
     * Der Griffpunkt (3 3) sitzt an der Spitze des Lichts – dort klickt es, dort
     * steht auch der Kegel. Zwei Fassungen: ruhend und, ueber allem Anklickbaren,
     * eingeschaltet (heller, ein Strahl mehr, ein Hauch Schein).
     */
    --cursor-torch: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2234%22%20height%3D%2234%22%20viewBox%3D%220%200%2034%2034%22%3E%3Cpath%20d%3D%22M13.2%2012.6%20Q15.2%2014.6%2017.2%2017.0%22%20fill%3D%22none%22%20stroke%3D%22%230a130f%22%20stroke-width%3D%229.6%22%20stroke-linecap%3D%22round%22%2F%3E%3Cpath%20d%3D%22M19.0%2018.8%20Q23.4%2022.6%2027.2%2027.8%22%20fill%3D%22none%22%20stroke%3D%22%230a130f%22%20stroke-width%3D%229.6%22%20stroke-linecap%3D%22round%22%2F%3E%3Cpath%20d%3D%22M8.8%208.4%20Q6.2%205.8%203.4%203.2%22%20fill%3D%22none%22%20stroke%3D%22%230a130f%22%20stroke-width%3D%223.6%22%20stroke-linecap%3D%22round%22%2F%3E%3Cpath%20d%3D%22M11.6%207.2%20Q10.6%204.8%209.8%202.4%22%20fill%3D%22none%22%20stroke%3D%22%230a130f%22%20stroke-width%3D%223.6%22%20stroke-linecap%3D%22round%22%2F%3E%3Cpath%20d%3D%22M7.4%2011.4%20Q4.9%2010.2%202.5%209.4%22%20fill%3D%22none%22%20stroke%3D%22%230a130f%22%20stroke-width%3D%223.6%22%20stroke-linecap%3D%22round%22%2F%3E%3Cpath%20d%3D%22M13.2%2012.6%20Q15.2%2014.6%2017.2%2017.0%22%20fill%3D%22none%22%20stroke%3D%22%23b3cc79%22%20stroke-width%3D%226.2%22%20stroke-linecap%3D%22round%22%2F%3E%3Cpath%20d%3D%22M19.0%2018.8%20Q23.4%2022.6%2027.2%2027.8%22%20fill%3D%22none%22%20stroke%3D%22%23d9d4c2%22%20stroke-width%3D%226.2%22%20stroke-linecap%3D%22round%22%2F%3E%3Cpath%20d%3D%22M8.8%208.4%20Q6.2%205.8%203.4%203.2%22%20fill%3D%22none%22%20stroke%3D%22%23b3cc79%22%20stroke-width%3D%221.5%22%20stroke-linecap%3D%22round%22%2F%3E%3Cpath%20d%3D%22M11.6%207.2%20Q10.6%204.8%209.8%202.4%22%20fill%3D%22none%22%20stroke%3D%22%23b3cc79%22%20stroke-width%3D%221.5%22%20stroke-linecap%3D%22round%22%2F%3E%3Cpath%20d%3D%22M7.4%2011.4%20Q4.9%2010.2%202.5%209.4%22%20fill%3D%22none%22%20stroke%3D%22%23b3cc79%22%20stroke-width%3D%221.5%22%20stroke-linecap%3D%22round%22%2F%3E%3C%2Fsvg%3E") 3 3;
    --cursor-torch-on: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2234%22%20height%3D%2234%22%20viewBox%3D%220%200%2034%2034%22%3E%3Ccircle%20cx%3D%226.4%22%20cy%3D%226.4%22%20r%3D%226.2%22%20fill%3D%22%23b3cc79%22%20opacity%3D%22.2%22%2F%3E%3Cpath%20d%3D%22M13.2%2012.6%20Q15.2%2014.6%2017.2%2017.0%22%20fill%3D%22none%22%20stroke%3D%22%230a130f%22%20stroke-width%3D%229.6%22%20stroke-linecap%3D%22round%22%2F%3E%3Cpath%20d%3D%22M19.0%2018.8%20Q23.4%2022.6%2027.2%2027.8%22%20fill%3D%22none%22%20stroke%3D%22%230a130f%22%20stroke-width%3D%229.6%22%20stroke-linecap%3D%22round%22%2F%3E%3Cpath%20d%3D%22M8.8%208.4%20Q6.2%205.8%203.4%203.2%22%20fill%3D%22none%22%20stroke%3D%22%230a130f%22%20stroke-width%3D%223.9%22%20stroke-linecap%3D%22round%22%2F%3E%3Cpath%20d%3D%22M11.6%207.2%20Q10.6%204.8%209.8%202.4%22%20fill%3D%22none%22%20stroke%3D%22%230a130f%22%20stroke-width%3D%223.9%22%20stroke-linecap%3D%22round%22%2F%3E%3Cpath%20d%3D%22M7.4%2011.4%20Q4.9%2010.2%202.5%209.4%22%20fill%3D%22none%22%20stroke%3D%22%230a130f%22%20stroke-width%3D%223.9%22%20stroke-linecap%3D%22round%22%2F%3E%3Cpath%20d%3D%22M10.4%209.8%20Q7.6%207.4%204.6%205.2%22%20fill%3D%22none%22%20stroke%3D%22%230a130f%22%20stroke-width%3D%223.9%22%20stroke-linecap%3D%22round%22%2F%3E%3Cpath%20d%3D%22M13.2%2012.6%20Q15.2%2014.6%2017.2%2017.0%22%20fill%3D%22none%22%20stroke%3D%22%23d1e0af%22%20stroke-width%3D%226.2%22%20stroke-linecap%3D%22round%22%2F%3E%3Cpath%20d%3D%22M19.0%2018.8%20Q23.4%2022.6%2027.2%2027.8%22%20fill%3D%22none%22%20stroke%3D%22%23d9d4c2%22%20stroke-width%3D%226.2%22%20stroke-linecap%3D%22round%22%2F%3E%3Cpath%20d%3D%22M8.8%208.4%20Q6.2%205.8%203.4%203.2%22%20fill%3D%22none%22%20stroke%3D%22%23d1e0af%22%20stroke-width%3D%221.8%22%20stroke-linecap%3D%22round%22%2F%3E%3Cpath%20d%3D%22M11.6%207.2%20Q10.6%204.8%209.8%202.4%22%20fill%3D%22none%22%20stroke%3D%22%23d1e0af%22%20stroke-width%3D%221.8%22%20stroke-linecap%3D%22round%22%2F%3E%3Cpath%20d%3D%22M7.4%2011.4%20Q4.9%2010.2%202.5%209.4%22%20fill%3D%22none%22%20stroke%3D%22%23d1e0af%22%20stroke-width%3D%221.8%22%20stroke-linecap%3D%22round%22%2F%3E%3Cpath%20d%3D%22M10.4%209.8%20Q7.6%207.4%204.6%205.2%22%20fill%3D%22none%22%20stroke%3D%22%23d1e0af%22%20stroke-width%3D%221.8%22%20stroke-linecap%3D%22round%22%2F%3E%3C%2Fsvg%3E") 3 3;
  }

  *{margin:0;padding:0;box-sizing:border-box;}
  html{scroll-behavior:smooth;}
  body{
    background:var(--forest-950);
    color:var(--paper);
    font-family:var(--font-body);
    overflow-x:hidden;
    -webkit-font-smoothing:antialiased;
    cursor:var(--cursor-torch), auto;
  }
  a{color:inherit;text-decoration:none;}
  img{max-width:100%;display:block;}
  ul{list-style:none;}
  button{font-family:inherit;background:none;border:none;color:inherit;}

  /* Ueberall dort, wo etwas passiert, geht die Lampe an. Der Block steht bewusst
     NACH den Grundregeln oben – sonst gaebe der spaetere button{cursor:pointer}
     bei gleicher Spezifitaet wieder die Systemhand zurueck. */
  a[href], button, summary, label[for], [role="button"], .spine{
    cursor:var(--cursor-torch-on), pointer;
  }
  /* In Eingabefeldern bleibt der Textbalken – dort will man setzen, nicht leuchten. */
  input, textarea, select{cursor:auto;}
  input[type="submit"], input[type="button"], input[type="checkbox"], input[type="radio"]{
    cursor:var(--cursor-torch-on), pointer;
  }
  [disabled], .is-disabled{cursor:not-allowed;}

  ::selection{background:var(--lime);color:var(--forest-950);}

  :focus-visible{outline:2px solid var(--lime);outline-offset:3px;}

  .wrap{
    max-width:1240px;
    margin:0 auto;
    padding:0 32px;
  }

  .eyebrow{
    font-family:var(--font-mono);
    font-size:12px;
    letter-spacing:.14em;
    text-transform:uppercase;
    color:var(--lime);
    display:flex;
    align-items:center;
    gap:10px;
  }
  .eyebrow::before{
    content:'';
    width:18px;height:1px;
    background:var(--lime);
    display:inline-block;
  }

  /* ---------- reveal ---------- */
  .reveal{
    opacity:0;
    transform:translateY(28px);
    transition:opacity .8s var(--ease), transform .8s var(--ease);
  }
  .reveal.in{opacity:1;transform:translateY(0);}

  /* ================= NAV ================= */
  /* Ueber die ID, NICHT ueber das Element `header`.
     Der Entwurf hatte genau ein <header> auf der Seite; im Theme gibt es sieben.
     `page.php`, `single.php`, `archive.php`, `index.php` und `404.php` setzen
     ihren Titelblock jeweils als <header class="page-header">. Die Elementregel
     machte daraus ein zweites `position:fixed; top:0; left:0` – die Ueberschrift
     klebte oben links im Eck und lag ueber der Kopfleiste, waehrend der Rest der
     Seite ordentlich im Rahmen stand. Genau dieses Bild. */
  #siteHeader{
    position:fixed;
    top:0;left:0;right:0;
    z-index:200;
    padding:22px 0;
    transition:padding .35s var(--ease), background .35s var(--ease), border-color .35s var(--ease);
    border-bottom:1px solid transparent;
  }
  #siteHeader.scrolled{
    padding:12px 0;
    background:rgba(10,19,15,0.82);
    backdrop-filter:blur(14px);
    border-bottom:1px solid var(--line);
  }

  /* ---------- WordPress-Werkzeugleiste ----------
     Angemeldet blendet WordPress oben eine Leiste ein und schiebt dafuer <html>
     um deren Hoehe nach unten. Feststehende Elemente kennen diesen Rand aber
     nicht: die Kopfleiste blieb bei top:0 und verschwand zur Haelfte hinter der
     Leiste. Sie und das Vollbildmenue ruecken deshalb selbst nach.

     Die Hoehe liefert WordPress als eigene Variable mit; die Zahl dahinter ist
     nur der Rueckfall, falls eine aeltere Fassung sie nicht setzt. */
  body.admin-bar #siteHeader,
  body.admin-bar .menu-overlay{ top: var(--wp-admin--admin-bar--height, 32px); }
  body.admin-bar .hero{ min-height: calc(100vh - var(--wp-admin--admin-bar--height, 32px)); }

  @media screen and (max-width:782px){
    /* Schmal steht die Leiste nicht fest, sondern scrollt mit weg. Sobald die
       Seite laeuft (ab 40px, dort greift .scrolled), darf die Kopfleiste also
       wieder ganz nach oben – sonst klaffte dauerhaft eine Luecke. */
    body.admin-bar #siteHeader,
    body.admin-bar .menu-overlay{ top: var(--wp-admin--admin-bar--height, 46px); }
    body.admin-bar #siteHeader.scrolled{ top:0; }
  }
  nav.wrap{
    display:flex;
    align-items:center;
    justify-content:space-between;
  }
  .brand{
    display:flex;align-items:center;gap:14px;
    font-family:var(--font-display);
    font-size:19px;
    font-weight:600;
    letter-spacing:.01em;
  }
  /* Der Textblock neben dem Zeichen: zwei Zeilen, **eine** linke Kante.
     Beide Zeilen sind Bloecke im selben Kasten und beginnen damit zwangslaeufig
     an derselben Kante – der Einzug zum Zeichen haengt an `gap`, an einer Zahl
     also, und nicht an Schriftmetriken.
     Die eigene Zeilenhoehe ist der eigentliche Punkt: Ohne sie erbt der Name
     die Vorgabe „normal", und Fraunces bringt dort reichlich Luft mit – der
     Block fiel dadurch weit auseinander. */
  .brand > span:not(.mark){
    display:block;
    line-height:1.08;
  }
  .brand .mark{
    width:40px;height:40px;
    border-radius:10px;
    background:var(--paper);
    display:grid;place-items:center;
    flex-shrink:0;
    padding:3px;
    box-shadow:0 4px 14px -4px rgba(0,0,0,.4);
  }
  .brand .mark-img{
    width:100%;height:100%;
    object-fit:contain;
    filter:brightness(0) saturate(100%);
    opacity:.88;
  }
  .brand small{
    display:block;
    font-family:var(--font-mono);
    font-weight:400;
    font-size:10px;
    /* Ohne eigene Zeilenhoehe legt die Unterzeile ihre halbe Zeilenschaltung
       oben drauf – genau die Luft, die hier weg soll. Der Abstand steht statt
       dessen als eine einzige, ablesbare Zahl im Rand. */
    line-height:1;
    letter-spacing:.1em;
    color:var(--mist);
    text-transform:uppercase;
    margin-top:2px;
  }

  .nav-right{display:flex;align-items:center;gap:14px;}

  .nav-cta{
    padding:11px 22px;
    background:var(--lime);
    color:var(--forest-950);
    border-radius:100px;
    font-size:14px;
    font-weight:700;
    transition:transform .25s var(--ease), box-shadow .25s var(--ease);
  }
  .nav-cta:hover{transform:translateY(-2px);box-shadow:0 10px 24px -8px rgba(200,241,105,.5);}

  .burger{
    width:48px;height:48px;
    position:relative;
    border-radius:50%;
    border:1px solid var(--line);
    background:rgba(244,241,230,0.04);
    transition:background .3s, border-color .3s, transform .3s var(--ease);
    z-index:400;
  }
  .burger:hover{background:rgba(200,241,105,0.12);border-color:var(--lime);transform:scale(1.06);}
  .burger span{
    position:absolute;left:14px;right:14px;height:2px;background:var(--paper);
    border-radius:2px;
    transition:transform .35s var(--ease), opacity .25s, background .3s;
  }
  .burger span:nth-child(1){top:17px;}
  .burger span:nth-child(2){top:23px;}
  .burger span:nth-child(3){top:29px;}
  .burger.open span:nth-child(1){transform:translateY(6px) rotate(45deg);}
  .burger.open span:nth-child(2){opacity:0;}
  .burger.open span:nth-child(3){transform:translateY(-6px) rotate(-45deg);}

  /* ---------- fullscreen menu overlay ---------- */
  .menu-overlay{
    position:fixed;
    inset:0;
    z-index:300;
    background:
      radial-gradient(ellipse 800px 500px at 85% 0%, rgba(200,241,105,0.08), transparent 60%),
      var(--forest-900);
    clip-path:circle(0% at calc(100% - 66px) 46px);
    transition:clip-path .7s var(--ease);
    overflow:hidden;
    visibility:hidden;
  }
  .menu-overlay.open{
    clip-path:circle(150% at calc(100% - 66px) 46px);
    visibility:visible;
  }
  .menu-inner{
    height:100%;
    display:grid;
    grid-template-columns:1.6fr 1fr;
    gap:60px;
    align-items:center;
    padding-top:80px;
    padding-bottom:120px;
  }
  .menu-main{display:flex;flex-direction:column;}
  .menu-link{
    display:flex;
    align-items:baseline;
    gap:22px;
    padding:8px 0;
    opacity:0;
    transform:translateY(34px);
    transition:opacity .5s var(--ease), transform .5s var(--ease);
  }
  .menu-overlay.open .menu-link{opacity:1;transform:translateY(0);}
  .menu-overlay.open .menu-link:nth-child(1){transition-delay:.10s;}
  .menu-overlay.open .menu-link:nth-child(2){transition-delay:.16s;}
  .menu-overlay.open .menu-link:nth-child(3){transition-delay:.22s;}
  .menu-overlay.open .menu-link:nth-child(4){transition-delay:.28s;}
  .menu-overlay.open .menu-link:nth-child(5){transition-delay:.34s;}
  .menu-overlay.open .menu-link:nth-child(6){transition-delay:.40s;}
  .menu-overlay.open .menu-link:nth-child(7){transition-delay:.46s;}
  .menu-overlay.open .menu-link:nth-child(8){transition-delay:.52s;}
  .menu-num{
    font-family:var(--font-mono);
    font-size:12px;
    color:var(--mist);
    width:26px;
    flex-shrink:0;
    transition:color .3s;
  }
  .menu-word{
    font-family:var(--font-display);
    font-size:clamp(30px, 4.6vw, 58px);
    font-weight:600;
    line-height:1.12;
    color:var(--paper-dim);
    position:relative;
    transition:color .3s var(--ease), transform .3s var(--ease), font-style .3s;
  }
  .menu-link:hover .menu-word, .menu-link:focus-visible .menu-word{
    color:var(--lime);
    font-style:italic;
    transform:translateX(14px);
  }
  .menu-link:hover .menu-num{color:var(--lime);}
  .menu-ext{
    font-family:var(--font-mono);
    font-size:.45em;
    vertical-align:super;
    color:var(--mist);
    font-style:normal;
  }
  .menu-link:hover .menu-ext{color:var(--lime);}

  .menu-side{
    display:flex;
    flex-direction:column;
    gap:26px;
    opacity:0;
    transform:translateY(24px);
    transition:opacity .6s var(--ease) .4s, transform .6s var(--ease) .4s;
  }
  .menu-overlay.open .menu-side{opacity:1;transform:translateY(0);}
  .menu-side-block h5{
    font-family:var(--font-mono);
    font-size:11px;
    letter-spacing:.1em;
    text-transform:uppercase;
    color:var(--lime);
    margin-bottom:8px;
  }
  .menu-side-block p{font-size:14.5px;color:var(--paper-dim);line-height:1.7;}
  .menu-side-block a{transition:color .2s;}
  .menu-side-block a:hover{color:var(--lime);}
  .menu-side-badge{
    font-family:var(--font-mono);
    font-size:11px;
    color:var(--mist);
    letter-spacing:.05em;
    border-top:1px solid var(--line);
    padding-top:18px;
  }
  .menu-rings{
    position:absolute;
    right:-160px;
    bottom:-200px;
    width:640px;height:640px;
    pointer-events:none;
    perspective:900px;
    opacity:0;
    transform:scale(.85);
    transition:opacity .8s var(--ease) .35s, transform .8s var(--ease) .35s;
  }
  .menu-overlay.open .menu-rings{opacity:1;transform:scale(1);}
  .menu-rings svg{
    width:100%;height:100%;
    display:block;
    transition:transform .5s cubic-bezier(.2,.7,.3,1);
    transform-style:preserve-3d;
    animation:rings-rotate 120s linear infinite;
  }
  @keyframes rings-rotate{from{rotate:0deg;}to{rotate:360deg;}}
  .ring{
    fill:none;
    stroke:rgba(200,241,105,0.13);
    stroke-width:1;
    transition:stroke .3s;
  }
  .ring-core{fill:var(--lime);opacity:.5;}
  .ring.pulse{
    animation:ring-pulse 1.4s var(--ease) forwards;
    animation-delay:calc(var(--i) * 55ms);
  }
  .ring.pulse-solo{
    animation:ring-pulse 2s var(--ease) forwards;
  }
  @keyframes ring-pulse{
    0%{stroke:rgba(200,241,105,0.13);stroke-width:1;}
    30%{stroke:rgba(200,241,105,0.75);stroke-width:2.2;}
    100%{stroke:rgba(200,241,105,0.13);stroke-width:1;}
  }
  body.menu-open{overflow:hidden;}

  /* ---------- große Jahresring-Scheibe im Seitenhintergrund ---------- */
  .page-rings{
    position:fixed;
    z-index:0;
    pointer-events:none;
  }
  .page-rings svg{animation:rings-rotate 180s linear infinite;}
  .rings-left svg{animation-duration:220s;animation-direction:reverse;}
  .rings-right{
    right:-260px;
    top:50%;
    width:760px;height:760px;
    margin-top:-380px;
    opacity:.9;
  }
  .ring-wolf{
    position:absolute;
    left:50%;top:50%;
    width:190px;
    transform:translate(-50%, -52%);
    filter:brightness(0) invert(1);
    opacity:0;
    transition:opacity .9s var(--ease);
    pointer-events:none;
  }
  .ring-wolf.wolf-sm{width:150px;}
  .ring-wolf.wolf-menu{width:170px;}
  .rings-left{
    left:-300px;
    bottom:-280px;
    width:620px;height:620px;
    opacity:.7;
  }
  main, footer, .marquee-band{position:relative;z-index:1;}
  .page-rings svg{width:100%;height:100%;display:block;}
  .page-ring{
    fill:none;
    stroke:rgba(200,241,105,0.06);
    stroke-width:1;
  }
  .page-ring.pulse-solo{
    animation:page-ring-pulse 2.4s var(--ease) forwards;
  }
  @keyframes page-ring-pulse{
    0%{stroke:rgba(200,241,105,0.06);stroke-width:1;}
    35%{stroke:rgba(200,241,105,0.42);stroke-width:1.8;}
    100%{stroke:rgba(200,241,105,0.06);stroke-width:1;}
  }
  body.menu-open .page-rings{opacity:0;transition:opacity .4s;}
  @media (max-width:900px){
    .rings-right{right:-420px;opacity:.55;}
    .rings-left{display:none;}
  }

  /* ================= HERO ================= */
  .hero{
    position:relative;
    min-height:100vh;
    display:flex;
    flex-direction:column;
    justify-content:center;
    padding-top:120px;
    overflow:hidden;
  }
  .hero-bg{
    position:absolute;inset:0;
    z-index:0;
    background:
      radial-gradient(ellipse 900px 500px at 80% -10%, rgba(200,241,105,0.12), transparent 60%),
      radial-gradient(ellipse 700px 500px at 10% 10%, rgba(255,138,61,0.08), transparent 60%),
      linear-gradient(180deg, var(--forest-950) 0%, var(--forest-900) 100%);
  }
  .hero-topo{
    position:absolute;
    inset:0;
    z-index:1;
    pointer-events:none;
    overflow:hidden;
  }
  .hero-topo svg{
    width:100%;height:100%;
    display:block;
  }
  .hero-topo path{
    fill:none;
    stroke:rgba(200,241,105,0.10);
    stroke-width:1;
  }
  .hero-topo path.pulse{
    animation:topo-pulse 2.6s var(--ease) forwards;
  }
  @keyframes topo-pulse{
    0%{stroke:rgba(200,241,105,0.10);stroke-width:1;}
    35%{stroke:rgba(200,241,105,0.65);stroke-width:1.8;}
    100%{stroke:rgba(200,241,105,0.10);stroke-width:1;}
  }
  .hero-topo g{transform-origin:center;}
  .topo-a{animation:topo-drift-a 46s ease-in-out infinite alternate;}
  .topo-b{animation:topo-drift-b 58s ease-in-out infinite alternate;}
  .topo-c{animation:topo-drift-c 52s ease-in-out infinite alternate;}
  @keyframes topo-drift-a{from{transform:translate(0,0) rotate(0deg);}to{transform:translate(-28px,16px) rotate(1.2deg);}}
  @keyframes topo-drift-b{from{transform:translate(0,0) rotate(0deg);}to{transform:translate(24px,-14px) rotate(-1.4deg);}}
  @keyframes topo-drift-c{from{transform:translate(0,0) rotate(0deg);}to{transform:translate(-16px,-20px) rotate(0.9deg);}}

  .page-glow{
    position:fixed;
    inset:auto;
    width:560px;height:560px;
    left:0;top:0;
    transform:translate(60vw, 20vh);
    border-radius:50%;
    background:radial-gradient(circle,
      rgba(200,241,105,0.13) 0%,
      rgba(200,241,105,0.04) 38%,
      transparent 68%);
    mix-blend-mode:screen;
    transition:transform .9s cubic-bezier(.2,.7,.3,1), opacity .5s;
    will-change:transform;
    pointer-events:none;
    z-index:2;
    opacity:1;
  }
  body.menu-open .page-glow{opacity:0;}
  @media (hover:none){.page-glow{display:none;}}
  .hero .wrap{position:relative;z-index:2;}

  .hero-headline{
    font-family:var(--font-display);
    font-weight:600;
    font-size:clamp(40px, 6.4vw, 92px);
    line-height:1.02;
    letter-spacing:-.01em;
    max-width:920px;
    margin-top:22px;
  }
  .hero-headline em{
    font-style:italic;
    font-weight:500;
    color:var(--lime);
  }
  .hero-sub{
    margin-top:26px;
    max-width:520px;
    font-size:17px;
    line-height:1.6;
    color:var(--paper-dim);
  }
  .hero-actions{
    margin-top:38px;
    display:flex;
    gap:14px;
    align-items:center;
    flex-wrap:wrap;
  }
  .btn-primary{
    padding:15px 28px;
    background:var(--lime);
    color:var(--forest-950);
    border-radius:100px;
    font-weight:700;
    font-size:14.5px;
    display:inline-flex;
    align-items:center;
    gap:8px;
    transition:transform .3s var(--ease), box-shadow .3s var(--ease);
  }
  .btn-primary:hover{transform:translateY(-3px);box-shadow:0 14px 30px -10px rgba(200,241,105,.45);}
  .btn-ghost{
    padding:15px 26px;
    border:1px solid var(--line);
    border-radius:100px;
    font-weight:600;
    font-size:14.5px;
    transition:border-color .3s, background .3s;
  }
  .btn-ghost:hover{border-color:var(--paper-dim);background:rgba(244,241,230,0.05);}

  .hero-scroll{
    position:absolute;
    bottom:36px;right:32px;
    z-index:2;
    display:flex;
    align-items:center;
    gap:10px;
    font-family:var(--font-mono);
    font-size:11px;
    letter-spacing:.1em;
    text-transform:uppercase;
    color:var(--mist);
  }
  .hero-scroll .dot{
    width:6px;height:6px;border-radius:50%;background:var(--lime);
    animation:pulse 1.8s ease-in-out infinite;
  }
  @keyframes pulse{0%,100%{opacity:.3;transform:scale(.8);}50%{opacity:1;transform:scale(1.2);}}

  /* ================= MARQUEE ================= */
  .marquee-band{
    border-top:1px solid var(--line);
    border-bottom:1px solid var(--line);
    background:var(--forest-900);
    padding:18px 0;
    overflow:hidden;
    position:relative;
    z-index:3;
  }
  /* Das Band besteht aus zwei gleichen Haelften; die Bewegung um -50 % setzt die
     zweite genau dort ab, wo die erste stand – daher der nahtlose Lauf.
     Der Abstand zwischen den Haelften darf deshalb **nicht** als `gap` am Band
     stehen: Er zaehlt zur Gesamtbreite, gehoert aber keiner Haelfte, und -50 %
     landete um seine halbe Breite daneben. Bei jedem Durchlauf sprang das Band
     um 26px. Der Abstand sitzt jetzt als Innenrand in den Haelften selbst und
     wandert damit korrekt mit. */
  .marquee-track{
    display:flex;
    width:max-content;
    animation:scroll-left 28s linear infinite;
  }
  .marquee-half{
    display:flex;
    align-items:center;
    gap:52px;
    padding-right:52px;
  }
  @keyframes scroll-left{from{transform:translateX(0);}to{transform:translateX(-50%);}}
  .marquee-track span{
    font-family:var(--font-mono);
    font-size:13px;
    letter-spacing:.1em;
    color:var(--mist);
    text-transform:uppercase;
    white-space:nowrap;
    /* Das gap haelt die Raute (::after) auf Abstand zum eigenen Wort. */
    display:flex;align-items:center;gap:52px;
  }
  .marquee-track span::after{content:'◆';color:var(--amber);font-size:9px;}

  /* ================= SECTION shared ================= */
  section{padding:120px 0;position:relative;}
  .section-head{
    display:flex;
    justify-content:space-between;
    align-items:flex-end;
    gap:40px;
    margin-bottom:64px;
    flex-wrap:wrap;
  }
  .section-title{
    font-family:var(--font-display);
    font-size:clamp(30px,3.6vw,48px);
    font-weight:600;
    line-height:1.1;
    max-width:600px;
    margin-top:14px;
  }
  .section-note{
    max-width:340px;
    font-size:14.5px;
    color:var(--mist);
    line-height:1.6;
  }

  /* ================= PILLARS ================= */
  .pillars{
    display:grid;
    grid-template-columns:repeat(3,1fr);
    gap:1px;
    background:var(--line);
    border:1px solid var(--line);
    border-radius:20px;
    overflow:hidden;
  }
  .pillar{
    background:var(--forest-950);
    padding:40px 34px;
    transition:background .35s var(--ease);
  }
  .pillar:hover{background:var(--forest-900);}
  .pillar .num{
    font-family:var(--font-mono);
    font-size:12px;
    color:var(--lime);
    margin-bottom:26px;
    display:block;
  }
  .pillar h3{
    font-family:var(--font-display);
    font-size:23px;
    font-weight:600;
    margin-bottom:12px;
  }
  .pillar p{
    font-size:14.5px;
    color:var(--paper-dim);
    line-height:1.65;
  }

  /* ================= PORTFOLIO SHELF ================= */
  .shelf{
    display:flex;
    gap:14px;
    height:460px;
    align-items:stretch;
  }
  .spine{
    position:relative;
    flex:0 0 100px;
    border-radius:16px;
    cursor:var(--cursor-torch-on), pointer;
    overflow:hidden;
    transition:flex-basis .55s var(--ease), background .55s var(--ease), padding .55s var(--ease);
    background:var(--forest-800);
    border:1px solid var(--line);
    display:flex;
    flex-direction:column;
    justify-content:space-between;
    padding:26px 18px;
  }
  .shelf:hover .spine{flex-basis:90px;}
  /* Aufgeklappt zieht der Rand auf 26px nach – dieselbe Kante, an der auch der
     Text der aufgeklappten Karte beginnt. Die Nummer steht damit exakt ueber
     der Kennzeichnung statt 8px daneben. Zusammengeklappt bleiben es 18px,
     sonst wird die schmale Spalte zu eng. */
  .spine:hover, .spine.active{
    flex-basis:340px !important;
    background:var(--forest-700);
    padding-left:26px;
    padding-right:26px;
  }
  .spine .spine-index{
    font-family:var(--font-mono);
    font-size:11px;
    color:var(--lime);
  }
  .spine .spine-title{
    font-family:var(--font-display);
    font-size:19px;
    font-weight:600;
    writing-mode:vertical-rl;
    transform:rotate(180deg);
    white-space:nowrap;
    transition:opacity .3s;
  }
  .spine.active .spine-title, .spine:hover .spine-title{opacity:0;position:absolute;pointer-events:none;}
  /* Die aufgeklappte Karte liegt als eigene Ebene ueber der Spalte (`inset:0`)
     und weiss deshalb nichts von der Nummer darunter. Bei 30px Rand landete die
     Kennzeichnung genau auf der „03" – beide standen uebereinander. Der obere
     Rand haelt jetzt Platz fuer die Nummer frei: 26px Rand + rund 16px Zeile,
     dazu Luft. */
  .spine-expand{
    position:absolute;inset:0;
    padding:52px 26px 30px;
    opacity:0;
    transform:translateY(10px);
    transition:opacity .35s var(--ease) .1s, transform .35s var(--ease) .1s;
    display:flex;
    flex-direction:column;
  }
  .spine.active .spine-expand, .spine:hover .spine-expand{opacity:1;transform:translateY(0);}
  .spine-expand .tag{
    font-family:var(--font-mono);
    font-size:10.5px;
    color:var(--lime);
    text-transform:uppercase;
    letter-spacing:.08em;
    margin-bottom:14px;
  }
  .spine-expand h4{
    font-family:var(--font-display);
    font-size:25px;
    font-weight:600;
    margin-bottom:12px;
  }
  .spine-expand p{
    font-size:14px;
    color:var(--paper-dim);
    line-height:1.6;
    flex:1;
  }
  .spine-expand .go{
    margin-top:16px;
    font-family:var(--font-mono);
    font-size:12px;
    letter-spacing:.05em;
    color:var(--paper);
    display:inline-flex;
    align-items:center;
    gap:8px;
    padding-bottom:2px;
    border-bottom:1px solid var(--paper);
    width:fit-content;
    transition:gap .25s, color .25s, border-color .25s;
  }
  .spine-expand .go:hover{gap:12px;color:var(--lime);border-color:var(--lime);}

  /* ================= VALUES ================= */
  .values{
    display:grid;
    grid-template-columns:1fr 1fr;
    gap:64px;
    align-items:start;
  }
  .value-list{display:flex;flex-direction:column;gap:0;}
  .value-item{
    padding:30px 0;
    border-top:1px solid var(--line);
    display:grid;
    grid-template-columns:56px 1fr;
    gap:22px;
  }
  .value-item:last-child{border-bottom:1px solid var(--line);}
  .value-icon{
    width:52px;height:52px;
    border-radius:14px;
    background:var(--forest-800);
    display:grid;place-items:center;
    font-size:20px;
  }
  .value-item h4{
    font-family:var(--font-display);
    font-size:19px;
    font-weight:600;
    margin-bottom:8px;
  }
  .value-item p{
    font-size:14.5px;
    color:var(--mist);
    line-height:1.65;
  }

  .facts-card{
    background:var(--forest-900);
    border:1px solid var(--line);
    border-radius:22px;
    padding:40px;
    position:sticky;
    top:120px;
  }
  .facts-card .fc-label{
    font-family:var(--font-mono);
    font-size:11px;
    color:var(--lime);
    text-transform:uppercase;
    letter-spacing:.1em;
    margin-bottom:26px;
  }
  .fact-row{
    display:flex;justify-content:space-between;
    padding:16px 0;
    border-top:1px solid var(--line);
    font-size:14px;
  }
  .fact-row:first-of-type{border-top:none;}
  .fact-row span:first-child{color:var(--mist);}
  .fact-row span:last-child{font-family:var(--font-mono);text-align:right;}

  /* ================= TESTIMONIALS ================= */
  .testi-outer{overflow:hidden;position:relative;}
  .testi-outer::before, .testi-outer::after{
    content:'';position:absolute;top:0;bottom:0;width:120px;z-index:2;
    pointer-events:none;
  }
  .testi-outer::before{left:0;background:linear-gradient(90deg, var(--forest-950), transparent);}
  .testi-outer::after{right:0;background:linear-gradient(270deg, var(--forest-950), transparent);}
  /* Die Laufschrift ist ein echter Scroll-Container statt einer CSS-Animation:
     nur so laesst sich per Wisch/Drag selbst nach links und rechts blaettern.
     Den Dauerlauf uebernimmt main.js, es scrollt den Container Bild fuer Bild
     weiter und haelt an, sobald jemand selbst anfasst. */
  .testi-scroller{
    overflow-x:auto;
    overflow-y:hidden;
    scrollbar-width:none;              /* Firefox */
    -ms-overflow-style:none;           /* alte Edge */
    -webkit-overflow-scrolling:touch;  /* Schwung auf iOS */
    overscroll-behavior-x:contain;     /* kein Zurueckwischen der Seite */
    cursor:grab;
  }
  .testi-scroller::-webkit-scrollbar{display:none;}
  /* Beim Ziehen mit der Maus darf nicht nebenbei Text markiert werden. */
  .testi-scroller.dragging{cursor:grabbing;user-select:none;}
  .testi-scroller:focus-visible{outline:2px solid var(--lime);outline-offset:4px;}
  .testi-track{
    display:flex;
    gap:20px;
    width:max-content;
  }
  /* ---------- Blaetterknoepfe als kleine Jahresring-Scheiben ----------
     Die Ringe sind absichtlich krumm (siehe Kommentar im Markup), der Pfeil ist
     ein einzelner, leicht schiefer Strich. Beide Knoepfe zeigen dieselben Ringe,
     stehen aber unterschiedlich gedreht – so wirken sie wie zwei Scheiben vom
     selben Stamm und nicht wie ein gespiegeltes Icon-Paar. */
  .testi-nav{
    position:absolute;
    top:50%;
    z-index:3;
    width:52px;height:52px;
    display:grid;place-items:center;
    padding:0;
    border-radius:50%;
    color:var(--mist);
    background:rgba(10,19,15,0.55);
    -webkit-backdrop-filter:blur(3px);
    backdrop-filter:blur(3px);
    transform:translateY(-50%);
    transition:color .35s var(--ease), background .35s var(--ease), transform .35s var(--ease);
  }
  .testi-prev{left:12px;}
  .testi-next{right:12px;}
  .testi-nav svg{width:44px;height:44px;display:block;overflow:visible;}
  .testi-nav .nav-rings{
    /* Drehpunkt in Nutzereinheiten des viewBox – die Mitte der Scheibe. Ueber
       transform-box:center liefe es bei manchen Browsern in die Ecke. */
    transform-box:view-box;
    transform-origin:22px 22px;
    transition:rotate 1.2s var(--ease);
  }
  .testi-prev .nav-rings{rotate:-14deg;}
  .testi-next .nav-rings{rotate:106deg;}
  .nav-ring{fill:none;stroke:currentColor;stroke-width:1;}
  .nav-ring-1{opacity:.30;}
  .nav-ring-2{opacity:.20;}
  .nav-ring-3{opacity:.14;}
  .nav-arrow{
    fill:none;
    stroke:currentColor;
    stroke-width:1.7;
    stroke-linecap:round;
    stroke-linejoin:round;
  }
  .testi-nav:hover, .testi-nav:focus-visible{
    color:var(--lime);
    background:rgba(10,19,15,0.82);
    transform:translateY(-50%) scale(1.07);
  }
  /* Beim Anfassen dreht sich die Scheibe ein Stueck weiter – wie ein Stamm,
     den man kurz andreht. Jeder Knopf in seine eigene Richtung. */
  .testi-prev:hover .nav-rings, .testi-prev:focus-visible .nav-rings{rotate:-46deg;}
  .testi-next:hover .nav-rings, .testi-next:focus-visible .nav-rings{rotate:142deg;}
  .testi-nav:active{transform:translateY(-50%) scale(.96);}
  .testi-nav:hover .nav-ring-1, .testi-nav:focus-visible .nav-ring-1{opacity:.65;}
  .testi-nav:hover .nav-ring-2, .testi-nav:focus-visible .nav-ring-2{opacity:.45;}
  .testi-nav:hover .nav-ring-3, .testi-nav:focus-visible .nav-ring-3{opacity:.3;}

  .testi-card{
    width:340px;
    background:var(--forest-900);
    border:1px solid var(--line);
    border-radius:18px;
    padding:30px;
    flex-shrink:0;
  }
  .stars{color:var(--amber);font-size:13px;letter-spacing:2px;margin-bottom:16px;}
  .testi-card p{font-size:14.5px;line-height:1.65;color:var(--paper-dim);min-height:96px;}
  .testi-foot{
    margin-top:20px;
    padding-top:16px;
    border-top:1px solid var(--line);
    display:flex;
    justify-content:space-between;
    font-family:var(--font-mono);
    font-size:11.5px;
    color:var(--mist);
  }

  /* ================= CTA BAND ================= */
  .cta-band{
    background:linear-gradient(120deg, var(--lime) 0%, #e7f4ab 100%);
    color:var(--forest-950);
    border-radius:28px;
    padding:70px 60px;
    display:flex;
    justify-content:space-between;
    align-items:center;
    gap:40px;
    flex-wrap:wrap;
  }
  .cta-band h2{
    font-family:var(--font-display);
    font-size:clamp(28px,3.4vw,42px);
    font-weight:600;
    max-width:520px;
    line-height:1.1;
  }
  .cta-band .btn-primary{background:var(--forest-950);color:var(--paper);}
  .cta-band .btn-primary:hover{box-shadow:0 14px 30px -10px rgba(10,19,15,.4);}

  /* ================= FOOTER ================= */
  footer{border-top:1px solid var(--line);padding:80px 0 30px;}
  .foot-top{
    display:grid;
    grid-template-columns:1.4fr 1fr 1fr 1fr;
    gap:40px;
    padding-bottom:60px;
  }
  .foot-brand p{color:var(--mist);font-size:14px;line-height:1.6;margin-top:16px;max-width:280px;}
  .foot-col h5{
    font-family:var(--font-mono);
    font-size:11px;
    text-transform:uppercase;
    letter-spacing:.1em;
    color:var(--mist);
    margin-bottom:18px;
  }
  .foot-col a{
    display:block;
    font-size:14px;
    color:var(--paper-dim);
    padding:6px 0;
    transition:color .2s;
    width:fit-content;
  }
  .foot-col a:hover{color:var(--lime);}
  .foot-bottom{
    border-top:1px solid var(--line);
    padding-top:26px;
    display:flex;
    justify-content:space-between;
    flex-wrap:wrap;
    gap:14px;
    font-size:12.5px;
    color:var(--mist);
  }

  /* ================= RESPONSIVE ================= */
  @media (max-width:900px){
    .nav-cta{display:none;}
    .menu-inner{grid-template-columns:1fr;gap:34px;align-content:start;padding-top:110px;overflow-y:auto;}
    .menu-side{padding-bottom:100px;}
    .pillars{grid-template-columns:1fr;}
    .values{grid-template-columns:1fr;}
    .facts-card{position:static;}
    .foot-top{grid-template-columns:1fr 1fr;}
    .shelf{height:auto;flex-direction:column;}
    .spine{flex-basis:auto !important;height:76px;flex-direction:row;align-items:center;}
    .spine .spine-title{writing-mode:horizontal-tb;transform:none;}
    /* Am Telefon liegt die Spalte quer, die Nummer steht deshalb mittig links.
       Aufgeklappt saesse sie damit mitten im Text – sie wandert nach oben, wo
       auch am Rechner ihr Platz freigehalten wird. */
    .spine.active{height:280px;align-items:flex-start;}
    .spine.active .spine-title{display:none;}
    .cta-band{padding:44px 28px;}
  }
  @media (max-width:560px){
    .wrap{padding:0 20px;}
    section{padding:80px 0;}
    .testi-card{width:270px;}
    /* Auf dem schmalen Schirm verdeckten die 120px breiten Verlaeufe die halbe
       Karte – hier reicht ein Hauch, damit der Rand weich bleibt. */
    .testi-outer::before, .testi-outer::after{width:40px;}
    .testi-nav{width:44px;height:44px;}
    .testi-nav svg{width:38px;height:38px;}
    .testi-prev{left:4px;}
    .testi-next{right:4px;}
  }

  @media (prefers-reduced-motion: reduce){
    *{animation-duration:0.01ms !important; animation-iteration-count:1 !important; transition-duration:0.01ms !important;}
  }

/* =========================================================================
 * Robustheit gegen Elementors globale Kit-Styles (nachträglich angehängt).
 *
 * Elementor lädt seitenweit CSS, das ELEMENT-Farben auf h1–h6 und a setzt.
 * Der Designentwurf oben verlässt sich bei einigen Überschriften auf Vererbung
 * von body; dadurch überschrieb Elementor sie (Headline dunkelblau). Hier wird
 * exakt dieselbe Palette explizit und mit Klassen-Spezifität erneut gesetzt –
 * die Optik bleibt identisch, gewinnt aber gegen Elementors Element-Regeln.
 * Betrifft nur die handgebauten Bereiche (Kopf, Menü, Startseite via body.home,
 * Footer); Elementor-Seiteninhalte bleiben unberührt.
 * ====================================================================== */
/* Seitenhintergrund: nirgends weiß. Gilt für ALLE Seiten, nicht nur die
   Startseite. Farbe identisch mit body{background:var(--forest-950)} ganz oben,
   hier aber unüberschreibbar – eine fremde body{...}-Regel, die nach main.css
   geladen wird, gewinnt sonst über gleiche Spezifität + Ladereihenfolge.
   Die Container, die Elementor-Seiteninhalte umschließen, gleich mit. */
html,
body { background-color: var(--forest-950) !important; }

/* Hier stand eine Ausnahme fuer ArtSense (template-kunst.php), solange diese
   Seite einen weissen Grund hatte. Sie steht jetzt auf dem Hausgrund wie jede
   andere Seite – die Regel darueber gilt damit wieder ohne Ausnahme. */

/* Die Container darueber NICHT einfaerben, sondern durchsichtig schalten.
   Weiss kann so trotzdem nirgends entstehen – darunter liegt der dunkle Body.
   Der Unterschied ist wichtig: mit eigener Deckfarbe verdeckte <main> die
   Jahresring-Scheiben, die als position:fixed mit z-index:0 HINTER dem Inhalt
   liegen. Samt Wolf. Durchsichtig gestellt scheinen sie wieder durch. */
#page,
#content,
main,
.site,
.site-content,
.elementor,
.elementor-section,
.elementor-container,
.e-con,
.e-con-inner { background-color: transparent !important; }

/* Ausnahmen: Flächen, die im Entwurf bewusst hell bzw. farbig sind. */
.brand .mark { background: var(--paper) !important; }
.cta-band { background: linear-gradient(120deg, var(--lime) 0%, #e7f4ab 100%) !important; }

/* Elementors Kit faerbt JEDEN <button>:
   .elementor-kit-38 button{background-color:#FFFFFF;color:#1A6C7A;
                            border:2px solid #1A6C7A}
   Das ist spezifischer (0,1,1) als das button{} und das .burger{} des Entwurfs
   und macht aus dem Burger einen weissen Kreis mit tuerkisem Rand. Betroffen
   sind der Burger im Header und der Absenden-Knopf der Suche. Beide werden hier
   ueber die ID bzw. eine hoehere Spezifitaet zurueckgeholt – ohne !important. */
#siteHeader .burger,
#burger {
  background: rgba(244, 241, 230, 0.04);
  border: 1px solid var(--line);
  border-radius: 50%;
  color: var(--paper);
}

#siteHeader .burger:hover,
#burger:hover,
#burger:focus {
  background: rgba(200, 241, 105, 0.12);
  border-color: var(--lime);
}

#burger span { background: var(--paper); }

/* Der Burger wurde vom geoeffneten Menue verdeckt – deshalb kein X und kein
   Zuklicken, nur ESC.
   Ursache ist eine Stapelkontext-Falle: <header> ist position:fixed mit
   z-index:200 und oeffnet damit einen eigenen Stapelkontext. Das z-index:400
   des Burgers zaehlt nur INNERHALB dieses Kontexts – nach aussen bleibt der
   ganze Header bei 200 und liegt unter dem Overlay (z-index:300).
   Das .burger.open-X wurde also die ganze Zeit korrekt animiert, nur unsichtbar.
   Der Header muss daher selbst ueber das Overlay – dauerhaft, nicht nur bei
   body.menu-open: beim Schliessen zieht sich der Clip-Kreis 0,7s lang genau auf
   den Burger zusammen, der Knopf waere sonst waehrend der Animation wieder weg. */
#siteHeader { z-index: 400; }

/* Taschenlampe: soll ueberall leuchten, auch ueber dem offenen Vollbildmenue.
   Zwei Dinge standen dem im Weg:
   1. body.menu-open .page-glow{opacity:0} weiter oben blendete sie beim Oeffnen
      bewusst aus – hier zurueckgedreht (gleiche Spezifitaet, spaetere Regel).
   2. Mit z-index:2 lag sie ohnehin unter dem Overlay (300) und dem Header (400).
      Solange das Menue offen ist, geht sie deshalb auf 500.
   Das Overlay clippt sie nicht mit: .page-glow haengt direkt am <body>, nicht im
   Overlay, und dessen clip-path wirkt nur auf eigene Nachfahren.
   pointer-events:none bleibt – der Fleck faengt keine Klicks ab. */
body.menu-open .page-glow {
  opacity: 1;
  z-index: 500;
}

/* Jahresring-Scheiben der Seite auf die Optik der Menue-Scheibe bringen.
   Alle drei SVGs haben dieselbe viewBox (0 0 800 800); wie gross die einzelnen
   Ringe erscheinen, haengt also allein an der Kastengroesse:
     Menue          640px -> Massstab 0.80   <- Vorbild
     rings-right    760px -> Massstab 0.95   (20% groeber, weiter auseinander)
     rings-left     620px -> Massstab 0.775
   Beide Seiten-Scheiben daher auf 640px. margin-top von rings-right muss die
   halbe Hoehe bleiben, sonst rutscht die Scheibe aus der vertikalen Mitte.
   Dazu die Strichfarbe: die Seiten-Ringe standen auf 0.06 Alpha, die Menue-Ringe
   auf 0.13 – halb so sichtbar, entsprechend schwer war der Wolf zu finden. */
.rings-right {
  width: 640px;
  height: 640px;
  margin-top: -320px;
}

/* Die linke Scheibe stand auf left:-300px / bottom:-280px. Bei 640px Groesse
   ragte damit fast alles aus dem Fenster – sichtbar blieb ein Bogen in der
   Ecke, und ihr Mittelpunkt (dort sitzt der Wolf) lag praktisch auf der Kante.
   Weiter hereingeholt: bei -160px liegt der Mittelpunkt bei 160px/160px, die
   Scheibe zeigt drei Viertel ihrer Flaeche und der Wolf ist erreichbar.
   Deckkraft auf den Wert der rechten Scheibe, damit beide gleich stark wirken. */
.rings-left {
  width: 640px;
  height: 640px;
  left: -160px;
  bottom: -160px;
  opacity: .9;
}

.page-ring { stroke: rgba(200, 241, 105, 0.13); }

/* Damit die Scheiben auch im Hero durchscheinen: .hero-bg besteht aus drei
   Lagen, zwei durchsichtigen Farbschleiern und einem DECKENDEN Verlauf
   950 -> 900 ganz unten. Der deckende Teil faellt weg, die beiden Schleier
   bleiben. Den Grundton liefert dann der Body – derselbe Wert (--forest-950),
   der Hero verliert also nur den leichten Verlauf nach unten, nicht die Farbe. */
.hero-bg {
  background:
    radial-gradient(ellipse 900px 500px at 80% -10%, rgba(200, 241, 105, 0.12), transparent 60%),
    radial-gradient(ellipse 700px 500px at 10% 10%, rgba(255, 138, 61, 0.08), transparent 60%);
}

/* Die Hoehenlinien im Hero raus – das sind die weit auseinander liegenden
   Kurven (drei Gruppen topo-a/-b/-c). Uebrig bleiben genau die drei
   Jahresring-Scheiben: die beiden der Seite und die im Menue.
   Bewusst display:none statt Loeschen im Markup – der Entwurf bleibt
   unangetastet, ein Entfernen dieser Regel holt die Linien zurueck. */
.hero-topo { display: none; }

/* Aufleuchtende Ringe: einzelne Ringe leuchten in unregelmaessigen Abstaenden
   gruen auf. Der Mechanismus steckte schon im Entwurf (autoPulse in main.js
   waehlt zufaellig einen Ring und haengt .pulse-solo an), war auf der Seite
   aber kaum zu sehen:
     Menue-Ringe  0.13 -> 0.75 Alpha, Strich 2.2   <- kraeftig
     Seiten-Ringe 0.06 -> 0.42 Alpha, Strich 1.8   <- halb so stark
   Dazu kam ein Fehler durch meine Aenderung am Grundton: die Kurve startete
   und endete bei 0.06, der Grundton steht inzwischen auf 0.13. Jeder Puls
   begann also mit einem Abdunkeln.
   Beides hier auf die Menue-Werte gezogen. Ein spaeter deklariertes @keyframes
   gleichen Namens ersetzt das frueheere vollstaendig. */
/* =========================================================================
 * Unterseiten (page.php, single.php, archive.php)
 *
 * Fuer diese Seiten gab es bisher KEINE einzige Regel – der Entwurf deckte nur
 * Startseite, Kopf, Menue und Fuss ab. Die Folgen auf /datenschutz/:
 *   - kein Abstand nach oben, der Text begann unter der festen Kopfleiste
 *   - keine Breitenbegrenzung, die Zeilen liefen ueber die ganze Fensterbreite
 *   - ul{list-style:none} aus dem Grundgeruest -> Aufzaehlungen ohne Punkte
 *   - a{color:inherit;text-decoration:none} -> Verweise sahen aus wie Fliesstext
 * Alles ueber .site-main adressiert (0,2,1), damit Elementors Kit-Regeln fuer
 * a und h1-h6 nicht dazwischenfunken.
 * ====================================================================== */
/* Nur fuer Seiten OHNE eigenen Kopfabstand.
   Zwei Vorlagen halten den Platz fuer die feste Kopfleiste selbst frei:
     page-support.php   -> <main class="site-main support-page">, 168px in support.css
     template-kunst.php -> <main class="site-main art">,          180px an .art-hero
   Ohne diesen Ausschluss addiert sich beides. Auf /support/ ergab das rund
   300px Leere unter der Kopfleiste – und weil der Lichtschein dort erst mit
   .support-steps beginnt, sah das obere Stueck wie ein schwarzer Balken aus,
   mit sichtbarer Kante zum helleren Bereich darunter. */
.site-main:not(.support-page):not(.art):not(.site-main--full) {
  padding-top: 132px;
  padding-bottom: 110px;
}

/* Baukasten-Seiten bringen ihre eigenen Abstaende mit und sollen die volle
   Breite behalten – die Kopfleiste ueberdecken duerfen sie trotzdem nicht. */
.site-main--full {
  padding-top: 84px;
  padding-bottom: 0;
}

.site-main .page-header { margin-bottom: 36px; }

.site-main .page-title {
  font-family: var(--font-display);
  font-size: clamp(30px, 3.6vw, 48px);
  font-weight: 600;
  line-height: 1.1;
  color: var(--paper);
}

.site-main .entry-content {
  max-width: 760px; /* rund 80 Zeichen – darueber wird Fliesstext muehsam */
  color: var(--paper-dim);
  font-size: 16px;
  line-height: 1.75;
}

.site-main .entry-content > * + * { margin-top: 1.1em; }

.site-main .entry-content h2,
.site-main .entry-content h3,
.site-main .entry-content h4 {
  font-family: var(--font-display);
  color: var(--paper);
  line-height: 1.25;
  margin-top: 2em;
}

.site-main .entry-content h2 { font-size: 26px; }
.site-main .entry-content h3 { font-size: 21px; }
.site-main .entry-content h4 { font-size: 18px; }

.site-main .entry-content ul,
.site-main .entry-content ol {
  padding-left: 1.3em;
  margin-top: 1em;
}

.site-main .entry-content ul { list-style: disc; }
.site-main .entry-content ol { list-style: decimal; }
.site-main .entry-content li { margin-top: .45em; }
.site-main .entry-content li::marker { color: var(--lime); }

/* Verweise im Fliesstext stehen in Textfarbe und sind unterstrichen – das Lime
   ist der Lohn fuers Hinzeigen, nicht der Grundzustand. Vorher war es umgekehrt:
   jeder Verweis leuchtete, und in langen Texten wie der Datenschutzerklaerung
   flimmerte dadurch die halbe Seite. */
.site-main .entry-content a {
  color: var(--paper);
  text-decoration: underline;
  text-decoration-color: rgba(244,241,230,0.4);
  text-underline-offset: 3px;
  transition: color .2s, text-decoration-color .2s;
}

.site-main .entry-content a:hover,
.site-main .entry-content a:focus-visible {
  color: var(--lime);
  text-decoration-color: var(--lime);
}

/* Sprungziele der Inhaltsuebersicht duerfen nicht unter der festen Kopfleiste
   landen – die ist je nach Scrollstand 58 bis 78 Pixel hoch. */
.site-main .entry-content [id] { scroll-margin-top: 110px; }

/* Alttexte aus der hellen Fassung tragen vereinzelt Inline-Stile mit sich, etwa
   style="background-color:#ffffff" am Verweis zur EU-Streitschlichtung. Auf
   weissem Grund fiel das nie auf, auf dunklem wird daraus ein weisser Kasten
   mitten im Satz. Inline-Stile schlagen jede normale Regel, deshalb hier
   !important – die einzige Stelle, an der das gegen fremdes Markup noetig ist.
   Der bekannte Fall ist im Seiteninhalt bereinigt; das hier faengt die ab, die
   noch irgendwo schlummern. */
.site-main .entry-content a,
.site-main .entry-content span,
.site-main .entry-content p { background-color: transparent !important; }
.site-main .entry-content strong { color: var(--paper); }

@media (max-width: 560px) {
  .site-main:not(.support-page):not(.art):not(.site-main--full) {
    padding-top: 120px;
    padding-bottom: 80px;
  }
}

/* Menue am Telefon: der erste Punkt klebte am oberen Rand, unter dem Logo.
   Ursache ist ein Shorthand, der mehr zurueckstellt als beabsichtigt:
     .menu-inner{padding-top:110px}   (max-width:900px, Zeile ~866)
     .wrap{padding:0 20px}            (max-width:560px, Zeile ~883)
   Das Element traegt beide Klassen (<div class="menu-inner wrap">). Die
   Kurzschreibweise padding:0 20px setzt auch padding-top und -bottom – auf 0.
   Beide Selektoren haben dieselbe Spezifitaet (0,1,0), die spaetere Regel
   gewinnt, und unter 560px stand das Menue damit ohne jeden Abstand oben an.
   Hier ueber .menu-overlay .menu-inner (0,2,0) gesetzt: schlaegt .wrap
   unabhaengig von der Reihenfolge. Links und rechts bleiben die 20px aus .wrap,
   es werden bewusst nur die senkrechten Werte gesetzt.
   132px statt 110px, weil die Kopfleiste am Telefon rund 84px hoch ist
   (22px Polster + 40px Zeichen + 22px) und darunter noch Luft stehen soll. */
@media (max-width: 900px) {
  .menu-overlay .menu-inner {
    padding-top: 132px;
    padding-bottom: 120px;
  }
}

/* Kurz aufglimmen, dann wieder aus. 1,4s – muss zu GLIMMER_MS in main.js passen.
   Die Spitze liegt frueh (25%), danach klingt es langsamer ab: das liest sich
   wie ein Aufleuchten und nicht wie ein gleichmaessiges Pulsieren. */
.page-ring.pulse-solo { animation: page-ring-pulse 1.4s var(--ease) forwards; }

@keyframes page-ring-pulse {
  0%   { stroke: rgba(200, 241, 105, 0.13); stroke-width: 1; }
  25%  { stroke: rgba(200, 241, 105, 0.85); stroke-width: 2.2; }
  100% { stroke: rgba(200, 241, 105, 0.13); stroke-width: 1; }
}

/* Ausnahme von der Sammelregel weiter oben, die bei „Bewegung reduzieren" JEDE
   Animation auf 0,01ms kuerzt – daher kam der statische Eindruck.
   Diese eine Animation bewegt nichts: kein Verschieben, kein Drehen, kein
   Skalieren, nur Helligkeit und Strichstaerke. Ein Ueberblenden ist auch bei
   reduzierter Bewegung unkritisch, deshalb darf es hier weiterlaufen.
   !important ist noetig, weil die Sammelregel selbst !important benutzt;
   die hoehere Spezifitaet (0,2,0 gegen 0,0,0) entscheidet. */
@media (prefers-reduced-motion: reduce) {
  .page-ring.pulse-solo {
    animation-duration: 1.4s !important;
    animation-iteration-count: 1 !important;
  }
}

/* Wolf in derselben Groesse wie im Menue (170px auf 640px Scheibe). */
.ring-wolf,
.ring-wolf.wolf-sm { width: 170px; }

body button.btn-primary,
body button.btn-primary:hover,
body button.btn-primary:focus {
  background: var(--lime);
  color: var(--forest-950);
  border: none;
}

#siteHeader .brand, #siteHeader .brand * { color: var(--paper); }
#siteHeader .brand small { color: var(--mist); }
#siteHeader .nav-cta { color: var(--forest-950); }

#menuOverlay .menu-link { color: var(--paper-dim); }
#menuOverlay .menu-link:hover .menu-word,
#menuOverlay .menu-link:focus-visible .menu-word { color: var(--lime); }
#menuOverlay .menu-word { color: var(--paper-dim); }
#menuOverlay .menu-num { color: var(--mist); }
#menuOverlay .menu-side-block h5 { color: var(--lime); }
#menuOverlay .menu-side-block p,
#menuOverlay .menu-side-block a { color: var(--paper-dim); }

body.home main h1, body.home main h2, body.home main h3,
body.home main h4, body.home main h5, body.home main h6 { color: var(--paper); }
body.home .hero-headline { color: var(--paper); }
body.home .hero-headline em { color: var(--lime); }
body.home .section-title { color: var(--paper); }
body.home .pillar h3,
body.home .spine-title,
body.home .spine-expand h4,
body.home .value-item h4 { color: var(--paper); }
body.home .eyebrow,
body.home .fc-label,
body.home .pillar .num,
body.home .spine-index,
body.home .spine-expand .tag { color: var(--lime); }
body.home .hero-sub,
body.home .pillar p,
body.home .spine-expand p,
body.home .testi-card p { color: var(--paper-dim); }
body.home .section-note,
body.home .value-item p { color: var(--mist); }
body.home .stars { color: var(--amber); }
body.home a.btn-primary { color: var(--forest-950); }
body.home a.btn-ghost { color: var(--paper); }
body.home .cta-band h2 { color: var(--forest-950); }
body.home .cta-band .btn-primary { color: var(--paper); }

#kontakt .foot-col h5 { color: var(--mist); }
#kontakt .foot-col a { color: var(--paper-dim); }
#kontakt .foot-col a:hover { color: var(--lime); }
#kontakt .foot-brand p { color: var(--mist); }

/* =========================================================================
 * ArtSense (template-kunst.php, Body-Klasse `bfv-light`)
 *
 * ACHTUNG BEIM LESEN: Die Klasse heisst `bfv-light`, die Seite ist aber nicht
 * mehr hell. Sie hatte einen weissen Grund, weil hier die Bilder der Inhalt
 * sind und der dunkle Hausgrund sich ueber ihre Farbigkeit legt. Auf Wunsch
 * steht sie inzwischen wieder auf dem Hausgrund – eigenstaendig bleibt an ihr
 * die Formensprache (`.art-*`), nicht mehr die Farbe. Der Name ist damit
 * historisch; umbenannt wurde er nicht, weil er in rund fuenfzig Regeln und im
 * Template steckt.
 *
 * Gedreht wird die Seite ueber fuenf Marken (`--art-ground` bis
 * `--art-accent`) gleich unten. Wer den hellen Stand zurueckholen will, setzt
 * dort #ffffff / #121814 / #4d5a52 / rgba(18,24,20,.12) / #3f6a17 ein und
 * blendet Lichtschein und Ringe wieder aus; die uebrigen Regeln bleiben, wie
 * sie sind. Vier Stellen haengen zusaetzlich am Grund und sind unten
 * entsprechend gekennzeichnet: Kopfleiste, Bildkante, Begriffsband, Fuss.
 * ====================================================================== */

body.bfv-light{
  /* Die eigenen Marken bleiben, obwohl sie jetzt auf die Hausfarben zeigen: Die
     Seite hat mit `.art-*` ihre eigene Formensprache, und ueber diese fuenf
     Werte laesst sich ihr Grund an einer Stelle drehen, ohne fuenfzig Regeln
     anzufassen. Genau das ist hier gerade passiert. */
  --art-ground:var(--forest-950);
  --art-ink:var(--paper);
  --art-ink-soft:var(--paper-dim);
  --art-rule:var(--line);
  /* Auf dunklem Grund traegt das Hauslimett wieder. Auf Weiss hatte es rund
     1,5:1 und musste abgedunkelt werden – dieser Umweg entfaellt. */
  --art-accent:var(--lime);

  background:var(--art-ground);
  color:var(--art-ink);
}

/* Lichtschein und Jahresringe waren ausgeblendet, solange der Grund weiss war –
   auf Weiss wurden aus ihnen graue Schlieren. Auf dem Hausgrund gehoeren sie
   dazu und kommen zurueck. */
body.bfv-light .page-glow,
body.bfv-light .page-rings{display:block;}

/* ---------- Kopfleiste ----------
   Die Leiste hatte hier einen eigenen dunklen Grund, weil sie sonst auf der
   weissen Seite weiss geworden waere: Bis zum ersten Scrollen ist sie
   DURCHSICHTIG, das Dunkel kommt vom Seitengrund darunter. Der ist jetzt
   wieder dunkel, also traegt die Leiste wie ueberall sonst.
   Die Innenteile bleiben ausdruecklich gesetzt – sie sind gegen fremde
   Stylesheets abgesichert und funktionieren unveraendert weiter. */
body.bfv-light #siteHeader{
  background:transparent;
  border-bottom-color:transparent;
}
/* Muss ebenfalls ueber die ID laufen: Seit die Grundregel `#siteHeader.scrolled`
   heisst (1,1,0), verlore eine Klassenfassung hier (0,2,1) den Vergleich. */
body.bfv-light #siteHeader.scrolled{
  background:rgba(10,19,15,.92);
  border-bottom-color:var(--line);
}
body.bfv-light #siteHeader .brand,
body.bfv-light #siteHeader .brand *{color:var(--paper);}
body.bfv-light #siteHeader .brand small{color:var(--mist);}
/* `!important`, weil das Plaettchen weiter oben eines traegt (Ausnahmeliste der
   Elementor-Absicherung) – ohne dieses hier gewaenne die andere Regel. */
body.bfv-light #siteHeader .brand .mark{
  background:var(--paper) !important;
  box-shadow:0 4px 14px -4px rgba(0,0,0,.4);
}
body.bfv-light #siteHeader .brand .mark-img{filter:brightness(0) saturate(100%);}
/* Ueber die ID adressiert, weil der Burger weiter oben schon einmal ueber `#burger`
   zurueckgeholt wurde (Elementor faerbt jeden <button>). Eine reine Klassenregel
   verloere dagegen. */
body.bfv-light #siteHeader .burger,
body.bfv-light #burger{
  border-color:var(--line);
  background:rgba(244,241,230,0.04);
  color:var(--paper);
}
body.bfv-light #burger span,
body.bfv-light #siteHeader .burger span{background:var(--paper);}
body.bfv-light #siteHeader .burger:hover,
body.bfv-light #burger:hover,
body.bfv-light #burger:focus{
  background:rgba(200,241,105,0.12);
  border-color:var(--lime);
}
body.bfv-light #siteHeader .nav-cta{
  background:var(--lime);
  color:var(--forest-950);
}
/* Das Vollbild-Menue bleibt dunkel – es ist eine eigene Ebene ueber der Seite,
   kein Teil ihres Grundes. */

/* ---------- Kopf der Seite ---------- */
body.bfv-light .art-hero{padding:180px 0 60px;}
body.bfv-light .art-hero .eyebrow{color:var(--art-accent);}
body.bfv-light .art-hero .eyebrow::before{background:var(--art-accent);}
body.bfv-light .art-title{
  font-family:var(--font-display);
  font-size:clamp(40px,6.4vw,88px);
  font-weight:600;
  line-height:1.02;
  letter-spacing:-.01em;
  margin-top:22px;
  color:var(--art-ink);
}
body.bfv-light .art-lead{
  margin-top:26px;
  max-width:64ch;
  font-size:17px;
  line-height:1.65;
  color:var(--art-ink-soft);
}

/* ---------- Werke ---------- */
body.bfv-light .art-stage{padding:70px 0;}
body.bfv-light .art-stage--top{padding-top:20px;}
body.bfv-light .art-stage--bottom{padding-bottom:130px;}

.art-piece{margin:0;}
.art-piece img{
  width:100%;
  height:auto;
  border-radius:18px;
  /* Kein Rahmen, nur ein Anheben: Ein Kasten um ein Bild konkurriert mit dem
     Bild.
     Auf dunklem Grund reicht ein Schatten allein nicht – dunkel auf dunkel ist
     nichts zu sehen. Dazu kommt deshalb eine Haarlinie in Papierton, die die
     Kante des Bildes vom Grund trennt, ohne als Rahmen zu wirken. */
  box-shadow:
    0 0 0 1px rgba(244,241,230,.09),
    0 26px 60px -30px rgba(0,0,0,.9);
}
.art-piece figcaption{
  display:flex;
  align-items:baseline;
  gap:14px;
  margin-top:16px;
  padding-top:14px;
  border-top:1px solid var(--art-rule);
}
.art-num{
  font-family:var(--font-mono);
  font-size:12px;
  letter-spacing:.08em;
  color:var(--art-accent);
  flex-shrink:0;
}
.art-name{
  font-family:var(--font-display);
  font-size:clamp(18px,2vw,23px);
  font-weight:600;
  line-height:1.2;
  color:var(--art-ink);
}

/* Ein Werk und ein Satz nebeneinander. Das Zitat sitzt oben buendig mit dem
   Bild statt mittig – so beginnen beide Spalten auf derselben Linie. */
.art-duo{
  display:grid;
  grid-template-columns:1.35fr 1fr;
  gap:56px;
  align-items:start;
}
.art-quote{
  margin:0;
  padding-left:26px;
  border-left:2px solid var(--art-accent);
}
.art-quote p{
  font-family:var(--font-display);
  font-style:italic;
  font-size:clamp(21px,2.4vw,29px);
  font-weight:500;
  line-height:1.35;
  color:var(--art-ink);
}

/* Hochformat allein: Es soll nicht ueber die ganze Spaltenbreite gezogen
   werden, sonst ueberragt es alles andere um das Doppelte. */
.art-solo{display:flex;justify-content:center;}
.art-solo .art-piece{max-width:520px;width:100%;}

.art-grid{
  display:grid;
  grid-template-columns:repeat(2,1fr);
  gap:56px 48px;
  align-items:start;
}

/* ---------- Begriffe ---------- */
body.bfv-light .art-words{
  padding:26px 0;
  border-top:1px solid var(--art-rule);
  border-bottom:1px solid var(--art-rule);
  /* Eine Spur heller als der Grund, wie die uebrigen abgesetzten Baender des
     Themes. Vorher war es eine Spur dunkler als Weiss – dieselbe Absicht. */
  background:var(--forest-900);
}
.art-word-list{
  display:flex;
  flex-wrap:wrap;
  align-items:center;
  justify-content:space-between;
  gap:14px 28px;
  margin:0;
}
.art-word-list li{
  font-family:var(--font-mono);
  font-size:13px;
  letter-spacing:.12em;
  text-transform:uppercase;
  /* Nicht --art-ink-soft: Das Band ist das Gegenstueck zum Laufband der
     Startseite und traegt deshalb dessen leiseren Ton. */
  color:var(--mist);
  display:flex;
  align-items:center;
  gap:28px;
  white-space:nowrap;
}
/* Dieselbe Raute wie im Laufband der Startseite – das Zeichen verbindet die
   beiden Seiten, ohne dass sie sich sonst gleichen muessten. */
.art-word-list li:not(:last-child)::after{
  content:'◆';
  color:var(--amber);
  font-size:8px;
}

/* ---------- Freier Seiteninhalt ---------- */
body.bfv-light .art-prose{max-width:72ch;color:var(--art-ink-soft);line-height:1.7;}
body.bfv-light .art-prose h2,
body.bfv-light .art-prose h3{font-family:var(--font-display);color:var(--art-ink);margin-top:1.4em;}
body.bfv-light .art-prose p{margin-top:1em;}
body.bfv-light .art-prose a{color:var(--art-accent);text-decoration:underline;}

/* ---------- Fuss ---------- */
/* Der Fuss stand hier gesondert, weil die Seite ueber ihm hell war und die
   Trennlinie deshalb stoerte. Jetzt ist er wieder der normale Fuss. */
body.bfv-light footer#kontakt{
  background:var(--forest-950);
  color:var(--paper);
  border-top:1px solid var(--line);
}

body.bfv-light ::selection{background:var(--art-accent);color:var(--forest-950);}
body.bfv-light :focus-visible{outline-color:var(--art-accent);}

@media (max-width:900px){
  .art-duo{grid-template-columns:1fr;gap:34px;}
  .art-grid{grid-template-columns:1fr;gap:46px;}
  body.bfv-light .art-hero{padding:140px 0 40px;}
  body.bfv-light .art-stage{padding:48px 0;}
  .art-word-list{justify-content:flex-start;gap:12px 20px;}
  .art-word-list li{gap:20px;}
}

/* =========================================================================
 * Das Regal – Brett, Neigung, Buchstütze.
 *
 * Die vier Rücken standen bisher nur nebeneinander in der Luft. Als Regal las
 * sich das nicht: Es fehlte die Fläche, auf der sie stehen, und die Rücken
 * standen alle exakt senkrecht – die eine Haltung, die Bücher in einem nur
 * halb gefüllten Regal nie haben.
 *
 * Drei Zutaten, alle rein zierend; an Aufbau und Bedienung ändert sich nichts:
 *   1. ein Brett unter der Reihe, breiter als die Bücher,
 *   2. eine wachsende Neigung nach links, Band für Band,
 *   3. eine Buchstütze, die die Reihe zusammenhält.
 *
 * Am Telefon steht die Reihe als Spalte untereinander (siehe Medienabfrage
 * weiter unten) – dort ergibt nichts davon einen Sinn und alles wird
 * zurückgenommen.
 * ====================================================================== */

.shelf { position: relative; }

/* ---------- 1) Das Brett ----------
   Absolut gesetzt und damit ausdrücklich KEIN Flex-Element: Ein ::after am
   Flex-Container zählt sonst als weiteres Kind und stünde als schmale Säule
   rechts neben den Büchern.
   Die Fläche reicht über die volle Breite des Satzspiegels, nicht nur bis zum
   letzten Band – ein Regal hört nicht dort auf, wo die Bücher aufhören. Genau
   dieser leere Teil rechts gibt der Buchstütze ihren Sinn. */
.shelf::after {
  content: '';
  position: absolute;
  left: -30px;
  right: -30px;
  /* Höhe und Versatz sind derselbe Wert: Die Oberkante des Bretts liegt damit
     genau auf der Unterkante der Rücken. Ein größerer Versatz ließe die Bücher
     über dem Brett schweben. */
  bottom: -12px;
  height: 12px;
  border-radius: 2px;
  /* Oben die vom Licht getroffene Kante, darunter die Stirnseite im Schatten –
     zwei Töne genügen, damit das Brett Tiefe bekommt. Ganz flach war es einen
     Zwischenstand lang, las sich dann aber als grauer Balken statt als Fläche,
     auf der etwas steht: Ohne Kante fehlt der Reihe der Boden.
     Grau statt Waldgrün, weil das Brett als grüne Fläche mit den Buchrücken
     verschwamm, die ja selbst grün sind. */
  background: linear-gradient(180deg, #6d726f 0 4px, #3d423f 4px 100%);
  box-shadow:
    inset 0 1px 0 rgba(244, 241, 230, 0.10),
    0 16px 34px -16px rgba(0, 0, 0, 0.9);
  pointer-events: none;
}

/* ---------- 2) Die Neigung ----------
   Der Drehpunkt ist die untere linke Ecke: Kippt ein Buch nach links, bleibt
   genau diese Kante am Brett und die rechte hebt leicht ab. Mit `bottom center`
   sänke die linke Ecke ins Brett hinein.
   Der erste Band bleibt aufrecht – er ist derjenige, an dem sich die anderen
   anlehnen. Die Winkel wachsen nach rechts, wie in einer echten Reihe, in der
   jeder Band ein Stück mehr Schräge vom Vorgänger erbt. */
.spine { transform-origin: bottom left; }

/* Die Stapelreihenfolge läuft nach rechts abwärts: Ein angelehnter Band
   verschwindet hinter dem, an dem er lehnt, nicht davor. */
.shelf .spine:nth-child(1) { z-index: 4; }
.shelf .spine:nth-child(2) { transform: rotate(-1.2deg); z-index: 3; }
.shelf .spine:nth-child(3) { transform: rotate(-1.9deg); z-index: 2; }
.shelf .spine:nth-child(4) { transform: rotate(-2.6deg); z-index: 1; }

/* Ein aufgeschlagener Band steht gerade – man hält ihn ja in der Hand. Gleiche
   Spezifität wie die drei Regeln darüber, gewinnt also durch die Reihenfolge. */
.shelf .spine.active,
.shelf .spine:hover { transform: rotate(0deg); z-index: 5; }

/* Die Neigung soll mitlaufen, wenn ein Band auf- oder zuklappt. */
.spine {
  transition:
    flex-basis .55s var(--ease),
    background .55s var(--ease),
    padding .55s var(--ease),
    transform .55s var(--ease);
}

/* ---------- 3) Die Buchstütze ----------
   Von vorn gesehen ist eine Buchstütze eine schmale, senkrechte Platte; ihr Fuß
   liegt unter den Büchern und ist damit ohnehin verdeckt. Sie steht aufrecht:
   Das Ding, das die Reihe hält, darf als Einziges nicht schräg stehen.

   Zwischenstand war ein runder Kiesel – der Strich trägt die Sache besser, weil
   er als Kante liest und die Reihe damit sichtbar abschließt.

   Zwei Dinge sind aus dem Zwischenstand geblieben: Sie ist kürzer als anfangs
   (44 statt 62 Prozent der Regalhöhe) und trägt kein Lime mehr. Als leuchtender
   Balken zog sie mehr Aufmerksamkeit auf sich als die Bücher, die sie hält.

   Wie das Brett flach: ein Ton, kein Verlauf, kein Schatten auf das Brett. Sie
   ist ein Strich, der die Reihe abschließt. */
.shelf-stop {
  flex: 0 0 9px;
  align-self: flex-end;
  height: 44%;
  margin-left: 4px;
  border-radius: 2px;
  /* Volles Lime, deckend – kein Verlauf, kein Schein, keine halbe Deckkraft.
     Das Zurückhaltende an ihr ist die Größe, nicht die Farbe: 9 Pixel breit auf
     44 Prozent der Regalhöhe. So bleibt sie ein Strich und wird trotzdem als
     der eine gesetzte Akzent gelesen. */
  background: var(--lime);
  /* Bleibt gesetzt, damit die Stütze über dem Brett liegt: Das Brett ist ein
     absolut gesetztes Pseudo-Element und würde als solches über einem Element
     ohne eigene Ebene gezeichnet. */
  position: relative;
  z-index: 4;
}

@media (max-width: 900px) {
  /* Als Spalte untereinander gibt es weder ein Brett noch eine Schräge. */
  .shelf::after { display: none; }
  .shelf .spine:nth-child(2),
  .shelf .spine:nth-child(3),
  .shelf .spine:nth-child(4) { transform: none; }
  .shelf-stop { display: none; }
}
