
  /* TASK-570: hier standen vier @import auf jsDelivr (@fontsource/inter
     5.0.16, Gewichte 400/600/700/800). Diese Datei wird auf JEDER Seite per
     <link> geladen -- damit ging die IP jedes Besuchers vor jeder Einwilligung
     an einen US-CDN. Inter kommt jetzt lokal von dieser Instanz; eingebunden
     genau einmal im Topic MtsThemeGlobal (head_html_tag) als
     /Modules/MoveToShop.Connector/fonts/inter.css.
     Hier bewusst KEIN Ersatz-@import: ein @import in einer per <link>
     geladenen Datei serialisiert den Ladepfad (HTML -> css -> css -> woff2)
     und war genau der Grund, warum die Schrift vorher an vier Stellen haengen
     konnte, ohne dass es jemandem auffiel. */

  :root {
    --mts-bg:#ffffff;
    --mts-bg-soft:#fafafa;
    --mts-bg-dark:#0a0a0a;
    --mts-text:#1d1d1f;
    --mts-text-muted:#6e6e73;
    --mts-line:#e5e5e7;
    /* --mts-accent stand hier als hartes `#5f8175` - die Multicycle-Markenfarbe,
       in einer Datei, die auf JEDE Instanz ausgeliefert wird. Entfernt am
       2026-08-03 (TASK-594.01 AC#5: genau eine Quelle je Variable).

       Sie hat nie getragen, das ist gemessen und nicht gefolgert. An beiden
       laufenden Instanzen mit einer Computed-Style-Sonde nachgesehen:
         store.movetoshop.de  html --mts-accent = #00787a  (theme.css `html:root`
                              0,1,1 plus der Marken-Layer im Dokument schlagen
                              dieses `:root` 0,1,0)
         mc.movetoshop.com    html --mts-accent = #5f8175  (aus theme.css, nicht
                              von hier - derselbe Wert, andere Quelle)
       Und dort, wo weder Theme noch Marken-Layer etwas sagen, gewinnt ohnehin
       `storefront.css :root { --mts-accent: var(--mts-c-primary) }`: gleiche
       Spezifitaet, aber storefront.css ist auf beiden Instanzen das ZULETZT
       geladene der beiden (Dokumentreihenfolge nachgezaehlt: theme.css ->
       mts-theme-global.css -> Marken-Layer -> storefront.css).

       Die 53 `var(--mts-accent)`-Stellen in dieser Datei bleiben damit versorgt.
       Gegenprobe, dass die Versorgung nicht an einer Seitenart haengt:
       storefront.css und mts-theme-global.css sind auf `/`, `/filialen`,
       `/cart` und `/cube` beide eingebunden. */
    --mts-accent-hover:#4d6b60;
    /* !important ist hier KEIN Spezifitaets-Trick, sondern die Absicherung
       einer Reihenfolge (TASK-577, 2026-07-27).

       `storefront.css` (Modul-wwwroot, geladen von der MtsAssets-ViewComponent)
       setzt in seinem eigenen `:root` `--mts-radius: 0.55rem`. Gleiche
       Spezifitaet - es entscheidet allein, welche Datei spaeter geladen wird.
       Bis heute gewann diese Datei, weil beide im <body> lagen und die Topics
       nach der ViewComponent kamen.

       Mit dem Umzug der Topics in die echte <head>-Zone dreht sich das um: die
       Topic-Styles stehen dann VOR storefront.css, und 29 Regeln in beiden
       Dateien haetten ploetzlich 8,8 px statt 18 px Radius bekommen - eine
       sichtbare Aenderung an fast jeder Kachel, ausgeloest von einer reinen
       Zonen-Korrektur. Gemessen am 2026-07-27 vor dem Umzug: 18 px.

       Nur DIESE eine Variable braucht den Riegel. Alle anderen Kollisionen
       zwischen den beiden Dateien sind klassen-gescopet (`.mts-page`,
       `.mts-store`) und damit ohnehin reihenfolge-unabhaengig; `--mts-accent`
       loest beidseitig auf #5f8175 auf.

       Sauber waere, auch storefront.css in den <head> zu heben - das braucht
       einen Modul-Rebuild (Zone steht in Module.cs). Bis dahin steht hier
       ausdruecklich, was vorher nur zufaellig galt. */
    --mts-radius:18px !important;
    --mts-radius-lg:24px;
    --mts-shadow:0 30px 60px -15px rgba(0,0,0,0.18);
    --mts-shadow-soft:0 12px 30px rgba(0,0,0,0.06);
    --mts-font:'Inter', -apple-system, BlinkMacSystemFont, 'SF Pro Text', system-ui, 'Segoe UI', Roboto, sans-serif;
    --mts-font-display:'Inter', -apple-system, BlinkMacSystemFont, 'SF Pro Display', system-ui, sans-serif;
  }

  body, html { font-family: var(--mts-font) !important; color: var(--mts-text); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; background: #fff !important; }
  h1, h2, h3, h4, h5, .heading-title, .pd-name, .cat-page-title, .page-title { font-family: var(--mts-font-display) !important; letter-spacing: -0.02em; font-weight: 700; }

  /* ===== CONTAINER ===== */
  .container, .megamenu-container, .footer-main, .footer-bottom, .footer-social { max-width: 1680px !important; padding-left: 32px !important; padding-right: 32px !important; }
  @media (max-width: 700px) { .container, .megamenu-container, .footer-main, .footer-bottom, .footer-social { padding-left: 20px !important; padding-right: 20px !important; } }

  /* ===== HEADER — kompakter, solid weiß ===== */
  /* z-index 1050: Bootstrap-Modal-Backdrop = 1040, Smartstore .artlist .art Hover = no
     explicit z-index aber via transform neuer Stacking-Context. Header MUSS drueber
     bleiben — daher 1050. Offcanvas (z-index 9999) und PD-Modal (9998) bleiben oben. */
  /* TASK-442 Iter 4: border-bottom entfernt (User: Trennlinie unter dem Header
     auf ALLEN Seiten weg); der Scroll-Shadow uebernimmt die Abgrenzung. */
  header#header { background: #ffffff !important; border-bottom: 0; position: sticky; top: 0; z-index: 1050 !important; transition: box-shadow 0.3s ease; isolation: isolate; }
  /* Kompletten Header inkl. aller Sub-Sektionen aus dem Stacking-Context der Karten heben.
     z-index pro Section GESTAFFELT (3/2/1), damit Bootstrap-Dropdowns aus der menubar
     (oben: Service/Kontakt/Anmelden) die nachfolgenden Sections shopbar/megamenu nicht
     visuell verdeckt bekommen. Vorher: alle drei = 1 → Source-Order entscheidet, und
     shopbar (DOM-Index 1) + megamenu (DOM-Index 2) lagen über menubar-Dropdowns.
     .megamenu-dropdown-container (Sibling unter header, z-index 1040) bleibt unberührt
     über allem. */
  header#header .menubar-section { position: relative; z-index: 3; }
  header#header .shopbar-section { position: relative; z-index: 2; }
  header#header .megamenu-section { position: relative; z-index: 1; }
  /* Listing-/Carousel-Karten erzeugen via transform/will-change einen Stacking-Context.
     Wir lassen ihn bestehen (fuer Hover-Lift), zwingen aber via z-index niedriger als Header. */
  .mts-store .mts-pcard,
  .mts-store .mts-tile,
  .mts-store .mts-mtile,
  .artlist .art,
  .product-card { z-index: 0 !important; }
  .mts-store .mts-pcard:hover,
  .mts-store .mts-tile:hover,
  .mts-store .mts-mtile:hover,
  .artlist .art:hover { z-index: 1 !important; }
  header#header.is-scrolled { box-shadow: 0 4px 20px rgba(0,0,0,0.06); }
  /* ALLE Header-Sub-Sections explizit weiß — Smartstore-Default ist .navbar-light grau (#f7f7f9) */
  header#header,
  header#header .navbar,
  header#header .navbar-light,
  header#header .megamenu-section,
  header#header .megamenu-section .navbar,
  header#header .megamenu-section .navbar-light,
  header#header .menubar-section,
  header#header .menubar-light,
  header#header .shopbar-section,
  header#header .shopbar { background-color: #ffffff !important; }
  /* Top-bar (KONTAKT/SERVICE/ANMELDEN) */
  header#header .menubar-section, header#header .menubar-light { background: #ffffff !important; border: 0 !important; padding: 1px 0 !important; min-height: 0 !important; }
  header#header .menubar { padding: 0 !important; min-height: 0 !important; }
  .menubar-link { color: var(--mts-text) !important; font-weight: 500 !important; font-size: 12px !important; padding: 4px 10px !important; border-radius: 999px; line-height: 1.2; }
  /* Marke als Text auf weißer Menubar -> Textton statt Flächenton.
     Die Kette fällt bewusst auf --mts-accent zurück: --mts-accent-text ist nur
     unter data-mts-brand="multicycle" definiert, das Theme der Demo kennt es
     nicht (nachgemessen an theme.css: nur --mts-accent + --mts-accent-hover).
     Ohne den zweiten Schritt wäre die Regel dort ungültig und der Hover-Akzent
     stillschweigend weg. Gilt für alle Textton-Umstellungen in dieser Datei. */
  .menubar-link:hover { color: var(--mts-accent-text, var(--mts-accent)) !important; background: transparent !important; }
  /* Shopbar (Logo + Search + Cart). border-bottom: Theme-Default 1px war die
     "graue Trennlinie unter dem Header" (TASK-442 Iter 4, alle Seiten). */
  header#header .shopbar-section { padding: 1px 0 2px !important; min-height: 0 !important; border-bottom: 0 !important; }
  header#header .shopbar { padding: 0 !important; min-height: 0 !important; background: transparent !important; }
  header#header .shopbar-container { padding-top: 0 !important; padding-bottom: 0 !important; }
  /* Logo: maximal 56px hoch, contain — verhindert dass quadratische User-Logos die Headerleiste sprengen */
  header#header .shop-logo a.brand,
  header#header .shop-logo .brand { display: inline-flex; align-items: center; }
  header#header .shop-logo img,
  header#header .shopbar img.img-fluid {
    max-height: 56px !important;
    width: auto !important;
    height: auto !important;
    max-width: 220px !important;
    object-fit: contain !important;
  }
  /* Megamenu (Bikes, Cube, ...) — kompakt + horizontal zentriert.
     Iter 18 Bugfix: Dropdown-Position folgte dem zentrierten <li> nicht.
     Ursache: smartstore.megamenu.js -> alignDrop() rechnet
       left = popper.position().left + parseInt(nav.css('margin-inline-start'))
     Mit `margin: 0 auto` auf ul#menu-main blieb margin-inline-start im
     computed style "auto" -> parseInt('auto') = NaN -> NaNpx wird vom
     Browser ignoriert -> Dropdown bleibt auf alter Inline-left-Position.
     Fix: margin auf 0 setzen, Zentrierung ueber justify-content im
     Flex-Container (.megamenu / .cms-menu) erledigen. */
  header#header .megamenu-section { padding: 0 !important; min-height: 0 !important; }
  header#header .megamenu-section .navbar { padding: 0 !important; min-height: 0 !important; height: auto !important; }
  header#header .megamenu-section .megamenu-container { min-height: 0 !important; height: auto !important; display: flex !important; justify-content: center !important; }
  header#header .megamenu-section .megamenu { width: 100% !important; max-width: 100% !important; display: flex !important; justify-content: center !important; }
  header#header .megamenu-section .cms-menu,
  header#header .megamenu-section .cms-menu-navbar {
    padding: 0 !important; margin: 0 !important;
    display: flex !important; justify-content: center !important;
    width: 100% !important;
  }
  /* ul#menu-main: KEIN margin:auto (das brach alignDrop), Zentrierung
     erledigt der .cms-menu Flex-Container darueber.
     position:static ist KRITISCH: Smartstore alignDrop() rechnet
     `popper.position().left` (= LI relativ zum naechsten positionierten
     Vorfahren). Wenn das <ul> position:relative ist, liefert das nur den
     Offset des LI INNERHALB des UL — unsere Flex-Zentrierung des UL geht
     dabei verloren. Mit position:static wandert die Bezugsbasis hoch zu
     .megamenu (position:relative) und das LI-Offset enthaelt die Zentrierung. */
  header#header .megamenu-section ul.navbar-nav#menu-main,
  header#header .megamenu-section .navbar-nav,
  header#header .megamenu-section .nav-slider {
    margin: 0 !important;
    justify-content: center !important;
    flex-wrap: wrap !important;
    position: static !important;
  }
  header#header .megamenu-section .nav-link { padding: 10px 14px !important; }
  /* Slider-Navigation-Pfeile (megamenu-nav-btn) sollen Menue-Zentrierung nicht stoeren */
  header#header .megamenu-section .megamenu-nav { position: absolute !important; top: 0 !important; }
  header#header .megamenu-section .megamenu-nav.alpha { left: 0 !important; }
  header#header .megamenu-section .megamenu-nav.omega { right: 0 !important; }
  header#header .megamenu-section .megamenu { position: relative !important; }
  /* Default-rendered Dropdown-Container darunter ist leer + 48px tall — collapse,
     ABER: nur solange KEIN inneres .dropdown-menu offen (.show) ist. Smartstore
     setzt .show auf das innere <div id="dropdown-menu-XXX">, NICHT auf den
     .megamenu-dropdown-container selbst (Iter 17 hatte das vertauscht ->
     Dropdowns oeffneten gar nicht mehr).

     Iter 19 Bugfix: Header-Bar wuchs beim Oeffnen eines Dropdowns mit.
     Ursache: .megamenu-dropdown-container ist Schwester-Element (NICHT Kind)
     von .megamenu-section und liegt im normalen Flow des Header-Wrappers.
     Iter-18-CSS schaltete height von 0 auf auto im show-Zustand -> Header
     bekam zusaetzliche Pixel.
     Fix: Container aus dem Flow nehmen (position:absolute, oben am Header
     verankert via top:100%). Naechster positionierter Vorfahre ist
     header#header (position:sticky etabliert containing block).
     Im geschlossenen Zustand zusaetzlich pointer-events:none, damit der
     unsichtbare Container keine Hover-Targets im Viewport blockiert. */
  header#header .megamenu-dropdown-container {
    padding: 0 !important;
    min-height: 0 !important;
    height: 0 !important;
    overflow: hidden !important;
    border: 0 !important;
    box-shadow: none !important;
    position: absolute !important;
    top: 100% !important;
    left: 0 !important;
    right: 0 !important;
    width: 100% !important;
    z-index: 1040 !important;
    pointer-events: none !important;
  }
  header#header .megamenu-dropdown-container:has(> div.show),
  header#header .megamenu-dropdown-container:has(.dropdown-menu.show),
  header#header .megamenu-dropdown-container.show,
  header#header .megamenu-dropdown-container.in,
  header#header .megamenu-dropdown-container[aria-expanded='true'] {
    height: auto !important; overflow: visible !important;
    padding: 24px !important; background: #fff !important;
    box-shadow: 0 30px 60px -15px rgba(0,0,0,0.18) !important;
    border-radius: var(--mts-radius) !important;
    pointer-events: auto !important;
  }
  /* Header-Wrapper darf das absolut positionierte Dropdown nicht clippen */
  header#header { overflow: visible !important; }
  header#header .megamenu-section { overflow: visible !important; }

  /* ===== SALE!-Menueintrag rot (Iter 19) ===== */
  /* Robuster Selektor: stabile URL /sale-/ statt Text-Match.
     Underline-/Active-States des Standardmenues bleiben erhalten,
     nur Farbe + Background-on-hover werden roetlich ueberschrieben. */
  header#header ul#menu-main a.nav-link[href*="/sale-" i],
  header#header ul#menu-main a.nav-link[href*="/sale-" i] > span {
    color: #ff3b30 !important;
    font-weight: 700 !important;
  }
  header#header ul#menu-main a.nav-link[href*="/sale-" i]:hover,
  header#header ul#menu-main a.nav-link[href*="/sale-" i]:focus {
    color: #d70015 !important;
    background: rgba(255, 59, 48, 0.08) !important;
  }
  header#header ul#menu-main a.nav-link[href*="/sale-" i]:hover > span,
  header#header ul#menu-main a.nav-link[href*="/sale-" i]:focus > span {
    color: #d70015 !important;
  }
  /* Search field: Lupe sitzt rechts; Padding genug vorhalten */
  .instasearch-form { background: var(--mts-bg-soft) !important; border-radius: 999px !important; border: 0 !important; box-shadow: none !important; position: relative; overflow: hidden; }
  .instasearch-form:focus-within { background: #fff !important; box-shadow: 0 0 0 2px var(--mts-accent) !important; }
  .instasearch-form .instasearch-term, .instasearch-term.form-control { border: 0 !important; background: transparent !important; font-size: 14px !important; padding: 11px 48px 11px 18px !important; box-shadow: none !important; }
  .instasearch-icon, .input-group-icon.instasearch-icon, .instasearch-addon { position: absolute !important; right: 8px !important; top: 50%; transform: translateY(-50%); color: var(--mts-text-muted) !important; background: transparent !important; left: auto !important; padding: 0 !important; pointer-events: none; }
  .instasearch-submit, button.instasearch-submit {
    position: absolute !important;
    right: 0 !important; top: 0 !important; bottom: 0 !important; left: auto !important;
    width: 44px !important;
    height: 100% !important;          /* Smartstore-Default 20px ueberschreiben */
    min-height: 100% !important;
    padding: 0 !important; margin: 0 !important;
    background: transparent !important;
    border: 0 !important;
    display: flex !important;
    align-items: center !important;
    justify-content: center !important;
  }
  .instasearch-submit i, .instasearch-submit svg { font-size: 16px !important; color: var(--mts-text-muted) !important; }
  .shopbar-icon, .menubar-icon { color: var(--mts-text) !important; transition: color 0.18s ease, transform 0.18s ease; }
  .shopbar-icon:hover { color: var(--mts-accent) !important; transform: translateY(-1px); }
  .badge.cart-badge, .badge.wishlist-badge { background: var(--mts-accent) !important; color: #fff !important; font-weight: 600 !important; }

  /* Megamenu */
  .megamenu .nav-link, .megamenu .nav-item > a { font-weight: 500 !important; color: var(--mts-text) !important; padding: 10px 16px !important; border-radius: 999px !important; }
  /* Nav-Label auf hellem Hover-Grund -> Textton (Kette wie oben). */
  .megamenu .nav-link:hover, .megamenu .nav-item > a:hover { background: var(--mts-bg-soft) !important; color: var(--mts-accent-text, var(--mts-accent)) !important; }
  .megamenu-dropdown-container { border: 0 !important; box-shadow: 0 30px 60px -15px rgba(0,0,0,0.18) !important; border-radius: var(--mts-radius) !important; padding: 24px !important; }

  /* ===== FOOTER ===== */
  footer#footer { background: var(--mts-bg-dark) !important; color: rgba(255,255,255,0.75) !important; padding: 80px 0 40px !important; margin-top: 80px; }
  /* iPad-Round-2 P9: Auf der Homepage endet der Content mit einer DUNKLEN
     Sektion (CTA). Der 80px-margin-top des Footers belichtete dort den weissen
     Page-Bg -> sichtbarer weisser Spalt zwischen CTA und Footer. Auf body.home
     den Margin entfernen -> dunkle CTA flieesst nahtlos in den dunklen Footer.
     Andere Seiten (Kategorie/PDP/Cart enden hell) behalten den 80px-Abstand. */
  body.home footer#footer,
  body:has(.home-page) footer#footer {
    margin-top: 0 !important;
  }
  footer#footer * { color: rgba(255,255,255,0.75); }
  footer#footer h1, footer#footer h2, footer#footer h3, footer#footer h4, footer#footer h5 { color: #fff !important; font-weight: 600 !important; margin-bottom: 18px !important; }
  footer#footer a { color: rgba(255,255,255,0.75) !important; }
  footer#footer a:hover { color: #fff !important; text-decoration: none !important; }
  /* Newsletter form on dark footer — sauberer Pill-Container (kein .shadow-xs Halo, kein weißer Addon-Bg) */
  footer#footer .footer-newsletter .input-group {
    background: rgba(255,255,255,0.08) !important;
    border: 1px solid rgba(255,255,255,0.16) !important;
    border-radius: 999px !important;
    box-shadow: none !important;
    padding: 4px !important;
    align-items: stretch !important;
    overflow: hidden;
    flex-wrap: nowrap !important;
    position: relative;
  }
  footer#footer .footer-newsletter .input-group .form-control,
  footer#footer .footer-newsletter input[type='email'],
  footer#footer .footer-newsletter input.rounded-start-pill {
    background: transparent !important;
    color: #fff !important;
    border: 0 !important;
    border-radius: 0 !important;
    padding: 12px 14px 12px 44px !important;
    box-shadow: none !important;
    flex: 1 1 auto !important;
    min-width: 0 !important;
  }
  footer#footer .footer-newsletter input::placeholder { color: rgba(255,255,255,0.55) !important; }
  /* Envelope-Icon links statt rechts ueber dem Text */
  footer#footer .footer-newsletter .input-group-icon {
    position: absolute !important;
    left: 18px !important; right: auto !important;
    top: 50% !important;
    transform: translateY(-50%) !important;
    color: rgba(255,255,255,0.5) !important;
    background: transparent !important;
    padding: 0 !important;
    margin: 0 !important;
    width: auto !important;
    height: auto !important;
    z-index: 2;
    pointer-events: none;
    --inline-icon-offset: 0 !important;
  }
  /* Addon-Wrapper transparent (war weiß und erzeugte den Halo um den orangenen Button) */
  footer#footer .footer-newsletter .input-group-append,
  footer#footer .footer-newsletter .input-group-inline-addon {
    background: transparent !important;
    border: 0 !important;
    padding: 0 !important;
    margin: 0 !important;
    border-radius: 0 !important;
    display: flex !important;
    align-items: stretch !important;
  }
  /* Newsletter submit button — orange, fluid pill am rechten Rand des Pills */
  footer#footer #newsletter-subscribe-button,
  footer#footer .footer-newsletter button[type='submit'],
  footer#footer .footer-newsletter .btn,
  footer#footer .btn-primary {
    background: var(--mts-accent) !important;
    border: 0 !important;
    color: #fff !important;
    border-radius: 999px !important;
    font-weight: 600 !important;
    padding: 10px 24px !important;
    margin: 0 !important;
    box-shadow: none !important;
    line-height: 1.3 !important;
  }
  footer#footer #newsletter-subscribe-button:hover,
  footer#footer .footer-newsletter .btn:hover,
  footer#footer .btn-primary:hover { background: var(--mts-accent-hover) !important; transform: none !important; }
  /* Subscribe-only — Abbestellen-Radio + komplette „Aktion wählen" fieldset weg */
  footer#footer .footer-newsletter fieldset,
  footer#footer .footer-newsletter fieldset.mb-2 { display: none !important; }
  /* GDPR-Checkbox-Block bleibt sichtbar (war via fieldset hidden? nein, ist ausserhalb) */
  footer#footer .footer-newsletter .form-group.gdpr-consent { margin-top: 14px !important; }
  .footer-social .btn { background: rgba(255,255,255,0.08) !important; color: #fff !important; border: 0 !important; width: 44px !important; height: 44px !important; margin: 0 6px !important; display:inline-flex !important; align-items:center !important; justify-content:center !important; transition: all 0.2s cubic-bezier(.22,.61,.36,1) !important; }
  .footer-social .btn i, .footer-social .btn svg { color: #fff !important; font-size: 16px !important; line-height: 1 !important; }
  .footer-social .btn:hover { background: var(--mts-accent) !important; color: #fff !important; transform: translateY(-2px); }
  .footer-social-wrapper { padding: 24px 0 !important; border-top: 1px solid rgba(255,255,255,0.08) !important; margin-top: 24px !important; }
  .footer-bottom { border-top: 1px solid rgba(255,255,255,0.08) !important; padding-top: 32px !important; margin-top: 40px !important; }

  /* ===== BUTTONS ===== */
/* Die rgba-Schreibweise 95,129,117 war #5f8175 fest verdrahtet - dieselbe
   Marke, nur in anderer Notation, in einer Datei die auch die Bidex-Demo
   bekommt (dort stand damit ein grüner Schimmer neben einem türkisen
   Rand). Bewusst NICHT var(--mts-accent): das ist deckend, hier braucht es
   die Deckkraft. --mts-c-primary-rgb trägt beide Instanzen. 2026-08-15 */
  .btn-primary, .btn.btn-primary, button.btn-primary {
    background: var(--mts-accent) !important; border-color: var(--mts-accent) !important; color: #fff !important;
    border-radius: 999px !important; font-weight: 600 !important; padding: 12px 28px !important;
    box-shadow: 0 8px 20px rgba(var(--mts-c-primary-rgb),0.3); transition: all 0.18s cubic-bezier(.22,.61,.36,1);
  }
  .btn-primary:hover, .btn.btn-primary:hover, button.btn-primary:hover {
    background: var(--mts-accent-hover) !important; border-color: var(--mts-accent-hover) !important; transform: translateY(-2px); box-shadow: 0 12px 26px rgba(var(--mts-c-primary-rgb),0.4);
  }
  .btn-secondary, .btn.btn-secondary, button.btn-secondary { background: var(--mts-text) !important; border-color: var(--mts-text) !important; color: #fff !important; border-radius: 999px !important; font-weight: 600 !important; padding: 12px 28px !important; }
  .btn-secondary:hover { background: #000 !important; transform: translateY(-2px); }
  .btn-outline-primary { border-radius: 999px !important; font-weight: 600 !important; }

  /* Icon-Buttons vom Text-Button-Padding ausnehmen (2026-07-29).

     Die drei Regeln darueber setzen `padding: 12px 28px !important` fuer JEDEN
     `.btn-primary`/`.btn-secondary`. Ein `.btn-icon` ist aber kein Textbutton:
     der Core gibt ihm `padding: 0` und eine feste Kantenlaenge
     (`width/height/min-width: var(--btn-height)`). Unser `!important` schlaegt
     dieses nicht-wichtige `padding: 0` aus — und weil `box-sizing: border-box`
     gilt, sprengt das Padding die feste Kantenlaenge: der Rahmen waechst auf
     die Padding-Summe, der Inhaltskasten schrumpft auf 0.

     GEMESSEN (Sonde im echten Live-DOM, 2026-07-29):
       .btn-custom-range (Preisfilter "uebernehmen", Listing + Suche)
           vorher  58 x 42 px   statt 36 x 36 — ein gestrecktes Pill dort, wo
                               storefront.css ausdruecklich einen runden Button
                               wollte (`.facet-range-container .btn`, Radius 9999px)
           nachher 36 x 36 px
       .btn-edit-story (PageBuilder-Zahnrad, siehe naechster Block)
           vorher  58 x 48 px, nachher 48 x 48 px

     Nur `padding` wird zurueckgesetzt, bewusst NICHT width/height: Buttons, die
     ihre Groesse selbst setzen, sollen sie behalten. Wer abweichendes Padding
     braucht, setzt es weiterhin spezifischer — z. B. der Papierkorb im
     Warenkorb (`storefront.css`, `body.shopping-cart-page .cart-item-actions
     .btn.btn-secondary.btn-icon`, Spezifitaet (0,4,1) schlaegt die (0,2,0) hier).
     Gegengeprueft auf Home/Kategorie/Suche/Warenkorb: sonst traegt kein
     `.btn-icon` gleichzeitig `.btn-primary`/`.btn-secondary`. */
  .btn.btn-icon, button.btn.btn-icon { padding: 0 !important; }

  /* PageBuilder-Edit-Button (das Zahnrad auf der Buehne, nur fuer angemeldete
     Redakteure sichtbar) — Icon zurueck in die Mitte.

     Markup (Smartstore.PageBuilder, Views/Shared/Components/Story/Default.cshtml):
       a.btn.btn-lg.btn-icon.btn-primary.btn-no-border.rounded-0.btn-edit-story > i.far.fa-cog

     Das Padding erledigt die Regel darueber. Hier bleiben die zwei Punkte, die
     nur diesen Button betreffen:

     1) FORM. `.btn-primary` setzt `border-radius: 999px !important` (0,2,0) und
        schlaegt damit das `.rounded-0` (0,1,0) aus dem Core-Markup. Statt den
        quadratischen Tab zurueckzuholen, bleibt der Button hier bewusst rund —
        das passt zum uebrigen Storefront und zum zweiten schwebenden Knopf
        unten rechts.

     2) ZENTRIERUNG. Der Core blendet den Button per `.g-stage:hover &` mit
        `display: block` ein. Damit ist die Flex-Zentrierung von `.btn-icon`
        wirkungslos und `text-align` ist die EINZIGE horizontale Zentrierung.
        `align-items`/`justify-content` stehen trotzdem mit drin, damit die
        Regel auch dann noch stimmt, wenn der Core auf Flex umstellt.
        `display` wird bewusst NICHT gesetzt: `.btn-edit-story` ist per Default
        `display: none`; ein `display`-Wert hier wuerde das Zahnrad dauerhaft
        einblenden statt nur beim Hover ueber die Buehne.

     GEMESSEN (2026-07-29, Versatz am gerenderten Pixel bestimmt, nicht am
     Element-Rechteck — die Glyphe sitzt im Inline-Kasten nicht mittig, eine
     DOM-Messung haette hier gelogen):
       vorher : Zahnrad dx=+12,5 px / dy=+12,0 px, haengt unten rechts heraus
       nachher: dx=+0,5 px / dy=+1,5 px (Rest = Glyphenmetrik der fa-cog,
                unterhalb der Wahrnehmungsschwelle) */
  .btn.btn-edit-story {
    text-align: center !important;
    align-items: center !important;
    justify-content: center !important;
    border-radius: 50% !important;
    /* Statt des gruenen Halos aus der .btn-primary-Regel: neutraler Schatten.
       Der Button liegt auf dem Hero-Foto, gruen auf gruen verwischt dort. */
    box-shadow: 0 4px 14px rgba(0, 0, 0, 0.22) !important;
  }

  /* ===== LISTING (`.art`) — Category, Search, Recently-Viewed: gleiches Look-and-Feel
     wie die Home-Carousel-Karten (.mts-pcard). Reines Weiss, links-buendig,
     Bild GANZ sichtbar (contain), Buttons IMMER unten am Karten-Fuss sichtbar. ===== */
  .artlist { gap: 24px !important; align-items: stretch !important; }
  .artlist-grid .art, .artlist .art {
    background: #fff !important;
    border: 0 !important;
    border-bottom: 0 !important;
    border-radius: var(--mts-radius) !important;
    overflow: visible !important;            /* art-drop nicht mehr clippen — Buttons sichtbar */
    box-shadow: var(--mts-shadow-soft) !important;
    transition: transform 0.3s cubic-bezier(.22,.61,.36,1), box-shadow 0.3s ease !important;
    padding: 0 !important;
    text-align: left !important;
    display: flex !important;
    flex-direction: column !important;
    position: relative;
    height: auto !important;
    /* WICHTIG: Smartstore-Default `.artlist-4-cols .art { width: 25% }` ueberschreiben.
       Ohne diesen Override schrumpft die Karte auf 25% der Grid-Zelle (~81px) zusammen. */
    width: 100% !important;
    max-width: 100% !important;
    flex: 1 1 auto !important;
  }
  .artlist .art:hover { transform: translateY(-6px); box-shadow: var(--mts-shadow) !important; }

  /* Bild-Container: 4:3 (Bikes sind landscape), reines Weiss — KEIN Grau mehr.
     flex-shrink:0 damit der Container in flex-Eltern (Slick-Carousel) nicht
     zusammenklappt; aspect-ratio allein reichte da nicht. */
  .art-picture-block, .art .art-picture-block {
    background: #ffffff !important;
    border: 0 !important;
    aspect-ratio: 4/3 !important;
    padding: 0 !important;
    margin: 0 !important;
    display: block !important;
    border-radius: var(--mts-radius) var(--mts-radius) 0 0;
    overflow: hidden;
    position: relative !important;
    width: 100% !important;
    flex: 0 0 auto !important;
    flex-shrink: 0 !important;
  }
  /* Inner anchor (.art-picture) — Smartstore-Default setzt `height: 0` (aspect-ratio
     ueber padding-bottom%-Trick). Das ueberschreiben wir mit explizitem 100% damit
     das absolute Layer wirklich die Picture-Block-Hoehe (244px @ 4:3) ausfuellt. */
  .art-picture-block .art-picture, .art-picture-block > a, .art-picture.img-center-container {
    position: absolute !important;
    top: 0 !important;
    left: 0 !important;
    right: 0 !important;
    bottom: 0 !important;
    width: 100% !important;
    height: 100% !important;
    display: block !important;
    background: transparent !important;
    border: 0 !important;
    aspect-ratio: auto !important;
    padding: 0 !important;
    margin: 0 !important;
  }
  /* Bild GANZ sichtbar — fixe Kanten via absolute inset:0, contain, nie cropped.
     `width:auto/height:auto` kollabiert in flex-Eltern auf 0px (Browser-Quirk),
     daher hier explizit width:100%/height:100% mit object-fit:contain. */
  /* SCOPE: nur Listing-Cards (.art), NIEMALS img.file-img global. Sonst wird
     u. a. .pd-brand-picture.file-img (PDP-Brand-Logo) absolut positioniert
     und kollidiert mit dem Titel. */
  .art-picture img, .art-picture .file-img, .art-picture-block img, .art img.file-img {
    position: absolute !important;
    inset: 0 !important;
    width: 100% !important;
    height: 100% !important;
    max-width: 100% !important;
    max-height: 100% !important;
    object-fit: contain !important;
    object-position: center !important;
    padding: 14px 18px !important;
    box-sizing: border-box !important;
    transition: transform 0.5s cubic-bezier(.22,.61,.36,1);
  }
  /* Defensive: PDP-Brand-Picture darf NIE absolute sein, immer inline */
  .pd-brand-picture, .pd-brand-block img, .pd-info .pd-brand img {
    position: static !important;
    inset: auto !important;
    padding: 0 !important;
  }
  .artlist .art:hover .art-picture img { transform: scale(1.04); }

  /* Brand-Logo (Cube etc.) — links-buendig, schoen platziert ueber dem Titel */
  .art-brand, .art-vendor, .pd-brand, .pd-brand-name {
    font-size: 11px !important;
    letter-spacing: 0.12em !important;
    text-transform: uppercase !important;
    color: var(--mts-text-muted) !important;
    font-weight: 500 !important;
    padding: 14px 18px 0 !important;
    text-align: left !important;
    margin: 0 !important;
    display: block;
  }
  .art-brand img.mts-brand-img, .art-vendor img.mts-brand-img, .pd-brand img.mts-brand-img {
    height: 24px !important; width: auto !important; max-width: 100px;
    object-fit: contain; display: inline-block; vertical-align: middle;
  }
  /* PD-Brand-Picture (Manufacturer-Logo auf der Produktdetailseite) — gut sichtbar */
  .pd-brand-picture, .pd-brand img, .pd-brand-block img,
  .product-page .pd-brand img, .product-page [class*="brand"] img {
    max-height: 64px !important;
    max-width: 200px !important;
    width: auto !important;
    height: auto !important;
    object-fit: contain !important;
    display: inline-block !important;
    vertical-align: middle !important;
  }
  .pd-brand-block, .pd-brand {
    display: inline-flex !important;
    align-items: center;
    margin-bottom: 16px;
  }

  /* Titel — IMMER links-buendig, voller Name sichtbar, kein Truncate */
  .art-genericname, .art-name {
    margin: 0 !important; padding: 0 !important;
    font-family: var(--mts-font-display) !important;
    text-align: left !important;
    min-height: auto !important;
  }
  .art-name-link, .art-name a {
    display: block !important;
    padding: 6px 18px 4px !important;
    text-align: left !important;
    font-weight: 600 !important;
    color: var(--mts-text) !important;
    font-size: 1rem !important;
    line-height: 1.35 !important;
    overflow: visible !important;          /* Smartstore-Default clippt 2. Zeile -> aufheben */
    max-height: none !important;
    height: auto !important;
    -webkit-line-clamp: unset !important;
    text-overflow: clip !important;
    white-space: normal !important;
  }
  .art-name-link span, .art-name span, .art-genericname span {
    text-align: left !important;
    display: block;
    overflow: visible;
    text-overflow: clip;
    white-space: normal;
  }

  .art-info, .art-meta, .art-brand-block { padding: 0 18px !important; text-align: left !important; }

  .art-delivery-info {
    font-size: 12px !important; color: var(--mts-text-muted) !important;
    padding: 0 18px !important; margin: 0 0 4px !important;
    text-align: left !important;
  }

  /* Preis — links-buendig mit feinem Trenner darueber.
     Iter 9 Phase B: `margin-top:auto` damit der Preis IMMER auf Card-Bottom
     sitzt — egal ob Single-Size-Badge / Specs-Tags vorhanden sind oder nicht.
     Sicherstellt gleiche Preis-Y-Position in einer Reihe. */
  .art-price-block {
    font-family: var(--mts-font-display) !important;
    padding: 10px 18px 14px !important;
    text-align: left !important;
    margin: 8px 0 0 !important;
    margin-top: auto !important;
    /* Iter 12 Phase A: trennlinie zwischen specs/single-size und preis WEG.
       Nur Whitespace trennt. */
    border-top: 0 !important;
  }
  /* Card-Body (Smartstore: .art-data-block enthaelt info + actions) muss
     ebenfalls als flex-column wachsen damit margin-top:auto greift. */
  .artlist .art .art-data-block {
    display: flex !important;
    flex-direction: column !important;
    flex: 1 1 auto !important;
    min-height: 0 !important;
  }
  .artlist .art .art-actions-block {
    margin-top: auto !important;
  }
  .art-price-block .art-price, .art-finalprice, .art-price-value, .price {
    font-family: var(--mts-font-display) !important;
    font-weight: 700 !important;
    color: var(--mts-text) !important;
    font-size: 1.3rem !important;
    letter-spacing: -0.01em;
    text-align: left !important;
    display: block;
  }
  /* Iter 14 Phase C: Grid (NICHT Lines) -> Preis-Block + Rating + Steuer-Hinweis
     ZENTRIERT (User: "ich will bei raster ansicht das dass zentriert noch ist
     ab 3.899,00 €"). Nur fuer Grid-Layout, Lines hat eigene right-aligned-Regel. */
  .artlist:not(.artlist-lines) .art .art-price-block,
  .artlist:not(.artlist-lines) .art .art-price,
  .artlist:not(.artlist-lines) .art .art-finalprice,
  .artlist:not(.artlist-lines) .art .art-price-value,
  .artlist:not(.artlist-lines) .art .art-old-price,
  .artlist:not(.artlist-lines) .art .art-baseprice,
  .artlist:not(.artlist-lines) .art .art-legalinfo,
  .artlist:not(.artlist-lines) .art .art-rating-block,
  .artlist:not(.artlist-lines) .art .art-rating,
  .artlist:not(.artlist-lines) .art .product-rating {
    text-align: center !important;
    justify-content: center !important;
  }
  .artlist:not(.artlist-lines) .art .art-rating-block,
  .artlist:not(.artlist-lines) .art .art-rating {
    display: flex !important;
    align-items: center !important;
  }
  .art-old-price, .price-old, .art-baseprice, s, del {
    color: var(--mts-text-muted) !important;
    text-decoration: line-through;
    font-weight: 500 !important;
    font-size: 0.9rem !important;
  }

  /* CRITICAL: art-drop IMMER sichtbar — kein hover-overlay, fester Footer der Karte.
     Smartstore-Default setzt `z-index: -1` (Drop-Layer hinter der Karte), das
     ueberschreiben wir auf z-index:1 damit die Buttons klickbar bleiben. */
  .art-drop {
    position: static !important;
    visibility: visible !important;
    opacity: 1 !important;
    display: block !important;
    padding: 0 18px 18px !important;
    margin: 0 !important;
    background: transparent !important;
    border: 0 !important;
    box-shadow: none !important;
    transform: none !important;
    top: auto !important; left: auto !important; right: auto !important; bottom: auto !important;
    height: auto !important;
    width: 100% !important;
    pointer-events: auto !important;
    z-index: 1 !important;
  }
  /* iPad-Round-2 P10: Karten-Compare-Button (nativ + injiziert) entfernt.
     Button-Grid daher 3 Spalten (Cart + Wunschliste + Beschreibung) statt 4
     -> keine Luecke. Der native Compare-Button ist via display:none raus
     (Regel unten), das Grid zaehlt ihn dann nicht mehr als Spalte. */
  /* C2: Smartstore-Flex Grid-Divider (--art-divider-color #dee2e6) neutralisieren
     -> keine graue Trennlinie zwischen Produkt-Reihen. Nur Grid, Lines bleibt. */
  .artlist:not(.artlist-lines), .artlist-grid {
    --art-divider-color: transparent !important;
  }
  .artlist-grid > .art,
  .category-page .artlist .art,
  .product-list .artlist .art {
    border-bottom: 0 !important;
    border-bottom-color: transparent !important;
  }
  .art-drop .art-btn-group, .art-drop .row.no-gutters {
    display: grid !important;
    grid-template-columns: 1fr 44px;
    gap: 6px !important;
    margin: 0 !important;
    width: 100% !important;
  }
  /* P10: nativen Smartstore-Karten-Compare-Button ("Vergleichen") aus dem
     Button-Grid nehmen (Desktop + alle Breakpoints). PDP-Compare bleibt. */
  .art-drop .art-btn-group .add-to-compare-list-button,
  .art-drop .row.no-gutters .add-to-compare-list-button,
  .artlist .art .add-to-compare-list-button {
    display: none !important;
  }
  /* C5: grauen Info-/Beschreibung-Button (fa-info, a.product-details-button)
     aus der Karte nehmen. Cart-Button spannt dann 1fr (freie Spalte). */
  .art-drop .art-btn-group .product-details-button,
  .art-drop .row.no-gutters .product-details-button,
  .artlist .art .product-details-button {
    display: none !important;
  }
  /* Compare-Restore (a2): Overlay-Card-Compare wieder sichtbar (Hide entfernt);
     nativer Smartstore-Card-Compare (.add-to-compare-list-button) bleibt aus. */
  .art-drop .art-btn, .art-drop .btn {
    height: 44px !important;
    min-height: 44px !important;
    width: 100% !important;
    min-width: 0 !important;
    padding: 0 !important;
    margin: 0 !important;
    border-radius: 12px !important;
    font-size: 14px !important;
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    flex: none !important;
    box-shadow: none !important;
  }
  .art-drop .add-to-cart-button {
    border-radius: 999px !important;
    background: var(--mts-accent) !important;
    border-color: var(--mts-accent) !important;
    color: #fff !important;
    box-shadow: 0 6px 14px rgba(var(--mts-c-primary-rgb),0.25) !important;
  }
  .art-drop .add-to-cart-button:hover {
    background: var(--mts-accent-hover) !important;
    border-color: var(--mts-accent-hover) !important;
  }
  .art-drop .btn-secondary {
    background: var(--mts-bg-soft) !important;
    color: var(--mts-text) !important;
    border: 1px solid var(--mts-line) !important;
  }
  .art-drop .btn-secondary:hover {
    background: var(--mts-text) !important;
    color: #fff !important;
  }

  /* Screenreader-Toggle (war 415px tall und blockierte Layout) — visuell weg, fuer SR ok */
  .art .sr-toggle {
    position: absolute !important;
    width: 1px !important; height: 1px !important;
    overflow: hidden !important;
    clip: rect(0,0,0,0);
    margin: -1px;
    padding: 0;
    border: 0;
    pointer-events: none;
  }

  /* Recently-Viewed Carousel — sieht aus wie die Home-Featured-Carousel:
     full-width Section ohne grauen Block-Background, ohne Border, 4 Karten/View
     mit grossen Pfeilbuttons rechts unten wie Home. */
  /* Section-Container: NUR die recently-viewed-Box (NICHT alle .product-grid /
     .block-boxed sonst breche ich Cart-/Wishlist-/Compare-Widgets). */
  .recently-viewed-product-grid {
    background: transparent !important;
    border: 0 !important;
    box-shadow: none !important;
    padding: 0 !important;
    margin: 0 !important;
    width: 100% !important;
    box-sizing: border-box !important;
  }
  /* Full-bleed-Variante (vom JS gesetzt nachdem das Element an body verschoben wurde) */
  body > .recently-viewed-product-grid.mts-rv-fullbleed,
  .mts-rv-fullbleed {
    width: 100% !important;
    margin: 0 0 0 0 !important;
    padding: 80px 0 96px !important;
    /* TASK-RV: Section-Hintergrund weiss (vorher var(--mts-bg-soft)=#fafafa).
       User-Feedback: kein grauer Block-/Kachel-Hintergrund. Die Karten sind
       bereits weiss; das Grau kam allein von dieser Section-Flaeche und schien
       in den Luecken zwischen den Karten durch. */
    background: #ffffff !important;
    border-top: 1px solid var(--mts-line) !important;
  }
  .mts-rv-fullbleed .block-title {
    max-width: 1680px !important;
    margin: 0 auto 48px !important;
    padding: 0 40px !important;
    text-align: center !important;
  }
  .mts-rv-fullbleed .block-title h3, .mts-rv-fullbleed h3 {
    font-family: var(--mts-font-display) !important;
    font-size: clamp(2rem, 4vw, 3.2rem) !important;
    font-weight: 700 !important;
    color: var(--mts-text) !important;
    letter-spacing: -0.025em !important;
    margin: 0 !important;
  }
  .mts-rv-fullbleed .block-body {
    max-width: 1680px !important;
    margin: 0 auto !important;
    padding: 0 40px !important;
  }
  @media (max-width:700px) {
    .mts-rv-fullbleed { padding: 56px 0 72px !important; }
    .mts-rv-fullbleed .block-title, .mts-rv-fullbleed .block-body { padding: 0 20px !important; }
  }
  .recently-viewed-product-grid .block-body, .product-grid .block-body { padding: 0 !important; background: transparent !important; }
  .recently-viewed-product-grid .block-title, .product-grid .block-title {
    border: 0 !important; background: transparent !important;
    text-align: center !important;
    margin-bottom: 32px !important;
  }
  .recently-viewed-product-grid h3, .product-grid h3 {
    font-family: var(--mts-font-display) !important;
    font-size: clamp(1.8rem, 3.5vw, 2.6rem) !important;
    font-weight: 700 !important;
    color: var(--mts-text) !important;
    letter-spacing: -0.025em !important;
    margin: 0 !important;
  }

  /* Carousel: Slick laeuft, Slides nehmen 1/4 Breite, kein Border */
  .artlist-carousel { width: 100% !important; position: relative; padding-bottom: 80px !important; }
  .artlist-carousel .slick-list { overflow: hidden !important; padding: 0 !important; margin: 0 -12px !important; }
  .artlist-carousel .slick-track { display: flex !important; align-items: stretch !important; }
  .artlist-carousel .slick-slide {
    padding: 0 12px !important;
    box-sizing: border-box !important;
    height: auto !important;
    max-width: none !important;
  }
  .artlist-carousel .slick-slide > div { height: 100% !important; }
  .artlist-carousel .slick-slide .art {
    width: 100% !important;
    max-width: none !important;
    height: 100% !important;
    display: flex !important;
    flex-direction: column !important;
    border: 0 !important;
    background: #fff !important;
    box-shadow: 0 1px 2px rgba(0,0,0,0.04) !important;
  }
  .artlist-carousel .slick-slide:only-child { max-width: 360px !important; flex: 0 0 360px !important; }

  /* Custom-Arrows wie Home-Featured: NUR fuer .artlist-carousel + recently-viewed.
     NICHT global auf .product-grid (broke Cart-/Wishlist-Widgets) */
  .artlist-carousel .slick-prev,
  .artlist-carousel .slick-next,
  .recently-viewed-product-grid .slick-prev,
  .recently-viewed-product-grid .slick-next {
    position: absolute !important;
    top: auto !important;
    bottom: 16px !important;
    transform: none !important;
    width: 48px !important; height: 48px !important;
    border-radius: 50% !important;
    background: #fff !important;
    color: var(--mts-text) !important;
    border: 1px solid var(--mts-line) !important;
    box-shadow: var(--mts-shadow-soft) !important;
    z-index: 10 !important;
    display: flex !important;
    align-items: center !important;
    justify-content: center !important;
    visibility: visible !important;
    opacity: 1 !important;
    cursor: pointer;
    font-size: 0;
  }
  .artlist-carousel .slick-prev::before,
  .artlist-carousel .slick-next::before,
  .recently-viewed-product-grid .slick-prev::before,
  .recently-viewed-product-grid .slick-next::before {
    color: var(--mts-text) !important;
    opacity: 1 !important;
    font-size: 18px !important;
    font-family: 'slick','FontAwesome', sans-serif !important;
  }
  .artlist-carousel .slick-prev,
  .recently-viewed-product-grid .slick-prev { right: 132px !important; left: auto !important; }
  .artlist-carousel .slick-next,
  .recently-viewed-product-grid .slick-next { right: 72px !important; left: auto !important; }
  
  .artlist-carousel .slick-prev:hover,
  .artlist-carousel .slick-next:hover,
  .recently-viewed-product-grid .slick-prev:hover,
  .recently-viewed-product-grid .slick-next:hover {
    background: var(--mts-text) !important;
    border-color: var(--mts-text) !important;
  }
  .artlist-carousel .slick-prev:hover::before,
  .artlist-carousel .slick-next:hover::before {
    color: #fff !important;
  }
  /* Slick Carousel Pfeile — sichtbar machen (Smartstore-Default versteckt sie) */
  .artlist-carousel .slick-prev, .artlist-carousel .slick-next,
  .product-grid .slick-prev, .product-grid .slick-next {
    display: flex !important;
    visibility: visible !important;
    opacity: 1 !important;
    width: 48px !important; height: 48px !important;
    background: #fff !important;
    border: 1px solid var(--mts-line) !important;
    border-radius: 50% !important;
    color: var(--mts-text) !important;
    box-shadow: var(--mts-shadow-soft) !important;
    align-items: center; justify-content: center;
    position: absolute !important;
    top: 50% !important;
    transform: translateY(-50%);
    z-index: 5;
    cursor: pointer;
  }
  .artlist-carousel .slick-prev, .product-grid .slick-prev { left: -24px !important; right: auto !important; }
  .artlist-carousel .slick-next, .product-grid .slick-next { right: -24px !important; left: auto !important; }
  .artlist-carousel .slick-prev:hover, .artlist-carousel .slick-next:hover,
  .product-grid .slick-prev:hover, .product-grid .slick-next:hover {
    background: var(--mts-text) !important; color: #fff !important; border-color: var(--mts-text) !important;
  }
  .artlist-carousel .slick-prev::before, .artlist-carousel .slick-next::before,
  .product-grid .slick-prev::before, .product-grid .slick-next::before {
    color: inherit !important; opacity: 1 !important; font-size: 18px !important;
  }
  /* Recently-Viewed-Block-Container ohne Border (NUR recently-viewed,
     andere .product-grid bleiben wie Smartstore sie liefert) */
  .recently-viewed-product-grid,
  .recently-viewed-product-grid .block {
    border: 0 !important;
    background: transparent !important;
    box-shadow: none !important;
  }
  .recently-viewed-product-grid .block-title {
    border: 0 !important; background: transparent !important;
  }

  /* ===== CATEGORY-LISTING GRID — Iter 10 Phase B =====
     User-Feedback Iter 9: "ich moechte das pro reihe nur 4 Produkte sind und
     die Produktekarten groesser bzw die Produktbilder viel groesser".
     Strategie: 4 Spalten ab Mid-Desktop (>=1280px). Damit die Cards trotzdem
     gross wirken, oeffnet die Category-Page den Container weit auf
     `max-width: min(1880px, calc(100vw - 32px))` (siehe Container-Override
     unten). Mobile bleibt 2-Spaltig. Negation `:not(.artlist-lines)` schuetzt
     den Smartstore-List-View ?v=list. */
  .artlist:not(.slick-initialized):not(.artlist-lines) {
    display: grid !important;
    grid-template-columns: repeat(2, minmax(0, 1fr)) !important;
    gap: 20px !important;
  }
  @media (min-width: 560px) {
    .artlist:not(.slick-initialized):not(.artlist-lines) { gap: 24px !important; }
  }
  /* Iter 11 (2026-08-17): Spaltenzahl im Standard-Zustand (Filter sichtbar,
     KEIN body.mts-filter-collapsed) kommt jetzt dynamisch aus der nativen
     Katalog-Einstellung "Spaltenbreite Raster-Ansicht"
     (CatalogSettings.GridStyleListColumnSpan) statt der iPad-Round-2-
     Fixierung auf 3. Product.List.cshtml:42-43 setzt dafuer bereits die
     Klasse `.artlist-{N}-cols` auf dasselbe Element. Verifiziert 2026-08-17
     read-only gegen die Multicycle-Box: aktueller Wert = Max4Cols (4).
     WICHTIG: die native Flex-Theme-SCSS (_artlist.scss) setzt fuer diese
     Klasse Bootstrap-Flex-Spalten (make-art-col) mit EIGENEN Breakpoints
     (3 Spalten erst ab lg=992px, 4 erst ab xl=1200px) UND ohne `display:
     grid` - kollidiert also mit `display:grid !important` weiter oben in
     dieser Datei (das ganze Overlay ist laengst auf CSS-Grid umgebaut).
     Ein einfaches Entfernen des !important-Overrides wuerde deshalb NICHT
     "die native Regel greifen lassen", sondern das Grid ohne Spalten-
     Definition zuruecklassen (kaputtes Layout) und zusaetzlich einen
     unerwuenschten 3-Spalten-Zwischenzustand bei 992-1199px einfuehren.
     Deshalb hier: dieselbe Grid-Strategie wie bisher, aber die Spaltenzahl
     liest sich aus der vom Server bereits gesetzten Klasse statt hart
     codiert zu sein - aendert sich GridStyleListColumnSpan im Admin
     (Katalog -> Einstellungen), greift das hier automatisch mit, ohne
     Code-Aenderung. Eingeklappter Zustand bleibt unveraendert fest bei 3
     (Regel weiter unten, `body.mts-filter-collapsed .artlist...`, hoehere
     Spezifitaet gewinnt dort weiterhin) - groessere Karten, wenn die
     Sidebar weg ist. */
  @media (min-width: 992px) {
    .artlist.artlist-2-cols:not(.slick-initialized):not(.artlist-lines) {
      grid-template-columns: repeat(2, minmax(0, 1fr)) !important;
      gap: 28px !important;
    }
    .artlist.artlist-3-cols:not(.slick-initialized):not(.artlist-lines) {
      grid-template-columns: repeat(3, minmax(0, 1fr)) !important;
      gap: 28px !important;
    }
    .artlist.artlist-4-cols:not(.slick-initialized):not(.artlist-lines) {
      grid-template-columns: repeat(4, minmax(0, 1fr)) !important;
      gap: 28px !important;
    }
    .artlist.artlist-5-cols:not(.slick-initialized):not(.artlist-lines) {
      grid-template-columns: repeat(5, minmax(0, 1fr)) !important;
      gap: 28px !important;
    }
    .artlist.artlist-6-cols:not(.slick-initialized):not(.artlist-lines) {
      grid-template-columns: repeat(6, minmax(0, 1fr)) !important;
      gap: 28px !important;
    }
  }
  @media (min-width: 1280px) {
    .artlist.artlist-2-cols:not(.slick-initialized):not(.artlist-lines) {
      grid-template-columns: repeat(2, minmax(0, 1fr)) !important;
      gap: 32px !important;
    }
    .artlist.artlist-3-cols:not(.slick-initialized):not(.artlist-lines) {
      grid-template-columns: repeat(3, minmax(0, 1fr)) !important;
      gap: 32px !important;
    }
    .artlist.artlist-4-cols:not(.slick-initialized):not(.artlist-lines) {
      grid-template-columns: repeat(4, minmax(0, 1fr)) !important;
      gap: 32px !important;
    }
    .artlist.artlist-5-cols:not(.slick-initialized):not(.artlist-lines) {
      grid-template-columns: repeat(5, minmax(0, 1fr)) !important;
      gap: 32px !important;
    }
    .artlist.artlist-6-cols:not(.slick-initialized):not(.artlist-lines) {
      grid-template-columns: repeat(6, minmax(0, 1fr)) !important;
      gap: 32px !important;
    }
  }
  /* ITER 10 Phase B — Category-Page Container weit oeffnen, damit 4 Cards
     auch ohne Filter-Collapse spuerbar gross sind. `.category-page` ist Kind
     von `<main>` -> wir treffen den Bootstrap-`.container` ueber den
     `body.lyt-cols-2 + Page hat .category-page` Verbund. Da .category-page
     ein div weit unten im DOM ist, wird der Selektor ueber :has() zugeordnet,
     mit Fallback auf body[data-pagetype="category"] (zur Vorsicht setzen wir
     auch den Body-Marker per JS). */
  body.lyt-cols-2:has(.category-page) > .container,
  body.mts-cat-page > .container,
  body.lyt-cols-2:has(.category-page) .container.menubar-container,
  body.lyt-cols-2:has(.category-page) > div > .container:not(.menubar-container):not(.shopbar-container):not(.megamenu-container):not(.footer-main):not(.footer-bottom):not(.footer-social) {
    max-width: min(1880px, calc(100vw - 32px)) !important;
  }
  /* Bild-Aspect 5:4 auf Listing — mehr Bildflaeche pro Card als 4:3 ohne
     dass die Card zu hoch wird */
  body.lyt-cols-2:has(.category-page) .artlist .art .art-picture-block,
  body.mts-cat-page .artlist .art .art-picture-block {
    aspect-ratio: 5 / 4 !important;
  }
  /* PHASE-1 BUGFIX: a11y skip-link nicht als Grid-Item rendern.
     Smartstore packt einen sichtbar=opacity:0 aber `display:block; width:100%`
     `<div class="skip-content-container">` als ERSTES Kind ins .artlist Grid.
     Damit verbraucht er Slot #1 und die erste Produktkarte landet in Slot #2.
     Loesung: aus dem Grid-Flow nehmen via standard sr-only-Pattern, Fokus
     bleibt erreichbar (clip-path:none on focus). */
  .artlist > .skip-content-container,
  .artlist .skip-content-container,
  .product-list-container > .skip-content-container {
    position: absolute !important;
    width: 1px !important;
    height: 1px !important;
    padding: 0 !important;
    margin: -1px !important;
    overflow: hidden !important;
    clip: rect(0, 0, 0, 0) !important;
    white-space: nowrap !important;
    border: 0 !important;
    /* Aus dem Grid-Flow: span 0 cells */
    display: block !important;
    grid-column: 1 / 2 !important;
    grid-row: 1 / 2 !important;
    pointer-events: none !important;
  }
  /* Auf Tastatur-Fokus wieder sichtbar */
  .artlist > .skip-content-container:focus-within,
  .product-list-container > .skip-content-container:focus-within {
    position: fixed !important;
    top: 80px !important;
    left: 24px !important;
    width: auto !important;
    height: auto !important;
    clip: auto !important;
    margin: 0 !important;
    z-index: 9999 !important;
    pointer-events: auto !important;
  }

  /* Card-Border + Subline auf Category-Page sichtbar machen */
  .artlist .art, .artlist-grid .art {
    border: 0 !important;
    outline: 0 !important;
  }

  /* ITER 10 PHASE A — Specs auf Listing-Cards komplett entfernt
     (User-Feedback: "ich moechte das du das ganz entfernst aus der produktekarte:
     Rahmen / Motor / Schaltung..."). Slot bleibt im DOM (JS-Pipeline braucht die
     Daten weiter fuer Hover-Image + Single-Size), aber visuell unsichtbar. */
  .artlist .art .mts-card-specs,
  .artlist .art .mts-card-specs.is-loading,
  .artlist .art .mts-card-specs.is-empty,
  .artlist.artlist-lines .art .mts-card-specs {
    display: none !important;
  }

  /* ===== Iter 9 Phase D — List-View-Layout (Smartstore ?v=list)
     Markup: <div class="artlist artlist-lines"><div class="art"> mit
       <figure class="art-picture-block"> + <div class="art-data-block">
         (.art-info-block + .art-actions-block)
     Default-Smartstore liefert eigenes Lines-CSS — wir uebersteuern aber
     unbeabsichtigt mit `.artlist .art { flex-direction:column }`. Hier den
     Lines-Mode explizit zuruecksetzen + Apple-Look anwenden. ===== */
  .artlist.artlist-lines {
    display: flex !important;
    flex-direction: column !important;
    gap: 16px !important;
  }
  .artlist.artlist-lines .art {
    flex-direction: row !important;
    flex-wrap: nowrap !important;
    align-items: stretch !important;
    /* Iter 14 Phase B: groessere Lines-Cards (User: "voll klein und nicht passend gross")
       gap 24 -> 32, padding 16 -> 24, min-height 220 -> 280.
       flex-wrap: nowrap erzwingt eine einzige Zeile (sonst wraps Data unter Pic). */
    gap: 32px !important;
    background: #fff !important;
    border-radius: var(--mts-radius) !important;
    box-shadow: var(--mts-shadow-soft) !important;
    padding: 24px !important;
    height: auto !important;
    min-height: 280px;
    transition: transform 0.3s cubic-bezier(.22,.61,.36,1), box-shadow 0.3s ease !important;
  }
  .artlist.artlist-lines .art:hover {
    transform: translateY(-2px) !important;
    box-shadow: 0 18px 40px -10px rgba(0,0,0,0.12) !important;
  }
  .artlist.artlist-lines .art .art-picture-block {
    /* Iter 14 Phase B: Pic-Block groesser (User: "voll klein").
       width 320 -> 440 (passt ~600 capped via 44% bei 1024 Container)
       max-width 38% -> 44% (mehr visuelles Gewicht fuers Bike-Bild)
       aspect 4/3 bleibt — passt zu Bike-Fotos. */
    flex: 0 0 var(--art-picture-width, 440px) !important;
    width: var(--art-picture-width, 440px) !important;
    max-width: 44% !important;
    aspect-ratio: 4 / 3 !important;
    margin: 0 !important;
    border-radius: 12px !important;
    overflow: hidden !important;
    background: #ffffff !important;
    position: relative !important;
  }
  .artlist.artlist-lines .art .art-data-block {
    flex: 1 1 auto !important;
    display: flex !important;
    flex-direction: column !important;
    padding: 4px 8px !important;
    gap: 8px !important;
    min-width: 0 !important;
  }
  .artlist.artlist-lines .art .art-info-block {
    flex: 1 1 auto;
    display: flex !important;
    flex-direction: column !important;
    gap: 6px !important;
  }
  .artlist.artlist-lines .art .art-name { padding: 0 !important; margin: 0 !important; }
  .artlist.artlist-lines .art .art-name-link, .artlist.artlist-lines .art .art-name a {
    /* Iter 14 Phase B: Title prominenter (1.15 -> 1.4rem), bisschen mehr Atemraum */
    font-size: 1.4rem !important;
    line-height: 1.3 !important;
    font-weight: 600 !important;
    letter-spacing: -0.015em !important;
    padding: 0 !important;
    display: block;
  }
  .artlist.artlist-lines .art .art-brand { padding: 0 !important; margin: 0 !important; }
  /* Iter 14 Phase B: Brand-Logo in der Lines-View prominenter (Default 24px Hoehe) */
  .artlist.artlist-lines .art .art-brand .mts-brand-img {
    max-height: 38px !important;
    max-width: 130px !important;
    object-fit: contain !important;
  }
  .artlist.artlist-lines .art .art-actions-block {
    flex: 0 0 auto !important;
    display: flex !important;
    flex-direction: column !important;
    gap: 8px !important;
    align-items: flex-end !important;
    justify-content: flex-end !important;
    padding-left: 16px !important;
    /* Iter 12 Phase A: vertikale Trennlinie zur Info-Spalte WEG.
       (Iter 9 hatte die als Trenner gesetzt; User will sie weg.) */
    border-left: 0 !important;
    min-width: 220px;
  }
  .artlist.artlist-lines .art .art-price-block {
    border-top: 0 !important;
    margin: 0 !important;
    padding: 0 !important;
    text-align: right !important;
  }
  .artlist.artlist-lines .art .art-price-block .art-price,
  .artlist.artlist-lines .art .art-price-block .art-finalprice {
    text-align: right !important;
  }
  /* Iter 14 Phase B: Preis prominent rechts in der Lines-View (Apple-Style:
     gross + dunkel, dominantes Element rechts). */
  .artlist.artlist-lines .art .art-price-block .art-price-value,
  .artlist.artlist-lines .art .art-price-block .art-finalprice .art-price-value,
  .artlist.artlist-lines .art .art-price-block .art-finalprice {
    font-size: 1.5rem !important;
    font-weight: 700 !important;
    letter-spacing: -0.015em !important;
    color: var(--mts-text) !important;
    line-height: 1.2 !important;
  }
  .artlist.artlist-lines .art .art-description {
    display: -webkit-box !important;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden !important;
    color: var(--mts-text-muted) !important;
    font-size: 13px !important;
    line-height: 1.45 !important;
    padding: 0 !important;
    margin: 0 !important;
  }
  .artlist.artlist-lines .art .art-variant-info,
  .artlist.artlist-lines .art .art-more-opts,
  .artlist.artlist-lines .art .art-legalinfo,
  .artlist.artlist-lines .art .art-shortdesc {
    padding: 0 !important;
    margin: 0 !important;
    /* Iter 14 Phase B: dezenter (User: "Variant-Hinweise stilistisch dezenter").
       font-size 12.5 -> 12, opacity senken statt nur color, mehr letter-spacing.
       Auch der "Größe, Farbe"-Link wird entkoppelt vom Default-Link-Look. */
    font-size: 12px !important;
    line-height: 1.5 !important;
    color: var(--mts-text-muted) !important;
    opacity: 0.78;
    letter-spacing: 0.005em;
  }

  /* Iter 15 Phase E — Grid-Listing-Card "Weitere Optionen" zentriert.
     User: "zeige das in der produktkarte auch noch zentriert an: Weitere
     Optionen: Groesse, Farbe ohne das : zentriert schoen".
     Doppelpunkt entfernen wir per JS (siehe stripMoreOptsColon),
     hier das Layout: zentriert, dezent, leicht aufgeluftet. */
  .artlist:not(.artlist-lines) .art .art-more-opts,
  .artlist:not(.artlist-lines) .art .art-variant-info {
    text-align: center !important;
    font-size: 12px !important;
    line-height: 1.5 !important;
    color: var(--mts-text-muted) !important;
    opacity: 0.85;
    letter-spacing: 0.005em;
    padding: 4px 8px !important;
    margin: 4px 0 0 !important;
  }
  .artlist:not(.artlist-lines) .art .art-more-opts > span,
  .artlist:not(.artlist-lines) .art .art-variant-info > span {
    display: block !important;
    text-align: center !important;
  }
  .artlist:not(.artlist-lines) .art .art-more-opts a,
  .artlist:not(.artlist-lines) .art .art-variant-info a {
    color: var(--mts-text) !important;
    text-decoration: none !important;
    font-weight: 600 !important;
    display: inline-block !important;
    text-align: center !important;
  }
  .artlist:not(.artlist-lines) .art .art-more-opts a:hover,
  .artlist:not(.artlist-lines) .art .art-variant-info a:hover {
    text-decoration: underline !important;
  }
  .artlist.artlist-lines .art .art-variant-info a,
  .artlist.artlist-lines .art .art-more-opts a {
    color: var(--mts-text-muted) !important;
    text-decoration: none !important;
    font-weight: 500 !important;
    border-bottom: 1px dotted rgba(0,0,0,0.18);
    padding-bottom: 1px;
  }
  .artlist.artlist-lines .art .art-variant-info a:hover,
  .artlist.artlist-lines .art .art-more-opts a:hover {
    color: var(--mts-text) !important;
    border-bottom-color: var(--mts-text);
  }
  .artlist.artlist-lines .art .art-delivery-info {
    padding: 0 !important;
    margin: 0 !important;
  }
  .artlist.artlist-lines .art .add-to-cart-button,
  .artlist.artlist-lines .art .btn-primary {
    width: auto !important;
    min-width: 200px;
  }
  /* List-View: Specs-Slot horizontal (1 Zeile) */
  .artlist.artlist-lines .art .mts-card-specs {
    flex-direction: row !important;
    flex-wrap: wrap !important;
    gap: 14px !important;
    margin: 4px 0 0 !important;
    min-height: 0 !important;
  }
  .artlist.artlist-lines .art .mts-card-specs__tag {
    flex: 0 1 auto !important;
  }
  /* Single-Size-Badge bleibt absolut auf Bild — funktioniert auch in Lines */

  @media (max-width: 768px) {
    .artlist.artlist-lines .art {
      flex-direction: column !important;
      gap: 12px !important;
    }
    .artlist.artlist-lines .art .art-picture-block {
      flex: 1 1 100% !important;
      width: 100% !important;
      max-width: 100% !important;
    }
    .artlist.artlist-lines .art .art-actions-block {
      border-left: 0 !important;
      /* Iter 12 Phase A: auch im Mobile-Stack KEINE Trennlinie zwischen
         Bild/Info und Actions. Nur Whitespace separiert. */
      border-top: 0 !important;
      padding: 12px 0 0 !important;
      align-items: stretch !important;
      min-width: 0;
    }
    .artlist.artlist-lines .art .art-price-block,
    .artlist.artlist-lines .art .art-price-block .art-price,
    .artlist.artlist-lines .art .art-price-block .art-finalprice {
      text-align: left !important;
    }
  }
  /* Subline / SubTitle / ShortDescription auf Category-Karten — wurde von
     Smartstore-Default gehidet, jetzt sichtbar */
  .art-shortdesc, .art-genericname, .art-subtitle, .art-description {
    display: block !important;
    visibility: visible !important;
    overflow: visible !important;
    max-height: none !important;
    padding: 4px 18px !important;
    color: var(--mts-text-muted) !important;
    font-size: 13px !important;
    line-height: 1.45 !important;
    margin: 0 !important;
    text-align: left !important;
  }
  .art-shortdesc { padding-bottom: 8px !important; }

  /* ===== CATEGORY-PAGE ===== */
  .cat-page-title, .category-page h1, .category-page .page-title h1 { font-size: clamp(2rem, 4vw, 3rem) !important; margin: 32px 0 16px !important; letter-spacing: -0.025em; font-weight: 700 !important; }
  .category-page .page-description, .cat-page-desc { color: var(--mts-text-muted) !important; font-size: 1.05rem !important; line-height: 1.55 !important; max-width: 720px; margin-bottom: 32px !important; }
  .breadcrumb { background: transparent !important; padding: 16px 0 !important; font-size: 13px !important; margin: 0 !important; }
  .breadcrumb a { color: var(--mts-text-muted) !important; text-decoration: none !important; }
  /* Breadcrumb-Link ist Text auf weißem Grund -> Textton (Kette wie oben). */
  .breadcrumb a:hover { color: var(--mts-accent-text, var(--mts-accent)) !important; }
  .breadcrumb-item.active { color: var(--mts-text) !important; font-weight: 500; }
  .breadcrumb-item + .breadcrumb-item::before { color: rgba(0,0,0,0.2) !important; }
  .pagination { gap: 4px; }
  .pagination .page-link { border-radius: 999px !important; border: 0 !important; color: var(--mts-text) !important; margin: 0 4px; min-width: 38px; text-align: center; padding: 8px 12px !important; transition: all 0.18s ease; }
  /* Seitenzahl ist Text auf hellem Hover-Grund -> Textton (Kette wie oben). */
  .pagination .page-link:hover { background: var(--mts-bg-soft) !important; color: var(--mts-accent-text, var(--mts-accent)) !important; }
  .pagination .page-item.active .page-link { background: var(--mts-text) !important; color: #fff !important; }
  /* Listing empty/404 state polish */
  .not-found-content, .error-page-content {
    text-align: center;
    padding: 80px 24px !important;
    max-width: 720px; margin: 0 auto;
  }
  .not-found-content h1, .error-page-content h1 {
    font-family: var(--mts-font-display) !important;
    font-size: clamp(4rem, 12vw, 8rem) !important;
    font-weight: 800 !important;
    color: var(--mts-text-muted) !important;
    letter-spacing: -0.04em !important;
    margin: 0 0 16px !important;
    line-height: 1 !important;
  }
  .not-found-content p, .error-page-content p { font-size: 1.1rem; color: var(--mts-text-muted); margin-bottom: 32px !important; }

  /* Category-Page filters/sort bar — kompakter Look */
  .cat-actions, .listing-actions, .product-list-actions {
    background: var(--mts-bg-soft) !important;
    border-radius: var(--mts-radius) !important;
    padding: 12px 16px !important;
    border: 0 !important;
    margin-bottom: 32px !important;
    display: flex; flex-wrap: wrap; gap: 12px; align-items: center;
  }
  .cat-actions select, .listing-actions select, .product-list-actions select {
    border-radius: 999px !important;
    border: 1px solid var(--mts-line) !important;
    background: #fff !important;
    padding: 8px 16px !important;
    font-size: 14px !important;
  }
  /* Per-page-/sort-Buttons in der Category-Toolbar */
  .cat-page .toolbar, .category-page .toolbar { background: transparent !important; border: 0 !important; padding: 0 !important; margin-bottom: 24px !important; }

  /* ===== CATEGORY-PAGE — Phase-3 Layout, Hero, Filter, Toolbar =====
     Scope: streng auf .category-page / .product-list bezogen. Keine globalen
     Selektoren, sonst Regression auf PDP/Cart/etc.
  */

  /* Page-Header mehr Atemraum, Title prominenter, optional Pattern-BG */
  .category-page .page-title {
    padding: 8px 0 4px !important;
    margin: 0 !important;
    border: 0 !important;
  }
  .category-page .page-title h1, .category-page h1.page-title {
    font-size: clamp(2.2rem, 5vw, 3.8rem) !important;
    font-weight: 800 !important;
    letter-spacing: -0.03em !important;
    margin: 32px 0 12px !important;
    line-height: 1.05 !important;
    color: var(--mts-text) !important;
    text-align: center !important;
  }
  .category-page .page-description, .category-page .cat-page-desc {
    color: var(--mts-text-muted) !important;
    font-size: 1.05rem !important;
    line-height: 1.55 !important;
    max-width: 720px;
    margin: 0 auto 28px !important;
    text-align: center !important;
  }
  /* ITER 8 PHASE E — Apple-Hero Tagline + Trennstrich */
  .category-page .mts-cat-tagline,
  .product-list .mts-cat-tagline {
    text-align: center;
    color: var(--mts-text-muted);
    font: 500 clamp(1rem, 1.6vw, 1.35rem)/1.45 var(--mts-font-display);
    letter-spacing: -0.005em;
    max-width: 720px;
    margin: 0 auto 18px !important;
  }
  .category-page .mts-cat-hero-rule {
    display: block;
    width: 56px;
    height: 3px;
    margin: 18px auto 36px;
    background: var(--mts-accent);
    border-radius: 999px;
    opacity: 0.85;
  }
  /* Bootstrap row Gap zwischen Sidebar und Main grosszuegiger */
  .category-page .row, .cat-page .row { margin-left: -16px !important; margin-right: -16px !important; }
  .category-page .row > [class*="col-"], .cat-page .row > [class*="col-"] {
    padding-left: 16px !important;
    padding-right: 16px !important;
  }

  /* ===== Filter-Sidebar (.faceted-search) — modernes Apple-Look-Sticky ===== */
  .faceted-search-block, aside.faceted-search-block, .faceted-search {
    background: transparent !important;
    border: 0 !important;
    padding: 0 !important;
    font-size: 14px;
  }
  /* ITER 10 PHASE D — Filter-Sidebar einklappbar (FIX vs. Iter 9).
     Bug Iter 9: Selektor `.category-page aside#content-left` greift NIE, weil
     `.category-page` ein Kind von `<main>` ist und der `<aside>` ein SIBLING
     im selben `<div id="content-body" class="row">`. Verschachtelung:
       <body class="lyt-cols-2">
         ...
         <div id="content-body" class="row">
           <aside id="content-left" class="col-lg-3 ...">  <-- Sidebar
           <main id="content-center" class="col-lg-9">
             <div class="page category-page">             <-- Marker
     Fix: scopen ueber `body.mts-cat-page` (vom JS auf <body> gesetzt sobald
     wir eine Category-Page erkennen). Damit greifen die Selektoren wirklich.
     WAR `position:sticky; top:96px`, freies Wachstum.

     NACHTRAG 2026-08-17 (Nutzer-Report, DREI Runden — Kern-Problem: die
     Sidebar (gemessen bis zu 1500 px Inhalt) ist oft hoeher als der
     verfuegbare Viewport (~900 px), und alle drei reinen CSS-Loesungen
     hatten je einen Mangel:
       1) Sticky + freies Wachstum (`overflow:visible`, urspruenglich): blieb
          am oberen Rand haengen, unteres Drittel (Preis/Farbe) nur per Maus-
          Scroll ueber der Sidebar NICHT erreichbar — loest sich Spec-gemaess
          erst, wenn die viel laengere Produkt-Spalte fast durchgescrollt ist.
       2) Sticky + `max-height`+`overflow-y:auto` (Zwischenschritt): behebt
          Erreichbarkeit, aber erzeugt einen sichtbaren Scrollbalken IM Filter
          — vom Nutzer ausdruecklich abgelehnt.
       3) `position:static` (voriger Stand): kein Scrollbalken, aber sobald
          die (kuerzere) Sidebar durchgescrollt ist, bleibt die LINKE Spalte
          fuer den Rest der (viel laengeren) Produktliste leer — Sidebar und
          Hauptspalte sind Flex-Geschwister in `#content-body.row`, die Zeile
          selbst ist so hoch wie ihr hoechstes Kind (main), links darunter
          also nur noch freie Flaeche.
     NACHTRAG 4 (selber Tag): "mache einfach den Filter oben links fest und
     muss nicht mit gehen beim Scrollen" wurde zunaechst als "reines
     position:sticky, top:96px" umgesetzt — sticky bleibt beim Scrollen ja
     an einer festen VIEWPORT-Position haengen, das las sich wie ein Treffer.

     NACHTRAG 5 (Klarstellung des Nutzers): GENAU DAS war nicht gemeint.
     "es sollte aber nicht sticky sein... wenn ich scrolle sollte es oben
     bleiben und nicht als sticky mitgehen" — der Nutzer will explizit KEIN
     Sticky-Verhalten (das "Mitgehen"/Hinterherfolgen beim Scrollen), sondern
     dass die Sidebar an ihrer NATUERLICHEN Position im Dokument bleibt (oben
     auf der Seite, wo sie im Fluss steht) und beim Scrollen ganz normal mit
     dem Rest der Seite mitscrollt (also aus dem Sichtfenster verschwindet,
     wie jeder andere Block auch) — kein Kleben am Viewport-Rand. Das ist
     Variante 3) von oben (`position:static`), mit demselben bekannten
     Nebeneffekt: sobald die (kuerzere) Sidebar durchgescrollt ist, bleibt
     die linke Spalte fuer den Rest der Produktliste leer. Nutzer hat diesen
     Nebeneffekt in Kauf genommen (nicht erneut moniert) — bewusst NICHT
     wieder auf Sticky zurueckgewichen. `align-self:flex-start` bleibt
     UNVERZICHTBAR, unabhaengig von Sticky/Static: `#content-body.row` ist
     ein Bootstrap-Flexrow mit Default `align-items:stretch` — ohne dieses
     Override wuerde die Sidebar auf die volle Hoehe der viel laengeren
     Produkt-Spalte gestreckt. */
  @media (min-width: 992px) {
    body.mts-cat-page aside#content-left,
    body.mts-cat-page aside.col-lg-3 {
      position: static !important;
      align-self: flex-start !important;
      max-height: none !important;
      overflow: visible !important;
      padding-right: 0 !important;
    }
    /* Sidebar etwas schmaler, Produktkarten-Spalte entsprechend breiter
       (Nutzer 2026-08-17: "der Filter soll etwas zusammenziehen, duenner").
       Bootstrap-Default waere `col-lg-3`/`col-lg-9` = 25 % / 75 %; hier fest
       auf 20 % / 80 % ueberschrieben. `width` UND `flex-basis` setzen: die
       Bootstrap-Spalten kommen mit `flex: 0 0 auto` + explizitem `width` an
       (kein `flex-basis:%`), also reicht `flex-basis` allein nicht. */
    body.mts-cat-page aside#content-left,
    body.mts-cat-page aside.col-lg-3 {
      width: 20% !important;
      flex-basis: 20% !important;
    }
    /* body.mts-cat-page main#content-center,
    body.mts-cat-page main.col-lg-9,
    body.mts-cat-page .col-lg-9 {
      width: 80% !important;
      flex-basis: 80% !important;
    }*/
    /* Collapse-Toggle Button */
    .mts-filter-toggle {
      display: inline-flex !important;
      align-items: center;
      gap: 6px;
      background: var(--mts-bg-soft);
      border: 0;
      border-radius: 999px;
      padding: 8px 14px 8px 12px;
      font: 600 12px/1 var(--mts-font);
      color: var(--mts-text);
      cursor: pointer;
      letter-spacing: 0.04em;
      text-transform: uppercase;
      transition: background 0.18s ease, color 0.18s ease;
      margin-bottom: 14px;
      width: 100%;
      justify-content: space-between;
    }
    /* Button-Beschriftung auf hellgrauem Grund -> Textton (Kette wie oben). */
    .mts-filter-toggle:hover { background: #ececef; color: var(--mts-accent-text, var(--mts-accent)); }
    .mts-filter-toggle svg {
      width: 14px; height: 14px;
      transition: transform 0.3s cubic-bezier(.22,.61,.36,1);
    }
    .mts-filter-toggle[aria-expanded="false"] svg { transform: rotate(-90deg); }
    /* Re-open Pill (sichtbar nur wenn collapsed) */
    .mts-filter-reopen {
      display: none;
      align-items: center;
      gap: 6px;
      background: var(--mts-bg-soft);
      border: 0;
      border-radius: 999px;
      padding: 8px 16px;
      font: 600 12px/1 var(--mts-font);
      color: var(--mts-text);
      cursor: pointer;
      letter-spacing: 0.04em;
      text-transform: uppercase;
      margin: 0 12px 16px 0;
      transition: background 0.18s ease, color 0.18s ease;
    }
    /* Button-Beschriftung auf hellgrauem Grund -> Textton (Kette wie oben). */
    .mts-filter-reopen:hover { background: #ececef; color: var(--mts-accent-text, var(--mts-accent)); }
    .mts-filter-reopen svg { width: 14px; height: 14px; transform: rotate(90deg); }
    /* Collapsed-State: KOMPLETTE Sidebar weg (Kategoriebaum + Facetten),
       Main-Col fully ausfahren. Selektor MUSS auf body.mts-cat-page +
       body.mts-filter-collapsed gescoped sein (nicht auf .category-page) —
       siehe Bug-Erklaerung oben. */
    body.mts-cat-page.mts-filter-collapsed aside#content-left,
    body.mts-cat-page.mts-filter-collapsed aside.col-lg-3 {
      display: none !important;
    }
    body.mts-cat-page.mts-filter-collapsed main#content-center,
    body.mts-cat-page.mts-filter-collapsed main.col-lg-9,
    body.mts-cat-page.mts-filter-collapsed .col-lg-9 {
      flex: 0 0 100% !important;
      max-width: 100% !important;
    }
    /* Re-Open-Pill: NUR sichtbar wenn collapsed. Toggle-in-Sidebar:
       NUR sichtbar wenn expanded (Sidebar ist ja sonst hidden). Damit haben
       wir IMMER genau einen sichtbaren Filter-Button. */
    body.mts-cat-page.mts-filter-collapsed .mts-filter-reopen { display: inline-flex !important; }
    body.mts-cat-page:not(.mts-filter-collapsed) .mts-filter-reopen { display: none !important; }
    /* Iter 10 Phase D — Container darf bei collapsed Filter NOCH weiter
       auswachsen (vs. Default 1880). Klar messbarer Effekt: ohne Sidebar ~25%
       mehr Card-Breite. */
    body.mts-filter-collapsed.lyt-cols-2 .container:not(.menubar-container):not(.shopbar-container):not(.megamenu-container):not(.footer-main):not(.footer-bottom):not(.footer-social) {
      max-width: min(2240px, calc(100vw - 32px)) !important;
    }
    /* Iter 12 (2026-08-17): Nutzer-Korrektur zu Iter 11 - auch der
       eingeklappte Zustand soll die Spaltenzahl dynamisch aus der Katalog-
       Einstellung uebernehmen, keine feste 3 mehr (loest die iPad-Round-2-
       P12-Fixierung ab). Groessere Karten bei eingeklapptem Filter kommen
       jetzt allein aus der freigesetzten Sidebar-Breite (Container-Override
       oben, `max-width: min(2240px, ...)`), nicht mehr aus einer
       abweichenden Spaltenzahl - bei aktuell Max4Cols also ebenfalls 4. */
    body.mts-filter-collapsed .artlist.artlist-2-cols:not(.slick-initialized):not(.artlist-lines) {
      grid-template-columns: repeat(2, minmax(0, 1fr)) !important;
    }
    body.mts-filter-collapsed .artlist.artlist-3-cols:not(.slick-initialized):not(.artlist-lines) {
      grid-template-columns: repeat(3, minmax(0, 1fr)) !important;
    }
    body.mts-filter-collapsed .artlist.artlist-4-cols:not(.slick-initialized):not(.artlist-lines) {
      grid-template-columns: repeat(4, minmax(0, 1fr)) !important;
    }
    body.mts-filter-collapsed .artlist.artlist-5-cols:not(.slick-initialized):not(.artlist-lines) {
      grid-template-columns: repeat(5, minmax(0, 1fr)) !important;
    }
    body.mts-filter-collapsed .artlist.artlist-6-cols:not(.slick-initialized):not(.artlist-lines) {
      grid-template-columns: repeat(6, minmax(0, 1fr)) !important;
    }
  }
  /* Mobile: Toggle nicht zeigen — Smartstore-Drawer-Pattern bleibt aktiv */
  @media (max-width: 991px) {
    .mts-filter-toggle, .mts-filter-reopen { display: none !important; }
  }
  /* Each filter group als Card-Look */
  .faceted-search-block .nav-toggler, .faceted-search-block .facet-group,
  .faceted-search-block > .block, .faceted-search > .block,
  .category-navigation, .product-list-categories {
    background: var(--mts-bg-soft) !important;
    border: 0 !important;
    border-radius: var(--mts-radius) !important;
    padding: 14px 16px !important;
    margin-bottom: 12px !important;
    box-shadow: none !important;
  }
  /* Filter-Group Headlines */
  .faceted-search-block .nav-toggler-heading,
  .faceted-search-block .facet-group-title,
  .faceted-search .block-title,
  .faceted-search-block h3, .faceted-search-block h4,
  .product-list-categories .block-title,
  .category-navigation .block-title {
    font-family: var(--mts-font-display) !important;
    font-size: 13px !important;
    font-weight: 700 !important;
    letter-spacing: 0.04em !important;
    text-transform: uppercase !important;
    color: var(--mts-text) !important;
    margin: 0 0 10px !important;
    padding: 0 !important;
    border: 0 !important;
    background: transparent !important;
  }
  .faceted-search-block label, .faceted-search-block .facet-label,
  .faceted-search a {
    color: var(--mts-text) !important;
    font-size: 14px !important;
    text-decoration: none !important;
    line-height: 1.45;
  }
  .faceted-search-block .form-check, .faceted-search-block .form-checkbox-group {
    padding: 4px 0 !important;
    margin: 0 !important;
    border: 0 !important;
  }
  /* Facetten-Label ist 14-px-Text auf weißer Sidebar -> Textton (Kette wie oben). */
  .faceted-search-block .form-check:hover, .faceted-search-block label:hover {
    color: var(--mts-accent-text, var(--mts-accent)) !important;
  }
  .faceted-search-block input[type="checkbox"], .faceted-search-block input[type="radio"] {
    accent-color: var(--mts-accent) !important;
    width: 16px; height: 16px;
    margin-right: 6px;
  }
  /* Active-Filter Chips */
  .active-facets, .faceted-search-block .active-facets {
    display: flex; flex-wrap: wrap; gap: 6px;
    margin-bottom: 12px;
  }
  .active-facets .facet-chip, .active-facets a {
    background: var(--mts-text) !important;
    color: #fff !important;
    border-radius: 999px !important;
    padding: 4px 10px !important;
    font-size: 12px !important;
    text-decoration: none !important;
    display: inline-flex; align-items: center; gap: 6px;
  }
  /* Price-Slider/Range modern */
  .faceted-search-block .form-row, .faceted-search-block .input-group {
    gap: 6px !important;
  }
  .faceted-search-block input[type="number"], .faceted-search-block input[type="text"] {
    border: 1px solid var(--mts-line) !important;
    border-radius: 10px !important;
    background: #fff !important;
    padding: 6px 10px !important;
    font-size: 13px !important;
    box-shadow: none !important;
  }
  .faceted-search-block .btn, .faceted-search-block button[type="submit"] {
    border-radius: 999px !important;
    background: var(--mts-text) !important;
    color: #fff !important;
    border: 0 !important;
    padding: 6px 14px !important;
    font-size: 12px !important;
    font-weight: 600 !important;
  }
  .faceted-search-block .btn:hover, .faceted-search-block button[type="submit"]:hover {
    background: var(--mts-accent) !important;
  }

  /* Preisfilter „von / bis" gestapelt statt nebeneinander (Nutzer 2026-08-17,
     mc.movetoshop.com). `.facet-range-container` ist natives Smartstore-Markup
     (Fieldset mit zwei `flex-grow-1`-Zahlenfeldern + "-"-Separator + rundem
     Anwenden-Button in EINER Flex-Zeile, `d-flex align-items-center`). Diese
     Zeile ist praktisch nicht schrumpfbar (zwei Stepper-Inputs) und zieht die
     Sidebar-Spalte breiter, als der Rest der Filter braucht — auf Kosten der
     Produktkarten-Spalte. Fix: DREI eigene Zeilen — „von" volle Breite,
     „bis" volle Breite (Nutzer-Nachtrag: „von" darf nicht breiter sein als
     „bis" — beide bekommen deshalb dieselbe `flex-basis:100%`, statt „bis"
     sich mit dem Button eine Zeile teilen zu lassen), Anwenden-Button rechts-
     buendig in einer eigenen dritten Zeile. "-"-Separator entfaellt (ergibt
     beim Stapeln keinen Sinn mehr). Selektor bewusst OHNE
     `.faceted-search-block`-Vorfahr: dasselbe Markup wird per JS unveraendert
     ins mobile `#filter-widget`-Offcanvas verschoben (Kommentar bei :3508) —
     die Regel muss an beiden Stellen greifen. */
  .facet-range-container { flex-wrap: wrap !important; row-gap: 8px; }
  .facet-range-container > .flex-grow-1.pr-2 {
    flex: 1 1 100% !important;
    padding-right: 0 !important;
  }
  .facet-range-container > .flex-grow-0.font-weight-700 { display: none !important; }
  .facet-range-container > .flex-grow-1.pl-2 {
    flex: 1 1 100% !important;
    padding-left: 0 !important;
  }
  .facet-range-container > .flex-grow-0.pl-2 {
    flex: 1 1 100% !important;
    padding-left: 0 !important;
    display: flex !important;
    justify-content: flex-end !important;
  }

  /* ===== ITER 8 PHASE C — Toolbar professioneller, ohne Borders ===== */
  /* Smartstore Standard-Markup: <div class="artlist-actions artlist-actions--top">
     mit `.artlist-action-group--filtersort` (Sort-Dropdown) und
     `.artlist-action-group--viewmode` (Grid/List-Switch). */
  .category-page .artlist-actions,
  .category-page .artlist-actions--top,
  .category-page .listing-actions,
  .category-page .product-list-actions,
  .category-page .cat-actions,
  .category-page .product-list-toolbar {
    background: transparent !important;
    border: 0 !important;
    border-radius: 0 !important;
    padding: 0 !important;
    margin: 0 0 24px !important;
    display: flex !important;
    flex-wrap: wrap;
    gap: 12px;
    align-items: center;
    justify-content: space-between;
  }
  /* Sort-Pill — Smartstore-Default: .btn-artlist-action.dropdown-toggle */
  .category-page .btn-artlist-action,
  .category-page .listing-actions .dropdown-toggle,
  .category-page .product-list-actions .dropdown-toggle,
  .artlist-action--sort .dropdown-toggle {
    background: var(--mts-bg-soft) !important;
    border: 0 !important;
    color: var(--mts-text) !important;
    border-radius: 999px !important;
    padding: 9px 18px !important;
    font: 500 13px/1 var(--mts-font) !important;
    box-shadow: none !important;
    transition: background 0.18s ease, color 0.18s ease !important;
    display: inline-flex !important;
    align-items: center !important;
    gap: 8px !important;
  }
  .category-page .btn-artlist-action:hover,
  .category-page .btn-artlist-action[aria-expanded="true"] {
    background: #ececef !important;
    color: var(--mts-text) !important;
    border: 0 !important;
  }
  /* Default-Bootstrap-Caret unter `.dropdown-toggle::after` durch SVG-Chevron ersetzen */
  .category-page .btn-artlist-action.dropdown-toggle::after,
  .artlist-action--sort .dropdown-toggle::after {
    content: '';
    display: inline-block;
    width: 12px; height: 12px;
    margin-left: 4px;
    background: currentColor;
    -webkit-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><path fill='black' d='M8 11l-4-4h8z'/></svg>") no-repeat center / contain;
    mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><path fill='black' d='M8 11l-4-4h8z'/></svg>") no-repeat center / contain;
    border: 0 !important;
    vertical-align: middle;
    transition: transform 0.2s ease;
  }
  .category-page .btn-artlist-action[aria-expanded="true"]::after { transform: rotate(180deg); }
  /* Dropdown-Menu Apple-Style */
  .category-page .dropdown-menu,
  #dropdown-artlist-action-sort {
    background: #fff !important;
    border: 0 !important;
    border-radius: 14px !important;
    padding: 6px !important;
    box-shadow: 0 12px 32px rgba(0,0,0,0.12), 0 0 0 1px rgba(0,0,0,0.04) !important;
    min-width: 200px !important;
    margin-top: 8px !important;
  }
  .category-page .dropdown-item,
  #dropdown-artlist-action-sort .dropdown-item {
    border-radius: 8px !important;
    padding: 9px 14px !important;
    font: 500 13.5px/1.3 var(--mts-font) !important;
    color: var(--mts-text) !important;
    background: transparent !important;
    transition: background 0.15s ease, color 0.15s ease !important;
  }
  /* Dropdown-Eintrag ist Text auf hellem Hover-Grund -> Textton (Kette wie oben). */
  .category-page .dropdown-item:hover,
  .category-page .dropdown-item:focus {
    background: var(--mts-bg-soft) !important;
    color: var(--mts-accent-text, var(--mts-accent)) !important;
  }
  .category-page .dropdown-item[aria-selected="true"],
  .category-page .dropdown-item.active {
    background: var(--mts-text) !important;
    color: #fff !important;
  }
  /* View-mode Switcher — segmented Pill, KEINE Border */
  .category-page .view-mode-switcher, .category-page .product-view-switcher,
  .product-list-actions .btn-group,
  .artlist-action--viewmode .btn-group,
  .artlist-action-group--viewmode .btn-group {
    display: inline-flex; gap: 2px;
    background: var(--mts-bg-soft);
    border: 0;
    border-radius: 999px;
    padding: 3px;
  }
  .category-page .view-mode-switcher .btn,
  .category-page .product-view-switcher .btn,
  .product-list-actions .btn-group .btn,
  .artlist-action--viewmode .btn-group .btn,
  .artlist-action-group--viewmode .btn-group .btn {
    border-radius: 999px !important;
    border: 0 !important;
    background: transparent !important;
    color: var(--mts-text-muted) !important;
    width: 34px; height: 34px;
    padding: 0 !important;
    display: inline-flex; align-items: center; justify-content: center;
    transition: background 0.18s ease, color 0.18s ease !important;
  }
  .category-page .view-mode-switcher .btn:hover,
  .artlist-action-group--viewmode .btn-group .btn:hover {
    color: var(--mts-text) !important;
    background: rgba(0,0,0,0.04) !important;
  }
  .category-page .view-mode-switcher .btn.active,
  .category-page .product-view-switcher .btn.active,
  .product-list-actions .btn-group .btn.active,
  .artlist-action--viewmode .btn-group .btn.active,
  .artlist-action-group--viewmode .btn-group .btn.active {
    background: var(--mts-text) !important;
    color: #fff !important;
  }
  /* Total-Count "1-20 von 20" als dezenter Sub-Text */
  .category-page .product-count, .category-page .item-count,
  .category-page .listing-actions small, .category-page .listing-actions .count {
    color: var(--mts-text-muted) !important;
    font-size: 13px !important;
  }

  /* Pagination dezenter */
  .category-page .pagination .page-link, .category-page .pagination-container .page-link {
    background: transparent !important;
    border: 0 !important;
    color: var(--mts-text) !important;
    border-radius: 999px !important;
    min-width: 40px; height: 40px;
    padding: 0 12px !important;
    display: inline-flex; align-items: center; justify-content: center;
    margin: 0 2px;
  }
  .category-page .pagination .page-item.active .page-link {
    background: var(--mts-text) !important;
    color: #fff !important;
  }
  /* Seitenzahl ist Text auf hellem Hover-Grund -> Textton (Kette wie oben). */
  .category-page .pagination .page-link:hover {
    background: var(--mts-bg-soft) !important;
    color: var(--mts-accent-text, var(--mts-accent)) !important;
  }

  /* ===== ITER 8 PHASE A — Cards groesser, Borders raus, dezenter Hover-Lift =====
     - Keine 1px-Outline-Shadows mehr (User: "graue Borders weg")
     - Aspect 4:3 → 5:4 / 16:11 fuer mehr Bildflaeche bei gleicher Breite
     - Bildpadding von 18/22 auf 8/10 → Bilder fast vollflaechig
     - Hover-Lift weicher, Shadow weiter aber transparenter */
  .category-page .artlist .art, .product-list .artlist .art {
    box-shadow: none !important;
    background: #ffffff !important;
    border: 0 !important;
    outline: 0 !important;
    transition: transform 0.4s cubic-bezier(.22,.61,.36,1),
                box-shadow 0.4s cubic-bezier(.22,.61,.36,1) !important;
  }
  .category-page .artlist .art:hover, .product-list .artlist .art:hover {
    transform: translateY(-6px) !important;
    box-shadow: 0 24px 50px -12px rgba(0,0,0,0.14) !important;
  }
  /* Iter 9: 3-Spalten-Default → Cards sind breiter → Image-Aspect 4:3 ergibt
     mehr Bildhoehe als 5:4 / 16:11. Bei collapsed Filter (4 Spalten) bleibt
     4:3 ebenfalls passend. Minimaler Innenrand bleibt. */
  /* C6: groessere Bilddarstellung — Block hoeher (5/4) + Innenrand reduziert. */
  .category-page .art-picture-block,
  .product-list .art-picture-block { aspect-ratio: 5 / 4 !important; }
  .category-page .art-picture img,
  .product-list .art-picture img { padding: 2px 6px !important; }
  /* Auf sehr grossen Screens (4 Spalten) leicht flacher, sonst wirken die
     Cards zu hoch. */
  @media (min-width: 1800px) {
    .category-page .art-picture-block { aspect-ratio: 5 / 4 !important; }
  }
  /* DOPPEL-TITEL killen — `.art-description` direkt nach `.art-name` enthaelt
     denselben Text. Wir verstecken sie, behalten aber ALL anderen
     `.art-description` (z.B. wenn Smartstore irgendwo wirklich eine
     ShortDescription rendert). JS markiert dedup-Faelle mit
     `data-mts-dup-desc="1"` (sehr defensiv, exakter Text-Vergleich). */
  .artlist .art .art-description[data-mts-dup-desc="1"] { display: none !important; }
  /* Defensive Fallback: wenn der text identisch zum h3.art-name ist, hide
     ueber CSS auch ohne JS. Allerdings haben Smartstore-Cards ein Pattern
     wo `.art-description` IMMER == name ist (siehe DOM-Recon Iter 8) →
     daher per Default verstecken auf Listing-Seiten. Sollte ein Shop spaeter
     `ShortDescription` befuellen, kann ueber Topic-Override re-aktiviert werden. */
  .category-page .artlist .art .art-description,
  .product-list .artlist .art .art-description,
  .artlist .art > .art-description {
    display: none !important;
  }

  /* ===== ITER 15 PHASE A — Kategorie-/Listing-Karte: Text ZENTRIERT =====
     User: Titel + Marken-Logo auf der Kategorie-Seite mittig statt links-buendig.
     Nur Grid (`.category-page` / `.product-list`), Lines-View behaelt ihr eigenes
     links/rechts-Layout. Specificity `.category-page .artlist .art ...` (0,4,0)
     schlaegt die globalen `text-align:left !important`-Regeln (0,2,0). */
  .category-page .artlist .art .art-brand,
  .category-page .artlist .art .art-vendor,
  .product-list .artlist .art .art-brand,
  .product-list .artlist .art .art-vendor {
    text-align: center !important;
    /* display:block + text-align:center zentriert auch das inline-block Logo-IMG;
       als Flex-Fallback (falls JS ein Wrapper-Element setzt) zusaetzlich zentrieren. */
    display: flex !important;
    flex-direction: column !important;
    align-items: center !important;
    justify-content: center !important;
  }
  /* Marken-Logo (Bidex-IMG, .mts-brand-img) und Text-Span mittig. */
  .category-page .artlist .art .art-brand img.mts-brand-img,
  .category-page .artlist .art .art-vendor img.mts-brand-img,
  .product-list .artlist .art .art-brand img.mts-brand-img,
  .product-list .artlist .art .art-vendor img.mts-brand-img {
    margin-inline: auto !important;
  }
  .category-page .artlist .art .art-brand > span,
  .product-list .artlist .art .art-brand > span {
    text-align: center !important;
  }
  /* Titel zentriert (Block, Link und der innere Span). */
  .category-page .artlist .art .art-name,
  .category-page .artlist .art .art-name-link,
  .category-page .artlist .art .art-name a,
  .category-page .artlist .art .art-name span,
  .category-page .artlist .art .art-genericname,
  .product-list .artlist .art .art-name,
  .product-list .artlist .art .art-name-link,
  .product-list .artlist .art .art-name a,
  .product-list .artlist .art .art-name span,
  .product-list .artlist .art .art-genericname {
    text-align: center !important;
  }
  /* Lieferinfo (falls vorhanden) ebenfalls mittig — sonst wirkt sie versetzt. */
  .category-page .artlist .art .art-delivery-info,
  .product-list .artlist .art .art-delivery-info {
    text-align: center !important;
  }

  /* ===== ITER 15 PHASE B — Preis NAEHER an den Titel, PRO REIHE gleiche Hoehe =====
     Problem (User): zwischen Titel und Preis war global zu viel Luft, weil der
     Preis-Block per `margin-top:auto` (globale Regel ~512) IMMER an den Card-Boden
     geklebt wurde. Dadurch wirkte jede Karte so, als seien 2 Titelzeilen reserviert.

     Loesung OHNE globalen 2-Zeilen-Reserve:
       1) `margin-top:auto` am Preis-Block fuer die Grid-Ansicht zuruecknehmen
          (Preis sitzt damit direkt unter dem Titel-Block).
       2) Den TITEL-Block `flex:1 1 auto` geben → er fuellt die Rest-Hoehe der Karte.
          `.art` ist Flex-Spalte (~358) und die Flex-Wrap-Reihe streckt via
          `align-items:stretch` (~347) alle Karten auf die hoechste Karte der Reihe.
          => In einer Reihe mit EINEM 2-zeiligen Titel wachsen die 1-zeiligen Titel
             mit und schieben ihre Preise auf dieselbe Y-Linie (Preise reihen-aligned).
          => Reine 1-Zeilen-Reihen haben keinen Slack → Titel waechst nicht → KOMPAKT.
       3) Die Buttons (`.art-drop`) landen automatisch am Card-Boden, weil der Titel
          den gesamten Slack absorbiert (Summe der Kinder == Reihen-Hoehe).
     Hinweis: Slack sitzt bewusst UNTER dem Titel-Text (oben ausgerichtet), nicht
     ueber dem Preis als fixer Reserve — daher kein konstanter 2-Zeilen-Abstand mehr. */
  .category-page .artlist .art .art-name,
  .product-list .artlist .art .art-name {
    flex: 1 1 auto !important;
    min-height: auto !important;
  }
  .category-page .artlist .art .art-price-block,
  .product-list .artlist .art .art-price-block {
    /* margin-top:auto (global ~512) zuruecknehmen: Preis hugged jetzt den Titel. */
    margin-top: 0 !important;
  }

  /* ITER 8 PHASE F — Mobile-Card lesbarer + groessere Bilder
     User-Feedback: 2-spaltig BEIBEHALTEN aber Bilder massiv groesser, Schrift
     besser lesbar. Aspect 5:4 fuer mehr Bildflaeche. */
  @media (max-width: 559px) {
    .category-page .art-picture-block,
    .product-list .art-picture-block { aspect-ratio: 4 / 5 !important; }
    .category-page .art-picture img { padding: 6px 8px !important; }
    .category-page .art-name-link, .category-page .art-name a {
      font-size: 0.95rem !important;
      line-height: 1.3 !important;
      padding: 8px 14px 4px !important;
      font-weight: 600 !important;
    }
    .category-page .art-price-block { padding: 6px 14px 14px !important; }
    .category-page .art-price-block .art-price, .category-page .art-finalprice {
      font-size: 1.1rem !important;
      font-weight: 700 !important;
      color: var(--mts-text) !important;
    }
    .category-page .art-brand, .category-page .art-vendor {
      padding: 12px 14px 0 !important;
      font-size: 10px !important;
      letter-spacing: 0.1em;
    }
    .category-page .art-brand img.mts-brand-img,
    .category-page .art-vendor img.mts-brand-img {
      height: 18px !important;
    }
    .category-page .art-shortdesc, .category-page .art-genericname { padding: 2px 14px !important; font-size: 12px !important; }
    .category-page .art-drop { padding: 0 12px 12px !important; }
    /* Specs-Tags + Single-Size kompakter aber lesbar */
    .artlist .art .mts-card-specs {
      margin: 4px 14px 4px !important;
      gap: 4px !important;
      min-height: 52px !important; /* nur 2 Tags reservieren */
    }
    .artlist .art .mts-card-specs__tag {
      font-size: 10.5px !important;
      padding: 2px 7px !important;
    }
    .artlist .art .mts-card-singlesize {
      padding: 3px 10px 3px 8px !important;
      font-size: 0.65rem !important;
    }
    .artlist .art .mts-card-singlesize-slot { min-height: 26px !important; padding: 4px 14px 0 !important; }
    /* Hero-Tagline auf Mobile kleiner */
    .category-page .mts-cat-tagline { font-size: 1rem !important; padding: 0 16px; }
    .category-page .mts-cat-hero-rule { margin: 12px auto 24px !important; width: 44px !important; }
    /* Filter auf Mobile als Drawer (collapsible) — Smartstore hat oft ein Toggle */
    .category-page .col-lg-3, .category-page .col-md-3 {
      margin-bottom: 16px !important;
    }
  }
  /* Tablet 560-991 → 2 Spalten, etwas groesser */
  @media (min-width: 560px) and (max-width: 991px) {
    .category-page .art-picture-block { aspect-ratio: 5 / 4 !important; }
    .category-page .art-name-link, .category-page .art-name a {
      font-size: 1rem !important;
      padding: 8px 16px 4px !important;
    }
  }

  /* Reveal-Fallback: falls IntersectionObserver mal nichts triggert (z.B. Cookie-
     Modal blockt Viewport beim Init), zeige Karten nach 2.5s zwingend.
     CSS-only Pflicht, JS-Hook ist redundant aber existiert weiter unten. */
  @keyframes mts-reveal-fallback { to { opacity: 1; transform: none; } }
  .artlist .art { animation: mts-reveal-fallback 0.01s linear 2.5s forwards; }
  /* Wenn IO triggert, transition gewinnt visuell und animiert sauber */

  /* ===== PRODUCT DETAIL — full-bleed Container, breiter Image-Bereich,
     großer Gap, schmalere Info-Spalte ===== */
  body.product-details, body.product-page { background: #fff !important; }
  /* Container auf der Produktseite ECHT full-bleed: max 1760px, minimal Padding,
     so dass es wie ein eigener Block au\xdferhalb der normalen Section wirkt */
  body.product-details .container, .product-page .container,
  body.product-details .container.menubar-container,
  .product-page .container.menubar-container {
    max-width: 1760px !important;
    padding-left: 24px !important;
    padding-right: 24px !important;
    width: 100% !important;
  }
  /* Auf grossen Screens (>1800px) volle Breite ausnutzen */
  @media (min-width: 1800px) {
    body.product-details .container.menubar-container,
    .product-page .container.menubar-container {
      max-width: none !important;
      padding-left: 60px !important;
      padding-right: 60px !important;
    }
  }
  /* Row randlos, damit Thumbnails ganz nach links rutschen koennen */
  .pd-section .row, body.product-details .pd-section.row, .product-page .pd-section.row {
    margin-left: 0 !important;
    margin-right: 0 !important;
  }
  /* Bild-Spalte: 60% breit, links 0 padding (Thumbs ganz links), rechts 80px Gap */
  .pd-section .pd-data-col, .pd-section > .col-12:not(.pd-info-col),
  .product-page .pd-section .pd-data-col {
    flex: 0 0 60% !important;
    max-width: 60% !important;
    padding-left: 0 !important;
    padding-right: 80px !important;
    box-sizing: border-box !important;
  }
  /* Info-Spalte: 40% breit, mit grosszuegigem links-Padding statt Bootstrap-Default
     damit das Marken-Logo + Titel von der Bild-Spalte deutlich getrennt sind */
  .pd-section .pd-info-col, .pd-info-col {
    flex: 0 0 40% !important;
    max-width: 40% !important;
    padding-left: 0 !important;
    padding-right: 0 !important;
    box-sizing: border-box !important;
  }
  @media (max-width: 1100px) {
    .pd-section .pd-data-col, .pd-section .pd-info-col {
      flex: 0 0 50% !important;
      max-width: 50% !important;
      padding-right: 32px !important;
    }
  }
  @media (max-width: 900px) {
    /* Specificity match (3 classes) damit `.pd-section > .col-12:not(.pd-info-col)` (Desktop) ueberschrieben wird */
    .pd-section > .pd-data-col, .pd-section > .pd-info-col,
    .pd-section > .col-12:not(.pd-foo),
    .pd-section .pd-data-col.pd-data-col, .pd-section .pd-info-col.pd-info-col {
      flex: 0 0 100% !important;
      max-width: 100% !important;
      padding: 0 !important;
    }
  }
  /* Thumbnails-Cell ganz nach links — kein Inset im gal-box */
  .pd-data-col .gal-box, .pd-data-col .pd-data-col-inner > * { padding-left: 0 !important; margin-left: 0 !important; }
  .pd-data-col .gal-nav-cell { padding-left: 0 !important; margin-left: 0 !important; }

  /* Titel — kompakter, nicht mehr 48px. Specificity 1,2,0 mit body+.page-title
     damit es die generelle .page-title h1-Regel ueberschreibt. */
  .pd-name, .product-name, .product-page h1, body.product-details h1,
  body.product-details .page-title h1.pd-name,
  .page-title h1.pd-name {
    font-size: clamp(1.5rem, 2.4vw, 2.2rem) !important;
    line-height: 1.2 !important;
    margin: 0 0 14px 0 !important;
    font-weight: 700 !important;
    letter-spacing: -0.02em !important;
  }
  .pd-info, .product-info, .pd-group { padding: 10px 0 !important; }

  /* Thumbnail-Strip + Hauptbild ohne kuenstlichen Box-Look */
  .pd-thumbs, .pd-gallery-thumbs, .gallery-thumbs, .product-thumbnails {
    margin-right: 16px !important;
    gap: 8px !important;
  }
  .pd-image-section, .product-images, .pd-gallery {
    background: transparent !important;
    border-radius: var(--mts-radius) !important;
    padding: 24px !important;
    margin-bottom: 24px;
    margin-right: 16px !important;
  }
  /* Iter 10 Phase G — Thumbnails (Smartstore .gal-nav .gal-item) ohne Border,
     groesser, weiter aussen am Page-Rand.
     Markup: .gal-nav-cell > .gal-nav > .gal-list > .gal-track > .gal-item
              > a.gal-item-viewport > img.gal-item-content
     Default-Smartstore zieht hier border-1 + 3px gap auf 56x56.

     Iter 13 Phase B (Desktop):
     - vertical-align: top → middle auf gal-nav-cell (Smartstore .gal-box ist
       display:table, table-cells respektieren vertical-align)
     - .gal-nav (inner block) bekommt margin-left: -16px → Thumbs visuell
       weiter zum Page-Rand. Margin auf table-cells hat keinen Effekt, daher
       zwingend auf den inneren block.
     - .gal-cell (das rechte table-cell mit dem Hauptbild) bekommt padding-left,
       damit visuell mehr Gap zwischen Thumbs und Hauptbild entsteht.
       Recon Iter 12: thumb-content endete x=95, gal-cell startete x=105 → 10px Gap.
       Mit padding-left:32px auf gal-cell startet Bildinhalt bei x=137, Thumbs
       bei x=1 (-16) und enden bei x=79 → ~58px sichtbarer Gap. */
  body.product-details .pd-data-col .gal-nav-cell,
  .pd-data-col .gal-nav-cell {
    /* Margin auf table-cell ignoriert; vertical-align fuer mittig */
    padding-left: 0 !important;
    padding-right: 0 !important;
    vertical-align: middle !important;
  }
  body.product-details .pd-data-col .gal-nav-cell .gal-nav,
  .pd-data-col .gal-nav-cell .gal-nav {
    /* Iter 14 Phase D: Thumbs nicht abgeschnitten am Page-Rand.
       Iter 13 hatte -16px margin-left; das ergab x=1 firstThumb -> Active-State-
       Ring + Scale-Hover wurde von #content-wrapper{overflow-x:hidden} geclippt.
       -8px Position + 6px linkes Padding (im gal-nav) = sichtbarer Atemraum
       fuer Outline + Hover-Scale. */
    margin-left: -8px !important;
    padding-left: 6px !important;
    overflow: visible !important;
  }
  body.product-details .pd-data-col .gal-box > .gal-cell,
  .pd-data-col .gal-box > .gal-cell {
    /* Push Hauptbild nach rechts → visueller Gap zu den Thumbs */
    padding-left: 32px !important;
  }
  /* Iter 14 Phase D: alle Container ueber gal-nav muessen overflow:visible
     haben sonst clipt der Active-State-Ring. */
  body.product-details .pd-data-col .gal-box,
  body.product-details .pd-data-col .gal-nav-cell,
  body.product-details #pd-gallery,
  body.product-details #pd-gallery-container,
  body.product-details #pd-gallery-container-inner,
  body.product-details .pd-data-col-inner,
  .pd-data-col .gal-box,
  .pd-data-col .gal-nav-cell {
    overflow: visible !important;
  }
  /* Iter 15 Phase B — Thumbnails AUSSERHALB der Produkt-Bild-Section.
     User: "die thumbnails immernoch direkt neben dem produktbild sollte aber
     ausserhalb davon sein leben der produktbild section".

     Recon (Iter 15, viewport 1440):
       body 0..1440, productPage 32..1408, pd-data-col 17..861 (844 breit),
       gal-box 17..781 (764 breit), pd-info-col 861..1423.
     Es gibt KEINE freie linke Margin auf der Page (productPage startet bei x=32).
     Das heisst "ausserhalb der Section" = innerhalb der pd-data-col, aber LINKS
     vom Bild (statt zwischen Bild und Info-Col). Iter 13/14 hatten Thumbs ~95-110
     vom Bildrand, also visuell ZUR Bild-Section gehoerig. Jetzt:
       - gal-box wechselt von display:table zu display:block
       - gal-nav-cell wird position:absolute, links innerhalb der gal-box
         (left:0, top vertikal mittig zur ganzen gal-box-Hoehe)
       - gal-cell (Hauptbild) bekommt padding-left:110px (88 Thumbs + 22 Gap)
         damit es rechts vom Thumbs-Block beginnt.
     Effekt: die Thumbs leben links AUSSEN am Rand der Bild-Section, das Bild
     selbst rueckt nach rechts. Visuell wirkt das wie "Thumbs vor der Section".

     Unter 1281px (Tablet/Mobile/kleine Desktops) bleibt das Original-Verhalten
     der Iter 13/14 (Thumbs inside table-layout). */
  @media (min-width: 1281px) {
    body.product-details .pd-data-col #pd-gallery-container-inner,
    .pd-data-col #pd-gallery-container-inner {
      position: relative !important;
    }
    body.product-details .pd-data-col .gal-box,
    .pd-data-col .gal-box {
      display: block !important;
      position: relative !important;
      min-height: 500px;
    }
    body.product-details .pd-data-col .gal-box > .gal-nav-cell,
    .pd-data-col .gal-box > .gal-nav-cell {
      display: block !important;
      position: absolute !important;
      left: 0 !important;
      top: 50% !important;
      transform: translateY(-50%) !important;
      width: 88px !important;
      height: auto !important;
      max-height: 100% !important;
      padding-left: 0 !important;
      padding-right: 0 !important;
      margin-left: 0 !important;
      vertical-align: top !important;
      z-index: 2;
    }
    body.product-details .pd-data-col .gal-box > .gal-cell,
    .pd-data-col .gal-box > .gal-cell {
      display: block !important;
      width: 100% !important;
      /* 88px Thumbs + 28px sichtbarer Gap = 116px linker Innenabstand */
      padding-left: 116px !important;
    }
    body.product-details .pd-data-col .gal-nav-cell .gal-nav,
    .pd-data-col .gal-nav-cell .gal-nav {
      margin-left: 0 !important;
      padding-left: 0 !important;
    }
  }

  /* Iter 23 — PDP-Thumbs Conditional Hide.
     Wenn ein Produkt nur EIN Bild hat, soll die Thumbnail-Spalte komplett
     verschwinden und das Hauptbild den freien Slot einnehmen.

     Smartstore selbst markiert die Thumb-Spalte mit
       <div class="gal-nav-cell gal-nav-hidden">
     sobald das Track-Item-Set (.gal-nav .gal-item) nicht mehr als ein
     Element enthaelt. Diese native Klasse haben wir in Iter 13/15 versehent-
     lich mit display:block !important ueberschrieben — hier wird sie wieder
     respektiert.

     Doppelter Trigger fuer Robustheit:
       1) `.gal-nav-cell.gal-nav-hidden`     (Smartstore-nativer Pfad)
       2) `:not(:has(.gal-nav .gal-item:nth-child(2)))` (CSS-only Fallback,
          falls Smartstore die Klasse mal nicht setzt; :has() ab Safari 15.4 /
          Chrome 105 / Firefox 121).

     Bei aktivem Hide laeuft die `.gal-cell` (Hauptbild) wieder mit
     padding-left:0, damit das Bild die volle Breite der Section bekommt
     und kein leerer 116px-Slot uebrig bleibt. Reine CSS-Loesung, kein JS. */
  body.product-details .pd-data-col .gal-nav-cell.gal-nav-hidden,
  .pd-data-col .gal-nav-cell.gal-nav-hidden,
  body.product-details .pd-data-col .gal-box:not(:has(.gal-nav .gal-item:nth-child(2))) .gal-nav-cell,
  .pd-data-col .gal-box:not(:has(.gal-nav .gal-item:nth-child(2))) .gal-nav-cell {
    display: none !important;
  }
  /* Hauptbild: Padding-Reset, sobald Thumbs versteckt sind. Greift sowohl im
     Desktop-Override (padding-left:116px) als auch im Iter 13 Phase B Default
     (padding-left:32px). */
  @media (min-width: 1281px) {
    body.product-details .pd-data-col .gal-box:has(.gal-nav-cell.gal-nav-hidden) > .gal-cell,
    body.product-details .pd-data-col .gal-box:not(:has(.gal-nav .gal-item:nth-child(2))) > .gal-cell,
    .pd-data-col .gal-box:has(.gal-nav-cell.gal-nav-hidden) > .gal-cell,
    .pd-data-col .gal-box:not(:has(.gal-nav .gal-item:nth-child(2))) > .gal-cell {
      padding-left: 0 !important;
    }
  }
  body.product-details .pd-data-col .gal-box:has(.gal-nav-cell.gal-nav-hidden) > .gal-cell,
  body.product-details .pd-data-col .gal-box:not(:has(.gal-nav .gal-item:nth-child(2))) > .gal-cell,
  .pd-data-col .gal-box:has(.gal-nav-cell.gal-nav-hidden) > .gal-cell,
  .pd-data-col .gal-box:not(:has(.gal-nav .gal-item:nth-child(2))) > .gal-cell {
    padding-left: 0 !important;
  }

  body.product-details .pd-data-col .gal-nav .gal-item,
  .pd-data-col .gal-nav .gal-item {
    border: 0 !important;
    background: transparent !important;
    padding: 0 !important;
    margin: 0 0 6px 0 !important;
    /* Iter 11 Fix 3 — Container auf 78x78 fixieren, damit innenliegende
       Smartstore-Default-Width von 56-68px nicht durchschlaegt. */
    width: 78px !important;
    height: 78px !important;
    box-sizing: border-box !important;
  }
  body.product-details .pd-data-col .gal-nav .gal-item-viewport,
  .pd-data-col .gal-nav .gal-item-viewport {
    border: 0 !important;
    border-radius: 12px !important;
    overflow: hidden;
    /* Iter 14 Phase D: weiche Apple-Style Transition fuer Hover/Active */
    transition: transform 0.2s cubic-bezier(.22,.61,.36,1), box-shadow 0.2s ease, outline-color 0.2s ease;
    /* Viewport ebenfalls auf volle Item-Groesse */
    width: 78px !important;
    height: 78px !important;
    display: block !important;
    outline: 2px solid transparent;
    outline-offset: 2px;
  }
  /* Iter 14 Phase D: Hover-State subtil — leichte Soft-Shadow + minimales Scale.
     Inactive-State hat KEINE Border (User: "modernes" + clean) */
  body.product-details .pd-data-col .gal-nav .gal-item:hover .gal-item-viewport,
  body.product-details .pd-data-col .gal-nav .gal-item .gal-item-viewport:hover,
  .pd-data-col .gal-nav .gal-item:hover .gal-item-viewport {
    transform: translateY(-1px);
    box-shadow: 0 4px 14px -4px rgba(0,0,0,0.18);
  }
  /* Iter 14 Phase D: Active-State modern — Outline mit Offset + Scale + Soft-Shadow.
     Iter 11/13 hatte nur 2px box-shadow als Border-Replacement; User wuenscht
     "anders und moderner schoene". Apple-Selected-Look = Ring mit Atemraum + leichtem Lift. */
  body.product-details .pd-data-col .gal-nav .gal-item[aria-selected="true"] .gal-item-viewport,
  body.product-details .pd-data-col .gal-nav .gal-item .gal-item-viewport[aria-selected="true"],
  .pd-data-col .gal-nav a.gal-item-viewport[aria-selected="true"] {
    /* outline + offset = Apple-Ring; box-shadow weg, sonst Doppel-Effekt */
    outline: 2px solid var(--mts-text) !important;
    outline-offset: 3px !important;
    box-shadow: 0 6px 20px -6px rgba(0,0,0,0.22) !important;
    transform: scale(1.04);
  }
  body.product-details .pd-data-col .gal-nav .gal-item-viewport img,
  .pd-data-col .gal-nav .gal-item-viewport img,
  .pd-data-col .gal-nav .gal-item img.gal-item-content {
    width: 78px !important;
    height: 78px !important;
    object-fit: cover !important;
    border-radius: 10px !important;
    display: block !important;
  }

  /* Pd-Offer + Smartstore-Default-Geschwister: KEIN Hintergrund, KEINE Borders.
     User: "ueber dem preis sind auch zwei komische linien die nicht da sein sollten".
     WICHTIG: NUR Smartstore-Klassen, NICHT meine eigenen .mts-pd-* Bloecke
     (sonst wird ihr Hintergrund/Border auch genullt). */
  .pd-offer, .pd-offer-section, .pd-offer-actions-container,
  .pd-buy-section, .pd-price-box, .pd-price-section,
  .pd-info-col .pd-info, .pd-info-col .pd-info-block,
  .pd-info-col .pd-attrs-container,
  .pd-info-col .pd-attribute-row,
  .pd-info-col .pd-actions-container,
  .pd-info-col .pd-group {
    background: transparent !important;
    border-top: 0 !important;
    border-bottom: 0 !important;
    box-shadow: none !important;
  }
  .pd-offer { padding: 8px 0 0 !important; margin: 0 !important; }
  .pd-attrs-container { padding: 0 !important; margin: 0 !important; }
  /* Iter 11 Fix 2 — PDP Title->Preis Gap (war 76px, Ziel 6-8px).
     - leere pd-attrs-container ausblenden (28px Box mit nur Whitespace,
       :empty matcht das NICHT, daher :has(> *) als Fallback + JS-Hide weiter unten)
     - h1.pd-name margin-bottom auf 8px (existierende Regel mit !important
       hatte 4px gesetzt — wir ueberschreiben mit hoeherer Spezifitaet)
     - pd-finalprice kein top-margin
     Body-scoped damit andere Layouts (z. B. Listing) nicht betroffen sind. */
  /* WICHTIG: Smartstore setzt KEINE body.product-details-Klasse!
     Stattdessen liegt der Wrapper-Div .product-details-page.
     Body hat nur lyt-cols-1. */
  .product-details-page .pd-info-col .pd-attrs-container:empty,
  .product-details-page .pd-info-col .pd-attrs-container:not(:has(> *)),
  .product-details-page .pd-info-col .pd-attrs-container[data-mts-empty="1"] {
    display: none !important;
    height: 0 !important;
    margin: 0 !important;
    padding: 0 !important;
    border: 0 !important;
  }
  .product-details-page .pd-info-col h1.pd-name,
  .product-details-page .pd-info-col .page-title h1.pd-name,
  .product-details-page .pd-info .page-title h1.pd-name {
    margin-bottom: 8px !important;
  }
  .product-details-page .pd-finalprice,
  .product-details-page .pd-offer .pd-finalprice,
  .product-details-page .pd-offer-price .pd-finalprice {
    margin-top: 0 !important;
  }
  .product-details-page .pd-offer { padding-top: 0 !important; }
  /* Iter 11 Fix 2 (Refinement) — pd-group hat global padding:10px 0; im
     pd-offer-Kontext fuegt das 20px ueber den Preis-Block an. Selektiv nullen. */
  .product-details-page .pd-offer .pd-group,
  .product-details-page .pd-offer-price .pd-group,
  .product-details-page .pd-offer-price-container .pd-group {
    padding: 0 !important;
  }
  /* pd-info-col gap auf 0 (war 8px) damit Title-zu-Preis enger.
     Whitespace wird durch h1.mb (8px) und pd-info.mb erzeugt. */
  .product-details-page .pd-info-col {
    gap: 0 !important;
  }
  /* pd-info margin-bottom = 0 — direkter Anschluss zum Preis */
  .product-details-page .pd-info {
    margin-bottom: 0 !important;
  }
  /* h1 margin-bottom auf 6px (war 8px) — finetune Richtung Ziel 6-8px */
  .product-details-page h1.pd-name,
  .product-details-page .page-title h1.pd-name,
  .product-details-page .pd-info .page-title h1.pd-name {
    margin-bottom: 6px !important;
  }
  /* page-title: kein bottom-margin */
  .product-details-page .pd-info .page-title {
    margin-bottom: 0 !important;
    padding-bottom: 0 !important;
  }

  /* Iter 10 Phase E — pd-info kompakter:
     - margin-bottom 18px -> 6px (Title naeher zum Preis-Block)
     - kein top-padding (User: "anbieterlogo + produkttitel nach oben schieben")
     pd-info-col selbst hat aktuell 16px padding-top im Mobile-Override; Desktop
     hat 0 padding-left. Wir nehmen den Brand-Block-margin-bottom auch runter. */
  .pd-info { padding: 0 !important; margin: 0 0 6px 0 !important; }
  .pd-info-col .pd-info .pd-brand-block { margin: 0 0 6px 0 !important; }
  .pd-info-col .pd-info > * { margin-bottom: 4px !important; }
  /* Title kompakter Bottom-Margin damit Preis enger anschliesst */
  .pd-info .page-title { margin: 0 !important; padding: 0 !important; }
  body.product-details .page-title h1.pd-name,
  .pd-info-col .page-title h1.pd-name,
  .page-title h1.pd-name {
    margin: 0 0 4px 0 !important;
  }
  /* pd-info-col gap reduzieren: war 14px, jetzt 8px */
  .pd-section .pd-info-col, .pd-info-col {
    gap: 8px !important;
  }
  /* zoom-window-container minimieren wenn leer (kein order-Slot blockieren) */
  .pd-info-col .zoom-window-container:empty { display: none !important; height: 0 !important; }

  /* Info-Col als Flex-Column damit wir die Review-Section UNTER die Kauf-Section
     verschieben koennen. Iter 10 Phase E: gap auf 8px (war 14px) damit Brand,
     Title, Preis enger zusammen sitzen (User-Feedback). */
  .pd-info-col {
    display: flex !important;
    flex-direction: column !important;
    gap: 8px !important;
  }
  .pd-info-col .zoom-window-container { order: 0 !important; }
  /* Neue Elemente: Leasing-Anbieter-Link ganz oben */
  .pd-info-col .mts-pd-providers-link { order: 0 !important; }

  /* Iter 13 Phase A — Brand-Logo soll vertikal auf gleicher Hoehe wie der
     "Leasing-Anbieter suchen"-Link starten (User-Feedback Iter 13).
     Vorher: providers-link nahm 32px+8px Gap im flex-flow → brand begann y=314,
     providers y=274 → 40px Differenz.
     Loesung: providers-link aus flex-flow nehmen via position:absolute top-right.
     Damit rueckt brand-block + alles darunter um 40px nach oben.
     Body-class .product-details-page als Scope, plus position:relative auf
     pd-info-col als Anchor. Nur Desktop — Mobile-Override unten setzt
     position:static via order:-1. */
  .product-details-page .pd-info-col {
    position: relative !important;
  }
  .product-details-page .pd-info-col .mts-pd-providers-link {
    position: absolute !important;
    top: 0 !important;
    right: 0 !important;
    margin: 0 !important;
    z-index: 2;
  }
  .pd-info-col .pd-info { order: 1 !important; }
  .pd-info-col .pd-attrs-container { order: 2 !important; }
  .pd-info-col .pd-offer { order: 3 !important; }
  /* Neue Elemente nach Cart-Button */
  .pd-info-col .mts-pd-countdown { order: 4 !important; }
  .pd-info-col .mts-pd-cta-row { order: 5 !important; }
  .pd-info-col .mts-pd-jobrad { order: 6 !important; }
  .pd-info-col .pd-review-summary { order: 7 !important; padding-top: 16px !important; }
  /* Review-Summary visuell dezent */
  .pd-review-summary { background: transparent !important; }
  /* Bewertungs-Link ist Text auf weißer PDP-Spalte -> Textton (Kette wie oben). */
  .pd-review-summary .pd-review-link { color: var(--mts-accent-text, var(--mts-accent)) !important; font-weight: 500; }

  /* Brand + Title visuell zusammenfassen ohne Trennstriche */
  .pd-info-col .pd-info > * { margin-bottom: 8px !important; }

  /* Leere Smartstore-Subkomponenten kollabieren (verhindert grosse
     Whitespace-Bloecke zwischen Preis und MwSt.-Zeile auf Mobile) */
  .pd-tierprices:empty, .pd-stock-info-container:empty,
  .pd-variants-container:empty, .pd-attrs-container:empty,
  .pd-group:empty, .pd-tierprices > .pd-group:empty {
    display: none !important;
    height: 0 !important;
    margin: 0 !important;
    padding: 0 !important;
  }
  .pd-offer-price > .pd-group { margin: 0 !important; }
  .pd-price-group { margin-bottom: 4px !important; }
  .pd-legalinfo { font-size: 13px; color: var(--mts-text-muted) !important; margin: 0 !important; }

  /* === NEUE PRODUKTE-SEITEN-BLOECKE (vom JS injiziert) === */

  /* Leasing-Anbieter-suchen Link oben rechts in der Info-Spalte */
  .mts-pd-providers-link {
    display: inline-flex; align-items: center; gap: 8px;
    align-self: flex-end;
    color: var(--mts-text); text-decoration: none;
    font-size: 14px; font-weight: 500;
    padding: 6px 0;
    cursor: pointer;
    transition: color 0.18s ease;
  }
  /* Unterstrichener Link auf Weiß, 14 px -> Textton (Kette wie oben). */
  .mts-pd-providers-link:hover { color: var(--mts-accent-text, var(--mts-accent)); text-decoration: underline; }
  .mts-pd-providers-link svg { width: 18px; height: 18px; flex-shrink: 0; }

  /* Bestelle-in-den-naechsten Countdown Block */
  .mts-pd-countdown {
    background: var(--mts-bg-soft);
    border-radius: 14px;
    padding: 16px 20px;
    text-align: center;
    line-height: 1.5;
    margin: 6px 0 0;
  }
  .mts-pd-countdown__label {
    display: inline-flex; align-items: center; gap: 8px;
    font-size: 14px; color: var(--mts-text);
    margin-bottom: 4px;
  }
  .mts-pd-countdown__label svg { width: 16px; height: 16px; color: var(--mts-text-muted); }
  .mts-pd-countdown__time { font-weight: 700; color: var(--mts-text); }
  .mts-pd-countdown__delivery {
    color: #15803d;
    font-weight: 600;
    font-size: 14px;
    margin-top: 4px;
  }

  /* CTA-Row: Leasing Anfrage + Bestpreis Anfrage Buttons nebeneinander */
  .mts-pd-cta-row {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 12px;
    margin-top: 4px;
  }
  .mts-pd-cta-btn {
    display: inline-flex; align-items: center; justify-content: center; gap: 8px;
    padding: 14px 18px;
    border-radius: 12px;
    border: 1px solid var(--mts-line);
    background: #fff;
    color: var(--mts-text);
    font-weight: 600; font-size: 14px;
    cursor: pointer;
    transition: all 0.2s ease;
    text-decoration: none;
  }
  .mts-pd-cta-btn:hover { transform: translateY(-1px); box-shadow: var(--mts-shadow-soft); }
  .mts-pd-cta-btn svg { width: 18px; height: 18px; flex-shrink: 0; }
  .mts-pd-cta-btn--leasing { color: #047857; border-color: rgba(4, 120, 87, 0.3); }
  .mts-pd-cta-btn--leasing:hover { background: rgba(4, 120, 87, 0.06); border-color: #047857; }
  .mts-pd-cta-btn--bestpreis { color: #b91c1c; border-color: rgba(185, 28, 28, 0.3); }
  .mts-pd-cta-btn--bestpreis:hover { background: rgba(185, 28, 28, 0.06); border-color: #b91c1c; }

  /* JobRad-Block (gruener Hervor-Banner) */
  .mts-pd-jobrad {
    background: linear-gradient(135deg, #00A651 0%, #007e3d 100%);
    color: #fff;
    border-radius: 14px;
    padding: 18px 20px;
    display: flex; align-items: center; gap: 14px;
    cursor: pointer;
    transition: transform 0.2s ease;
  }
  .mts-pd-jobrad:hover { transform: translateY(-2px); }
  .mts-pd-jobrad__icon {
    width: 44px; height: 44px;
    background: rgba(255,255,255,0.18);
    border-radius: 10px;
    display: flex; align-items: center; justify-content: center;
    flex-shrink: 0;
  }
  .mts-pd-jobrad__icon svg { width: 22px; height: 22px; color: #fff; }
  .mts-pd-jobrad__text { flex: 1; }
  .mts-pd-jobrad__title { font-weight: 700; font-size: 15px; line-height: 1.2; }
  .mts-pd-jobrad__sub { font-size: 12px; opacity: 0.85; margin-top: 2px; }

  /* Modal-Overlay fuer Leasing/Bestpreis/Anbieter-Modals */
  .mts-pd-modal-backdrop {
    position: fixed; inset: 0; z-index: 9998;
    background: rgba(0,0,0,0.6);
    display: flex; align-items: center; justify-content: center;
    padding: 20px;
    opacity: 0; visibility: hidden;
    transition: opacity 0.2s ease, visibility 0.2s ease;
  }
  .mts-pd-modal-backdrop.is-open { opacity: 1; visibility: visible; }
  .mts-pd-modal {
    background: #fff;
    border-radius: var(--mts-radius);
    max-width: 540px; width: 100%;
    max-height: 90vh; overflow-y: auto;
    padding: 32px;
    box-shadow: 0 30px 60px rgba(0,0,0,0.3);
    transform: translateY(20px) scale(0.97);
    transition: transform 0.25s ease;
  }
  .mts-pd-modal-backdrop.is-open .mts-pd-modal { transform: none; }
  .mts-pd-modal h3 { font-size: 1.5rem; font-weight: 700; margin: 0 0 8px; letter-spacing: -0.02em; }
  .mts-pd-modal p { color: var(--mts-text-muted); margin: 0 0 20px; line-height: 1.5; }
  .mts-pd-modal__close {
    position: absolute; top: 14px; right: 14px;
    width: 36px; height: 36px;
    background: var(--mts-bg-soft); border: 0; border-radius: 50%;
    cursor: pointer;
    display: flex; align-items: center; justify-content: center;
    font-size: 18px;
  }
  .mts-pd-modal__form { display: flex; flex-direction: column; gap: 12px; }
  .mts-pd-modal__form input, .mts-pd-modal__form textarea {
    padding: 12px 14px;
    border: 1px solid var(--mts-line);
    border-radius: 10px;
    font-size: 14px;
    font-family: inherit;
    background: #fff;
  }
  .mts-pd-modal__form input:focus, .mts-pd-modal__form textarea:focus {
    outline: 0; border-color: var(--mts-accent);
    box-shadow: 0 0 0 3px rgba(var(--mts-c-primary-rgb),0.18);
  }
  .mts-pd-modal__submit {
    background: var(--mts-accent); color: #fff;
    border: 0; border-radius: 12px;
    padding: 14px 20px;
    font-weight: 600; cursor: pointer;
    margin-top: 4px;
  }
  .mts-pd-modal__submit:hover { background: var(--mts-accent-hover); }

  /* TASK-119: Filial-Verfuegbarkeits-/Reserve-Liste im Modal */
  .mts-fil-list { display: grid; gap: 10px; margin: 16px 0 0; }
  .mts-fil-loading, .mts-fil-empty, .mts-fil-error {
    color: var(--mts-text-muted); font-size: 14px; margin: 8px 0;
  }
  .mts-fil-error { color: #b91c1c; }
  .mts-fil-card {
    border: 1px solid var(--mts-line); border-radius: 14px;
    padding: 14px 16px; background: #fff;
  }
  .mts-fil-card.is-current { border-color: var(--mts-accent); box-shadow: 0 0 0 2px rgba(var(--mts-c-primary-rgb),0.14); }
  .mts-fil-card__head { display: flex; align-items: center; justify-content: space-between; gap: 10px; flex-wrap: wrap; }
  .mts-fil-state { display: inline-flex; align-items: center; gap: 8px; font-size: 13px; font-weight: 600; color: #1f2937; }
  .mts-fil-dot { width: 9px; height: 9px; border-radius: 50%; background: #9ca3af; flex: 0 0 auto; }
  .mts-fil-card--in .mts-fil-dot { background: #16a34a; }
  .mts-fil-card--low .mts-fil-dot { background: #d97706; }
  .mts-fil-card--out .mts-fil-dot { background: #dc2626; }
  .mts-fil-card--unknown .mts-fil-dot { background: #9ca3af; }
  .mts-fil-qty { font-weight: 500; color: var(--mts-text-muted); margin-left: 4px; }
  .mts-fil-badges { display: inline-flex; gap: 6px; flex-wrap: wrap; }
  .mts-fil-badge { font-size: 11px; font-weight: 600; padding: 2px 8px; border-radius: 999px; }
  /* 11-px-Pillentext auf 12-Prozent-Tint, also praktisch Weiß -> Textton (Kette wie oben). */
  .mts-fil-badge--current { background: rgba(var(--mts-c-primary-rgb),0.12); color: var(--mts-accent-text, var(--mts-accent)); }
  .mts-fil-badge--primary { background: #eef2ff; color: #4338ca; }
  .mts-fil-name { font-size: 15px; font-weight: 700; margin: 10px 0 2px; letter-spacing: -0.01em; }
  .mts-fil-addr { font-size: 13px; color: var(--mts-text-muted); margin: 0 0 10px; }
  .mts-fil-actions { display: flex; flex-direction: column; gap: 6px; }
  .mts-fil-btn {
    display: inline-flex; align-items: center; justify-content: center;
    font-size: 14px; font-weight: 600; border: 0; border-radius: 10px;
    padding: 11px 16px; cursor: pointer; text-decoration: none;
  }
  .mts-fil-btn--primary { background: var(--mts-accent); color: #fff; }
  .mts-fil-btn--primary:hover { background: var(--mts-accent-hover); }
  .mts-fil-btn--primary:disabled { opacity: 0.6; cursor: default; }
  .mts-fil-btn--ghost { background: #f3f4f6; color: #1f2937; }
  .mts-fil-btn--static { cursor: default; }
  .mts-fil-btn--disabled { background: #f3f4f6; color: #9ca3af; cursor: not-allowed; }
  .mts-fil-err { font-size: 13px; color: #b91c1c; margin-top: 4px; }
  .mts-fil-success { text-align: center; padding: 4px 0; color: #065f46; }
  .mts-fil-success svg { color: #16a34a; }
  .mts-fil-success h5 { font-size: 15px; font-weight: 700; margin: 6px 0 4px; }
  .mts-fil-success p { font-size: 13px; color: #1f2937; margin: 0 0 4px; }
  .mts-fil-success__sub { color: var(--mts-text-muted) !important; }

  /* Anbieter-Modal-Liste */
  .mts-pd-providers-list {
    display: grid; gap: 8px;
    margin: 16px 0 0;
  }
  .mts-pd-provider-item {
    display: flex; align-items: center; gap: 12px;
    padding: 12px 14px;
    border: 1px solid var(--mts-line);
    border-radius: 12px;
    text-decoration: none;
    color: var(--mts-text);
    transition: all 0.18s ease;
  }
  .mts-pd-provider-item:hover { border-color: var(--mts-accent); background: rgba(var(--mts-c-primary-rgb),0.04); }
  .mts-pd-provider-item__name { font-weight: 600; }
  .mts-pd-provider-item__sub { font-size: 12px; color: var(--mts-text-muted); margin-top: 2px; }
  .pd-image-section img, .product-images img, .pd-gallery img { border-radius: var(--mts-radius) !important; object-fit: contain !important; }
  .pd-finalprice, .pd-finalprice-amount, .pd-offer-price, .product-price, .product-page .price {
    font-family: var(--mts-font-display) !important;
    font-size: clamp(1.8rem, 3.5vw, 2.6rem) !important;
    font-weight: 700 !important; color: var(--mts-text) !important;
    letter-spacing: -0.02em;
  }
  .pd-attrs, .pd-attribute, .product-attribute-row, .pd-attrs-container { padding: 14px 0 !important; border-bottom: 1px solid var(--mts-line); }
  .pd-tabs .nav-link, .nav-tabs .nav-link { font-weight: 600 !important; color: var(--mts-text-muted) !important; border: 0 !important; padding: 14px 22px !important; border-radius: 999px !important; background: transparent !important; }
  .pd-tabs .nav-link.active, .nav-tabs .nav-link.active { background: var(--mts-text) !important; color: #fff !important; }
  .pd-tabs, .nav-tabs { border-bottom: 0 !important; gap: 8px; }
  #pd-add-to-cart, .add-to-cart-button, .pd-buy-section .btn-primary, .pd-offer-actions-container .btn-primary { padding: 16px 36px !important; font-size: 16px !important; }
  .pd-actions-container .pd-action-link { color: var(--mts-text-muted) !important; }
  /* Aktions-Link ("merken", "fragen?") ist Text auf Weiß -> Textton (Kette wie oben). */
  .pd-actions-container .pd-action-link:hover { color: var(--mts-accent-text, var(--mts-accent)) !important; }
  /* Compare-Restore (b1): nativer Smartstore-PDP-Compare-Link bleibt sichtbar
     in der .pd-actions-Row (neben "merken" / "fragen?"), mit nativem SVG.
     Die P13-Hides wurden entfernt. */
  .pd-rating-box, .pd-review-link { font-size: 13px; color: var(--mts-text-muted) !important; }

  /* Stock universal */
  .stock-availability, .availability-text {
    display: inline-flex; align-items: center; gap: 8px;
    font-size: 14px !important; font-weight: 500 !important;
    padding: 6px 12px; border-radius: 999px; background: rgba(21,128,61,0.1); color: #15803d !important;
  }
  .stock-availability.out-of-stock, .availability-text.unavailable { background: rgba(156,163,175,0.15); color: #6b7280 !important; }

  /* ===== CART ===== */
  .cart-list, .order-summary { background: #fff !important; border-radius: var(--mts-radius-lg) !important; border: 0 !important; padding: 24px !important; box-shadow: var(--mts-shadow-soft); }
  .cart-row { border-bottom: 1px solid var(--mts-line) !important; padding: 24px 0 !important; }
  .cart-row:last-child { border-bottom: 0 !important; }
  .order-summary-content, .cart-summary, .totals { background: var(--mts-bg-soft) !important; border-radius: var(--mts-radius-lg) !important; padding: 28px !important; }
  .quantity-input, input[type='number'] { border-radius: 12px !important; border: 1px solid var(--mts-line) !important; padding: 8px 12px !important; }

  /* ===== HOMEPAGE-WIDGETS ===== */
  .home > * { background: transparent !important; }
  .home .heading-title { font-size: clamp(1.6rem, 3vw, 2.4rem) !important; }
  .home .product-grid-home-page, .home .product-grid { padding: 80px 0 !important; }
  .home .manufacturer-grid { display: none !important; }
  /* Smartstore-Default-Page-Title ('Willkommen bei Move To Shop') auf Home unsichtbar */
  .home-page .topic-html-content > .block-title, .home-page .block-title { display: none !important; }
  .home-page .topic-html-content { margin-top: 0 !important; margin-bottom: 0 !important; }
  /* iPad-Round-2 P9: kein weisses Bottom-Padding der Homepage-Content-Wrapper
     bis zum Footer -> nahtloser Uebergang von der dunklen CTA-Sektion. */
  body.home .page.home-page,
  body.home .home-page > .page-body,
  body.home .home-page .page-body,
  body.home .home-page .more-less,
  body.home .home-page .more-block,
  body.home .home-page .mts-store,
  body.home .home-page .topic-html-content,
  body.home .home-page .topic-html-content-body,
  body.home .page-main .container {
    margin-bottom: 0 !important;
    padding-bottom: 0 !important;
  }
  /* Default 'Top-Warengruppen'-Heading auf Home (CategoryHomePageBlock) ausblenden */
  .home .artlist-homepage-categories, .home .product-grid-home-page > .heading { display: none !important; }
  /* Listing/Category Page-Header background grau weg */
  .page-header, .cat-page > .page-header, .category-page > .page-header { background: #fff !important; padding: 16px 0 !important; }
  /* Theme-Selector im Footer hide (CSS-Backup zur Setting) */
  footer .theme-selector, footer #theme-selector, footer .footer-block-theme, footer .theme-block { display: none !important; }
  footer h5:has(+ * .theme-selector), footer h4:has(+ * .theme-selector) { display: none !important; }
  /* Konkret bei Smartstore Flex Theme: Themes-Heading & Dropdown */
  footer .footer-services > div:has(.theme-selector), footer-newsletter ~ * + * { }
  /* GDPR-Hinweis-Text in Newsletter sollte sichtbar sein (war weiss auf weiss) */
  footer .footer-newsletter .newsletter-disclaimer, footer .footer-newsletter label { color: rgba(255,255,255,0.7) !important; }

  /* Recently viewed bigger */
  .product-grid-recently-viewed-products, .recently-viewed-block { padding: 80px 0 !important; }
  .product-grid-recently-viewed-products .heading-title, .recently-viewed-block .heading-title { font-size: clamp(1.8rem, 3vw, 2.4rem) !important; margin-bottom: 40px !important; }

  /* ===== FORMS ===== */
  .form-control, input[type='text'], input[type='email'], input[type='tel'], input[type='password'], textarea, select {
    border-radius: 14px !important;
    border: 1px solid var(--mts-line) !important;
    padding: 12px 16px !important;
    font-size: 15px !important;
    transition: all 0.18s ease;
    background: #fff !important;
  }
  .form-control:focus, input:focus, textarea:focus, select:focus {
    outline: 0 !important;
    border-color: var(--mts-accent) !important;
    box-shadow: 0 0 0 3px rgba(var(--mts-c-primary-rgb),0.18) !important;
  }
  .form-label, label { font-weight: 500 !important; font-size: 14px !important; color: var(--mts-text) !important; margin-bottom: 8px; }

  /* ===== PAGE WRAPPERS ===== */
  .product-page, .category-page, .topic-page, .cms-page-content { padding: 32px 0 80px !important; }

  /* ===== CARDS ===== */
  .card, .panel { border: 0 !important; border-radius: var(--mts-radius-lg) !important; box-shadow: var(--mts-shadow-soft) !important; }

  /* ===== BG CLEANUP ===== */
  .bg-light, .bg-secondary { background: #fff !important; }

  /* ===== OFFCANVAS-PANELS (Cart, Wishlist, Compare, Mobile-Menu) =====
     Smartstore-Default-Hintergrund war durch unsere Bg-Resets verloren gegangen,
     dadurch schienen die Header-Icons durch die Panels durch (User: "kommt
     zweimal was, eine neue section ueber der von Smartstore"). */
  .offcanvas, #offcanvas-cart, #offcanvas-menu, #offcanvas-search,
  .offcanvas .offcanvas-content,
  .offcanvas-cart-content,
  .offcanvas-menu-content {
    background: #ffffff !important;
  }
  /* Backdrop hinter dem Offcanvas — abgedunkelt damit Page klar wegtritt */
  .offcanvas-backdrop, .modal-backdrop {
    background: rgba(0,0,0,0.5) !important;
    opacity: 1 !important;
  }
  /* Tabs-Header hat eigene Border unten */
  .offcanvas-cart-header { background: #ffffff !important; border-bottom: 1px solid var(--mts-line) !important; }

  /* ===== iPad-Round-3 P15 (korrigiert): NUR "Vergleichen" raus =====
     Wunschliste BLEIBT im Header + Offcanvas (User-Korrektur 2026-06-20).
     Nur der Compare-/Vergleichen-Eintrag wird ausgeblendet. */
  /* (a) Header-Shopbar: nur Vergleichen ausblenden; Warenkorb + Wunschliste bleiben. */
  #shopbar-compare,
  a.shopbar-button[href="/compareproducts/"] {
    display: none !important;
  }
  /* (b) Offcanvas-Cart-Tab-Header: nur Vergleichen-Tab ausblenden;
     Warenkorb- + Wunschliste-Tab bleiben. */
  #offcanvas-cart .offcanvas-cart-header .nav-item:has(> #compare-tab),
  .offcanvas-cart-header .nav-item:has(> a[href="#occ-compare"]) {
    display: none !important;
  }
  /* Fallback ohne :has(): den Compare-Tab-Link selbst ausblenden. */
  #offcanvas-cart #compare-tab {
    display: none !important;
  }
  /* (c) CMS-Linklist-Menue (nav-collapse / Offcanvas-Seitenleiste): den
     "Vergleichen"-Eintrag (/compareproducts/) ausblenden (2026-06-20). */
  .cms-menu-linklist li:has(> a.menu-link[href="/compareproducts/"]),
  .cms-menu-linklist a.menu-link[href="/compareproducts/"] {
    display: none !important;
  }
  /* Warenkorb- + Wunschliste-Tab teilen sich die Breite (Vergleichen ist raus). */
  #offcanvas-cart .offcanvas-cart-header .nav-item:has(> #cart-tab),
  #offcanvas-cart .offcanvas-cart-header .nav-item:has(> #wishlist-tab) {
    flex: 1 1 50% !important;
  }

  /* ===== iPad-Round-2 P16: Offcanvas-Cart restyle (weiss + schwarz) ===== */
  /* Aktiver "Warenkorb"-Tab: KEIN schwarzer Button-Hintergrund mehr.
     Stattdessen weiss + schwarze Schrift + Akzent-Unterstrich. Ueberstimmt
     die generische `.nav-tabs .nav-link.active { background:#1d1d1f }`-Regel
     via hoeherer Spezifitaet (#offcanvas-cart). */
  #offcanvas-cart .offcanvas-cart-header .nav-link,
  .offcanvas-cart-header .nav-link {
    color: var(--mts-text-muted) !important;
    background: #ffffff !important;
    border: 0 !important;
    border-bottom: 2px solid transparent !important;
    border-radius: 0 !important;
    font-weight: 600 !important;
  }
  #offcanvas-cart .offcanvas-cart-header .nav-link.active,
  #offcanvas-cart .nav-tabs .nav-link.active,
  .offcanvas-cart-header .nav-link.active {
    color: var(--mts-text) !important;
    background: #ffffff !important;
    border-bottom: 2px solid var(--mts-accent) !important;
  }

  /* Offcanvas-Cart-Footer: schwarz-auf-weiss. Zwischensumme schwarz,
     "zum Warenkorb" + "zur Kasse" schwarze Buttons mit weisser Schrift. */
  #offcanvas-cart .offcanvas-cart-footer {
    background: #ffffff !important;
    border-top: 1px solid var(--mts-line) !important;
  }
  #offcanvas-cart .offcanvas-cart-footer .sub-total-caption {
    color: var(--mts-text-muted) !important;
  }
  #offcanvas-cart .offcanvas-cart-footer .sub-total,
  #offcanvas-cart .offcanvas-cart-footer .sub-total.price {
    color: var(--mts-text) !important;
    font-weight: 700 !important;
  }
  #offcanvas-cart .offcanvas-cart-footer .btn,
  #offcanvas-cart .offcanvas-cart-footer .btn-action,
  #offcanvas-cart .offcanvas-cart-footer .btn-success,
  #offcanvas-cart .offcanvas-cart-footer .btn-clear {
    background: var(--mts-text) !important;
    border: 1px solid var(--mts-text) !important;
    color: #ffffff !important;
    border-radius: 12px !important;
    font-weight: 600 !important;
  }
  #offcanvas-cart .offcanvas-cart-footer .btn:hover,
  #offcanvas-cart .offcanvas-cart-footer .btn-action:hover,
  #offcanvas-cart .offcanvas-cart-footer .btn-success:hover,
  #offcanvas-cart .offcanvas-cart-footer .btn-clear:hover {
    background: #000000 !important;
    border-color: #000000 !important;
    color: #ffffff !important;
  }
  #offcanvas-cart .offcanvas-cart-footer .btn i,
  #offcanvas-cart .offcanvas-cart-footer .btn span {
    color: #ffffff !important;
  }

  /* Mengen-Stepper im Offcanvas OHNE Border (nur Buttons + Zahl, clean). */
  #offcanvas-cart .qty-input,
  #offcanvas-cart .qty-input .numberinput-group,
  #offcanvas-cart .qty-input .input-group,
  #offcanvas-cart .qty-input .form-control,
  #offcanvas-cart .qty-input .numberinput,
  #offcanvas-cart .numberinput-stepper {
    border: 0 !important;
    box-shadow: none !important;
    background: transparent !important;
  }
  #offcanvas-cart .qty-input .form-control,
  #offcanvas-cart .qty-input .numberinput {
    background: var(--mts-bg-soft) !important;
    border-radius: 10px !important;
  }
  #offcanvas-cart .numberinput-stepper {
    color: var(--mts-text-muted) !important;
  }
  #offcanvas-cart .numberinput-stepper:hover {
    color: var(--mts-accent) !important;
  }

  /* ===== GLOBAL REVEAL CLASSES (for any Smartstore-rendered list) ===== */
  .mtsg-reveal { opacity: 0; transform: translateY(40px); transition: opacity 0.9s cubic-bezier(.22,.61,.36,1), transform 0.9s cubic-bezier(.22,.61,.36,1); will-change: transform, opacity; }
  .mtsg-reveal.is-visible { opacity: 1; transform: none; }
  /* Apply to artlist children */
  .artlist .art { opacity: 0; transform: translateY(36px); transition: opacity 0.7s cubic-bezier(.22,.61,.36,1), transform 0.7s cubic-bezier(.22,.61,.36,1); }
  .artlist .art.is-visible { opacity: 1; transform: none; }

  /* ===== ACTIVE-TAB ORANGE-UNDERLINE entfernen =====
     Smartstore .nav-tabs-line / .nav-tabs-line-dense rendert ein ::before
     mit `background: rgb(238,155,0); height: 2px; bottom: 0` als Active-Indicator.
     Bei schwarzem Active-Tab (bg:#1d1d1f, color:#fff) reicht das visuell aus,
     der orangene Strich ist redundant und vom User explizit nicht gewollt.
     Killt Underline auf ALL Tabs/Pill-Buttons mit aktivem State. */
  .pd-tabs .nav-link::before, .pd-tabs .nav-link::after,
  .nav-tabs .nav-link::before, .nav-tabs .nav-link::after,
  .nav-tabs-line .nav-link::before, .nav-tabs-line .nav-link::after,
  .nav-tabs-line-dense .nav-link::before, .nav-tabs-line-dense .nav-link::after,
  .nav-tabs .nav-tabs-indicator,
  .pd-tabs .nav-tabs-indicator {
    display: none !important;
    content: none !important;
    background: transparent !important;
    height: 0 !important;
  }
  /* Falls Active-Tab als .btn-secondary (schwarz) auf Mobile mit Border-Bottom
     orange angezeigt wird (Smartstore Default-Skin). */
  .btn-secondary, .btn.btn-secondary,
  #pd-add-to-cart, .add-to-cart-button,
  .pd-buy-section .btn-primary, .pd-offer-actions-container .btn-primary {
    border-bottom-color: transparent !important;
  }

  /* ===== Doppelter Titel — pd-description versteckt sobald sie ein Echo
     von h1.pd-name ist. Smartstore liefert oft beide identisch. JS setzt
     `data-mts-dup-title="1"` (siehe Boot-Code). CSS regelt den Default-Hide
     wenn JS nicht angekommen ist. */
  .pd-info .pd-description[data-mts-dup-title="1"] { display: none !important; }

  /* Iter 10 Phase G — Quantity-Label "Menge:" KOMPLETT verstecken.
     User-Feedback: "entferne noch das : bei Menge:1 damit dort direkt steht 1
     bzw einfach direkt die zahl". Smartstore-Markup:
       <span class="fwn text-truncate">Menge:</span>
       <span data-bind="value">1</span>
     Wir hiden das Label, der Wert (data-bind=value) bleibt sichtbar. */
  .pd-offer-action-qty .btn-secondary .fwn.text-truncate,
  .pd-offer-action-qty .btn-secondary > span.fwn {
    display: none !important;
  }
  /* Wert-Span bleibt sichtbar und zentriert */
  .pd-offer-action-qty .btn-secondary [data-bind="value"] {
    display: inline-block !important;
    font-weight: 600 !important;
    margin-right: 6px;
  }
  .pd-offer-action-qty .btn-secondary {
    min-width: 90px !important;
    white-space: normal !important;
    justify-content: center !important;
  }

  /* ===== Countdown — grauer Hintergrund weg, dezenter Inline-Look.
     Iter 15 Phase A: Trennlinien (border-top/bottom) entfernt — User: "entferne
     noch die trennlinien ueber und unter Bestelle in den naechsten 14 Std...".
     Stattdessen reicht etwas vertikales Padding fuer Atemraum. ===== */
  .mts-pd-countdown {
    background: transparent !important;
    padding: 12px 0 !important;
    text-align: left !important;
    border-top: 0 !important;
    border-bottom: 0 !important;
    margin: 14px 0 0 !important;
    border-radius: 0 !important;
  }
  .mts-pd-countdown__label { display: flex; gap: 8px; align-items: flex-start; }
  .mts-pd-countdown__delivery { margin-top: 2px !important; padding-left: 24px; }
  /* Iter 10 Phase G — Variant: above-CTA (durch JS-Move in .pd-offer-actions-container).
     Zentriert, kompakter Padding, oberhalb des Add-to-Cart-Buttons. */
  .pd-offer-actions-container .mts-pd-countdown,
  .mts-pd-countdown--above-cta {
    text-align: center !important;
    padding: 10px 0 !important;
    margin: 0 0 12px 0 !important;
  }
  .pd-offer-actions-container .mts-pd-countdown .mts-pd-countdown__label,
  .mts-pd-countdown--above-cta .mts-pd-countdown__label {
    display: inline-flex !important;
    justify-content: center;
    align-items: center;
  }
  .pd-offer-actions-container .mts-pd-countdown .mts-pd-countdown__delivery,
  .mts-pd-countdown--above-cta .mts-pd-countdown__delivery {
    padding-left: 0 !important;
    text-align: center;
  }

  /* ===== Brand-Block (PDP) layout — `inline-flex` lässt Logo NEBEN Titel
     stehen. Block-Display erzwingen, damit Reihenfolge (Brand → Titel → Preis)
     auf Mobile UND Desktop sauber gestackt ist. */
  .pd-info .pd-brand-block, .pd-info-col .pd-brand-block {
    display: block !important;
    margin: 0 0 12px 0 !important;
  }
  .pd-info .pd-brand-block .pd-brand,
  .pd-info-col .pd-brand-block .pd-brand {
    display: inline-flex;
    align-items: center;
  }
  /* Logo Größe (PDP) — auf Mobile etwas kleiner, Desktop wie bisher */
  .pd-info .pd-brand-picture, .pd-info-col .pd-brand-picture {
    max-height: 56px !important;
    max-width: 180px !important;
  }

  /* ===== Slick Carousel Arrows: Pfeil-Icon als Inline-SVG =====
     Iter 16 Bugfix: Vorher stand hier `content: "\\2190"` (CSS-Unicode-Escape).
     Problem: Das HTML-Template wird durch escSql() in die DB geschrieben, dabei
     wird `\` zu `\\` (SQL-Escape). Nach SQL-Parse landet `\\2190` in der DB.
     Browser sieht das CSS als `content: "\\2190"` → CSS-Parser interpretiert
     `\\` als literalen Backslash, der Rest `2190` ist Text. Im 48px-Button
     wird davon nur "190" / "21" sichtbar → User-Report "Zahlen statt Pfeile".

     Fix: SVG-Pfeil als background-image (data-URI). Encoding-robust, kein
     Font-Faff, perfekt skalierbar, passt zum Apple-Look. Smartstore-Default-
     FA-Icon im Button-Inneren bleibt durch `font-size: 0` ausgeblendet
     (siehe Zeile ~737), damit kein doppeltes Glyph rendert. */
  .recently-viewed-product-grid .slick-prev,
  .recently-viewed-product-grid .slick-next,
  .product-grid .slick-prev,
  .product-grid .slick-next,
  .artlist-carousel .slick-prev,
  .artlist-carousel .slick-next {
    background-repeat: no-repeat !important;
    background-position: center !important;
    background-size: 18px 18px !important;
  }
  /*
  .recently-viewed-product-grid .slick-prev,
  .product-grid .slick-prev,
  .artlist-carousel .slick-prev {
    background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%231d1d1f' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'><polyline points='15 18 9 12 15 6'/></svg>") !important;
  }
  .recently-viewed-product-grid .slick-next,
  .product-grid .slick-next,
  .artlist-carousel .slick-next {
    background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%231d1d1f' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'><polyline points='9 18 15 12 9 6'/></svg>") !important;
  }
  .recently-viewed-product-grid .slick-prev:hover,
  .product-grid .slick-prev:hover,
  .artlist-carousel .slick-prev:hover {
    background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'><polyline points='15 18 9 12 15 6'/></svg>") !important;
  }
  .recently-viewed-product-grid .slick-next:hover,
  .product-grid .slick-next:hover,
  .artlist-carousel .slick-next:hover {
    background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'><polyline points='9 18 15 12 9 6'/></svg>") !important;
  }
*/
  /* Pseudoelement-Reste entschaerfen (alte CSS-Cached-Builds zeigen sonst
     immer noch "190"/"21"). content: none ueberschreibt sowohl Slick-Defaults
     (Slick-Font \\2190) als auch unsere alte Variante. */
  .recently-viewed-product-grid .slick-prev::before,
  .recently-viewed-product-grid .slick-next::before,
  .product-grid .slick-prev::before,
  .product-grid .slick-next::before,
  .artlist-carousel .slick-prev::before,
  .artlist-carousel .slick-next::before {
    content: "" !important;
    display: none !important;
  }
  /* Smartstore-Default FA-Chevron im Button-Inneren wegblenden — wir nutzen
     das SVG-Background. Sonst doppelte Glyphe sichtbar, sobald andere CSS
     `font-size: 0` aufhebt. */
  .recently-viewed-product-grid .slick-prev > i,
  .recently-viewed-product-grid .slick-next > i,
  .product-grid .slick-prev > i,
  .product-grid .slick-next > i,
  .artlist-carousel .slick-prev > i,
  .artlist-carousel .slick-next > i {
    display: none !important;
  }

  /* ===== Recently-Viewed: 4 Karten pro Slide + groessere Cards =====
     Iter 16: User-Feedback "max 4 Karten pro Block, groesser darstellen".
     Smartstore liefert Slick-Init mit slidesToShow=6 (Default), Responsive
     reduziert auf 5/4/3/2 unterhalb von 960/780/640/440. Wir wollen aber
     auf Desktop genau 4. Loesung: Slick-Re-Init via JS (siehe unten im
     Boot-Script). CSS hier ergaenzt visuelles Sizing & Spacing.

     Iter 17: User-Feedback "weisser Hintergrund statt grauer + Bild groesser".
     Quelle des grauen Tones war diese Section selbst: `.art-picture-block`
     mit `background: #fafafa` (Z. 2649 alt) hat das globale `#ffffff`
     (Z. 364) gewonnen wegen hoeherer Selektor-Spezifitaet. Fix: BG auf
     reines Weiss. Fuer "Bild groesser" gleich zwei Hebel kombiniert:
     - aspect-ratio 4/3 → 1/1: Produktbilder sind im Smartstore-MediaService
       quadratisch (600x600). Im 4/3-Slot blieb seitlich BG-Rand sichtbar
       (Bild 323x323 in 447x335-Slot). 1/1 macht das Bild zum Slot-Fueller.
     - inset 12px → 6px: noch ein paar Pixel mehr fuer das Bild, aber die
       Karte sieht trotzdem nicht "ueberlaufend" aus (Apple-Look).
     - min-height auf der Card ENTFERNT: Card-Hoehe ergibt sich aus
       Slot (~440px @ 1:1, Card-Breite ~440-460px Desktop) + Textblock
       (~150px Brand/Titel/Preis/Stock) = ~590-610px. Card-Hoehen sind
       auch ohne min-height konsistent, weil alle Karten denselben Slot
       und denselben Textblock-Aufbau haben. Smartstore-grid stretcht
       via `align-items: stretch` ohnehin alle Karten in einer Reihe.
     - Responsive: 1/1 bleibt auf allen Breakpoints; nur die explizite
       min-height-Cascade (440/400/360) wird obsolet → entfernt. */
  .recently-viewed-product-grid .artlist-carousel .slick-slide {
    padding: 0 14px !important;
  }
  .recently-viewed-product-grid .artlist-carousel .slick-list {
    margin: 0 -14px !important;
  }
  /* Cards groesser, mehr Bild-Anteil, mehr Atemraum.
     Iter 17: min-height entfernt (Bild-Slot 1:1 bestimmt jetzt die Hoehe). */
  .recently-viewed-product-grid .art {
    border-radius: 18px !important;
    overflow: hidden !important;
    background: #ffffff !important; /* Iter 17: Card explizit weiss (Konsistenz zu Apple-Look) */
    transition: transform 0.32s cubic-bezier(.22,.61,.36,1), box-shadow 0.32s cubic-bezier(.22,.61,.36,1) !important;
  }
  .recently-viewed-product-grid .art:hover {
    transform: translateY(-4px) !important;
    box-shadow: 0 14px 40px rgba(0,0,0,0.10) !important;
    background: #ffffff !important; /* Iter 17: Hover-State darf nicht grau werden */
  }
  /* Iter 17: BG #fafafa → #ffffff, aspect-ratio 4/3 → 1/1
     (Produktbilder sind quadratisch, Slot wird voll genutzt). */
  .recently-viewed-product-grid .art-picture-block {
    position: relative !important;
    aspect-ratio: 1 / 1 !important;
    background: #ffffff !important;
    overflow: hidden !important;
  }
  /* Iter 17: inset 12px → 6px (mehr Bild-Flaeche). */
  .recently-viewed-product-grid .art-picture-block img,
  .recently-viewed-product-grid .art-picture-block picture {
    position: absolute !important;
    inset: 6px !important;
    width: calc(100% - 12px) !important;
    height: calc(100% - 12px) !important;
    max-width: 100% !important;
    max-height: 100% !important;
    object-fit: contain !important;
    background: #ffffff !important; /* Iter 17: Bild-Layer auch weiss (transparente PNGs) */
  }
  /* Auch die anchor/picture-Wrapper im Bild-Slot weiss halten, damit kein
     Smartstore-Default-Grau durchkommt. */
  .recently-viewed-product-grid .art-picture-block .art-picture,
  .recently-viewed-product-grid .art-picture-block > a {
    background: #ffffff !important;
  }
  .recently-viewed-product-grid .art-info,
  .recently-viewed-product-grid .art-body {
    padding: 18px 16px 18px !important;
    background: #ffffff !important; /* Iter 17: Textblock-BG explizit weiss */
  }
  .recently-viewed-product-grid .slick-dots li.slick-active button {
    background: var(--mts-text, #1d1d1f) !important;
    transform: scale(1.25);
  }
  /* Iter 17: Responsive min-height-Cascade entfernt — Hoehe ergibt sich
     jetzt aus dem 1:1-Slot, Cards skalieren automatisch konsistent. */

  /* ============================================================================
     TASK-RV — Recently-Viewed: Slider-Pfeile AUSSERHALB der Karten + borderless
     ----------------------------------------------------------------------------
     User-Feedback (nur diese Section):
       (3) Prev/Next-Pfeile links & rechts AUSSERHALB der Kartenreihe, nicht ueber
           den Karten liegend.
       (4) Pfeile OHNE Border/Kreis — nur das Pfeil-Icon.

     Ausgangslage (live-computed): Die Karten-Reihe (.artlist.slick-slider) war
     full-bleed edge-to-edge (x:0..1440). Die Pfeile lagen bei left:-24/right:-24
     und ueberlappten damit ~34px die aeussersten Karten. Es gab keinen Gutter
     fuer aussenliegende Pfeile.

     Loesung: Der Carousel-Content wird ueber horizontales Padding auf
     `.artlist-carousel` um einen Gutter eingerueckt; die Pfeile (offset-parent =
     `.artlist.slick-slider`, das slick per position:relative aufspannt) werden
     mit negativem left/right VOLL in diesen Gutter geschoben — links/rechts
     neben der Reihe, mit ~30px Abstand zur ersten/letzten Karte.

     Scope: STRIKT `.recently-viewed-product-grid .artlist-carousel ...`
     (Spezifitaet 0,3,0) → schlaegt die generischen `.artlist-carousel ...`- und
     `.product-grid ...`-Regeln (0,2,0) und trifft NUR die Recently-Viewed-Section.
     Home-Featured-Carousel + Cross-Sell/andere .product-grid bleiben unberuehrt.
     ============================================================================ */
  /* Gutter fuer aussenliegende Pfeile + deterministische Kartenkanten
     (slick-list-Negativmargin auf 0 gesetzt, sonst ist die Kartenkante nicht
     vorhersagbar). */
  .recently-viewed-product-grid .artlist-carousel {
    padding-left: 72px !important;
    padding-right: 72px !important;
  }
  .recently-viewed-product-grid .artlist-carousel .slick-list {
    margin-left: 0 !important;
    margin-right: 0 !important;
  }
  /* Pfeile: borderless (kein Rahmen, kein Kreis), nur das SVG-Icon.
     Vertikal zentriert auf die Kartenreihe, horizontal im Gutter. */
  /*
  .recently-viewed-product-grid .artlist-carousel .slick-prev,
  .recently-viewed-product-grid .artlist-carousel .slick-next {
    position: absolute !important;
    top: 50% !important;
    bottom: auto !important;
    transform: translateY(-50%) !important;
    width: 44px !important;
    height: 44px !important;
    padding: 0 !important;
    border: 0 !important;
    border-radius: 0 !important;
    background-color: transparent !important;
    box-shadow: none !important;
    background-size: 30px 30px !important;
    background-position: center !important;
    background-repeat: no-repeat !important;
    z-index: 6 !important;
    opacity: 1 !important;
    visibility: visible !important;
    display: flex !important;
  }
  .recently-viewed-product-grid .artlist-carousel .slick-prev {
    left: -60px !important;
    right: auto !important;
  }
  .recently-viewed-product-grid .artlist-carousel .slick-next {
    right: -60px !important;
    left: auto !important;
  }
  .recently-viewed-product-grid .artlist-carousel .slick-prev:hover,
  .recently-viewed-product-grid .artlist-carousel .slick-next:hover {
    background-color: transparent !important;
    border: 0 !important;
    box-shadow: none !important;
    transform: translateY(-50%) scale(1.14) !important;
  }
  .recently-viewed-product-grid .artlist-carousel .slick-prev:hover {
    background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%231d1d1f' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'><polyline points='15 18 9 12 15 6'/></svg>") !important;
  }
  .recently-viewed-product-grid .artlist-carousel .slick-next:hover {
    background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%231d1d1f' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'><polyline points='9 18 15 12 9 6'/></svg>") !important;
  }

  .recently-viewed-product-grid .artlist-carousel .slick-arrow.slick-disabled {
    opacity: 0.28 !important;
    cursor: default !important;
  }

  @media (max-width: 899.98px) {
    .recently-viewed-product-grid .artlist-carousel {
      padding-left: 0 !important;
      padding-right: 0 !important;
    }
    .recently-viewed-product-grid .artlist-carousel .slick-prev,
    .recently-viewed-product-grid .artlist-carousel .slick-next {
      display: none !important;
    }
  }
*/
  /* ===== Variant-Picker als Pills (statt <select>) — JS rendert
     `.mts-variant-pills` neben/anstelle der <select>. Styles hier.
     Iter 10 Phase F: mittig zentriert (User-Feedback).
     Iter 15 Phase C: 2-Spalten-Grid statt Flex-Wrap (User: "zeige die groessen
     Optionen im 2 grid an nicht in 1 gr und alles untereinander"). Pills
     fuellen jeweils ihre Spalte (width:auto, kein full-stretch sodass Apple-
     Pill-Look erhalten bleibt — gleichmaessige Spalten via grid-template-columns).
     Swatch-Variante (Farb-Kreise) bleibt Flex (Kreise sollen nicht 50%-breit). */
  .mts-variant-pills {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 8px;
    margin: 6px 0 0;
    justify-items: center;
    /* Begrenzen auf max ~340px Gesamtbreite, damit Pills nicht Riesen werden
       wenn Container 562px breit ist und nur 2 Werte vorhanden sind. */
    max-width: 360px;
    margin-left: auto;
    margin-right: auto;
  }
  .mts-variant-pills--swatch {
    /* Farb-Swatches bleiben in einem Flex-Row (Kreise dichter, kompakt). */
    display: flex !important;
    flex-wrap: wrap;
    justify-content: center;
    max-width: none !important;
  }
  .mts-variant-pill {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-height: 44px;
    min-width: 56px;
    width: 100%;
    padding: 8px 18px;
    border-radius: 999px;
    border: 1px solid var(--mts-line);
    background: #fff;
    color: var(--mts-text);
    font-weight: 500;
    font-size: 14px;
    cursor: pointer;
    transition: all 0.15s ease;
    white-space: nowrap;
    user-select: none;
  }
  .mts-variant-pill:hover {
    border-color: var(--mts-text);
  }
  .mts-variant-pill.is-active {
    background: var(--mts-text);
    color: #fff;
    border-color: var(--mts-text);
  }
  .mts-variant-pills--swatch .mts-variant-pill {
    width: 44px !important;
    height: 44px;
    min-width: 44px;
    padding: 0;
    border-radius: 50%;
    position: relative;
    overflow: hidden;
  }
  /* Auswahl ueber die Groesse, nicht ueber einen Ring (Nutzer-Vorgabe
     2026-08-09) - dieselbe Sprache wie `.mts-pcard__swatch.is-active` und der
     PDP-Choice-Box in storefront.css. WAR `box-shadow: 0 0 0 2px var(--mts-text)`
     plus weisser Rand.
     Diese Pillenleiste rendert auf mc.movetoshop.com derzeit nicht (am
     Livestand gezaehlt: 0 Vorkommen auf der Produktseite) - sie wird
     mitgezogen, damit die drei Flaechen nicht auseinanderlaufen, sobald der
     Pfad irgendwo doch greift. */
  .mts-variant-pills--swatch .mts-variant-pill.is-active {
    transform: scale(1.12);
  }
  /* Iter 10 Phase F — Original Smartstore <select> IMMER unsichtbar in
     Variant-Sektion (User: "das dropdown kann eigentlich weg"). Wir behalten
     ihn im DOM (Smartstore-Update-Logik braucht .value), aber rendern ihn
     unsichtbar als sr-only.
     Iter 14 Phase E: select2-Plugin (Smartstore CE laedt select2.js und rendert
     <span class="select2 select2-container ..."> als visuelles Dropdown-Replacement
     direkt nach dem <select>). DAS ist das sichtbare Dropdown! select-Element ist
     bereits clip-versteckt, aber select2-Wrapper nicht. Wir verstecken beide. */
  .pd-variants .form-group.choice select.form-control,
  .pd-variants .form-group.choice .choice-control select.form-control,
  .pd-attrs-container .form-group.choice select.form-control,
  .pd-variants .form-group.choice .select2,
  .pd-variants .form-group.choice .select2-container,
  .pd-variants .form-group.choice .choice-control .select2,
  .pd-variants .form-group.choice .choice-control .select2-container,
  .pd-attrs-container .form-group.choice .select2,
  .pd-attrs-container .form-group.choice .select2-container,
  .pd-attrs-container .form-group.choice .choice-control .select2,
  .pd-attrs-container .form-group.choice .choice-control .select2-container {
    position: absolute !important;
    width: 1px !important; height: 1px !important;
    padding: 0 !important; margin: -1px !important;
    overflow: hidden !important;
    clip: rect(0,0,0,0) !important;
    white-space: nowrap !important;
    border: 0 !important;
    pointer-events: none !important;
    opacity: 0 !important;
    visibility: hidden !important;
  }
  /* Schliesse zudem das ggf. offene select2-Dropdown (im Body angehaengt) komplett aus */
  body > .select2-container--open,
  body > .select2-container.select2-container--open {
    display: none !important;
  }
  /* Choice-Label kompakter, mittig (passend zu Pills) */
  .pd-variants .choice-label,
  .pd-attrs-container .choice-label {
    font-weight: 500 !important;
    font-size: 13px !important;
    color: var(--mts-text-muted) !important;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    margin-bottom: 8px !important;
    text-align: center !important;
    display: block !important;
  }
  /* Das Sternchen ist erzeugter Text auf Weiß -> Textton (Kette wie oben). */
  .pd-variants .choice-label.required::after,
  .pd-attrs-container .choice-label.required::after { content: " *"; color: var(--mts-accent-text, var(--mts-accent)); }
  .pd-variants .form-group.choice,
  .pd-attrs-container .form-group.choice { margin-bottom: 18px !important; }

  /* Iter 15 Phase A — Padding zwischen Variants-Container und naechstem Block
     (Preis/Quantity/Cart). User: "kleines bisschen padding zu den optionen vom
     produkt das es nicht zu nah ist". Vorher: ~4-6px Default-Gap. Jetzt: 14px
     bottom-padding auf den Container, plus etwas top-margin. */
  .pd-info-col .pd-variants,
  .pd-info-col .pd-variants-container,
  .pd-info-col .pd-attrs-container {
    margin-top: 6px !important;
    padding-bottom: 14px !important;
  }

  /* Iter 14 Phase E: Variants-Container = Flex-Row auf Desktop (User: "Optionen
     nebeneinander, nicht untereinander"). Mehrere Choices (Groesse + Farbe) liegen
     nebeneinander, jede Choice mit eigenem Label + Pills-Reihe darunter.
     pd-info-col ist nur 562px breit (col-lg-5). Mit gap 36 + 2 Choices muss jede
     Choice ~263px sein. min-width:0 + flex:1 1 0 erzwingt gleichmaessige Verteilung
     statt Wrap. Pills wrappen dann INNERHALB der Choice falls noetig.
     Auf Mobile wieder Stack via Media-Query weiter unten. */
  @media (min-width: 768px) {
    .pd-variants,
    .pd-variants-container,
    .pd-attrs-container {
      display: flex !important;
      flex-direction: row !important;
      flex-wrap: wrap !important;
      gap: 28px !important;
      align-items: flex-start !important;
      justify-content: center !important;
    }
    .pd-variants .form-group.choice,
    .pd-variants-container .form-group.choice,
    .pd-attrs-container .form-group.choice {
      flex: 1 1 0 !important;
      min-width: 0 !important;
      max-width: 100% !important;
      margin-bottom: 0 !important;
    }
    /* Pills im Choice duerfen wrappen, bleiben aber zentriert */
    .pd-variants .form-group.choice .mts-variant-pills,
    .pd-attrs-container .form-group.choice .mts-variant-pills {
      justify-content: center !important;
    }
  }
  /* Mobile: Choices wieder uebereinander stacken (passt zu schmaler Single-Col) */
  @media (max-width: 767px) {
    .pd-variants,
    .pd-variants-container,
    .pd-attrs-container {
      display: block !important;
    }
    .pd-variants .form-group.choice,
    .pd-variants-container .form-group.choice,
    .pd-attrs-container .form-group.choice {
      width: 100% !important;
      margin-bottom: 18px !important;
    }
    /* Iter 15 Phase C: auch auf Mobile 2-Spalten-Grid (User-Wunsch). Kompakter
       max-width damit Pills auf schmalem Screen nicht zu breit werden. */
    .pd-variants .form-group.choice .mts-variant-pills,
    .pd-attrs-container .form-group.choice .mts-variant-pills {
      max-width: 100% !important;
      gap: 6px !important;
    }
  }

  /* ===== PHASE 5.1 — Mobile Filter (Apple-Style)
     Smartstore CE hat bereits einen eigenen Off-Canvas-Mechanismus auf Mobile:
     #filter-widget (offcanvas-bottom) plus einen Default-Trigger-Button mit
     [data-target="#filter-widget"] und Text "Filtern & Sortieren". Smartstore-JS
     verschiebt die catmenu + faceted-search ins #filter-widget — jeder
     Eigen-Drawer wuerde diesen Mechanismus brechen. Wir verbessern hier nur das
     Look-and-Feel: Trigger als pill-foermige Filter-Bar, Off-Canvas mit
     Apple-Header, Backdrop-Blur, weiche Bottom-Slide-In-Animation. ===== */
  /* 1) Default-Trigger ("Filtern & Sortieren") — Smartstore liefert ihn als
     btn.btn-primary, also muessen wir spezifischer sein als .btn-primary.
     Wir nehmen den Look einer dunklen Pill (Apple-Primary) statt des Orangen
     Defaults — das wirkt zurueckhaltender und passt zu unseren Pages. */
  button[aria-controls="filter-widget"],
  button[data-target="#filter-widget"],
  a[aria-controls="filter-widget"],
  a[data-target="#filter-widget"],
  .btn[aria-controls="filter-widget"],
  .btn[data-target="#filter-widget"] {
    background: var(--mts-text) !important;
    background-image: none !important;
    color: #fff !important;
    border: 1px solid var(--mts-text) !important;
    border-radius: 999px !important;
    padding: 12px 26px !important;
    font: 600 14px var(--mts-font) !important;
    box-shadow: 0 6px 18px rgba(0,0,0,0.18) !important;
    transition: all 0.2s ease !important;
    width: auto !important;
    max-width: max-content !important;
    display: inline-flex !important;
    align-items: center !important;
    gap: 10px !important;
    letter-spacing: 0.01em;
  }
  button[aria-controls="filter-widget"]:hover,
  .btn[aria-controls="filter-widget"]:hover,
  a[aria-controls="filter-widget"]:hover {
    background: #000 !important;
    transform: translateY(-1px);
  }
  button[aria-controls="filter-widget"]:active,
  .btn[aria-controls="filter-widget"]:active { transform: scale(0.97) !important; }
  button[aria-controls="filter-widget"] .badge,
  .btn[aria-controls="filter-widget"] .badge {
    background: var(--mts-accent) !important;
    color: #fff !important;
    border-radius: 999px !important;
    padding: 2px 8px !important;
    font-weight: 700 !important;
    margin-left: 6px;
  }
  /* Mobile: Trigger nimmt mehr Platz ein damit er klar als Aktion sichtbar ist */
  @media (max-width: 991.98px) {
    button[aria-controls="filter-widget"],
    .btn[aria-controls="filter-widget"] {
      padding: 14px 28px !important;
      font-size: 15px !important;
    }
  }

  /* 2) Off-Canvas selbst */
  #filter-widget.offcanvas {
    background: #fff !important;
    border-top-left-radius: 22px !important;
    border-top-right-radius: 22px !important;
    box-shadow: 0 -16px 50px rgba(0,0,0,0.18) !important;
    border: 0 !important;
  }
  #filter-widget .offcanvas-header,
  #filter-widget.offcanvas-header {
    border-bottom: 1px solid var(--mts-line) !important;
    padding: 18px 22px !important;
    font: 700 18px var(--mts-font-display) !important;
    letter-spacing: -0.01em;
  }
  #filter-widget .offcanvas-content,
  #filter-widget .offcanvas-scrollable {
    padding: 18px 22px 28px !important;
  }
  #filter-widget .btn-close,
  #filter-widget .offcanvas-close {
    border-radius: 999px !important;
    width: 32px !important; height: 32px !important;
    background: rgba(0,0,0,0.05) !important;
    transition: background 0.15s ease;
  }
  #filter-widget .btn-close:hover,
  #filter-widget .offcanvas-close:hover { background: rgba(0,0,0,0.1) !important; }
  /* Backdrop dahinter: Apple-Blur. Smartstore rendert .offcanvas-backdrop ohne
     immer .show — wir stylen alle Varianten. */
  .offcanvas-backdrop,
  .offcanvas-backdrop.show,
  body > .offcanvas-backdrop {
    background-color: rgba(0,0,0,0.42) !important;
    -webkit-backdrop-filter: blur(6px) !important;
    backdrop-filter: blur(6px) !important;
  }
  #filter-widget.offcanvas-bottom {
    transition: transform 0.32s cubic-bezier(0.32, 0.72, 0, 1) !important;
    max-height: 92vh !important;
  }
  /* Facet-Group Headers */
  #filter-widget .facet-group {
    border-bottom: 1px solid var(--mts-line) !important;
    padding: 14px 0 !important;
  }
  #filter-widget .facet-group-header {
    font: 700 15px var(--mts-font-display) !important;
    color: var(--mts-text) !important;
    padding: 6px 0 !important;
  }
  #filter-widget .facet-control {
    padding: 8px 12px !important;
    border-radius: 8px !important;
    transition: background 0.15s ease;
  }
  #filter-widget .facet-control:hover { background: rgba(0,0,0,0.04) !important; }
  #filter-widget .facet-control.selected,
  #filter-widget .facet-toggle.selected {
    background: var(--mts-text) !important;
    color: #fff !important;
  }
  #filter-widget .filter-actions,
  #filter-widget .offcanvas-footer {
    border-top: 1px solid var(--mts-line) !important;
    padding: 14px 18px !important;
    background: #fff !important;
    box-shadow: 0 -8px 20px rgba(0,0,0,0.04) !important;
  }
  #filter-widget .filter-actions .btn,
  #filter-widget .offcanvas-footer .btn {
    border-radius: 999px !important;
    padding: 14px 18px !important;
    font-weight: 700 !important;
  }

  /* 3) Mobile-Toolbar — Filter-Button bekommt eigenen Platz */
  @media (max-width: 991.98px) {
    .artlist-actions, .toolbar {
      flex-wrap: wrap !important;
      gap: 10px !important;
      padding: 12px 0 !important;
    }
  }

  /* ===== PHASE 5.2 — Hover Image Switch on Listing Cards
     Strategie: aus dem Default-Image (z.B. -1.jpg) wird per Naming-Convention
     ein -2.jpg geprobt. Nur wenn das 200 zurueckgibt, blenden wir es als
     zweites <img> in den Picture-Block und crossfaden bei Hover. ===== */
  .artlist .art .art-picture-block { position: relative; }
  .artlist .art .mts-card-img-hover {
    position: absolute;
    inset: 0;
    width: 100% !important;
    height: 100% !important;
    object-fit: contain !important;
    opacity: 0;
    transition: opacity 0.45s ease;
    pointer-events: none;
    /* Padding wie das Original-Image — wird in JS aus Smartstore-CSS uebernommen */
    padding: 18px 22px;
    z-index: 2;
  }
  .artlist .art:hover .mts-card-img-hover[data-mts-loaded="1"] { opacity: 1; }
  .artlist .art:hover .art-picture img:not(.mts-card-img-hover) { opacity: 0.0; transition: opacity 0.45s ease; }
  /* Fallback ohne 2. Bild — leichter Zoom */
  .artlist .art[data-mts-hover-img="none"]:hover .art-picture img { transform: scale(1.06); }

  /* ===== Iter 9 Phase C — Specs als kompakte Icon+Text-Liste =====
     User-Feedback Iter 8: "Pills sehr schlecht bis garnicht lesbar".
     Neuer Ansatz: jede Spec auf eigener Zeile mit Inline-SVG-Icon links und
     Wert in lesbarer Schrift (13px) rechts. Label (Rahmen / Motor / …)
     wird als Caption in Muted-Color, Wert in Volltext.
     Layout-Shift-Schutz via min-height (3 Zeilen reservieren). */
  .artlist .art .mts-card-specs {
    display: flex; flex-direction: column;
    gap: 4px;
    margin: 8px 18px 10px;
    padding: 0;
    min-height: 78px;
  }
  .artlist .art .mts-card-specs__tag {
    display: flex !important; align-items: center;
    gap: 8px;
    background: transparent !important;
    border: 0 !important;
    padding: 2px 0 !important;
    font: 500 12.5px/1.35 var(--mts-font) !important;
    color: var(--mts-text) !important;
    letter-spacing: 0 !important;
    max-width: 100%;
    white-space: nowrap !important;
    overflow: hidden !important;
    text-overflow: ellipsis !important;
  }
  .artlist .art .mts-card-specs__tag::before {
    content: '';
    flex: 0 0 14px;
    width: 14px; height: 14px;
    background: currentColor;
    opacity: 0.55;
    -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat;
    -webkit-mask-position: center; mask-position: center;
    -webkit-mask-size: contain; mask-size: contain;
  }
  /* Icon: Frame (Rahmen) */
  .artlist .art .mts-card-specs__tag--rahmen::before {
    -webkit-mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><circle cx='5.5' cy='17.5' r='3.5'/><circle cx='18.5' cy='17.5' r='3.5'/><path d='M15 17.5l-3-7m-7 7l5-7h6m-1-5h-3m6 0h-1l-2 5'/></svg>");
            mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><circle cx='5.5' cy='17.5' r='3.5'/><circle cx='18.5' cy='17.5' r='3.5'/><path d='M15 17.5l-3-7m-7 7l5-7h6m-1-5h-3m6 0h-1l-2 5'/></svg>");
  }
  /* Icon: Motor (Lightning Bolt) */
  .artlist .art .mts-card-specs__tag--motor::before {
    -webkit-mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='black'><path d='M13 2L4 14h7l-2 8 9-12h-7l2-8z'/></svg>");
            mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='black'><path d='M13 2L4 14h7l-2 8 9-12h-7l2-8z'/></svg>");
  }
  /* Icon: Schaltung (Settings/Gears) */
  .artlist .art .mts-card-specs__tag--schaltung::before {
    -webkit-mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='3'/><path d='M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z'/></svg>");
            mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='3'/><path d='M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z'/></svg>");
  }
  /* Icon: Gewicht (Scale) */
  .artlist .art .mts-card-specs__tag--gewicht::before {
    -webkit-mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M5 4h14a2 2 0 0 1 2 2L18 20a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L3 6a2 2 0 0 1 2-2z'/><circle cx='12' cy='10' r='2'/><path d='M9 14h6'/></svg>");
            mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M5 4h14a2 2 0 0 1 2 2L18 20a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L3 6a2 2 0 0 1 2-2z'/><circle cx='12' cy='10' r='2'/><path d='M9 14h6'/></svg>");
  }
  .artlist .art .mts-card-specs__tag .mts-card-specs__label {
    color: var(--mts-text-muted);
    font-weight: 500;
    margin-right: 6px;
    flex: 0 0 auto;
  }
  .artlist .art .mts-card-specs__tag .mts-card-specs__value {
    color: var(--mts-text);
    font-weight: 600;
    overflow: hidden;
    text-overflow: ellipsis;
    min-width: 0;
  }
  /* Motor-Akzent in Apple-Orange behalten — aber feiner. */
  .artlist .art .mts-card-specs__tag--motor::before { color: var(--mts-accent); opacity: 0.85; }
  .artlist .art .mts-card-specs__tag--motor .mts-card-specs__value { color: #c0511a; }
  .artlist .art .mts-card-specs.is-empty { display: none; }
  /* Iter 10 Phase C — Single-Size-Badge ZENTRIERT im Card-Body, UEBER dem Preis
     (User-Feedback Iter 9: "wo nur eine Groesse verfuegbar ist sollte das ueber
     den preis zentrerit nur die Groesse alleine angezeigt werden mit gruenen
     punkt nicht ueber dem artikel").
     Card-Hoehe stabil: Slot wird IMMER als Wrapper-Element angelegt
     (.mts-card-singlesize-slot), Preis-Block bleibt durch margin-top:auto am
     Card-Bottom — Y-Position des Preises ist damit identisch egal ob Badge
     vorhanden oder nicht. */
  .artlist .art .mts-card-singlesize-slot {
    display: flex;
    align-items: center;
    justify-content: center;
    /* Iter 11 Fix 1 — min-height von 30 auf 31, Slot wird IMMER vom JS angelegt
       (auch leer), damit Card-Hoehe row-uebergreifend stabil ist. Reihe 3 hatte
       bisher 475px statt 506px weil keine Cube-Bikes mit Single-Size in dieser
       Range waren. */
    min-height: 31px;
    padding: 6px 18px 0;
    margin: 0 !important;
  }
  .artlist .art .mts-card-singlesize {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    margin: 0;
    padding: 5px 14px 5px 12px;
    background: rgba(34,197,94,0.08);
    border-radius: 999px;
    border: 1px solid rgba(34,197,94,0.18);
    font: 600 0.72rem/1.1 var(--mts-font);
    color: #15803d;
    letter-spacing: 0.02em;
    text-transform: uppercase;
  }
  .artlist .art .mts-card-singlesize__dot {
    width: 7px; height: 7px;
    border-radius: 50%;
    background: #22c55e;
    box-shadow: 0 0 0 3px rgba(34,197,94,0.15);
    flex: 0 0 auto;
  }
  .artlist .art .mts-card-singlesize__label {
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }
  /* Skeleton waehrend Lade-Vorgang — verhindert Layout-Shift.
     Iter 9: Skeleton ist jetzt eine schmale Linie pro Spec (statt Pill). */
  .artlist .art .mts-card-specs.is-loading .mts-card-specs__tag {
    background: linear-gradient(90deg, #f0f0f0 0%, #f7f7f7 50%, #f0f0f0 100%);
    background-size: 200% 100%;
    animation: mtsCardSpecPulse 1.4s ease-in-out infinite;
    color: transparent;
    border-radius: 4px;
    height: 14px;
    width: 70%;
  }
  .artlist .art .mts-card-specs.is-loading .mts-card-specs__tag::before { display: none; }
  @keyframes mtsCardSpecPulse {
    0% { background-position: 200% 0; }
    100% { background-position: -200% 0; }
  }

  /* ===== MOBILE =====
     Smartstore CE setzt KEIN body.product-details / .product-page (Body class
     ist nur "lyt-cols-1"). Selektor-Anker daher: .pd-section (existiert nur
     auf Produktseiten). */
  @media (max-width: 900px) {
    /* PDP: Bild-Spalte voll, Info-Spalte voll, Stack-Order erzwingen.
       Specificity erhoeht (Class doppelt) damit Desktop-Override greift. */
    /* TASK-639: die negativen Aussenabstaende der Bootstrap-Row mit neutralisieren.
       Die Spalten bekommen unten `padding: 0 !important` — damit faellt die
       Gegenrechnung weg, mit der Bootstrap seinen Row-Gutter ausgleicht, und die
       Galerie steht 1 px links und 1 px rechts ueber dem Viewport (gemessen auf
       der PDP: #pd-gallery x=-1, Breite 392 bei 390 px Viewport). Zwei Pixel, aber
       exakt dieselbe Bauart wie der grosse Ueberlauf im Kopf. */
    .pd-section { display: flex !important; flex-direction: column !important;
                  margin-left: 0 !important; margin-right: 0 !important; }
    .pd-section.pd-section .pd-data-col.pd-data-col,
    .pd-section.pd-section .pd-info-col.pd-info-col,
    .pd-section.pd-section > .col-12 {
      flex: 1 1 100% !important;
      max-width: 100% !important;
      width: 100% !important;
      padding: 0 !important;
    }
    .pd-section.pd-section .pd-data-col.pd-data-col { order: 0; margin-bottom: 24px !important; }
    .pd-section.pd-section .pd-info-col.pd-info-col { order: 1; }

    /* Bild GROSS — keine Padding-Käfige, volle Viewport-Breite.
       Iter 13 Phase B Mobile-Reset: Desktop-Rule setzt .gal-cell padding-left:32px
       (fuer Thumb-Image-Gap). Auf Mobile ohne Thumbs daneben: zurueckdrehen. */
    .pd-image-section, .product-images, .pd-gallery, .gal-box, .gal-image,
    .pd-data-col .gal-box > .gal-cell {
      padding: 0 !important;
      margin: 0 !important;
      background: transparent !important;
    }
    .pd-data-col .gal-box, .pd-data-col .pd-data-col-inner > * {
      padding: 0 !important; margin: 0 !important;
    }
    .gal-image, .gal-image-cell, .pd-data-col img.file-img,
    .pd-data-col .gal-box img, .pd-data-col picture img {
      width: 100% !important;
      max-width: 100% !important;
      height: auto !important;
      object-fit: contain !important;
      display: block !important;
      margin: 0 auto !important;
    }
    /* Thumbnails-Strip darunter horizontal scrollbar, kompakt.
       Iter 13 Phase B Mobile-Reset: Desktop-Rule setzt vertical-align:middle
       und padding-right:32px — beides hier explizit zurueckdrehen. */
    .pd-data-col .gal-nav-cell, .pd-data-col .pd-thumbs, .product-thumbnails {
      flex-direction: row !important;
      flex-wrap: nowrap !important;
      overflow-x: auto !important;
      gap: 8px !important;
      padding: 8px 0 !important;
      margin: 0 !important;
      width: 100% !important;
      vertical-align: top !important;
      -webkit-overflow-scrolling: touch;
    }
    .pd-data-col .gal-nav-item, .pd-data-col .pd-thumbs > * {
      flex: 0 0 auto !important;
      width: 64px !important;
      height: 64px !important;
    }
    /* Slider-Dots dezent */
    .pd-data-col .slick-dots { padding: 8px 0 0 !important; }

    /* Info-Col Padding zurück geben (vorher genullt) — high specificity */
    .pd-section.pd-section .pd-info-col.pd-info-col {
      padding: 16px 16px 24px !important;
    }

    /* Stack-Order: Brand-Logo → Titel → Review → Preis → Variants → Cart-Buttons → Countdown → CTA → JobRad */
    .pd-info-col { gap: 10px !important; }
    .pd-info-col .pd-info { order: 1 !important; }
    .pd-info-col .pd-info .pd-brand-block { order: 0 !important; margin-bottom: 8px !important; }
    .pd-info-col .pd-info .page-title { order: 1 !important; }
    .pd-info-col .pd-info .pd-description { order: 2 !important; display: none !important; }
    .pd-info-col .pd-review-summary { order: 2 !important; padding: 0 !important; margin: 4px 0 8px !important; }
    .pd-info-col .pd-attrs-container { order: 3 !important; }
    .pd-info-col .pd-offer { order: 4 !important; }
    .pd-info-col .mts-pd-countdown { order: 5 !important; }
    .pd-info-col .mts-pd-cta-row { order: 6 !important; }
    .pd-info-col .mts-pd-jobrad { order: 7 !important; }
    .pd-info-col .mts-pd-providers-link { order: -1 !important; align-self: flex-start !important; }
    /* Iter 13 Phase A Mobile-Reset: Desktop-Override macht providers-link
       position:absolute. Auf Mobile soll es wieder im flow stacken. */
    .product-details-page .pd-info-col {
      position: static !important;
    }
    .product-details-page .pd-info-col .mts-pd-providers-link {
      position: static !important;
      top: auto !important;
      right: auto !important;
    }

    /* Titel kompakt aber lesbar */
    .pd-name, h1.pd-name, body.product-details .page-title h1.pd-name {
      font-size: 1.6rem !important;
      line-height: 1.2 !important;
      margin: 6px 0 4px !important;
    }
    /* Preis groß, Mobile-friendly */
    .pd-finalprice, .pd-finalprice-amount {
      font-size: 1.8rem !important;
    }

    /* Quantity + Cart-Button auf Mobile: Cart full-width darunter, qty kleiner */
    .pd-offer-actions, .pd-offer-actions-container .row {
      flex-wrap: wrap !important;
      gap: 10px !important;
    }
    .pd-offer-action-qty {
      flex: 0 0 auto !important;
      max-width: 50% !important;
    }
    .pd-offer-actions > .col {
      flex: 1 1 100% !important;
      max-width: 100% !important;
      min-width: 0 !important;
    }
    /* Add-to-Cart Button breit + griffig */
    #pd-add-to-cart, .add-to-cart-button {
      width: 100% !important;
      padding: 18px 24px !important;
      font-size: 16px !important;
    }

    /* CTA-Row: 1 Spalte auf Mobile */
    .mts-pd-cta-row { grid-template-columns: 1fr !important; }

    /* Tabs bleiben horizontal scrollbar.
       TASK-811 (2026-08-16): `overflow-y:hidden` ergaenzt. `.pd-tabs` traegt
       nicht nur den Reiter-Streifen, sondern den kompletten Inhalt darunter -
       ohne explizites overflow-y rechnet der Browser die zweite Achse auf
       `auto`. Gemessen auf mc.movetoshop.com: .pd-tabs 9532 px hoch, heute
       0 px Ueberlauf (also ohne sichtbare Wirkung), kippt aber bei jedem
       zusaetzlichen Pixel Inhalt (nachgeladenes Bild, laengerer Text, andere
       Systemschrift) zum Zwei-Achsen-Scrollcontainer mitten auf der Seite. */
    .pd-tabs, .nav-tabs {
      flex-wrap: nowrap !important;
      overflow-x: auto !important;
      overflow-y: hidden !important;
      -webkit-overflow-scrolling: touch;
      gap: 6px !important;
    }
    .pd-tabs .nav-link, .nav-tabs .nav-link {
      padding: 10px 16px !important;
      font-size: 14px !important;
      white-space: nowrap !important;
      flex: 0 0 auto !important;
    }

    header#header { position: static; }
    .menubar-section { padding: 4px 0 !important; }
    .shopbar { padding: 8px 0 !important; }
  }
  @media (max-width: 700px) {
    .container, .pd-info-col, .pd-data-col { padding-left: 14px !important; padding-right: 14px !important; }
    body.product-details .pd-data-col { padding: 0 !important; }
  }

  /* =====================================================================
     ITER 12 — User-Feedback (2026-04-27)
     A) List-View weisser Bild-BG, keine Trennlinien (oben implementiert)
     B) Kategorie-Hero Banner mit dunklem Bild + weisser Schrift
     C) Mobile Listing-Card komplett zentriert + grosser Cart-Button
     D) Mobile PDP komplett zentriert
     ===================================================================== */

  /* ---------- B) Kategorie-Hero Banner ---------- */
  /* Wrapper wird vom JS (initCategoryHero) erzeugt: <div class="mts-cat-hero-banner">.
     Title h1 + .mts-cat-tagline + .mts-cat-hero-rule wandern hinein.
     Banner ist edge-to-edge im main-Content-Bereich, dunkel (Bild + Overlay),
     weisse Typo, kompakt. Cube-Bilder via slug->media-id Mapping (data-bg-id) */
  /* C1: gehoisted (Banner sitzt jetzt vor der Breadcrumb in section#content). */
  body.mts-hero-hoisted .mts-cat-hero-banner { margin-top: 8px !important; }
  body.mts-cat-page .mts-cat-hero-banner {
    position: relative;
    margin: 16px 0 28px !important;
    /* Iter 14 Phase A: hoeher (180 -> 230), bisschen mehr vertikales Padding.
       Iter 15 Phase D: 230 -> 280 Desktop, mehr vertikales Padding (User:
       "die hoehe besser machen von den banner"). Mehr "Editorial"-Look. */
    padding: 64px 32px !important;
    border-radius: 18px !important;
    overflow: hidden !important;
    isolation: isolate;
    background: #1d1d1f;
    min-height: 280px;
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    text-align: center;
  }
  /* Cube-Produktbild als Hintergrund (cover, leicht verschoben damit das
     Rad nicht exakt zentriert hinter dem Text liegt). Wird pro Slug per
     data-bg-id auf eine bestimmte Smartstore-Media-Id gesetzt. */
  body.mts-cat-page .mts-cat-hero-banner::before {
    content: '';
    position: absolute;
    inset: 0;
    background-size: cover;
    background-position: center 35%;
    background-repeat: no-repeat;
    background-color: #1d1d1f;
    background-image: var(--mts-hero-bg, none);
    /* Iter 14 Phase A: weniger Brightness-Daempfung damit das Bike-Bild klarer
       sichtbar ist (User: "weniger deckkraft aber nur bisschen"). 0.55 -> 0.7 */
    filter: brightness(0.7) saturate(0.95);
    z-index: -2;
  }
  /* Dunkler Overlay-Gradient ueber dem Bild — weisser Text immer lesbar.
     Diagonal von dunkel-links zu mittel-rechts erzeugt Apple-Editorial-Look. */
  body.mts-cat-page .mts-cat-hero-banner::after {
    content: '';
    position: absolute;
    inset: 0;
    /* Iter 14 Phase A: Overlay reduziert (0.58/0.32/0.55 -> 0.42/0.18/0.42).
       Bild bleibt klar erkennbar, weisser Text bleibt durch Text-Shadow + Helligkeitsmix lesbar. */
    background:
      linear-gradient(135deg, rgba(0,0,0,0.42) 0%, rgba(0,0,0,0.18) 60%, rgba(0,0,0,0.42) 100%);
    z-index: -1;
  }
  /* Title + Tagline + Rule innerhalb des Banners — weiss. Nutzt höhere
     Spezifität als die generischen .category-page-Regeln, damit color #fff
     und centered greifen. */
  body.mts-cat-page .mts-cat-hero-banner h1,
  body.mts-cat-page .mts-cat-hero-banner h1.page-title,
  body.mts-cat-page .mts-cat-hero-banner .page-title h1 {
    color: #ffffff !important;
    font-size: clamp(1.75rem, 4vw, 3rem) !important;
    font-weight: 800 !important;
    letter-spacing: -0.025em !important;
    line-height: 1.1 !important;
    margin: 0 0 8px !important;
    text-shadow: 0 2px 12px rgba(0,0,0,0.35);
  }
  body.mts-cat-page .mts-cat-hero-banner .mts-cat-tagline {
    color: rgba(255,255,255,0.92) !important;
    font-size: clamp(0.95rem, 1.4vw, 1.2rem) !important;
    margin: 0 auto !important;
    font-weight: 500;
    text-shadow: 0 1px 8px rgba(0,0,0,0.4);
    max-width: 640px;
  }
  body.mts-cat-page .mts-cat-hero-banner .mts-cat-hero-rule {
    background: var(--mts-accent) !important;
    margin: 16px auto 0 !important;
    width: 48px !important;
    height: 3px !important;
    opacity: 1;
    box-shadow: 0 1px 6px rgba(var(--mts-c-primary-rgb),0.5);
  }
  /* Page-description / cat-page-desc bleibt UNTER dem Banner und sichtbar */
  body.mts-cat-page .mts-cat-hero-banner + .page-description,
  body.mts-cat-page .mts-cat-hero-banner ~ .page-description {
    text-align: center !important;
    color: var(--mts-text-muted) !important;
    margin: 0 auto 28px !important;
    max-width: 720px;
  }
  /* Mobile: kompakter Banner, Schrift kleiner aber kraftvoll */
  @media (max-width: 700px) {
    body.mts-cat-page .mts-cat-hero-banner {
      margin: 8px 0 20px !important;
      /* Iter 14 Phase A: mobile leicht hoeher (140 -> 170, padding 28 -> 36).
         Iter 15 Phase D: weiter rauf 170 -> 200 (User: "Hoehe besser machen"). */
      padding: 44px 20px !important;
      min-height: 200px;
      border-radius: 14px !important;
    }
    body.mts-cat-page .mts-cat-hero-banner h1 {
      font-size: 1.6rem !important;
    }
    body.mts-cat-page .mts-cat-hero-banner .mts-cat-tagline {
      font-size: 0.95rem !important;
    }
    body.mts-cat-page .mts-cat-hero-banner .mts-cat-hero-rule {
      margin-top: 12px !important;
      width: 38px !important;
    }
  }

  /* ---------- C) Mobile Listing-Card zentriert + grosser Cart-Button ---------- */
  @media (max-width: 559px) {
    /* Card-Inhalt komplett zentriert */
    .artlist:not(.artlist-lines) .art {
      text-align: center !important;
    }
    .artlist:not(.artlist-lines) .art .art-brand,
    .artlist:not(.artlist-lines) .art .art-vendor,
    .artlist:not(.artlist-lines) .art .art-name,
    .artlist:not(.artlist-lines) .art .art-name-link,
    .artlist:not(.artlist-lines) .art .art-name a,
    .artlist:not(.artlist-lines) .art .art-info,
    .artlist:not(.artlist-lines) .art .art-meta,
    .artlist:not(.artlist-lines) .art .art-shortdesc,
    .artlist:not(.artlist-lines) .art .art-genericname,
    .artlist:not(.artlist-lines) .art .art-price-block,
    .artlist:not(.artlist-lines) .art .art-price-block .art-price,
    .artlist:not(.artlist-lines) .art .art-price-block .art-finalprice,
    .artlist:not(.artlist-lines) .art .art-delivery-info {
      text-align: center !important;
    }
    /* Brand-Image: Block-zentriert (Default war inline-block links) */
    .artlist:not(.artlist-lines) .art .art-brand img.mts-brand-img,
    .artlist:not(.artlist-lines) .art .art-vendor img.mts-brand-img {
      display: block !important;
      margin: 0 auto !important;
    }
    /* Specs-Liste zentriert */
    .artlist:not(.artlist-lines) .art .mts-card-specs {
      align-items: center !important;
      text-align: center !important;
    }
    .artlist:not(.artlist-lines) .art .mts-card-specs__tag {
      justify-content: center !important;
    }
    /* Single-Size-Slot zentriert */
    .artlist:not(.artlist-lines) .art .mts-card-singlesize-slot {
      text-align: center !important;
      display: flex !important;
      justify-content: center !important;
    }
    /* Cart-Button: full-width und gross. Smartstore rendert in .art-drop ein
       Grid (Cart + Wishlist + Compare + Info). Wir splitten optisch:
       Cart-Button nimmt eigene erste Zeile, breit + 52px hoch + weiss-auf-schwarz
       (wir nutzen weiterhin Accent-Orange wie auf Desktop fuer Konsistenz, aber
       prominent). Wishlist/Compare/Info bleiben darunter als 3-Spalten. */
    .artlist:not(.artlist-lines) .art .art-drop {
      padding: 0 14px 16px !important;
    }
    /* C5: Info-Button (Beschreibung) entfernt -> Zeile 2 hat nur noch die
       Wunschliste. Eine Spalte fuellt die Zeile lueckenlos. Cart spannt via
       grid-column:1/-1 weiterhin die volle Breite in Zeile 1. */
    .artlist:not(.artlist-lines) .art .art-drop .art-btn-group,
    .artlist:not(.artlist-lines) .art .art-drop .row.no-gutters {
      grid-template-columns: 1fr !important;
      grid-auto-flow: row !important;
      gap: 8px !important;
    }
    /* Add-to-Cart auf 1. Zeile, full-width (3 Spalten breit) */
    .artlist:not(.artlist-lines) .art .art-drop .add-to-cart-button,
    .artlist:not(.artlist-lines) .art .art-drop .ajax-cart-link.btn-primary,
    .artlist:not(.artlist-lines) .art .art-drop .btn-primary {
      grid-column: 1 / -1 !important;
      width: 100% !important;
      min-height: 52px !important;
      height: 52px !important;
      padding: 0 18px !important;
      font-size: 0.95rem !important;
      font-weight: 700 !important;
      letter-spacing: 0.01em !important;
      box-shadow: 0 8px 20px rgba(var(--mts-c-primary-rgb),0.32) !important;
    }
    /* Wishlist + Compare + Info: jeweils 1 Spalte, gleiche Hoehe, kompakt */
    .artlist:not(.artlist-lines) .art .art-drop .art-btn-group > .btn:not(.add-to-cart-button):not(.btn-primary),
    .artlist:not(.artlist-lines) .art .art-drop .art-btn-group > .art-btn:not(.add-to-cart-button),
    .artlist:not(.artlist-lines) .art .art-drop .row.no-gutters > .btn:not(.add-to-cart-button):not(.btn-primary) {
      grid-column: span 1 !important;
      height: 40px !important;
      min-height: 40px !important;
      width: 100% !important;
    }
    /* Falls Wishlist/Compare/Info nicht in Reihe stehen — wir bauen
       ein dezidiertes Sub-Layout per Container :nth-child via display:grid
       on parent. Die obigen Regeln genuegen i.d.R. weil grid-auto-flow:row
       die uebrigen Children automatisch in Reihe 2 packt. */
  }

  /* ---------- D) Mobile PDP komplett zentriert ---------- */
  @media (max-width: 768px) {
    /* Info-Col komplett auf Mitte gepolt */
    .product-details-page .pd-info-col,
    .product-page .pd-info-col {
      text-align: center !important;
    }
    /* Brand-Logo zentriert (war inline-flex links) */
    .product-details-page .pd-info-col .pd-brand-block,
    .product-details-page .pd-info-col .pd-brand,
    .product-page .pd-info-col .pd-brand-block,
    .product-page .pd-info-col .pd-brand {
      display: flex !important;
      justify-content: center !important;
      margin: 0 auto 8px !important;
    }
    .product-details-page .pd-info-col .pd-brand-picture,
    .product-details-page .pd-info-col .pd-brand img,
    .product-page .pd-info-col .pd-brand-picture,
    .product-page .pd-info-col .pd-brand img {
      margin: 0 auto !important;
    }
    /* Title zentriert */
    .product-details-page .pd-info-col .pd-name,
    .product-details-page .pd-info-col h1.pd-name,
    .product-details-page .pd-info-col .page-title h1.pd-name,
    .product-page .pd-info-col h1.pd-name {
      text-align: center !important;
    }
    /* SKU / Subtitle / Short-Description / Tags */
    .product-details-page .pd-info-col .pd-sku,
    .product-details-page .pd-info-col .pd-shortdesc,
    .product-details-page .pd-info-col .pd-tag-list,
    .product-details-page .pd-info-col .pd-shipping-info,
    .product-details-page .pd-info-col .pd-stock-info,
    .product-details-page .pd-info-col .pd-delivery-info {
      text-align: center !important;
      justify-content: center !important;
    }
    /* Variant-Pills + Attribute-Rows zentriert */
    .product-details-page .pd-info-col .pd-attrs-container,
    .product-details-page .pd-info-col .pd-attribute-row,
    .product-details-page .pd-info-col .pd-attribute-options,
    .product-details-page .pd-info-col .pd-attribute-options-list,
    .product-details-page .pd-info-col .pd-variants {
      text-align: center !important;
      justify-content: center !important;
    }
    .product-details-page .pd-info-col .pd-attribute-options,
    .product-details-page .pd-info-col .pd-attribute-options-list,
    .product-details-page .pd-info-col .pd-variants,
    .product-details-page .pd-info-col .pd-attribute-controls {
      display: flex !important;
      flex-wrap: wrap !important;
      justify-content: center !important;
      gap: 8px !important;
    }
    /* Variant-Labels (vor den Pills, "Größe", "Farbe") zentriert */
    .product-details-page .pd-info-col .pd-attribute-label,
    .product-details-page .pd-info-col .pd-attribute-name,
    .product-details-page .pd-info-col .pd-attribute-row > label {
      text-align: center !important;
      display: block !important;
      width: 100% !important;
    }
    /* Preis-Block zentriert */
    .product-details-page .pd-info-col .pd-offer,
    .product-details-page .pd-info-col .pd-offer-price,
    .product-details-page .pd-info-col .pd-offer-price-container,
    .product-details-page .pd-info-col .pd-finalprice,
    .product-details-page .pd-info-col .pd-baseprice,
    .product-details-page .pd-info-col .pd-old-price,
    .product-details-page .pd-info-col .pd-price-section {
      text-align: center !important;
      justify-content: center !important;
    }
    .product-details-page .pd-info-col .pd-offer-price-container,
    .product-details-page .pd-info-col .pd-finalprice {
      display: flex !important;
      flex-direction: column !important;
      align-items: center !important;
    }
    /* Quantity-Block zentriert */
    .product-details-page .pd-info-col .pd-qty,
    .product-details-page .pd-info-col .pd-quantity,
    .product-details-page .pd-info-col .pd-qty-section,
    .product-details-page .pd-info-col .qty-input,
    .product-details-page .pd-info-col .input-group.qty,
    .product-details-page .pd-info-col .qty-spinner,
    .product-details-page .pd-info-col .pd-offer-actions,
    .product-details-page .pd-info-col .pd-actions-container,
    .product-details-page .pd-info-col .pd-buy-section {
      justify-content: center !important;
      margin-left: auto !important;
      margin-right: auto !important;
    }
    .product-details-page .pd-info-col .qty-input,
    .product-details-page .pd-info-col .input-group.qty {
      display: flex !important;
      justify-content: center !important;
      max-width: 160px !important;
      margin: 0 auto 12px !important;
    }
    /* Add-to-Cart-Button zentriert + breit */
    .product-details-page .pd-info-col #pd-add-to-cart,
    .product-details-page .pd-info-col .add-to-cart-button {
      margin-left: auto !important;
      margin-right: auto !important;
      max-width: 480px !important;
    }
    /* Countdown-Block zentriert */
    .product-details-page .pd-info-col .mts-pd-countdown {
      text-align: center !important;
      margin-left: auto !important;
      margin-right: auto !important;
    }
    /* CTA-Row + JobRad + Provider-Link zentriert */
    .product-details-page .pd-info-col .mts-pd-cta-row,
    .product-details-page .pd-info-col .mts-pd-jobrad,
    .product-details-page .pd-info-col .mts-pd-providers-link {
      text-align: center !important;
    }
    /* Review-Summary zentriert */
    .product-details-page .pd-info-col .pd-review-summary {
      text-align: center !important;
      justify-content: center !important;
    }
  }

  /* ==============================================================
     ===== ITER 18 — PDP Preis-/Angebots-Sektion zentriert (Desktop) =
     User: "die Preis-/Angebots-Sektion soll horizontal mittig statt
     linksbuendig dargestellt werden".
     Scope: NUR die Preis-/Offer-Subklassen innerhalb der PDP-Info-Col
     (.product-details-page .pd-info-col ...). Trifft bewusst NICHT:
       - Listing-/Kachel-Preise (.art-* — anderer Container)
       - Produkt-Varianten (.pd-variants* — User arbeitet parallel)
       - Menge/Warenkorb-Button (.pd-offer-actions* — bleibt wie gehabt)
     Die Mobile-Query oben (max-width:768px) zentriert bereits alles;
     dieser Block ergaenzt die Zentrierung NUR fuer den Preis-Block auch
     auf Desktop und deckt die Smartstore-CE-UVP/Ersparnis-Struktur ab
     (.pd-promoprice-group / .pd-promoprice-line / .pd-promosaving).
     Struktur (CE 6.3 Price-Partial):
       .pd-offer-price-container > .pd-offer-price
         > .pd-group > .pd-price-group
            > .pd-finalprice (.pd-finalprice-offer) [Verkaufspreis]
            > .pd-promoprice-group
                > .pd-promoprice-line  "Unverb. Preisempf.:" + UVP + Tip
                > .pd-promoprice-line  "Sie sparen:" + Betrag + Badge
                    > .pd-promosaving.d-flex  (Flex: Betrag + Badge)
         > .pd-group > .pd-legalinfo  "inkl. MwSt. Versandkostenfrei"
       .pd-stock-info-container > .pd-stock-info > .pd-stock  "Vorraetig"
     ============================================================== */
  /* Block-Level-Zentrierung der Container (text-align vererbt auf
     alle inline/Text-Kinder: Preis, UVP-Zeile, Erklaerung, Legalinfo). */
  .product-details-page .pd-info-col .pd-offer-price-container,
  .product-details-page .pd-info-col .pd-offer-price,
  .product-details-page .pd-info-col .pd-offer-price > .pd-group,
  .product-details-page .pd-info-col .pd-price-group,
  .product-details-page .pd-info-col .pd-finalprice,
  .product-details-page .pd-info-col .pd-promoprice-group,
  .product-details-page .pd-info-col .pd-promoprice-line,
  .product-details-page .pd-info-col .pd-legalinfo,
  .product-details-page .pd-info-col .pd-stock-info-container,
  .product-details-page .pd-info-col .pd-stock-info,
  .product-details-page .pd-info-col .pd-stock {
    text-align: center !important;
  }
  /* Flex-Container im Preisblock: text-align zentriert Flex-ITEMS nicht.
     Live gemessen (getComputedStyle): .pd-finalprice (Hauptpreis-Wrapper) und
     .pd-promoprice-line ("Unverb. Preisempf." + "Sie sparen" Zeilen) sind
     display:flex; justify-content:normal -> ihre Kinder (Preis-Amount, Label +
     UVP/Sparbetrag) bleiben sonst linksbuendig trotz text-align:center.
     Daher justify-content:center fuer alle Flex-Container der Preis-Sektion.
     .pd-promosaving (.d-flex, "Sie sparen" Betrag + Badge) ebenso. */
  .product-details-page .pd-info-col .pd-finalprice,
  .product-details-page .pd-info-col .pd-promoprice-line,
  .product-details-page .pd-info-col .pd-promosaving.d-flex,
  .product-details-page .pd-info-col .pd-promosaving {
    justify-content: center !important;
  }
  /* .pd-stock-info ist .pd-group (kann flex sein) -> ebenfalls mittig. */
  .product-details-page .pd-info-col .pd-stock-info {
    justify-content: center !important;
  }

  /* ==============================================================
     ===== ITER 16 — Phase A: PDP Header weiter rauf  ==============
     User: "ich moechte das alles weiter nach oben rutscht bei der
     produktseite ... weil ueber leasing anbieter und marken logo
     noch viel platz zum header ist".
     Recon: Header bottom y=170, Brand+ProvidersLink y=274 → 104px Gap.
     Davon: Breadcrumb y=194..244 (Hoehe 50, padding-top 16), dann
     Whitespace 30px bis pd-section y=274.
     Ziel: Brand y ~210-220 (rund 60px hochziehen).
     Mechanik: body.mts-pdp (vom JS gesetzt) als Scope. Breadcrumb
     enger ziehen (padding 16->4 top, height ~50->28). Ausserdem
     pd-section margin-top negativ ziehen, um die generische
     content-Body Top-Whitespace zu schliessen.
     ============================================================== */
  body.mts-pdp .breadcrumb-container {
    margin-top: 0 !important;
    margin-bottom: 0 !important;
  }
  body.mts-pdp .breadcrumb-container .breadcrumb,
  body.mts-pdp .breadcrumb {
    padding-top: 4px !important;
    padding-bottom: 4px !important;
    margin-bottom: 0 !important;
    font-size: 12px !important;
    line-height: 1.3 !important;
  }
  /* Inhalts-Bereich in Smartstore ist <section.container#content> mit
     Smartstore-Default-Padding/Margin. Wir ziehen die pd-section eng an
     den Breadcrumb. */
  body.mts-pdp section#content,
  body.mts-pdp .container#content {
    padding-top: 0 !important;
    margin-top: 0 !important;
  }
  body.mts-pdp .pd-section {
    margin-top: -8px !important;
    padding-top: 0 !important;
  }
  /* Auf der gesamten PDP keine zusaetzlichen Top-Margins auf den ersten
     Block in der Info-Col und Data-Col. */
  body.mts-pdp .pd-section .pd-info-col,
  body.mts-pdp .pd-section .pd-data-col {
    padding-top: 0 !important;
  }
  /* Brand-Block: vorher hatte er ggf. mt durch Smartstore-Default; nullen. */
  body.mts-pdp .pd-info-col .pd-info .pd-brand-block {
    margin-top: 0 !important;
  }
  /* Mobile: Breadcrumb noch kompakter, pd-section dichter an Header */
  @media (max-width: 767px) {
    body.mts-pdp .breadcrumb-container .breadcrumb,
    body.mts-pdp .breadcrumb {
      padding-top: 2px !important;
      padding-bottom: 2px !important;
      font-size: 11px !important;
    }
    body.mts-pdp .pd-section {
      margin-top: -4px !important;
    }
  }

  /* ==============================================================
     ===== ITER 16 — Phase B: Variant-Pills Auto-Width + Single  ===
     User: "die groessen jetzt nicht mehr lesen weil die button
     breite nicht angepasst ist an den text der option".
     User: "wenn nur eine groesse verfuegbar ist dann sollte 1 gr
     angezeigt werden nichtmehr 2 grid".
     Loesung: grid-template-columns auf auto-fit/minmax(140px, 1fr)
     -- Pills nehmen mind. 140px Breite, koennen breiter werden bei
     langen Werten (Diamant 22"/29/XL etc.). Bei nur einem Pill
     setzen wir per JS die Klasse `.mts-variant-pills--single`, die
     auf 1-Spalte umschaltet (voll-breit). Color-Swatches bleiben
     Flex (Phase B referenziert sie nicht).
     ============================================================== */
  /* Override Iter 15-Grid: jetzt auto-fit. Hoehere Spezifitaet via Body. */
  body .mts-variant-pills:not(.mts-variant-pills--swatch) {
    grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)) !important;
    max-width: 420px !important;
  }
  /* Single-Pill: 1-Spalte voll-breit (gut sichtbar als "nur eine Groesse"). */
  body .mts-variant-pills.mts-variant-pills--single:not(.mts-variant-pills--swatch) {
    grid-template-columns: 1fr !important;
    max-width: 280px !important;
  }
  /* Pills duerfen jetzt breiter als 56px sein, Text wird komplett gezeigt.
     Falls extrem lang, wird er ueber padding/whitespace nowrap kontrolliert.
     Wir lassen white-space:nowrap (Iter 10 Default), aber erlauben weiches
     Wrapping bei sehr langem Text via overflow-wrap. */
  body .mts-variant-pills:not(.mts-variant-pills--swatch) .mts-variant-pill {
    white-space: normal !important;
    line-height: 1.25 !important;
    text-align: center !important;
    padding: 8px 14px !important;
    min-height: 44px !important;
  }
  @media (max-width: 767px) {
    body .mts-variant-pills:not(.mts-variant-pills--swatch) {
      grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)) !important;
      max-width: 100% !important;
    }
  }

  /* ==============================================================
     ===== ITER 16 — Phase C: Hero-Banner Hoehe + OnlineShopBilder ==
     User: "die hoehe besser machen ... etwas groesser ... als das
     aktuelle". Aktuell 280/200 -> jetzt 340 Desktop / 240 Mobile.
     Bilder kommen aus /mtsbilder/* (kuratierte Cube-Lifestyle-
     Aufnahmen, keine Catalog-Cutouts mehr fuer Hero).
     ============================================================== */
  body.mts-cat-page .mts-cat-hero-banner {
    min-height: 340px !important;
    padding: 76px 32px !important;
    margin: 16px 0 28px !important;
  }
  /* Lifestyle-Bilder sind nicht zentriert auf Bike sondern echtes
     Editorial — backgroundPosition auf center center, brightness
     etwas mehr (Bilder sind dunkler als Catalog-Cutouts). */
  body.mts-cat-page.mts-hero-lifestyle .mts-cat-hero-banner::before {
    background-position: center center !important;
    background-size: cover !important;
    filter: brightness(0.78) saturate(1.05) !important;
  }
  body.mts-cat-page.mts-hero-lifestyle .mts-cat-hero-banner::after {
    background:
      linear-gradient(135deg, rgba(0,0,0,0.55) 0%, rgba(0,0,0,0.30) 60%, rgba(0,0,0,0.55) 100%) !important;
  }
  @media (max-width: 700px) {
    body.mts-cat-page .mts-cat-hero-banner {
      min-height: 240px !important;
      padding: 56px 22px !important;
    }
  }

  /* ==============================================================
     ===== ITER 16 — Phase D: Manufacturer-Page = Category-Page  ===
     User: "die marken kategorie seite ganz anders aussieht wie die
     anderen kategorien seite ... mache das die marken seite wie
     die kategorien seite ... zeige das logo von dem anbieter an".
     DOM-Recon: .manufacturer-page hat exakt die gleiche Struktur
     wie .category-page (.page-title h1, .page-body, product-list-
     container, artlist), aber Smartstore-CSS scoped vieles auf
     .category-page. Hier extenden wir ALLE relevanten Selectoren
     mit `.manufacturer-page`.
     JS extension: isCategoryPage() schliesst Manufacturer ein,
     initCategoryHero erkennt Manufacturer und nutzt Bidex-Logo
     im Banner statt Tagline.
     ============================================================== */
  /* Container-Layout-Fixes: Manufacturer-Page genauso wie Category-Page. */
  body.lyt-cols-2:has(.manufacturer-page) > .container,
  body.lyt-cols-2:has(.manufacturer-page) .container.menubar-container,
  body.lyt-cols-2:has(.manufacturer-page) > div > .container:not(.menubar-container):not(.shopbar-container):not(.megamenu-container):not(.footer-main):not(.footer-bottom):not(.footer-social) {
    /* selber Trick wie .category-page-Layout */
  }
  /* Listing-Card-Bilder, Hero, Filter-Sidebar — alle via .mts-cat-page Body-
     Class scopen, die JS jetzt auch auf Manufacturer-Pages setzt. */

  /* Generic page-title / description Klone fuer Manufacturer */
  .manufacturer-page h1,
  .manufacturer-page .page-title h1 {
    font-size: clamp(2rem, 4vw, 3rem) !important;
    margin: 32px 0 16px !important;
    letter-spacing: -0.025em;
    font-weight: 700 !important;
  }
  .manufacturer-page .manufacturer-description,
  .manufacturer-page .page-description {
    color: var(--mts-text-muted) !important;
    font-size: 1.05rem !important;
    line-height: 1.55 !important;
    max-width: 720px;
    margin-bottom: 32px !important;
  }
  /* Toolbar/Pagination/Cards in Manufacturer-Page wie Category-Page */
  .manufacturer-page .toolbar { background: transparent !important; border: 0 !important; padding: 0 !important; margin-bottom: 24px !important; }

  /* Brand-Logo im Hero-Banner (vom JS injiziert: .mts-cat-hero-brandlogo)
     Iter 17 Phase A: User-Feedback "transparent sodass man direkt das logo
     sieht ohne hintergrund". Daher kein Box-BG/Padding/Border-Radius mehr.
     Stattdessen kraftvoller drop-shadow als Tiefe + leichte glow gegen
     dunkle Bildbereiche. Bidex-Logos sind auf weissem Hintergrund 250x185
     – mix-blend-mode:multiply blendet das Weiss aus, ohne dass das Logo
     leidet (Bidex-Logos sind farbig auf neutralem Weiss gedruckt). */
  body.mts-cat-page .mts-cat-hero-banner .mts-cat-hero-brandlogo {
    display: block;
    max-width: 240px;
    max-height: 110px;
    width: auto;
    height: auto;
    margin: 0 auto 14px;
    object-fit: contain;
    background: transparent !important;
    padding: 0 !important;
    border-radius: 0 !important;
    box-shadow: none !important;
    border: 0 !important;
    mix-blend-mode: multiply;
    filter: drop-shadow(0 4px 14px rgba(0,0,0,0.55)) drop-shadow(0 1px 2px rgba(0,0,0,0.45));
  }
  @media (max-width: 700px) {
    body.mts-cat-page .mts-cat-hero-banner .mts-cat-hero-brandlogo {
      max-width: 170px;
      max-height: 78px;
      margin-bottom: 10px;
    }
  }

  /* ==============================================================
     ===== ITER 17 Phase C — Sub-Kategorie-Tile ohne Bild =========
     User: "soll das erste produktbild angezeigt werden was dahinter
     ist als kategorie bild ohne hintergrund etc."
     JS setzt .mts-cat-tile-fixed auf .art sobald das echte Produkt-
     bild geladen ist. Bis dahin bleibt der default-image-Look.
     Der Card-Wrapper soll transparent sein und das Produktbild
     direkt zeigen (kein grauer BG, kein Padding-Frame).
     ============================================================== */
  .artlist .art.mts-cat-tile-fixed .art-picture-block {
    background: transparent !important;
    border: 0 !important;
    box-shadow: none !important;
  }
  .artlist .art.mts-cat-tile-fixed .art-picture img,
  .artlist .art.mts-cat-tile-fixed .art-picture-block img {
    background: transparent !important;
    padding: 4px !important;
    object-fit: contain !important;
    mix-blend-mode: multiply;
  }
  /* Card-Hover bleibt aktiv, aber dezenter Schatten statt flaeche */
  .artlist .art.mts-cat-tile-fixed:hover .art-picture-block {
    box-shadow: 0 6px 24px rgba(0,0,0,0.10) !important;
  }


/* ===== Iter-21-MM — Header-Megamenu-Hover-Sustain (no-flicker switch) ===== */
header#header .megamenu-dropdown-container {
  /* Container-Background IMMER weiß setzen — selbst im height:0-Zustand
     blitzt dann nichts mehr durch falls JS-Sustain einen Frame zu spät kommt. */
  background: #fff !important;
  transition: none !important;
}
/* Sustain-Klasse vom JS gesetzt — hält Container offen für 180ms nach Verlassen,
   überbrückt das Smartstore-Unmount-vor-Mount-Flackern beim Trigger-Switch. */
header#header .megamenu-dropdown-container.mts-mm-sustain {
  height: auto !important;
  overflow: visible !important;
  padding: 24px !important;
  background: #fff !important;
  box-shadow: 0 30px 60px -15px rgba(0,0,0,0.18) !important;
  border-radius: var(--mts-radius) !important;
  pointer-events: auto !important;
}
/* Inhalt während Sustain trotzdem nur dann sichtbar wenn ein .show child da ist —
   sustain-only-state zeigt leeren weißen Container, kein altes Inhalt-Echo. */
header#header .megamenu-dropdown-container.mts-mm-sustain:not(:has(.dropdown-menu.show)):not(:has(> div.show)) > div {
  visibility: hidden !important;
}
/* ===== /Iter-21-MM ====================================================== */

/* ===== Iter-21-CTA — PDP-CTA-Buttons border weg, Pill-Style mit Tint ====== */
.mts-pdp-extras--iter20 .mts-pdp-cta-btn,
.mts-pdp-extras .mts-pdp-cta-btn {
  border: 0 !important;
  outline: 0 !important;
  box-shadow: none !important;
  border-radius: 12px !important;
}
.mts-pdp-extras--iter20 .mts-pdp-cta-btn--filiale {
  background: #f3f4f6 !important;
  color: #1f2937 !important;
}
.mts-pdp-extras--iter20 .mts-pdp-cta-btn--filiale:hover {
  background: #e5e7eb !important;
  transform: translateY(-1px);
}
.mts-pdp-extras--iter20 .mts-pdp-cta-btn--leasing {
  background: #d1fae5 !important;
  color: #065f46 !important;
}
.mts-pdp-extras--iter20 .mts-pdp-cta-btn--leasing:hover {
  background: #a7f3d0 !important;
  transform: translateY(-1px);
}
.mts-pdp-extras--iter20 .mts-pdp-cta-btn--bestpreis {
  background: #fee2e2 !important;
  color: #991b1b !important;
}
.mts-pdp-extras--iter20 .mts-pdp-cta-btn--bestpreis:hover {
  background: #fecaca !important;
  transform: translateY(-1px);
}
/* ===== /Iter-21-CTA ===================================================== */



/* ===== Iter-22-MM — Header-Megamenu Outer-Container TRANSPARENT ============
   Iter-19 + Iter-21 setzten Background/Padding/Shadow am OUTER Container,
   der ueber komplette 1440px Headerbreite spannt -> sichtbar als weisse
   Leiste rechts vom eigentlich schmalen Dropdown.
   Iter-22: Outer wird komplett unsichtbar, alle visuellen Eigenschaften
   liegen am inneren .dropdown-menu (Smartstore-Default, bereits korrekt).
   ========================================================================== */
header#header .megamenu-dropdown-container.simple,
header#header .megamenu-dropdown-container.simple.mts-mm-sustain,
header#header .megamenu-dropdown-container.simple:has(> div.show),
header#header .megamenu-dropdown-container.simple:has(.dropdown-menu.show) {
  background: transparent !important;
  background-color: transparent !important;
  box-shadow: none !important;
  border-radius: 0 !important;
  padding: 0 !important;
  border: 0 !important;
}
/* Container muss im Show/Sustain-Zustand "offen" sein, damit das absolut
   positionierte innere .dropdown-menu nicht durch Container-overflow:hidden
   geclippt wird. height:0 ist ok solange overflow:visible -> Inner ragt raus. */
header#header .megamenu-dropdown-container.simple:has(> div.show),
header#header .megamenu-dropdown-container.simple:has(.dropdown-menu.show),
header#header .megamenu-dropdown-container.simple.mts-mm-sustain {
  overflow: visible !important;
  pointer-events: auto !important;
}
/* Sustain im Leer-Zustand: keine pointer-events brauchen wir nicht zu
   suppressen — Container ist transparent, hat keine visuelle Praesenz mehr. */

/* Inner .dropdown-menu hat bereits alle visuellen Eigenschaften (Smartstore-
   Default). Hier minimal anheben fuer Apple-Look-Konsistenz: groesserer
   border-radius + leicht weicherer Schatten. */
header#header .megamenu-dropdown-container.simple .dropdown-menu {
  border-radius: 14px !important;
  box-shadow: 0 30px 60px -15px rgba(0,0,0,0.18), 0 8px 24px -8px rgba(0,0,0,0.12) !important;
  border: 0 !important;
  padding: 10px !important;
}
/* ===== /Iter-22-MM ======================================================== */



/* ===== Iter-22-PHASE2-FONT — Bidex Webfont (woff2 inline) =================
   Quelle: ShopifyApp/BikeShopDesignDede/assets/bidex.woff2 + bidex-icons.css
   1:1 wie zweirad-dede.de, kein Asset-Upload noetig.
   ========================================================================== */
/* Bidex Icon Font - V. 001.00 */
@font-face {
	font-family: 'bidex';
	src: url('data:font/woff2;base64,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') format('woff2');
	font-weight: normal;
	font-style: normal;
	font-display: swap;
}	
.bidex {
	display: inline-block;
	font: normal normal normal 14px/1 bidex;
	font-family: 'bidex';
	font-size: inherit;
	text-rendering: auto;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	font-size:28px;
}
.bidex-sm {
	font-size: 1.2em;
}
.bidex-2x {font-size: 2em;}
.bidex-3x {font-size: 3em;}
.bidex-4x {font-size: 4em;}
.bidex-5x {font-size: 5em;}
.bidex-6x {font-size: 6em;}
.bidex-7x {font-size: 7em;}
.bidex-8x {font-size: 8em;}
.bidex-9x {font-size: 9em;}
.bidex-10x {font-size: 10em;}


.bidex-bidex:before{
	content: "\f000";
}
/* Damen */
.bidex-ft10:before{	
	content: "\f001";
}
/* Trapez */
.bidex-ft11:before{	
	content: "\f002";
}
/* Mixte */
.bidex-ft12:before{	
	content: "\f003";
}
/* Wave */
.bidex-ft13:before{	
	content: "\f004";
}
/* Tiefeinsteiger */
.bidex-ft14:before{	
	content: "\f005";
}
/* Schwanenhals */
.bidex-ft15:before{	
	content: "\f006";
}
/* Curve */
.bidex-ft16:before{	
	content: "\f007";
}
/* Herren */
.bidex-ft20:before{	
	content: "\f008";
}
/* Diamant */
.bidex-ft21:before{	
	content: "\f009";
}
/* Pedersen */
.bidex-ft22:before{	
	content: "\f00a";
}
/* Unisex */
.bidex-ft30:before{	
	content: "\f00b";
}
/* Y-Rahmen */
.bidex-ft31:before{	
	content: "\f00c";
}
/* Compact */
.bidex-ft32:before{	
	content: "\f00d";
}
/* Faltrahmen */
.bidex-ft33:before{	
	content: "\f00e";
}
/* Liegeradrahmen */
.bidex-ft40:before{	
	content: "\f00f";
}
/* Transportrad */
.bidex-ft50:before{	
	content: "\f010";
}
/* Long-John */
.bidex-ft51:before{	
	content: "\f011";
}
/* Backpacker */
.bidex-ft52:before{	
	content: "\f012";
}
/* Bäckerrad */
.bidex-ft53:before{	
	content: "\f013";
}
/* Transport-Dreirad */
.bidex-ft55:before{	
	content: "\f014";
}



/* Spezifikationen */

/* Jahr */
.bidex-year:before{	
	content: "\f100";
}
/* Rahmen */
.bidex-frame:before{	
	content: "\f101";
}
/* Rahmen-Farbe */
.bidex-framecolor:before{	
	content: "\f102";
}
/* Rahmen-Farben */
.bidex-bidex-fc:before{	
	content: "\f103";
}
/* Rahmen-Material */
.bidex-bidex-fm:before{	
	content: "\f104";
}
/* Rahmen-Form */
.bidex-bidex-ft:before{	
	content: "\f105";
}
/* Gabel */
.bidex-fork:before{	
	content: "\f106";
}
/* Gabel Federweg */
.bidex-fork-suspension-travel:before{	
	content: "\f107";
}
/* Dämpfer */
.bidex-rear-shock:before{	
	content: "\f108";
}
/* Dämpfer Federweg */
.bidex-rear-shock-suspension-travel:before{	
	content: "\f109";
}
/* Schaltung */
.bidex-derailleur:before{	
	content: "\f10a";
}
/* Schalthebel */
.bidex-shift-levers:before{	
	content: "\f10b";
}
/* Schalthebel */
.bidex-front-derailleur:before{	
	content: "\f10c";
}
/* Schaltungstyp */
.bidex-bidex-gs:before{	
	content: "\f10d";
}
/* Bremse */
.bidex-brakes:before{	
	content: "\f10e";
}
/* Bremshebel */
.bidex-brake-levers:before{	
	content: "\f10f";
}
/* Bremsscheiben */
.bidex-brake-disc:before{	
	content: "\f110";
}
/* Laufradsatz */
.bidex-wheelset:before{	
	content: "\f111";
}
/* Felgen */
.bidex-rims:before{	
	content: "\f112";
}
/* Naben */
.bidex-hubs:before{	
	content: "\f113";
}
/* Reifen */
.bidex-tires:before{	
	content: "\f114";
}
/* Speichen	*/
.bidex-spokes:before{	
	content: "\f115";
}
/* Lenker */
.bidex-handlebar:before{	
	content: "\f116";
}
/* Vorbau */
.bidex-stem:before{	
	content: "\f117";
}
/* Steuersatz */
.bidex-headset:before{	
	content: "\f118";
}
/* Griffe */
.bidex-grips:before{	
	content: "\f119";
}
/* Lenkeraufsatz */
.bidex-aerobar:before{	
	content: "\f11a";
}
/* Lenkerband */
.bidex-handlebar-tape:before{	
	content: "\f11b";
}
/* Sattel */
.bidex-saddle:before{	
	content: "\f11c";
}
/* Sattelklemme	*/
.bidex-seat-clamp:before{	
	content: "\f11d";
}
/* Sattelstütze	*/
.bidex-seat-post:before{	
	content: "\f11e";
}
/* Kurbelsatz */
.bidex-crankset:before{	
	content: "\f11f";
}
/* Innenlager */
.bidex-bottom-bracket:before{	
	content: "\f120";
}
/* Kette */
.bidex-chain:before{	
	content: "\f121";
}
/* Kettenschutz */
.bidex-chainguard:before{	
	content: "\f122";
}
/* Zahnkranz */
.bidex-sprocket:before{	
	content: "\f123";
}
/* Frontleuchte */
.bidex-front-light:before{	
	content: "\f124";
}
/* Rückleuchte */
.bidex-rear-light:before{	
	content: "\f125";
}
/* Dynamo */
.bidex-dynamo:before{	
	content: "\f126";
}
/* Gepäckträger */
.bidex-rack:before{	
	content: "\f127";
}
/* Gepäckträger vorne */
.bidex-front-rack:before{	
	content: "\f128";
}
/* Schutzbleche */
.bidex-mudguards:before{	
	content: "\f129";
}
/* Schloss */
.bidex-lock:before{	
	content: "\f12a";
}
/* Ständer */
.bidex-stand:before{	
	content: "\f12b";
}
/* Pedale */
.bidex-pedals:before{	
	content: "\f12c";
}
/* Motor */
.bidex-motor:before{	
	content: "\f12d";
}
/* Akku */
.bidex-battery:before{	
	content: "\f12e";
}
/* Akku-Kapazität (wH) */
.bidex-battery-capacity:before{	
	content: "\f12f";
}
/* Display */
.bidex-display:before{	
	content: "\f130";
}
/* Reichweite */
.bidex-range:before{	
	content: "\f131";
}
/* Gewicht */
.bidex-weight:before{	
	content: "\f132";
}
/* Zulässiges Gesamtgewicht */
.bidex-permissible-total-weight:before{	
	content: "\f133";
}
/* Strassenzulassung */
.bidex-bidex-st:before{	
	content: "\f134";
}
/* Sport-Lenker */
.bidex-hb10:before{	
	content: "\f200";
}
.bidex-hb11:before{	
	content: "\f201";
}
.bidex-hb12:before{	
	content: "\f202";
}
.bidex-hb20:before{	
	content: "\f203";
}
.bidex-hb21:before{	
	content: "\f204";
}
.bidex-hb22:before{	
	content: "\f205";
}
.bidex-hb23:before{	
	content: "\f206";
}
.bidex-hb24:before{	
	content: "\f207";
}
.bidex-hb30:before{	
	content: "\f208";
}
.bidex-hb31:before{	
	content: "\f209";
}
.bidex-hb32:before{	
	content: "\f20A";
}
.bidex-hb33:before{	
	content: "\f20B";
}
.bidex-hb34:before{	
	content: "\f20C";
}
.bidex-hb35:before{	
	content: "\f20D";
}
.bidex-hb36:before{	
	content: "\f20E";
}
/*  Sattelstützen  */
.bidex-sp10:before{	
	content: "\f300";
}
.bidex-sp20:before{	
	content: "\f301";
}
.bidex-sp30:before{	
	content: "\f302";
}
.bidex-sp31:before{	
	content: "\f303";
}
.bidex-sp32:before{	
	content: "\f304";
}
.bidex-sp40:before{	
	content: "\f305";
}
.bidex-sp41:before{	
	content: "\f306";
}
.bidex-sp42:before{	
	content: "\f307";
}
.bidex-sp43:before{	
	content: "\f308";
}
.bidex-sp60:before{	
	content: "\f309";
}
.bidex-sp61:before{	
	content: "\f30A";
}

/* Rahmen-Hauptfarbe Icons */
.bidex-fc10:before{	/* gelb */
	content: "\f400";
}
.bidex-fc20:before{	/* orange */
	content: "\f401";
}
.bidex-fc30:before{	/* rot */
	content: "\f402";
}
.bidex-fc40:before{	/* violett */
	content: "\f403";
}
.bidex-fc50:before{	/* blau */
	content: "\f404";
}
.bidex-fc60:before{	/* grün */
	content: "\f405";
}
.bidex-fc70:before{	/* grau */
	content: "\f406";
}
.bidex-fc80:before{	/* braun */
	content: "\f407";
}
.bidex-fc90:before{	/* weiß */
	content: "\f408";
}
.bidex-fc95:before{	/* schwarz */
	content: "\f409";
}
.bidex-fc96:before{	/* silber */
	content: "\f40A";
}

/* Rahmenhöhe Icons */
.bidex-fh43:before{	/* 43 cm */
	content: "\f500";
}
.bidex-fh48:before{	/* 48 cm */
	content: "\f501";
}
.bidex-fh53:before{	/* 53 cm */
	content: "\f502";
}
.bidex-fh58:before{	/* 58 cm */
	content: "\f503";
}
.bidex-fh82:before{	/* S */
	content: "\f504";
}
.bidex-fh83:before{	/* M */
	content: "\f505";
}
.bidex-fh84:before{	/* L */
	content: "\f506";
}
.bidex-fh85:before{	/* XL */
	content: "\f507";
}

/* Schaltungstyp Icons */
.bidex-gs10:before{	/* Kettenschaltung */
	content: "\f600";
}
.bidex-gs20:before{	/* Nabenschaltung */
	content: "\f601";
}
.bidex-gs30:before{	/* Tretlagergetriebe */
	content: "\f602";
}

/* Laufradgröße Icons */
.bidex-ws24:before{	/* 24"/507mm */
	content: "\f700";
}
.bidex-ws27:before{	/* 27"/630mm */
	content: "\f701";
}
.bidex-ws28:before{	/* 28"/622mm */
	content: "\f702";
}
.bidex-ws29:before{	/* 29"/622mm */
	content: "\f703";
}
.bidex-ws50:before{	/* 27.5"/584mm */
	content: "\f704";
}

/* Antriebsträger Icons */
.bidex-dt10:before{	/* Kette */
	content: "\f800";
}
.bidex-dt20:before{	/* Riemen */
	content: "\f801";
}

/* Motor-Marke Icons */
.bidex-mo12:before{	/* Bosch */
	content: "\f900";
}
.bidex-mo60:before{	/* Panasonic */
	content: "\f901";
}
.bidex-mo61:before{	/* Pinion */
	content: "\f902";
}
.bidex-mo70:before{	/* Shimano */
	content: "\f903";
}
.bidex-mo72:before{	/* TQ */
	content: "\f904";
}
/* Rahmengröße Icon */
.bidex-frame-size:before{	
	content: "\f338";
}


/* ===== /Iter-22-PHASE2-FONT ============================================== */



/* ===== Iter-22-PHASE2-RENDER — DEDE-1:1 Spec-Block-Styles ===============
   Quelle: zweirad-dede.de PDP-CSS, gespiegelt fuer Smartstore-PDP unter #pd-tabs-1.
   Iter-21-Polish-Block (Iter-21-PDP-TABS in MtsStufeBStyle) wird durch
   diese Regeln ueberschrieben (hoehere CSS-Cascade-Position, !important).
   ========================================================================= */
#pd-tabs-1 .bidex-product-accordion {
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif !important;
  width: 100% !important;
  max-width: 100% !important;
  margin: 0 !important;
  padding: 0 !important;
  background: transparent !important;
}
#pd-tabs-1 .bidex-technical-data-header {
  width: 100% !important;
  background-color: #ffffff !important;
  padding: 2rem !important;
  text-align: center !important;
  border: none !important;
  display: flex !important;
  align-items: center !important;
  justify-content: center !important;
  gap: 1rem !important;
}
#pd-tabs-1 .bidex-technical-data-icon {
  display: inline-flex !important;
  align-items: center !important;
  justify-content: center !important;
}
#pd-tabs-1 .bidex-technical-data-icon svg {
  width: 64px !important;
  height: 64px !important;
  color: #000 !important;
}
#pd-tabs-1 .bidex-technical-data-title {
  font-size: 2.8rem !important;
  font-weight: 600 !important;
  color: #000 !important;
}
#pd-tabs-1 .bidex-attribute-groups-wrapper {
  width: 100% !important;
  background-color: #ffffff !important;
  padding: 2rem !important;
  border: none !important;
}
#pd-tabs-1 .bidex-attribute-groups {
  display: grid !important;
  grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)) !important;
  gap: 1.5rem !important;
  margin-top: 0 !important;
}
#pd-tabs-1 .bidex-attribute-groups--black-headers .bidex-attribute-group-header { color: #000 !important; }
#pd-tabs-1 .bidex-attribute-groups--black-headers .bidex-attribute-group-header .bidex { color: #000 !important; }
#pd-tabs-1 .bidex-attribute-group {
  border: none !important;
  border-radius: 4px !important;
  overflow: hidden !important;
  background-color: transparent !important;
  margin: 0 !important;
  padding: 0 !important;
}
#pd-tabs-1 .bidex-attribute-group-header {
  background-color: transparent !important;
  padding: 0.75rem 1rem !important;
  font-weight: bold !important;
  text-transform: uppercase !important;
  color: #000 !important;
  display: flex !important;
  align-items: center !important;
  gap: 0.75rem !important;
  font-size: 1.82rem !important;
  margin: 0 !important;
}
#pd-tabs-1 .bidex-attribute-group-header .bidex,
#pd-tabs-1 .bidex-attribute-group-header i.bidex {
  font-size: 2.86em !important;
  color: #000 !important;
  display: inline-block !important;
  line-height: 1 !important;
}
#pd-tabs-1 .bidex-attribute-group-content {
  padding: 0.5rem !important;
  display: block !important;
}
#pd-tabs-1 .bidex-attribute-item {
  padding: 0.5rem 1rem !important;
  display: block !important;
  border: none !important;
}
#pd-tabs-1 .bidex-attribute-name {
  font-weight: bold !important;
  margin-right: 0.5rem !important;
  display: inline !important;
  color: inherit !important;
  font-size: inherit !important;
}
#pd-tabs-1 .bidex-attribute-value {
  color: #2c3e50 !important;
  display: inline !important;
  font-size: inherit !important;
  font-weight: normal !important;
}
@media (max-width: 768px) {
  #pd-tabs-1 .bidex-technical-data-icon svg { width: 52px !important; height: 52px !important; }
  #pd-tabs-1 .bidex-technical-data-title { font-size: 2.4rem !important; }
  #pd-tabs-1 .bidex-attribute-groups-wrapper,
  #pd-tabs-1 .bidex-technical-data-header { padding: 1.5rem !important; }
  #pd-tabs-1 .bidex-attribute-groups { grid-template-columns: 1fr !important; }
}
/* Hide Smartstore-default specs table when DEDE-Akkordeon present */
#pd-tabs-1:has(.bidex-product-accordion[data-iter22]) .pd-specs,
#pd-tabs-1:has(.bidex-product-accordion[data-iter22]) .pd-specs-table { display: none !important; }
/* ===== /Iter-22-PHASE2-RENDER =========================================== */



/* ===== Iter-22-PHASE2-CLEANUP — V2-Akkordeon dauerhaft ausblenden =========
   V3 ist Single-Source-of-Truth fuer Spec-Akkordeon. Alle anderen
   .bidex-product-accordion-Instanzen in #pd-tabs-1 verstecken.
   ========================================================================= */
#pd-tabs-1 .bidex-product-accordion[data-iter21],
#pd-tabs-1 .bidex-product-accordion:not([data-iter22]) {
  display: none !important;
}
/* ===== /Iter-22-PHASE2-CLEANUP =========================================== */



/* ===== Iter-22-PHASE2-PX — DEDE-1:1 in fixen px-Werten =================
   Override fuer Iter-22-PHASE2-RENDER (rem/em -> px). Smartstore-rem-base
   ist 16px, DEDE-rem-base 10px (62.5% convention). Mit fixen px-Werten
   werden die Akkordeon-Headers, Icons und Items optisch identisch.
   ========================================================================= */
#pd-tabs-1 .bidex-product-accordion {
  font-size: 14px !important;
  line-height: 1.6 !important;
}
#pd-tabs-1 .bidex-technical-data-header {
  padding: 18px !important;
  gap: 12px !important;
}
#pd-tabs-1 .bidex-technical-data-icon svg {
  width: 48px !important;
  height: 48px !important;
}
#pd-tabs-1 .bidex-technical-data-title {
  font-size: 28px !important;
  line-height: 1.2 !important;
}
#pd-tabs-1 .bidex-attribute-groups-wrapper {
  padding: 16px !important;
}
#pd-tabs-1 .bidex-attribute-groups {
  gap: 16px !important;
}
#pd-tabs-1 .bidex-attribute-group {
  border-radius: 0 !important;
  background: transparent !important;
}
#pd-tabs-1 .bidex-attribute-group-header {
  display: inline-flex !important;
  align-items: center !important;
  gap: 8px !important;
  padding: 8px 10px !important;
  font-size: 18px !important;
  font-weight: 700 !important;
  letter-spacing: 0 !important;
  line-height: 1.2 !important;
  color: #000 !important;
  text-transform: uppercase !important;
  width: 100% !important;
}
#pd-tabs-1 .bidex-attribute-group-header i.bidex,
#pd-tabs-1 .bidex-attribute-group-header .bidex {
  font-size: 48px !important;
  line-height: 1 !important;
  color: #000 !important;
  flex: 0 0 auto !important;
  display: inline-flex !important;
  align-items: center !important;
  justify-content: center !important;
  width: 1em !important;
  height: 1em !important;
  margin: 0 !important;
  padding: 0 !important;
}
#pd-tabs-1 .bidex-attribute-group-header .bidex-attribute-group-name {
  display: inline-block !important;
  flex: 1 1 auto !important;
  font-size: 18px !important;
  line-height: 1.2 !important;
  font-weight: 700 !important;
  color: #000 !important;
  text-transform: uppercase !important;
  letter-spacing: 0 !important;
}
#pd-tabs-1 .bidex-attribute-group-content {
  padding: 4px 0 !important;
}
#pd-tabs-1 .bidex-attribute-item {
  padding: 4px 10px !important;
  display: block !important;
  line-height: 1.5 !important;
}
#pd-tabs-1 .bidex-attribute-name {
  font-size: 14px !important;
  font-weight: 700 !important;
  color: #111 !important;
  display: inline !important;
  margin-right: 6px !important;
}
#pd-tabs-1 .bidex-attribute-name::after { content: ":"; }
#pd-tabs-1 .bidex-attribute-value {
  font-size: 14px !important;
  color: #2c3e50 !important;
  font-weight: 400 !important;
  display: inline !important;
}
@media (max-width: 768px) {
  #pd-tabs-1 .bidex-technical-data-icon svg { width: 36px !important; height: 36px !important; }
  #pd-tabs-1 .bidex-technical-data-title { font-size: 22px !important; }
  #pd-tabs-1 .bidex-attribute-group-header { font-size: 16px !important; }
  #pd-tabs-1 .bidex-attribute-group-header .bidex-attribute-group-name { font-size: 16px !important; }
  #pd-tabs-1 .bidex-attribute-group-header i.bidex { font-size: 36px !important; }
}
/* ===== /Iter-22-PHASE2-PX ============================================== */



/* ===== Iter-22-PHASE2-FINAL — Item-Layout 2-zeilig wie DEDE ============ */
#pd-tabs-1 .bidex-attribute-name::after { content: '' !important; }
#pd-tabs-1 .bidex-attribute-name {
  display: block !important;
  margin-right: 0 !important;
  margin-bottom: 2px !important;
  font-size: 14px !important;
  font-weight: 700 !important;
  color: #111 !important;
  line-height: 1.3 !important;
}
#pd-tabs-1 .bidex-attribute-value {
  display: block !important;
  font-size: 14px !important;
  color: #2c3e50 !important;
  line-height: 1.4 !important;
}
#pd-tabs-1 .bidex-attribute-item {
  padding: 6px 10px !important;
  display: block !important;
}
/* ===== /Iter-22-PHASE2-FINAL =========================================== */



/* ===== Bidex-Spec-Strip-V4 — 4er-Grid in PDP-Beschreibung =================
   Mini-Spec-Strip am Ende des Beschreibungs-Tabs: 8 Tiles in 4-Spalten-Grid
   (Desktop) bzw. 2-Spalten (Mobile). 1:1 Optik wie Iter-22-PHASE2 V3
   (Bidex-Webfont-Glyph schwarz, kein Border, zentriert). Loest die alten
   FA-Tile-Renderings (Iter-20-Ära) ab.
   Gerendert von buildBidexSpecStripV4() in MtsStufeBScripts (apple-style.js).
   ========================================================================= */
.bidex-spec-strip {
  display: grid !important;
  grid-template-columns: repeat(4, 1fr) !important;
  gap: 28px 16px !important;
  margin: 32px 0 8px !important;
  padding: 24px 8px !important;
  background: transparent !important;
  border: none !important;
  justify-items: center !important;
  align-items: start !important;
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif !important;
}
.bidex-spec-strip__tile {
  display: flex !important;
  flex-direction: column !important;
  align-items: center !important;
  text-align: center !important;
  width: 100% !important;
  max-width: 220px !important;
  border: none !important;
  background: transparent !important;
  padding: 0 !important;
  gap: 8px !important;
}
.bidex-spec-strip__tile > i.bidex {
  font-size: 40px !important;
  color: #000 !important;
  line-height: 1 !important;
  display: inline-flex !important;
  align-items: center !important;
  justify-content: center !important;
  width: 1em !important;
  height: 1em !important;
  flex: 0 0 auto !important;
  margin: 0 !important;
  padding: 0 !important;
}
.bidex-spec-strip__label {
  font-size: 13px !important;
  font-weight: 700 !important;
  color: #000 !important;
  text-transform: uppercase !important;
  letter-spacing: 0 !important;
  line-height: 1.2 !important;
  margin: 0 !important;
}
.bidex-spec-strip__value {
  font-size: 12px !important;
  font-weight: 400 !important;
  color: #2c3e50 !important;
  line-height: 1.4 !important;
  margin: 0 !important;
  display: -webkit-box !important;
  -webkit-line-clamp: 3 !important;
  -webkit-box-orient: vertical !important;
  overflow: hidden !important;
  word-break: break-word !important;
}
@media (max-width: 992px) {
  .bidex-spec-strip { grid-template-columns: repeat(2, 1fr) !important; gap: 24px 12px !important; }
  .bidex-spec-strip__tile > i.bidex { font-size: 34px !important; }
}
/* Legacy FA-Spec-Grid aus Bestandsprodukten (vor 2026-05-02 importiert)
   verstecken, falls der Backfill noch nicht durchgelaufen ist. */
#pd-tabs-0 .bidex-spec-grid,
#pd-tabs-0 .bidex-spec-grid-heading,
.pd-full-description .bidex-spec-grid,
.pd-full-description .bidex-spec-grid-heading {
  display: none !important;
}
/* ===== /Bidex-Spec-Strip-V4 ============================================== */

/* ===== Iter 24 — PDP Hauptbild groesser ====================================
   User-Feedback (2026-05-04): Hauptbild auf der Produktdetailseite wirkt zu
   klein, wenn die Thumbnail-Spalte daneben angezeigt wird. Iter 15 Phase B
   gibt der Bild-Spalte 60% und der Info-Spalte 40%, die gal-box hat
   min-height:500px und das Hauptbild bekommt links 116px Inset (88px Thumbs
   + 28px Gap). Effektive Bildbreite bei Viewport 1440px war damit ca.
   ~600-650px – fuer ein Premium-Bike-Bild zu wenig.

   Diese Iter:
   - Spalten-Verhaeltnis: 60/40 -> 66/34 (Bild dominiert klar)
   - Right-Padding der Bild-Spalte: 80px -> 48px (mehr Platz fuer Bild)
   - .pd-image-section innen-Padding: 24px -> 8px
   - gal-box min-height: 500px -> 640px (Desktop) bzw. 720px (>=1600px)
   - Hauptbild max-height absichtlich nicht gesetzt (Smartstore haelt
     aspect-ratio bei) – stattdessen ueber gal-cell min-height steuern.
   - Tablet (1100..900): 50/50 unveraendert, aber Padding kleiner.
   - Mobile (<900): unveraendert (image schon full-width).

   Wichtig: Lightbox/Hover-Zoom (.gal-cell img) funktioniert weiter, weil
   wir nur Container-Dimensionen anfassen, nicht das img selbst. */
@media (min-width: 1101px) {
  body.product-details .pd-section .pd-data-col,
  body.product-details .pd-section > .col-12:not(.pd-info-col),
  .product-page .pd-section .pd-data-col {
    flex: 0 0 66% !important;
    max-width: 66% !important;
    padding-right: 48px !important;
  }
  body.product-details .pd-section .pd-info-col,
  body.product-details .pd-info-col,
  .product-page .pd-info-col {
    flex: 0 0 34% !important;
    max-width: 34% !important;
  }
  body.product-details .pd-image-section,
  body.product-details .product-images,
  body.product-details .pd-gallery {
    padding: 8px !important;
  }
}
@media (min-width: 1281px) {
  body.product-details .pd-data-col .gal-box,
  .pd-data-col .gal-box {
    min-height: 640px !important;
  }
  /* Hauptbild-Cell: feste min-height plus aspect-ratio-Hint, damit Smartstore
     das img mit object-fit:contain auf die volle Hoehe zieht. Nicht max-width
     setzen – die gal-cell-Breite ergibt sich automatisch aus der Spalte. */
  body.product-details .pd-data-col .gal-box > .gal-cell,
  .pd-data-col .gal-box > .gal-cell {
    min-height: 640px !important;
  }
  body.product-details .pd-data-col .gal-cell .gal-image-cell,
  body.product-details .pd-data-col .gal-cell img,
  .pd-data-col .gal-cell .gal-image-cell,
  .pd-data-col .gal-cell img {
    max-height: none !important;
  }
}
@media (min-width: 1600px) {
  body.product-details .pd-data-col .gal-box,
  .pd-data-col .gal-box {
    min-height: 720px !important;
  }
  body.product-details .pd-data-col .gal-box > .gal-cell,
  .pd-data-col .gal-box > .gal-cell {
    min-height: 720px !important;
  }
}
/* Tablet (901..1100px): Spalten bleiben bei 50/50 (bestehender Override),
   aber Bild-Section-Padding und gal-box-min-height etwas hochziehen. */
@media (min-width: 901px) and (max-width: 1100px) {
  body.product-details .pd-image-section,
  body.product-details .product-images,
  body.product-details .pd-gallery {
    padding: 8px !important;
  }
  body.product-details .pd-data-col .gal-box,
  .pd-data-col .gal-box {
    min-height: 520px !important;
  }
}
/* ===== /Iter 24 — PDP Hauptbild groesser ================================== */

/* ===== Iter 25 — Bug-Triple Fix (CSS-Teil) =================================
   User-Feedback (2026-05-04):
   1) Kategorie-Hero zeigt nur Slogan, der Kategoriename fehlt ueber dem Bild.
   2) Color-Swatches in der Listing-Card sind eckig (sollen rund sein).
   3) Color-Swatches in der Listing-Card zeigen oft die FALSCHE Farbe
      (zweiter Teil eines `'n'`-Doppelnamens, statt der Hauptfarbe).

   Diagnose:
   - Bug 1: Iter 16 Phase D wollte den Brand-Namen unter dem Logo auf
            der Manufacturer-Page verstecken. Der Selector
            `body .mts-cat-hero-banner h1.h3` ist aber zu breit, weil
            Smartstore das Kategorie-h1 ebenfalls mit class="h3" rendert.
            Folge: Auf JEDER Kategorie wird der Name versteckt.
            Fix hier: Hide auf .manufacturer-page einschraenken
            (body.mts-cat-hero-lifestyle reicht nicht, weil Lifestyle-
            Hero auch fuer Kategorien greift). Ueberschreibt das alte
            Iter-16-Hide via groesserer Specificity + nicht-Manufacturer.
   - Bug 2: Smartstore rendert <a class="art-color-opt"> mit Inline-
            background-color — das ist ein Quadrat. Wir machen ihn rund.
   - Bug 3: Daten-Bug stammt aus dem Bidex-Importer-Mapping (zwei-
            farbige Namen wie `mistygreen'n'black` werden auf den
            ZWEITEN Token gemappt → Schwarz statt Mistygreen).
            Vollstaendiger Fix gehoert in den Bidex-Importer
            (`smartstore/bidex-sync/src/services/bidexImporter.js`).
            Hier: Frontend-Quickfix per JS-Patch (siehe Iter-25-JS-
            Block weiter unten) — mappt Token → Hex und ueberschreibt
            den Inline-Style. */

/* Bug 1: Kategorie-h1 im Hero-Banner wieder sichtbar machen.
   Specificity 0,3,1 — schlaegt das alte Iter-16-Hide (0,2,1)
   ueberall ausser auf Manufacturer-Pages. */
body:not(.mts-manufacturer-page) .mts-cat-hero-banner h1.h3,
body:not(.mts-manufacturer-page) .mts-cat-hero-banner > h1 {
  display: block !important;
}
/* Manufacturer-Page-Marker setzt das JS bereits via .manufacturer-page
   im DOM; wir spiegeln das auf body, damit der Selektor oben greift.
   Falls das DOM-Element fehlt, ist body:not(.mts-manufacturer-page) true
   und der Title bleibt sichtbar — sicherer Default. */

/* Bug 2: Color-Swatches in der Listing-Card rund.
   Smartstore rendert `<a class="art-color-opt" style="background-color:#xxx">`.
   Hat 14x14 als Default — wir machen 16x16, rund, mit Hover-Lift. */
.art-color-opts .art-color-opt,
.artlist .art .art-color-opt,
.artlist .art-color-opts a.art-color-opt {
  border-radius: 50% !important;
  width: 18px !important;
  height: 18px !important;
  display: inline-block !important;
  border: 1.5px solid rgba(0,0,0,0.12) !important;
  box-shadow: 0 1px 2px rgba(0,0,0,0.08), inset 0 0 0 2px #fff !important;
  transition: transform 0.15s ease, box-shadow 0.15s ease !important;
  vertical-align: middle !important;
}
.art-color-opts .art-color-opt:hover,
.artlist .art .art-color-opt:hover {
  transform: scale(1.15);
  box-shadow: 0 2px 6px rgba(0,0,0,0.18), inset 0 0 0 2px #fff !important;
}
.art-color-opts .art-color-opt[aria-selected="true"],
.artlist .art .art-color-opt[aria-selected="true"] {
  box-shadow: 0 0 0 2px var(--mts-accent), inset 0 0 0 2px #fff !important;
}

/* Bug 3 (CSS-Teil — visueller Hint dass JS-Patch greift):
   Wenn der JS-Patch eine Farbe korrigiert hat, setzt er
   data-mts-color-fixed="1" — das ist nur ein Marker fuer Recon. */

/* ===== /Iter 25 — Bug-Triple Fix (CSS-Teil) ================================ */

/* Iter 26 - Hover swap fallback ============================================
   Bug 4: Listing-Card wurde beim Hover weiss, wenn das Produkt kein zweites
   Bild hat. Ursache: Line 2927 (.artlist .art:hover .art-picture
   img:not(.mts-card-img-hover) { opacity: 0 }) feuert unconditional. Der
   bestehende [data-mts-hover-img="none"]-Override (Line 2929) reset nur
   transform, nicht opacity, und hat geringere Specificity.

   Strategie A: CSS-only Override mit hoeherer Specificity. Greift in zwei
   Faellen:
     1) JS hat applyPdpDataToCard schon ausgefuehrt und kein 2. Bild
        gefunden -> data-mts-hover-img="none".
     2) JS noch nicht durch (PDP-Fetch laeuft) ODER Spec-Queue blockiert
        -> Card hat ueberhaupt kein .mts-card-img-hover-Element. Decken
        wir per :not(:has(...)) ab. :has() ist in allen evergreen Browsern
        (Chrome 105+, Safari 15.4+, FF 121+) supported - bei Smartstore
        CE 6.3 Storefront-Zielgruppe ausreichend.

   Plus JS-Marker-Sicherheitsnetz: setzt data-mts-hover-img="none" sofort
   beim Card-Mount, falls applyPdpDataToCard verzoegert/skipped.
   ============================================================================ */
.artlist .art[data-mts-hover-img="none"]:hover .art-picture img,
.artlist .art[data-mts-hover-img="none"]:hover .art-picture-block img,
.artlist .art:not(:has(.mts-card-img-hover[data-mts-loaded="1"])):hover .art-picture img:not(.mts-card-img-hover),
.artlist .art:not(:has(.mts-card-img-hover[data-mts-loaded="1"])):hover .art-picture-block img:not(.mts-card-img-hover) {
  opacity: 1 !important;
}
/* Defensive: falls die Hover-Img-Datei doch eingehaengt ist, aber noch
   nicht geladen (data-mts-loaded != "1"), zeigen wir das Original-Bild. */
.artlist .art:has(.mts-card-img-hover:not([data-mts-loaded="1"])):hover .art-picture img:not(.mts-card-img-hover),
.artlist .art:has(.mts-card-img-hover:not([data-mts-loaded="1"])):hover .art-picture-block img:not(.mts-card-img-hover) {
  opacity: 1 !important;
}
/* ===== /Iter 26 — Hover swap fallback ===================================== */

/* ===== Iter 27 — Card-Compactness + PDP-Bild + PDP-Swatch + Tab-Flicker =====
   User-Feedback (2026-05-04, 6 Punkte):
     1) Card zu viel Whitespace — Padding/Gap reduzieren (Title<->Preis).
     2) Title in Card deutlich groesser (~17px, weight 700).
     3) Manufacturer-Logo in Card groesser (height 30-32px, max-width 110px).
     4) Color-Swatch INLINE neben "Weitere Option Groesse" (gleiche Zeile).
     5) Swatch groesser (22-24px) + KEIN Border (kein inset 2px white).
     6) Single-Size-Badge UNTER Preis (statt darueber).
     7) PDP-Hauptbild noch groesser (Iter 24 reicht nicht): 70/30 Spalten,
        min-height 800/880 statt 640/720, padding-right 32 statt 48.
     8) PDP-Color-Pill zeigt nur 1 Hex bei zweifarbigen Lacken — gleicher
        Tokenizer wie Iter-25 auf .mts-variant-pills--swatch .mts-variant-pill.
     9) Beschreibung-Tab flackert beim Reload (Smartstore tabs-autoselect lädt
        per AJAX `setselectedtab` State -> kurzer Sprung auf Merkmale und
        zurueck). Fix: tabs-autoselect-Klasse + data-tabselector-href so
        frueh wie moeglich entfernen, ersten Tab einrasten. */

/* P1+P2: Card-Compactness — Padding/Gaps zwischen Brand, Title, Description,
   Price reduzieren. Specificity matched die bestehenden Iter-1..26-Regeln
   (dieselben Selektoren). !important toggelt korrekt mangels Cascade-Dop. */
body .artlist:not(.artlist-lines) .art .art-brand,
body .artlist:not(.artlist-lines) .art .art-vendor {
  padding: 8px 16px 0 !important;
  margin: 0 !important;
}
body .artlist:not(.artlist-lines) .art .art-name {
  margin: 0 !important;
  padding: 0 !important;
  text-align: center !important;        /* C3: Produkttitel zentriert (Desktop+Mobile) */
}
body .artlist:not(.artlist-lines) .art .art-name-link,
body .artlist:not(.artlist-lines) .art .art-name a {
  padding: 2px 16px 2px !important;
  font-size: 1.075rem !important;       /* P2: Titel ~17px */
  font-weight: 700 !important;
  line-height: 1.3 !important;
  letter-spacing: -0.01em !important;
  text-align: center !important;        /* C3: Titel-Text mittig im display:block-Link */
}
body .artlist:not(.artlist-lines) .art .art-description {
  padding: 0 16px !important;
  margin: 2px 0 0 !important;
  font-size: 12px !important;
  line-height: 1.4 !important;
}
body .artlist:not(.artlist-lines) .art .art-delivery-info {
  padding: 0 16px !important;
  margin: 0 !important;
  font-size: 11px !important;
}
body .artlist:not(.artlist-lines) .art .art-price-block {
  padding: 4px 16px 8px !important;
  margin: 2px 0 0 !important;
}
body .artlist:not(.artlist-lines) .art .art-drop {
  padding: 0 16px 14px !important;
}
/* mts-card-specs zwischen Titel und Preis — tighter Gap */
body .artlist:not(.artlist-lines) .art .mts-card-specs {
  margin: 4px 0 0 !important;
  padding: 0 16px !important;
}

/* P3: Manufacturer-Logo groesser. Specificity ueber `body` schlaegt
   die alte Iter-1-Regel (.art-brand img.mts-brand-img). */
body .artlist:not(.artlist-lines) .art .art-brand img.mts-brand-img,
body .artlist:not(.artlist-lines) .art .art-vendor img.mts-brand-img {
  height: 30px !important;
  max-width: 110px !important;
  width: auto !important;
}
/* Wenn der Brand noch als Text (kein Logo gemappt) gerendert wird,
   ihn etwas groesser/markanter zeigen — hilft Hierarchie. */
body .artlist:not(.artlist-lines) .art .art-brand:not(:has(img.mts-brand-img)) > span,
body .artlist:not(.artlist-lines) .art .art-vendor:not(:has(img.mts-brand-img)) > span {
  font-size: 12px !important;
  font-weight: 600 !important;
}

/* P4: Color-Swatch + "Weitere Option Groesse" inline.
   .art-variant-info enthaelt .art-color-opts (nav) UND .art-more-opts (div).
   Default: blockig untereinander. Wir setzen flex-row, gap, wrap.
   Iter-25 setzt .art-variant-info > span (display:block) — span ist
   *Kind* der .art-more-opts (Hinweis-Text "Weitere Option:"). Das bleibt. */
body .artlist:not(.artlist-lines) .art .art-variant-info {
  display: flex !important;
  flex-direction: row !important;
  align-items: center !important;
  justify-content: center !important;
  flex-wrap: wrap !important;
  gap: 8px !important;
  text-align: center !important;
  padding: 2px 8px !important;
  margin: 2px 0 0 !important;
}
body .artlist:not(.artlist-lines) .art .art-variant-info > .art-color-opts {
  display: inline-flex !important;
  flex-direction: row !important;
  align-items: center !important;
  gap: 6px !important;
  margin: 0 !important;
  padding: 0 !important;
}
body .artlist:not(.artlist-lines) .art .art-variant-info > .art-more-opts {
  display: inline-flex !important;
  flex-direction: row !important;
  align-items: center !important;
  flex-wrap: wrap !important;
  gap: 4px !important;
  margin: 0 !important;
  padding: 0 !important;
  text-align: center !important;
}
/* Hinweis-Span ("Weitere Option:") inline statt block, damit Größe-Link
   direkt daneben steht. */
body .artlist:not(.artlist-lines) .art .art-variant-info > .art-more-opts > span,
body .artlist:not(.artlist-lines) .art .art-variant-info > .art-more-opts > .bidi-embed {
  display: inline !important;
  text-align: center !important;
}

/* P5: Swatch groesser + ohne Border. Specificity ueber `body` schlaegt
   die Iter-25-Regel (.art-color-opts .art-color-opt). User: "keinen border". */
body .art-color-opts .art-color-opt,
body .artlist .art .art-color-opt,
body .artlist .art-color-opts a.art-color-opt {
  width: 22px !important;
  height: 22px !important;
  border: 0 !important;
  /* Iter 25 hatte border:1.5px + box-shadow inset 0 0 0 2px #fff. Beides weg.
     Stattdessen sehr feiner Outer-Shadow fuer Tiefenwahrnehmung. Kein
     inset-Ring -> der Swatch ist eine einfarbige Pille. */
  box-shadow: 0 1px 2px rgba(0,0,0,0.1) !important;
}
body .art-color-opts .art-color-opt:hover,
body .artlist .art .art-color-opt:hover {
  box-shadow: 0 2px 6px rgba(0,0,0,0.18) !important;
  transform: scale(1.12) !important;
}
body .art-color-opts .art-color-opt[aria-selected="true"],
body .artlist .art .art-color-opt[aria-selected="true"] {
  box-shadow: 0 0 0 2px var(--mts-accent) !important;
}

/* P6: Single-Size-Slot UNTER Preis statt darueber. Iter-27-JS setzt
   `data-mts-iter27=1` auf den Slot und positioniert ihn nach dem
   Price-Block. Hier nur eine konsistente Margin/Padding-Definition,
   damit der Slot unter dem Preis Luft hat. */
body .artlist:not(.artlist-lines) .art .mts-card-singlesize-slot[data-mts-iter27="1"] {
  margin-top: 4px !important;
  padding: 0 16px !important;
}

/* P7: PDP Hauptbild groesser — 70/30 Spalten, min-height hochziehen.
   Schlaegt die Iter-24-Regeln (66/34, 640/720) per spaeterer Cascade. */
@media (min-width: 1101px) {
  body.product-details .pd-section .pd-data-col,
  body.product-details .pd-section > .col-12:not(.pd-info-col),
  .product-page .pd-section .pd-data-col {
    flex: 0 0 70% !important;
    max-width: 70% !important;
    padding-right: 32px !important;
  }
  body.product-details .pd-section .pd-info-col,
  body.product-details .pd-info-col,
  .product-page .pd-info-col {
    flex: 0 0 30% !important;
    max-width: 30% !important;
  }
}
@media (min-width: 1281px) {
  body.product-details .pd-data-col .gal-box,
  .pd-data-col .gal-box {
    min-height: 800px !important;
  }
  body.product-details .pd-data-col .gal-box > .gal-cell,
  .pd-data-col .gal-box > .gal-cell {
    min-height: 800px !important;
  }
}
@media (min-width: 1600px) {
  body.product-details .pd-data-col .gal-box,
  .pd-data-col .gal-box {
    min-height: 880px !important;
  }
  body.product-details .pd-data-col .gal-box > .gal-cell,
  .pd-data-col .gal-box > .gal-cell {
    min-height: 880px !important;
  }
}

/* P9: Tab-Flicker — Smartstore aktiviert die Tabs visuell sofort. Wir
   hidemen alle nicht-active tab-panes, damit selbst wenn der Server-Default
   kurz auf einen anderen Tab springt, kein Inhalt-Flicker stattfindet
   (User: "kurzer Sprung auf Merkmale"). */
body #pd-tabs.mts-iter27-tabs-locked .tab-pane:not(.active) {
  visibility: hidden !important;
}
body #pd-tabs.mts-iter27-tabs-locked .tab-pane.active {
  visibility: visible !important;
}
/* ===== /Iter 27 — Card + PDP + Tab-Flicker ================================ */

/* =========================================================================
   Iter 28 — Listing-Card-Footer-Alignment (Bug 10)
   -------------------------------------------------------------------------
   Symptom: Add-to-Cart-Button rutscht zwischen Cards in derselben Grid-Reihe
   hoch/runter, je nachdem ob der Produkttitel 1 oder 2 Zeilen ist. Der Button
   sitzt nicht auf gleicher Hoehe.

   Diagnose der Card-Struktur (curl /e-bikes-2/, Card data-id=2712):
     .art (display:flex column, set in Iter-1 zeile 333)
       figure.art-picture-block      (4:3 aspect, fix)
       .art-brand                    (~24px, fix)
       h3.art-name > .art-name-link  (1 oder 2 Zeilen — VARIABEL)
       .art-description              (Wiederholung Title, oft 1 Zeile)
       .art-delivery-info            (oft leer, 0px)
       .art-price-block              (fix)
       button.sr-toggle              (sr-only, 0px)
       .art-drop                     (Button-Reihe — bottom-most)

   Iter-1 hat `.art { display:flex; flex-direction:column }` schon gesetzt,
   und Iter-1 hat `.art-name-link` explizit auf "kein clamp, height:auto"
   gestellt (Zeile 456-470). Also: 2-Zeilen-Titel waechst die Card-Hoehe und
   schiebt alles drunter runter. Bei Cards mit 1-Zeilen-Titel bleibt der
   Footer hoeher.

   Loesung in zwei Teilen:

   1) Title-Slot reservieren: min-height fuer 2 Zeilen, damit alle Cards
      bei gleicher Title-Hoehe starten — egal ob der Text 1 oder 2 Zeilen
      braucht. line-height ist Iter-1=1.35, font-size=1rem -> 2 Zeilen ~
      2.7em. Wir bleiben bei "kein clamp" (User-Wunsch Iter-1: 2. Zeile
      sichtbar) — der Slot ist nur eine Untergrenze, lange Titel duerfen
      weiterhin wachsen. Bei 3-Zeilen-Titeln waechst diese Card halt mehr.
      Dafuer braucht es Punkt 2.

   2) `.art-drop` als Footer ans Karten-Ende kleben: `margin-top:auto`
      pusht den Block ans flex-Ende. Smartstore-Defaultraster `.artlist`
      ist Grid mit `align-items:stretch` (Iter-1 zeile 332) — alle Cards
      einer Reihe haben dieselbe Hoehe. Damit landet der Button-Block
      exakt auf gleicher Hoehe in allen Cards der Reihe, auch wenn eine
      Card einen 3-Zeilen-Titel hat (die anderen bekommen halt mehr
      Whitespace zwischen Preis und Button — akzeptabel).

   Specificity: `.artlist .art ...` matcht aktuelles Smartstore-Markup,
   inklusive Iter-1/26-Selektoren. Recently-Viewed-Carousel
   (`.artlist-carousel .slick-slide .art`) bleibt von dieser Regel
   unberuehrt, weil dort Cards einzeln in Slides leben — kein Reihen-
   Vergleich noetig. List-View (`.artlist.artlist-lines`) wird durch
   `:not(.artlist-lines)` explizit ausgenommen, dort gilt der eigene
   Iter-9-Lines-Block.
   =========================================================================*/
.artlist:not(.artlist-lines) .art .art-name {
  /* Slot fuer mind. 2 Zeilen reservieren. Iter-1 line-height=1.35,
     font-size=1rem -> 2 * 1.35em = 2.7em. Plus Iter-1-padding 6px+4px = 10px. */
  min-height: calc(2 * 1.35em + 10px) !important;
}
.artlist:not(.artlist-lines) .art .art-name-link,
.artlist:not(.artlist-lines) .art .art-name a {
  /* Selbe Untergrenze auch direkt am Link, falls .art-name-Container weg ist. */
  min-height: calc(2 * 1.35em) !important;
}
.artlist:not(.artlist-lines) .art .art-drop {
  /* Footer ans Karten-Ende kleben. Iter-1 hatte `position:static` schon
     gesetzt und z-index:1 — wir aendern nur die Vertikal-Position. */
  margin-top: auto !important;
}
/* Sicherheits-Override: falls Smartstore in einer Variante die Card
   nicht als flex-column rendert, erzwingen wir es nochmal explizit.
   (Iter-1 setzt es schon fuer .artlist-grid .art / .artlist .art —
   diese Regel ist Idempotenz-Anker.) */
.artlist:not(.artlist-lines) .art {
  display: flex !important;
  flex-direction: column !important;
  height: 100% !important;
}
/* ===== /Iter 28 — Listing-Card-Footer-Alignment ============================ */

/* ===== Iter 29 + 30 — rolled back 2026-05-04: both attempts broke PDP image (Iter 29 zentrierte ohne stretch -> Bild klein, Iter 30 fix unzureichend). Zurueck auf Iter-28-Endzustand. ===== */

/* === CART PAGE STYLES (managed by cart-agent) ============================ */
/* Scope: nur /cart-Seite. Keine Selektoren beruehren PDP/Listing/Header.
   Ziele:
   - Produkt-Item (.cart-row) weisser Hintergrund, keine Border
   - Bestellsummen-Tabelle (.cart-summary) weisser Hintergrund, kein soft-grey
   - Cube-Brand-Logo: default-image.png ausblenden (Bidex-JS ersetzt es ggf.)
   - Doppelter Titel: .cart-item-desc verstecken (Workaround, kein DOM-Edit)
*/
body.shopping-cart-page .cart,
body.shopping-cart-page .cart-body,
body.shopping-cart-page .cart-row,
.shopping-cart .cart,
.shopping-cart .cart-body,
.shopping-cart .cart-row,
form .cart,
form .cart-body,
form .cart-row,
.cart-content .cart,
.cart-content .cart-body,
.cart-content .cart-row {
  background: #ffffff !important;
  background-color: #ffffff !important;
  border: 0 !important;
  box-shadow: none !important;
}

/* Cart-Row: keine Trennlinie nach unten, kein Border, weiss */
.cart-body .cart-row,
.cart .cart-row,
#cart-items .cart-row {
  border: 0 !important;
  border-bottom: 0 !important;
  border-top: 0 !important;
  background: #ffffff !important;
  padding: 20px !important;
  border-radius: var(--mts-radius-lg, 14px) !important;
  margin-bottom: 14px !important;
  box-shadow: 0 1px 2px rgba(0,0,0,0.04) !important;
}
.cart-body .cart-row:last-child,
.cart .cart-row:last-child {
  margin-bottom: 0 !important;
  border-bottom: 0 !important;
}

/* Order-Summary-Box (rechte Seite): weisser Hintergrund, kein soft-grey */
.cart-content,
.order-summary-content,
.order-summary-content.cart-content,
.cart-collaterals,
.cart-collaterals .cart-summary,
.cart-summary {
  background: #ffffff !important;
  background-color: #ffffff !important;
}

/* Cart-Summary-Tabelle: weisser Hintergrund, klare Trennlinien */
table.cart-summary,
table.cart-summary > tbody,
table.cart-summary > tbody > tr,
table.cart-summary > tbody > tr > td {
  background: #ffffff !important;
  background-color: #ffffff !important;
}
table.cart-summary > tbody > tr {
  border-bottom: 1px solid var(--mts-line, #e5e5ea) !important;
}
table.cart-summary > tbody > tr.cart-summary-total {
  border-top: 1px solid var(--mts-text, #1d1d1f) !important;
  border-bottom: 0 !important;
}
table.cart-summary > tbody > tr > td {
  padding: 12px 0 !important;
}

/* Cart-Item-Brand: default-image.png (kein Logo hinterlegt) ausblenden.
   Falls Bidex-JS das img mit Bidex-Logo ersetzt, bleibt es sichtbar. */
.cart-item-brand img.cart-item-brand-image[src*="default-image"] {
  display: none !important;
}
.cart-item-brand img.cart-item-brand-image:not([src*="default-image"]) {
  max-height: 28px !important;
  width: auto !important;
  max-width: 100px !important;
  object-fit: contain !important;
}
.cart-item-brand a:has(img[src*="default-image"]) {
  display: none !important;
}

/* Doppelter Titel-Workaround: .cart-item-desc enthaelt den Titel ein zweites
   Mal als sub-heading (Smartstore Default-Behavior). Wird nur visuell
   versteckt — DOM bleibt redundant, Screenreader liest beides. Echter Fix
   nur via Razor-Override moeglich (smartstore-frontend nicht erlaubt). */
.cart-item-data .cart-item-desc {
  display: none !important;
}

/* Cart-Item-Title: leicht prominenter, da Sub-Heading weg */
.cart-item-data .cart-item-title {
  margin-bottom: 4px !important;
}
.cart-item-data .cart-item-title .cart-item-link {
  font-weight: 600 !important;
  font-size: 16px !important;
  color: var(--mts-text, #1d1d1f) !important;
  text-decoration: none !important;
}

/* Cart-Layout: linke und rechte Spalte konsistent abrunden, weisser BG.
   Wrapper-Container .cart-container hat in Smartstore-Default oft soft-grey. */
.shopping-cart-page .page-body,
.shopping-cart-page main,
.shopping-cart-page .cart-container {
  background: transparent !important;
}

/* Mobile: Item-Row vertikal stapeln, weiss bleibt weiss */
@media (max-width: 768px) {
  .cart-body .cart-row,
  .cart .cart-row {
    padding: 16px !important;
  }
}

/* === CART V2 ADDITIONS (managed by cart-agent) ============================
   User-Bericht: Restlicher grauer Hintergrund bei "Rabattcode", "Gutschein",
   "Zahlungsinformations"-Section, generelle Toolbar/Footer-Bereiche.
   Root-Cause: Smartstore Flex-Theme hat
     --cart-footer-bg: #f7f7f9
     --cart-child-row-bg: #fafafb
   und .cart-footer hat zusaetzlich border:1px solid var(--cart-border-color)
   sowie padding:1.25rem (umrandet die ganze rechte Spalte mit grauer Box).
   Loesung: globale CSS-Var auf weiss + selektiver Border-Reset.
   Scope strikt nur shopping-cart-page + order-summary-page (Cart + Mini-Cart-
   Variante). Kein Impact auf PDP/Listing/Header/Footer.
   ========================================================================== */
:root {
  --cart-footer-bg: #ffffff !important;
  --cart-child-row-bg: #ffffff !important;
}

/* Cart-Footer (rechte Spalte mit Coupon/Gift/Reward/Estimate + Totals) */
body.shopping-cart-page .cart-footer,
body.order-summary-page .cart-footer,
.shopping-cart-page #cart-summary-container,
.order-summary-page #cart-summary-container {
  background: #ffffff !important;
  background-color: #ffffff !important;
  border: 0 !important;
  border-radius: var(--mts-radius-lg, 14px) !important;
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04) !important;
  padding: 20px !important;
}

/* Trennlinie zwischen Footer-Groups: weicher grauer Strich statt 0.08-Black */
body.shopping-cart-page .cart-footer-group + .cart-footer-group:before,
body.order-summary-page .cart-footer-group + .cart-footer-group:before {
  background-color: var(--mts-line, #e5e5ea) !important;
}

/* Cart-Action-Boxen (Rabattcode, Gutschein, Bonuspunkte, Versandschaetzung) */
body.shopping-cart-page .cart-action,
body.shopping-cart-page .cart-action-coupon,
body.shopping-cart-page .cart-action-giftcard,
body.shopping-cart-page .cart-action-rewardpoints,
body.shopping-cart-page .cart-action-shipping,
body.shopping-cart-page .cart-action-body,
body.order-summary-page .cart-action,
body.order-summary-page .cart-action-coupon,
body.order-summary-page .cart-action-giftcard,
body.order-summary-page .cart-action-rewardpoints,
body.order-summary-page .cart-action-shipping,
body.order-summary-page .cart-action-body {
  background: #ffffff !important;
  background-color: #ffffff !important;
}

/* Reward-Points alert-info Block (Standardmaessig hellblau) auf weiss */
body.shopping-cart-page .cart-action-rewardpoints .alert.alert-info,
body.shopping-cart-page .cart-action-rewardpoints .reward-points,
body.order-summary-page .cart-action-rewardpoints .alert.alert-info,
body.order-summary-page .cart-action-rewardpoints .reward-points {
  background: #ffffff !important;
  background-color: #ffffff !important;
  border: 1px solid var(--mts-line, #e5e5ea) !important;
  color: var(--mts-text, #1d1d1f) !important;
}

/* Estimate-Shipping alert-info Default-Hint auf weiss */
body.shopping-cart-page .cart-action-shipping .alert.alert-info,
body.order-summary-page .cart-action-shipping .alert.alert-info {
  background: #ffffff !important;
  background-color: #ffffff !important;
  border: 1px solid var(--mts-line, #e5e5ea) !important;
  color: var(--mts-text-muted, #6e6e73) !important;
}

/* Checkout-Attributes-Wrapper (Bestellanmerkungen / Versandzeit-Auswahl) */
body.shopping-cart-page .cart-checkout-attributes,
body.order-summary-page .cart-checkout-attributes {
  background: #ffffff !important;
  background-color: #ffffff !important;
  border-bottom: 1px solid var(--mts-line, #e5e5ea) !important;
}

/* Selected-Checkout-Attributes Container (oberhalb Checkout-Buttons) */
body.shopping-cart-page .selected-checkout-attributes,
body.order-summary-page .selected-checkout-attributes {
  background: #ffffff !important;
  background-color: #ffffff !important;
}

/* Cart-Footer-Actions (Toolbar mit Continue-Shopping / Update / Checkout) */
body.shopping-cart-page .cart-footer-actions,
body.shopping-cart-page .cart-buttons,
body.shopping-cart-page .checkout-buttons,
body.order-summary-page .cart-footer-actions,
body.order-summary-page .cart-buttons,
body.order-summary-page .checkout-buttons {
  background: #ffffff !important;
  background-color: #ffffff !important;
}

/* Page-Body / Layout-Wrapper, falls Smartstore-Master-Layout grauen BG vererbt */
body.shopping-cart-page,
body.order-summary-page,
body.shopping-cart-page .page-body,
body.order-summary-page .page-body,
body.shopping-cart-page .order-summary-content,
body.order-summary-page .order-summary-content,
body.shopping-cart-page main,
body.order-summary-page main {
  background: #ffffff !important;
  background-color: #ffffff !important;
}

/* Fieldsets der Aktion-Boxen (Smartstore wickelt jede Box in <fieldset>) */
body.shopping-cart-page .cart-footer fieldset,
body.order-summary-page .cart-footer fieldset {
  background: transparent !important;
  border: 0 !important;
  margin: 0 !important;
  padding: 0 !important;
}

/* Cart-Action-Title (Klapp-Header): leichte Sub-Heading-Optik, kein BG */
body.shopping-cart-page .cart-action-title,
body.order-summary-page .cart-action-title {
  background: transparent !important;
  font-weight: 600 !important;
  color: var(--mts-text, #1d1d1f) !important;
}

/* === CART-AKTIONSROW (Issue 6+7, 2026-07-01) ===========================
   WICHTIG: Scope ist .shopping-cart-page (DIV auf /cart/, Cart.cshtml:18).
   Die BODY-Klasse ist order-summary-page, NICHT shopping-cart-page — ein
   body.shopping-cart-page-Scope matcht daher NICHT.
   Mengen-Stepper ohne Border; "Auf die Wunschliste" kleiner; Reihenfolge
   [Loeschen] [Wunschliste] [Menge] via Flex-order (Menge rechts neben der
   Wunschliste). Markup: CartItems.cshtml .cart-item-actions.hstack ->
   [remove-btn][.cart-item-qty][addfromcart-btn]. QtyInput = .qty-input.
   ======================================================================== */
.shopping-cart-page .cart-item-actions { align-items: center; }
.shopping-cart-page .cart-item-actions .btn[data-action='remove'] { order: 1; }
.shopping-cart-page .cart-item-actions .btn[data-action='addfromcart'] {
  order: 2; font-size: 0.8rem !important; padding: 4px 8px !important;
}
.shopping-cart-page .cart-item-actions .cart-item-qty { order: 3; }
/* Mengen-Stepper: Border entfernen (QtyInput -> .qty-input / .numberinput / input) */
.shopping-cart-page .cart-item-qty .qty-input,
.shopping-cart-page .cart-item-qty .numberinput-group,
.shopping-cart-page .cart-item-qty .numberinput,
.shopping-cart-page .cart-item-qty .form-control,
.shopping-cart-page .cart-item-qty input {
  border: 0 !important; box-shadow: none !important;
}
/* === END CART V2 ADDITIONS ============================================== */
/* === END CART PAGE STYLES ================================================ */

/* === CHECKOUT CONFIRM STYLES (managed by checkout-agent) ================
   Scope: nur /checkout/confirm und allgemein checkout-page Body-Class.
   Ziele:
   - Comment-Box ("Moechten Sie uns etwas mitteilen") transparent statt grau
   - Order-Summary-Box (rechts) + bottom-order-total-container transparent
   - Terms-of-Service-Consent-Box transparent
   - Cart-Item-Brand fuer Confirm gleich behandeln wie Cart (Bidex-Logo via JS)
   ========================================================================== */
body.checkout-page .order-summary-content,
body.checkout-page .checkout-data,
body.checkout-page .page.checkout-confirm-page,
body.checkout-page .page.checkout-confirm-page > .page-body {
  background: transparent !important;
  background-color: transparent !important;
}

/* Comment-Box (graue Card mit Header "Moechten Sie uns etwas mitteilen") */
body.checkout-page .comment-box.card,
body.checkout-confirm-page .comment-box.card {
  background: transparent !important;
  background-color: transparent !important;
  border: 0 !important;
  box-shadow: none !important;
}
body.checkout-page .comment-box .card-header,
body.checkout-confirm-page .comment-box .card-header {
  background: transparent !important;
  background-color: transparent !important;
  border-bottom: 0 !important;
  padding-left: 0 !important;
  padding-right: 0 !important;
  font-weight: 600 !important;
  color: var(--mts-text, #1d1d1f) !important;
}
body.checkout-page .comment-box .card-body,
body.checkout-confirm-page .comment-box .card-body {
  background: transparent !important;
  background-color: transparent !important;
  padding-left: 0 !important;
  padding-right: 0 !important;
}
body.checkout-page .comment-box textarea,
body.checkout-confirm-page .comment-box textarea {
  background: #ffffff !important;
  border: 1px solid var(--mts-line, #e5e5ea) !important;
  border-radius: var(--mts-radius-lg, 12px) !important;
  padding: 12px 14px !important;
  width: 100% !important;
  min-height: 96px !important;
  box-shadow: none !important;
}

/* Terms-of-Service-Consent-Box (Newsletter/Datenuebertragung-Card) */
body.checkout-page #terms-of-service-consent-box.card,
body.checkout-confirm-page #terms-of-service-consent-box.card {
  background: transparent !important;
  background-color: transparent !important;
  border: 0 !important;
  box-shadow: none !important;
}
body.checkout-page #terms-of-service-consent-box .card-body,
body.checkout-confirm-page #terms-of-service-consent-box .card-body {
  background: transparent !important;
  padding-left: 0 !important;
  padding-right: 0 !important;
}

/* Bottom-Order-Total-Container (untere Buy-Button-Box mit ToS + Total) */
body.checkout-page .bottom-order-total-container.card,
body.checkout-confirm-page .bottom-order-total-container.card,
body.checkout-page .bottom-order-total-container.card.card-body,
body.checkout-confirm-page .bottom-order-total-container.card.card-body {
  background: transparent !important;
  background-color: transparent !important;
  border: 0 !important;
  box-shadow: none !important;
  padding: 18px 0 !important;
}

/* Order-Totals (rechte Spalte CheckoutOrderTotals -> .cart-footer)
   Auf Confirm explizit weiss + dezente Card-Optik (statt Default-grey).  */
body.checkout-page .cart-footer,
body.checkout-confirm-page .cart-footer {
  background: #ffffff !important;
  background-color: #ffffff !important;
  border: 0 !important;
  border-radius: var(--mts-radius-lg, 14px) !important;
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04) !important;
  padding: 22px !important;
}
body.checkout-page .cart-footer #order-totals,
body.checkout-confirm-page .cart-footer #order-totals,
body.checkout-page .cart-footer .selected-checkout-attributes,
body.checkout-confirm-page .cart-footer .selected-checkout-attributes,
body.checkout-page .cart-footer .cart-footer-actions,
body.checkout-confirm-page .cart-footer .cart-footer-actions {
  background: transparent !important;
}
body.checkout-page .cart-footer .terms-of-service,
body.checkout-confirm-page .cart-footer .terms-of-service,
body.checkout-page .bottom-order-total-container .terms-of-service,
body.checkout-confirm-page .bottom-order-total-container .terms-of-service {
  background: transparent !important;
  font-size: 13px !important;
  color: var(--mts-text-muted, #6e6e73) !important;
  margin-bottom: 12px !important;
}

/* Confirm-Page Cart-Items: gleiche Optik wie /cart (weisse Cards) */
body.checkout-confirm-page #cart-items.cart,
body.checkout-confirm-page .cart-body,
body.checkout-confirm-page .cart-row {
  background: #ffffff !important;
  border: 0 !important;
  box-shadow: none !important;
}
body.checkout-confirm-page .cart-body .cart-row {
  background: #ffffff !important;
  border: 0 !important;
  border-radius: var(--mts-radius-lg, 14px) !important;
  padding: 18px !important;
  margin-bottom: 12px !important;
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04) !important;
}
body.checkout-confirm-page .cart-body .cart-row:last-child {
  margin-bottom: 0 !important;
}

/* Brand-Logo (Bidex) ueber Produkttitel im Cart + Confirm.
   Im Default-Smartstore-Render ist .cart-item-brand entweder ein <a><img>
   (mit Manufacturer-MediaFile) ODER nur ein <span> mit dem Brand-Namen
   (Fallback wenn kein MediaFile gesetzt). Unser JS macht aus dem Span
   einen <img> mit Bidex-Logo. CSS sorgt fuer kompakte Darstellung. */
body.shopping-cart-page .cart-item-brand,
body.checkout-confirm-page .cart-item-brand,
body.order-summary-page .cart-item-brand {
  margin-bottom: 6px !important;
  min-height: 22px !important;
  line-height: 1 !important;
}
body.shopping-cart-page .cart-item-brand img.mts-brand-img,
body.checkout-confirm-page .cart-item-brand img.mts-brand-img,
body.order-summary-page .cart-item-brand img.mts-brand-img {
  max-height: 28px !important;
  max-width: 110px !important;
  width: auto !important;
  height: auto !important;
  object-fit: contain !important;
  display: inline-block !important;
}
/* Brand-Text-Fallback (kein Bidex-Treffer): dezenter Caption-Look */
body.shopping-cart-page .cart-item-brand > span:not(.mts-brand-img),
body.checkout-confirm-page .cart-item-brand > span:not(.mts-brand-img),
body.order-summary-page .cart-item-brand > span:not(.mts-brand-img) {
  font-size: 12px !important;
  color: var(--mts-text-muted, #6e6e73) !important;
  text-transform: uppercase !important;
  letter-spacing: 0.04em !important;
  font-weight: 500 !important;
}
/* === END CHECKOUT CONFIRM STYLES ======================================== */

/* =========================================================================
   TASK-126 — Wunschlisten-Herz auf Listing-Card (.artlist .art)
   -------------------------------------------------------------------------
   Architektur-Entscheidung (dokumentiert, AC#2): NATIVE Smartstore-Wishlist,
   account-persistent, i18n-faehig. KEIN localStorage-Nachbau.
   PDP-Herz, Header-Counter (data-bind-to="WishlistItemsCount") und die
   /wishlist-Uebersichtsseite sind bereits nativ vorhanden + MTS-gestylt.
   Echter Gap = Herz-Toggle AUF der Listing-Card.

   Mechanik: Der Card-Walker (initCardHearts) haengt pro Card ein Herz-Overlay
   oben rechts auf .art-picture-block. Der Klick triggert programmatisch den
   bereits nativ gerenderten Wishlist-Button der Card
   (button.ajax-cart-link.add-to-wishlist-button[data-href=".../?shoppingCartTypeId=2"]).
   Damit laeuft Smartstores eigener AJAX-Flow inkl. Header-Counter-Update —
   wir bauen NICHTS am Persistenz-Layer nach. Der native (sekundaere) Button
   in .art-drop wird optisch ausgeblendet, das Herz ersetzt ihn prominent.
   ========================================================================= */
.artlist .art .art-picture-block { position: relative !important; }
.mts-card-heart {
  position: absolute !important;
  top: 10px !important;
  right: 10px !important;
  z-index: 6 !important;
  width: 38px !important;
  height: 38px !important;
  display: flex !important;
  align-items: center !important;
  justify-content: center !important;
  margin: 0 !important;
  padding: 0 !important;
  border: 0 !important;
  border-radius: 999px !important;
  background: rgba(255, 255, 255, 0.82) !important;
  -webkit-backdrop-filter: saturate(180%) blur(10px) !important;
  backdrop-filter: saturate(180%) blur(10px) !important;
  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.12) !important;
  color: #6e6e73 !important;
  cursor: pointer !important;
  opacity: 0;
  transform: translateY(-2px);
  transition: opacity 0.18s ease, transform 0.18s ease, color 0.18s ease, background 0.18s ease !important;
  line-height: 0 !important;
  -webkit-appearance: none !important;
  appearance: none !important;
}
/* Herz auf Touch-Geraeten immer sichtbar (kein Hover), auf Desktop bei
   Card-Hover oder wenn aktiv (in Wunschliste). */
.artlist .art:hover .mts-card-heart,
.mts-card-heart:focus-visible,
.mts-card-heart.is-active,
.mts-card-heart.is-busy { opacity: 1; transform: translateY(0); }
@media (hover: none) {
  .mts-card-heart { opacity: 1; transform: none; }
}
.mts-card-heart svg {
  width: 20px !important;
  height: 20px !important;
  fill: none;
  stroke: currentColor;
  stroke-width: 2;
  pointer-events: none;
}
.mts-card-heart:hover { color: #e11d48 !important; background: #fff !important; }
.mts-card-heart.is-active { color: #e11d48 !important; }
.mts-card-heart.is-active svg { fill: #e11d48 !important; stroke: #e11d48 !important; }
.mts-card-heart.is-active:not(.is-busy) { animation: mts-heart-pop 0.32s ease; }
.mts-card-heart.is-busy { pointer-events: none; opacity: 1 !important; }
.mts-card-heart.is-busy svg { animation: mts-heart-spin 0.7s linear infinite; }
@keyframes mts-heart-pop { 0% { transform: scale(1); } 50% { transform: scale(1.28); } 100% { transform: scale(1); } }
@keyframes mts-heart-spin { to { transform: rotate(360deg); } }
/* Den nativen, sekundaeren Wishlist-Button in der Card-Button-Reihe
   ausblenden — das prominente Herz oben rechts ersetzt ihn. Wir lassen das
   Markup im DOM (es ist unsere Trigger-Quelle), verstecken es nur visuell. */
.artlist .art .art-drop .add-to-wishlist-button {
  display: none !important;
}

/* =========================================================================
   TASK-124 — Bike-Vergleich (Compare-Button + Bar + Drawer, max 3 Bikes)
   -------------------------------------------------------------------------
   Persistenz-Entscheidung (dokumentiert, AC#3): LOKALER localStorage-Layer
   (KEY 'mts-compare-v2', max 3), 1:1 analog zum Shopify-Lead-Theme
   (BikeShopDesignDede/assets/bike-compare.js). KEIN MtsStorage — das existiert
   in der Smartstore-Storefront NICHT; der Helper ist inline nachgebaut.
   Begruendung: Vergleich ist eine fluechtige, anonyme UI-Auswahl (kein
   account-relevanter Zustand wie Wunschliste/Warenkorb); localStorage haelt
   die Auswahl pro Browser ueber Navigationen ohne Server-Roundtrip.

   Spec-Werte gibt es NICHT als data-Attribute auf den Cards — sie werden
   lazy per PDP-HTML-Fetch geholt (Wiederverwendung von pickPdpDataFromHtml /
   sessionStorage-Cache) und ueber eine 16-Achsen-Label-Whitelist auf die
   nativen SpecificationAttributes (.pd-specs-table) gemappt.
   ========================================================================= */
/* Compare-Restore (a3): Overlay-Parent muss den absoluten Button clippen. */
.artlist .art .art-picture-block {
  position: relative !important;
  overflow: hidden !important;
}
.mts-compare-btn {
  position: absolute !important;
  top: 14px !important;
  left: 14px !important;
  z-index: 6 !important;
  width: 38px !important;
  height: 38px !important;
  display: flex !important;
  align-items: center !important;
  justify-content: center !important;
  margin: 0 !important;
  padding: 0 !important;
  border: 0 !important;
  border-radius: 999px !important;
  background: rgba(255, 255, 255, 0.82) !important;
  -webkit-backdrop-filter: saturate(180%) blur(10px) !important;
  backdrop-filter: saturate(180%) blur(10px) !important;
  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.12) !important;
  color: #6e6e73 !important;
  cursor: pointer !important;
  opacity: 0;
  transform: translateY(-2px);
  transition: opacity 0.18s ease, transform 0.18s ease, color 0.18s ease, background 0.18s ease !important;
  line-height: 0 !important;
  -webkit-appearance: none !important;
  appearance: none !important;
}
.artlist .art:hover .mts-compare-btn,
.mts-compare-btn:focus-visible,
.mts-compare-btn.is-active { opacity: 1; transform: translateY(0); }
@media (hover: none) { .mts-compare-btn { opacity: 1; transform: none; } }
.mts-compare-btn svg { width: 19px !important; height: 19px !important; fill: none; stroke: currentColor; stroke-width: 2; pointer-events: none; }
.mts-compare-btn:hover { color: var(--mts-accent) !important; background: #fff !important; }
.mts-compare-btn.is-active { color: var(--mts-accent) !important; background: #fff !important; }
.mts-compare-btn.is-active svg { stroke: var(--mts-accent) !important; }
/* Kleiner, wenn der Filter ausgeklappt ist UND die Karten 4-spaltig laufen
   (Nutzer 2026-08-17): der 20 %-Filter laesst pro Karte nur noch ~209-225 px
   (gemessen /fahrraeder/, 1440 px), da wirkt der 38-px-Button ueberdimensioniert.
   Bei eingeklapptem Filter (`body.mts-filter-collapsed`, volle Kartenbreite)
   bleibt die Basisgroesse — dort passt sie. NUR Desktop (≥992px, Kollaps-
   Toggle existiert unterhalb dessen nicht, siehe :3559); die 44-px-Touch-
   Regel bei ≤991.98px (:7946) bleibt unberuehrt.
   Nachtrag 2026-08-17: 32px war dem Nutzer im Livetest immer noch zu gross
   -> weiter auf 26px runter, Icon 16->13px, Insets 12->10px mitgezogen. */
@media (min-width: 992px) {
  body.mts-cat-page:not(.mts-filter-collapsed) .artlist-4-cols .mts-compare-btn {
    width: 26px !important;
    height: 26px !important;
    top: 10px !important;
    left: 10px !important;
  }
  body.mts-cat-page:not(.mts-filter-collapsed) .artlist-4-cols .mts-compare-btn svg {
    width: 13px !important;
    height: 13px !important;
  }
}
/* PDP-Variante des Buttons: inline neben den Brand/Title, nicht absolut. */
.mts-compare-btn--pdp {
  position: static !important;
  opacity: 1 !important;
  transform: none !important;
  width: auto !important;
  height: auto !important;
  gap: 8px !important;
  padding: 10px 18px !important;
  border-radius: var(--mts-radius, 18px) !important;
  background: var(--mts-bg-soft, #fafafa) !important;
  box-shadow: none !important;
  color: var(--mts-text, #1d1d1f) !important;
  font-size: 14px !important;
  font-weight: 600 !important;
  line-height: 1 !important;
  -webkit-backdrop-filter: none !important;
  backdrop-filter: none !important;
}
/* Fläche bleibt Flächenton; der Ersatzwert #5f8175 ist raus, weil er auf der
   Demo (data-mts-brand="bidex") ein fremdes Grün eingesetzt hätte. */
.mts-compare-btn--pdp.is-active { background: var(--mts-accent) !important; color: #fff !important; }
.mts-compare-btn--pdp.is-active svg { stroke: #fff !important; }
.mts-compare-btn--pdp svg { width: 18px !important; height: 18px !important; }

/* Floating Compare-Bar unten */
.mts-compare-bar {
  position: fixed !important;
  left: 0; right: 0; bottom: 0;
  z-index: 1055;
  background: rgba(255, 255, 255, 0.92) !important;
  -webkit-backdrop-filter: saturate(180%) blur(14px);
  backdrop-filter: saturate(180%) blur(14px);
  box-shadow: 0 -10px 30px rgba(0, 0, 0, 0.10);
  border-top: 1px solid rgba(0, 0, 0, 0.06);
  transform: translateY(110%);
  transition: transform 0.28s cubic-bezier(0.22, 0.61, 0.36, 1);
}
.mts-compare-bar.is-visible { transform: translateY(0); }
.mts-compare-bar__inner {
  max-width: 1280px; margin: 0 auto;
  padding: 12px 24px calc(12px + env(safe-area-inset-bottom, 0px));
  display: flex; align-items: center; gap: 16px; flex-wrap: wrap;
}
.mts-compare-bar__items { display: flex; gap: 10px; flex: 1; min-width: 0; min-height: 56px; align-items: center; }
.mts-compare-bar__item { display: flex; align-items: center; gap: 10px; font-size: 13px; min-width: 0; }
.mts-compare-bar__item img { width: 56px; height: 56px; object-fit: contain; border-radius: 8px; flex-shrink: 0; background: #fff; }
.mts-compare-bar__item-title { line-height: 1.3; max-width: 160px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mts-compare-bar__item-remove { background: none; border: 0; cursor: pointer; padding: 2px; color: rgba(0,0,0,0.4); font-size: 18px; line-height: 1; }
/* Das Mal-Zeichen ist Text (18 px) auf der hellen Leiste -> Textton; der harte
   Ersatzwert entfällt, damit hier kein instanzfremdes Grün stehen bleibt. */
.mts-compare-bar__item-remove:hover { color: var(--mts-accent-text, var(--mts-accent)); }
.mts-compare-bar__actions { display: flex; align-items: center; gap: 10px; flex-shrink: 0; }
.mts-compare-bar__count { font-size: 12px; color: var(--mts-text-muted, #6e6e73); white-space: nowrap; }
.mts-compare-bar__btn {
  border: 0; border-radius: 999px; cursor: pointer; font-size: 13px; font-weight: 600;
  padding: 9px 18px; line-height: 1; -webkit-appearance: none; appearance: none;
}
.mts-compare-bar__btn--clear { background: var(--mts-bg-soft, #fafafa); color: var(--mts-text, #1d1d1f); }
.mts-compare-bar__btn--clear:hover { background: #f0f0f0; }
/* Fläche bleibt Flächenton; nur der harte Ersatzwert entfällt. */
.mts-compare-bar__btn--open { background: var(--mts-accent); color: #fff; }
.mts-compare-bar__btn--open:disabled { opacity: 0.45; cursor: not-allowed; }
@media (max-width: 749px) {
  .mts-compare-bar__inner { flex-direction: column; gap: 8px; padding: 10px 14px calc(10px + env(safe-area-inset-bottom, 0px)); }
  .mts-compare-bar__items { width: 100%; justify-content: center; min-height: 0; }
  .mts-compare-bar__item-title { display: none; }
  .mts-compare-bar__item img { width: 44px; height: 44px; }
  .mts-compare-bar__actions { width: 100%; justify-content: center; flex-wrap: wrap; }
  .mts-compare-bar__count { width: 100%; text-align: center; }
}

/* Compare-Drawer (Overlay + Spec-Tabelle) */
.mts-compare-drawer {
  position: fixed; inset: 0; z-index: 1060;
  background: rgba(0, 0, 0, 0.45);
  -webkit-backdrop-filter: blur(2px); backdrop-filter: blur(2px);
  display: flex; align-items: flex-end; justify-content: center;
  opacity: 0; visibility: hidden; transition: opacity 0.22s ease, visibility 0.22s ease;
}
.mts-compare-drawer.is-open { opacity: 1; visibility: visible; }
.mts-compare-drawer__panel {
  background: #fff; width: 100%; max-width: 1100px;
  max-height: 92vh; border-radius: var(--mts-radius-lg, 24px) var(--mts-radius-lg, 24px) 0 0;
  display: flex; flex-direction: column; overflow: hidden;
  transform: translateY(24px); transition: transform 0.28s cubic-bezier(0.22, 0.61, 0.36, 1);
}
.mts-compare-drawer.is-open .mts-compare-drawer__panel { transform: translateY(0); }
.mts-compare-drawer__header {
  display: flex; align-items: center; justify-content: space-between;
  padding: 20px 24px; border-bottom: 1px solid rgba(0, 0, 0, 0.07);
  position: sticky; top: 0; background: #fff; z-index: 1;
}
.mts-compare-drawer__title { margin: 0; font-size: 20px; font-weight: 700; color: var(--mts-text, #1d1d1f); }
.mts-compare-drawer__close {
  background: none; border: 0; cursor: pointer; padding: 8px; color: var(--mts-text, #1d1d1f);
  border-radius: 999px; line-height: 0; transition: background 0.2s;
}
.mts-compare-drawer__close:hover { background: rgba(0, 0, 0, 0.06); }
.mts-compare-drawer__body { padding: 20px 24px calc(28px + env(safe-area-inset-bottom, 0px)); overflow: auto; -webkit-overflow-scrolling: touch; }
.mts-compare-table { width: 100%; border-collapse: collapse; font-size: 14px; table-layout: fixed; }
.mts-compare-table th, .mts-compare-table td { vertical-align: top; word-wrap: break-word; overflow-wrap: anywhere; }
.mts-compare-table .mts-compare-row--label th {
  text-align: center; padding: 16px 12px 5px; font-weight: 700; font-size: 13px;
  letter-spacing: 0.02em; text-transform: uppercase; color: var(--mts-text-muted, #6e6e73);
  border-top: 1px solid rgba(0, 0, 0, 0.07); white-space: normal;
}
.mts-compare-table .mts-compare-row--value td { padding: 0 12px 12px; text-align: center; color: var(--mts-text, #1d1d1f); }
.mts-compare-table .mts-compare-row--product td { padding: 0 12px 14px; border-bottom: 1px solid rgba(0, 0, 0, 0.06); }
.mts-compare-table .mts-compare-row--product + .mts-compare-row--label th { border-top: none; padding-top: 16px; }
.mts-compare-table .mts-compare-row--remove td { padding: 14px 12px; border-top: 1px solid rgba(0, 0, 0, 0.06); text-align: center; }
.mts-compare-prod-img { width: 100%; height: 180px; object-fit: contain; border-radius: 10px; display: block; background: #fff; }
.mts-compare-prod-title { display: block; margin-top: 8px; font-weight: 600; font-size: 13px; color: var(--mts-text, #1d1d1f); text-decoration: none; }
.mts-compare-prod-title:hover { text-decoration: underline; }
.mts-compare-price { font-size: 16px; font-weight: 700; color: var(--mts-text, #1d1d1f); }
.mts-compare-brand-logo { max-height: 34px; max-width: 100%; width: auto; object-fit: contain; display: inline-block; }
.mts-compare-remove-btn {
  background: none; border: 1px solid rgba(0, 0, 0, 0.15); border-radius: 8px;
  padding: 5px 12px; font-size: 12px; cursor: pointer; color: var(--mts-text-muted, #6e6e73); transition: border-color 0.2s;
}
/* Rand bleibt Flächenton, die Beschriftung "Entfernen" ist Text auf Weiß ->
   Textton; beide harten Ersatzwerte entfallen. */
.mts-compare-remove-btn:hover { border-color: var(--mts-accent); color: var(--mts-accent-text, var(--mts-accent)); }
.mts-compare-loading { text-align: center; padding: 28px 12px; color: var(--mts-text-muted, #6e6e73); font-size: 14px; }
body.mts-compare-drawer-open .mts-compare-bar { display: none !important; }
@media (max-width: 749px) {
  .mts-compare-drawer__panel { max-height: 100vh; border-radius: 0; }
  .mts-compare-table { font-size: 12.5px; }
  .mts-compare-prod-img { height: 130px; }
  .mts-compare-table .mts-compare-row--label th { padding: 12px 6px 4px; font-size: 12px; }
  .mts-compare-table .mts-compare-row--value td { padding: 0 6px 9px; }
}

/* ============================================================
   TASK-435 — Listing-Karten strukturell 1:1 zu Home .mts-pcard
   Portiert aus homepage-stufe-a.shell.html:159-182. JS-Enhancer
   (mts-theme-global.js enhancePcard) setzt .mts-pcard an native .art
   + haengt __body an. Scope .artlist.mts-pcard-grid > .art.mts-pcard.
   Overrides schlagen die Legacy-!important-.art-Regeln :335-571.
   Vars aus :7-19 (--mts-radius-lg 24px, --mts-line, --mts-shadow, --mts-accent).
   ============================================================ */
/* (A) Container: native .art auf pcard-Look + Legacy-Neutralisierung */
.artlist.mts-pcard-grid > .art.mts-pcard {
  overflow: hidden !important;
  border-radius: var(--mts-radius-lg, 24px) !important;
  padding: 0 !important;
  background: #fff !important;
  border: 0 !important;
  box-shadow: 0 1px 2px rgba(0,0,0,0.04) !important;
  display: flex !important;
  flex-direction: column !important;
  transition: transform .4s cubic-bezier(.22,.61,.36,1), box-shadow .4s cubic-bezier(.22,.61,.36,1) !important;
}
.artlist.mts-pcard-grid > .art.mts-pcard:hover {
  transform: translateY(-8px) !important;
  box-shadow: var(--mts-shadow) !important;
}
/* native Zusatz-Knoten ausblenden (bleiben im DOM fuer Funktion),
   damit der Aufbau exakt Home entspricht */
.art.mts-pcard > .art-description,
.art.mts-pcard > .art-delivery-info,
.art.mts-pcard > .mts-listing-chip,
.art.mts-pcard > .mts-card-specs,
.art.mts-pcard > .mts-card-singlesize-slot,
.art.mts-pcard > .sr-toggle,
.art.mts-pcard > .art-drop,
.art.mts-pcard > .art-price-block {
  display: none !important;
}

/* (B) __media: 1:1, Bild contain 18/20 (Home :164-166) */
.art.mts-pcard .art-picture-block.mts-pcard__media {
  position: relative !important;
  aspect-ratio: 1 / 1 !important;
  background: #fff !important;
  overflow: hidden !important;
  padding: 0 !important;
  border-radius: var(--mts-radius-lg, 24px) var(--mts-radius-lg, 24px) 0 0 !important;
  flex: 0 0 auto !important;
}
.art.mts-pcard .mts-pcard__media img,
.art.mts-pcard .mts-pcard__media .file-img {
  position: absolute !important; inset: 0 !important;
  width: 100% !important; height: 100% !important;
  object-fit: contain !important; object-position: center !important;
  padding: 18px 20px !important; box-sizing: border-box !important;
  transition: transform .6s cubic-bezier(.22,.61,.36,1) !important;
}
.art.mts-pcard:hover .mts-pcard__media img { transform: scale(1.04) !important; }
/* Aspect 1/1 wie Home — schlaegt body.mts-cat-page .artlist .art .art-picture-block (5/4, :879-882) */
body.mts-cat-page .artlist.mts-pcard-grid .art.mts-pcard .art-picture-block.mts-pcard__media { aspect-ratio: 1 / 1 !important; }
/* Sale-Badge: nativen .art-badges verstecken, eigenen __badge (JS) im Home-Pill-Look (Home :167-168) */
.art.mts-pcard .art-badges { display: none !important; }
.art.mts-pcard .mts-pcard__badge {
  position: absolute !important; top: 14px; left: 14px; z-index: 2;
  background: #fff; color: var(--mts-text);
  font-size: 11px; font-weight: 600; letter-spacing: .06em; text-transform: uppercase;
  padding: 7px 13px; border-radius: 999px; box-shadow: 0 4px 14px rgba(0,0,0,.06); line-height: 1;
}
.art.mts-pcard .mts-pcard__badge--accent { background: var(--mts-accent); color: #fff; }

/* (C) __body-Track (Home :169-177) */
.art.mts-pcard .mts-pcard__body {
  padding: 18px 22px 22px !important; flex: 1 1 auto !important;
  display: flex !important; flex-direction: column !important;
  gap: 6px !important; text-align: left !important; align-items: flex-start !important;
}
.art.mts-pcard .art-brand.mts-pcard__brand {
  height: 30px !important; line-height: 1 !important; margin: 0 0 2px !important; padding: 0 !important;
  text-transform: none !important; font-size: inherit !important; letter-spacing: normal !important; display: block !important;
}
.art.mts-pcard .mts-pcard__brand img,
.art.mts-pcard .mts-pcard__brand .mts-brand-img {
  /* TASK-442 Iter 2: 24px -> 30px (User: "markenlogo etwas groesser") */
  height: 30px !important; width: auto !important; max-width: 110px !important; object-fit: contain !important; display: block !important;
}
.art.mts-pcard .mts-pcard__brandname { font-weight: 700; font-size: .95rem; letter-spacing: .04em; }
.art.mts-pcard .mts-pcard__cat {
  /* TASK-697 AC#9 (2026-08-13): war #86868b = 3,62:1 bei 11 px. Diese Zeile
     steht auf JEDER Produktkarte, der Verstoss war damit der haeufigste im
     ganzen Shop. #6e6e73 (5,07:1) ist der Wert, den :root in dieser Datei
     ohnehin als --mts-text-muted fuehrt - der frueher hier stehende Kommentar
     "Home-muted exakt" zielte auf die Story-Variante #86868b, und genau diese
     Angleichung nach unten war der Fehler. */
  font-size: 11px !important; color: #6e6e73 !important; letter-spacing: .1em !important;
  text-transform: uppercase !important; font-weight: 500 !important; text-align: left !important;
  align-self: flex-start !important; padding: 0 !important; margin: 0 !important;
}
.art.mts-pcard .art-name.mts-pcard__name {
  font-size: 1rem !important; font-weight: 600 !important; line-height: 1.35 !important; color: var(--mts-text) !important;
  flex: 1 1 auto !important; min-height: 2.7em !important; padding: 0 !important; margin: 0 !important;
  text-align: left !important; align-self: stretch !important; overflow: visible !important;
}
.art.mts-pcard .mts-pcard__name a {
  display: block !important; overflow: visible !important; -webkit-line-clamp: unset !important;
  color: inherit !important; font: inherit !important; text-decoration: none !important;
}
.art.mts-pcard .mts-pcard__name a span { color: inherit !important; font: inherit !important; }
.art.mts-pcard .mts-pcard__stock {
  /* 2026-08-17: WAR align-items:center. Bei zweizeiligem Text ("In anderer
     Filiale verfuegbar" bricht in der schmalen Karte auf 2 Zeilen) zentrierte
     das den Punkt ueber die GESAMTE Texthoehe - er stand dadurch mittig links,
     nicht neben dem Wort "In" der ersten Zeile (User-Befund: "der Punkt sollte
     auch neben dem Text sein, nicht einfach ganz links"). flex-start richtet
     Punkt und Text an der Oberkante aus, der Punkt bekommt unten seinen
     eigenen Vertikal-Ausgleich per margin-top (siehe .mts-pcard__stock-dot). */
  display: inline-flex !important; align-items: flex-start !important; gap: 6px !important;
  font-size: 13px !important; font-weight: 500 !important; line-height: 1.35 !important; color: #15803d; align-self: flex-start !important;
}
.art.mts-pcard .mts-pcard__stock.mts-pcard__stock--low { color: #b45309; }
.art.mts-pcard .mts-pcard__stock.mts-pcard__stock--out { color: #9ca3af; }
.art.mts-pcard .mts-pcard__stock-dot {
  width: 8px; height: 8px; border-radius: 50%; background: currentColor; flex: 0 0 auto;
  /* Zentriert den 8px-Punkt auf der ERSTEN Textzeile (17,5px bei line-height
     1.35/13px): (17.5 - 8) / 2 ~ 5px. Bei einzeiligem Text (z. B. "Wenige
     verfuegbar") aendert das nichts sichtbar - der Punkt sass dort schon
     neben dem Text. */
  margin-top: 5px;
}

/* (D) __price-row (Home :178-182) */
.art.mts-pcard .mts-pcard__price-row {
  display: flex !important; align-items: center !important; justify-content: space-between !important;
  gap: 12px !important; margin-top: 8px !important; padding: 14px 0 0 !important; align-self: stretch !important;
  border-top: 1px solid rgba(0,0,0,0.09) !important; text-align: left !important; width: 100% !important; /* Home-line exakt */
}
.art.mts-pcard .mts-pcard__price {
  font-size: 1.35rem !important; font-weight: 700 !important; color: var(--mts-text) !important; letter-spacing: -.01em !important; text-align: left !important;
}
.art.mts-pcard .mts-pcard__price-row small {
  font-weight: 500; font-size: .85rem; color: var(--mts-text-muted); display: block; text-decoration: line-through;
}
.art.mts-pcard .mts-pcard__buy {
  width: 42px !important; height: 42px !important; background: var(--mts-text) !important; color: #fff !important; border-radius: 50% !important;
  display: flex !important; align-items: center !important; justify-content: center !important; flex: 0 0 auto !important;
  font-size: 18px !important; border: 0 !important; cursor: pointer; text-decoration: none !important; line-height: 1 !important;
  transition: all .22s cubic-bezier(.22,.61,.36,1) !important;
}
.art.mts-pcard .mts-pcard__buy:hover {
  background: var(--mts-accent) !important; color: #fff !important; transform: rotate(-12deg) scale(1.08) !important;
}

/* (E) FOUC: konvertierbare Listing-Karten bis Umbau kaschieren */
body.mts-cat-page .artlist .art:has(.art-price-block):not([data-mts-pcard-init]) {
  opacity: 0; transition: opacity .25s ease;
}
body.mts-cat-page .artlist .art[data-mts-pcard-init="1"] { opacity: 1; }
body.mts-pcard-ready .artlist .art { opacity: 1 !important; }

/* --- TASK-435b: Listing-Karten zentriert + etwas kompakter + groesserer Titel (User 2026-07-04) --- */
.artlist.mts-pcard-grid > .art.mts-pcard {
  max-width: 90% !important; justify-self: center !important; margin-left: auto !important; margin-right: auto !important;
}
.art.mts-pcard .mts-pcard__body {
  align-items: center !important; text-align: center !important;
  padding: 15px 16px 18px !important; gap: 5px !important;
}
.art.mts-pcard .art-brand.mts-pcard__brand { text-align: center !important; width: 100% !important; height: 30px !important; }
.art.mts-pcard .mts-pcard__brand img,
.art.mts-pcard .mts-pcard__brand .mts-brand-img { height: 30px !important; margin: 0 auto !important; }
.art.mts-pcard .mts-pcard__cat { align-self: center !important; text-align: center !important; }
.art.mts-pcard .art-name.mts-pcard__name {
  align-self: center !important; text-align: center !important; font-size: 1.125rem !important; /* Titel groesser (war 1rem) */
}
.art.mts-pcard .mts-pcard__stock { align-self: center !important; }
.art.mts-pcard .mts-pcard__price-row { justify-content: center !important; text-align: center !important; }
.art.mts-pcard .mts-pcard__price { text-align: center !important; }
.art.mts-pcard .mts-pcard__buy { width: 38px !important; height: 38px !important; font-size: 16px !important; }

/* --- TASK-435c: Buttons dauerhaft sichtbar, Badge zentriert, Inhalt hochgezogen, Titel-Stock enger (User 2026-07-04) --- */
/* (1) Wunschliste (top-right) + Vergleich (top-left) IMMER sichtbar, nicht nur bei Hover */
.art.mts-pcard .mts-card-heart,
.art.mts-pcard .mts-compare-btn { opacity: 1 !important; transform: none !important; }
/* (2) Rabatt-Badge oben ZENTRIERT statt oben-links -> kein Overlap mit Compare-Btn (top-left) */
.art.mts-pcard .mts-pcard__badge {
  left: 50% !important; right: auto !important; transform: translateX(-50%) !important;
}
/* (3) Titel <-> Stock enger: name/body wachsen nicht mehr (der Gap kam vom flex-grow) */
.art.mts-pcard .art-name.mts-pcard__name { flex: 0 0 auto !important; min-height: 0 !important; }
/* (4) Inhalt in die weisse Bild-Unterflaeche hochziehen (kompakter) + Karte natuerliche Hoehe */
.art.mts-pcard .mts-pcard__body { flex: 0 0 auto !important; margin-top: -26px !important; position: relative; z-index: 1; }
.artlist.mts-pcard-grid > .art.mts-pcard { align-self: start !important; }
/* Titel WIRKLICH eng an Stock: native 2-Zeilen-Link-Reserve (:1753 flex + Link-min-height) killen */
body.mts-cat-page .art.mts-pcard .mts-pcard__name,
body.mts-cat-page .art.mts-pcard .mts-pcard__name a,
body.mts-cat-page .art.mts-pcard .mts-pcard__name span {
  min-height: 0 !important; height: auto !important; flex: 0 0 auto !important;
}
body.mts-cat-page .art.mts-pcard .mts-pcard__name a { padding-top: 2px !important; padding-bottom: 0 !important; }

/* --- TASK-435d: 2-Spalten-Layout (Identitaet links / Preis+Rabatt rechts) + Bild randlos (User 2026-07-04) --- */
/* Bild OHNE Padding (randlos, groesser, kein Crop) */
.art.mts-pcard .art-picture-block.mts-pcard__media img,
.art.mts-pcard .art-picture-block.mts-pcard__media .file-img { padding: 0 !important; }
/* Body = Reihe mit 2 Spalten (Zentrierung/Stapelung von 435b/c zuruecknehmen; margin-top:-26 aus 435c bleibt) */
.art.mts-pcard .mts-pcard__body {
  flex-direction: row !important;
  align-items: flex-start !important;
  justify-content: space-between !important;
  text-align: left !important;
  gap: 12px !important;
  padding: 14px 16px 16px !important;
}
/* LINKS: Logo/Kategorie/Titel/Stock linksbuendig gestapelt */
.art.mts-pcard .mts-pcard__col-left {
  flex: 1 1 auto !important; min-width: 0 !important;
  display: flex !important; flex-direction: column !important; align-items: flex-start !important;
  gap: 4px !important; text-align: left !important;
}
.art.mts-pcard .mts-pcard__col-left .mts-pcard__brand { align-self: flex-start !important; text-align: left !important; width: auto !important; }
.art.mts-pcard .mts-pcard__col-left .mts-pcard__brand img,
.art.mts-pcard .mts-pcard__col-left .mts-pcard__brand .mts-brand-img { margin: 0 !important; }
.art.mts-pcard .mts-pcard__col-left .mts-pcard__cat { align-self: flex-start !important; text-align: left !important; }
.art.mts-pcard .mts-pcard__col-left .art-name.mts-pcard__name { align-self: flex-start !important; text-align: left !important; }
.art.mts-pcard .mts-pcard__col-left .mts-pcard__name a,
.art.mts-pcard .mts-pcard__col-left .mts-pcard__name a span { text-align: left !important; }
.art.mts-pcard .mts-pcard__col-left .mts-pcard__stock { align-self: flex-start !important; }
/* RECHTS: Rabatt/Preis/UVP/Button rechtsbuendig gestapelt */
.art.mts-pcard .mts-pcard__col-right {
  flex: 0 0 auto !important;
  display: flex !important; flex-direction: column !important; align-items: flex-end !important;
  gap: 2px !important; text-align: right !important; white-space: nowrap !important;
}
.art.mts-pcard .mts-pcard__discount {
  color: #e11d48 !important; font-weight: 700 !important; font-size: 0.92rem !important;
  line-height: 1.1 !important; margin-bottom: 2px !important;
}
.art.mts-pcard .mts-pcard__col-right .mts-pcard__price {
  text-align: right !important; font-size: 1.25rem !important; font-weight: 700 !important;
  line-height: 1.15 !important; color: var(--mts-text) !important;
}
.art.mts-pcard .mts-pcard__uvp {
  font-size: 0.8rem !important; color: var(--mts-text-muted) !important;
  text-decoration: line-through !important; text-align: right !important; line-height: 1.2 !important;
}
.art.mts-pcard .mts-pcard__col-right .mts-pcard__buy { margin-top: 8px !important; }

/* --- TASK-435e: Identitaet zentriert (gestapelt), Preis-Block rechts unten fix, Rabatt rot umrandet (User 2026-07-04) --- */
/* Karten gleich hoch (Button-Fixplatz) + Body fuellt Karte, vertikal gestapelt */
.artlist.mts-pcard-grid > .art.mts-pcard { align-self: stretch !important; }
.art.mts-pcard .mts-pcard__body {
  flex: 1 1 auto !important;
  flex-direction: column !important;
  align-items: stretch !important;
  justify-content: flex-start !important;
  gap: 4px !important;
}
/* Identitaets-Block: volle Breite, ZENTRIERT (Kat/Stock-Fehlalignment behoben) */
.art.mts-pcard .mts-pcard__col-left {
  width: 100% !important; flex: 0 0 auto !important;
  align-items: center !important; text-align: center !important; gap: 4px !important;
}
.art.mts-pcard .mts-pcard__col-left .mts-pcard__brand { align-self: center !important; text-align: center !important; }
.art.mts-pcard .mts-pcard__col-left .mts-pcard__brand img,
.art.mts-pcard .mts-pcard__col-left .mts-pcard__brand .mts-brand-img { margin: 0 auto !important; }
.art.mts-pcard .mts-pcard__col-left .mts-pcard__cat { align-self: center !important; text-align: center !important; padding: 0 !important; }
.art.mts-pcard .mts-pcard__col-left .art-name.mts-pcard__name { align-self: center !important; text-align: center !important; }
.art.mts-pcard .mts-pcard__col-left .mts-pcard__name a,
.art.mts-pcard .mts-pcard__col-left .mts-pcard__name a span { text-align: center !important; padding-left: 0 !important; padding-right: 0 !important; }
.art.mts-pcard .mts-pcard__col-left .mts-pcard__stock { align-self: center !important; }
/* Preis-Block: volle Breite, rechtsbuendig, ans Karten-UNTEN gepinnt (Button-Fixplatz) */
.art.mts-pcard .mts-pcard__col-right {
  width: 100% !important; flex: 0 0 auto !important; margin-top: auto !important;
  align-items: flex-end !important; text-align: right !important; gap: 2px !important;
}
/* Rabatt: rot UMRANDET (eingekreist) */
.art.mts-pcard .mts-pcard__discount {
  display: inline-block !important;
  color: #e11d48 !important; font-weight: 700 !important; font-size: 0.82rem !important;
  border: 1.5px solid #e11d48 !important; border-radius: 999px !important;
  padding: 2px 10px !important; line-height: 1.25 !important; margin-bottom: 3px !important;
}

/* --- TASK-435f: Preis-Block als EINE horizontale Zeile (Rabatt/UVP/Preis/Button nebeneinander) statt gestapelt (User 2026-07-04) --- */
.art.mts-pcard .mts-pcard__col-right {
  flex-direction: row !important;
  align-items: center !important;
  justify-content: flex-end !important;
  flex-wrap: wrap !important;
  gap: 8px !important;
}
.art.mts-pcard .mts-pcard__discount { margin-bottom: 0 !important; }
.art.mts-pcard .mts-pcard__uvp { text-align: right !important; white-space: nowrap !important; }
.art.mts-pcard .mts-pcard__col-right .mts-pcard__price { white-space: nowrap !important; }
.art.mts-pcard .mts-pcard__col-right .mts-pcard__buy { margin-top: 0 !important; }

/* --- TASK-435g: Preis-Block wieder VERTIKAL, aber RECHTS NEBEN der Identitaet (gleiche Ebene, nicht darunter) (User 2026-07-04) --- */
.artlist.mts-pcard-grid > .art.mts-pcard { align-self: start !important; }
.art.mts-pcard .mts-pcard__body {
  flex-direction: row !important;
  align-items: stretch !important;
  justify-content: space-between !important;
  gap: 12px !important;
}
/* Identitaet: LINKS, linksbuendig (sauberes Side-by-side; Fehlalignment via Padding-Fix behoben) */
.art.mts-pcard .mts-pcard__col-left {
  flex: 1 1 auto !important; width: auto !important; min-width: 0 !important;
  align-items: flex-start !important; text-align: left !important; justify-content: flex-start !important;
}
.art.mts-pcard .mts-pcard__col-left .mts-pcard__brand { align-self: flex-start !important; text-align: left !important; }
.art.mts-pcard .mts-pcard__col-left .mts-pcard__brand img,
.art.mts-pcard .mts-pcard__col-left .mts-pcard__brand .mts-brand-img { margin: 0 !important; }
.art.mts-pcard .mts-pcard__col-left .mts-pcard__cat { align-self: flex-start !important; text-align: left !important; }
.art.mts-pcard .mts-pcard__col-left .art-name.mts-pcard__name { align-self: flex-start !important; text-align: left !important; }
.art.mts-pcard .mts-pcard__col-left .mts-pcard__name a,
.art.mts-pcard .mts-pcard__col-left .mts-pcard__name a span { text-align: left !important; }
.art.mts-pcard .mts-pcard__col-left .mts-pcard__stock { align-self: flex-start !important; }
/* Preis-Block: RECHTS daneben, VERTIKAL gestapelt, rechtsbuendig, unten gepinnt (Button-Fixplatz) */
.art.mts-pcard .mts-pcard__col-right {
  flex: 0 0 auto !important; width: auto !important; margin-top: 0 !important;
  flex-direction: column !important;
  align-items: flex-end !important;
  justify-content: flex-end !important;
  flex-wrap: nowrap !important;
  gap: 2px !important;
  align-self: stretch !important;
  white-space: nowrap !important;
}
.art.mts-pcard .mts-pcard__discount { margin-bottom: 3px !important; }
.art.mts-pcard .mts-pcard__col-right .mts-pcard__buy { margin-top: 8px !important; }

/* --- Header-Fix: leeres MtsPdpVariantUx-Widget (nur PDP-Groessen-Boxen-<style>) erzeugte ~45px-Leerblock ueber dem Header auf JEDER Seite -> Wrapper ausblenden; das <style> wirkt bei display:none weiter, PDP bleibt intakt (User 2026-07-04) --- */
.topic-widget-MtsPdpVariantUx { display: none !important; }

/* --- TASK-435h: Identitaet wieder ZENTRIERT, Buy-Button kleiner, Wunschlisten-Herz entfernen (User 2026-07-04) --- */
/* Identitaet (Logo/Marke/Kategorie/Titel/Stock) wieder zentriert in der linken Spalte */
.art.mts-pcard .mts-pcard__col-left { align-items: center !important; text-align: center !important; }
.art.mts-pcard .mts-pcard__col-left .mts-pcard__brand { align-self: center !important; text-align: center !important; }
.art.mts-pcard .mts-pcard__col-left .mts-pcard__brand img,
.art.mts-pcard .mts-pcard__col-left .mts-pcard__brand .mts-brand-img { margin: 0 auto !important; }
.art.mts-pcard .mts-pcard__col-left .mts-pcard__cat { align-self: center !important; text-align: center !important; }
.art.mts-pcard .mts-pcard__col-left .art-name.mts-pcard__name { align-self: center !important; text-align: center !important; }
.art.mts-pcard .mts-pcard__col-left .mts-pcard__name a,
.art.mts-pcard .mts-pcard__col-left .mts-pcard__name a span { text-align: center !important; }
.art.mts-pcard .mts-pcard__col-left .mts-pcard__stock { align-self: center !important; }
/* Buy-Button etwas kleiner */
.art.mts-pcard .mts-pcard__buy { width: 32px !important; height: 32px !important; font-size: 14px !important; }
/* Wunschlisten-Herz (oben rechts) entfernen — nicht mehr benoetigt (Vergleichsbutton bleibt) */
.art.mts-pcard .mts-card-heart { display: none !important; }

/* ================================================================= */
/* ===== MULTICYCLE-AT REBRAND (2026-07-05) ======================== */
/* Grosses Multicycle-Logo (SVG) + laengliche Suchleiste ueber den    */
/* Kategorien. Farb-Rebrand Orange->Multicycle-Gruen via --mts-accent */
/* (#5f8175 / Hover #4d6b60 / Signatur-Salbei #7d9c92) oben ersetzt.  */
/* ================================================================= */

/* --- Grosses Multicycle-Logo statt MediaFile-Logo (Store.LogoMediaFileId=22349) --- */
header#header .shop-logo a.brand,
header#header .shop-logo .brand {
  background-image: url("/Modules/MoveToShop.Connector/mc-logo.svg?v=mc0705a") !important;
  background-repeat: no-repeat !important;
  background-position: left center !important;
  background-size: contain !important;
  height: 90px !important;
  width: 385px !important;
  max-width: 48vw !important;
}
/* Original-MediaFile-Logo unsichtbar halten (Klickflaeche bleibt via a.brand-Box) */
header#header .shop-logo a.brand > img,
header#header .shopbar .shop-logo img.img-fluid { opacity: 0 !important; width: 1px !important; height: 1px !important; max-width: 1px !important; max-height: 1px !important; }
@media (max-width: 992px) {
  header#header .shop-logo a.brand { height: 58px !important; width: 250px !important; max-width: 52vw !important; }
}
@media (max-width: 575px) {
  header#header .shop-logo a.brand { height: 44px !important; width: 190px !important; }
}

/* --- Header-Layout (User-Iteration 2026-07-05) ------------------------ */
/* Reihe 1 (Menubar): Trust-Items links | Suche MITTIG | Kontakt/Service/  */
/*   Filiale/Anmelden rechts.                                              */
/* Reihe 2 (Shopbar): Logo links | Kategorie-Nav MITTIG | Bewertung +      */
/*   Wunschliste + Warenkorb rechts.                                       */

/* Suche aus der Shopbar in die obere Menubar-Zeile heben, horizontal      */
/* mittig. .shopbar-section ist position:relative -> Bezug; top negativ    */
/* hebt die Suche in die ~37px-Menubar darueber.                           */
/* Suche wird per JS (mts-theme-global.js, IIFE __mtsMoveSearchToMenubar) aus
   .shopbar-section (z:2, wird von der opaken Menubar z:3 verdeckt) in die
   .menubar-Zeile verschoben und fuellt dort die Luecke Trust<->Kontakt.
   Ein fixed/absolute-Element bleibt sonst im Stacking-Context des Eltern
   .shopbar-section gefangen und kann die Menubar nie ueberholen. */
header#header .menubar { align-items: center !important; flex-wrap: nowrap !important; justify-content: flex-start !important; position: relative !important; }
/* Menubar-Container voll-breit + linksbuendig, damit die Trust-Leiste ans Logo
   ausgerichtet ist und Home/Kategorie IDENTISCH sitzen. Der navbar-slide-Slider
   setzt sonst max-width:1408 + margin-left:16 je nach Init unterschiedlich
   (Home trust x32 vs Kategorie x48). */
header#header .menubar-section .container.menubar-container,
header#header .menubar-section .menubar-container,
header#header .shopbar-section .container.shopbar-container {
  max-width: none !important; width: 100% !important; margin-left: 0 !important; margin-right: 0 !important;
  padding-left: 24px !important; padding-right: 24px !important;
}
/* Startseite: Trennlinie + Schatten zwischen Header und Hero entfernen */
body.home header#header { border-bottom: 0 !important; box-shadow: none !important; }
body.home header#header.is-scrolled { box-shadow: none !important; }
/* Suche fuellt die volle Luecke Sicher-bezahlen<->Kontakt: flex-grow statt fester
   Breite; dafuer die ml-auto der rechten Gruppe neutralisieren, sonst frisst das
   Auto-Margin den Flex-Grow-Platz und die Suche waechst nicht. */
/* ml-auto neutralisiert: die flex-grow-Suche fuellt die Luecke, die rechte Gruppe wird
   dadurch nach rechts gedrueckt (bleibt rechtsbuendig). Mit auto wuerde die Suche NICHT wachsen. */
header#header .menubar .menubar-group.ml-auto { margin-left: 0 !important; }
/* Trust-Leiste kompakter (Nutzerwunsch 2026-07-28). Sie belegte auf der
   Kundeninstanz 699 px der Menubar-Zeile und schob die Suche so weit nach
   rechts, dass diese nicht mehr ueber der Kategorie-Nav zentriert werden
   konnte (gemessen: Mitte Suchfeld 907, Mitte Nav 951). Kleinere Schrift und
   engere Abstaende schaffen den Platz, ohne die Leiste zu entfernen. */
header#header .mts-trustbar { font-size: 13px !important; gap: 8px !important; }
/* Die Groesse der Badges selbst steht weiter unten (~Z.7110) und wird dort
   gesetzt - hier NICHT wiederholen. Zwei Regeln mit identischem Selektor in
   derselben Datei sind genau der Drift, den dieses Repo an anderer Stelle
   schon teuer bezahlt hat: die spaetere gewinnt still, und die frueher
   gelesene sieht richtig aus. */

/* Die Suche soll auf JEDER Instanz so lang sein wie auf der Demo
   (Nutzerwunsch 2026-07-28).

   Warum sie das nicht war: auf der Kundeninstanz ist `html.mts-zoom-110`
   gesetzt (import/81-apply-zoom-110.js). storefront.css nimmt der Suche dort
   das flex-grow -

     html.mts-zoom-110 header#header .menubar .shopbar-col.shopbar-search.mts-menubar-search
       { flex: 0 0 auto !important; min-width: 200px !important; }

   - damit bei 110 % Zoom die Menubar umbricht, statt das Eingabefeld auf 78 px
   zusammenzuquetschen. Das ist fuer enge Fenster richtig und bleibt dort auch
   so. Ab 1200 px ist der Platz aber vorhanden, und dort galt die Bremse
   ebenfalls: gemessen 323 px Feldbreite auf der Kundeninstanz gegen 678 px auf
   der Demo.

   Die Spezifitaet ist Absicht, kein Trick: storefront.css wird von der
   MtsAssets-ViewComponent im BODY eingebunden und damit spaeter geladen als
   diese Datei (die haengt am Topic im head). Bei gleicher Spezifitaet gewaenne
   sonst die Regel dort. `body.mts-header-merged` grenzt zusaetzlich auf genau
   den Zustand ein, in dem die Nav in die Shopbar gemergt ist. */
@media (min-width: 1200px) {
  html.mts-zoom-110 body.mts-header-merged header#header .menubar .shopbar-col.shopbar-search.mts-menubar-search {
    flex: 1 1 auto !important;
  }
  /* Das Feld selbst wird gedeckelt, die Spalte darf weiter wachsen. Der
     Unterschied ist der Spielraum: die Spalte fuellt die Luecke (dadurch stimmt
     die Platzreserve aus TASK-582 exakt und es entsteht kein Sprung), das
     Formular sitzt darin zentriert und laesst links und rechts Luft. Nur so
     kann es anschliessend per transform ueber der Kategorie-Nav ausgerichtet
     werden - fuellt es die Spalte vollstaendig aus (die Regel weiter oben setzt
     width:100%), gibt es nichts zu verschieben. 690 px ist die Feldbreite, die
     die Demo-Instanz zeigt. */
  header#header .menubar .mts-menubar-search .instasearch-form {
    max-width: 690px !important;
  }
}
/* Suche ABSOLUT in der Header-Mitte (zentriert), modern in Weiss statt Grau.
   Formular fuellt die Col-Breite, sonst sitzt es linksbuendig in der Col. */
/* Suche MITTIG in der Top-Zeile: fuellt die Luecke zwischen Trust (Sicher bezahlen) und
   rechter Gruppe (Kontakt) via flex-grow. NICHT eigene Zeile; Trust/rechts bleiben normal gross. */
header#header .menubar { flex-wrap: nowrap !important; }
header#header .menubar .shopbar-col.shopbar-search.mts-menubar-search {
  position: static !important; left: auto !important; top: auto !important; transform: none !important;
  order: 0 !important; flex: 1 1 auto !important; width: auto !important; max-width: none !important; min-width: 0 !important;
  margin: 0 12px !important; z-index: auto !important;
  display: flex !important; justify-content: center !important; align-items: center !important;
}
header#header .mts-menubar-search .instasearch-form,
header#header .mts-menubar-search form { width: 320px !important; max-width: 320px !important; min-width: 320px !important; background: #ffffff !important; box-shadow: 0 2px 10px rgba(0,0,0,0.09) !important; border: 1px solid var(--mts-line) !important; }
header#header .menubar .mts-menubar-search .instasearch-form { width: 100% !important; }
/* Logo darf beim Klick in die Suche NICHT verschwinden:
   Theme setzt bei body.search-focused .shop-logo{opacity:0} (Such-Modus) -> hart ueberschreiben. */
body.search-focused header#header .shop-logo,
body.search-focused header#header .shop-logo a.brand { opacity: 1 !important; visibility: visible !important; }
/* Fallback falls JS nicht laeuft: Suche sichtbar in der Shopbar-Zeile (nicht verdeckt) */
header#header .shopbar-section .shopbar-col.shopbar-search:not(.mts-menubar-search) {
  position: static !important; top: auto !important; transform: none !important; margin: 0 20px !important; width: auto !important;
}
/* Aktiv-Kategorie-Unterstrich gruen (Theme-Default #EE9B00) — NUR ::before;
   ::after ist der Dropdown-Caret und darf NICHT eingefaerbt werden. */
header#header ul#menu-main .nav-link::before, header#header .megamenu .nav-link::before { background-color: var(--mts-accent) !important; }
header#header .shopbar-col.shopbar-search .instasearch-form { width: 100% !important; max-width: none !important; height: 34px !important; border: 1px solid var(--mts-line) !important; }
header#header .shopbar-col.shopbar-search .instasearch-term { padding: 6px 42px 6px 16px !important; font-size: 13px !important; }
header#header .shopbar-col.shopbar-search .instasearch-submit { width: 38px !important; }

/* Shopbar einreihig: Logo | Kategorie-Nav (mittig) | Tools */
header#header .shopbar { flex-wrap: nowrap !important; align-items: center !important; }
/* Brand-Gruppe breiter + Logo darin ZENTRIERT (mittig unter der Trust-Leiste,
   nicht linksbuendig). 520px -> Logo-Mitte ~x300, nahe Trust-Mitte ~x324. */
/* Logo LINKSBUENDIG nah am Rand (nicht mehr zentriert) */
header#header .shopbar .shopbar-col-group.shopbar-col-group-brand { order: 0 !important; flex: 0 0 auto !important; width: auto !important; min-width: 380px !important; max-width: none !important; margin-left: 0 !important; padding-left: 24px !important; display: flex !important; justify-content: flex-start !important; align-items: center !important; }
header#header .shopbar .shopbar-col.shop-logo { flex: 0 0 auto !important; width: 385px !important; min-width: 385px !important; }

/* ---------------------------------------------------------------------------
   TASK-639 — dieselben Spalten unterhalb des Theme-Breakpoints freigeben.
   ---------------------------------------------------------------------------
   Die beiden Regeln darueber sind der Multicycle-Desktop-Umbau (TASK-437/441)
   und standen ohne Media-Query. Auf dem Handy belegte die Brand-Gruppe damit
   756 px bei 390 px Viewport, und die Suche — die in dieser Gruppe sitzt — lag
   vollstaendig ausserhalb des Bildschirms (gemessen: x=453 bis 744, weder
   sichtbar noch per elementFromPoint erreichbar, auf mc UND auf store).

   WARUM DAS NICHT AUFFIEL, obwohl es jede Seite betraf: `theme.css` setzt
   `body { overflow-x: hidden }`. Der Ueberlauf wird also geklippt statt
   scrollbar — `documentElement.scrollWidth` meldet den Viewport-Wert, und der
   Screenshot zeigt einen Kopf, der ordentlich aussieht, weil die Media-Queries
   in Z.6966/6969 das Logo-BILD verkleinern. Nur eben nicht die SPALTE. Wer
   nach Augenschein oder nach scrollWidth arbeitet, findet hier nichts.

   DER BREAKPOINT IST NICHT GERATEN. Bei 991 px blendet das Theme die Menubar
   aus und zeigt den Offcanvas-Opener (gemessen ueber 13 Breiten), und
   mts-theme-global.js:4217 entscheidet mit derselben Grenze, dass die Suche auf
   dem Handy in der Shopbar BLEIBT ("Mobile: kein Move -> Suche gehoert sichtbar
   in die Shopbar"). Genau diese Absicht stellen die Regeln hier wieder her.

   Zeilenbild unter der Grenze: Logo, darunter die Suche ueber die volle Breite,
   darunter die Werkzeug-Zeile. Die Suche bekommt `flex: 1 1 100%`, damit sie
   nicht auf den Rest neben dem Logo zusammenschrumpft.
   --------------------------------------------------------------------------- */
@media (max-width: 991.98px) {
  header#header .shopbar .shopbar-col-group.shopbar-col-group-brand {
    flex: 1 1 100% !important;
    width: auto !important;
    min-width: 0 !important;
    max-width: 100% !important;
    flex-wrap: wrap !important;
    row-gap: 6px !important;
    padding-left: 14px !important;
    padding-right: 14px !important;
  }
  header#header .shopbar .shopbar-col.shop-logo {
    flex: 0 0 auto !important;
    width: auto !important;
    min-width: 0 !important;
    max-width: 100% !important;
  }
  header#header .shopbar .shopbar-col-group-brand .shopbar-col.shopbar-search {
    flex: 1 1 100% !important;
    width: 100% !important;
    min-width: 0 !important;
    max-width: 100% !important;
    margin: 0 !important;
  }
}
/* MULTICYCLE-AT (2026-07-05): Nav EINZEILIG rechts neben dem Logo, Items zentriert
   (moeglichst mittig unter der Suche). Kein eigener Zeilenumbruch. */
header#header .shopbar .megamenu-container.mts-nav-merged {
  order: 1 !important; flex: 1 1 auto !important; width: auto !important; max-width: none !important;
  margin: 0 !important; padding: 0 24px !important; display: flex !important; justify-content: center !important;
}
header#header .shopbar .megamenu-container.mts-nav-merged .megamenu.simple { width: auto !important; max-width: none !important; justify-content: center !important; margin: 0 auto !important; }
/* WICHTIG (Dropdown-Alignment): ul#menu-main braucht margin:0 (KEIN auto!) +
   position:static, sonst rechnet smartstore.megamenu.js alignDrop() falsch und
   die Unterkategorien erscheinen verschoben statt direkt unter dem Menuepunkt. */
header#header .shopbar .megamenu-container.mts-nav-merged ul.navbar-nav { width: auto !important; max-width: none !important; justify-content: center !important; margin: 0 !important; position: static !important; }
/* Nav-Items schmaler (Font auf a UND span + Padding), damit die 7 Kategorien
   neben dem zentrierten Logo passen und NICHT in die Google-Bewertung laufen.
   Text steckt teils im <span> -> deshalb auch span targeten, hohe Spezifitaet. */
header#header .megamenu-container.mts-nav-merged ul#menu-main li a.nav-link,
header#header .megamenu-container.mts-nav-merged ul#menu-main li a.nav-link > span,
header#header .megamenu-container.mts-nav-merged ul#menu-main li a { font-size: 17px !important; font-weight: 700 !important; text-transform: uppercase !important; letter-spacing: 0.02em !important; }
header#header .megamenu-container.mts-nav-merged ul#menu-main li a.nav-link { padding-left: 9px !important; padding-right: 9px !important; }
header#header .shopbar .shopbar-col-group-tools { order: 2 !important; flex: 0 0 auto !important; }
/* Megamenu-Slider-Pfeile ausblenden (alle 7 Kategorien passen, kein Slider noetig) */
header#header .megamenu-nav, header#header .megamenu-nav-btn { display: none !important; }
header#header .shopbar .megamenu-container.mts-nav-merged, header#header .shopbar .megamenu.simple, header#header .shopbar .nav-slider { overflow: visible !important; }
/* FB/IG-Social (Inline-SVG, Multicycle-Gruen) einzeilig in der Tools-Gruppe,
   direkt VOR dem Google-Badge (also zwischen Nav und Google). */
header#header .shopbar-tools .mts-social-links { display: inline-flex !important; align-items: center; gap: 2px; margin-right: 6px; }
header#header a.mts-social-link { color: var(--mts-accent) !important; display: inline-flex; align-items: center; justify-content: center; padding: 5px !important; line-height: 0; transition: color .15s ease, transform .15s ease; }
header#header a.mts-social-link:hover { color: var(--mts-accent-hover) !important; transform: translateY(-1px); }
header#header a.mts-social-link svg { display: block; }

/* Wunschlisten-/Warenkorb-Zaehler gruen (Theme-Default #EE9B00 ueberschreiben) */
header#header .badge-counter, .badge.badge-counter, .badge-pill.badge-counter { background-color: var(--mts-accent) !important; color: #fff !important; }

/* Mobile (<lg): Menubar ausgeblendet -> Suche zurueck in die Shopbar */
@media (max-width: 991.98px) {
  header#header .shopbar-section .shopbar-col.shopbar-search { position: static !important; transform: none !important; width: auto !important; flex: 1 1 auto !important; }
  header#header .shopbar { flex-wrap: wrap !important; }
  header#header .shopbar .shopbar-col-group-brand { margin-left: 0 !important; }
  header#header .shopbar .megamenu-container.mts-nav-merged { order: 3 !important; flex: 0 0 100% !important; }
}

/* === Header-Suche im multicycle.at-Stil: Pill, gruener 2px-Border, gruenes Icon, hoeher, breiter === */
header#header .menubar .shopbar-col.shopbar-search.mts-menubar-search {
  flex: 1 1 auto !important; width: auto !important; max-width: none !important; min-width: 0 !important;
}
header#header .mts-menubar-search .instasearch-form,
header#header .mts-menubar-search form,
header#header .shopbar-col.shopbar-search .instasearch-form {
  width: 100% !important; max-width: none !important; min-width: 0 !important;
  border: 2px solid var(--mts-accent) !important;
  border-radius: 999px !important;
  background: #ffffff !important;
  box-shadow: none !important;
  min-height: 46px !important; height: auto !important;
  overflow: hidden !important;
}
header#header .mts-menubar-search .instasearch-form:focus-within,
header#header .shopbar-col.shopbar-search .instasearch-form:focus-within {
  box-shadow: 0 0 0 3px rgba(var(--mts-c-primary-rgb),0.18) !important;
}
header#header .shopbar-col.shopbar-search .instasearch-term,
header#header .mts-menubar-search .instasearch-term {
  padding: 12px 52px 12px 22px !important;
  font-size: 14px !important; line-height: 1.2 !important; min-height: 44px !important;
  background: transparent !important; border: 0 !important; box-shadow: none !important;
}
header#header .instasearch-term::placeholder {
  text-transform: uppercase !important; letter-spacing: 0.04em !important;
  color: var(--mts-text-muted) !important; opacity: 1 !important;
}
header#header .shopbar-col.shopbar-search .instasearch-submit,
header#header .mts-menubar-search .instasearch-submit { width: 48px !important; }
header#header .instasearch-submit i,
header#header .instasearch-submit svg,
header#header .instasearch-icon {
  color: var(--mts-accent) !important; fill: var(--mts-accent) !important; stroke: var(--mts-accent) !important; font-size: 17px !important;
}
/* Header-Warenkorb-Icon (ist ein SVG, 23px) auf Herz-Groesse (28px) bringen */
header#header #shopbar-cart .shopbar-button-icon svg { width: 28px !important; height: 28px !important; }
/* === Megamenu-Dropdown korrekt UNTER der Kategorie (Container per JS in .megamenu.simple verschoben) === */
header#header .megamenu.simple { position: relative !important; }
header#header .megamenu.simple > .megamenu-dropdown-container { left: 0 !important; right: auto !important; top: 100% !important; }

/* Rechte Menubar-Gruppe (Kontakt/Service/Filiale/Anmelden) kompakter -> Platz fuer breitere Suche.
   NUR ml-auto + Folgegruppen; NICHT die Trust-Gruppe (ml-0). */
header#header .menubar .menubar-group.ml-auto,
header#header .menubar .menubar-group.ml-auto ~ .menubar-group { font-size: 14px !important; }
/* Trust-Badges + Filial-Pill NORMALE Groesse (Suche eigene Zeile -> kein Platzdruck) */
/* Kompakter seit 2026-07-28 (Nutzerwunsch): vorher 14px / gap 6 / Icon 18px.
   Die vier Badges belegten damit 594 px der Menubar-Zeile und schoben das
   Suchfeld so weit nach rechts, dass es nicht mehr ueber der Kategorie-Nav
   zentriert werden konnte - fuer die Ausrichtung fehlte der Platz links. */
header#header .mts-trustbar .mts-trust-badge { font-size: 12px !important; gap: 4px !important; }
header#header .mts-trustbar .mts-trust-badge svg,
header#header .mts-trustbar .mts-trust-badge img { width: 14px !important; height: 14px !important; }
header#header .menubar .mts-branch-pill { font-size: 13px !important; padding: 6px 12px !important; }
/* Suchformular MUSS die (breite) Col-Breite fuellen - Theme haelt es sonst per Flex bei ~225px Content-Breite */
header#header .shopbar-col.shopbar-search.mts-menubar-search { display: flex !important; align-items: center !important; }
header#header .shopbar-col.shopbar-search .instasearch-form,
header#header .shopbar-col.shopbar-search .instasearch-form.has-icon,
header#header .mts-menubar-search .instasearch-form.has-icon {
  flex: 1 1 auto !important; width: 100% !important; max-width: none !important; min-width: 0 !important;
}
header#header .shopbar-col.shopbar-search .instasearch-form.has-icon input.instasearch-term.form-control,
header#header .mts-menubar-search .instasearch-form.has-icon input.instasearch-term.form-control,
header#header .mts-menubar-search .instasearch-term.form-control {
  flex: 1 1 0% !important; width: 100% !important; max-width: none !important; min-width: 0 !important;
}
/* === Gruener Lupen-Button mit WEISSER Lupe (multicycle.at-Stil) === */
header#header .shopbar-col.shopbar-search .instasearch-icon,
header#header .mts-menubar-search .instasearch-icon {
  background: var(--mts-accent) !important;
  border-radius: 999px !important;
  width: 36px !important; min-width: 36px !important; height: 36px !important;
  right: 5px !important; left: auto !important; top: 50% !important; bottom: auto !important;
  transform: translateY(-50%) !important;
  display: flex !important; align-items: center !important; justify-content: center !important;
}
header#header .shopbar-col.shopbar-search .instasearch-icon i,
header#header .shopbar-col.shopbar-search .instasearch-icon svg,
header#header .mts-menubar-search .instasearch-icon i,
header#header .mts-menubar-search .instasearch-icon svg,
header#header .instasearch-submit i,
header#header .instasearch-submit svg {
  color: #ffffff !important; fill: #ffffff !important; stroke: #ffffff !important; font-size: 16px !important;
}
/* Lupe EXAKT im gruenen Kreis zentrieren: Glyph absolut mittig (der fa-Glyph sass ~6px links).
   .instasearch-icon ist bereits position:absolute -> ist der Bezug fuer das absolute Glyph. */
header#header .instasearch-icon i,
header#header .instasearch-icon svg {
  position: absolute !important; left: 50% !important; top: 50% !important;
  transform: translate(calc(-50% + 6px), -50%) !important; margin: 0 !important; line-height: 1 !important;
}
/* Submit ist transparent/klickbar; der (einzige, gemeinsame) Lupe-Glyph bleibt sichtbar + weiss */
header#header .instasearch-submit { background: transparent !important; border: 0 !important; }
/* Clear-X (erscheint beim Tippen) vertikal ZENTRIERT + LINKS vom gruenen Kreis (sass zu weit oben + ueberlappte) */
header#header .mts-menubar-search .instasearch-addon,
header#header .shopbar-col.shopbar-search .instasearch-addon {
  top: 0 !important; bottom: 0 !important; transform: none !important;
  right: 50px !important; height: auto !important; display: flex !important; align-items: center !important;
}
header#header .instasearch-addon .instasearch-clear,
header#header .instasearch-addon button,
header#header .instasearch-clear {
  top: auto !important; bottom: auto !important; transform: none !important; position: static !important;
  margin: 0 !important; align-self: center !important;
}
/* Clear-X als echter KREIS + auf gleicher Mitte wie die gruene Lupe (36px).
   WICHTIG: display NICHT setzen -> das Theme blendet den Button bei LEEREM Feld
   selbst aus (display:none) und zeigt ihn erst bei Eingabe. Quadratische Box (30x30)
   -> border-radius:50% wird ein Kreis (nicht das 24x56-Oval des Themes).
   Die addon-Bezugsbox ist 56px hoch und sitzt ~6px hoeher als die Pille -> top:6px
   zieht den Button auf die Lupe-Mitte (sonst klebt er zu weit oben am Rand). */
header#header .mts-menubar-search .instasearch-addon .instasearch-clear.input-clear,
header#header .shopbar-col.shopbar-search .instasearch-addon .instasearch-clear.input-clear,
header#header .instasearch-addon .instasearch-clear.input-clear {
  width: 30px !important; min-width: 30px !important;
  height: 30px !important; min-height: 30px !important;
  flex: 0 0 30px !important;
  border-radius: 50% !important;
  padding: 0 !important;
  line-height: 30px !important; text-align: center !important;
  align-items: center !important; justify-content: center !important;
  position: relative !important; top: 6px !important;
}
header#header .instasearch-addon .instasearch-clear.input-clear i,
header#header .instasearch-addon .instasearch-clear.input-clear svg {
  margin: 0 !important; line-height: 1 !important;
}

/* === Header NIEDRIGER + Zeilen enger (User-Iteration) === */
header#header .menubar-section { padding: 0 !important; }
header#header .shopbar-section { padding: 0 0 1px !important; }
header#header .mts-menubar-search .instasearch-form { min-height: 40px !important; height: 40px !important; }
header#header .menubar, header#header .menubar .menubar-group { min-height: 0 !important; }
/* Such-Col (war 64px -> trieb die Menubar-Hoehe) auf Form-Hoehe zwingen */
header#header .menubar .shopbar-col.shopbar-search.mts-menubar-search { height: 42px !important; min-height: 0 !important; padding-top: 0 !important; padding-bottom: 0 !important; align-items: center !important; }
/* Logo etwas niedriger -> Shopbar-Zeile (und Header) niedriger.
   TASK-639: auf den Desktop begrenzt. Diese Regel hat bis hierher auch auf dem
   Handy gegolten und dort die beiden Media-Queries in Z.6966/6969 ausgehebelt —
   gleicher Selektor, gleiche Spezifitaet, spaeter in der Datei, also gewann sie
   still. Sichtbare Folge: das Logo-Bild war mobil auf 250 bzw. 190 px verkleinert,
   behielt aber die 76 px Hoehe des Desktops und trug diese Hoehe in den Kopf.
   Ohne die Grenze hier ist der reparierte Kopf 209 px hoch statt 181. */
@media (min-width: 992px) {
  header#header .shop-logo a.brand, header#header .shop-logo .brand { height: 76px !important; }
}
header#header .shopbar, header#header .shopbar .shopbar-col { min-height: 0 !important; }
/* Hover/Focus-Border + Outline auf Herz + Warenkorb (und alle Header-Tool-Buttons) entfernen */
header#header .shopbar-button, header#header .shopbar-tool > a,
header#header #shopbar-wishlist > a, header#header #shopbar-cart > a { border: 0 !important; }
header#header .shopbar-button:hover, header#header .shopbar-button:focus, header#header .shopbar-button:focus-visible, header#header .shopbar-button:active,
header#header .shopbar-tool > a:hover, header#header .shopbar-tool > a:focus, header#header .shopbar-tool > a:focus-visible,
header#header #shopbar-wishlist > a:hover, header#header #shopbar-wishlist > a:focus,
header#header #shopbar-cart > a:hover, header#header #shopbar-cart > a:focus {
  outline: none !important; border-color: transparent !important; box-shadow: none !important; background: transparent !important;
}
/* === SALE-Kategorie mit multicycle-gruenem Hintergrund (href-Selektor robust + id-Fallback) === */
header#header .megamenu-container.mts-nav-merged ul#menu-main li a[href$="/sale"],
header#header .megamenu-container.mts-nav-merged ul#menu-main li a[href$="/sale/"],
header#header ul#menu-main li#main-nav-item-160 > a {
  background: var(--mts-accent) !important; color: #ffffff !important;
  border-radius: 6px !important; padding: 4px 22px !important;
  line-height: 1.35 !important;
}
/* === Such-Fokus: Shopbar-Layout KOMPLETT einfrieren ===
   Das Theme kollabiert im Such-Modus die Logo-Zone (transform translateX(385) auf .shop-logo
   + Brand-Gruppe schrumpft) -> die zentrierte Nav rueckt ~50px nach, Google/Tools bleiben.
   In unserem Layout (Suche in der Menubar) ist das unnoetig -> alles auf Normalwerte pinnen. */
body.search-focused header#header .shopbar,
body.search-focused header#header .shopbar-col-group-brand,
body.search-focused header#header .shopbar .shopbar-col.shop-logo,
body.search-focused header#header .shop-logo a.brand,
body.search-focused header#header .megamenu-container.mts-nav-merged,
body.search-focused header#header ul#menu-main,
body.search-focused header#header .shopbar-col-group-tools {
  transform: none !important; transition: none !important; opacity: 1 !important; visibility: visible !important;
}
body.search-focused header#header .shopbar .shopbar-col-group.shopbar-col-group-brand { width: auto !important; min-width: 380px !important; padding-left: 24px !important; max-width: none !important; }
/* KERN-FIX: Das Theme setzt im Such-Fokus margin-left:-373px auf die Logo-Col (+ translateX(385)),
   was die Brand-Gruppe kollabieren laesst -> die zentrierte Nav rueckt -50px. margin-left:0 haelt
   die Logo-Col im Fluss -> Brand-Gruppe bleibt ~480px -> Nav bewegt sich nicht. */
body.search-focused header#header .shopbar .shopbar-col.shop-logo,
body.search-focused header#header .shop-logo a.brand { position: static !important; margin: 0 !important; width: 385px !important; min-width: 385px !important; flex: 0 0 auto !important; left: auto !important; right: auto !important; top: auto !important; }

/* ---------------------------------------------------------------------------
   TASK-639 — die zweite Haelfte. Die beiden Regeln direkt darueber wiederholen
   die festen Spaltenbreiten fuer den Such-Fokus. Wer nur Z.7090/7091 abgesichert
   haette, bekaeme den Ueberlauf zurueck, sobald jemand ins Suchfeld tippt.

   Der Block MUSS hier stehen und nicht oben bei den anderen: Media-Queries
   erhoehen die Spezifitaet nicht, beide Regelsaetze tragen !important, und
   `body.search-focused …` ist spezifischer als der Basis-Selektor. Entschieden
   wird also nach Position in der Datei — oben waere er wirkungslos gewesen.

   Das Logo-BILD braucht hier eine ausdrueckliche Breite: es ist ein
   background-image auf a.brand, das <img> darin ist auf 1 px gesetzt (Z.6964).
   `width: auto` liesse den Kasten auf 0 zusammenfallen und das Logo
   verschwinden. Uebernommen werden deshalb genau die Werte der mobilen
   Media-Queries aus Z.6966/6969.
   --------------------------------------------------------------------------- */
@media (max-width: 991.98px) {
  body.search-focused header#header .shopbar .shopbar-col-group.shopbar-col-group-brand {
    width: auto !important;
    min-width: 0 !important;
    max-width: 100% !important;
    padding-left: 14px !important;
    padding-right: 14px !important;
  }
  body.search-focused header#header .shopbar .shopbar-col.shop-logo {
    width: auto !important;
    min-width: 0 !important;
    max-width: 100% !important;
  }
  body.search-focused header#header .shop-logo a.brand {
    width: 250px !important;
    min-width: 0 !important;
    max-width: 52vw !important;
    height: 58px !important;
  }
}
@media (max-width: 575px) {
  body.search-focused header#header .shop-logo a.brand {
    width: 190px !important;
    height: 44px !important;
  }
}
header#header ul#menu-main li > a[href$="/sale"] > span,
header#header ul#menu-main li > a[href$="/sale/"] > span,
header#header ul#menu-main li#main-nav-item-160 > a > span {
  color: #ffffff !important;
}
header#header ul#menu-main li > a[href$="/sale"]::before,
header#header ul#menu-main li > a[href$="/sale/"]::before,
header#header ul#menu-main li#main-nav-item-160 > a::before { display: none !important; }


/* ============================================================================
   TASK-442 — Karten-Farb-Swatches (multicycle-Style, Home + Listing)
   Iter 6: EINE gemeinsame Overlay-Zeile .mts-pcard__variants unten im
   __media-Block (position:relative auf beiden Karten-Typen: Home-Topic :168,
   Listing :6448): Swatches links, Groessen rechts, gleiche Grundlinie.
   Kreis 24px mit weissem Innenring, Auswahl-Ring in Textfarbe (analog
   PDP-Swatch .is-active). JS: renderCardSwatches in mts-theme-global.js.
   ========================================================================== */
.mts-pcard__variants {
  /* Nutzer-Vorgabe 2026-08-17 (mc.movetoshop.com): Farbkreise duerfen NIE
     auf dem Produktbild liegen. WAR ein Bild-Overlay
     (`position:absolute; bottom:12px`, Iter 6) — bei genug Groessen wuchs
     die Zeile dadurch nach OBEN ins Bild (row-gap liess Groessen zweizeilig
     werden, der bottom-verankerte Block wurde dadurch insgesamt hoeher, also
     ragte sein Oberrand tiefer ins Bild). Jetzt normaler Fluss-Block GLEICH
     NACH der Bild-Figure (JS: ensureVariantRow() haengt per
     `insertBefore(..., media.nextSibling)` nicht mehr in die Figure,
     sondern dahinter) — feste Position unter dem Bild, unabhaengig davon,
     wie viele Zeilen die Groessen brauchen.

     NACHTRAG (selber Tag, Korrektur): ein erster Versuch stellte die Zeile
     auf Spalten-Layout um (Farbkreise oben, Groessen in eigener Zeile
     darunter) — das widersprach der ORIGINAL-Vorgabe aus TASK-442 Iter 5
     (Kommentar weiter unten bei .mts-pcard__sizes: "gegenueber von den
     farbkreisen, rechtsbuendig"). Zurueckgebaut auf Zeile mit
     `space-between`: Farbkreise links, Groessen rechts, GENAU wie vorher —
     der einzige Unterschied zum Vor-Fix-Zustand ist die Position des
     GESAMTEN Blocks (jetzt unter dem Bild statt darauf). Waechst die
     Groessen-Zeile durch Umbruch nach unten, zieht sie nur den Block selbst
     in die Hoehe (normaler Fluss, kein bottom-verankertes Overlay mehr) —
     die Farbkreise bleiben an ihrer Position, das Bild bleibt unberuehrt.
     `pointer-events:none` + der Passthrough-Trick aus TASK-811 sind damit
     hinfaellig: es liegt kein Bild-Link mehr darunter, den ein Tipp treffen
     koennte.

     ZWEITER NACHTRAG (2026-08-17, Bugfix): bei genug Groessen (gemessen: 7
     Groessen + 2 Farbkreise, Karte 225 px) warf die AEUSSERE Zeile den
     KOMPLETTEN .mts-pcard__sizes-Block auf eine neue Zeile UNTER die
     Farbkreise, statt ihn intern umbrechen zu lassen — ein klassisches
     Flexbox-Verhalten: `.mts-pcard__sizes` hatte `flex:0 1 auto` (kein
     Wachsen), also zaehlte fuer die Umbruch-Entscheidung DIESER Zeile seine
     NATUERLICHE, UNGEWRAPPTE Breite (alle 7 Chips in einer Reihe gedacht,
     deutlich breiter als der Restplatz) — obwohl der Block selbst laengst
     `flex-wrap:wrap` traegt und intern haette umbrechen koennen. Flexbox
     entscheidet Zeilenumbrueche nach der hypothetischen (Basis-)Breite eines
     Items, nicht danach, ob es sich selbst noch verkleinern/intern umbrechen
     koennte. Fix: `flex-wrap` HIER auf `nowrap` — Farbkreise und Groessen
     starten IMMER auf derselben Zeile; `.mts-pcard__sizes` bekommt per
     `flex-grow:1` den kompletten Restplatz als definierte Breite, innerhalb
     derer sein EIGENES `flex-wrap:wrap` (siehe dort) korrekt greift. */
  position: static;
  display: flex;
  align-items: flex-start;
  gap: 8px;
  flex-wrap: nowrap;
  padding: 10px 14px 6px;
  /* NACHTRAG 2026-08-17 (User): Karten mit 1-zeiliger Groessenliste (40px
     gemessen: 10px Polster + 24px Farbkreis-Zeile + 6px Polster) waren
     niedriger als Karten mit 2 Zeilen (57px: 10 + 41 [2x18,5px Chipzeile +
     4px Gap] + 6) - dieselbe Grid-Reihe stretcht zwar korrekt, aber zwischen
     verschiedenen Reihen blieb der Hoehenunterschied sichtbar. Fixe
     Mindesthoehe auf den 2-Zeilen-Wert reserviert IMMER Platz fuer 2
     Groessen-Zeilen (User: "immer mindestens zwei Reihen fuer die Groesse
     reservieren"), egal ob die Karte 1 oder 2 Zeilen tatsaechlich braucht.
     Braucht eine Karte ausnahmsweise 3 Zeilen, waechst sie weiter darueber
     hinaus (min-height, keine feste height). */
  min-height: 57px;
}
.mts-pcard__swatches {
  display: flex;
  /* TASK-719 (09.08.): WAR `wrap`. Die Leiste sitzt als Overlay am unteren
     Bildrand (`.mts-pcard__variants` ist `position:absolute; bottom:12px`) -
     eine zweite Zeile waechst deshalb nach OBEN ins Produktbild. Gemessen bei
     390 px Geraetebreite: 36 von 36 Karten ragten hinein.
     Die Zahl der Kreise deckelt jetzt das JS (`mtsKappeSwatchLeiste`) und
     haengt einen `+N`-Chip an. `nowrap` ist der Riegel dahinter: rechnet die
     Kappung einmal daneben, wird waagerecht beschnitten statt senkrecht ins
     Bild gewachsen - die deutlich harmlosere Fehlerrichtung. */
  flex-wrap: nowrap;
  /* WAR `overflow: hidden` (bis 2026-08-09).
     Gemessen auf /fahrraeder/: die Leiste ist exakt so gross wie ihr Inhalt -
     Kastenlinks 74,9 = Kreislinks 74,9, Kastenhoehe 26,4 = Kreishoehe 26,4.
     Alles, was ein Kreis nach AUSSEN zeichnet, lag damit ausserhalb der
     Clip-Box und wurde weggeschnitten: der Auswahl-Ring links/oben/unten am
     ersten Kreis (das vom Nutzer gemeldete "abgeschnitten je Ecke") und der
     feine Schlagschatten aller Kreise.

     `clip` statt `hidden` behaelt den Riegel aus TASK-719 - waagerecht wird
     weiter beschnitten, wenn die Kappung einmal danebenrechnet - und
     `overflow-clip-margin` schiebt die Schnittkante 8 px nach aussen, ohne
     einen einzigen Layoutwert zu aendern. Genau das ist hier entscheidend:
     Innenabstand plus negativer Aussenabstand haette dasselbe geleistet, aber
     die Oberkante der Leiste verschoben - und `mtsKappeSwatchLeiste` entscheidet
     an genau dieser Oberkante (`Math.abs(r.top - barOben) < 4`), ob die
     Groessenanzeige in derselben Zeile steht. Der Umweg haette die Kappung
     stillschweigend verstellt.

     Aeltere Browser ohne `overflow-clip-margin` (Safari < 18.2) verstehen
     `clip` trotzdem und schneiden an der Polsterkante - also genau wie bisher,
     kein Rueckschritt. */
  overflow: clip;
  overflow-clip-margin: 8px;
  gap: 8px;
  /* TASK-656: WAR `flex: 0 1 auto` + `min-width: 0`. Damit waren die Kreise
     das einzige schrumpffaehige Element der Zeile und trugen die gesamte
     Differenz - auf /bikes/ bei 390 px auf 23 von 24 Karten bis auf Breite 0
     (sichtbar blieb der 2-px-Splitter). Der `flex-wrap: wrap` daneben konnte
     das nie auffangen: umgebrochen wird INNERHALB der Breite, die das Element
     bekommt, und es bekam keine. */
  flex: 0 0 auto;
}
/* Zaehler-Chip fuer die gekappten Farben (TASK-719, 09.08.2026).
   Gleiche Groesse und Form wie ein Farbkreis, aber neutral eingefaerbt - er
   ist eine Angabe, keine waehlbare Farbe. Bewusst ohne eigenen Klick-Handler:
   er erbt, was die Karte tut, und fuehrt damit zur Produktseite, auf der alle
   Farben stehen. */
.mts-pcard__swatch--more {
  background: var(--mts-c-surface-alt, #f1f2f4) !important;
  background-image: none !important;
  color: var(--mts-text, #1d1d1f);
  box-shadow: inset 0 0 0 1px rgba(15, 23, 42, 0.16) !important;
  display: inline-flex !important;
  align-items: center;
  justify-content: center;
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: -0.02em;
  font-variant-numeric: tabular-nums;
  line-height: 1;
  cursor: inherit;
  pointer-events: auto; /* TASK-811: Elternregel .mts-pcard__variants sperrt jetzt global */
}
/* Und so wird der Zähler wieder los (2026-08-19).
   Das `display: inline-flex !important` im Block darüber schlägt JEDES
   Inline-`style="display:none"` — nach der Kaskade gewinnt eine wichtige
   Autoren-Deklaration gegen jede normale, das Style-Attribut eingeschlossen.
   Gemessen am Livestand: der Chip trug `style="display: none;"`, meldete in
   `getComputedStyle()` weiter `flex` und stand als 32-x-32-px-Element in der
   Leiste. Ein einmal erzeugter Zähler war damit unlöschbar und erschien
   zusammen mit allen Kreisen, sobald ein späterer Lauf diese zurückstellte.
   Das JS schaltet ihn deshalb über `hidden`; dieser Riegel hat dieselbe
   Gewichtsklasse und dazu die höhere Spezifität (Klasse + Attribut).
   Das `!important` oben bleibt bewusst stehen: es steht dort gegen eine andere
   Regel, ein Rückbau wäre eine zweite, unbelegte Änderung. */
.mts-pcard__swatch--more[hidden] { display: none !important; }
@media (max-width: 991.98px) {
  .mts-pcard__swatch--more { font-size: 12px; }
}
.mts-pcard__swatch {
  /* Iter 2: 18px -> 24px (User: "farbkreise bisschen groesser") */
  width: 24px;
  height: 24px;
  /* NICHT SCHRUMPFEN. Seit die Leiste `nowrap` ist (TASK-719, 09.08.), waeren
     die Kreise wieder das einzige schrumpffaehige Element der Zeile und
     truegen die gesamte Ueberbreite - gemessen fielen 21 Kreise auf je 3 px
     zusammen. Das ist derselbe Defekt wie in TASK-656, nur ueber einen anderen
     Weg herbeigefuehrt. Zusaetzlich verfaelscht es die Kappung: die misst die
     Chipbreite und haette mit 3 px 22 Kreise fuer passend gehalten. */
  flex: 0 0 auto;
  padding: 0;
  border-radius: 50%;
  border: 1px solid rgba(0, 0, 0, 0.18);
  box-shadow: inset 0 0 0 2px #fff, 0 1px 4px rgba(0, 0, 0, 0.12);
  cursor: pointer;
  transition: transform .15s ease, box-shadow .15s ease;
  pointer-events: auto; /* TASK-811: Elternregel .mts-pcard__variants sperrt jetzt global */
}
.mts-pcard__swatch:hover { transform: scale(1.12); }
/* AUSGEWAEHLT HEISST GROESSER, NICHT UMRANDET (Nutzer-Vorgabe 2026-08-09).

   WAR: `box-shadow: inset 0 0 0 2px #fff, 0 0 0 2px var(--mts-text)` plus
   `border-color: transparent` - also ein 2 px starker, fast schwarzer Ring um
   den Kreis. Auf der Karte war der doppelt unguenstig: er wirkte schwer, und
   er war das einzige Element, das ueber die Clip-Box der Leiste hinausragte
   (siehe Begruendung bei `.mts-pcard__swatches`).

   Jetzt traegt allein die Groesse die Auswahl. 24 -> 28,3 px sind 18 Prozent,
   bei 8 px Abstand kollidiert nichts.

   Der Haarstrich `border: 1px solid rgba(0,0,0,.18)` aus der Grundregel bleibt
   ABSICHTLICH stehen und wird hier nicht mehr auf `transparent` gesetzt: er
   sitzt auf JEDEM Kreis, ist also kein Auswahlmerkmal, sondern das, was einen
   weissen oder silbernen Lack auf weisser Karte ueberhaupt sichtbar macht.

   Die Zeile steht bewusst NACH `:hover`: beide Selektoren haben dieselbe
   Spezifitaet, die spaetere gewinnt - ein aktiver Kreis behaelt beim Ueberfahren
   seine 1,18 und schrumpft nicht auf den Hover-Wert 1,12 zusammen. */
.mts-pcard__swatch.is-active {
  box-shadow: inset 0 0 0 2px #fff, 0 1px 4px rgba(0, 0, 0, 0.12);
  transform: scale(1.18);
}
/* TASK-442 Iter 2 — Mehrfarben-Karten: Bild bleibt ruhig stehen (kein
   Hover-Zoom), damit das per Swatch gewaehlte Bild beim Ansteuern der
   Kreise nicht wandert. Einfarbige Karten behalten den Zoom (Default-
   Regeln: Listing :6448ff, Home-Topic :170). Klick-only-Swap macht das JS. */
.art.mts-pcard--multicolor:hover .mts-pcard__media img,
.mts-pcard--multicolor:hover .mts-pcard__media img {
  transform: none !important;
}

/* ============================================================================
   TASK-442 Iter 2 — Kategorieseiten-Kopf entschlacken (User 2026-07-05):
   1. Keine Trennlinie unter dem Header (Header-Border kommt aus :35).
   2. Kein Padding/Abstand zwischen Header und Kategorie-Hero — Smartstore-
      Default-padding-top von section#content + Banner-margin-top (Muster
      analog PDP-Fix body.mts-pdp section#content, :4058).
   body.mts-cat-page deckt Kategorie- UND Manufacturer-Seiten (markCatPageBody).
   ========================================================================== */
body.mts-cat-page header#header { border-bottom: 0 !important; }
body.mts-cat-page section#content,
body.mts-cat-page .container#content {
  padding-top: 0 !important;
  margin-top: 0 !important;
}
body.mts-cat-page .mts-cat-hero-banner,
body.mts-cat-page.mts-hero-hoisted .mts-cat-hero-banner {
  margin-top: 0 !important;
}

/* ============================================================================
   TASK-442 Iter 3 — Hover-Zweitbild-Regeln (User 2026-07-05):
   MEHRFARBEN-Karten zeigen IMMER das Bild der gewaehlten Farbe (kein
   Crossfade zum zweiten Galeriebild — das waere idR die naechste Farbe);
   EINFARBIGE Karten behalten den Hover-Crossfade — NEU auch auf der
   Startseite (second aus mts-card-colors.json, injiziert in
   renderCardSwatches; Listing behaelt zusaetzlich den fetchPdpDataForCard-
   Weg, injectHoverImg ist idempotent).
   ========================================================================== */
/* Backstop: Multi-Karten nie ein Hover-Zweitbild (Timing-Fenster, bis
   renderCardSwatches ein vom PDP-Fetch injiziertes entfernt) + Original
   bleibt beim Hover voll sichtbar (schlaegt :3344). */
.mts-pcard--multicolor .mts-card-img-hover { display: none !important; }
.artlist .art.mts-pcard--multicolor:hover .art-picture img:not(.mts-card-img-hover),
.artlist .art.mts-pcard--multicolor:hover .art-picture-block img:not(.mts-card-img-hover) {
  opacity: 1 !important;
}
/* HOME-Karten: Crossfade-Mechanik (Pendant zu .artlist .art :3330-3344).
   Geometrie (absolute/inset/contain/padding) kommt aus dem Topic-CSS —
   .mts-pcard__media img matcht auch das hover-img. */
a.mts-pcard .mts-card-img-hover {
  opacity: 0;
  transition: opacity 0.45s ease;
  pointer-events: none;
  z-index: 2;
}
a.mts-pcard:hover .mts-card-img-hover[data-mts-loaded="1"] { opacity: 1; }
a.mts-pcard:not(.mts-pcard--multicolor):hover:has(.mts-card-img-hover[data-mts-loaded="1"]) .mts-pcard__media img:not(.mts-card-img-hover) {
  opacity: 0;
  transition: opacity 0.45s ease;
}

/* ============================================================================
   TASK-442 Iter 5 — Groessen-Verfuegbarkeit auf der Produktkarte (User:
   "groessen anzeigen ... gruen/gelb ... gegenueber von den farbkreisen,
   rechtsbuendig, klein aber sichtbar"). Punkt gruen (#15803d, wie der
   Auf-Lager-Dot) = in der gewaehlten Farbe verfuegbar; gelb (#eab308) =
   nicht verfuegbar. Swatch-Klick faerbt live um (renderSizeAvail).
   ========================================================================== */
.mts-pcard__sizes {
  /* Iter 6: lebt in .mts-pcard__variants (rechts).
     TASK-656: WAR `flex-wrap: nowrap` + `flex: 0 0 auto`, also nicht
     schrumpffaehig und einzeilig. In einer 126-px-Zeile forderte die Leiste
     damit ihre volle Inhaltsbreite (140-279 px) und ragte 65-147 px ueber den
     Kartenrand hinaus; `.art.mts-pcard` hat `overflow: hidden`, der Ueberstand
     wurde also lautlos abgeschnitten - auf Karte 733 rund 147 px von sieben
     Groessen. Jetzt darf die Leiste schrumpfen und ihre Chips umbrechen.
     Ab etwa 1.280 px reicht der Platz weiterhin fuer eine Zeile, der Desktop
     bleibt damit unveraendert (gemessen 08.08. auf beiden Instanzen). */
  display: flex;
  flex-wrap: wrap;
  /* Rechtsbuendig, wie in TASK-442 Iter 5 vom Nutzer vorgegeben ("gegenueber
     von den farbkreisen, rechtsbuendig"). `margin-left:auto` schiebt die
     Leiste bewusst zusaetzlich zu `justify-content` an den rechten Rand — das
     wirkt PRO Flex-Zeile, haelt also auch eine umgebrochene zweite Zeile
     rechtsbuendig statt linksbuendig. Kurzzeitig (selber Tag) auf
     linksbuendig/eigene-Zeile umgestellt und wieder zurueckgebaut, siehe
     Kommentar bei .mts-pcard__variants. */
  justify-content: flex-end;
  gap: 4px;
  /* WAR `flex: 0 1 auto` (kein Wachsen). Genau das liess die AEUSSERE Zeile
     (.mts-pcard__variants) bei vielen Groessen umbrechen, weil ohne
     Wachsen die natuerliche (ungewrappte) Inhaltsbreite fuer die
     Zeilen-Entscheidung des Elternelements zaehlte statt des Restplatzes,
     der Block wanderte dadurch komplett unter die Farbkreise. `flex-grow:1`
     gibt dem Block den kompletten Restplatz als definierte Breite — darin
     wrappen die einzelnen Chips (das `flex-wrap:wrap` oben) jetzt korrekt,
     die Farbkreise bleiben unberuehrt auf derselben Zeile stehen. */
  flex: 1 1 0%;
  min-width: 0;
  margin-left: auto;
}
.mts-pcard__size {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  font-size: 10.5px;
  font-weight: 600;
  line-height: 1;
  white-space: nowrap;
  color: var(--mts-text, #1d1d1f);
  background: rgba(255, 255, 255, 0.9);
  border: 1px solid rgba(0, 0, 0, 0.07);
  border-radius: 999px;
  padding: 3px 6px 3px 4px;
}
.mts-pcard__size::before {
  content: '';
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: #eab308; /* gelb = in gewaehlter Farbe nicht verfuegbar */
  flex: 0 0 auto;
}
.mts-pcard__size.is-in::before { background: #15803d; } /* gruen = verfuegbar */

/* ============================================================================
   TASK-639 — Handy-Bedienbarkeit: Hero-Ueberschrift und Trefferflaechen
   ============================================================================
   Zwei Befunde derselben Messung (mc.movetoshop.com, 360/390/430 px, echter
   Browser, Mobil-Emulation). Anders als der Kopf-Ueberlauf weiter oben liegt
   die Ursache hier NICHT in dieser Datei, sondern im Story-Body der Startseite
   (`.mts-hero h1`, `.mts-btn`) — also in einem DB-Inhalt, der pro Instanz
   getrennt gepflegt wird und den gerade ein anderer Arbeitsstrang umbaut.
   Deshalb steht die Korrektur hier und nicht dort; sie ist bewusst auf die
   Handy-Breiten begrenzt und laesst Tablet und Desktop unberuehrt.

   1. DIE UEBERSCHRIFT WAR ABGESCHNITTEN, UND ZWAR OHNE JEDE UMBRUCHCHANCE.
      Der Text lautet `Raus&nbsp;aufs&nbsp;Rad.<br>Dein&nbsp;neues&nbsp;Bike&nbsp;wartet.`
      Geschuetzte Leerzeichen sind fuer den Umbruchalgorithmus keine Trennstelle:
      die zweite Zeile ist EIN unteilbares Wort von 442 px Laufweite. Die Box ist
      bei 390 px Viewport 298 px breit, `section.mts-hero` traegt `overflow:hidden`
      — der Rest wird also nicht abgeschnitten UND scrollbar, sondern schlicht
      weggeschnitten. Sichtbar: "Dein neues Bike w…".
      Die Schriftgroesse kommt aus `clamp(2.6rem, 7.5vw, 6rem)`: unterhalb von
      etwa 555 px gewinnt die UNTERGRENZE 2.6rem = 41,6 px — die Schrift skaliert
      dort also gar nicht mehr mit, obwohl der Platz weiter schrumpft.
      Korrektur unterhalb des Bootstrap-sm-Breakpoints: Untergrenze absenken und
      die Vorzugsgroesse auf 6.9vw nehmen (bei 390 px: 26,9 px, Laufweite 286 px
      in einer 298-px-Box). `overflow-wrap` ist das Netz darunter — greift es
      doch einmal, sieht man einen unschoenen Umbruch statt eines unsichtbar
      fehlenden Satzendes. Das ist die bessere Fehlerrichtung, und sie haelt
      auch, wenn jemand den Text spaeter verlaengert.

   2. TREFFERFLAECHEN. Gemessen wurden 15 Ziele unter 44 x 44 px auf der
      Startseite. Vergroessert werden hier die, bei denen das ohne Eingriff ins
      Kartenbild geht: die beiden Social-Symbole im Kopf (28 x 28), die
      Hero-Schaltflaechen (40,6 px hoch) sowie Vergleichs- und Kaufknopf der
      Produktkarte (38 x 38). Die Farb- und Groessen-Schalter der Karte bleiben
      absichtlich unberuehrt — 44 px je Kreis passen nicht in eine 178 px breite
      Karte, und ueberlappende unsichtbare Trefferflaechen waeren schlechter als
      kleine sichtbare: man traefe zuverlaessig den falschen Kreis.
   ========================================================================== */
@media (max-width: 575.98px) {
  body .mts-hero h1 {
    font-size: clamp(1.1rem, 6.9vw, 2.6rem) !important;
    overflow-wrap: break-word !important;
  }
}
@media (max-width: 991.98px) {
  body .mts-btn {
    min-height: 44px !important;
  }
  .mts-compare-btn {
    width: 44px !important;
    height: 44px !important;
  }
  .art.mts-pcard .mts-pcard__buy {
    width: 44px !important;
    height: 44px !important;
  }
}
/* Werkzeug-Zeile auf sehr schmalen Geraeten: umbrechen statt hinauslaufen.
   Bei 320 px reicht das Zusammenschieben nicht mehr — der Warenkorb stand 37 px
   ausserhalb des Bildschirms (gemessen, und zwar auch OHNE die Aenderungen
   dieses Tickets: ein Altbestand, den `body { overflow-x: hidden }` verdeckt
   hat). Die Grenze liegt bewusst bei 360 px und nicht beim Theme-Breakpoint:
   `flex-wrap: wrap` schaltet das Schrumpfen der Eintraege ab, und von 360 px
   aufwaerts reicht genau dieses Schrumpfen. Weiter oben angesetzt kostet die
   Regel dort eine zweite Zeile und 52 px Kopfhoehe, ohne etwas zu reparieren. */
@media (max-width: 359.98px) {
  header#header .shopbar .shopbar-col-group-tools,
  header#header .shopbar .shopbar-col.shopbar-tools {
    max-width: 100% !important;
    flex-wrap: wrap !important;
  }
}
/* NICHT VERGROESSERT: die beiden Social-Symbole im Kopf (28 x 28) — und das ist
   eine Messung, keine Nachlaessigkeit. Die Werkzeug-Zeile fuehrt auf Handy-
   breiten fuenf Eintraege mit Textbeschriftung (Menue, Anmelden, Wunschliste,
   Warenkorb) und ist damit randvoll. Der Sprung auf 44 px kostet 2 x 16 px und
   zwingt die Zeile in den Umbruch: gemessen bei 390 px waechst die Gruppe von
   60 auf 120 px und der Kopf von 191 auf 243 px. Ein um 52 px hoeherer Kopf auf
   JEDER Seite, damit zwei Symbole groesser sind, ist der schlechtere Tausch.
   Der saubere Weg waere, die Textbeschriftungen auf dem Handy wegzulassen oder
   die Social-Symbole dort in den Fuss zu nehmen — beides Gestaltungsfragen, die
   der Kunde entscheidet, keine technischen. */

/* ----------------------------------------------------------------------------
   TASK-639 Nachtrag — Farb-Schalter der Produktkarte auf Touch-Groesse.
   ----------------------------------------------------------------------------
   Gemessen wurden 84 Ziele unter 44 x 44 px auf der Kategorieseite, die grosse
   Mehrheit davon Farbkreise (24 x 24) und Groessen-Marken. 44 px je Kreis passen
   nicht: die Karte ist bei 390 px Viewport rund 178 px breit, fuenf Kreise mit
   Abstand waeren breiter als die Karte selbst.

   Der naheliegende Ausweg — eine unsichtbare Trefferflaeche per ::after — waere
   hier SCHLECHTER als der kleine Kreis: bei 8 px Abstand liegen die Mittelpunkte
   32 px auseinander, eine 44er Flaeche ueberlappt den Nachbarn also um 12 px.
   Man traefe dann zuverlaessig den falschen Farbkreis, ohne es zu sehen.

   Stattdessen wachsen Kreis UND Abstand: 32 px bei 12 px Abstand. Damit liegen
   die Mittelpunkte 44 px auseinander — das ist die Zahl, auf die es beim Treffen
   wirklich ankommt (WCAG 2.2 „Target Size" rechnet den Abstand ausdruecklich mit
   an; 24 px plus Abstand erfuellen dort bereits die Stufe AA).

   NUR unterhalb des Theme-Breakpoints: auf dem Desktop wird mit der Maus gezielt,
   dort bleibt das Kartenbild unangetastet — so, wie es die Abnahme fuer alles ab
   992 px verlangt.
   -------------------------------------------------------------------------- */
@media (max-width: 991.98px) {
  .mts-pcard__swatches {
    gap: 12px !important;
    /* GRENZE FUER DEN UMBRUCH (2026-08-08). `flex-wrap: wrap` steht oben schon,
       konnte aber nichts bewirken: umgebrochen wird innerhalb der EIGENEN Breite,
       und die ergab sich hier aus dem Inhalt. Vier Kreise brauchen
       4 x 32 + 3 x 12 = 164 px; die Karte auf einer Kategorieseite ist bei 390 px
       Geraetebreite aber nur rund 154 px breit. Gemessen ragten die Kreise damit
       2 px (bei 390) bzw. 16 px (bei 360) ueber den Rand und wurden beschnitten.

       `max-width: 100%` gibt dem Umbruch die fehlende Grenze - drei Kreise je
       Zeile, der vierte rutscht darunter. Bewusst NICHT `min-width: 0` oder
       `flex: 0 1 auto`: genau das war TASK-656, dort trugen die Kreise als
       einziges schrumpffaehiges Element die gesamte Differenz und fielen auf
       Breite 0 zusammen. Eine Obergrenze kappt, sie schrumpft nicht. */
    max-width: 100% !important;
  }
  .mts-pcard__swatch {
    width: 32px !important;
    height: 32px !important;
    /* Bezugsrahmen für die Trefferfläche darunter. */
    position: relative;
  }
  /* NACHTRAG 2026-08-14 – die Trefferfläche jetzt DOCH per ::after, und das ist
     kein Widerruf des Absatzes oben, sondern seine Folge.

     Dort wurde ::after mit 24 px Kreis und 8 px Abstand verworfen: die
     Mittelpunkte lagen 32 px auseinander, eine 44er Fläche hätte den Nachbarn
     um 12 px überlappt. Genau deshalb wuchsen Kreis UND Abstand auf 32/12 –
     und damit liegen die Mittelpunkte 44 px auseinander. Zwei 44er Flächen
     stoßen bei 44 px Abstand exakt aneinander, ohne Überlappung. Die
     Bedingung, die ::after damals ausgeschlossen hat, ist von der damaligen
     Lösung selbst beseitigt worden.

     Gemessen am Livestand, Startseite bei 390 px: 34 Farbkreise mit 32 x 32 px.
     Der Kreis bleibt bei 32 – das Kartenbild hängt an dieser Zahl (die Leiste
     liegt als Overlay im Bild, siehe .mts-pcard__swatches). Nur die Fläche
     wächst, das Aussehen ist unverändert: kein Hintergrund, kein Rand.

     RANDFALL, der bleibt: der ausgewählte Kreis trägt `transform: scale(1.18)`
     und skaliert das ::after mit, auf rund 52 px. Er greift damit etwa 4 px in
     die Fläche der Nachbarn. Das ist die harmlose Richtung – getroffen wird ein
     Kreis, der ohnehin schon aktiv ist, es passiert also nichts. Ein
     Gegenskalieren wäre mehr Mechanik als der Fall wert.

     NUR unterhalb 992 px. Auf dem Desktop stehen 24 px Kreise mit 8 px Abstand
     (Grundregel), dort wäre exakt die alte 12-px-Überlappung zurück. */
  .mts-pcard__swatch::after {
    content: '';
    position: absolute;
    /* 32 + 2 x 6 = 44. Bleibt innerhalb der `overflow-clip-margin: 8px` der
       Leiste – ohne die wäre die Fläche an der Clip-Kante wieder beschnitten. */
    inset: -6px;
    border-radius: 50%;
  }
}

/* --------------------------------------------------------------------------
   PRODUKTKARTE AUF DEM TELEFON: IDENTITAET UEBER PREIS STATT DANEBEN
   (2026-08-08, S3d — gemessen an /hardtails/ bei 390 px, nicht geschaetzt)

   BEFUND, der den Eingriff ausloest. 24 Karten gemessen:
     - .mts-pcard__col-left schrumpft auf 34 px (Karte selbst nur 154 px breit)
     - der Titel ragt bei 18 von 24 Karten links UEBER den Kartenrand, bis 20 px
     - der Titel laeuft bei 24 von 24 Karten in die Preisspalte, bis 23 px

   URSACHE, und warum ein reiner Umbruch nicht reicht. `TASK-435g` hat den Body
   auf `flex-direction: row` gestellt: links die Identitaet, rechts der Preis.
   Die Preisspalte traegt `flex: 0 0 auto` + `white-space: nowrap` und nimmt
   sich damit ihre 57 px KOMPROMISSLOS. Fuer die Identitaet bleiben 53 px. Der
   Titel ist aber rund 79 px breit und zusaetzlich ZENTRIERT (`TASK-435h`), er
   laeuft also symmetrisch nach BEIDEN Seiten heraus - nach links ueber den
   Kartenrand, nach rechts unter den Preis. Ein `overflow-wrap` allein wuerde
   den Titel in eine 53 px schmale Saeule pressen: sechs Zeilen Blocksatzbruch,
   technisch dicht und praktisch unlesbar.

   Bei 154 px Kartenbreite traegt "Identitaet neben Preis" schlicht nicht. Ab
   576 px bleibt das Nebeneinander unveraendert - Desktop und Tablet sind von
   dieser Regel nicht beruehrt.
   -------------------------------------------------------------------------- */
@media (max-width: 575.98px) {
  /* Body stapeln: Identitaet oben, Preisblock darunter */
  .art.mts-pcard .mts-pcard__body {
    flex-direction: column !important;
    align-items: stretch !important;
    gap: 6px !important;
  }
  /* Identitaet ueber die volle Kartenbreite - damit hat der Titel Platz und
     bleibt zentriert, ohne die Karte zu verlassen. */
  .art.mts-pcard .mts-pcard__col-left {
    width: 100% !important;
    flex: 0 0 auto !important;
    min-width: 0 !important;
    max-width: 100% !important;
  }
  /* Der Titel darf seine Spalte nicht mehr ueberschiessen. `anywhere` statt
     `break-word`: CUBE-Modellnamen enthalten Ketten wie "C:68X" ohne Trennstelle,
     an denen `break-word` nicht umbricht und der Ueberhang bliebe. */
  .art.mts-pcard .mts-pcard__col-left .mts-pcard__name,
  .art.mts-pcard .mts-pcard__col-left .mts-pcard__name a,
  .art.mts-pcard .mts-pcard__col-left .mts-pcard__name a span {
    max-width: 100% !important;
    overflow-wrap: anywhere !important;
  }
  /* Preisblock: volle Breite, wieder als EINE Zeile (Rabatt/UVP/Preis/Button),
     rechtsbuendig. `nowrap` faellt weg - es war der Grund fuer die feste
     57-px-Saeule und wird gestapelt nicht mehr gebraucht. */
  .art.mts-pcard .mts-pcard__col-right {
    width: 100% !important;
    flex: 0 0 auto !important;
    flex-direction: row !important;
    flex-wrap: wrap !important;
    align-items: center !important;
    justify-content: flex-end !important;
    align-self: auto !important;
    white-space: normal !important;
    gap: 8px !important;
    margin-top: auto !important;
  }
  .art.mts-pcard .mts-pcard__col-right .mts-pcard__price,
  .art.mts-pcard .mts-pcard__uvp {
    white-space: nowrap !important;
  }
  .art.mts-pcard .mts-pcard__col-right .mts-pcard__buy {
    margin-top: 0 !important;
  }
}

/* --------------------------------------------------------------------------
   PRODUKTKARTE BEI AUSGEKLAPPTEM FILTER (Desktop/Tablet ab 992px):
   IDENTITAET UEBER PREIS STATT DANEBEN, GENAU WIE AUF DEM TELEFON (2026-08-17)
   ----------------------------------------------------------------------------
   BEFUND (gemessen /hardtails-2/, 1440px Fenster, Filter offen, 4 Spalten):
   Karte 225px breit, `.mts-pcard__col-right` (TASK-435g, Preis+Pfeil
   NEBENEINANDER-Modell) reserviert davon fix 63px fuer den Preis - fuer
   `.mts-pcard__col-left` (Marke/Kategorie/Titel/Status) bleiben nur 118px.
   Titel und Status muessen sich dort durchzwaengen, obwohl daneben mit dem
   Preisblock noch 63px unbenutzte Kartenbreite fuer den Titel liegen wuerden
   (User: "der titel sollte die breite der karte besser nutzen koennen").
   Ausserdem stand der Preis bislang NEBEN dem Status (zwei Spalten auf
   gleicher Hoehe) statt darunter (User: "preis unter dem status").

   FIX: exakt dasselbe Muster wie der Telefon-Fix oben (@media max-width:
   575.98px) - nur eben nicht ueber die Fensterbreite ausgeloest, sondern
   ueber den Body-Marker `mts-filter-collapsed`, den das Filter-Toggle-JS
   setzt (siehe :1612ff). Ist der Filter eingeklappt, hat die Karte wieder
   genug Breite fuer das Nebeneinander - dort bleibt TASK-435g unveraendert.
   `min-width: 992px` deckt sich mit dem Breakpoint, ab dem die Sidebar
   ueberhaupt als eigene Spalte existiert (aside.col-lg-3, :1013ff) - darunter
   ist der Filter ohnehin ein Overlay und die Karte laeuft schon durch den
   Telefon/Tablet-Pfad (2-Spalten-Grid, meist breiter als 225px). */
@media (min-width: 992px) {
  body.mts-cat-page:not(.mts-filter-collapsed) .art.mts-pcard .mts-pcard__body {
    flex-direction: column !important;
    align-items: stretch !important;
    gap: 6px !important;
  }
  body.mts-cat-page:not(.mts-filter-collapsed) .art.mts-pcard .mts-pcard__col-left {
    width: 100% !important;
    flex: 0 0 auto !important;
    min-width: 0 !important;
    max-width: 100% !important;
  }
  body.mts-cat-page:not(.mts-filter-collapsed) .art.mts-pcard .mts-pcard__col-left .mts-pcard__name,
  body.mts-cat-page:not(.mts-filter-collapsed) .art.mts-pcard .mts-pcard__col-left .mts-pcard__name a,
  body.mts-cat-page:not(.mts-filter-collapsed) .art.mts-pcard .mts-pcard__col-left .mts-pcard__name a span {
    max-width: 100% !important;
    overflow-wrap: anywhere !important;
  }
  /* Preisblock: volle Breite, direkt unter dem Status. NACHTRAG 2026-08-17
     (User-Korrektur): "nur den Preis zentriert, der Button rechtsbuendig" -
     KEIN gemeinsam zentriertes Preis+Pfeil-Paar (das war der vorherige
     Versuch). Der Preis wird per `position:absolute` aus dem Flow genommen
     und relativ zur vollen Kartenbreite zentriert; der Pfeil bleibt normales
     Flex-Item und behaelt damit seine alte rechtsbuendige Position
     (`justify-content: flex-end`, TASK-435g/h) - beide Positionen sind damit
     unabhaengig voneinander, nicht als ein Block verschoben. */
  body.mts-cat-page:not(.mts-filter-collapsed) .art.mts-pcard .mts-pcard__col-right {
    width: 100% !important;
    flex: 0 0 auto !important;
    flex-direction: row !important;
    flex-wrap: wrap !important;
    align-items: center !important;
    justify-content: flex-end !important;
    align-self: auto !important;
    white-space: normal !important;
    gap: 8px !important;
    margin-top: auto !important;
    position: relative !important;
    /* Mindesthoehe = Pfeilgroesse, damit die absolut zentrierte Preis-Zeile
       (siehe unten) eine Bezugshoehe hat, auch wenn sie selbst aus dem Flow
       genommen ist. */
    min-height: 28px !important;
  }
  body.mts-cat-page:not(.mts-filter-collapsed) .art.mts-pcard .mts-pcard__col-right .mts-pcard__price {
    position: absolute !important;
    left: 50% !important;
    top: 50% !important;
    transform: translate(-50%, -50%) !important;
    white-space: nowrap !important;
  }
  body.mts-cat-page:not(.mts-filter-collapsed) .art.mts-pcard .mts-pcard__uvp {
    white-space: nowrap !important;
  }
  body.mts-cat-page:not(.mts-filter-collapsed) .art.mts-pcard .mts-pcard__col-right .mts-pcard__buy {
    margin-top: 0 !important;
    /* Nutzer-Nachtrag 2026-08-17: war 32px (TASK-435h-Basiswert, global). In
       der schmalen Filter-offen-Karte etwas kleiner. */
    width: 28px !important;
    height: 28px !important;
    font-size: 12px !important;
  }
}

/* ==========================================================================
   ZULETZT ANGESEHEN - gleiche Kartenhöhe, kein Schattenband  (2026-08-08)
   ==========================================================================
   BEFUND, am Bildschirmfoto des Nutzers pixelweise nachgemessen:
   Unter den KURZEN Karten lag ein grauer Streifen, der an der hohen Karte
   abbrach. Gemessen bei y=692: durchgehend Grauwert 246 von x=130 bis x=1370,
   ab x=1410 (die hohe Karte) wieder 255. Senkrecht ein VERLAUF 244 -> 250 ->
   255 über rund 20 Pixel - also ein Schatten und keine Fläche.

   Es war der Kartenschatten selbst: `.artlist .art` trägt in Zeile 461
   `box-shadow: 0 12px 30px rgba(0,0,0,0.06)`. Die Karten stehen nur 8 Pixel
   auseinander (am Foto gemessen), ein 30-Pixel-Weichzeichner überbrückt das
   mühelos - drei Schatten verschmelzen zu einer geschlossenen Fläche. Solange
   alle Karten gleich hoch sind, sieht das wie eine gewollte Kante aus; sobald
   ein Titel dreizeilig wird, endet die Fläche mitten in der Reihe.

   Deshalb ZWEI Eingriffe, beide nur in diesem Block:

   1. GLEICHE HÖHE. `.slick-track` wird zum Flex-Container, die Karten strecken
      sich auf die Höhe der höchsten. Der Textkörper bekommt `flex: 1`, damit
      Preis und Schaltfläche unten stehen bleiben statt in der Mitte zu hängen.
      Bewusst NICHT über `min-height`: genau diese Kaskade wurde in Iteration 17
      entfernt (Kommentar Zeile 3049), weil sie bei jedem Layoutwechsel neu
      geraten werden muss.
   2. KEIN VERSATZ, KEIN WEICHZEICHNER. Der Schlagschatten wird durch einen
      Haarlinien-Ring ersetzt: `0 0 0 1px` hat weder Versatz noch Weichzeichner
      und kann deshalb gar keine Fläche unter der Karte erzeugen. Die Karte
      bleibt trotzdem vom weissen Abschnitt unterscheidbar - ohne den Ring wären
      weisse Karten auf weissem Grund unsichtbar.
      Der Hover-Schatten (Zeile 3067) bleibt unangetastet: der ist eine Antwort
      auf eine Handlung und darf sich abheben.
   ========================================================================== */
.recently-viewed-product-grid .artlist-carousel .slick-track {
  display: flex !important;
  align-items: stretch !important;
}
.recently-viewed-product-grid .artlist-carousel .slick-slide {
  height: auto !important;
}
.recently-viewed-product-grid .artlist-carousel .slick-slide.art {
  display: flex !important;
  flex-direction: column !important;
}
.recently-viewed-product-grid .artlist-carousel .slick-slide .mts-pcard__body {
  flex: 1 1 auto !important;
}
.recently-viewed-product-grid .art {
  box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) !important;
}

/* ==========================================================================
   TASK-719/T5 — ZWEIFARBIGER KREIS, HALBE/HALBE (2026-08-09)
   ==========================================================================
   AUSGANGSLAGE. Ein Farbkreis trägt genau einen Hex (PVAV.Color). Die
   Bidex-Farbnamen sind aber überwiegend zweifarbig ("matt black'n'red").
   Auf Produkt 1608 heißen alle zehn Varianten an erster Stelle "black" -
   zehn optisch identische schwarze Kreise, zwischen denen der Kunde nicht
   wählen kann.

   ZWEI VERWORFENE FASSUNGEN, BEIDE AUS EINEM BELEGTEN GRUND.

   1. Innenring in der Zweitfarbe. Gemessen am Livestand (Kreis 28 px,
      Ring 5 px): der Ring belegte 59 % der Fläche, die Füllung 41 %. Damit
      dominierte die ZWEITfarbe - auf "matt blue'n'black" ein schwarzer Kreis
      mit blauem Punkt, während der Flaschenhalter am Produktfoto ganz blau
      ist und nur der Schriftzug schwarz.

   2. Außenring in der Zweitfarbe. Löste die Flächenfrage (Füllung 100 %),
      scheiterte aber am Auswahl-Zustand: der Auswahl-Rahmen liegt ebenfalls
      außen und ist dunkel, verdeckt den Akzent also genau dann, wenn der
      Kunde die Farbe gewählt hat (Nutzer-Meldung 09.08.). Ein Merkmal, das
      beim Anklicken verschwindet, trägt keine Information.

   ENTSCHEIDUNG DES NUTZERS (09.08.): die Fläche teilt sich hälftig. Beide
   Farben liegen INNEN, der Auswahl-Rahmen kann außen nichts mehr verdecken.

   Abgrenzung zum alten Zweifarb-Verlauf, der 2026-08 abgelehnt wurde: der
   war weich verlaufend und zog seine BEIDEN Farben aus dem Namen - der
   Tokenizer erfand dabei Stops, die der Name nicht hergab. Hier ist die
   erste Hälfte die am Produktbild GEMESSENE Farbe (PVAV.Color), nur die
   zweite kommt aus dem Namen, und die Kante ist hart. Gleiche Optik,
   andere Datenlage.

   ZWEI ENTWURFSENTSCHEIDUNGEN, DIE HIER FESTGESCHRIEBEN SIND.

   1. Genau EINE Stellschraube: `--mts-swatch-split` (der Winkel). Sie gilt
      für alle vier Flächen gleichzeitig - Karte, native Listenreihe,
      PDP-Choice-Box, PDP-Pill. Wer sie hier ändert, ändert sie überall.

   2. Gezeichnet wird mit `background-image`, NICHT mit `background`. Die
      Primärfarbe steht als `background-color` auf dem Element - vom Server
      (PDP-Choice-Box), aus der Karten-JSON oder vom JS. `transparent` in der
      ersten Hälfte lässt sie durchscheinen, statt sie zu ersetzen. Damit
      bleibt die gemessene Farbe die Quelle der Wahrheit, und dieses
      Stylesheet muss sie nirgends kennen.

   Gesetzt wird die Zweitfarbe vom JS (`mtsApplySwatchRing`,
   mts-theme-global.js): `--mts-swatch-ring` plus `data-mts-ring="1"` als
   Marker. Ohne Marker greift keine Regel hier - ist die Zweitfarbe der
   Füllung zu ähnlich (MTS_RING_MIN_DIST), bleibt der Kreis einfarbig.
   ========================================================================== */
:root {
  /* Teilungswinkel. 135deg = diagonal von links oben nach rechts unten, die
     übliche Lesart für Zweiton-Swatches. */
  --mts-swatch-split: 135deg;
}

/* EINE Regel für alle vier Flächen.

   `!important` ist hier nicht Bequemlichkeit: an mehreren Stellen setzt das JS
   die Füllung als Inline-Style. Eine Inline-Kurzschreibweise (`background`)
   würde ein Hintergrundbild aus dem Stylesheet mit abräumen - Autor-!important
   schlägt Inline ohne !important und macht die Regel gegen diese Reihenfolge
   unempfindlich. Die Inline-Setzer sind zusätzlich auf die Langform
   `backgroundColor` umgestellt; der Riegel hier ist der zweite Boden. */
.mts-pcard__swatch[data-mts-ring="1"],
body .art-color-opts .art-color-opt[data-mts-ring="1"],
body .artlist .art .art-color-opt[data-mts-ring="1"],
html body .pd-variants .choice-box .choice-box-element[data-mts-ring="1"],
html body .pd-variants-container .choice-box .choice-box-element[data-mts-ring="1"],
body .mts-variant-pills--swatch .mts-variant-pill[data-mts-ring="1"] {
  background-image: linear-gradient(
    var(--mts-swatch-split, 135deg),
    transparent 0 50%,
    var(--mts-swatch-ring) 50% 100%
  ) !important;
}

/* --------------------------------------------------------------------------
   TASK-719/T5 (C) — DOPPELTE FARBREIHE IN DER LISTENANSICHT

   BEFUND, gemessen und gegengeprüft: in /pedale?v=list sieht der Kunde
   dieselben Farben zweimal untereinander - oben die MTS-Reihe über dem Bild,
   darunter die native Smartstore-Reihe.

   URSACHE: der Riegel `.art.mts-pcard > .art-drop { display:none !important }`
   (weiter oben in dieser Datei). Im Listen-Markup (`artlist-lines`) existiert
   `.art-drop` gar nicht - dort hängt `.art-variant-info` direkt im
   `.art-info-block`. Die Regel greift also strukturell nie. Beleg: /pedale hat
   49 Vorkommen von "art-drop", /pedale?v=list genau eines, und das ist die
   CSS-Regel selbst.

   WARUM NICHT PAUSCHAL. Zwei Gründe, beide belegt:
     - `.art-variant-info` trägt auch `.art-more-opts` ("Weitere Optionen:
       Größe, Farbe"), das für `artlist-lines` weiter oben (:1185-1199)
       bewusst gestylt wird. Ein pauschales Ausblenden nimmt das mit.
     - Ein reiner CSS-Riegel ist fail-closed: rendert die MTS-Reihe einmal
       nicht (kein Bild, keine Farbdaten, JS-Fehler), stünde danach gar kein
       Swatch mehr da.

   ALSO FAIL-OPEN: die Klasse `mts-pcard--has-swatches` setzt das JS erst, wenn
   seine eigene Leiste nachweislich im Dokument hängt und mindestens einen
   Kreis enthält. Keine MTS-Reihe -> keine Klasse -> native Reihe bleibt
   sichtbar. Ausgeblendet wird ausschließlich `.art-color-opts`, nie die
   ganze `.art-variant-info`.
   -------------------------------------------------------------------------- */
.art.mts-pcard--has-swatches .art-variant-info > .art-color-opts,
a.mts-pcard--has-swatches .art-variant-info > .art-color-opts {
  display: none !important;
}

/* ============================================================================
   PDP "PRODUKTDETAILS": ZWEISPALTIG MIT KLEBENDEM BILDSTAPEL
   (TASK-730, 2026-08-11, Iteration 4)
   ----------------------------------------------------------------------------
   AUSGANGSLAGE: Der Tab rendert die Beschreibung als Textblock ueber die volle
   Inhaltsbreite - auf mc gemessen 1410 px bei 1440-px-Fenster, rund 200 Zeichen
   Zeilenlaenge, ohne ein einziges Bild.

   VORBILD ist multicycle.de, am DOM gemessen: zwei gleiche Spalten, rechts die
   Bilder mit `sticky top-[100px]`, `aspect-4/3`, `object-cover`. Jedes Bild
   bleibt beim Scrollen an derselben Stelle stehen, das naechste schiebt sich
   darueber - die Bilder ueberlagern sich also, statt aneinander vorbeizulaufen.

   DREI FOLGERUNGEN, DIE ZUSAMMENGEHOEREN:
     1. Alle Bilder brauchen DASSELBE Format. Ein Hochformat im Stapel deckt
        das darunterliegende nicht sauber ab und zerreisst den Effekt. Deshalb
        ausschliesslich Querformat 4:3 (auch so gewuenscht).
     2. Die Strecke darf nicht laenger werden als die Textspalte, sonst steht
        links weisse Flaeche. Die Bildzahl wird deshalb im JS aus der Texthoehe
        gerechnet - bei gleich hohen Bildern ist das eine Division, kein
        iteratives Messen (das war der Fehler der Vorversion).
     3. `align-items: start` bleibt: bei `stretch` waere die gemessene
        Texthoehe die gestreckte Zeilenhoehe und damit von der Bildzahl
        abhaengig - eine Rueckkopplung, die nie zur Ruhe kaeme.

   REIHENFOLGE IN DER LINKEN SPALTE (vom Nutzer vorgegeben):
     KPI-Kacheln, dann Beschreibung, dann Merkmale.

   FAIL-SAFE: alles haengt an .mts-pdd, einer Klasse, die nur das JS setzt und
   nur dann, wenn Bilder fuer dieses Produkt existieren.
   -------------------------------------------------------------------------- */
.mts-pdd {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: clamp(20px, 2.6vw, 48px);
  align-items: start;
}

.mts-pdd__text,
.mts-pdd__media { min-width: 0; }

.mts-pdd__text {
  display: flex;
  flex-direction: column;
  gap: clamp(20px, 2vw, 34px);
}

/* Die Kappung auf 260 px ("Mehr anzeigen") stammt aus der einspaltigen Ansicht
   und erzeugt neben einer langen Bildstrecke eine halbleere Textspalte. Der
   Inline-Style des Smartstore-JS steht am Element selbst - ohne !important
   gewinnt er (vgl. feedback_css_kaskade_drei_fallen). */
.mts-pdd .more-less.collapsed { max-height: none !important; }
.mts-pdd .btn-text-expander { display: none !important; }

/* KPI-Kacheln in der halben Spalte: vier Spalten waeren je ~160 px breit und
   brechen die Werte auf fuenf Zeilen - deshalb zwei. */
.mts-pdd .bidex-spec-strip {
  grid-template-columns: repeat(2, 1fr) !important;
  margin: 0 !important;
}
.mts-pdd .bidex-product-accordion { margin: 0 !important; }

/* Der Reiter "Merkmale" zeigt jetzt einen leeren Tab - sein Inhalt steht links.
   Die Klasse setzt das JS, damit ohne JS nichts verschwindet. */
.mts-tab-hidden { display: none !important; }

/* --- Bildstapel ----------------------------------------------------------- */
.mts-pdd__media {
  display: flex;
  flex-direction: column;
  gap: clamp(12px, 1.2vw, 16px);
}

.mts-pdd__media img {
  position: sticky;
  top: 100px;                    /* wie im Vorbild - unter der Kopfzeile */
  display: block;
  width: 100%;
  aspect-ratio: 4 / 3;
  height: auto;
  object-fit: cover;
  border-radius: 14px;
  background: #f2f2f2;
  opacity: 0;
  transition: opacity .6s ease;
}
.mts-pdd__media img.is-in { opacity: 1; }

/* KEIN transform auf diesen Bildern: es erzeugt einen eigenen Bezugsrahmen und
   kann `position: sticky` aushebeln. Eingeblendet wird nur ueber die Deckkraft. */

/* Unter 992 px ist eine halbe Spalte zum Lesen zu schmal: einspaltig, die
   Strecke unter den Text, ohne Kleben (dort gibt es keine Nebenspalte, an der
   sie sich orientieren koennte). */
@media (max-width: 991.98px) {
  .mts-pdd { grid-template-columns: 1fr; gap: 24px; }
  .mts-pdd__media img { position: static; }
}

@media (prefers-reduced-motion: reduce) {
  .mts-pdd__media img { transition: none; opacity: 1; }
}

/* ----------------------------------------------------------------------------
   DAMIT DER BILDSTAPEL UEBERHAUPT KLEBEN KANN (TASK-730, 2026-08-11)

   `position: sticky` orientiert sich am naechsten Vorfahren, der einen
   Scrollport aufmacht. Auf dieser Storefront tragen `body` UND
   `#content-wrapper` ein `overflow-x: hidden` (gemessen: `overflow: hidden auto`)
   - und schon eine einzige Achse auf `hidden` genuegt, um genau das zu tun.
   Die Bilder klebten deshalb an einem Container, der selbst gar nicht scrollt:
   sie liefen einfach mit (gemessen, Bildkante wanderte auf -448, -995, -1543 px,
   statt bei 100 px stehenzubleiben).

   `clip` schneidet optisch identisch ab, macht aber KEINEN Scrollport auf.
   Gegenprobe an derselben Seite: die Bilder kleben nacheinander bei 100 px
   (1, dann 2, dann 3, dann 4 gleichzeitig) und der horizontale Ueberlauf bleibt
   aus. Kennt ein Browser `clip` nicht, bleibt der bisherige Wert `hidden`
   stehen - dann klebt der Stapel nicht, und sonst passiert nichts.

   Bewusst nur auf der Produktseite (body.mts-pdp), nicht global.
   -------------------------------------------------------------------------- */
body.mts-pdp,
body.mts-pdp #content-wrapper {
  overflow-x: clip;
}

/* ----------------------------------------------------------------------------
   DIESELBE FALLE AUF STARTSEITE UND KATEGORIESEITE (TASK-811, 2026-08-16)

   Der Kommentar oben beschreibt die Falle nur fuer die Produktseite, sie gilt
   aber fuer JEDE Seite: `body` UND `#content-wrapper` tragen im Kern-Theme
   `overflow-x:hidden` OHNE `overflow-y` - nach CSS-Spec wird `overflow-y` damit
   auf `auto` gerechnet, der Container wird zum eigenen (Mini-)Scrollcontainer.

   Live an der Vendor-`theme.css` bestaetigt: `body{overflow-x:hidden}`,
   `#content-wrapper{min-height:300px;overflow-x:hidden}`. Auf mc.movetoshop.com
   gemessen (390x844): `#content-wrapper` overflow-y=auto, 0-5 px Eigenlauf
   (schwankend mit dem Ladezustand) ueber rund 79 % der Bildschirmflaeche -
   auf Startseite UND Kategorieseite, auf der Produktseite dank der Regel oben
   nicht.

   `clip` schneidet wie `hidden` optisch ab, macht aber KEINEN Scrollport auf
   (bereits fuer die Produktseite nachgewiesen). Bewusst NICHT global auf
   `body`/`#content-wrapper` gesetzt (kleinerer Radius als die Variante oben),
   sondern nur fuer die beiden gemeldeten Seiten. `#page` bleibt unberuehrt -
   der Kern kennt dafuer bereits die Ausstiegsklasse `.content-overflow-initial`,
   die hier bewusst NICHT gesetzt wird (sie deckt `body` selbst nicht ab). */
body.home,
body.home #content-wrapper,
body.mts-cat-page,
body.mts-cat-page #content-wrapper {
  overflow-x: clip;
}

/* === Reiterbeschriftung "Produktdetails" an die linke Spalte ==============
   Nutzerwunsch 2026-08-11: das Wort soll nicht mittig ueber beiden Spalten
   schweben, sondern links stehen - gegenueber dem Beschreibungsbild.

   Ausgangslage, am Livestand gemessen (CSS-Pixel, Zoom 1,1 herausgerechnet):
   Pille x=679,2 y=109,5 - also mittig und 66 px ueber der Bildstrecke, die
   bei x=785,5 y=175,9 beginnt. Die Textspalte startet bei x=15.

   ZWEI EINGRIFFE, beide noetig:
     1. Die Pille waagerecht auf die Mitte der TEXTSPALTE schieben. Erst war
        sie linksbuendig - der Nutzer wollte sie zentriert, aber weiterhin
        neben dem Bild. Ueber die ganze Seite zentriert ginge nicht: die
        Seitenmitte liegt bei ~763 px, die Bildspalte beginnt bei 785,5, die
        Pille haengte also in sie hinein.
     2. Die Bildstrecke um die Leistenhoehe anheben, damit ihre Oberkante mit
        der Pille fluchtet. Der Betrag kommt gemessen aus dem JS
        (`--mts-pdd-reiter`, siehe fluchteReiter); der Vorgabewert 0 laesst das
        Layout unveraendert, falls das JS nicht laeuft.

   NUR ZWEISPALTIG. Unter 992 px steht die Strecke unter dem Text - dort gibt
   es kein Gegenueber, und ein negativer Rand wuerde die Bilder in den Text
   schieben. Derselbe Umbruchpunkt wie beim Raster darueber. */
#pd-tabs > .nav-tabs {
  /* Die Zentrierung des Themes BLEIBT - der Nutzer will die Pille mittig, nur
     eben mittig ueber der Textspalte statt ueber der ganzen Seite. Der Schub
     dorthin kommt gemessen aus dem JS (--mts-pdd-reiter-x, siehe
     fluchteReiter); ohne JS steht sie wie bisher in der Seitenmitte.

     `transform` und nicht `margin`: ein Rand verschiebt bei einem zentrierten
     Flex-Container auch dessen Mitte, der Schub waere also nur zur Haelfte
     wirksam und muesste verdoppelt werden - eine Rechnung, die niemand am
     Ergebnis nachvollziehen kann. Die Leiste enthaelt nichts Klebendes, das
     ein neuer Bezugsrahmen stoeren koennte. */
  transform: translateX(var(--mts-pdd-reiter-x, 0px));
}

@media (min-width: 992px) {
  html[data-mts-pdd] .mts-pdd__media {
    margin-top: calc(-1 * var(--mts-pdd-reiter, 0px));
  }
}

/* =======================================================================
   TASK-697 AC#9 - Textkontrast (2026-08-13, Spur C)
   =======================================================================

   GEMESSEN, NICHT GESCHAETZT. Auf der Startseite von mc.movetoshop.com wurden
   191 Textelemente gegen WCAG 1.4.3 gerechnet (Relativluminanz, Hintergrund
   ueber die Vorfahrenkette aufgeloest, bildhinterlegte Flaechen ausgelassen):
   55 Verstoesse aus 11 Ursachen. Zwei davon sind oben an ihrer Fundstelle
   behoben (.mts-pcard__cat hier in dieser Datei, .mts-cb-foot in chatbot.css).
   Die restlichen liegen NICHT in einer Datei, die wir ausrollen - sie stehen
   im HeadMarkUp des Story-CodeBlocks 153 in der Datenbank, ausgeliefert als
   `<style>` im Kopf der Startseite. Dort steht:

       .mts-store { --mts-accent: #5f8175; --mts-text-muted: #86868b; ... }

   WARUM DIE KORREKTUR TROTZDEM HIER STEHT UND NICHT DORT.
   Block 153 traegt rund 48.700 Zeichen HeadMarkUp und sieht im Editor aus wie
   ein leerer Kasten - am 09.08. wurde er genau deshalb schon einmal geloescht,
   danach waren zwoelf Klassen ungestylt und am Seitenanfang war NICHTS davon
   zu sehen. Eine Zwei-Werte-Korrektur ist diesen Weg nicht wert, solange sie
   sich aus einer ausgerollten Datei erledigen laesst. Spezifitaet macht das
   moeglich: `.mts-store .x` (0,2,0) schlaegt `.x` (0,1,0) unabhaengig von der
   Reihenfolge, und `html .mts-store` (0,1,1) schlaegt `.mts-store` (0,1,0).

   WARUM `--mts-accent` NICHT GLOBAL DUNKLER WIRD.
   101 Regeln lesen die Variable, die meisten dekorativ (Raender, Schatten,
   Flaechen ohne Text). Fuer die gilt die 3:1-Grenze aus WCAG 1.4.11, und
   #5f8175 erfuellt sie mit 4,30:1. Nur dort, wo TEXT auf oder in der Farbe
   steht, greift 4,5:1 - und nur diese Stellen werden umgehaengt. Ein globaler
   Wechsel waere eine Designaenderung, keine Kontraktkorrektur.

   WARUM MARKEN-GESCOPT.
   Diese Datei liegt auf BEIDEN Instanzen. `#4d6b60` ist der abgedunkelte
   Multicycle-Gruenton (er steht im Theme bereits als --mts-c-primary-dark und
   als --b365-accent-text mit #4f6b60). Auf einer Instanz mit anderer Marke
   waere er falsch. `<html>` traegt auf mc nachweislich
   data-mts-brand="multicycle" - daran haengt der Block.

   Kontraste gerechnet (auf bzw. gegen Weiss):
       #86868b  3,62:1   ->  #6e6e73  5,07:1
       #b0b6bd  2,04:1   ->  #6e6e73  5,07:1
       #5f8175  4,30:1   ->  #4d6b60  5,85:1
       #7d9c92  3,01:1   ->  #445e54  7,53:1   (Hover, war heller als der Grundzustand)

   NICHT ANGEFASST: die Ankuendigungsleiste (#6d8c80, 3,68:1). Das ist eine
   ausdrueckliche Nutzerentscheidung vom 07.08. und bleibt so.
   ===================================================================== */

/* Die gedaempfte Textfarbe der Story auf den Wert dieser Datei ziehen. */
html .mts-store { --mts-text-muted: #6e6e73; }

/* =====================================================================
   DIE STORY FUHR EINE ANDERE SCHRIFT ALS DER REST DES SHOPS (2026-08-15)
   =====================================================================
   Derselbe Story-Block, der weiter unten den Akzent neu setzt, setzt auf
   `.mts-store` auch die Schrift:

       .mts-store { --mts-font: 'Inter', …; --mts-font-display: 'Inter', …;
                    font-family: var(--mts-font); }

   Gemessen auf der ausgelieferten Startseite: Ankündigungsleiste,
   Chatbot und Vergleichsleiste liefen auf din-2014, die Story-Knoepfe,
   der Bike3D-Aufruf und die Überschriften auf Inter. Zwei Schriften auf
   einer Seite, ohne dass es jemand entschieden hätte.

   Wieder Vererbung, nicht Spezifität - `--mts-font` sitzt auf
   `.mts-store` und damit naeher an den Nachfahren als jedes `:root`.
   Gegenzug auf derselben Ebene: `html .mts-store` (0,1,1) gegen
   `.mts-store` (0,1,0). Bewusst NICHT marken-gescopt und bewusst KEIN
   fester Schriftstapel - `inherit` nimmt den Wert des Elternelements,
   also die Schrift, die das Theme der jeweiligen Instanz auf <html>
   gesetzt hat. Damit trägt die Regel jede Marke, ohne einen Namen zu
   kennen.

   >>> NACHWEIS, DASS DIN ÜBERHAUPT ANKOMMT <<<
   Der Kopf von custom-themes/Multicycle/wwwroot/_bike365-tokens.scss hält
   fest, das Adobe-Fonts-Kit sei "auf der Kundendomain noch nicht
   freigeschaltet". Das ist für mc.movetoshop.com überholt, am Glyphen
   nachgemessen (2026-08-15, 64 px / 600):

       "din-2014", serif      1075,27 px      serif      1175,84 px
       "din-2014", monospace  1075,27 px      monospace  1233,00 px

   Zwei verschiedene Anker, derselbe Wert mit Kandidat - die Schrift
   rendert also wirklich. `document.fonts.check()` allein ist dafuer KEIN
   Beleg; es meldete auch dann `true`, wenn das Stylesheet nur halb
   geladen war.

   >>> WAS BEIM DOMAINWECHSEL PASSIERT - BITTE VOR DEM CUTOVER PRUEFEN <<<
   Das Kit ist DOMAINGEBUNDEN. Die Freigabe gilt für mc.movetoshop.com;
   für multicycle.at und bike365.at muss sie getrennt erteilt werden.
   Faellt sie aus, fällt NICHT nur die Story zurück, sondern der ganze
   Shop - diese Regel macht die Story nur ehrlich mitleidend statt
   heimlich anders. Der Rückfall ist ausserdem schlechter als der
   Schriftstapel vermuten lässt: von "DIN Next LT Pro", "DIN Pro",
   "DIN Alternate", "Roboto Condensed" und "Archivo Narrow" rendert am
   Messrechner KEINE einzige; auf einem unveränderten Windows-Geraet
   landet man damit bei Arial. Vor dem Domainwechsel also dieselbe
   Glyphen-Messung wiederholen, nicht die Kit-Konfiguration ansehen.
   ===================================================================== */
html .mts-store,
html .mts-page {
  --mts-font:         inherit;
  --mts-font-display: inherit;
}

/* =====================================================================
   DIE STORY SETZT DEN AKZENT SELBST - UND GEWINNT DAMIT (2026-08-15)
   =====================================================================
   Nach der Umstellung auf den Bike365-Ton stand die Startseite trotzdem
   noch im alten Gruen. Am Livestand gemessen, nicht gefolgert:

       <html>       --mts-accent = #6d8c80   (richtig)
       .mts-store   --mts-accent = #5f8175   (alt, 11 Elemente)
       .mts-btn--primary        rgb(95,129,117)
       .mts-bike3d__info-cta    rgb(95,129,117)

   Die Ursache ist NICHT Spezifität. Der Story-Block (PageBuilder-Story
   MtsHomePageCode, ausgeliefert als <style> im Kopf) setzt
   `.mts-store { --mts-accent:#5f8175; --mts-accent-hover:#7d9c92; }`.
   Bei Custom Properties gewinnt der NAEHERE VORFAHRE, nicht die
   spezifischere Regel - Spezifität entscheidet nur zwischen Regeln auf
   DEMSELBEN Element. Ein Block auf <html> kann daher nie durchgreifen,
   egal wie spezifisch er ist.

   Deshalb hier, auf derselben Ebene: `[data-mts-brand] .mts-store` ist
   (0,2,0) gegen `.mts-store` (0,1,0) und schlaegt den Story-Block auf
   genau dem Element, auf dem er sitzt.

   WARUM NICHT DIE STORY REPARIEREN. Derselbe Grund wie im Abschnitt
   darüber: der Träger ist ein CodeBlock mit rund 48.700 Zeichen, der im
   Editor wie ein leerer Kasten aussieht und am 09.08. genau deshalb schon
   einmal gelöscht wurde. Eine Handvoll Tokens ist diesen Weg nicht wert,
   solange Spezifität es aus einer ausgerollten Datei erledigt.

   Nebenbefund, der mitkorrigiert wird: die Story fuehrt als
   `--mts-accent-hover` den Wert #7d9c92 - HELLER als ihr eigener
   Grundzustand. Ein Hover, der aufhellt statt abzudunkeln, war schon vor
   dieser Runde falsch.
   ===================================================================== */
[data-mts-brand="multicycle"] .mts-store,
[data-mts-brand="multicycle"] .mts-page {
  --mts-accent:       var(--mts-c-primary);
  --mts-accent-2:     var(--mts-c-primary-soft);
  --mts-accent-hover: var(--mts-c-primary-hover);
  /* Textsicherer Marken-Ton - nur dort verwendet, wo Text im Spiel ist. */
  --mts-accent-text:  #4d6b60;
}

/* Akzent ALS Text (13 px, 600) - braucht 4,5:1. */
/* Ersatzwert entfällt: der Selektor liegt innerhalb von .mts-store, wo die
   Regel zwei Zeilen darüber --mts-accent-text ohnehin setzt. */
[data-mts-brand="multicycle"] .mts-store .mts-shead__eyebrow,
[data-mts-brand="multicycle"] .mts-store .g-tagline.mts-shead__eyebrow {
  color: var(--mts-accent-text);
}

/* =====================================================================
   NACHTRAG 2026-08-15 - FLAECHE UND TEXT TRENNEN SICH HIER

   Der Abschnitt darueber hat am 13.08. BEIDES auf #4d6b60 gezogen: die
   Marke als Text (richtig, bleibt) UND die gefuellten Knoepfe (ab jetzt
   falsch). Sichtbare Folge auf mc.movetoshop.com, vom Nutzer gemeldet und
   von mir am Livestand nachgemessen: der SmartFit-Knopf stand auf #4d6b60,
   der Kaufknopf daneben auf #5f8175, die Ankuendigungsleiste darueber auf
   #6d8c80 - drei Gruentoene auf einer Seite.

   Nutzer-Entscheidung vom 15.08.: alle FLAECHEN auf den Bike365-Markenton.
   Der traegt jetzt --mts-accent (Quelle: storefront.css, Brand-Block -
   dort steht die vollstaendige Begruendung samt Kontrast-Preis). Diese
   Regeln nennen deshalb keinen Zahlenwert mehr; sie hingen genau daran,
   dass sie einen nannten.

   Was NICHT zurueckgenommen wird: --mts-accent-text (#4d6b60, 5,85:1) fuer
   die Marke ALS TEXT auf Weiss - siehe die Regel darueber. Wer diese
   Trennung wieder einebnet, holt sich einen der beiden Fehler zurueck:
   entweder drei Toene oder unlesbare 13-px-Zeilen.
   ===================================================================== */

/* Gefuellte Marken-Knoepfe: Flaeche, kein Text -> --mts-accent.
   (Stand bis 14.08.: var(--mts-accent-text) - ein Textton als Flaeche.) */
[data-mts-brand="multicycle"] .mts-store .mts-btn--primary,
[data-mts-brand="multicycle"] .mts-store .mts-bike3d__info-cta {
  background: var(--mts-accent);
}
[data-mts-brand="multicycle"] .mts-store .mts-btn--primary:hover,
[data-mts-brand="multicycle"] .mts-store .mts-bike3d__info-cta:hover {
  background: var(--mts-accent-hover);
}

/* Vergleichsleiste und SmartFit-Knopf liegen ausserhalb von .mts-store.
   Der Grundzustand steht schon auf var(--mts-accent) - .mts-sf-btn in
   smartfit.css, .mts-compare-bar__btn--open weiter oben in dieser Datei.
   Hier bleibt deshalb nur noch der Hover uebrig; die frueheren
   background-Zeilen mit hartem #4d6b60 sind ersatzlos entfallen, weil sie
   genau die Regel ueberschrieben haben, die das Richtige tat. */
[data-mts-brand="multicycle"] .mts-compare-bar__btn--open:hover,
[data-mts-brand="multicycle"] .mts-sf-btn:hover {
  background: var(--mts-accent-hover);
}

/* =======================================================================
   LESBARKEIT UND LAYOUTRUHE DER PRODUKTKARTE (2026-08-14)
   =======================================================================
   Zwei Befunde von der Startseite mc.movetoshop.com, beide am ausgelieferten
   Stand gemessen. Repo und Livestand waren zum Messzeitpunkt byte-identisch
   (mts-theme-global.css md5 04d3da3d86f4…, zugleich der Cache-Buster der
   Asset-Adresse) – die Zeilennummern unten stimmen also mit dem, was der
   Browser bekommt.
   ======================================================================= */

/* -----------------------------------------------------------------------
   (1) KATEGORIEZEILE UNTER DER LESBARKEITSGRENZE

   BEFUND: `.mts-pcard__cat` rendert auf der Startseite bei 390 px mit 11 px
   Großbuchstaben und `letter-spacing: .1em` – 18 Textknoten unter 12 px, der
   einzige solche Fall auf der Seite.

   WOHER DIE 11 PX AUF DER STARTSEITE WIRKLICH KOMMEN. Nicht aus der Regel
   weiter oben in dieser Datei: die lautet `.art.mts-pcard .mts-pcard__cat`
   und braucht die Klasse `mts-pcard` an der Kartenwurzel, die dort erst das
   JS setzt. Maßgeblich ist im Rohzustand der <style>-Block der Story
   (CodeBlock 153, ausgeliefert im Kopf der Startseite):

       .mts-pcard__cat { font-size:11px; ... letter-spacing:0.1em; ... }

   Spezifität (0,1,0), ohne !important. Deshalb steht hier BEIDES im
   Selektor – der nackte Klassenname für die Startseite, die verschachtelte
   Variante für die Listing-Karten, deren Regel oben (0,3,0) sonst gewinnt.
   Warum die Korrektur nicht im Block 153 selbst passiert, steht ausführlich
   im TASK-697-Abschnitt darüber: 48.700 Zeichen HeadMarkUp, die im Editor
   wie ein leerer Kasten aussehen, und ein Löschvorfall am 09.08.

   ZUR BREITE – hier weicht der Kommentar bewusst von der Auftragsannahme ab.
   Die Behauptung war, der geringere Sperrsatz gebe die gewonnene Breite
   vollständig zurück. Das stimmt nicht ganz, und die Grenze lässt sich
   ausrechnen: Gleichstand herrscht bei 11 x (k + 0,1) = 12 x (k + 0,06), also
   bei einem mittleren Vorschub k = 0,38 em. Inter-Großbuchstaben liegen
   deutlich darüber (rund 0,66 em), damit bleibt ein Zuwachs von etwa 3 %.
   Bei den vorkommenden Werten – ein bis zwei Wörter in einer rund 275 px
   breiten Kartenspalte – ist das folgenlos, aber es ist NICHT null. Wer nach
   dem Deploy einen Umbruch in dieser Zeile sieht, hat hier die Ursache.
   ----------------------------------------------------------------------- */
@media (max-width: 991.98px) {
  .mts-pcard__cat,
  .art.mts-pcard .mts-pcard__cat {
    font-size: 12px !important;
    letter-spacing: .06em !important;
  }
}

/* -----------------------------------------------------------------------
   (2) LAYOUTSPRUNG DER PRODUKTKARTEN AUF DER STARTSEITE

   AUSGANGSWERT: CLS 0,0225 (drei Läufe unter Fast-3G mit vierfacher
   CPU-Drossel, identischer Wert), davon 0,02163 aus dem ersten Produktband.
   Das ist unter der 0,1-Schwelle, es besteht kein Handlungsdruck – der
   Eingriff ist billig, nicht dringend.

   WARUM DER NAHELIEGENDE FIX NICHTS TUT. Der Vorschlag lautete, dem
   `figure.art-picture-block.mts-pcard__media` ein `aspect-ratio: 1` zu geben.
   Das ist ein No-op, aus zwei sich ergänzenden Gründen:
     - Der Wert steht dort bereits, mit !important
       (`.art.mts-pcard .art-picture-block.mts-pcard__media`, weiter oben).
     - Im ausgelieferten HTML trägt das figure die Klasse `mts-pcard__media`
       gar nicht. Nachgezählt auf der Startseite: 18 x
       `<figure class="art-picture-block">`, 18 x `<div class="art">` – beide
       Klassen setzt erst `enhancePcard` (mts-theme-global.js).

   DIE ECHTE URSACHE ist genau dieser Klassenwechsel. Vorher greift die
   globale Regel `.art .art-picture-block { aspect-ratio: 4/3 !important }`,
   nachher die pcard-Regel mit 1/1. Bei rund 300 px Kartenbreite wächst die
   Bildfläche damit von 225 auf 300 px – 75 px je Karte, nachträglich, ohne
   FOUC-Kaschierung (die gilt nur für `body.mts-cat-page`).

   DER FIX ZIEHT DEN ENDWERT VOR, statt einen neuen einzuführen. Damit ist
   der Sprung beseitigt und nicht bloß verschoben – die bekannte Falle, dass
   ein CLS-Fix die Zahl erhöht, weil er die Verschiebung nur einer anderen
   Gruppe zuschlägt, kann hier nicht greifen: Vor- und Nachwert sind beide
   1/1, es gibt keinen zweiten Zeitpunkt mehr.

   ENG GESCOPT auf die Startseite, weil nur dort gemessen wurde. Die
   Kategorieseiten haben denselben Sprung (5/4 -> 1/1), aber dort kaschiert die
   FOUC-Regel die Karte bis zur Konvertierung; das ist ein eigener Fall und
   wird hier nicht mitangefasst. Der Selektor deckt die gemessene Fläche
   vollständig ab: alle 18 Bildkästen der Startseite liegen in den beiden
   `g-block-productlist`-Blöcken, keiner bleibt außen vor.

   FAIL-SAFE: läuft das JS nicht, bleiben die Bilder quadratisch statt 4:3.
   Unkritisch – die Katalogbilder kommen als 600x600 bzw. 800x800 und werden
   ohnehin `object-fit: contain` dargestellt; es ändert sich nur die Höhe des
   weißen Rahmens, in die Richtung, die das JS ansteuert.

   NACHMESSEN NACH DEM DEPLOY. 0,0225 ist der AUSGANGSWERT, keine Zielmarke.
   Der Wert muss unter denselben Bedingungen neu erhoben werden (Fast-3G,
   4x CPU, mehrere Läufe), sonst ist die Verbesserung nicht belegt.
   ----------------------------------------------------------------------- */
body.home .g-block-productlist .artlist .art > figure.art-picture-block {
  aspect-ratio: 1 / 1 !important;
}

/* ============================================================================
   TASK-838 (22.08.2026) — KATEGORIE-HERO AUS DEM SERVER
   ============================================================================
   Bis hierher hat initCategoryHero() den Hero nach dem Laden ins DOM gehängt.
   Der PageBuilder-Block "mtscategoryhero" liefert ihn jetzt fertig im HTML aus.

   Warum diese Regeln nicht einfach die vorhandenen mitbenutzen: das gesamte
   bisherige Hero-CSS hängt an `body.mts-cat-page` — einer Klasse, die ERST das
   JavaScript setzt. Für alles, was ab dem ersten Bildaufbau stimmen soll, ist
   sie damit unbrauchbar. Die Werte hier sind deshalb keine neuen Entwürfe,
   sondern die am 21./22.08. auf /e-bikes/ GEMESSENEN Endwerte des Livestands:
   340 px hoch, 76/32 Innenabstand, 28 px Abstand nach unten, Bild mit
   brightness(0.78) saturate(1.05), Verlauf 0,55 / 0,30 / 0,55.

   Der Hero trägt eine zweite Klasse (--server). Damit bleiben die alten Regeln
   fuer die JavaScript-Fassung unangetastet, die auf anderen Instanzen und auf
   Markenseiten weiterläuft.
   ========================================================================== */

/* Die Bühne selbst bringt keine eigene Höhe mit: bleibt der Hero aus (jede
   Seite, die keine Kategorie ist), darf hier kein Loch stehenbleiben. */
.mts-cat-hero-stage,
.mts-cat-hero-stage > .g-story,
.mts-cat-hero-stage .g-block-mtscategoryhero,
.mts-cat-hero-stage .g-block-mtscategoryhero > .g-block-inner {
  margin: 0 !important;
  padding: 0 !important;
}

.mts-cat-hero-banner--server {
  position: relative;
  box-sizing: border-box;
  /* Die Bühne hängt in content_before, also außerhalb des Inhaltscontainers:
     100% sind hier bereits die volle Fensterbreite. Die Regel aus dem
     Startseiten-Stylesheet (width:100vw + margin-left:calc(50% - 50vw)) wuerde
     bei sichtbarer Bildlaufleiste um deren Breite überstehen — deshalb hier
     ausdrücklich zurückgesetzt. */
  width: 100% !important;
  max-width: 100% !important;
  margin: 0 0 28px !important;
  padding: 76px 32px !important;
  min-height: 340px !important;
  border-radius: 0 !important;
  overflow: hidden !important;
  isolation: isolate;
  background: #1d1d1f;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  text-align: center;
}
/* Die Bildebene der JavaScript-Fassung (::before mit --mts-hero-bg) bleibt hier
   leer — das Bild ist ein echtes <img>, damit der Browser es schon beim Zerlegen
   des HTML anfordert. Als Hintergrundbild startete der Abruf erst nach 560 ms. */
.mts-cat-hero-banner--server::before { content: none !important; }
.mts-cat-hero-banner--server .mts-cat-hero-bgimg {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center center;
  filter: brightness(0.78) saturate(1.05);
  z-index: -2;
  pointer-events: none;
  user-select: none;
}
/* Der Verlauf braucht !important, und das ist kein Reflex: die alte Regel
   `body.mts-cat-page .mts-cat-hero-banner::after` hat mit 0,2,1 die höhere
   Spezifität, und ihr Verlauf ist der SCHWÄCHERE (0,42 / 0,18 / 0,42). Die
   stärkere Fassung stand bisher unter `body.mts-hero-lifestyle` - diese Klasse
   setzt pickHeroImage() im JavaScript, das hier nicht mehr läuft. Ohne diese
   Zeile wäre der Hero sichtbar heller als vorher (gemessen 22.08.). */
.mts-cat-hero-banner--server::after {
  content: '';
  position: absolute;
  inset: 0;
  background: linear-gradient(135deg, rgba(0,0,0,0.55) 0%, rgba(0,0,0,0.30) 60%, rgba(0,0,0,0.55) 100%) !important;
  z-index: -1;
}
.mts-cat-hero-banner--server > h1,
.mts-cat-hero-banner--server > h1.h3 {
  display: block !important;
  color: #ffffff !important;
  font-size: clamp(1.75rem, 4vw, 3rem) !important;
  font-weight: 800 !important;
  letter-spacing: -0.025em !important;
  line-height: 1.1 !important;
  margin: 0 0 8px !important;
  text-shadow: 0 2px 12px rgba(0,0,0,0.35);
}
.mts-cat-hero-banner--server .mts-cat-tagline {
  color: rgba(255,255,255,0.92) !important;
  font-size: clamp(0.95rem, 1.4vw, 1.2rem) !important;
  margin: 0 auto !important;
  font-weight: 500;
  text-shadow: 0 1px 8px rgba(0,0,0,0.4);
  max-width: 640px;
}
body .mts-cat-hero-banner.mts-cat-hero-banner--server .mts-cat-hero-rule {
  /* `display: block` allein reicht hier NICHT. Ein Topic im ausgelieferten HTML
     traegt `body .mts-cat-hero-banner h1.h3, ... { display: none !important }` -
     eine Regel aus der Markenseiten-Anpassung, die auch den Farbstrich trifft.
     Gemessen am 22.08.: der Strich stand im HTML, war aber `display: none`,
     während die Überschrift sichtbar blieb (die hatte hier schon !important). */
  display: block !important;
  background: var(--mts-accent, #6d8c80) !important;
  margin: 16px auto 0 !important;
  width: 48px !important;
  height: 3px !important;
  opacity: 1;
  box-shadow: 0 1px 6px rgba(var(--mts-c-primary-rgb), 0.5);
}
/* Der Inhaltsbereich schliesst direkt an den Hero an — der Abstand steckt im
   margin-bottom des Heros, so wie vorher auch. */
.mts-cat-hero-stage + section#content,
.mts-cat-hero-stage + section.container#content {
  padding-top: 0 !important;
  margin-top: 0 !important;
}
@media (max-width: 700px) {
  .mts-cat-hero-banner--server {
    margin: 0 0 20px !important;
    padding: 56px 22px !important;
    min-height: 240px !important;
  }
  .mts-cat-hero-banner--server > h1,
  .mts-cat-hero-banner--server > h1.h3 { font-size: 1.6rem !important; }
  .mts-cat-hero-banner--server .mts-cat-tagline { font-size: 0.95rem !important; }
  body .mts-cat-hero-banner.mts-cat-hero-banner--server .mts-cat-hero-rule {
    margin-top: 12px !important;
    width: 38px !important;
  }
}


/* ===================================================================== *
 * Megamenü im Zuschnitt von dede-lemgo.de  (TASK-847)
 * ---------------------------------------------------------------------
 * ZIEL
 *   Die aufgeklappte Fläche soll aussehen wie auf dede-lemgo.de: randlos
 *   über die volle Fensterbreite, flach (kein Kartenrand, keine Ecken,
 *   kein Schlagschatten ringsum), Inhalt in einem Raster aus sechs
 *   gleich breiten Spalten, kräftige Überschrift je Warengruppe und
 *   ruhige Unterpunkte darunter.
 *
 * WAS HIER NICHT PASSIERT
 *   Kein Eingriff in Smartstore.MegaMenu. Die Klappflächen werden weiter
 *   vom Modul erzeugt, und der Reiter "Mega-Menü" in der Warengruppen-
 *   maske bleibt vollständig wirksam: Bild an/aus, Anzahl Unterpunkte,
 *   Teaser-HTML, Rotator. Diese Datei formt nur die Ausgabe um.
 *
 * DIE DREI PUNKTE, DIE DAS TRAGEN
 *   1. `header#header ...` TRIFFT AUF DIESER INSTANZ NICHTS. `#header` ist
 *      hier ein DIV (`div#header.container`), das <header>-Element darin
 *      trägt gar keine Id. Die älteren Regeln in dieser Datei, die mit
 *      `header#header` beginnen, sind wirkungslos - gemessen am 2026-08-22
 *      mit `document.querySelector('header#header')` => null. Alles hier
 *      hängt deshalb an den Modulklassen selbst.
 *   2. DIE SICHTBARE KARTE IST `.dropdown-menu.megamenu-dropdown`, nicht
 *      `.megamenu-dropdown-container`. Der Container ist nur der Anker
 *      (position:relative, height:0); die Karte darin ist absolut
 *      positioniert und trägt Weiß, Radius und Schatten.
 *   3. DER ANKER STEHT NICHT MITTIG IM FENSTER. Gemessen bei 1920 px:
 *      Container von 71 px bis 1622 px, rechts bleiben 281 px. Der
 *      übliche Ausbruch `left:calc(50% - 50vw)` setzt Mittigkeit voraus
 *      und würde die Fläche um rund 113 px verschieben. Die beiden
 *      Variablen `--mts-mm-bleed-left` / `--mts-mm-bleed-width` werden
 *      deshalb aus dem JS gesetzt (mts-theme-global.js, Abschnitt
 *      "Megamenü-Ausbruch"); ohne JS fällt alles auf die bisherige
 *      Breite zurück, statt zu verrutschen.
 * ===================================================================== */

/* --- 1. Randlose Fläche über die volle Fensterbreite ------------------ */

/* Der Anker darf nicht mehr clippen und keine eigene Breite erzwingen. */
.megamenu-container .megamenu-dropdown-container {
  max-width: none !important;
  overflow: visible !important;
}

@media (min-width: 992px) {
  .megamenu-dropdown-container > div[id^="dropdown-menu-"] > .dropdown-menu.megamenu-dropdown {
    left: var(--mts-mm-bleed-left, 0px) !important;
    right: auto !important;
    width: var(--mts-mm-bleed-width, 100%) !important;
    max-width: none !important;
    margin: 0 !important;
    padding: 40px 0 48px !important;

    /* Flach wie bei dede: keine Ecken, kein Rahmen, kein Ringsum-Schatten.
       Die Trennung zum Kopf macht eine Haarlinie, die Tiefe nach unten ein
       weicher Schatten NUR an der Unterkante. */
    border: 0 !important;
    border-top: 1px solid var(--mts-c-border, #e5e7eb) !important;
    border-radius: 0 !important;
    box-shadow: 0 24px 32px -28px rgba(0, 0, 0, 0.45) !important;
    background: var(--mts-surface, #fff) !important;
  }

  /* Der Modul-Zipfel ("Sprechblasen-Spitze") über der Fläche entfällt -
     eine randlose Leiste hat keinen Anker, auf den er zeigen könnte. */
  .megamenu-dropdown-container > div[id^="dropdown-menu-"] > .dropdown-menu.megamenu-dropdown::before,
  .megamenu-dropdown-container > div[id^="dropdown-menu-"] > .dropdown-menu.megamenu-dropdown::after {
    display: none !important;
  }


  /* Der Zipfel ueber der Klappflaeche sitzt NICHT an der Flaeche selbst,
     sondern als ::before/::after am aktiven Navigationspunkt
     (li.nav-item.dropdown-submenu.active, 23,6 x 10 px, border-bottom).
     Wer ihn an `.megamenu-dropdown::before` sucht, findet nichts.
     Eine randlose Leiste hat keinen Punkt, auf den er zeigen koennte. */
  .megamenu .nav-item.dropdown-submenu.active::before,
  .megamenu .nav-item.dropdown-submenu.active::after,
  .megamenu .nav-item.dropdown-submenu.show::before,
  .megamenu .nav-item.dropdown-submenu.show::after {
    display: none !important;
    content: none !important;
  }

  /* Das Modul oeffnet mit translateY(-8px). Bei einer Karte faellt das nicht
     auf, bei einer randlosen Leiste schiebt es die Haarlinie ueber die
     Kopfkante. */
  .megamenu-dropdown-container > div[id^="dropdown-menu-"] > .dropdown-menu.megamenu-dropdown {
    transform: none !important;
  }

  /* --- 2. Inhalt auf Seitenbreite, sechs gleiche Spalten -------------- */

  /* Bootstrap-Zeile (flex + negative Ränder) wird zum Raster. `display:
     contents` an den Spalten hebt die serverseitige Spaltenaufteilung des
     Moduls auf: die `.megamenu-dropdown-item` rutschen eine Ebene höher
     und werden selbst zu Rasterzellen. Ihre DOM-Reihenfolge ist die
     Baumreihenfolge der Warengruppen, das Raster liest sie zeilenweise -
     also links nach rechts, genau wie dede.

     Nebenwirkung, die wir WOLLEN: "Max. Einträge pro Spalte" aus der
     Warengruppenmaske steuert jetzt nur noch, wie viele Einträge das
     Modul überhaupt ausliefert, nicht mehr die Optik. Der Wert bleibt
     trotzdem wichtig - er KAPPT lautlos (siehe Kommentar unten). */
  .megamenu-dropdown-container .megamenu-dropdown-row {
    display: grid !important;
    grid-template-columns: repeat(6, minmax(0, 1fr)) !important;
    gap: 0 40px !important;
    align-items: start !important;
    align-content: start !important;
    width: auto !important;
    max-width: 1680px !important;
    margin: 0 auto !important;
    padding: 0 32px !important;
  }

  .megamenu-dropdown-container .megamenu-col:not(.megamenu-cat-img) {
    display: contents !important;
  }

  .megamenu-dropdown-container .megamenu-dropdown-item {
    display: block !important;
    min-width: 0 !important;
    margin: 0 0 30px !important;
    padding: 0 !important;
  }

  /* --- 3. Schrift: kräftige Überschrift, ruhige Unterpunkte ----------- */

  .megamenu-dropdown-container a.megamenu-dropdown-heading {
    display: block !important;
    font-size: 1.375rem !important;   /* 22px - dede fährt 24px auf gleichem 16px-Grund */
    font-weight: 700 !important;
    line-height: 1.25 !important;
    letter-spacing: -0.01em !important;
    color: var(--mts-text, #1d1d1f) !important;
    margin: 0 0 10px !important;
    padding: 0 !important;
    text-decoration: none !important;
    overflow-wrap: anywhere;
  }

  .megamenu-dropdown-container a.megamenu-dropdown-heading:hover,
  .megamenu-dropdown-container a.megamenu-dropdown-heading:focus-visible {
    color: var(--mts-accent-text, #4d6b60) !important;
    text-decoration: none !important;
  }

  /* Warengruppen OHNE Unterpunkte (z. B. Equipment: 17 flache Einträge)
     würden als 17 fette 22px-Zeilen erschlagen. Sie bekommen deshalb den
     ruhigeren Listenschnitt - dieselbe Fläche, andere Gewichtung. */
  .megamenu-dropdown-container .megamenu-dropdown-item:not(:has(.megamenu-subitems)) a.megamenu-dropdown-heading {
    font-size: 1.0625rem !important;  /* 17px */
    font-weight: 600 !important;
    margin-bottom: 0 !important;
  }
  .megamenu-dropdown-container .megamenu-dropdown-item:not(:has(.megamenu-subitems)) {
    margin-bottom: 12px !important;
  }

  .megamenu-dropdown-container .megamenu-subitems {
    display: block !important;
    margin: 0 !important;
    padding: 0 !important;
  }

  .megamenu-dropdown-container .megamenu-subitem-wrap {
    display: block !important;
    width: auto !important;
  }

  /* Das Modul hängt `text-truncate` an jeden Unterpunkt. Bei vier breiten
     Spalten fiel das nicht auf; bei sechs schmalen schneidet es Namen wie
     "MTB Allmountain-Trail (130-150mm)" mitten durch. dede lässt umbrechen
     (`word-wrap: break-word`) - hier dasselbe. */
  .megamenu-dropdown-container a.megamenu-subitem.text-truncate,
  .megamenu-dropdown-container a.megamenu-subitem {
    display: block !important;
    white-space: normal !important;
    overflow: visible !important;
    text-overflow: clip !important;
    font-size: 0.9375rem !important;  /* 15px */
    font-weight: 400 !important;
    line-height: 1.45 !important;
    color: var(--mts-text-muted, #6e6e73) !important;
    padding: 4px 0 !important;
    text-decoration: none !important;
    transition: color 0.15s ease, padding-left 0.15s ease;
    overflow-wrap: anywhere;
  }

  .megamenu-dropdown-container a.megamenu-subitem:hover,
  .megamenu-dropdown-container a.megamenu-subitem:focus-visible,
  .megamenu-dropdown-container a.megamenu-subitem.active {
    color: var(--mts-text, #1d1d1f) !important;
    text-decoration: underline !important;
    text-underline-offset: 3px !important;
    padding-left: 5px !important;
  }

  .megamenu-dropdown-container a.megamenu-subitem.more-link {
    font-weight: 600 !important;
    color: var(--mts-accent-text, #4d6b60) !important;
  }

  /* --- 4. Warengruppenbild bleibt konfigurierbar ---------------------- */

  /* "Bild der Warengruppe anzeigen" ist ein Schalter in der Warengruppen-
     maske und muss ein Schalter BLEIBEN - deshalb wird hier nichts
     ausgeblendet. Das Bild wird nur in eine Rasterzelle gezwungen (zwei
     Spalten breit, Höhe gedeckelt) statt wie bisher eine Viertelfläche
     mit 470 px Höhe zu belegen.
     Ausgeliefert wird der Schalter AUS - das entspricht dede. Wer ihn in
     der Maske wieder anhakt, bekommt diese Darstellung, keinen Bruch. */
  /* `grid-row: 1 / -1` ist hier der Punkt, nicht die Breite: als normale
     Zelle belegte das Bild nur die erste Rasterzeile, war aber nur rund
     190 px hoch - neben einer 7-zeiligen Warengruppe wie "Hardtails" blieb
     dadurch links oben eine tote Fläche von halber Klapphöhe. Über alle
     Zeilen gezogen liest es sich als bewusste Spalte statt als Loch. */
  .megamenu-dropdown-container .megamenu-cat-img {
    display: block !important;
    grid-column: span 2 !important;
    grid-row: 1 / -1 !important;
    align-self: stretch !important;
    width: auto !important;
    max-width: none !important;
    flex: none !important;
    padding: 0 32px 0 0 !important;
    margin: 0 !important;
    text-align: left !important;
  }
  .megamenu-dropdown-container .megamenu-cat-img img {
    max-height: 260px !important;
    width: auto !important;
    max-width: 100% !important;
    object-fit: contain !important;
    position: sticky !important;
    top: 0 !important;
  }
  .megamenu-dropdown-container .megamenu-cat-img-text {
    font-size: 0.875rem !important;
    color: var(--mts-text-muted, #6e6e73) !important;
    margin-top: 10px !important;
  }

  /* Teaser-HTML und Produkt-Rotator (beides Schalter derselben Maske)
     bekommen ebenfalls eine feste Rasterbreite statt Bootstrap-Spalten. */
  .megamenu-dropdown-container .megamenu-html-text,
  .megamenu-dropdown-container .rotator-container {
    grid-column: span 2 !important;
    width: auto !important;
    max-width: none !important;
    flex: none !important;
    padding: 0 !important;
  }

  /* Hintergrundbild der Klappfläche darf die randlose Leiste nicht sprengen */
  .megamenu-dropdown-container .megamenu-picture-container {
    max-width: 1680px !important;
    margin: 0 auto !important;
  }
}

/* --- 5. Schmalere Fenster: Rasterbreite mitwachsen lassen -------------- */
/* Zwischen 992 px und 1400 px sind sechs Spalten zu eng für Namen wie
   "MTB Allmountain-Trail (130-150mm)". Vier bzw. fünf Spalten halten die
   Zeilen lesbar - die Aufteilung macht weiterhin das Raster, nicht der
   Server, es geht also kein Eintrag verloren. */
@media (min-width: 992px) and (max-width: 1199.98px) {
  .megamenu-dropdown-container .megamenu-dropdown-row {
    grid-template-columns: repeat(4, minmax(0, 1fr)) !important;
    gap: 0 28px !important;
    padding: 0 24px !important;
  }
  .megamenu-dropdown-container a.megamenu-dropdown-heading { font-size: 1.1875rem !important; }
}

@media (min-width: 1200px) and (max-width: 1499.98px) {
  .megamenu-dropdown-container .megamenu-dropdown-row {
    grid-template-columns: repeat(5, minmax(0, 1fr)) !important;
    gap: 0 32px !important;
  }
  .megamenu-dropdown-container a.megamenu-dropdown-heading { font-size: 1.25rem !important; }
}

/* ===================================================================== */

/* ===================================================================== *
 * Seitenleiste für die Navigation auf Telefon und Tablet  (TASK-847)
 * ---------------------------------------------------------------------
 * WAS SIE ERSETZT
 *   Bisher klappte der Hamburger einen Bootstrap-Collapse auf, in dem die
 *   Warengruppen als kleine Kärtchen in drei Reihen umbrachen; ein Tipp
 *   darauf öffnete ein schwebendes Kästchen (`#mts-megapanel` aus Topic 13,
 *   Abschnitt `ipad-menu-touch-2026`) mit einem Ausklapper nach rechts für
 *   die dritte Ebene. Auf 390 px war das Kästchen breiter als der Anker,
 *   und die dritte Ebene hatte rechts keinen Platz mehr.
 *
 *   Jetzt: eine Leiste über die volle Höhe, große Tippflächen, eine Ebene
 *   pro Ansicht, Rückweg über eine Kopfzeile - der Zuschnitt von
 *   dede-lemgo.de (`.menu-drawer`).
 *
 * QUELLE DER EINTRÄGE
 *   Ausschließlich das, was Smartstore.MegaMenu ohnehin gerendert hat
 *   (`#dropdown-menu-<id>`), plus die übrigen Menüpunkte aus
 *   `#nav-kategorien`. Die Warengruppen-Konfiguration wirkt also auf
 *   Telefon und Desktop gleichermaßen - es gibt keine zweite Pflegestelle.
 *
 * WARUM DIE EIGENE NAMENSFAMILIE `mtsnav`
 *   Die Topic-Regeln für `#mts-megapanel` stehen WEITER HINTEN im <head>
 *   (Byte 52208) als diese Datei (Byte ~15000) und gewinnen bei gleicher
 *   Spezifität. Ein eigener Namensraum vermeidet den Kampf komplett.
 * ===================================================================== */

.mtsnav {
  position: fixed;
  inset: 0;
  z-index: 2147481700;          /* über Kopfzeile, Vergleichsleiste und Chat-Knopf */
  display: none;
}
.mtsnav.is-mounted { display: block; }

/* Solange zu: nichts abfangen, sonst ist die ganze Seite tot. */
.mtsnav:not(.is-open) { pointer-events: none; }

.mtsnav__scrim {
  position: absolute;
  inset: 0;
  background: rgba(0, 0, 0, 0.42);
  opacity: 0;
  transition: opacity 0.26s ease;
}
.mtsnav.is-open .mtsnav__scrim { opacity: 1; }

.mtsnav__panel {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  width: min(100%, 460px);
  display: flex;
  flex-direction: column;
  background: var(--mts-surface, #fff);
  box-shadow: -18px 0 48px -24px rgba(0, 0, 0, 0.5);
  transform: translateX(100%);
  transition: transform 0.28s cubic-bezier(0.22, 0.61, 0.36, 1);
  /* 100dvh statt 100vh: auf iOS springt 100vh mit der Adressleiste und die
     letzte Zeile der Liste liegt dann unter der Bildkante. */
  height: 100%;
  max-height: 100dvh;
}
.mtsnav.is-open .mtsnav__panel { transform: translateX(0); }

@media (prefers-reduced-motion: reduce) {
  .mtsnav__panel, .mtsnav__scrim, .mtsnav__stack { transition: none !important; }
}

/* --- Kopfzeile -------------------------------------------------------- */

.mtsnav__head {
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 14px 8px 14px 20px;
  border-bottom: 1px solid var(--mts-c-border, #e5e7eb);
}
.mtsnav__title {
  font-size: 1.0625rem;
  font-weight: 700;
  letter-spacing: 0.02em;
  text-transform: uppercase;
  color: var(--mts-text, #1d1d1f);
  margin-right: auto;
}
.mtsnav__close {
  flex: 0 0 auto;
  width: 44px;
  height: 44px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: 0;
  background: transparent;
  color: var(--mts-text, #1d1d1f);
  cursor: pointer;
  border-radius: 10px;
}
.mtsnav__close:active { background: var(--mts-bg-soft, #fafafa); }

/* --- Standortwahl ----------------------------------------------------- */
/* Auf dem Telefon zog der Umschalter bisher eine eigene Zeile im Kopf und
   war dort auf "CUBE STORE WIE…" beschnitten. Hier hat er die volle Breite
   und trägt seine Beschriftung. Auf dem Desktop bleibt er, wo er war. */

.mtsnav__branch {
  flex: 0 0 auto;
  border-bottom: 1px solid var(--mts-c-border, #e5e7eb);
  padding: 4px 12px;
}
.mtsnav__branch:empty { display: none; }

.mtsnav__branch .mts-branch-pill {
  display: flex !important;
  width: 100%;
  align-items: center;
  gap: 12px !important;
  padding: 14px 8px !important;
  font-size: 1rem !important;
  border-radius: 12px !important;
}
.mtsnav__branch .mts-branch-pill svg:first-of-type {
  width: 20px; height: 20px;
  color: var(--mts-accent, #6d8c80);
}
.mtsnav__branch .mts-branch-pill-label {
  max-width: none !important;
  font-weight: 600 !important;
  white-space: normal !important;
}
.mtsnav__branch .mts-branch-pill-caret { margin-left: auto; opacity: 0.7; }
.mtsnav__branch .mts-branch-pill:active { background: var(--mts-bg-soft, #fafafa); }

/* Kopfzeile der Seite: die frei gewordene Zeile darf keine Lücke lassen. */
body.mtsnav-branch-moved .mts-branch-pill-row:empty,
body.mtsnav-branch-moved .mts-branch-pill-wrap:empty { display: none !important; }

/* --- Ebenen ----------------------------------------------------------- */

.mtsnav__viewport {
  flex: 1 1 auto;
  overflow: hidden;
  position: relative;
}
.mtsnav__stack {
  display: flex;
  height: 100%;
  width: 100%;
  transition: transform 0.28s cubic-bezier(0.22, 0.61, 0.36, 1);
}
.mtsnav__level {
  flex: 0 0 100%;
  width: 100%;
  height: 100%;
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior: contain;
  padding: 8px 0 32px;
}

/* --- Zeilen ----------------------------------------------------------- */

.mtsnav__row {
  display: flex;
  align-items: center;
  gap: 12px;
  width: 100%;
  min-height: 54px;
  padding: 12px 20px;
  border: 0;
  background: transparent;
  text-align: left;
  font-size: 1.0625rem;      /* 17px - dede fährt 18px */
  font-weight: 500;
  line-height: 1.35;
  color: var(--mts-text, #1d1d1f);
  text-decoration: none !important;
  cursor: pointer;
  font-family: inherit;
}
.mtsnav__row:active { background: var(--mts-bg-soft, #fafafa); }
.mtsnav__row-text { flex: 1 1 auto; min-width: 0; overflow-wrap: anywhere; }
.mtsnav__row-icon { flex: 0 0 auto; opacity: 0.45; }

/* Rückweg: kleiner und leiser als die Einträge, damit er nicht wie einer
   von ihnen aussieht. */
.mtsnav__back {
  display: flex;
  align-items: center;
  gap: 10px;
  width: 100%;
  min-height: 44px;
  padding: 10px 20px;
  margin-bottom: 4px;
  border: 0;
  background: transparent;
  font-family: inherit;
  font-size: 0.9375rem;
  font-weight: 600;
  color: var(--mts-text-muted, #6e6e73);
  cursor: pointer;
  text-align: left;
}
.mtsnav__back:active { background: var(--mts-bg-soft, #fafafa); }

/* "Alle … anzeigen" - der Weg auf die Warengruppe selbst. Ohne ihn wäre
   eine Warengruppe mit Unterpunkten auf dem Telefon nicht mehr erreichbar:
   ihre Zeile führt dann nur noch eine Ebene tiefer. */
.mtsnav__all {
  font-weight: 600;
  color: var(--mts-accent-text, #4d6b60);
}

.mtsnav__sep {
  height: 1px;
  margin: 8px 20px;
  background: var(--mts-c-border, #e5e7eb);
}

/* Solange die Leiste offen ist, darf die Seite dahinter nicht mitscrollen. */
body.mtsnav-open { overflow: hidden !important; }

/* Ab der Desktop-Breite ist die Leiste nie sichtbar - dort greift das
   randlose Klappmenü. */
@media (min-width: 992px) {
  .mtsnav.is-desktop { display: none !important; }
}


/* ===================================================================== *
 * Ankündigungsleiste: Luft nach unten auf schmalen Fenstern   TASK-847
 * ---------------------------------------------------------------------
 * BEFUND ZUERST, WEIL ER DER ERWARTUNG WIDERSPRICHT: eine echte
 * Überlappung gibt es nicht. Gemessen 2026-08-22 bei 360/390/414/430 px
 * liegt die Unterkante der Leiste exakt auf der Oberkante des
 * Hero-Blocks (beide 172,7 px bei 390 px Breite), und `elementFromPoint`
 * bestätigt den Wechsel genau dort. Auch innerhalb der Leiste ist nichts
 * beschnitten: Kasten 40 px, Zeilenkasten 24 px, Glyphen 20 px, also
 * 10 px Luft über UND unter der Schrift.
 *
 * Was der Eindruck stattdessen ist: unter einer nur 10 px hohen
 * Restfläche folgt übergangslos ein dunkles Bild. Zwei Flächen, die
 * bündig aneinanderstoßen, lesen sich dann als ineinanderlaufend -
 * besonders auf einem Gerät mit hoher Pixeldichte, wo die Naht auf einer
 * gebrochenen Pixelzeile liegt (172,7 x 3 = 518,1) und das später
 * gezeichnete Bild die letzte Zeile der Leiste teilweise überdeckt.
 *
 * Zwei Maßnahmen, beide ohne Eingriff in die Story:
 *   1. mehr Höhe auf dem Telefon -> die Schrift bekommt Abstand zur Kante
 *   2. eine Naht-Sicherung: der Schlagschatten zeichnet einen Pixel in
 *      der Farbe der Leiste UNTER ihre Unterkante. Fällt die Naht auf
 *      eine gebrochene Zeile, füllt ihn die Leistenfarbe statt das Bild.
 *      Kein Layout-Einfluss - ein Schatten belegt keinen Platz.
 * ===================================================================== */
@media (max-width: 991.98px) {
  .b365-ticker {
    min-height: 48px !important;
    box-shadow: 0 1px 0 0 rgb(109, 140, 128) !important;   /* = var(--mts-accent) */
  }
}


/* "Zuletzt angesehen" sitzt nach dem Umhaengen (mts-theme-global.js) in der
   Seitenspalte statt am Dokumentende. Dort brauchte er nie Abstaende, hier
   schon - sonst klebt er am letzten Inhalt und am Footer. */
.recently-viewed-product-grid.mts-recently-moved {
  margin-top: 48px !important;
  margin-bottom: 48px !important;
}
@media (max-width: 991.98px) {
  .recently-viewed-product-grid.mts-recently-moved {
    margin-top: 32px !important;
    margin-bottom: 32px !important;
  }
}

/* ==========================================================================
   "ZULETZT ANGESEHEN" TRÄGT JETZT DIE PRODUKTKARTE DER LISTE   (2026-08-26)
   ==========================================================================
   AUFTRAG. Der Block soll auf JEDER Seite so aussehen wie eine Produktliste –
   Kategorieseite, Startseiten-Bänder und "Zuletzt angesehen" sollen sich
   nicht unterscheiden.

   WARUM ER SICH BISHER UNTERSCHIED, an vier unabhängigen Stellen gemessen:

   1. DER GESTAPELTE TEXTBLOCK IST SEITENGEBUNDEN, NICHT KARTENGEBUNDEN.
      Die Grundregel der Karte ist seit TASK-435g `flex-direction: row`
      (Identität links, Preis rechts daneben). Auf "gestapelt, Preis mittig,
      Pfeil rechts" schaltet sie erst
      `body.mts-cat-page:not(.mts-filter-collapsed)` (Zeile 8245 ff.) bzw. –
      für die Startseite – eine Theme-Regel des Designers unter `body.home`.
      Die Karte in "Zuletzt angesehen" steht auf der Produktseite
      (`body.mts-pdp`) und fällt deshalb auf das Nebeneinander zurück: der
      Titel bekommt eine schmale Säule und bricht dreizeilig um, der Preis
      steht rechts statt mittig. Es ist also kein Fehler an dieser Karte,
      sondern eine Regel, die an der falschen Bedingung hängt. Hier hängt sie
      an der SEKTION (`.recently-viewed-product-grid`, 0/4/0) und gilt damit
      auf jeder Seite. Auf `body.home` gewinnt weiterhin die Theme-Regel des
      Designers (0/7/1) – sie sagt dasselbe.

   2. KARTENRAHMEN. Die Liste zeichnet `border-radius:10px` und
      `0 0 2px 1px rgba(130,130,130,.18)`; diese Sektion trug seit dem 08.08.
      `18px` und einen Haarlinien-Ring `0 0 0 1px`. Der Ring war die Antwort
      auf ein Schattenband unter den Karten (Zeile 8308 ff.) – der
      Listenschatten hat 2px Weichzeichner statt 30 und kann dieses Band gar
      nicht erzeugen. Die Begründung von damals trägt hier also nicht mehr,
      und der Rahmen darf zurück auf den Listenwert.

   3. DIE KARTEN KLEBEN ANEINANDER. `.slick-slide` und `.art` sind DASSELBE
      Element – die Slide-Polsterung `padding: 0 14px` liegt damit INNERHALB
      der weissen Karte. Zwei Nachbarkarten stossen deshalb aneinander, und
      der Ring zeichnet nur eine Haarlinie dazwischen. Genau das liest sich
      als "sieht nicht aus wie Produktkarten". Ein `margin` statt der
      Polsterung ist keine Lösung: Slick rechnet seinen Versatz aus
      `slideWidth * index`, ein Aussenabstand verschiebt jede Karte. Deshalb
      wandert der sichtbare Rahmen auf ein `::before`, das um genau diese
      14px eingerückt ist – die Slick-Rechnung bleibt unberührt, der Abstand
      ist echt.

   4. FARBKREISE. In der Liste sind es Pillen (22x15, Theme-Regel unter
      `main .artlist.mts-pcard-grid`), hier Kreise – weil der verschobene
      Block (`moveRecentlyViewed`) nicht mehr unter `<main>` hängt und die
      Theme-Regel deshalb nicht greift.

   DAZU ZWEI ECHTE FEHLER IN DIESER SEKTION, beide auf der Produktseite
   sichtbar, beide NICHT an der Karte:

   A. DIE PUNKTE SIND SCHWARZE ELLIPSEN. Ein Topic-Skript zieht global
      `$('.artlist-carousel .slick-dots li button').css('width', …)` auf
      (Slider-Breite minus 180) / Anzahl – gemessen 565px je Punkt. Das ist
      als Fortschrittsbalken gedacht und hat im Theme auch eine passende
      Darstellung, aber die hängt an `body.home`. Überall sonst trifft die
      gestreckte Breite auf `border-radius:50%` und 10px Höhe. Eine
      Inline-Breite schlägt jede normale Regel – nur `!important` kommt
      dagegen an. Genau diese Regel stand hier und wurde entfernt.

   B. DIE PFEILE SIND LEERE WEISSE KREISE. Das Pfeil-Symbol kam aus zwei
      `background-image`-Blöcken (Zeile 3159 ff. und 3325 ff.), beide sind
      auskommentiert. Die Fallback-Kette darunter zeichnet zwar noch Kreis
      und Rahmen, das Zeichen selbst aber nicht: `::before` trägt
      `content:none`. Übrig bleibt ein leerer Kreis, der die äusserste Karte
      um rund 24px überlappt. Die Pfeile werden hier neu gesetzt, statt die
      Kommentare des Designers aufzuheben – seine Zeilen bleiben unangetastet,
      meine stehen später und sind enger gefasst.

   RÜCKNAHME: deploy/deploy-storefront-assets.sh --zurueck <sicherung>
   ========================================================================== */

/* --- 1. Textblock gestapelt, Preis mittig, Pfeil rechts -------------------
   ENTFERNT AM 26.08. Diese sieben Regeln standen hier wortgleich als
   Ausnahme fuer `.recently-viewed-product-grid` - und dieselbe Aussage stand
   ausserdem im Telefon-Block (:8174), im Filter-offen-Block (:8241) und in
   den Theme-Regeln des Designers unter `body.home`. Genau das war der
   Doppelpflege-Zustand, den der Nutzer abgeschafft haben wollte ("wenn
   möglich auch davon erben"). Die Aussage steht jetzt EINMAL, unscoped auf
   `.art.mts-pcard`, im Block "DIE PRODUKTKARTE - EINE DEFINITION" am
   Dateiende - "Zuletzt angesehen" erbt sie von dort.

   Gegenprobe am 26.08. auf /cube-agree-c-62-slt-2026/: mit geloeschten
   Regeln UND ohne die neue Grundregel faellt die Karte auf das Nebeneinander
   zurueck (Preis 99 px neben der Kartenmitte, Titel 74 px hoch) - die Regeln
   haben also wirklich getragen und werden wirklich ersetzt. Mit der neuen
   Grundregel: Preisversatz 0 px, Titel 48 px, alle acht Karten 538 px hoch -
   Stand identisch zu vorher. */

/* --- 1b. Karten einer Reihe gleich hoch, wie im Listengitter -------------
   `.slick-track` ist seit dem 08.08. `display:flex; align-items:stretch`, die
   Karten wurden davon aber nie erfasst: `.artlist:not(.artlist-lines) .art`
   setzt `height:100%` (0/3/0) und steht in einem Topic-`<style>` im
   Seitenkörper, also HINTER `.recently-viewed-product-grid .artlist-carousel
   .slick-slide { height:auto }` (ebenfalls 0/3/0). Bei Gleichstand gewinnt die
   spätere Quelle. Eine Prozenthöhe gegen einen Container ohne feste Höhe fällt
   auf `auto` zurück – jede Karte war damit genau so hoch wie ihr eigener
   Inhalt. Solange der Titel drei Zeilen reservierte, fiel das nicht auf; ohne
   die Reserve steht eine einzeilige Karte 26px niedriger als ihre Nachbarin.
   Mit 0/4/1 gewinnt `height:auto`, und `align-items:stretch` greift –
   gemessen: vier Karten 557/583/557/557 vorher, 583/583/583/583 nachher. */
body .recently-viewed-product-grid .artlist-carousel .slick-slide.art {
  height: auto !important;
}

/* --- 2. + 3. Kartenrahmen der Liste, innerhalb der Slide-Polsterung ------- */
.recently-viewed-product-grid .artlist-carousel .slick-slide.art {
  border-radius: 0 !important;
  background: transparent !important;
  box-shadow: none !important;
}
.recently-viewed-product-grid .artlist-carousel .slick-slide.art:hover {
  box-shadow: none !important;
}
.recently-viewed-product-grid .artlist-carousel .slick-slide.art::before {
  content: '';
  position: absolute;
  /* exakt die Slide-Polsterung aus Zeile 3233 – läuft die auseinander, läuft
     der Rahmen mit der Karte auseinander. */
  inset: 0 14px;
  z-index: 0;
  /* Radius und Schatten kommen seit dem 26.08. aus den Variablen des Blocks
     "DIE PRODUKTKARTE - EINE DEFINITION" am Dateiende. Werte unveraendert -
     der Rahmen hat nur keine zweite Quelle mehr. */
  border-radius: var(--mts-pcard-radius) !important;
  background: #ffffff;
  box-shadow: var(--mts-pcard-shadow) !important;
  transition: box-shadow 0.32s cubic-bezier(.22, .61, .36, 1);
  pointer-events: none;
}
.recently-viewed-product-grid .artlist-carousel .slick-slide.art:hover::before {
  box-shadow: var(--mts-pcard-shadow-hover) !important;
}
/* Der Rahmen ist ein positioniertes Kind mit z-index 0 und würde damit jedes
   NICHT positionierte Geschwister überdecken – die Farbreihe ist genau so
   eines. Die drei sichtbaren Baugruppen werden deshalb ausdrücklich darüber
   gelegt, statt sich auf die Malreihenfolge zu verlassen. */
.recently-viewed-product-grid .artlist-carousel .slick-slide.art > .mts-pcard__media,
.recently-viewed-product-grid .artlist-carousel .slick-slide.art > .mts-pcard__variants,
.recently-viewed-product-grid .artlist-carousel .slick-slide.art > .mts-pcard__body {
  position: relative;
  z-index: 1;
}

/* --- 4. Farbkreise als Pillen wie in der Liste ---------------------------- */
.recently-viewed-product-grid .art.mts-pcard .mts-pcard__swatch {
  width: 22px !important;
  height: 15px !important;
  border-radius: 999px !important;
  box-shadow: none !important;
  margin-top: 1px !important;
}

/* --- A. Punkte: kleine Kreise, gegen die Inline-Breite des Topic-Skripts --
   `body:not(.home)` ist Absicht: auf der Startseite hat der Designer für
   dieselben Punkte eine eigene Gestaltung (schmale 20x2-Balken statt Kreise,
   `body.home .product-grid .block-body .artlist-carousel .slick-dots …`). Er
   setzt Breite und Höhe nur am `button`, nicht am `li` – eine unbeschränkte
   Regel hier würde seine Balken in ein 8px-Kästchen zwängen. */
body:not(.home) .recently-viewed-product-grid .slick-dots {
  gap: 10px !important;
  padding: 12px 8px !important;
  margin-top: 8px !important;
}
body:not(.home) .recently-viewed-product-grid .slick-dots li {
  width: 8px !important;
  height: 8px !important;
  flex: 0 0 auto !important;
}
body:not(.home) .recently-viewed-product-grid .slick-dots li button {
  width: 8px !important;
  height: 8px !important;
  min-width: 0 !important;
  padding: 0 !important;
  border: 0 !important;
  border-radius: 50% !important;
  background: rgba(29, 29, 31, 0.20) !important;
}

/* --- B. Pfeile: Winkelzeichen ohne Kreis, im 72px-Gutter neben der Reihe --
   Wieder `body:not(.home)`: die Startseite hat vom Designer fertige Pfeile
   (50px-Kreise, rechtsbündig unter dem Carousel, Font-Awesome-Zeichen über
   `::after`). Er setzt dort weder `left/top` noch `transform` noch ein
   Hintergrundbild – ohne die Einschränkung hätte diese Regel seine Pfeile
   verschoben und ein ZWEITES Zeichen darüber gelegt. */
body:not(.home) .recently-viewed-product-grid .artlist-carousel .slick-prev,
body:not(.home) .recently-viewed-product-grid .artlist-carousel .slick-next {
  position: absolute !important;
  top: 50% !important;
  bottom: auto !important;
  transform: translateY(-50%) !important;
  width: 44px !important;
  height: 44px !important;
  padding: 0 !important;
  border: 0 !important;
  border-radius: 0 !important;
  background-color: transparent !important;
  box-shadow: none !important;
  background-repeat: no-repeat !important;
  background-position: center !important;
  background-size: 30px 30px !important;
  z-index: 6 !important;
  opacity: 1 !important;
  visibility: visible !important;
  display: flex !important;
}
body:not(.home) .recently-viewed-product-grid .artlist-carousel .slick-prev {
  left: -60px !important;
  right: auto !important;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%231d1d1f' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'><polyline points='15 18 9 12 15 6'/></svg>") !important;
}
body:not(.home) .recently-viewed-product-grid .artlist-carousel .slick-next {
  right: -60px !important;
  left: auto !important;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%231d1d1f' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'><polyline points='9 18 15 12 9 6'/></svg>") !important;
}
body:not(.home) .recently-viewed-product-grid .artlist-carousel .slick-prev:hover,
body:not(.home) .recently-viewed-product-grid .artlist-carousel .slick-next:hover {
  background-color: transparent !important;
  border: 0 !important;
  box-shadow: none !important;
  transform: translateY(-50%) scale(1.14) !important;
}
body:not(.home) .recently-viewed-product-grid .artlist-carousel .slick-arrow.slick-disabled {
  opacity: 0.28 !important;
  cursor: default !important;
}
/* Absicherung: das Topic-Skript kann die Pfeile in einen selbst angelegten
   Behälter `.slick-arrows` am Carousel umhängen (`moveSlickButtons`). Dann
   wäre der Bezugsrahmen nicht mehr `.artlist.slick-slider`, sondern das
   Carousel MIT seiner 72px-Polsterung – `left:-60px` landete ausserhalb der
   Sektion. Der Behälter bekommt deshalb genau die Fläche der Kartenreihe.

   `body:not(.home)` ist NICHT Vorsicht, sondern gemessen. Auf der Startseite
   hat der Designer für genau diesen Behälter eine eigene Gestaltung: ein
   rechtsbündiges Paar UNTER dem Carousel (`text-align:right`,
   `margin-top:25px`, Pfeile `position:inherit`, 50px-Kreise). Er setzt darin
   aber kein `position` – eine unbeschränkte Regel hier hätte den Behälter
   absolut gestellt und seine beiden Pfeile von (1446|825) und (1512|825) an
   die Zeilenränder (13|508) und (1521|508) gezogen. Gemessen mit und ohne
   Regel am 26.08. Seine Gestaltung bleibt damit unangetastet. */
body:not(.home) .recently-viewed-product-grid .artlist-carousel > .slick-arrows {
  position: absolute !important;
  left: 72px !important;
  right: 72px !important;
  top: 0 !important;
  height: calc(100% - 80px) !important;
  pointer-events: none !important;
}
body:not(.home) .recently-viewed-product-grid .artlist-carousel > .slick-arrows > .slick-arrow {
  pointer-events: auto !important;
}
/* Unter 900px tragen Wischen und Punkte – Pfeile weg UND der Gutter mit.
   Der Gutter (72px je Seite, Zeile 3317) existiert nur für die Pfeile. Seine
   Rücknahme für schmale Fenster stand im auskommentierten Block und ist damit
   seit dessen Stilllegung wirkungslos: bei 390px Fensterbreite blieben der
   Kartenreihe 246px, die Karte selbst war 224px breit. Beides gehört in
   dieselbe Regel, sonst hebt die eine Hälfte die andere auf. */
@media (max-width: 899.98px) {
  body:not(.home) .recently-viewed-product-grid .artlist-carousel .slick-prev,
  body:not(.home) .recently-viewed-product-grid .artlist-carousel .slick-next {
    display: none !important;
  }
  body:not(.home) .recently-viewed-product-grid .artlist-carousel {
    padding-left: 0 !important;
    padding-right: 0 !important;
  }
}

/* --- 5. Zwei-Zeilen-Reserve des Titels abschalten -------------------------
   ENTFERNT AM 26.08., derselbe Grund wie bei Abschnitt 1: die Reserve wird
   jetzt in der EINEN Definition am Dateiende abgeschaltet, unscoped auf
   `.art.mts-pcard` - dort mit derselben Spezifitaet 0/4/1, die es hier
   brauchte, um gegen das Topic-`<style>` im Dokument anzukommen
   (`.artlist:not(.artlist-lines) .art .art-name`, 0/4/0 in einer spaeteren
   Quelle). Die vollstaendige Begruendung dieser Zahl steht dort. */

/* ==========================================================================
   DIE PRODUKTKARTE - EINE DEFINITION   (2026-08-26)
   ==========================================================================
   AUFTRAG DES NUTZERS: "sollte wie bei startseite produktliste sein zuletzt
   angesehen und wenn möglich auch davon erben falls man diese produktliste
   ändert und sollte auf jeder seite sein wo zuletzt angesehen ist".

   Das Erben ist der eigentliche Punkt. Bis hierher gab es EINE Karte, aber
   ZWEI Aussagen darüber, wie sie aufgebaut ist:

     GRUNDREGEL (TASK-435g, :7145)  -> Identität LINKS, Preis RECHTS daneben
     und vier Ausnahmen, die alle dasselbe Gegenteil sagen - gestapelt,
     Preis mittig, Pfeil rechts:
       1. @media (max-width: 575.98px)                            (:8174)
       2. body.mts-cat-page:not(.mts-filter-collapsed) ab 992px   (:8241)
       3. Theme-Regeln des Designers unter `body.home`  (/themes/multicycle/)
       4. .recently-viewed-product-grid ...                       (:9742)

   Vier Stellen für eine Aussage heisst: wer die Produktliste ändert, ändert
   "Zuletzt angesehen" NICHT mit - genau der Zustand, den der Auftrag
   abschaffen will. Deshalb wird die Aussage hier umgedreht: der gestapelte
   Startseiten-Aufbau IST die Grundregel der Karte, unscoped auf
   `.art.mts-pcard`. Kategorieseite, Suche, Startseiten-Bänder, "Zuletzt
   angesehen" (Produktseite, Startseite, eigenständige Seite) erben ab jetzt
   alle aus diesem einen Block.

   WAS DAS SICHTBAR ÄNDERT: das Nebeneinander verschwindet vollständig. Es
   erschien zuletzt ohnehin nur noch auf der Kategorieseite mit EINGEKLAPPTEM
   Filter und auf der Suchergebnisseite - überall sonst hatte eine der vier
   Ausnahmen es schon abgeschaltet. Gemessen /hardtails/ bei 1600 px, Filter
   eingeklappt: Titelspalte vorher 212 px von 329 px Kartenbreite, nachher
   297 px; Preis vorher rechtsbündig, nachher exakt zur Karte zentriert
   (Versatz 0 px); Pfeil unverändert rechtsbündig (Abstand 0 px zum
   Spaltenrand).

   SPEZIFITÄTEN, gemessen per CSSOM am 26.08. - nicht geschätzt:
   - `.mts-pcard__body`, `__col-left`, `__col-right`: die stärkste
     konkurrierende Regel ist 0/3/0 (die 435-Kette in dieser Datei). Gleiche
     Spezifität, spätere Zeile - dieser Block gewinnt. Kein Topic-`<style>`
     mischt hier mit.
   - `.mts-pcard__price`: stärkster Gegner 0/4/0, hier ebenfalls 0/4/0 und
     später.
   - TITEL: hier ist 0/3/0 NICHT genug. Die Zwei-Zeilen-Reserve steht dreimal,
     und die stärkste Fassung sitzt in einem Topic-`<style>` IM DOKUMENT:
     `.artlist:not(.artlist-lines) .art .art-name { min-height: calc(2.7em + 2px) }`
     - 0/4/0, aber als Stylesheet 7 hinter dieser Datei (Stylesheet 4). Bei
     Gleichstand gewinnt die spätere Quelle, eine 0/4/0-Regel hier verliert
     also immer. Deshalb `body` vorweg plus die Doppelklasse
     `.art-name.mts-pcard__name` = 0/4/1. Dieselbe Zahl, mit der die
     Kategorieseite es seit TASK-435c löst (`body.mts-cat-page …`).
   - RAHMEN: der Designer setzt Schatten und Hover-Schatten der Gitterkarte
     unter `main .artlist.mts-pcard-grid > .art.mts-pcard` (0/4/1) in
     /themes/multicycle/theme.css. `body …` statt `main …` ist ebenfalls
     0/4/1 und steht in der späteren Quelle - damit trägt die Variable unten
     auch dort. Der WERT ist unverändert derselbe; der Rahmen sieht nach
     diesem Block exakt aus wie vorher, er hat nur noch eine Quelle.

   WAS BEWUSST NICHT HIER STEHT: alles, was Karussell-Beiwerk ist und keine
   Karte - Punkte, Pfeile, Slide-Polsterung, der Rahmen im `::before`. Das
   bleibt im Block "ZULETZT ANGESEHEN" darüber, benutzt aber dieselben
   Variablen.
   ========================================================================== */

/* Der Rahmen der Karte - EINE Stelle. Werte aus der Listenkarte übernommen
   (Designer-Theme, `main .artlist.mts-pcard-grid > .art.mts-pcard`). Wer den
   Rahmen ändern will, ändert diese drei Zeilen. */
:root {
  --mts-pcard-radius: 10px;
  --mts-pcard-shadow: 0 0 2px 1px rgba(130, 130, 130, 0.18);
  --mts-pcard-shadow-hover: 0 0 5px 1px rgba(41, 41, 41, 0.18);
}

/* --- 1. Textkörper GESTAPELT: Identität oben, Preiszeile darunter --------- */
/* `container-type` macht den Textkörper zum Grössen-Container. Gebraucht wird
   das für Abschnitt 3b weiter unten - die Preiszeile muss auf die KARTENbreite
   reagieren, nicht auf die Fensterbreite. Die beiden gehen auseinander: bei
   390 px Fenster ist die Karte auf der Kategorieseite 332 px breit (eine
   Spalte), auf /recentlyviewedproducts 171 px (zwei Spalten, MTS-Standard
   `.artlist:not(.slick-initialized):not(.artlist-lines)`). Eine Media-Query
   könnte diese beiden Fälle prinzipiell nicht auseinanderhalten. */
.art.mts-pcard .mts-pcard__body {
  flex-direction: column !important;
  align-items: stretch !important;
  justify-content: flex-start !important;
  gap: 6px !important;
  container-type: inline-size;
  container-name: mtspcard;
}

/* --- 2. Identität über die volle Kartenbreite, zentriert ------------------ */
.art.mts-pcard .mts-pcard__col-left {
  width: 100% !important;
  flex: 0 0 auto !important;
  min-width: 0 !important;
  max-width: 100% !important;
  align-items: center !important;
  text-align: center !important;
}
/* CUBE-Modellnamen enthalten Ketten wie "C:68X" ohne Trennstelle, an denen
   `break-word` nicht umbricht - der Überhang bliebe stehen. Deshalb
   `anywhere`. */
.art.mts-pcard .mts-pcard__col-left .mts-pcard__name,
.art.mts-pcard .mts-pcard__col-left .mts-pcard__name a,
.art.mts-pcard .mts-pcard__col-left .mts-pcard__name a span {
  max-width: 100% !important;
  overflow-wrap: anywhere !important;
}

/* --- 3. Preiszeile: volle Breite, unten gepinnt --------------------------- */
/* Der Preis wird aus dem Fluss genommen und zur KARTE mittig gestellt, der
   Pfeil bleibt normales Flex-Kind und damit rechtsbündig. Beide Positionen
   sind dadurch unabhängig voneinander - kein gemeinsam zentriertes Paar
   (das war der verworfene Versuch vom 17.08.). `min-height` = Pfeilgrösse
   (32px, TASK-435h), damit der absolut gestellte Preis auch dann eine
   Bezugshöhe hat, wenn die Zeile sonst leer wäre. */
.art.mts-pcard .mts-pcard__col-right {
  width: 100% !important;
  flex: 0 0 auto !important;
  flex-direction: row !important;
  flex-wrap: wrap !important;
  align-items: center !important;
  justify-content: flex-end !important;
  align-self: auto !important;
  white-space: normal !important;
  gap: 8px !important;
  margin-top: auto !important;
  position: relative !important;
  min-height: 32px !important;
}
.art.mts-pcard .mts-pcard__col-right .mts-pcard__price {
  position: absolute !important;
  left: 50% !important;
  top: 50% !important;
  transform: translate(-50%, -50%) !important;
  white-space: nowrap !important;
}

/* --- 3b. Schmale Karte: Preis in eine eigene Zeile ------------------------
   BEFUND vom 26.08., /recentlyviewedproducts bei 390 px, sechs von sechs
   Karten: der zur Karte zentrierte Preis lief 11 bis 19 px unter den
   Pfeilknopf und war rechts abgeschnitten ("4.999,00" ohne Währungszeichen).

   Es ist keine Regelkollision, sondern schlicht zu wenig Platz. Die Preiszeile
   ist dort 139 px breit; der Pfeil misst auf dem Telefon 44 px statt 32 px,
   der Preis 89 px. Zentriert man 89 px in 139 px, endet der Preis 19 px hinter
   der linken Pfeilkante. "Mittig UND rechtsbündig" ist bei dieser Breite nicht
   erfüllbar - die beiden Forderungen schliessen sich aus, egal welche Regel
   gewinnt.

   Unterhalb von 240 px Kartenbreite bekommt der Preis deshalb eine eigene
   Zeile über die volle Breite und bleibt darin zentriert; der Pfeil rutscht
   in die Zeile darunter und bleibt rechtsbündig. Optisch dieselbe Aussage,
   nur untereinander. Gemessen nachher: Preisversatz zur Kartenmitte 0 px,
   Pfeil 16 px vom rechten Kartenrand (= Kartenpolsterung), keine
   Rechteck-Überschneidung mehr, Karten einer Reihe weiter gleich hoch
   (532/532 bzw. 487/487); die Karte wird dadurch rund 31 px höher.

   Die Grenze 240 px ist gerechnet, nicht geraten: Preis (bis ~105 px bei
   fünfstelligen Beträgen) + Abstand 8 px + Pfeil 44 px = 157 px, plus die
   32 px Kartenpolsterung = 189 px; 240 px lässt Luft für UVP und Rabatt in
   derselben Zeile.

   Browser ohne Container-Queries (vor Chrome 105 / Safari 16) überspringen
   den Block. Dann gilt die Grundregel darüber - also genau der Zustand, den
   die Startseite heute schon hat. Kein Rückschritt gegenüber vorher. */
@container mtspcard (max-width: 239.98px) {
  .art.mts-pcard .mts-pcard__col-right .mts-pcard__price {
    position: static !important;
    left: auto !important;
    top: auto !important;
    transform: none !important;
    flex: 0 0 100% !important;
    text-align: center !important;
  }
}
.art.mts-pcard .mts-pcard__uvp { white-space: nowrap !important; }
.art.mts-pcard .mts-pcard__col-right .mts-pcard__buy { margin-top: 0 !important; }

/* --- 4. Titel ohne Zwei-Zeilen-Reserve (0/4/1, Begründung oben) ----------- */
body .art.mts-pcard .art-name.mts-pcard__name,
body .art.mts-pcard .art-name.mts-pcard__name a,
body .art.mts-pcard .art-name.mts-pcard__name span {
  min-height: 0 !important;
  height: auto !important;
  flex: 0 0 auto !important;
}
body .art.mts-pcard .art-name.mts-pcard__name a.art-name-link {
  padding-top: 2px !important;
  padding-bottom: 0 !important;
  min-height: 0 !important;
  height: auto !important;
}

/* --- 5. Gitterkarte: gleiche Höhe je Reihe + Rahmen aus den Variablen -----
   Die gleiche Höhe hing bis hierher an der Zwei-Zeilen-Reserve des Titels:
   solange jeder Titel 51 px hoch war, waren auch alle Karten gleich hoch.
   Ohne die Reserve fällt das weg, und die Startseite zeigt sofort, dass
   dort nie eine echte Höhenangleichung stand - gemessen 527/505/527/527/505
   statt durchgehend 545.

   Der Grund ist eine Ungleichheit zwischen den Seiten, die man nicht sieht:
   die Kategorieseite legt das Gitter als CSS-Grid an
   (`.artlist:not(.slick-initialized):not(.artlist-lines) { display:grid }`,
   :7000er-Bereich), auf der Startseite stellt eine Theme-Regel des Designers
   dasselbe Gitter auf `display:flex` um
   (`.mts-store .g-block-product-list .artlist.artlist-grid`, 0/4/0). Im Grid
   greift `height:100%` gegen die Zeilenhöhe und macht die Karten gleich hoch;
   im Flex-Container ohne eigene Höhe fällt dieselbe Prozenthöhe auf `auto`
   zurück und jede Karte ist genau so hoch wie ihr Inhalt.

   `align-self: stretch` allein reicht NICHT - gemessen am 26.08.: die Höhen
   blieben 527/505/527. Der Grund ist die Regel selbst: `align-self` wirkt nur
   auf eine Cross-Size von `auto`, und `.artlist:not(.artlist-lines) .art`
   setzt `height:100%` (0/3/0, zusätzlich aus einem Topic-`<style>`). Erst
   `height:auto` daneben macht die Karte streckbar. Mit beidem zusammen:
   Startseite durchgehend 527, Kategorieseite unverändert gleich hoch,
   Preiszeile in allen acht gemessenen Karten 18 px über dem Kartenboden.

   Das Karussell ist von dieser Regel NICHT betroffen: seine Karten hängen an
   `.slick-track`, nicht direkt an der `.artlist`, der Kindkombinator trifft
   sie also nicht. Dort bleibt Abschnitt 1b des Blocks darüber zuständig. */
body .artlist.mts-pcard-grid > .art.mts-pcard {
  align-self: stretch !important;
  height: auto !important;
  border-radius: var(--mts-pcard-radius) !important;
  box-shadow: var(--mts-pcard-shadow) !important;
}
body .artlist.mts-pcard-grid > .art.mts-pcard:hover {
  box-shadow: var(--mts-pcard-shadow-hover) !important;
}
/* Die Bildfläche sitzt randlos in der Karte und trägt oben denselben Radius.
   Bislang hing sie an `--mts-radius-lg` (:6896) - und genau diese Variable
   hat auf der Startseite einen ANDEREN Wert: gemessen 36 px dort gegen 10 px
   auf der Kategorieseite. Die Bildfläche war damit runder als die Karte, die
   sie enthält. Sichtbar wurde das nie, weil die Karte `overflow:hidden`
   trägt und beide Flächen weiss sind - es ist trotzdem eine zweite Quelle
   für dieselbe Zahl und gehört an die Variable. */
body .art.mts-pcard .art-picture-block.mts-pcard__media {
  border-radius: var(--mts-pcard-radius) var(--mts-pcard-radius) 0 0 !important;
}

/* --- 6. Der native Datenblock, wo Smartstore ihn NICHT flach rendert ------
   BEFUND vom 26.08., /recentlyviewedproducts bei 1600 px gemessen: die
   Beschreibung, "Weitere Option: Grösse" und ein zweites Preisband lagen
   sichtbar über der Karte, dazu fehlten Markenlogo und Kategoriezeile.

   URSACHE, im DOM beider Seiten nachgesehen: die Regel, die diese nativen
   Knoten stilllegt (`.art.mts-pcard > .art-description` … :6878), ist eine
   DIREKTKIND-Kette. Auf der Kategorieseite trägt sie, weil die Knoten dort
   flach unter `.art` hängen (gemessen: `.art-data-block` existiert dort gar
   nicht). Die eigenständige Seite rendert die native Smartstore-Gitterkarte
   MIT Wrapper: `.art > .art-data-block > .art-info-block > .art-description`.
   Der Direktkind-Selektor greift eine Ebene zu hoch und trifft nichts.

   Der ganze Wrapper darf weg: `enhancePcard` liest Marke, Kategorie, Titel,
   Status, Preis und Rabatt daraus aus und baut damit `.mts-pcard__body` -
   sichtbar wäre er also doppelt. `display:none` lässt die Knoten im DOM, das
   JS liest weiter (es fragt Text und Attribute ab, keine Geometrie).

   Bewusst an `.mts-pcard` gehängt und nicht an die Seite: die Bedingung ist
   "diese Karte hat bereits einen umgebauten Textkörper", nicht "diese Seite
   heisst so". Wo Smartstore flach rendert, findet der Selektor nichts und
   tut nichts. */
/* NACHTRAG 26.08. nach dem Abnahmedurchlauf – `display:none` auf dem ganzen
   Wrapper war zu grob und hat einen zweiten Fehler erzeugt. In dem Wrapper
   steckt nämlich auch `.art-actions-block > .mts-branch-chip-mount`, der
   Anker für den Filialbestand. `mts-branch-stock.js` holt die Bestände
   viewport-gesteuert per IntersectionObserver (`ROOT_MARGIN 300px`) – und ein
   Element in einem `display:none`-Teilbaum hat kein Rechteck, überschneidet
   also nie. Ergebnis: KEIN einziger `/MtsStorefront/BranchStockBatch`-Aufruf
   auf dieser Seite, die Verfügbarkeitszeile blieb auf allen Karten leer.
   Gemessen am 26.08.: mit sichtbarem Wrapper füllen sich dieselben vier Karten
   sofort mit "Wenige verfügbar" / "Auf Anfrage" / "In anderer Filiale
   verfügbar".

   Ein 1x1-Kniff (`position:absolute; overflow:hidden; clip`) hilft NICHT: der
   Anker wird dann vom `overflow:hidden` des Wrappers weggeschnitten und ist
   für den Beobachter wieder leer. Ausprobiert, blieb leer.

   Deshalb stillgelegt wird jetzt der INHALT, nicht der Wrapper – und der
   Anker ausdrücklich ausgenommen. Das ist auch genau das Muster, das auf der
   Kategorieseite trägt: dort hängt derselbe Anker flach unter `.art`, bleibt
   im Fluss und wird erst unsichtbar, wenn er gefüllt ist und `.mts-listing-chip`
   trägt. Der Zustand steht zu dem Zeitpunkt längst in `.mts-pcard__stock`,
   nachgetragen über das Ereignis `mts:branch-stock`.

   Bekannter Rest: der leergeräumte Wrapper behält rund 12px Höhe (die
   Zeilenbox des Ankers). Weisser Streifen auf weisser Karte, alle Karten
   bleiben gleich hoch und der Preis steht in allen gemessenen Karten 23px
   über dem Kartenboden. `font-size:0`/`line-height:0` ändern daran nichts –
   ausprobiert. Nicht weiter verfolgt. */
.art.mts-pcard > .art-data-block {
  display: block !important;
  margin: 0 !important;
  padding: 0 !important;
  border: 0 !important;
  background: none !important;
  box-shadow: none !important;
  min-height: 0 !important;
}
.art.mts-pcard > .art-data-block > *:not(.art-actions-block) {
  display: none !important;
}
.art.mts-pcard > .art-data-block > .art-actions-block {
  display: block !important;
  margin: 0 !important;
  padding: 0 !important;
  border: 0 !important;
  background: none !important;
  min-height: 0 !important;
}
.art.mts-pcard > .art-data-block > .art-actions-block > *:not(.mts-branch-chip-mount) {
  display: none !important;
}
/* Sobald der Anker gefüllt ist, trägt er `.mts-listing-chip` – ab da ist er
   entbehrlich, die Aussage steht in der Statuszeile der Karte. */
.art.mts-pcard > .art-data-block .mts-branch-chip-mount.mts-listing-chip {
  display: none !important;
}
