/*
 Theme Name:   KWP Beautiful Things Child
 Theme URI:    https://kwpbeautifulthings.at
 Description:  Child-Theme von GeneratePress für den Relaunch von kwpbeautifulthings.at
 Author:       KWP
 Template:     generatepress
 Version:      1.4.12
 Text Domain:  kwpbeautifulthings-child
*/

/* ==========================================================================
   Design-Tokens & Basis-Komponenten
   Übernommen aus dem abgestimmten Prototyp (Arbeitsstand 0.6).
   Gleiche Klassennamen wie dort, damit sich Prototyp-Markup beim
   Seitenaufbau möglichst unverändert übernehmen lässt.
   Google Fonts werden per functions.php eingebunden, nicht per @import.
   ========================================================================== */

:root{
  --ink:#1d1a17;
  --ink-soft:#4a443d;
  --paper:#fbf8f3;
  --paper-2:#f2ece3;
  --line:#ded5c8;
  --accent:#9a6b3f;
  --accent-dark:#7c5430;
  --sage:#7c8471;
  --danger:#a33;
  --max:1240px;
  --serif:'Cormorant Garamond', 'Iowan Old Style', Georgia, serif;
  --sans:'Jost', 'Helvetica Neue', Arial, sans-serif;
}

*,*::before,*::after{box-sizing:border-box}
html{scroll-behavior:smooth}
body{
  margin:0;
  background:var(--paper);
  color:var(--ink);
  font-family:var(--sans);
  font-weight:300;
  font-size:17px;
  line-height:1.75;
  -webkit-font-smoothing:antialiased;
}
img{max-width:100%;display:block}
/* Jost ist nur in den Schnitten 300/400/500 eingebunden (functions.php).
   <strong>/<b> verlangen vom Browser aber Schriftschnitt 700 — den gibt es
   in Jost nicht, weshalb der Browser für Fettschrift auf eine komplett
   andere, systemeigene Schriftart ausweicht (sichtbar andere Buchstaben-
   formen). Fix: Fettschrift auf den schwersten tatsächlich geladenen
   Jost-Schnitt (500) begrenzen, bleibt dadurch in der Font-Familie. */
strong,b{font-weight:500}
a{color:inherit;text-decoration:none}
.wrap{max-width:var(--max);margin:0 auto;padding:0 28px}
.narrow{max-width:820px;margin-left:auto;margin-right:auto}

h1,h2,h3,h4{font-family:var(--serif);font-weight:400;line-height:1.14;margin:0 0 .5em}
h1{font-size:clamp(2.6rem,6vw,4.6rem);letter-spacing:.01em}
h2{font-size:clamp(1.9rem,3.6vw,2.9rem)}
h3{font-size:clamp(1.35rem,2.2vw,1.8rem)}
/* Adresse "Kaiser-Wilhelm-Promenade 4" (Startseite, Abschnitt "Besuchen Sie uns") soll nie
   umbrechen — eigene, kleinere Clamp-Kurve statt der allgemeinen h2-Größe, damit der Text bei
   26 Zeichen auch in der schmaleren Spalte der Zweispalten-Ansicht und auf Mobile (dort volle
   Breite nach dem Stapeln bei 560px) zuverlässig auf einer Zeile bleibt. */
.addr-heading{font-size:clamp(1.25rem,4.4vw,2.4rem);white-space:nowrap}
p{margin:0 0 1.1em}
.lead{font-size:1.12rem;color:var(--ink-soft)}

.eyebrow{
  font-family:var(--sans);font-size:.72rem;font-weight:400;
  letter-spacing:.32em;text-transform:uppercase;color:var(--accent);
  margin:0 0 1rem;
}
.rule{width:56px;height:1px;background:var(--accent);border:0;margin:1.4rem 0 1.8rem}
.rule.center{margin-left:auto;margin-right:auto}
.center{text-align:center}

/* ---------- Buttons ---------- */
.btn{
  display:inline-block;font-family:var(--sans);font-size:.76rem;font-weight:400;
  letter-spacing:.22em;text-transform:uppercase;
  padding:14px 30px;border:1px solid var(--ink);color:var(--ink);
  background:transparent;transition:all .25s ease;cursor:pointer;
}
.btn:hover{background:var(--ink);color:var(--paper)}
.btn.light{border-color:#fff;color:#fff}
.btn.light:hover{background:#fff;color:var(--ink)}
.btn.solid{background:var(--ink);color:var(--paper)}
/* Zwei Buttons auf gleiche Breite, exakt bündig mit dem Fließtext
   darüber (dasselbe max-width wie .hero p): display:grid statt
   inline-grid, sonst passt sich der Container nur an die Inhaltsbreite
   der Buttons an und bleibt schmäler als Überschrift/Text. */
.hero-actions{display:grid !important;grid-template-columns:1fr 1fr;gap:16px;margin-top:32px;max-width:640px}
.hero-actions .btn{text-align:center}
.btn.solid:hover{background:var(--accent);border-color:var(--accent)}
.link-more{
  font-size:.75rem;letter-spacing:.22em;text-transform:uppercase;
  border-bottom:1px solid var(--accent);padding-bottom:4px;display:inline-block;
}
.link-more:hover{color:var(--accent)}

/* ---------- Header ---------- */
.topbar{
  background:var(--ink);color:#e9e2d7;font-size:.72rem;letter-spacing:.18em;
  text-transform:uppercase;text-align:center;padding:9px 16px;
}
.topbar a{border-bottom:1px solid rgba(255,255,255,.35)}

/* Hinweis: Der eigene Header/Nav-Aufbau des ursprünglichen HTML-Prototyps
   (header.site, .head-inner, nav.main, .sub-menu, .burger …) wird auf der
   echten Seite nicht gebraucht — GeneratePress rendert Header und Menü mit
   eigener Markup-Struktur (.site-header, .main-navigation, …), die weiter
   unten im Abschnitt "GeneratePress-Integration" mit denselben Design-
   Tokens gestylt wird. Nur die Logo-Bildgröße bleibt hier stehen, weil
   dieselbe Klasse (.brand) gleich im Footer wiederverwendet wird. */
.brand img{height:46px;width:auto;display:block}
.kwpbt-footer .brand img{height:54px}
@media (max-width:900px){.brand img{height:38px}}
@media (max-width:560px){.brand img{height:32px}}

/* ---------- Hero ---------- */
.hero{
  position:relative;min-height:78vh;display:flex;align-items:center;
  /* Platzhalterfarbe (12.09.2026): vorher #2a2521 (isolierter Hex-Wert,
     keine Markenfarbe) — jetzt var(--accent-dark), damit der kurze
     Moment vor dem Laden des Hero-Fotos (bzw. bei CSS-Hintergrund-Heros
     generell) nicht wie ein fast schwarzer, "kaputt" wirkender Block
     aussieht. Kontrast zu weißer Hero-Schrift weiterhin komfortabel
     (6,9:1, WCAG-AA-Minimum ist 4,5:1). */
  background:var(--accent-dark) center/cover no-repeat;color:#fff;
}
.hero::after{content:'';position:absolute;inset:0;z-index:1;background:linear-gradient(180deg,rgba(20,17,14,.45),rgba(20,17,14,.62))}
/* Testweise EIN Hero (Tagesbar, 11.09.2026) auf ein echtes <img> statt
   CSS-background-image umgestellt — Versuch, das seitenweite Mobil-LCP-
   Problem (siehe Berichte/Code-Analyse-Grundauf-11-09-2026.md) an der
   Wurzel zu beheben statt per Preload-Hint zu kompensieren (zwei
   Preload-Versuche für "Über uns" scheiterten live, siehe
   Technische-Learnings.md). Ein <img> wird vom Browser-Vorab-Scanner immer
   sofort erkannt, unabhängig vom CSS-Parsing — kein Preload-Hinweis nötig.
   z-index:0, damit es hinter dem ::after-Verlauf (z-index:1) und dem
   .wrap-Inhalt (z-index:2) liegt — exakt dieselbe Ebenen-Reihenfolge wie
   vorher mit background-image, nur als eigenes Element statt CSS-Eigenschaft.
   Stand 12.09.2026: mittlerweile auf 17 der 25 Seiten im Einsatz (siehe
   00-PROJEKT-KONTEXT.md), Regel wirkt weiterhin nur dort, wo das
   `<img class="hero-bg">`-Markup tatsächlich im Seiteninhalt steht. */
.hero > img.hero-bg{position:absolute;inset:0;z-index:0;width:100%;height:100%;object-fit:cover}
.hero .wrap{position:relative;z-index:2;padding-top:96px;padding-bottom:96px}
.hero h1{color:#fff;margin-bottom:.35em}
.hero .eyebrow{color:#e2c9a6}
.hero p{color:#f1e9dd;max-width:640px !important;font-size:1.1rem}
/* Mobil-Bildoptimierung Startseiten-Hero (10.09.2026, 900px-Datei seit der
   LCP-Preload-Korrektur): PageSpeed identifizierte den Hero als tatsächliches
   LCP-Element (lcp-discovery-insight), das Original-Foto (1182x665, 291 KB)
   wurde von Mobilgeräten unnötig groß geladen. Nur für die Startseite
   (page-id-93165) unter 768px auf eine eigens verkleinerte Datei umgeschaltet
   — Desktop/Tablet bleiben unverändert beim Original, das per
   Inline-style="background-image" auf dem Element gesetzt wird. Datei bewusst
   900px breit (nicht kleiner): Der ergänzende Preload-Hint in functions.php
   (kwpbt_child_preload_hero_image) nutzt `imagesrcset`/`imagesizes` und wählt
   nach Pixeldichte (DPR) des Geräts — bei einer ursprünglich getesteten
   700px-Datei reichte das bei DPR 2 (sehr üblich) rechnerisch nicht, der
   Browser preloadete zusätzlich das Original. Mit 900px stimmen Preload-Wahl
   und diese CSS-Regel für die praktisch relevante Mehrheit der Mobilgeräte
   überein (Details siehe Technische-Learnings.md).
   13.09.2026: Datei von JPEG auf WebP umgestellt (gleiche 900px-Breite/Qualität
   82, ~44% kleiner) — Gegenstück in functions.php (kwpbt_child_preload_hero_image)
   mitgezogen. */
@media (max-width:768px){
  .page-id-93165 .hero{background-image:url('https://kwpbeautifulthings.at/wp-content/uploads/2026/09/85012-hero-mobile-900.webp') !important}
}
/* Nur auf der Kontakt-Seite breiter, damit der Satz "Per E-Mail, WhatsApp
   oder Telefon – und natürlich persönlich an der Kaiser-Wilhelm-Promenade."
   auf einer Zeile bleibt, statt wie die übrigen Hero-Texte auf 640px
   begrenzt zu sein (auf Kundenwunsch nur für diese eine Seite).
   25.08.2026: .page-kontakt (per functions.php, kwpbt_child_slug_body_classes)
   live bestätigt (body.className enthält die Klasse) — der bis dahin als
   Sicherheitsnetz mitgeführte ID-Selektor .page-id-74256 ist damit entfernt. */
.page-kontakt .hero p{max-width:900px !important}
/* Variante ohne den dunklen Verlauf — auf Wunsch für Impressum/Datenschutz/
   AGB, deren Bilder (Original-Fotos von kwp-badgastein.at) klar und ohne
   Grauschleier zu sehen sein sollen. Lesbarkeit kommt stattdessen über
   Schlagschatten auf dem Text. */
.hero.no-overlay::after{content:none}
.hero.no-overlay h1,
.hero.no-overlay .eyebrow,
.hero.no-overlay p{text-shadow:0 2px 14px rgba(0,0,0,.6),0 1px 4px rgba(0,0,0,.45)}
/* +1cm auf Wunsch: Eingangsseiten (Concept Store, Tagesbar, Über uns,
   Kontakt, Online Store, Impressum/Datenschutz/AGB) wirkten mit reinem
   52vh knapp beschnitten. 1cm = 37.8px bei 96dpi. */
.hero.short{min-height:calc(52vh + 38px)}
/* 17.08.2026: Versuch, die Tagesbar-Hero-Bühne für dieses eine Foto extra
   zu erhöhen (weniger Beschnitt), per Seiten-ID wieder zurückgenommen —
   der Bildausschnitt wirkte dadurch größer/anders als bei den übrigen
   "short"-Hero-Seiten und passte nicht mehr ins einheitliche Bild. Bleibt
   bewusst bei der Standardhöhe wie alle anderen Nebenseiten. */

/* ---------- Sections ---------- */
section{padding:92px 0}
section.tight{padding:64px 0}
.bg-alt{background:var(--paper-2)}
.bg-dark{background:var(--ink);color:#efe7db}
.bg-dark h2,.bg-dark h3{color:#fff}
.bg-dark .eyebrow{color:#dcbb90}
.bg-dark p{color:#cfc5b6}

/* ---------- Grids ---------- */
.grid{display:grid;gap:34px}
.g-2{grid-template-columns:repeat(2,1fr)}
.g-3{grid-template-columns:repeat(3,1fr)}
.g-4{grid-template-columns:repeat(4,1fr)}

/* Bereichskarten */
.pillar{background:var(--paper);border:1px solid var(--line);display:flex;flex-direction:column}
.pillar .media{aspect-ratio:4/3}
.pillar .body{padding:30px 30px 34px;display:flex;flex-direction:column;flex:1}
.pillar .body p{flex:1;color:var(--ink-soft);font-size:.97rem}

/* Split */
.split{display:grid;grid-template-columns:1fr 1fr;gap:64px;align-items:center}
.split.rev .media{order:2}

/* Produktkacheln */
.product .media{aspect-ratio:1/1;margin-bottom:14px;transition:opacity .25s}
.product:hover .media{opacity:.85}
.product h4{font-family:var(--sans);font-size:.82rem;font-weight:400;letter-spacing:.14em;text-transform:uppercase;margin:0 0 6px}
.product .price{font-family:var(--serif);font-size:1.15rem;color:var(--accent-dark)}

/* Kategoriekacheln */
.cat{position:relative;display:block;overflow:hidden}
.cat .media{aspect-ratio:3/4;transition:transform .5s ease}
.cat:hover .media{transform:scale(1.04)}
.cat span{
  position:absolute;left:0;right:0;bottom:0;padding:22px;color:#fff;z-index:2;
  font-size:.8rem;letter-spacing:.24em;text-transform:uppercase;
  background:linear-gradient(180deg,rgba(0,0,0,0),rgba(0,0,0,.6));
}

/* Bildflächen (Kacheln, Kategorie-/Produktbilder usw.) */
.media{background:var(--paper-2);position:relative;overflow:hidden}
/* img per position:absolute+inset statt width/height:100% verankert: Safari
   berechnet eine prozentuale Höhe auf einem nur per aspect-ratio bemessenen
   Elternelement (siehe z. B. .pillar .media{aspect-ratio:4/3}) beim
   Verkleinern des Browserfensters teils nicht neu — das Bild blieb auf der
   alten Größe stehen, bis man neu lud. absolute+inset wird von Safari beim
   Resize zuverlässig neu berechnet, optisch identisches Ergebnis. */
.media img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}

/* ---------- Aktuelles/News: Instagram-Feed im Look der Produktkacheln
   (29.08.2026, auf Wunsch: "Fläche der Bilder wie auf der Startseite"
   hinterlegen + "Mehr Aktuelles"-Button, der auf 6 Reihen gesamt aufklappt;
   Standard-Ansicht später auf Wunsch von 1 auf 3 Reihen erhöht).
   Live geprüft (Smash Balloon "Instagram Feed"-Plugin): .sbi_photo_wrap ist
   bereits quadratisch mit echtem <img> darin — bekommt hier denselben
   Hintergrund wie .media oben. Die .sbi_item-Kacheln liegen als direkte
   Kinder von #sbi_images (das wiederum in #sb_instagram = .sbi liegt) in
   exakter visueller Zeilenreihenfolge, dadurch funktioniert nth-child hier
   zuverlässig. WICHTIG, live gefunden: Smash Balloons eigene Regel
   "#sb_instagram #sbi_images .sbi_item{display:inline-block}" hat zwei
   ID-Selektoren (Spezifität 2,0,1) und gewinnt gegen jede reine
   Klassen-Regel unabhängig von der Ladereihenfolge — exakt dieselbe Falle
   wie schon dreimal zuvor bei WooCommerce/GeneratePress-Core-CSS (siehe
   Technische-Learnings.md). Deshalb hier dieselben zwei ID-Selektoren
   mitgeführt, statt nur mit Klassen zu arbeiten. */
.page-aktuelles .sbi_photo_wrap,
.page-news .sbi_photo_wrap,
.page-notizie .sbi_photo_wrap{background:var(--paper-2)}
/* Standardmäßig 3 Reihen (12 Kacheln) offen, nicht nur eine — auf Wunsch
   vom 29.08.2026 nachträglich angepasst (ursprünglich :nth-child(n+5), also
   nur 1 Reihe). .page-notizie (italienische Fassung) am 14.09.2026 ergänzt
   — fehlte bis dahin, obwohl die Seite denselben Aufbau verwendet. */
.page-aktuelles #sb_instagram #sbi_images .sbi_item:nth-child(n+13),
.page-news #sb_instagram #sbi_images .sbi_item:nth-child(n+13),
.page-notizie #sb_instagram #sbi_images .sbi_item:nth-child(n+13){display:none}
/* Aufklappen zeigt die restlichen drei Reihen (Kacheln 13–24, macht 6 Reihen
   gesamt), nicht alle von Smash Balloon geladenen Kacheln — falls mehr als
   24 geladen sind, bleiben die überzähligen bewusst versteckt. Die Feed-
   Einstellung "Anzahl der Beiträge" ist dafür in Instagram-Feed → Alle
   Feeds → Inspirationen → Feed-Layout auf 24 gesetzt (Desktop und Mobil). */
.page-aktuelles #sb_instagram.aktuelles-expanded #sbi_images .sbi_item:nth-child(-n+24),
.page-news #sb_instagram.aktuelles-expanded #sbi_images .sbi_item:nth-child(-n+24),
.page-notizie #sb_instagram.aktuelles-expanded #sbi_images .sbi_item:nth-child(-n+24){display:block!important}
/* Die Platzhalter-Klassen .ph/.ph.dark aus der frühen Prototyp-Phase (vor
   den echten Fotos) wurden am 19.08.2026 entfernt — geprüft per REST-API
   gegen alle 29 veröffentlichten Seiten, keine einzige nutzt sie noch
   (jede Bildfläche hat inzwischen ein echtes Foto). */

/* Kontaktformular (Contact Form 7) — Eingaben optisch an die restigen
   Formulare (Newsletter, statische Prototyp-Vorschau) angleichen. */
.wpcf7 input[type=text],
.wpcf7 input[type=email],
.wpcf7 textarea{
  width:100%;padding:14px;border:1px solid var(--line);background:#fff;
  font-family:var(--sans);font-size:.95rem;color:var(--ink);
}
.wpcf7 textarea{margin-top:20px;resize:vertical}
/* Spam-Schutz (Honeypot), 27.08.2026, korrigiert 28.08.2026: Ein
   zusätzliches Textfeld ([kwp-hp-field], siehe Kontaktformular +
   Contact Form (EN) im CF7-Editor), das für echte Besucher unsichtbar
   bleibt, aber im HTML vorhanden ist. Ursprünglich über die Klasse
   .kwp-hp versteckt — die wurde im CF7-Formular-Tag aber nie gesetzt
   (Feld landete nur zufällig durch ein Layout-Detail off-screen, nicht
   zuverlässig). Fix: Auswahl jetzt über das data-name-Attribut, das
   CF7 automatisch auf den umschließenden Wrapper-Span schreibt —
   funktioniert unabhängig vom CF7-Formular-Tag, kein erneuter Edit im
   CF7-Editor nötig. Bewusst NICHT display:none (manche Bots
   überspringen offensichtlich versteckte Felder), sondern aus dem
   sichtbaren Bereich herausgeschoben, bleibt für Screenreader
   ebenfalls unsichtbar. Die eigentliche Prüfung/Abweisung läuft
   serverseitig über den wpcf7_spam-Filter in functions.php — dort auch
   die ergänzende Zeitfalle gegen Bots, die dieses Feld gezielt
   überspringen (siehe Technische-Learnings.md). */
.wpcf7-form-control-wrap[data-name="kwp-hp-field"]{
  position:absolute;left:-9999px;top:0;width:1px;height:1px;overflow:hidden;
}
.wpcf7 label{display:block;font-size:.8rem;color:var(--ink-soft);margin-bottom:6px}
.wpcf7-response-output{
  margin:20px 0 0;padding:14px 18px;border:1px solid var(--line);font-size:.9rem;
}
.wpcf7-not-valid-tip{color:var(--danger);font-size:.8rem;margin-top:4px}

/* Info-Box */
.notice{
  border:1px solid var(--accent);padding:26px 30px;background:#fff;
  font-size:.95rem;color:var(--ink-soft);
}
.notice strong{color:var(--ink);font-weight:400}

/* Öffnungszeiten */
.hours{list-style:none;margin:0;padding:0;font-size:.98rem}
.hours li{display:flex;justify-content:space-between;gap:20px;padding:11px 0;border-bottom:1px solid var(--line)}
.hours li:last-child{border-bottom:0}

/* Marken */
.count{font-size:.72rem;letter-spacing:.16em;text-transform:uppercase;color:var(--ink-soft)}
.count b{font-weight:400;color:var(--accent)}
.brands{
  display:flex;flex-wrap:wrap;gap:10px 28px;list-style:none;padding:0;margin:0;
  font-size:.78rem;letter-spacing:.16em;text-transform:uppercase;color:var(--ink-soft);
}

/* ---------- Footer ----------
   Eigener Footer-Inhalt, ersetzt GPs Standard-Copyright-Zeile (siehe
   kwpbt_child_footer() in functions.php). GP selbst rendert den äußeren
   <footer>-Tag mit eigener Klasse (aktuell "site-info", je nach GP-Version
   unterschiedlich) — deshalb ein eigener, dedizierter Klassenname
   (.kwpbt-footer) statt eines GP- oder Prototyp-Selektors. */
.kwpbt-footer{background:var(--ink);color:#bdb3a4;padding:76px 0 34px;font-size:.9rem}
/* Footer-Inhalt nutzt denselben seitlichen Rand wie der Header
   (.site-header .inside-header, 39px statt der normalen .wrap-28px) —
   sonst startet der Footer-Text sichtbar weiter links als Logo/Menü im
   Kopfbereich (per Screenshot mit Lot-Linie vom User aufgezeigt). Eigene,
   spezifischere Regel statt .wrap direkt zu ändern, da .wrap sonst überall
   sonst im Fließtext (28px) verwendet wird. */
.kwpbt-footer .wrap{padding:0 39px}
.kwpbt-footer h4{
  font-family:var(--sans);font-size:.72rem;letter-spacing:.24em;text-transform:uppercase;
  color:#fff;margin:0 0 18px;font-weight:400;
}
.kwpbt-footer a:hover{color:#fff}
.kwpbt-footer ul{list-style:none;margin:0;padding:0;line-height:1.45}
.kwpbt-footer li{margin:3px 0}
.foot-grid{display:grid;grid-template-columns:1.5fr 1fr 1fr 1fr;gap:44px}
.foot-bottom{
  margin-top:56px;padding-top:24px;border-top:1px solid rgba(255,255,255,.12);
  display:flex;flex-wrap:wrap;gap:14px;justify-content:space-between;
  font-size:.76rem;letter-spacing:.08em;
}
/* 26.08.2026: Newsletter-Formular ist jetzt ein echtes CF7-Formular
   ([contact-form-7 id="a756581" title="Newsletter Footer"], sendet an
   post@kaiser-wilhelm.at — händische Listenpflege, kein Newsletter-Dienst
   angebunden). CF7 umschließt Felder serienmäßig in <p>- bzw. <fieldset>-Tags
   mit Browser-Standardabständen — hier vollständig zurückgesetzt, damit
   E-Mail-Feld und Button optisch/größenmäßig exakt der alten, einzeiligen
   Handschrift entsprechen. Die Zustimmungs-Checkbox ([newsletter-consent])
   ist Teil desselben Formulars, wird aber NICHT im Footer angezeigt (dort
   soll sich nichts an Größe/Optik ändern), sondern eigenständig im
   Anmeldeprozess abgefragt: ein Dialog (#nf-modal, HTML in kwpbt_child_footer(),
   Skript in assets/js/kwpbt-child.js — seit 27.08.2026, vorher inline in
   functions.php) öffnet sich erst, wenn im Footer auf „Anmelden" geklickt
   wird, ohne dass die Zustimmung schon vorliegt. */
.newsletter-form{margin-top:16px;max-width:420px}
.newsletter-form .wpcf7,
.newsletter-form form{margin:0}
.newsletter-form fieldset{border:0;margin:0;padding:0}
.newsletter-form p{margin:0}
.newsletter-form .nf-row{display:flex;gap:0}
.newsletter-form .nf-row .wpcf7-form-control-wrap{flex:1;display:block}
.newsletter-form input[type="email"]{
  box-sizing:border-box;width:100%;display:block;
  background:transparent;border:1px solid rgba(255,255,255,.28);
  padding:13px 15px;color:#fff;font-family:var(--sans);font-size:.85rem;
}
.newsletter-form input::placeholder{color:#8d8375}
.newsletter-form input[type="submit"]{
  box-sizing:border-box;border:1px solid #fff;background:#fff;color:var(--ink);
  padding:0 22px;cursor:pointer;font-family:var(--sans);font-size:.7rem;
  letter-spacing:.2em;text-transform:uppercase;
}
.newsletter-form input[type="submit"]:hover{background:var(--accent);border-color:var(--accent);color:#fff}
.newsletter-form .wpcf7-spinner{display:none}
.newsletter-form .nf-consent{display:none}
.newsletter-form .wpcf7-response-output{display:none}
.newsletter-form .screen-reader-response{position:absolute;width:1px;height:1px;overflow:hidden}

/* Anmelde-Dialog für die Newsletter-Zustimmung (siehe Kommentar oben) */
.nf-modal{
  display:none;position:fixed;inset:0;z-index:300;align-items:center;justify-content:center;
  padding:20px;background:rgba(29,26,23,.72);
}
.nf-modal.open{display:flex}
.nf-modal-box{background:var(--paper);color:var(--ink);max-width:420px;width:100%;padding:36px 32px;position:relative}
.nf-modal-box .eyebrow{margin-bottom:.4rem}
.nf-modal-box h3{margin:0 0 16px;font-family:var(--serif);font-size:1.6rem;font-weight:400}
.nf-modal-close{
  position:absolute;top:10px;right:14px;background:none;border:0;font-size:1.6rem;
  line-height:1;cursor:pointer;color:var(--ink-soft);
}
.nf-modal-box label{
  display:flex;align-items:flex-start;gap:10px;font-size:.85rem;color:var(--ink-soft);
  cursor:pointer;margin:0 0 24px;
}
.nf-modal-box input[type="checkbox"]{margin-top:3px;flex-shrink:0}
.nf-modal-box .btn{width:100%;text-align:center}
.nf-modal-box .btn[disabled]{opacity:.5;cursor:default}

/* ==========================================================================
   GeneratePress-Integration
   GeneratePress erzeugt Header und Menü mit eigener Markup-Struktur
   (.site-header, .main-navigation, …) statt der Klassen aus dem statischen
   HTML-Prototyp. Hier werden die echten GeneratePress-Klassen mit denselben
   Design-Tokens gestylt. Selektoren nach GP-Standardmarkup; ggf.
   nachjustieren, sobald wir sehen, was der Server tatsächlich ausliefert.
   ========================================================================== */

/* Kopfbereich: sticky, papierfarben-transluzent, wie im Prototyp */
.site-header{
  position:sticky;top:0;z-index:60;
  background:rgba(251,248,243,.96);
  backdrop-filter:blur(8px);
  border-bottom:1px solid var(--line);
}
.site-header .inside-header{
  max-width:var(--max);margin:0 auto;padding:16px 39px; /* 28px + 3mm (11px) links/rechts */
}
/* Logo, Menü und Kopf-Werkzeuge in einer Zeile — wie im Prototyp. GP sollte
   das bei "nav-float-right" von selbst tun, tut es auf diesem Server aber
   nicht zuverlässig (gleiches Muster wie beim Mobil-Menü-Bug), deshalb
   erzwingen wir es direkt.
   03.09.2026, vierter Anlauf: Ursache des 31.08.-Problems war nicht die
   Schwellenzahl selbst, sondern dass EINE globale Schwelle zwei sehr
   unterschiedliche Bedarfe gleichzeitig bedienen sollte — Content-Seiten
   (Kopf-Werkzeuge nur "EN" + 2 Icons, ~94px) und Shop-Seiten (mit der
   textlastigen "Warenkorb (0)"-Box, 252px). Die 1360px-Schwelle vom 31.08.
   war zwar für Shop-Seiten korrekt berechnet, zwang aber ALLE Content-
   Seiten (brauchen nur ~1145px) unnötig früh aufs Mobil-Menü — u. a. bei
   jedem ganz normal maximierten 1366px-Laptop (echte innerWidth dort nur
   ~1356px, live nachgemessen, nicht die Bildschirmauflösung selbst).
   Statt die Schwelle wieder zu verschieben (verlagert das Problem nur
   zwischen Content- und Shop-Seiten hin und her), die eigentliche Ursache
   behoben: Warenkorb-Box zeigt jetzt Icon+Zahl statt Text (29px statt
   147px, siehe kwpbt_child_head_tools() in functions.php) — Shop-Seiten
   brauchen dadurch nur noch ~1185px (Nav 838px + Logo 103px + Kopf-
   Werkzeuge 134px + Lücke 32px + 2×39px Innenabstand), nur noch 40px mehr
   als Content-Seiten (1145px) statt vorher 158px. Eine einzige, moderate
   Schwelle mit Puffer reicht jetzt wieder für beide Fälle — kein eigener
   Header-Breitenzuschlag mehr nötig, var(--max) gilt wieder überall
   gleich. */
@media (min-width:1200px){
  .site-header .inside-header{
    display:flex !important;align-items:center;flex-wrap:nowrap;
    padding-top:22px;padding-bottom:22px;
  }
  .site-header .site-branding{flex-shrink:0}
  .site-header #site-navigation{flex:1;min-width:0}
  .site-header #site-navigation .inside-navigation{max-width:none;margin:0;padding-left:32px}
  .site-header #mobile-menu-control-wrapper{display:none !important}
  /* Menü-Padding zurücknehmen — die Luft kommt jetzt vom Header selbst
     (padding oben/unten), nicht mehr zusätzlich von jedem Link einzeln.
     NUR die oberste Ebene (> ul.menu > li > a) — ohne den direkten-Kind-
     Combinator traf diese Regel bisher ungewollt auch die Dropdown-Ebenen
     darunter und überschrieb dort mit höherer Spezifität (3 Klassen) deren
     eigenes, bewusst kleineres Padding, unabhängig von deren Regel-
     Reihenfolge im Stylesheet. Per document.styleSheets-Diagnose gefunden.
     29.08.2026: dank der höheren Schwelle (siehe oben) wieder auf ein
     angenehmes 20px zurückgesetzt (zwischenzeitlich 13px). 03.09.2026: auf
     Wunsch minimal auf 17px verringert (mehr Luft im Header), vorab als
     Browser-Vorschau gezeigt und erst nach Freigabe übernommen. */
  .site-header .main-navigation .main-nav > ul.menu > li > a{padding:6px 17px}
}

/* Logo / Site-Titel als "Brand" im Serif-Stil */
.site-header .main-title,
.site-header .main-title a{
  font-family:var(--serif);font-weight:400;line-height:1;
  font-size:1.5rem;letter-spacing:.06em;color:var(--ink);
}
.site-header .site-description{
  font-family:var(--sans);font-size:.6rem;letter-spacing:.34em;
  text-transform:uppercase;color:var(--accent);margin-top:6px;
}
.site-header .site-logo img{height:47px;width:auto}
@media (max-width:900px){.site-header .site-logo img{height:38px}}

/* Volle Breite: GP liefert standardmäßig eine rechte Sidebar-Spalte und
   begrenzt den Container — beides entfernen, damit unsere <section>-
   Hintergründe randlos über die volle Fensterbreite gehen (das .wrap
   innerhalb zentriert den eigentlichen Inhalt wieder auf var(--max)). */
#right-sidebar{display:none !important}
#primary{width:100% !important;float:none !important}
.site .container.grid-container,
.site-content .container{
  max-width:none !important;padding-left:0 !important;padding-right:0 !important;
}
/* Padding nur auf unseren eigenen, handgebauten Seiten entfernen — die
   bringen ihr eigenes .wrap mit und brauchen hier keinen zusätzlichen Rand.
   WooCommerce-Seiten (Shop-Kategorien, Produkte, Warenkorb, Kasse) haben
   kein eigenes .wrap und bekommen weiter unten stattdessen dieselben
   komfortablen Seitenränder wie der Rest der Website. */
body:not(.woocommerce-page) #primary .inside-article{padding:0 !important}
article .entry-content{margin:0}

/* WooCommerce-Seiten randlos-volle Breite (kein GP-Sidebar, siehe oben),
   aber mit denselben Seitenrändern wie überall sonst (.wrap: max. var(--max),
   28px Luft links/rechts) — sonst laufen Titel, Beschreibung und
   Produktraster bis an den Bildschirmrand. Betrifft Kategorie-Archive
   (/mode/ usw.) genauso wie einzelne Produktseiten, Warenkorb und Kasse. */
body.woocommerce-page #primary .inside-article{
  max-width:var(--max) !important;margin:0 auto !important;
  padding:0 28px !important;
}
@media (max-width:560px){
  body.woocommerce-page #primary .inside-article{padding:0 20px !important}
}
/* Abstand zwischen letztem Inhalt (Produktraster, Produktseite, Warenkorb …)
   und Footer — ohne das rückt der Footer direkt an das letzte Bild/den
   letzten Button heran. Explizit weiß statt der body-eigenen Cremefarbe
   (--paper), sonst entsteht ein sichtbar andersfarbener Streifen im neuen
   Abstand, da der Produktbereich selbst auf reinem Weiß läuft. */
body.woocommerce-page #primary{padding-top:38px;padding-bottom:38px;background:#fff}

/* Navigation */
.main-navigation{
  background:transparent;border-top:0;
}
.main-navigation .inside-navigation{
  max-width:var(--max);margin:0 auto;
  display:flex;align-items:center;justify-content:space-between;
}
.main-navigation .main-nav ul li a{
  font-family:var(--sans);font-size:.825rem;font-weight:400;
  /* 03.09.2026: von .2em auf .17em minimal verringert (Wunsch nach mehr
     Luft im Header bei den seither ohnehin knappen Desktop-Breiten) — vorab
     als reine Browser-Vorschau gezeigt (JS-Style-Injection, nichts live
     geändert) und erst nach Freigabe übernommen. */
  letter-spacing:.17em;text-transform:uppercase;color:var(--ink);
  padding:22px 16px;position:relative;
}
/* GeneratePress fügt bei Menüpunkten mit Untermenü automatisch einen
   eigenen SVG-Pfeil ein (.dropdown-menu-toggle) — ausgeblendet, das war das
   zweite, überflüssige Anzeiger-Symbol neben dem eigenen +/– unten. */
.main-navigation .dropdown-menu-toggle{display:none}
/* Aufklapp-Anzeiger „+", wie im Mock-up: schlichtes Zeichen bei jedem
   Menüpunkt mit Untermenü. */
#site-navigation .main-nav ul.menu li.menu-item-has-children > a::after{
  content:'+';margin-left:7px;font-size:.7rem;opacity:.55;
}
/* Wechsel zu „–" nur bei tatsächlich aufgeklappten Unterpunkten (dritte
   Ebene, z. B. „Tisch") — die oberste Ebene („Online Store") bleibt laut
   Mock-up immer bei „+" stehen, da sie nur ein einfaches Hover-Flyout ist,
   kein Akkordeon. Deshalb hier gezielt auf ul.sub-menu li beschränkt statt
   auf ul.menu li (das träfe auch die oberste Ebene). */
#site-navigation .main-nav ul.menu ul.sub-menu li.menu-item-has-children:hover > a::after{
  content:'\2013';
}
/* Kopf-Werkzeuge (EN/Suche, Warenkorb, Instagram/Facebook) — siehe
   functions.php kwpbt_child_head_tools(). Unterscheidet sich je nach
   Bereich (gegen beide Original-Seiten verifiziert, siehe Kommentar dort):
   Content-Seiten zeigen EN, der Online-Store-Bereich zeigt stattdessen eine
   Suche. Die beiden Social-Icons stehen laut kwp-badgastein.at im Menü
   direkt danach, nicht im Fließtext — reine Icon-Links ohne Beschriftung.
   position:relative, damit die Suchbox (.search-form-wrap) darunter
   andockt. */
.main-navigation .head-tools{
  position:relative;
  display:flex;align-items:center;gap:18px;flex-shrink:0;
  font-size:.72rem;letter-spacing:.18em;text-transform:uppercase;
}
/* Seit 03.09.2026 Icon+Zahl statt Text „Warenkorb (0)" (war 252px breit,
   zwang die Kopfzeile zu einer eigenen, überhöhten Umschalt-Schwelle, unter
   der alle Nicht-Shop-Seiten unnötig früh aufs Mobil-Menü umschalteten —
   siehe Technische-Learnings.md, live an echten Fensterbreiten nachgemessen,
   nicht per iframe-Trick geraten). */
.main-navigation .head-tools .cart{
  display:flex;align-items:center;gap:5px;color:var(--ink);border:0;padding:0;flex-shrink:0;
}
.main-navigation .head-tools .cart:hover{color:var(--accent)}
.main-navigation .head-tools .cart .cart-count{font-size:.72rem;letter-spacing:.05em}
.main-navigation .head-tools .social-icon{
  display:flex;color:var(--ink);flex-shrink:0;
}
.main-navigation .head-tools .social-icon:hover{color:var(--accent)}
.main-navigation .head-tools .search-toggle{
  display:flex;align-items:center;color:var(--ink);background:none;
  border:0;padding:0;cursor:pointer;flex-shrink:0;
}
.main-navigation .head-tools .search-toggle:hover{color:var(--accent)}
/* Sprachumschalter (14.09.2026, DE/EN/IT-Vorbereitung): zwei kleine,
   übereinanderstehende Links statt einem einzelnen Textlink — zeigt immer
   die zwei Sprachen, auf denen man gerade NICHT ist. Eigenes Element statt
   eines Dropdowns (bewusste Entscheidung, siehe IT-Version-Vorbereitung.md).
   Padding statt Zeilenabstand für die Touch-Fläche am Handy — offener Punkt
   aus Rolands Vorprüfung: bei zwei kleinen Zeilen sonst zu knapp zum Treffen. */
.main-navigation .head-tools .lang-switch{
  display:flex;flex-direction:column;flex-shrink:0;
}
.main-navigation .head-tools .lang-switch .lang-link{
  color:var(--ink);padding:5px 2px;line-height:1;
}
.main-navigation .head-tools .lang-switch .lang-link:hover{color:var(--accent)}
/* Suchbox: standardmäßig ausgeblendet, per JS (assets/js/kwpbt-child.js)
   beim Klick auf die Lupe eingeblendet — .search-form-wrap ist WooCommerce-
   Markup (get_product_search_form()), hier nur umgestylt. */
.search-form-wrap{
  display:none;position:absolute;top:100%;right:0;margin-top:14px;
  background:var(--paper);border:1px solid var(--line);
  box-shadow:0 18px 40px rgba(29,26,23,.09);padding:16px;z-index:60;min-width:280px;
}
.search-form-wrap.is-open{display:block}
.search-form-wrap .woocommerce-product-search{display:flex;gap:8px}
.search-form-wrap .woocommerce-product-search label{display:none}
.search-form-wrap input[type="search"]{
  flex:1;border:1px solid var(--line);padding:9px 12px;
  font-size:.85rem;font-family:var(--sans);letter-spacing:normal;text-transform:none;
}
.search-form-wrap button[type="submit"]{
  border:1px solid var(--ink);background:var(--ink);color:var(--paper);
  padding:9px 16px;font-size:.7rem;letter-spacing:.12em;text-transform:uppercase;cursor:pointer;
}
.main-navigation .main-nav ul li a:hover,
.main-navigation .main-nav ul li.current-menu-item > a{
  color:var(--accent);background:transparent;
}
/* Untermenüs — list-style:none, sonst zeigt der Browser standardmäßig Ringe
   (Ebene 2) bzw. Vierecke (Ebene 3) vor jedem Punkt. */
.main-navigation ul ul{
  background:var(--paper);border:1px solid var(--line);
  box-shadow:0 18px 40px rgba(29,26,23,.09);
  list-style:none;margin:0;padding:0;
}
/* .main-nav ergänzt, weil GeneratePress selbst eine Regel exakt dieser
   Spezifität mitbringt (.main-navigation .main-nav ul ul li a, main.min.css)
   — ohne .main-nav verlor unsere Regel trotz späterer Ladereihenfolge nie
   sichtbar gegen GPs 14px/10px 20px (per document.styleSheets bestätigt:
   „ul ul li a" ohne .main-nav hatte nur 1 Klasse, GPs Regel 2 — GP gewann
   dadurch immer, unabhängig von der Regel-Reihenfolge im Stylesheet). */
.main-navigation .main-nav ul ul li a{
  font-size:.74rem;letter-spacing:.12em;color:var(--ink-soft);
  padding:6px 18px;line-height:1.2;border-bottom:0;
}
.main-navigation .main-nav ul ul li a:hover{color:var(--accent);background:var(--paper-2)}

/* Sichtbarkeit Desktop/Mobil explizit erzwingen — GP liefert hier auf diesem
   Server auch ohne unser CSS schon den mobilen Zustand aus (Ursache unklar,
   evtl. Customizer-Breakpoint-Wert). Deshalb feste, unabhängige Regeln statt
   uns auf GPs eigene Umschaltung zu verlassen. Schwelle 03.09.2026 von
   1360px auf 1200px gesenkt (Gegenstück muss bei .site-header
   .inside-header oben identisch mitgezogen werden), siehe ausführliche
   Begründung weiter oben bei .site-header .inside-header. Nochmal
   03.09.2026 auf 850px erweitert (min-width statt fest 1200px), weil die
   Hover-/Aufklapp-Logik für Untermenüs ("Online Store" → "Tisch" usw.)
   inhaltlich unabhängig davon ist, ob die Menüzeile ein- oder zweizeilig
   ist — betrifft ab jetzt auch das neue zweizeilige Zwischen-Menü
   (850–1199px, eigener Block weiter unten NACH diesem hier, damit dessen
   display:grid auf ul.menu den flex-wrap hier überschreiben kann —
   Ladereihenfolge bei gleicher Spezifität entscheidet). */
@media (min-width:850px){
  #site-navigation .menu-toggle,
  #mobile-menu-control-wrapper .menu-toggle{display:none !important}
  #site-navigation .main-nav{display:block !important}
  #site-navigation .main-nav > ul.menu{
    display:flex !important;flex-wrap:wrap;align-items:center;
    list-style:none;margin:0;padding:0;
  }
  #site-navigation .main-nav > ul.menu > li{position:relative}
  /* Aufklappen/Zuklappen über opacity+visibility mit VERZÖGERTEM
     Zuklappen statt display:none/block, damit ein kurzer :hover-Aussetzer
     beim Wandern der Maus über die (im Dokumentfluss aufklappende) dritte
     Ebene nicht sofort das ganze Menü schließt. Aufklappen bleibt sofort.
     Ausführliche Herleitung: Technische-Learnings.md, „Menü bricht nach
     Tisch ab". */
  #site-navigation .main-nav ul.menu ul.sub-menu{
    position:absolute;top:100%;left:0;min-width:230px;z-index:50;
    visibility:hidden;opacity:0;pointer-events:none;
    transition:opacity .15s ease, visibility 0s linear .25s;
  }
  #site-navigation .main-nav ul.menu li:hover > ul.sub-menu,
  #site-navigation .main-nav ul.menu li.sfHover > ul.sub-menu{
    visibility:visible;opacity:1;pointer-events:auto;transition-delay:0s;
  }
  /* .js-menu-open erzwingt Sichtbarkeit UND Höhe unabhängig vom rohen
     :hover-Status — gesetzt/entfernt per JS (siehe assets/js/kwpbt-child.js)
     mit demselben 300ms-Timer, der auch die dritte Ebene zuklappt. Zwei
     Gründe, beide in Technische-Learnings.md ausführlich hergeleitet:
     1. Reines CSS-:hover mit eigener 0,25s-transition-delay lief unabhängig
        vom JS-Timer der dritten Ebene und konnte mit diesem auseinanderlaufen.
     2. GeneratePress schaltet height:auto/overflow:visible NUR bei echtem
        :hover/.sfHover frei (main.min.css) — unabhängig von unserer
        visibility/opacity-Logik. Ohne dieses Override fiel GP bei kurz
        verlorenem :hover auf height:0 zurück und der Inhalt klappte optisch
        weg, obwohl visibility/opacity längst „offen" meldeten. */
  #site-navigation .main-nav ul.menu li.js-menu-open > ul.sub-menu{
    visibility:visible!important;opacity:1!important;pointer-events:auto!important;
    height:auto!important;overflow:visible!important;
  }
  /* Dritte Menü-Ebene (z. B. „Tisch" → Unterkategorien wie Geschirr,
     Servietten, …): NICHT als Flyout, sondern als eingerückte Liste direkt
     unter dem übergeordneten Punkt, wie im abgestimmten Mock-up (Akkordeon-
     Optik). Ein Flyout würde ohnehin falsch verankern: die zweite Ebene
     (ul.sub-menu) ist selbst schon position:absolute und damit der nächste
     positionierte Vorfahre der dritten Ebene, statt des „Tisch"-Punkts
     selbst — die Regel oben (ul.menu ul.sub-menu) träfe sonst beide Ebenen
     gleich und die dritte Ebene würde unterhalb der GESAMTEN zweiten Ebene
     aufklappen (Bug: Unterkategorien erschienen unter „Sale" statt unter
     „Tisch"). Deshalb hier gezielt zurück auf position:static. */
  #site-navigation .main-nav ul.menu ul.sub-menu ul.sub-menu{
    /* position:relative statt :static — verankert die senkrechte
       Führungslinie (::before weiter unten, position:absolute) an dieser
       Ebene selbst. War zuvor in einer zweiten, separaten Regel mit
       demselben Selektor nachgereicht (redundant, am 19.08.2026
       zusammengeführt, siehe Code-Review); Grundverhalten unverändert. */
    position:relative;display:none;float:none;
    min-width:0;width:100%;
    border:0;box-shadow:none;
    background:transparent;margin:0;padding:0;
    /* Erbt sonst opacity:0/visibility:hidden von der Ebene-2-Regel oben,
       bräuchte das hier aber nicht (Sichtbarkeit läuft rein über
       display:none/block). height/overflow ausdrücklich mit erzwingen —
       gleicher Grund wie bei .js-menu-open weiter oben: GeneratePress gibt
       height:auto nur bei echtem :hover/.sfHover auf dem ELTERN-<li> frei,
       was unser Akkordeon (offen per JS/inline display, auch bei Maus auf
       einem Geschwister-Punkt) nicht garantiert. Per ID-Selektor ohnehin
       spezifischer als GPs Regel, !important hier nur zur Robustheit. */
    visibility:visible;opacity:1;pointer-events:auto;transition:none;
    height:auto!important;overflow:visible!important;
  }
  /* float:none: GeneratePress vererbt an Untermenüs standardmäßig
     float:left (main.min.css). Ein floatendes Element trägt nicht zur
     Höhe seines Eltern-<li> bei, wodurch der nachfolgende Geschwister-
     Punkt ("Home Inspo") textuell dem Float auswich und dadurch künstlich
     aufgebläht wurde — sah wie ein Verschmelzen/Abbrechen des Menüs aus.
     Details: Technische-Learnings.md, „float:left, nicht Timing". */
  /* Kein CSS-:hover mehr für das Auf-/Zuklappen dieser Ebene — übernimmt
     jetzt assets/js/kwpbt-child.js per JS mit Verzögerung beim Zuklappen.
     Reines CSS kann das Zuklappen nicht verzögern, was bei dieser im
     Dokumentfluss liegenden Ebene zu abrupten Layout-Sprüngen unter der
     Maus führte. */
  #site-navigation .main-nav ul.menu ul.sub-menu ul.sub-menu li a{
    padding-left:34px;font-size:.66rem;
  }
  /* Senkrechter Führungsstrich links neben den eingerückten Unterpunkten,
     wie im Mock-up (Akkordeon-Optik) — kein Trennstrich zwischen „Tisch"
     und den Unterpunkten, sondern eine durchgehende vertikale Linie über
     die ganze Liste. Ankert an position:relative aus der Regel oben. */
  #site-navigation .main-nav ul.menu ul.sub-menu ul.sub-menu::before{
    content:'';position:absolute;left:20px;top:0;bottom:0;width:1px;
    background:var(--accent);opacity:.45;
  }
}

/* Zweizeiliges Zwischen-Menü, 850–1199px (03.09.2026, auf Wunsch als
   bewusst gestalteter Zwischenschritt statt direktem Sprung Desktop →
   Hamburger). Grund: Bei 1196px real gemessen (Safari, Nutzer-Screenshot)
   lag das Fenster nur 4px unter der 1200px-Schwelle — eine ganz normale
   Alltagsbreite, kein Sonderfall. Ein erster Testlauf ohne diesen Block
   (nur die Hamburger-Schwelle abgesenkt) sah kaputt aus (Logo/Kopf-
   Werkzeuge blieben mittig zur ganzen, jetzt höheren Zeile stehen, kein
   fester Umbruch) — genau das war schon einmal ein gemeldeter Bug
   (31.08.2026). Deshalb hier explizit gestaltet: feste 3+3-Aufteilung per
   CSS-Grid (nicht dem Zufall von flex-wrap überlassen — mit Flexbox hätte
   die genaue Aufteilung von der verfügbaren Breite abgehangen und wäre
   nicht vorhersagbar 3+3 gewesen), Logo/Menü/Kopf-Werkzeuge oben
   ausgerichtet (align-items:flex-start statt center) statt vertikal zur
   vollen Höhe zentriert. Steht bewusst NACH dem Block oben (gleiche
   Spezifität bei ul.menu{display:...}, Ladereihenfolge entscheidet: grid
   soll den dortigen flex-wrap überschreiben). Live an den tatsächlichen
   Kachel-/Textbreiten nachgemessen (nicht geraten): breiteste Zeile
   (Concept Store + Tagesbar + Online Store) 470px inkl. Lücken; untere
   Grenze 850px hat auf Shop-Seiten (mit Warenkorb-Icon, dort am
   knappsten) noch ca. 30px Luft. Vorab als Vorschau gezeigt (zunächst nur
   im isolierten Browser-Werkzeug, auf Nutzerwunsch dann zusätzlich live
   auf staging.kwpbeautifulthings.at, weil der Nutzer kein Chrome
   installiert hat und die erste Vorschau so nicht selbst sehen konnte). */
@media (min-width:850px) and (max-width:1199px){
  .site-header .inside-header{
    display:flex !important;flex-wrap:nowrap;
    align-items:flex-start;
    padding-top:20px;padding-bottom:20px;
  }
  .site-header .site-branding{flex-shrink:0}
  .site-header #site-navigation{flex:1;min-width:0}
  .site-header #site-navigation .inside-navigation{
    max-width:none;margin:0;padding-left:32px;
    align-items:flex-start;
  }
  /* 03.09.2026: Logo bleibt in dieser ganzen Zone bei voller Höhe (47px) —
     ohne diese Zeile würde die separate @media(max-width:900px)-Regel
     weiter oben (aus einer Zeit vor diesem Zwischen-Menü) das Logo
     zwischen 850–900px auf 38px verkleinern, uneinheitlich zum Rest der
     Zone. Als feste Bezugsgröße gewählt, weil die zweizeilige Menühöhe
     jetzt gezielt darauf abgestimmt ist (siehe Padding-Rechnung unten). */
  .site-header .site-logo img{height:47px}
  /* 03.09.2026: vertikales Padding mehrfach angepasst (6px → 4px → 2px →
     0px „zu eng" → jetzt 4px). Rechnerisch auf die Logo-Höhe (47px)
     abgestimmt, damit das zweizeilige Menü oben und bündig mit dem Logo
     abschließt: 2 Zeilen à (Zeilenhöhe 15,84px bei line-height:1.2 + 2×4px
     Padding) = 2×23,84 ≈ 48px, praktisch deckungsgleich mit den 47px
     Logo-Höhe. */
  .site-header .main-navigation .main-nav > ul.menu > li > a{
    padding:4px 17px;line-height:1.2;
  }
  /* Feste 3 Spalten statt flex-wrap — garantiert immer 3+3 in der
     bestehenden Menü-Reihenfolge, unabhängig von der genauen Fensterbreite
     innerhalb dieser Zone. */
  #site-navigation .main-nav > ul.menu{
    display:grid !important;
    grid-template-columns:repeat(3,auto);
    column-gap:4px;row-gap:0;justify-content:start;
  }
  /* Kopf-Werkzeuge optisch auf Höhe der ersten Menüzeile bringen (deren
     Link-Padding oben jetzt wieder 4px beträgt) statt an der
     Fenster-Oberkante. */
  .main-navigation .head-tools{padding-top:4px}
}

@media (max-width:849px){
  /* Schwelle 29.08.2026 von 768px auf 1149px angehoben, 31.08.2026 wegen
     eines Rechenfehlers bei den Kopf-Werkzeugen (Warenkorb-Box) auf 1359px
     verschoben, 03.09.2026 nach Behebung der eigentlichen Ursache
     (Warenkorb-Box jetzt Icon+Zahl statt Text) auf 1199px gesenkt, dann
     nochmal auf 849px gesenkt, weil dazwischen (850–1199px) jetzt ein
     eigenes, gestaltetes zweizeiliges Zwischen-Menü greift (Gegenstück zu
     min-width:850px/max-width:1199px oben, ausführliche Begründung dort) —
     erst darunter (kleinere Tablets, schmale Fenster) kommt dieses Menü
     statt einer zu eng gequetschten Zeile. Nur
     EIN Menü-Knopf auf Mobil: der Icon-Button im Header
     (#mobile-menu-control-wrapper). Der zweite, identisch funktionierende
     Text-Button "☰ MENÜ" innerhalb von #site-navigation selbst wird
     ausgeblendet — beide steuern über aria-controls ohnehin dasselbe Menü
     (GPs eigenes navigation.js), es brauchte also nie zwei sichtbare
     Auslöser. Vorher standen hier fälschlich beide auf "sichtbar". */
  /* GeneratePress selbst blendet #mobile-menu-control-wrapper über sein
     eigenes main.min.css bereits ab ca. 769px aus (eigener, fest verdrahteter
     Breakpoint, unabhängig von unserer eigenen Schwelle) — live per iframe-
     Test in mehreren Breiten gefunden: Zwischen 769px und unserer eigenen
     Schwelle blieb der Menü-Knopf dadurch unsichtbar (Breite/Höhe 0), obwohl
     unsere eigene .menu-toggle-Regel direkt darunter korrekt auf "sichtbar"
     stand. Hier zusätzlich den WRAPPER selbst erzwingen (flex, wie GPs
     eigener Wert unterhalb von 769px), sonst bleibt genau diese Lücke
     bestehen. */
  #mobile-menu-control-wrapper{display:flex !important}
  #site-navigation .menu-toggle{display:none !important}
  #mobile-menu-control-wrapper .menu-toggle{display:inline-block !important}
  #site-navigation .main-nav{display:none !important}
  #site-navigation.toggled .main-nav,
  #site-navigation .main-nav.toggled{display:block !important}
  #site-navigation .main-nav > ul.menu{list-style:none;margin:0;padding:0}
  #site-navigation .main-nav ul.menu ul.sub-menu{list-style:none;margin:0;padding:0 0 0 14px}

  /* Online-Store-Untermenü ließ sich per Tap nicht öffnen: Das sichtbare
     "+"-Zeichen (oben, ::after am Link) ist rein dekorativ und hat keine
     Klick-Logik — auf Mobilgeräten gibt es kein :hover, also öffnete sich
     nie etwas, ein Tap führte nur den Link selbst aus. Fix: GPs eigenen,
     tatsächlich funktionierenden Aufklapp-Button (.dropdown-menu-toggle,
     weiter oben global ausgeblendet) hier gezielt nur für Mobil wieder
     sichtbar machen — inkl. seines eigenen Klick-Handlers (menu.min.js),
     der beim Klick li.sfHover sowie ul.sub-menu.toggled-on umschaltet.
     Eigenes SVG-Pfeilsymbol durch dasselbe "+"/"–"-Zeichen wie überall
     sonst ersetzt, das alte dekorative Zeichen am Linktext dafür hier
     ausgeblendet (sonst zwei Anzeiger nebeneinander). */
  #site-navigation .main-nav ul.menu li.menu-item-has-children > a::after{content:none}
  #site-navigation .main-nav .dropdown-menu-toggle{
    display:inline-flex !important;align-items:center;justify-content:center;
    min-width:32px;min-height:32px;margin-left:2px;vertical-align:middle;
  }
  #site-navigation .main-nav .dropdown-menu-toggle svg{display:none}
  #site-navigation .main-nav .dropdown-menu-toggle::after{
    content:'+';font-size:.7rem;opacity:.55;
  }
  #site-navigation .main-nav li.sfHover > a .dropdown-menu-toggle::after{content:'\2013'}
  #site-navigation .main-nav li.sfHover > ul.sub-menu{display:block !important}

  /* Zeilenabstand im aufgeklappten Mobil-Menü deutlich zu groß: Die
     Basis-Regel weiter oben (.main-navigation .main-nav ul li a) bringt
     padding:22px 16px mit, dazu kommt line-height:60px direkt von
     GeneratePress selbst (main.min.css, dort für die einzeilige
     Desktop-Leiste gedacht — dort aber ohnehin per eigener Regel oben in
     @media (min-width:769px) auf padding:6px 16px reduziert). Für Mobil
     gab es bislang keine entsprechende Reduzierung, macht zusammen mit den
     60px Zeilenhöhe ca. 104px pro Menüpunkt. Hier — genau wie beim Desktop-
     Gegenstück — ausschließlich für die oberste Ebene im mobilen Menü
     zurückgesetzt, angelehnt an das bereits vorhandene, kompaktere Padding
     der Untermenüpunkte (padding:6px 18px). Betrifft NUR diesen
     @media(max-width:768px)-Block, Desktop bleibt unberührt. */
  #site-navigation .main-nav > ul.menu > li > a{
    padding:11px 16px;line-height:1.3;
  }
}

/* Mobiles Menü / Burger */
.menu-toggle{
  background:transparent;border:1px solid var(--ink);color:var(--ink);
  font-family:var(--sans);font-size:.72rem;letter-spacing:.14em;text-transform:uppercase;
}
.menu-toggle:hover{background:var(--ink);color:var(--paper)}
.main-navigation.toggled .main-nav,
.main-navigation .main-nav.toggled{background:var(--paper)}

/* Seiten (nicht Beiträge) bauen ihre eigene Überschrift in den Hero-Bereich
   ein (Custom-HTML-Inhalt) — der automatische WordPress-Seitentitel darüber
   entfällt deshalb. */
.page .entry-header{display:none}

/* ==========================================================================
   WooCommerce
   Shop-Kern (Warenkorb, Kasse, Zahlungen) bleibt technisch unangetastet —
   ausschließlich CSS auf WooCommerce-Standardmarkup, keine Template-
   Overrides. Design-Tokens von oben (var(--ink), var(--accent) usw.)
   durchgängig wiederverwendet, damit Shop und übrige Seiten wie aus einem
   Guss wirken. Seitenränder für alle WooCommerce-Seiten bereits weiter oben
   gelöst (body.woocommerce-page #primary .inside-article).
   ========================================================================== */

/* ---------- Gemeinsam: Breadcrumb, Seitentitel, Meldungen, Buttons ---------- */
.woocommerce-breadcrumb{
  font-size:.76rem;letter-spacing:.08em;text-transform:uppercase;
  color:var(--ink-soft);margin:0;
}
.woocommerce-breadcrumb a{border-bottom:1px solid var(--line)}
.woocommerce-breadcrumb a:hover{color:var(--accent);border-bottom-color:var(--accent)}

.woocommerce-products-header__title.page-title,
.product_title.entry-title{
  font-family:var(--serif);font-weight:400;line-height:1.05;
  font-size:clamp(2.4rem,5vw,3.6rem);margin:14px 0 18px;
}
.term-description{color:var(--ink-soft);max-width:64ch;margin-bottom:34px}

/* Alle WooCommerce-Standardbuttons (Ausführung wählen, In den Warenkorb,
   Warenkorb aktualisieren, Zur Kasse, Bestellung aufgeben …) auf denselben
   Stil wie .btn.solid im Rest der Seite. */
/* !important auf Farbe/Rahmen: WooCommerces eigenes woocommerce.css bringt
   dieselbe Selektor-Spezifität (nur in :where() gewrappt, siehe
   Technische-Learnings.md) — bei Ladereihenfolge nach unserem Child-Theme-
   CSS gewinnt sonst WooCommerces Standard-Lila statt unserer Farben. */
.woocommerce a.button,
.woocommerce button.button,
.woocommerce input.button,
.woocommerce #respond input#submit,
.woocommerce-page a.button,
.woocommerce-page button.button,
.woocommerce-page input.button{
  display:inline-block;font-family:var(--sans);font-weight:400;
  letter-spacing:.18em;text-transform:uppercase;
  border-radius:0;
  transition:all .25s ease;cursor:pointer;box-shadow:none;
  background:var(--ink) !important;border:1px solid var(--ink) !important;color:var(--paper) !important;
  /* WooCommerce trifft denselben Button mit derselben Spezifität
     (.woocommerce:where(...) button.button — :where() zählt 0, macht die
     Selektoren de facto gleich stark wie unsere). Ohne !important
     entscheidet dann nur die Ladereihenfolge, wer bei padding/font-size
     gewinnt — WooCommerce schrumpfte den Button dadurch auf sein eigenes
     0.618em/1em statt unserer großzügigen Maße aus der Vorlage. */
  font-size:.76rem !important;
  padding:14px 28px !important;
}
.woocommerce a.button:hover,
.woocommerce button.button:hover,
.woocommerce input.button:hover,
.woocommerce #respond input#submit:hover{
  background:var(--accent) !important;border-color:var(--accent) !important;color:#fff !important;
}
.woocommerce a.button.alt,
.woocommerce button.button.alt,
.woocommerce input.button.alt,
.woocommerce #payment #place_order{
  background:var(--accent) !important;border-color:var(--accent) !important;color:#fff !important;
}
.woocommerce a.button.alt:hover,
.woocommerce button.button.alt:hover,
.woocommerce input.button.alt:hover,
.woocommerce #payment #place_order:hover{
  background:var(--accent-dark) !important;border-color:var(--accent-dark) !important;
}
/* "Bitte erst Option wählen"-Zustand bei Varianten: bleibt dunkel wie der
   normale Button (statt ausgewaschen/kaputt auszusehen), nur der Text in
   Akzentfarbe als dezenter Hinweis, dass er noch nicht aktiv ist.
   WooCommerce trifft mit .button.alt.disabled (kombiniert, in einer
   Regel) genau denselben Button und lädt nach unserem Child-Theme-CSS —
   bei gleicher Spezifität gewinnt sonst WCs eigene .alt-Hintergrundfarbe.
   Deshalb hier zusätzlich dieselbe kombinierte Klassenkette. */
.woocommerce a.button.disabled,
.woocommerce a.button.disabled:hover,
.woocommerce a.button.alt.disabled,
.woocommerce a.button.alt.disabled:hover,
.woocommerce button.button.disabled,
.woocommerce button.button.disabled:hover,
.woocommerce button.button.alt.disabled,
.woocommerce button.button.alt.disabled:hover{
  background:var(--ink) !important;border-color:var(--ink) !important;color:var(--accent) !important;
  cursor:not-allowed;
  /* WooCommerce setzt hier zusätzlich opacity:.5 (eigene .disabled-Regel,
     unabhängig von Hintergrund-/Textfarbe) — machte den sonst korrekt
     dunklen Button trotzdem blass/ausgewaschen. */
  opacity:1 !important;
  /* Der Button erbt transition:all .25s ease (Basis-Button-Regel). Wenn die
     disabled-Klasse direkt beim Seitenaufbau gesetzt wird (WooCommerce-JS),
     kann diese Transition "hängen bleiben" (nie fertig laufen, v.a. wenn
     der Tab beim Laden nicht sichtbar/aktiv ist) — der Button zeigt dann
     dauerhaft die alte, falsche Farbe (Akzent statt Ink), bestätigt via
     getAnimations(). Fix: keine Transition für den disabled-Zustand,
     dann gibt es nichts, das hängen bleiben kann. */
  transition:none !important;
}
.woocommerce a.button.loading,
.woocommerce button.button.loading{opacity:.6}

/* Preisdarstellung überall einheitlich */
.woocommerce .price,
.woocommerce-Price-amount{
  font-family:var(--serif);color:var(--accent-dark);font-size:1.05em;
}
.woocommerce del .woocommerce-Price-amount{color:var(--ink-soft);opacity:.6}
.woocommerce ins{background:none;text-decoration:none}
.woocommerce ins .woocommerce-Price-amount{color:var(--accent)}

/* Sale-/Ausverkauft-Fähnchen */
.woocommerce span.onsale{
  position:absolute;top:14px;left:14px;z-index:3;
  background:var(--ink);color:var(--paper);border-radius:0;
  font-family:var(--sans);font-size:.66rem;letter-spacing:.14em;text-transform:uppercase;
  min-height:0;min-width:0;line-height:1;padding:7px 11px;
}

/* Info-/Fehlermeldungen (leerer Warenkorb, Gutschein ungültig …) */
.woocommerce-message,
.woocommerce-info,
.woocommerce-error,
.woocommerce-noreviews,
p.no-comments{
  border:1px solid var(--line);border-top:3px solid var(--accent);
  background:var(--paper-2);color:var(--ink);
  padding:18px 22px;font-size:.94rem;list-style:none;
}
.woocommerce-error{border-top-color:var(--danger)}
.woocommerce-message .button,
.woocommerce-info .button{float:none;display:inline-block;margin-top:10px}
/* WooCommerce setzt vor diesen Meldungen per ::before ein eigenes Icon aus
   seiner "WooCommerce"-Iconschrift (grüner Haken bei Erfolg, Kreuz/Info
   bei Fehler/Hinweis) — passt farblich nicht zur eigenen Palette und wird
   in der abgestimmten Vorlage nicht verwendet. */
.woocommerce-message::before,
.woocommerce-info::before,
.woocommerce-error::before{display:none}

/* Formularfelder (Kasse, Gutschein, Bewertung …) im selben Stil wie das
   Kontaktformular (.wpcf7 weiter oben). */
.woocommerce form .form-row input.input-text,
.woocommerce form .form-row textarea,
.woocommerce form .form-row select,
.woocommerce table.shop_table td select,
.woocommerce #order_comments,
.select2-container .select2-selection--single{
  border:1px solid var(--line) !important;border-radius:0 !important;
  background:#fff;font-family:var(--sans);font-size:.95rem;color:var(--ink);
  padding:12px 14px !important;height:auto !important;box-shadow:none !important;
}
.woocommerce form .form-row label{
  font-size:.8rem;color:var(--ink-soft);letter-spacing:.02em;
}
.woocommerce form .form-row .required{color:var(--accent);text-decoration:none}
.select2-container--default .select2-selection--single .select2-selection__rendered{
  line-height:1.9;color:var(--ink);
}
.select2-container--default .select2-selection--single .select2-selection__arrow{height:100%}

/* ---------- Shop-Archiv (Kategorieseiten) ---------- */
.woocommerce-result-count,
.woocommerce-ordering{
  font-size:.82rem;color:var(--ink-soft);margin:0 0 34px;
}
.woocommerce-ordering select{
  border:1px solid var(--line);background:#fff;padding:8px 12px;
  font-family:var(--sans);font-size:.8rem;color:var(--ink);
}

.woocommerce ul.products{
  display:grid !important;grid-template-columns:repeat(4,1fr);gap:38px 30px;
  list-style:none;margin:0;padding:0;
}
/* WooCommerce hängt an ul.products einen alten Float-Clearfix
   (::before{content:" ";display:table}) — ein Relikt aus der Zeit vor
   CSS Grid, als Produkte per float:left nebeneinander standen. In einem
   Grid-Container wird dieses (leere, aber nicht display:none) Pseudo-
   Element selbst zum ERSTEN Rasterelement und verschiebt dadurch jedes
   echte Produkt um eine Spalte nach rechts — sichtbar als leere erste
   Spalte in jeder Zeile. Braucht kein Clearfix mehr (Grid floatet nicht),
   deshalb hier deaktiviert. */
.woocommerce ul.products::before,
.woocommerce ul.products::after{content:none !important;display:none !important}
.woocommerce ul.products li.product{
  width:auto !important;margin:0 !important;float:none !important;text-align:left;
}
.woocommerce ul.products li.product a img{
  width:100%;aspect-ratio:1/1;object-fit:cover;margin-bottom:10px;
  transition:opacity .25s;
}
.woocommerce ul.products li.product:hover a img{opacity:.85}
.woocommerce ul.products li.product .woocommerce-loop-product__title{
  font-family:var(--sans);font-size:.82rem;font-weight:400;
  letter-spacing:.12em;text-transform:uppercase;color:var(--ink);
  margin:0 0 4px;line-height:1.4;
}
.woocommerce ul.products li.product .price{display:block;margin-bottom:8px}
/* Box immer genau so breit wie das Bild darüber — WooCommerce macht den
   Button standardmäßig inline-block mit automatischer, textabhängiger
   Breite ("In den Warenkorb" vs. "Ausführung wählen" fallen unterschiedlich
   breit aus), dadurch wirkte er mal schmäler, mal breiter als das Bild. */
.woocommerce ul.products li.product .button{
  display:block;width:100%;box-sizing:border-box;margin-top:0;
  padding:11px 22px;font-size:.7rem;text-align:center;
}
.woocommerce ul.products li.product .star-rating{display:none}

/* Stand ohne Abstand direkt unter dem ersten Produkt und links statt
   mittig — eigener Absatz mit Innenabstand oben und zentriert statt am
   ul.products-Raster zu kleben. */
.woocommerce nav.woocommerce-pagination{
  margin-top:48px;
}
.woocommerce nav.woocommerce-pagination ul{
  border:0;display:flex;justify-content:center;gap:6px;
}
.woocommerce nav.woocommerce-pagination ul li{border:0}
.woocommerce nav.woocommerce-pagination ul li a,
.woocommerce nav.woocommerce-pagination ul li span{
  border:1px solid var(--line);color:var(--ink);padding:9px 15px;
  font-family:var(--sans);font-size:.8rem;
}
.woocommerce nav.woocommerce-pagination ul li a:hover,
.woocommerce nav.woocommerce-pagination ul li span.current{
  background:var(--ink);color:var(--paper);border-color:var(--ink);
}

/* ---------- Einzelnes Produkt ---------- */
.woocommerce div.product div.images{margin-bottom:0}
.woocommerce div.product div.images img{border-radius:0}
.woocommerce div.product .woocommerce-product-gallery__trigger{
  background:var(--paper);border:1px solid var(--line);border-radius:0;
}
.woocommerce div.product div.summary{padding-left:8px}
.woocommerce div.product .product_title{margin-top:0}
.woocommerce div.product p.price,
.woocommerce div.product span.price{
  font-size:1.6rem;margin-bottom:22px;display:block;
}
.woocommerce div.product .woocommerce-product-details__short-description{
  color:var(--ink-soft);margin-bottom:26px;
}
.woocommerce div.product .woocommerce-product-details__short-description ul{
  padding-left:1.2em;
}
.woocommerce div.product form.cart{
  display:flex;flex-wrap:wrap;align-items:flex-start;gap:8px;margin-bottom:28px;
}
/* WooCommerce baut die Attribut-Auswahl als <table><tr><th class="label">
   Auswahl</th><td class="value"><select>...</select></td></tr></table> —
   Label und Select sitzen also per Tabellen-Layout NEBENEINANDER in einer
   Zeile. Dadurch stand der Select nicht linksbündig mit Mengenfeld/Button
   darunter, sondern um die Breite der Label-Spalte nach rechts eingerückt.
   Fix: Tabelle/Zeilen/Zellen komplett auf display:block umstellen, damit
   das Label über dem Select steht (wie in der abgestimmten Vorlage) statt
   daneben — beide beginnen dann an derselben linken Kante. */
.woocommerce div.product form.cart .variations,
.woocommerce div.product form.cart .variations tbody,
.woocommerce div.product form.cart .variations tr{
  display:block;width:100%;
}
.woocommerce div.product form.cart .variations{margin-bottom:0}
.woocommerce div.product form.cart .variations th.label,
.woocommerce div.product form.cart .variations td.label,
.woocommerce div.product form.cart .variations td.value{
  display:block;width:auto;
}
/* WooCommerce nutzt hier <th class="label">, nicht <td> — ohne dieses
   Selektor-Ziel fiel die Zelle auf den fetten Browser-Standard für <th>
   zurück (sah wie eine große, fette Überschrift statt eines schlichten
   Formular-Labels aus). */
.woocommerce div.product form.cart .variations th.label,
.woocommerce div.product form.cart .variations td.label{
  font-family:var(--sans);font-size:.95rem;font-weight:500;text-align:left;
  color:var(--ink);padding-right:14px;margin-bottom:8px;
}
/* Das Attribut "Auswahl" (globales WooCommerce-Attribut pa_selection, auf
   fast allen Produkten vorhanden) zeigt sein eigenes Label nicht mehr an —
   auf Kundenwunsch global entfernt. Gezielt nur dieses eine Attribut per
   :has() auf die zugehörige Select-ID, damit andere Attribut-Labels (z. B.
   "Größe" bei Ringen) unverändert sichtbar bleiben. */
.woocommerce div.product form.cart .variations tr:has(select#pa_selection) th.label,
.woocommerce div.product form.cart .variations tr:has(select#pa_selection) td.label{
  display:none;
}
/* WooCommerce blendet den nativen Pfeil per appearance:none aus und setzt
   stattdessen ein eigenes Pfeil-Icon per background-image — unsere eigene
   background:#fff (Kurzschreibweise) hat dieses Icon mit überschrieben,
   das Feld wirkte dadurch ohne jeden Aufklapp-Hinweis. Jetzt mit
   background-color (Langschreibweise, ändert nur die Farbe) plus einem
   eigenen kleinen Pfeil-Icon rechts im Feld, wie im abgestimmten Entwurf. */
.woocommerce div.product form.cart .variations select{
  border:1px solid var(--line) !important;border-radius:0 !important;
  padding:9px 40px 9px 14px !important;
  font-family:var(--sans);width:100%;background-color:#fff !important;
  box-shadow:none !important;appearance:none;-webkit-appearance:none;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none' stroke='%231d1a17' stroke-width='1.6'%3E%3Cpath d='M5 8l5 5 5-5'/%3E%3C/svg%3E") !important;
  background-repeat:no-repeat !important;
  background-position:right 12px center !important;
  background-size:16px !important;
  height:38px !important;box-sizing:border-box !important;
  font-size:1rem !important;
}
/* WooCommerce hängt nach dem Select einen "Zurücksetzen"-Link an
   (a.reset_variations), den es selbst nur per visibility:hidden versteckt
   — das nimmt ihm zwar die Sichtbarkeit, aber NICHT den Platz im Layout.
   Weil der Select jetzt width:100% hat, bleibt für den Link (inline)
   daneben kein Platz mehr, er rutscht auf eine eigene Zeile darunter und
   erzeugte dadurch einen unerwünschten Extra-Abstand vor Menge/Button.
   Komplett aus dem Layout nehmen, kein sichtbarer "Zurücksetzen"-Link in
   der abgestimmten Vorlage vorgesehen. */
.woocommerce div.product form.cart .variations a.reset_variations{
  display:none !important;
}
/* Mengenfeld und "In den Warenkorb"-Button stecken beide in
   WooCommerces eigenem .variations_button-Wrapper, NICHT direkt als Kind
   von form.cart, sondern zwei Ebenen tiefer (form.cart > .single_variation_
   wrap > .variations_button). width:100% auf .variations_button allein
   griff daher ins Leere (100% eines nicht-verbreiterten Zwischen-Wrappers
   bleibt bei dessen Inhaltsbreite hängen) — deshalb hier zusätzlich auf
   den echten Flex-Kind-Wrapper direkt in form.cart. Der Button füllt den
   restlichen Platz (flex:1), damit diese Zeile exakt so breit wird wie die
   Select-Box darüber (width:100%) — beide Reihen sind dadurch links UND
   rechts bündig, unabhängig von der Textlänge im Button. */
.woocommerce div.product form.cart .single_variation_wrap{width:100%}
.woocommerce div.product form.cart .variations_button{
  display:flex;align-items:center;gap:14px;width:100%;
}
.woocommerce div.product form.cart .variations_button button.single_add_to_cart_button{
  flex:1;
}
.woocommerce div.product form.cart div.quantity{margin:0;flex-shrink:0}
.woocommerce div.product form.cart .qty{
  border:1px solid var(--line);padding:9px 10px;width:64px;text-align:center;
  font-family:var(--sans);
  height:38px;box-sizing:border-box;
}
/* Auswahl-Select, Mengenfeld, "In den Warenkorb"-Button und "Zurück"-Button
   standen nicht auf gleicher Höhe: <select>, <input>, <button> und <a>
   haben je nach Kontext unterschiedliche geerbte line-height (normal vs.
   von WooCommerce/uns überschrieben), wodurch dieselbe Padding-Angabe bei
   jedem Element zu einer anderen Gesamthöhe führte. Fix: alle vier auf
   dieselbe explizite Höhe fixieren statt sich auf natürliche/vererbte
   Zeilenhöhe zu verlassen; Button/Link-Text wird per Flexbox statt
   vertikalem Padding zentriert. */
.woocommerce div.product form.cart button.single_add_to_cart_button,
.woocommerce div.product .back-to-store{
  height:38px !important;box-sizing:border-box !important;
  display:inline-flex !important;align-items:center;justify-content:center;
  padding-top:0 !important;padding-bottom:0 !important;
}
.woocommerce div.product .product_meta{
  font-size:.82rem;color:var(--ink-soft);border-top:1px solid var(--line);
  padding-top:18px;margin-top:8px;
}
.woocommerce div.product .product_meta a{border-bottom:1px solid var(--line)}
/* Artikelnummer wird nicht verwendet (immer "n. v."), deshalb ausgeblendet
   statt eines leeren/nichtssagenden Werts. */
.woocommerce div.product .product_meta .sku_wrapper{display:none}
/* "Kategorie" (fettes Label) und der Wert stehen laut abgestimmter
   Vorlage NEBENEINANDER in einer Zeile — dasselbe Label-Wert-Muster wie
   "Auswahl" + Auswahlfeld weiter oben, nicht untereinander gestapelt.
   Beide kommen per functions.php (kwpbt_child_product_meta) als eigene
   <span>s ohne Trennzeichen dazwischen, deshalb hier explizit mit Abstand
   nebeneinander statt aneinandergeklebt (sonst "KategorieSCHMUCK"). */
.woocommerce div.product .product_meta .posted_in{
  display:flex;align-items:baseline;gap:14px;margin-bottom:16px;
}
.woocommerce div.product .product_meta .posted_in .meta-label{
  font-weight:500;color:var(--ink);flex-shrink:0;
}
.woocommerce div.product .product_meta .posted_in .meta-value{
  font-weight:400;color:var(--ink-soft);
}
/* "Zurück zum Online Store" — per functions.php nach der Meta-Zeile
   eingehängt (woocommerce_product_meta_end). Als eigener, dunkler Button
   statt Textlink, wie in der abgestimmten Vorlage. */
.woocommerce div.product .back-to-store{
  display:inline-block;font-family:var(--sans);font-size:.76rem;
  font-weight:400;letter-spacing:.18em;text-transform:uppercase;
  padding:14px 28px;background:var(--ink);border:1px solid var(--ink);
  color:var(--accent);border-bottom:1px solid var(--ink);
  transition:all .25s ease;
}
.woocommerce div.product .back-to-store:hover{
  background:var(--accent);border-color:var(--accent);color:#fff;
}

/* Beschreibung-/Bewertungs-Tabs */
/* Abstand zur Produktgalerie/Zusammenfassung darüber auf Wunsch vergrößert
   (23.08.2026, vorher 56px) — betrifft alle Produktseiten.
   Als padding-top auf den Wrapper statt margin-top auf die Liste:
   .woocommerce-tabs hat von WooCommerce clear:both (schwebende
   Galerie/Zusammenfassung-Spalten darüber) — bei geclearten Elementen
   wird ein margin-top durch die CSS-Clearance-Berechnung teilweise
   neutralisiert, padding-top ist davon nicht betroffen und wirkt
   zuverlässig in voller Höhe (24.08.2026 live festgestellt: mit
   margin-top:84px betrug der sichtbare Abstand nur 34px). 50px
   padding-top ergeben zusammen mit dem vorhandenen Basis-Abstand
   die gewünschten 84px sichtbaren Gesamtabstand. */
.woocommerce div.product .woocommerce-tabs{padding-top:50px}
.woocommerce div.product .woocommerce-tabs ul.tabs{
  list-style:none;display:flex;gap:6px;margin:0;padding:0;
  border-bottom:1px solid var(--line);
}
/* WooCommerce liefert von sich aus einen "Ordner-Look" für inaktive Tabs (graue
   Hintergrundfarbe, Padding und abgerundete Ecken direkt auf dem li, nicht nur auf dem
   a) — das frühere margin/border-Reset allein ließ diesen Look für den inaktiven Tab
   durchscheinen, wodurch er optisch größer/höher wirkte als der aktive (19.09.2026,
   Nutzerhinweis: unterschiedliche "Schrifthöhe" der Reiter — bei Prüfung computed
   font-size auf beiden Tabs identisch, Ursache war dieser Hintergrund-Block). Jetzt
   li komplett flach, beide Tabs unterscheiden sich nur noch per .active-Unterstrich. */
.woocommerce div.product .woocommerce-tabs ul.tabs li{margin:0;border:0;padding:0;background:transparent;border-radius:0}
.woocommerce div.product .woocommerce-tabs ul.tabs li a{
  display:inline-block;padding:14px 22px;font-family:var(--sans);
  font-size:.78rem;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-soft);
  background:transparent;border-radius:0;
}
.woocommerce div.product .woocommerce-tabs ul.tabs li.active a{color:var(--ink);border-bottom:2px solid var(--accent)}
/* WooCommerce liefert selbst .woocommerce div.product .woocommerce-tabs .panel{padding:0} —
   gleiche Spezifität nötig, sonst wird unser padding-top wieder auf 0 zurückgesetzt
   (24.08.2026 live festgestellt, gleiches Muster wie beim Tab-Abstand oben). */
.woocommerce div.product .woocommerce-tabs .panel{padding:30px 0;max-width:70ch}
.woocommerce div.product .woocommerce-tabs .panel h2{font-size:1.5rem}

/* Verwandte Produkte — nutzen dieselbe ul.products-Regel oben */
.related.products{margin-top:88px;padding-top:56px;border-top:1px solid var(--line)}
.related.products > h2{font-size:1.7rem;margin-bottom:34px}

/* ---------- Warenkorb ---------- */
table.shop_table{
  width:100%;border-collapse:collapse;margin-bottom:34px;font-size:.92rem;
}
table.shop_table th{
  text-align:left;font-family:var(--sans);font-size:.72rem;letter-spacing:.1em;
  text-transform:uppercase;color:var(--ink-soft);font-weight:400;
  padding:14px 12px;border-bottom:1px solid var(--ink);
}
table.shop_table td{padding:20px 12px;border-bottom:1px solid var(--line);vertical-align:middle}
table.shop_table td.product-thumbnail img{width:84px;height:84px;object-fit:cover}
table.shop_table td.product-name a{color:var(--ink);font-weight:400}
.woocommerce a.remove{
  color:var(--ink-soft) !important;border:1px solid var(--line) !important;
  background:transparent !important;border-radius:0 !important;
  width:28px;height:28px;line-height:26px !important;font-size:1rem !important;
}
.woocommerce a.remove:hover{color:#fff !important;background:var(--danger) !important;border-color:var(--danger) !important}
.woocommerce-cart .cart-collaterals{margin-top:20px}
.cart_totals h2{font-size:1.5rem}
.cart_totals table.shop_table td,
.cart_totals table.shop_table th{border-bottom:1px solid var(--line)}
.cart_totals .order-total .woocommerce-Price-amount{font-size:1.25rem}
#coupon_code{max-width:220px}

/* ---------- Kasse ---------- */
.woocommerce-checkout h3{margin-top:0}
.woocommerce-checkout-review-order-table{margin-top:14px}
.woocommerce-checkout #payment{
  background:var(--paper-2);border:1px solid var(--line);border-radius:0;
}
.woocommerce-checkout #payment div.payment_box{
  background:var(--paper);border-radius:0;font-size:.9rem;color:var(--ink-soft);
}
.woocommerce-checkout #payment div.payment_box::before{border-bottom-color:var(--paper)}
.woocommerce-checkout #payment ul.payment_methods{border-bottom-color:var(--line)}
/* AGB-/Datenschutz-Links in der Kasse: technisch schon als <a> vorhanden
   (WooCommerce verlinkt automatisch zu den in den WC-Einstellungen
   hinterlegten Seiten "AGB Online Store"/"Datenschutzerklärung"), aber
   durch das globale a{color:inherit;text-decoration:none} unsichtbar —
   sahen aus wie normaler Fließtext, nicht wie ein Link. */
.woocommerce-terms-and-conditions-link,
.woocommerce-privacy-policy-link{
  color:var(--accent);text-decoration:underline;text-underline-offset:2px;
}
.woocommerce-terms-and-conditions-link:hover,
.woocommerce-privacy-policy-link:hover{color:var(--ink)}
.woocommerce-additional-fields h3,
#order_review_heading{
  font-family:var(--serif);font-weight:400;font-size:1.6rem;
}

@media (max-width:1000px){
  .woocommerce ul.products{grid-template-columns:repeat(3,1fr)}
  .woocommerce div.product .images,
  .woocommerce div.product div.summary{width:100%}
  /* Auf Mobil fallen Galerie und Zusammenfassung von nebeneinander (Desktop)
     auf untereinander — das margin-bottom:0 auf div.images weiter oben ist
     bewusst für die Desktop-Seite-an-Seite-Anordnung gedacht, ließ auf Mobil
     aber keinerlei Abstand zwischen letztem Galerie-Thumbnail und Produkttitel
     (Nutzerhinweis 20.09.2026, Screenshot zeigte den Titel fast klebend unter
     den Thumbnails). Nur hier, nicht global, damit Desktop unverändert bleibt.
     WICHTIG: Selektor muss "div.images" heißen, nicht nur ".images" — sonst
     gewinnt die spezifischere Ursprungsregel "div.product div.images" trotz
     Media Query (CSS-Spezifität schlägt Quellreihenfolge). Live mit 375px
     Viewport getestet: mit nur ".images" blieb margin-bottom bei 0px, mit
     "div.images" (gleiche Spezifität, aber später in der Datei) greift die
     28px korrekt. */
  .woocommerce div.product div.images{margin-bottom:28px}
}
@media (max-width:768px){
  .woocommerce ul.products{grid-template-columns:repeat(2,1fr)}
}
@media (max-width:560px){
  .woocommerce ul.products{grid-template-columns:1fr}
  table.shop_table td.product-thumbnail{display:none}
}

/* ---------- Responsive ---------- */
@media (max-width:900px){
  .g-3,.g-4{grid-template-columns:repeat(2,1fr)}
  .split{grid-template-columns:1fr;gap:34px}
  .split.rev .media{order:0}
  .foot-grid{grid-template-columns:1fr 1fr}
  section{padding:64px 0}
}
@media (max-width:560px){
  .hero-actions{display:grid;grid-template-columns:1fr}
  .g-2,.g-3,.g-4{grid-template-columns:1fr}
  .foot-grid{grid-template-columns:1fr}
  .wrap{padding:0 20px}
}
/* Sprachumschalter auch am Handy sichtbar (14.09.2026, auf Vanessas Wunsch,
   Nachtrag zur DE/EN/IT-Vorbereitung). GeneratePress blendet auf Mobil den
   gesamten .head-tools-Block per eigener Kernregel aus
   (".inside-navigation > :not(.navigation-search):not(.main-nav)"), weil
   dort normalerweise Warenkorb/Social/Suche sitzen, die absichtlich nur am
   Desktop erscheinen — hier NUR .lang-switch gezielt wieder einblenden,
   die übrigen head-tools-Elemente bleiben wie zuvor am Handy verborgen.
   Nachbesserung 14.09.2026 (Vanessa: "ganz schlecht gelungen"): Die erste
   Fassung setzte top:50%/translateY(-50%) auf .head-tools selbst — bei
   dessen tatsächlicher Höhe (2 Zeilen à Padding) reichte das über den
   unteren Header-Rand hinaus (live gemessen: Kasten bis 8px unterhalb des
   Headers, "IT" berührte dadurch die Trennlinie). Dazu nur 4,5px Abstand
   zum Hamburger-Button (schätzte right:56px ohne Nachmessen) und keinerlei
   optische Fassung — reiner schwebender Text.
   Zweiter Versuch (top:0/bottom:0 + align-items:center auf .head-tools)
   sollte es auf die volle Header-Höhe strecken — live erneut vermessen,
   IMMER NOCH 9px Überstand. Ursache gefunden: Die absolute Positionierung
   bezieht sich auf den nächsten position:relative-Vorfahren, das ist hier
   NICHT der Header, sondern .inside-navigation — und die kollabiert am
   Handy auf Höhe 0 (der Hauptmenü-Inhalt ist ja ausgeblendet), genau auf
   Höhe der Hamburger-Unterkante. top:0/bottom:0 relativ zu einer 0px
   hohen Box ergibt keine echte Streckung, sondern zentriert den Inhalt um
   genau diesen einen Punkt — spürbar tiefer als die echte Header-Mitte.
   Fix: .inside-navigation für diese eine Zone auf position:static
   zurückgesetzt, damit .head-tools stattdessen am nächsthöheren
   Vorfahren mit echter Höhe andockt (.site-header selbst, position:sticky
   wirkt ebenfalls als Bezugsrahmen, volle 93px Höhe) — top:0/bottom:0
   strecken jetzt korrekt auf den ganzen Header, live nachgemessen: Kasten
   bleibt vollständig innerhalb des Headers, keine Überschneidung mit der
   Trennlinie mehr. Dazu mehr Abstand zum Hamburger (live nachgemessen:
   Hamburger-Button beginnt bei 284px in einem 375px-Viewport) und eine
   dezente Fassung (Hintergrund + Rahmen), damit der Umschalter als
   eigenes Element erkennbar ist statt als loser Text. */
@media (max-width:768px){
  .has-inline-mobile-toggle #site-navigation .inside-navigation{position:static}
  .has-inline-mobile-toggle #site-navigation .inside-navigation > .head-tools{
    /* right relativ zum jetzt korrekten Bezugsrahmen (.site-header, volle
       Breite) neu berechnet — 375px Viewport, Hamburger beginnt bei 284px,
       16px gewünschter Abstand: 375-(284-16)=107. Beim vorherigen (falschen)
       Bezugsrahmen ergab derselbe Rechenweg zufällig 68px. */
    display:flex !important;width:auto;position:absolute;right:107px;top:0;bottom:0;
    align-items:center;
  }
  .has-inline-mobile-toggle .head-tools .cart,
  .has-inline-mobile-toggle .head-tools .social-icon,
  .has-inline-mobile-toggle .head-tools .search-toggle{display:none !important}
  /* 14.09.2026 (Roland): Kasten (Hintergrund/Rahmen) um den Sprachumschalter
     mobil auf Wunsch wieder entfernt — wirkte am Handy zu wuchtig/aufdringlich
     neben dem Hamburger-Icon. Größere Touch-Fläche pro Zeile bleibt bestehen
     (offener Punkt aus Rolands Vorprüfung, siehe IT-Version-Vorbereitung.md) —
     das war eine reine Antippbarkeits-Maßnahme, unabhängig vom Kasten. */
  .head-tools .lang-switch .lang-link{padding:6px 10px}
}

/* ---------- Kasse: AGB-Checkbox-Hervorhebung nach Validierungsfehler ---------- */
/* Siehe functions.php: kwpbt_child_scroll_to_terms_checkbox_on_error() */
.woocommerce-terms-and-conditions-wrapper.kwp-terms-highlight{
  outline:2px solid #c0392b;
  outline-offset:6px;
  border-radius:2px;
  transition:outline-color .3s ease;
}

/* ---------- Produktseite: Abstand Hauptbild zu Vorschaubildern-Reihe ---------- */
/* 25.08.2026, auf Wunsch: Hauptbild und Vorschaubilder-Reihe berührten sich
   direkt (0px). Betrifft automatisch alle Produktseiten mit mehreren Bildern
   (WooCommerce-Standardklasse .flex-control-thumbs).
   Live festgestellt: Erster Versuch mit dem schwächeren Selektor
   ".woocommerce-product-gallery .flex-control-thumbs" wurde von WooCommerce
   eigener Regel ".woocommerce div.product div.images .flex-control-thumbs
   {margin:0}" überschrieben (höhere Spezifität gewinnt unabhängig von der
   Ladereihenfolge) — exakt dasselbe Muster wie beim Tab-Abstand weiter oben.
   Deshalb hier derselbe, gleich spezifische Selektor. */
.woocommerce div.product div.images .flex-control-thumbs{margin-top:8px}

/* Englische Seiten: 26.08.2026 zunächst ein eigener zweiter Navigations-
   streifen (.en-subnav) im Seiteninhalt — noch am selben Tag durch eine
   saubere Lösung ersetzt: Das Hauptmenü im echten Header wird auf /en/-
   Seiten serverseitig gegen ein eigenes englisches Menü getauscht
   (kwpbt_child_swap_primary_menu_for_en() in functions.php), keine zweite
   Zeile mehr nötig. */

/* EU-Widerrufsbutton (§13a FAGG, ab 1.10.2026 Pflicht) — 03.09.2026, seit
   04.09.2026 live. Logik in functions.php (kwpbt_child_widerruf_formular_shortcode() /
   kwpbt_child_widerruf_verarbeiten() — Kommentar am 12.09.2026 korrigiert, die
   Funktion hieß ursprünglich kwpbt_child_widerruf_block(), existiert unter
   diesem Namen aber nicht mehr). Kommentar am 14.09.2026 nochmal korrigiert:
   Ausgabe war nie dauerhaft auf der WooCommerce-Seite "Bestellung ansehen" —
   seit dem Neuaufbau vom 04.09.2026 läuft das Formular über den Shortcode
   [kwp_widerruf_formular] auf einer eigenen, dedizierten Seite
   ("Vertrag widerrufen" / "Cancel Contract" / "Recesso dal Contratto"), wie
   es §13a FAGG ("dauerhaft, seitenweit, ohne Login erreichbar") verlangt.
   Bewusst deutlich hervorgehoben (Rahmen + --danger-Ton),
   weil die Vorgabe eine "deutlich sichtbare, hervorgehobene" Darstellung
   verlangt. */
.kwp-widerruf{margin:28px auto;padding:26px 30px;border:2px solid var(--danger);border-radius:4px;background:#fff}
.kwp-widerruf p{font-family:var(--sans);font-size:.88rem;line-height:1.5;color:var(--ink-soft);margin:0 0 4px}
.kwp-widerruf p a{color:var(--accent-dark)}
.kwp-widerruf__formular{margin-top:18px;display:flex;flex-direction:column;gap:10px}
.kwp-widerruf__formular label{font-family:var(--sans);font-size:.8rem;letter-spacing:.03em;color:var(--ink-soft)}
.kwp-widerruf__formular input,.kwp-widerruf__formular textarea{font-family:var(--sans);font-size:.92rem;padding:9px 11px;border:1px solid var(--line);border-radius:2px;background:var(--paper)}
.kwp-widerruf__hp{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}
.kwp-widerruf__bestaetigen{align-self:flex-start;margin-top:6px;font-family:var(--sans);font-size:.92rem;letter-spacing:.04em;color:#fff;background:var(--ink);border:0;border-radius:2px;padding:11px 24px;cursor:pointer}
.kwp-widerruf__bestaetigen:hover{background:var(--ink-soft)}
.kwp-widerruf--bestaetigt{border-color:var(--sage)}
.kwp-widerruf--fehler{border-color:var(--danger);background:#fdf3f0}
.kwp-widerruf--bestaetigt p,.kwp-widerruf--fehler p{font-family:var(--sans);font-size:.92rem;color:var(--ink-soft);margin:0}

/* ---------- 404-Seite: eigene Vorlage statt GeneratePress-Standard „Ups!" ---------- */
/* 10.09.2026, auf Wunsch: ruhige Überschrift statt flapsig, größere mittige
   Produktsuche statt der schmalen Kopfzeilen-Dropdown-Suche, direkte Links
   statt Fließtext. Siehe 404.php. Suchformular ist dieselbe
   get_product_search_form()-Ausgabe wie im Header (kwpbt_child_head_tools()
   in functions.php) — hier nur größer/mittig gestylt statt im schmalen
   Dropdown, WooCommerce-eigenes <label> bleibt wie dort screen-reader-only. */
.kwpbt-404{padding:88px 0 110px;text-align:center}
.kwpbt-404-inner{max-width:560px;margin:0 auto}
.kwpbt-404-inner h1{font-size:clamp(2rem,4vw,2.75rem);margin-bottom:18px}
.kwpbt-404-inner .lead{margin-bottom:44px}
.kwpbt-404-search{margin-bottom:52px}
.kwpbt-404-search-label{
  display:block;font-family:var(--sans);font-size:.72rem;font-weight:400;
  letter-spacing:.16em;text-transform:uppercase;color:var(--ink-soft);margin-bottom:12px;
}
.kwpbt-404-search .woocommerce-product-search{display:flex;border:1px solid var(--ink)}
.kwpbt-404-search .woocommerce-product-search label{position:absolute;left:-9999px}
.kwpbt-404-search input[type="search"]{
  flex:1;min-width:0;border:0;background:transparent;padding:17px 20px;
  font-family:var(--sans);font-size:.98rem;color:var(--ink);letter-spacing:normal;text-transform:none;
}
.kwpbt-404-search input[type="search"]:focus{outline:none}
.kwpbt-404-search .woocommerce-product-search:focus-within{border-color:var(--accent)}
.kwpbt-404-search button[type="submit"]{
  border:0;background:var(--ink);color:var(--paper);padding:0 28px;
  font-family:var(--sans);font-size:.76rem;letter-spacing:.14em;text-transform:uppercase;
  cursor:pointer;transition:background .15s;
}
.kwpbt-404-search button[type="submit"]:hover,
.kwpbt-404-search button[type="submit"]:focus-visible{background:var(--accent)}
.kwpbt-404-quick-label{font-size:.72rem;letter-spacing:.16em;text-transform:uppercase;color:var(--ink-soft);margin-bottom:18px}
.kwpbt-404-links{display:flex;flex-wrap:wrap;justify-content:center;gap:14px}
@media (max-width:560px){
  .kwpbt-404{padding:64px 0 80px}
  .kwpbt-404-search input[type="search"]{padding:15px 16px}
}

/* ==========================================================================
   Google-Bewertungen — schmales Vertrauens-Band auf der Startseite.
   Bewusst kein eigener Hintergrund/Rahmen: läuft nahtlos im letzten
   Abschnitt vor dem Footer weiter (gleiche Sektion wie Adresse/Öffnungszeiten).
   ========================================================================== */
.stars{display:inline-flex;gap:2px;line-height:1}
.stars svg{width:15px;height:15px;fill:#c8983f}
.g-logo{display:inline-flex;align-items:center;gap:6px;font-size:.82rem;color:var(--ink-soft)}

.trust-bar-wrap{margin-top:28px}
.trust-bar{
  display:flex;align-items:center;justify-content:center;gap:36px;
  flex-wrap:wrap;text-align:left;
}
.trust-score{display:flex;align-items:center;gap:14px}
.trust-score .num{font-family:var(--serif);font-size:2.6rem;line-height:1;color:var(--ink)}
.trust-score .meta{display:flex;flex-direction:column;gap:4px}
.trust-score .meta .g{
  display:flex;align-items:center;gap:6px;font-size:.78rem;color:var(--ink-soft);
}
.trust-score .meta .count{font-size:.78rem;color:var(--ink-soft)}
.trust-divider{width:1px;align-self:stretch;background:var(--line)}
.trust-quotes{display:flex;gap:28px;flex:1;min-width:0}
.trust-quote{flex:1;min-width:0}
.trust-quote p{
  font-family:var(--serif);font-style:italic;font-size:1rem;line-height:1.5;
  color:var(--ink);margin:0 0 8px;
}
.trust-quote cite{font-style:normal;font-size:.74rem;letter-spacing:.05em;color:var(--ink-soft)}
.trust-cta{
  flex-shrink:0;font-size:.72rem;letter-spacing:.14em;text-transform:uppercase;
  color:var(--accent-dark);border-bottom:1px solid var(--accent-dark);padding-bottom:2px;
  white-space:nowrap;text-decoration:none;
}
@media (max-width:860px){
  .trust-bar{flex-direction:column;align-items:stretch;text-align:center}
  .trust-score{justify-content:center}
  .trust-divider{display:none}
  .trust-quotes{flex-direction:column;text-align:center}
}
