/** Shopify CDN: Minification failed

Line 1452:2 Unexpected "{"
Line 1452:3 Expected identifier but found "%"
Line 1453:15 Expected identifier but found whitespace
Line 1453:63 Unexpected "1000px"
Line 1456:3 Expected identifier but found "%"
Line 1467:2 Unexpected "{"
Line 1467:3 Expected identifier but found "%"
Line 1468:12 Unexpected "05.09"
Line 1471:3 Expected identifier but found "%"

**/
/* SHOPIFY_STYLESHEETS_VERSION: 1.0 */


/* CSS from section stylesheet tags */
/* START_SECTION:brand-statement (INDEX:0) */
.brand-statement__inner {
    max-width: 56rem;
    margin: 0 auto;
    padding: var(--section-pad-block) var(--section-pad-inline);
    text-align: center;
  }

  .brand-statement__text {
    font-family: var(--font-heading);
    font-weight: 600;
    font-size: var(--mq-buehne-5);
    line-height: 1.4;
    letter-spacing: -0.01em;
    margin: 0;
  }

  .brand-statement__mark {
    margin: 0 0.08em;
  }
/* END_SECTION:brand-statement */

/* START_SECTION:cart-drawer (INDEX:1) */
/* ═══════════ Warenkorb-EIGENES ═══════════
     Die Overlay-Huelle (.mq-ov, .mq-ov__tint, .mq-ov__card, __head, __title,
     __x, __body, __foot) steht seit dem 04.08.2026 vollstaendig in
     assets/base.css im Block "Gemeinsames Modal-System". Hier stand bis dahin
     eine aeltere, schmalere Teilfassung derselben Klassen.

     Sie musste weg, weil sie GEWONNEN hat: Das gebuendelte Stylesheet der
     Sections haengt Shopify ueber content_for_header ein, also NACH base.css.
     Bei gleicher Spezifitaet gewinnt das spaetere — und der Schieber liegt auf
     jeder Seite im Render-Tree. Die alte Fassung hat damit die zurueckgeholte
     Arbeit ueberall ausgehebelt: 420 statt 480 px, feste 16px-Ecken statt
     --mq-ecke-gross aus dem Theme-Editor, kein transform in der Transition
     (also keine Einblendbewegung), 16px-Titel statt 20px, und der 54px-Platz
     fuer das Schliesskreuz fiel weg.

     Am schlimmsten traf es das mobile Blatt: @media (max-width: 579px) in
     base.css erhoeht die Spezifitaet nicht, also blieben top/left/transform aus
     der alten Fassung stehen — nur die is-open-Regel schlug durch, und die
     Karte rutschte beim Oeffnen unter 580px in den unteren rechten Quadranten.
     Das war schlechter als vor der Wiederherstellung.

     Uebrig bleibt hier nur, was wirklich zum Warenkorb gehoert. */

  /* Werte am laufenden Checkout am "Pay now"-Knopf ausgelesen:
     Grundfarbe #005BD1, beim Ueberfahren und Druecken #00459E, Ecken 12px.
     Die drei Werte stehen auf :root in layout/theme.liquid — sonst gaelte
     .cd__checkout nur im Schieber. Gleiche Werte, nur eine Ebene hoeher.

     04.08.2026: Die zweite Kommentarzeile begann mit Backslash-Stern statt
     Schraegstrich-Stern. Der Kommentar oeffnete dadurch nie, die drei
     folgenden Zeilen wurden zu einem ungueltigen Selektor, und .cd__panel
     bekam sein display:flex nicht. Aufgefallen ist es erst, als base.css die
     Regel ersatzweise mittrug. */
  .cd__panel { display: flex; flex-direction: column; }

  /* Innenabstand fuer den Rumpf. .cd__inner steckt auch in der rechten Spalte
     der Cart-Seite — deshalb nur innerhalb des Schiebers (.cd__panel), sonst
     wuerde die Cart-Seite mitverschoben. Der Rumpf einer Blende (.mq-ov__body)
     bekommt seinen Abstand aus base.css. */
  .cd__panel .cd__inner { min-height: 0; padding:0 20px; }
  .cd__inner { min-height: 0; }

  /* Der Schieber ist weiss. Das Grau kommt aus dem Checkout, wo die Uebersicht
     auf der grauen Spalte liegt — hier gibt es diese Spalte nicht. */
  .cd__panel .x-summary > div { background-color: #fff; }

  /* Gescrollt wird NUR die Artikelliste — das ist der eigene Rollbereich des
     Checkouts. Damit bleiben Zwischensumme, Versand, Gesamt und die Knoepfe
     fest unten stehen. Der aeussere Kasten darf deshalb nicht mehr rollen:
     sein overflow hat auch die Mengen-Blase ueber dem ersten Bild abgeschnitten
     (die ragt oben heraus; der Checkout faengt das mit padding/margin ab).

     Der Fuss selbst (.mq-ov__foot) bekommt Abstand und das hidden-Verhalten
     seit dem 04.08.2026 aus assets/base.css — hier stand dieselbe Regel
     doppelt. */

  /*
    The cart body is NOT styled here. Its markup is the checkout's own order
    summary and its stylesheet is assets/checkout-summary.css — the original,
    pulled out of the checkout's stylesheets. Nothing below touches it; the
    drawer only says how tall it may get and what sits around it. Its inner
    padding comes from the checkout's summary panel, so there is none here.
  */
  /* No flex:1 here. It gave the cart body a definite height, and the checkout's
     rows carry height:100% (._1fragem4q) — so each row stretched to the whole
     panel and then shrank back to an even share: two 104/156px rows both came
     out 130px tall. The rows size themselves; the checkout's own scroll area
     (._1b9t7yp2, max-height 40vh) caps the list. */
  .cd__inner { min-height: 0; }
  /* Warenkorb-Reste, die es vor dem gemeinsamen Aufbau gab, sind ersetzt durch
     .mq-ov__head / .mq-ov__body / .mq-ov__foot. */
  /* In the drawer the cart body is wrapped by Shopify's own section div, so the
     scrolling has to sit on THAT element — it is the flex child of the panel.
     shrink-only (0 1 auto), never grow: growing would hand the checkout's rows
     a definite height and they carry height:100%. */
  .cd__panel > .shopify-section { flex: 0 1 auto; overflow: visible; }

  /* ---- Hoehendeckel der Artikelliste, 08.08.2026 ----
     Der Checkout deckelt sie mit max-height: 40vh (Klasse ._1b9t7yp2, Wert
     ueber --_16s97g73f). Seine Regel dafuer steht aber in einer Abfrage ab
     1000px — auf dem Handy galt sie nicht, und die Liste wuchs unbegrenzt.
     Zusammen mit overflow: hidden auf der Karte hiess das: Bei vielen Artikeln
     oder aufgeklappten Buendeln wurde die Fusszeile mit dem Kasse-Knopf
     abgeschnitten.

     Hier derselbe Deckel fuer schmale Schirme, in dvh statt vh, damit die
     Adressleiste des Browsers nicht mitzaehlt. Die Liste scrollt dann, die
     Fusszeile bleibt sichtbar. */
  @media screen and (max-width: 999.99px) {
    .cd__panel .x-summary ._1b9t7yp2 {
      max-height: 40dvh;
      overflow-y: auto;
      overscroll-behavior-y: contain;
    }
  }
  /* primary button, 1:1 with the checkout "Pay now" button */
  .cd__checkout {
    display: flex; align-items: center; justify-content: center; text-align: center; text-decoration: none;
    font-family: var(--font-heading, sans-serif); font-weight: 700; font-size: 14px;
    color: #fff; background: var(--cd-accent); padding:14px; min-height: 50px;
    border-radius: var(--cd-radius); cursor: pointer; border: 0; width: 100%;
    /* Uebergang 1:1 aus dem Checkout: 0.2s ease-in-out auf denselben sechs
       Eigenschaften. Ohne ihn springt die Farbe, im Checkout blendet sie. */
    transition: color 0.2s ease-in-out, background-color 0.2s ease-in-out,
                border-color 0.2s ease-in-out, box-shadow 0.2s ease-in-out,
                opacity 0.2s ease-in-out, transform 0.2s ease-in-out;
  }
  .cd__checkout:hover { background: var(--cd-accent-hover); }
  /* Fokus-Rahmen wie im Checkout: 1px innen, in der dunkleren Blauvariante. */
  .cd__checkout:focus-visible { outline: 0; box-shadow: inset 0 0 0 1px var(--cd-accent-hover); }
  /* everything about this button lives in .btn-grey (assets/base.css) — only
     its distance to the blue button above is local */
  .cd__view { margin-top:var(--raum-1); }

  /* Ruecksendezeile unter den beiden Knoepfen. Abstand 16px wie im Raster,
     Schriftgroesse 12px — dieselbe wie "Secure SSL checkout" darueber, damit
     kein neuer Wert dazukommt. */
  .cd__returns { margin:16px 0 0; font-size: 12px; line-height: 1.4; color: var(--x-default-color-text-subdued, #707070); text-align: center; }
  .cd__returns a { color: var(--cd-accent); text-decoration: underline; white-space: nowrap; }

  .cd__empty { padding:var(--raum-6) 20px; text-align: center; }
  .cd__emptytxt { color: var(--mq-text-leise); margin:0 0 20px; }

  /* Die Reservierung: eine Zeile ueber dem Warenkorb, die zeigt, wie lange die
     Artikel gehalten werden. Sie steht in snippets/cart-contents.liquid und
     erscheint dadurch im Schieber UND auf der Warenkorb-Seite.

     Kein eigener Rahmen, kein Kasten: Sie ist eine Angabe zum Warenkorb, keine
     Werbeflaeche. Die Masse sind die des Checkouts — 14px Text, 12px/20px
     Innenabstand wie die Kopfzeile der Zusammenfassung darunter.

     Die Farbe kommt aus dem Regler farbe_akzent, damit die Zeile zum Kaufknopf
     passt und nicht als Warnung gelesen wird. Ablaufende Zeit ist keine
     Fehlermeldung; erst der abgelaufene Warenkorb ist eine, und dafuer setzt
     assets/mq.js role="alert". */
  .cd__hold {
    display: flex;
    align-items: center;
    gap:8px;
    padding:12px 20px;
    font-size: 14px;
    line-height: 1.4;
    color: var(--cd-accent);
    border-bottom: 1px solid var(--mq-linie);
  }

  .cd__hold[hidden] { display: none; }

  /* Fehlerzeile des Warenkorbs: Muelleimer und Rabattcode melden sich hier.
     Masse und Farbe wie die Fehlerzeile des Kaufknopfs (.pb__adderr), damit
     eine Fehlermeldung im ganzen Shop gleich aussieht. */
  .cd__fehler {
    margin:0;
    padding:12px 20px;
    font-size: 14px;
    line-height: 1.4;
    color: var(--mq-fehler, #d91c1c);
    border-bottom: 1px solid var(--mq-linie);
  }

  .cd__fehler[hidden] { display: none; }

  /* Der Punkt links: derselbe, den die Produktseite fuer den Lagerstand nutzt
     (.pb__dot). Er sagt "laeuft gerade", ohne ein Wort zu brauchen. */
  .cd__hold-punkt {
    flex: 0 0 auto;
    width: 8px;
    height: 8px;
    border-radius: var(--ecke-rund);
    background: currentColor;
  }

  /* Abgelaufen: Die Zeile wird zur Meldung und wechselt auf die Fehlerfarbe des
     Shops. Getroffen wird sie ueber role="alert", das assets/mq.js genau dann
     setzt — kein zweites Attribut noetig. */
  .cd__hold[role="alert"] { color: var(--mq-fehler, #d91c1c); }
  .cd__hold[role="alert"] .cd__hold-punkt { display: none; }

  /* Bewegung nur, wo sie erlaubt ist. Der Punkt pulst leise, damit die Zeile
     lebt, ohne zu blinken. */
  @media (prefers-reduced-motion: no-preference) {
    .cd__hold-punkt { animation: cd-hold-puls 2s ease-in-out infinite; }
  }

  @keyframes cd-hold-puls {
    0%, 100% { opacity: 1; }
    50% { opacity: 0.35; }
  }
/* END_SECTION:cart-drawer */

/* START_SECTION:feature-banner (INDEX:3) */
/*
    Rebuilt from samsung.com/us — their .hd08-hero-kv-home. Source read
    directly, not inferred: CSS at .../home/ho-g-hero-kv-home/clientlibs/
    site.min.*.css, JS at the matching site.min.*.js (its updateShrinkMotion
    is transferred in assets/scroll-shrink.js).

    The effect: __contents starts full-width and its max-width shrinks
    linearly to 1440px as you scroll, staying centred. Only the coloured
    panel narrows — the text does NOT move with it, because the text is
    anchored to the CENTRE, not to the edge:

      .hd08-hero-kv-home--text-align-desktop-middle-right __text-wrap {
        right: 50%; margin-right: -748px; padding-right: 88px;
      }

    right:50% resolves to the container's midpoint, and that midpoint is
    always the viewport midpoint (left:50% + translateX(-50%) on __contents)
    no matter how narrow it gets. The -748px offset is fixed. Anchoring to
    the edge instead (right:60px) would drag the text along — that is the
    whole trick.
  */
  .feature-banner {
    position: relative;
    width: 100%;
    max-width: 1920px;
    height: 100vh;
    /*
      Pull back up under the overlay's top bar + header so this section starts
      at the very top of the overlay and keeps its full height. Those bars
      keep their place in flow (which is what stacks them) but are lifted over
      this section by z-index — see sections/section2-top-bar.liquid and
      sections/section2-header.liquid. --overlay-bars-height is measured in
      layout/theme.liquid.
    */
    margin: calc(-1 * var(--overlay-bars-height, 0px)) auto 0;
    font-size: 0;
  }

  .feature-banner__contents {
    overflow: hidden;
    position: absolute;
    left: 50%;
    bottom: 0;
    width: 100%;
    height: 100%;
    max-width: 1920px;
    margin: 0 auto;
    transform: translateX(-50%);
    background: #dedede;
  }

  /*
    Their .hd08-hero-kv-home__contents.is-animation, verbatim. Added by
    assets/scroll-shrink.js only while the shrink is mid-flight, lifting the
    panel onto its own compositing layer for the duration. Without it the
    resize repaints on the main thread every frame and the motion judders.
  */
  .feature-banner__contents.is-animation {
    will-change: transform;
  }

  /*
    Anchored to the centre (right/left: 50% + a fixed margin), never to the
    edge — see the note above. Their exact offsets: -748px / -720px, with
    88px / 60px of padding pulling the text back inward.
  */
  .feature-banner__text-wrap {
    position: absolute;
    top: 50%;
    z-index: 10;
    width: 620px;
    box-sizing: content-box;
    transform: translateY(-50%);
    font-size: 16px;
  }

  .feature-banner--align-left .feature-banner__text-wrap {
    left: 50%;
    margin-left: -720px;
    padding-left: 60px;
  }

  .feature-banner--align-right .feature-banner__text-wrap {
    right: 50%;
    margin-right: -748px;
    padding-right: 88px;
  }

  .feature-banner--align-center .feature-banner__text-wrap {
    left: 50%;
    width: 720px;
    transform: translate(-50%, -50%);
    text-align: center;
  }

  /* Their fluid band below 1440px — same ratios, vw instead of px. */
  @media screen and (min-width: 750px) and (max-width: 1440px) {
    .feature-banner--align-left .feature-banner__text-wrap {
      margin-left: -50vw;
      padding-left: 4.16666667vw;
    }

    .feature-banner--align-right .feature-banner__text-wrap {
      margin-right: -51.94444444vw;
      padding-right: 6.11111111vw;
    }

    .feature-banner--align-center .feature-banner__text-wrap {
      width: 50vw;
    }
  }

  @media screen and (max-width: 749.99px) {
    .feature-banner {
      height: 177.77777778vw;
    }

    .feature-banner__text-wrap,
    .feature-banner--align-left .feature-banner__text-wrap,
    .feature-banner--align-right .feature-banner__text-wrap,
    .feature-banner--align-center .feature-banner__text-wrap {
      top: 50%;
      left: 50%;
      right: auto;
      width: 86.66666667vw;
      margin: 0;
      padding: 0;
      transform: translate(-50%, -50%);
      text-align: center;
    }
  }

  .feature-banner--text-black {
    color: var(--color-ink);
  }

  .feature-banner--text-white {
    color: var(--color-background);
  }

  .feature-banner__headline {
    font-family: var(--font-heading);
    font-weight: 700;
    font-size: var(--mq-buehne-2);
    line-height: 1.15;
    letter-spacing: -0.01em;
    margin: 0 0 var(--space-2);
  }

  .feature-banner__desc {
    font-family: var(--font-heading);
    font-weight: 400;
    font-size: var(--mq-buehne-6);
    line-height: 1.3;
    margin: 0;
  }

  .feature-banner__cta-wrap {
    display: flex;
    align-items: center;
    gap: var(--space-3);
    margin-top: var(--space-4);
  }

  .feature-banner--align-center .feature-banner__cta-wrap {
    justify-content: center;
  }

  .feature-banner__link {
    font-family: var(--font-body);
    font-size: 14px;
    color: inherit;
    text-decoration: none;
    border-bottom: 1px solid currentColor;
    padding-bottom: 2px;
  }

  .feature-banner__button {
    font-family: var(--font-body);
    font-size: 14px;
    color: inherit;
    text-decoration: none;
    border: 1px solid currentColor;
    border-radius: 9999px;
    padding: 0.5em 1.4em;
    transition: background-color 0.15s ease, color 0.15s ease;
  }

  .feature-banner--text-black .feature-banner__button:hover {
    background: var(--color-ink);
    color: var(--color-background);
  }

  .feature-banner--text-white .feature-banner__button:hover {
    background: var(--color-background);
    color: var(--color-ink);
  }

  /*
    Their text reveal, values from the same stylesheet:
      opacity   .5s linear
      transform 1.5s cubic-bezier(0, 0.18, 0.07, 1)
    staggered .067s / .134s / .201s, starting at translateY(20px). This is a
    one-shot entrance and is unrelated to the shrink, which stays glued to
    the scroll position.
  */
  .feature-banner__headline,
  .feature-banner__desc,
  .feature-banner__cta-wrap {
    opacity: 0;
    visibility: hidden;
    transform: translateY(20px);
    transition: opacity 0.5s linear, transform 1.5s cubic-bezier(0, 0.18, 0.07, 1);
  }

  .feature-banner__text-wrap.is-ani .feature-banner__headline,
  .feature-banner__text-wrap.is-ani .feature-banner__desc,
  .feature-banner__text-wrap.is-ani .feature-banner__cta-wrap {
    opacity: 1;
    visibility: visible;
    transform: translateY(0);
  }

  .feature-banner__text-wrap.is-ani .feature-banner__headline {
    transition-delay: 0.067s;
  }

  .feature-banner__text-wrap.is-ani .feature-banner__desc {
    transition-delay: 0.134s;
  }

  .feature-banner__text-wrap.is-ani .feature-banner__cta-wrap {
    transition-delay: 0.201s;
  }

  @media (prefers-reduced-motion: reduce) {
    .feature-banner__headline,
    .feature-banner__desc,
    .feature-banner__cta-wrap {
      opacity: 1;
      visibility: visible;
      transform: none;
      transition: none;
    }
  }
/* END_SECTION:feature-banner */

/* START_SECTION:features (INDEX:4) */
.features__inner {
    max-width: var(--container-width);
    margin: 0 auto;
    padding: var(--section-pad-block) var(--section-pad-inline);
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--space-5);
    border-top: 1px solid var(--color-line);
  }

  @media screen and (min-width: 750px) {
    .features__inner {
      grid-template-columns: repeat(3, 1fr);
    }
  }

  .features__index {
    display: block;
    font-family: var(--font-heading);
    font-weight: var(--mq-fett);
    font-size: 12px;
    color: var(--mq-text-leise);
    letter-spacing: 0.08em;
    margin: 0 0 var(--space-2);
  }

  .features__title {
    font-size: 18px;
    margin: 0 0 var(--space-1);
  }

  .features__text {
    font-family: var(--font-body);
    font-size: 14px;
    line-height: 1.6;
    color: var(--mq-text-leise);
    margin: 0;
    max-width: 32ch;
  }
/* END_SECTION:features */

/* START_SECTION:footer (INDEX:5) */
.site-footer {
    border-top: 1px solid var(--color-line);
  }

  .site-footer__inner {
    max-width: var(--container-width);
    margin: 0 auto;
    padding: var(--section-pad-block) var(--section-pad-inline);
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: var(--space-2);
  }

  .site-footer__tagline {
    font-size: 14px;
    color: var(--color-ink);
    opacity: 0.6;
    margin: 0;
  }

  /* Umbruch-Eigenschaften der Fusszeilen-Meta. Am 04.08.2026 aus der Sicherung
     vom 02.08. zurueckgeholt. In .site-footer__meta stehen zwei Auswahlfelder,
     der Kontakt-Link und die Copyright-Zeile; ohne flex-wrap bleibt das auf
     schmalen Schirmen eine einzige nicht umbrechende Reihe. */
  .site-footer__meta {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: flex-end;
    min-width: 0;
    max-width: 100%;
    gap: var(--space-3);
    font-size: 14px;
  }

  .site-footer__meta a {
    text-decoration: none;
  }

  /* Mobile Fusszeile: volle Breite, linksbuendig. Am 04.08.2026 aus der
     Sicherung vom 02.08. zurueckgeholt, damit die umgebrochene Meta-Zeile
     unter 640px nicht rechtsbuendig zerfranst. */
  @media screen and (max-width: 749.99px) {
    .site-footer__meta {
      width: 100%;
      justify-content: flex-start;
    }
  }
/* END_SECTION:footer */

/* START_SECTION:header (INDEX:6) */
/*
    The hero's header. Plain and self-contained: no scroll-linked behavior,
    no effects, no animation, no hiding. It just sits there, full stop. Has
    nothing to do with sections/section2-header.liquid — that one lives
    inside the overlay and is a separate section entirely.

    Position goes on the shopify-section-* WRAPPER, not .site-header
    itself: Shopify sizes that wrapper exactly to its content, leaving no
    room to position within it.
  */
  #shopify-section-header {
    position: fixed;
    top: var(--topbar-height, 0px);
    left: 0;
    right: 0;
    z-index: 10;
  }

  @media screen and (min-width: 750px) {
    /*
      Inside .scroll-stage (position:fixed, inset:0 — see base.css), absolute
      pins to the viewport exactly like fixed did, but keeps this header in
      the stage's stacking context so the section-2 overlay (z-index 100)
      can actually cover it. As `fixed` it sat in the root context instead,
      out of the overlay's reach at any z-index.
    */
    #shopify-section-header {
      position: absolute;
      /*
        Reserve the overlay's scrollbar here. The hero layer has no scrollbar of
        its own, the overlay below does (.scroll-stage__content is
        overflow-y:auto), so without this the two layers offer different usable
        widths and the logo jumps sideways on the hero → section-2 switch. The
        document-level gutter is off on the homepage (assets/base.css), so this
        reserves it exactly once.
      */
      right: var(--scrollbar-width, 0px);
    }
  }

  .site-header {
    background: transparent;
  }

  .site-header__inner {
    /* Same centred content box as the checkout/split, so the logo lands at the
       same x everywhere (intelligent max-width centring, not a left/right gap).
       40px inline padding = the checkout's panel padding, so the logo sits at
       box-left + 40 = the checkout logo x. Icons ride the right edge of the same
       box (further right than the split, as intended). */
    max-width: calc(var(--overlay-width) - var(--scrollbar-width, 0px));
    margin: 0 auto;
    padding: var(--space-3) 40px;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--space-3);
  }

  .site-header__logo {
    display: block;
    line-height: 0;
  }

  /* Same brand asset and same 130px width as the checkout header, so the mark
     is identical on every surface. */
  .site-header__logo img {
    width: 130px;
    height: auto;
    display: block;
  }

  /* ---- Kopfleiste auf schmalen Schirmen, 08.08.2026 ----
     Gerechnet bei 375px: 40px Rand mal zwei lassen 295px. Darin standen
     130px Logo, 24px Abstand zu den Symbolen, vier weitere Abstaende zu je
     24px und fuenf Zeichnungen von zusammen rund 96px — Bedarf 346px. Es gibt
     weder Umbruch noch Menueknopf, also wurden Logo und Symbole gestaucht.

     Der Rand kommt jetzt aus den Rahmenvariablen (14px statt 40px), das Logo
     geht auf 100px und die Abstaende auf 12px. Bedarf damit rund 240px bei
     347px Platz. */
  @media screen and (max-width: 749.99px) {
    .site-header__inner {
      padding: var(--mq-rahmen-quer) var(--mq-rahmen-laengs);
      gap: 12px;
    }
    .site-header__logo img { width: 100px; }
  }
/* END_SECTION:header */

/* START_SECTION:hero (INDEX:7) */
.hero {
    position: relative;
    z-index: 1;
    /* 08.08.2026 von 100vh auf 100dvh: Auf Mobilgeraeten rechnet vh gegen den
       GROSSEN Viewport, die Adressleiste schneidet den unteren Rand also ab.
       dvh folgt der tatsaechlich sichtbaren Hoehe. */
    height: 100dvh;
    min-height: 480px;
    overflow: hidden;
  }

  /*
    Below the snap-scroll breakpoint, .scroll-stage isn't fixed (see
    base.css), so the page is one normal flowing document again and hero
    needs its own pull-up behind the header/top-bar, same as before.
  */
  @media screen and (max-width: 749.99px) {
    .hero {
      /* Nur um den Teil hochziehen, der wirklich ueber der Buehne schwebt.

         --bars-height ist die Summe BEIDER Leisten (layout/theme.liquid misst
         alle [data-fixed-bar="true"]). Unter 750px steht die obere Leiste aber
         im Fluss — sections/top-bar.liquid setzt dort position: relative und
         schaltet erst ab 750px auf absolute. Nur der Kopf ist hier fixed
         (sections/header.liquid). Mit der vollen Summe begann die Buehne bei
         y = -Hoehe(header), oben wurde das Bild angeschnitten, und weil sie
         100dvh hoch ist, begann der naechste Abschnitt um denselben Betrag zu
         frueh. 10.08.2026 korrigiert.

         Die Messung selbst bleibt unangetastet: --bars-height speist auch
         --pb-sticky-top in layout/theme.liquid. */
      margin-top: calc(-1 * (var(--bars-height, 0px) - var(--topbar-height, 0px)));
    }
  }

  /* 18.09.2026: opacity/visibility/animation-* sind hier weg. Sie gehoerten
     zur Schleife — ein Rahmen startete unsichtbar und wurde erst von seinen
     Keyframes eingeblendet. Ohne Schleife haette er das nie getan, und die
     Buehne waere schwarz geblieben. */
  /* Die Buehne: schwarze Flaeche, Text oben, Geraet darunter. Zwei Reihen in
     einem Raster statt Text ueber Bild — so kann sich das Bild nehmen, was
     nach dem Text uebrig ist, ohne ihn je zu ueberdecken. */
  .hero__frame {
    position: absolute;
    inset: 0;
    background-color: #0B0B0E;
    display: grid;
    grid-template-rows: auto minmax(0, 1fr);
    align-content: start;
  }

  .hero__frame-content {
    position: relative;
    width: 100%;
    padding: var(--raum-4);
    padding-top: calc(var(--bars-height, 0px) + var(--raum-6));
    display: flex;
    flex-direction: column;
    align-items: center;
    text-align: center;
    color: #fff;
  }

  /* Das Geraet. contain, nie cover: Ein Hersteller zeigt sein Produkt ganz.
     min-height 0, damit die Rasterzeile wirklich schrumpfen darf — ohne das
     waechst sie ueber die Buehne hinaus und der Text wandert nach oben raus. */
  .hero__buehne {
    min-height: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 0 var(--raum-4) var(--raum-5) var(--raum-4);
  }

  .hero__img {
    max-width: min(86vw, 640px);
    max-height: 100%;
    width: auto;
    height: auto;
    object-fit: contain;
    display: block;
  }

  .hero__eyebrow {
    font-family: var(--font-heading);
    font-weight: var(--mq-fett);
    font-size: 14px;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    /* Auf Schwarz waere #707070 nicht mehr lesbar. Gedaempftes Weiss statt
       eines zweiten Grautons — es bleibt derselbe Ton wie auf den Buehnen der
       Laser-Seite. */
    color: rgba(255, 255, 255, 0.62);
    margin: 0 0 var(--space-2);
  }

  .hero__mark {
    margin-right: 0.15em;
  }

  .hero__mark .cls-1 {
    fill: var(--color-background);
  }

  .hero__heading {
    /* font-weight und line-height am 10.08.2026 ergaenzt. Sie kamen bis dahin
       aus dem Browser-Standard fuer h1. Seit nur noch der erste Rahmen eine h1
       traegt und die uebrigen p sind, fehlten sie dort: gemessen 400 statt 700
       und Zeilenhoehe 90px statt 72px — duenne Schrift ab dem zweiten Rahmen.
       Jetzt stehen sie an der Klasse und gelten fuer beide Elementarten. */
    font-weight: var(--mq-fett);
    /* Die Buehnenzeile, E2: 32/40 ab 750 px. Sie steht auf einer Flaeche,
       nicht im Fliesstext — deshalb gilt der 22-px-Deckel hier nicht. */
    font-size: var(--t-titel-1);
    line-height: var(--t-titel-1-zeile);
    letter-spacing: -0.01em;
    margin: 0 0 var(--space-3);
    max-width: var(--mass-titel);
    text-wrap: balance;
  }

  .hero__subheading {
    font-family: var(--font-body);
    font-size: 16px;
    line-height: 1.6;
    max-width: var(--mass);
    color: rgba(255, 255, 255, 0.78);
    margin: 0 0 var(--space-4);
  }

  .hero__cta {
    display: inline-block;
    width: fit-content;
    font-family: var(--font-heading);
    font-weight: var(--mq-fett);
    text-decoration: none;
    color: var(--color-ink);
    background: var(--color-background);
    padding: var(--space-2) var(--space-4);
    border-radius: var(--ecke-1);
  }

  .hero__cta:hover {
    background: var(--mq-akzent);
    color: var(--color-background);
  }
/* END_SECTION:hero */

/* START_SECTION:main-404 (INDEX:8) */
/* Diese Seite stand als einzige quer. Am 31.07.2026 gemessen: Abstand
     Logo-Unterkante bis Inhalt 146px statt der 16px, die der Checkout vorgibt.

     Ursache war nicht ein Innenabstand, sondern place-items:center zusammen mit
     min-height:60vh — der Inhalt wurde in der Mitte eines uebergrossen Kastens
     geparkt. Die Regel in assets/base.css, die den oberen Innenabstand
     abraeumt, konnte dagegen nichts ausrichten.

     Gleich mit korrigiert, weil es dasselbe Konstrukt ist und beides gegen den
     Checkout-Massstab lief:
       · zentrierter Text   -> linksbuendig, der Checkout zentriert nirgends
       · Gewicht 700        -> 600, mehr kennt der Checkout nicht
       · clamp(3rem…5.5rem) -> 22px, die groesste Groesse der Skala
       · feste px           -> Editor-Variablen (--mq-*)
       · --color-accent     -> das ist das Markenlila; ein Knopf traegt die
                               Akzentfarbe, so wie ueberall sonst im Shop */
  .nf {
    background: var(--mq-hintergrund);
    color: var(--mq-text);
    font-family: var(--font-body);
  }
  .nf__inner {
    max-width: var(--mq-spalte);
    padding-block:0 var(--mq-abstand-gross);
  }
  .nf__code {
    font-size: var(--mq-t-22);
    line-height: var(--mq-zeile-klein);
    font-weight: var(--mq-fett);
    color: var(--mq-text-leise);
    margin:0;
  }
  .nf__title {
    font-size: var(--mq-t-22);
    line-height: var(--mq-zeile-klein);
    font-weight: var(--mq-fett);
    margin:var(--mq-abstand) 0;
  }
  .nf__text {
    font-size: var(--mq-t-14);
    line-height: var(--mq-zeile);
    color: var(--mq-text-leise);
    margin:0 0 var(--mq-abstand-gross);
  }
  /* Derselbe Hauptknopf wie ueberall (.cd__checkout), hier nur nicht ueber die
     volle Breite — es ist ein Rueckweg, kein Kaufabschluss. */
  .nf__cta {
    display: inline-block;
    font-size: var(--mq-t-14);
    font-weight: var(--mq-fett);
    padding:12px 24px;
    border-radius: var(--mq-ecke-knopf);
    background: var(--mq-akzent);
    color: var(--mq-auf-akzent);
    text-decoration: none;
  }
  .nf__cta:hover { background: var(--mq-akzent-gedrueckt); }
/* END_SECTION:main-404 */

/* START_SECTION:main-collection (INDEX:9) */
/* Die Karte selbst steht in assets/base.css. Sie wird von drei Sektionen
     benutzt — Kategorie, Kategorieuebersicht und Suche —, und Shopify laedt
     dieses CSS nur fuer Dateien im Render-Baum der jeweiligen Seite. Hier
     blieben deshalb nur die Regeln der rechten Vertrauensspalte, die es
     ausschliesslich auf dieser Seite gibt. Huelle, Kopf und Warenkorb kommen
     wie bisher aus den .pb / .pb__* / .cd__*-Regeln. */

  /* Right column · trust section (press + awards + image) */
  .clx__trust { display: flex; flex-direction: column; gap:24px; }
  .clx__trustimg { margin:0; aspect-ratio: 4 / 3; border-radius: 12px; overflow: hidden;
    background: #dedede; display: flex; align-items: center; justify-content: center; }
  .clx__trustimg img { width: 100%; height: 100%; object-fit: cover; display: block; }
  /* .clx__ph am 08.08.2026 entfernt — Platzhaltertext eines Bildkastens, den
     es im Markup nicht mehr gibt. */
  .clx__block { display: grid; gap:var(--raum-2); }
  .clx__kicker { font-size: 12px; letter-spacing: 0.18em; text-transform: uppercase;
    color: var(--pb-uv); font-weight: 700; margin:0; }
  .clx__quotes { list-style: none; margin:0; padding:0; display: grid; gap:16px; }
  .clx__quotes li { padding-bottom:16px; border-bottom: 1px solid var(--pb-line); }
  .clx__quotes li:last-child { padding-bottom:0; border-bottom: 0; }
  .clx__quotes p { margin:0 0 var(--raum-0); font-weight: 600; font-size: 16px; line-height: 1.4; letter-spacing: -0.01em; }
  .clx__quotes cite { font-style: normal; font-size: 12px; color: var(--pb-mut); }
  .clx__badges { list-style: none; margin:0; padding:0; display: flex; flex-wrap: wrap; gap:8px; }
  .clx__badges li { font-size: 12px; padding:var(--raum-1) var(--raum-2); border: 1px solid var(--pb-line);
    border-radius: var(--ecke-rund); background: #fff; color: var(--pb-ink); }

  /* 10.08.2026 entfernt: @media (max-width: 749.99px) { .clx__grid {
     grid-template-columns: 1fr } }. Dieselbe Abfrage mit demselben Wert steht
     bereits in assets/base.css und gilt dort auf jeder Seite. */
/* END_SECTION:main-collection */

/* START_SECTION:main-contact (INDEX:10) */
/* Alle Werte aus den Editor-Variablen (--mq-*), keine festen Zahlen.
     Groessen und Gewichte nach dem Checkout-Massstab: h1 22, h2 20, Fliesstext 14,
     Gewicht nur 600, Zeilenhoehe 1,35 bzw. 1,2. */
  .kt__intro { margin: 0 0 var(--mq-abstand-gross); }
  .kt__form { margin-block-end: var(--mq-abstand-gross); }

  /* Das Textfeld erbt alles vom Eingabefeld des Checkouts; nur die Hoehe und
     die Ausrichtung des Textes am oberen Rand kommen dazu. */
  .kt__area {
    min-height: 140px;
    resize: vertical;
    padding-block: var(--mq-abstand);
    font-family: inherit;
  }

  /* Auswahlfeld: dasselbe wie auf der Sendungsverfolgung. */
  /* appearance steht jetzt zentral in assets/base.css: dort bekommt das Feld
     den Pfeil des Checkouts. Ein ppearance: auto hier wuerde ihn wieder
     durch den Pfeil des Betriebssystems ersetzen. */

  .kt__ok,
  .kt__fehler {
    font-size: var(--mq-t-14);
    line-height: var(--mq-zeile);
    border-radius: var(--mq-ecke-kasten);
    padding: var(--mq-abstand);
    margin: 0;
  }
  .kt__ok { color: var(--mq-erfolg); background: var(--mq-flaeche-leise); }
  .kt__fehler { color: var(--mq-fehler); background: var(--mq-flaeche-leise); }

  .kt__hinweis {
    font-size: var(--mq-t-12);
    line-height: var(--mq-zeile-klein);
    color: var(--mq-text-leise);
    margin: var(--mq-abstand) 0 0;
  }
  .kt__hinweis a { color: var(--mq-akzent); text-decoration: underline; }

  .kt__h2 {
    font-size: var(--mq-t-20);
    line-height: var(--mq-zeile-klein);
    font-weight: var(--mq-fett);
    margin: var(--mq-abstand-gross) 0 var(--mq-abstand);
  }

  .kt__liste {
    list-style: none;
    margin: 0;
    padding: 0;
    font-size: var(--mq-t-14);
    line-height: var(--mq-zeile);
  }
  .kt__liste li + li { margin-block-start: var(--mq-abstand); }
  .kt__liste strong { font-weight: var(--mq-fett); }
  .kt__liste a { color: var(--mq-akzent); text-decoration: underline; }

  .kt__text {
    font-size: var(--mq-t-14);
    line-height: var(--mq-zeile);
    margin: 0;
  }
/* END_SECTION:main-contact */

/* START_SECTION:main-language (INDEX:11) */
/* Die Auswahlfelder selbst (.lf*) sind bereits in assets/base.css definiert —
     nicht doppelt. Hier steht nur, wie die Seite darum herum sitzt. */
  .lang { padding-block: var(--mq-abstand-gross); }
  .lang__title {
    font-family: var(--font-heading);
    font-weight: var(--mq-fett);
    font-size: var(--mq-t-22);
    line-height: var(--mq-zeile-klein);
    letter-spacing: -0.01em;
    margin: 0 0 var(--mq-abstand-gross);
  }
  .lang__label {
    font-size: var(--mq-t-12);
    line-height: var(--mq-zeile-klein);
    color: var(--mq-text-leise);
    margin: 0 0 var(--mq-abstand);
  }
  .lang .lf + .lang__label { margin-top: var(--mq-abstand-gross); }
  .lang__foot { margin-top: var(--mq-abstand-gross); }
/* END_SECTION:main-language */

/* START_SECTION:main-list-collections (INDEX:12) */
.lcx { padding-block: var(--mq-abstand-gross); }
  .lcx__gruppen { margin-top: var(--mq-abstand-gross); border-top: var(--mq-linie-staerke) solid var(--mq-linie); padding-top: var(--mq-abstand-gross); }
  .lcx__h2 { font-family: var(--font-heading); font-weight: var(--mq-fett); font-size: var(--mq-t-20); line-height: var(--mq-zeile-klein); margin: 0 0 var(--mq-abstand); }
  .lcx__liste { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--mq-abstand); }
  .lcx__liste li { display: flex; justify-content: space-between; gap: var(--mq-abstand); align-items: baseline; border-bottom: var(--mq-linie-staerke) solid var(--mq-linie); padding-bottom: var(--mq-abstand); }
  .lcx__liste a { color: var(--mq-akzent); font-size: var(--mq-t-14); text-decoration: underline; }
  .lcx__zahl { color: var(--mq-text-leise); font-size: var(--mq-t-12); }
/* END_SECTION:main-list-collections */

/* START_SECTION:main-page (INDEX:13) */
.pg {
    background: var(--color-background);
    color: var(--color-ink);
    font-family: var(--font-body);
  }
  /* 16.08.2026: Diese drei Kommentare waren vorher Liquid-Kommentare.

     Shopify fuehrt in einem Stylesheet-Block KEIN Liquid aus — die Tags landeten
     woertlich im gebuendelten styles.css, das jeder Kunde laedt. Live
     nachgesehen: sechs Liquid-Tags mitten im CSS, alle aus dieser Datei. Der
     Browser faengt sich zwar wieder und die Regeln danach greifen weiter
     (.pg__inner 760px, .pg__title 22px gemessen), aber gueltig ist es nicht, und
     Shopifys eigene Themepruefung meldet es als Fehler.

     Ein CSS-Kommentar tut dasselbe, ohne die Datei zu beschaedigen.

     KEIN seitlicher Innenabstand: Der Rahmen .gdtca bringt bereits 40px mit —
     genau die Kante des Checkouts. Hier standen zusaetzlich 24px, dadurch war
     die Textspalte 451 statt 499 Pixel breit und sass 24px weiter innen als
     Kopfleiste und Fuss. Am 31.07.2026 auf /pages/track-your-order gemessen:
     Kopf und Fuss bei 459, Ueberschrift und Formular bei 483. Die Regel gilt
     ueber das gebuendelte Stylesheet auch fuer Sendungsverfolgung und
     Rechtsseiten. */
  .pg__inner {
    /* 19.09.2026 von 760 auf 640. Die 760 stammten aus der Zeit von 14px Text.
       Mit 16px Fliesstext traegt eine 760px-Spalte rund 95 Zeichen je Zeile,
       640px rund 80 — naeher an den 45 bis 75, ab denen das Auge beim Ruecksprung
       die naechste Zeile noch trifft (Bringhurst). Die Kante selbst aendert sich
       nicht; die Spalte bleibt mittig im 40px-Rahmen von .gdtca. */
    max-width: 640px;
    margin-inline: auto;
    padding-block: var(--section-pad-block);
  }
  /* Alle Groessen in px, nicht in rem: Auf diesen Seiten liegen die Dateien des
     Checkouts, und die setzen die Grundeinheit auf 10px. Ein rem-Wert waere dort
     nur noch 62,5 % gross — der Fliesstext kam mit 10px statt 16px heraus.

     Schriftgroessen auf der Skala des Checkouts: 10 · 12 · 14 · 16 · 18 · 20 · 22.
     Mehr kennt er nicht. Vorher: Titel bis 48px, Zwischenueberschrift bis 26px.
     Am 31.07.2026 gemessen: h1 kam mit 48px heraus. 22px ist der groesste Wert,
     den der Checkout kennt. Abstaende ebenfalls aus der Rasterliste, nicht in em. */
  /* 19.09.2026 — DIESE SEITEN LASEN SICH WIE EIN FORMULAR, NICHT WIE TEXT.
     Gilt fuer Kontakt, Sendungsverfolgung, Garantie und alle Rechtsseiten.

     Vorher: .rte 14px bei Zeilenhoehe 1.35. Zwei Fehler in einer Zeile.

     Erstens die Groesse. 14px ist im Checkout die BEDIENgroesse — Feldbeschriftung,
     Tabellenzelle, Knopftext. Sein Fliesstext steht auf 16. Vierzehn Pixel auf einer
     760px breiten Textspalte ergaben rund 108 Zeichen je Zeile; Bringhurst nennt
     45 bis 75 als den Bereich, in dem das Auge den Zeilenanfang noch wiederfindet.
     Jetzt --t-text (16/24) und die Spalte auf 640px, also rund 80 Zeichen.

     Zweitens die krummen Zeilen. 14 mal 1,35 sind 18,9px; 16 mal 1,35 waeren 21,6;
     0.35em ergaben 4,9. Kein Wert davon faellt auf einen ganzen Pixel, also sass
     kein Absatz auf derselben Linie wie sein Nachbar. Alle Zeilenhoehen kommen
     jetzt aus den Tokenpaaren und sind ganzzahlig.

     Drittens die Abstaende. Ueberschrift, Absatz und Aufzaehlung standen alle
     14px auseinander — bei gleichem Abstand kann das Auge keine Gruppen bilden,
     und die Seite wirkt als eine einzige Textmasse. Jetzt mit Sprung:
     48 vor h2, 32 vor h3, 24 zwischen Absaetzen, 8 zwischen Listenpunkten. */
  .pg__title {
    font-family: var(--font-heading);
    font-weight: var(--mq-fett);
    font-size: var(--t-titel-2);
    line-height: var(--t-titel-2-zeile);
    letter-spacing: -0.01em;
    margin: 0 0 var(--raum-3);
  }
  .rte {
    font-size: var(--t-text);
    line-height: var(--t-text-zeile);
  }
  .rte > * + * { margin-top: var(--raum-3); }
  .rte h2 {
    font-family: var(--font-heading);
    font-weight: var(--mq-fett);
    font-size: var(--t-titel-2);
    line-height: var(--t-titel-2-zeile);
    margin-top: var(--raum-5);
  }
  .rte h3 {
    font-family: var(--font-heading);
    font-weight: var(--mq-fett);
    font-size: var(--t-titel-3);
    line-height: var(--t-titel-3-zeile);
    margin-top: var(--raum-4);
  }
  .rte ul, .rte ol { padding-left: var(--raum-3); }
  .rte li + li { margin-top: var(--raum-1); }
  /* 10.08.2026: von --color-accent auf --mq-akzent. --color-accent zeigt in
     layout/theme.liquid auf --mq-marke, also auf das Markenlila #B526D3 —
     Verweise im Fliesstext aller Seiten erschienen damit lila statt im
     Checkout-Blau #005BD1, das jeder andere Verweis des Shops traegt.
     Die Ecke folgt derselben Begruendung: --mq-ecke-klein statt fester 8px. */
  .rte a { color: var(--mq-akzent); }
  .rte img { height: auto; border-radius: var(--mq-ecke-kasten); }
/* END_SECTION:main-page */

/* START_SECTION:main-password (INDEX:14) */
.pw {
    /* 08.08.2026 auf dvh: vh rechnet mobil gegen den grossen Viewport und laesst
     den unteren Rand unter der Adressleiste verschwinden. */
  min-height: 100dvh;
    display: flex; align-items: center; justify-content: center;
    padding:48px 24px;
    background: var(--color-background);
    color: var(--color-ink);
    font-family: var(--font-body);
  }
  .pw__card { width: 100%; max-width: 480px; text-align: center; }

  .pw__logo { line-height: 0; margin:0 0 var(--raum-5); }
  .pw__logo img { width: 150px; height: auto; display: inline-block; }
  /* 10.08.2026 auf die Skala gesetzt. Vorher: 26px / 12px / clamp(30,6vw,50) /
     clamp(15,2.4vw,17) und dreimal Gewicht 800 — lauter Werte, die es sonst
     nirgends im Theme gab. Die Wortmarke erscheint nur, wenn kein Logo
     hinterlegt ist. Der Untertitel lag mit 15-17px zwischen zwei Stufen. */
  .pw__wordmark { font-family: var(--font-heading); font-weight: var(--mq-fett); font-size: var(--mq-t-22); letter-spacing: -0.02em; line-height: 1; }

  .pw__eyebrow {
    font-size: var(--mq-t-12); font-weight: var(--mq-fett); letter-spacing: 0.32em; text-transform: uppercase;
    color: var(--mq-akzent); margin:0 0 16px;
  }
  .pw__title {
    font-family: var(--font-heading); font-weight: var(--mq-fett);
    font-size: var(--mq-buehne-5); letter-spacing: -0.035em; line-height: 1.02;
    text-wrap: balance; margin:0 0 16px;
  }
  .pw__sub { margin: 0 auto 32px; max-width: 42ch; font-size: var(--mq-t-16);
    line-height: 1.55; color: var(--color-ink); opacity: 0.62; }

  .pw__field { display: flex; gap:8px; }
  .pw__enter { margin-top:var(--space-3); }
  .pw__field input {
    flex: 1; min-width: 0; font: inherit; font-size: var(--mq-t-14); color: var(--color-ink);
    background: #fff; border: 1px solid var(--color-line); border-radius: var(--mq-ecke-kasten);
    padding:14px 16px; outline: none; transition: border-color 0.15s, box-shadow 0.15s;
  }
  /* Der Hof zog seine Farbe aus einer festen RGB-Zahl und blieb blau, auch wenn
     im Theme-Editor eine andere Akzentfarbe eingestellt wird. color-mix mischt
     ihn jetzt aus dem Regler. 10.08.2026. */
  .pw__field input:focus {
    border-color: var(--mq-akzent);
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--mq-akzent) 18%, transparent);
  }
  .pw__btn {
    font: inherit; font-weight: var(--mq-fett); font-size: var(--mq-t-14); cursor: pointer; white-space: nowrap;
    color: #fff; background: var(--mq-akzent); border: 0; border-radius: var(--mq-ecke-kasten); padding:14px 20px;
    transition: background-color 0.15s;
  }
  .pw__btn:hover { background: var(--mq-akzent-gedrueckt); }
  .pw__ok { font-weight: var(--mq-fett); color: var(--mq-akzent); margin:0; }

  .pw .errors { list-style: none; margin:0 0 12px; padding:0; color: var(--mq-fehler); font-size: var(--mq-t-14); }

  @media screen and (max-width: 579.99px) {
    .pw__field { flex-direction: column; }
    .pw__btn { width: 100%; }
  }

  /* iOS Safari zoomt beim Antippen in jedes Feld unter 16px hinein und zoomt
     danach nicht wieder heraus. Der Kunde tippt sein Passwort dann in eine
     vergroesserte, verschobene Seite — und diese Seite ist die einzige, die
     ueberhaupt jemand zu sehen bekommt, solange der Shop geschuetzt ist.

     Die Abweichung von den 14px des Checkouts gilt nur fuer Finger; mit der
     Maus bleibt sein Wert unveraendert. Dieselbe Loesung steht in
     assets/base.css fuer die Felder aller uebrigen Seiten. 10.08.2026. */
  @media (pointer: coarse) {
    .pw__field input { font-size: 16px; }
  }
/* END_SECTION:main-password */

/* START_SECTION:main-product (INDEX:15) */
/* =====================================================================
     SCHRIFTWERTE — Angleichung an den Checkout, 07.08.2026
     ---------------------------------------------------------------------
     Gemessen am 04.08.2026 auf /products/laser-mosquit: Die Produktseite
     laedt die 44 Stylesheets des Shopify-Checkouts mit. Deren Wurzel steht
     auf 10px statt 16px, also kommt jeder rem-Wert mit 62,5 Prozent seiner
     gemeinten Groesse heraus (0.9rem war als 14,4px gemeint, rendert als
     9px). Messwert: 142 Elemente mit 9px, dazu 5px, 6px und 8px im
     laufenden Text, insgesamt 48 abweichende Kombinationen aus Groesse,
     Gewicht und Buchstabenabstand.

     Der Checkout selbst kennt nur diese Skala, am selben Tag ausgelesen:
       Schriftgroessen   10 · 12 · 14 · 16 · 18 · 20 · 22 px
       Buchstabenabstand durchgehend normal
       Schriftfamilie    Plus Jakarta Sans

     Umrechnung in dieser Datei:
       - font-size steht hier bereits in px; nur die Ueberschrift h1
         (.pb__title) lag mit 28px ueber dem Deckel und geht auf 22px.
       - letter-spacing in em ist entfallen; alle 8 Vorkommen stehen jetzt
         auf normal, auch das negative Tracking (h2 hatte -0.02em, das sind
         bei 20px genau -0,4px, die der Checkout nicht hat).
       - line-height bleibt einheitenlos (1.2 / 1.35 wie im Checkout).
       - rem in Abstaenden (padding, margin, gap, width) ist unberuehrt.
     Geaendert wurden ausschliesslich Werte, keine Selektoren, Klassen oder
     Strukturen. Einzelne Stellen tragen deshalb keinen eigenen Kommentar.
     ===================================================================== */
  /* Alle --pb-Werte stehen seit dem 08.08.2026 im style-Block von
     layout/theme.liquid. Zwei Gruende, dort und nicht hier:

     In einem Stylesheet-Block fuehrt Shopify kein Liquid aus, die Farben
     mussten hier also fest verdrahtet sein — die Regler unter Onlineshop ->
     Anpassen blieben auf der Produktseite wirkungslos.

     Und Shopify laedt dieses CSS nur fuer Dateien im Render-Baum der
     jeweiligen Seite. Kategorie- und Suchseite benutzen dieselben Werte,
     hatten main-product aber nie im Render-Baum. */
  .pb {
    font-family: var(--font-body);
    color: var(--pb-ink);
    background: var(--pb-main-bg);
  }
  .pb *, .pb *::before, .pb *::after { box-sizing: border-box; }

  /* =====================================================================
     THE SPLIT — copied 1:1 from the live Shopify checkout shell, read on
     2026-07-20 from mosquit.store/checkouts/cn/... via the Chrome extension.
     Authored checkout rules, reproduced verbatim below:

       .Sxi8I            display: grid;
                         grid-template-areas: "main order-summary";
                         grid-template-columns: minmax(min-content, calc(50% + offset)) 1fr;
       ._9F1Rf           grid-area: main; display: flex;
                         justify-content: flex-end; height: 100%;
       ._9F1Rf .gdtca    width: 100%; height: 100%; max-width: 580px; padding:40px;
                         border-right: 1px solid var(--x-default-color-border);
       .i4DWM            grid-area: order-summary; display: block;
       .i4DWM ._4QenE    position: sticky; inset: 0 auto;
                         width: 100%; max-width: 480px; padding:40px;

     Breakpoint is the checkout's own: screen and (min-width: 1000px).
     Below it the checkout hides the summary entirely; here it stacks instead.
     ===================================================================== */
  /* Raster, Spalten, Farben und Abstaende kommen aus den Checkout-Dateien
     (Sxi8I / _9F1Rf / gdtca / i4DWM / _4QenE) — genau wie auf der Cart-Seite.
     Die frueheren Regeln .pb__grid / .pb__gallery / .pb__info / .pb__aside
     haben dasselbe nachgebaut und sind deshalb entfernt. */

  /* Der Abstand nach links und rechts kommt AUSSCHLIESSLICH aus .gdtca
     (padding:40px, Checkout-Original). Wer hier nochmal padding-inline
     setzt, verdoppelt ihn — genau das war am 31.07.2026 bei der Galerie der
     Fall: Kasten bei 40, Bild erst bei 80, waehrend Text und Story bei 49
     standen. Deshalb hier NUR noch oben und unten. */
  .pb__gallery-in,
  .pb__info-in,
  .pb__story { width: 100%; }
  .pb__gallery-in { padding:var(--pb-pad) 0; }
  .pb__info-in { padding:0 0 var(--pb-pad); }
  /* story: kein padding-inline — dasselbe wuerde sich mit .gdtca verdoppeln.
     Die Breite kommt aus .pb__col weiter unten, wie bei Galerie und Text. */
  /* 10.08.2026 entfernt: der 1000px-Block mit .pb__gallery-in { padding-top }.
     Er war wirkungslos — assets/base.css setzt
     html body .gdtca.pb__headbox + .gdtca > * { padding-block-start: 0 } mit
     (0,3,2) gegen die (0,1,0) dieser Regel. Soll die Galerie auf dem Desktop
     wirklich Abstand nach oben bekommen, gehoert die Ausnahme dorthin.

     Ebenfalls entfernt: .pb__hdr in beiden Auspraegungen (Grundregel hier und
     die max-width-Regel im 1000px-Block weiter unten). Die Klasse steht in
     keinem class-Attribut des Themes — nur .pb__hdr-nav, .pb__hdr-ico,
     .pb__hdr-cart und .pb__hdr-count kommen vor. */
  /* Am 08.08.2026 entfernt: .pb__brand und .pb__brand img. Das Logo dieser
     Sektion sitzt seit dem Umbau der Kopfzeile in sections/header.liquid und
     sections/section2-header.liquid, die ihr 130px-Mass je selbst setzen; die
     Klasse .pb__brand erzeugt hier nichts mehr. */
  /* The bag is Shopify's original and sets the size: 11.5 of its 14 units at
     the former 24px box = 19.71px tall. Every glyph is cropped to its own
     outline (see the markup), so this one height makes all four exactly as
     tall as the bag while each keeps its own width. The 1.5px stroke sits
     centred on the outline and spills 0.75px past the box on every side --
     the same on all four, so one flex gap gives one optical gap. 24px is the
     spacing account-to-bag already had. */
  .pb__hdr-nav { display: flex; align-items: center; gap:24px; }
  .pb__hdr-ico { position: relative; display: inline-flex; align-items: center; justify-content: center; height: 24px; padding:0; border: 0; background: none; cursor: pointer; color: var(--pb-uv, #005bd1); text-decoration: none; }
  .pb__hdr-ico svg { height: 19.71px; width: auto; overflow: visible; display: block; }
  .pb__hdr-ico:hover { color: var(--mq-akzent-gedrueckt); }
  /* Checkout draws the bag in a 24px box, so its outline stops 3.43px short of
     the header's right edge ((24 - 24 * 10/14) / 2). Our boxes hug the outline,
     which would push the bag flush to the edge. This margin puts it back on the
     checkout's pixel without touching the 24px spacing on its left. */
  .pb__hdr-cart { margin-right:3.43px; }
  .pb__hdr-count { position: absolute; top: -6px; right: -8px; min-width: 15px; height: 15px; padding:0 4px; display: inline-flex; align-items: center; justify-content: center; font-family: var(--font-body); font-size: 10px; font-weight: var(--mq-fett); line-height: 1; color: #fff; background: var(--pb-uv, #005bd1); border-radius: var(--ecke-rund); font-variant-numeric: tabular-nums; }
  .pb__hdr-count[hidden] { display: none; }
  @media screen and (min-width: 1000px) {
    /* Header ONLY sits in the checkout's box, not the full column: 500px content
       (= 580px wrapper − 80px padding), right-aligned to the seam. Result: logo
       x=459 and cart x=934/958 match the checkout pixel-for-pixel, while the
       gallery / info / story / footer below stay 100% width (per earlier request). */
    /* .pb__hdr am 10.08.2026 entfernt — siehe Begruendung oben. Die Regel
       band die linke Kante des Logos an die des Bildes; die Klasse existiert
       im Markup nicht, die Rechnung lief also ins Leere. */
  }

  /* Am 08.08.2026 entfernt: .pb__footer samt Media-Query, .pb__footer-links,
     dessen a und a:hover sowie .pb__footer-copy — zusammen 20 Zeilen. Die
     Fusszeile dieser Sektion baut seit dem 04.08.2026 snippets/split-footer.liquid
     mit den Klassen des Checkouts; keine dieser fuenf Klassen wird noch erzeugt.
     Die Masse leben in assets/base.css weiter, dort an der echten Fusszeile
     gemessen (Kopf 459 bis 958, Text 14px, Linkfarbe #005bd1). */

  /* html body davor, weil dasselbe Element auch die Checkout-Klasse ._4QenE
     traegt. Deren Regel lautet padding:var(--x-shell-order-summary-padding),
     und diese Variable setzt der Checkout erst ab 1000px — darunter ist die
     Angabe ungueltig und faellt auf 0 zurueck. Bei gleicher Spezifitaet
     gewinnt sie, weil die Checkout-Dateien nach dem Theme-CSS laden.
     Am 08.08.2026 im Browser nachgemessen: ohne diesen Praefix stand die
     rechte Spalte mobil auf padding 0. */
  html body .pb__aside-in {
    width: 100%;
    max-width: var(--pb-aside-max);
    margin-inline: auto;
    /* quer und laengs getrennt statt einheitlich --pb-pad: Der Checkout
       benutzt unter 1000px 20px quer und 14px laengs; ab 1000px schalten
       beide Variablen auf den vollen Reglerwert um und ergeben wieder 40px. */
    padding:var(--mq-rahmen-quer) var(--mq-rahmen-laengs);
  }
  @media screen and (min-width: 1000px) {
    /* html body auch hier, seit 08.08.2026. Die Grundregel oben traegt diesen
       Praefix, um die Checkout-Klasse ._4QenE zu ueberstimmen — ohne ihn hier
       gewaenne sie mit (0,2,2) gegen die (0,1,0) dieser Abfrage, und
       margin-inline bliebe auf auto. Genau das war am 08.08.2026 am laufenden
       Shop zu sehen: Die Kaufspalte stand bei x=1208 statt an der Naht bei
       x=999, also mittig in ihrer Spalte statt buendig — 209px zu weit rechts.
       Der Checkout setzt sie linksbuendig an die Naht. */
    html body .pb__aside-in {
      margin-inline: 0;
      /*
        05.09.2026, auf Patryks Ansage: Die Kaufspalte klebt nicht mehr und
        hat keine Hoehengrenze mehr.

        Vorher stand hier position: sticky mit min-height und max-height auf
        Fensterhoehe, overflow: hidden und flex-direction: column; der lange
        Mittelteil (.pb__aside-scroll) scrollte in sich selbst. Das war die
        Bauweise der Checkout-Bestellzusammenfassung und loeste das Problem
        vom 31.07.2026: Ein klebendes Panel, das hoeher ist als das Fenster,
        verschluckt seinen unteren Teil, und der Kaufknopf war auf einem
        1366x768-Notebook nie zu sehen.

        Ohne das Kleben stellt sich dieses Problem nicht mehr: Die Spalte
        laeuft mit der Seite, alles darunter erreicht man durch normales
        Scrollen. Die Reihenfolge steht damit im Fluss — Bestandshinweis,
        Pick Your Deal, Secure checkout, Kaufknopf, View cart.

        Was damit ohne Wirkung bleibt: margin-top: auto an .pb__pay hat
        keinen Flex-Rest mehr zu verteilen, und --pb-sticky-top wird nicht
        mehr gebraucht.

        NACHTRAG 17.09.2026: Der Absatz oben stimmte nicht. Entfernt wurde am
        05.09.2026 nur die EIGENE Regel des Themes. Das Kleben kam danach
        weiter aus den Checkout-Stylesheets, die diese Seite selbst laedt
        (.i4DWM ._4QenE { position: sticky; top: 0 }), und die Kaufspalte
        traegt beide Klassen. Am 17.09.2026 auf der laufenden Seite gemessen:
        position = sticky, top = 0px.

        Damit war das Problem vom 31.07.2026 zurueck, nur ohne seine Loesung:
        Die Spalte ist 860px hoch: auf einem 1366x768-Notebook bleibt ihr
        unteres Ende dauerhaft unter der Fensterkante, und der Kaufknopf ist
        nicht erreichbar — die frueheren Hoehengrenzen und der eigene
        Scrollbereich, die genau das verhinderten, sind ja entfernt.

        Zurueckgesetzt wird es in der Regel direkt unter dieser Abfrage — sie
        braucht mehr Gewicht, als hier zur Verfuegung steht.
      */
    }
  }

  /*
    Die Kaufspalte klebt — 18.09.2026, auf Patryks Entscheidung.

    WARUM UEBERHAUPT. Gemessen am 17.09.2026: .pb__aside ist 727px breit
    (46 Prozent der Fensterbreite) und 23 579px hoch. Inhalt traegt sie auf
    870px davon. Die restlichen 22 709px — 96 Prozent — sind leer. Der Blick
    findet eine angefangene zweite Spalte, sucht ihren Inhalt und findet
    keinen. Das ist die lauteste Frage, die der Shop stellt.

    WARUM `top` UND NICHT `bottom`. Am 18.09.2026 mit `bottom` gebaut,
    gemessen und wieder verworfen — die Begruendung gehoert hierher, damit
    es niemand ein zweites Mal versucht. Die Idee war, den FUSS des Kastens
    ans untere Fenster zu heften, damit der Kaufknopf immer sichtbar bleibt,
    auch wenn der Kasten hoeher ist als das Fenster. Sie kann nicht
    funktionieren: `bottom` verschiebt einen klebenden Kasten nach OBEN, und
    ein klebender Kasten darf seinen umgebenden Block nie verlassen. Unser
    Kasten sitzt am oberen Rand von .i4DWM, kann also um genau 0px nach oben
    — er klebt nie. Am laufenden Shop nachgemessen: nach 6000px Scrollen
    stand er bei -6000..-5140, also unverschoben.

    Es bleibt `top`, und damit das Problem vom 31.07.2026: Der Kasten ist
    860px hoch. Auf einem 1366x768-Notebook faellt der Kaufknopf unten aus
    dem Fenster. Die Antwort ist dieselbe wie im Checkout selbst — eine
    Hoehengrenze und ein eigener Scrollbereich. `overflow-y: auto` zeigt
    ihn nur, wenn er gebraucht wird: bei 900px Fensterhoehe stehen dem
    Kasten 868px zur Verfuegung, er braucht 860 und bleibt ohne Leiste.

    --pb-sticky-top gibt es seit dem 31.07.2026 genau dafuer; es rechnet
    --bars-height mit, also die Hoehe fester Leisten. Auf der Produktseite
    ist keine Leiste fest, der Wert ist calc(0px + 16px).

    SPEZIFITAET. Die Checkout-Regel lautet `.i4DWM ._4QenE { position: sticky;
    top: 0 }` und wiegt zwei Klassen (0-2-0). `html body .pb__aside-in`
    daneben wiegt eine Klasse und zwei Typen (0-1-2) und verliert. Der
    doppelte Klassenname hebt auf 0-2-2 und ist die kleinste Erhoehung, die
    reicht; getroffen wird genau dasselbe Element.

    Nicht in der Checkout-Datei aendern: Das ist fremder, versionierter Code.
    Nicht ueber !important: Das naechste Problem waere dann unloesbar.

    Erst ab 1000px, weil es darunter keine zweite Spalte gibt, an der etwas
    kleben koennte — dort steht der Kasten im Fluss wie bisher.
  */
  html body .pb__aside-in.pb__aside-in {
    position: static;
    top: auto;
    bottom: auto;
  }

  @media screen and (min-width: 1000px) {
    html body .pb__aside-in.pb__aside-in {
      position: sticky;
      top: var(--pb-sticky-top);
      bottom: auto;
      max-height: calc(100dvh - 2 * var(--raum-2));
      overflow-y: auto;
      overscroll-behavior: contain;
      scrollbar-width: thin;
    }
  }

  /*
    Der Scrollbereich traegt seine Regeln aus den Checkout-Stylesheets
    (_1b9t7yp0, _1fragemuk, _1fragemv4, _1fragemnc, _1b9t7ypa). Hier steht nur,
    was es im Checkout nicht gibt.

    Unter 1000 px wird der Kasten nicht begrenzt (_16s97g796: max-height none),
    also darf der Bereich dort auch nicht scrollen — sonst entstuende auf dem
    Handy ein Scrollfeld ohne Not.
  */
  /*
    Der Rahmen traegt flex:1 und min-height:0, damit er den Rest der Spalte
    ausfuellt und seine max-height sich auf den WIRKLICH freien Platz bezieht.
    Im Checkout steht das nicht, weil dort unter der Liste nur zwei kurze
    Zeilen folgen und 40vh fest genug ist. Hier haengen Zahlungssymbole,
    Kaufknopf und "View cart" darunter — deren Hoehe wechselt mit der Sprache
    und der Zahl der Zahlungsarten.
  */
  {%- comment -%}
    Hier stand: .pb__aside-frame { flex: 1; min-height: 0 } ab 1000px. Das
    gehoerte zur Hoehenbegrenzung der Spalte und hat ohne sie keine Aufgabe
    mehr.
  {%- endcomment -%}

  /* 10.08.2026: Der Rollbereich traegt tabindex="0", damit er sich mit der
     Tastatur scrollen laesst. outline: none nahm ihm dafuer jeden sichtbaren
     Hinweis — man landete beim Tabben in einem Kasten, ohne zu sehen wo. Statt
     den Ring zu loeschen sitzt er jetzt innen, damit er das Spaltenraster
     nicht aufdrueckt. */
  .pb__aside-scroll:focus-visible {
    outline: 2px solid var(--mq-akzent);
    outline-offset: -2px;
  }
  {%- comment -%}
    Bis zum 05.09.2026 galt das nur unter 1000px, weil die Spalte darueber
    absichtlich scrollte. Jetzt gilt es ueberall — es gibt keinen Rollbereich
    mehr.
  {%- endcomment -%}
  /*
    BEIDE Richtungen zuruecksetzen, nicht nur overflow-y. CSS rechnet
    overflow-y: visible zu auto um, sobald overflow-x einen anderen Wert
    als visible hat — die Checkout-Klasse _1fragemv4 setzt genau das
    (overflow-x: hidden). Mit nur einer der beiden Zeilen bliebe ein
    Scrollkontext bestehen.

    Zwei Klassen im Selektor, nicht eine: Die Checkout-Stylesheets werden
    NACH diesem Abschnitt geladen; bei gleicher Spezifitaet gewaenne
    _1fragemv4 mit overflow-x: hidden.

    Ebenso der Innenabstand aus _1b9t7ypa: Sein Gegenstueck _1b9t7yp9
    (negativer Aussenabstand) sitzt am Rahmen und gilt auch dort immer.
    Beide zusammen sind neutral, deshalb bleiben sie stehen.
  */
  /* Die Huelle des Kaufkastens traegt .co-kauf, weil das Skript sie sucht.
     Aus den Checkout-Dateien bringt diese Klasse 24px Abstand nach oben mit;
     der gehoerte zum alten Kasten. Die Bestandszeile darueber hat ihren
     eigenen Abstand von 24 — beide zusammen ergaben 48px Leerraum ueber
     "Pick Your Deal", am 05.09.2026 gemessen. */
  .co-form > .co-kauf { margin-top: 0; }

  .pb__aside-frame > .pb__aside-scroll { overflow-x: visible; overflow-y: visible; max-height: none; }
  .pb__aside-in > .pb__aside-frame { overflow-x: visible; overflow-y: visible; max-height: none; display: block; }

  /* ---- gallery: thumbnails (left, stacked) + square main image (right) ----
     every gap = var(--pb-pad) (40px), the same as the section's left/right inset:
       - between stacked thumbnails
       - from the thumb column across to the main image
     all product images are forced square via aspect-ratio: 1. */
  .pb__media { display: flex; gap:var(--pb-tgap); align-items: flex-start; position: relative;
    padding-left: calc(var(--pb-thumbw) + var(--pb-tgap)); }
  .pb__media:not(:has(.pb__thumbs)) { padding-left:0; }
  @media screen and (min-width: 1000px) {
    /* The specified geometry: the big image is flush-left with the LOGO — i.e. it
       gets exactly the checkout form's 499px and ends on the content edge the
       header already sits on. Left of it, the same 40px gap the content keeps
       to the buy column, then the 96px thumbnails. The whole row is
       right-aligned, and its total width (96 + 40 + 499 = 635px) becomes the
       width of every section below (info + story). */
    .pb__media { width: min(var(--pb-col), 100%); margin-left: auto;
      padding-left: calc(var(--pb-thumbw) + var(--pb-tgap)); }
    .pb__thumbs { width: var(--pb-thumbw); }
    /* The image may SHRINK below 499 when the pane gets narrow (1000–1550px
       viewports) — same behaviour as the header box above it (max-width 499,
       right-aligned), so the picture keeps sharing its left edge with the
       logo at every width. Thumbnails and the 40px gap stay fixed. */
    .pb__stage { flex: 0 1 499px; min-width: 0; }
    /* THE left-column content box. One class, one width — used by the product
       page (description, story), the cart (items, totals) and the collection
       (product grid), so all three start and end on the same line. The pane has
       no right padding of its own, so the 40px to the seam goes on as margin;
       right edges land on the same content edge as the image above. */
    /* KEIN margin-right hier. Der Abstand zur Naht kommt schon aus dem
       Innenabstand von .gdtca (padding:40px, Checkout-Original). Beides
       zusammen ergab 80px links vom Schnitt, waehrend rechts davon nur 40px
       standen — die Seite war unsymmetrisch, und zwar auf Produkt-, Warenkorb-
       und Kategorieseite gleichzeitig, weil alle drei .pb__col benutzen.
       Gemessen am 31.07.2026 bei 1350px Fensterbreite:
         vorher  weiss 40 → 644, Naht bei 725  → Luecke 81
         Checkout                              → Luecke 41
       Aus demselben Grund faellt das "- var(--pb-pad)" in der Breite weg: die
       100 % beziehen sich bereits auf den Kasten INNERHALB des Innenabstands. */
    .pb__col,
    .pb__gallery-in {
      width: min(var(--pb-col), 100%);
      margin-left: auto;
      padding-inline: 0;
    }
  }

  /* 5 QUADRATISCHE Kacheln in der Spaltenbreite --pb-thumbw.

     10.08.2026 umgestellt: Bis dahin folgte die Kachelgroesse der BUEHNENHOEHE
     (height: calc((100% - 4 * var(--pb-tgap)) / 5)) und die Breite kam ueber
     aspect-ratio hinterher — gedeckelt von max-width: 100%, also von
     --pb-thumbw. Sobald die abgeleitete Breite groesser war als die Spalte,
     schlug max-width das aspect-ratio, und die Kachel war kein Quadrat mehr,
     sondern hoeher als breit. Das Bild darin laeuft auf object-fit: cover und
     wurde sichtbar beschnitten. Bei 1200px Fenster gemessen: Spalte 72px,
     Kachelhoehe 88px. Im umgekehrten Fall blieb rechts ein toter Streifen.

     Kachelhoehe und Buehnenhoehe treffen sich nur bei genau einer
     Fensterbreite — jetzt fuehrt die Breite, und die Kachel ist bei jeder
     Breite quadratisch. Die Kachelspalte ist dafuer nicht mehr exakt so hoch
     wie die Buehne; das ist der kleinere Preis.

     Der alte Kommentar rechnete mit 4.75px Luecke, tatsaechlich sind es
     14.75px (--pb-tgap in layout/theme.liquid). */
  /* --pb-tgap und --pb-thumbw stehen jetzt oben auf .pb, weil auch --pb-col
     und .pb__media sie brauchen. Hier nur noch benutzt. */
  .pb__thumbs { display: flex; flex-direction: column; align-items: flex-start;
    gap:var(--pb-tgap); margin:0;
    position: absolute; left: 0; top: 0; height: 100%; width: var(--pb-thumbw); }
  /* Rand IMMER innen: Kontur mit Innen-Versatz liegt UEBER dem Bild,
     Kachelgroesse aendert sich nie, nichts verschiebt sich */
  /* Die Kacheln sind seit dem 17.09.2026 etwas kleiner als ihre Spalte:
     --pb-mini statt 100 %. Die SPALTE bleibt unveraendert breit, denn aus
     --pb-thumbw leitet sich --pb-col ab, und daran haengt die gemeinsame
     Inhaltskante von Produkt-, Warenkorb- und Kategorieseite. Wer die Spalte
     schmaler macht, verschiebt drei Seiten. Die Kacheln stehen linksbuendig,
     ihre linke Kante liegt also weiter genau auf dieser Kante; die Luft
     entsteht rechts, zwischen Kachel und Buehne. */
  .pb__thumbs { --pb-mini: 82%; }
  .pb__more { width: var(--pb-mini); height: auto; aspect-ratio: 1;
    flex: 0 0 auto; padding:0; border: 0;
    outline: 1px solid var(--pb-line); outline-offset: -1px; background: var(--pb-surface); cursor: pointer;
    display: flex; align-items: center; justify-content: center;
    font-family: var(--font-heading); font-weight: var(--mq-fett); font-size: 16px; color: var(--pb-uv-lite);
    transition: outline-color 0.18s ease; }
  .pb__more:hover { outline-color: rgba(0, 91, 209, 0.55); }
  .pb__thumb { width: var(--pb-mini); height: auto; aspect-ratio: 1;
    flex: 0 0 auto; padding:0; border: 0; outline: 1px solid var(--pb-line); outline-offset: -1px;
    background: var(--pb-surface); cursor: pointer; overflow: hidden; transition: outline-color 0.18s ease; }
  .pb__thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
  .pb__thumb:hover { outline-color: rgba(0, 91, 209, 0.55); }
  .pb__thumb.is-active { outline: 2px solid var(--pb-uv-lite); outline-offset: -2px; box-shadow: 0 0 22px -4px var(--pb-glow); }

  .pb__stage { position: relative; flex: 1 1 auto; min-width: 0; aspect-ratio: 1; background: var(--pb-surface); overflow: hidden; }
  .pb__slide { position: absolute; inset: 0; display: none; }

  /* ---- Bildspalte auf schmalen Schirmen, 08.08.2026 ----
     Der Aufbau oben ist fuer eine Miniaturspalte NEBEN der Buehne gerechnet:
     .pb__media traegt links einen Innenabstand von Kachelbreite plus Abstand,
     und .pb__thumbs liegt absolut darin. Die Kacheln teilen sich dabei die
     Hoehe der Buehne durch fuenf.

     Auf dem Handy fuehrte das zu 28px-Kacheln, die sich mit dem Finger nicht
     treffen lassen, und kostete zugleich rund ein Fuenftel der Bildbreite fuer
     eine Spalte, die niemand bedienen kann.

     Unter 750px liegen die Kacheln deshalb waagerecht unter der Buehne: feste
     56px statt einer Hoehenteilung, waagerecht scrollbar, und die Buehne
     bekommt die volle Breite. */
  @media screen and (max-width: 749.99px) {
    /* column-reverse, weil die Kacheln im Markup vor der Buehne stehen — auf
       breiten Schirmen sitzen sie ja links davon. Auf dem Handy gehoert das
       Produktbild nach oben und die Auswahl darunter. */
    .pb__media { flex-direction: column-reverse; padding-left:0; gap:var(--raum-1); }

    /* In der Spalte verteilt flex die HOEHE. Die Buehne traegt oben
       flex: 1 1 auto — damit waere sie null hoch und ueber aspect-ratio: 1
       auch null breit. Sie bekommt hier deshalb ihre volle Breite und laesst
       die Hoehe aus dem Seitenverhaeltnis folgen. */
    .pb__stage { flex: 0 0 auto; width: 100%; }

    .pb__thumbs {
      position: static;
      flex-direction: row;
      width: 100%;
      height: auto;
      gap:8px;
      overflow-x: auto;
      overflow-y: hidden;
      align-items: center;
      /* Fingerbedienung: das Wischen soll an den Enden nicht die ganze Seite
         mitziehen, und die Kacheln sollen einrasten. */
      overscroll-behavior-x: contain;
      scroll-snap-type: x proximity;
    }
    .pb__thumb,
    .pb__more { height: 56px; width: 56px; scroll-snap-align: start; }
  }
  .pb__slide.is-active { display: block; }
  /* Overlay-Karussell (alle Bilder): benutzt DIE geteilte Huelle .mq-ov / .mq-ov__tint
     / .mq-ov__card aus sections/cart-drawer.liquid — identisch zum Warenkorb.
     Hier nur das Galerie-Eigene: Innen-Layout (Thumbs links + Hauptbild) und die
     Kartengroesse (breiter, weil Bilder). Rahmen/Blende/Oeffnen = geteilt. */
  /* flex-direction ausdruecklich, seit 08.08.2026. Die Karte traegt zugleich
     .mq-ov__card, und assets/base.css setzt dort column. Ohne eigene Angabe
     gewann diese — der Miniaturstreifen lag UEBER dem Bild statt daneben, und
     weil er nicht schrumpft (flex 0 0 auto), blieb dem Bild bei acht Aufnahmen
     rechnerisch nichts uebrig. Das galt auf jedem Geraet, nicht nur mobil. */
  .pb__ov-card { display: flex; flex-direction: row; overflow: hidden; }
  /* Thumbs LINKS als Spalte: 88er Quadrate, feste Abstaende, Scrollbar sichtbar,
     Breite fest + reservierte Scrollbar-Breite */
  .pb__ov-strip { flex: 0 0 auto; width: calc(128px + var(--scrollbar-width, 0px));
    display: flex; flex-direction: column; gap:12px; padding:20px;
    overflow-y: auto; box-shadow: inset -1px 0 0 var(--mq-linie); }
  .pb__ov-strip button { width: 88px; height: 88px; flex: 0 0 auto; padding:0; border: 0;
    outline: 1px solid var(--pb-line); outline-offset: -1px; background: #fff; cursor: pointer; overflow: hidden; }
  .pb__ov-strip button img { width: 100%; height: 100%; object-fit: cover; display: block; }
  .pb__ov-strip button.is-active { outline: 2px solid var(--pb-uv-lite); outline-offset: -2px; }
  /* Hauptbereich rechts: feste Abstaende in alle Richtungen */
  .pb__ov-main { flex: 1 1 auto; min-width: 0; position: relative; }
  .pb__ov-stage { position: absolute; inset: 64px 88px; display: flex; align-items: center; justify-content: center; }
  .pb__ov-stage img { max-width: 100%; max-height: 100%; display: block; }
  .pb__ov-x { position: absolute; top: 14px; right: 16px; border: 0; background: none; cursor: pointer;
    color: var(--pb-ink); padding:var(--raum-1); }
  .pb__ov-x svg { width: 18px; height: 18px; display: block; }
  .pb__ov-x:hover { color: var(--pb-uv-lite); }
  .pb__ov-pf { position: absolute; top: 50%; transform: translateY(-50%); width: 44px; height: 44px;
    border-radius: 50%; border: 0; outline: 1px solid var(--pb-line); outline-offset: -1px;
    background: #fff; cursor: pointer; display: flex; align-items: center; justify-content: center; color: var(--pb-ink); }
  .pb__ov-pf:hover { background: #f5f5f5; }
  .pb__ov-pf svg { width: 18px; height: 18px; }
  .pb__ov-pf--l { left: 22px; }
  .pb__ov-pf--r { right: 22px; }
  .pb__ov-count { position: absolute; top: 22px; left: 50%; transform: translateX(-50%); margin:0;
    font-size: 12px; color: var(--pb-mut); font-variant-numeric: tabular-nums; }

  /* ---- Galerie-Overlay auf schmalen Schirmen, 08.08.2026 ----
     Die Masse oben sind fuer eine breite Karte gerechnet: 128px Streifen
     links, dazu inset 64px 88px auf dem Bild. Bei 375px Bildschirm blieben
     dem Bild damit rechnerisch 56px Breite, und die beiden 44px-Pfeile bei
     left/right 22px ueberlappten sich darin — das Bild war vollstaendig
     verdeckt.

     Unter 750px liegt der Streifen deshalb waagerecht unter dem Bild, das
     Bild bekommt den ganzen Rest, und die Pfeile sitzen am unteren Rand
     ausserhalb der Bildflaeche. */
  @media screen and (max-width: 749.99px) {
    /* Die Karte braucht eine eigene Hoehe, sonst ist sie nur so hoch wie ihr
       Inhalt — und der Inhalt der Bildflaeche ist absolut positioniert, traegt
       also nichts bei. Gemessen am 08.08.2026: Ohne diese Zeile war die Karte
       78px hoch und die Bildflaeche 357 mal 0.
       48px sind derselbe Abzug, den .mq-ov__card in assets/base.css benutzt. */
    .pb__ov-card { flex-direction: column-reverse; height: calc(100dvh - 48px); }

    /* min-height: 0 hebt die Vorgabe auf, dass ein Flex-Kind nicht unter seine
       Inhaltsgroesse schrumpft. Ohne sie teilt sich die Hoehe nicht auf. */
    .pb__ov-main { flex: 1 1 auto; min-height: 0; }

    .pb__ov-strip {
      width: 100%;
      flex-direction: row;
      gap:8px;
      padding:var(--raum-1) var(--mq-rahmen-laengs);
      overflow-x: auto;
      overflow-y: hidden;
      box-shadow: inset 0 1px 0 var(--mq-linie);
    }
    .pb__ov-strip button { width: 56px; height: 56px; }

    /* Das Bild fuellt die Karte bis auf einen schmalen Rand. Oben bleibt Platz
       fuer Zaehler und Schliesskreuz, unten fuer die Pfeilreihe. */
    .pb__ov-stage { inset: 48px 8px 60px; }

    /* Pfeile nebeneinander unter das Bild, statt links und rechts hinein.
       56px sind die Anfassgroesse der Miniaturbilder daneben. */
    .pb__ov-pf { top: auto; bottom: 6px; transform: none; width: 56px; height: 48px; border-radius: var(--mq-ecke-kasten, 12px); }
    .pb__ov-pf--l { left: 50%; margin-left:-60px; }
    .pb__ov-pf--r { right: 50%; margin-right:-60px; }

    .pb__ov-count { top: 16px; }
  }
  .pb__slide img { width: 100%; height: 100%; object-fit: cover; display: block; }
  .pb__ph { display: grid; place-items: center; color: var(--pb-mut); letter-spacing: normal; text-transform: uppercase; font-size: 12px; }

  /* ---- left column typography ----
     From here on the sizes and gaps are the checkout's own steps, read out of
     its stylesheet on 2026-07-21. Its root font-size is 10px, so its rem values
     are written here as the px they actually render at:
       text    12 / 14 / 16 / 18 / 20 / 22 / 28px
       line    1.2 (tight) or 1.35 (base)
       spacing 2 / 4 / 6 / 8 / 10 / 14 / 16 / 20 / 24 / 32 / 40 / 48px
     Every value moved to its nearest step. Where one sat exactly between two
     steps it went to the smaller one — applied the same way everywhere, so the
     result stays predictable. */
  .pb__eyebrow { font-family: var(--font-heading); font-size: 12px; letter-spacing: normal; text-transform: uppercase; font-weight: var(--mq-fett); color: var(--pb-uv-lite); margin:0 0 var(--raum-1); }
  .pb__title { font-family: var(--font-heading); font-size: 22px; line-height:26px; letter-spacing: normal; font-weight: var(--mq-fett); margin:0 0 20px; }
  .pb__h2 { font-family: var(--font-heading); font-size: 20px; line-height:24px; letter-spacing: normal; font-weight: var(--mq-fett); margin:0 0 20px; }
  .pb__rte { font-size: 16px; line-height:22px; color: var(--pb-mut); }
  .pb__rte > * + * { margin-top: 1em; }
  .pb__rte a { color: var(--pb-uv-lite); }

  .pb__block { margin-top: clamp(40px, 5vw, 48px); padding-top: clamp(24px, 3vw, 40px); border-top: 1px solid var(--pb-line); }

  .pb__reviews { display: grid; gap:var(--raum-0); }
  .pb__review { margin:0; padding:20px; background: var(--pb-surface); }
  .pb__stars { display: flex; gap:var(--raum-0); margin-bottom:var(--raum-1); }
  .pb__star { color: var(--pb-line); font-size: 14px; line-height: 1; }
  .pb__star.is-on { color: var(--pb-uv-lite); }
  .pb__review blockquote { margin:0 0 var(--raum-1); font-size: 16px; line-height:22px; }
  .pb__review figcaption { font-size: 12px; color: var(--pb-mut); }

  .pb__faq details { border-top: 1px solid var(--pb-line); }
  .pb__faq details:last-child { border-bottom: 1px solid var(--pb-line); }
  .pb__faq summary { cursor: pointer; padding:16px 0; font-weight: var(--mq-fett); font-size: 16px; list-style: none; display: flex; justify-content: space-between; gap:16px; }
  .pb__faq summary::-webkit-details-marker { display: none; }
  .pb__faq summary::after { content: "+"; color: var(--pb-uv-lite); font-weight: 400; }
  .pb__faq details[open] summary::after { content: "−"; }
  .pb__faq details > .pb__rte { padding: 0 0 16px; font-size: 14px; }

  /* ---- right column: buy panel ---- */
  .pb__aside-name { font-family: var(--font-heading); font-size: 16px; font-weight: var(--mq-fett); letter-spacing: normal; margin:0 0 14px; }
  .pb__pricerow { display: flex; align-items: baseline; flex-wrap: wrap; gap:var(--raum-1); margin-bottom:var(--raum-1); }
  /* 22px statt 28px, 04.08.2026. Der Checkout kennt hoechstens 22px, und seine
     eigene Preiszeile steht sogar auf 18px (am selben Tag an der
     Bestelluebersicht gemessen: $399.00, 18px, Gewicht 700). 28px stand hier
     als einziger Wert ueber dem Deckel — .pb__title kam im selben Durchgang
     von 28 auf 22, diese Zeile wurde dabei uebersehen. */
  .pb__price { font-family: var(--font-heading); font-size: 22px; font-weight: var(--mq-fett); letter-spacing: normal; font-variant-numeric: tabular-nums; line-height:26px; }
  .pb__was { color: var(--pb-mut); font-size: 16px; }
  .pb__was[hidden], .pb__off[hidden] { display: none; }
  .pb__off { font-size: 12px; font-weight: var(--mq-fett); letter-spacing: normal; padding:4px var(--raum-1); color: #fff; background: var(--pb-uv); }

  .pb__stock { display: flex; align-items: center; gap:8px; font-size: 14px; color: var(--pb-mut); margin:0 0 24px; }

  /* ---- Das Pixelraster der Kaufspalte — 17.09.2026 ----

     Am 17.09.2026 beanstandet: Unter der ausgewaehlten Deal-Karte lag ein
     zweiter, sehr heller blauer Strich — "als waeren da 2 Rahmen". Gemessen:
     Die Karte endete bei 273.391 statt auf einem ganzen Pixel. Ihr 1px-Rand
     deckte damit 61 % der einen Bildschirmzeile und 39 % der naechsten ab, und
     der Browser zeichnet beide — eine kraeftige Linie und eine blasse
     darunter. Bei den grauen Karten passiert dasselbe, nur faellt Grau auf
     Weiss kaum auf; Blau auf Hellblau sofort.

     Die Ursache liegt nicht an der Karte. Die Zeilenhoehen dieser Spalte sind
     einheitenlose Verhaeltnisse aus dem Checkout (1.35 und 1.2). Daraus werden
     16 x 1.35 = 21.6, 14 x 1.35 = 18.9, 22 x 1.2 = 26.4, 12 x 1.35 = 16.2 —
     lauter Bruchteile, die sich von der Produktueberschrift abwaerts
     aufaddieren. Die Spalte begann bei 151.672 statt bei 152.

     Hier stehen die Verhaeltnisse deshalb als ganze Pixel: dasselbe Verhaeltnis,
     auf den naechsten Pixel gerundet. Die Abweichung ist 0.1 bis 0.4px je Zeile
     und liegt damit unter der Toleranz des Standards (hoechstens 1 CSS-Pixel);
     der doppelte Strich dagegen ist sichtbar. Nach der Aenderung gemessen:
     Spalte beginnt bei 159.000, die Karten bei 206/288/371, jede Kante auf
     einem ganzen Pixel.

     Nur die Kaufspalte. Sie ist der Bereich mit umrandeten Flaechen; im
     Fliesstext der Seite traegt das Verhaeltnis nichts aus und bleibt.
  */
  .pb__aside-in { line-height: 19px; }                    /* 14px x 1.35 = 18.9 */

  /* Dasselbe fuer die Story-Spalte, 19.09.2026.

     Die uebernommenen Checkout-Stylesheets setzen 1.35 weit oben (.pb__info
     traegt schon 18.9px), und alles darunter erbt es. Fuer den Kaufkasten ist
     das seit dem 17.09. geloest — die Story-Spalte stand noch im Erbe: 175 von
     291 Textknoten hatten krumme Zeilen, alle Vielfache von 1.35 (10.5, 13.5,
     16.2, 18.9, 21.6, 24.3).

     Krumme Zeilenhoehen schieben jede Kante zwischen zwei Bildschirmzeilen;
     der Rand wird auf beide verteilt und wirkt unscharf. Deshalb steigt die
     Spalte hier aus dem Erbe aus — mit den Paaren aus dem Zielsatz, nicht mit
     einem einzelnen Wert: Elemente ohne eigene Klasse (Tabellenzellen,
     Beschreibungslisten, Aufklappzeilen) bekommen das Paar ihrer Groesse. */
  .pb__story { line-height: var(--t-ui-zeile); }
  .pb__story table,
  .pb__story td,
  .pb__story th,
  .pb__story dt,
  .pb__story dd { font-size: var(--t-ui); line-height: var(--t-ui-zeile); }
  .pb__story summary,
  .pb__story b { line-height: var(--t-text-zeile); }
  .pb__story small { font-size: var(--t-fuss); line-height: var(--t-fuss-zeile); }
  .pb__story sup { line-height: 1; }
  .pb__aside-in .pb__aside-name,
  .pb__aside-in .pb__was { line-height: 22px; }           /* 16px x 1.35 = 21.6 */
  .pb__aside-in .pb__price { line-height: 26px; }         /* 22px x 1.2  = 26.4 */
  .pb__aside-in .pb__off,
  .pb__aside-in .pb__pay-secure,
  .pb__aside-in .pb__pay-secure * { line-height: 16px; }  /* 12px x 1.35 = 16.2 */
  /* 10.08.2026: Farben auf die Regler, Schein entfernt. Die Fuellung war
     bereits auf die gedeckten Checkout-Toene geaendert worden, der Schein
     stammte noch vom hellen Vorgaengergruen und -rot. Der Checkout kennt
     ausserhalb seiner Fokusringe keinen einzigen box-shadow. Die sichtbare
     Farbe bleibt gleich, weil die Regler dieselben Zahlen fuehren. */
  .pb__dot { width: 7px; height: 7px; border-radius: 50%; background: var(--mq-erfolg); }
  .pb__dot--out { background: var(--mq-fehler); }

  /* Ueberschrift ueber einem Auswahlkasten — 1:1 die des Checkouts.
     Am 31.07.2026 an "Shipping method" gemessen: H2, 16px / 19,2px / 700,
     Farbe #000, KEINE Grossschreibung, KEIN Buchstabenabstand, und 14px
     Abstand hinunter zum Kasten. Die grossen Abschnitte dort ("Payment",
     "Contact", "Delivery") sind 20px — das ist die Ebene darueber, nicht
     unsere. Vorher stand hier 12px, gesperrt, grau, GROSSGESCHRIEBEN:
     ein Element, das der Checkout nirgends hat. */

  /* KEIN eigenes margin hier — sonst gewinnt diese Regel gegen .pb__label
     und die 14px des Checkouts zwischen Ueberschrift und Kasten fallen weg. */

  /* ================================================================
     EIN KASTEN statt drei — 03.08.2026

     Vorgabe: "Pick your Deal" ist der Deckel, darunter die Auswahl, dann
     "Extend Warranty", Boden ist die Menge mit + und minus — alles als eine
     Einheit im Aufbau des Checkouts.

     Der Kasten wird hier NICHT gebaut. Er entsteht aus den Original-
     Klassen des Checkouts an den Zeilen selbst (co-wahlzeile,
     co-kastenzeile) und den vier Klassen am umschliessenden Kasten.
     Alle Zeilen sind direkte Geschwister — nur dann greift die Regel
     des Checkouts, die zwei Nachbarn eine Linie teilen laesst.

     Der erste Versuch am 03.08.2026 gab jedem Block ein Stueck Rahmen,
     weil die Auswahl ausserhalb des Warenkorb-Formulars stand. Das war
     der Fehler: Wrapper dazwischen brechen die Nachbarschaft, und jede
     Zeile zog ihre eigene Linie — der doppelte Rand, der beanstandet
     wurde. Das Formular umschliesst jetzt den ganzen Kasten.
     ================================================================ */

  /* ================================================================
     Kastenzeile ohne Auswahlknopf — 14.08.2026

     Die vier Zeilen des Kaufkastens, die KEINE Auswahl sind: der Deckel
     "Pick your Deal", weitere Optionsbeschriftungen, der Kopf der
     Gewaehrleistung und die Mengenzeile am Boden.

     Bis zum 14.08.2026 trugen sie die vollstaendige Huelle einer
     Auswahlzeile — acht verschachtelte Ebenen, darunter ein leeres div fuer
     den Knopf, der hier nie steht, und drei Huellen ohne jede eigene Regel.
     Sichtbare Folge: cursor: pointer auf einer Ueberschrift. Sie sah
     anklickbar aus und tat nichts.

     Diese Regeln bilden nach, was die acht Ebenen erzeugt haben. Alle Werte
     sind am 14.08.2026 an der laufenden Seite gemessen, nicht geschaetzt:

       Zeilenhoehe   49px einzeilig, 67px mit Untertitel
       Innenabstand  14px, links 24px
       Titel         14px/700, Zeilenhoehe 18.9px, schwarz
       Untertitel    14px/400 in #686B6E, direkt unter dem Titel
       rechte Spalte 14px vom Rand, senkrecht mittig

     Die 24px links sind kein neuer Wert: 14px Innenabstand plus die 10px,
     die im Raster als Abstand zur Knopfspalte standen. Ohne sie ruecken
     die Ueberschriften um 10px nach links und fluchten nicht mehr mit dem
     Auswahlkreis der Zeilen darunter.

     Rahmen, Rundung und die geteilten Trennlinien stehen NICHT hier. Sie
     kommen weiterhin aus den Checkout-Klassen am selben Element, weil sie
     ueber :first-child / :last-child mit den Auswahlzeilen zusammenwirken.
     ================================================================ */
  .co-kz {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    align-items: center;
    gap:8px;
    padding:14px 14px 14px 24px;
    /* Die Zeile ist eine Ueberschrift, kein Bedienelement. Der Zeiger der
       Auswahlzeilen wird hier ausdruecklich zurueckgenommen — er kommt aus
       den geerbten Checkout-Klassen. */
    cursor: default;
  }

  .co-kz__titel {
    display: block;
    font-size: 14px;
    font-weight: var(--mq-fett);
    line-height:19px;
    color: var(--pb-ink);
  }

  .co-kz__unter {
    margin:0;
    font-size: 14px;
    font-weight: 400;
    line-height:19px;
    color: var(--pb-mut);
  }

  .co-kz__rechts {
    display: flex;
    align-items: center;
    justify-content: flex-end;
  }

  /* Nicht kaufbare Auswahl: das Skript setzt is-soldout auf das Label der
     Zeile — heute ist das <label class="pyd-wahl">, das den Auswahlknopf
     umschliesst (snippets/pyd-kaufkasten.liquid).

     Hier standen bis zum 17.09.2026 .pb__swatch und .co-zeile__label. Beide
     Klassen rendert das Theme nicht mehr: .co-zeile__label kam aus dem
     nachgebauten Kaufkasten, .pb__swatch aus der Schutz-Nachfrage, die seit
     dem 15.08.2026 die echten Zeilen klont statt eigene Knoepfe zu bauen. Am
     17.09.2026 nachgezaehlt: beide 0 Treffer im ganzen Theme. Die Regel lief
     also ins Leere — und das Skript setzte die Klasse ohnehin nirgends mehr
     (siehe render() weiter unten).

     Der Durchstrich sitzt am Text, nicht an der Karte: line-through auf einem
     Rasterkasten zieht sonst einen Strich quer durch die ganze Zeile. */
  .pyd-wahl.is-soldout { opacity: 0.35; cursor: not-allowed; }
  .pyd-wahl.is-soldout .pyd-titel,
  .pyd-wahl.is-soldout .pyd-unter { text-decoration: line-through; }
  /* ---- Die Auswahl war frueher hier NACHGEBAUT. ----
     Am 03.08.2026 entfernt: Sie trägt jetzt die Original-Klassen des
     Checkouts (snippets/co-wahlzeile.liquid, co-kastenzeile.liquid) und
     bekommt Rahmen, Rundung und Farbe aus dem Checkout-Stylesheet selbst.

     Weg sind die Regeln .pb__deals, .pb__deal*, .pb__dotc, .pb__deal-panel,
     .pb__plan-opt sowie .pb__qtyrow, .pb__qty, .pb__qtybtn und .pb__qtyinput.
     Kein Element im Theme trug diese Klassen noch — nachgeprueft ueber alle
     .liquid-Dateien; Treffer gab es nur in aelteren Sicherungskopien
     ausserhalb des Themes. Ihre Aufgabe steht jetzt in assets/checkout-uebernahme.css
     (nur noch Inhalt INNERHALB einer Zeile) und in den Checkout-Klassen.

     .pb__swatch bleibt: Die Nachfrage nach dem Schutz (plan-ask) baut ihre
     Knoepfe damit auf, siehe assets/mq.js. */

  /* 1:1 with the checkout "Pay now" button (#checkout-pay-button, measured 2026-07-20):
     bg #005bd1, radius 12px, NO shadow, 14px padding, 50px tall, Plus Jakarta 14px/700,
     NO press animation. Hover darken kept subtle — the checkout's exact hover shade sits
     in Shopify's cross-origin CSS and can't be read. */
  .pb__add { width: 100%; min-height: 50px; display: flex; align-items: center; justify-content: center; cursor: pointer; border: 0; border-radius: var(--pb-radius); padding:14px; font-family: var(--font-heading); font-weight: 700; font-size: 14px; color: #fff; background: var(--pb-uv); transition: background-color 0.2s ease-in-out; }
  .pb__add:hover { background: var(--mq-akzent-gedrueckt); }
  .pb__add:disabled { opacity: 0.4; cursor: not-allowed; }

  /* Die hochgestellte Vorsilbe des Kauftextes: aus "Pre-Order Now" wird PRE,
     drei Viertel so gross und OBEN BUENDIG mit dem O von "Order" — nicht
     darueber schwebend. Gebaut in snippets/knopftext.liquid.

     .kt haelt beide Teile in einer Textzeile. Ohne diesen Wrapper waeren sie
     zwei Flex-Kinder des Knopfes, die align-items:center einzeln zentriert;
     vertical-align greift dann nicht und die Silbe haengt am Knopfrand statt
     am Text.

     Hier stand bis zum 13.08.2026 vertical-align: text-top. Das war falsch:
     text-top legt die Oberkante der TEXTBOX aufeinander, nicht die der
     Buchstaben. Ueber jedem Grossbuchstaben liegt in der Textbox noch Luft fuer
     Oberlaengen und Akzente, und diese Luft ist bei kleinerer Schrift kleiner —
     die Vorsilbe ragte deshalb sichtbar ueber das O hinaus.

     Buendig sind die Buchstaben, wenn ihre Versalhoehen fluchten. Gemessen in
     Plus Jakarta Sans 700 (Canvas, actualBoundingBoxAscent): 11.00px bei 14px
     Schrift, also 0.7857 der Schriftgroesse. Die kleine Schrift ist 0.75 davon,
     ihre Versalhoehe also um 0.7857 x 0.25 = 0.1964 der grossen Schriftgroesse
     niedriger. In der Schriftgroesse der Vorsilbe gerechnet: 0.1964 / 0.75 =
     0.262em, um die sie angehoben werden muss.

     Als Formel: Anhebung = Versalverhaeltnis / 3, solange die Vorsilbe drei
     Viertel misst. vertical-align nimmt den Wert relativ zur eigenen
     Schriftgroesse — der Abstand skaliert also mit, wenn die Knopfschrift sich
     aendert.

     line-height: 1 verhindert, dass die kleinere Zeile die Knopfhoehe von 50px
     veraendert — das ist das Mass des "Pay now" im Checkout. */
  .kt { display: inline; }
  .kt-pre {
    font-size: 0.75em;
    line-height: 1;
    letter-spacing: 0.02em;
    vertical-align: 0.262em;
    /* Luecke zwischen der Vorsilbe und dem Wort dahinter. Sie steht als
       Innenabstand rechts an der Vorsilbe, damit der Strich darunter an
       ihrer letzten Letter endet und nicht in die Luecke laeuft. */
    position: relative;
    padding: 0 0.3em 0 0;
  }
  /* Der Strich unter der Vorsilbe. Er liegt auf der Grundlinie von "Order",
     nicht unter der Vorsilbe selbst.

     Die 0.0715em sind gemessen, nicht geschaetzt: bottom: 0 setzt den Strich
     an die Unterkante des Vorsilben-Kastens, und die lag am 07.09.2026 gegen
     eine eingesetzte Grundlinien-Marke 0.75px ueber der Grundlinie — bei
     10.5px Schriftgroesse der Vorsilbe also 0.0715em. In em, damit es
     mitwaechst, wenn die Knopfschrift sich aendert.

     Die Strichstaerke steht als eigener Wert daneben und geht in die
     Rechnung ein: Wer sie aendert, verschiebt den Strich nicht — seine
     Oberkante bleibt auf der Grundlinie. */
  .kt-pre::after {
    --kt-strich: 1.5px;
    content: "";
    position: absolute;
    left: 0;
    right: 0.3em;
    bottom: calc(-0.0715em - var(--kt-strich));
    height: var(--kt-strich);
    background: currentColor;
  }

  /* Fehlerzeile unter dem Kaufknopf. 14px ist die Textgroesse des Checkouts,
     die Farbe kommt aus dem Regler farbe_fehler (Vorgabe #D91C1C) — kein
     eigener Wert. Der Abstand 12px ist derselbe wie zwischen den Zeilen der
     Kaufspalte. */
  /* 20px statt 1.4: Die Fehlerzeile steht mitten in der Kaufspalte, und 14 mal
     1.4 sind 19.6 — ein Bruchteil, der beim Erscheinen alles darunter
     verschiebt und die Kartenkanten wieder zwischen zwei Bildschirmzeilen
     legt. Genau dagegen ist der Block "Pixelraster der Kaufspalte" weiter
     oben gebaut. 20 bleibt die lockerere Zeile, die sie sein soll. */
  .pb__adderr { margin-top:12px; font-size: 14px; line-height: 20px; color: var(--mq-fehler); }
  .pb__adderr[hidden] { display: none; }

  /* Die Zusagenzeile unter dem Kaufknopf. 14 ist der Abstand, den der
     Kaufkasten ueberall benutzt (assets/pyd.css:132); Schrift und
     Zeilenhoehe kommen vom Kasten, damit die Zeile nicht aus dem
     Pixelraster faellt. */
  .pb__zusage { margin:14px 0 0 0; font-size: 14px; color: var(--pb-mut); }

  /* Der Ersatz fuer den Bewertungsblock vor der ersten Auslieferung. */
  .pb__keinebewertung { font-size: var(--t-text); line-height: var(--t-text-zeile); color: var(--pb-mut); max-width: var(--mass); }

  /* Erklaerkasten der Zusatzartikel. Am 04.08.2026 aus der Sicherung vom
     02.08. zurueckgeholt, zusammen mit dem Markup .pb__support-notice im
     Kaufpanel; ohne diese Regeln haette der Text weder Trennlinie noch
     Abstand zur Preiszeile. */
  .pb__support-notice { margin-top:24px; padding-top:20px; border-top: 1px solid var(--pb-line); }
  .pb__support-notice p { margin:0 0 16px; font-size: 14px; line-height:21px; color: var(--pb-mut); }

  /* the visible add-to-cart: a plain block at the bottom of the sticky buy panel
     — full panel width, no positioning tricks. Desktop only (see below). */
  .pb__stickyadd { display: none; }
  @media screen and (min-width: 1000px) {
    /* desktop: the sticky button is the only add-to-cart → hide the in-panel one.
       Er bleibt im DOM, weil er die Menge und die Variantennummer traegt; seit
       dem 13.08.2026 schickt der mitlaufende Knopf das Formular selbst ab
       (type="submit" form="pb-form"), er braucht ihn also nicht mehr als
       Umweg. On mobile the sticky is hidden and .pb__add is the buy button. */
    .pb__add { display: none; }
    /* 1:1 with the checkout "Pay now" button: flat, radius 12px, 14px padding,
       50px tall, Plus Jakarta 14px/700. */
    .pb__stickyadd {
      display: flex;
      align-items: center;
      justify-content: center;
      width: 100%;
      /* Der Abstand zur Zeile darueber steht jetzt an .pb__pay, damit er
         oben und unten gleich ist. */
      margin-top:0;
      min-height: 50px;
      cursor: pointer;
      border: 0;
      border-radius: var(--pb-radius);
      padding:14px;
      font-family: var(--font-heading);
      font-weight: var(--mq-fett);
      font-size: 14px;
      color: #fff;
      background: var(--pb-uv);
      transition: background-color 0.2s ease-in-out;
    }
    .pb__stickyadd:hover { background: var(--mq-akzent-gedrueckt); }
    .pb__stickyadd:disabled { opacity: 0.4; cursor: not-allowed; }
  }

  /* everything about this button lives in .btn-grey (assets/base.css) — only
     its distance to the buy button above it is local */
  .pb__viewcart { margin-top:var(--raum-1); }

  /* Die mobile Kaufleiste. Ab 1000px gibt es sie nicht — dort klebt die
     Kaufspalte selbst, und zwei klebende Flaechen uebereinander waeren eine
     zu viel. */
  .pb__mobar { display: none; }

  @media screen and (max-width: 999px) {
    .pb__mobar {
      position: fixed;
      inset: auto 0 0 0;
      z-index: 40;
      display: flex;
      align-items: center;
      gap:var(--raum-2);
      padding:12px 16px 12px 16px;
      background: var(--pb-main-bg);
      border-top: 1px solid var(--pb-line);
      /* Unter dem Warenkorb-Fenster und der Kopfzeile, ueber dem Inhalt. */
      transform: translateY(100%);
      transition: transform var(--zeit-2) var(--kurve);
      /* Solange sie unten steht, faengt sie keine Klicks ab. */
      visibility: hidden;
    }
    .pb__mobar.is-da {
      transform: translateY(0);
      visibility: visible;
    }
    .pb__mobar-txt {
      display: flex;
      flex-direction: column;
      min-width: 0;
      flex: 1 1 auto;
    }
    .pb__mobar-name {
      font-size: var(--t-ui);
      line-height: var(--t-ui-zeile);
      font-weight: 600;
      /* Ein langer Produktname darf den Knopf nicht wegdruecken. */
      overflow: hidden;
      text-overflow: ellipsis;
      white-space: nowrap;
    }
    .pb__mobar-preis {
      font-size: var(--t-fuss);
      line-height: var(--t-fuss-zeile);
      color: var(--pb-mut);
    }
    /* 1:1 der Kaufknopf: 50 hoch, Radius 12, 14px/700, Checkout-Blau. */
    .pb__mobar-add {
      flex: 0 0 auto;
      display: flex;
      align-items: center;
      justify-content: center;
      min-height: 50px;
      cursor: pointer;
      border: 0;
      border-radius: var(--pb-radius);
      padding:14px 20px 14px 20px;
      font-family: var(--font-heading);
      font-weight: var(--mq-fett);
      font-size: 14px;
      color: #fff;
      background: var(--pb-uv);
      transition: background-color 0.2s ease-in-out;
    }
    .pb__mobar-add:hover { background: var(--mq-akzent-gedrueckt); }
    .pb__mobar-add:disabled { opacity: 0.4; cursor: not-allowed; }
  }

  @media (prefers-reduced-motion: reduce) {
    .pb__mobar { transition: none; }
  }

  /* Hier standen fuenf Regeln fuer .pb__dynamic — den Schnellkauf-Block.
     Mit dem Block sind sie verwaist, deshalb weg: Altlasten werden
     geloescht, nicht liegengelassen. */

  /* .pb__meta, .pb__meta li und .pb__meta-link am 02.08.2026 entfernt —
     der Infoblock, zu dem sie gehoerten, ist weg. Regeln ohne Markup sind
     genau die Altlast, die der Kommentar oben verbietet. */

  /* ---- Die Gewaehrleistung war frueher hier nachgebaut. ----
     Am 03.08.2026 entfernt. Sie ist keine eigene Flaeche mehr, sondern zwei
     Zeilen im selben Kasten wie die Bundles — laut Vorgabe: "Pick your Deal"
     ist der Deckel, darunter die Auswahl, dann "Extend Warranty", Boden ist
     die Menge mit + und minus, alles als eine Einheit im Aufbau des Checkouts.

     Weg sind .pb__ext, .pb__ext-kopf, -schild, -titel, -was, -hinweis,
     -opts, -opt, -kaest, -row, -col, -main, -sub, -preis und -note. Kein
     Element im Theme trug sie noch; nachgeprueft ueber alle .liquid-Dateien.
     Ihre Aufgabe uebernehmen jetzt die Original-Klassen des Checkouts und
     die co-gar-*-Regeln in assets/checkout-uebernahme.css. */

  .pb__ico { color: var(--pb-uv-lite); flex: 0 0 auto; }

  /* payment methods + secure-checkout line; margin-top:auto drops this block and
     the CTA under it to the bottom of the sticky panel */
  /* Oben und unten derselbe Abstand zur SCHRIFT, nicht zum Textkasten.

     GEMESSEN WIRD GEGEN DIE SICHTBARE KANTE, nicht gegen den Rahmen.

     Der Rahmen (.pb__aside-frame) endet 5px UNTER dem Garantiekasten — er
     traegt aus der Checkout-Klasse _1b9t7yp9 einen negativen Aussenabstand,
     und das Ende seines Inhalts ist nicht das Ende dessen, was man sieht.
     Wer den Innenabstand gegen den Rahmen rechnet, bekommt oben 5px zu
     viel: Am 05.09.2026 standen so 18.03 ueber der Schrift und 13.03
     darunter, obwohl im Code zweimal dasselbe stand.

     Deshalb hier zweimal 12. Sichtbar sind es dann 13.03 oben und 13.03
     unten — die 1.03 sind der Rest der Schriftmetrik, gleich auf beiden
     Seiten.

     Zur Groesse: 16 liess die Zeile zwischen Kasten und Knopf schweben, 10
     draengte sie an den Knopf. Am 05.09.2026 alle drei Staende im Bild
     verglichen. */
  .pb__pay { margin-top: auto; padding:16px 0 16px 0; }
  /* .pb__pay-icons, dessen li und .pb__pay-svg am 11.08.2026 entfernt — das
     Markup dazu gibt es nicht mehr. */
  /* Linksbuendig, wie alles andere in der Kaufspalte. Mittig stand sie am
     05.09.2026 kurz — das war ein Missverstaendnis: Gemeint war die Mitte
     zwischen oben und unten, nicht die waagerechte. */
  .pb__pay-secure { display: flex; align-items: center; gap:8px; margin:0; font-size: 12px; color: var(--pb-mut); }
  /* 11 statt 14: Die Zeichnung fuellt 80 % ihres Kastens, bei 11px sind das
     8.84px Tinte — praktisch genau die Versalhoehe der Schrift daneben
     (8.94px, am 05.09.2026 gemessen). Bei 14px ragte das Schloss oben und
     unten ueber die Buchstaben hinaus; beide Mitten lagen zwar auf 0.12px
     genau uebereinander, aber gleich hoch sahen sie nicht aus. */
  .pb__pay-secure svg { width: 11px; height: 11px; flex: 0 0 auto; }
  /*
    Eine Schriftzeile ist nicht ihr Kasten: Jede Schrift reserviert ueber und
    unter den Buchstaben Platz fuer Ober- und Unterlaengen. Diese halbe
    Durchschuss-Zeile ("half-leading") verteilt sich nicht gleichmaessig, und
    deshalb steht Text, dessen KASTEN mittig sitzt, sichtbar zu hoch. Am
    05.09.2026 hier gemessen: Kasten 16 oben und 16 unten, Buchstaben aber 16
    oben und 17.19 unten.

    text-box schneidet diesen unsichtbaren Platz weg. "trim-both cap
    alphabetic" heisst: oben bis zur Versalhoehe, unten bis zur Grundlinie —
    der engste Sitz um die Buchstaben. Danach zentriert die Flexbox das, was
    man wirklich sieht, und das Schloss behaelt seinen eigenen mittigen Sitz.

    Ein Ausgleich ueber Innenabstaende waere die Alternative gewesen; er
    haette aber das Schloss mitverschoben. Firefox kennt text-box noch nicht
    und zeigt weiter den alten Stand — ein Unterschied von 1.19px.
  */
  .pb__pay-secure span { text-box: trim-both cap alphabetic; }

  .pb__badges { list-style: none; margin:20px 0 0; padding:16px 0 0; border-top: 1px solid var(--pb-line); display: grid; grid-template-columns: repeat(auto-fit, minmax(96px, 1fr)); gap:14px; }
  .pb__badges li { display: grid; gap:var(--raum-0); text-align: center; }
  .pb__badges strong { font-family: var(--font-heading); font-size: 12px; letter-spacing: normal; }
  /* 16 statt 1.35 — 12 mal 1.35 sind 16.2, siehe "Pixelraster der Kaufspalte". */
  .pb__badges span { font-size: 12px; color: var(--pb-mut); line-height: 16px; }

  .pb-reveal { opacity: 0; transform: translateY(22px); transition: opacity 0.8s cubic-bezier(0.16, 1, 0.3, 1), transform 0.8s cubic-bezier(0.16, 1, 0.3, 1); }
  .pb-reveal.is-in { opacity: 1; transform: none; }
  @media (prefers-reduced-motion: reduce) {
    .pb-reveal { opacity: 1; transform: none; transition: none; }
  }
/* END_SECTION:main-product */

/* START_SECTION:main-search (INDEX:16) */
.srx { padding-block: var(--mq-abstand-gross); }
  /* Gestapelt, nicht nebeneinander. Am 31.07.2026 gemessen: der Primaerknopf
     cd__checkout bringt width:499px mit — nebeneinander frisst er die ganze
     Zeile und das Feld bleibt bei Breite 0, im Bildschirmfoto war es
     unsichtbar. Feld ueber Knopf ist ausserdem genau die Form, die das
     Formular der Sendungsverfolgung hat. */
  .srx__form { display: grid; gap: var(--mq-abstand); margin: 0 0 var(--mq-abstand-gross); }
  .srx__zeile { font-size: var(--mq-t-14); line-height: var(--mq-zeile); color: var(--mq-text-leise); margin: 0 0 var(--mq-abstand-gross); }
/* END_SECTION:main-search */

/* START_SECTION:main-tracking (INDEX:17) */
/* Alle Groessen in px: auf dieser Seite liegen die Dateien des Checkouts, und
     die setzen die Grundeinheit auf 10px (siehe sections/main-page.liquid).
     Alle Abstaende stammen aus dem Raster des Checkouts. */
  .trk__form { margin-top:32px; }
  .trk__out { margin-top:32px; }

  /* Die drei Stationen. Waagerecht, mit einer Linie dazwischen.
     Der Punkt ist 14px hoch und sitzt bei 4px — der Text beginnt bei 24px,
     also 6px darunter. Alle drei Werte stehen im Raster. */
  .trk__steps { list-style: none; margin:0 0 32px; padding:0; display: flex; }
  .trk__step { flex: 1; position: relative; padding-top:24px; font-size: 14px; color: var(--mq-text-leise); text-align: center; }
  .trk__step::before {
    content: ''; position: absolute; top: 4px; left: 50%; transform: translateX(-50%);
    width: 14px; height: 14px; border-radius: 50%;
    background: #fff; border: 2px solid var(--mq-linie);
  }
  /* Die Linie verbindet den vorherigen Punkt mit diesem. Sie liegt UNTER dem
     Punkt (z-index 0 gegen 1), nicht hinter dem Kasten — mit z-index:-1 war sie
     hinter dem weissen Hintergrund verschwunden. */
  .trk__step::before { z-index: 1; }
  .trk__step::after {
    content: ''; position: absolute; top: 10px; left: -50%; width: 100%; height: 2px;
    background: var(--mq-linie); z-index: 0;
  }
  .trk__step:first-child::after { display: none; }
  .trk__step--done { color: var(--color-ink); font-weight: 700; }
  .trk__step--done::before { background: var(--cd-accent); border-color: var(--cd-accent); }
  .trk__step--done::after { background: var(--cd-accent); }

  /* Drei Stationen nebeneinander brauchen Platz fuer ihre Beschriftung. Bei
     375px Bildschirm blieben je Station rund 110px fuer Woerter wie
     "Angekommen" oder "Erstattet" — sie brachen mitten im Wort um. Unter 580px
     stehen sie deshalb untereinander, mit der Verbindungslinie senkrecht.
     08.08.2026. */
  @media screen and (max-width: 579.99px) {
    .trk__steps { display: grid; gap:var(--raum-2); margin-bottom:var(--raum-3); }
    .trk__step { padding-top:0; padding-left:var(--raum-3); text-align: left; }
    .trk__step::before { top: 3px; left: 0; transform: none; }
    .trk__step::after { top: -14px; left: 6px; width: 2px; height: 14px; }
  }

  .trk__card { border: 1px solid var(--mq-linie); border-radius: var(--cd-radius); padding:24px; }
  .trk__row { display: flex; justify-content: space-between; gap:16px; font-size: 16px; }
  .trk__row + .trk__row { margin-top:8px; }
  .trk__label { color: var(--mq-text-leise); }
  .trk__items { list-style: none; margin:16px 0 0; padding:16px 0 0; border-top: 1px solid var(--mq-linie); }
  .trk__items li { display: flex; justify-content: space-between; gap:16px; font-size: 16px; }
  .trk__items li + li { margin-top:8px; }
  .trk__link { display: inline-block; margin-top:16px; color: var(--cd-accent); }
  .trk__msg { font-size: 16px; }

  /* Stand der Rueckgabe. Eigene Karte unter der Bestellung, damit klar ist:
     Das hier ist eine zweite Sache, nicht ein Detail der Bestellung. */
  .trk__vorgaenge { margin-top:16px; }
  .trk__vorgang + .trk__vorgang { margin-top:16px; padding-top:16px;
    border-top: 1px solid var(--mq-linie); }
  .trk__vorgang { margin-top:16px; }
  .trk__stand { font-weight: 600; }
  .trk__klein { font-size: 14px; color: var(--mq-text-leise); margin:var(--raum-0) 0 0; }
  .trk__gut { color: var(--mq-erfolg); }

  /* Ruecksendung. Der Bereich haengt unter dem Ergebnis, mit demselben
     Abstand wie das Ergebnis zum Formular darueber. */
  .trk__ret { margin-top:24px; }
  .trk__retform { margin-top:16px; }
  /* Das Formular traegt die Stapel-Klasse des Checkouts, und die setzt
     display:flex. Das uebersteuert das eingebaute "hidden" des Browsers —
     ohne diese Zeile stand das Formular sofort offen statt erst auf Klick. */
  .trk__retform[hidden] { display: none; }
  /* Auswahlfeld und Textfeld tragen die Klassen der Checkout-Eingabefelder.
     Zwei Dinge muessen ergaenzt werden, weil der Checkout dort nur
     einzeilige Textfelder hat: die Hoehe des Textfeldes und der Pfeil,
     den ein Auswahlfeld selbst mitbringt. */
  /* appearance steht jetzt zentral in assets/base.css: dort bekommt das Feld
     den Pfeil des Checkouts. Ein ppearance: auto hier wuerde ihn wieder
     durch den Pfeil des Betriebssystems ersetzen. */
  .trk__area { min-height: 80px; resize: vertical; }
  /* Der Zahlknopf ist derselbe blaue Knopf wie "Show my order" — .cd__checkout.
     Nur der Abstand nach oben ist hier eigen, damit er nicht am Text klebt. */
  .trk__pay { margin-top:16px; }
/* END_SECTION:main-tracking */

/* START_SECTION:media-text (INDEX:18) */
.media-text__inner {
    max-width: var(--container-width);
    margin: 0 auto;
    padding: var(--section-pad-block) var(--section-pad-inline);
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--space-5);
    align-items: center;
  }

  @media screen and (min-width: 750px) {
    /* Zwei Spalten nur, wenn es eine Bildkachel gibt. Fehlt sie, bleibt die
       Vorgabe 1fr von oben stehen und der Text nimmt die ganze Breite. */
    .media-text__inner:has(.media-text__media) {
      grid-template-columns: 1fr 1fr;
      gap: var(--space-6);
    }
    /* Image side toggle: on right, the media cell moves after the text. */
    .media-text--img-right .media-text__media {
      order: 2;
    }
  }

  /* Ohne Bild wuerde der Fliesstext sonst ueber die volle Containerbreite
     laufen. --mass ist die Lesebreite aus dem Zielsatz in theme.liquid. */
  .media-text__inner:not(:has(.media-text__media)) .media-text__body {
    max-width: var(--mass);
  }

  .media-text__img {
    width: 100%;
    height: auto;
    display: block;
    border-radius: 8px;
  }

  .media-text--text-white {
    color: var(--color-background);
  }

  .media-text__eyebrow {
    font-family: var(--font-heading);
    font-weight: var(--mq-fett);
    font-size: 12px;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--mq-text-leise);
    margin: 0 0 var(--space-2);
  }

  .media-text__heading {
    font-size: var(--mq-buehne-3);
    line-height: 1.15;
    letter-spacing: -0.01em;
    margin: 0 0 var(--space-3);
  }

  .media-text__text {
    font-family: var(--font-body);
    font-size: 16px;
    line-height: 1.6;
    color: var(--mq-text-leise);
    margin: 0 0 var(--space-3);
    max-width: 46ch;
  }

  .media-text__list {
    font-family: var(--font-body);
    font-size: 16px;
    line-height: 1.5;
    margin: 0 0 var(--space-4);
    padding: 0;
    list-style: none;
  }

  .media-text__list li {
    position: relative;
    padding-left: 1.5em;
    margin-bottom: var(--space-1);
  }

  .media-text__list li::before {
    content: "";
    position: absolute;
    left: 0;
    top: 0.5em;
    width: 0.5em;
    height: 0.5em;
    border-radius: 50%;
    background: var(--mq-akzent);
  }

  .media-text__cta {
    display: inline-block;
    font-family: var(--font-heading);
    font-weight: var(--mq-fett);
    text-decoration: none;
    color: var(--color-background);
    background: var(--color-ink);
    padding: var(--space-2) var(--space-4);
    border-radius: var(--ecke-1);
  }

  .media-text--text-white .media-text__cta {
    color: var(--color-ink);
    background: var(--color-background);
  }

  .media-text__cta:hover {
    background: var(--mq-akzent);
    color: var(--color-background);
  }
/* END_SECTION:media-text */

/* START_SECTION:product-highlight (INDEX:19) */
.product-highlight {
    position: relative;
    z-index: 2;
    background: var(--color-ink);
    color: var(--color-background);
  }

  .product-highlight__inner {
    max-width: var(--container-width);
    margin: 0 auto;
    padding: var(--section-pad-block) var(--section-pad-inline);
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--space-6);
    align-items: center;
  }

  @media screen and (min-width: 750px) {
    .product-highlight__inner {
      grid-template-columns: 1fr 1fr;
    }

    .product-highlight__media {
      order: -1;
    }
  }

  .product-highlight__media {
    background: rgba(255, 255, 255, 0.06);
    border-radius: var(--ecke-2);
    padding: var(--space-5);
  }

  .product-highlight__media img {
    width: 100%;
    height: auto;
  }

  .product-highlight__title {
    font-size: var(--mq-buehne-4);
    margin: 0 0 var(--space-3);
  }

  .product-highlight__mark {
    margin-right: 0.15em;
  }

  .product-highlight__mark .cls-1 {
    fill: var(--color-background);
  }

  .product-highlight__description {
    font-family: var(--font-body);
    line-height: 1.6;
    color: rgba(255, 255, 255, 0.75);
    margin: 0 0 var(--space-4);
    max-width: 48ch;
  }

  .product-highlight__specs {
    border-top: 1px solid rgba(255, 255, 255, 0.15);
    margin: 0 0 var(--space-4);
  }

  .product-highlight__spec {
    display: flex;
    justify-content: space-between;
    padding: var(--space-2) 0;
    border-bottom: 1px solid rgba(255, 255, 255, 0.15);
    font-family: var(--font-body);
    font-size: 14px;
  }

  .product-highlight__spec dt {
    opacity: 0.6;
  }

  .product-highlight__spec dd {
    margin: 0;
    font-variant-numeric: tabular-nums;
    letter-spacing: 0.02em;
  }

  .product-highlight__cta {
    display: inline-block;
    font-family: var(--font-heading);
    font-weight: var(--mq-fett);
    text-decoration: none;
    color: var(--color-ink);
    background: var(--color-background);
    padding: var(--space-2) var(--space-4);
    border-radius: var(--ecke-1);
    transition: background-color 0.15s ease, color 0.15s ease;
  }

  .product-highlight__cta:hover {
    background: var(--mq-akzent);
    color: var(--color-background);
  }
/* END_SECTION:product-highlight */

/* START_SECTION:s2-auswahl (INDEX:25) */
.s2__inner {
    max-width: var(--container-width);
    margin: 0 auto;
    padding: var(--section-pad-block) var(--section-pad-inline);
  }

  .s2__frage {
    margin: 0 0 var(--raum-5) 0;
    font-size: var(--t-titel-1);
    line-height: var(--t-titel-1-zeile);
    font-weight: 600;
    max-width: var(--mass-titel);
  }

  .s2__paar {
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--raum-6);
  }

  @media screen and (min-width: 750px) {
    .s2__paar { grid-template-columns: 1fr 1fr; }
  }

  /* Gleiche Bodenlinie fuer beide Produkte: Das Bild bekommt ein festes
     Verhaeltnis, nicht seine natuerliche Hoehe. Sonst haengt der Name des
     einen Produkts hoeher als der des anderen, und der Vergleich, um den es
     geht, wird zur Frage nach dem Layout. */
  .s2__bild {
    aspect-ratio: 4 / 3;
    display: flex;
    align-items: center;
    justify-content: center;
    margin: 0 0 var(--raum-4) 0;
  }

  .s2__bild img {
    max-width: 100%;
    max-height: 100%;
    width: auto;
    height: auto;
    display: block;
  }

  .s2__name {
    margin: 0 0 var(--raum-1) 0;
    font-size: var(--t-titel-2);
    line-height: var(--t-titel-2-zeile);
    font-weight: 600;
  }

  .s2__satz {
    margin: 0 0 var(--raum-2) 0;
    font-size: var(--t-text);
    line-height: var(--t-text-zeile);
    max-width: var(--mass);
  }

  .s2__preis {
    margin: 0 0 var(--raum-3) 0;
    font-size: var(--t-titel-3);
    line-height: var(--t-titel-3-zeile);
    font-weight: 600;
  }

  /* Ein Textlink, kein zweiter Kaufknopf: Auf dieser Seite wird nichts
     gekauft, hier wird gewaehlt. */
  .s2__weg {
    display: inline-block;
    font-size: var(--t-ui);
    line-height: var(--t-ui-zeile);
    font-weight: 600;
    color: var(--mq-akzent);
    text-decoration: underline;
    text-underline-offset: 3px;
  }

  .s2__weg:focus-visible {
    outline: 2px solid var(--mq-akzent);
    outline-offset: 2px;
  }
/* END_SECTION:s2-auswahl */

/* START_SECTION:section2-header (INDEX:26) */
/*
    Section 2's own header. Lives inside the overlay (assets/section-snap.js
    moves everything past the hero in there). Layered ON TOP of section 1
    rather than stacked above it in flow: it keeps its flow position, takes a
    z-index to lift it, and section 1 pulls back up underneath via a negative
    margin — see sections/feature-banner.liquid and --overlay-bars-height in
    layout/theme.liquid.

    Sticky, and this is the important part: sticky positions against the
    nearest scrolling ancestor, which here is the overlay. So it docks to the
    top of the OVERLAY and is structurally incapable of escaping up to the
    hero — no scroll maths, no guard conditions, nothing to get wrong. It
    docks below the top bar (which sticks at 0) rather than over it, hence the
    --overlay-topbar-height offset; the two travel as one block.

    It once had position:fixed, which tore it out of the overlay and pinned it
    to the viewport instead, so it jumped to the top on its own while the
    overlay was still sliding. That was the "swipes along weirdly" bug — and
    exactly the class of problem sticky rules out. Nothing here is shared with
    sections/header.liquid: separate section, separate rules.
  */
  .scroll-stage__content > .shopify-section:has(.section2-header) {
    position: sticky;
    top: var(--overlay-topbar-height, 0px);
    z-index: 20;
  }

  /*
    Transparent while parked over section 1's grey panel, solid white once the
    overlay is scrolled and content passes underneath — .is-scrolled is set by
    assets/section-snap.js and drives the top bar the same way.
  */
  .section2-header {
    background: transparent;
    transition: background-color 0.2s ease;
  }

  .scroll-stage__content.is-scrolled .section2-header {
    background: var(--color-background);
  }

  .section2-header__inner {
    /* Identical box to the hero header (sections/header.liquid): the overlay's
       own scrollbar is the only one reserved on the homepage, so both headers
       subtract it exactly once and land on the same left AND right edge as the
       checkout. */
    max-width: calc(var(--overlay-width) - var(--scrollbar-width, 0px));
    margin: 0 auto;
    padding: var(--space-3) 40px;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--space-3);
  }

  /* identical to the hero header's logo rule (sections/header.liquid) */
  .section2-header__logo {
    display: block;
    line-height: 0;
  }

  .section2-header__logo img {
    width: 130px;
    height: auto;
    display: block;
  }

  /* Schmale Schirme: dieselben Werte wie in sections/header.liquid, siehe die
     Rechnung dort. 08.08.2026. */
  @media screen and (max-width: 749.99px) {
    .section2-header__inner {
      padding: var(--mq-rahmen-quer) var(--mq-rahmen-laengs);
      gap: 12px;
    }
    .section2-header__logo img { width: 100px; }
  }
/* END_SECTION:section2-header */

/* START_SECTION:section2-top-bar (INDEX:27) */
/*
    Section 2's own top bar — counterpart to sections/top-bar.liquid, which
    belongs to the hero. Same deal as sections/section2-header.liquid: it is
    just the first thing inside the overlay (assets/section-snap.js moves
    everything past the hero in there) and does nothing — no position, no
    z-index, no scroll logic. It rides up with the overlay because it IS
    part of the overlay. Shares nothing with the hero's top bar: separate
    section, separate settings, separate rules.
  */
  /*
    Sits as a LAYER on top of section 1, not stacked above it in flow: it
    keeps its place in the flow (so it and the header stack naturally without
    anyone measuring anything), gets a z-index to lift it, and section 1
    pulls itself back up underneath via a negative margin — see
    sections/feature-banner.liquid and --overlay-bars-height in
    layout/theme.liquid.

    Sticky, not fixed: sticky is scoped to its scroll container, so it docks
    to the top of the OVERLAY and can never escape it up to the hero. It also
    keeps its slot in the flow, which is what lets the header below it dock
    right underneath rather than on top of it. The pair travels together.
  */
  .scroll-stage__content > .shopify-section:has(.section2-top-bar) {
    position: sticky;
    top: 0;
    z-index: 21;
  }

  /*
    Transparent while parked over section 1's grey panel, solid once the
    overlay is scrolled and content starts passing underneath — the same
    .is-scrolled flag drives the header (assets/section-snap.js sets it).
  */
  .section2-top-bar {
    background: transparent;
    color: var(--color-ink);
    transition: background-color 0.2s ease;
  }

  .scroll-stage__content.is-scrolled .section2-top-bar {
    background: var(--color-background);
  }

  .section2-top-bar__inner {
    max-width: var(--container-width);
    margin: 0 auto;
    padding: var(--space-1) var(--section-pad-inline);
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 0.5em;
  }

  .section2-top-bar__icon {
    flex-shrink: 0;
  }

  .section2-top-bar__text {
    font-family: var(--font-body);
    font-size: 12px;
    letter-spacing: 0.02em;
  }

  .section2-top-bar--ticker .section2-top-bar__inner {
    justify-content: flex-start;
    overflow: hidden;
  }

  .section2-top-bar--ticker .section2-top-bar__text {
    display: inline-block;
    white-space: nowrap;
    transform: translateX(-100%);
  }

  @media (prefers-reduced-motion: no-preference) {
    .section2-top-bar--ticker .section2-top-bar__text {
      animation: section2-top-bar-ticker 14s linear infinite;
    }
  }

  @keyframes section2-top-bar-ticker {
    from {
      transform: translateX(-100%);
    }
    to {
      transform: translateX(100vw);
    }
  }
/* END_SECTION:section2-top-bar */

/* START_SECTION:top-bar (INDEX:28) */
/*
    The hero's top bar. Transparent, full stop — it sits over the hero image
    and never changes. It used to swap to a solid dark background the moment
    you scrolled away (via an is-hero-overlay class toggled from JS), which
    was both a leftover of the old overlay-then-solid header and pointless:
    the section-2 overlay covers this bar anyway, so all it ever produced was
    a visible flash to black during the 0.3s slide.
  */
  .top-bar {
    background: transparent;
    color: var(--color-background);
  }

  /* Page level, below the section-2 overlay — see the layer map in base.css. */
  #shopify-section-top-bar {
    position: relative;
    z-index: 13;
  }

  @media screen and (min-width: 750px) {
    /*
      Same reasoning as sections/header.liquid: absolute inside the fixed
      .scroll-stage pins to the viewport while staying in the stage's
      stacking context, so the overlay can cover it. Out of flow here also
      means the hero starts at y=0 and keeps its full 100vh.
    */
    #shopify-section-top-bar {
      position: absolute;
      top: 0;
      left: 0;
      /* Same scrollbar reservation as sections/header.liquid — see the note there. */
      right: var(--scrollbar-width, 0px);
    }
  }

  .top-bar__inner {
    max-width: var(--container-width);
    margin: 0 auto;
    padding: var(--space-1) var(--section-pad-inline);
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 0.5em;
  }

  .top-bar__icon {
    flex-shrink: 0;
  }

  .top-bar__text {
    font-family: var(--font-body);
    font-size: 12px;
    letter-spacing: 0.02em;
  }

  .top-bar--ticker .top-bar__inner {
    justify-content: flex-start;
    overflow: hidden;
  }

  .top-bar--ticker .top-bar__text {
    display: inline-block;
    white-space: nowrap;
    transform: translateX(-100%);
  }

  @media (prefers-reduced-motion: no-preference) {
    .top-bar--ticker .top-bar__text {
      animation: top-bar-ticker 14s linear infinite;
    }
  }

  @keyframes top-bar-ticker {
    from {
      transform: translateX(-100%);
    }
    to {
      transform: translateX(100vw);
    }
  }
/* END_SECTION:top-bar */

/* CSS from snippet stylesheet tags */
/* START_SNIPPET:localization-form (INDEX:34) */
.loc {
    display: flex;
    flex-wrap: wrap;
    gap:var(--raum-1);
  }

  .loc form {
    margin:0;
  }

  /* checkout values: 14px text, 12px corners, #DEDEDE border, #707070 text
     10.08.2026 auf die Regler gesetzt — dieselben Zahlen, aber jetzt aus einer
     Quelle. */
  .loc__select {
    font-family: inherit;
    font-size: var(--mq-t-14, 14px);
    line-height: 1;
    color: var(--mq-text-leise);
    background: transparent;
    border: var(--mq-linie-staerke, 1px) solid var(--mq-linie);
    border-radius: var(--mq-ecke-kasten);
    padding:8px var(--raum-1);
    cursor: pointer;
  }

  /* Mit dem Finger ist dieses Feld zu klein und zu niedrig: 14px Schrift loesen
     unter iOS den Hineinzoom aus, und 8px Polsterung bei line-height: 1 ergeben
     rund 32px Hoehe statt der 44px, die Apple als Mindestmass nennt.
     10.08.2026 ergaenzt. */
  @media (pointer: coarse) {
    .loc__select {
      font-size: 16px;
      padding:12px 14px;
      min-height: 44px;
    }
  }

  .loc__select:hover {
    color: #000000;
  }
/* END_SNIPPET:localization-form */

/* START_SNIPPET:logo-mark (INDEX:35) */
.logo-mark {
    display: inline;
  }

  .logo-mark svg {
    display: inline;
    height: 0.8756em;
    width: auto;
    vertical-align: -0.1306em;
  }
/* END_SNIPPET:logo-mark */

/* START_SNIPPET:pdp-content-laser (INDEX:39) */
/* ===========================================================================
     DIE VIER DUNKLEN BUEHNEN — E1, entschieden am 19.09.2026

     Hero, Jagd, Sicherheit, Abschluss stehen auf Schwarz. Sie brauchen dafuer
     kein Foto: Eine Buehne ist Schwarz, eine grosse Zeile und Luft. Das Bild
     legt sich spaeter darueber, es ersetzt sie nicht.

     Warum genau diese vier: Sie sind die Stellen, an denen die Seite etwas
     BEHAUPTET statt etwas aufzuzaehlen — was das Geraet ist, wie es jagt, dass
     es sicher ist, und die Aufforderung. Dazwischen bleibt es weiss, weil
     Zahlen, Masse und FAQ gelesen und nicht bestaunt werden (die Literatur
     dazu: dunkler Grund hebt Wert und Haltbarkeit, heller Grund die
     Lesbarkeit — 2026-09-18-premium-literatur.md).

     Alles Lesbare darauf ist weiss. Die Buehnenzeile traegt --t-titel-1
     (32/40 ab 750 px, E2), nicht den 22-px-Deckel: Der gilt fuer Text, den man
     liest, nicht fuer eine Zeile, die auf einem Bild steht.

     Kein Verlauf, kein Glow, kein Schimmer. Der Kontrast kommt aus der Flaeche
     selbst, und weiss auf #0B0B0E ist 19:1 — weit ueber den 4,5:1, die WCAG
     verlangt.
     =========================================================================== */
  .mg-buehne {
    background: #0B0B0E;
    color: #fff;
    /* Kein Ausdehnen auf die Fensterbreite. Der erste Entwurf zog die Buehne
       mit margin-inline: calc(50% - 50vw) an die Fensterkanten — richtig fuer
       eine Seite, falsch hier: Die Story sitzt ab 1000 px in der linken
       Spalte, und die Buehne lief dadurch links aus dem Bild und rechts unter
       den Kaufkasten (gemessen: -296 bis 1601 bei 1912 Fensterbreite).

       Die Spalte hat keinen eigenen Innenabstand, die Buehne fuellt sie also
       ohnehin ganz. Sie braucht nur ihren eigenen Rand nach innen. */
    padding: var(--raum-7) var(--raum-4) var(--raum-7) var(--raum-4);
  }

  .mg-buehne + .mg-buehne { margin-top: 0; }

  /* 19.09.2026: font-size und line-height sind hier raus.

     Diese Regel setzte auf den vier schwarzen Buehnen --t-titel-1, also 32px —
     und damit ausgerechnet dort die kleinste Ueberschrift, wo die groesste
     hingehoert. Gemessen: .mg-h lief im hellen Teil auf 48px, auf der Buehne
     auf 32px zurueck. Die Buehne ist der Rang ueber dem Fliesstext, nicht
     darunter.

     Sie erbt jetzt --mq-buehne-2 aus der Grundregel. Die Farbe bleibt hier,
     die ist der einzige Grund, warum es diese Regel ueberhaupt gibt. */
  .mg-buehne .mg-display,
  .mg-buehne .mg-h {
    color: #fff;
  }

  .mg-buehne .mg-kicker { color: rgba(255, 255, 255, 0.62); }
  .mg-buehne .mg-lede,
  .mg-buehne .mg-note,
  .mg-buehne .mg-press,
  .mg-buehne p,
  .mg-buehne li,
  .mg-buehne b,
  .mg-buehne span { color: #fff; }

  .mg-buehne .mg-lede { color: rgba(255, 255, 255, 0.78); }

  /* Der Ghost-Knopf muss auf Schwarz eine Kontur haben, sonst verschwindet er. */
  .mg-buehne .mg-cta--ghost {
    border-color: rgba(255, 255, 255, 0.45);
    color: #fff;
  }
  .mg-buehne .mg-cta--ghost:hover { border-color: #fff; background: rgba(255, 255, 255, 0.08); }

  /* Auf Schwarz braucht das Produktbild keinen eigenen Grund mehr. */
  .mg-buehne .mg-heroimg,
  .mg-buehne .mg-endimg { mix-blend-mode: normal; }

  /* Die Kette der Sensoren auf der Jagd-Buehne: Linien und Kacheln hell. */
  .mg-buehne .mg-rail li { border-color: rgba(255, 255, 255, 0.18); }
  .mg-buehne .mg-ic,
  .mg-buehne .mg-i { color: #fff; }
  .mg-buehne sup { color: rgba(255, 255, 255, 0.6); }

  /* Die Sicherheits-Buehne traegt vier Kacheln; auf Schwarz reicht die
     Haarlinie, keine Flaeche. */
  .mg-buehne .mg-fgrid > div,
  .mg-buehne .mg-card {
    border-color: rgba(255, 255, 255, 0.16);
    background: transparent;
  }
  /* Der bestehende Balkenvergleich (.mg-db/.mg-track) auf schwarzem Grund.
     Kein zweiter Baustein fuer dieselbe Form: Die Seite zeigt zwei Vergleiche,
     Lautstaerke und Zeit, und beide benutzen dieselben vier Regeln. Hier
     stehen nur die Farben, die auf Schwarz anders sein muessen. */
  .mg-buehne .mg-db__r { color: rgba(255, 255, 255, 0.7); }
  .mg-buehne .mg-db__r.on { color: #fff; }
  .mg-buehne .mg-track { background: rgba(255, 255, 255, 0.16); }
  .mg-buehne .mg-track span { background: rgba(255, 255, 255, 0.45); }
  .mg-buehne .mg-db__r.on .mg-track span { background: #fff; }
  /* Das Abdeckungs-Diagramm. Eine technische Zeichnung, kein Bild: Sie erbt
     ihre Farbe vom Text (currentColor), damit sie auf weissem wie auf
     schwarzem Grund stimmt, ohne zwei Fassungen. */
  .mg-plan {
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--raum-4);
    align-items: center;
  }
  @media screen and (min-width: 750px) {
    .mg-plan { grid-template-columns: minmax(0, 320px) 1fr; gap: var(--raum-5); }
  }
  .mg-plan__svg {
    width: 100%;
    max-width: 320px;
    height: auto;
    display: block;
    color: var(--mg-ink);
  }
  .mg-buehne .mg-plan__svg { color: #fff; }
  /* Sprungnavigation — nur ab 750px, siehe Begruendung am Markup. */
  .mg-nav { display: none; }

  @media screen and (min-width: 750px) {
    .mg-nav {
      position: sticky;
      top: var(--pb-sticky-top);
      z-index: 20;
      display: flex;
      flex-wrap: wrap;
      gap: 0 var(--raum-4);
      margin: 0 0 var(--raum-5) 0;
      padding: var(--raum-2) 0 var(--raum-2) 0;
      background: var(--mq-hintergrund);
      border-bottom: 1px solid var(--pb-line);
    }

    /* Eine Zeile, kein Knopf: Radius 0, kein Rahmen, keine Flaeche. Wer hier
       klickt, kauft nichts — er sucht. */
    .mg-nav a {
      font-size: var(--t-ui);
      line-height: var(--t-ui-zeile);
      font-weight: var(--mq-fett);
      color: var(--mq-text);
      text-decoration: none;
      border-radius: 0;
      white-space: nowrap;
    }

    .mg-nav a:hover { color: var(--mq-akzent); }

    .mg-nav a:focus-visible {
      outline: 2px solid var(--mq-akzent);
      outline-offset: 2px;
    }
  }

  /* Die Sprungziele ruecken um die Hoehe der klebenden Leiste nach unten,
     damit die Ueberschrift nicht dahinter verschwindet. Gilt auch ohne die
     Leiste — dann steht die Ueberschrift nur etwas tiefer im Bild. */
  .mg-sec[id] { scroll-margin-top: calc(var(--pb-sticky-top) + 56px); }
  /* ————— Umrechnung rem -> px, Stand 04.08.2026 —————
     Gemessen am laufenden Shop: die Produktseite laedt die 44 Stylesheets des
     Shopify-Checkouts. Die setzen die Grundeinheit auf 10px statt 16px. Jeder
     rem-Wert kam dadurch mit 62,5 Prozent seiner gemeinten Groesse heraus —
     auf /products/laser-mosquit als 5px, 6px, 8px und 9px im Fliesstext
     (allein 142 Elemente bei 9px, 48 abweichende Kombinationen insgesamt).

     Darum steht hier ueberall px statt rem. Rechenweg je Wert:
       1. rem mal 16 = gemeinte Groesse (0.9rem war als 14,4px gemeint).
       2. Runden auf die Skala des Checkouts: 10 · 12 · 14 · 16 · 18 · 20 · 22 px.
          Genau dazwischen wird aufgerundet. 14,4 -> 14. 17,6 -> 18. 12,8 -> 12.
       3. Deckel 22px, Boden 10px. Die clamp()-Ueberschriften lagen alle
          ueber dem Deckel und stehen deshalb fest auf 22px.
     letter-spacing steht ueberall auf normal — der Checkout kennt weder
     negatives noch positives Tracking. Abstaende (padding, margin, gap, width)
     und Zeilenhoehen sind unveraendert. ————— */
  /* ————— mg · MEGA-Vergleichsversion (A Shop / B Flagship / C Design-Tool) ————— */
  .mg { --mg-ink:#000000; --mg-mut:#707070; --mg-line:#dedede; --mg-uv:#005bd1;
        background:#fff; color:var(--mg-ink); font-family:var(--font-body); }
  .mg-sec { padding: var(--raum-4) 0 var(--raum-5) 0; }
  .mg-center { text-align:center; }
  /* Die Redaktionsmarken .mg-area und .mg-tag sind am 19.09.2026 mit den
     Entwurfsvarianten geloescht worden (Schritt 2a). Sie beschrifteten im
     Theme-Editor, welche Variante welche war; es gibt nur noch eine je
     Bereich. Ihre Regeln standen bis heute hier und sprachen ins Leere. */
  .mg-kicker { font-size:12px; letter-spacing:normal; text-transform:uppercase; color:var(--mg-uv); margin: 0 0 var(--raum-2) 0; font-weight: var(--mq-fett); }
  /* 19.09.2026 — DIE UEBERSCHRIFTEN VERLASSEN DAS TEXTBAND.

     Gemessen: auf dieser Seite war die groesste Schrift 32px, das Verhaeltnis
     zwischen groesster und kleinster 3,2 zu 1. Zum Vergleich, am selben Tag an
     denselben Stellen erhoben: Bang & Olufsen 6,0 zu 1, Flow-Startseite 6,4 zu 1,
     Apple 9,6 zu 1. Bei 3,2 zu 1 ist auf einer Seite nichts mehr deutlich
     wichtiger als etwas anderes — das Auge findet keinen Einstieg und liest die
     Seite als Datenblatt.

     Der Grund war nicht Absicht: --mq-buehne-1 bis -6 stehen seit Monaten in
     layout/theme.liquid (Zeilen 246 bis 251) und reichen bis 60px. Benutzt
     wurden sie an acht Stellen im ganzen Theme, davon drei auf der
     Passwortseite. Auf den Produktseiten kein einziges Mal.

     Hier gilt --mq-buehne-2, nicht -1: Die Story laeuft in der 499px-Spalte des
     Kaufrasters. Sechzig Pixel ergeben darin rund zehn Zeichen je Zeile, also
     eine vierzeilige Ueberschrift. --mq-buehne-2 deckelt bei 48px.

     Zeilenhoehe 1,05 und leicht negative Laufweite gelten NUR hier oben. Im
     Lesetext bleiben die ganzzahligen Zeilenhoehen unangetastet: dort sitzen
     Zeilen aufeinander und brauchen den Rhythmus, eine Ueberschrift steht
     allein. (Bringhurst, Kap. 3.1: je groesser der Grad, desto enger Zeile und
     Laufweite.) */
  .mg-h {
    font-weight: var(--mq-fett);
    font-size: var(--mq-buehne-2);
    line-height: 1.05;
    letter-spacing: -0.01em;
    max-width: var(--mass-titel);
    margin: 0 0 var(--raum-3) 0;
  }
  .mg-display { font-weight: var(--mq-fett); letter-spacing:-0.01em; font-size: var(--mq-buehne-2); line-height:1.05; margin: var(--raum-1) 0 var(--raum-3) 0; }
  .mg-lede { color:var(--mg-mut); font-size:16px; line-height:26px; max-width:52ch; margin: 0 0 var(--raum-1) 0; }
  .mg-center .mg-lede { margin-inline:auto; }
  .mg-note { font-size:12px; color:var(--mg-mut); margin: var(--raum-2) 0 0 0; line-height:19px; }
  .mg-note--line { padding-top: var(--raum-2); border-top:1px solid #ededed; }
  /* 04.08.2026: Die em-Schriftgroessen dieser Datei rechneten auf ihren
     Elternwerten zu 6,2 bis 11 px herunter — dieselbe Groessenordnung, wegen
     der die rem-Werte umgestellt wurden. Sie stehen jetzt als feste 10px, die
     kleinste Stufe des Checkouts. Es sind die Einheitenzusaetze neben den
     grossen Zahlen (dB, Grad, Hochgestelltes). Von den vier Stellen von damals
     sind seit dem 19.09.2026 zwei uebrig; .mg-wavedb und .mg-cone__stats
     gehoerten zu geloeschten Varianten. */
  .mg sup { color:var(--mg-uv); font-size:10px; }
  .mg-supw { color:#fff !important; }
  .mg-i { width:22px; height:22px; fill:none; stroke:currentColor; stroke-width:1.5; stroke-linecap:round; stroke-linejoin:round; }
  .mg-ic { display:inline-flex; color:var(--mg-uv); }
  .mg-icbox { display:inline-flex; width:40px; height:40px; align-items:center; justify-content:center;
    border:1px solid #dedede; border-radius:var(--pb-radius, 12px); color:var(--mg-uv); flex:0 0 auto; }
  .mg-icbox--lg { width:54px; height:54px; border-radius:var(--ecke-2); }
  .mg-ctarow { display:flex; gap: var(--raum-2); flex-wrap:wrap; margin-top: var(--raum-3); }
  .mg-center .mg-ctarow { justify-content:center; }
  .mg-cta { display:inline-flex; align-items:center; justify-content:center; min-height:52px; padding: var(--raum-2) var(--raum-4) var(--raum-2) var(--raum-4);
    border-radius:var(--pb-radius, 12px); background:var(--mg-uv); color:#fff; font-family:var(--font-heading); font-weight: var(--mq-fett); font-size:14px; text-decoration:none; }
  .mg-cta:hover { background:#004aa8; }
  .mg-cta--ghost { background:none; border:1px solid var(--mg-line); color:var(--mg-ink); }
  .mg-heroimg { width:min(460px,100%); height:auto; margin: var(--raum-3) auto 0; display:block; }
  .mg-press { margin: var(--raum-4) 0 0 0; font-size:12px; color:var(--mg-mut); }
  .mg-press strong { color:var(--mg-ink); font-weight:600; }
  /* Stats B */
  .mg-num { font-weight: var(--mq-fett); font-variant-numeric:tabular-nums; font-size: var(--mq-buehne-3); letter-spacing:-0.01em; line-height:1; }
  .mg-num em { font-style:normal; font-size:12px; color:var(--mg-uv); margin-left: var(--raum-0); font-weight: var(--mq-fett); }
  /* Stats C */
  /* Stats A */
  .mg-bento { display:grid; grid-template-columns:repeat(2,1fr); gap: var(--raum-1); }
  .mg-card { border:1px solid #dedede; border-radius:var(--pb-radius, 12px); padding: var(--raum-3) var(--raum-3) var(--raum-3) var(--raum-3); }
  .mg-card--hero { grid-column:1/-1; }
  .mg-card .mg-num { font-size: var(--mq-buehne-4); font-weight: var(--mq-fett); }
  .mg-card p { margin: var(--raum-1) 0 0 0; font-size:14px; color:var(--mg-mut); }
  /* Zitat */
  /* Panels (C) */
  /* 12px statt 10px, 08.08.2026: Das hier ist ein Bedienelement, kein Etikett.
     Der Checkout benutzt 10px nur fuer Zaehler und Fussnoten; seine kleinste
     Groesse auf einem Knopf ist 12px. */
  /* Rail */
  .mg-rail { list-style:none; margin: var(--raum-3) 0 0 0; padding: 0 0 0 0; }
  .mg-rail li, .mg-row { display:flex; gap: var(--raum-2); align-items:flex-start; padding: var(--raum-2) 0 var(--raum-2) 0; }
  .mg-rail li + li, .mg-row + .mg-row { border-top:1px solid var(--mg-line); }
  .mg-rail b, .mg-row b { display:block; font-size:16px; margin-bottom: var(--raum-0); }
  .mg-rail li > div > span, .mg-row > div > span { color:var(--mg-mut); font-size:14px; line-height:22px; display:block; }
  .mg-media { margin: var(--raum-4) 0 0 0; position:relative; }
  .mg-media img { width:100%; height:auto; border-radius:var(--ecke-2); display:block; filter:saturate(.88); }
  .mg-media figcaption { position:absolute; left:0; right:0; bottom:0; padding: var(--raum-6) var(--raum-3) var(--raum-3) var(--raum-3); color:#fff;
    font-size:14px; line-height:21px; background:linear-gradient(transparent, rgba(0,0,0,0.55)); border-radius: 0 0 var(--ecke-2) var(--ecke-2); }
  .mg-media--light figcaption { position:static; padding: var(--raum-2) var(--raum-0) 0 var(--raum-0); color:var(--mg-mut); background:none; font-size:14px; }
  /* Anatomie */
  .mg-anat { position:relative; margin: var(--raum-4) auto 0; max-width:635px; padding-inline:118px; }
  .mg-anat img { width:100%; height:auto; display:block; }
  .mg-call { position:absolute; display:flex; align-items:center; gap: var(--raum-1); font-size:12px; font-weight:600; background:#fff; text-align:left; }
  .mg-call::before { content:""; width:9px; height:9px; border-radius:50%; background:var(--mg-uv); flex:0 0 auto; }
  .mg-call small { display:block; font-weight:400; color:var(--mg-mut); font-size:12px; }
  /* Zielfilter C */
  .mg-target { display:grid; grid-template-columns:1fr 1fr; gap: var(--raum-4); align-items:start; margin-top: var(--raum-3); }
  .mg-target__fire { border-left:3px solid var(--mg-uv); padding-left: var(--raum-2); }
  .mg-target__fire p { font-size:10px; letter-spacing:normal; text-transform:uppercase; color:var(--mg-uv); font-weight: var(--mq-fett); margin: 0 0 var(--raum-1) 0; }
  .mg-target__fire div { font-weight: var(--mq-fett); font-size:22px; letter-spacing:normal; line-height:1; margin: 0 0 var(--raum-1) 0; }
  .mg-target__fire span { color:var(--mg-mut); font-size:14px; line-height:21px; }
  .mg-target__ign p { font-size:10px; letter-spacing:normal; text-transform:uppercase; color:#a2a6ad; font-weight: var(--mq-fett); margin: 0 0 var(--raum-1) 0; }
  .mg-target__ign ul { list-style:none; margin: 0 0 0 0; padding: 0 0 0 0; display:grid; gap: var(--raum-1); }
  .mg-target__ign li { font-size:14px; color:var(--mg-mut); line-height:20px; padding-left: var(--raum-3); position:relative; }
  .mg-target__ign li::before { content:"✕"; position:absolute; left:0; color:#c0c0c0; font-size:12px; }
  /* Sicherheit */
  .mg-fgrid { display:grid; grid-template-columns:1fr 1fr; gap: var(--raum-4) var(--raum-4); margin-top: var(--raum-4); }
  .mg-fgrid--3 { grid-template-columns:repeat(3,1fr); }
  .mg-fgrid b { display:block; font-size:16px; margin: var(--raum-2) 0 var(--raum-1) 0; }
  .mg-fgrid > div > span:not(.mg-ic) { color:var(--mg-mut); font-size:14px; line-height:22px; display:block; }
  /* Welle */
  /* 12px, siehe Begruendung beim Umschalter oben — Beschriftung eines Knopfs. */
  /* dB Meter B */
  .mg-db { display:grid; gap: var(--raum-2); max-width:560px; margin: var(--raum-4) auto 0; }
  .mg-db__r { display:grid; grid-template-columns:116px 1fr 54px; gap: var(--raum-2); align-items:center; font-size:14px; color:var(--mg-mut); text-align:left; }
  .mg-db__r.on { color:var(--mg-ink); font-weight: var(--mq-fett); }
  .mg-track { height:5px; border-radius:var(--ecke-rund); background:#f5f5f5; overflow:hidden; }
  .mg-track span { display:block; height:100%; border-radius:var(--ecke-rund); background:#dedede; }
  .mg-db__r.on .mg-track span { background:var(--mg-uv); }
  .mg-db__v { text-align:right; font-variant-numeric:tabular-nums; }
  /* Kegel */
  /* Strom C */
  .mg-approw { display:grid; grid-template-columns:auto 1fr; gap: var(--raum-2); align-items:start; }
  .mg-approw b { display:block; font-size:18px; font-weight: var(--mq-fett); letter-spacing:normal; margin-bottom: var(--raum-0); }
  .mg-approw div > span { color:var(--mg-mut); font-size:14px; line-height:22px; }
  /* Mosaik */
  .mg-mosaic { display:grid; grid-template-columns:1fr 1fr; gap: var(--raum-2); margin: var(--raum-3) 0 var(--raum-2) 0; }
  .mg-mosaic > div { position:relative; border-radius:var(--ecke-2); overflow:hidden; }
  .mg-mosaic__wide { grid-column:1/-1; aspect-ratio:16/8; }
  .mg-mosaic > div:not(.mg-mosaic__wide) { aspect-ratio:1; }
  .mg-mosaic img { width:100%; height:100%; object-fit:cover; display:block; filter:saturate(.9); }
  .mg-mosaic span { position:absolute; left:16px; bottom:13px; font-size:12px; letter-spacing:normal;
    text-transform:uppercase; color:#fff; text-shadow:0 1px 8px rgba(0,0,0,0.85); }
  /* Szenen-Tabs B */
  /* Vergleich C */
  /* Vergleich B */
  .mg-table { width:100%; border-collapse:collapse; font-size:14px; margin-top: var(--raum-1); }
  .mg-table th, .mg-table td { padding: var(--raum-2) var(--raum-2) var(--raum-2) var(--raum-2); text-align:center; color:var(--mg-mut); font-weight:400; }
  .mg-table td:first-child, .mg-table th:first-child { text-align:left; color:var(--mg-ink); }
  .mg-table tbody tr { border-top:1px solid var(--mg-line); }
  .mg-table .own { color:var(--mg-ink) !important; font-weight: var(--mq-fett); }
  .mg-table thead .own { color:var(--mg-uv) !important; }
  /* Specs */
  .mg-specs { margin: var(--raum-3) 0 0 0; }
  .mg-specs > div { display:flex; justify-content:space-between; gap: var(--raum-2); padding: var(--raum-2) 0 var(--raum-2) 0; font-size:14px; }
  .mg-specs > div + div { border-top:1px solid var(--mg-line); }
  .mg-specs dt { color:var(--mg-mut); }
  .mg-specs dd { margin: 0 0 0 0; font-weight:600; text-align:right; font-variant-numeric:tabular-nums; }
  .mg-dim { max-width:380px; display:block; margin-top: var(--raum-4); font-family:var(--font-body); }
  /* Deal */
  .mg-deal { margin-top: var(--raum-4); }
  .mg-deal__l { display:flex; justify-content:space-between; align-items:baseline; gap: var(--raum-2); padding: var(--raum-2) 0 var(--raum-2) 0;
    font-size:16px; border-top:1px solid var(--mg-line); }
  .mg-deal__l small { display:block; font-size:14px; color:var(--mg-mut); margin-top: var(--raum-0); font-weight:400; }
  .mg-deal__free { color:var(--mg-uv); font-weight: var(--mq-fett); white-space:nowrap; }
  .mg-deal__free s { color:var(--mg-mut); font-weight:400; margin-right: var(--raum-1); }
  .mg-deal__total { border-bottom:1px solid var(--mg-line); font-weight: var(--mq-fett); font-size:18px; }
  .mg-deal__fine { font-size:12px; color:var(--mg-mut); margin: var(--raum-2) 0 0 0; line-height:19px; }
  .mg-trust { display:grid; grid-template-columns:repeat(4,1fr); gap: var(--raum-3) var(--raum-2); margin-top: var(--raum-5); text-align:center; }
  .mg-trust > div { display:grid; gap: var(--raum-1); justify-items:center; }
  .mg-trust b { font-size:14px; }
  .mg-trust > div > span:not(.mg-ic) { font-size:12px; color:var(--mg-mut); line-height:17px; }
  /* FAQ */
  .mg-faq { margin-top: var(--raum-3); }
  .mg-faq details { padding: var(--raum-2) 0 var(--raum-2) 0; }
  .mg-faq details + details { border-top:1px solid var(--mg-line); }
  .mg-faq summary { cursor:pointer; font-weight:600; font-size:16px; }
  .mg-faq p { margin: var(--raum-1) 0 0 0; color:var(--mg-mut); font-size:14px; line-height:23px; }
  /* Abschluss C */
  .mg-endimg { width:min(340px,100%); height:auto; margin: 0 auto var(--raum-1); display:block; }
  .mg-chips { display:flex; flex-wrap:wrap; gap: var(--raum-1); margin: var(--raum-2) 0 0 0; }
  .mg-chips--center { justify-content:center; }
  .mg-chips span { display:inline-flex; align-items:center; gap: var(--raum-1); font-size:12px; letter-spacing:normal;
    padding: var(--raum-1) var(--raum-2) var(--raum-1) var(--raum-2); border:1px solid var(--mg-line); border-radius:var(--ecke-rund); color:var(--mg-ink); }
  .mg-chips .mg-i { width:15px; height:15px; color:var(--mg-uv); }
  .mg-foot ol { margin: 0 0 0 0; padding-left: var(--raum-3); color:var(--mg-mut); font-size:12px; line-height:19px; display:grid; gap: var(--raum-1); }
  /* Reveal */
  .mg-reveal { opacity:0; transform:translateY(18px); transition:opacity .7s cubic-bezier(.16,1,.3,1), transform .7s cubic-bezier(.16,1,.3,1); }
  .mg-reveal.in { opacity:1; transform:none; }
  @media (prefers-reduced-motion: reduce) { .mg-reveal { opacity:1; transform:none; transition:none; } }
  @media screen and (max-width: 749.99px) {
.mg-fgrid, .mg-fgrid--3, .mg-target, .mg-bento { grid-template-columns:1fr; }
    .mg-trust { grid-template-columns:1fr 1fr; }
    .mg-anat { padding-inline:0; }
    .mg-call { position:static; margin-top: var(--raum-1); }
    .mg-mosaic { grid-template-columns:1fr; }
    .mg-mosaic__wide { aspect-ratio:16/10; }

    /* ---- 08.08.2026 ergaenzt ----
       Die drei folgenden Raster fehlten in dieser Abfrage. Gerechnet bei 375px
       Bildschirm und 347px Inhalt: drei Szenenkacheln ergaben je 109px, vier
       Wellenknoepfe je 80px, und die Datenbankzeile reservierte 196px fest fuer
       zwei Spalten, sodass dem Balken 84px blieben. */
    .mg-db__r     { grid-template-columns:1fr; gap: var(--raum-1); }

    /* Die beiden Vergleichstabellen behalten ihre Spalten, bekommen aber einen
       eigenen Scrollbereich. Fuenf Spalten auf 347px liessen je Zelle rund
       30px Textbreite — schmaler als ein einzelnes Wort. Waagerecht scrollen
       ist ehrlicher als umbrechen: Die Zeilen gehoeren zusammen.
       Das Theme hatte bis heute keinen einzigen overflow-x-Bereich. */

    /* Bei der echten Tabelle greift overflow nur, wenn sie kein display:table
       mehr ist — deshalb block. width:max-content mit min-width:100% erhaelt
       dabei die natuerliche Spaltenverteilung. */
    /* 10.08.2026: width: max-content ist raus. Scrollkasten und Inhalt waren
       dasselbe Element — mit max-content war der Kasten immer exakt so breit
       wie sein Inhalt, es gab also nie einen Ueberhang zum Scrollen. Die
       Tabelle wuchs stattdessen ueber den Bildschirmrand hinaus und schob die
       ganze Seite in die Breite. Jetzt begrenzt max-width: 100% den Kasten,
       und die Zellen halten ueber white-space: nowrap ihre Spaltenbreite —
       der Ueberhang entsteht dadurch INNERHALB des Kastens und scrollt. */
    .mg-table {
      display: block;
      overflow-x: auto;
      overscroll-behavior-x: contain;
      max-width: 100%;
    }
    .mg-table th,
    .mg-table td { white-space: nowrap; }
  }
/* END_SNIPPET:pdp-content-laser */

/* START_SNIPPET:pdp-content (INDEX:40) */
/* rem-Umrechnung, 07.08.2026 — warum hier keine rem-Schriftgroessen mehr stehen
     ----------------------------------------------------------------------------
     Die Produktseite laedt die 44 Stylesheets des Shopify-Checkouts mit. Die
     setzen die Grundeinheit auf 10px statt der ueblichen 16px. Jeder rem-Wert
     kam dadurch mit 62,5 Prozent seiner gemeinten Groesse heraus.
     Gemessen am 04.08.2026 auf /products/laser-mosquit: Schriftgroessen von 5,
     6, 8 und 9 px im laufenden Text, allein 142 Elemente mit 9px, insgesamt 48
     abweichende Kombinationen aus Groesse, Gewicht und Buchstabenabstand.

     Rechenweg fuer jeden Wert unten:
       rem mal 16   = die gemeinte Groesse
       danach runden auf die Skala des Checkouts: 10 12 14 16 18 20 22 px
       genau dazwischen wird aufgerundet, Deckel 22px, Boden 10px
     Beispiel: 0.9rem war als 14,4px gemeint, kam als 9px heraus, steht jetzt
     als 14px.

     letter-spacing steht ueberall auf normal. Der Checkout misst am selben Tag
     durchgehend normal, weder negatives noch positives Tracking. Das gilt auch
     fuer die frueheren -0.045em bis -0.02em an den Ueberschriften.

     Bei clamp() sind nur die beiden rem-Grenzen umgerechnet, der mittlere
     cqw-Wert bleibt. Wo beide Grenzen ueber dem Deckel lagen, stehen jetzt
     zweimal 22px.

     Nicht angefasst: Abstaende (padding, margin, gap, width), Zeilenhoehen
     (alle bereits einheitenlos) und die Container-Queries in em. */
  .px {
    /* the story responds to the COLUMN width, not the viewport */
    container-type: inline-size;
    container-name: pxcol;
    --px-night: #07060a; --px-night2: #0d0b13; --px-day: #ffffff; --px-paper: #f2f1f4;
    --px-ink: #121016; --px-ink-mut: #6a6673; --px-snow: #f6f4f9; --px-snow-mut: rgba(246,244,249,0.6);
    /* 19.09.2026 (Schritt 7b): Lila raus. Die Hausregel ist "Lila nur im
       Logo" — diese Story war die letzte Stelle im Shop, an der es als
       Text- und Flaechenfarbe stand (.px-eyebrow, .px-stat__n, .px-badge,
       .px-cta). Der Akzent ist jetzt das Checkout-Blau; auf dunklem Grund
       traegt Weiss, wie es E1 fuer alles Lesbare auf Buehnen festlegt.
       Der Glow ist auf transparent gesetzt statt entfernt: Er haengt an
       zwei Verlaeufen, deren Aufbau sonst mitgeaendert werden muesste, und
       fuer Glow gibt es keinen Beleg (2026-09-18-premium-literatur.md). */
    --px-uv: var(--mq-akzent, #005BD1); --px-uv-lite: #ffffff; --px-glow: transparent;
    --px-f: var(--font-heading, "Helvetica Neue", Inter, -apple-system, "Segoe UI", sans-serif);
    font-family: var(--px-f); color: var(--px-ink); -webkit-font-smoothing: antialiased;
  }
  .px * { box-sizing: border-box; margin: 0 0 0 0; }
  /* the band edges come from .pb__story (flush-left at 176px, 40px gap right).
     A modest inner padding keeps the text off the band edges without pushing it
     far from the title's 176px alignment. */
  /* 19.09.2026 — ZWEI ABSTANDSSTUFEN STATT VIERZEHN clamp-AUSDRUECKEN.

     Vorher rechnete jeder Abstand dieser Story sein eigenes clamp() mit cqw.
     Am laufenden Shop gemessen kamen dabei 26, 28, 30, 37, 44 und 55 Pixel
     heraus — Werte, die auf keiner Stufe liegen und sich bei jeder
     Fensterbreite verschieben. Zwoelf verschiedene Abstaende auf einer Seite
     ergeben keinen Rhythmus, und wer die Datei liest, kann keinem Wert
     ansehen, warum er dort steht.

     Jetzt zwei Stufen, die am vorhandenen Haltepunkt (52em) umschalten:
       --px-r   der normale Abstand      24 schmal, 48 breit
       --px-rg  der grosse Abstand       48 schmal, 96 breit
     Beide zeigen auf die Tokenskala, ergeben also immer ganze Pixel. */
  .px-sec {
    --px-r: var(--raum-3);
    --px-rg: var(--raum-5);
    padding: var(--px-rg) var(--px-r) var(--px-rg) var(--px-r);
  }
  .px-in { max-width: 100%; margin: 0 auto; }
  .px-day { background: var(--px-day); } .px-paper { background: var(--px-paper); }
  .px-night { background: var(--px-night); color: var(--px-snow); } .px-night2 { background: var(--px-night2); }

  .px-eyebrow { font-size: 12px; letter-spacing: normal; text-transform: uppercase; font-weight: var(--mq-fett); color: var(--px-uv); }
  .px-night .px-eyebrow, .px-warm .px-eyebrow { color: var(--px-uv-lite); }
  .px-h1 { font-size: var(--mq-buehne-2); line-height: 1.05; letter-spacing: -0.01em; font-weight: var(--mq-fett); max-width: var(--mass-titel); }
  .px-h2 { font-size: var(--mq-buehne-2); line-height: 1.05; letter-spacing: -0.01em; font-weight: var(--mq-fett); max-width: var(--mass-titel); margin-bottom: var(--raum-2); }
  .px-h3 { font-size: var(--t-titel-3); line-height: var(--t-titel-3-zeile); letter-spacing: normal; font-weight: var(--mq-fett); }
  .px-lede { font-size: var(--t-text); line-height: var(--t-text-zeile); color: var(--px-ink-mut); max-width: 46ch; }
  .px-night .px-lede { color: var(--px-snow-mut); }
  .px-uv { color: var(--px-uv-lite); }

  .px-cta { display: inline-block; padding: var(--raum-2) var(--raum-4) var(--raum-2) var(--raum-4); background: var(--px-uv); color: #fff; font-weight: var(--mq-fett); font-size: 16px; text-decoration: none; }
  .px-cta:hover { background: #8f1fa8; color: #fff; }
  .px-cta--ghost { background: transparent; color: var(--px-snow); box-shadow: inset 0 0 0 1px rgba(246,244,249,0.4); }
  .px-cta--ghost:hover { background: rgba(246,244,249,0.08); color: var(--px-snow); }

  .px-photo { background-size: cover; background-position: center; }
  .px-slot { position: relative; background: linear-gradient(160deg, #17151d, #0b0a0f); display: grid; place-items: center; overflow: hidden; }
  .px-day .px-slot, .px-paper .px-slot { background: linear-gradient(160deg, #eceaf0, #dedbe6); }
  .px-slot__tag { position: absolute; left: 16px; bottom: 14px; font-size: 10px; letter-spacing: normal; text-transform: uppercase; color: rgba(18,16,22,0.34); }
  .px-slot__cap { position: absolute; left: 18px; bottom: 16px; z-index: 2; font-weight: var(--mq-fett); font-size: 14px; color: #fff; text-shadow: 0 1px 12px rgba(0,0,0,0.7); }
  .px-photo::after { content: ""; position: absolute; inset: 0; background: linear-gradient(180deg, transparent 45%, rgba(0,0,0,0.55)); }

  /* HERO — height driven by column width, not 92vh */
  .px-hero { position: relative; min-height: clamp(420px, 82cqw, 620px); display: flex; align-items: flex-end; overflow: hidden; background: var(--px-night); }
  .px-hero__photo { position: absolute; inset: 0; background-size: cover; background-position: center; }
  .px-hero__bg { position: absolute; inset: 0; background:
      linear-gradient(90deg, rgba(5,4,7,0.94) 0%, rgba(5,4,7,0.55) 46%, rgba(5,4,7,0.78) 100%),
      radial-gradient(58% 44% at 66% 42%, rgba(181,38,211,0.34), transparent 60%),
      linear-gradient(180deg, rgba(5,4,7,0.2), rgba(5,4,7,0.85)); }
  .px-hero__lamp { position: absolute; right: 7%; top: 44%; transform: translateY(-50%); width: clamp(96px, 26cqw, 220px); display: grid; place-items: center; z-index: 1; }
  .px-hero__halo { position: absolute; inset: -20% -40%; background: radial-gradient(circle, var(--px-glow), transparent 62%); filter: blur(30px); animation: pxPulse 5.5s ease-in-out infinite; }
  .px-hero__img { position: relative; width: 100%; height: auto; z-index: 1;
      -webkit-mask-image: radial-gradient(ellipse 56% 80% at 50% 48%, #000 54%, transparent 82%);
      mask-image: radial-gradient(ellipse 56% 80% at 50% 48%, #000 54%, transparent 82%); }
  @keyframes pxPulse { 0%,100% { opacity: .7; transform: scale(1); } 50% { opacity: 1; transform: scale(1.06); } }
  .px-hero__in { position: relative; z-index: 2; width: 100%; max-width: 100%; margin: 0 auto; padding: var(--px-r) var(--px-r) var(--px-rg) var(--px-r); color: var(--px-snow); }
  .px-hero__stats { display: flex; flex-wrap: wrap; gap: var(--px-r); margin-bottom: var(--px-rg); }
  .px-stat__n { font-size: var(--mq-buehne-3); line-height: 1.05; font-weight: var(--mq-fett); letter-spacing: -0.01em; color: var(--px-uv-lite); line-height: 1; }
  .px-stat__l { font-size: 12px; color: var(--px-snow-mut); margin-top: var(--raum-1); max-width: 15ch; }
  .px-hero__name { display: flex; align-items: baseline; gap: var(--raum-2) var(--raum-2); flex-wrap: wrap; margin-bottom: var(--raum-3); }
  .px-badge { font-size: 10px; letter-spacing: normal; padding: var(--raum-0) var(--raum-1) var(--raum-0) var(--raum-1); color: var(--px-uv-lite); box-shadow: inset 0 0 0 1px rgba(217,134,240,0.5); align-self: center; }
  .px-hero__row { display: flex; gap: var(--raum-2); flex-wrap: wrap; align-items: center; }

  /* OBJECT */
  .px-obj { display: grid; gap: var(--px-rg); align-items: center; grid-template-columns: 1fr; }
  .px-slot--obj { aspect-ratio: 4/5; }
  .px-day .px-slot--obj { background: #ffffff; }
  .px-obj__img { width: 100%; max-width: 360px; height: auto; }

  /* MATERIAL */
  .px-macros { display: grid; grid-template-columns: repeat(2, 1fr); gap: var(--raum-0); margin-top: var(--px-r); }
  .px-macros .px-slot { aspect-ratio: 1; }

  /* SPECTRUM */
  .px-spec { position: relative; }
  .px-spec__bar { height: clamp(110px, 20cqw, 220px); background: linear-gradient(90deg, #1b1030 0%, #3d1a7a 18%, #6a1fc0 38%, var(--px-uv) 55%, #ff3df0 74%, #2b6bff 100%); }
  .px-spec__mark { position: absolute; left: 55%; top: 0; bottom: 0; width: 2px; background: #fff; box-shadow: 0 0 24px 6px rgba(255,255,255,0.5); }
  .px-spec__lab { position: absolute; left: 55%; transform: translateX(-50%); top: calc(100% + 14px); font-size: 12px; letter-spacing: normal; }
  .px-spec__scale { display: flex; justify-content: space-between; margin-top: var(--raum-5); font-size: 12px; color: var(--px-snow-mut); letter-spacing: normal; }

  /* 2000V */
  .px-ringwrap { display: grid; place-items: center; margin-top: var(--px-rg); }
  .px-ring { position: relative; width: min(70cqw, 300px); aspect-ratio: 1; }
  .px-ring__spin { position: absolute; inset: 0; border-radius: 50%;
      background: conic-gradient(from 0deg, transparent 0%, rgba(181,38,211,0.16) 40%, var(--px-uv) 72%, #fff 88%, transparent 100%);
      -webkit-mask: radial-gradient(farthest-side, transparent calc(100% - 3px), #000 calc(100% - 2px));
      mask: radial-gradient(farthest-side, transparent calc(100% - 3px), #000 calc(100% - 2px));
      animation: pxSpin 5s linear infinite; }
  @keyframes pxSpin { to { transform: rotate(360deg); } }
  .px-ring__core { position: absolute; inset: 0; display: grid; place-content: center; }
  .px-ring__v { font-size: clamp(22px, 7cqw, 22px); font-weight: var(--mq-fett); letter-spacing: normal; }
  .px-ring__v em { font-style: normal; color: var(--px-uv-lite); }

  /* SILENCE — dB meter */
  .px-db { max-width: 640px; margin: var(--px-r) auto 0; display: flex; flex-direction: column; gap: var(--raum-2); text-align: left; }
  .px-db__row { display: grid; grid-template-columns: 92px 1fr auto; align-items: center; gap: var(--raum-2); }
  .px-db__lab { font-size: 14px; color: var(--px-ink-mut); }
  .px-db__track { height: 12px; background: #eceaf0; overflow: hidden; }
  .px-db__fill { display: block; height: 100%; width: 0; background: #cfccd6; transition: width 1.1s cubic-bezier(.16,1,.3,1); }
  .px-db.in .px-db__fill { width: var(--w); }
  .px-db__val { font-weight: var(--mq-fett); font-size: 14px; font-variant-numeric: tabular-nums; }
  .px-db__row--on .px-db__lab { color: var(--px-uv); font-weight: var(--mq-fett); }
  .px-db__row--on .px-db__fill { background: linear-gradient(90deg, #7a2bff, var(--px-uv)); }
  .px-db__row--on .px-db__val { color: var(--px-uv); }

  /* DAY/NIGHT */
  .px-two { display: grid; grid-template-columns: 1fr; }
  .px-two__half { position: relative; padding: var(--px-rg) var(--px-r) var(--px-rg) var(--px-r); min-height: clamp(300px, 46cqw, 460px); display: flex; flex-direction: column; justify-content: flex-end; gap: var(--raum-2); color: var(--px-snow); overflow: hidden; }
  .px-two__scrim { position: absolute; inset: 0; background: linear-gradient(180deg, rgba(10,7,4,0.15), rgba(10,7,4,0.82)); }
  .px-two__scrim--uv { background: linear-gradient(180deg, rgba(20,6,30,0.3), rgba(6,4,10,0.86)); }
  .px-two__half > *:not(.px-two__scrim) { position: relative; z-index: 1; }
  .px-orb { width: 54px; height: 54px; border-radius: 50%; }
  .px-orb--warm { background: radial-gradient(circle at 34% 30%, #ffe6a8, #ff9d2e); box-shadow: 0 0 60px 12px rgba(255,157,46,0.5); }
  .px-orb--uv { background: radial-gradient(circle at 34% 30%, var(--px-uv-lite), var(--px-uv)); box-shadow: 0 0 60px 12px var(--px-glow); }

  /* PLACEMENT scenes */
  .px-scenes { display: grid; grid-template-columns: 1fr; gap: var(--raum-0); margin-top: var(--px-r); }
  .px-scene { position: relative; aspect-ratio: 3/4; overflow: hidden; }

  /* SPECS */
  .px-specs { display: grid; grid-template-columns: 1fr; gap: var(--px-r); }
  .px-specs__row { display: flex; justify-content: space-between; gap: var(--raum-3); padding: var(--raum-2) 0 var(--raum-2) 0; font-size: 16px; }
  .px-specs__row + .px-specs__row { box-shadow: inset 0 1px 0 rgba(18,16,22,0.09); }
  .px-specs__row dt { color: var(--px-ink-mut); }
  .px-specs__row dd { font-weight: 600; text-align: right; font-variant-numeric: tabular-nums; }

  /* Am 08.08.2026 entfernt: acht .px-anchor-Regeln und .px-note. Sie gehoerten
     zum Preisvergleich, der am 31.07.2026 aus dem Markup genommen wurde (die
     Begruendung steht oben bei Abschnitt 10). Ohne dieses Markup erzeugt keine
     der Klassen mehr ein Element. */

  /* wider columns only if the container ever grows past the checkout width */
  @container pxcol (min-width: 40em) {
    .px-two   { grid-template-columns: 1fr 1fr; }
    .px-scenes { grid-template-columns: repeat(3, 1fr); }
    .px-obj   { grid-template-columns: 1fr 1fr; }
    .px-specs { grid-template-columns: 0.8fr 1.2fr; }
    .px-db__row { grid-template-columns: 130px 1fr auto; gap: var(--raum-2); }
  }
  @container pxcol (min-width: 52em) {
    .px-macros { grid-template-columns: repeat(4, 1fr); }
    /* Die breite Stufe der beiden Story-Abstaende, siehe .px-sec. */
    .px-sec { --px-r: var(--raum-5); --px-rg: var(--raum-7); }
  }

  .reveal { opacity: 0; transform: translateY(26px); transition: opacity .9s cubic-bezier(.16,1,.3,1), transform .9s cubic-bezier(.16,1,.3,1); }
  .reveal.in { opacity: 1; transform: none; }
  @media (prefers-reduced-motion: reduce) { .reveal { opacity: 1; transform: none; } .px-hero__halo, .px-ring__spin { animation: none; } }
/* END_SNIPPET:pdp-content */