/* ============================================================
   META Shop — Design System
   Premium industrial. Deep steel + signal red. Editorial type.
   No external imagery (brand constraint) — original CSS/SVG only.
   ============================================================ */

/* Schriften selbst gehostet (legal-03 / pa-04): kein Google-Fonts-CDN mehr —
   keine Besucher-IP an Google (DSGVO) + kein render-blocking @import.
   WOFF2 in /assets/fonts/, latin + latin-ext (latin-ext laedt der Browser
   nur bei Bedarf via unicode-range). Quelle: Google Fonts (OFL). */
@font-face{font-family:'Inter';font-style:normal;font-weight:400;font-display:swap;src:url('/assets/fonts/inter-400-latin-ext.woff2') format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Inter';font-style:normal;font-weight:400;font-display:swap;src:url('/assets/fonts/inter-400-latin.woff2') format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Inter';font-style:normal;font-weight:450;font-display:swap;src:url('/assets/fonts/inter-450-latin-ext.woff2') format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Inter';font-style:normal;font-weight:450;font-display:swap;src:url('/assets/fonts/inter-450-latin.woff2') format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Inter';font-style:normal;font-weight:500;font-display:swap;src:url('/assets/fonts/inter-500-latin-ext.woff2') format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Inter';font-style:normal;font-weight:500;font-display:swap;src:url('/assets/fonts/inter-500-latin.woff2') format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Inter';font-style:normal;font-weight:600;font-display:swap;src:url('/assets/fonts/inter-600-latin-ext.woff2') format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Inter';font-style:normal;font-weight:600;font-display:swap;src:url('/assets/fonts/inter-600-latin.woff2') format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Inter';font-style:normal;font-weight:700;font-display:swap;src:url('/assets/fonts/inter-700-latin-ext.woff2') format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Inter';font-style:normal;font-weight:700;font-display:swap;src:url('/assets/fonts/inter-700-latin.woff2') format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Sora';font-style:normal;font-weight:400;font-display:swap;src:url('/assets/fonts/sora-400-latin-ext.woff2') format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Sora';font-style:normal;font-weight:400;font-display:swap;src:url('/assets/fonts/sora-400-latin.woff2') format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Sora';font-style:normal;font-weight:500;font-display:swap;src:url('/assets/fonts/sora-500-latin-ext.woff2') format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Sora';font-style:normal;font-weight:500;font-display:swap;src:url('/assets/fonts/sora-500-latin.woff2') format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Sora';font-style:normal;font-weight:600;font-display:swap;src:url('/assets/fonts/sora-600-latin-ext.woff2') format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Sora';font-style:normal;font-weight:600;font-display:swap;src:url('/assets/fonts/sora-600-latin.woff2') format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Sora';font-style:normal;font-weight:700;font-display:swap;src:url('/assets/fonts/sora-700-latin-ext.woff2') format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Sora';font-style:normal;font-weight:700;font-display:swap;src:url('/assets/fonts/sora-700-latin.woff2') format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:'Sora';font-style:normal;font-weight:800;font-display:swap;src:url('/assets/fonts/sora-800-latin-ext.woff2') format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}
@font-face{font-family:'Sora';font-style:normal;font-weight:800;font-display:swap;src:url('/assets/fonts/sora-800-latin.woff2') format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}

:root{
  /* Brand */
  --red:#e2001a;            /* META signal red — Flächen/Buttons (weiß-auf-rot 4,94:1 ✓) */
  --red-600:#c4001a;
  --red-glow:rgba(226,0,26,.35);
  /* Marketing-Audit 2026-07-05 (Aufhellen): Rot-Text jetzt auf HELLEM Grund. #c4001a = 5,9:1 auf
     #fff / 5,6:1 auf --ink(#f4f6f8) ≥ AA. Flächen/Buttons bleiben --red (#e2001a). */
  --red-text:#c4001a;

  /* Neutrals — hell/sachlich (Aufhellen 2026-07-05). Content-Fläche hell; Header/Footer bleiben
     dunkel als „Klammer" (Tokens dafür weiter unten auf .site-header/.site-footer zurückgescopt). */
  /* Feedback Ludwig 2026-07-05: Seiten-BG etwas tiefer/ruhiger (war zu glary-weiß) — weiße Karten
     & Produktbild-Kacheln „schweben" jetzt sichtbar auf grauem Grund statt in einer weißen Fläche. */
  --ink:#e8ebf0;            /* Seiten-Hintergrund (ruhiges Grau, hebt weiße Karten ab) */
  --ink-2:#eef1f5;          /* zweite, leicht hellere Fläche (Karten-Verläufe bleiben near-white) */
  --panel:#ffffff;          /* Karten/Panels */
  --panel-2:#eef1f6;        /* zweite Panel-Fläche (subtiler Füll-Ton auf weißen Karten) */
  --line:#e3e7ec;           /* Haarlinie auf hell */
  --line-2:#cdd4dd;         /* kräftigere Linie/Rahmen */
  --muted:#5a636f;          /* Specs/Maße/Preise (6,4:1 auf #fff ≥ AA) */
  --muted-2:#39414d;        /* kräftigerer Sekundärtext (≈9:1 auf #fff) */
  --text:#1a1f27;           /* Fließtext (≈14:1 auf #fff) */
  --white:#ffffff;

  /* Accents */
  --steel:#6b7689;
  --steel-2:#5a6675;        /* Akzenttext (System-Label/Zähler) — 6,2:1 auf #fff ≥ AA */
  --good:#1a9e46;           /* Erfolg als Text/Icon auf hell (dunkler als #23c552) */

  /* Geometry */
  --r-sm:6px; --r:10px; --r-lg:14px; --r-xl:18px;   /* Refresh 2026-07-16: engere Radien, Industrie-Anmutung; alle 4 Token behalten (--r-xl-Verwender) */
  --maxw:1240px;
  --gutter:clamp(18px,4vw,40px);
  --header-h:72px;          /* Höhe der .nav-Leiste; Sticky-Offsets (Listing-Toolbar) rechnen damit — Visual-Audit 2026-07-06 */

  /* Shadow — weiche graue Elevation auf hell (Aufhellen 2026-07-05). Rot NICHT mehr als Karten-Glow;
     Rot-Signal bleibt nur am Kauf-Button (dort eigener rot-getönter Schatten). */
  --sh-1:0 1px 2px rgba(16,24,40,.08);
  --sh-2:0 6px 16px -8px rgba(16,24,40,.14);
  --sh-red:0 6px 16px -8px rgba(16,24,40,.16);     /* neutralisiert: früher roter Glow -> weicher grauer Schatten */
  --sh-pop:0 16px 40px -20px rgba(16,24,40,.24);   /* dropdowns / mega / toasts */

  --ease:cubic-bezier(.2,.7,.2,1);
  --ease-out:cubic-bezier(.16,1,.3,1);

  /* Motion durations (paired with --ease) */
  --t-fast:.15s var(--ease);
  --t:.25s var(--ease);
  --t-slow:.4s var(--ease-out);

  /* Semantic state colors (text / soft-bg / hairline) */
  --ok:var(--good);     --ok-bg:rgba(35,197,82,.12);  --ok-line:rgba(35,197,82,.32);
  --warn:#f5a524;       --warn-bg:rgba(245,165,36,.12);--warn-line:rgba(245,165,36,.32);
  --danger:var(--red);  --danger-bg:rgba(226,0,26,.12);--danger-line:rgba(226,0,26,.34);
  --info:#3a9bff;       --info-bg:rgba(58,155,255,.12);--info-line:rgba(58,155,255,.32);

  /* a11y-F1: AA-taugliche TEXT/Icon-Varianten der Statusfarben auf hellem Grund (Kleintext ≥ 4,5:1,
     Grafik ≥ 3:1). Die hellen Flächen-Tokens oben (--good/--ok/--warn/--info) bleiben für Füllungen
     mit weißer Schrift (Buttons, gefüllte Badges, .added). Analog zu --red-text.
     Kontrast auf #fff: good-text 5,4:1 · warn-text 5,1:1 · info-text 5,5:1. */
  --good-text:#127a37;  --warn-text:#9a6200;  --info-text:#1668c7;

  /* Spacing scale */
  --s-1:4px; --s-2:8px; --s-3:12px; --s-4:16px; --s-5:24px; --s-6:32px; --s-7:48px; --s-8:72px;

  /* Focus ring (brand) */
  --focus:0 0 0 2px var(--ink), 0 0 0 4px var(--red);

  /* Layering scale */
  --z-header:50; --z-mega:60; --z-banner:80; --z-toast:120; --z-modal:200;
}

/* ============================================================
   TYPO-TOKENS — kanonisches Schrift-System (Jitter-Killer, 2026-07-24)
   Snap-to-scale: jeder bisherige Rohwert bewegt sich <= ~1.1px @16px.
   Beseitigt „mal groesser/kleiner" (50 fast-identische Groessen -> 13 Stufen)
   und „mal hoeher/tiefer" (fehlende line-height an Versal-Labels/Preiszeilen).
   NUR Typografie — Farben/Radien/Spacing unberuehrt. Body-Anker: 1rem = 16px.
   ============================================================ */
:root{
  /* ---- statische Groessen-Skala (13 Stufen) ---- */
  --fs-2xs:   .6875rem;  /* 11px   — Micro-Badge/Counter (.brand small, .wish-badge, .reco-tag, .badge-count) */
  --fs-xs:    .75rem;    /* 12px   — Versal-Label / Fineprint / Micro (eyebrow, section-label, .vat, kbd) */
  --fs-sm:    .8125rem;  /* 13px   — Caption / kleiner Meta-Grautext (crumbs, foot-bottom, chips) */
  --fs-ms:    .875rem;   /* 14px   — Meta / sekundaerer Body (near-body Grautext, small-buttons) */
  --fs-base:  .9375rem;  /* 15px   — Body / Inputs / Nav / kompakte Buttons */
  --fs-md:    1rem;      /* 16px   — Lead-Basis / Button-lg / kleiner Card-Title / muted */
  --fs-lg:    1.0625rem; /* 17px   — Lead-lg / Card-Title (feat h4, sidebar-head, section-head p) */
  --fs-xl:    1.15rem;   /* 18.4px — Card-Title-lg / H3 / kleiner Preis (cat h3, pcard now, panel h2) */
  --fs-2xl:   1.3125rem; /* 21px   — Preis-lg / H3-lg / Telefon (cta-phone, ro-v, checkout h2) */
  --fs-3xl:   1.4375rem; /* 23px   — Preis-lg gross / feste H2 / Stat (cart total, empty h2, trust b) */
  --fs-4xl:   1.75rem;   /* 28px   — feste Zwischenstufe grosse H2 (checkout h2 1.7) */
  --fs-5xl:   2.0625rem; /* 33px   — Stat-/Score-Zahl (stat-num, reviews score, price-main now) */
  --fs-6xl:   2.6rem;    /* 41.6px — Aggregat-Kennzahl (trust__agg-num) */

  /* ---- fluide Heading-Tokens (Werte aus der Inventur, unveraendert) ---- */
  --fs-hero:    clamp(2.5rem, 5.4vw, 4.4rem);        /* .hero h1 */
  --fs-h1:      clamp(2.2rem, 4.6vw, 3.6rem);        /* cat-hero / account h1 / grosse Landing-H1 */
  --fs-h2:      clamp(1.9rem, 3.4vw, 2.8rem);        /* section-head h2 / planer-head h1 */
  --fs-h2-sm:   clamp(1.6rem, 2.8vw, 2.2rem);        /* cat-top/guide/intro-H2 (gemeinsame kleine H2) */
  --fs-title:   clamp(1.5rem, 2.6vw, 2.2rem);        /* pdp-title / cross-head / reco-nahe Titel */

  /* ---- Line-Height-Tokens ---- */
  --lh-caps:   1;     /* einzeilige Versal-/Label-Boxen — kein „Schweben" */
  --lh-tight:  1.1;   /* Stat-/Preis-Zahlen, kurze fette Zahlen */
  --lh-heading:1.15;  /* H1–H4, clamp-Headings (nur wo bisher keine eigene lh) */
  --lh-title:  1.2;   /* Card-Title, mehrzeilige Labels/Formular-Labels */
  --lh-snug:   1.35;  /* mehrzeiliger Kleintext (pcard-name, bom-name, faktenzeilen) */
  --lh-body:   1.55;  /* Flisstext (Absaetze, Prosa, Consent, Definitionen) */
  --lh-prose:  1.7;   /* Langtext/Rechtsprosa/FAQ (bewusst luftig) */

  /* ---- Font-Weights (Inter 400/450/500/600/700 · Sora 400/500/600/700/800) ---- */
  --fw-body:    400;
  --fw-emph:    450;
  --fw-medium:  500;
  --fw-semibold:600;
  --fw-bold:    700;
  --fw-black:   800;

  /* ---- Uppercase-Tracking (Versal-Sperrung) ---- */
  --ls-caps:    .1em;   /* Standard fuer ALLE uppercase-Labels (eyebrow/section/badge) */
  --ls-caps-sm: .03em;  /* nur sehr kleine Tabellen-Header (thead th) */
  --ls-tight:  -.02em;  /* grosse Headings/Display-Zahlen (optisches Zusammenziehen) */
}

*{box-sizing:border-box}
html{scroll-behavior:smooth}
body{
  margin:0;
  font-family:'Inter',system-ui,-apple-system,Segoe UI,Roboto,sans-serif;
  background:var(--ink);
  color:var(--text);
  line-height:1.5;
  -webkit-font-smoothing:antialiased;
  text-rendering:optimizeLegibility;
  overflow-x:hidden;
}
/* Aufhellen 2026-07-05: seitenweites Blueprint-Raster + roter Radial-Glow (body::before) entfernt
   (Deko-Streichliste #5) — auf hellem Grund obsolet, kostete Ruhe/Scanbarkeit. */

/* ---------- Dark-Bracket: Header + Footer bleiben dunkel („Klammer", Audit) ----------
   Die Content-Fläche ist hell (Tokens oben). Header/Footer behalten die dunkle Marke: dazu die
   flächen-/text-/linien-Tokens hier auf ihre dunklen Werte zurückscopen, damit alle var()-basierten
   Kind-Regeln (Nav, Mega-Menü, Mobile-Drawer, Footer-Spalten) hell-auf-dunkel korrekt bleiben —
   ohne header.css/footer-Regeln einzeln anzufassen. */
/* Feedback Ludwig 2026-07-05: Dark-Bracket von near-black auf ANTHRAZIT gehoben — die Leiste oben
   war zu hart-schwarz gegen den hellen Content. Weicherer Übergang, angenehmer. */
.site-header, .site-footer, .topbar{
  --ink:#171b23; --ink-2:#1e2330; --panel:#262c39; --panel-2:#2e3543;
  --line:#333b49; --line-2:#3f4859;
  --muted:#98a1b1; --muted-2:#c0c8d4; --text:#f0f2f6; --steel-2:#a6b0c1;
  --red-text:#ff6b70;                 /* kleiner Rot-Text auf anthrazit (AA) */
  /* a11y-F1: auf dem dunklen Bracket brauchen Status-Texte HELLE Werte (die dunklen
     Content-Varianten wären hier unlesbar). AA auf #171b23: good 4,9:1 · warn 8,4:1 · info 5,0:1. */
  --good-text:#3ddc7a;  --warn-text:#f5a524;  --info-text:#5aa9ff;
  --sh-2:0 18px 50px -20px rgba(0,0,0,.55);
  --sh-pop:0 24px 70px -24px rgba(0,0,0,.7);
  color:var(--text);
}
.site-footer{background:var(--ink-2)}   /* --ink-2 hier anthrazit gescopt -> Footer bleibt dunkel */
.topbar{background:#141821}             /* schlanke Beratungs-Topbar, minimal dunkler als der Header */
h1,h2,h3,h4{font-family:'Sora',sans-serif;font-weight:var(--fw-bold);line-height:1.08;margin:0}
h1,h2{letter-spacing:var(--ls-tight)}h3{letter-spacing:-.01em}h4{letter-spacing:0}   /* gestaffelt: enger bei großen Graden, neutral bei h4 */
p{margin:0}
a{color:inherit;text-decoration:none}
img{max-width:100%;display:block}
.container{width:min(var(--maxw),100% - var(--gutter)*2);margin-inline:auto;position:relative;z-index:1}

/* ---------- base / a11y ---------- */
button,input,select,textarea{font:inherit;color:inherit}
/* Sichtbarer Tastatur-Fokus: einheitliche :focus-visible-Baseline weiter unten
   (weißes Outline, mit P17 abgestimmt). --focus (rote Ring) bleibt für Custom-
   Controls in ui.css (Checkbox/Switch), wo ein Outline schlecht aussieht. */
:focus:not(:focus-visible){outline:none}
::selection{background:var(--red);color:#fff}
:root{accent-color:var(--red)}
hr{border:none;border-top:1px solid var(--line);margin:0}

/* slim steel scrollbars */
*{scrollbar-width:thin;scrollbar-color:var(--line-2) transparent}
::-webkit-scrollbar{width:11px;height:11px}
::-webkit-scrollbar-thumb{background:var(--line-2);border-radius:99px;border:3px solid var(--ink)}
::-webkit-scrollbar-thumb:hover{background:var(--steel)}

/* utilities */
.visually-hidden{position:absolute!important;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
.skip-link{position:fixed;top:-60px;left:16px;z-index:var(--z-modal);background:var(--red);color:#fff;padding:.7rem 1.1rem;border-radius:0 0 10px 10px;font-weight:var(--fw-semibold);transition:top .2s var(--ease)}
.skip-link:focus{top:0}

/* ---------- buttons ---------- */
.btn{
  display:inline-flex;align-items:center;gap:.6em;justify-content:center;
  padding:.92em 1.4em;border-radius:var(--r);font-weight:var(--fw-semibold);font-size:var(--fs-md);
  border:1px solid transparent;cursor:pointer;transition:.25s var(--ease);
  white-space:nowrap;
}
.btn svg{width:1.05em;height:1.05em}
.btn-primary{background:var(--red);color:#fff;box-shadow:var(--sh-1)}
.btn-primary:hover{background:var(--red-600);box-shadow:var(--sh-2)}
.btn-ghost{background:#fff;border-color:var(--line-2);color:var(--text)}
.btn-ghost:hover{background:var(--panel-2);border-color:var(--steel)}
.btn-lg{padding:1.05em 1.7em;font-size:var(--fs-md)}

/* ---------- header ---------- */
.site-header{
  position:sticky;top:0;z-index:50;
  backdrop-filter:saturate(140%) blur(14px);
  /* Feedback Ludwig 2026-07-05: Anthrazit statt near-black (Leiste war zu dunkel). */
  /* Flach statt vertikalem Transparenz-Fade (der Fade war SaaS-Optik). */
  background:rgba(23,27,35,.92);
  border-bottom:1px solid var(--line);
}
.nav{display:flex;align-items:center;gap:1.4rem;height:72px}
.brand{display:flex;align-items:center;gap:.7rem;font-family:'Sora';font-weight:var(--fw-black);font-size:var(--fs-xl);letter-spacing:-.01em}
.brand .logo{
  display:grid;place-items:center;width:38px;height:38px;border-radius:9px;
  background:var(--red);color:#fff;font-weight:var(--fw-black);box-shadow:var(--sh-red);
  font-size:var(--fs-sm);letter-spacing:var(--ls-tight);
}
.brand small{color:var(--muted);font-weight:var(--fw-medium);font-size:var(--fs-2xs);letter-spacing:.22em;text-transform:uppercase;display:block;margin-top:1px}
.nav-links{display:flex;gap:.3rem;margin-left:1rem}
.nav-links a{padding:.5rem .8rem;border-radius:8px;color:var(--muted-2);font-weight:var(--fw-medium);font-size:var(--fs-base);transition:.2s}
.nav-links a:hover{color:#fff;background:rgba(255,255,255,.05)}
.nav-spacer{flex:1}
.nav-tools{display:flex;align-items:center;gap:.55rem}
.icon-btn{display:grid;place-items:center;width:44px;height:44px;border-radius:var(--r);border:1px solid var(--line);background:rgba(255,255,255,.02);color:var(--muted-2);transition:.2s;position:relative}
.icon-btn:hover{color:#fff;border-color:var(--line-2);background:rgba(255,255,255,.06)}
.icon-btn .badge{position:absolute;top:-6px;right:-6px;background:var(--red);color:#fff;font-size:var(--fs-2xs);font-weight:var(--fw-bold);line-height:var(--lh-caps);min-width:18px;height:18px;border-radius:9px;display:grid;place-items:center;padding:0 4px}
.burger{display:none}

/* ---------- hero ---------- */
.hero{position:relative;padding:clamp(48px,8vw,104px) 0 clamp(40px,6vw,80px)}
/* Feedback Ludwig 2026-07-11 (2. Runde): links Text, rechts die vier Kennzahlen als
   2x2-Kachel-Grid (.hero-stats) — Inhalte in die Fläche verteilt statt leerer rechter Hälfte. */
.hero-grid{display:grid;grid-template-columns:minmax(0,1.12fr) minmax(0,.88fr);gap:clamp(32px,6vw,88px);align-items:center}
/* Doppelklasse .trust.hero-stats: gewinnt die Spezifität gegen die späteren .trust-Basisregeln
   (display:flex/margin-top/1.5rem-Zahl), ohne sie umzusortieren. */
.trust.hero-stats{display:grid;grid-template-columns:1fr 1fr;gap:clamp(12px,1.6vw,20px);margin-top:0;align-self:center}
.trust.hero-stats .t{background:var(--panel);border:1px solid var(--line);border-radius:var(--r-lg);
  padding:clamp(1.1rem,2vw,1.7rem) clamp(1.15rem,2vw,1.8rem);box-shadow:var(--sh-1)}
.trust.hero-stats .t b{font-size:clamp(1.7rem,2.6vw,2.4rem);line-height:var(--lh-tight)}
.trust.hero-stats .t span{font-size:var(--fs-ms);line-height:var(--lh-title);margin-top:.3rem}
.hero-grid>*{min-width:0}   /* Visual-Audit 2026-07-06 (C2): Grid-Spalten dürfen unter min-content der langen DE-Komposita schrumpfen -> kein Mobil-Overflow */
/* 2026-07-24: entpillt (Doktrin flat/„Rot nur Signal") — der rosa Pill-Badge wirkte billig/templatehaft.
   Flacher Kicker wie .need-eyebrow: nur Versalien + Sperrung, gedämpft, ohne Fläche/Rahmen/Rundung. */
.eyebrow{display:inline-flex;align-items:center;gap:.5rem;font-size:var(--fs-xs);font-weight:var(--fw-semibold);letter-spacing:var(--ls-caps);line-height:var(--lh-caps);text-transform:uppercase;color:var(--muted);margin-bottom:.9rem}
.hero h1{font-size:var(--fs-hero);margin:1.1rem 0 0;font-weight:var(--fw-black);overflow-wrap:break-word;hyphens:auto}
/* Anti-KI 2026-07-16: Verlaufswort in der H1 (KI-Landingpage-Klischee) auf Volltonfarbe; Markup-Span bleibt, verbessert AA. */
.hero h1 .grad{color:var(--text)}
.hero .lead{color:var(--muted-2);font-size:clamp(1.05rem,1.5vw,1.22rem);max-width:46ch;margin:1.3rem 0 0}
.hero-cta{display:flex;gap:.8rem;flex-wrap:wrap;margin-top:2rem}
.trust{display:flex;gap:1.8rem;margin-top:2.4rem;flex-wrap:wrap}
.trust .t{display:flex;flex-direction:column}
.trust .t b{font-family:'Sora';font-size:var(--fs-3xl);font-weight:var(--fw-bold);line-height:var(--lh-tight)}
.trust .t span{color:var(--muted);font-size:var(--fs-sm);line-height:var(--lh-title)}
.cat-load-note{margin-top:.7rem;font-size:var(--fs-xs);color:var(--muted);max-width:62ch}/* E3 Traglast-Vorbehalt (2026-07-11) */

/* hero visual — 2026-07-11 komplett entfernt (Feedback Ludwig): kein Hero-Produktrender mehr. */

/* ---------- section scaffolding ---------- */
.section{padding:clamp(56px,8vw,104px) 0;position:relative}
.section-head{max-width:62ch;margin-bottom:clamp(28px,4vw,52px)}
.section-head .eyebrow{margin-bottom:1rem}
.section-head h2{font-size:var(--fs-h2)}
.section-head p{color:var(--muted-2);margin-top:.9rem;font-size:var(--fs-lg)}

/* ---------- category cards ---------- */
.cat-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:18px}
.cat{
  position:relative;padding:24px;border-radius:var(--r-lg);border:1px solid var(--line);
  background:var(--panel);overflow:hidden;transition:.3s var(--ease);min-height:210px;
  display:flex;flex-direction:column;justify-content:space-between
}/* P4: entkachelt (flat-panel) */
.cat:hover{border-color:var(--line-2);box-shadow:var(--sh-2)}/* P4: Hover-Doktrin — kein translateY */
/* Aufhellen 2026-07-05: roter Radial-Glow der Kategorie-Kachel (Deko #7) entfernt. */
.cat .ico{width:46px;height:46px;display:grid;place-items:center;background:transparent;border:none;color:var(--steel-2)}/* P4: entkachelt — Icon frei, Deko-Icon entfärbt (steel-2, AA) */
.cat h3{font-size:var(--fs-xl);margin-top:16px}
.cat p{color:var(--muted);font-size:var(--fs-base);margin-top:.4rem}
.cat .count{margin-top:14px;font-size:var(--fs-sm);color:var(--steel-2);font-weight:var(--fw-semibold)}
.cat .arrow{position:absolute;top:24px;right:24px;color:var(--muted);transition:.3s}
.cat:hover .arrow{color:var(--text);transform:translate(3px,-3px)}/* P4: Rot-Doktrin — Hover-Pfeil neutral (Micro-Move bleibt) */

/* ---------- feature band ---------- */
.feature-band{border-top:1px solid var(--line);border-bottom:1px solid var(--line);background:var(--ink-2)}/* Design-Refresh 2026-07-16 P6: Dunkelband-Fade → flach */
.feat-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:0}
.feat{padding:30px;border-left:1px solid var(--line)}
.feat:first-child{border-left:none}
.feat .ico{color:var(--steel-2);margin-bottom:14px}/* Deko-Icons entfärbt (Rot nur Signal) 2026-07-16 */
.feat h4{font-size:var(--fs-lg)}
.feat p{color:var(--muted);font-size:var(--fs-base);margin-top:.45rem}

/* ---------- 3d teaser ---------- */
.viewer-card{display:grid;grid-template-columns:1.1fr .9fr;gap:0;border:1px solid var(--line);border-radius:var(--r-xl);overflow:hidden;background:var(--panel)}/* Flat-Panel 2026-07-16: Verlauf raus */
/* Aufhellen 2026-07-05: Bleistift-Skizze + 40px-Raster + roter Glow (Deko #6) raus -> echtes Render. */
.viewer-stage{position:relative;min-height:420px;display:grid;place-items:center;padding:clamp(20px,3vw,40px);background:var(--panel-2)}
.viewer-stage img{width:100%;max-width:460px;height:auto;object-fit:contain;filter:drop-shadow(0 20px 34px rgba(16,24,40,.16))}
.viewer-stage .chip{position:absolute;top:18px;left:18px;font-size:var(--fs-sm);line-height:var(--lh-caps);letter-spacing:var(--ls-caps);text-transform:uppercase;color:#fff;border:1px solid rgba(255,255,255,.15);background:rgba(16,24,40,.72);padding:.4rem .7rem;border-radius:999px}
.viewer-info{padding:clamp(26px,3vw,44px);display:flex;flex-direction:column;justify-content:center}
.viewer-info h2{font-size:var(--fs-h2)}
.viewer-info p{color:var(--muted-2);margin-top:1rem}
.viewer-info ul{list-style:none;padding:0;margin:1.6rem 0 0;display:grid;gap:.7rem}
.viewer-info li{display:flex;gap:.7rem;align-items:flex-start;color:var(--muted-2);font-size:var(--fs-base)}
.viewer-info li svg{color:var(--steel-2);flex:none;margin-top:3px}/* Deko-Häkchen entfärbt 2026-07-16 */

/* ---------- footer ---------- */
.site-footer{border-top:1px solid var(--line);background:var(--ink-2);margin-top:40px;padding:56px 0 30px}
.foot-grid{display:grid;grid-template-columns:1.4fr repeat(3,1fr);gap:30px}
.foot-grid h5{font-size:var(--fs-xs);line-height:var(--lh-caps);letter-spacing:var(--ls-caps);text-transform:uppercase;color:var(--muted);margin:0 0 1rem}
.foot-grid a,.foot-grid .foot-link{
  display:block;color:var(--muted-2);padding:.28rem 0;font:inherit;font-size:var(--fs-base);
  border:0;background:none;text-align:left;cursor:pointer
}
.foot-grid a:hover,.foot-grid .foot-link:hover{color:#fff}
/* Vertrauens-/Anbieterzeile im Footer (Marketing-Audit 2026-07-05 P1) — ersetzt das „Entwurf“-Badge. */
.foot-legal{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem 1.1rem;margin-top:34px;padding-top:22px;border-top:1px solid var(--line);color:var(--muted-2);font-size:var(--fs-ms)}
.foot-legal .foot-legal-name{font-weight:var(--fw-semibold);color:var(--text)}
.foot-legal a{color:var(--muted-2);border-bottom:1px solid transparent;transition:.16s}
.foot-legal a:hover{color:#fff;border-bottom-color:var(--line-2)}
.foot-bottom{display:flex;justify-content:space-between;gap:14px;flex-wrap:wrap;margin-top:18px;padding-top:18px;border-top:1px solid var(--line);color:var(--muted);font-size:var(--fs-sm)}
.foot-dev{color:var(--warn)}

/* ---------- live build banner ---------- */
.live-banner{
  position:fixed;left:50%;bottom:18px;transform:translateX(-50%);z-index:80;
  display:flex;align-items:center;gap:.7rem;
  background:rgba(18,21,27,.92);border:1px solid var(--line-2);border-radius:999px;
  padding:.6rem 1rem .6rem .8rem;box-shadow:var(--sh-2);backdrop-filter:blur(10px);font-size:var(--fs-ms)
}
.live-dot{flex:none;width:9px;height:9px;border-radius:50%;background:var(--good)}
.live-banner b{color:#fff}.live-banner span{color:var(--muted)}

/* ---------- responsive ---------- */
@media (max-width:980px){
  .hero-grid{grid-template-columns:1fr}
  .trust.hero-stats{margin-top:1.4rem}   /* Kennzahl-Kacheln rutschen mobil unter den Text */
  .viewer-card{grid-template-columns:1fr}
  .feat-grid{grid-template-columns:1fr 1fr}
  .feat{border-left:none;border-top:1px solid var(--line)}
  .feat:nth-child(-n+2){border-top:none}
  .foot-grid{grid-template-columns:1fr 1fr}
}
@media (max-width:720px){
  .nav-links{display:none}
  .burger{display:grid}
  .feat-grid{grid-template-columns:1fr}
  .feat{border-top:1px solid var(--line)!important}
  /* Footer mobil: Marke oben über volle Breite, die 3 Link-Spalten NEBENEINANDER (nicht gestapelt). */
  /* Overflow-Fix 2026-07-19: minmax(0,1fr) statt 1fr — sonst treiben lange dt. Einzelwörter
     (Weitspannregale, Fachbodenregale, Cookie-Einstellungen) die Track-min-content-Breite über
     die Container-Breite (Summe 312 > 284 bei 320 px) und erzeugen 10 px Dokument-Overflow (nur DE;
     EN bricht in kürzere Wörter). break-word bricht den Rest-Überhang in der schmalen Spalte um. */
  .foot-grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:22px 12px}
  .foot-grid > :first-child{grid-column:1 / -1}
  .foot-grid a,.foot-grid .foot-link{font-size:var(--fs-sm);overflow-wrap:break-word}
  .trust{gap:1.2rem}
}
@media (max-width:430px){
  /* Overflow-Fix 2026-07-19: 3 Spalten sind bei 320 px nur ~86 px breit — zu schmal für die
     langen dt. Einzelwörter/Titel (Fachbodenregale, Cookie-Einstellungen, „RECHTLICHES"), die
     dann unschön mitten im Wort umbrechen. Auf den kleinsten Screens 2 Spalten (~136 px): alles
     passt ohne Umbruch, bleibt „nebeneinander" (nicht gestapelt) und erzeugt keinen Overflow. */
  .foot-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
}
/* FAB-Overlap-Fix 2026-07-24 (Finding 84): der ortsfeste rote KI-Berater-FAB (.ldc-fab,
   height:54px, bottom clamp 12–24px; via chat.js auf jeder Seite) überdeckt mobil die
   Footer-Feinzeile (Copyright / „Preisliste gültig ab …" / „Entwurf …"). Auf schmalen
   Viewports zusätzliche Bodenreserve schaffen, damit die Rechts-/Preiszeilen frei bleiben —
   der FAB bleibt wo er ist, der Footer wächst nur nach unten. 78px ≈ FAB-Höhe 54 + Offset + Luft. */
@media (max-width:640px){
  .site-footer{padding-bottom:calc(30px + 78px + env(safe-area-inset-bottom, 0px))}
}
/* ============================================================
   CATALOG
   ============================================================ */
.catalog{padding:clamp(26px,4vw,44px) 0 60px}
.catalog-head{display:flex;justify-content:space-between;align-items:flex-end;gap:20px;flex-wrap:wrap;margin-bottom:26px}
.crumbs{color:var(--muted);font-size:var(--fs-ms);margin-bottom:.5rem}
.crumbs a:hover{color:var(--red-text)}
.catalog-head h1{font-size:var(--fs-h2)}
.catalog-head .muted{color:var(--muted);font-weight:var(--fw-medium);font-size:var(--fs-md);font-family:'Inter'}
.catalog-head .muted b{color:var(--red-text)}
.catalog-tools{display:flex;gap:.7rem;align-items:center;flex-wrap:wrap}
.search-wrap{position:relative;display:flex;align-items:center}
.search-wrap svg{position:absolute;left:14px;width:18px;height:18px;color:var(--muted);pointer-events:none}
.search-wrap input{width:min(340px,68vw);padding:.74rem .9rem .74rem 2.5rem;border-radius:var(--r);border:1px solid var(--line-2);background:var(--panel);color:var(--text);font-size:var(--fs-base)}/* P4: entpillt (Aktions-Control) */
.search-wrap input:focus{outline:none;border-color:var(--red);box-shadow:0 0 0 3px rgba(226,0,26,.15)}
#sort{padding:.74rem 1rem;border-radius:var(--r);border:1px solid var(--line-2);background:var(--panel);color:var(--text);font-size:var(--fs-base);cursor:pointer}/* P4: entpillt (Aktions-Control) */

.catalog-body{display:grid;grid-template-columns:248px 1fr;gap:26px;align-items:start}
.sidebar{position:sticky;top:88px;border:1px solid var(--line);border-radius:var(--r-lg);background:var(--panel);padding:6px 18px 18px;max-height:calc(100vh - 108px);overflow:auto}/* P4: entkachelt (flat-panel) */
.sidebar-head{font-family:'Sora';font-weight:var(--fw-bold);font-size:var(--fs-lg);padding:16px 0 6px;position:sticky;top:0;background:var(--panel);z-index:1}
.facet{padding:14px 0;border-top:1px solid var(--line)}
.facet h4{font-size:var(--fs-xs);line-height:var(--lh-caps);letter-spacing:var(--ls-caps);text-transform:uppercase;color:var(--muted-2);margin-bottom:.7rem;font-family:'Inter';font-weight:var(--fw-semibold)}
.facet-list{display:flex;flex-direction:column;gap:.15rem}
.facet-opt,.facet-toggle{display:flex;align-items:center;gap:.55rem;font-size:var(--fs-base);color:var(--muted-2);cursor:pointer;padding:.28rem .35rem;border-radius:7px;transition:.15s}
.facet-opt:hover,.facet-toggle:hover{background:rgba(0,0,0,.04);color:var(--text)}
.facet-opt em{margin-left:auto;color:var(--muted);font-style:normal;font-size:var(--fs-sm)}
.facet-opt input,.facet-toggle input{accent-color:var(--red);width:15px;height:15px}
.price-row{display:flex;align-items:center;gap:.5rem}
.price-row input{width:100%;padding:.5rem .6rem;border-radius:8px;border:1px solid var(--line-2);background:var(--panel);color:var(--text);font-size:var(--fs-ms)}
.price-row span{color:var(--muted)}
/* Maß-Bereichs-Facette (Marketing-Audit 2026-07-05, P1) — H/B/T je min/max, Preis-Range wiederverwendet. */
.dim-list{display:flex;flex-direction:column;gap:.55rem}
.dim-row .dim-label{display:block;font-size:var(--fs-sm);color:var(--muted-2);margin-bottom:.25rem;font-weight:var(--fw-medium)}
/* Fachlast/Feldlast-Zeile auf der Produktkarte (Traglast als erstes B2B-Kaufkriterium sichtbar). */
.pcard-load{color:var(--muted-2);font-weight:var(--fw-semibold)}
/* P3 (Audit 2026-07-05): Kürzel-Tooltips (abbr.js) — dezent gepunktet, Hilfe-Cursor. */
abbr.gl{text-decoration:underline dotted;text-decoration-color:var(--line-2);text-underline-offset:2px;cursor:help}

.pgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:18px}
.pcard{display:flex;flex-direction:column;border:1px solid var(--line);border-radius:var(--r);overflow:hidden;background:var(--panel);transition:.25s var(--ease)}/* P4: entkachelt (flat-panel, kein Verlauf) */
.pcard:hover{border-color:var(--line-2);box-shadow:var(--sh-2)}/* P4: Hover-Doktrin — kein translateY, nur Rand+Schatten */
.pcard-art{position:relative;aspect-ratio:5/4;display:grid;place-items:center;background:var(--panel-2);color:var(--steel);border-bottom:1px solid var(--line);overflow:hidden}/* Visual-Audit 2026-07-06 (#17 safe): clippt übergroße SSR/no-JS-Bilder, sprengt die Karte nicht mehr; P4: 5/4 (Regal-Hochformat, weniger Weißrand) */
.pcard-art svg{width:52%}
.s3-badge{position:absolute;top:10px;left:10px;background:var(--red);color:#fff;font-size:var(--fs-2xs);font-weight:var(--fw-bold);line-height:var(--lh-caps);letter-spacing:var(--ls-caps);padding:.2rem .5rem;border-radius:6px}
.pcard-body{padding:14px 14px 14px;display:flex;flex-direction:column;flex:1}
.pcard-sys{font-size:var(--fs-xs);line-height:var(--lh-caps);letter-spacing:var(--ls-caps);color:var(--steel-2);font-weight:var(--fw-semibold);text-transform:uppercase}
.pcard-name{font-family:'Inter';font-weight:var(--fw-semibold);font-size:var(--fs-base);line-height:var(--lh-snug);margin:.4rem 0 0;color:var(--text);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;min-height:2.4em}
.pcard-spec{color:var(--muted);font-size:var(--fs-sm);margin-top:.4rem}
.pcard-foot{display:flex;align-items:flex-end;justify-content:space-between;gap:10px;margin-top:auto;padding-top:12px}
.pcard-price{display:flex;flex-direction:column;line-height:1.25;min-width:0}
.pcard-price .now{font-family:'Sora';font-weight:var(--fw-bold);font-size:var(--fs-xl);line-height:var(--lh-tight);color:var(--text)}
.pcard-price .was{font-size:var(--fs-xs);color:var(--muted);text-decoration:line-through}
.pcard-price .vat{font-size:var(--fs-xs);color:var(--muted)}
/* #117: Direktkauf-Button trägt jetzt Icon + Label (.pcard-add-lbl) — nicht mehr fixes
   44×44-Quadrat, sondern content-breit mit ≥44px Touch-Höhe und Icon-Label-Abstand.
   Das reine Icon (added-Swap / Renderer ohne Label) bleibt über min-width:44px quadratisch. */
.pcard-add{padding:.55rem .85rem;border-radius:var(--r);min-width:44px;min-height:44px;display:inline-flex;align-items:center;justify-content:center;gap:.45rem;white-space:nowrap}/* W4m-2: 44px Touch-Ziel (Site-Standard) */
.pcard-add .pcard-add-lbl{font-size:var(--fs-ms);font-weight:var(--fw-semibold)}
.pcard-add.added{background:var(--good)}
.more-wrap{display:flex;justify-content:center;margin-top:30px}
.empty{grid-column:1/-1;text-align:center;color:var(--muted);padding:60px 0;display:flex;flex-direction:column;gap:18px;align-items:center}

@media (max-width:900px){
  .catalog-body{grid-template-columns:1fr}
  .sidebar{position:static;max-height:none;display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:0 22px}
  .sidebar-head{grid-column:1/-1}
}

/* ============================================================
   Mobile-Audit 2026-07-11 — gezielte Mobil-Fixes (Desktop-Optik unberührt)
   ============================================================ */
/* P2-1: iOS Safari zoomt bei Fokus auf Felder <16px. Katalog-Suche + Sortierung
   (und die Preis-Range-Inputs der Facetten) auf ≥16px — nur mobil. */
@media (max-width:760px){
  .search-wrap input,#sort,.price-row input{font-size:16px}
}
/* P2-3: Lange Primär-CTA-Labels werden bei 320–345px vom nowrap-Button rechts
   abgeschnitten. Auf sehr schmalen Screens den Umbruch im Button erlauben
   (Hero-/Kategorie-/Guide-/Beratungs-CTAs). Buttons dürfen zweizeilig werden — Optik
   sitewide bleibt unverändert (gezielter Selektor, nur ≤430px). */
@media (max-width:430px){
  .hero-cta .btn,.guide-cta .btn,.cat-hero-copy .btn,.cta-actions .btn{white-space:normal;text-align:center;max-width:100%}
  /* #117: Auf der 2-spaltigen Mobil-Karte reicht die Breite nicht für Preis + beschrifteten
     Kaufbutton. Dort auf das reine Icon zurückfallen (44×44 bleibt), damit die Fußzeile
     nicht überläuft. Ab 431px zeigt der Button wieder „In den Warenkorb". */
  .pcard-add .pcard-add-lbl{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
  .pcard-add{gap:0}
}
/* P3-5: Scroll-Lock, solange der Off-Canvas-Drawer offen ist — der Hintergrund soll
   nicht hinter dem Menü weiterscrollen (Doppel-Scroll). Rein CSS via :has(); kein JS
   nötig (site.js togglet .nav-links.open). Overlay bleibt selbst scrollbar. */
body:has(.nav-links.open){overflow:hidden}

@media (prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  *,*::before,*::after{
    animation-duration:.001ms!important;animation-iteration-count:1!important;
    transition-duration:.001ms!important;scroll-behavior:auto!important;
  }
}   /* Visual-Audit 2026-07-06 (#5): auch Transitions + Smooth-Scroll deaktivieren, nicht nur animation */

/* ============================================================
   P17 · Quer-QA — abgestimmter Mini-Fix (a11y), additiv.
   Bewusst NUR die Fokus-Baseline: Header-Fokus, Mobil-Menue (.nav-links.open)
   und Header-Layout liegen in components/header.css (P3) und werden dort
   gepflegt -> hier nichts Header-spezifisches, um Kollisionen zu vermeiden.
   Header-Overflow @360px ist als To-do an P3 gelistet (docs/QA_REPORT.md).
   ============================================================ */

/* (A11y) Sichtbarer Tastatur-Fokus als Baseline fuer interaktive Elemente,
   die NICHT bereits in header.css abgedeckt sind: .btn (Hero-CTAs,
   "Planer oeffnen"), Katalog-Suche/-Sortierung, Produktkarten-Buttons,
   Facetten-Checkboxen, "Mehr laden".
   :where() hat Spezifitaet 0 -> die roten Header-Outlines aus header.css
   (.icon-btn/.nav-top/...) gewinnen weiterhin; weiss bleibt fuer den Rest
   und ist auch auf rotem .btn-primary kontrastreich sichtbar. */
:where(a,button,input,select,textarea,summary,[tabindex]:not([tabindex="-1"])):focus-visible{
  outline:3px solid var(--text);   /* Aufhellen 2026-07-05: dunkler Fokusring, auf hellem Grund sichtbar */
  outline-offset:2px;
}

/* ============================================================
   MEGA-MENÜ — JS-Zustand (Verhalten: assets/js/nav.js, P3)
   Ergänzt die reine Hover/:focus-within-Baseline aus components/header.css (P1).
   nav.js markiert die Leiste mit [data-enhanced] und schaltet je Item .open
   (Klick/Touch/Tastatur öffnet) bzw. .hover-off (Escape erzwingt Schließen
   trotz Hover/Fokus). Höhere Spezifität als die header.css-Basisregeln.
   ============================================================ */
@media (min-width:721px){   /* nur Desktop; <=720px = Off-Canvas-Drawer aus header.css */
  /* visibility wird hier NICHT interpoliert (sonst Engine-Quirk: Panel bleibt hidden,
     Menüpunkte nicht fokussierbar) — beim Öffnen sofort sichtbar schalten. */
  .nav-links[data-enhanced] .nav-item.has-mega.open > .mega{
    opacity:1;visibility:visible;transform:none;pointer-events:auto;
    transition:opacity .18s ease,transform .18s ease,visibility 0s
  }
  .nav-links[data-enhanced] .nav-item.has-mega.hover-off > .mega{
    opacity:0;visibility:hidden;transform:translateY(8px);pointer-events:none;
    transition:opacity .18s ease,transform .18s ease,visibility 0s
  }
}

/* Warenkorb: Hinweis bei automatisch entfernten (nicht mehr gelisteten) Positionen (fe-06). */
.cart-removed-note{
  display:flex;gap:.6rem;align-items:flex-start;
  margin:0 0 1.1rem;padding:.85rem 1rem;
  background:var(--warn-bg);border:1px solid var(--warn-line);border-radius:var(--r-sm);
  color:var(--muted-2);font-size:var(--fs-base);line-height:1.45
}
.cart-removed-note svg{flex:0 0 auto;color:var(--warn-text);margin-top:1px}

/* ============================================================
   L-3 (Audit 2026-07-02) · Ziffern-Praezision: technische Zahlen
   (Preise, Masse, Traglasten, Summen) in Tabellenziffern — Spalten
   fluchten, Preis-Updates "springen" nicht. Rein typografisch.
   ============================================================ */
.pdp-price, .pdp-pricebox, .pdp-specs table, .pdp-specs td, .pdp-cross-price,
.cart-prices, .cart-summary, .sum, .sum-line, .sum-item, .sum-qty,
.cfg-price, .qf-pos, .trust .t b,
.pcard-price, .pcard-spec, .pcard-load, .pdp-now, .pdp-axis-val, .pdp-opt, .pdp-gross, .ls-price,
.reco-price {/* Design-Refresh 2026-07-16 P6: Empfehlungspreis in tabular-nums-Whitelist ergänzt */
  font-variant-numeric: tabular-nums lining-nums;
}

/* --- W3 (Ludwig): Kategorie-Kacheln mit echten Produktbildern + Bestseller-Fotos --- */
.cat-photo{background:#fff;border-radius:var(--r-lg);aspect-ratio:4/3;position:relative;overflow:hidden}/* Design-Refresh 2026-07-16 P6: Radius tokenisiert (14px→--r-lg) · Mobile-Fix 2026-07-18: Bild absolut statt Grid-Item — Portrait-Tiles (bis 800×1914) sprengten die 4/3-Box (min-content schlägt aspect-ratio, max-height:100% löst zirkulär nicht auf); mobil wuchsen Kacheln auf ~2 Screenhöhen + Layout-Shift beim Lazy-Load */
.cat-photo img{position:absolute;inset:14px;width:calc(100% - 28px);height:calc(100% - 28px);object-fit:contain}
.cat.has-photo h3{margin-top:14px}
.pcard-art.has-photo{background:#fff}
.pcard-art .pcard-photo{max-width:88%;max-height:88%;width:auto;height:auto;object-fit:contain}
/* Sanftes Einblenden lazy geladener Bilder (JS setzt html.js-img-fade + .img-ready; ohne JS voll sichtbar) */
html.js-img-fade img[loading="lazy"]{opacity:0;transition:opacity .35s var(--ease,ease)}
html.js-img-fade img[loading="lazy"].img-ready{opacity:1}
