/*
 * Warehouse One 2026 theme overrides.
 *
 * Keep customer-specific colors and layout overrides here instead of editing
 * the generated APEX stylesheet. This entry compiles to css/wh1-overrides.css.
 */
@font-face {
  font-family: 'Muli';
  src: url("../fonts/Mulish-Variable-Latin.woff2") format("woff2");
  font-weight: 200 900;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: 'Muli';
  src: url("../fonts/Mulish-VariableItalic-Latin.woff2") format("woff2");
  font-weight: 200 900;
  font-style: italic;
  font-display: swap;
}
:root {
  /* Warehouse One brand palette */
  --wh1-color-primary: #0f555c;
  --wh1-color-primary-dark: #09393e;
  --wh1-color-primary-border: #0b4146;
  --wh1-color-surface-soft: #e0eff0;
  --wh1-color-brand-dhl: #fecc00;
  --wh1-color-brand-gls: #1c146b;
  /* Current APEX / Bootstrap baseline values used for later adjustment. */
  --wh1-color-black: #0a0a0a;
  --wh1-color-white: #ffffff;
  --wh1-color-body-bg: #ffffff;
  --wh1-color-border: #e1e1e1;
  --wh1-color-border-strong: #c3c3c3;
  --wh1-color-disabled: #ebebeb;
  --wh1-color-muted: #737373;
  --wh1-color-price-unit: #a9a9a9;
  --wh1-color-highlight-red: #ea094b;
  --wh1-color-defective-copies: #ff0000;
  --wh1-color-highlight-red-soft: #f9b4c8;
  --wh1-color-stock-high: #9dc31a;
  --wh1-color-stock-low: #f9b400;
  --wh1-color-stock-out: var(--wh1-color-highlight-red);
  --wh1-color-warning: #ffc107;
  --wh1-color-success-apex: #6eb156;
  --wh1-color-error: #dc3545;
  /* APEX source palette values used by styles.min.css. */
  --wh1-color-apex-00000005: rgba(0, 0, 0, 0.0196);
  --wh1-color-apex-00000013: rgba(0, 0, 0, 0.0745);
  --wh1-color-apex-0000001a: rgba(0, 0, 0, 0.102);
  --wh1-color-apex-00000020: rgba(0, 0, 0, 0.1255);
  --wh1-color-apex-00000026: rgba(0, 0, 0, 0.149);
  --wh1-color-apex-0000002d: rgba(0, 0, 0, 0.1765);
  --wh1-color-apex-00000033: rgba(0, 0, 0, 0.2);
  --wh1-color-apex-00000040: rgba(0, 0, 0, 0.251);
  --wh1-color-apex-0000004d: rgba(0, 0, 0, 0.302);
  --wh1-color-apex-00000080: rgba(0, 0, 0, 0.502);
  --wh1-color-apex-000000b9: rgba(0, 0, 0, 0.7255);
  --wh1-color-apex-000000cc: rgba(0, 0, 0, 0.8);
  --wh1-color-apex-0d151f00: rgba(13, 21, 31, 0);
  --wh1-color-apex-0d151f99: rgba(13, 21, 31, 0.6);
  --wh1-color-apex-0d6efd: #0d6efd;
  --wh1-color-apex-0dcaf0: #0dcaf0;
  --wh1-color-apex-0f5132: #0f5132;
  --wh1-color-apex-18212d00: rgba(24, 33, 45, 0);
  --wh1-color-apex-18212d99: rgba(24, 33, 45, 0.6);
  --wh1-color-apex-198754: #198754;
  --wh1-color-apex-1d7c30: #1d7c30;
  --wh1-color-apex-1e2125: #1e2125;
  --wh1-color-apex-20c997: #20c997;
  --wh1-color-apex-212529: #212529;
  --wh1-color-apex-223b3f: #223b3f;
  --wh1-color-apex-28a745: #28a745;
  --wh1-color-apex-28a74540: rgba(40, 167, 69, 0.251);
  --wh1-color-apex-28a745e6: rgba(40, 167, 69, 0.902);
  --wh1-color-apex-2b4a4f: #2b4a4f;
  --wh1-color-apex-2c3034: #2c3034;
  --wh1-color-apex-323539: #323539;
  --wh1-color-apex-333333: #333333;
  --wh1-color-apex-343a40: #343a40;
  --wh1-color-apex-365d63: #365d63;
  --wh1-color-apex-373b3e: #373b3e;
  --wh1-color-apex-383838: #383838;
  --wh1-color-apex-3a636a: #3a636a;
  --wh1-color-apex-3d6970: #3d6970;
  --wh1-color-apex-474c58: #474c58;
  --wh1-color-apex-495057: #495057;
  --wh1-color-apex-525252: #525252;
  --wh1-color-apex-636a73: #636a73;
  --wh1-color-apex-6610f2: #6610f2;
  --wh1-color-apex-666666: #666666;
  --wh1-color-apex-666666-2: #666666;
  --wh1-color-apex-6c757d: #6c757d;
  --wh1-color-apex-6d7583: #6d7583;
  --wh1-color-apex-6f42c1: #6f42c1;
  --wh1-color-apex-8a6700: #8a6700;
  --wh1-color-apex-91a0a8: #91a0a8;
  --wh1-color-apex-999999: #999999;
  --wh1-color-apex-adb5bd: #adb5bd;
  --wh1-color-apex-b3b3b3: #b3b3b3;
  --wh1-color-apex-b8b8b8: #b8b8b8;
  --wh1-color-apex-badbcc: #badbcc;
  --wh1-color-apex-bbbbbb: #bbbbbb;
  --wh1-color-apex-bcd4d9: #bcd4d9;
  --wh1-color-apex-bdbdbd: #bdbdbd;
  --wh1-color-apex-bfd5c4: #bfd5c4;
  --wh1-color-apex-c1dadf: #c1dadf;
  --wh1-color-apex-c2c2c2: #c2c2c2;
  --wh1-color-apex-c4cecf: #c4cecf;
  --wh1-color-apex-c4cfd5: #c4cfd5;
  --wh1-color-apex-c4dbca: #c4dbca;
  --wh1-color-apex-c7cbd0: #c7cbd0;
  --wh1-color-apex-c7e0e5: #c7e0e5;
  --wh1-color-apex-c8d8da: #c8d8da;
  --wh1-color-apex-c9e1cf: #c9e1cf;
  --wh1-color-apex-cbd0d3: #cbd0d3;
  --wh1-color-apex-cccccc: #cccccc;
  --wh1-color-apex-cccccc-2: #cccccc;
  --wh1-color-apex-ced4da: #ced4da;
  --wh1-color-apex-d02536: #d02536;
  --wh1-color-apex-d1d6d8: #d1d6d8;
  --wh1-color-apex-d1e7dd: #d1e7dd;
  --wh1-color-apex-d1ecf1: #d1ecf1;
  --wh1-color-apex-d4d4d4: #d4d4d4;
  --wh1-color-apex-d4edda: #d4edda;
  --wh1-color-apex-d63384: #d63384;
  --wh1-color-apex-d7dbde: #d7dbde;
  --wh1-color-apex-dae5e6: #dae5e6;
  --wh1-color-apex-dc3545: #dc3545;
  --wh1-color-apex-dc354540: rgba(220, 53, 69, 0.251);
  --wh1-color-apex-dc3545e6: rgba(220, 53, 69, 0.902);
  --wh1-color-apex-dde0e3: #dde0e3;
  --wh1-color-apex-dfc2c4: #dfc2c4;
  --wh1-color-apex-e2e7ea: #e2e7ea;
  --wh1-color-apex-e5c7ca: #e5c7ca;
  --wh1-color-apex-e6dbb9: #e6dbb9;
  --wh1-color-apex-e6e6e6: #e6e6e6;
  --wh1-color-apex-e9ecef: #e9ecef;
  --wh1-color-apex-eccccf: #eccccf;
  --wh1-color-apex-ece1be: #ece1be;
  --wh1-color-apex-ececec: #ececec;
  --wh1-color-apex-eff1f2: #eff1f2;
  --wh1-color-apex-f1f1f1: #f1f1f1;
  --wh1-color-apex-f2e7c3: #f2e7c3;
  --wh1-color-apex-f2f2f2: #f2f2f2;
  --wh1-color-apex-f8d7da: #f8d7da;
  --wh1-color-apex-f8f9fa: #f8f9fa;
  --wh1-color-apex-fd7e14: #fd7e14;
  --wh1-color-apex-fff3cd: #fff3cd;
  --wh1-color-apex-ffffff33: rgba(255, 255, 255, 0.2);
  --wh1-color-apex-ffffff80: rgba(255, 255, 255, 0.502);
  --wh1-color-apex-rgba-0-0-0-0: rgba(0, 0, 0, 0);
  --wh1-color-apex-rgba-0-0-0-p05: rgba(0, 0, 0, 0.05);
  --wh1-color-apex-rgba-0-0-0-p075: rgba(0, 0, 0, 0.075);
  --wh1-color-apex-rgba-0-0-0-p1: rgba(0, 0, 0, 0.1);
  --wh1-color-apex-rgba-0-0-0-p125: rgba(0, 0, 0, 0.125);
  --wh1-color-apex-rgba-0-0-0-p15: rgba(0, 0, 0, 0.15);
  --wh1-color-apex-rgba-0-0-0-p175: rgba(0, 0, 0, 0.175);
  --wh1-color-apex-rgba-0-0-0-p25: rgba(0, 0, 0, 0.25);
  --wh1-color-apex-rgba-0-0-0-p3: rgba(0, 0, 0, 0.3);
  --wh1-color-apex-rgba-0-0-0-p55: rgba(0, 0, 0, 0.55);
  --wh1-color-apex-rgba-0-0-0-p7: rgba(0, 0, 0, 0.7);
  --wh1-color-apex-rgba-0-0-0-p9: rgba(0, 0, 0, 0.9);
  --wh1-color-apex-rgba-255-255-255-0: rgba(255, 255, 255, 0);
  --wh1-color-apex-rgba-255-255-255-p1: rgba(255, 255, 255, 0.1);
  --wh1-color-apex-rgba-255-255-255-p15: rgba(255, 255, 255, 0.15);
  --wh1-color-apex-rgba-255-255-255-p25: rgba(255, 255, 255, 0.25);
  --wh1-color-apex-rgba-255-255-255-p55: rgba(255, 255, 255, 0.55);
  --wh1-color-apex-rgba-255-255-255-p75: rgba(255, 255, 255, 0.75);
  --wh1-color-current: currentColor;
  --wh1-color-transparent: rgba(0, 0, 0, 0);
  /* Bootstrap variable overrides consumed by APEX components. */
  --bs-black: var(--wh1-color-black);
  --bs-white: var(--wh1-color-white);
  --bs-secondary: var(--wh1-color-white);
  --bs-highlight: var(--wh1-color-primary);
  --bs-highlight-rgb: 15, 85, 92;
  --bs-primary: var(--wh1-color-primary);
  --bs-primary-rgb: 15, 85, 92;
  --bs-body-color: var(--wh1-color-black);
  --bs-body-bg: var(--wh1-color-body-bg);
  --bs-border-color: var(--wh1-color-border);
  --bs-gray: var(--wh1-color-muted);
  --bs-gray-600: var(--wh1-color-muted);
  --bs-link-color: var(--wh1-color-primary);
  --bs-link-hover-color: var(--wh1-color-primary-dark);
  --link-color: var(--wh1-color-primary);
  --link-hover-color: var(--wh1-color-primary-dark);
  /* WH1 core design tokens used by the styleguide and new theme work. */
  --wh1-font-family-base: 'Muli', sans-serif;
  --wh1-font-family-heading: 'Muli', sans-serif;
  --wh1-font-size-xs: 0.75rem;
  --wh1-font-size-sm: 0.875rem;
  --wh1-font-size-md: 1rem;
  --wh1-font-size-lg: 1.25rem;
  --wh1-font-size-xl: 1.75rem;
  --wh1-font-size-2xl: 2.4rem;
  --wh1-heading-size-h1: 30px;
  --wh1-heading-size-h2: 24px;
  --wh1-heading-size-h3: 20px;
  --wh1-heading-size-h4: 18px;
  --wh1-heading-size-h5: 16px;
  --wh1-heading-size-h6: 15px;
  --wh1-heading-weight: 400;
  --wh1-heading-line-height: 1.1;
  --wh1-line-height-tight: 1.2;
  --wh1-line-height-base: 1.42857143;
  --wh1-space-2xs: 4px;
  --wh1-space-xs: 8px;
  --wh1-space-sm: 12px;
  --wh1-space-md: 16px;
  --wh1-space-lg: 24px;
  --wh1-space-xl: 32px;
  --wh1-space-2xl: 48px;
  --wh1-container-gutter-x-mobile: 1.625rem;
  --wh1-container-gutter-x-desktop: 3.625rem;
  --wh1-radius-xs: 4px;
  --wh1-radius-sm: 6px;
  --wh1-radius-md: 10px;
  --wh1-radius-card: 25px;
  --wh1-radius-pill: 999px;
  --wh1-border-width: 1px;
  --wh1-border-default: var(--wh1-border-width) solid var(--wh1-color-border);
  --wh1-border-strong: var(--wh1-border-width) solid var(--wh1-color-border-strong);
  --wh1-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.08);
  --wh1-shadow-md: 0 8px 24px rgba(0, 0, 0, 0.12);
  --wh1-focus-ring: 0 0 0 0.2rem rgba(15, 85, 92, 0.24);
}
html {
  overflow-x: clip;
  overflow-y: visible;
}
body {
  --bs-body-font-family: var(--wh1-font-family-base);
  --bs-body-font-size: 14px;
  --bs-body-font-weight: 400;
  --bs-body-line-height: var(--wh1-line-height-base);
  accent-color: var(--wh1-color-primary);
  color: var(--wh1-color-primary);
  font-family: var(--wh1-font-family-base);
  font-size: 14px;
  font-weight: 400;
  line-height: var(--wh1-line-height-base);
  letter-spacing: 0;
  overflow-x: hidden;
  overflow-x: clip;
}
h1,
.h1,
h2,
.h2,
h3,
.h3,
h4,
.h4,
h5,
.h5,
h6,
.h6 {
  color: var(--wh1-color-primary);
  font-family: var(--wh1-font-family-heading);
  font-style: normal;
  font-weight: var(--wh1-heading-weight);
  line-height: var(--wh1-heading-line-height);
  letter-spacing: 0;
}
h1,
.h1 {
  font-size: var(--wh1-heading-size-h1);
}
h2,
.h2 {
  font-size: var(--wh1-heading-size-h2);
}
h3,
.h3 {
  font-size: var(--wh1-heading-size-h3);
}
h4,
.h4 {
  font-size: var(--wh1-heading-size-h4);
}
h5,
.h5 {
  font-size: var(--wh1-heading-size-h5);
}
h6,
.h6 {
  font-size: var(--wh1-heading-size-h6);
}
p,
li,
dt,
dd {
  letter-spacing: 0;
}
#wrapper a:where(:not(.btn)) {
  color: var(--wh1-color-primary);
  font-family: var(--wh1-font-family-base);
  letter-spacing: 0;
  text-decoration: none;
}
#wrapper a:where(:not(.btn)):hover,
#wrapper a:where(:not(.btn)):focus,
#wrapper a:where(:not(.btn)).active {
  color: var(--wh1-color-primary-dark);
  text-decoration: none;
}
#wrapper a:where(:not(.btn)).disabled,
#wrapper a:where(:not(.btn))[aria-disabled="true"] {
  color: var(--wh1-color-muted);
}
#wrapper p a {
  text-decoration: underline;
}
#wrapper p a:hover,
#wrapper p a:focus,
#wrapper p a.active {
  text-decoration: underline;
}
/* ===================================================================
 * #70174 — "Most clickable texts don't look interactive".
 *
 * `#wrapper a:where(:not(.btn))` above paints every text link in the brand teal and removes the
 * underline, and its hover state only darkens the teal by a few percent
 * (#0F555C -> #09393E). At body-copy size that shift is invisible, so nothing on the page
 * announces itself as clickable. Bootstrap `.btn` anchors are deliberately excluded: their
 * variant owns its text colour together with its background in every state.
 *
 * Production says the opposite, and says it globally — read out of the live bundle
 * (`out/wh1-2023/src/css/bundles/default.min.css`):
 *
 *     a         { color: #333; text-decoration: none }
 *     a:hover,
 *     a:focus   { color: #0F555C; text-decoration: underline }
 *
 * i.e. the affordance is the underline plus the colour change on hover/focus, applied to every
 * anchor and opted out of by the components that already read as controls. The same shape is
 * reproduced here: one broad rule, then the opt-outs. Keyboard focus is included deliberately —
 * with the underline gone there was nothing marking the focused link either.
 *
 * The `#wrapper` prefix is required: the resting rule it has to beat is an id selector.
 * =================================================================== */
#wrapper {
  /*
     * Opt-outs: elements that are anchors in markup but controls on screen. Each already carries
     * its own hover treatment (fill, border, image zoom, dropdown underline), and an extra
     * underline on top reads as a defect rather than as an affordance.
     */
}
#wrapper a:where(:not(.btn)):hover,
#wrapper a:where(:not(.btn)):focus-visible {
  color: var(--wh1-color-primary);
  text-decoration: underline;
}
#wrapper a.dropdown-item:hover,
#wrapper a.nav-link:hover,
#wrapper a.navbar-brand:hover,
#wrapper a.page-link:hover,
#wrapper a.kussin-header-logo-link:hover,
#wrapper a.kussin-product-wishlist:hover,
#wrapper a.store-link:hover,
#wrapper a.subcat-tile:hover,
#wrapper a.wh1-cat-hero-link:hover,
#wrapper a.breadcrumb-link:hover,
#wrapper .navbar a:hover,
#wrapper .kussin-omb-dropdown a:hover,
#wrapper .kussin-header-meta-controls a:hover,
#wrapper .kussin-factfinder-record-card a:hover,
#wrapper .kussin-product-carousel a:hover,
#wrapper ff-record a:hover,
#wrapper .card a:hover,
#wrapper .dd-image-box a:hover,
#wrapper .usp-list a:hover,
#wrapper .usp-list-content a:hover,
#wrapper a.dropdown-item:focus-visible,
#wrapper a.nav-link:focus-visible,
#wrapper a.navbar-brand:focus-visible,
#wrapper a.page-link:focus-visible,
#wrapper a.kussin-header-logo-link:focus-visible,
#wrapper a.kussin-product-wishlist:focus-visible,
#wrapper a.store-link:focus-visible,
#wrapper a.subcat-tile:focus-visible,
#wrapper a.wh1-cat-hero-link:focus-visible,
#wrapper a.breadcrumb-link:focus-visible,
#wrapper .navbar a:focus-visible,
#wrapper .kussin-omb-dropdown a:focus-visible,
#wrapper .kussin-header-meta-controls a:focus-visible,
#wrapper .kussin-factfinder-record-card a:focus-visible,
#wrapper .kussin-product-carousel a:focus-visible,
#wrapper ff-record a:focus-visible,
#wrapper .card a:focus-visible,
#wrapper .dd-image-box a:focus-visible,
#wrapper .usp-list a:focus-visible,
#wrapper .usp-list-content a:focus-visible {
  text-decoration: none;
}
/* ===================================================================
 * #70207 — "PDP: Hyperlinks are not underlined".
 *
 * #70174 above gives every link an underline on hover, which answers "does this react when I
 * point at it". It does not answer the question this ticket asks, which is whether a run of text
 * contains a link *at all*: at rest a link is only the brand teal on the brand teal body colour,
 * so a link sitting inside a sentence is invisible until the pointer happens to cross it — and on
 * a touch screen there is no hover at all. The reporter marked three of them on one product page
 * ("(in DE) Mehr Informationen", "Herstellerinformationen anzeigen") and one in the order history
 * ("Widerruf für diese Bestellung einreichen").
 *
 * `#wrapper p a` above already underlines links inside a paragraph, which is why the CMS pages
 * (shipping, payment, right of withdrawal, blog) never showed the defect. The places that did are
 * the ones where the sentence is built out of something other than a `<p>`. Those are listed
 * here, so the underline stays on running text and does not spread to the link lists that only
 * look like text — the brand index at /marken/, the footer columns, the category tiles.
 *
 * Audited on 2026-08-23 across home, category, search, PDP, basket, order history, account,
 * brand index, blog and every legal/service CMS page; the selectors below are every remaining
 * place a visible link sat in running text without a decoration.
 * =================================================================== */
#wrapper {
  /* Product page: the delivery note under the buy button, the manufacturer-information link
       under the brand copy, and the same link as the last row of the specification table. */
  /* A control that happens to sit inside one of the containers above keeps its own look. */
}
#wrapper .kussin-product-delivery-meta a,
#wrapper a.kussin-product-manufacturer-info-link,
#wrapper .kussin-product-attributes td a,
#wrapper a[id^="accOrderLink"],
#wrapper a.tabslw-account-link,
#wrapper .cmsContent li a,
#wrapper .cmsContent span a,
#wrapper .dd-shortcode-text li a,
#wrapper .dd-shortcode-text span a,
#wrapper blockquote a,
#wrapper dd a {
  text-decoration: underline;
}
#wrapper .kussin-product-delivery-meta a:hover,
#wrapper a.kussin-product-manufacturer-info-link:hover,
#wrapper .kussin-product-attributes td a:hover,
#wrapper a[id^="accOrderLink"]:hover,
#wrapper a.tabslw-account-link:hover,
#wrapper .cmsContent li a:hover,
#wrapper .cmsContent span a:hover,
#wrapper .dd-shortcode-text li a:hover,
#wrapper .dd-shortcode-text span a:hover,
#wrapper blockquote a:hover,
#wrapper dd a:hover,
#wrapper .kussin-product-delivery-meta a:focus,
#wrapper a.kussin-product-manufacturer-info-link:focus,
#wrapper .kussin-product-attributes td a:focus,
#wrapper a[id^="accOrderLink"]:focus,
#wrapper a.tabslw-account-link:focus,
#wrapper .cmsContent li a:focus,
#wrapper .cmsContent span a:focus,
#wrapper .dd-shortcode-text li a:focus,
#wrapper .dd-shortcode-text span a:focus,
#wrapper blockquote a:focus,
#wrapper dd a:focus,
#wrapper .kussin-product-delivery-meta a:focus-visible,
#wrapper a.kussin-product-manufacturer-info-link:focus-visible,
#wrapper .kussin-product-attributes td a:focus-visible,
#wrapper a[id^="accOrderLink"]:focus-visible,
#wrapper a.tabslw-account-link:focus-visible,
#wrapper .cmsContent li a:focus-visible,
#wrapper .cmsContent span a:focus-visible,
#wrapper .dd-shortcode-text li a:focus-visible,
#wrapper .dd-shortcode-text span a:focus-visible,
#wrapper blockquote a:focus-visible,
#wrapper dd a:focus-visible,
#wrapper .kussin-product-delivery-meta a.active,
#wrapper a.kussin-product-manufacturer-info-link.active,
#wrapper .kussin-product-attributes td a.active,
#wrapper a[id^="accOrderLink"].active,
#wrapper a.tabslw-account-link.active,
#wrapper .cmsContent li a.active,
#wrapper .cmsContent span a.active,
#wrapper .dd-shortcode-text li a.active,
#wrapper .dd-shortcode-text span a.active,
#wrapper blockquote a.active,
#wrapper dd a.active {
  text-decoration: underline;
}
#wrapper .kussin-product-delivery-meta a.btn,
#wrapper .cmsContent li a.btn,
#wrapper .cmsContent span a.btn,
#wrapper .dd-shortcode-text li a.btn,
#wrapper .dd-shortcode-text span a.btn,
#wrapper blockquote a.btn,
#wrapper dd a.btn,
#wrapper .kussin-product-delivery-meta a.btn:hover,
#wrapper .cmsContent li a.btn:hover,
#wrapper .cmsContent span a.btn:hover,
#wrapper .dd-shortcode-text li a.btn:hover,
#wrapper .dd-shortcode-text span a.btn:hover,
#wrapper blockquote a.btn:hover,
#wrapper dd a.btn:hover,
#wrapper .kussin-product-delivery-meta a.btn:focus,
#wrapper .cmsContent li a.btn:focus,
#wrapper .cmsContent span a.btn:focus,
#wrapper .dd-shortcode-text li a.btn:focus,
#wrapper .dd-shortcode-text span a.btn:focus,
#wrapper blockquote a.btn:focus,
#wrapper dd a.btn:focus,
#wrapper .kussin-product-delivery-meta a.btn:focus-visible,
#wrapper .cmsContent li a.btn:focus-visible,
#wrapper .cmsContent span a.btn:focus-visible,
#wrapper .dd-shortcode-text li a.btn:focus-visible,
#wrapper .dd-shortcode-text span a.btn:focus-visible,
#wrapper blockquote a.btn:focus-visible,
#wrapper dd a.btn:focus-visible {
  text-decoration: none;
}
/* ===================================================================
 * #70177 — "Not readable when selected in profile menu".
 *
 * The account page's "Wo willst du hin?" menu marks the page you are on with Bootstrap's
 * `.dropdown-item.active`. The base stylesheet pairs that with a near-black background
 * (`--bs-dropdown-link-active-bg: var(--wh1-color-black)`) and white text — but the text never
 * turns white, because `#wrapper a.active { color: var(--wh1-color-primary-dark) }` above is an
 * id selector and outranks Bootstrap's class rule. The entry therefore renders #09393E on
 * #0A0A0A: measured contrast 1.2:1, i.e. invisible. (The same tie hides the ticked language in
 * the language switcher.)
 *
 * Production paints the selected entry white on the brand teal
 * (`.dropdown-menu > .active > a { color: #fff; background-color: #0F555C }` in the live
 * bundle) — matched here, at a weight that beats the `#wrapper` rule.
 * =================================================================== */
#wrapper .dropdown-menu .dropdown-item.active,
#wrapper .dropdown-menu .dropdown-item.active:hover,
#wrapper .dropdown-menu .dropdown-item.active:focus {
  color: var(--wh1-color-white);
  background-color: var(--wh1-color-primary);
  text-decoration: none;
}
.ff-record-list-item {
  min-width: 0;
}
.ff-record-list-item .kussin-factfinder-record-card {
  height: auto;
  min-width: 0;
  max-width: 100%;
  overflow: hidden;
  border: var(--wh1-border-width) solid var(--wh1-color-surface-soft);
  border-radius: var(--wh1-radius-md);
}
.ff-record-list-item .kussin-factfinder-record-card .kussin-factfinder-record-image {
  position: relative;
}
.ff-record-list-item .kussin-factfinder-record-card .kussin-factfinder-record-image .badges {
  position: absolute;
  top: var(--wh1-space-sm);
  left: var(--wh1-space-sm);
  z-index: 1;
  display: flex;
  flex-direction: column;
  gap: var(--wh1-space-xs);
}
.ff-record-list-item .kussin-factfinder-record-card .kussin-factfinder-record-image .badges .badge {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 48px;
  height: 48px;
  padding: 0;
  color: var(--wh1-color-white);
  font-size: var(--wh1-font-size-xs);
  font-weight: 700;
  line-height: 1;
  text-align: center;
  border-radius: 50%;
}
.ff-record-list-item .kussin-factfinder-record-card .kussin-factfinder-record-image .badges .badge.badge-new {
  background-color: var(--wh1-color-primary) !important;
}
.ff-record-list-item .kussin-factfinder-record-card .kussin-factfinder-record-image .badges .badge.badge-sale {
  background-color: var(--wh1-color-highlight-red) !important;
}
.ff-record-list-item .kussin-factfinder-record-card .kussin-factfinder-record-brand {
  color: var(--wh1-color-primary);
  font-size: 0.875rem;
  font-weight: 700;
  letter-spacing: normal;
  line-height: 20px;
  text-transform: none;
}
.ff-record-list-item .kussin-factfinder-record-card .kussin-factfinder-record-brand.text-muted {
  color: var(--wh1-color-primary) !important;
}
.ff-record-list-item .kussin-factfinder-record-card .kussin-factfinder-record-title {
  display: -webkit-box;
  overflow: hidden;
  color: var(--wh1-color-primary);
  font-size: var(--wh1-font-size-xs);
  font-style: normal;
  font-weight: 400;
  line-height: 1.42857143;
  min-height: 2.85714286em;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  line-clamp: 2;
  margin-bottom: 0;
}
.ff-record-list-item .kussin-factfinder-record-card .kussin-factfinder-record-reviews {
  display: flex;
  align-items: center;
  min-height: 20px;
  margin-bottom: 0;
}
.ff-record-list-item .kussin-factfinder-record-card .kussin-factfinder-record-review-count {
  line-height: 1.42857143;
}
.ff-record-list-item .kussin-factfinder-record-card .kussin-factfinder-record-title + .kussin-factfinder-record-price {
  margin-top: 20px;
}
.ff-record-list-item .kussin-factfinder-record-card .kussin-factfinder-record-price {
  font-style: normal;
}
.ff-record-list-item .kussin-factfinder-record-card .kussin-factfinder-record-price:not(:has(.basePrice))::before {
  display: block;
  flex: 0 0 100%;
  min-height: 20px;
  content: '';
}
.ff-record-list-item .kussin-factfinder-record-card .kussin-factfinder-record-price .basePrice {
  position: static;
  flex: 0 0 100%;
  min-width: 0;
  min-height: 20px;
  margin: 0;
  overflow: hidden;
  color: var(--wh1-color-muted) !important;
  font-size: var(--wh1-font-size-xs);
  line-height: 1.2;
  text-align: right;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.ff-record-list-item .kussin-factfinder-record-card .kussin-factfinder-record-price .kussin-factfinder-record-current-price,
.ff-record-list-item .kussin-factfinder-record-card .kussin-factfinder-record-price .oldPrice {
  color: var(--wh1-color-primary) !important;
}
.ff-record-list-item .kussin-factfinder-record-card .kussin-factfinder-record-price .oldPrice {
  line-height: 24px;
}
.ff-record-list-item .kussin-factfinder-record-card .kussin-factfinder-record-price .oldPrice del {
  font-size: 0.6875rem;
  font-weight: 400;
  line-height: 24px;
}
.ff-record-list-item .kussin-factfinder-record-card .kussin-factfinder-record-price .kussin-factfinder-record-current-price {
  font-size: 1.375rem;
  font-weight: 700;
}
.ff-record-list-item .kussin-factfinder-record-card .kussin-factfinder-record-price:has(.oldPrice) .kussin-factfinder-record-current-price {
  color: var(--wh1-color-highlight-red) !important;
}
.ff-record-list-item .kussin-factfinder-record-card .kussin-factfinder-record-variants {
  width: 100%;
  min-width: 0;
  margin-top: 10px;
}
.ff-record-list-item .kussin-factfinder-record-card .kussin-factfinder-record-variants ul.sizeselection {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: var(--wh1-space-xs);
  width: 100%;
  max-width: 100%;
  box-sizing: border-box;
  text-align: center;
}
.ff-record-list-item .kussin-factfinder-record-card .kussin-factfinder-record-variants ul.sizeselection li {
  margin: 0;
  color: var(--wh1-color-primary);
  background: var(--wh1-color-white);
  border-color: var(--wh1-color-primary);
  border-radius: var(--wh1-radius-sm);
}
.ff-record-list-item .kussin-factfinder-record-card .kussin-factfinder-record-variants ul.sizeselection li.sold-out {
  color: var(--wh1-color-muted);
  background: var(--wh1-color-surface-soft);
  border-color: var(--wh1-color-border-strong);
}
@media (max-width: 991.98px) {
  .ff-record-list-item {
    display: flex;
    align-self: stretch;
  }
  .ff-record-list-item .kussin-factfinder-record-card {
    display: flex;
    flex: 1 1 auto;
    flex-direction: column;
    width: 100%;
    height: 100%;
    /*
             * APEX absolutely positions product-card prices below lg. FACT
             * Finder variants follow the price in markup, so keep the price in
             * normal flow on touch-sized layouts and anchor the purchase
             * information at the bottom of the stretched card body. The
             * variant list itself stays hidden at this breakpoint.
             */
    /*
             * #70241 — no size list on a touch-sized card.
             *
             * The chips are a hover affordance. WH1-2023 keeps `.actions` at
             * `display: none` and reveals it on `:hover`/`:focus-within`, and
             * below 1200px it hides them outright with `display: none !important`
             * (build/less/kussin/components/factfinder/ff_record.less), so
             * production has never shown a size on a phone.
             *
             * Our own reveal lives in the `(min-width: 992px) and (hover: hover)`
             * block of components/factfinder/list.less. Everything this media
             * query covers fell outside it and kept the element's default, so the
             * chips sat open permanently — the extra row on every phone card.
             */
  }
  .ff-record-list-item .kussin-factfinder-record-card .card-body,
  .ff-record-list-item .kussin-factfinder-record-card .card-body.sale {
    position: relative;
    display: flex;
    flex: 1 1 auto;
    flex-direction: column;
    padding-bottom: 0.625rem;
  }
  .ff-record-list-item .kussin-factfinder-record-card .card-body > .kussin-factfinder-record-price {
    position: static;
    inset: auto;
    align-items: flex-start;
    justify-content: flex-start;
    flex-direction: column;
    margin-top: auto;
    margin-bottom: 0.25rem;
  }
  .ff-record-list-item .kussin-factfinder-record-card .card-body > .kussin-factfinder-record-price:not(:has(.basePrice))::before {
    order: 1;
    flex: 0 0 20px;
    width: 100%;
    min-height: 20px;
  }
  .ff-record-list-item .kussin-factfinder-record-card .card-body > .kussin-factfinder-record-price:not(:has(.oldPrice))::after {
    display: block;
    order: 2;
    flex: 0 0 30px;
    content: '';
  }
  .ff-record-list-item .kussin-factfinder-record-card .card-body > .kussin-factfinder-record-price .basePrice {
    order: 1;
    flex: 0 0 auto;
    width: 100%;
  }
  .ff-record-list-item .kussin-factfinder-record-card .card-body > .kussin-factfinder-record-price .oldPrice {
    order: 2;
    flex: 0 0 30px;
    min-height: 30px;
    margin-bottom: 0;
    text-align: left;
  }
  .ff-record-list-item .kussin-factfinder-record-card .card-body > .kussin-factfinder-record-price .kussin-factfinder-record-current-price {
    order: 3;
    margin-left: 0;
    line-height: 1.4;
    text-align: left;
  }
  .ff-record-list-item .kussin-factfinder-record-card .kussin-factfinder-record-reviews {
    margin-bottom: 10px;
  }
  .ff-record-list-item .kussin-factfinder-record-card .kussin-factfinder-record-variants {
    display: none;
  }
}
/* ===================================================================
 * #70064 — in-category campaign teasers inside the product listing.
 *
 * FACT Finder injects product teasers as ordinary records. `is-teaser` identifies that content
 * type but does not prescribe its grid span: most teasers retain the normal APEX product column,
 * while explicitly full-width campaigns span the row.
 *
 * The rules below are production's own, read out of the inline \3c style> block its OXID 6 theme
 * emits on the category page (they are NOT in any prod stylesheet file, which is why grepping
 * the CSS bundle found nothing). New full-width campaign HTML should provide the Kussin-owned
 * `kussin-factfinder-teaser--full-width` marker. `.slom-slider-neo` remains a compatibility hook
 * for the existing backend-authored Burton campaign only.
 * =================================================================== */
.ff-record-list .ff-record-list-item[is-teaser]:has(.kussin-factfinder-teaser--full-width),
.ff-record-list .ff-record-list-item[is-teaser]:has(.slom-slider-neo),
.ff-record-list .ff-record-list-item[is-teaser]:has(> a > .ff-record-item > .visible-xs > img):has(> a > .ff-record-item > .visible-sm > img):has(> a > .ff-record-item > .visible-md > img):has(> a > .ff-record-item > .visible-lg > img) {
  /* span the whole grid row instead of one product column */
  flex: 0 0 100% !important;
  max-width: 100% !important;
  width: 100% !important;
  /*
     * #70171 (follow-up) — the banner was painted over the size list of the card above it.
     *
     * Production stacks the banner's own two halves with `z-index: 100` on the text panel so the
     * copy sits above the mood photo. Both live in this element, but this element opens no stacking
     * context of its own, so that 100 does not stay inside the banner — it competes with every
     * product card in the listing. A hovered card lifts itself to `z-index: 20`
     * (factfinder/list.less), while the campaign's authored panel could otherwise
     * escape its banner and compete with adjacent product-card content.
     *
     * Opening a stacking context here keeps the 100 where it was meant to apply — between the panel
     * and the photo — while the banner itself sits at 1 among the cards, below the hovered card's
     * 20. Nothing about the banner's own appearance changes.
     */
  position: relative;
  z-index: 1;
}
/*
 * #70391 — a full-row campaign must not strand the products behind it.
 *
 * FACT Finder places these teasers by record position, not by grid geometry. On a long listing
 * that lands on a row boundary (Burton puts them after the 12th and the 25th record, both exact
 * multiples of the four-column row), so the grid stays intact. On a short one it does not: the
 * FLOW brand page has three products and the campaign at position three, so the row broke after
 * two cards, the banner took the next row, and the third product sat alone below it with a hole
 * where its neighbours should have been.
 *
 * Sorting the teaser after the products fixes exactly that, and `:nth-last-child(-n+4)` is what
 * confines it to the case: the teaser only sorts down when fewer records follow it than fill a
 * row, which is the only time the products behind it cannot close that row themselves. A campaign
 * placed mid-listing keeps its position, so FACT Finder's placement still decides where a banner
 * appears in a full catalogue.
 *
 * `order` is the right lever because the record list is a wrapping flex row and the markup comes
 * from FACT Finder's own web component, which the shop does not author.
 */
.ff-record-list > .ff-record-list-item[is-teaser]:has(.kussin-factfinder-teaser--full-width):nth-last-child(-n+4),
.ff-record-list > .ff-record-list-item[is-teaser]:has(.slom-slider-neo):nth-last-child(-n+4),
.ff-record-list > .ff-record-list-item[is-teaser]:has(> a > .ff-record-item > .visible-xs > img):has(> a > .ff-record-item > .visible-sm > img):has(> a > .ff-record-item > .visible-md > img):has(> a > .ff-record-item > .visible-lg > img):nth-last-child(-n+4) {
  order: 1;
}
.ff-record-list .ff-record-list-item[is-teaser]:has(.kussin-factfinder-teaser--full-width) > a,
.ff-record-list .ff-record-list-item[is-teaser]:has(.slom-slider-neo) > a,
.ff-record-list .ff-record-list-item[is-teaser]:has(> a > .ff-record-item > .visible-xs > img):has(> a > .ff-record-item > .visible-sm > img):has(> a > .ff-record-item > .visible-md > img):has(> a > .ff-record-item > .visible-lg > img) > a {
  display: block;
  height: 100%;
  text-decoration: none;
}
/*
 * The older voucher campaign is another full-row teaser, but it does not use the split-panel
 * markup above and its anchor has no stable campaign class. FACT Finder supplies four Bootstrap 3
 * visibility wrappers instead. APEX/Bootstrap 5 no longer implements `visible-xs` through
 * `visible-lg`, so every image was displayed and the 250px banner became a 900px stack inside one
 * product column. The complete four-image structure is the compatibility marker here: it keeps
 * the rule independent of campaign copy, URLs, and the working `.slom-slider-neo` variant.
 */
.ff-record-list .ff-record-list-item[is-teaser] > a > .ff-record-item:has(> .visible-xs > img):has(> .visible-sm > img):has(> .visible-md > img):has(> .visible-lg > img) {
  width: 100%;
  overflow: hidden;
}
.ff-record-list .ff-record-list-item[is-teaser] > a > .ff-record-item:has(> .visible-xs > img):has(> .visible-sm > img):has(> .visible-md > img):has(> .visible-lg > img) > .visible-xs,
.ff-record-list .ff-record-list-item[is-teaser] > a > .ff-record-item:has(> .visible-xs > img):has(> .visible-sm > img):has(> .visible-md > img):has(> .visible-lg > img) > .visible-sm,
.ff-record-list .ff-record-list-item[is-teaser] > a > .ff-record-item:has(> .visible-xs > img):has(> .visible-sm > img):has(> .visible-md > img):has(> .visible-lg > img) > .visible-md,
.ff-record-list .ff-record-list-item[is-teaser] > a > .ff-record-item:has(> .visible-xs > img):has(> .visible-sm > img):has(> .visible-md > img):has(> .visible-lg > img) > .visible-lg {
  display: none;
  width: 100%;
}
.ff-record-list .ff-record-list-item[is-teaser] > a > .ff-record-item:has(> .visible-xs > img):has(> .visible-sm > img):has(> .visible-md > img):has(> .visible-lg > img) > .visible-xs > img,
.ff-record-list .ff-record-list-item[is-teaser] > a > .ff-record-item:has(> .visible-xs > img):has(> .visible-sm > img):has(> .visible-md > img):has(> .visible-lg > img) > .visible-sm > img,
.ff-record-list .ff-record-list-item[is-teaser] > a > .ff-record-item:has(> .visible-xs > img):has(> .visible-sm > img):has(> .visible-md > img):has(> .visible-lg > img) > .visible-md > img,
.ff-record-list .ff-record-list-item[is-teaser] > a > .ff-record-item:has(> .visible-xs > img):has(> .visible-sm > img):has(> .visible-md > img):has(> .visible-lg > img) > .visible-lg > img {
  display: block;
  width: 100%;
  height: auto;
}
@media (max-width: 767.98px) {
  .ff-record-list .ff-record-list-item[is-teaser] > a > .ff-record-item:has(> .visible-xs > img):has(> .visible-sm > img):has(> .visible-md > img):has(> .visible-lg > img) > .visible-xs {
    display: block;
    height: auto;
  }
  .ff-record-list .ff-record-list-item[is-teaser] > a > .ff-record-item:has(> .visible-xs > img):has(> .visible-sm > img):has(> .visible-md > img):has(> .visible-lg > img) > .visible-xs > img {
    width: auto;
    max-width: 100%;
    height: auto;
    margin-inline: auto;
  }
}
@media (min-width: 768px) and (max-width: 991.98px) {
  .ff-record-list .ff-record-list-item[is-teaser] > a > .ff-record-item:has(> .visible-xs > img):has(> .visible-sm > img):has(> .visible-md > img):has(> .visible-lg > img) > .visible-sm {
    display: block;
  }
}
@media (min-width: 992px) and (max-width: 1199.98px) {
  .ff-record-list .ff-record-list-item[is-teaser] > a > .ff-record-item:has(> .visible-xs > img):has(> .visible-sm > img):has(> .visible-md > img):has(> .visible-lg > img) > .visible-md {
    display: block;
  }
}
@media (min-width: 1200px) {
  .ff-record-list .ff-record-list-item[is-teaser] > a > .ff-record-item:has(> .visible-xs > img):has(> .visible-sm > img):has(> .visible-md > img):has(> .visible-lg > img) > .visible-lg {
    display: block;
  }
}
.ff-record-list .ff-record-list-item[is-teaser] .slom-slider-neo {
  position: relative;
  min-height: 250px;
}
.ff-record-list .ff-record-list-item[is-teaser] .slom-slider-neo .slider-content {
  position: absolute;
  z-index: 100;
  top: 0;
  left: 0;
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  justify-content: center;
  width: 50%;
  height: 100%;
  border-radius: 15px 0 0 15px;
}
.ff-record-list .ff-record-list-item[is-teaser] .slom-slider-neo .mood-img-big,
.ff-record-list .ff-record-list-item[is-teaser] .slom-slider-neo img {
  position: absolute;
  right: 5px;
  top: 0;
  width: 50%;
  height: 100%;
  margin-left: auto;
  background-position: bottom right;
  background-size: cover;
  border-radius: 0 15px 15px 0;
  -o-object-fit: cover;
     object-fit: cover;
}
.ff-record-list .ff-record-list-item[is-teaser] .slom-slider-neo .mood-img-small {
  display: none;
}
.ff-record-list .ff-record-list-item[is-teaser] .slom-slider-neo .slider-content-wrapper {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  justify-content: flex-start;
  width: 87%;
  max-width: 452px;
  padding-right: 30px;
}
.ff-record-list .ff-record-list-item[is-teaser] .slom-slider-neo .slider-content-wrapper h2,
.ff-record-list .ff-record-list-item[is-teaser] .slom-slider-neo .slider-content-wrapper h3 {
  margin: 0;
  /*
     * The general migrated-CMS safeguard in pages/cms-content.less restores heading inheritance
     * with `!important`. Production explicitly paints both campaign headings white, so this
     * narrower teaser rule must carry the same weight to keep the authored panel colour from
     * becoming the text colour.
     */
  color: var(--wh1-color-white) !important;
}
.ff-record-list .ff-record-list-item[is-teaser] .slom-slider-neo .slider-content-wrapper h2 {
  font-size: 36px;
  font-weight: 700;
}
.ff-record-list .ff-record-list-item[is-teaser] .slom-slider-neo .slider-content-wrapper h3 {
  font-size: 18px;
}
.ff-record-list .ff-record-list-item[is-teaser] .slom-slider-neo .slider-content-wrapper a {
  margin: 4px 4px 4px 0;
  padding: 8px 12px;
  border: 1px solid var(--wh1-color-white);
  border-radius: 5px;
  color: var(--wh1-color-white);
  text-decoration: none;
  transition: 0.3s;
}
.ff-record-list .ff-record-list-item[is-teaser] .slom-slider-neo .slider-content-wrapper a:hover {
  background-color: var(--wh1-color-white);
  color: var(--wh1-color-primary);
}
/* Phones: production stacks the photo on top and the panel beneath, and swaps in the
   portrait-cropped `mood-img-small`. */
@media (max-width: 768px) {
  .ff-record-list .ff-record-list-item[is-teaser] .slom-slider-neo .slider-content {
    position: relative;
    bottom: 0;
    width: 100%;
    height: auto;
    padding: 30px 0;
    border-radius: 0 0 15px 15px;
  }
  .ff-record-list .ff-record-list-item[is-teaser] .slom-slider-neo .slider-content-wrapper {
    max-width: unset;
  }
  .ff-record-list .ff-record-list-item[is-teaser] .slom-slider-neo .mood-img-big {
    display: none;
  }
  .ff-record-list .ff-record-list-item[is-teaser] .slom-slider-neo .mood-img-small {
    position: relative;
    right: unset;
    left: unset;
    top: unset;
    display: block;
    width: 100%;
    height: 250px;
    background-position: right bottom;
    background-size: cover;
    border-radius: 15px 15px 0 0;
  }
}
/* #70400: CMS landing-page campaigns share listing cards, in a wrapping grid. */
.kussin-factfinder-landingpage {
  display: block;
  min-width: 0;
  max-width: 100%;
}
.kussin-factfinder-landingpage .kussin-factfinder-landingpage-list {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--wh1-space-lg);
  width: 100%;
  margin: 0 0 48px;
  padding: 0;
}
.kussin-factfinder-landingpage .kussin-factfinder-landingpage-list > .ff-record-list-item {
  float: none;
  width: auto;
  min-width: 0;
  max-width: 100%;
  margin: 0;
  padding: 0;
}
@media (min-width: 768px) {
  .kussin-factfinder-landingpage .kussin-factfinder-landingpage-list {
    grid-template-columns: repeat(3, minmax(0, 1fr));
  }
}
@media (min-width: 992px) {
  .kussin-factfinder-landingpage .kussin-factfinder-landingpage-list {
    grid-template-columns: repeat(5, minmax(0, 1fr));
  }
}
/*
 * #70004 — Flash Of Unstyled Content guard for the FACT-Finder web components.
 *
 * Every ff-* element is delivered with an `unresolved` attribute and a Mustache body
 * ({{resultCount}}, {{group.name}}, {{record.Title}}, …). The attribute is only removed once
 * dist/bundle.js has upgraded the custom element, so until then the browser paints the raw
 * template source — the "developer text" the ticket is about.
 *
 * OXID 6 shipped this guard twice (an inline \3c style>[unresolved]{opacity:0}\3c /style> in the head
 * from wmdk_jozuercher #43657, plus views/tpl/factfinder/base/ff_js_polymer.tpl). Neither was
 * carried over when the FACT-Finder templates were migrated to Twig, so OXID 7 had no guard at
 * all. This rule restores it. It lives in the theme stylesheet, which is a render-blocking
 * <link> in <head>, so the guard is in force before the first paint — the flash becomes
 * impossible rather than merely short.
 *
 * opacity (not display/visibility) is deliberate: the elements keep their box, so the page does
 * not reflow when FACT-Finder resolves them.
 *
 * Note this only works because <ff-searchbox>/<ff-searchbutton> no longer carry `unresolved`
 * (see factfinder/search/searchbox.html.twig) — production does not set it there either, and the
 * header search field must stay usable even if the FACT-Finder bundle never loads.
 */
[unresolved] {
  opacity: 0;
}
.kussin-factfinder-search-overlay-wrapper {
  --kussin-factfinder-search-overlay-panel-color: var(--wh1-color-primary);
  --kussin-factfinder-search-overlay-muted-bg: var(--wh1-color-white);
  --kussin-factfinder-search-overlay-border: var(--wh1-color-surface-soft);
}
.kussin-factfinder-search-overlay-wrapper .kussin-factfinder-searchbox-wrapper {
  flex-wrap: nowrap;
  overflow: hidden;
  background: var(--wh1-color-white);
  border: 0;
  border-radius: var(--wh1-radius-md);
  box-shadow: none;
}
.kussin-factfinder-search-overlay-wrapper .kussin-factfinder-searchbox .form-control {
  min-height: 50px;
  padding: 12px 15px;
  color: var(--wh1-color-black);
  font-size: var(--wh1-font-size-md);
  background: var(--wh1-color-white);
  border: var(--wh1-border-width) solid var(--wh1-color-surface-soft);
  border-right-width: 0;
  border-radius: var(--wh1-radius-md) 0 0 var(--wh1-radius-md);
  box-shadow: none;
}
.kussin-factfinder-search-overlay-wrapper .kussin-factfinder-searchbox .form-control:focus {
  color: var(--wh1-color-black);
  background: var(--wh1-color-white);
  border-color: var(--wh1-color-primary);
  border-right-width: 0;
  box-shadow: none;
}
.kussin-factfinder-search-overlay-wrapper .kussin-factfinder-searchbutton {
  flex: 0 0 50px;
}
.kussin-factfinder-search-overlay-wrapper .kussin-factfinder-searchbutton .btn {
  position: static;
  inset: auto;
  z-index: auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 50px;
  min-width: 50px;
  min-height: 50px;
  padding: 14px;
  color: var(--wh1-color-primary);
  background: var(--wh1-color-surface-soft);
  border: var(--wh1-border-width) solid var(--wh1-color-surface-soft);
  border-left-width: 0;
  border-radius: 0 var(--wh1-radius-md) var(--wh1-radius-md) 0;
}
.kussin-factfinder-search-overlay-wrapper .kussin-factfinder-searchbutton .btn:hover,
.kussin-factfinder-search-overlay-wrapper .kussin-factfinder-searchbutton .btn:focus {
  color: var(--wh1-color-white);
  background: var(--wh1-color-primary);
  border-color: var(--wh1-color-primary);
}
.kussin-factfinder-search-overlay-wrapper .kussin-factfinder-searchbutton .btn svg {
  width: 20px;
  height: 20px;
  fill: currentColor;
}
body.kussin-factfinder-search-overlay-active .kussin-factfinder-search-overlay-wrapper::before {
  background: var(--wh1-color-white);
}
body.kussin-factfinder-search-overlay-active .kussin-factfinder-search-overlay-close {
  border: 0;
}
body.kussin-factfinder-search-focus-mode-active .kussin-factfinder-search-overlay-focus-enabled .kussin-factfinder-searchbox .form-control {
  min-height: 50px;
  font-size: var(--wh1-font-size-md);
}
body.kussin-factfinder-search-focus-mode-active .kussin-factfinder-search-overlay-focus-enabled .kussin-factfinder-searchbutton .btn {
  width: 50px;
  min-width: 50px;
  min-height: 50px;
}
.kussin-factfinder-suggest {
  border: 0;
  background: var(--wh1-color-white);
  box-shadow: none;
}
.kussin-factfinder-suggest .ffw-suggestContainer,
.kussin-factfinder-suggest .ffw-listLayout {
  background: var(--wh1-color-white) !important;
}
.kussin-factfinder-suggest a,
.kussin-factfinder-suggest a:hover,
.kussin-factfinder-suggest a:focus,
.kussin-factfinder-suggest ff-suggest-item,
.kussin-factfinder-suggest ff-suggest-item:hover,
.kussin-factfinder-suggest ff-suggest-item:focus,
.kussin-factfinder-suggest li,
.kussin-factfinder-suggest li:hover,
.kussin-factfinder-suggest li:focus {
  text-decoration: none !important;
}
.kussin-factfinder-suggest-section {
  padding: var(--wh1-space-sm);
}
.kussin-factfinder-suggest-terms {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--wh1-space-sm);
  align-items: stretch;
  border-right: 0;
  background: var(--wh1-color-white);
}
.kussin-factfinder-suggest-group {
  min-width: 0;
  overflow: hidden;
  background: var(--wh1-color-white);
  border: var(--wh1-border-width) solid var(--wh1-color-surface-soft);
  border-radius: var(--wh1-radius-md);
}
.kussin-factfinder-suggest-group + .kussin-factfinder-suggest-group {
  margin-top: 0;
}
.kussin-factfinder-suggest-caption {
  margin: 0;
  padding: 10px 15px;
  overflow: hidden;
  color: var(--wh1-color-primary);
  font-size: var(--wh1-font-size-sm);
  font-weight: 400;
  letter-spacing: 0;
  text-overflow: ellipsis;
  text-transform: none;
  white-space: nowrap;
  background: var(--wh1-color-surface-soft);
}
.kussin-factfinder-suggest-group ul {
  padding: 10px 0;
}
.kussin-factfinder-suggest-item li {
  padding: 3px 15px;
  overflow: hidden;
  color: var(--wh1-color-primary);
  border: 0;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.kussin-factfinder-suggest-item li .query {
  font-weight: 700;
}
.kussin-factfinder-suggest-item li:hover,
.kussin-factfinder-suggest-item li:focus {
  color: var(--wh1-color-primary);
  background: var(--wh1-color-surface-soft);
  border: 0;
  outline: 0;
}
.kussin-factfinder-suggest-products {
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: var(--wh1-space-sm);
  align-items: start;
}
.kussin-factfinder-suggest-product {
  min-width: 0;
}
.kussin-factfinder-suggest-product-link {
  position: relative;
  display: flex;
  height: auto;
  min-width: 0;
  overflow: hidden;
  color: var(--wh1-color-primary);
  background: var(--wh1-color-white);
  border: var(--wh1-border-width) solid var(--wh1-color-surface-soft);
  border-radius: var(--wh1-radius-md);
  box-shadow: none;
}
.kussin-factfinder-suggest-product-link:hover,
.kussin-factfinder-suggest-product-link:focus {
  color: var(--wh1-color-primary);
  border-color: var(--wh1-color-surface-soft);
  box-shadow: 0 0 3px rgba(0, 0, 0, 0.2);
  outline: 0;
}
.kussin-factfinder-suggest-product-image {
  position: relative;
  display: block;
  width: 100%;
  min-height: 170px;
  padding: 10px;
}
.kussin-factfinder-suggest-product-image .product-img {
  display: block;
  width: 100%;
  height: 170px;
  min-height: 0;
  -o-object-fit: contain;
     object-fit: contain;
}
.kussin-factfinder-suggest-product-badges {
  position: absolute;
  top: var(--wh1-space-sm);
  left: var(--wh1-space-sm);
  z-index: 1;
  display: flex;
  flex-direction: column;
  gap: var(--wh1-space-xs);
}
.kussin-factfinder-suggest-product-badges .badge {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 48px;
  height: 48px;
  padding: 0;
  color: var(--wh1-color-white);
  font-size: var(--wh1-font-size-xs);
  font-weight: 700;
  line-height: 1;
  text-align: center;
  border-radius: 50%;
}
.kussin-factfinder-suggest-product-badges .badge.badge-new {
  background: var(--wh1-color-primary) !important;
}
.kussin-factfinder-suggest-product-badges .badge.badge-sale {
  background: var(--wh1-color-highlight-red) !important;
}
.kussin-factfinder-suggest-product-body {
  display: flex;
  flex-direction: column;
  width: 100%;
  min-width: 0;
  padding: 10px;
}
.kussin-factfinder-suggest-product-brand {
  min-height: 20px;
  margin-bottom: 0;
  color: var(--wh1-color-primary) !important;
  font-weight: 700;
}
.kussin-factfinder-suggest-product-title {
  display: -webkit-box;
  min-height: 2.8em;
  margin-bottom: 0;
  overflow: hidden;
  color: var(--wh1-color-primary);
  font-size: var(--wh1-font-size-xs);
  font-weight: 400;
  line-height: 1.4;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  line-clamp: 2;
}
.kussin-factfinder-suggest-product-reviews {
  display: flex;
  align-items: flex-end;
  min-height: 20px;
  margin-bottom: 10px;
}
.kussin-factfinder-suggest-product-title + .kussin-factfinder-suggest-product-price {
  margin-top: 30px;
}
.kussin-factfinder-suggest-product-price {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: 0 var(--wh1-space-xs);
  margin-top: 0;
  font-style: normal;
}
.kussin-factfinder-suggest-product-price .oldPrice {
  color: var(--wh1-color-primary) !important;
  font-size: 11px;
}
.kussin-factfinder-suggest-product-price .kussin-factfinder-record-current-price {
  margin-left: auto;
  color: var(--wh1-color-primary) !important;
  font-size: 1.375rem;
  font-weight: 700;
  white-space: nowrap;
}
.kussin-factfinder-suggest-product-price.sale .kussin-factfinder-record-current-price {
  color: var(--wh1-color-highlight-red) !important;
}
.kussin-factfinder-suggest-product-price .basePrice {
  flex: 0 0 100%;
  color: var(--wh1-color-muted) !important;
  font-size: var(--wh1-font-size-xs);
  text-align: right;
}
.kussin-factfinder-suggest-product-variants {
  width: 100%;
  min-width: 0;
  margin-top: var(--wh1-space-md);
}
.kussin-factfinder-suggest-product-variants ul.sizeselection {
  display: block;
  width: 100%;
  max-width: 100%;
  margin: 0;
  padding: 0;
  overflow: hidden;
  text-align: center;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.kussin-factfinder-suggest-product-variants ul.sizeselection li {
  display: inline-block;
  min-width: 35px;
  min-height: 35px;
  margin: 1px;
  padding: 7px;
  color: var(--wh1-color-primary);
  font-size: var(--wh1-font-size-xs);
  line-height: 1.4;
  border: var(--wh1-border-width) solid var(--wh1-color-primary);
  border-radius: var(--wh1-radius-sm);
}
.kussin-factfinder-suggest-product-variants ul.sizeselection li.sold-out {
  color: var(--wh1-color-muted);
  background: var(--wh1-color-surface-soft);
  border-color: var(--wh1-color-border-strong);
}
.kussin-factfinder-suggest-product-link .kussin-factfinder-suggest-product-variants {
  display: none;
}
.kussin-factfinder-suggest-product-link:hover .kussin-factfinder-suggest-product-variants,
.kussin-factfinder-suggest-product-link:focus .kussin-factfinder-suggest-product-variants,
.kussin-factfinder-suggest-product-link:focus-within .kussin-factfinder-suggest-product-variants {
  display: block;
}
@media (min-width: 992px) {
  .kussin-factfinder-suggest .ffw-suggestContainer:not(:has(.kussin-factfinder-suggest-terms li)) {
    grid-template-columns: minmax(0, 1fr) !important;
  }
  .kussin-factfinder-suggest .ffw-suggestContainer:not(:has(.kussin-factfinder-suggest-terms li)) .kussin-factfinder-suggest-terms {
    display: none;
  }
  .kussin-factfinder-suggest .ffw-suggestContainer:not(:has(.kussin-factfinder-suggest-terms li)) .kussin-factfinder-suggest-products {
    width: 100%;
    padding-right: 0;
    padding-left: 0;
  }
}
.kussin-factfinder-suggest-all-results .kussin-factfinder-search-more-button {
  width: min(50%, 520px);
  border-radius: var(--wh1-radius-pill);
}
@media (min-width: 1200px) and (max-width: 1699.98px) {
  .kussin-factfinder-search-overlay-wrapper {
    --kussin-factfinder-search-overlay-horizontal-gap: max(var(--wh1-space-md), calc((100vw - 1140px) / 2));
  }
}
@media (min-width: 1700px) {
  .kussin-factfinder-search-overlay-wrapper {
    --kussin-factfinder-search-overlay-horizontal-gap: max(var(--wh1-space-md), calc((100vw - 1620px) / 2));
  }
}
@media (max-width: 1199.98px) {
  .kussin-factfinder-suggest-product-variants {
    display: none !important;
  }
}
@media (max-width: 991.98px) {
  body.kussin-factfinder-search-overlay-active .kussin-factfinder-search-overlay-trigger {
    visibility: hidden;
  }
  body.kussin-factfinder-search-overlay-active:not(.kussin-factfinder-search-focus-mode-active) .kussin-factfinder-suggest .ffw-suggestContainer,
  body.kussin-factfinder-search-focus-mode-active .kussin-factfinder-suggest .ffw-suggestContainer {
    grid-template-columns: minmax(0, 1fr);
  }
  .kussin-factfinder-suggest-terms {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
  .kussin-factfinder-suggest-products {
    grid-template-columns: minmax(0, 1fr);
  }
}
@media (max-width: 575.98px) {
  .kussin-factfinder-suggest-section {
    padding: var(--wh1-space-xs);
  }
  .kussin-factfinder-suggest-terms,
  .kussin-factfinder-suggest-products {
    gap: var(--wh1-space-xs);
  }
  .kussin-factfinder-suggest-caption,
  .kussin-factfinder-suggest-item li {
    padding-right: 10px;
    padding-left: 10px;
  }
  .kussin-factfinder-suggest-products {
    grid-template-columns: 1fr;
  }
  .kussin-factfinder-suggest-product-link {
    flex-direction: row;
  }
  .kussin-factfinder-suggest-product-image {
    flex: 0 0 38%;
    width: 38%;
    min-height: 130px;
  }
  .kussin-factfinder-suggest-product-image .product-img {
    height: 130px;
  }
  .kussin-factfinder-suggest-product-body {
    flex: 1 1 auto;
  }
  .kussin-factfinder-suggest-all-results .kussin-factfinder-search-more-button {
    width: 100%;
  }
}
.kussin-factfinder-filtercloud {
  border-color: var(--wh1-color-surface-soft);
  border-radius: var(--wh1-radius-md);
}
.kussin-factfinder-filtercloud-items {
  gap: var(--wh1-space-sm);
  padding-top: var(--wh1-space-sm);
}
.kussin-factfinder-filtercloud-item {
  position: relative;
  display: inline-flex;
  align-items: center;
  min-width: 80px;
  margin-top: var(--wh1-space-sm);
  padding: var(--wh1-space-sm) var(--wh1-space-md);
  color: var(--wh1-color-primary);
  background: var(--wh1-color-surface-soft);
  border: var(--wh1-border-width) solid var(--wh1-color-surface-soft);
  border-radius: var(--wh1-radius-md);
}
.kussin-factfinder-filtercloud-item:hover,
.kussin-factfinder-filtercloud-item:focus {
  color: var(--wh1-color-primary);
  border-color: var(--wh1-color-primary);
  text-decoration: none;
}
.kussin-factfinder-filtercloud-group {
  position: absolute;
  top: calc(-1 * var(--wh1-space-sm));
  left: var(--wh1-space-xs);
  max-width: 80px;
  padding: 2px var(--wh1-space-xs);
  overflow: hidden;
  color: var(--wh1-color-primary);
  font-size: var(--wh1-font-size-xs);
  font-weight: 400;
  text-overflow: ellipsis;
  white-space: nowrap;
  background: var(--wh1-color-white);
  border: var(--wh1-border-width) solid var(--wh1-color-surface-soft);
  border-radius: var(--wh1-radius-sm);
}
.kussin-factfinder-filtercloud-name {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.kussin-factfinder-filtercloud-remove {
  flex: 0 0 auto;
  color: var(--wh1-color-primary);
}
.kussin-factfinder-list-toolbar {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: var(--wh1-space-lg);
  margin: var(--wh1-space-lg) 0;
  padding: 0;
  border: 0;
}
.kussin-factfinder-list-heading {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: var(--wh1-space-sm);
  min-width: 0;
}
.kussin-factfinder-list-title {
  margin: 0;
  color: var(--wh1-color-primary);
  font-family: 'Muli', sans-serif;
  font-size: 1.5rem;
  font-style: italic;
  font-weight: 600;
  line-height: 1.1;
}
.kussin-factfinder-list-controls {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: flex-end;
  gap: var(--wh1-space-lg);
}
.kussin-factfinder-list-controls .sort-list > span {
  color: var(--wh1-color-primary) !important;
  font-size: 0.875rem;
  font-weight: 400;
  line-height: 40px;
}
.kussin-factfinder-mobile-asn-actions {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 5px;
  margin-bottom: var(--wh1-space-sm);
}
.kussin-factfinder-mobile-asn-trigger {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--wh1-space-sm);
  min-height: 64px;
  padding: 15px;
  color: var(--wh1-color-primary);
  background: var(--wh1-color-white);
  border: var(--wh1-border-width) solid var(--wh1-color-surface-soft);
  border-radius: 15px;
  font: inherit;
  font-weight: 700;
  text-align: left;
}
.kussin-factfinder-mobile-asn-trigger svg {
  flex: 0 0 25px;
  width: 25px;
  height: 25px;
  fill: currentColor;
}
.kussin-factfinder-mobile-asn-trigger:hover,
.kussin-factfinder-mobile-asn-trigger:focus-visible,
.kussin-factfinder-mobile-asn-trigger[aria-expanded='true'] {
  color: var(--wh1-color-white);
  background: var(--wh1-color-primary);
  border-color: var(--wh1-color-primary);
}
.kussin-factfinder-mobile-asn-trigger:focus-visible {
  outline: 0;
  box-shadow: var(--wh1-focus-ring);
}
.kussin-factfinder-mobile-asn-trigger[hidden] {
  display: none;
}
.kussin-factfinder-record-list ff-record,
.kussin-factfinder-record-card .card-body {
  min-width: 0;
}
@media (min-width: 992px) and (hover: hover) {
  .kussin-factfinder-record-card {
    transition: none;
  }
  .ff-record-list-item {
    position: relative;
  }
  .ff-record-list-item:hover .kussin-factfinder-record-card,
  .ff-record-list-item:focus-within .kussin-factfinder-record-card {
    position: relative;
    z-index: 20;
    box-shadow: 0 8px 18px rgba(15, 85, 92, 0.18);
  }
  .ff-record-list-item:has(.kussin-factfinder-record-variants) .kussin-factfinder-record-variants {
    display: none;
  }
  .ff-record-list-item:has(.kussin-factfinder-record-variants):hover .kussin-factfinder-record-card,
  .ff-record-list-item:has(.kussin-factfinder-record-variants):focus-within .kussin-factfinder-record-card {
    overflow: visible;
    border-bottom-color: transparent;
    border-bottom-right-radius: 0;
    border-bottom-left-radius: 0;
  }
  .ff-record-list-item:has(.kussin-factfinder-record-variants):hover .kussin-factfinder-record-variants,
  .ff-record-list-item:has(.kussin-factfinder-record-variants):focus-within .kussin-factfinder-record-variants {
    display: block;
    position: absolute;
    top: calc(100% - 1px);
    right: -1px;
    left: -1px;
    z-index: 2;
    width: auto;
    margin-top: 0;
    padding: 10px 9px 10px;
    background: var(--wh1-color-white);
    border: var(--wh1-border-width) solid var(--wh1-color-surface-soft);
    border-top: 0;
    border-radius: 0 0 var(--wh1-radius-md) var(--wh1-radius-md);
    box-shadow: 0 12px 18px -8px rgba(15, 85, 92, 0.18);
  }
}
/*
 * #70332 — the size overlay needs room under the last row.
 *
 * The overlay hangs off the bottom of the hovered card and is 49px tall (measured on the hoodies
 * listing, one row of chips). The paging control sat 20px under the grid, so hovering a card in
 * the last row drew the size list straight over the page numbers: the `z-index: 20` above puts the
 * card in front, which is right for the cards around it and wrong for the control below it.
 *
 * Raising the card was never going to fix this — whichever of the two wins, one of them is covered.
 * The gap is what was missing, so the paging control keeps the overlay's height clear of itself.
 * Only where the overlay exists: it is a hover reveal, and the rules above already scope it to a
 * wide viewport with a real pointer. The control carries Bootstrap's `.mt-4`, whose margin is
 * marked important, so nothing but an important of its own can move it.
 */
@media (min-width: 992px) and (hover: hover) {
  .kussin-factfinder-pagination {
    margin-top: 4.5rem !important;
  }
}
/*
 * #70241 — a wide viewport that cannot hover is still a touch device, and the reveal
 * above never fires there. Production draws the same line: below 1200px the size list is
 * hidden outright, above it the list only ever appears under the pointer.
 */
@media (min-width: 992px) and (hover: none) {
  .ff-record-list-item .kussin-factfinder-record-card .kussin-factfinder-record-variants {
    display: none;
  }
}
@media (max-width: 991.98px) {
  .kussin-factfinder-list-toolbar {
    display: block;
    margin: var(--wh1-space-lg) 0 var(--wh1-space-md);
  }
  .kussin-factfinder-list-heading {
    display: block;
    margin-bottom: var(--wh1-space-md);
  }
  .kussin-factfinder-list-title {
    margin-bottom: var(--wh1-space-sm);
    font-size: 1.5rem;
  }
  .kussin-factfinder-list-controls {
    display: block;
  }
  .kussin-factfinder-list-controls .sort-list {
    display: flex;
    flex-wrap: nowrap;
    align-items: center;
    justify-content: space-between;
    gap: var(--wh1-space-md);
    width: 100%;
    margin-top: var(--wh1-space-md);
  }
  .kussin-factfinder-list-controls .sort-list > span {
    flex: 1 1 auto;
    margin-right: 0 !important;
    color: var(--wh1-color-primary) !important;
    font-size: 0.875rem;
    line-height: 40px;
  }
  /*
     * #70009 — the closed sort control sizes to its label, as on production.
     *
     * A fixed `flex-basis: 180px` made the pill 180px wide on a 390px phone while production's is
     * 79px, so the two controls in the toolbar had ragged left edges and the block read as
     * misaligned. `auto` lets it hug the selected value; `max-width` still stops a long label from
     * crowding out "Produkte pro Seite".
     *
     * This is the CLOSED trigger only. The open list keeps its own 180px width from
     * `sort-by.less` (`.ffw-dropdown-container`), which is absolutely positioned and therefore
     * independent — so the #69974 "dropdown too wide on open" fix is untouched.
     */
  .kussin-factfinder-list-controls .kussin-factfinder-sortbox {
    flex: 0 1 auto;
    max-width: 55%;
    min-width: 0;
  }
  .kussin-factfinder-list-controls .kussin-factfinder-sortbox .ffw-selected-container {
    max-width: 100%;
    min-width: 0;
  }
  .kussin-factfinder-list-controls .kussin-factfinder-sortbox .ffw-selected-container ff-sortbox-item {
    max-width: 100%;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }
  .kussin-factfinder-list-controls .kussin-factfinder-products-per-page {
    flex: 0 0 80px;
    min-width: 80px;
  }
  .kussin-factfinder-list-body {
    --bs-gutter-y: 0;
  }
  .kussin-factfinder-asn-column {
    position: static;
    width: 0;
    height: 0;
    margin: 0;
    padding: 0;
  }
}
/* ===================================================================
 * #70171 — "Campagne overlaps with hover sizes".
 *
 * The campaign box at the top of a listing ("Diese Produkte können wir dir empfehlen!") renders
 * its four recommendations as ordinary FactFinder records, so they inherit the listing's hover
 * behaviour and would otherwise reveal their size lists. Inside the campaign box the product
 * options are intentionally absent, matching production.
 *
 * Production suppresses the hover size list inside the campaign box outright. Its rule, read from
 * the live bundle:
 *
 *     body.cl-alist       ff-campaign-pushed-products .ff-record-list .ff-record-list-item:hover .listDetails .actions,
 *     body.cl-search      … , body.cl-manufacturerlist … { display: none !important }
 *
 * Reproduced here against this theme's class names.
 * =================================================================== */
body.cl-alist .kussin-factfinder-campaign-pushed-products .ff-record-list-item:has(.kussin-factfinder-record-variants):hover .kussin-factfinder-record-variants,
body.cl-search .kussin-factfinder-campaign-pushed-products .ff-record-list-item:has(.kussin-factfinder-record-variants):hover .kussin-factfinder-record-variants,
body.cl-manufacturerlist .kussin-factfinder-campaign-pushed-products .ff-record-list-item:has(.kussin-factfinder-record-variants):hover .kussin-factfinder-record-variants,
body.cl-alist .kussin-factfinder-campaign-pushed-products .ff-record-list-item:has(.kussin-factfinder-record-variants):focus-within .kussin-factfinder-record-variants,
body.cl-search .kussin-factfinder-campaign-pushed-products .ff-record-list-item:has(.kussin-factfinder-record-variants):focus-within .kussin-factfinder-record-variants,
body.cl-manufacturerlist .kussin-factfinder-campaign-pushed-products .ff-record-list-item:has(.kussin-factfinder-record-variants):focus-within .kussin-factfinder-record-variants {
  display: none !important;
}
/* ===================================================================
 * #70173 — the listing headline on a brand landing.
 *
 * With the default page header hidden (see `page/list/list.html.twig`), the FactFinder list
 * headline becomes the page's visible title, exactly as on production. Production styles it as an
 * inline-block heading sitting on a hairline rule — measured on the live brand page:
 * `font-size: 24px; font-style: italic; display: inline-block; padding-bottom: 10px;
 * border-bottom: 1px solid rgb(235, 235, 235)`. The theme drew the same text with no rule at all.
 * =================================================================== */
.kussin-factfinder-list-title {
  display: inline-block;
  padding-bottom: 10px;
  border-bottom: 1px solid #ebebeb;
}
/* ===================================================================
 * #70178 — "Stöckli Picture is not styled".
 *
 * CMS blocks placed on a listing by the content injector are emitted into a bare
 * `<div class="cnc-contentinjector">` with no container of any kind, so every row inside them runs
 * the full viewport width. On the STÖCKLI brand page that stretched the "STÖCKLI THE SWISS SKI"
 * teaser from production's 568px to 725px and pushed it flush against the left edge of the window
 * (measured: prod `.dd-shortcode-image.dd-image-box` at x=150 w=568, dev1 at x=-5 w=725).
 *
 * On production the same content sits inside Bootstrap 3's `.container`: 1170 wide with a 15px
 * gutter, centred. Re-create that shell around the injected CMS groups only — the group wrappers
 * are the class-less `<div>` children of `.cnc-contentinjector`; the block content the injector
 * wraps (the list header, the product list) keeps its own `.container-xxl` and is left alone.
 *
 * Same treatment as `#catLongDescLocator` in `pages/category-list.less`, for the same reason.
 *
 * #70233 — scoped to listing pages, which is the page type this was measured and written for.
 * The injector also feeds ~850 product detail pages, and there production does NOT put the
 * injected CMS into a 1170 container: it emits `.container-fluid.dd-ve-container`, measured on
 * /burton/step-on-bindung-2027-black-m.html at 1440 as a 1440-wide shell with a 1445 row, so a
 * `col-sm-4` cell comes out 482 and its box 432. Capping the same wrapper at 1170 here squeezed
 * those cells to 383 and left the pair of boxes stranded in the middle of the row with a 106px
 * gully. Exactly the boundary #70142 draws a few rules down, for the same reason: the injected
 * panels on a detail page were settled separately and must not inherit a listing's shell.
 * =================================================================== */
:where(body.cl-alist, body.cl-manufacturerlist, body.cl-vendorlist, body.cl-search) .cnc-contentinjector > div:not([class]) {
  max-width: 1170px;
  margin-inline: auto;
  padding-inline: 15px;
}
/* ===================================================================
 * #70142 — the content the injector adds to a listing was left unformatted.
 *
 * `kussin/cnc-contentinjector` emits its CMS groups into a bare `<div class="cnc-contentinjector">`,
 * which is neither `.cmsContent` nor `.dd-ve-container` — so the CMS heading normalisation in
 * `pages/cms-content.less` (#70189) never reaches it and the theme's own brand heading style wins.
 * Measured on /en/watersports/lycras/ the "Categories you might also be interested in" heading
 * rendered 28px / 600 / italic / line-height 33.6 against production's 20px / 400 / normal / 22,
 * and because `<b>` resolves `bolder` against its parent the bold runs came out at 900 instead of
 * 700. On /en/snow/snowboard/snowboards/ the h2 was 32px against production's 24px.
 *
 * Same values already measured off warehouse-one.de for `pages/cms-content.less`; only the scope is
 * new. `:where()` keeps specificity at zero so a CMS record's own inline \3c style> still wins, and the
 * selector is the class-less group wrapper — the one #70178 already uses — because the injection
 * point above the list also wraps the theme's own header, whose children are all classed.
 *
 * Scoped to listing pages. The injector also feeds 850 product detail pages, but those panels were
 * already settled under #70189 and this normalisation visibly shrank them (32px/mb 20 -> 24/10), so
 * the rule is kept to the page type the ticket is about: the trailing content on a category,
 * brand, vendor or search listing.
 * =================================================================== */
:where(body.cl-alist, body.cl-manufacturerlist, body.cl-vendorlist, body.cl-search) :where(.cnc-contentinjector > div:not([class])) h1,
:where(body.cl-alist, body.cl-manufacturerlist, body.cl-vendorlist, body.cl-search) :where(.cnc-contentinjector > div:not([class])) h2,
:where(body.cl-alist, body.cl-manufacturerlist, body.cl-vendorlist, body.cl-search) :where(.cnc-contentinjector > div:not([class])) h3,
:where(body.cl-alist, body.cl-manufacturerlist, body.cl-vendorlist, body.cl-search) :where(.cnc-contentinjector > div:not([class])) h4,
:where(body.cl-alist, body.cl-manufacturerlist, body.cl-vendorlist, body.cl-search) :where(.cnc-contentinjector > div:not([class])) h5,
:where(body.cl-alist, body.cl-manufacturerlist, body.cl-vendorlist, body.cl-search) :where(.cnc-contentinjector > div:not([class])) h6 {
  margin-bottom: 10px;
  font-style: normal;
  font-weight: 400;
  line-height: 1.1;
}
:where(body.cl-alist, body.cl-manufacturerlist, body.cl-vendorlist, body.cl-search) :where(.cnc-contentinjector > div:not([class])) h1 {
  margin-top: 20px;
  font-size: 30px;
}
:where(body.cl-alist, body.cl-manufacturerlist, body.cl-vendorlist, body.cl-search) :where(.cnc-contentinjector > div:not([class])) h2 {
  margin-top: 20px;
  font-size: 24px;
}
:where(body.cl-alist, body.cl-manufacturerlist, body.cl-vendorlist, body.cl-search) :where(.cnc-contentinjector > div:not([class])) h3 {
  margin-top: 20px;
  font-size: 20px;
}
:where(body.cl-alist, body.cl-manufacturerlist, body.cl-vendorlist, body.cl-search) :where(.cnc-contentinjector > div:not([class])) h4 {
  margin-top: 10px;
  font-size: 18px;
}
:where(body.cl-alist, body.cl-manufacturerlist, body.cl-vendorlist, body.cl-search) :where(.cnc-contentinjector > div:not([class])) h5,
:where(body.cl-alist, body.cl-manufacturerlist, body.cl-vendorlist, body.cl-search) :where(.cnc-contentinjector > div:not([class])) h6 {
  margin-top: 10px;
}
/* family and colour, as `pages/cms-content.less` does for `.cmsContent` (#70189) */
body.cl-alist .cnc-contentinjector > div:not([class]) h1,
body.cl-manufacturerlist .cnc-contentinjector > div:not([class]) h1,
body.cl-vendorlist .cnc-contentinjector > div:not([class]) h1,
body.cl-search .cnc-contentinjector > div:not([class]) h1,
body.cl-alist .cnc-contentinjector > div:not([class]) h2,
body.cl-manufacturerlist .cnc-contentinjector > div:not([class]) h2,
body.cl-vendorlist .cnc-contentinjector > div:not([class]) h2,
body.cl-search .cnc-contentinjector > div:not([class]) h2,
body.cl-alist .cnc-contentinjector > div:not([class]) h3,
body.cl-manufacturerlist .cnc-contentinjector > div:not([class]) h3,
body.cl-vendorlist .cnc-contentinjector > div:not([class]) h3,
body.cl-search .cnc-contentinjector > div:not([class]) h3,
body.cl-alist .cnc-contentinjector > div:not([class]) h4,
body.cl-manufacturerlist .cnc-contentinjector > div:not([class]) h4,
body.cl-vendorlist .cnc-contentinjector > div:not([class]) h4,
body.cl-search .cnc-contentinjector > div:not([class]) h4,
body.cl-alist .cnc-contentinjector > div:not([class]) h5,
body.cl-manufacturerlist .cnc-contentinjector > div:not([class]) h5,
body.cl-vendorlist .cnc-contentinjector > div:not([class]) h5,
body.cl-search .cnc-contentinjector > div:not([class]) h5,
body.cl-alist .cnc-contentinjector > div:not([class]) h6,
body.cl-manufacturerlist .cnc-contentinjector > div:not([class]) h6,
body.cl-vendorlist .cnc-contentinjector > div:not([class]) h6,
body.cl-search .cnc-contentinjector > div:not([class]) h6 {
  color: var(--wh1-color-primary) !important;
  font-family: var(--wh1-font-family-heading) !important;
}
/* ===================================================================
 * #69732 — "FACT Finder: fix column settings in module settings (they don't apply to frontend)".
 *
 * The module asks for a column count in the backend and renders it as Bootstrap's own row classes
 * — `row-cols-1 row-cols-md-2 row-cols-xl-3` for "1 per row on a phone, 3 on a desktop". Those
 * classes arrive on the container correctly; they simply never take effect, because the APEX
 * stylesheet hard-codes the widths one specificity step higher:
 *
 *     .grid-row .col              { flex: 0 1 50% }
 *     @media (min-width: 768px)   { .grid-row .col { flex: 0 1 33.3333% } }
 *     @media (min-width: 992px)   { .grid-row .col { flex: 0 1 25% } }
 *     @media (min-width: 1200px)  { .grid-row .col { flex: 0 1 20% } }
 *
 * `.grid-row .col` is two classes; Bootstrap's `.row-cols-2 > *` is one. APEX wins everywhere, so
 * the setting was decoration: measured on /skate/inliner/ with the backend set to 3 desktop and 1
 * mobile, the page still painted 5 and 2.
 *
 * Answered at the same weight, for exactly the counts the setting can produce (mobile 1 or 2,
 * desktop 3, 4 or 5), at Bootstrap's own breakpoints. A `.grid-row` that carries no row-cols class
 * is untouched and keeps APEX's ladder.
 * =================================================================== */
/* The setting names two ends — a phone and a desktop — and says nothing about what happens
   between them. So only those two ends are answered here, and the widths APEX steps through at 768
   and 992 are left alone: a tablet keeps its three- and four-across ladder instead of inheriting
   the phone's count. */
@media (max-width: 767.98px) {
  .grid-row.row-cols-1 > .col {
    flex: 0 1 100%;
  }
  .grid-row.row-cols-2 > .col {
    flex: 0 1 50%;
  }
}
@media (min-width: 1200px) {
  .grid-row.row-cols-xl-3 > .col {
    flex: 0 1 33.33333%;
  }
  .grid-row.row-cols-xl-4 > .col {
    flex: 0 1 25%;
  }
  .grid-row.row-cols-xl-5 > .col {
    flex: 0 1 20%;
  }
}
.kussin-factfinder-sortbox {
  position: relative;
}
.kussin-factfinder-sortbox .ffw-selected-container ff-sortbox-item.ffw-selected {
  min-height: 40px;
  padding: 8px 2rem 8px var(--wh1-space-sm);
  color: var(--wh1-color-primary);
  background: var(--wh1-color-surface-soft);
  border-color: var(--wh1-color-surface-soft);
  border-radius: var(--wh1-radius-md);
}
.kussin-factfinder-sortbox:hover .ffw-selected-container ff-sortbox-item.ffw-selected,
.kussin-factfinder-sortbox:focus .ffw-selected-container ff-sortbox-item.ffw-selected,
.kussin-factfinder-sortbox[aria-expanded="true"] .ffw-selected-container ff-sortbox-item.ffw-selected {
  border-color: var(--wh1-color-primary);
}
.kussin-factfinder-sortbox:focus .ffw-selected-container ff-sortbox-item.ffw-selected {
  box-shadow: var(--wh1-focus-ring);
}
.kussin-factfinder-sortbox .ffw-dropdown-container {
  top: calc(100% - var(--wh1-border-width));
  right: 0;
  left: auto;
  width: 180px;
  min-width: 100%;
  max-width: calc(100vw - (2 * var(--wh1-space-md)));
  overflow: hidden !important;
  background: var(--wh1-color-white);
  border: var(--wh1-border-width) solid var(--wh1-color-surface-soft);
  border-radius: var(--wh1-radius-md);
  box-shadow: var(--wh1-shadow-sm);
}
.kussin-factfinder-sortbox .ffw-dropdown-container ff-sortbox-item {
  width: 100%;
  min-height: 40px;
  padding: 8px var(--wh1-space-sm);
  color: var(--wh1-color-primary);
  text-align: left;
  background: var(--wh1-color-white);
  border: 0;
  border-radius: 0;
  overflow-wrap: anywhere;
}
.kussin-factfinder-sortbox .ffw-dropdown-container ff-sortbox-item:hover,
.kussin-factfinder-sortbox .ffw-dropdown-container ff-sortbox-item:focus,
.kussin-factfinder-sortbox .ffw-dropdown-container ff-sortbox-item.selected,
.kussin-factfinder-sortbox .ffw-dropdown-container ff-sortbox-item.ffw-selected {
  color: var(--wh1-color-primary);
  text-decoration: none;
  background: var(--wh1-color-surface-soft);
  border-color: transparent;
}
@media (max-width: 991.98px) {
  .kussin-factfinder-list-controls .kussin-factfinder-sortbox .ffw-selected-container,
  .kussin-factfinder-list-controls .kussin-factfinder-sortbox .ffw-selected-container ff-sortbox-item.ffw-selected,
  .kussin-factfinder-list-controls .kussin-factfinder-sortbox .ffw-dropdown-container {
    width: 100%;
    min-width: 0;
    max-width: 100%;
  }
}
.kussin-factfinder-products-per-page > ff-products-per-page-item.ffw-selected {
  min-height: 40px;
  padding: 8px 2rem 8px var(--wh1-space-sm);
  color: var(--wh1-color-primary);
  background: var(--wh1-color-surface-soft);
  border-color: var(--wh1-color-surface-soft);
  border-radius: var(--wh1-radius-md);
}
.kussin-factfinder-products-per-page:hover > ff-products-per-page-item.ffw-selected,
.kussin-factfinder-products-per-page:focus > ff-products-per-page-item.ffw-selected,
.kussin-factfinder-products-per-page[aria-expanded="true"] > ff-products-per-page-item.ffw-selected {
  border-color: var(--wh1-color-primary);
}
.kussin-factfinder-products-per-page:focus > ff-products-per-page-item.ffw-selected {
  box-shadow: var(--wh1-focus-ring);
}
.kussin-factfinder-products-per-page .ffw-ppp-dropdown-container {
  overflow: hidden;
  background: var(--wh1-color-white);
  border-color: var(--wh1-color-surface-soft);
  border-radius: var(--wh1-radius-md);
  box-shadow: var(--wh1-shadow-sm);
}
.kussin-factfinder-products-per-page .ffw-ppp-dropdown-container ff-products-per-page-item {
  min-height: 40px;
  padding: 8px var(--wh1-space-sm);
  color: var(--wh1-color-primary);
  background: var(--wh1-color-white);
  border-color: var(--wh1-color-surface-soft);
  border-radius: 0;
}
.kussin-factfinder-products-per-page .ffw-ppp-dropdown-container ff-products-per-page-item:hover,
.kussin-factfinder-products-per-page .ffw-ppp-dropdown-container ff-products-per-page-item:focus,
.kussin-factfinder-products-per-page .ffw-ppp-dropdown-container ff-products-per-page-item.selected,
.kussin-factfinder-products-per-page .ffw-ppp-dropdown-container ff-products-per-page-item.ffw-selected {
  color: var(--wh1-color-primary);
  text-decoration: none;
  background: var(--wh1-color-surface-soft);
  border-color: var(--wh1-color-surface-soft);
}
.kussin-factfinder-pagination-nav {
  display: inline-flex;
  align-items: stretch;
  gap: 0;
  margin: 0;
  /* #69981 — the «/‹/›/» cells hold a text glyph, not an icon
     * (`<span aria-hidden="true">«</span>`; the numbered cells hold a bare
     * text node). Guillemets sit on the baseline and are only ~7px of ink
     * against the digits' ~11px, so centring the *line box* leaves the arrow
     * ~3px below the cell centre and ~2px below the digits. Nudge the glyph
     * back onto the optical centre; the value is in `em` so it tracks the
     * font size. Measured on /snow/snowboard/ (1440px): arrow ink centre
     * 43.0px vs cell centre 40.0px vs digit centre 41.0px. */
}
.kussin-factfinder-pagination-nav ff-paging-item {
  min-width: 0 !important;
  margin: 0 !important;
  padding: 0 !important;
  background: transparent !important;
  border: 0 !important;
  border-radius: 0 !important;
  box-shadow: none !important;
}
.kussin-factfinder-pagination-nav ff-paging-item:not(.ffw-hidden) {
  display: inline-flex;
}
.kussin-factfinder-pagination-nav ff-paging-item:not(:first-of-type) .ffw-page-item-container {
  margin-left: -1px !important;
}
.kussin-factfinder-pagination-nav ff-paging-item.ffw-hidden .ffw-page-item-container {
  margin-left: 0 !important;
}
.kussin-factfinder-pagination-nav .ffw-page-item-container {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 44px;
  min-height: 44px;
  margin: 0 !important;
  padding: 10px 16px;
  color: var(--wh1-color-primary);
  background: var(--wh1-color-white);
  border: var(--wh1-border-width) solid var(--wh1-color-primary);
  border-radius: 0;
  box-shadow: none;
}
.kussin-factfinder-pagination-nav ff-paging-item:not(.ffw-hidden):first-of-type .ffw-page-item-container {
  padding-right: 25px;
  padding-left: 25px;
  border-top-left-radius: var(--wh1-radius-pill);
  border-bottom-left-radius: var(--wh1-radius-pill);
}
.kussin-factfinder-pagination-nav ff-paging-item:not(.ffw-hidden):last-of-type .ffw-page-item-container {
  padding-right: 25px;
  padding-left: 25px;
  border-top-right-radius: var(--wh1-radius-pill);
  border-bottom-right-radius: var(--wh1-radius-pill);
}
.kussin-factfinder-pagination-nav .ffw-page-item-container > span {
  transform: translateY(-0.15em);
}
.kussin-factfinder-pagination-nav ff-paging-item.active .ffw-page-item-container,
.kussin-factfinder-pagination-nav ff-paging-item.ffw-selected .ffw-page-item-container {
  position: relative;
  z-index: 2;
  color: var(--wh1-color-primary);
  background: var(--wh1-color-surface-soft);
  border-color: var(--wh1-color-primary);
}
.kussin-factfinder-pagination-nav .ffw-page-item-container:hover,
.kussin-factfinder-pagination-nav .ffw-page-item-container:focus {
  position: relative;
  z-index: 2;
  color: var(--wh1-color-white);
  background: var(--wh1-color-primary);
  border-color: var(--wh1-color-primary);
}
.kussin-factfinder-resultcount {
  color: var(--wh1-color-primary);
  font-size: 1rem;
  font-weight: 200;
  line-height: 33px;
}
@media (max-width: 991.98px) {
  .kussin-factfinder-resultcount {
    font-size: 0.875rem;
    line-height: normal;
  }
}
.cl-manufacturerlist .kussin-factfinder-asn ff-asn-group[for-group="Marke"] {
  display: none;
}
.kussin-factfinder-asn ff-asn-group[for-group="CategoryPathROOT"] .wh1-asn-tooltip {
  display: none;
}
.kussin-factfinder-asn .kussin-factfinder-asn-title {
  display: none;
}
.kussin-factfinder-asn ff-asn ff-asn-group:not([opened]) [data-container="groupCaption"] > div,
.kussin-factfinder-asn ff-asn ff-asn-group-slider:not([opened]) [data-container="groupCaption"] > div,
.kussin-factfinder-asn ff-asn ff-asn-group:not([opened]) .groupCaption[aria-expanded="false"],
.kussin-factfinder-asn ff-asn ff-asn-group-slider:not([opened]) .groupCaption[aria-expanded="false"] {
  margin-bottom: 0;
}
.kussin-factfinder-asn ff-asn ff-asn-group,
.kussin-factfinder-asn ff-asn ff-asn-group-slider {
  border-color: var(--wh1-color-border);
  border-radius: var(--wh1-radius-md);
  box-shadow: none;
}
.kussin-factfinder-asn ff-asn [data-container="groupCaption"] > div,
.kussin-factfinder-asn ff-asn .groupCaption,
.kussin-factfinder-asn ff-asn .ffw-caption,
.kussin-factfinder-asn ff-asn [data-container="caption"] {
  font-size: 1rem;
  font-weight: 700;
  line-height: 1.42857143;
}
.kussin-factfinder-asn ff-asn [data-container="removeFilter"]::before {
  color: currentColor;
}
.kussin-factfinder-asn ff-asn [data-container="showMore"]:hover,
.kussin-factfinder-asn ff-asn [data-container="showLess"]:hover,
.kussin-factfinder-asn ff-asn .wmdk-remove-filter:hover,
.kussin-factfinder-asn ff-asn [data-container="removeFilter"]:hover {
  color: var(--wh1-color-primary);
  text-decoration: none;
}
.kussin-factfinder-asn ff-asn input[type="search"],
.kussin-factfinder-asn ff-asn input[type="text"],
.kussin-factfinder-asn ff-asn input[type="number"],
.kussin-factfinder-asn ff-asn input:not([type]) {
  min-height: 50px;
  padding: 10px;
  color: var(--wh1-color-muted);
  background: var(--wh1-color-white);
  border: var(--wh1-border-width) solid var(--wh1-color-border-strong);
  border-radius: var(--wh1-radius-md);
  box-shadow: none;
}
.kussin-factfinder-asn ff-asn input[type="search"]:focus,
.kussin-factfinder-asn ff-asn input[type="text"]:focus,
.kussin-factfinder-asn ff-asn input[type="number"]:focus,
.kussin-factfinder-asn ff-asn input:not([type]):focus {
  color: var(--wh1-color-muted);
  background: var(--wh1-color-white);
  border-color: var(--wh1-color-primary);
  box-shadow: 0 0 0 0.25rem rgba(15, 85, 92, 0.18);
}
.kussin-factfinder-asn ff-asn ff-asn-group[filter-style="MULTISELECT"]:not(.view-block):not([for-group="Farbe"]):not([for-group="Color"]) ff-asn-group-element .kussin-factfinder-asn-checkbox {
  display: none;
}
.kussin-factfinder-asn ff-asn ff-asn-group[filter-style="MULTISELECT"]:not(.view-block):not([for-group="Farbe"]):not([for-group="Color"]) ff-asn-group-element > .ffw-asn-selected > [slot="selected"]::before,
.kussin-factfinder-asn ff-asn ff-asn-group[filter-style="MULTISELECT"]:not(.view-block):not([for-group="Farbe"]):not([for-group="Color"]) ff-asn-group-element > .ffw-asn-unselected > [slot="unselected"]::before {
  width: 1.2em;
  height: 1.2em;
  border: var(--wh1-border-width) solid var(--wh1-color-border-strong);
  border-radius: var(--wh1-radius-xs);
  box-shadow: none;
}
.kussin-factfinder-asn ff-asn ff-asn-group[filter-style="MULTISELECT"]:not(.view-block):not([for-group="Farbe"]):not([for-group="Color"]) ff-asn-group-element > .ffw-asn-selected > [slot="selected"]::before {
  background-color: var(--wh1-color-surface-soft);
  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%230f555c' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e");
  border-color: var(--wh1-color-primary);
}
.kussin-factfinder-asn ff-asn ff-asn-group[filter-style="MULTISELECT"]:not(.view-block):not([for-group="Farbe"]):not([for-group="Color"]) ff-asn-group-element > .ffw-asn-selected > [slot="selected"]::after {
  display: none;
}
.kussin-factfinder-asn ff-asn .view-block ff-asn-group-element > div {
  border-color: var(--wh1-color-border-strong);
  border-radius: var(--wh1-radius-md);
}
.kussin-factfinder-asn ff-asn .view-block ff-asn-group-element > div:hover,
.kussin-factfinder-asn ff-asn .view-block ff-asn-group-element > div[slot="selected"] {
  border-color: var(--wh1-color-primary);
  background: var(--wh1-color-surface-soft);
}
.kussin-factfinder-asn ff-asn .kussin-factfinder-asn-slider {
  /*
             * #70138 — keep the range track inside the card, in line with everything above it.
             *
             * `ff-slider` is one handle wider than the rest of the group's content: the bundle
             * centres a handle on each end of the track, so half a circle hangs past it on both
             * sides. Measured on the Stoeckli rail, the slider ran 45..364 while the value fields
             * and the scale end labels stopped at 347 and the card itself at 363 — the right-hand
             * handle sat a pixel outside the card. Inset the element by the handle radius so the
             * track shares the left and right edge of the fields above it.
             */
}
.kussin-factfinder-asn ff-asn .kussin-factfinder-asn-slider ff-slider {
  padding: 0 0.5rem;
}
.kussin-factfinder-asn ff-asn .kussin-factfinder-asn-slider .ffw-sliderBar::before {
  background: var(--wh1-color-primary);
}
.kussin-factfinder-asn ff-asn .kussin-factfinder-asn-slider .sliderBtn,
.kussin-factfinder-asn ff-asn .kussin-factfinder-asn-slider [slot="slider1"],
.kussin-factfinder-asn ff-asn .kussin-factfinder-asn-slider [slot="slider2"] {
  background: var(--wh1-color-primary);
  border-color: var(--wh1-color-white);
  box-shadow: 0 0 0 1px var(--wh1-color-primary);
}
.kussin-factfinder-asn ff-asn [for-group="FilterSale"] .kussin-factfinder-toggle {
  position: relative;
  display: inline-block;
  box-sizing: border-box;
  width: 60px;
  height: 30px;
  background: var(--wh1-color-white);
  border: var(--wh1-border-width) solid var(--wh1-color-surface-soft);
  border-radius: var(--wh1-radius-pill);
}
.kussin-factfinder-asn ff-asn [for-group="FilterSale"] .kussin-factfinder-toggle::before {
  position: absolute;
  bottom: 1px;
  left: 2px;
  display: block;
  box-sizing: border-box;
  width: 26px;
  height: 26px;
  margin: 0;
  background: var(--wh1-color-surface-soft);
  border: var(--wh1-border-width) solid var(--wh1-color-surface-soft);
  border-radius: 50%;
  content: "";
  transition: transform 0.4s, background-color 0.4s, border-color 0.4s;
}
.kussin-factfinder-asn ff-asn [for-group="FilterSale"] .kussin-factfinder-toggle.is-selected {
  background: var(--wh1-color-highlight-red-soft);
  border-color: var(--wh1-color-highlight-red);
}
.kussin-factfinder-asn ff-asn [for-group="FilterSale"] .kussin-factfinder-toggle.is-selected::before {
  background: var(--wh1-color-highlight-red);
  border-color: var(--wh1-color-highlight-red);
  transform: translateX(29px);
}
.kussin-factfinder-asn .kussin-factfinder-remove-all-filters {
  color: var(--wh1-color-primary);
}
.kussin-factfinder-asn .kussin-factfinder-remove-all-filters span {
  color: inherit;
}
.kussin-factfinder-asn .kussin-factfinder-remove-all-filters:hover {
  color: var(--wh1-color-highlight-red);
  text-decoration: none;
}
/* ===================================================================
 * #70058 — the explanatory marker beside an ASN filter value.
 *
 * Production renders a Font Awesome info circle and opens a hand-built panel next to it. Neither
 * Font Awesome nor jQuery exists in this theme, so the marker is a real <button> carrying an
 * inline glyph and the panel is a single reused element positioned in script — hover for a mouse,
 * focus or Enter for a keyboard, and `aria-describedby` so a screen reader gets the text too.
 * =================================================================== */
.wh1-asn-tooltip {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 18px;
  height: 18px;
  margin-left: 6px;
  padding: 0;
  border: 0;
  background: none;
  /* Sampled from production: the info-circle is solid dark teal, not the muted grey the rest of
       the ASN uses — it has to read as a marker at 18px against the filter label beside it. */
  color: #0b4247;
  vertical-align: middle;
  cursor: help;
}
.wh1-asn-tooltip svg {
  width: 16px;
  height: 16px;
}
.wh1-asn-tooltip:hover,
.wh1-asn-tooltip:focus-visible {
  color: var(--wh1-color-primary);
}
.wh1-asn-tooltip:focus-visible {
  outline: 2px solid var(--wh1-color-primary);
  outline-offset: 2px;
  border-radius: 50%;
}
/* The popup production builds by hand, reproduced: #e0eff0 panel, primary-coloured 14px text,
   15px/20px padding, 10px radius and a soft drop shadow. The native `title` attribute this
   replaces rendered as an unstyled OS tooltip whose colours cannot be set at all. */
.wh1-asn-tooltip-bubble {
  position: fixed;
  /* Above the mobile filter drawer. `.kussin-factfinder-asn-overlay` is fixed at 1104 and the
       bubble is appended to <body>, so at 1080 it opened *behind* the drawer — present, correctly
       positioned and completely invisible on a phone. 1104 is the highest layer the ASN uses. */
  z-index: 1110;
  max-width: 280px;
  padding: 15px 20px;
  color: var(--wh1-color-primary);
  font-size: 0.875rem;
  line-height: 1.4;
  text-align: left;
  background: var(--wh1-color-surface-soft);
  border-radius: 10px;
  box-shadow: 0 1px 6px rgba(0, 0, 0, 0.35);
  pointer-events: none;
}
.wh1-asn-tooltip-bubble[hidden] {
  display: none;
}
.wh1-asn-tooltip-bubble .wh1-asn-tooltip-caret {
  position: absolute;
  top: -6px;
  width: 0;
  height: 0;
  margin-left: -6px;
  border-right: 6px solid transparent;
  border-bottom: 6px solid var(--wh1-color-surface-soft);
  border-left: 6px solid transparent;
}
.wh1-asn-tooltip-bubble.is-above .wh1-asn-tooltip-caret {
  top: auto;
  bottom: -6px;
  border-top: 6px solid var(--wh1-color-surface-soft);
  border-bottom: 0;
}
/* ===================================================================
 * #70138 / #70187 — the mobile category and filter drawer.
 *
 * Production's drawer (screenshots on #70138) is a full-bleed sheet: no gutter around it, an
 * upright "Filter" title with the live article count underneath, the selected filters as removable
 * chips in their own card, every group collapsed, and a footer with "Alle Filter anzeigen" and
 * "Filter anwenden". Ours sat inset behind a dimmed page, drew an italic title, showed every group
 * expanded, had no count, no chips and no footer — and the close control was an unstyled Bootstrap
 * button whose × sat off-centre (#70187: asymmetric `.btn` padding and a 32px line box).
 *
 * The header/footer furniture is theme-owned; `initFactFinderMobileAsn()` fills the count and
 * borrows the listing's one filter cloud while the drawer is open.
 * =================================================================== */
/*
 * #70279 — that furniture is the drawer's, and above the drawer's own breakpoint it has no
 * business on the page. Every rule below was written inside the `max-width: 991.98px` block, so on
 * a desktop the same markup fell through unstyled: the sidebar printed the drawer's "Filter" title
 * and close cross, and under the filter cloud a bare "Alle Filter anzeigen" and "Filter anwenden"
 * in the browser's own black. Production's desktop column carries neither control, because there
 * is nothing to expand and nothing to apply — the listing reloads on every tick.
 *
 * The cloud slot is emptied rather than hidden as well: the drawer borrows the listing's single
 * `ff-filter-cloud` into it and hands it back on close, and a stale copy left in a desktop sidebar
 * would be a second one.
 */
@media (min-width: 992px) {
  .kussin-factfinder-asn-overlay-header,
  .kussin-factfinder-asn-overlay-footer,
  .kussin-factfinder-asn-overlay-cloud {
    display: none;
  }
}
@media (max-width: 991.98px) {
  /*
     * 4. scroll lock. Overflow-only locks still allow the document viewport to move in some
     * mobile browsers. The controller records the current scroll position before fixing the body,
     * then restores that position when the drawer closes. The dialog body remains independently
     * scrollable below.
     */
  html.kussin-factfinder-asn-overlay-active {
    overflow: hidden;
  }
  /*
     * #70470 — the drawer and its footer buttons sat under the Trusted Shops badge. Trusted Shops
     * pins its badge container inline at `z-index: 2147483647`, the largest value there is, so no
     * stacking of the drawer can pass it. While the drawer is open the badge is hidden instead and
     * comes back with the page underneath (the badge's own stylesheet pins `visibility: visible` on
     * the inner element, so only `display` reaches it); the consent layer is left alone, it has to
     * stay reachable until the visitor answers it.
     */
  body.kussin-factfinder-asn-overlay-active [id^="trustbadge-container-"] {
    display: none !important;
  }
  body.kussin-factfinder-asn-overlay-active {
    position: fixed;
    top: calc(-1 * var(--kussin-factfinder-asn-scroll-y, 0px));
    left: calc(-1 * var(--kussin-factfinder-asn-scroll-x, 0px));
    width: 100%;
    overflow: hidden;
    overscroll-behavior: none;
  }
  /* the one frame in which the groups are being collapsed — see initFactFinderMobileAsn */
  .kussin-factfinder-asn-overlay.is-preparing .kussin-factfinder-asn-overlay-dialog {
    visibility: hidden;
  }
  /*
     * #70138 — collapse the groups without animating them.
     *
     * Opening the drawer closes every group that arrived expanded. Each close is a 0.35s height
     * transition, so the sheet appeared with its groups standing open and then visibly folded
     * themselves away one after another — the layout shift the ticket describes. Suppressing the
     * transition for the duration of that pass makes the collapse instantaneous: the drawer is
     * simply drawn in its settled state, and the groups animate normally from the first real tap.
     */
  .kussin-factfinder-asn-overlay.is-collapsing .ffw-wrapper,
  .kussin-factfinder-asn-overlay.is-collapsing .ffw-asn-group-container {
    transition: none !important;
  }
  /*
     * NB: no `touch-action` here or on the root. An earlier revision set `touch-action: none`
     * on <html> to help the scroll lock — but that suppresses tap gestures inside the drawer as
     * well, so on a real phone the category tree and the group headers stopped responding while
     * a headless mouse click still worked. The fixed-body lock above leaves drawer gestures intact.
     */
  /* 1. full-bleed sheet — the FactFinder module wraps it in a 1rem gutter */
  .kussin-factfinder-asn-overlay {
    padding: 0;
    overscroll-behavior: contain;
  }
  .kussin-factfinder-asn-overlay-dialog {
    border-radius: 0;
  }
  /* 2. upright type, not the theme's italic display face */
  .kussin-factfinder-asn-overlay-header {
    align-items: flex-start;
    padding: 16px;
  }
  .kussin-factfinder-asn-overlay-heading {
    display: grid;
    gap: 2px;
    min-width: 0;
  }
  .kussin-factfinder-asn-overlay-title {
    color: var(--wh1-color-primary);
    font-family: var(--wh1-font-family-base);
    font-size: 1.375rem;
    font-style: normal;
    font-weight: 700;
    line-height: 1.2;
  }
  .kussin-factfinder-asn-overlay-count {
    color: var(--wh1-color-primary);
    font-size: 0.875rem;
    font-weight: 400;
  }
  /* 3. close control: production draws the bare glyph, no box */
  .kussin-factfinder-asn-overlay-close {
    display: flex;
    flex: 0 0 auto;
    align-items: center;
    justify-content: center;
    width: 44px;
    height: 44px;
    padding: 0;
    color: var(--wh1-color-primary);
    background: transparent;
    border: 0;
    /* the glyph is what has to sit in the middle: a 1em line box removes the half-leading
           that pushed it up, and the optical rise of `×` is taken out separately. */
  }
  .kussin-factfinder-asn-overlay-close > span {
    display: block;
    font-size: 34px;
    font-weight: 300;
    line-height: 1;
    transform: translateY(-0.04em);
  }
  .kussin-factfinder-asn-overlay-close:hover,
  .kussin-factfinder-asn-overlay-close:focus-visible {
    color: var(--wh1-color-primary-dark);
    background: transparent;
  }
  /* 5. selected filters as chips, in their own card above the groups */
  .kussin-factfinder-asn-overlay-body {
    display: flex;
    flex: 1 1 auto;
    flex-direction: column;
    min-height: 0;
    overflow: auto;
    overscroll-behavior: contain;
    -webkit-overflow-scrolling: touch;
  }
  .kussin-factfinder-asn-overlay .kussin-factfinder-asn {
    overflow: visible;
  }
  /*
     * The filter cloud already draws its own card (white, 1px border, 16px padding), so the slot
     * that holds it must not draw a second one — that was the double border and double padding.
     * The slot only positions it.
     */
  .kussin-factfinder-asn-overlay-cloud {
    margin: 16px 16px 0;
    padding: 0;
    border: 0;
    /* the cloud renders nothing when no filter is set — collapse the slot with it */
  }
  .kussin-factfinder-asn-overlay-cloud[hidden] {
    display: none;
  }
  .kussin-factfinder-asn-overlay-cloud:not(:has(.kussin-factfinder-filtercloud-item)) {
    display: none;
  }
  .kussin-factfinder-asn-overlay-cloud .kussin-factfinder-filtercloud {
    margin: 0;
  }
  /*
     * #70138 — "tap anywhere in the header should open the accordion".
     *
     * The group draws ~18px of padding around a caption that is only a 16px text line, and the
     * bundle's toggle listens on the caption alone — so two thirds of the header row was dead.
     * Rather than forward the tap in script, give the caption the padding: the header row and the
     * control become the same box, which is also how it reads to a screen reader.
     */
  .kussin-factfinder-asn-overlay .kussin-factfinder-asn-group {
    padding-top: 0;
    padding-bottom: 0;
  }
  .kussin-factfinder-asn-overlay .kussin-factfinder-asn-group > [data-container="groupCaption"] > [slot="groupCaption"],
  .kussin-factfinder-asn-overlay .kussin-factfinder-asn-group > [data-container="groupCaption"] > .groupCaption {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 10px;
    padding: 17.6px 0;
    cursor: pointer;
  }
  /*
     * Every collapsed header is the same height.
     *
     * The FactFinder module gives a group caption `margin: 0 0 .8rem` to separate it from the open
     * panel below. On a CLOSED group that margin is 12.8px of nothing — and it only showed on the
     * two groups whose caption is not the collapsible variant ("Kategorie", the tree, and "Preis",
     * the slider), so those two rows stood 66px tall against 54px for every other filter. Drop the
     * gap while the group is closed; it comes back with the panel.
     */
  .kussin-factfinder-asn-overlay .kussin-factfinder-asn-group:has(.ffw-wrapper:not([opened])) > [data-container="groupCaption"] > div {
    margin-bottom: 0;
  }
  /*
     * An open group closes off with the same space it opens with.
     *
     * The caption carries the group's vertical padding now (so the whole header row is the tap
     * target), which left an OPEN group with no bottom padding at all — the last chip row, or the
     * slider's value fields, sat flush against the card's bottom border while the header above had
     * 17.6px of air. Give the padding back while the panel is open; a closed group keeps the tight
     * 54px row.
     */
  .kussin-factfinder-asn-overlay .kussin-factfinder-asn-group:has(.ffw-wrapper[opened]) {
    padding-bottom: 17.6px;
  }
  /*
     * Range handles sit inside the card.
     *
     * `ff-slider` is deliberately one handle wider than its value fields (#70058) and the bundle
     * centres a handle on the track end, so half of each circle hangs outside the track. In the
     * drawer the group is only 326px wide, so the circles ended up past the content box and read
     * as though they were falling out of the card.
     *
     * This used to be corrected here with a 10px inset on `.ffw-sliderSection`. `ff-slider` now
     * carries the inset itself, for the rail and the drawer alike (see the `ff-slider` rule in the
     * shared block above, added for the same complaint on the desktop rail). Keeping this one as
     * well simply added to it: the drawer's handles sat 26px in from each card edge instead of the
     * ~16px this was tuned for. Removed rather than reduced, so there is one place that decides it.
     */
  /* 6. groups past the fold stay hidden until "Alle Filter anzeigen" */
  .kussin-factfinder-asn-overlay .is-beyond-fold {
    display: none;
  }
  /*
     * #70470 — the "Filter" drawer does not list the category tree.
     *
     * The listing offers two buttons, "Kategorie" and "Filter", and both opened the same drawer:
     * the tree on top, the same filters underneath. The category button is the way to the tree
     * (`initFactFinderMobileAsn()` opens it there), so the filter drawer leaves it out. Keyed on
     * the drawer's mode attribute, which only exists while a drawer is open on a phone, so the
     * desktop rail keeps its tree.
     */
  .kussin-factfinder-asn-overlay[data-kussin-factfinder-active-mode="filters"] .kussin-factfinder-asn ff-asn-group[for-group="CategoryPathROOT"] {
    display: none;
  }
  /*
     * #70470 — and the same drawer does not list the category as a selected filter either: the
     * controller marks the category chips (`is-category`) and a cloud holding nothing else
     * (`is-category-only`), both taken off the page here and nowhere else. The "Kategorie" drawer
     * and the desktop rail keep every chip.
     */
  .kussin-factfinder-asn-overlay[data-kussin-factfinder-active-mode="filters"] .kussin-factfinder-filtercloud-item.is-category,
  .kussin-factfinder-asn-overlay[data-kussin-factfinder-active-mode="filters"] ff-filter-cloud.is-category-only {
    display: none;
  }
  /* 6. footer actions */
  .kussin-factfinder-asn-overlay-footer {
    display: flex;
    flex: 0 0 auto;
    flex-direction: column;
    align-items: center;
    gap: 10px;
    padding: 16px;
    border-top: 1px solid var(--wh1-color-line, #d3e3e2);
    background: var(--wh1-color-white);
  }
  .kussin-factfinder-asn-overlay-more,
  .kussin-factfinder-asn-overlay-apply {
    width: min(260px, 100%);
    border-radius: 30px;
    font-size: 0.875rem;
    font-weight: 400;
    padding: 13px 20px;
  }
  .kussin-factfinder-asn-overlay-more {
    color: var(--wh1-color-primary);
    background: transparent;
    border: 1px solid var(--wh1-color-primary);
  }
  .kussin-factfinder-asn-overlay-more[hidden] {
    display: none;
  }
  .kussin-factfinder-asn-overlay-apply {
    color: var(--wh1-color-white);
    background: var(--wh1-color-primary);
    border: 1px solid var(--wh1-color-primary);
  }
}
/* ===================================================================
 * #70172 — "Stöckli slide levers are not defined".
 *
 * Terrain, Schwung and Speed are rating scales, not measurements. The bundle draws every range
 * facet as two editable number fields plus a bar, so these three offered a "1" and a "5" with
 * nothing to say what either end means — which is exactly what the ticket reports.
 *
 * Production hides the two number fields on these three groups and prints the end of the scale in
 * their place. Its rules, read from the live bundle
 * (`out/wh1-2023/src/css/bundles/product-list.min.css`):
 *
 *     html ff-asn ff-asn-group-slider[for-group="Terrain"] … span input { display: none }
 *     html[lang="de"] … span[data-for="data-control-1"]:before { content: "Piste" }
 *     html[lang="de"] … span[data-for="data-control-2"]:before { content: "Tiefschnee" }
 *
 * Reproduced here for both languages. The English index names the middle group `Swing`, so both
 * spellings are listed. The numbers themselves are untouched — the bundle still reads them, and
 * the slider keeps working; only the fields are taken off the page.
 * =================================================================== */
.kussin-factfinder-asn ff-asn-group-slider[for-group="Terrain"] .ffw-container .ffw-wrapper span input,
.kussin-factfinder-asn ff-asn-group-slider[for-group="Schwung"] .ffw-container .ffw-wrapper span input,
.kussin-factfinder-asn ff-asn-group-slider[for-group="Swing"] .ffw-container .ffw-wrapper span input,
.kussin-factfinder-asn ff-asn-group-slider[for-group="Speed"] .ffw-container .ffw-wrapper span input {
  display: none;
}
.kussin-factfinder-asn ff-asn-group-slider[for-group="Terrain"] .ffw-container .ffw-wrapper span[data-for="data-control-1"]:before,
.kussin-factfinder-asn ff-asn-group-slider[for-group="Schwung"] .ffw-container .ffw-wrapper span[data-for="data-control-1"]:before,
.kussin-factfinder-asn ff-asn-group-slider[for-group="Swing"] .ffw-container .ffw-wrapper span[data-for="data-control-1"]:before,
.kussin-factfinder-asn ff-asn-group-slider[for-group="Speed"] .ffw-container .ffw-wrapper span[data-for="data-control-1"]:before,
.kussin-factfinder-asn ff-asn-group-slider[for-group="Terrain"] .ffw-container .ffw-wrapper span[data-for="data-control-2"]:before,
.kussin-factfinder-asn ff-asn-group-slider[for-group="Schwung"] .ffw-container .ffw-wrapper span[data-for="data-control-2"]:before,
.kussin-factfinder-asn ff-asn-group-slider[for-group="Swing"] .ffw-container .ffw-wrapper span[data-for="data-control-2"]:before,
.kussin-factfinder-asn ff-asn-group-slider[for-group="Speed"] .ffw-container .ffw-wrapper span[data-for="data-control-2"]:before {
  display: block;
  color: var(--wh1-color-primary);
  font-size: 0.875rem;
  line-height: 1.4;
}
.kussin-factfinder-asn ff-asn-group-slider[for-group="Terrain"] .ffw-container .ffw-wrapper span[data-for="data-control-2"]:before,
.kussin-factfinder-asn ff-asn-group-slider[for-group="Schwung"] .ffw-container .ffw-wrapper span[data-for="data-control-2"]:before,
.kussin-factfinder-asn ff-asn-group-slider[for-group="Swing"] .ffw-container .ffw-wrapper span[data-for="data-control-2"]:before,
.kussin-factfinder-asn ff-asn-group-slider[for-group="Speed"] .ffw-container .ffw-wrapper span[data-for="data-control-2"]:before {
  text-align: right;
}
html[lang="de"] .kussin-factfinder-asn ff-asn-group-slider[for-group="Terrain"] .ffw-container .ffw-wrapper span[data-for="data-control-1"]:before {
  content: "Piste";
}
html[lang="de"] .kussin-factfinder-asn ff-asn-group-slider[for-group="Terrain"] .ffw-container .ffw-wrapper span[data-for="data-control-2"]:before {
  content: "Tiefschnee";
}
html[lang="de"] .kussin-factfinder-asn ff-asn-group-slider[for-group="Schwung"] .ffw-container .ffw-wrapper span[data-for="data-control-1"]:before {
  content: "Kurz";
}
html[lang="de"] .kussin-factfinder-asn ff-asn-group-slider[for-group="Schwung"] .ffw-container .ffw-wrapper span[data-for="data-control-2"]:before {
  content: "Lang";
}
html[lang="de"] .kussin-factfinder-asn ff-asn-group-slider[for-group="Speed"] .ffw-container .ffw-wrapper span[data-for="data-control-1"]:before {
  content: "Gem\00FCtlich";
}
html[lang="de"] .kussin-factfinder-asn ff-asn-group-slider[for-group="Speed"] .ffw-container .ffw-wrapper span[data-for="data-control-2"]:before {
  content: "Schnell";
}
html[lang="en"] .kussin-factfinder-asn ff-asn-group-slider[for-group="Terrain"] .ffw-container .ffw-wrapper span[data-for="data-control-1"]:before {
  content: "Slope";
}
html[lang="en"] .kussin-factfinder-asn ff-asn-group-slider[for-group="Terrain"] .ffw-container .ffw-wrapper span[data-for="data-control-2"]:before {
  content: "Deep snow";
}
html[lang="en"] .kussin-factfinder-asn ff-asn-group-slider[for-group="Schwung"] .ffw-container .ffw-wrapper span[data-for="data-control-1"]:before,
html[lang="en"] .kussin-factfinder-asn ff-asn-group-slider[for-group="Swing"] .ffw-container .ffw-wrapper span[data-for="data-control-1"]:before {
  content: "Short";
}
html[lang="en"] .kussin-factfinder-asn ff-asn-group-slider[for-group="Schwung"] .ffw-container .ffw-wrapper span[data-for="data-control-2"]:before,
html[lang="en"] .kussin-factfinder-asn ff-asn-group-slider[for-group="Swing"] .ffw-container .ffw-wrapper span[data-for="data-control-2"]:before {
  content: "Long";
}
html[lang="en"] .kussin-factfinder-asn ff-asn-group-slider[for-group="Speed"] .ffw-container .ffw-wrapper span[data-for="data-control-1"]:before {
  content: "Comfortable";
}
html[lang="en"] .kussin-factfinder-asn ff-asn-group-slider[for-group="Speed"] .ffw-container .ffw-wrapper span[data-for="data-control-2"]:before {
  content: "Fast";
}
.kussin-factfinder-campaign-pushed-products-row {
  margin-top: 5px;
  margin-bottom: var(--wh1-space-lg);
}
.kussin-factfinder-campaign-pushed-products-row .kussin-factfinder-campaign-pushed-products {
  margin: 0;
  padding: 25px 40px;
  background: var(--wh1-color-surface-soft);
  border-radius: 15px;
}
.kussin-factfinder-campaign-pushed-products-row .kussin-factfinder-campaign-pushed-products-header {
  margin-bottom: var(--wh1-space-sm);
}
.kussin-factfinder-campaign-pushed-products-row .kussin-factfinder-campaign-pushed-products.kussin-product-carousel .kussin-product-carousel-title {
  font-size: 1.25rem;
  font-weight: 400;
  line-height: 1.1;
  text-align: left;
}
@media (max-width: 767px) {
  .kussin-factfinder-campaign-pushed-products-row .kussin-factfinder-campaign-pushed-products {
    padding: 25px 30px;
  }
  .kussin-factfinder-campaign-pushed-products-row .kussin-product-carousel .kussin-product-carousel-track {
    padding-inline: 0;
    scroll-padding-inline: 0;
  }
  .kussin-factfinder-campaign-pushed-products-row .kussin-product-carousel .kussin-product-carousel-arrows {
    display: block;
  }
  .kussin-factfinder-campaign-pushed-products-row .kussin-product-carousel .kussin-product-carousel-arrow {
    width: 30px;
    height: 44px;
    background: transparent;
    border: 0;
    border-radius: 0;
    box-shadow: none;
  }
  .kussin-factfinder-campaign-pushed-products-row .kussin-product-carousel .kussin-product-carousel-arrow:not(:disabled) {
    opacity: 1;
  }
  .kussin-factfinder-campaign-pushed-products-row .kussin-product-carousel .kussin-product-carousel-arrow:hover,
  .kussin-factfinder-campaign-pushed-products-row .kussin-product-carousel .kussin-product-carousel-arrow:focus,
  .kussin-factfinder-campaign-pushed-products-row .kussin-product-carousel .kussin-product-carousel-arrow:active {
    color: var(--wh1-color-primary);
    background: transparent;
    box-shadow: none;
  }
  .kussin-factfinder-campaign-pushed-products-row .kussin-product-carousel .kussin-product-carousel-arrow:focus-visible {
    outline: 2px solid var(--wh1-color-primary);
    outline-offset: 2px;
  }
  .kussin-factfinder-campaign-pushed-products-row .kussin-product-carousel .kussin-product-carousel-arrow-previous {
    left: -30px;
  }
  .kussin-factfinder-campaign-pushed-products-row .kussin-product-carousel .kussin-product-carousel-arrow-next {
    right: -30px;
  }
  .kussin-factfinder-campaign-pushed-products-row .kussin-factfinder-campaign-pushed-products.kussin-product-carousel .kussin-product-carousel-title {
    width: 100%;
    margin: 5px 0;
    font-size: 0.875rem;
    line-height: 20px;
    text-align: center;
  }
}
/*
 * #70227 — "the screen freezes when scrolling".
 *
 * The theme declared `scroll-behavior: smooth` on the root element, which does not just animate
 * anchor jumps: it makes *every* programmatic scroll on the document an animation, and while one
 * is running the browser keeps driving the scroll position itself. A wheel or touch scroll that
 * arrives mid-animation is overridden, so the page stops responding for a moment and the visitor
 * has to scroll a second time — measured on /snow/snowboard/snowboard-boots/ at 390: a wheel of
 * 500px issued 60ms into a scroll-to-top landed at 3149 and was then pulled back to 0 by the
 * animation. Production runs the document at `auto` and does not do this.
 *
 * Nothing that wants smooth scrolling loses it: the theme's own call sites ask for it explicitly
 * (`scrollIntoView({ behavior: 'smooth' })` in wh1.js, the ASN "scroll to listing" button), and
 * the carousel and the product gallery set `scroll-behavior` on their own scrollers, not here.
 */
/* Bootstrap's reboot in the apex base stylesheet declares the same thing on `:root` behind a
   `prefers-reduced-motion: no-preference` query, so removing the theme's own rule is not enough —
   it has to be answered at the same specificity, from a sheet that loads after it. */
:root {
  scroll-behavior: auto;
}
/*
 * Keep the APEX grid gutters intact while increasing only the outer inset of
 * the widest WH1 content container. Bootstrap applies half of gutter-x to
 * each side, resulting in 13px below lg and 29px from lg upward.
 */
.container-xxl {
  --bs-gutter-x: var(--wh1-container-gutter-x-mobile);
}
@media (min-width: 992px) {
  .container-xxl {
    --bs-gutter-x: var(--wh1-container-gutter-x-desktop);
  }
}
/* Zero-height scroll target just above the product listing. */
.wh1-products-anchor {
  scroll-margin-top: 20px;
}
/* ===================================================================
 * #70025 — "back to top" control.
 *
 * #70491: keep the production clearance above the desktop trust badge. The old
 * 40px bottom inset put the revealed button behind Trusted Shops on dev1.
 * Phone positioning and dynamic mobile sticky-cart clearance remain independent.
 * =================================================================== */
.wh1-back-to-top {
  position: fixed;
  right: 20px;
  bottom: 254px;
  z-index: 100;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 48px;
  height: 48px;
  padding: 0;
  border: 0;
  border-radius: 50%;
  background: var(--wh1-color-primary);
  color: var(--wh1-color-white);
  cursor: pointer;
  opacity: 0;
  visibility: hidden;
  transition: opacity 0.3s ease;
}
.wh1-back-to-top svg {
  width: 22px;
  height: 22px;
}
.wh1-back-to-top.is-visible {
  opacity: 0.75;
  visibility: visible;
}
.wh1-back-to-top.is-visible:hover,
.wh1-back-to-top.is-visible:focus-visible {
  opacity: 1;
}
.wh1-back-to-top:focus-visible {
  outline: 2px solid var(--wh1-color-primary);
  outline-offset: 3px;
}
/* the off-canvas navigation covers the page — prod hides the control the same way */
body.kussin-omb-oc-open .wh1-back-to-top,
body.kussin-factfinder-asn-overlay-active .wh1-back-to-top {
  display: none;
}
@media (max-width: 649.98px) {
  .wh1-back-to-top {
    right: 15px;
    bottom: 90px;
  }
}
@media (max-width: 991.98px) {
  /*
     * #70201 — the sticky add-to-basket bar sat on top of it.
     *
     * On a phone the bar is fixed to the bottom edge and measures ~113px, while the control sits
     * 90px up and is 48px tall — so the two overlapped completely (measured 48x48) and the arrow
     * was unreachable behind a bar at `z-index: 1035`.
     *
     * `initProductStickyCart()` already publishes the bar's height as `--kussin-sticky-cart-height`
     * and marks the document with `.kussin-sticky-cart-active` while it is mounted, so the control
     * can simply stand on top of it — and it follows the bar when its height changes (a discount
     * label moves into it, the price wraps) instead of being pushed by a guessed constant.
     */
  /*
     * The bar's height is not its full footprint: on a discounted article a discount label is
     * mounted into it `position: absolute; top: -25px`, so it hangs above the bar and outside the
     * bar's own box. The arrow cleared the bar and still sat on the label. `publishMetrics()`
     * measures both and publishes the taller of the two as the clearance; the plain height stays
     * the fallback for anything that has not been re-measured yet.
     */
  html.kussin-sticky-cart-active .wh1-back-to-top,
  html.kussin-sticky-cart-active body.cl-details .wh1-back-to-top {
    bottom: calc(var(--kussin-sticky-cart-clearance, var(--kussin-sticky-cart-height, 0px)) + 15px);
  }
}
@media (prefers-reduced-motion: reduce) {
  .wh1-back-to-top {
    transition: none;
  }
}
.header {
  box-shadow: none;
}
.header .header-container {
  padding-top: 10px;
  padding-bottom: 10px;
}
.header .kussin-header-logo-picture {
  display: block;
}
.header .logo-img {
  display: block;
  width: min(572px, 42vw);
  max-width: none;
  height: auto;
}
.header .kussin-header-control-icon {
  fill: currentColor;
}
.header .search {
  margin-right: 0 !important;
  margin-left: 0 !important;
}
.header .search:focus-within {
  outline: 0;
}
.header .search .input-group {
  flex-wrap: nowrap;
  overflow: hidden;
  background: var(--wh1-color-white);
  border-radius: var(--wh1-radius-md);
}
.header .search .form-control {
  min-width: 0;
  min-height: 50px;
  padding: 12px 15px;
  background: var(--wh1-color-white);
  border: 1px solid var(--wh1-color-surface-soft);
  border-right-width: 0;
  border-radius: var(--wh1-radius-md) 0 0 var(--wh1-radius-md);
  box-shadow: none;
}
.header .search .form-control:focus {
  background: var(--wh1-color-white);
  border-color: var(--wh1-color-primary);
  box-shadow: none;
}
.header .search .btn {
  position: static;
  inset: auto;
  z-index: auto;
  flex: 0 0 50px;
  width: 50px;
  min-height: 50px;
  justify-content: center;
  padding: 14px;
  color: var(--wh1-color-primary);
  background: var(--wh1-color-surface-soft);
  border: 1px solid var(--wh1-color-surface-soft);
  border-left-width: 0;
  border-radius: 0 var(--wh1-radius-md) var(--wh1-radius-md) 0;
}
.header .search .btn:hover,
.header .search .btn:focus {
  color: var(--wh1-color-white);
  background: var(--wh1-color-primary);
  border-color: var(--wh1-color-primary);
}
.header .search .btn svg,
.header .search .btn:hover svg,
.header .search .btn:focus svg {
  width: 20px;
  height: 20px;
  fill: currentColor;
}
@media (min-width: 992px) {
  .header .header-container {
    display: grid;
    grid-template-columns: max-content minmax(360px, 1fr);
    -moz-column-gap: clamp(24px, 3vw, 48px);
         column-gap: clamp(24px, 3vw, 48px);
    align-items: center;
  }
  .header .logo-link {
    justify-self: start;
  }
  .header .search {
    justify-self: stretch;
    width: 100%;
    max-width: none;
  }
  #navigation > .nav-item {
    white-space: nowrap;
    flex: 0 0 auto;
  }
  #navigation > .nav-item > .nav-link {
    white-space: nowrap;
  }
}
@media (max-width: 991.98px) {
  .kussin-omb-bar {
    display: none !important;
  }
  .header[data-kussin-mobile-header] {
    position: relative;
    top: auto;
    z-index: auto;
  }
  .header[data-kussin-mobile-header][data-kussin-mobile-header-fixed="1"] {
    box-shadow: none;
  }
  .header[data-kussin-mobile-header][data-kussin-mobile-header-fixed="1"] > [data-kussin-mobile-header-inner] {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    z-index: 1030;
    box-sizing: border-box;
    width: 100%;
    background: var(--wh1-color-white);
    box-shadow: 0 2px 4px var(--wh1-color-apex-0000004d);
  }
  .header[data-kussin-mobile-header] .mobile-nav {
    position: relative;
    z-index: 20;
    width: 100%;
    height: 50px;
    min-height: 50px;
    overflow: visible;
    color: var(--wh1-color-white);
    background: var(--wh1-color-primary);
    box-shadow: none;
    /* #70423 — since #70313 the account and basket entries arrive inside a
               `.kussin-live-widget` wrapper, the mount point the per-visitor fetch fills, so they
               are no longer direct children of the bar and fell back to Bootstrap's plain `.btn`
               (black on the teal bar, 48x40 instead of a quarter of the row). The wrapper takes
               the cell the control used to take, exactly as `.dropdowns` does for the language
               switch, and the control inside it gets the direct-child rules. */
  }
  .header[data-kussin-mobile-header] .mobile-nav > .btn,
  .header[data-kussin-mobile-header] .mobile-nav > .dropdowns,
  .header[data-kussin-mobile-header] .mobile-nav > .kussin-live-widget {
    flex: 0 0 25%;
    min-width: 0;
    max-width: 25%;
  }
  .header[data-kussin-mobile-header] .mobile-nav > .btn,
  .header[data-kussin-mobile-header] .mobile-nav > .dropdowns > .btn,
  .header[data-kussin-mobile-header] .mobile-nav > .kussin-live-widget > .btn {
    display: flex;
    width: 100%;
    min-height: 50px;
    padding: 8px 12px;
    align-items: center;
    justify-content: center;
    color: var(--wh1-color-white);
    background: transparent;
    border: 0;
    border-radius: 0;
    box-shadow: none;
  }
  .header[data-kussin-mobile-header] .mobile-nav > .btn:hover,
  .header[data-kussin-mobile-header] .mobile-nav > .dropdowns > .btn:hover,
  .header[data-kussin-mobile-header] .mobile-nav > .kussin-live-widget > .btn:hover,
  .header[data-kussin-mobile-header] .mobile-nav > .btn:focus,
  .header[data-kussin-mobile-header] .mobile-nav > .dropdowns > .btn:focus,
  .header[data-kussin-mobile-header] .mobile-nav > .kussin-live-widget > .btn:focus,
  .header[data-kussin-mobile-header] .mobile-nav > .btn.show,
  .header[data-kussin-mobile-header] .mobile-nav > .dropdowns > .btn.show,
  .header[data-kussin-mobile-header] .mobile-nav > .kussin-live-widget > .btn.show {
    color: var(--wh1-color-primary);
    background: var(--wh1-color-surface-soft);
  }
  .header[data-kussin-mobile-header] .mobile-nav svg,
  .header[data-kussin-mobile-header] .mobile-nav .kussin-header-control-icon {
    display: block;
    flex: 0 0 26px;
    width: 26px;
    height: 26px;
    fill: currentColor;
    vertical-align: middle;
  }
  .header[data-kussin-mobile-header] .mobile-nav .btn-text {
    display: none;
  }
  .header[data-kussin-mobile-header] .mobile-nav .btn-minibasket {
    position: relative;
  }
  .header[data-kussin-mobile-header] .mobile-nav .badge {
    position: absolute;
    top: 3px;
    right: calc(50% - 24px);
  }
  .header[data-kussin-mobile-header] .mobile-nav .dropdowns {
    position: relative;
  }
  .header[data-kussin-mobile-header] .mobile-nav .dropdown-menu {
    color: var(--bs-body-color);
  }
  .header[data-kussin-mobile-header] .header-box {
    background: var(--wh1-color-white);
  }
  .header[data-kussin-mobile-header] .header-container {
    display: flex;
    width: 100%;
    padding: 12px 0;
    flex-direction: column;
    gap: 10px;
    align-items: stretch;
    transition: padding 180ms ease, gap 180ms ease;
  }
  .header[data-kussin-mobile-header] .logo-link {
    width: 100%;
    height: auto;
    min-height: 38px;
    padding: 0;
    justify-content: flex-start;
  }
  .header[data-kussin-mobile-header] .kussin-header-logo-picture {
    width: 100%;
    overflow: hidden;
  }
  .header[data-kussin-mobile-header] .logo-img {
    width: 100%;
    max-width: 100%;
    max-height: none;
    aspect-ratio: 1744 / 189.3527;
    -o-object-fit: cover;
       object-fit: cover;
    -o-object-position: left center;
       object-position: left center;
  }
  .header[data-kussin-mobile-header] .search,
  .header[data-kussin-mobile-header] .search:not(.show) {
    position: static;
    display: block;
    width: 100%;
    max-width: none;
    padding: 0;
    background: transparent;
  }
  .header[data-kussin-mobile-header].is-mobile-compact .header-container {
    display: grid;
    grid-template-columns: 46px minmax(0, 1fr);
    gap: 10px;
    padding-top: 8px;
    padding-bottom: 8px;
    align-items: center;
  }
  .header[data-kussin-mobile-header].is-mobile-compact .logo-link {
    width: 46px;
    height: 38px;
    min-height: 38px;
    overflow: hidden;
  }
  .header[data-kussin-mobile-header].is-mobile-compact .kussin-header-logo-picture {
    display: block;
    flex: 0 0 46px;
    width: 46px;
    height: 38px;
    overflow: hidden;
  }
  .header[data-kussin-mobile-header].is-mobile-compact .logo-img {
    display: block;
    width: 46px;
    max-width: none;
    height: 38px;
    max-height: none;
    aspect-ratio: auto;
    -o-object-fit: cover;
       object-fit: cover;
    -o-object-position: left center;
       object-position: left center;
    transform: none;
  }
  .cl-start .header[data-kussin-mobile-header-fixed="1"] > [data-kussin-mobile-header-inner] {
    box-shadow: none;
  }
}
@media (prefers-reduced-motion: reduce) {
  .header[data-kussin-mobile-header] .header-container {
    transition: none;
  }
}
.header-box,
.mobile-nav {
  border-color: rgba(15, 85, 92, 0.18);
}
/* ===================================================================
 * #69984 — the logo in the off-canvas ("desktop mobile") menu.
 *
 * The drawer showed the shop's `sLogoFile`, which is the animated
 * `logo.svg`: 1.6MB of artwork whose viewBox is 22% empty on the left
 * and right. Width-driven sizing made it as wide as its box, but those
 * empty margins meant the wordmark itself still rendered small — the
 * gap the ticket was left with.
 *
 * Production solves exactly this by not using the vector in the drawer
 * at all: it serves `out/wh1-2023/img/wh1_logo.png`, a 3.4kB raster
 * (WebP under a .png name) cropped tight to the wordmark. This does the
 * same with our own artwork, rasterised from `logo-static.svg` and
 * trimmed to its ink box — 461x50, 11.7kB.
 *
 * The header keeps the SVG deliberately: it carries the 2s reveal
 * animation (`<animateTransform>`), which a raster cannot do, and it is
 * the one place the animation is seen. So this does not reduce what the
 * page downloads — the header still fetches the vector — it fixes how
 * large the wordmark reads in the drawer. Dropping the vector site-wide
 * would save ~618kB per session but costs the animation; that is a
 * separate decision, noted in the handover.
 * =================================================================== */
.kussin-omb-oc-logo > img {
  display: none;
}
.kussin-omb-oc-logo::after {
  content: "";
  display: block;
  width: 100%;
  max-width: 292px;
  margin: 0 auto;
  /* the trimmed artwork's own ratio, so it never distorts */
  aspect-ratio: 461 / 50;
  background: url('../../img/logo-drawer.webp') no-repeat center;
  background-size: contain;
}
/* ===================================================================
 * #70322 — the closed off-canvas drawer was shading the left gutter.
 *
 * The drawer (`kussin/oxid-menu-builder`) is `position: fixed; left: 0`
 * and parks itself off screen with `transform: translateX(-100%)`, so
 * while it is closed its right edge sits exactly on x = 0. Its
 * `box-shadow: 2px 0 12px rgba(0,0,0,.2)` is painted all the same, and
 * a 2px offset plus a 12px blur reaches ~14px into the page — the whole
 * mobile gutter. Measured at 390 the left column ran from #E1E1E1 at
 * x = 0 up to #FEFEFE at x = 14 while the right column stayed #FFF, so
 * the 15px on the left read as filled and the 15px on the right read as
 * empty. The blocks themselves are on 15 / 15; the *ink* was not, which
 * is why a `getBoundingClientRect()` sweep called the page symmetric and
 * the eye still saw more air on the right. Same shading in the ticket's
 * own screenshot, over every page that shows the drawer.
 *
 * Carry the shadow on `.open` only, where it is what it is for: lifting
 * the panel off the dimmed page. Fading it with the slide keeps the
 * close from dropping it in one frame.
 * =================================================================== */
.kussin-omb-oc {
  box-shadow: none;
  transition: transform 0.4s ease, box-shadow 0.4s ease;
}
.kussin-omb-oc.open {
  box-shadow: 2px 0 12px rgba(0, 0, 0, 0.2);
}
.kussin-footer {
  padding: 0;
  margin-top: 120px;
  color: var(--wh1-color-primary);
  background: var(--wh1-color-surface-soft);
  border: 0;
}
.kussin-footer .kussin-footer-benefits {
  padding: 30px 0;
  color: var(--wh1-color-white);
  background: var(--wh1-color-primary);
}
.kussin-footer .kussin-footer-benefits-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
  gap: 24px;
  align-items: center;
}
.kussin-footer .kussin-footer-benefit,
.kussin-footer .kussin-footer-install {
  display: flex;
  gap: 12px;
  align-items: center;
  min-width: 0;
  color: inherit;
  font-size: var(--wh1-font-size-md);
  font-weight: 600;
  line-height: 1.35;
}
.kussin-footer .kussin-footer-install {
  width: 100%;
  padding: 0;
  text-align: left;
  background: transparent;
  border: 0;
}
.kussin-footer .kussin-footer-install:hover,
.kussin-footer .kussin-footer-install:focus-visible {
  color: var(--wh1-color-white);
  text-decoration: underline;
}
.kussin-footer .kussin-footer-icon {
  display: block;
  flex: 0 0 30px;
  width: 30px;
  height: 30px;
  background-color: var(--wh1-color-white);
  -webkit-mask-position: center;
          mask-position: center;
  -webkit-mask-repeat: no-repeat;
          mask-repeat: no-repeat;
  -webkit-mask-size: contain;
          mask-size: contain;
}
.kussin-footer .kussin-footer-icon-trusted {
  -webkit-mask-image: url('../../img/footer/benefit-trusted-shops.svg');
          mask-image: url('../../img/footer/benefit-trusted-shops.svg');
}
.kussin-footer .kussin-footer-icon-delivery {
  -webkit-mask-image: url('../../img/footer/benefit-delivery.svg');
          mask-image: url('../../img/footer/benefit-delivery.svg');
}
.kussin-footer .kussin-footer-icon-ssl {
  -webkit-mask-image: url('../../img/footer/benefit-ssl.svg');
          mask-image: url('../../img/footer/benefit-ssl.svg');
}
.kussin-footer .kussin-footer-icon-install {
  -webkit-mask-image: url('../../img/footer/benefit-install-app.svg');
          mask-image: url('../../img/footer/benefit-install-app.svg');
}
.kussin-footer .kussin-footer-main {
  padding-top: 50px;
  padding-bottom: 30px;
}
.kussin-footer .kussin-footer-title {
  width: 100%;
  min-height: 34px;
  padding: 0 0 10px;
  margin: 0 0 14px;
  color: var(--wh1-color-primary);
  font-family: Muli, system-ui, sans-serif;
  font-size: var(--wh1-font-size-sm);
  font-style: normal;
  font-weight: 700;
  line-height: 1.3;
  text-align: left;
  background: transparent;
  border: 0;
  border-bottom: 1px solid var(--wh1-color-primary);
}
.kussin-footer .kussin-footer-title svg {
  width: 16px;
  height: 16px;
  fill: currentColor;
  transition: transform 0.2s ease;
}
.kussin-footer .kussin-footer-title[aria-expanded="true"] svg {
  transform: rotate(180deg);
}
.kussin-footer button.kussin-footer-title {
  display: flex;
  justify-content: space-between;
  align-items: center;
}
.kussin-footer .kussin-footer-content .nav-link {
  padding: 0;
  color: var(--wh1-color-primary);
  font-size: 0.8125rem;
}
.kussin-footer .kussin-footer-content .nav-link + .nav-link {
  margin-top: 5px;
}
.kussin-footer .kussin-footer-content .nav-link:hover,
.kussin-footer .kussin-footer-content .nav-link:focus-visible {
  color: var(--wh1-color-primary-dark);
  text-decoration: underline;
}
.kussin-footer .kussin-footer-checklist {
  display: grid;
  gap: 7px;
  margin: 0;
}
.kussin-footer .kussin-footer-checklist li {
  display: flex;
  gap: 10px;
  align-items: flex-start;
  font-size: 0.8125rem;
  line-height: 1.4;
}
.kussin-footer .kussin-footer-checklist svg {
  flex: 0 0 20px;
  width: 20px;
  height: 20px;
  fill: var(--wh1-color-primary);
}
.kussin-footer .kussin-footer-badges {
  display: flex;
  gap: 12px;
  align-items: flex-start;
}
.kussin-footer .kussin-footer-badges a,
.kussin-footer .kussin-footer-badges img {
  display: block;
}
.kussin-footer .kussin-footer-badges img {
  width: auto;
  max-width: 125px;
  height: 130px;
  -o-object-fit: contain;
     object-fit: contain;
}
.kussin-footer .kussin-footer-commerce {
  padding-top: 42px;
  margin-top: 30px;
}
.kussin-footer .kussin-footer-logo-grid {
  display: grid;
  gap: 10px;
}
.kussin-footer .kussin-footer-payment-grid {
  grid-template-columns: repeat(8, 80px);
}
.kussin-footer .kussin-footer-delivery-grid {
  grid-template-columns: repeat(2, 90px);
}
.kussin-footer .kussin-footer-logo-tile {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 80px;
  height: 60px;
  padding: 7px;
  color: var(--wh1-color-primary);
  text-align: center;
  text-decoration: none;
  background: var(--wh1-color-white);
  border: 1px solid transparent;
  border-radius: 10px;
}
.kussin-footer .kussin-footer-logo-tile:hover,
.kussin-footer .kussin-footer-logo-tile:focus-visible {
  color: var(--wh1-color-primary-dark);
  border-color: var(--wh1-color-primary);
}
.kussin-footer .kussin-footer-logo-tile img {
  display: block;
  width: 100%;
  max-width: 65px;
  height: 45px;
  -o-object-fit: contain;
     object-fit: contain;
}
.kussin-footer .kussin-footer-delivery-grid .kussin-footer-logo-tile {
  width: 90px;
}
.kussin-footer .kussin-footer-carrier-dhl {
  background: var(--wh1-color-brand-dhl);
}
.kussin-footer .kussin-footer-carrier-gls {
  background: var(--wh1-color-brand-gls);
}
.kussin-footer .kussin-footer-logo-tile-text {
  font-size: var(--wh1-font-size-xs);
  font-weight: 700;
  line-height: 1.2;
}
.kussin-footer .kussin-footer-social {
  max-width: 200px;
  margin: 30px auto 0;
  text-align: center;
}
.kussin-footer .kussin-footer-social-title {
  margin-bottom: 12px;
  color: var(--wh1-color-primary);
  font-family: Muli, system-ui, sans-serif;
  font-size: var(--wh1-font-size-lg);
  font-style: normal;
  font-weight: 700;
}
.kussin-footer .kussin-footer-social-links {
  display: flex;
  gap: 18px;
  justify-content: center;
}
.kussin-footer .kussin-footer-social-links a {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  color: var(--wh1-color-primary);
  border: 1px solid transparent;
  border-radius: 50%;
}
.kussin-footer .kussin-footer-social-links a:hover,
.kussin-footer .kussin-footer-social-links a:focus-visible {
  color: var(--wh1-color-primary-dark);
  border-color: var(--wh1-color-primary);
}
.kussin-footer .kussin-footer-social-links .kussin-footer-social-icon {
  display: block;
  width: 30px;
  height: 30px;
  background-color: currentColor;
  -webkit-mask-position: center;
          mask-position: center;
  -webkit-mask-repeat: no-repeat;
          mask-repeat: no-repeat;
  -webkit-mask-size: contain;
          mask-size: contain;
}
.kussin-footer .kussin-footer-social-links .kussin-footer-social-icon-instagram {
  -webkit-mask-image: url('../../img/footer/social-instagram.svg');
          mask-image: url('../../img/footer/social-instagram.svg');
}
.kussin-footer .kussin-footer-social-links .kussin-footer-social-icon-facebook {
  -webkit-mask-image: url('../../img/footer/social-facebook.svg');
          mask-image: url('../../img/footer/social-facebook.svg');
}
.kussin-footer .kussin-footer-vat {
  color: inherit;
}
.kussin-footer .kussin-footer-more {
  padding: 0 0 50px;
  color: var(--wh1-color-primary);
  text-align: center;
  background: var(--wh1-color-surface-soft);
}
.kussin-footer .kussin-footer-slogan {
  font-size: 1.375rem;
  font-weight: 700;
  text-transform: uppercase;
}
.kussin-footer .kussin-footer-legal {
  margin-top: 5px;
  font-size: 0.625rem;
}
.kussin-footer .kussin-footer-legal a {
  color: inherit;
}
.kussin-footer .kussin-footer-legal p {
  display: inline;
  margin: 0;
}
.kussin-footer .kussin-footer-legal .kussin-footer-vat + .kussin-footer-rrp::before {
  content: ' / ';
}
.kussin-footer [data-kussin-pwa-modal] {
  color: var(--wh1-color-black);
  text-align: left;
}
.kussin-footer [data-kussin-pwa-modal] li + li {
  margin-top: 8px;
}
@media (max-width: 1199.98px) {
  .kussin-footer .kussin-footer-payment-grid {
    grid-template-columns: repeat(4, minmax(80px, 1fr));
  }
}
@media (max-width: 991.98px) {
  .kussin-footer {
    margin-top: 72px;
  }
  .kussin-footer .kussin-footer-benefits-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
  .kussin-footer .kussin-footer-section {
    border-bottom: 1px solid var(--wh1-color-border);
  }
  .kussin-footer .kussin-footer-section-badges {
    border-bottom: 0;
  }
  .kussin-footer .kussin-footer-section-badges .kussin-footer-title {
    margin-bottom: 14px;
  }
  .kussin-footer .kussin-footer-section-badges .kussin-footer-content {
    padding-bottom: 8px;
  }
  .kussin-footer .kussin-footer-title {
    margin-bottom: 0;
    font-size: var(--wh1-font-size-md);
    border-bottom: 0;
  }
  .kussin-footer .kussin-footer-content {
    padding-bottom: 18px;
  }
}
@media (max-width: 575.98px) {
  .kussin-footer .kussin-footer-benefits {
    padding: 30px 30px 52px;
  }
  .kussin-footer .kussin-footer-benefits > .container-xl {
    padding-right: 15px;
    padding-left: 15px;
  }
  .kussin-footer .kussin-footer-benefits-grid {
    grid-template-columns: 1fr;
    gap: 20px;
  }
  .kussin-footer .kussin-footer-benefit,
  .kussin-footer .kussin-footer-install {
    gap: 15px;
    font-size: var(--wh1-font-size-sm);
    line-height: 40px;
  }
  .kussin-footer .kussin-footer-icon {
    flex-basis: 40px;
    width: 40px;
    height: 40px;
  }
  .kussin-footer .kussin-footer-main {
    padding-right: 35px;
    padding-left: 35px;
    padding-top: 60px;
  }
  .kussin-footer .kussin-footer-section:not(.kussin-footer-section-badges) {
    margin-bottom: 11px;
  }
  .kussin-footer .kussin-footer-commerce {
    padding-top: 0;
    margin-top: 5px;
  }
  .kussin-footer .kussin-footer-commerce .kussin-footer-title {
    margin-bottom: 6px;
  }
  .kussin-footer .kussin-footer-commerce > section + section {
    margin-top: 27px;
  }
  .kussin-footer .kussin-footer-payment-grid {
    grid-template-columns: repeat(3, minmax(0, 80px));
    gap: 14px;
    width: min(100%, 268px);
  }
  .kussin-footer .kussin-footer-delivery-grid {
    grid-template-columns: repeat(3, minmax(0, 90px));
    gap: 14px;
    width: min(100%, 298px);
  }
  .kussin-footer .kussin-footer-logo-tile,
  .kussin-footer .kussin-footer-delivery-grid .kussin-footer-logo-tile {
    width: 100%;
  }
  .kussin-footer .kussin-footer-social {
    margin-top: 55px;
  }
}
.btn {
  display: inline-flex;
  flex-direction: row;
  gap: var(--wh1-space-xs);
  align-items: center;
  justify-content: center;
  text-align: center;
  text-decoration: none;
}
.btn-primary,
.btn-secondary,
.btn-highlight,
.btn-outline-primary,
.btn-outline-highlight {
  min-height: 44px;
  padding: 16px 40px;
  font-weight: 700;
  line-height: 1.1;
  border-radius: var(--wh1-radius-pill);
}
.btn-sm {
  min-height: 40px;
  padding: 10px 24px;
  font-size: var(--wh1-font-size-sm);
  line-height: 1.2;
  border-radius: var(--wh1-radius-pill);
}
.btn-primary,
.btn-highlight,
.btn-check:checked + .btn,
.btn.show,
.btn:first-child:active,
:not(.btn-check) + .btn:active {
  --bs-btn-bg: var(--wh1-color-primary);
  --bs-btn-border-color: var(--wh1-color-primary);
  --bs-btn-hover-bg: var(--wh1-color-primary-dark);
  --bs-btn-hover-border-color: var(--wh1-color-primary-dark);
  --bs-btn-active-bg: var(--wh1-color-primary-dark);
  --bs-btn-active-border-color: var(--wh1-color-primary-dark);
}
.btn-primary,
.btn-highlight,
.btn-primary:active,
.btn-highlight:active,
.btn-primary:focus,
.btn-highlight:focus,
.btn-primary:hover,
.btn-highlight:hover {
  color: var(--wh1-color-white) !important;
  background-color: var(--wh1-color-primary);
  border-color: var(--wh1-color-primary);
}
.btn-check:checked + .btn {
  color: var(--wh1-color-white) !important;
  background-color: var(--wh1-color-primary);
  border-color: var(--wh1-color-primary);
}
.btn-primary:hover,
.btn-highlight:hover,
.btn-primary:focus,
.btn-highlight:focus,
.btn-primary.active,
.btn-highlight.active {
  background-color: var(--wh1-color-primary-dark);
  border-color: var(--wh1-color-primary-dark);
}
.btn-outline-primary,
.btn-outline-highlight {
  color: var(--wh1-color-primary);
  background-color: var(--wh1-color-white);
  border-color: var(--wh1-color-primary);
}
.btn-outline-primary:hover,
.btn-outline-highlight:hover,
.btn-outline-primary:focus,
.btn-outline-highlight:focus,
.btn-outline-primary.active,
.btn-outline-highlight.active {
  color: var(--wh1-color-white);
  background-color: var(--wh1-color-primary);
  border-color: var(--wh1-color-primary);
}
.btn-secondary {
  color: var(--wh1-color-primary);
  background-color: var(--wh1-color-surface-soft);
  border-color: var(--wh1-color-surface-soft);
}
.btn-light {
  color: var(--wh1-color-primary);
  background-color: var(--wh1-color-white);
  border-color: var(--wh1-color-border-strong);
}
.btn-light:hover,
.btn-light:focus,
.btn-light.active {
  color: var(--wh1-color-white);
  background-color: var(--wh1-color-primary);
  border-color: var(--wh1-color-primary);
}
.btn-link {
  min-height: auto;
  padding-right: 0;
  padding-left: 0;
  color: var(--wh1-color-primary);
  border-radius: 0;
}
.btn.wh1-button-soft {
  min-height: auto;
  padding: 10px;
  font-size: 14px;
  font-weight: 400;
  line-height: 1.42857143;
  border-radius: var(--wh1-radius-md);
}
.btn:disabled,
.btn.disabled {
  opacity: 0.55;
}
.wh1-login-password-group > .input-group-btn > .btn.wh1-button-soft.forgotPasswordOpener {
  border-top-left-radius: 0;
  border-bottom-left-radius: 0;
  border-top-right-radius: var(--wh1-radius-md);
  border-bottom-right-radius: var(--wh1-radius-md);
  font-size: 16px;
  font-weight: 500;
  line-height: 1;
}
.wh1-button-icon {
  display: inline-flex;
  flex: 0 0 auto;
  align-items: center;
  justify-content: center;
  width: 20px;
  height: 20px;
  color: currentColor;
}
.wh1-button-icon svg {
  display: block;
  width: 100%;
  height: 100%;
}
.wh1-button-icon svg,
.wh1-button-icon svg * {
  fill: currentColor;
}
.wh1-button-spinner {
  flex: 0 0 auto;
  width: 20px;
  height: 20px;
  fill: none !important;
  animation: wh1-button-spin 0.8s linear infinite;
}
.wh1-button-spinner-track,
.wh1-button-spinner-indicator {
  fill: none !important;
}
.wh1-button-spinner-track {
  stroke: rgba(255, 255, 255, 0.32);
}
.wh1-button-spinner-indicator {
  stroke: currentColor;
  stroke-linecap: round;
}
.badge,
.page-link.active,
.active > .page-link {
  background-color: var(--wh1-color-primary);
  border-color: var(--wh1-color-primary);
}
@keyframes wh1-button-spin {
  to {
    transform: rotate(360deg);
  }
}
/* ===================================================================
 * #70153 — "Wishlist: cart button icon not visible".
 *
 * The wish-list rows put the "add to basket" control on a `.btn.btn-highlight`: a solid teal
 * button with white text. The base stylesheet gives every button icon the brand teal
 * (`.btn svg { fill: var(--wh1-color-primary) }`) and only exempts `.btn-primary`
 * (`.btn-primary svg { fill: var(--wh1-color-white) }`). `.btn-highlight` sets `color` but never
 * the icon fill, so the cart drew teal-on-teal and the button looked empty — measured
 * `fill: rgb(15, 85, 92)` on `background: rgb(15, 85, 92)`. The trash button beside it was fine
 * because it is a light button.
 *
 * Follow the button's own text colour, which is white in every state `.btn-highlight` defines
 * (see the base stylesheet: `.btn-highlight, .btn-highlight:hover { color: white }`).
 * =================================================================== */
.btn-highlight svg,
.btn-highlight:hover svg,
.btn-highlight:focus svg,
.btn-highlight:focus-visible svg,
.btn-highlight.show svg {
  fill: var(--wh1-color-white);
}
@media (max-width: 991px) {
  .cl-account .form-control,
  .cl-account .form-select {
    font-size: 16px;
  }
}
.form-label,
.form-check-label {
  color: var(--wh1-color-primary);
}
.form-floating > .form-control:not(:-moz-placeholder) ~ label {
  color: var(--wh1-color-muted);
}
.form-floating > label,
.form-floating > .form-control:focus ~ label,
.form-floating > .form-control:not(:placeholder-shown) ~ label,
.form-floating > .form-select ~ label {
  color: var(--wh1-color-muted);
}
.form-floating > .form-control,
.form-floating > .form-select {
  min-height: 58px;
  padding: 20px 10px 8px;
}
.form-floating > .form-control::-moz-placeholder {
  color: transparent;
  opacity: 0;
}
.form-floating > .form-control::placeholder {
  color: transparent;
  opacity: 0;
}
.form-floating > label {
  padding: 15px 10px;
}
.form-control,
.form-select {
  min-height: 50px;
  padding: 10px;
  color: var(--wh1-color-muted);
  background-color: var(--wh1-color-white);
  border: var(--wh1-border-width) solid var(--wh1-color-surface-soft);
  border-radius: var(--wh1-radius-md);
  box-shadow: none;
}
.form-control:focus,
.form-select:focus {
  color: var(--wh1-color-muted);
  background-color: var(--wh1-color-white);
  border-color: var(--wh1-color-primary);
  box-shadow: 0 0 0 0.25rem rgba(15, 85, 92, 0.18);
  outline: 0;
}
.form-control:disabled,
.form-select:disabled {
  color: var(--wh1-color-muted);
  background-color: var(--wh1-color-apex-f8f9fa);
  border-color: var(--wh1-color-surface-soft);
  opacity: 1;
}
.form-control.is-valid,
.form-select.is-valid {
  border-color: var(--wh1-color-success-apex);
}
.form-control.is-valid:focus,
.form-select.is-valid:focus {
  box-shadow: 0 0 0 0.25rem rgba(110, 177, 86, 0.24);
}
.form-control.is-invalid,
.form-select.is-invalid {
  border-color: var(--wh1-color-error);
}
.form-control.is-invalid:focus,
.form-select.is-invalid:focus {
  box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.24);
}
.form-control::-moz-placeholder {
  color: var(--wh1-color-muted);
  opacity: 1;
}
.form-control::placeholder {
  color: var(--wh1-color-muted);
  opacity: 1;
}
.form-control.is-invalid,
.form-control.is-invalid:focus {
  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");
}
.form-control.is-valid,
.form-control.is-valid:focus {
  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%236eb156' d='M2.3 6.73.6 4.53c-.4-.52-.04-1.27.62-1.27.23 0 .45.1.6.28l.86 1.11 2.83-3.54A.78.78 0 0 1 6.12.82c.66 0 1.02.75.62 1.27L3.53 6.73c-.31.4-.92.4-1.23 0z'/%3e%3c/svg%3e");
}
.form-select.is-invalid:not([multiple]):not([size]),
.form-select.is-invalid:not([multiple])[size="1"],
.form-select.is-invalid:not([multiple]):not([size]):focus,
.form-select.is-invalid:not([multiple])[size="1"]:focus {
  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%230a0a0a' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"), url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");
}
.form-select.is-valid:not([multiple]):not([size]),
.form-select.is-valid:not([multiple])[size="1"],
.form-select.is-valid:not([multiple]):not([size]):focus,
.form-select.is-valid:not([multiple])[size="1"]:focus {
  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%230a0a0a' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"), url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%236eb156' d='M2.3 6.73.6 4.53c-.4-.52-.04-1.27.62-1.27.23 0 .45.1.6.28l.86 1.11 2.83-3.54A.78.78 0 0 1 6.12.82c.66 0 1.02.75.62 1.27L3.53 6.73c-.31.4-.92.4-1.23 0z'/%3e%3c/svg%3e");
}
.form-check {
  display: flex;
  gap: var(--wh1-space-xs);
  align-items: center;
}
.form-check-input {
  width: 1.2em;
  height: 1.2em;
  margin-top: 0;
  border: var(--wh1-border-width) solid var(--wh1-color-border-strong);
  box-shadow: none;
}
.form-check-input[type="checkbox"] {
  border-radius: var(--wh1-radius-xs);
}
.form-check-input:focus {
  border-color: var(--wh1-color-primary);
  box-shadow: 0 0 0 0.2rem rgba(15, 85, 92, 0.18);
}
.form-check-input:checked {
  background-color: var(--wh1-color-surface-soft);
  border-color: var(--wh1-color-primary);
}
.form-check-input:checked[type="checkbox"] {
  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%230f555c' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e");
}
.form-check-input:checked[type="radio"] {
  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%230f555c'/%3e%3c/svg%3e");
}
/* #70292 — the account form marks a required field the way the checkout does, with a bold label,
   so the note under it ("fill in the fields marked in bold") is true on both pages. */
.cl-register .form-floating > label.req {
  font-weight: 700;
}
/* #70292, review — and like the checkout it hangs no asterisk on it; the bold label is the mark. */
.cl-register .form-floating > label.req::after {
  content: "";
}
textarea.form-control {
  min-height: 112px;
}
.valid-feedback {
  color: var(--wh1-color-success-apex);
}
.invalid-feedback {
  color: var(--wh1-color-error);
}
/* #70051 — APEX marks the *wrapper* (`.form-floating.is-invalid`, see
 * `form/fieldset/user_billing.html.twig`) instead of the control itself, so the
 * error colour comes from the descendant rule `.is-invalid .form-control`.
 * That ties on specificity with this file's `.form-control:focus` and loses on
 * source order, which turned a focused invalid field teal. Keep it red. */
.is-invalid .form-control:focus,
.is-invalid .form-select:focus {
  border-color: var(--wh1-color-error);
  box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.24);
}
/* ===================================================================
 * #70259 — "the placeholder text remains visible even while typing".
 *
 * The checkout's message box is a `.form-floating` textarea with `rows="4"`, and Bootstrap 5 pins
 * `.form-floating > .form-control` to `calc(3.5rem + 2px)` and ignores `rows` entirely. So the box
 * renders 58px tall — one line — and everything typed past the first line is clipped
 * (measured at 427px: scrollHeight 69 against a 58px box). What the reporter sees as a placeholder
 * that will not go away is the floating *label*: with no room to sit above the text it lands on top
 * of it, and the two runs of text overlap.
 *
 * The contact page met the same Bootstrap rule and answers it the same way (pages/contact.less).
 * Four rows plus the 20px the floating label reserves is ~8rem, which is also production's height
 * for this box.
 * =================================================================== */
.form-floating > textarea#orderRemark.form-control {
  min-height: 8rem;
}
.input-group > .form-control {
  position: relative;
  z-index: 1;
}
.input-group > .form-control:not(:last-child) {
  border-top-right-radius: 0;
  border-bottom-right-radius: 0;
}
.input-group > .btn,
.input-group > .input-group-btn > .btn {
  min-height: 50px;
  padding: 10px 16px;
  border-radius: 0 var(--wh1-radius-md) var(--wh1-radius-md) 0;
}
.wh1-login-password-group {
  flex-wrap: nowrap;
}
.wh1-login-password-group > .form-control {
  min-height: 50px;
  padding: 10px;
  border-right-width: 0;
  border-top-right-radius: 0;
  border-bottom-right-radius: 0;
}
.wh1-login-password-group > .input-group-btn {
  display: flex;
  margin-left: 0;
}
.wh1-login-password-group > .input-group-btn > .forgotPasswordOpener {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 50px;
  min-width: 50px;
  min-height: 50px;
  margin-bottom: 0;
  padding: 10px;
  color: var(--wh1-color-primary);
  background: var(--wh1-color-surface-soft);
  border-color: var(--wh1-color-surface-soft);
  border-left-width: 0;
  border-radius: 0 var(--wh1-radius-md) var(--wh1-radius-md) 0;
  font-size: 16px;
  font-weight: 500;
  line-height: 1;
  text-decoration: none;
}
.wh1-login-password-group > .input-group-btn > .forgotPasswordOpener:hover,
.wh1-login-password-group > .input-group-btn > .forgotPasswordOpener:focus {
  color: var(--wh1-color-white);
  background: var(--wh1-color-primary);
  border-color: var(--wh1-color-primary);
  text-decoration: none;
}
/*
 * #70294 — the tick must not be squeezed by the text beside it.
 *
 * `.form-check` is a flex row and `.form-check-input` sets a width, which in a flex row is only a
 * basis: beside the order step's terms paragraph the box shrank to 4px and read as a stray line.
 * It is taken out of the shrinking, and where the label runs to several lines the box lines up with
 * the first of them instead of the middle of the block.
 */
.form-check-input {
  flex: 0 0 auto;
}
.form-check:has(> #checkAgbTop),
.form-check:has(> #oxdownloadableproductsagreement),
.form-check:has(> #oxserviceproductsagreement) {
  align-items: flex-start;
}
.form-check:has(> #checkAgbTop) .form-check-input,
.form-check:has(> #oxdownloadableproductsagreement) .form-check-input,
.form-check:has(> #oxserviceproductsagreement) .form-check-input {
  margin-top: 3px;
}
.wh1-login-remember {
  gap: 6px;
  font-size: var(--wh1-font-size-sm);
}
.wh1-login-remember .form-check-input {
  width: 1em;
  height: 1em;
}
.forgotPasswordOpener {
  display: inline-block;
  margin-bottom: var(--wh1-space-sm);
  color: var(--wh1-color-primary);
}
/* #70292 — the same for the register page: the newsletter tick and its label on one line, the
   two texts below them, as production sets them. Without the wrap the texts stood beside the tick. */
.is-checkout #user_form .form-check,
.cl-register form.needs-validation .form-check {
  flex-wrap: wrap;
}
.is-checkout #user_form .form-check > p.text-muted,
.cl-register form.needs-validation .form-check > p.text-muted {
  flex: 0 0 100%;
  margin: 0;
}
/* ===================================================================
 * #70062 — checkout step 1: the form must not move when a validation
 * message appears or disappears.
 *
 * Both the server (`message/inputvalidation.html.twig`) and APEX's
 * `build/js/main.js:100-120` put a `.invalid-feedback` block into the flow
 * under the field, so every failed/corrected field pushed everything below
 * it down or up. Taking the message out of the flow and parking it in the
 * 1rem `.mb-3` gap under the field means showing/hiding it costs zero
 * reflow. The white plate keeps a long message legible if it has to wrap
 * over the field below.
 * =================================================================== */
.is-checkout #user_form .mb-3,
.is-checkout #user_form .row > [class*="col-"] {
  position: relative;
}
.is-checkout #user_form .invalid-feedback {
  position: absolute;
  top: 100%;
  left: 0;
  z-index: 3;
  width: 100%;
  margin-top: 0;
  padding: 0 2px;
  background: var(--wh1-color-white);
  border-radius: var(--wh1-radius-xs);
  font-size: 11px;
  line-height: 13px;
}
/* #70267 — the wish list's labels are headings above their control, as production prints them,
   not floating captions inside the box. Weight and colour follow the page's other section labels. */
.kussin-wishlist-label {
  margin-bottom: 6px;
  color: var(--wh1-color-primary);
  font-weight: 600;
}
.kussin-wishlist-control + .kussin-wishlist-control {
  margin-top: 4px;
}
/* #70267, second round — the search box and the publish list are two answers to the same kind of
   question, so they are the same width. Production constrains them with the account menu that sits
   to their left; this page has no such column, so the width is stated instead of inherited.

   Third round — the width is one column for the whole block, the two fields and the button row
   under them, so it is set on the two wrappers and read by everything inside. 640px is what the
   save button and the share button need to sit on one line at their size; APEX's own `.max-600`
   cap on the search box is lifted to the same number so the three edges meet. */
.wishlist-search,
.wishlistPublish {
  --wh1-wishlist-control-width: 640px;
}
.wishlist-search.max-600 {
  max-width: var(--wh1-wishlist-control-width);
}
.kussin-wishlist-control .input-group,
.kussin-wishlist-control .form-select {
  max-width: var(--wh1-wishlist-control-width);
}
/* The buttons under them were set at the page's default button size, which reads as heavy beside a
   label and a single line of type. Production's are a size smaller. */
.wishlistPublish .btn,
.kussin-wishlist-control .btn {
  padding: 10px 22px;
  font-size: var(--wh1-font-size-sm);
}
.wishlistPublish .publish-list {
  display: flex;
  flex-wrap: nowrap;
  gap: 8px;
  max-width: var(--wh1-wishlist-control-width);
  /* The share button takes what the save button leaves, so the row ends on the same right edge
       as the two fields above it. */
}
.wishlistPublish .publish-list .btn-outline-primary {
  flex: 1 1 auto;
  text-align: center;
  white-space: normal;
}
@media (max-width: 767.98px) {
  .wishlist-search,
  .wishlistPublish {
    --wh1-wishlist-control-width: 100%;
  }
  /* A phone has no room for both on one line; production stacks them there too, the share
       button across the full width under the save button. */
  .wishlistPublish .publish-list {
    flex-wrap: wrap;
  }
  .wishlistPublish .publish-list .btn-outline-primary {
    flex-basis: 100%;
  }
}
/* ===================================================================
 * #70502 — a field that is simply correct does not get celebrated.
 *
 * APEX marks the form `.was-validated` when it is submitted, and Bootstrap then paints every field
 * that passes: green border, green tick inside text fields and selects, and the checkbox itself
 * filled Bootstrap green (#28a745, which is not a Warehouse One colour at all). On the checkout
 * address step that leaves the whole panel green after pressing Weiter, ticked boxes included,
 * which is what the ticket reports.
 *
 * Only the valid half is neutralised. The red invalid feedback is the half that tells the customer
 * something and is left exactly as it is. The pale green panel behind the delivery address is the
 * theme's own `#e0eff0` surface, not validation, so it stays too.
 * =================================================================== */
.was-validated {
  /* the select keeps its caret, it just loses the tick stacked next to it */
}
.was-validated .form-control:valid,
.was-validated .form-control:valid:focus,
.was-validated .form-select:valid,
.was-validated .form-select:valid:focus {
  border-color: var(--wh1-color-surface-soft);
  box-shadow: none;
}
.was-validated .form-control:valid,
.was-validated .form-control:valid:focus {
  background-image: none;
}
.was-validated .form-select:valid,
.was-validated .form-select:valid:focus {
  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%230a0a0a' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");
}
.was-validated .form-check-input:valid {
  border-color: var(--wh1-color-border-strong);
}
.was-validated .form-check-input:valid:checked {
  background-color: var(--wh1-color-surface-soft);
  border-color: var(--wh1-color-primary);
}
.was-validated .form-check-input:valid:checked[type="checkbox"] {
  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%230f555c' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e");
}
.was-validated .form-check-input:valid ~ .form-check-label {
  color: inherit;
}
.was-validated .valid-feedback,
.was-validated .valid-tooltip {
  display: none;
}
.alert > p {
  margin: 0;
  color: inherit;
  text-align: center;
}
/* #70274 — the confirmation banner on the newsletter settings page (and every other boxed
   success message). The theme sets `padding: 30px 0` on alerts, which is right for a full-bleed
   strip but leaves the text hard against the left edge of a boxed one — the very complaint in the
   ticket, which the page template's container only half solved. Production pads its banner on all
   four sides. */
.alert-success {
  padding: var(--wh1-space-md);
}
.alert-success > p {
  text-align: left;
}
/* #70258 — the error banner's colours.
 *
 * Bootstrap 5's `.alert-danger` here is a solid #dc3545 panel with white text, which shouts at a
 * shopper who has merely typed an address the shop already knows. Production has always used the
 * quieter pairing below — a pale red field, a matching hairline border and dark red text — and the
 * reporter asked for those values, so they are copied verbatim from the live stylesheet
 * (default.min.css, `.alert-danger`). Left-aligned like production, and with a border to hold the
 * lighter field together; the theme's own `.alert > p { text-align: center }` is what the second
 * rule undoes. */
.alert-danger {
  padding: var(--wh1-space-md);
  background-color: #f2dede;
  border: 1px solid #ebccd1;
  /* `!important` is not decoration here: the compiled theme carries
     * `.text-white, .alert-danger { color: … white !important }`, which no amount of specificity
     * in this file can outrank. */
  color: #a94442 !important;
}
.alert-danger > p {
  color: inherit;
  text-align: left;
}
/* #70006, then #70260 — the wish-list confirmation, above the basket and on the product page.
   The theme sets `padding: 30px 0` on alerts, which suits a message sitting inside an
   already padded container: full-bleed, no side inset. These are inserted directly above
   a card, so the text ran into the left edge — and 30px of vertical space is a lot for a
   single line.

   One line of text, so the box is sized for one line: the same 16px on all four sides
   rather than the earlier 16/24 split, and the text centred in it. The message carries no
   `<p>`, which is why the theme's `.alert > p { text-align: center }` never reached it and
   the sentence sat left while the box it sits in is centred. Rounded like the cards below. */
.wh1-noticelist-message,
.wh1-giftregistry-message {
  padding: var(--wh1-space-md);
  border-radius: var(--wh1-radius-md);
  text-align: center;
}
/* #70423 — the product-page confirmation ("Der Artikel wurde vom Wunschzettel entfernt.") had
   Bootstrap's 16px alert margin below it and nothing above, so it sat hard against the breadcrumb.
   The same space above as below, and the sentence starts at the left edge like the other boxed
   messages (`.alert-success > p` above) rather than centred. The basket-page message is unchanged. */
.wh1-giftregistry-message {
  margin-top: var(--wh1-space-md);
  text-align: left;
}
/* ===================================================================
 * #70022 — the "Sale of the Day" teaser on the Sale category page.
 *
 * The shortcode markup is OXID 6 / Bootstrap 3: it labels its three stacked
 * blocks `.row`. Under Bootstrap 5 a `.row` is a flex container whose children
 * get `width: 100%`, so the prefix and the countdown — one line on production —
 * were forced onto separate lines, and none of the type or the button carried
 * any styling at all.
 *
 * Values sampled from www.warehouse-one.de/en/sale/: 32px for the prefix and
 * the countdown (the time bold, the words not), and a full-width teal button at
 * 24px with 10px/20px padding.
 * =================================================================== */
/* Production sets the text column 14px clear of the banner (image ends at 909,
   the copy starts at 923). Padding the column rather than each block keeps the
   headline, the paragraphs and the button on one left edge. */
.sale-of-the-day-countdown {
  padding-left: var(--wh1-space-md);
}
.sale-of-the-day-counter {
  align-items: baseline;
  -moz-column-gap: 0.35em;
       column-gap: 0.35em;
  /* Undo Bootstrap 5's `.row > * { width: 100% }` so the two sit on one line. */
}
.sale-of-the-day-counter > * {
  width: auto;
  max-width: none;
  padding-right: 0;
  padding-left: 0;
}
.sale-of-the-day-counter-prefix,
.sale-of-the-day-counter-js {
  font-size: 2rem;
  line-height: 1.2;
  color: var(--wh1-color-primary);
}
.sale-of-the-day-counter-js {
  font-weight: 700;
}
.sale-of-the-day-description {
  margin-top: var(--wh1-space-md);
}
.sale-of-the-day-description p {
  margin-bottom: var(--wh1-space-sm);
}
.sale-of-the-day-description p:last-child {
  margin-bottom: 0;
}
.sale-of-the-day-button {
  margin-top: var(--wh1-space-lg);
}
/* The label is an `<a>`, and the theme paints every link in the page shell with
   `#wrapper a { color: var(--wh1-color-primary) }` — an ID selector, so a plain
   `.sale-of-the-day-button a` (0,2,1) loses to it (1,0,1) and the button rendered
   teal on teal. Prefixing with `#wrapper` wins the cascade, the same trick
   `cms-content.less` uses for the accordion labels. */
#wrapper .sale-of-the-day-button a,
.sale-of-the-day-button a {
  display: block;
  padding: 10px 20px;
  font-size: 1.5rem;
  color: var(--wh1-color-white);
  text-align: center;
  text-decoration: none;
  background: var(--wh1-color-primary);
}
#wrapper .sale-of-the-day-button a:hover,
#wrapper .sale-of-the-day-button a:focus,
.sale-of-the-day-button a:hover,
.sale-of-the-day-button a:focus {
  color: var(--wh1-color-white);
  background: var(--wh1-color-primary-dark);
}
/* ===================================================================
 * Basket line items.
 * =================================================================== */
/*
 * #70007 — the product thumbnail was distorted.
 *
 * APEX renders it with hard attributes: `<img … width="70" height="70">`. The file behind it is not
 * square, though, and cannot be: OXID generates the derivative by fitting the article photo INSIDE
 * the configured box while keeping its aspect ratio, so the `87_87_90` variant of a portrait product
 * is 58x87. Squeezing that into a 70x70 frame with the default `object-fit: fill` is what stretched
 * it — measured on dev1: natural 58x87, painted 70x70.
 *
 * So this is not a matter of requesting a different thumbnail size; there is no square file to ask
 * for, and forcing square dimensions is the distortion itself.
 *
 * The 70x70 box stays: it reserves the space while the lazily-loaded image arrives, so the row does
 * not jump. Only the fill mode changes, and the photo letterboxes inside its frame at its own
 * proportions — the same treatment the mini-basket already uses.
 */
.basketitemrow .col-img img {
  -o-object-fit: contain;
     object-fit: contain;
}
/*
 * …and sit in the middle of the row.
 *
 * `.basketitemrow .row` is a flex container, so its columns stretch to the tallest one — the text
 * column, 129px against the thumbnail's 70px. The image column therefore filled that height and the
 * photo hung at the top with ~59px of empty space under it. Centring the column itself, rather than the
 * image inside it, keeps the box at its natural 70px and lets flex place it.
 */
.basketitemrow .col-img {
  align-self: center;
}
/* ===================================================================
 * #70117 — the applied-coupon row has to survive a long code.
 *
 * A voucher number is whatever the series generates, and this shop's series generate 32-character
 * hashes. In the summary the row is a flex box with the label on one side and the amount on the
 * other; an unbreakable 32-character string pushed the row past its width and carried the remove
 * icon off the edge of a phone screen, so an applied coupon could not be taken off again.
 *
 * The label is allowed to truncate — the full code stays in the title attribute — and the icon is
 * kept out of the shrinking: it is the control, it never gives up space.
 * =================================================================== */
.list-group-item .wh1-voucher-row {
  min-width: 0;
  flex: 1 1 auto;
}
.list-group-item .wh1-voucher-row [data-wh1-voucher] {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.list-group-item .wh1-voucher-row .removeFn {
  flex: 0 0 auto;
}
.list-group-item .wh1-voucher-amount {
  flex: 0 0 auto;
  white-space: nowrap;
  padding-left: 0.5rem;
}
/* The flyout basket prints the same code in a fixed Bootstrap column (#70117). A 32-character
   voucher number has nothing to break on, so it ran past the column and pushed the amount out of
   the row on a phone. Same answer as the summary: truncate the label, keep the figure whole. */
.wh1-voucher-label {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
/* ===================================================================
 * #70098 — the basket's own controls, as production has them.
 *
 * A tick box on every line, an "Alle" master beside the group actions at the foot of the list, and
 * a way back into the shop underneath. The actions themselves ride on the form the page already
 * posts; see initBasketSelection() in wh1.js.
 * =================================================================== */
.kussin-basket-select {
  display: flex;
  align-items: center;
  /* #70318 — the column dropped its gutter entirely, so the tick box sat against the edge of the
       product thumbnail and the two read as one control. Keep the gutter off on the left, where it
       would push the box away from the list edge, and give the box its own room on the right. */
  padding-left: 0;
  padding-right: var(--wh1-space-md);
}
.kussin-basket-functions {
  display: flex;
  flex-wrap: wrap;
  gap: var(--wh1-space-sm) var(--wh1-space-md);
  align-items: center;
  justify-content: space-between;
}
.kussin-basket-functions-select {
  display: flex;
  align-items: center;
  gap: var(--wh1-space-xs);
}
.kussin-basket-functions-select .form-check-label {
  margin: 0;
  color: var(--wh1-color-primary);
  font-size: var(--wh1-font-size-sm);
}
.kussin-basket-functions-actions {
  display: flex;
  gap: var(--wh1-space-sm);
}
.kussin-basket-continue .btn-link {
  display: inline-flex;
  align-items: center;
  gap: var(--wh1-space-xs);
  color: var(--wh1-color-primary);
  font-size: var(--wh1-font-size-sm);
  text-decoration: none;
}
.kussin-basket-continue .btn-link svg {
  width: 12px;
  height: 12px;
  fill: currentColor;
}
.kussin-basket-continue .btn-link:hover,
.kussin-basket-continue .btn-link:focus-visible {
  text-decoration: underline;
}
/* The title is a link now; it keeps the heading's weight and colour rather than the link colour. */
a.kussin-basket-item-title {
  color: inherit;
  text-decoration: none;
}
a.kussin-basket-item-title:hover,
a.kussin-basket-item-title:focus-visible {
  text-decoration: underline;
}
/* ===================================================================
 * #70294 — the brand and the markdown on a basket line.
 *
 * Production leads each line with the brand and says what the reduction is worth. The badge reuses
 * the wording the product page uses, but not its geometry: `.wmdk-discount-rate` is positioned
 * absolutely inside the buy box, which would tear a basket row apart, so the basket keeps its own
 * flat pill.
 * =================================================================== */
.kussin-basket-item-brand {
  margin-right: 4px;
  color: var(--wh1-color-primary);
  font-weight: 700;
}
/*
 * #70501 — the price the customer pays never breaks, and the pair being compared stays together.
 *
 * The current price used to be a bare text node in `.value`. Above the phone breakpoint the value
 * is plain inline text, so the normal space before the currency sign is a break opportunity and
 * "34,90 €" lands on two lines; in the narrow summary column around 1024px the row fell to three
 * lines because the badge sits between the two prices in the markup. Both are geometry, not
 * wording: the price is its own non-breaking element and the badge is ordered after the prices at
 * every width, so the struck price and the current one read as one figure.
 */
.basketitemrow .unit-price .value {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  -moz-column-gap: 6px;
       column-gap: 6px;
  row-gap: 4px;
}
.basketitemrow .kussin-basket-item-price {
  order: 2;
  white-space: nowrap;
}
.basketitemrow .unit-price .value > del {
  order: 1;
}
.basketitemrow .kussin-basket-item-saving {
  order: 3;
}
.basketitemrow .kussin-basket-item-saving {
  position: static;
  display: inline-block;
  min-height: 0;
  margin: 0 0 0 6px;
  padding: 1px 8px;
  border-radius: var(--wh1-radius-pill);
  background: var(--wh1-color-highlight-red);
  color: var(--wh1-color-white);
  font-size: var(--wh1-font-size-xs);
  font-weight: 700;
  line-height: 1.6;
  white-space: nowrap;
}
/* The line total is the figure being checked on the order step: keep it right and let it breathe. */
.basketitemrow .totalPrice {
  white-space: nowrap;
}
/* ===================================================================
 * #70098 — the right-hand half of a basket line, set on one baseline.
 *
 * The quantity stepper, the remove and wishlist icons and the line total each sat wherever their
 * own box happened to fall: measured on the basket page the trash button's centre was 8px above
 * the stepper's and the total's 14px below it, so three controls that belong to the same line read
 * as three separate rows. Both wrappers are flex containers already — they were simply never told
 * where to put their items on the cross axis.
 *
 * The `:has()` selectors pick the inner row only. The line's outer row carries the photo and the
 * description as well, and those are deliberately NOT centred — the description is the tall column
 * and everything else hangs from its top.
 * =================================================================== */
.basketitemrow {
  /* APEX hangs the stepper 10px below the top of its column, which is what put it out of line
       with the total beside it once both were centred — the offset is inside `.quantity`, so no
       amount of centring on the wrappers could reach it. */
  /* Bootstrap's heading classes carry `margin-bottom: .5rem`, and the line total wears `.h5`.
       Centring the column therefore centres a box that is 8px taller than the figure inside it,
       which left the price sitting low against the stepper on a phone. */
}
.basketitemrow .d-flex:has(> .quantity) {
  align-items: center;
}
.basketitemrow .quantity {
  margin-top: 0;
}
.basketitemrow .row:has(> [class*="col-"] > .totalPrice) {
  align-items: center;
}
.basketitemrow .totalPrice > .h5 {
  margin-bottom: 0;
}
/*
 * #70098 — and the icons say when they are being clicked.
 *
 * The remove button was a bare glyph in the shop's green on the card: hovering did nothing and a
 * click gave no answer at all, so on a phone there was no way to tell the tap had registered. The
 * pair now fills with the brand colour and carries the glyph in white while it is hovered, focused
 * or held down. The wishlist star is treated with it — they sit side by side and one of them
 * lighting up alone would read as a fault.
 */
.basketitemrow .btn-remove,
.basketitemrow .btn-noticelist {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: var(--wh1-radius-pill);
  transition: background-color 0.15s ease-in-out;
}
.basketitemrow .btn-remove svg,
.basketitemrow .btn-noticelist svg {
  fill: var(--wh1-color-primary);
  transition: fill 0.15s ease-in-out;
}
.basketitemrow .btn-remove:hover,
.basketitemrow .btn-noticelist:hover,
.basketitemrow .btn-remove:focus-visible,
.basketitemrow .btn-noticelist:focus-visible,
.basketitemrow .btn-remove:active,
.basketitemrow .btn-noticelist:active {
  background: var(--wh1-color-primary);
}
.basketitemrow .btn-remove:hover svg,
.basketitemrow .btn-noticelist:hover svg,
.basketitemrow .btn-remove:focus-visible svg,
.basketitemrow .btn-noticelist:focus-visible svg,
.basketitemrow .btn-remove:active svg,
.basketitemrow .btn-noticelist:active svg {
  fill: var(--wh1-color-white);
}
/*
 * #70098 — air between the last line and the group actions on a phone.
 *
 * "Alle auswählen" and the group buttons are the last item of the same list group, so the bar butts
 * straight against the row above it. On a wide screen the row ends with the line total and the gap
 * reads as a table rule; on a phone the quantity stepper is the last thing in the row and its
 * buttons ended up a hairline away from the ones underneath, which invites the wrong tap.
 */
/*
 * #70098 — and the stepper needs air under the price block on a phone.
 *
 * On a wide screen the quantity sits beside the description; stacked on a phone it lands directly
 * under the savings badge, and with `.quantity`'s own 10px offset removed (see above) the two were
 * touching. The gap is put on the row that carries the stepper and the line total together, not on
 * the stepper itself: a margin inside the column would push the stepper down within its own box
 * and take it back out of line with the total beside it.
 */
@media (max-width: 767.98px) {
  .basketitemrow .row:has(> [class*="col-"] > .totalPrice) {
    margin-top: var(--wh1-space-sm);
  }
}
@media (max-width: 767.98px) {
  /* The card's own `.list-group-item` padding is set through a compound selector, so the class on
       its own loses the cascade — the bar is addressed with the same weight the card uses. */
  .basket .list-group-item.kussin-basket-functions {
    padding-top: var(--wh1-space-md);
    padding-bottom: var(--wh1-space-sm);
  }
}
/*
 * #70098 — the row's overflow menu, once it is open.
 *
 * Bootstrap marks an open dropdown toggle with `.show` and the theme answers that with the dark
 * teal active fill (#09393E). The glyph inside kept the button's resting colour — the shop green —
 * which on that ground is all but invisible: the dots vanished at exactly the moment the customer
 * had just tapped them. They are carried in white for as long as the menu is open, held down or
 * focused.
 */
.basketitemrow .btn-group > .btn[data-bs-toggle="dropdown"] svg {
  fill: var(--wh1-color-primary);
  transition: fill 0.15s ease-in-out;
}
.basketitemrow .btn-group > .btn[data-bs-toggle="dropdown"].show svg,
.basketitemrow .btn-group > .btn[data-bs-toggle="dropdown"]:active svg,
.basketitemrow .btn-group > .btn[data-bs-toggle="dropdown"]:focus-visible svg {
  fill: var(--wh1-color-white);
}
/*
 * #70098 — the unit price on a phone.
 *
 * The line is a flex row of a fixed 80px label and whatever is left, and on a 390px screen what is
 * left is 152px — shared by the struck price, the savings badge and the price actually charged.
 * All three went onto lines of their own, and the last of them broke between the amount and the
 * currency sign, leaving a lone "€" hanging over the row.
 *
 * On a phone the label is allowed its natural width, the value takes the rest of the column and
 * lays its three parts out as a wrapping flex line. The badge is sent to the end so the two prices
 * — the pair the customer is comparing — stay together on the first line, and nothing is allowed
 * to break inside a figure.
 */
@media (max-width: 767.98px) {
  .basketitemrow .unit-price {
    /* anonymous flex items — the charged price among them — keep order 0 and therefore their
           source position, so moving only the badge is enough to put it last */
  }
  .basketitemrow .unit-price li {
    flex-wrap: wrap;
    -moz-column-gap: 6px;
         column-gap: 6px;
  }
  .basketitemrow .unit-price .attribute {
    width: auto;
  }
  .basketitemrow .unit-price .value {
    display: flex;
    flex: 1 1 auto;
    flex-wrap: wrap;
    align-items: center;
    -moz-column-gap: 6px;
         column-gap: 6px;
    row-gap: 4px;
    white-space: nowrap;
  }
}
/*
 * #70098 — the basket page is flat on production, not a stack of cards.
 *
 * Production draws the cart, the coupon field and the totals straight onto a white page, separated
 * by the rule under each heading. Ours inherited APEX's chrome: three white cards with 25px
 * corners floating on the shop's grey ground, which is the treatment production keeps for the
 * checkout steps that follow — so the basket looked like a later step than it is.
 *
 * The page is put on white and the three boxes give up their own surface. Only the checkout's own
 * boxes are named: the recommendation sliders further down the page are cards as well, and those
 * are meant to look like cards.
 */
body.cl-basket {
  background: var(--wh1-color-white);
}
body.cl-basket #basket_list,
body.cl-basket .kussin-voucher-box,
body.cl-basket [data-wh1-summary] > .card {
  border: 0;
  border-radius: 0;
  background: transparent;
  box-shadow: none;
}
body.cl-basket #basket_list > .card-header,
body.cl-basket .kussin-voucher-box > .card-header,
body.cl-basket [data-wh1-summary] > .card > .card-header {
  background: transparent;
}
/* ===================================================================
 * #70359 — the PayPal express buttons under the basket totals and in the flyout.
 *
 * The PayPal SDK paints each funding source into its own `.paypal-button-container` and leaves the
 * spacing between them to the shop. Nothing here claimed it, so the stack came out uneven: the
 * first button sat flush against the shop's own "Zur Kasse" / "Warenkorb zeigen" control, and the
 * gaps between the remaining ones were whatever each rendered iframe happened to carry.
 *
 * One gap above every container gives the whole stack a single rhythm and separates it from the
 * shop's control, wherever the module places it — the basket summary, the flyout, or the empty
 * basket. The SDK owns everything inside the container; only the space around it is the theme's.
 * =================================================================== */
.paypal-button-container {
  margin-top: var(--wh1-space-sm);
}
.input-group.js-amount {
  display: flex;
  align-items: stretch;
  width: 100%;
  gap: 0;
  /*
     * #70007 / #70048 — Bootstrap's `.input-group` sets `flex-wrap: wrap`. In the basket the group
     * lives in a `.quantity` flex item that collapses to ~100px, while the three controls need
     * ~215px, so "-", the value and "+" wrapped onto three lines and the selector rendered as a
     * tall vertical box. The stepper must never wrap — it is one control.
     */
  flex-wrap: nowrap;
}
.input-group.js-amount > .btn,
.input-group.js-amount > .form-control {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 44px;
  margin: 0 !important;
  border-radius: 0;
}
.input-group.js-amount > .btn {
  flex: 0 0 44px;
  width: 44px;
  padding: 0;
  font-weight: 700;
  line-height: 1;
}
.input-group.js-amount > .form-control {
  flex: 1 1 auto;
  width: 1%;
  min-width: 64px;
  padding-right: var(--wh1-space-sm);
  padding-left: var(--wh1-space-sm);
  text-align: center;
  border-color: var(--wh1-color-primary);
}
.input-group.js-amount > .btn + .form-control,
.input-group.js-amount > .form-control + .btn {
  margin-left: -1px !important;
}
.input-group.js-amount > :first-child {
  flex-basis: auto;
  width: auto;
  padding-right: 25px;
  padding-left: 25px;
  border-top-left-radius: var(--wh1-radius-pill);
  border-bottom-left-radius: var(--wh1-radius-pill);
}
.input-group.js-amount > :last-child {
  flex-basis: auto;
  width: auto;
  padding-right: 25px;
  padding-left: 25px;
  border-top-right-radius: var(--wh1-radius-pill);
  border-bottom-right-radius: var(--wh1-radius-pill);
}
.input-group.js-amount > :focus,
.input-group.js-amount > .form-control:focus {
  position: relative;
  z-index: 2;
}
/*
 * #70007 / #70048 — the stepper inside a basket row.
 *
 * `.quantity` is a flex item of a bare `.d-flex` inside a narrow grid column, so it takes its width
 * from the group's min-content and squeezes the controls. Let it size to its content instead, and
 * trim the pill padding so the whole stepper fits the column on mobile too.
 */
.basket .quantity,
.basketitemrow .quantity {
  /*
     * APEX styles this as a compact bordered box — `.basket .quantity { border: 1px solid …;
     * max-width: 100px }` plus `.basket .quantity button, .basket .quantity input { border: none }`.
     * That fights the WH1 pill stepper: the 100px cap is narrower than the pill's own minimum, and
     * the square border boxes in a control that already draws its own rounded outline. Drop both and
     * let the pill be the visible control.
     */
  max-width: none;
  border: 0;
  flex: 0 0 auto;
  min-width: 0;
}
.basket .quantity .input-group.js-amount,
.basketitemrow .quantity .input-group.js-amount {
  width: auto;
  /*
         * The generic stepper lets the value field grow (`flex: 1 1 auto`) so it fills the PDP buy
         * box. In a basket row there is nothing to fill — without a fixed basis it stretched the
         * control to the full column width. Pin it instead.
         */
  /*
         * APEX strips the borders off the inner controls (`.basket .quantity button, .basket
         * .quantity input { border: none }`) because it draws its own box around `.quantity`. We
         * removed that box, so the pill has to draw its own outline again or the stepper renders as
         * three unattached characters.
         */
}
.basket .quantity .input-group.js-amount > .form-control,
.basketitemrow .quantity .input-group.js-amount > .form-control {
  flex: 0 0 64px;
  width: 64px;
  min-width: 64px;
}
.basket .quantity .input-group.js-amount > .btn,
.basketitemrow .quantity .input-group.js-amount > .btn,
.basket .quantity .input-group.js-amount > .form-control,
.basketitemrow .quantity .input-group.js-amount > .form-control {
  border: 1px solid var(--wh1-color-primary);
}
.basket .quantity .input-group.js-amount > :first-child,
.basketitemrow .quantity .input-group.js-amount > :first-child,
.basket .quantity .input-group.js-amount > :last-child,
.basketitemrow .quantity .input-group.js-amount > :last-child {
  padding-right: var(--wh1-space-md);
  padding-left: var(--wh1-space-md);
}
/* On phones the row collapses to a single column; keep the stepper compact and left-aligned. */
@media (max-width: 575.98px) {
  .basketitemrow .quantity .input-group.js-amount {
    justify-content: flex-start;
  }
  .basketitemrow .quantity .input-group.js-amount > .btn {
    flex: 0 0 auto;
    width: auto;
  }
  .basketitemrow .quantity .input-group.js-amount > .form-control {
    flex: 0 0 56px;
    width: 56px;
    min-width: 56px;
  }
  .basketitemrow .quantity .input-group.js-amount > :first-child,
  .basketitemrow .quantity .input-group.js-amount > :last-child {
    padding-right: var(--wh1-space-sm);
    padding-left: var(--wh1-space-sm);
  }
}
.card,
.card-title,
.card-text {
  color: var(--wh1-color-primary);
}
.card .text-muted {
  color: var(--wh1-color-primary);
}
.is-checkout .content .card {
  border-radius: var(--wh1-radius-card);
  overflow: hidden;
}
/*
 * #70050 — collapse chevron alignment (reported on the mobile basket's "Gutschein" card).
 *
 * APEX pins the chevron with a hardcoded `top: 26px` (`.card-collapse svg`), which only lines up
 * when the header is exactly one line at the desktop font size. On a phone the heading sits at a
 * different height, so the arrow drifts off centre. Centre it on the header instead of guessing an
 * offset; the rotation has to be composed into the same transform, since transform is not additive.
 */
.card-collapse svg {
  top: 50%;
  transform: translateY(-50%) rotate(180deg);
}
.card-collapse.collapsed svg {
  transform: translateY(-50%) rotate(0);
}
/* ===================================================================
 * #70263 — the thumbnails on the wish list and the note list are stretched.
 *
 * APEX's line list item writes the picture as `<img width="100" height="100" class="card-img">`,
 * and Bootstrap's `.card-img { width: 100% }` then widens it to the column — 112px — while the
 * `height` attribute keeps holding it at 100. Every picture is therefore forced into the same
 * 1.12 box no matter what it is: measured on the wish list, source ratios between 0.67 and 0.95
 * all rendered at 1.12, so a portrait snowboard came out as a landscape one.
 *
 * Production lets each row's picture keep its own proportions and take the height it needs, which
 * is what `height: auto` restores. `object-fit: contain` is the belt to that braces: should
 * anything else pin a height again, the picture letterboxes instead of stretching.
 * =================================================================== */
.card .row > [class*="col-"] > a > img.card-img,
a.d-block > img.card-img {
  height: auto;
  -o-object-fit: contain;
     object-fit: contain;
  /*
     * Follow-up on the same ticket: with the height freed, a portrait board grew to whatever its
     * column allowed and the rows lost their common rhythm. Production caps the same picture at
     * 150px and centres what is left over, so the list reads as one column of thumbnails again
     * rather than a ladder of different-sized pictures.
     */
  max-height: 150px;
  /*
     * `.card-img` sets `width: 100%`, which pins the box to the column and leaves `object-fit`
     * letterboxing a tall picture inside it. Releasing the width lets the picture shrink to the
     * 150px cap on its own, so it ends up the size production gives it, centred in the column.
     */
  width: auto;
  max-width: 100%;
  display: block;
  margin-inline: auto;
}
/* ===================================================================
 * Checkout chrome — step indicator and the "Übersicht" summary card.
 * Markup: apex/tpl/page/checkout/inc/steps.html.twig
 *         apex/tpl/page/checkout/inc/summary_sidebar.html.twig
 * =================================================================== */
.steps .step {
  /* #69978 — the step labels were left at APEX's near-black / grey.
         * The step the customer is on, and the ones already completed, are
         * WH1 green; the ones still ahead stay muted. */
}
.steps .step.active .num {
  color: var(--wh1-color-white);
  background: var(--wh1-color-primary);
  border-color: var(--wh1-color-primary);
}
.steps .step.done .num {
  color: var(--wh1-color-white);
  background: var(--wh1-color-success-apex);
  border-color: var(--wh1-color-success-apex);
}
.steps .step.active .text {
  color: var(--wh1-color-primary);
  font-weight: 600;
}
.steps .step.done .text {
  color: var(--wh1-color-primary);
}
.steps .step.text-muted .text {
  color: var(--wh1-color-muted);
}
/*
 * #70292 — the connectors, now that the row is five long.
 *
 * APEX draws a rule either side of every marker and then hides the two that would dangle:
 * `.step-1:before` and `.step-3:after` — the third being the last of its three steps. With five
 * steps that leaves a gap on the right of step three and a rule running off the end past "Fertig!".
 * The ends are therefore re-declared for this row's real length.
 *
 * The markers themselves are softened rather than redrawn: a slightly heavier ring, the connector
 * in the shop's own tint instead of APEX's grey, and the rule behind a completed step carried in
 * green so the row reads as a filled progress line rather than five separate dots.
 */
/* The id is needed: the connector colour is otherwise decided by rules of the same weight that
   follow the step's text colour, so a class-only override loses to whichever came last. */
#checkout-steps.kussin-checkout-steps {
  /* #E0EFF0 written out: the soft-brand token was retired on #70285, and an undefined custom
       property makes the whole declaration invalid, which drops the colour back to currentColor —
       which is why the rule under the active step was drawing in the step's own black. */
}
#checkout-steps.kussin-checkout-steps .step-3::after {
  display: block;
}
#checkout-steps.kussin-checkout-steps .step-5::after {
  display: none;
}
#checkout-steps.kussin-checkout-steps .step::before,
#checkout-steps.kussin-checkout-steps .step::after {
  border-bottom-color: #e0eff0;
}
#checkout-steps.kussin-checkout-steps .step.done::before,
#checkout-steps.kussin-checkout-steps .step.done::after,
#checkout-steps.kussin-checkout-steps .step.active::before {
  border-bottom-color: var(--wh1-color-success-apex);
}
#checkout-steps.kussin-checkout-steps .step .num {
  border-width: 2px;
  font-weight: 600;
  line-height: 26px;
}
/*
 * #70098 — the markers are links now, and have to keep looking like markers.
 *
 * An anchor is inline and carries the theme's link colour and underline, so wrapping the number
 * and the label in one turned the row into a line of blue underlined text and broke the pill's
 * own box. The link is therefore made the block the marker used to be, and the colour is left to
 * the `.step` rules above, which already say what an active, a completed and a pending step look
 * like. Only the cursor and a hint on hover mark it as something to click.
 */
.kussin-checkout-steps .kussin-step-link {
  display: block;
  color: inherit;
  text-decoration: none;
  cursor: pointer;
}
.kussin-checkout-steps .kussin-step-link:hover .text,
.kussin-checkout-steps .kussin-step-link:focus-visible .text {
  text-decoration: underline;
}
.kussin-checkout-steps .kussin-step-link:focus-visible {
  outline: 2px solid var(--wh1-color-primary);
  outline-offset: 2px;
}
/*
 * #70292 — five markers, and a phone shows only their numbers.
 *
 * Production names every step on a desktop and drops to the bare numbered pills on a phone. With
 * five labels in the row instead of three, keeping the text below `lg` wrapped the markers into
 * two and a half lines and the connectors ran between the wrong pills.
 */
@media (max-width: 991.98px) {
  .kussin-checkout-steps {
    flex-wrap: nowrap;
  }
  .kussin-checkout-steps .step .text {
    display: none;
  }
}
/* -------------------------------------------------------------------
 * #69978 — "Übersicht" summary card.
 * The rows (Summe Artikel, MwSt., Versandkosten, …) inherited APEX's
 * body colour (#212529) while the card heading and the grand total were
 * already WH1 green. Bring the whole card onto the brand colour.
 * `.is-checkout` covers basket / user / payment / order (oView.getIsOrderStep()).
 * ------------------------------------------------------------------- */
.is-checkout .card > .list-group-flush > .list-group-item {
  color: var(--wh1-color-primary);
}
/*
 * #70294 / #70098 — the totals card was given production's striped treatment: every other row on
 * the shop's light blue, the borders dropped and the grand total set bold. It was reverted on
 * #70098 by request — the summary keeps APEX's plain rows on white, on every step and not only in
 * the basket. The `.kussin-checkout-summary` hook on the card was removed with it; re-add it in
 * summary_sidebar.html.twig if the card ever needs styling of its own again.
 */
/*
 * #70098 — the grand total has to be the line the eye lands on.
 *
 * Production sets it apart twice over: the row carries Bootstrap 3's `.lead` (21px against the
 * 14px of the rows above it) and wraps the figure in `<strong>`. Ours inherited APEX's `.h5`,
 * which came out at 16px in the normal weight — barely a step up from the rows it is meant to
 * summarise. The row is put back on production's footing using this theme's own scale: the large
 * token, which is 20px, and the bold weight.
 *
 * `[data-wh1-summary]` scopes it to the totals card, which is the wrapper the coupon swap already
 * marks, so the basket's own list-group rows are left alone.
 */
[data-wh1-summary] .list-group-item.h5 {
  font-size: var(--wh1-font-size-lg);
  font-weight: 700;
}
/* -------------------------------------------------------------------
 * #69978 — free-shipping notice (kussin/wh1-core-modifications,
 * .../wh1-2026/page/checkout/inc/summary_sidebar.html.twig).
 *
 * The module ships its own 25x25 inline SVG with a hard-coded
 * fill="#000000". Nothing in this theme styled it, so it rendered at full
 * size, black, on the text baseline — which reads as a stray/broken glyph
 * after "… nach DE/AT/NL.". Production styles the same markup
 * (`.wmdk-freeshipping-notice p span.icon.freeshipping`); those rules are
 * ported here, with the notice itself at 12px as the ticket asks.
 * #70529 — in the mini cart's strike-price red (#DC3545), not muted.
 * ------------------------------------------------------------------- */
.wmdk-freeshipping-notice {
  font-size: var(--wh1-font-size-xs);
}
.wmdk-freeshipping-notice p {
  position: relative;
  /* room for the icon, which is parked in the bottom-right corner: as a
         * plain inline-block it drops onto a line of its own whenever the
         * sentence happens to fill the last line. */
  margin: 0;
  padding-right: 24px;
  color: var(--wh1-color-apex-dc3545);
  font-size: var(--wh1-font-size-xs);
  font-weight: 400;
  line-height: 1.5;
}
.wmdk-freeshipping-notice p b,
.wmdk-freeshipping-notice p strong {
  font-size: var(--wh1-font-size-xs);
  font-weight: 700;
}
.wmdk-freeshipping-notice .icon.freeshipping {
  position: absolute;
  right: 0;
  bottom: 1px;
  display: block;
  width: 18px;
  max-width: 18px;
  margin: 0;
}
.wmdk-freeshipping-notice .icon.freeshipping svg {
  display: block;
  width: 100%;
  height: auto;
  /* beats the element's own fill="#000000" presentation attribute */
  fill: currentColor;
}
.is-checkout .card > .list-group-flush > .list-group-item.wmdk-freeshipping-notice {
  color: var(--wh1-color-apex-dc3545);
}
/*
 * #70294 — the instruction production sets at the head of the order step, above the panels and
 * under the step markers: "Bitte prüfe alle Daten, bevor Du Deine Bestellung abschließt!". Ours
 * went straight into the addresses with nothing said.
 */
.kussin-checkout-order-check {
  margin: var(--wh1-space-md) 0 0;
  /* Set as production sets it: a bordered box with the line centred in it, in the normal weight. */
  padding: 12px 16px;
  border: var(--wh1-border-width) solid var(--wh1-color-border-strong);
  color: var(--wh1-color-primary);
  background: var(--wh1-color-white);
  font-size: var(--wh1-font-size-sm);
  text-align: center;
}
/* #70294 — the terms box on the last step sits on the same light blue as the step's other panels. */
.is-checkout .agb.card {
  background: #e0eff0;
  /* Review round, 2026-09-07: the heading kept APEX's white card cap, so the box read as a white
       bar over a tinted body ("only partly implemented"). Production tints the whole panel, title
       included, so the cap goes transparent and the tint runs through. */
}
.is-checkout .agb.card > .card-header {
  background: transparent;
}
/*
 * #70117 — the coupon box under the cart.
 *
 * It used to be a collapsed card in the narrow summary column, where the field filled whatever was
 * left. In the left column it would otherwise stretch the full width of the basket, which reads as
 * a search bar rather than a code field, so the card is held to production's width and given air
 * between itself and the last basket row — the cart's own markup ends flush against it.
 *
 * The width is a max, not a width: below `sm` the card takes the column it is given.
 */
.kussin-voucher-box {
  max-width: 480px;
  margin-top: var(--wh1-space-lg);
  /* The rule under a card heading already sets 20px before the first thing in the card — the
       summary's first total and the basket's first line both start there. The body's own top
       padding was stacking on top of that, so the code field sat 32px down while every other card
       began at 20, which read as the box being loose at the top. */
  /* The field keeps its rounded corners on all four sides while the button beside it is square on
       the left, so the two met on a visible notch. They are one control, so the edge where they
       touch is flat on both. */
}
.kussin-voucher-box .card-body {
  padding-top: 0;
}
.kussin-voucher-box .voucher-input {
  flex: 1 1 auto;
}
.kussin-voucher-box .voucher-input .form-control {
  border-top-right-radius: 0;
  border-bottom-right-radius: 0;
}
@media (max-width: 575.98px) {
  .kussin-voucher-box {
    max-width: none;
    margin-top: var(--wh1-space-md);
  }
}
/* ===================================================================
 * #70292, option A — the address step in production's shape.
 *
 * Production groups the checkout into mint panels, prints a static bold label above every input
 * rather than floating it inside, and repeats the back and forward buttons above the form as well
 * as below it. This file is that treatment, and nothing else on the page is touched: the panels
 * are wrapped by `initCheckoutAddressPanels()`, the labels are the theme's own `.form-floating`
 * markup unfolded, and both revert cleanly by dropping this import.
 * =================================================================== */
.kussin-checkout-panel {
  padding: 18px 16px 6px;
  margin-bottom: var(--wh1-space-md);
  border-radius: 15px;
  /* #E0EFF0 is production's light blue; the theme spells it out because the soft-brand
       token was retired on #70285. */
  background: #e0eff0;
  /* The panel already carries the tint, so the controls inside it stay white to keep the
       contrast production has between a field and the surface it sits on. */
}
.kussin-checkout-panel > h2 {
  margin-bottom: var(--wh1-space-sm);
  color: var(--wh1-color-primary);
  font-size: 1rem;
  font-weight: 700;
}
.kussin-checkout-panel .form-control,
.kussin-checkout-panel .form-select {
  background-color: var(--wh1-color-white);
}
/*
 * Labels above the field instead of floating inside it.
 *
 * Bootstrap's `.form-floating` puts the label after the input and lifts it with a transform. Making
 * the wrapper a reversed column moves the label above without touching the markup, and the floating
 * geometry — the transform, the padding the input reserves for the lifted label, the fixed height —
 * has to be unwound with it or the field keeps a blank strip at the top.
 */
#addressForm .form-floating {
  display: flex;
  flex-direction: column-reverse;
  /* With the label out of the box there is nothing left to animate, and the rules Bootstrap
       applies on focus and on a filled field would otherwise shrink the static label. */
}
#addressForm .form-floating > label {
  position: static;
  height: auto;
  padding: 0 0 4px;
  border: 0;
  color: var(--wh1-color-primary);
  font-size: var(--wh1-font-size-sm);
  font-weight: 400;
  line-height: 1.3;
  transform: none;
  pointer-events: auto;
  /* Only a required field's label is bold, that is the one cue the note under the form
           points at. Setting every label bold made the optional phone read as mandatory. */
}
#addressForm .form-floating > label.req {
  font-weight: 700;
}
#addressForm .form-floating > .form-control,
#addressForm .form-floating > .form-select {
  height: auto;
  min-height: 44px;
  padding-top: 10px;
  padding-bottom: 10px;
  line-height: 1.4;
}
#addressForm .form-floating > .form-control:not(:-moz-placeholder) ~ label {
  transform: none;
  opacity: 1;
}
#addressForm .form-floating > .form-control:focus ~ label,
#addressForm .form-floating > .form-control:not(:placeholder-shown) ~ label,
#addressForm .form-floating > .form-select ~ label {
  transform: none;
  opacity: 1;
}
/* Production marks a required field by setting its label in bold and saying so once underneath the
   form, rather than hanging an asterisk on every one of them. */
#addressForm .form-floating > label.req::after {
  content: "";
}
/*
 * The step's own two controls, the back link under the panels and the forward button under the
 * summary, sat flush against the edges of their columns while everything between them was inset.
 * They take the same space the top bar takes, so all four buttons on a step line up on one inset.
 *
 * Both are full width on a phone and the forward one carries `w-100`, whose width is marked
 * important, so a margin alone would simply push them past their column. The cap does the work
 * instead: a width of 100% is held to the column less the two margins, which no longer overflows
 * and needs nothing marked important to beat.
 *
 * The basket page is left out. It is flat rather than panelled, and its "Zur Kasse" button belongs
 * to the totals directly above it.
 */
.is-checkout:not(.cl-basket) .btn-back,
.is-checkout:not(.cl-basket) .btn-highlight.w-100 {
  max-width: calc(100% - (2 * var(--wh1-space-md)));
  margin: var(--wh1-space-md);
}
/*
 * The panels replace APEX's cards, so the card chrome underneath them has to go: its white
 * background showed as a strip behind every heading and framed the whole step in a second box that
 * production does not have.
 */
.kussin-checkout-panel > .card-header,
.kussin-checkout-panel > h2 {
  padding-left: 0;
  padding-right: 0;
  border-bottom: 0;
  background: transparent;
  /* #70294 — the rule under the heading is APEX's own, inset by the header padding APEX has and
       this panel does not, so it started a step to the right of the first letter. It runs from the
       text's own edge now. */
}
.kussin-checkout-panel > .card-header::after,
.kussin-checkout-panel > h2::after {
  left: 0;
  right: 0;
}
/* #70294 — the cart and the coupon box keep the basket page's white; only the data panels are
   tinted, so the two read as the same thing the customer saw on the first step. */
.kussin-checkout-panel:has(> #orderEditCart),
.kussin-checkout-panel:has(> .kussin-voucher-box) {
  background: var(--wh1-color-white);
}
.kussin-checkout-panel > .card-body {
  padding-left: 0;
  padding-right: 0;
}
.is-checkout .card:has(> .kussin-checkout-panel),
.is-checkout .card.active:has(> .kussin-checkout-panel) {
  border: 0;
  background: transparent;
}
/* ===================================================================
 * #70293 — the payment and shipping step.
 *
 * The markup already carries everything the step needs: a radio and a name per method, the method's
 * long description behind `.payment-option-info` (revealed for the selected one by `.activePayment`),
 * its surcharge in `.payment-option-price`, and the carrier's cost in `#shipSetCost`. None of it was
 * styled, so the methods ran together as a plain list, the description read as body copy and the
 * price sat inline with the name.
 *
 * Each method is therefore given the same treatment the fields on the address step have — white on
 * the panel's tint — with the chosen one marked by the shop's teal rather than by a colour swap, so
 * this holds whether the step offers one method or the four production shows.
 * =================================================================== */
.kussin-checkout-panel {
  /* The description belongs to the method above it, so it is indented past the radio and set
       quieter than the name it explains. */
  /* The carrier's cost, the one figure that changes the total on this step. */
}
.kussin-checkout-panel .payment-option {
  display: flex;
  flex-wrap: wrap;
  gap: var(--wh1-space-xs) var(--wh1-space-md);
  align-items: flex-start;
  justify-content: space-between;
  padding: 14px 16px;
  margin-bottom: var(--wh1-space-sm);
  border: var(--wh1-border-width) solid transparent;
  border-radius: 15px;
  background: var(--wh1-color-white);
  /* The selected method keeps the surface and gains an edge — a filled row would fight the
           radio, which is already saying the same thing. */
}
.kussin-checkout-panel .payment-option:has(input[type="radio"]:checked) {
  border-color: var(--wh1-color-primary);
}
.kussin-checkout-panel .payment-option-form {
  flex: 1 1 16rem;
  min-width: 0;
}
.kussin-checkout-panel .payment-option .form-check-label {
  margin-left: var(--wh1-space-xs);
  color: var(--wh1-color-primary);
  font-weight: 700;
}
.kussin-checkout-panel .payment-option-info {
  margin-top: var(--wh1-space-xs);
  padding-left: 1.75rem;
}
.kussin-checkout-panel .payment-option-info .desc {
  color: var(--wh1-color-primary);
  font-size: var(--wh1-font-size-sm);
  line-height: 1.5;
  /* #70364 — the description is editor-authored HTML and comes out of the admin's rich
               text field with whatever the text was pasted with. PayPal's carries
               `white-space: nowrap` on every span, so both of its sentences ran straight out of
               the card and were cut off at its edge. Nothing an editor pastes may decide whether
               the text fits, hence the override on the descendants: an inline style only loses to
               `!important`. */
  white-space: normal;
  overflow-wrap: anywhere;
}
.kussin-checkout-panel .payment-option-info .desc * {
  white-space: normal !important;
}
.kussin-checkout-panel .payment-option-price {
  /* APEX pins the figure to `right: 0; top: 0` of the row, which put it on the card's own
           border and ignored the padding, so the amount touched the rounded edge. Back into the
           flow, where `space-between` places it inside the padding like everything else. */
  position: static;
  flex: 0 0 auto;
  color: var(--wh1-color-primary);
  font-weight: 700;
  text-align: right;
  white-space: nowrap;
}
.kussin-checkout-panel #shipSetCost {
  margin-top: var(--wh1-space-sm);
  color: var(--wh1-color-primary);
  font-weight: 700;
}
/* #70406: A module-wrapped option can be its parent's last child while more methods follow. */
#payment .kussin-checkout-panel > .card-body > .payment-option:last-child {
  margin-bottom: 0;
}
/* ===================================================================
 * #70292, review of 2026-09-03 — the desktop form in production's shape.
 *
 * Measured on www.warehouse-one.de at 1440, guest and account forms alike: the label stands in a
 * right-aligned column beside its field (24% of the form), bold for a required field and regular
 * for an optional one, without an asterisk; a name, a phone number, a company each take a row of
 * their own; street and number, postcode and town share one row behind one label; the date of
 * birth is three fields behind one label; and the note under the fields sits in a bordered box
 * aligned with the fields. Ours kept the labels above the fields inside the panels and printed the
 * note as a bare line, which is what the reviewer put beside the production screenshot.
 *
 * Desktop only: the phone layout was approved as it is, so below md the panel treatment above is
 * all that applies. The markup is APEX's and untouched; the checkout (`#addressForm`) and the
 * account page (`.cl-register`) render the same fieldsets, so one set of rules serves both.
 * =================================================================== */
@media (min-width: 768px) {
  #addressForm,
  .cl-register form.needs-validation {
    --kussin-address-label-col: 30%;
    --kussin-address-label-gap: 12px;
    /* The server-rendered message (`message/inputvalidation.html.twig`) is not inside the
           floating box but its next sibling, so the grid placement above does not reach it and it
           sat under the label column. Set right like the labels, it ends under the field. */
    /* One field per row. The pairs APEX sets side by side (first and last name, phone and fax,
           company and VAT id) would each carry a label column of their own and leave the fields a
           third as wide. */
    /* Street and number, postcode and town: one row behind one label, the second field's label
           dropped, so the row reads "Straße [street] [no.]" and "PLZ [code] [town]" as production
           sets them. The column wrappers and the floating boxes dissolve into the row's own grid. */
    /* Date of birth: the section label to the left, the three fields behind it on their APEX
           widths, each showing its own placeholder. */
    /* The consent and the "same as billing" ticks stand in the field column, as they do in
           production. */
    /* The note: production's bordered box under the fields, in the field column, set the way
           the order step's own notice is set. */
  }
  #addressForm .form-floating,
  .cl-register form.needs-validation .form-floating {
    display: grid;
    grid-template-columns: var(--kussin-address-label-col) minmax(0, 1fr);
    -moz-column-gap: var(--kussin-address-label-gap);
         column-gap: var(--kussin-address-label-gap);
    align-items: center;
    /* Bootstrap prints the validation message as a sibling of the input inside the
               floating box, so once that box is a two-column grid the message is a grid item as
               well. Without a placement it is auto-flowed into the first free cell, which is the
               label column on the row below, and "Please specify a value for this required field."
               ended up under the labels on the far left instead of under the field it belongs to. */
  }
  #addressForm .form-floating > label,
  .cl-register form.needs-validation .form-floating > label {
    position: static;
    grid-row: 1;
    grid-column: 1;
    height: auto;
    margin: 0;
    padding: 0;
    border: 0;
    color: var(--wh1-color-primary);
    font-size: var(--wh1-font-size-sm);
    font-weight: 400;
    line-height: 1.3;
    text-align: right;
    transform: none;
    opacity: 1;
    pointer-events: auto;
    /* The bold label is the mark, the note under the form says so; no asterisk. */
  }
  #addressForm .form-floating > label.req,
  .cl-register form.needs-validation .form-floating > label.req {
    font-weight: 700;
  }
  #addressForm .form-floating > label::after,
  .cl-register form.needs-validation .form-floating > label::after {
    content: "";
  }
  #addressForm .form-floating > .form-control,
  .cl-register form.needs-validation .form-floating > .form-control,
  #addressForm .form-floating > .form-select,
  .cl-register form.needs-validation .form-floating > .form-select {
    grid-row: 1;
    grid-column: 2;
    height: auto;
    min-height: 44px;
    padding-top: 10px;
    padding-bottom: 10px;
    line-height: 1.4;
  }
  #addressForm .form-floating > .form-control:not(:-moz-placeholder) ~ label, .cl-register form.needs-validation .form-floating > .form-control:not(:-moz-placeholder) ~ label {
    transform: none;
    opacity: 1;
  }
  #addressForm .form-floating > .form-control:focus ~ label,
  .cl-register form.needs-validation .form-floating > .form-control:focus ~ label,
  #addressForm .form-floating > .form-control:not(:placeholder-shown) ~ label,
  .cl-register form.needs-validation .form-floating > .form-control:not(:placeholder-shown) ~ label,
  #addressForm .form-floating > .form-select ~ label,
  .cl-register form.needs-validation .form-floating > .form-select ~ label {
    transform: none;
    opacity: 1;
  }
  #addressForm .form-floating > .invalid-feedback,
  .cl-register form.needs-validation .form-floating > .invalid-feedback,
  #addressForm .form-floating > .valid-feedback,
  .cl-register form.needs-validation .form-floating > .valid-feedback {
    grid-row: 2;
    grid-column: 2;
    text-align: right;
  }
  #addressForm .form-floating + .invalid-feedback,
  .cl-register form.needs-validation .form-floating + .invalid-feedback {
    text-align: right;
  }
  #addressForm .row.gx-2 > [class*="col-"],
  .cl-register form.needs-validation .row.gx-2 > [class*="col-"] {
    flex: 0 0 100%;
    max-width: 100%;
  }
  #addressForm .row.gx-2:has([name$="[oxuser__oxstreetnr]"]),
  .cl-register form.needs-validation .row.gx-2:has([name$="[oxuser__oxstreetnr]"]),
  #addressForm .row.gx-2:has([name$="[oxuser__oxcity]"]),
  .cl-register form.needs-validation .row.gx-2:has([name$="[oxuser__oxcity]"]) {
    display: grid;
    grid-template-columns: var(--kussin-address-label-col) minmax(0, 2fr) minmax(0, 1fr);
    -moz-column-gap: var(--kussin-address-label-gap);
         column-gap: var(--kussin-address-label-gap);
    align-items: center;
    margin: 0 0 var(--wh1-space-md);
  }
  #addressForm .row.gx-2:has([name$="[oxuser__oxstreetnr]"]) > [class*="col-"],
  .cl-register form.needs-validation .row.gx-2:has([name$="[oxuser__oxstreetnr]"]) > [class*="col-"],
  #addressForm .row.gx-2:has([name$="[oxuser__oxcity]"]) > [class*="col-"],
  .cl-register form.needs-validation .row.gx-2:has([name$="[oxuser__oxcity]"]) > [class*="col-"],
  #addressForm .row.gx-2:has([name$="[oxuser__oxstreetnr]"]) .form-floating,
  .cl-register form.needs-validation .row.gx-2:has([name$="[oxuser__oxstreetnr]"]) .form-floating,
  #addressForm .row.gx-2:has([name$="[oxuser__oxcity]"]) .form-floating,
  .cl-register form.needs-validation .row.gx-2:has([name$="[oxuser__oxcity]"]) .form-floating {
    display: contents;
  }
  #addressForm .row.gx-2:has([name$="[oxuser__oxstreetnr]"]) > [class*="col-"]:last-child .form-floating > label,
  .cl-register form.needs-validation .row.gx-2:has([name$="[oxuser__oxstreetnr]"]) > [class*="col-"]:last-child .form-floating > label,
  #addressForm .row.gx-2:has([name$="[oxuser__oxcity]"]) > [class*="col-"]:last-child .form-floating > label,
  .cl-register form.needs-validation .row.gx-2:has([name$="[oxuser__oxcity]"]) > [class*="col-"]:last-child .form-floating > label {
    display: none;
  }
  #addressForm .row.gx-2:has([name$="[oxuser__oxstreetnr]"]) > [class*="col-"]:last-child .form-floating > .form-control,
  .cl-register form.needs-validation .row.gx-2:has([name$="[oxuser__oxstreetnr]"]) > [class*="col-"]:last-child .form-floating > .form-control,
  #addressForm .row.gx-2:has([name$="[oxuser__oxcity]"]) > [class*="col-"]:last-child .form-floating > .form-control,
  .cl-register form.needs-validation .row.gx-2:has([name$="[oxuser__oxcity]"]) > [class*="col-"]:last-child .form-floating > .form-control {
    grid-column: 3;
  }
  #addressForm .row.gx-2:has([name$="[oxuser__oxcity]"]),
  .cl-register form.needs-validation .row.gx-2:has([name$="[oxuser__oxcity]"]) {
    grid-template-columns: var(--kussin-address-label-col) minmax(0, 1fr) minmax(0, 2fr);
  }
  #addressForm .oxDate,
  .cl-register form.needs-validation .oxDate {
    display: grid;
    grid-template-columns: var(--kussin-address-label-col) minmax(0, 1fr);
    -moz-column-gap: var(--kussin-address-label-gap);
         column-gap: var(--kussin-address-label-gap);
    align-items: center;
  }
  #addressForm .oxDate > label,
  .cl-register form.needs-validation .oxDate > label {
    margin: 0;
    color: var(--wh1-color-primary);
    font-size: var(--wh1-font-size-sm);
    text-align: right;
  }
  #addressForm .oxDate > .row,
  .cl-register form.needs-validation .oxDate > .row {
    margin-top: 0;
    margin-bottom: 0;
  }
  #addressForm .oxDate > .row > [class*="col-"],
  .cl-register form.needs-validation .oxDate > .row > [class*="col-"] {
    flex: 0 0 auto;
    max-width: none;
  }
  #addressForm .oxDate .form-floating,
  .cl-register form.needs-validation .oxDate .form-floating {
    display: block;
    /* The floating-label rule in components/ui/forms.less hides every placeholder; with the
                   label gone these three are the only cue. */
  }
  #addressForm .oxDate .form-floating > label,
  .cl-register form.needs-validation .oxDate .form-floating > label {
    display: none;
  }
  #addressForm .oxDate .form-floating > .form-control::-moz-placeholder, .cl-register form.needs-validation .oxDate .form-floating > .form-control::-moz-placeholder {
    color: var(--wh1-color-muted);
    opacity: 1;
  }
  #addressForm .oxDate .form-floating > .form-control::placeholder,
  .cl-register form.needs-validation .oxDate .form-floating > .form-control::placeholder {
    color: var(--wh1-color-muted);
    opacity: 1;
  }
  #addressForm .form-check,
  .cl-register form.needs-validation .form-check {
    margin-left: calc(var(--kussin-address-label-col) + var(--kussin-address-label-gap));
  }
  #addressForm .req-warning,
  .cl-register form.needs-validation .req-warning {
    margin: var(--wh1-space-md) 0 0 calc(var(--kussin-address-label-col) + var(--kussin-address-label-gap));
    padding: 12px 16px;
    border: var(--wh1-border-width) solid var(--wh1-color-border-strong);
    color: var(--wh1-color-primary);
    background: var(--wh1-color-white);
    font-size: var(--wh1-font-size-sm);
  }
}
/*
 * #70292, round 4 (2026-09-11) — the register page ("Konto eröffnen") in production's shape.
 *
 * Compared against www.warehouse-one.de/index.php?cl=register at 1440 and 390: production opens
 * with the breadcrumb and a page header with a rule under it, names the two sections with plain
 * headings, lets the form use the content column, prints the newsletter tick with its label on one
 * line and the two texts below it in the field column, and asks for the date of birth right under
 * the name. Ours had APEX' small h3 without breadcrumb, card headers with a rule, a 600px form,
 * the tick beside the texts, and the birthdate last.
 *
 * The desktop label column itself comes from pages/checkout-address.less; this file only adds what
 * the register page needs on top.
 */
.cl-register {
  /* The two sections are headings over a plain form, not cards. */
  /* Production's form spans the content column; APEX caps it at 600px. */
  /* Date of birth right under the name, as production asks for it. The billing fieldset is APEX'
       and its markup stays; the container becomes a column and the three blocks move up. */
}
.cl-register .page-header {
  margin: 0 0 var(--wh1-space-lg);
  padding-bottom: 9px;
  border-bottom: var(--wh1-border-width) solid var(--wh1-color-border);
  font-size: var(--wh1-heading-size-h1);
  font-weight: var(--wh1-heading-weight);
  line-height: var(--wh1-heading-line-height);
  color: var(--wh1-color-primary);
}
.cl-register form.needs-validation > .card-header {
  margin: 0 0 var(--wh1-space-sm);
  padding: 0;
  border: 0;
  background: transparent;
  font-size: var(--wh1-heading-size-h3);
  font-weight: var(--wh1-heading-weight);
  color: var(--wh1-color-primary);
  /* APEX draws a rule under every card header; production has none here. */
}
.cl-register form.needs-validation > .card-header::after {
  content: none;
}
.cl-register form.needs-validation > .card-body {
  padding: 0 0 var(--wh1-space-lg);
}
.cl-register .card.card-lg {
  border: 0;
  background: transparent;
}
.cl-register .max-600 {
  max-width: 900px;
}
.cl-register #registerAdrressForm {
  display: flex;
  flex-direction: column;
}
.cl-register #registerAdrressForm > .row.gx-2:has([name$="[oxuser__oxsal]"]) {
  order: -3;
}
.cl-register #registerAdrressForm > .row.gx-2:has([name$="[oxuser__oxfname]"]) {
  order: -2;
}
.cl-register #registerAdrressForm > .oxDate {
  order: -1;
}
/* Desktop: the save button stands in the field column under the note, as production sets it. The
   label column itself is defined in pages/checkout-address.less. */
@media (min-width: 768px) {
  .cl-register form.needs-validation #registerAdrressForm > .mb-3:has(> button[type="submit"]) {
    margin-left: calc(var(--kussin-address-label-col) + var(--kussin-address-label-gap));
  }
}
/* #70476: Unzer owns the namespaced template. Style its existing field groups
   without changing payment data, forms, or the module's deletion handler. */
/* The module also emits a duplicate heading before layout/page and the header. */
body.cl-unzer_saved_payments > .container-xxl.py-5:has(> .row > h3.page-header) {
  display: none;
}
.cl-unzer_saved_payments .card.card-lg {
  overflow: visible;
  border: var(--wh1-border-width) solid var(--wh1-color-surface-soft);
  border-radius: 0;
  box-shadow: none;
}
.cl-unzer_saved_payments .card.card-lg > .card-header {
  padding: 0;
  border: 0;
  border-radius: 0;
  background: var(--wh1-color-white);
  color: var(--wh1-color-primary);
  /* Limit the destructive action's hit area to its visible button. */
}
.cl-unzer_saved_payments .card.card-lg > .card-header > .row {
  margin: 0;
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr)) minmax(0, 1.4fr);
}
.cl-unzer_saved_payments .card.card-lg > .card-header > .row > .col-3 {
  width: auto;
  min-width: 0;
  padding: var(--wh1-space-sm) var(--wh1-space-md);
  overflow-wrap: anywhere;
}
.cl-unzer_saved_payments .card.card-lg > .card-header > .row > .col-3 > strong {
  display: block;
  margin-bottom: var(--wh1-space-xs);
  font-weight: 800;
  overflow-wrap: normal;
}
.cl-unzer_saved_payments .card.card-lg > .card-header > .row > .col-3:nth-child(odd) {
  background: var(--wh1-color-surface-soft);
}
.cl-unzer_saved_payments .card.card-lg > .card-header form {
  margin: 0;
  min-width: 0;
}
.cl-unzer_saved_payments .card.card-lg > .card-header .btn {
  max-width: 100%;
  min-height: 44px;
  padding: var(--wh1-space-xs) var(--wh1-space-sm);
  white-space: normal;
}
.cl-unzer_saved_payments .card.card-lg > .card-header .stretched-link::after {
  content: none;
}
@media (max-width: 991.98px) {
  .cl-unzer_saved_payments .card.card-lg > .card-header > .row {
    grid-template-columns: minmax(0, 1fr);
  }
  .cl-unzer_saved_payments .card.card-lg > .card-header > .row > .col-3 {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    gap: var(--wh1-space-sm);
    align-items: start;
    padding: var(--wh1-space-xs) var(--wh1-space-sm);
    border-bottom: var(--wh1-border-width) solid var(--wh1-color-surface-soft);
    background: var(--wh1-color-white);
  }
  .cl-unzer_saved_payments .card.card-lg > .card-header > .row > .col-3:nth-child(odd) {
    background: var(--wh1-color-white);
  }
  .cl-unzer_saved_payments .card.card-lg > .card-header > .row > .col-3:nth-child(odd of :not(:empty)) {
    background: var(--wh1-color-surface-soft);
  }
  .cl-unzer_saved_payments .card.card-lg > .card-header > .row > .col-3 > strong {
    margin: 0;
  }
  .cl-unzer_saved_payments .card.card-lg > .card-header > .row > .col-3 > span {
    min-width: 0;
  }
  .cl-unzer_saved_payments .card.card-lg > .card-header > .row > .col-3:empty {
    display: none;
  }
  .cl-unzer_saved_payments .card.card-lg > .card-header > .row > .col-3:last-child {
    align-items: center;
    border-bottom: 0;
  }
}
/*
 * #70526 — the order history ("Bestellhistorie") in the shape of the live shop.
 *
 * APEX' card is flat in this theme (border width 0, white header), so on the live test the orders
 * ran into each other: four bare columns, then "Warenkorb", then the next date. Production draws
 * each order as a panel: a thin frame, a tinted heading with the four labels, the cart in a white
 * body, a clear gap between orders. Same rule shape as the saved-payments page (#70476); the
 * difference is the heading, which keeps its four columns down to tablet width and turns into
 * label/value rows on the phone, where four columns at 390px broke every word in two.
 */
.cl-account_order .card.card-lg {
  overflow: visible;
  margin-bottom: var(--wh1-space-xl) !important;
  /* .mb-3 on the markup is !important too */
  border: var(--wh1-border-width) solid var(--wh1-color-border);
  border-radius: var(--wh1-radius-xs);
  box-shadow: none;
}
.cl-account_order .card.card-lg > .card-header {
  padding: var(--wh1-space-sm) var(--wh1-space-md);
  border: 0;
  border-bottom: var(--wh1-border-width) solid var(--wh1-color-border);
  border-radius: 0;
  background: var(--wh1-color-surface-soft);
  color: var(--wh1-color-primary);
}
.cl-account_order .card.card-lg > .card-header > .row {
  margin: 0;
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: var(--wh1-space-sm);
}
.cl-account_order .card.card-lg > .card-header > .row > .col-3 {
  width: auto;
  min-width: 0;
  padding: 0;
  overflow-wrap: anywhere;
}
.cl-account_order .card.card-lg > .card-header > .row > .col-3 > strong {
  font-weight: 800;
  overflow-wrap: normal;
}
.cl-account_order .card.card-lg > .card-body {
  padding: var(--wh1-space-md);
}
.cl-account_order .card.card-lg > .card-body > strong {
  display: block;
  margin-bottom: var(--wh1-space-2xs);
  color: var(--wh1-color-primary);
}
.cl-account_order .card.card-lg > .card-body > ol.list-unstyled {
  margin: 0;
}
@media (max-width: 767.98px) {
  .cl-account_order {
    /* One line per label: the label keeps a fixed column, the value takes the rest. */
  }
  .cl-account_order .card.card-lg > .card-header > .row {
    grid-template-columns: minmax(0, 1fr);
    gap: var(--wh1-space-2xs);
  }
  .cl-account_order .card.card-lg > .card-header > .row > .col-3 {
    display: flex;
    flex-wrap: wrap;
    -moz-column-gap: var(--wh1-space-xs);
         column-gap: var(--wh1-space-xs);
  }
  .cl-account_order .card.card-lg > .card-header > .row > .col-3 > strong {
    flex: 0 0 7em;
  }
}
#thankyouPage .link {
  text-decoration: underline;
  text-underline-offset: 0.15em;
}
#thankyouPage .link:hover,
#thankyouPage .link:focus-visible {
  text-decoration: underline;
}
/* ===================================================================
 * #70477, the Unzer saved payment lists on the order step.
 *
 * The Unzer module lists a customer's saved cards (and saved SEPA mandates and PayPal accounts,
 * same markup) as a table inside its `.unzerUI.form` wrapper, and Unzer's hosted stylesheet
 * dresses every input in that wrapper as a text field: 11px 1rem of padding, a border and a white
 * ground. The radio that picks the row inherits all of it and renders as an oversized box, and
 * with the text columns beside it the row grows wider than a phone. The body clips sideways
 * overflow, so the radio simply fell off the right edge and could not be reached.
 *
 * The radio is set back to the theme's own radio. Below the tablet breakpoint each row folds into
 * two lines, the row's name (card number, holder, e-mail) above the remaining values, with the
 * radio beside both lines on the right. The column headings go there because the values explain
 * themselves. The wrapper scrolls on its own should a row still be wider than the panel, so the
 * page never has to.
 * =================================================================== */
.savedpayment {
  overflow-x: auto;
  /* Unzer's `.unzerUI.form input:not(.unzerChoices__input)` weighs (0,3,1) and the module pins
       `-webkit-appearance: radio` on the element itself, so the appearance needs the importance
       and everything else one class more. The look is the theme's `.form-check-input` radio. */
}
.savedpayment .table {
  margin-bottom: 0;
}
.savedpayment .table > :not(caption) > * > * {
  vertical-align: middle;
}
.savedpayment .unzerUI.form input[type="radio"] {
  -moz-appearance: none !important;
       appearance: none !important;
  -webkit-appearance: none !important;
  box-sizing: border-box;
  display: block;
  width: 1.2em;
  height: 1.2em;
  margin: 0;
  padding: 0;
  border: var(--wh1-border-width) solid var(--wh1-color-border-strong);
  border-radius: 50%;
  background: var(--wh1-color-white) center / contain no-repeat;
  box-shadow: none;
  line-height: 1;
  cursor: pointer;
  /* Unzer's rule also sets `outline: none`, which outweighs the theme's generic focus ring. */
}
.savedpayment .unzerUI.form input[type="radio"]:checked {
  background-color: var(--wh1-color-surface-soft);
  border-color: var(--wh1-color-primary);
  background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%230f555c'/%3e%3c/svg%3e");
}
.savedpayment .unzerUI.form input[type="radio"]:focus-visible {
  outline: 3px solid var(--wh1-color-primary);
  outline-offset: 2px;
  box-shadow: 0 0 0 2px var(--wh1-color-white);
}
@media (max-width: 767.98px) {
  .savedpayment .table {
    display: block;
  }
  .savedpayment .table > thead {
    display: none;
  }
  .savedpayment .table > tbody {
    display: block;
  }
  .savedpayment .table > tbody > tr {
    display: grid;
    grid-template-columns: max-content max-content 1fr auto;
    -moz-column-gap: var(--wh1-space-sm);
         column-gap: var(--wh1-space-sm);
    row-gap: 2px;
    align-items: center;
    padding: var(--wh1-space-xs) 0;
    border-bottom: var(--wh1-border-width) solid var(--wh1-color-surface-soft);
    /* The row's name takes the first line across every column but the radio's. The other
               values place themselves on the second line. */
    /* The radio keeps both lines company on the right. */
  }
  .savedpayment .table > tbody > tr > * {
    display: block;
    min-width: 0;
    padding: 0;
    border: 0;
    overflow-wrap: anywhere;
  }
  .savedpayment .table > tbody > tr > th[scope="row"] {
    grid-column: 1 / -2;
  }
  .savedpayment .table > tbody > tr > td:last-child {
    grid-column: -2 / -1;
    grid-row: 1 / span 2;
  }
}
.table {
  --bs-table-border-color: var(--wh1-color-surface-soft);
  border-color: var(--wh1-color-surface-soft);
}
.table,
.table th,
.table td,
.table .text-muted {
  color: var(--wh1-color-primary);
}
.table > :not(caption) > * > * {
  border-color: var(--wh1-color-surface-soft);
}
.table-striped > tbody > tr:nth-of-type(odd) > * {
  --bs-table-accent-bg: var(--wh1-color-surface-soft);
  background-color: var(--wh1-color-surface-soft);
}
.pagination {
  display: inline-flex;
  gap: 0;
  margin-top: 0;
  margin-bottom: 0;
  padding-left: 0;
}
.pagination .page-item {
  margin: 0 !important;
  /* #69981 — the first/last cells render a `&laquo;` / `&raquo;` text
         * glyph (apex/tpl/widget/locator/paging.html.twig). Guillemets sit on
         * the baseline, so centring the line box leaves the arrow ~3px below
         * the cell centre while the digits look centred. Same correction as
         * `components/factfinder/pagination.less`. */
}
.pagination .page-item + .page-item .page-link {
  margin-left: -1px !important;
}
.pagination .page-item:first-child .page-link {
  padding-right: 25px;
  padding-left: 25px;
  border-top-left-radius: var(--wh1-radius-pill);
  border-bottom-left-radius: var(--wh1-radius-pill);
}
.pagination .page-item:last-child .page-link {
  padding-right: 25px;
  padding-left: 25px;
  border-top-right-radius: var(--wh1-radius-pill);
  border-bottom-right-radius: var(--wh1-radius-pill);
}
.pagination .page-item:first-child,
.pagination .page-item:last-child {
  /* the disabled arrow has no wrapper span: shift the flex content
             * by trading padding-top for padding-bottom (net height unchanged) */
}
.pagination .page-item:first-child .page-link > span[aria-hidden="true"],
.pagination .page-item:last-child .page-link > span[aria-hidden="true"] {
  transform: translateY(-0.15em);
}
.pagination .page-item:first-child span.page-link,
.pagination .page-item:last-child span.page-link {
  padding-top: calc(10px - 0.15em);
  padding-bottom: calc(10px + 0.15em);
}
.pagination .page-item.active .page-link {
  position: relative;
  z-index: 2;
  color: var(--wh1-color-primary);
  background: var(--wh1-color-surface-soft);
  border-color: var(--wh1-color-primary);
  text-decoration: none;
}
.pagination .page-link {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 44px;
  min-height: 44px;
  margin: 0 !important;
  padding: 10px 16px;
  color: var(--wh1-color-primary);
  background: var(--wh1-color-white);
  border-width: var(--wh1-border-width);
  border-style: solid;
  border-color: var(--wh1-color-primary);
  border-radius: 0;
  box-shadow: none;
  text-decoration: none;
}
.pagination .page-link:hover,
.pagination .page-link:focus {
  position: relative;
  z-index: 2;
  color: var(--wh1-color-white);
  background: var(--wh1-color-primary);
  border-color: var(--wh1-color-primary);
  text-decoration: none;
}
.pagination .page-item.disabled .page-link {
  color: var(--wh1-color-muted);
  background: var(--wh1-color-white);
  border-color: var(--wh1-color-border-strong);
  text-decoration: none;
}
.details-related {
  background: var(--wh1-color-white);
}
.kussin-product-carousel {
  --kussin-product-carousel-desktop-items: 5;
  --kussin-product-carousel-gap: var(--wh1-space-md);
  display: block;
  margin-bottom: var(--wh1-space-2xl);
}
.kussin-product-carousel .kussin-product-carousel-header {
  margin-bottom: var(--wh1-space-lg);
}
.kussin-product-carousel .kussin-product-carousel-title {
  margin: 0;
  color: var(--wh1-color-primary);
  font-family: 'Muli', sans-serif;
  font-size: 1.5rem;
  font-style: normal;
  font-weight: 700;
  line-height: 1.25;
}
.kussin-product-carousel .kussin-product-carousel-subtitle {
  margin: var(--wh1-space-sm) 0 0;
  color: var(--wh1-color-primary);
}
.kussin-product-carousel .kussin-product-carousel-stage {
  position: relative;
}
.kussin-product-carousel .kussin-product-carousel-track {
  display: flex;
  gap: var(--kussin-product-carousel-gap);
  width: 100%;
  margin: 0;
  padding: 0;
  overflow-x: auto;
  overflow-y: hidden;
  scroll-behavior: smooth;
  scroll-snap-type: x mandatory;
  scrollbar-width: none;
}
.kussin-product-carousel .kussin-product-carousel-track::-webkit-scrollbar {
  display: none;
}
.kussin-product-carousel[data-kussin-product-carousel-infinite] .kussin-product-carousel-track {
  overscroll-behavior-x: contain;
}
.kussin-product-carousel [data-kussin-infinite-clone] {
  pointer-events: none;
  -webkit-user-select: none;
     -moz-user-select: none;
          user-select: none;
}
.kussin-product-carousel .kussin-product-carousel-slide {
  display: block;
  flex: 0 0 calc((100% - (var(--kussin-product-carousel-desktop-items) - 1) * var(--kussin-product-carousel-gap)) / var(--kussin-product-carousel-desktop-items));
  width: auto;
  min-width: 0;
  max-width: none;
  height: auto;
  margin: 0;
  padding: 0;
  scroll-snap-align: start;
}
.kussin-product-carousel .kussin-product-carousel-slide > .card,
.kussin-product-carousel .kussin-product-carousel-slide > .product-card,
.kussin-product-carousel .kussin-product-carousel-slide .kussin-factfinder-record-card {
  height: 100%;
}
.kussin-product-carousel .kussin-product-carousel-arrows {
  pointer-events: none;
}
.kussin-product-carousel .kussin-product-carousel-arrow {
  position: absolute;
  top: 50%;
  z-index: 21;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 48px;
  height: 48px;
  padding: 0;
  color: var(--wh1-color-primary);
  background: var(--wh1-color-white);
  border: var(--wh1-border-width) solid var(--wh1-color-surface-soft);
  border-radius: 50%;
  box-shadow: var(--wh1-shadow-md);
  opacity: 0;
  pointer-events: auto;
  transform: translateY(-50%);
  transition: opacity 160ms ease, color 160ms ease, background-color 160ms ease;
}
.kussin-product-carousel .kussin-product-carousel-arrow svg {
  width: 20px;
  height: 20px;
  fill: currentColor;
}
.kussin-product-carousel .kussin-product-carousel-arrow:hover,
.kussin-product-carousel .kussin-product-carousel-arrow:focus-visible {
  color: var(--wh1-color-white);
  background: var(--wh1-color-primary);
}
.kussin-product-carousel .kussin-product-carousel-arrow:disabled {
  opacity: 0;
  pointer-events: none;
}
.kussin-product-carousel:hover .kussin-product-carousel-arrow:not(:disabled),
.kussin-product-carousel:focus-within .kussin-product-carousel-arrow:not(:disabled) {
  opacity: 1;
}
.kussin-product-carousel .kussin-product-carousel-arrow-previous {
  left: var(--wh1-space-sm);
}
.kussin-product-carousel .kussin-product-carousel-arrow-next {
  right: var(--wh1-space-sm);
}
.kussin-product-carousel .kussin-product-carousel-dots {
  display: none;
}
@media (min-width: 992px) and (hover: hover) {
  .kussin-product-carousel .kussin-product-carousel-slide .kussin-factfinder-record-variants {
    display: none !important;
  }
  .kussin-product-carousel .kussin-product-carousel-slide:hover .kussin-factfinder-record-card,
  .kussin-product-carousel .kussin-product-carousel-slide:focus-within .kussin-factfinder-record-card {
    border-bottom-color: var(--wh1-color-surface-soft);
    border-radius: var(--wh1-radius-md);
  }
  .kussin-product-carousel .kussin-product-carousel-slide .kussin-factfinder-record-card.kussin-carousel-size-open {
    border-bottom-color: transparent;
    border-bottom-right-radius: 0;
    border-bottom-left-radius: 0;
    box-shadow: none;
  }
}
.kussin-carousel-size-overlay {
  position: fixed;
  z-index: 20;
  box-sizing: border-box;
  padding: 10px 9px;
  background: var(--wh1-color-white);
  border: var(--wh1-border-width) solid var(--wh1-color-surface-soft);
  border-top: 0;
  border-radius: 0 0 var(--wh1-radius-md) var(--wh1-radius-md);
  box-shadow: 0 12px 18px -8px rgba(15, 85, 92, 0.18);
  overflow-y: auto;
  overscroll-behavior: contain;
}
.kussin-carousel-size-overlay ul {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: var(--wh1-space-xs);
  list-style: none;
  margin: 0;
  padding: 0;
}
.kussin-carousel-size-overlay li {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 2rem;
  min-height: 1.75rem;
  padding: 0.2rem 0.45rem;
  font-size: 0.8125rem;
  line-height: 1;
  color: var(--wh1-color-primary);
  border: var(--wh1-border-width) solid var(--wh1-color-primary);
  border-radius: var(--wh1-radius-sm);
}
.kussin-carousel-size-overlay li.sold-out {
  color: var(--wh1-color-muted);
  background: var(--wh1-color-surface-soft);
  border-color: var(--wh1-color-border-strong);
  opacity: 0.65;
  text-decoration: line-through;
}
@media (max-width: 767.98px) {
  .kussin-product-carousel {
    --kussin-product-carousel-gap: var(--wh1-space-md);
    margin-bottom: var(--wh1-space-2xl);
  }
  .kussin-product-carousel .kussin-product-carousel-header {
    margin-bottom: var(--wh1-space-md);
  }
  .kussin-product-carousel .kussin-product-carousel-title {
    font-size: 1.25rem;
  }
  .kussin-product-carousel .kussin-product-carousel-track {
    padding-inline: 60px;
    scroll-padding-inline: 60px;
  }
  .kussin-product-carousel .kussin-product-carousel-slide {
    flex-basis: 100%;
    scroll-snap-align: center;
  }
  .kussin-product-carousel[data-kussin-slider-preview='false'] .kussin-product-carousel-track {
    padding-inline: 0;
    scroll-padding-inline: 0;
  }
  .kussin-product-carousel .kussin-product-carousel-arrows {
    display: none;
  }
  .kussin-product-carousel .kussin-product-carousel-dots {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: var(--wh1-space-sm);
    min-height: 28px;
    margin-top: var(--wh1-space-md);
  }
  .kussin-product-carousel .kussin-product-carousel-dot {
    width: 28px;
    height: 28px;
    padding: 0;
    background: transparent;
    border: 0;
    border-radius: 50%;
  }
  .kussin-product-carousel .kussin-product-carousel-dot::before {
    display: block;
    width: 10px;
    height: 10px;
    margin: auto;
    content: '';
    background: var(--wh1-color-surface-soft);
    border-radius: 50%;
    transition: background-color 160ms ease, transform 160ms ease;
  }
  .kussin-product-carousel .kussin-product-carousel-dot:hover::before,
  .kussin-product-carousel .kussin-product-carousel-dot:focus-visible::before,
  .kussin-product-carousel .kussin-product-carousel-dot[aria-current='true']::before {
    background: var(--wh1-color-primary);
    transform: scale(1.2);
  }
}
@media (prefers-reduced-motion: reduce) {
  .kussin-product-carousel .kussin-product-carousel-track {
    scroll-behavior: auto;
  }
  .kussin-product-carousel .kussin-product-carousel-arrow,
  .kussin-product-carousel .kussin-product-carousel-dot::before {
    transition: none;
  }
}
.kussin-brand-subcategories {
  width: 100%;
  min-width: 0;
  /* #70369 — the row as production draws it (measured on warehouse-one.de/the-north-face/ at
       1440: 285px slots with the artwork inset 20px on either side, so 40px of white between two
       images; a bottom gradient over the artwork; the label bottom-left, 18px regular, uppercase,
       5px 10px in from the corner; 20px chevrons standing 25px outside the row, nothing behind them).
       The stage carries the side room for the chevrons, so they never overlap a tile. */
  --kussin-product-carousel-gap: 40px;
}
.kussin-brand-subcategories .kussin-product-carousel-track {
  list-style: none;
}
.kussin-brand-subcategories .kussin-brand-subcategory-link {
  position: relative;
  display: block;
  overflow: hidden;
  border: 0;
  border-radius: 5px;
  color: var(--wh1-color-white);
  text-decoration: none;
}
.kussin-brand-subcategories .kussin-brand-subcategory-link:focus-visible {
  /* #70425 — white ring inside the tile and the teal ring outside: readable on the photo. */
  outline: 3px solid var(--wh1-color-white);
  outline-offset: -3px;
  box-shadow: 0 0 0 3px var(--wh1-color-primary);
}
.kussin-brand-subcategories .kussin-brand-subcategory-link img {
  display: block;
  width: 100%;
  height: auto;
}
.kussin-brand-subcategories .kussin-brand-subcategory-placeholder {
  display: block;
  aspect-ratio: 600 / 245;
  background: var(--wh1-color-primary);
}
.kussin-brand-subcategories .kussin-product-carousel-stage {
  padding-inline: 45px;
}
.kussin-brand-subcategories .kussin-brand-subcategory-link::after {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  background: linear-gradient(rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0) 50%, rgba(0, 0, 0, 0.3) 75%, rgba(0, 0, 0, 0.3) 100%);
}
.kussin-brand-subcategories .kussin-brand-subcategory-label {
  position: absolute;
  inset: auto 0 0 0;
  z-index: 1;
  display: flex;
  align-items: flex-end;
  justify-content: flex-start;
  padding: 5px 10px;
  color: var(--wh1-color-white);
  text-align: left;
  text-transform: uppercase;
  font-weight: 400;
  font-size: 18px;
  line-height: 1.1;
}
.kussin-brand-subcategories .kussin-product-carousel-arrows {
  display: block;
}
.kussin-brand-subcategories .kussin-product-carousel-arrow {
  width: 20px;
  height: 20px;
  color: var(--wh1-color-primary);
  background: transparent;
  border: 0;
  border-radius: 0;
  box-shadow: none;
}
.kussin-brand-subcategories .kussin-product-carousel-arrow svg {
  width: 20px;
  height: 20px;
}
.kussin-brand-subcategories .kussin-product-carousel-arrow:hover,
.kussin-brand-subcategories .kussin-product-carousel-arrow:focus-visible {
  color: var(--wh1-color-primary-dark);
  background: transparent;
}
.kussin-brand-subcategories .kussin-product-carousel-arrow:not(:disabled) {
  opacity: 1;
}
.kussin-brand-subcategories .kussin-product-carousel-arrow-previous {
  left: 0;
}
.kussin-brand-subcategories .kussin-product-carousel-arrow-next {
  right: 0;
}
@media (max-width: 767.98px) {
  /* #70369 — production on a phone: one 285px image centred in the 365px row, the chevrons at the
       very edges of the row, no neighbour peeking in. The shared carousel hides its arrows below
       768px in favour of dots; this row keeps the chevrons, as production does. */
  .kussin-brand-subcategories .kussin-product-carousel-stage {
    padding-inline: 40px;
  }
  .kussin-brand-subcategories .kussin-product-carousel-track {
    padding-inline: 0;
    scroll-padding-inline: 0;
  }
  .kussin-brand-subcategories .kussin-product-carousel-arrows {
    display: block;
  }
  .kussin-brand-subcategories .kussin-product-carousel-arrow-previous {
    left: -5px;
  }
  .kussin-brand-subcategories .kussin-product-carousel-arrow-next {
    right: -5px;
  }
}
/*
 * Account wish list — WH1-2023 mobile composition on APEX markup.
 *
 * APEX keeps the thumbnail in a 25% column and hides the complete price/actions
 * column below its `md` breakpoint. The production layout instead gives the
 * image a full row and keeps the title plus purchase controls below it. Scope
 * the bridge to the account wish list so other APEX line-list placements retain
 * their parent-theme behavior.
 */
#wishlistProductList .functions .input-group > .btn-highlight {
  border-radius: 0;
}
#wishlistProductList > .line-view > .card {
  margin-bottom: var(--wh1-space-xl) !important;
  padding-bottom: var(--wh1-space-xl);
  border-bottom: var(--wh1-border-default);
}
#wishlistProductList > .line-view > .card > .row > .col-3 > a {
  padding-block: var(--wh1-space-sm) !important;
}
@media (max-width: 767.98px) {
  .wishlistPublish .publish-list > .btn-primary {
    width: 100%;
    margin-bottom: var(--wh1-space-sm);
  }
  #wishlistProductList > .line-view > .card > .row > .col-3,
  #wishlistProductList > .line-view > .card > .row > .col-9 {
    flex: 0 0 100%;
    width: 100%;
    max-width: 100%;
  }
  #wishlistProductList > .line-view > .card > .row > .col-3 .card-img {
    width: auto;
    max-width: 100%;
    height: auto;
    max-height: 150px;
  }
  #wishlistProductList .card-body > .row {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
  #wishlistProductList .card-body > .row > .col-12 {
    grid-column: 1;
    width: auto;
    max-width: none;
  }
  #wishlistProductList .card-body > .row > .d-none.d-md-block {
    display: contents !important;
  }
  #wishlistProductList .functions {
    display: contents;
  }
  #wishlistProductList .functions > .price {
    grid-row: 1;
    grid-column: 2;
  }
  #wishlistProductList .functions > :not(.price) {
    grid-column: 1 / -1;
  }
  #wishlistProductList .functions .input-group {
    flex-wrap: nowrap;
    width: 100%;
  }
  #wishlistProductList .functions .oldPrice {
    display: block;
  }
}
/*
 * Visual CMS brand accordion compatibility.
 *
 * `kussin/visualcms-shortcodes` 2.x retains the legacy
 * `.dd-shortcode-wmdkbrandaccordion` wrapper but emits its OXID 7 content as
 * unclassed direct children. Keep that backend-authored class only as the
 * compatibility boundary; new theme-owned markup must use the `kussin` prefix.
 *
 * The current Onewheel record is expanded on both production and dev1, so this
 * migrates the WH1-2023 presentation without restoring its jQuery UI accordion
 * implementation. The inline padding from the OXID 7 shortcode template has to
 * be overridden to recover the measured production spacing.
 */
.dd-shortcode-wmdkbrandaccordion {
  color: var(--wh1-color-primary);
  font-size: var(--wh1-font-size-sm);
  line-height: 20px;
  /* OXID 6 markup can still occur in migrated/cached CMS fragments. Its
       triggers were hidden for this expanded content and are not part of the
       OXID 7 shortcode output. */
}
.dd-shortcode-wmdkbrandaccordion > div > h3 {
  position: relative;
  margin: 20px 0 10px !important;
  padding: 20px !important;
  overflow: hidden;
  border-radius: var(--wh1-radius-md);
  background: var(--wh1-color-surface-soft);
  color: var(--wh1-color-primary);
  font-size: var(--wh1-font-size-lg);
  font-style: normal;
  font-weight: 400;
  line-height: 22px;
}
.dd-shortcode-wmdkbrandaccordion > div > div {
  padding: 20px !important;
  border-radius: var(--wh1-radius-md);
  background: var(--wh1-color-surface-soft);
  color: var(--wh1-color-primary);
  -moz-column-count: 2;
       column-count: 2;
}
.dd-shortcode-wmdkbrandaccordion > div > h3 .trigger {
  display: none !important;
}
@media (max-width: 480px) {
  .dd-shortcode-wmdkbrandaccordion > div > div {
    -moz-column-count: 1;
         column-count: 1;
  }
}
/*
 * Responsive media compatibility for migrated Visual CMS/WYSIWYG content.
 *
 * APEX uses Bootstrap 5's `.ratio` API, while migrated OXID 6 content still
 * contains Bootstrap 3/4 `.embed-responsive` markup. Recreate that layout with
 * the platform aspect-ratio property instead of restoring old Bootstrap CSS or
 * rewriting persisted CMS HTML.
 */
.embed-responsive {
  position: relative;
  display: block;
  width: 100%;
  overflow: hidden;
}
.embed-responsive-16by9 {
  aspect-ratio: 16 / 9;
}
.embed-responsive > .embed-responsive-item,
.embed-responsive > iframe,
.embed-responsive > embed,
.embed-responsive > object,
.embed-responsive > video {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  border: 0;
}
/*
 * #70351 — the consent placeholder a pasted YouTube embed gets.
 *
 * Under #70351 every YouTube iframe in the page output is handed to the consent manager
 * (`Core\Output` in wh1-core-modifications), which hides the iframe and draws its own
 * "We need your approval" panel in front of it. It sizes that panel from the iframe, and an embed
 * pasted from YouTube carries YouTube's own `width="560" height="315"`.
 *
 * 560px does not fit a CMS text cell — measured 560 inside 434 on the Supermatic product page — so
 * the panel hung out of its column and its heading and body text were cut off on the left.
 *
 * Capping the iframe is enough: the consent manager measures it and sizes the panel to match, so
 * the panel came back at 354px on the same page without being touched directly. Do not put a width
 * on the panel itself — the manager wraps it in a shrink-to-fit box, so a percentage width there
 * resolves against a parent that is sizing itself to the panel, and both collapse to zero.
 *
 * Scoped to Visual CMS cells (`dd-shortcode-*`, on every one of them) so a video attached through
 * the article's media tab keeps the 425x344 box `Model\MediaUrl` gives it.
 */
[class*="dd-shortcode-"] iframe.cmplazyload[data-cmp-src],
[class*="dd-shortcode-"] .cmplazypreviewiframe {
  max-width: 100%;
}
/* ===================================================================
 * #69079 — Gutschify embedded-home widget.
 *
 * The widget arrives as a finished HTML fragment from gutschify.xxiii.tools
 * and brings its own stylesheet, including the tile call-to-action:
 * `.tile a.button { background: var(--color-primary); color: var(--color-secondary) }`.
 * That is a (0,2,0) selector, so the theme's `#wrapper a { color: var(--wh1-color-primary) }`
 * (1,0,1) outranks it and paints the label in the button's own background — the
 * CTA reads as an empty teal bar. Production runs the OXID 6 theme, which has no
 * such `#wrapper a` rule, so there the vendor colours apply.
 *
 * Hand the widget's own custom properties back the win by matching at the same
 * id-level specificity. Nothing here invents colours: every value is the
 * variable Gutschify itself set on the fragment.
 * =================================================================== */
#wrapper .gutschify-widget .gutschify a.button,
#wrapper .gutschify-widget .gutschify a.action-button {
  color: var(--color-secondary);
  text-decoration: none;
}
#wrapper .gutschify-widget .gutschify a.button:hover,
#wrapper .gutschify-widget .gutschify a.button:focus,
#wrapper .gutschify-widget .gutschify a.action-button:hover,
#wrapper .gutschify-widget .gutschify a.action-button:focus {
  color: var(--color-button-hover-text);
  text-decoration: none;
}
/* ===================================================================
 * #69069 — the customer-facing two-factor page.
 *
 * The module ships its own markup with an inline \3c style> block of floated <dl> pairs and bare
 * textareas, which reads as a different site. The template is rewritten to the theme's cards and
 * form controls (composer patch, patches/69069/); these are the few pieces that markup alone
 * cannot carry: the QR needs a quiet framed panel, and the secret, the one-time code and the
 * backup codes are strings people copy or type digit by digit, so they get a monospaced face and
 * room to breathe.
 * =================================================================== */
.kussin-totp-qr {
  border: 1px solid var(--wh1-color-border);
  border-radius: var(--wh1-radius-md);
  background: var(--wh1-color-white);
  /* the module renders the QR as an inline <svg> with no dimensions of its own */
}
.kussin-totp-qr svg,
.kussin-totp-qr img {
  display: block;
  width: 100%;
  max-width: 220px;
  height: auto;
  margin-inline: auto;
}
/* The shared secret is only ever read or copied — never typed into by hand. It is a long base32
   string, so it is set small and tight enough to sit inside the field rather than scroll out of
   it, and on a narrow screen it wraps instead of overflowing. */
.kussin-totp-secret {
  font-family: var(--wh1-font-family-mono, ui-monospace, "SFMono-Regular", Menlo, monospace);
  font-size: 0.8125rem;
  letter-spacing: 0;
  word-break: break-all;
  background: var(--wh1-color-apex-f8f9fa, #f8f9fa);
}
/* Six digits, entered under time pressure from a phone screen. */
.kussin-totp-code {
  max-width: 12ch;
  font-family: var(--wh1-font-family-mono, ui-monospace, "SFMono-Regular", Menlo, monospace);
  font-size: 1.25rem;
  letter-spacing: 0.35em;
  text-align: center;
}
/* Ten recovery codes, one per line: a fixed pitch keeps them scannable. */
.kussin-totp-backupcodes {
  font-family: var(--wh1-font-family-mono, ui-monospace, "SFMono-Regular", Menlo, monospace);
  letter-spacing: 0.04em;
  resize: vertical;
}
.header .meta {
  padding-top: 5px;
  padding-bottom: 0;
  color: var(--wh1-color-primary);
  background-color: var(--wh1-color-white);
  /*
         * #70145 — the header's own flyouts must stay above the mega menu.
         *
         * `kussin/oxid-menu-builder` lifts the whole navigation while it is hovered —
         * `#mainnav.kussin-omb.kussin-omb-dim-on:hover { z-index: 1001 }` in menu_builder.css —
         * and these controls open Bootstrap dropdowns, which sit at `--bs-dropdown-zindex: 1000`.
         * `.header` is `position: relative` with `z-index: auto`, so it opens no stacking context
         * and the two numbers compete directly in the root: 1001 beats 1000 and the open account
         * flyout was sliced by the teal bar and the mega panel. Measured on the home page at
         * 1600x900, `elementFromPoint` inside the open flyout returned an element inside
         * `#mainnav`, both while hovering the bar's dead space and with a panel open.
         *
         * 1002 clears the menu's hover lift and its dim overlay (`.kussin-omb-dim`, 1000) while
         * staying under Bootstrap's modal at 1055.
         */
  /* #70423 — the account trigger sits one level deeper since #70313, inside the
           `.kussin-live-widget` wrapper the per-visitor fetch fills, so the direct-child rule
           stopped matching and the trigger fell back to Bootstrap's `.btn`: black at rest and
           filled with the dark active colour while its menu is open. */
  /* #70232 — "the icons are different".

           Measured against production's meta bar at 1440: the account and basket glyphs sit at
           18x18 there and the globe at 20x20, where this bar drew all three at 30. At that size
           they are half again as tall as the copy beside them and read as a different icon set. */
  /* The caret production draws beside the account icon — a 5px chevron, the same shape the
           language switch uses, so the control announces its dropdown. */
}
.header .meta .meta-wrapper {
  gap: var(--wh1-space-md);
  align-items: center;
}
.header .meta .usp-list,
.header .meta .usp-list .list-inline-item {
  color: var(--wh1-color-primary);
  background-color: var(--wh1-color-white);
}
.header .meta .usp-list .list-inline-item {
  font-size: 12px;
}
.header .meta .kussin-header-usp-link {
  display: inline-flex;
  align-items: center;
  color: inherit;
  text-decoration: none;
}
.header .meta .kussin-header-usp-link:hover,
.header .meta .kussin-header-usp-link:focus {
  color: inherit;
  text-decoration: underline;
}
.header .meta .kussin-header-usp-icon {
  flex: 0 0 20px;
  width: 20px;
  height: 20px;
}
.header .meta svg {
  fill: var(--wh1-color-primary);
}
.header .meta .kussin-header-meta-controls {
  flex: 0 0 auto;
  gap: 2px;
  align-items: center;
  margin-left: auto;
}
.header .meta .kussin-header-meta-account,
.header .meta .dropdowns,
.header .meta .kussin-header-meta-cart {
  position: relative;
  z-index: 1002;
}
.header .meta .kussin-header-meta-account > .btn,
.header .meta .kussin-header-meta-account > .kussin-live-widget > .btn,
.header .meta .dropdowns > .btn,
.header .meta .kussin-header-meta-cart .btn-minibasket {
  position: relative;
  display: inline-flex;
  width: 40px;
  height: 40px;
  padding: 5px;
  align-items: center;
  justify-content: center;
  color: var(--wh1-color-primary);
  background: transparent;
  border-color: transparent;
  box-shadow: none;
}
.header .meta .kussin-header-meta-account > .btn:hover,
.header .meta .kussin-header-meta-account > .kussin-live-widget > .btn:hover,
.header .meta .dropdowns > .btn:hover,
.header .meta .kussin-header-meta-cart .btn-minibasket:hover,
.header .meta .kussin-header-meta-account > .btn:focus,
.header .meta .kussin-header-meta-account > .kussin-live-widget > .btn:focus,
.header .meta .dropdowns > .btn:focus,
.header .meta .kussin-header-meta-cart .btn-minibasket:focus,
.header .meta .kussin-header-meta-account > .btn.show,
.header .meta .kussin-header-meta-account > .kussin-live-widget > .btn.show,
.header .meta .dropdowns > .btn.show,
.header .meta .kussin-header-meta-cart .btn-minibasket.show {
  color: var(--wh1-color-primary-dark);
  background: var(--wh1-color-surface-soft);
  border-color: transparent;
}
.header .meta .kussin-header-meta-account .kussin-header-control-icon,
.header .meta .kussin-header-meta-cart .kussin-header-control-icon {
  /* `flex: none` because the button is a flex row: at 30px the glyphs had room, at
               production's 18 — with the caret now beside the account icon — the account svg was
               allowed to shrink and came out 8px wide against its 18px height. */
  flex: none;
  width: 18px;
  height: 18px;
  fill: currentColor;
}
.header .meta .dropdowns .btn > svg {
  width: 20px;
  height: 20px;
}
.header .meta .kussin-header-control-caret {
  flex: none;
  width: 12px;
  height: 12px;
  margin-left: 7px;
  fill: currentColor;
  vertical-align: middle;
}
.header .meta .kussin-header-meta-cart .btn-text {
  display: none;
}
.header .meta .kussin-header-meta-cart .badge {
  position: absolute;
  top: 0;
  right: -2px;
}
.header .meta .dropdown-menu {
  color: var(--bs-body-color);
}
.header {
  /* The desktop meta bar gives every icon control a 40px square through the more specific
       `.header .meta …` selector. That is correct for language and basket, but it clips the
       account trigger's icon/badge/caret row: the icon overflows left and the caret reaches into
       the language control. Match production's content-sized account button while retaining a
       40px minimum for the guest state. This selector deliberately matches the meta-bar rule's
       specificity and wins through the account-menu partial's later cascade position. */
}
.header .menu-dropdowns,
.header .kussin-header-meta-account {
  /* #70423 — `> .kussin-live-widget > .btn` is the same trigger since #70313 wrapped it in
           the mount point of the per-visitor fetch; every direct-child rule in this file carries
           that variant so the wrapper changes nothing about the look. */
}
.header .menu-dropdowns > .btn,
.header .kussin-header-meta-account > .btn,
.header .menu-dropdowns > .btn.show,
.header .kussin-header-meta-account > .btn.show,
.header .menu-dropdowns > .btn:active,
.header .kussin-header-meta-account > .btn:active,
.header .menu-dropdowns > .btn:focus,
.header .kussin-header-meta-account > .btn:focus,
.header .menu-dropdowns > .btn:hover,
.header .kussin-header-meta-account > .btn:hover,
.header .menu-dropdowns > .kussin-live-widget > .btn,
.header .kussin-header-meta-account > .kussin-live-widget > .btn,
.header .menu-dropdowns > .kussin-live-widget > .btn.show,
.header .kussin-header-meta-account > .kussin-live-widget > .btn.show,
.header .menu-dropdowns > .kussin-live-widget > .btn:active,
.header .kussin-header-meta-account > .kussin-live-widget > .btn:active,
.header .menu-dropdowns > .kussin-live-widget > .btn:focus,
.header .kussin-header-meta-account > .kussin-live-widget > .btn:focus,
.header .menu-dropdowns > .kussin-live-widget > .btn:hover,
.header .kussin-header-meta-account > .kussin-live-widget > .btn:hover {
  color: var(--wh1-color-primary);
  background-color: transparent;
  border-color: transparent;
  box-shadow: none;
}
.header .menu-dropdowns .dropdown-menu,
.header .kussin-header-meta-account .dropdown-menu {
  border-radius: var(--wh1-radius-md);
  overflow: hidden;
  /*
             * #69977 — the entries of the logged-in account menu ("Mein Konto", "Mein
             * Wunschzettel", "Abmelden", …) inherited Bootstrap's --bs-dropdown-link-color
             * (#212529, near-black). Production paints the very same service menu in WH1 green
             * (#0F555C, sampled from www.warehouse-one.de: .service-menu .dropdown-menu a =
             * rgb(15, 85, 92)), so the entries have to carry the brand colour, not just the
             * trigger. The Bootstrap custom properties are set as well so any dropdown chrome
             * that reads them (dividers, headers, keyboard-focused item) follows along instead
             * of falling back to the grey default.
             */
  --bs-dropdown-link-color: var(--wh1-color-primary);
  --bs-dropdown-link-hover-color: var(--wh1-color-primary);
  --bs-dropdown-link-active-color: var(--wh1-color-primary);
  /*
             * Hover is an underline, not a filled row. Bootstrap's default is a tinted
             * background, and production paints none at all — sampled on
             * www.warehouse-one.de, the service menu's entries stay
             * `background-color: rgba(0, 0, 0, 0)` in both the resting and the hovered
             * state. The two `*-bg` custom properties have to go to transparent as well,
             * or the chrome that reads them paints the fill back in behind the item.
             */
  --bs-dropdown-link-hover-bg: transparent;
  --bs-dropdown-link-active-bg: transparent;
}
.header .menu-dropdowns .dropdown-menu .dropdown-item,
.header .kussin-header-meta-account .dropdown-menu .dropdown-item {
  color: var(--wh1-color-primary);
  text-decoration: none;
  /* `:focus` underlines too: with the background gone the underline is the
                   only thing left marking the keyboard position. */
}
.header .menu-dropdowns .dropdown-menu .dropdown-item:hover,
.header .kussin-header-meta-account .dropdown-menu .dropdown-item:hover,
.header .menu-dropdowns .dropdown-menu .dropdown-item:focus,
.header .kussin-header-meta-account .dropdown-menu .dropdown-item:focus {
  color: var(--wh1-color-primary);
  background-color: transparent;
  text-decoration: underline;
}
.header .menu-dropdowns .dropdown-menu .dropdown-item:active,
.header .kussin-header-meta-account .dropdown-menu .dropdown-item:active,
.header .menu-dropdowns .dropdown-menu .dropdown-item.active,
.header .kussin-header-meta-account .dropdown-menu .dropdown-item.active {
  color: var(--wh1-color-primary);
  background-color: transparent;
  text-decoration: none;
}
.header .menu-dropdowns .dropdown-menu .dropdown-divider,
.header .kussin-header-meta-account .dropdown-menu .dropdown-divider {
  border-top-color: var(--wh1-color-surface-soft);
  opacity: 1;
}
.header .meta .kussin-header-meta-account > .btn,
.header .meta .kussin-header-meta-account > .kussin-live-widget > .btn {
  width: auto;
  min-width: 40px;
  gap: 0;
  padding-inline: 12px;
}
.kussin-account-menu-actions {
  display: flex;
  flex-wrap: nowrap;
  gap: var(--wh1-space-xs);
  align-items: center;
}
.kussin-account-menu-actions > .btn {
  flex: 1 1 0;
  min-width: 0;
  white-space: nowrap;
}
/*
 * #70177 — keep the header's own service menu opted out of the global selected-entry fill.
 *
 * `components/base.less` now paints `.dropdown-item.active` white on teal from an `#wrapper`-
 * prefixed selector, which is what the account page's "Wo willst du hin?" menu needs. The header
 * service menu deliberately paints no fill at all (see the note above, sampled from production),
 * and its class-only rule can no longer outrank an id selector — so restate it with `#wrapper`.
 */
#wrapper .header .menu-dropdowns .dropdown-menu .dropdown-item.active,
#wrapper .header .kussin-header-meta-account .dropdown-menu .dropdown-item.active {
  color: var(--wh1-color-primary);
  background-color: transparent;
}
/* ===================================================================
 * #70141 — "Customer links are missing counters".
 *
 * Production prints how much the customer has parked: a small ring on the account icon carrying
 * the total, and a badge behind each list inside the flyout. The APEX header showed neither, so
 * nothing in the header ever changed when a product was added to a list.
 *
 * The ring is production's own control, measured from warehouse-one.de
 * (`.service-menu button .badge`): a 20px white circle with a 1px WH1-green border and a bold
 * 10px green number, pulled 7px left and 6px up so it overlaps the person icon, with the caret
 * drawn back over it.
 * =================================================================== */
.header {
  /* #70141, mobile — the bar under `lg` carries the same count next to the same icon.
       The theme already positions a mobile badge absolutely (`top: 3px; right: calc(50% - 24px)`,
       which is what puts the basket's number on its icon's top right), but that only lands on the
       icon when the control it sits in is a containing block. `.btn-minibasket` is
       `position: relative` and gets it; the account entry was a static anchor, so its badge
       resolved against the header instead and drifted about 170px left of the person, halfway to
       the globe. One line puts it back on the icon, with the basket's own offsets. */
}
.header .mobile-nav .btn-account {
  position: relative;
}
.header .kussin-header-meta-account {
  /* The trigger keeps the shared 40px minimum. Its icon, optional ring and caret are inline
           flex items, so the button grows to contain whichever combination is rendered. */
  /* Inside the flyout the count follows its entry. The theme's generic `.dropdown-item .badge`
           rule repaints a badge white-on-black and right-aligns it (`margin-left: auto`) for the
           account page's own side menu; in a compact header flyout that reads as a superscript
           rather than a count. Restore the theme's plain `.badge` — the same teal disc the basket
           icon in this very header already carries — and let it sit beside its label. */
  /*
         * The log-out entry. Production sets it apart from the navigation entries by colour —
         * there it is a Bootstrap `btn-danger` button, whose red belongs to no Warehouse palette;
         * #70141 asks for the Warehouse red instead. It stays a menu entry like its siblings, so
         * only the colour differs, and the rule has to restate the `:hover`/`:focus`/`:active`
         * states because the block above pins every `.dropdown-item` to the brand green.
         */
}
.header .kussin-header-meta-account > .btn,
.header .kussin-header-meta-account > .kussin-live-widget > .btn {
  width: auto;
  min-width: 40px;
  gap: 0;
  padding-inline: 12px;
}
.header .kussin-header-meta-account > .btn .badge,
.header .kussin-header-meta-account > .kussin-live-widget > .btn .badge {
  position: relative;
  left: -7px;
  top: -6px;
  flex: none;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 20px;
  height: 20px;
  margin-right: -10px;
  padding: 0;
  border: 1px solid var(--wh1-color-primary);
  border-radius: 50%;
  background: var(--wh1-color-white);
  color: var(--wh1-color-primary);
  font-size: 10px;
  font-weight: 700;
  line-height: 1;
}
.header .kussin-header-meta-account .dropdown-menu .dropdown-item .badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 18px;
  height: 18px;
  margin-left: 6px;
  padding: 0 5px;
  border-radius: 9px;
  background: var(--wh1-color-primary);
  color: var(--wh1-color-white);
  font-size: 11px;
  font-weight: 700;
  line-height: 1;
  vertical-align: middle;
}
.header .kussin-header-meta-account .dropdown-menu .dropdown-item.kussin-account-menu-logout {
  color: var(--wh1-color-highlight-red);
}
.header .kussin-header-meta-account .dropdown-menu .dropdown-item.kussin-account-menu-logout:hover,
.header .kussin-header-meta-account .dropdown-menu .dropdown-item.kussin-account-menu-logout:focus {
  color: var(--wh1-color-highlight-red);
  text-decoration: underline;
}
.header .kussin-header-meta-account .dropdown-menu .dropdown-item.kussin-account-menu-logout:active,
.header .kussin-header-meta-account .dropdown-menu .dropdown-item.kussin-account-menu-logout.active {
  color: var(--wh1-color-highlight-red);
}
/* `#wrapper`-prefixed for the same reason as the `.active` rule above: `components/base.less`
   paints dropdown items from an id-level selector, which a class-only rule can no longer outrank. */
#wrapper .header .kussin-header-meta-account .dropdown-menu .dropdown-item.kussin-account-menu-logout,
#wrapper .header .kussin-header-meta-account .dropdown-menu .dropdown-item.kussin-account-menu-logout:hover,
#wrapper .header .kussin-header-meta-account .dropdown-menu .dropdown-item.kussin-account-menu-logout:focus {
  color: var(--wh1-color-highlight-red);
}
.header .dropdowns > .dropdown-menu {
  min-width: 210px;
}
.header .dropdowns > .dropdown-menu > form > label {
  display: none;
}
.header .dropdowns .btn-group[role="group"] > .dropdown-toggle {
  display: none;
}
.header .dropdowns .btn-group[role="group"] > .dropdown-menu {
  position: static;
  display: block;
  width: 100%;
  min-width: 0;
  margin: 0;
  padding: 0;
  transform: none !important;
  border: 0;
  box-shadow: none;
}
.header .dropdowns .btn-group[role="group"] > .dropdown-menu .dropdown-item[hreflang] {
  margin-right: 0;
  margin-left: 0;
}
.header .btn-group > .dropdown-menu .dropdown-item[hreflang] {
  display: flex;
  width: auto;
  min-height: 42px;
  margin-right: 10px;
  margin-left: 10px;
  padding: 10px 5px;
  align-items: center;
  justify-content: center;
  color: var(--wh1-color-primary);
  background: var(--wh1-color-white);
  border: 1px solid var(--wh1-color-surface-soft);
  border-radius: 10px;
  text-align: center;
  text-decoration: none;
}
.header .btn-group > .dropdown-menu .dropdown-item[hreflang]:not(:last-child) {
  margin-bottom: 5px;
}
.header .btn-group > .dropdown-menu .dropdown-item[hreflang]:hover,
.header .btn-group > .dropdown-menu .dropdown-item[hreflang]:focus,
.header .btn-group > .dropdown-menu .dropdown-item[hreflang].active {
  color: var(--wh1-color-primary);
  background: var(--wh1-color-surface-soft);
}
.header .btn-group > .dropdown-menu .dropdown-item[hreflang].de::before,
.header .btn-group > .dropdown-menu .dropdown-item[hreflang].en::before {
  content: "";
  display: inline-block;
  flex: 0 0 20px;
  width: 20px;
  height: 15px;
  margin-right: 5px;
  background-position: center;
  background-repeat: no-repeat;
  background-size: cover;
}
.header .btn-group > .dropdown-menu .dropdown-item[hreflang].de::before {
  background-image: url("../../img/lang/icon-lang-de.svg");
}
.header .btn-group > .dropdown-menu .dropdown-item[hreflang].en::before {
  background-image: url("../../img/lang/icon-lang-en.svg");
}
/* ===================================================================
 * #70144 — say which language you are in.
 *
 * The header offered a globe and nothing else, so the current language was invisible until the
 * dropdown was opened. Production prints the abbreviation over the icon's top-left corner —
 * `header#header .languages-menu span.lang-short { position: absolute; top: 6px; left: 0;
 * font-size: 9px; text-transform: uppercase }` in the live bundle, teal on desktop and white on
 * the mobile bar, which `color: inherit` gives us for free since that bar sets its own colour.
 *
 * The button is already `position: relative` (components/header/meta-bar.less), and the label is
 * `aria-hidden` because the control keeps its own descriptive aria-label.
 * =================================================================== */
.kussin-header-lang-short {
  position: absolute;
  top: 4px;
  left: 1px;
  color: inherit;
  font-size: 9px;
  font-weight: 400;
  line-height: 1;
  text-transform: uppercase;
  pointer-events: none;
}
/* ===================================================================
 * #70144 follow-up — "[DE] is too far apart from the globe icon" on Android and iOS.
 *
 * The desktop rule anchors the label to its button's top-left corner. That is right for the 30px
 * meta-bar button and wrong here: the mobile bar's button is 50px tall and stretches with the flex
 * row — 97.5px at 390px wide — so the label landed ~35px to the left of the globe and 8px above
 * it, reading as a stray word rather than a badge on the icon.
 *
 * Production stacks the two tight: measured on www.warehouse-one.de at 390px the label's right
 * edge is exactly the icon's left edge, and the label's top sits ~3px above the icon's.
 *
 * What makes that reproducible is giving the label something the size of the globe to be
 * positioned against. The button is not it — it stretches with the flex row — so the icon and the
 * label share a wrapper that is exactly the icon's box (layout/header.html.twig). `right: 100%`
 * then puts the label's right edge on the icon's left edge and `top: -3px` lifts it by the amount
 * production overlaps, with no offset derived from the icon's size: redraw the globe at any size
 * and the label stays on it.
 * =================================================================== */
.kussin-mobile-language-currency > .btn {
  position: relative;
  /* The wrapper is exactly the globe's box, so the label can be placed against the icon. */
}
.kussin-mobile-language-currency > .btn .kussin-header-lang-stack {
  position: relative;
  display: inline-flex;
}
.kussin-mobile-language-currency > .btn .kussin-header-lang-short {
  /* right edge on the icon's left edge, top 3px above the icon's top — production's fit,
           expressed against the icon itself, so it holds at whatever size the icon is drawn. */
  top: -3px;
  right: 100%;
  left: auto;
}
.basketFlyout {
  /*
     * #69985 — flyout chrome.
     *
     * Requested in the ticket: a dark-green header bar with white text and a white close icon, a
     * light-blue flyout background, and a smaller/muted shipping note. This is a design request, not
     * prod parity — production renders the mini basket as a plain white Bootstrap 3 dropdown
     * (`header#header .minibasket-menu .dropdown-menu`), so there is nothing to copy from it.
     *
     * #E0EFF0 is WH1's light blue; production uses the same value for the mini-basket row borders.
     */
  /*
     * APEX paints the body grey and fixes the note size with deep selectors of its own —
     * `.modal.fade.basketFlyout .modal-dialog .modal-body` (0,5,0) and
     * `… .modal-body .bottom .charges` (0,7,0). Mirror that depth rather than reaching for
     * !important, so the cascade still reads normally.
     */
  /* The disclaimer under the totals is secondary information, not body copy. */
}
.basketFlyout.modal.fade .modal-dialog {
  width: min(400px, calc(100vw - 24px));
  max-width: none;
}
.basketFlyout .emoji.h1 {
  font-style: normal;
}
.basketFlyout .minibasket-link,
.basketFlyout .minibasket-link:hover,
.basketFlyout .minibasket-link:focus,
.basketFlyout .kussin-minibasket-product-name,
.basketFlyout .kussin-minibasket-product-price {
  text-decoration: none !important;
}
.basketFlyout .minibasket-link {
  align-items: center;
  min-width: 0;
  margin-bottom: 5px;
  padding: 5px;
  border-radius: var(--wh1-radius-md);
}
.basketFlyout .minibasket-link > span:last-child {
  min-width: 0;
}
.basketFlyout .minibasket-img {
  width: 75px;
  height: 75px;
  padding: 5px;
  -o-object-fit: contain;
     object-fit: contain;
}
.basketFlyout .modal-header {
  background: var(--wh1-color-primary);
  border-bottom: 0;
  color: var(--wh1-color-white);
  /* Bootstrap paints .btn-close with a dark SVG mask; invert it so the X reads on the bar. */
}
.basketFlyout .modal-header .modal-title {
  color: var(--wh1-color-white);
}
.basketFlyout .modal-header .btn-close {
  filter: invert(1) grayscale(100%) brightness(200%);
  opacity: 1;
}
.basketFlyout .modal-header .btn-close:hover,
.basketFlyout .modal-header .btn-close:focus {
  opacity: 0.75;
}
.basketFlyout .modal-content {
  background: var(--wh1-color-surface-soft);
}
.basketFlyout .modal-body > .btn-highlight {
  border-radius: var(--wh1-radius-pill);
}
.basketFlyout.modal.fade .modal-dialog .modal-body {
  background: var(--wh1-color-surface-soft);
}
.basketFlyout.modal.fade .modal-dialog .modal-body .bottom .charges {
  color: var(--wh1-color-muted);
  font-size: var(--wh1-font-size-xs);
  line-height: 1.4;
}
.basketFlyout .kussin-minibasket-product-name {
  display: block;
  max-width: 100%;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
/* Trusted Shops injects the trustbadge at the maximum z-index. Keep it from covering the
   mini-basket and other Bootstrap dialogs; it returns when the modal closes. */
body.modal-open [id^="trustbadge-container-"] {
  display: none !important;
}
.breadcrumb-wrapper .breadcrumb-link,
.breadcrumb-wrapper .breadcrumb-link:hover,
.breadcrumb-wrapper .breadcrumb-link:focus {
  color: var(--bs-link-color);
  text-decoration: none;
}
.breadcrumb-wrapper .breadcrumb-link svg,
.breadcrumb-wrapper .breadcrumb-link svg * {
  color: var(--bs-link-color);
  fill: currentColor;
}
.breadcrumb-wrapper .breadcrumb-item:before,
.breadcrumb-wrapper .breadcrumb-item::before {
  color: var(--wh1-color-border);
}
/*
 * #70054 — the current page's breadcrumb crumb.
 *
 * This rule used to be unscoped (`.breadcrumb-wrapper .breadcrumb-item.active { display: none }`),
 * which hid the last crumb on EVERY page. On a category listing that meant "Skate / Inliner /" with
 * a blank third slot — the text was in the DOM but rendered at zero width, which is what the
 * reporter screenshotted. Production shows the full path there: "Skate / Inliner / Kids Skates".
 *
 * On the product page it is deliberate: the theme appends the product title as an extra
 * `.breadcrumb-item.active`, and production does not show it either (its PDP breadcrumb ends at the
 * brand). So the rule is kept — just scoped to the detail page, which is the only place it was
 * meant for. `.active` is used by both, so the body class is the only thing that separates them.
 */
body.cl-details .breadcrumb-wrapper .breadcrumb-item.active {
  display: none;
}
.kussin-product-mobile-brand {
  margin: 5px 0 15px;
}
.kussin-product-mobile-brand-link {
  display: flex;
  align-items: center;
  gap: 5px;
  width: 100%;
  min-width: 0;
  padding: 10px;
  border: var(--wh1-border-width) solid var(--wh1-color-surface-soft);
  border-radius: 15px;
  background: var(--wh1-color-white);
  color: var(--wh1-color-black);
  text-align: left;
  text-decoration: none;
}
.kussin-product-mobile-brand-link:hover,
.kussin-product-mobile-brand-link:focus {
  border-color: var(--wh1-color-primary);
  color: var(--wh1-color-black);
  text-decoration: none;
}
.kussin-product-mobile-brand-logo {
  width: 60px;
  height: auto;
  flex: 0 0 60px;
  -o-object-fit: contain;
     object-fit: contain;
}
.kussin-product-mobile-brand-text {
  display: block;
  min-width: 0;
}
.kussin-product-mobile-brand-name,
.kussin-product-mobile-brand-title {
  display: block;
}
.kussin-product-mobile-brand-name {
  color: var(--wh1-color-black);
  font-size: 0.875rem;
  font-weight: 800;
}
.kussin-product-mobile-brand-title {
  max-width: 100%;
  overflow: hidden;
  color: var(--wh1-color-primary);
  font-size: 0.75rem;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.kussin-product-gallery-pagination {
  display: none;
}
.gallery .zoom-container img[data-bs-toggle='modal'] {
  cursor: pointer;
}
.gallery .zoom-modal .carouselThumbnail {
  display: flex;
  flex: 0 0 80px;
  align-items: center;
  justify-content: center;
  padding: 4px;
  overflow: hidden;
  line-height: 0;
}
.gallery .zoom-modal .carouselThumbnail img {
  width: 100%;
  height: 100%;
  max-width: 100%;
  max-height: 100%;
  -o-object-fit: contain;
     object-fit: contain;
}
@media (min-width: 768px) {
  .gallery .gallery-helper:nth-child(11):checked ~ .wrap figure {
    transform: translate(-1000%);
  }
  .gallery .gallery-helper:nth-child(11):checked ~ .wrap figure:not(:nth-of-type(11)) {
    opacity: 0;
    visibility: hidden;
  }
  .gallery .gallery-helper:nth-child(11):checked ~ .wrap figure:nth-of-type(11) {
    opacity: 1;
    visibility: visible;
  }
  .gallery .gallery-helper:nth-child(11):checked ~ .thumbnails .slider {
    transform: translateY(1000%);
  }
  .gallery .gallery-helper:nth-child(11):checked ~ .thumbnails .thumb:nth-of-type(11) {
    cursor: default;
  }
  .gallery .gallery-helper:nth-child(11):checked ~ .thumbnails .thumb:nth-of-type(11) img {
    border-color: var(--wh1-color-black);
  }
  .gallery .gallery-helper:nth-child(12):checked ~ .wrap figure {
    transform: translate(-1100%);
  }
  .gallery .gallery-helper:nth-child(12):checked ~ .wrap figure:not(:nth-of-type(12)) {
    opacity: 0;
    visibility: hidden;
  }
  .gallery .gallery-helper:nth-child(12):checked ~ .wrap figure:nth-of-type(12) {
    opacity: 1;
    visibility: visible;
  }
  .gallery .gallery-helper:nth-child(12):checked ~ .thumbnails .slider {
    transform: translateY(1100%);
  }
  .gallery .gallery-helper:nth-child(12):checked ~ .thumbnails .thumb:nth-of-type(12) {
    cursor: default;
  }
  .gallery .gallery-helper:nth-child(12):checked ~ .thumbnails .thumb:nth-of-type(12) img {
    border-color: var(--wh1-color-black);
  }
}
@media (max-width: 767.98px) {
  .kussin-product-main-column,
  .gallery,
  .gallery > .carousel {
    min-width: 0;
    max-width: 100%;
  }
  .gallery .wrap {
    width: 100%;
    max-width: 100%;
    height: 250px;
    margin-bottom: 0;
    padding-inline: 0;
    overflow-x: auto;
    overflow-y: hidden;
    overscroll-behavior-x: contain;
    scroll-behavior: smooth;
    scroll-padding-inline: 0;
    scroll-snap-type: x mandatory;
    scrollbar-width: none;
    -webkit-overflow-scrolling: touch;
  }
  .gallery[data-kussin-slider-preview='true'] .wrap {
    padding-inline: 60px;
    scroll-padding-inline: 60px;
  }
  .gallery .wrap figure {
    flex: 0 0 100%;
    width: 100%;
    min-width: 100%;
    height: 250px;
    margin: 0;
    display: flex;
    align-items: center;
    justify-content: center;
  }
  .gallery .wrap img {
    width: auto;
    height: auto;
    max-width: 220px;
    max-height: 250px;
    -o-object-fit: contain;
       object-fit: contain;
  }
  .gallery .wrap [data-kussin-infinite-clone] {
    pointer-events: none;
    -webkit-user-select: none;
       -moz-user-select: none;
            user-select: none;
  }
  .kussin-product-gallery-pagination {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: var(--wh1-space-sm);
    min-height: 28px;
    margin: var(--wh1-space-md) auto 0;
  }
  .kussin-product-gallery-dot {
    width: 28px;
    height: 28px;
    padding: 0;
    background: transparent;
    border: 0;
    border-radius: 50%;
  }
  .kussin-product-gallery-dot::before {
    display: block;
    width: 10px;
    height: 10px;
    margin: auto;
    content: '';
    background: var(--wh1-color-surface-soft);
    border-radius: 50%;
    transition: background-color 160ms ease, transform 160ms ease;
  }
  .kussin-product-gallery-dot:hover::before,
  .kussin-product-gallery-dot:focus-visible::before,
  .kussin-product-gallery-dot.is-active::before,
  .kussin-product-gallery-dot[aria-current='true']::before {
    background: var(--wh1-color-primary);
    transform: scale(1.2);
  }
}
@media (max-width: 767.98px) and (prefers-reduced-motion: reduce) {
  .gallery .wrap {
    scroll-behavior: auto;
  }
  .kussin-product-gallery-dot::before {
    transition: none;
  }
}
/* ===================================================================
 * #70168 — "PDP: Thumbnail images are distorted".
 *
 * The gallery thumbnails are the shop's generated *icon* size, which is 87 px on the long edge and
 * keeps each photo's own aspect ratio — the files really are 87×79, 48×87, 87×65, 51×87 for the
 * reported article. The theme drew them into a fixed 112×112 box (104×104 inside the 2 px padding
 * and 2 px border), so every thumbnail was scaled UP by about 20 % and the portrait ones sat as
 * narrow strips in a square. Blurred and inconsistent, which is what the ticket calls distorted.
 *
 * No larger thumbnail exists to reach for: only `87_87_90` is generated on the CDN — 112, 160, 220
 * and 260 all answer 404 — so the image cannot be sharpened by asking for more pixels. Render it
 * at its own resolution instead: an 87 px box, never upscaled, aspect kept by `contain`, centred
 * in the 120 px rail so the column keeps its width and the active-thumbnail border still lines up.
 * =================================================================== */
.gallery .thumbnails .thumb {
  display: flex;
  align-items: center;
  justify-content: center;
}
.gallery .thumbnails .thumb img {
  width: 87px;
  height: 87px;
  -o-object-fit: contain;
     object-fit: contain;
}
/* ===================================================================
 * #69726 — video slides in the product gallery.
 *
 * Uploaded files (kussin/video-gallery) and the article's YouTube media records follow the pictures
 * as ordinary slides: one radio, one thumbnail label and one figure each, so the APEX radio states
 * and the theme's mobile scroller drive them unchanged. New here is the box the player sits in, the
 * thumbnail tile, and the desktop states 13 to 16: APEX draws 1 to 10, gallery.less adds 11 and 12,
 * and with twelve pictures plus three videos a product reaches 15 slides.
 * =================================================================== */
@media (min-width: 768px) {
  .gallery .gallery-helper:nth-child(13):checked ~ .wrap figure {
    transform: translate(-1200%);
  }
  .gallery .gallery-helper:nth-child(13):checked ~ .wrap figure:not(:nth-of-type(13)) {
    opacity: 0;
    visibility: hidden;
  }
  .gallery .gallery-helper:nth-child(13):checked ~ .wrap figure:nth-of-type(13) {
    opacity: 1;
    visibility: visible;
  }
  .gallery .gallery-helper:nth-child(13):checked ~ .thumbnails .thumb:nth-of-type(13) {
    cursor: default;
  }
  .gallery .gallery-helper:nth-child(13):checked ~ .thumbnails .thumb:nth-of-type(13) img {
    border-color: var(--wh1-color-black);
  }
  .gallery .gallery-helper:nth-child(14):checked ~ .wrap figure {
    transform: translate(-1300%);
  }
  .gallery .gallery-helper:nth-child(14):checked ~ .wrap figure:not(:nth-of-type(14)) {
    opacity: 0;
    visibility: hidden;
  }
  .gallery .gallery-helper:nth-child(14):checked ~ .wrap figure:nth-of-type(14) {
    opacity: 1;
    visibility: visible;
  }
  .gallery .gallery-helper:nth-child(14):checked ~ .thumbnails .thumb:nth-of-type(14) {
    cursor: default;
  }
  .gallery .gallery-helper:nth-child(14):checked ~ .thumbnails .thumb:nth-of-type(14) img {
    border-color: var(--wh1-color-black);
  }
  .gallery .gallery-helper:nth-child(15):checked ~ .wrap figure {
    transform: translate(-1400%);
  }
  .gallery .gallery-helper:nth-child(15):checked ~ .wrap figure:not(:nth-of-type(15)) {
    opacity: 0;
    visibility: hidden;
  }
  .gallery .gallery-helper:nth-child(15):checked ~ .wrap figure:nth-of-type(15) {
    opacity: 1;
    visibility: visible;
  }
  .gallery .gallery-helper:nth-child(15):checked ~ .thumbnails .thumb:nth-of-type(15) {
    cursor: default;
  }
  .gallery .gallery-helper:nth-child(15):checked ~ .thumbnails .thumb:nth-of-type(15) img {
    border-color: var(--wh1-color-black);
  }
  .gallery .gallery-helper:nth-child(16):checked ~ .wrap figure {
    transform: translate(-1500%);
  }
  .gallery .gallery-helper:nth-child(16):checked ~ .wrap figure:not(:nth-of-type(16)) {
    opacity: 0;
    visibility: hidden;
  }
  .gallery .gallery-helper:nth-child(16):checked ~ .wrap figure:nth-of-type(16) {
    opacity: 1;
    visibility: visible;
  }
  .gallery .gallery-helper:nth-child(16):checked ~ .thumbnails .thumb:nth-of-type(16) {
    cursor: default;
  }
  .gallery .gallery-helper:nth-child(16):checked ~ .thumbnails .thumb:nth-of-type(16) img {
    border-color: var(--wh1-color-black);
  }
}
.gallery .thumbnails .kussin-product-gallery-video-thumb {
  position: relative;
}
.gallery .thumbnails .kussin-product-gallery-video-thumb img {
  -o-object-fit: cover;
     object-fit: cover;
  background: var(--wh1-color-surface-soft);
}
.gallery .thumbnails .kussin-product-gallery-video-thumb::after {
  position: absolute;
  top: 50%;
  left: 50%;
  width: 28px;
  height: 28px;
  content: '';
  transform: translate(-50%, -50%);
  border-radius: 50%;
  background: var(--wh1-color-primary) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23fff' d='M8 5v14l11-7z'/%3E%3C/svg%3E") center / 16px 16px no-repeat;
  pointer-events: none;
}
.gallery .thumbnails .kussin-product-gallery-video-thumb:focus-visible {
  outline: 2px solid var(--wh1-color-primary);
  outline-offset: 2px;
}
.gallery .wrap figure.kussin-product-gallery-video {
  display: flex;
  align-items: center;
  justify-content: center;
}
.kussin-product-gallery-video-frame {
  position: relative;
  width: 100%;
  max-height: 100%;
  aspect-ratio: 16 / 9;
  overflow: hidden;
  background: var(--wh1-color-black);
  border-radius: 3px;
}
.kussin-product-gallery-video-frame iframe,
.kussin-product-gallery-video-frame video,
.kussin-product-gallery-video-frame .cmplazypreviewiframe {
  position: absolute;
  inset: 0;
  width: 100% !important;
  height: 100% !important;
  border: 0;
}
.kussin-product-gallery-video-frame video {
  -o-object-fit: contain;
     object-fit: contain;
  background: var(--wh1-color-black);
}
@media (min-width: 768px) {
  .kussin-product-gallery-video-frame {
    width: min(100%, calc((70vh - 20px) * 16 / 9));
  }
}
@media (max-width: 767.98px) {
  .kussin-product-gallery-video-frame {
    width: min(100%, calc(250px * 16 / 9));
  }
}
/*
 * Worker-mode presentation.
 *
 * The OXID 7 module owns the panel markup, worker-group checks, table data,
 * accessibility state, and toggle behavior. Its public `wmdk-*` classes are
 * retained here only as compatibility hooks. The child theme restores the
 * elevated white flyout surface from WH1-2023 without copying its Bootstrap 3
 * template or JavaScript.
 *
 * The module stylesheet is registered after the theme stylesheet, so the
 * detail-page scope intentionally gives these rules one more class of
 * specificity than the module defaults.
 */
body.cl-details .wmdk-worker-toggle,
.wh1-styleguide .wmdk-worker-toggle {
  color: var(--wh1-color-primary);
  background: var(--wh1-color-white);
  border: 0;
  box-shadow: -2px 0 5px rgba(0, 0, 0, 0.2);
}
body.cl-details .wmdk-worker-toggle:hover,
.wh1-styleguide .wmdk-worker-toggle:hover {
  color: var(--wh1-color-primary-dark);
  background: var(--wh1-color-surface-soft);
}
body.cl-details .wmdk-worker-toggle:focus-visible,
.wh1-styleguide .wmdk-worker-toggle:focus-visible {
  color: var(--wh1-color-primary-dark);
  background: var(--wh1-color-white);
  box-shadow: -2px 0 5px rgba(0, 0, 0, 0.2), var(--wh1-focus-ring);
  outline: 0;
}
body.cl-details .wmdk-worker-panel__inner,
.wh1-styleguide .wmdk-worker-panel__inner {
  padding: 20px;
  background: var(--wh1-color-white);
  border-radius: 8px 0 0 8px;
  box-shadow: -2px 0 5px rgba(0, 0, 0, 0.2);
}
@media (max-width: 767.98px) {
  body.cl-details .wmdk-worker-panel__inner,
  .wh1-styleguide .wmdk-worker-panel__inner {
    border-radius: 0;
  }
}
.details .brand-name,
.details .details-title {
  display: inline;
  color: var(--wh1-color-primary);
  font-family: var(--wh1-font-family-heading);
  font-size: calc(0.83rem + 1.56vw);
  font-style: italic;
  line-height: 1.2;
  letter-spacing: 0;
}
.details .brand-name,
.details .brand-name:hover,
.details .brand-name:focus {
  font-weight: 700;
  text-decoration: none;
}
.details .details-title {
  margin: 0;
  font-weight: 400;
}
@media (min-width: 1200px) {
  .details .brand-name,
  .details .details-title {
    font-size: 2rem;
  }
}
.tobasketFunction > .input-group {
  display: inline-flex;
  align-items: stretch;
  width: auto;
  gap: 0;
}
.tobasketFunction > .input-group > span,
.tobasketFunction > .input-group > .form-control {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 44px;
  margin: 0 !important;
  border-radius: 0;
}
.tobasketFunction > .input-group > span {
  flex: 0 0 44px;
  width: 44px;
  padding: 0;
  color: var(--wh1-color-primary);
  font-weight: 700;
  line-height: 1;
  background: var(--wh1-color-white);
  border: var(--wh1-border-width) solid var(--wh1-color-primary);
}
.tobasketFunction > .input-group > .form-control {
  flex: 0 0 64px;
  width: 64px;
  min-width: 64px;
  padding-right: var(--wh1-space-sm);
  padding-left: var(--wh1-space-sm);
  text-align: center;
  border-color: var(--wh1-color-primary);
}
.tobasketFunction > .input-group > span + .form-control,
.tobasketFunction > .input-group > .form-control + span {
  margin-left: -1px !important;
}
.tobasketFunction > .input-group > span:first-child {
  flex-basis: auto;
  width: auto;
  padding-right: 25px;
  padding-left: 25px;
  border-top-left-radius: var(--wh1-radius-pill);
  border-bottom-left-radius: var(--wh1-radius-pill);
}
.tobasketFunction > .input-group > .form-control + span {
  flex-basis: auto;
  width: auto;
  padding-right: 25px;
  padding-left: 25px;
  border-top-right-radius: var(--wh1-radius-pill);
  border-bottom-right-radius: var(--wh1-radius-pill);
}
.tobasketFunction > .input-group > span:focus,
.tobasketFunction > .input-group > .form-control:focus {
  position: relative;
  z-index: 2;
}
.kussin-product-aside {
  margin-top: var(--wh1-space-lg);
}
.kussin-product-buybox {
  position: relative;
  padding: 25px 40px;
  border: var(--wh1-border-width) solid var(--wh1-color-surface-soft);
  border-radius: 15px;
  background: var(--wh1-color-surface-soft);
}
.kussin-product-buybox .details-title,
.kussin-product-buybox .brand-name {
  font-size: 1.125rem;
}
.kussin-product-buybox .kussin-product-heading {
  padding-right: 20px;
}
.kussin-product-buybox .kussin-product-heading > .wmdk-flags {
  display: none;
}
.kussin-product-buybox .details-shortdesc {
  margin-top: var(--wh1-space-sm);
}
.kussin-product-buybox .variant-dropdown {
  margin-top: 10px;
}
.kussin-product-buybox .details-information {
  display: none;
}
.kussin-product-buybox > .rating,
.kussin-product-buybox > .wmdk-flags {
  display: none;
}
.kussin-product-buybox .kussin-product-stockstatus,
.kussin-product-buybox .product-links {
  display: none;
}
.kussin-product-alternatives,
.kussin-factfinder-variants {
  margin-top: 10px;
}
.kussin-product-alternatives > strong,
.kussin-factfinder-variants > strong,
.kussin-product-alternatives .variant-label,
.kussin-factfinder-variants .variant-label,
.kussin-product-alternatives .variant-label strong,
.kussin-factfinder-variants .variant-label strong {
  display: block;
  margin-bottom: 8px;
  color: var(--wh1-color-primary);
  font-size: 0.875rem;
  font-weight: 700;
  line-height: 1.2;
}
.kussin-product-alternative-list,
.kussin-product-buybox .kussin-factfinder-variant-list {
  display: flex;
  flex-wrap: wrap;
  gap: 5px;
  margin: 0;
  padding: 0;
  list-style: none;
}
.kussin-product-alternative-list a,
.kussin-product-buybox .kussin-factfinder-variant-list a {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 48px;
  height: 48px;
  overflow: hidden;
  border: 0;
  border-radius: 50%;
  background: var(--wh1-color-white);
}
.kussin-product-alternative-list img,
.kussin-product-buybox .kussin-factfinder-variant-list img {
  display: block;
  width: 100%;
  height: 100%;
  -o-object-fit: contain;
     object-fit: contain;
}
.kussin-product-variant-group {
  margin-bottom: 6px !important;
}
.kussin-product-variant-group .form-label {
  margin-bottom: 8px;
  color: var(--wh1-color-primary);
  font-size: 0.875rem;
  font-weight: 700;
  line-height: 1.2;
}
.kussin-product-variant-group .kussin-product-variant-select {
  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;
}
.kussin-product-size-options {
  display: flex;
  flex-wrap: wrap;
  gap: 5px;
}
.kussin-product-size-option {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 48px;
  min-height: 48px;
  padding: 8px 10px;
  border: 1px solid var(--wh1-color-primary);
  border-radius: var(--wh1-radius-pill);
  background: var(--wh1-color-white);
  color: var(--wh1-color-black);
  line-height: 1;
}
.kussin-product-size-option:hover,
.kussin-product-size-option:focus-visible,
.kussin-product-size-option.is-active {
  border-color: var(--wh1-color-primary);
  background: var(--wh1-color-primary);
  color: var(--wh1-color-white);
}
.kussin-product-size-option:disabled {
  overflow: hidden;
  border-color: var(--wh1-color-disabled);
  background: var(--wh1-color-white);
  color: var(--wh1-color-disabled);
  cursor: not-allowed;
}
.kussin-product-size-option:disabled::after {
  position: absolute;
  right: 5px;
  left: 5px;
  top: 50%;
  border-top: 2px solid currentColor;
  content: "";
  transform: rotate(-45deg);
}
.kussin-product-utilities {
  position: static;
}
.kussin-product-utilities .sizecharts {
  position: absolute;
  right: 0;
  top: 55px;
  z-index: 4;
}
.kussin-product-utilities .sizecharts .mt-1 {
  margin: 0 !important;
}
.kussin-product-sizechart {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 48px;
  height: 48px;
  padding: 7px 8px;
  border-radius: 15px 0 0 15px;
  background: var(--wh1-color-primary);
  color: var(--wh1-color-white);
  font-size: var(--wh1-font-size-sm);
  font-weight: 700;
  line-height: 1.2;
  text-decoration: none;
}
.kussin-product-sizechart:hover,
.kussin-product-sizechart:focus {
  background: var(--wh1-color-primary-dark);
  color: var(--wh1-color-white);
  text-decoration: none;
}
.kussin-product-sizechart .icon,
.kussin-product-sizechart .icon svg {
  display: block;
  width: 32px;
  height: 32px;
  flex: 0 0 32px;
  fill: currentColor;
}
.kussin-product-sizechart .icon svg path {
  fill: var(--wh1-color-white) !important;
}
.kussin-product-sizechart .description {
  display: none;
}
.kussin-product-wishlist {
  position: absolute;
  right: 0;
  top: 0;
  z-index: 4;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 48px;
  height: 48px;
  padding: 0;
  border: 0;
  border-radius: 0 15px 0 15px;
  background: var(--wh1-color-primary);
  color: var(--wh1-color-white);
  /* #70053: the logged-in control is a <button> submitting the wishlist form (an <a> could not
       carry a valid stoken here), so the UA button defaults have to be neutralised. */
  -webkit-appearance: none;
  -moz-appearance: none;
       appearance: none;
  cursor: pointer;
  /* The heart's `<path>` needs `!important` to beat the icon fill the theme sets globally, but it
       follows the button's own `color` rather than a hard white — otherwise no state can ever
       recolour it (#70053: the "on the registry" heart stayed white on a white surface). */
  /*
     * #70053 — article already on the gift registry.
     *
     * This used to be a slightly darker teal, which nobody reads as "saved" — and it carried the
     * whole burden of feedback, because the page showed no confirmation at all. The confirmation is
     * now rendered on submit, and the resting state says it too: the heart turns warehouse red.
     *
     * Red on the teal button would sit at roughly 2:1 contrast, so the surface flips to white and
     * keeps a teal edge — the control stays recognisable against the product photo it overlaps
     * while the heart itself reads clearly as filled.
     */
}
.kussin-product-wishlist svg {
  width: 25px;
  height: 25px;
  fill: currentColor;
}
.kussin-product-wishlist svg path {
  fill: currentColor !important;
}
.kussin-product-wishlist:hover,
.kussin-product-wishlist:focus {
  background: var(--wh1-color-primary);
  color: var(--wh1-color-white);
}
.kussin-product-wishlist.is-in-wishlist {
  background: var(--wh1-color-white);
  box-shadow: inset 0 0 0 1px var(--wh1-color-primary);
  color: var(--wh1-color-highlight-red);
}
.kussin-defective-copies .checkbox {
  margin: 10px 0;
}
.kussin-defective-copies label {
  position: relative;
  display: block;
  border: 1px solid var(--wh1-color-defective-copies);
  padding: 10px 10px 10px 30px;
  color: var(--wh1-color-defective-copies);
  font-size: 14px;
  font-weight: 400;
  line-height: 20px;
  cursor: pointer;
}
.kussin-defective-copies input[type="checkbox"] {
  position: absolute;
  margin: 4px 0 0 -20px;
}
.kussin-product-purchase {
  margin-top: 10px;
  /* #70222 — base price beside the price, the way OXID 6 renders `#productPriceUnit`:
       12px / 400 in the same grey (rgb(169,169,169)), sitting on the price's baseline. */
  /* ===============================================================
     * #70170 — the savings badge drawn over the stock notice.
     *
     * The badge hangs 18px below the price row and is ~52px tall, so half of it sits under the
     * row. On a buyable article the add-to-basket button is right there and absorbs the overhang,
     * which is what production shows. When the article cannot be bought the button block renders
     * empty (measured: `.tobasketFunction` height 0), the availability notice moves up into that
     * space — and "Dieser Artikel ist nicht auf Lager…" ends up underneath "JETZT 50% SPAREN!".
     *
     * Reserve the overhang in exactly that case: a purchase block that carries a badge but no
     * button gives the notice below it the room the button would have taken.
     * =============================================================== */
  /*
     * #69728 — production's mobile buy button reads "In den Warenkorb | 39,90 €*": the price is in
     * a `.mobile-only` span that the live stylesheet hides at top level and shows again below
     * 991px (`… .tobasket .mobile-only { display: inline-block }`). This theme carried the span in
     * the markup but hid it at every width, so the price only ever appeared once the sticky bar
     * took over on scroll — never on the button as it sits in the buy box.
     */
}
.kussin-product-purchase .price-wrapper {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 0 var(--wh1-space-sm);
  position: relative;
  margin-bottom: 10px;
}
.kussin-product-purchase .price-label {
  order: 2;
  margin: 0;
  padding-left: 0 !important;
  font-style: normal !important;
}
.kussin-product-purchase .price-label .price,
.kussin-product-purchase .price-label .price-markup {
  color: var(--wh1-color-primary);
  font-size: 1.375rem;
  font-style: normal !important;
  font-weight: 800;
  line-height: 1;
}
.kussin-product-purchase .price-label .price-markup {
  font-size: 25px;
  line-height: 25px;
  vertical-align: top;
  font-weight: 700;
  position: relative;
  top: 4px;
}
.kussin-product-purchase .price-label .text-danger .price,
.kussin-product-purchase .price-label .text-danger .price-markup {
  color: var(--wh1-color-highlight-red);
}
.kussin-product-purchase .price-unit {
  order: 3;
  color: var(--wh1-color-price-unit);
  font-size: 0.75rem;
  font-style: normal;
  font-weight: 400;
  line-height: 1.25;
  white-space: nowrap;
}
.kussin-product-purchase .price-old {
  order: 1;
  width: 100%;
  padding-left: 0 !important;
  color: var(--wh1-color-primary) !important;
  font-size: var(--wh1-font-size-md);
  font-style: normal !important;
}
.kussin-product-purchase .wmdk-discount-rate {
  position: absolute;
  right: 18px;
  bottom: -18px;
  z-index: 1;
  display: flex;
  align-items: center;
  min-height: 45px;
  margin: 0;
  padding: 8px 10px;
  border: 1px solid var(--wh1-color-highlight-red);
  border-radius: 10px 10px 0 0;
  background: var(--wh1-color-white);
  color: var(--wh1-color-highlight-red);
  font-size: 0.75rem;
  font-weight: 800;
  line-height: 1.15;
  text-transform: uppercase;
  transform: rotate(-3deg);
}
.kussin-product-purchase:has(.wmdk-discount-rate) [data-kussin-sticky-cart]:not(:has(button, .btn, input[type="submit"])) + .kussin-product-availability {
  margin-top: 26px;
}
.kussin-product-purchase .vat-info-text {
  display: none;
}
.kussin-product-purchase #amountToBasket,
.kussin-product-purchase #decrement,
.kussin-product-purchase #increment {
  display: none !important;
}
.kussin-product-purchase .tobasket-function,
.kussin-product-purchase .tobasketFunction,
.kussin-product-purchase .tobasketFunction > .input-group {
  display: block;
  width: 100%;
  margin: 0 !important;
}
.kussin-product-purchase .input-group-tweak {
  width: 100%;
  margin: 0 !important;
}
.kussin-product-purchase #toBasket,
.kussin-product-purchase .btn-inquiry {
  position: relative;
  z-index: 2;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--wh1-space-xs);
  width: 100%;
  min-height: 52px;
  border: 0;
  border-radius: var(--wh1-radius-pill);
  background: var(--wh1-color-primary);
  color: var(--wh1-color-white);
  font-size: var(--wh1-font-size-md);
  font-weight: 800;
}
.kussin-product-purchase #toBasket:hover,
.kussin-product-purchase #toBasket:focus,
.kussin-product-purchase .btn-inquiry:hover,
.kussin-product-purchase .btn-inquiry:focus {
  background: var(--wh1-color-primary-dark);
}
.kussin-product-purchase #toBasket svg {
  width: 23px;
  height: 23px;
}
.kussin-product-purchase #toBasket .mobile-only {
  display: none !important;
}
@media (max-width: 991.98px) {
  .kussin-product-purchase {
    /*
         * The label and the price are two flex items of the button, and at the theme's own
         * 16px/700 with 40px of side padding they do not fit a phone: measured at 390, each item
         * wrapped and the control grew to two lines. Production draws this button at 14px in a
         * 20px gutter and keeps it on one line (298x42 at the same width), so the mobile variant
         * takes those proportions while keeping the theme's pill and its teal.
         */
  }
  .kussin-product-purchase #toBasket {
    padding: 12px 20px;
    font-size: var(--wh1-font-size-sm);
    white-space: nowrap;
  }
  .kussin-product-purchase #toBasket .mobile-only {
    display: inline-block !important;
  }
}
.kussin-product-purchase #toBasket.kussin-agreement-required,
.kussin-product-purchase #toBasket.not-saleable,
.kussin-product-purchase #toBasket:disabled {
  cursor: not-allowed;
  opacity: 0.55;
}
.kussin-product-availability {
  margin-top: var(--wh1-space-sm);
  font-size: var(--wh1-font-size-sm);
  color: var(--wh1-color-stock-high);
  font-weight: 600;
  text-align: center;
}
.kussin-product-availability .deliverytime {
  display: block;
}
.kussin-product-availability #productDeliveryTime,
.kussin-product-availability .kussin-product-delivery-meta {
  display: block;
}
.kussin-product-availability .stockFlag {
  display: inline-block;
  color: inherit;
  font-size: 0.875rem;
}
.kussin-product-availability a {
  color: var(--wh1-color-black);
  font-size: 0.75rem;
  font-weight: 400;
  text-decoration: underline;
}
.kussin-product-availability .kussin-product-delivery-meta {
  margin-top: 2px;
  color: var(--wh1-color-black);
  font-size: 0.75rem;
  font-weight: 400;
}
.kussin-product-availability svg {
  width: 20px;
  height: 20px;
  color: var(--wh1-color-stock-high);
}
.kussin-product-availability .highStock {
  color: var(--wh1-color-stock-high);
}
.kussin-product-availability .lowStock {
  color: var(--wh1-color-stock-low);
}
.kussin-product-availability .notOnStock {
  color: var(--wh1-color-stock-out);
}
.kussin-product-brand,
.kussin-product-showroom {
  margin-top: var(--wh1-space-sm);
}
.kussin-product-brand > a,
.kussin-product-showroom > a,
.kussin-product-brand .store-link,
.kussin-product-showroom .store-link {
  display: flex;
  align-items: center;
  gap: var(--wh1-space-sm);
  width: 100%;
  min-height: 72px;
  padding: var(--wh1-space-sm) var(--wh1-space-md);
  border: var(--wh1-border-width) solid var(--wh1-color-surface-soft);
  border-radius: 15px;
  background: var(--wh1-color-white);
  color: var(--wh1-color-black);
  text-align: left;
  text-decoration: none;
}
.kussin-product-brand > a:hover,
.kussin-product-showroom > a:hover,
.kussin-product-brand > a:focus,
.kussin-product-showroom > a:focus,
.kussin-product-brand .store-link:hover,
.kussin-product-showroom .store-link:hover,
.kussin-product-brand .store-link:focus,
.kussin-product-showroom .store-link:focus {
  border-color: var(--wh1-color-primary);
  text-decoration: none;
}
.kussin-product-brand img {
  width: 56px;
  height: 56px;
  flex: 0 0 56px;
  -o-object-fit: contain;
     object-fit: contain;
}
.kussin-product-brand span,
.kussin-product-brand strong,
.kussin-product-brand small {
  display: block;
}
.kussin-product-brand small {
  margin-top: 2px;
  color: var(--wh1-color-primary);
}
.kussin-product-showroom .showroom-icon,
.kussin-product-showroom .showroom-icon-inner {
  width: 100%;
}
.kussin-product-showroom .icon,
.kussin-product-showroom .icon {
  display: flex;
  flex: 0 0 auto;
  align-items: center;
  justify-content: center;
  width: 56px;
}
.kussin-product-showroom .icon svg {
  display: block;
  width: 45px;
  height: 45px;
  flex: 0 0 45px;
  color: var(--wh1-color-primary);
}
.kussin-product-showroom .icon svg path {
  fill: var(--wh1-color-primary) !important;
}
.kussin-product-showroom .showroom-text,
.kussin-product-showroom .showroom-text .name,
.kussin-product-showroom .showroom-text .link {
  display: block;
}
.kussin-product-showroom .showroom-text .name {
  font-weight: 800;
}
.kussin-product-showroom .showroom-text .link {
  color: var(--wh1-color-primary);
  font-size: var(--wh1-font-size-sm);
  text-decoration: underline;
}
.wmdk-flags {
  display: flex;
  flex-wrap: wrap;
  gap: var(--wh1-space-xs);
  margin-bottom: var(--wh1-space-sm);
}
.wmdk-flags .flag {
  padding: 3px 10px;
  border-radius: var(--wh1-radius-xs);
  background: var(--wh1-color-primary);
  color: var(--wh1-color-white);
  font-size: var(--wh1-font-size-xs);
  font-weight: 800;
  text-transform: uppercase;
}
.wmdk-flags .flag-sale {
  background: var(--wh1-color-highlight-red);
}
/* ===================================================================
 * #70281 — the size-chart dialog, rebuilt against the live one.
 *
 * Production opens this chart in fancybox: a white panel that is only as wide as the table, 25px
 * corners, 44px of air on every side, a small cross in the top-right, and the customer-service note
 * under the table. No title bar, no button at the end. Ours was a Bootstrap `modal-xl`, which is a
 * fixed 1140px wide whatever the chart holds, with a ruled header and a footer button — so a
 * four-column chart floated in the middle of a mostly empty sheet.
 *
 * The numbers below are measured off the live dialog on
 * /vans/hylane-ballistic-schuh-2026-black-black.html: panel radius 25px, panel padding 44px, cells
 * 10px/20px at 14px, headers 700, the note 14px centred in #0f555c with underlined links.
 *
 * The dialog stays `modal-xl` in the markup because that is what caps the wide charts
 * (`table.wmdk-sizecharts-wide`, see #70115); `width: auto` lets everything narrower shrink to its
 * table instead of stretching to the cap.
 * =================================================================== */
/* Two dialogs, two shapes — production's, not ours to unify.
 *
 * The size chart opens in a fancybox panel: no header, no button, just the table, the
 * customer-service note and a small cross in the corner, inside a 44px frame with 25px corners
 * (measured on /vans/hylane-ballistic-schuh-2026-black-black.html).
 *
 * The specification opens in a Bootstrap modal that keeps its titled header and its closing button,
 * and it is a tighter thing: a 15px frame with a hairline under the header and above the footer,
 * both running the full width of the panel, and a table that draws every cell border in #ddd and
 * stripes alternate rows in #f9f9f9 (measured on /nidecker/thruster-snowboard-2026.html).
 *
 * Neither panel carries padding of its own: each region pads itself, so the two rules reach the
 * panel edges without negative margins and the frame stays even on all four sides.
 * =================================================================== */
#wmdk-sizecharts-modal .modal-dialog,
#wmdk-techspecs-modal .modal-dialog {
  /* `fit-content`, not `auto`: a flex item with `auto` still grows to the cap, which is how a
           four-column chart ended up centred in 1200px of white. The cap is what the wide charts
           need (see #70115); the note's own 520px keeps a short chart from collapsing to a sliver. */
  width: -moz-fit-content;
  width: fit-content;
  max-width: min(96vw, 1200px);
  margin-inline: auto;
}
#wmdk-sizecharts-modal .modal-content,
#wmdk-techspecs-modal .modal-content {
  position: relative;
  border: 0;
  border-radius: var(--wh1-radius-card);
  padding: 0;
}
/* ---------------------------------------------------------------- size chart */
#wmdk-sizecharts-modal {
  /* The cross sits inside the panel's corner rather than on its edge: production keeps it clear
       of the rounding, and at this size it reads as a control instead of a stray glyph. */
  /* A link, not a second button competing with the cross, under a rule that reaches both edges. */
  /* On a phone the 44px frame costs a third of the screen; the chart needs that room more than
       the panel needs the air. */
}
#wmdk-sizecharts-modal .modal-body {
  padding: 44px;
}
#wmdk-sizecharts-modal .wmdk-sizecharts-close {
  position: absolute;
  top: 18px;
  right: 18px;
  z-index: 2;
  width: 14px;
  height: 14px;
  padding: 8px;
  background-size: 14px;
  opacity: 0.55;
  transition: opacity 0.15s ease-in-out;
}
#wmdk-sizecharts-modal .wmdk-sizecharts-close:hover,
#wmdk-sizecharts-modal .wmdk-sizecharts-close:focus {
  opacity: 1;
}
#wmdk-sizecharts-modal .wmdk-sizecharts-footer {
  justify-content: flex-end;
  border-top: var(--wh1-border-default);
  margin: 0;
  padding: var(--wh1-space-md) 44px;
}
#wrapper #wmdk-sizecharts-modal .wmdk-sizecharts-close-link,
#wmdk-sizecharts-modal .wmdk-sizecharts-close-link {
  color: var(--wh1-color-primary);
  font-size: var(--wh1-font-size-sm);
  text-decoration: underline;
}
#wrapper #wmdk-sizecharts-modal .wmdk-sizecharts-close-link:hover,
#wmdk-sizecharts-modal .wmdk-sizecharts-close-link:hover {
  text-decoration: none;
}
@media (max-width: 575.98px) {
  #wmdk-sizecharts-modal .modal-body {
    padding: 20px;
  }
  #wmdk-sizecharts-modal .wmdk-sizecharts-footer {
    padding-inline: 20px;
  }
  #wmdk-sizecharts-modal .wmdk-sizecharts-close {
    top: 10px;
    right: 10px;
  }
}
/* ------------------------------------------------------------- specification */
#wmdk-techspecs-modal {
  /* Production's button is a small, quiet one sitting a frame's width from the edge. Ours keeps
       the theme's shape but not its landing-page proportions — a 52px pill in a 15px frame was what
       pushed the control so far inside the panel. */
  /* The specification table is production's `table-bordered table-striped`: every cell ruled in
       #ddd, alternate rows in #f9f9f9, headings in the shop's teal over a heavier bottom rule. */
  /* The note sits directly under the table, as it does on the live dialog. */
}
#wmdk-techspecs-modal .modal-header,
#wmdk-techspecs-modal .modal-body,
#wmdk-techspecs-modal .modal-footer {
  padding: 16px;
  margin: 0;
}
#wmdk-techspecs-modal .modal-header {
  border-bottom: var(--wh1-border-width) solid #e5e5e5;
}
#wmdk-techspecs-modal .modal-footer {
  justify-content: flex-end;
  border-top: var(--wh1-border-width) solid #e5e5e5;
}
#wmdk-techspecs-modal .modal-footer .btn {
  padding: 9px 22px;
  font-size: var(--wh1-font-size-sm);
  font-weight: 500;
}
#wmdk-techspecs-modal .wmdk-sizechart-table {
  /* The stripe is painted twice over: Bootstrap fills the cell from
           `--bs-table-striped-bg`, and the theme then covers it with an inset box-shadow spread to
           9999px in `--bs-table-accent-bg`, which it sets on the CELL
           (`.table-striped > tbody > tr:nth-of-type(odd) > *`) — so a value inherited from the
           table never reaches it. Both variables therefore have to be handed the grey at the same
           level the theme sets them. */
  --bs-table-striped-bg: #f9f9f9;
  border-color: #ddd;
}
#wmdk-techspecs-modal .wmdk-sizechart-table th,
#wmdk-techspecs-modal .wmdk-sizechart-table td {
  padding: 8px;
  border: var(--wh1-border-width) solid #ddd;
  color: var(--wh1-color-primary);
  font-size: var(--wh1-font-size-sm);
  vertical-align: middle;
}
#wmdk-techspecs-modal .wmdk-sizechart-table th {
  border-bottom-width: 2px;
  border-bottom-color: var(--wh1-color-primary);
  font-weight: 700;
}
#wmdk-techspecs-modal .wmdk-sizechart-table td {
  font-weight: 400;
}
#wmdk-techspecs-modal .wmdk-sizechart-table.table-striped > tbody > tr:nth-of-type(odd) > * {
  --bs-table-accent-bg: #f9f9f9;
  background-color: #f9f9f9;
}
#wmdk-techspecs-modal .wmdk-sizechart-footer {
  margin: var(--wh1-space-md) 0 0;
  color: var(--wh1-color-primary);
  font-size: var(--wh1-font-size-sm);
}
#wrapper #wmdk-techspecs-modal .wmdk-sizechart-footer a {
  color: inherit;
  text-decoration: underline;
}
#wrapper #wmdk-techspecs-modal .wmdk-sizechart-footer a:hover,
#wrapper #wmdk-techspecs-modal .wmdk-sizechart-footer a:focus {
  text-decoration: none;
}
.wmdk-sizecharts-hmtl-table-wrapper {
  /* A chart wider than the dialog scrolls inside its own wrapper rather than pushing the panel
       past the viewport — the same guard the live shop puts on this wrapper. */
  max-width: 100%;
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  /* #70281 — the table fills the panel and its columns are sized by their contents, which is how
       the live chart sits: `auto` layout inside a box that is only as wide as the dialog needs. The
       old `fixed` layout across a 1140px dialog was what pushed "XS" and its measurements to
       opposite ends of the sheet. */
}
.wmdk-sizecharts-hmtl-table-wrapper table {
  width: 100%;
  max-width: 100%;
  margin: 0 auto;
  table-layout: auto;
  border: var(--wh1-border-width) solid var(--wh1-color-surface-soft);
}
.wmdk-sizecharts-hmtl-table-wrapper th,
.wmdk-sizecharts-hmtl-table-wrapper td {
  padding: 10px 20px;
  font-size: var(--wh1-font-size-sm);
  text-align: center;
  vertical-align: middle;
  overflow-wrap: break-word;
}
.wmdk-sizecharts-hmtl-table-wrapper th {
  font-weight: 700;
}
.wmdk-sizecharts-hmtl-table-wrapper tr.odd {
  background: var(--wh1-color-surface-soft);
}
.wmdk-sizecharts-hmtl-table-wrapper table.wmdk-sizecharts-wide th,
.wmdk-sizecharts-hmtl-table-wrapper table.wmdk-sizecharts-wide td {
  padding: 8px 4px;
  font-size: var(--wh1-font-size-xs);
}
.wmdk-sizecharts-hmtl-table-wrapper img {
  display: block;
  max-width: 100%;
  max-height: 80vh;
  margin: 0 auto;
  -o-object-fit: contain;
     object-fit: contain;
}
.wmdk-sizecharts-hmtl-table-explanation,
.wmdk-sizecharts-hmtl-table-custom-explanations {
  margin: 0 auto var(--wh1-space-xl);
}
/* #70281 — the customer-service note under the chart. Production sets it at 14px in the shop's
   teal and underlines the phone number and the address, which is the only thing telling a customer
   they can be tapped; ours inherited the body size and painted the links in the same flat colour as
   the sentence around them. */
.wmdk-sizecharts-hmtl-table-footer {
  /* 520px is the note's share of the width: it wraps to two lines there, the way the live one
       does, and a narrow chart therefore opens a panel about as wide as the live 624px rather than
       collapsing to its own four columns. A wider chart takes over and the note simply wraps
       earlier. */
  max-width: 520px;
  margin: var(--wh1-space-xl) auto 0;
  color: var(--wh1-color-primary);
  font-size: var(--wh1-font-size-sm);
  text-align: center;
  /* `#wrapper a { text-decoration: none }` is an ID selector, so a plain descendant rule loses
       to it; the phone number and the address have to carry the ID prefix to stay underlined. */
}
#wrapper .wmdk-sizecharts-hmtl-table-footer a {
  color: inherit;
  text-decoration: underline;
}
#wrapper .wmdk-sizecharts-hmtl-table-footer a:hover,
#wrapper .wmdk-sizecharts-hmtl-table-footer a:focus {
  text-decoration: none;
}
.wmdk-sizechart-table-wrapper {
  max-width: 100%;
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
}
.wmdk-sizechart-table-wrapper th,
.wmdk-sizechart-table-wrapper td {
  white-space: nowrap;
}
@media (min-width: 992px) {
  .kussin-product-aside {
    margin-top: 0;
  }
  .kussin-product-sidebar {
    position: sticky;
    top: 50px;
    z-index: 2;
  }
}
/* #70281 — below the extra-large breakpoint the dialog used to be released to the full viewport
   with a flat 8px margin, which is also what took its horizontal `auto` away: on a window around
   960px the panel sat against the left edge instead of in the middle. It keeps the tighter margin
   and gets the centring back; the width itself is handled by `fit-content` and the 96vw cap. */
@media (max-width: 1199.98px) {
  #wmdk-sizecharts-modal .modal-dialog {
    margin: var(--wh1-space-xs) auto;
  }
}
@media (max-width: 767.98px) {
  .kussin-product-buybox {
    padding: 25px 30px;
  }
  .kussin-product-sizechart .description {
    display: none;
  }
  .wmdk-sizecharts-hmtl-table-wrapper table,
  .wmdk-sizecharts-hmtl-table-wrapper tbody,
  .wmdk-sizecharts-hmtl-table-wrapper tr,
  .wmdk-sizecharts-hmtl-table-wrapper td {
    display: block;
    width: auto;
  }
  .wmdk-sizecharts-hmtl-table-wrapper table {
    border: 0;
  }
  .wmdk-sizecharts-hmtl-table-wrapper thead {
    display: none;
  }
  .wmdk-sizecharts-hmtl-table-wrapper tr,
  .wmdk-sizecharts-hmtl-table-wrapper tr.odd {
    margin-bottom: var(--wh1-space-sm);
    border: var(--wh1-border-width) solid var(--wh1-color-surface-soft);
    background: transparent;
  }
  .wmdk-sizecharts-hmtl-table-wrapper td,
  .wmdk-sizecharts-hmtl-table-wrapper table.wmdk-sizecharts-wide td {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: var(--wh1-space-md);
    padding: var(--wh1-space-xs) var(--wh1-space-sm);
    font-size: var(--wh1-font-size-sm);
    text-align: right;
  }
  .wmdk-sizecharts-hmtl-table-wrapper td + td {
    border-top: var(--wh1-border-width) solid var(--wh1-color-surface-soft);
  }
  .wmdk-sizecharts-hmtl-table-wrapper td::before {
    content: attr(data-label);
    font-weight: 800;
    text-align: left;
  }
  .wmdk-sizecharts-hmtl-table-wrapper td.wh1-base-size,
  .wmdk-sizecharts-hmtl-table-wrapper table.wmdk-sizecharts-wide td.wh1-base-size {
    display: block;
    background: var(--wh1-color-surface-soft);
    font-size: var(--wh1-font-size-md);
    font-weight: 800;
    text-align: center;
  }
  .wmdk-sizecharts-hmtl-table-wrapper td.wh1-base-size::before {
    content: attr(data-label) ": ";
  }
  .wmdk-sizecharts-hmtl-table-wrapper td:empty {
    display: none;
  }
}
/* ===================================================================
 * #70167 — "PDP: wishlist Heart icon is not visible".
 *
 * `.kussin-product-wishlist` sets `color: var(--wh1-color-white)` and the heart's `<path>` follows
 * `currentColor`, so the control was designed as a white heart on the teal square — which is what
 * production shows. It only ever rendered that way for logged-in visitors, because for them the
 * control is a `<button>`: for everyone else it is `<a id="loginToWish">`, and
 * `#wrapper a { color: var(--wh1-color-primary) }` (an id selector) beats the class rule. The
 * heart then inherited the same teal as the square it sits on and disappeared — measured
 * `color: rgb(15, 85, 92)` on `background: rgb(15, 85, 92)`.
 *
 * Restated below with the `#wrapper` prefix so the anchor and the button agree. The
 * "already on the registry" state is repeated for the same reason.
 * =================================================================== */
#wrapper a.kussin-product-wishlist,
#wrapper a.kussin-product-wishlist:hover,
#wrapper a.kussin-product-wishlist:focus {
  color: var(--wh1-color-white);
}
#wrapper a.kussin-product-wishlist.is-in-wishlist,
#wrapper a.kussin-product-wishlist.is-in-wishlist:hover,
#wrapper a.kussin-product-wishlist.is-in-wishlist:focus {
  color: var(--wh1-color-highlight-red);
}
[data-kussin-sticky-cart].is-sticky {
  min-height: var(--kussin-sticky-cart-anchor-height, 0);
}
[data-kussin-sticky-cart].is-sticky > .tobasket-function,
[data-kussin-sticky-cart].is-sticky > .tobasketFunction {
  position: fixed;
  right: 0;
  bottom: 0;
  left: 0;
  z-index: 1035;
  width: 100%;
  margin: 0 !important;
  padding: 10px 10px max(60px, calc(10px + env(safe-area-inset-bottom))) 20px;
  border-top: var(--wh1-border-width) solid var(--wh1-color-surface-soft);
  background: var(--wh1-color-surface-soft);
  box-shadow: 0 2px 10px var(--wh1-color-black);
}
[data-kussin-sticky-cart].is-sticky .kussin-sticky-cart-discount {
  position: absolute;
  top: -25px;
  right: 30px;
  bottom: auto;
  z-index: 1;
  display: block;
  width: auto;
  height: 45px;
  min-height: 0;
  margin: 0;
  padding: 10px;
  border: 1px solid var(--wh1-color-highlight-red);
  border-radius: 10px 10px 0 0;
  background: var(--wh1-color-white);
  color: var(--wh1-color-highlight-red);
  font-size: 12px;
  font-weight: 700;
  letter-spacing: -0.2px;
  line-height: 15px;
  text-transform: uppercase;
  transform: rotate(-3deg);
}
[data-kussin-sticky-cart].is-sticky > .tobasketFunction > .input-group,
[data-kussin-sticky-cart].is-sticky > .tobasket-function {
  position: relative;
  z-index: 2;
  display: flex;
  width: 100%;
  height: 42px;
  margin: 0 !important;
}
[data-kussin-sticky-cart].is-sticky > .tobasketFunction > .input-group > .input-group-tweak {
  display: flex;
  flex: 1 1 auto;
  width: 100%;
  height: 42px;
  margin: 0 !important;
}
[data-kussin-sticky-cart].is-sticky #toBasket,
[data-kussin-sticky-cart].is-sticky .submitButton {
  position: static;
  display: block;
  width: 100%;
  height: 42px;
  min-height: 42px;
  padding: 10px 20px;
  border: 1px solid var(--wh1-color-primary-border);
  border-radius: 25px;
  background: var(--wh1-color-primary);
  color: var(--wh1-color-white);
  font-size: 14px;
  font-weight: 400;
  line-height: 20px;
  text-align: center;
}
[data-kussin-sticky-cart].is-sticky #toBasket svg,
[data-kussin-sticky-cart].is-sticky .submitButton svg {
  display: inline-block;
  width: 14px;
  height: 14px;
  margin-right: 3px;
  vertical-align: -2px;
}
[data-kussin-sticky-cart].is-sticky .mobile-only,
[data-kussin-sticky-cart].is-sticky #toBasket .mobile-only {
  display: inline-block !important;
  font-size: 14px;
  font-weight: 400;
  line-height: 20px;
}
html.kussin-sticky-cart-active body {
  padding-bottom: var(--kussin-sticky-cart-height, 0);
}
.cl-details .details {
  /* APEX clips this wrapper. That turns it into the sticky sidebar's nearest
       overflow ancestor even though the wrapper itself does not scroll. */
  overflow: visible;
}
.kussin-product-information {
  margin-top: var(--wh1-space-xl);
}
@media (min-width: 768px) and (max-width: 991.98px) {
  .kussin-product-layout > .kussin-product-information-column {
    width: 100%;
  }
}
@media (min-width: 992px) {
  .kussin-product-layout {
    display: grid;
    /*
         * `minmax(0, …)` rather than a bare `7fr`: an `fr` track has an automatic minimum of
         * min-content, so the gallery's intrinsic width propped the first column open at 1076px and
         * squeezed the buy box down to 316 — the product title wrapped over three lines and the
         * add-to-basket label over two. With a zero floor the tracks keep the ratio they declare.
         */
    grid-template-columns: minmax(0, 7fr) minmax(0, 5fr);
  }
  .kussin-product-layout > .kussin-product-main-column,
  .kussin-product-layout > .kussin-product-aside,
  .kussin-product-layout > .kussin-product-information-column {
    width: 100%;
    max-width: 100%;
  }
  .kussin-product-main-column {
    grid-column: 1;
    grid-row: 1;
  }
  .kussin-product-aside {
    grid-column: 2;
    grid-row: 1 / span 2;
  }
  .kussin-product-information-column {
    grid-column: 1;
    grid-row: 2;
  }
  .kussin-product-information-panel {
    padding-right: 20px;
  }
}
@media (min-width: 1200px) {
  .kussin-product-layout {
    grid-template-columns: minmax(0, 8fr) minmax(0, 4fr);
  }
}
.kussin-product-information-panel {
  border-bottom: var(--wh1-border-width) solid var(--wh1-color-surface-soft);
}
.kussin-product-information-heading {
  margin: 0;
}
.kussin-product-information-trigger {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--wh1-space-md);
  width: 100%;
  padding: 20px 0;
  border: 0;
  background: transparent;
  color: var(--wh1-color-primary);
  font-family: var(--wh1-font-family-heading);
  font-size: 1.5rem;
  font-weight: 600;
  line-height: 1.2;
  text-align: left;
}
.kussin-product-information-arrow {
  width: 12px;
  height: 12px;
  flex: 0 0 12px;
  border-right: 2px solid currentColor;
  border-bottom: 2px solid currentColor;
  transform: rotate(45deg) translateY(-3px);
  transition: transform 0.2s ease;
}
.kussin-product-information-trigger[aria-expanded="true"] .kussin-product-information-arrow {
  transform: rotate(225deg) translate(-2px, -2px);
}
.kussin-product-information-content {
  height: 0;
  overflow: hidden;
  position: relative;
  transition: height 0.2s ease-in-out;
}
.kussin-product-information-panel-preview:not(.is-open) .kussin-product-information-content {
  height: 120px;
}
.kussin-product-information-panel.is-open .kussin-product-information-content {
  height: auto;
}
.kussin-product-information-panel:not(.kussin-product-information-panel-preview):not(.is-open) .kussin-product-information-content {
  visibility: hidden;
}
/*
 * #70234 — the GPSR manufacturer modal must stay visible.
 *
 * `kussin/eugdsr` emits the modal inside the specification pane, and the rule above makes a closed
 * pane `visibility: hidden`. Visibility inherits, so the modal opened from the brand band — whose
 * pane is closed — dimmed the page with its backdrop and rendered nothing. It only appeared to work
 * from the link in the specification table, because that link exists only while the pane is open.
 * A fixed-position descendant is not clipped by the pane's `overflow: hidden`, so restoring
 * visibility is all that is needed.
 */
.kussin-product-information-content .modal {
  visibility: visible;
}
.kussin-product-information-body {
  padding: 20px 0;
  line-height: 1.8;
}
.kussin-product-information-more {
  position: absolute;
  right: 0;
  bottom: 0;
  left: 0;
  display: block;
  width: 100%;
  height: 70px;
  padding: 42px 0 0;
  border: 0;
  background: linear-gradient(transparent, var(--wh1-color-white) 62%);
  color: var(--wh1-color-primary);
  font-size: var(--wh1-font-size-sm);
  font-weight: 800;
  text-align: center;
}
.kussin-product-information-more::before,
.kussin-product-information-more::after {
  content: "-";
  margin: 0 var(--wh1-space-xs);
}
.kussin-product-information-panel.is-open .kussin-product-information-more {
  display: none;
}
.kussin-product-attributes {
  --bs-table-striped-color: var(--wh1-color-primary);
  margin-bottom: 0;
}
.kussin-product-attributes th,
.kussin-product-attributes td {
  width: 50%;
  padding: var(--wh1-space-sm) var(--wh1-space-md);
  vertical-align: top;
}
.kussin-product-attributes th {
  font-weight: 800;
}
/* #70373: Editor-authored tables share the specification appearance, without
   its two-column widths. Important declarations override pasted inline styles. */
.cl-details #description .kussin-product-information-body {
  overflow-x: auto;
}
.cl-details #description .kussin-product-information-body table {
  width: 100% !important;
  max-width: 100%;
  margin-block: var(--wh1-space-md);
  border: 0 !important;
  border-collapse: collapse;
  table-layout: auto !important;
  color: var(--wh1-color-primary);
}
.cl-details #description .kussin-product-information-body table th,
.cl-details #description .kussin-product-information-body table td {
  width: auto !important;
  height: auto !important;
  padding: var(--wh1-space-sm) var(--wh1-space-md) !important;
  border: 0 !important;
  border-bottom: var(--wh1-border-width) solid var(--wh1-color-surface-soft) !important;
  vertical-align: top !important;
  background: var(--wh1-color-white) !important;
  box-shadow: none;
}
.cl-details #description .kussin-product-information-body table th,
.cl-details #description .kussin-product-information-body table td,
.cl-details #description .kussin-product-information-body table th *,
.cl-details #description .kussin-product-information-body table td * {
  color: inherit !important;
  font-family: inherit !important;
  font-size: inherit !important;
  white-space: normal !important;
}
.cl-details #description .kussin-product-information-body table th {
  font-weight: 800;
}
.cl-details #description .kussin-product-information-body table > tbody > tr:nth-child(odd) > th,
.cl-details #description .kussin-product-information-body table > tbody > tr:nth-child(odd) > td {
  background: var(--wh1-color-surface-soft) !important;
}
@media (max-width: 767.98px) {
  .kussin-product-information {
    margin-top: var(--wh1-space-lg);
  }
  .kussin-product-information-trigger {
    padding: var(--wh1-space-md) 0;
    font-size: 1.25rem;
  }
  .kussin-product-information-body {
    padding: 20px 10px;
  }
  .kussin-product-attributes th,
  .kussin-product-attributes td {
    padding: var(--wh1-space-xs) var(--wh1-space-sm);
  }
  .cl-details #description .kussin-product-information-body table th,
  .cl-details #description .kussin-product-information-body table td {
    padding: var(--wh1-space-xs) var(--wh1-space-sm) !important;
  }
}
/* ===================================================================
 * #70234 — the brand block below the product information.
 *
 * Production shows the manufacturer's copy as its own full-width band after the
 * description/specification accordion and before the CMS content the injector adds, open on
 * arrival rather than collapsed — the title is not clickable on either viewport, so there is no
 * toggle here.
 *
 * Values measured on the live K2 page at 1440: a white band across the viewport, a 1170px centred
 * container, and inside it a light-teal card `rgb(224, 239, 240)` with 20px/40px padding. Both the
 * "Marke" heading and the brand name are 24px / 400 / upright / brand teal in Muli — not the
 * theme's italic heading — and the copy itself is 14px.
 * =================================================================== */
.kussin-product-manufacturer-band {
  padding: 20px 0;
  background: var(--wh1-color-white);
}
.kussin-product-manufacturer {
  padding: 20px 40px;
  background: var(--wh1-color-surface-soft);
  border-radius: 25px;
}
.kussin-product-manufacturer-heading,
.kussin-product-manufacturer-title {
  margin: 0 0 var(--wh1-space-xs);
  color: var(--wh1-color-primary);
  font-family: var(--wh1-font-family-base);
  font-size: 1.5rem;
  font-style: normal;
  font-weight: 400;
  line-height: 1.25;
  text-transform: none;
}
.kussin-product-manufacturer-info-link {
  display: inline-block;
  margin-top: var(--wh1-space-sm);
}
.kussin-product-manufacturer-body {
  color: var(--wh1-color-primary);
  font-size: 0.875rem;
  line-height: 1.65;
}
.kussin-product-manufacturer-body p:last-child {
  margin-bottom: 0;
}
@media (max-width: 767.98px) {
  .kussin-product-manufacturer {
    padding: 20px;
  }
}
/* ===================================================================
 * #70286 — the grey band between the newsletter block and "Kunden kauften auch".
 *
 * `.details` and `.details-related` are adjacent white blocks, but the last thing inside
 * `.details` is a `.row-spacer`, whose `margin-bottom: var(--row-spacing)` collapses straight
 * out through the parent's open bottom edge. The 50px it takes therefore sits *between* the two
 * white blocks, where the page background (#f2f6f7) shows through as a full-width bar.
 *
 * Keeping the spacing but moving it inside the white block removes the bar without changing the
 * rhythm of the page: the spacer no longer pushes from outside, and `.details` reserves the same
 * distance as padding, which is painted in its own white.
 * =================================================================== */
.details {
  padding-bottom: var(--row-spacing);
}
.details > .row-spacer:last-child {
  margin-bottom: 0;
}
/* ===================================================================
 * #70286 — a recommendation section with nothing in it.
 *
 * The grey bar this ticket started with is gone, but the same seam shows a second way: FACT-Finder
 * answers `"hits": []` for an article it does not know, the web component fills nothing in, and the
 * heading plus the empty slider still hold their share of the page — a band of blank between the
 * newsletter block and the footer. wh1.js marks such a section while it holds no record, and the
 * rule below takes it out of the flow; the class is removed again the moment a record arrives, so a
 * slow API answer costs nothing but the wait.
 *
 * `.details` gives back the padding it reserves for the section as well: with nothing following it,
 * that fifty pixels is just more of the same emptiness.
 * =================================================================== */
.details-related.wh1-carousel-empty,
.kussin-factfinder-pdp-related.wh1-carousel-empty {
  display: none;
}
.details:has(+ .details-related.wh1-carousel-empty) {
  padding-bottom: 0;
}
/* ===================================================================
 * #70286 — the grey bar, the rest of it.
 *
 * Moving the last spacer inside `.details` closed the band above "Kunden kauften auch", but the
 * page still ends on a grey one: `.kussin-footer` carries `margin-top: 120px`, and a margin paints
 * nothing, so the body's #F2F6F7 shows through it — under the recommendation carousel on a product
 * that has one, and under the product block itself on a product whose carousel is folded away
 * (#70286's own collapse), which is why the reporter saw it "still there, just wider".
 *
 * The 120px is kept exactly as it is; it simply moves inside the white. `main.content` takes it as
 * padding and paints its own white behind it, and the footer gives up the outer margin. That also
 * closes every other seam between the white blocks on this page, which is where the bar was first
 * reported.
 *
 * Scoped to the product page on purpose: on the listing and CMS pages the same 120px is the gap
 * that separates content from the footer on the shop's grey ground, and it is meant to be seen.
 * =================================================================== */
body.cl-details main.content {
  padding-bottom: 120px;
  background: var(--wh1-color-white);
}
body.cl-details .kussin-footer {
  margin-top: 0;
}
/* Manufacturer landings rendered by the VisualCMS BrandMood/BrandSubcats
 * shortcodes. The kussin wrapper is theme-owned; wmdk classes are compatibility
 * hooks for the existing CMS output and must not be used for new markup. */
.kussin-brand-landing {
  padding-bottom: 24px;
  /* #70134 — see the note at the foot of this file: the module's own -500px bleed stacks on top
       of this theme's `width: 100vw`, and `object-fit: cover` turns the surplus into zoom. */
  /*
     * #70038 — "Zu den Produkten scrollen".
     *
     * The previous rule turned the link into a 44px circle and hid the label with a
     * `span { clip: rect(0,0,0,0) }` selector — but the CMS content has NO <span>: the label is a
     * bare text node inside the <a>. Nothing was hidden, so "Zu den Produkten scrollen" overflowed
     * the 44px box and wrapped over four lines with the chevron drawn on top of it.
     *
     * Production does not draw a circle at all. It renders a centred uppercase teal label with a
     * wide chevron beneath (`.dd-shortcode-wmdkffautoscrolltorecordlist .wmdk-scroll2recordlist-button`
     * in the live stylesheet). Matched here, and keyed on the shortcode rather than on the brand
     * landing so it also applies where the CMS places the widget on a category page.
     */
  /*
     * #70390 — the tile row has to follow the number of tiles.
     *
     * `repeat(4, ...)` was measured on BTFL, which has four. The 54 bands rendered across the 82
     * brand landings hold 3 to 10 tiles and five is the commonest (15 of them), so a fixed four
     * wrapped most brands: NIDECKER's five came out 4 + 1 with the second row three columns short.
     * The module's own inline value is no better. It is `auto-fill`, which keeps the tracks it
     * created even when nothing occupies them, so BTFL sat in 5 of 7 tracks at 1600 with two dead
     * columns on the right and 207px tiles.
     *
     * `auto-fit` collapses the empty tracks and the `1fr` maximum hands their width back to the
     * tiles that exist, so every count that fits the 200px minimum lands on one line and fills the
     * row. The inline style is on the element itself, hence the !important.
     */
}
.kussin-brand-landing #catDescLocator > div > .row {
  margin-inline: 0;
}
.kussin-brand-landing .dd-shortcode-wmdkbrandmood,
.kussin-brand-landing .dd-shortcode-wmdkbrandsubcats {
  width: 100%;
  max-width: none;
  padding-inline: 0;
}
.kussin-brand-landing .dd-shortcode-wmdkbrandmood {
  position: relative;
  left: 50%;
  width: 100vw;
  margin: 0 0 20px -50vw;
  overflow: hidden;
}
.kussin-brand-landing .wmdk-brand-mood-inner {
  position: relative;
  height: 498px;
  overflow: hidden;
  background: var(--wh1-color-black);
}
.kussin-brand-landing .dd-shortcode-wmdkbrandmood .wmdk-brand-mood-inner {
  margin-inline: 0;
}
.kussin-brand-landing .wmdk-brand-mood-inner > img.wmdk-brand-mood {
  position: absolute;
  inset: 0;
  display: block;
  width: 100%;
  height: 100%;
  max-width: none;
  -o-object-fit: cover;
     object-fit: cover;
  -o-object-position: center;
     object-position: center;
}
.kussin-brand-landing .wmdk-brand-mood-inner > img.wmdk-brand-mood-mobile {
  display: none;
}
.kussin-brand-landing .wmdk-brand-mood-content {
  position: absolute;
  z-index: 1;
  inset: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  padding: 20px;
  text-align: center;
}
.kussin-brand-landing .wmdk-brand-logo {
  display: block;
  width: auto;
  max-width: 138px;
  max-height: 138px;
  margin: 0 auto 20px;
}
.kussin-brand-landing .wmdk-brand-claim {
  max-width: 340px;
  margin: 0 auto;
  padding: 10px 25px;
  background: rgba(0, 0, 0, 0.4);
  color: var(--wh1-color-white);
  font-size: 18px;
  line-height: 1.35;
  text-transform: uppercase;
}
.kussin-brand-landing .wmdk-scroll2recordlist-wrapper {
  margin-top: 20px;
}
.kussin-brand-landing .dd-shortcode-wmdkbrandsubcats > ul {
  display: grid !important;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)) !important;
  gap: 15px !important;
  margin: 0 !important;
  padding: 0 !important;
  list-style: none !important;
}
.kussin-brand-landing .dd-shortcode-wmdkbrandsubcats > ul > li {
  min-width: 0;
}
.kussin-brand-landing .dd-shortcode-wmdkbrandsubcats > ul > li > a {
  display: block;
  height: 100%;
  border-radius: var(--wh1-radius-sm);
  overflow: hidden;
}
.kussin-brand-landing .dd-shortcode-wmdkbrandsubcats > ul > li > a:focus-visible {
  outline: 0;
  box-shadow: var(--wh1-focus-ring);
}
@media (max-width: 991.98px) {
  .kussin-brand-landing .dd-shortcode-wmdkbrandsubcats > ul {
    display: flex !important;
    gap: 15px !important;
    padding: 3px 0 12px !important;
    overflow-x: auto;
    overscroll-behavior-inline: contain;
    scroll-padding-inline: 0;
    scroll-snap-type: x mandatory;
    scrollbar-width: none;
    -webkit-overflow-scrolling: touch;
  }
  .kussin-brand-landing .dd-shortcode-wmdkbrandsubcats > ul::-webkit-scrollbar {
    display: none;
  }
  .kussin-brand-landing .dd-shortcode-wmdkbrandsubcats > ul > li {
    flex: 0 0 min(320px, calc(100% - 40px));
    scroll-snap-align: start;
    scroll-snap-stop: normal;
  }
}
@media (max-width: 480px) {
  .kussin-brand-landing .wmdk-brand-mood-inner {
    height: 320px;
  }
  .kussin-brand-landing .wmdk-brand-mood-inner > img.wmdk-brand-mood:not(.wmdk-brand-mood-mobile) {
    display: none;
  }
  .kussin-brand-landing .wmdk-brand-mood-inner > img.wmdk-brand-mood-mobile {
    display: block;
  }
  .kussin-brand-landing .wmdk-brand-logo {
    max-width: 120px;
    max-height: 120px;
    margin-bottom: 14px;
  }
  .kussin-brand-landing .wmdk-brand-claim {
    padding: 8px 18px;
    font-size: 14px;
  }
  .kussin-brand-landing .wmdk-scroll2recordlist-wrapper {
    margin-top: 12px;
  }
}
@media (prefers-reduced-motion: reduce) {
  .kussin-brand-landing .dd-shortcode-wmdkbrandsubcats > ul {
    scroll-behavior: auto;
  }
}
/* ===================================================================
 * #70038 — the FactFinder "scroll to the product list" widget.
 *
 * Keyed on the shortcode, matching production, so it styles the control wherever the CMS places it
 * — brand landing, category page or search. Values taken from the live stylesheet
 * (`.dd-shortcode-wmdkffautoscrolltorecordlist .wmdk-scroll2recordlist-button`): a centred
 * uppercase teal label with a wide chevron underneath, and no underline.
 *
 * The label is a bare text node in the CMS content (there is no <span> to hook), so the anchor
 * itself carries the type. A `span` is styled too, for content that does have one.
 * =================================================================== */
.dd-shortcode-wmdkffautoscrolltorecordlist {
  /* `#wrapper a` in the base stylesheet is an id selector and would otherwise keep the
       underline and the link colour, so match at the same weight rather than with !important. */
  /*
     * The wide chevron, on its own line under the label.
     *
     * Production can leave this `inline-block` because its label is wrapped in a `display: block`
     * <span>, which pushes the pseudo-element onto the next line. Our CMS content has no <span>, so
     * an inline-block chevron lands beside the text — make it a block and centre it instead.
     */
}
.dd-shortcode-wmdkffautoscrolltorecordlist .wmdk-scroll2recordlist-button {
  text-align: center;
}
.dd-shortcode-wmdkffautoscrolltorecordlist .wmdk-scroll2recordlist-button a,
.dd-shortcode-wmdkffautoscrolltorecordlist .wmdk-scroll2recordlist-button a span {
  display: block;
  color: var(--wh1-color-primary);
  font-size: 22px;
  font-weight: 700;
  text-transform: uppercase;
  text-decoration: none;
}
.dd-shortcode-wmdkffautoscrolltorecordlist .wmdk-scroll2recordlist-button a:hover,
.dd-shortcode-wmdkffautoscrolltorecordlist .wmdk-scroll2recordlist-button a:focus-visible {
  color: var(--wh1-color-primary-dark);
  text-decoration: none;
}
.dd-shortcode-wmdkffautoscrolltorecordlist .wmdk-scroll2recordlist-button a:focus-visible {
  outline: 2px solid var(--wh1-color-primary);
  outline-offset: 4px;
}
.dd-shortcode-wmdkffautoscrolltorecordlist .wmdk-scroll2recordlist-button a::after {
  display: block;
  width: 0;
  height: 0;
  margin: 10px auto 0;
  padding: 10px;
  border: solid currentColor;
  border-width: 0 3px 3px 0;
  content: "";
  transform: scaleX(2) rotate(45deg);
}
#wrapper .dd-shortcode-wmdkffautoscrolltorecordlist .wmdk-scroll2recordlist-button a {
  color: var(--wh1-color-primary);
  text-decoration: none;
}
@media (max-width: 767.98px) {
  .dd-shortcode-wmdkffautoscrolltorecordlist .wmdk-scroll2recordlist-button a,
  .dd-shortcode-wmdkffautoscrolltorecordlist .wmdk-scroll2recordlist-button a span {
    font-size: 16px;
  }
}
/* ===================================================================
 * #70134 — bring the brand landing back in line with production.
 *
 * Three separate defects, all measured against warehouse-one.de:
 *
 * 1. The breadcrumb. Production hides it outright on a brand listing —
 *    `body.cl-manufacturerlist #breadcrumb { display: none }` in the live bundle, no media query.
 *    The theme's wrapper carries the vertical padding, so the wrapper has to go, not just the list,
 *    or 48px of empty space stays behind. (The headline half of this is in build/js/wh1.js.)
 *
 * 2. The mood image was magnified. `kussin/visualcms-shortcodes` still ships production's OXID 6
 *    full-bleed hack — `margin-left/right: -500px` on `.wmdk-brand-mood-inner` — while this theme
 *    already full-bleeds the shortcode with `width: 100vw`. Stacked, the inner measures
 *    `100vw + 1000px`, and since the image is `object-fit: cover` the surplus becomes zoom rather
 *    than overflow: measured 2.305x on a 383px viewport (166x139 of a 600x320 photo) and 1.271x at
 *    1440. The shortcode class is needed to out-specify the module, whose stylesheet is linked
 *    inside the body and wins any tie.
 *
 * 3. The subcategory tile captions are lowercase; production's are uppercase.
 * =================================================================== */
body.cl-manufacturerlist .breadcrumb-wrapper {
  display: none;
}
.dd-shortcode-wmdkbrandsubcats li strong,
.dd-shortcode-wmdkbrandsubcats li h4 {
  text-transform: uppercase;
}
/* ===================================================================
 * #70143 — the brand A-Z overview at /marken/ and /en/brands/.
 *
 * Both are `cl=manufacturerlist&mnid=root`. The markup is emitted by
 * `ManufacturerListController::getManufacturerIndex()` / `::getManufacturerBoxes()` in
 * kussin/oxid-factfinder-integration, which still writes Bootstrap 3 column classes and inline
 * `background-image` logos — production forces those columns to full width in its own stylesheet,
 * so the same is done here rather than rewriting the controller's HTML.
 *
 * Values sampled from `body.cl-manufacturerlist #content …` in production's live bundle: a letter
 * anchor row between two hairlines, an uppercase group heading on a hairline, and a four-up grid of
 * 110px logo tiles.
 * =================================================================== */
.kussin-brand-index {
  padding-bottom: 30px;
  /* the controller's own BS3 grid — production widens it to the full container */
}
.kussin-brand-index .row > .col-sm-8,
.kussin-brand-index .row > .col-xs-12 {
  flex: 0 0 100%;
  width: 100%;
  max-width: 100%;
  padding-right: 0;
  padding-left: 0;
}
.kussin-brand-index .ankerlinks {
  display: flex;
  flex-wrap: wrap;
  margin: 10px 0;
  padding: 10px 0;
  border-top: 1px solid var(--wh1-color-surface-soft);
  border-bottom: 1px solid var(--wh1-color-surface-soft);
  list-style: none;
}
.kussin-brand-index .ankerlinks li {
  font-size: 24px;
  list-style: none;
}
.kussin-brand-index h2 {
  margin-bottom: 10px;
  padding-bottom: 10px;
  border-bottom: 1px solid var(--wh1-color-surface-soft);
  color: var(--wh1-color-primary);
  font-size: 24px;
  text-transform: uppercase;
}
.kussin-brand-index ul.manufacturers {
  display: flex;
  flex-wrap: wrap;
  gap: 5px;
  margin: 0 0 30px;
  padding: 0;
  list-style: none;
}
.kussin-brand-index ul.manufacturers li {
  flex: 0 0 calc(25% - 5px);
  height: 110px;
  border: 1px solid var(--wh1-color-surface-soft);
}
.kussin-brand-index ul.manufacturers li a {
  display: block;
  width: 100%;
  height: 110px;
  background-position: center;
  background-repeat: no-repeat;
  font-size: 14px;
}
.kussin-brand-index ul.manufacturers li a span {
  display: block;
  margin: 5px;
}
/*
 * `#wrapper a` is an id selector and paints every link in the brand teal; production leaves the
 * anchor row and the tile captions at its body grey, so restate them at the same weight.
 */
#wrapper .kussin-brand-index .ankerlinks li a {
  display: block;
  padding: 5px;
  color: var(--wh1-color-apex-333333);
  text-transform: uppercase;
}
#wrapper .kussin-brand-index h2 a {
  color: inherit;
}
#wrapper .kussin-brand-index ul.manufacturers li a {
  color: var(--wh1-color-apex-333333);
}
@media (max-width: 768px) {
  .kussin-brand-index ul.manufacturers li {
    flex-basis: calc(50% - 5px);
  }
}
@media (max-width: 480px) {
  .kussin-brand-index ul.manufacturers li {
    flex-basis: 100%;
  }
}
/* ===========================================================================
   Category "mood" hero banner (matches OXID6 wh1-2023): full-bleed category
   image with a dark overlay and centered white "Zu den N Artikeln" count,
   big uppercase category name and a down chevron.
   =========================================================================== */
/* ===================================================================
   #69763 — the mood hero is full-bleed on purpose, container or no container.

   The hero is rendered by the theme inside the listing head, and on any category that also has
   injected CMS content `kussin/cnc-contentinjector` wraps that head in its own
   `<div class="cnc-contentinjector">`. The wrapper sits in the page container, so the banner
   picked up the container's inset — 15px a side on a laptop, and from 1700px up the 1620px cap,
   which left it 1590 wide inset 165 on a 1920 screen while the page around it ran edge to edge.
   A category without injected content had no wrapper and stayed full-bleed, so the same page
   looked different depending on whether someone had added content to it.

   INTENTIONAL: the escape below is deliberate, not a leftover. The hero and the subcategory
   tiles are the listing head and belong to the page, not to the injected content — they break
   out. The injected CMS content itself keeps the 1170px reading width it is given in
   `pages/cms-content.less`. Production shows both edge to edge, which is what the
   `.wh1-cat-hero` comment above has always described as "full-bleed".
   =================================================================== */
:where(body.cl-alist, body.cl-manufacturerlist, body.cl-vendorlist) .wh1-cat-hero-link,
:where(body.cl-alist, body.cl-manufacturerlist, body.cl-vendorlist) .subcatList-wrapper {
  width: 100vw;
  max-width: 100vw;
  /* Centre the viewport-wide box on whatever inset the container left: half the parent's
           width minus half the viewport is exactly the distance back to the left edge. */
  margin-inline: calc(50% - 50vw);
}
.wh1-cat-hero-link {
  display: block;
  color: inherit;
  text-decoration: none;
}
.wh1-cat-hero-link:hover {
  color: inherit;
  text-decoration: none;
}
.wh1-cat-hero {
  position: relative;
  height: 340px;
  overflow: hidden;
  background: #0b4247;
}
.wh1-cat-hero::after {
  position: absolute;
  z-index: 1;
  inset: 0;
  content: "";
  background: rgba(0, 0, 0, 0.28);
}
.wh1-cat-hero-img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  -o-object-fit: cover;
     object-fit: cover;
  -o-object-position: center;
     object-position: center;
}
.wh1-cat-hero-content {
  position: absolute;
  z-index: 2;
  inset: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  padding: 0 20px;
  color: #fff;
  text-align: center;
  text-decoration: none;
}
.wh1-cat-hero-content:hover {
  color: #fff;
  text-decoration: none;
}
.wh1-cat-hero-count {
  margin-bottom: 10px;
  font-size: 40px;
  font-weight: 400;
  text-transform: uppercase;
}
.wh1-cat-hero-title {
  margin: 10px 0 40px;
  color: #fff;
  font-size: 70px;
  font-style: normal;
  font-weight: 700;
  line-height: 1.1;
  text-transform: uppercase;
}
.wh1-cat-hero-scroll {
  display: block;
  width: 16px;
  height: 16px;
  border: solid #fff;
  border-width: 0 3px 3px 0;
  transform: scaleX(1.4) rotate(45deg);
}
@media (max-width: 767.98px) {
  .wh1-cat-hero {
    height: 230px;
  }
  .wh1-cat-hero-title {
    margin-bottom: 25px;
    font-size: 32px;
  }
  .wh1-cat-hero-count {
    margin-bottom: 5px;
    font-size: 22px;
  }
}
/* ===========================================================================
   Subcategory tiles on category / manufacturer listings.
   Re-creates the OXID6 (wh1-2023) "Weitere Kategorien" block: light-blue band,
   rectangular rounded image tiles (bigger than the old 70px strips), uppercase
   dark-green titles and a pill "Alle anzeigen" load-more button.
   =========================================================================== */
.subcatList-wrapper {
  padding: 46px 0;
  background: var(--wh1-color-surface-soft);
}
.subcatList-wrapper .subcatHeading {
  margin-bottom: 28px;
  color: var(--wh1-color-primary);
  font-size: 1.2em;
  font-weight: 700;
  line-height: 24px;
}
.wh1-cat-description {
  padding: 40px 0;
  /*
     * #70043 — a band with nothing in it.
     *
     * The Sale record's CMS cells are all `hidden-xs hidden-sm hidden-md hidden-lg` (production
     * hides them too), so the shop renders the description block, finds it non-empty server side,
     * and the 40px above and below end up as an 80px white gap under the heading. Whether the
     * cells collapse is a CSS question, so only the browser can answer it —
     * `initCmsEmptyCategoryDescription()` sets this class when the block measures zero.
     */
}
.wh1-cat-description.wh1-cat-description--empty {
  display: none;
}
.subcat-grid {
  display: grid;
  /*
     * #69987 — five per row on wide screens ("since we have now more space we should show more
     * subcategories per row"). The collapsed state follows: it shows exactly one full row before
     * "Alle anzeigen", so the cut has to move from the 5th tile to the 6th.
     *
     * This is the DATABASE subcategory grid. The Visual CMS tile grid on pages such as
     * /water/neopren/ is a different component (#catLongDescLocator, see #70060) — that one is not
     * affected by this and stays at prod's three columns.
     */
  grid-template-columns: repeat(5, 1fr);
  gap: 26px;
  /* below the xxl container there is no room for five, so fall back to four */
}
.subcat-grid.is-collapsed .subcat-tile:nth-child(n + 6) {
  display: none;
}
@media (max-width: 1399.98px) {
  .subcat-grid {
    grid-template-columns: repeat(4, 1fr);
  }
  .subcat-grid.is-collapsed .subcat-tile:nth-child(n + 5) {
    display: none;
  }
}
@media (max-width: 991.98px) {
  .subcat-grid {
    grid-template-columns: repeat(2, 1fr);
    gap: 18px;
  }
}
@media (max-width: 575.98px) {
  .subcat-grid {
    grid-template-columns: 1fr;
  }
  .subcat-grid.is-collapsed .subcat-tile:nth-child(n + 3) {
    display: none;
  }
}
.subcat-tile {
  display: block;
  text-decoration: none;
}
.subcat-tile-media {
  display: block;
  overflow: hidden;
  border: 1px solid #d4e4e6;
  border-radius: 8px;
  background: #fff;
}
.subcat-tile-img {
  display: block;
  width: 100%;
  height: 132px;
  -o-object-fit: cover;
     object-fit: cover;
  transition: transform 0.25s ease;
}
.subcat-tile-name {
  display: block;
  margin-top: 12px;
  overflow: hidden;
  color: #0b4247;
  font-size: 0.875rem;
  font-weight: 700;
  letter-spacing: normal;
  line-height: 20px;
  text-align: center;
  text-overflow: ellipsis;
  text-transform: uppercase;
  white-space: nowrap;
}
.subcat-tile:hover .subcat-tile-img,
.subcat-tile:focus .subcat-tile-img {
  transform: scale(1.05);
}
.subcat-tile:hover .subcat-tile-name {
  color: #0f555c;
}
.subcat-trigger-wrap {
  margin-top: 30px;
  text-align: center;
}
.subcat-trigger {
  display: inline-block;
  min-width: 300px;
  padding: 11px 20px;
  color: #0b4247;
  background: transparent;
  border: 2px solid #0b4247;
  border-radius: 30px;
  cursor: pointer;
  font-size: 0.875rem;
  font-weight: 400;
  letter-spacing: normal;
  line-height: 20px;
  text-transform: none;
  transition: background 0.15s ease, color 0.15s ease;
}
.subcat-trigger:hover {
  color: #fff;
  background: #0b4247;
}
/* ===========================================================================
   VisualCMS category-description tiles — the "Full Suit / Shorty / Lycras …"
   image tiles and the "Women / Men / Kids" links beneath each — on category,
   manufacturer and search listings (body.cl-alist). Match warehouse-one.de.

   Prod computed values (read from the live site, not guessed):
   - grid lives in #catLongDescLocator, which on prod carries Bootstrap's
     .container (1170 / 15px padding → ~1140 inner). OXID7's VisualCMS10 drops
     the .container, so the grid runs edge-to-edge and spreads the fixed-375px
     images into ~480px columns with big uneven gaps. Re-add the centred shell.
   - tile caption = SPAN.dd-image-caption: absolute over the bottom half, soft
     upward gradient linear-gradient(0deg, rgba(0,0,0,.4), rgba(0,0,0,0)),
     24px padding, Muli 20px / 700 / uppercase / white.
     OXID7 instead emits BS5 card markup — .card-img-overlay.bg-black.bg-opacity-50
     (a dark band) with an italic teal .card-title.h6 — so restyle both.
   - tiles are border-radius 5px, overflow hidden (rounded, clipped image).
   - "Women / Men / Kids" links = dark #333, no underline (OXID7 renders them the
     theme teal + underlined via `#wrapper a`).

   Scoped to .cl-alist so the homepage tiles (.cms-home, styled in
   pages/home/tiles.less) are untouched.
   =========================================================================== */
.cl-alist {
  /*
     * #70060 — the centred shell the comment above promises but nobody actually wrote.
     *
     * Production's `#catLongDescLocator` carries Bootstrap 3's `.container`, giving a centred
     * 1170px box (measured on the live site: width 1170, margins 135/135 at a 1440 viewport).
     * VisualCMS 10 drops that class on OXID 7, so the block ran to 1382px with only a 29px gutter —
     * the CMS tile grid on /water/neopren/ sat wider than everything around it, which is what the
     * ticket calls "not centered". Note the neopren tiles are Visual CMS content, not database
     * subcategories: that category has none.
     *
     * Applied to the long-description block generally, exactly as prod's `.container` was.
     */
  /* VisualCMS 10.0.1 rebuilds the dedicated `.slom-cat-row` tile grid with
       image tiles (`.slom-cat-third`) and "Damen / Herren / Kids" labels
       (`.dd-shortcode-text`) as `col-xs-12` inside Bootstrap `.row`s. Give
       only those tile-grid items an explicit third-width (2-across on phones).
       Ordinary category copy also uses `.dd-shortcode-text`, so it must remain
       full width. The #catLongDescLocator id out-specifies `.col-xs-12` here.
       (NB: do NOT make `.slom-cat-row` itself flex — it holds the tile row and
       the label row as separate `.row`s that must keep stacking vertically.) */
  /*
     * #70060 — the "Damen / Herren / Kids" line under each tile is LEFT aligned on production
     * (measured: tile and label both start at x=150, `text-align: start`). It was centred here,
     * which left it visibly out of step with the tile above it.
     */
  /*
     * #70060 (mobile) — phones stack one tile per row, as production does.
     *
     * This used to be 50%, which put the tile image and its label row side by side: the phone
     * screenshot on the ticket shows [image | Damen / Herren / Kids] pairs with the labels running
     * off the right edge. Production renders a full-width tile with its labels underneath.
     */
  /* "Women / Men / Kids" links under each tile — dark, un-underlined (the
       #catLongDescLocator id beats the theme's `#wrapper a` teal + underline). */
  /* tighten the inter-tile gutter to prod's ~5px (OXID7 default is wider). */
  /* mobile parity: prod caption drops to 18px / 16px padding on small screens. */
}
.cl-alist #catLongDescLocator {
  max-width: 1170px;
  margin-inline: auto;
  padding-inline: 15px;
}
.cl-alist #catLongDescLocator .slom-cat-third,
.cl-alist #catLongDescLocator .slom-cat-row .dd-shortcode-text {
  flex: 0 0 33.333%;
  max-width: 33.333%;
}
.cl-alist #catLongDescLocator .slom-cat-row .dd-shortcode-text {
  text-align: start;
}
@media (max-width: 767.98px) {
  .cl-alist #catLongDescLocator .slom-cat-third,
  .cl-alist #catLongDescLocator .slom-cat-row .dd-shortcode-text {
    flex: 0 0 100%;
    max-width: 100%;
  }
}
.cl-alist .dd-image-box {
  margin: 8px 0 0 !important;
  /* prod: 8px top only (kills the my-4) */
  /* caption band: prod's soft upward gradient over the bottom half, not
           OXID7's dark bg-opacity band. */
}
.cl-alist .dd-image-box .card {
  border: 0;
  background: transparent;
  border-radius: 5px;
  overflow: hidden;
  /* clips the image + gradient to the rounded corners */
}
.cl-alist .dd-image-box img {
  display: block;
  width: 100%;
  height: auto;
  border-radius: 5px;
  /* prod zooms the tile image to scale(1.1) on hover over 0.4s (measured
               live). The .card overflow:hidden above clips the scaled image to the
               rounded tile; the caption is a sibling overlay so it stays put. */
  transition: transform 0.4s cubic-bezier(0.46, 0.03, 0.52, 0.96);
}
.cl-alist .dd-image-box .card:hover img,
.cl-alist .dd-image-box .card:focus-within img {
  transform: scale(1.1);
}
.cl-alist .dd-image-box .card-img-overlay {
  inset: auto 0 0 0;
  height: 50%;
  display: flex;
  align-items: flex-end;
  padding: 24px !important;
  background: linear-gradient(0deg, rgba(0, 0, 0, 0.4) 0%, rgba(0, 0, 0, 0) 100%) !important;
  border-radius: 0;
}
.cl-alist .dd-image-box .card-img-overlay-content {
  width: 100%;
}
.cl-alist .dd-image-box .dd-image-caption,
.cl-alist .dd-image-box .card-title {
  margin: 0;
  color: #fff;
  font-family: 'Muli', sans-serif;
  font-size: 20px;
  /* prod .slom-cat-third caption = fixed 20px */
  font-weight: 700;
  font-style: normal;
  letter-spacing: 0;
  text-transform: uppercase;
  text-shadow: none;
}
.cl-alist #catLongDescLocator .slom-cat-row .dd-shortcode-text a {
  color: #333;
  text-decoration: none;
}
.cl-alist #catLongDescLocator .slom-cat-row .dd-shortcode-text a:hover,
.cl-alist #catLongDescLocator .slom-cat-row .dd-shortcode-text a:focus {
  color: #0b4247;
  text-decoration: none;
}
.cl-alist #catLongDescLocator .slom-cat-row > .row {
  --bs-gutter-x: 0.375rem;
}
@media (max-width: 768px) {
  .cl-alist .dd-image-box .card-img-overlay {
    padding: 16px !important;
  }
  .cl-alist .dd-image-box .dd-image-caption,
  .cl-alist .dd-image-box .card-title {
    font-size: 18px;
  }
}
/* =========================================================================
   #70356 — the category text under the listing, on the product column.

   The injected group wrapper carries production's own shell: 1170px, centred, 15px gutter
   (`components/factfinder/list.less`, #70178 / #70233). The product grid is not on that shell —
   it lives in the page's `.container-xxl`, which runs to the viewport and stops at 1620px — so the
   text block and the products it belongs to were laid out on two different grids. Measured on
   /water/wake/wakeboards/ the text started 183px left of the first card at 1920 and 288px left of
   it at 1200, and reached past the last card at every width.

   The offsets are the listing grid's own arithmetic rather than fitted values. Giving the injector
   the container's cap makes the percentages below resolve against the same box the grid uses;
   inside it, with `W` the container width, its 29px gutter, the row's -7.5px and the column's
   7.5px:

       first card  = 25% * (W - 43) + 29   = 25% * W + 18.25
       card width  = 75% * (W - 43) - 15   = 75% * W - 47.25

   Below `lg` the filter column is not beside the products, the results column is the whole row,
   and the block keeps the phone treatment #70063 pinned to production's 360px box.
   ========================================================================= */
/* -------------------------------------------------------------------------
   Scope, corrected under #70356.

   The arithmetic above is right and was verified on the category pages, but it
   was keyed on `body.cl-alist` and a category listing is not the only listing
   that carries this block. A brand page is `cl-manufacturerlist` and a vendor
   page `cl-vendorlist`, and both draw the same FACT Finder grid inside the same
   `.container-xxl` with the same 29px gutter and the same 25/75 split — so the
   text block missed the rule entirely and kept the full page width. Measured on
   /nidecker/ and /flow/ at 1600 it ran 215 to 1385 where the cards run 418 to
   1572, i.e. 203px out on the left and 187px short on the right.

   Keying on the listing itself rather than on a body class is what makes this
   cover every case: the offsets only make sense where the filter column takes
   the first quarter of the row, and `.kussin-factfinder-listing` is exactly the
   wrapper that draws it. A page with a content injector and no product grid —
   an ordinary CMS page — is left alone, which a list of body classes could not
   guarantee on its own.
   ------------------------------------------------------------------------- */
@media (min-width: 992px) {
  body:has(.kussin-factfinder-listing) .cnc-contentinjector {
    max-width: 1620px;
    margin-inline: auto;
    /*
         * `!important` is doing real work here, it is not padding over a specificity guess.
         *
         * The servers load a legacy stylesheet the local checkout does not have — production's own
         * `saltylemon.css`, printed inline in the body — and it carries
         *
         *     body.cl-alist .cnc-contentinjector,
         *     body.cl-manufacturerlist .cnc-contentinjector { max-width:1620px; margin:auto;
         *                                                     padding-left:15px; padding-right:15px }
         *
         * That selector's specificity is identical to this one, and being inline it comes later in
         * document order, so it wins. Its 15px shrinks the box the percentages below resolve
         * against, and the block lands 10px short of the product grid on the right — exactly what
         * this ticket was reopened for. Measured on www1 /water/wake/wakeboards/: -10px at 1920,
         * 1600 and 1200, and 0 with this declaration in place.
         *
         * Worth remembering that the defect is invisible locally, because that stylesheet is only
         * on the servers.
         */
    padding-inline: 0 !important;
  }
  /* #70469: injected BrandMood landings keep the centered CMS container.
       The product-column offset is for listing copy, not the hero and its content. */
  body:has(.kussin-factfinder-listing) .cnc-contentinjector > div:not([class]):not(:has(.dd-shortcode-wmdkbrandmood)) {
    max-width: none;
    width: calc(75% - 47px);
    margin-left: calc(25% + 18px);
    margin-right: 0;
    /*
         * Not `padding-inline: 0` — that was the remaining half of #70356.
         *
         * The block's own box was landing on the grid correctly, but what a visitor sees is the
         * `.row` inside it, and a Bootstrap row carries `margin-inline: -0.5 * --bs-gutter-x` on
         * the understanding that its parent pays that back as padding. With the padding zeroed the
         * margin had nothing to cancel, so the content hung 5px past the block on each side:
         * measured on /water/wake/wakeboards/ the text ran 413 to 1576 where the toolbar and the
         * product cards above it end at 1571. Narrow enough to look like a rendering slip rather
         * than a layout bug, which is why it survived the first pass.
         *
         * Reading the gutter from the row's own custom property keeps the two in step if the
         * theme ever retunes it, instead of pinning the 5px this breakpoint happens to use.
         */
    padding-inline: calc(var(--bs-gutter-x, 0.625rem) * 0.5);
  }
}
/* =========================================================================
   Homepage LAYOUT — VisualCMS grid in oxstartslot1 (.cms-home).
   Container width, centering, block rhythm and full-bleed rows live here.
   Per-section styling is split into home/*.less so sections can be worked on
   independently. Hero / FACT-Finder / blog styling lives in their widgets.

   NOTE: content column matches warehouse-one.de's 1140px container 1:1
   (@wh1-hp-width), measured from prod's computed layout (2026-07-15 review).
   ========================================================================= */
/* match prod's content container exactly */
/* prod spaces blocks tightly (~15-24px), not the 44px we had */
/* #70379 — one gap on both edges of a mint band (prod's lower edge is 34px) */
.cms-home {
  width: 100%;
  max-width: 100%;
  padding-left: 0;
  padding-right: 0;
  margin-left: 0;
  margin-right: 0;
  overflow-x: hidden;
  font-family: var(--wh1-font-family-base);
  color: var(--wh1-color-black);
  /* ---- block rhythm + centered content column -------------------------- */
  /* full-bleed hero — its widget carries `wh1-row-fullbleed`, copied up to the .row
       by the homepage JS (start.html.twig). Banderoles stay contained (wh1-row-banderole
       in home/tiles.less). No :has(). */
  /* generic button reset (variant styling in home/bands.less + widgets) */
}
.cms-home > div > .row {
  --bs-gutter-x: 1.5rem;
  max-width: 1140px;
  margin-inline: auto;
  padding-inline: 0;
  /* content spans the full 1140 column like prod (no side inset) */
  margin-top: 1.5rem;
}
.cms-home > div > .row:first-child {
  margin-top: 0;
}
.cms-home > div > .row.wh1-row-fullbleed {
  max-width: none;
  margin-top: 0;
  padding-inline: 0;
  --bs-gutter-x: 0;
}
.cms-home .btn,
.cms-home .btn:hover,
.cms-home .btn:focus {
  text-decoration: none !important;
}
/* keep side breathing room until the 1140 column can center with margin */
@media (max-width: 1199px) {
  .cms-home > div > .row {
    padding-inline: 15px;
  }
}
/* ---- mobile ------------------------------------------------------------- */
@media (max-width: 767px) {
  .cms-home > div > .row {
    margin-top: 1.75rem;
  }
  .cms-home .wmdk-hero-slider .wmdk-hero-content {
    max-width: 100%;
  }
}
/* ---- per-section partials (owned independently) ------------------------- */
/* Homepage — image tiles, banderoles, showroom gallery. Match warehouse-one.de.
   Prod computed values (read from the live site, not guessed):
   - all images: SHARP corners (border-radius 0)
   - category tile title = SPAN.dd-image-caption: absolute, bottom 50% of tile,
     background linear-gradient(0deg, rgba(0,0,0,.4), rgba(0,0,0,0)), padding 24px,
     Muli 20px / 700 / uppercase / white
   - SALE + Winter banderoles: CONTAINER width (prod ~1140), NOT edge-to-edge
   - inter-tile gap ~5px; caption 20px (18px for the 4-up), fixed (prod does not clamp)
   - no hover zoom on prod
   Tile images render at ~1110 here vs prod's 1140 (the shared grid container adds
   ~15px side padding — a global width-shell thing, not fixable inside this file).
   Scoped under .cms-home. */
.cms-home {
  /* Opt-in rounded corners — prod tiles use border-radius 5px. Add the class
       `wh1-rounded` to an image widget's "CSS class" field to round it. */
  /* Hover zoom — OPT-IN only, via the `wh1-hover-zoom` class on an image widget.
       Per request only the "Snowboard & Winterbekleidung" tile zooms (not every tile).
       The card's overflow:hidden clips the scaled image. */
  /* category tile caption overlay — the overlay/caption elements only exist on
       captioned tiles, so target them directly (no :has). */
  /* SALE/Winter banderoles + rollschuhe/snowwear render at CONTAINER width (1140),
       not edge-to-edge. Their widget carries `wh1-row-banderole` (copied up to the .row
       by the homepage JS) so the image spans the full 1140 column with no gutter. */
  /* inter-tile gap: prod ~5px between images (2-up/3-up/4-up/showroom). The tile
       images carry `wh1-row-tiles` (copied up to the .row) → tight gutter. */
  /* #70322 — mobile alignment: the width above only pays for the gutter while the max-width is
       what sizes the row. Once the viewport is narrower than it (1140 + 6 = 1146) the row is the
       viewport instead, the extra width buys nothing, and the shell's `padding-inline: 15px`
       (pages/cms-home.less) leaves the column's own half-gutter uncancelled: a stacked tile
       rendered 18…372 at 390 where the banderole, the copy and the buttons around it render
       15…375. Below that point take the half gutter off the row's padding instead — the same
       pairing, expressed the way this branch positions the row. `wh1-row-show` carries
       `wh1-row-tiles` too, so the showroom 3-up is covered by the same rule. */
  /* mobile parity with prod (.slom-cat-row .dd-image-caption @≤768: 18px / 16px pad).
       Desktop is the primary target; this only keeps small screens from over-sizing the 20px caption. */
  /* mobile layout parity with prod: keep the showroom gallery 3-up (small) instead of
       stacking it 1-up (classes copied up to the .row by the homepage JS). */
}
.cms-home .dd-image-box {
  margin: 0 !important;
}
.cms-home .dd-image-box .card {
  border: 0;
  background: transparent;
  border-radius: 0;
  overflow: hidden;
}
.cms-home .dd-image-box img {
  display: block;
  width: 100%;
  height: auto;
  border-radius: 0;
}
.cms-home .dd-image-box.wh1-rounded {
  border-radius: 5px;
  overflow: hidden;
}
.cms-home .dd-image-box.wh1-rounded .card {
  border-radius: 5px;
}
.cms-home .dd-image-box.wh1-hover-zoom img {
  transition: transform 0.4s cubic-bezier(0.46, 0.03, 0.52, 0.96);
}
.cms-home .dd-image-box.wh1-hover-zoom:hover img {
  transform: scale(1.1);
}
.cms-home .dd-image-box {
  /* 4-up brand tiles map to prod .slom-cat-quarter → 18px caption */
}
.cms-home .dd-image-box .card-img-overlay {
  inset: auto 0 0 0;
  height: 50%;
  display: flex;
  align-items: flex-end;
  padding: 24px !important;
  background: linear-gradient(0deg, rgba(0, 0, 0, 0.4) 0%, rgba(0, 0, 0, 0) 100%) !important;
  border-radius: 0;
}
.cms-home .dd-image-box .card-img-overlay-content {
  width: 100%;
}
.cms-home .dd-image-box .dd-image-caption,
.cms-home .dd-image-box .card-title {
  color: #fff;
  font-family: 'Muli', sans-serif;
  font-weight: 700;
  font-style: normal;
  text-transform: uppercase;
  letter-spacing: 0;
  margin: 0;
  font-size: 20px;
  /* prod: .slom-cat-full/half/third caption = fixed 20px (NOT a clamp — that undershot to ~17px) */
  text-shadow: none;
}
.cms-home .dd-image-box.col-md-3 .dd-image-caption,
.cms-home .dd-image-box.col-md-3 .card-title {
  font-size: 18px;
}
.cms-home > div > .row.wh1-row-banderole {
  max-width: 1140px;
  margin-inline: auto;
  padding-inline: 0;
  --bs-gutter-x: 0;
}
@media (max-width: 1199px) {
  .cms-home > div > .row.wh1-row-banderole {
    padding-inline: 15px;
  }
}
.cms-home .dd-image-box.dd-fullwidth img {
  border-radius: 0;
}
.cms-home .dd-image-box.dd-fullwidth .card {
  border-radius: 0;
}
.cms-home > div > .row.wh1-row-tiles {
  --bs-gutter-x: 0.375rem;
  /* The home page shell replaces Bootstrap's negative row margins with `margin-inline: auto`
           (pages/cms-home.less), and those negative margins are what normally pulls the outer
           columns back out to the container edge. Without them a gutter insets the row's first and
           last column by half of it, so these tiles rendered 153…1287 where every banderole beside
           them renders 150…1290. Give the row the gutter back as width. */
  max-width: calc(1140px + var(--bs-gutter-x));
}
@media (max-width: 1145.98px) {
  .cms-home > div > .row.wh1-row-tiles {
    padding-inline: calc(15px - var(--bs-gutter-x) * 0.5);
  }
}
@media (max-width: 768px) {
  .cms-home .dd-image-box .card-img-overlay {
    padding: 16px !important;
  }
  .cms-home .dd-image-box .dd-image-caption,
  .cms-home .dd-image-box .card-title {
    font-size: 18px;
  }
}
@media (max-width: 767px) {
  .cms-home {
    /* Prod stacks the mobile category tiles/banderoles as one tight stack (~8px between
           every consecutive tile — kite/wing/sup measured 7–8px on prod). Our 2-up/3-up rows
           otherwise TOUCH (row-gap 0) while adjacent rows keep the 28px section gap — even both
           out to a consistent 8px so the streetwear / rollschuhe / sale-banderole rhythm reads
           like prod. Headings, mint bands and the newsletter keep the larger section gap
           because they are not tiles/banderoles, so they aren't matched by these selectors. */
  }
  .cms-home > div > .row.wh1-row-show {
    --bs-gutter-x: 0.375rem;
  }
  .cms-home > div > .row.wh1-row-show > [class*="col-"] {
    flex: 0 0 33.333%;
    max-width: 33.333%;
  }
  .cms-home > div > .row.wh1-row-tiles {
    row-gap: 8px;
  }
  .cms-home > div > .row.wh1-row-tiles + .row.wh1-row-tiles,
  .cms-home > div > .row.wh1-row-tiles + .row.wh1-row-banderole,
  .cms-home > div > .row.wh1-row-banderole + .row.wh1-row-tiles,
  .cms-home > div > .row.wh1-row-banderole + .row.wh1-row-banderole {
    margin-top: 8px;
  }
}
/* Homepage — "Top Marken" brand-logo grid. Match warehouse-one.de.
   Owned independently. Selectors scoped under .cms-home.
   The 18 logos render as `image` widgets at col-md-2 (6-up desktop, 3-up mobile).

   Verified live against prod (.slom-brand-section .dd-image-box img, saltylemon.css):
   - logos are solid BLACK, full opacity, NO grayscale filter;
   - each logo renders 85x85 (prod: max-width:85px on a square 200x200 source);
   - HOVER zooms the logo to scale(1.2) over .3s ease (prod DOES zoom — the
     task's "no zoom" was incorrect; confirmed by computed transform matrix(1.2)
     and a visual before/after on the live site). Box overflow stays visible so
     the enlarged logo is not clipped.
   - 6-up desktop with ~190px column pitch (prod grid row has 0 side padding).
   Mobile parity note (<=768px): prod caps the logo at max-width:64px. */
.cms-home {
  /* The 18 logo widgets carry `wh1-row-logos` (copied up to the .row by the homepage
       JS in start.html.twig), so the grid is targeted directly — no :has(). */
}
.cms-home > div > .row.wh1-row-logos {
  justify-content: center;
  align-items: center;
  row-gap: 1.875rem;
  /* 30px -> ~115px row pitch, matches prod (box 85 + gap ~30) */
  padding-block: 0.75rem;
  padding-inline: 0;
  /* prod grid row has no side padding -> columns spread to ~190px pitch like prod */
  /* Mobile: prod caps the logo at 64px (<=768px) */
}
.cms-home > div > .row.wh1-row-logos .dd-image-box {
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: visible;
  /* let the hover zoom overflow the cell (prod: overflow visible) */
  margin-block: 0;
  /* neutralise widget my-4 so row-gap alone controls vertical rhythm */
  /* #70378 — the widget puts a `.card` between the cell and the image, and Bootstrap
               gives a card `overflow: hidden`. The cell above was already opened up, but the card
               was not, so a logo scaled to 1.2 (85px -> 102px) lost 9px off the top and the bottom
               inside it: enough to cut the wordmark under logos such as VANS and STÖCKLI. The card
               here carries no background, border or radius of its own, so there is nothing for it
               to clip to. */
  /* Prod fires the zoom on img:hover; our cell has a .stretched-link
               overlay on top of the img, so img:hover never triggers — zoom on
               cell hover instead (same visible effect: logo grows to 1.2x). */
  /* prod hover zoom */
}
.cms-home > div > .row.wh1-row-logos .dd-image-box > .card {
  overflow: visible;
}
.cms-home > div > .row.wh1-row-logos .dd-image-box img {
  width: auto;
  height: auto;
  max-width: 85px;
  /* prod: 85px (square source -> 85x85) */
  max-height: 85px;
  margin: 0 auto;
  border-radius: 0;
  filter: none;
  opacity: 1;
  transform: scale(1);
  transition: all 0.3s ease;
  /* prod: transition all .3s ease */
}
.cms-home > div > .row.wh1-row-logos .dd-image-box:hover img {
  transform: scale(1.2);
}
@media (max-width: 768px) {
  .cms-home > div > .row.wh1-row-logos .dd-image-box img {
    max-width: 64px;
    max-height: 64px;
  }
}
/* Homepage — section headings, text CTAs, the mint product/magazine bands and
   the support block. Match warehouse-one.de. Owned independently.
   Values read from prod's computed styles (2026-07-15):
   - section headings (h2): Muli 24px/700, teal (#0f555c), LEFT-aligned, margin 20/0/10
   - "Magazin" sub-heading (h3): Muli 20px/400, teal, LEFT-aligned
   - descriptive paragraphs: teal (#0f555c), LEFT-aligned, ~14–18px/400 (prod varies)
   - newsletter "10€/€10" teaser: CENTERED (heading + copy + button)
   - CTA buttons (prod .slom-btn-round): SOLID teal bg, white text, radius 50px,
     padding 16px 56px, 14px/400, NO border, NO hover change.
     NOTE: a high-specificity theme rule `#wrapper a { color: primary }` (spec 101)
     forces teal text on every anchor; the button text colour therefore needs
     `!important` to stay white (otherwise teal-on-teal = invisible "empty pill").
   - mint band behind product row + magazine: #e2eff0, full-bleed
   (FF/blog widget INTERNALS live in their widget templates.) */
.cms-home {
  /* ---- section headings (prod: left teal Muli, h2 24/700, h3 20/400) ---- */
  /* #70709 — `wh1-copy-small` (CSS-Klasse of the showroom text widget): prod sets this copy in
       the theme's 14/20 body size, not the 18px of the section intros, and leaves 34px above the
       showroom button (the copy block's slom-mb-34). The two paragraph margins collapse, so the
       button paragraph carries the whole 34, and 44 below it for prod's 88px to the Magazin title. */
  /* `wh1-copy` — put this in a text widget's Layout Settings → CSS-Klasse. It pulls
       the copy out to the content-column edge so headings/paragraphs line up with the
       images (the column gutter otherwise insets them ~12px), and kills the theme's
       inherited italic on the headings. Prod: text left edge = image left edge, upright. */
  /* The negative margin this used to carry could not widen the box: `.col-12` is
       `flex: 0 0 auto; width: 100%`, a fixed width, so the margin only shifted it left — the left
       edge landed on 150 by luck while the right edge stayed 24px short at 1266. Dropping the
       column's own padding instead widens it properly to 150…1290, the edge the banderoles and
       product rows already use. */
  /* newsletter block stays centered (prod's "10€/€10" teaser is centered) */
  /* ---- section CTA buttons — match prod .slom-btn-round ------------------
       solid teal pill, white text, radius 50px, 16/56 padding, 14px/400, no border.
       color:#fff !important is REQUIRED to beat `#wrapper a` (teal, spec 101). */
  /* ---- mint bands (prod #e2eff0) --------------------------------------------
       `wh1-row-band` (+ -top / -bot on the first / last row) is set on the
       heading / text / FF / blog widget's CSS-Klasse and copied up to its .row by
       the homepage JS (start.html.twig). So the band is full-bleed with 1140-centred
       content, is continuous across the tagged rows (margin-top:0 between them), and
       ONLY the tagged rows get it — no :has(), no bleed onto the newsletter. -------- */
  /* prod's band has no element padding — the space above the heading is the heading's
       own margin, the space below the products is the record-list margin. Keep the band
       padding minimal so it isn't doubled up (the note: too much space top/bottom).

       #70379: the two edges have to read the same. Leaving the top gap to the heading's
       own margin made it whatever that heading happened to carry, and the bottom gap to
       whatever the last widget ended with: 28px above the heading against 8px below the
       products, which is what the note is about. The band owns both edges now, so the
       gap is one value on both sides, and the first heading's own top margin is dropped
       rather than added to it. 2rem is production's lower gap (34px measured on
       warehouse-one.de), which sits between the two values the page had. */
  /* #70322 — mobile alignment: the product grid inside the mint band.
       The widget's own inline style block gives each card column `padding: 0 5px 0 0`, i.e. the whole
       inter-card gutter on the right and nothing on the left. The first card of a row is then flush
       with the container while the last one stops half a gutter short: measured at 390 the two-up
       row painted 15…190 and 195…370 inside a 15…375 column, so the block read as pushed left.
       Split the gutter over both sides and give the list the matching negative margin, which is the
       pair Bootstrap uses everywhere else here — the 5px between two cards is unchanged, only the
       outer edges move back onto the column. `width: auto` for the same reason as the magazine
       band: the list is `width: 100%`, and a definite width turns a negative margin into a shift
       instead of the widening it is meant to be. */
  /* ---- support block --------------------------------------------------- */
  /* ==== mobile parity (≤767) — match warehouse-one.de spacing/height/width ==========
       Scoped under .cms-home (this file), so these out-specify the widgets' own inline
       \3c style> even though those load later in the body. */
}
.cms-home .dd-shortcode-text h2 {
  text-align: left !important;
  /* beat the builder's .text-center */
  font-family: 'Muli', sans-serif;
  font-weight: 700;
  text-transform: none;
  font-size: 1.5rem;
  /* prod: 24px */
  line-height: 1.1;
  color: var(--wh1-color-primary);
  margin: 20px 0 10px;
}
.cms-home .dd-shortcode-text h3 {
  text-align: left !important;
  font-family: 'Muli', sans-serif;
  font-weight: 400;
  /* prod "Magazin": normal weight */
  text-transform: none;
  font-size: 1.25rem;
  /* prod: 20px */
  line-height: 1.1;
  color: var(--wh1-color-primary);
  margin: 20px 0 10px;
}
.cms-home .dd-shortcode-text p {
  text-align: left;
  /* prod descriptive copy is left-aligned */
  color: var(--wh1-color-primary);
  /* prod body copy is teal, not muted */
  font-size: 1.125rem;
  /* prod's prominent descriptive paras = 18px */
  line-height: 1.4286;
  /* #70709: prod 18/25.7 */
  margin: 0 0 10px;
  /* #70709: prod */
}
.cms-home .wh1-copy-small p {
  font-size: 14px;
  line-height: 20px;
}
.cms-home .wh1-copy-small p.text-center {
  margin: 34px 0 44px;
}
.cms-home .dd-shortcode-text.wh1-copy {
  margin-inline: 0;
  padding-inline: 0;
}
.cms-home .wh1-copy h1,
.cms-home .wh1-copy h2,
.cms-home .wh1-copy h3,
.cms-home .wh1-copy h4,
.cms-home .wh1-copy p {
  font-style: normal;
}
.cms-home .wh1-newsletter-cta {
  text-align: center;
}
.cms-home .wh1-newsletter-cta h2 {
  text-align: center !important;
}
.cms-home .wh1-newsletter-cta p {
  text-align: center;
  margin-inline: auto;
  max-width: 760px;
}
.cms-home .dd-shortcode-text .btn {
  display: inline-block;
  border: 0;
  border-radius: 50px;
  padding: 16px 56px;
  min-height: 0;
  /* neutralise theme's 56px so height = prod 52px */
  font-family: 'Muli', sans-serif;
  font-weight: 400;
  font-size: 14px;
  line-height: 1.4;
  text-decoration: none;
  background: var(--wh1-color-primary);
  color: #fff !important;
  transition: background 0.2s ease;
}
.cms-home .dd-shortcode-text .btn:hover,
.cms-home .dd-shortcode-text .btn:focus {
  background: var(--wh1-color-primary);
  /* prod: no hover change */
  color: #fff !important;
}
.cms-home > div > .row.wh1-row-band {
  max-width: none;
  margin-top: 0;
  padding-inline: 15px;
  background: #e2eff0;
  --bs-gutter-x: 0;
}
.cms-home > div > .row.wh1-row-band > * {
  max-width: 1140px;
  margin-inline: auto;
}
.cms-home > div > .row.wh1-row-band-top {
  margin-top: 1.5rem;
  padding-top: 2rem;
}
.cms-home > div > .row.wh1-row-band-top > * > *:first-child,
.cms-home > div > .row.wh1-row-band-top h1,
.cms-home > div > .row.wh1-row-band-top h2,
.cms-home > div > .row.wh1-row-band-top h3,
.cms-home > div > .row.wh1-row-band-top h4 {
  margin-top: 0;
}
.cms-home > div > .row.wh1-row-band-bot {
  padding-bottom: 2rem;
}
.cms-home .dd-shortcode-wmdkfflandingpage .ff-record-list {
  width: auto;
  margin-right: -2.5px;
  margin-left: -2.5px;
}
.cms-home .dd-shortcode-wmdkfflandingpage .ff-record-list-item {
  padding-right: 2.5px;
  padding-left: 2.5px;
}
.cms-home .dd-shortcode-text a[href^="mailto:"],
.cms-home .dd-shortcode-text a[href^="tel:"] {
  color: var(--wh1-color-primary);
  text-decoration: none;
  font-weight: 600;
}
@media (max-width: 767px) {
  .cms-home {
    /* section CTA buttons are full-width on mobile (prod, e.g. the Showroom button) */
    /* Magazin blog cards: match prod's mobile card (240px tall, object-fit cover clips the
           273px image), a single tight ~10px gap (prod's cards nearly touch — this reads cleaner
           than prod's 0 while still addressing "too much gap"), and flush-LEFT with the "Magazin"
           heading (drop the nested grid gutter that insets the tiles ~12px). */
    /* NB: no `padding-inline: 0` here — the posts column's padding is the other half of its
           row's negative margin, and dropping it put the first card 5px off-screen. */
    /* FF product rows: prod shows a clean 2×2 on mobile — hide the odd 5th card so the
           two rows are balanced (cards already stretch to equal height). */
  }
  .cms-home .dd-shortcode-text .btn {
    display: block;
    width: 100%;
    padding-inline: 24px;
  }
  .cms-home .dd-shortcode-wmdkblogfeed .wmdk-blog-feed-post img {
    height: 240px;
  }
  .cms-home .dd-shortcode-wmdkblogfeed .wmdk-blog-feed-post {
    margin-bottom: 0;
  }
  .cms-home .dd-shortcode-wmdkblogfeed .wmdk-blog-feed-posts > .row {
    row-gap: 10px;
  }
  .cms-home .wmdk-ff-fallback .ff-record-list-item:nth-child(n+5) {
    display: none;
  }
}
/* =========================================================================
   CMS content pages (#69986 "Styling of cms pages", #70042 "too much
   whitespace on the shipping page").

   Everything below is scoped to `article.cmsContent` — the wrapper the CMS
   page template emits (`apex/tpl/page/info/content.html.twig:11`). Nothing
   here may apply to category / manufacturer long descriptions, the checkout
   or a widget, even though some of them reuse the same class names.

   The records these pages render were authored for the OXID 6 Flow theme and
   still carry its legacy markup: `.cms-background` grey panels,
   `ul.wmdk_portoliste` price tiles, `<dl>/<dt>/<dd>` pairs, `<blockquote>`
   and a stray `<font>`. warehouse-one.de styles them in `default.min.css`;
   APEX has no rules for any of it, so on OXID 7 the panels lost their grey
   background and the shipping-cost table collapsed into a 31-row list.

   Reference values were read out of `69958-work/reference/prod-default.min.css`:

     .dd-ve-container.wmdk-visual-cms .cms-background
         { background-color:#ebebeb; padding:10px 12px 1px 10px; margin-bottom:12px }
     .dd-ve-container.wmdk-visual-cms .cms-background h2 { margin-top:0 }
     .dd-ve-container.wmdk-visual-cms ul.wmdk_portoliste li
         { background-color:#ebebeb; margin:2px; padding:5px;
           width:224px; height:55px; display:inline; float:left }
     blockquote  { padding:10px 20px; margin:0 0 20px;
                   font-size:17.5px; border-left:5px solid #eee }   (Bootstrap 3 base)
     dl { margin-top:0; margin-bottom:20px }  dt { font-weight:bold }  dd { margin-left:0 }

   prod scopes on `.dd-ve-container`, a Bootstrap-3-only wrapper that the
   OXID 7 VisualCMS renderer no longer emits, so the scope is `.cmsContent`
   here instead.
   ========================================================================= */
/* rgba(235,235,235,1) === prod #ebebeb */
/* prod `margin: 2px` on every tile   */
/* -------------------------------------------------------------------------
   Space above the heading — #70375.

   A CMS page opens straight with its content: the template gives the article
   `pb-5` and nothing at the top, and these records carry their own `<h1>`
   rather than the template's, so the heading sits hard against the navigation
   bar and its ascenders were clipped by it on the accessibility page.
   Production opens that gap with a breadcrumb row above the heading, which
   these pages do not have on OXID 7, so the page itself has to own the space.

   The rule sits on `main` rather than on `article.cmsContent`, because the
   VisualCMS renderer puts its own `.dd-ve-content` wrapper between the two and
   the authored heading lives in that wrapper, outside the article. 3rem
   mirrors the `pb-5` at the foot of the article and the `py-5` the newsletter
   page took for the same reason under #70273.
   ------------------------------------------------------------------------- */
body.cl-content main.content {
  padding-top: 3rem;
}
/* -------------------------------------------------------------------------
   The content column on a full-width CMS record — #70389.

   A record with `ddfullwidth` set gets no `.container` from the VisualCMS page
   template, so on OXID 7 its grid is a bare `<div>` sitting directly in
   `main`, and the page ran edge to edge: the Lagerverkauf heading started at
   x=0 against production's centred column.

   Production is not container-less there, it is capped by the wrapper class
   the OXID 6 renderer emits and OXID 7 does not:

       .dd-ve-container { max-width: 1180px; margin: auto; padding: 0 20px }
       (69958-work/reference/prod-default.min.css)

   so those numbers are taken as they stand. The direct-child combinator is
   what selects the full-width case and only it: a normal record renders as
   `.dd-ve-content > .container > article.cmsContent` and keeps the wider
   column it was signed off with under #70042 and #70375.

   The `.dd-fullwidth` breakout below still spans the viewport — its margins
   are `calc(50% - 50vw)`, measured against the row inside this column, so
   capping the column moves the negative margin by exactly as much.
   ------------------------------------------------------------------------- */
.dd-ve-content > article.cmsContent {
  max-width: 1180px;
  margin-inline: auto;
  padding-inline: 20px;
}
/* -------------------------------------------------------------------------
   Author-written CTAs inside a CMS text cell — #70388.

   `.btn-primary` is the shop's own call to action: 44px minimum, 16px/700 on
   40px of horizontal padding. That is right for "In den Warenkorb" and for the
   contact form, and wrong for a link an editor typed into a paragraph. The
   showroom band's "Ja, für den Showroom Newsletter anmelden" came out 425x52
   against production's 318x34 and dominated the band it sits in.

   Production renders these at Bootstrap 3's default button metrics:

       .btn { padding: 6px 12px; font-size: 14px; font-weight: 400;
              line-height: 1.42857143 }

   so those are the numbers used. The pill radius is deliberately kept: the
   ticket is about size, and the rounded shape is this theme's own language,
   applied everywhere else on the page.

   `p > .btn` is what separates an authored CTA from a real one. Every button
   an editor writes sits in a paragraph of a `.dd-shortcode-text` cell, while
   the theme's own buttons are emitted by their form markup, so the contact
   page's submit keeps the full size it was signed off with under #69986.
   ------------------------------------------------------------------------- */
.cmsContent p > .btn {
  min-height: 0;
  padding: 6px 12px;
  font-size: 14px;
  font-weight: 400;
  line-height: 1.42857143;
}
/* -------------------------------------------------------------------------
   And the heading itself is centred — the other half of #70389.

   Capping the column put the heading back on production's geometry, which is
   left-aligned inside it, and that is not what the ticket asks for: the
   reference image attached to it shows the headline centred over the content,
   its centre within 14px of the navigation's. So the column carries the block
   and this carries the line.

   Confined to the same full-width records as the cap above, which are the
   landing-style pages (Lagerverkauf, its Gewinnspiel, The One). An ordinary CMS
   page keeps the left-aligned heading it was signed off with under #70375, and
   nothing here touches body copy — only the record's own top-level headings,
   so a heading an editor set inside a column or a card is left alone.
   ------------------------------------------------------------------------- */
.dd-ve-content > article.cmsContent > div > .row > [class*="dd-shortcode-text"] > h1,
.dd-ve-content > article.cmsContent > div > .row > [class*="dd-shortcode-text"] > h2 {
  text-align: center;
}
.cmsContent {
  /* ---------------------------------------------------------------------
       Table borders.
       The migrated records use Bootstrap 3's `.table.table-bordered` (opening
       hours, price lists). Bootstrap 5 draws those borders from
       `--bs-border-width`, which this theme sets to 0 — so every rule vanished
       and the opening-hours table read as a loose two-column list. Prod draws
       1px #ddd on the table and on every cell.
       --------------------------------------------------------------------- */
  /* ---------------------------------------------------------------------
       Text rhythm — #70042.
       APEX gives every `<p>` a 1rem (16px) bottom margin. The records are
       full of hand-made `<p>&nbsp;</p>` spacers written against prod's 10px
       margin, so each of them cost 16px + a 24px line box instead of
       10px + 20px. Restore prod's paragraph rhythm and drop the truly empty
       paragraphs the editor left behind, which contribute nothing but margin.
       --------------------------------------------------------------------- */
  /* ---------------------------------------------------------------------
       Grey content panels (`.cms-background`).
       The 1px bottom padding is prod's and is load-bearing: it stops the last
       paragraph's bottom margin from collapsing out through the panel.
       --------------------------------------------------------------------- */
  /* ---------------------------------------------------------------------
       A band that a "show more" button opens — #70370.
       On the showroom page the button sits at the foot of one CMS band and the
       form it reveals is the first thing in the next one, so the moment it
       opened the form's panel started against the button with no gap at all.
       The accordion panels further up use `.collapse` too, but theirs live
       inside a `.panel`; only a collapse that is a band's own child is one of
       these reveals.
       --------------------------------------------------------------------- */
  /* ---------------------------------------------------------------------
       Definition lists.
       APEX inherits Bootstrap 5, whose `dd` keeps `margin-left: 0` but adds a
       0.5rem bottom margin; prod has none. Bold `dt` is the browser default on
       both, so only the spacing needs restoring.
       --------------------------------------------------------------------- */
  /* ---------------------------------------------------------------------
       Bootstrap 3 accordion panels (`.panel-group > .panel > .panel-heading`).
       Several migrated pages — /store-duesseldorf/ is the obvious one — colour
       the heading bar via the record's own custom CSS
       (`.panel-default > .panel-heading { color:#fff; background:#0F555C }`) and
       rely on Bootstrap 3's `.panel-title > a { color: inherit }` to carry that
       white down to the link that holds the label. APEX is Bootstrap 5 and ships
       no such rule, so the link fell back to the theme's `#wrapper a` primary
       colour — teal text on a teal bar, i.e. seven invisible labels.

       Measured on /store-duesseldorf/: `.panel-title` computed
       `color: rgb(15,85,92)` on a `rgb(15,85,92)` bar, against white on
       production. The heading element is an `<h4>`, and APEX colours every
       `h1`–`h6` with the brand primary, which beats the white inherited from
       the bar — so Bootstrap 3's `.panel-title { color: inherit }` is the rule
       that matters, not only the one on the link.

       NOTE this only makes the labels legible again. The panels still do not
       expand, because the markup carries Bootstrap 3's `data-toggle="collapse"`
       / `data-parent` instead of Bootstrap 5's `data-bs-*` — a separate defect,
       see the changelog.
       --------------------------------------------------------------------- */
  /* ---------------------------------------------------------------------
       Full-bleed CMS bands (`.dd-background.dd-fullwidth`).

       Visual CMS breaks these out of the content column from JavaScript, not
       CSS: `fullwidth.js` measures `gap = (body.clientWidth - cmsContent
       .clientWidth) / 2` and writes `margin: 0 -{gap}px` inline (plus a
       matching padding, so the *inner* content stays aligned with the column).
       That runs correctly here — the elements do carry `margin: 0 -155px`.

       What defeats it is the grid: under OXID 7 these divs are additionally
       rendered as Bootstrap 5 columns (`col-sm-12`), and `.col-*` sets
       `flex: 0 0 auto; width: 100%`. An explicit width pins the box to the
       row regardless of the negative margins, so the band stopped at the
       column edge (1140px) instead of spanning the viewport (1440px on prod).
       The OXID 6 markup has no column classes on these divs at all.

       Doing the breakout in CSS instead, and winning over the inline styles,
       fixes a second and much more visible problem: `fullwidth.js` binds to
       `window.load`, which waits for every image on the page. On dev1 that is
       ~28s, so the bands sat at column width for the whole load and then
       snapped to full width — a huge late layout shift. Geometry that CSS can
       express should not wait on an image-gated event.

       `50%` in these `calc()`s resolves against the containing block (the row,
       1140px), so the margins come out at -150px and the padding at 150px:
       the band spans the viewport exactly and its content keeps the column's
       edge. That is production's geometry to the pixel, and it is also 5px
       tighter each side than the value fullwidth.js computes, because the JS
       measures the content column and is blind to Bootstrap 5's -5px row
       gutter.

       `100vw` is safe here specifically because `html` and `body` are both
       `overflow-x: clip` in this theme — otherwise it would overhang by the
       scrollbar width. Verified before relying on it.

       No other CMS page has a `.dd-fullwidth` inside `.cmsContent`, so this
       is confined to the showroom pages in practice.
       --------------------------------------------------------------------- */
  /* The padding keeps a band's *text* on the column edge while its background
       bleeds. Media fills the band edge to edge instead, so it gets none — the
       same exception fullwidth.js makes, and what production does for the
       slider. (`.dd-hero-box` is the JS's fourth exception; this page has none,
       and CSS cannot test for a descendant without `:has()`.) */
  /* ---------------------------------------------------------------------
       Vertical rhythm of a tinted band (`.slom-mt-*` / `.slom-mb-*`).

       These record classes carry 34px/50px of spacing and are meant to sit
       *inside* the colour. On production they do, because OXID 6 renders the
       text widget as its own `.dd-shortcode-text` wrapper nested in the
       background div, and the margins belong to that inner wrapper.

       OXID 7 merges the widget's classes onto the background div itself — the
       very element `fullwidth.js` rewrites. The JS assigns `element.style.margin`
       as a **shorthand**, so `margin: 0 -155px` silently resets margin-top and
       margin-bottom to 0 inline, beating any stylesheet. The spacing therefore
       vanished: the newsletter band closed to 10px under its button where
       production leaves 34px.

       On the band the spacing has to be padding anyway — a margin would fall
       outside the colour, which is not what the record asks for. `!important`
       is required for the same reason as above: it overrides an inline
       shorthand (`padding: 0 155px`), which likewise zeroes both vertical sides.

       The trailing paragraph's own bottom margin is dropped so the gap is
       exactly the class's value. Production reaches the same number by margin
       collapsing, which padding disables. It has to be `p:last-of-type` rather
       than `:last-child`: the real last child is the accordion's `.collapse`
       div, which is zero-height while closed, so the paragraph's margin would
       otherwise still stack on top of the padding (44px against prod's 34px).
       --------------------------------------------------------------------- */
  /* ---------------------------------------------------------------------
       Blockquote — used as the sub-headline under the page `<h1>`.
       APEX strips the rule entirely (no border, no indent, body font size).
       --------------------------------------------------------------------- */
  /* ---------------------------------------------------------------------
       Shipping-cost tiles (`ul.wmdk_portoliste`) — the "table styling" of
       #69986. One `<li>` per country, each holding `<dl><dt>Land</dt>
       <dd><p>Preis</p></dd></dl>`; four of them (DE/NL/AT and the nested
       variants) additionally float a 41% / 59% split inside the tile.

       Deliberate deviation from prod: prod lays the tiles out with
       `float: left` on a fixed `width: 224px`, which (a) collapses the `<ul>`
       to height 0 because nothing clears the floats — measured live on
       warehouse-one.de, `ul.wmdk_portoliste` reports 0px tall — and (b) needs
       the container to be exactly 1140px to produce five per row. APEX's
       content column is 1130px, so copying `224px` verbatim would drop the
       fifth tile off every row. A wrapping flex row reproduces prod's visual
       result (five equal grey tiles per row, 2px gutters, ~224px each at
       desktop) without either problem, and reflows properly on small screens.
       --------------------------------------------------------------------- */
}
.cmsContent .table-bordered,
.cmsContent .table-bordered > :not(caption) > *,
.cmsContent .table-bordered > :not(caption) > * > * {
  border-width: 1px;
  border-color: #ddd;
}
.cmsContent p {
  margin-bottom: 10px;
}
.cmsContent p:empty {
  display: none;
}
.cmsContent .cms-background {
  background-color: var(--wh1-color-disabled);
  padding: 10px 12px 1px 10px;
  margin-bottom: 12px;
}
.cmsContent .cms-background > h2:first-child,
.cmsContent .cms-background h2 {
  margin-top: 0;
  margin-bottom: 10px;
}
.cmsContent .dd-background > .collapse.show {
  padding-top: 1.5rem;
}
.cmsContent dl {
  margin-top: 0;
  margin-bottom: 20px;
}
.cmsContent dd {
  margin-left: 0;
  margin-bottom: 0;
}
.cmsContent .dd-fullwidth {
  width: 100vw !important;
  max-width: 100vw !important;
  margin-right: calc(50% - 50vw) !important;
  margin-left: calc(50% - 50vw) !important;
  padding-right: calc(50vw - 50%) !important;
  padding-left: calc(50vw - 50%) !important;
}
.cmsContent .dd-shortcode-carousel.dd-fullwidth,
.cmsContent .dd-image-box.dd-fullwidth,
.cmsContent .dd-image-gallery.dd-fullwidth {
  padding-right: 0 !important;
  padding-left: 0 !important;
}
.cmsContent .dd-background.slom-mt-34 {
  padding-top: 34px !important;
}
.cmsContent .dd-background.slom-mb-34 {
  padding-bottom: 34px !important;
}
.cmsContent .dd-background.slom-mt-50 {
  padding-top: 50px !important;
}
.cmsContent .dd-background[class*="slom-mb-"] > p:last-of-type {
  margin-bottom: 0;
}
.cmsContent .panel-group {
  margin-bottom: 20px;
}
.cmsContent .panel {
  margin-bottom: 20px;
  background-color: var(--wh1-color-white);
  border: 1px solid transparent;
  border-radius: 0;
  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
}
.cmsContent .panel-default {
  border-color: #ddd;
}
.cmsContent .panel-group .panel {
  margin-bottom: 0;
  border-radius: 0;
}
.cmsContent .panel-group .panel + .panel {
  margin-top: 5px;
}
.cmsContent .panel-heading {
  padding: 10px 15px;
  border-bottom: 1px solid transparent;
}
.cmsContent .panel-group .panel-heading {
  border-bottom: 0;
}
.cmsContent .panel-group .panel-heading + .panel-collapse > .panel-body {
  border-top: 1px solid #ddd;
}
.cmsContent .panel-body {
  padding: 15px;
}
.cmsContent .panel-title {
  margin-top: 0;
  margin-bottom: 0;
  font-size: 16px;
  /* Bootstrap 3 default; prod computes 16px here */
  color: inherit;
  /* upright/400 comes from the CMS heading reset below — the label is an `<h4>` */
}
.cmsContent .panel-title > small,
.cmsContent .panel-title > .small {
  color: inherit;
}
.cmsContent blockquote {
  padding: 10px 20px;
  margin: 0 0 20px;
  font-size: 17.5px;
  border-left: 5px solid var(--wh1-color-border);
}
.cmsContent ul.wmdk_portoliste {
  display: flex;
  flex-wrap: wrap;
  /* the record carries an inline `margin: 0 0 10px 0` on the <ul>; pull the
           tile gutters back out so the row still starts flush with the column. */
  margin-left: -2px;
  margin-right: -2px;
  padding: 0;
  list-style: none;
}
.cmsContent ul.wmdk_portoliste > li {
  flex: 0 0 calc(20% - (2px * 2));
  max-width: calc(20% - (2px * 2));
  min-height: 55px;
  margin: 2px;
  padding: 5px;
  background-color: var(--wh1-color-disabled);
  /* the DE/NL/AT tiles float their two halves — contain them so the
               tile keeps its height instead of collapsing. */
  overflow: hidden;
  /* prod renders these tiles at the OXID 6 base size (14px/20px).
               Kept, not raised to the theme's 16px: at 16px "aktuell kein
               Versand möglich" and "Versandkostenfrei ab 100,00 EUR" wrap and
               the rows go ragged. */
  font-size: 14px;
  line-height: 20px;
  /* the DE/NL/AT tiles nest a second <dl> and float a <p> beside it;
               zero every inherited margin so the tile keeps prod's two-line height. */
}
.cmsContent ul.wmdk_portoliste > li dl,
.cmsContent ul.wmdk_portoliste > li dd,
.cmsContent ul.wmdk_portoliste > li p {
  margin: 0;
}
.cmsContent ul.wmdk_portoliste > li dt {
  font-weight: 700;
}
@media (max-width: 1199.98px) {
  .cmsContent ul.wmdk_portoliste > li {
    flex-basis: calc(25% - (2px * 2));
    max-width: calc(25% - (2px * 2));
  }
}
@media (max-width: 991.98px) {
  .cmsContent ul.wmdk_portoliste > li {
    flex-basis: calc(33.3333% - (2px * 2));
    max-width: calc(33.3333% - (2px * 2));
  }
}
@media (max-width: 767.98px) {
  .cmsContent ul.wmdk_portoliste > li {
    flex-basis: calc(50% - (2px * 2));
    max-width: calc(50% - (2px * 2));
  }
}
@media (max-width: 575.98px) {
  .cmsContent ul.wmdk_portoliste > li {
    flex-basis: calc(100% - (2px * 2));
    max-width: calc(100% - (2px * 2));
  }
}
/* The label itself is an `<a>`, and the theme paints every link inside the page
   shell with `#wrapper a { color: var(--wh1-color-primary) }` — an ID selector,
   so `.cmsContent .panel-title > a` (0,2,1) loses to it (1,0,1). Prefix with
   `#wrapper` to win the cascade, the same trick `wh1-overrides.less` already
   uses for the USP strip. Kept outside the `.cmsContent` block above because
   the prefix has to come first in the selector. */
#wrapper .cmsContent .panel-title > a,
.cmsContent .panel-title > a {
  color: inherit;
  text-decoration: none;
}
/* #70224 — an image-only link in a migrated CMS record carries no underline.

   The payment row on /zahlung-und-lieferung/ is ten `<a>` elements that wrap
   nothing but an icon, and the whitespace the WYSIWYG left around each `<img>`
   is still a text node: apex's link underline paints under it, so every icon
   trails a stray dash production does not have. Production draws these anchors
   bare, so the underline is removed only where the link has no text of its
   own — a link with a label keeps it. */
#wrapper .cmsContent a:has(> img):not(:has( > :not(img))),
.cmsContent a:has(> img):not(:has( > :not(img))) {
  text-decoration: none;
}
/* Headings inside migrated CMS records.
   The theme's brand style sets every `h1`–`h6` italic at weight 600; production
   renders the CMS records upright at 400 throughout — measured on both
   /store-duesseldorf/ and /versand-lieferung/. The weight difference also leaks
   one level down, because `<b>`/`<span>` use the UA default `font-weight: bolder`,
   which resolves *relative to the parent*: 900 off 600 here against prod's 700
   off 400. Resetting the heading therefore corrects the bold runs inside it too.

   `:where()` is what makes this safe. It contributes no specificity, so the
   selector stays at (0,0,1) — the same weight as the theme's own `h2` rule,
   winning only on source order. That matters because several records ship their
   own `\3c style>` block with bare element selectors (the "Unsere Öffnungszeiten"
   headline is bold there, on prod too); a `.cmsContent h2` selector would
   outrank those and flatten deliberate emphasis the editor set. Scoped to
   `.cmsContent`, which the home page does not use, so its layout is untouched. */
:where(.cmsContent) h1,
:where(.cmsContent) h2,
:where(.cmsContent) h3,
:where(.cmsContent) h4,
:where(.cmsContent) h5,
:where(.cmsContent) h6,
:where(.wmdk-imagetextbox-wrapper) h1,
:where(.wmdk-imagetextbox-wrapper) h2,
:where(.wmdk-imagetextbox-wrapper) h3,
:where(.wmdk-imagetextbox-wrapper) h4,
:where(.wmdk-imagetextbox-wrapper) h5,
:where(.wmdk-imagetextbox-wrapper) h6 {
  font-style: normal;
  font-weight: 400;
}
/* …and production's heading scale, which is what makes the migrated records read as intended.

   The records use headings as containers for explicitly sized inline text — the showroom address is
   `<h4><span style="font-size:18px">…` and the tour teaser is `<h1><span style="font-size:24px">…`.
   A heading contributes its own strut to every line box it contains, so the theme's larger headings
   (h1 40px, leading 48px against production's 30px/33px) opened a gap far taller than the text
   actually in it: the tour block measured 96px high where production is 66px. That is the "too much
   white space, looks messy" on #70072 — the copy is identical, only the leading differs.

   Sizes are measured off warehouse-one.de; the 1.1 ratio and the 20/10 and 10/10 margins are the
   Bootstrap 3 rhythm those records were written for. `h5`/`h6` keep the theme's size and only take
   the tighter leading, since production has none on these pages to measure.

   `:where()` again: records ship their own `\3c style>` blocks with bare element selectors, and those
   must keep winning. */
:where(.cmsContent) h1 {
  font-size: 30px;
}
:where(.cmsContent) h2 {
  font-size: 24px;
}
:where(.cmsContent) h3 {
  font-size: 20px;
}
:where(.cmsContent) h4 {
  font-size: 18px;
}
:where(.cmsContent) h1,
:where(.cmsContent) h2,
:where(.cmsContent) h3,
:where(.cmsContent) h4,
:where(.cmsContent) h5,
:where(.cmsContent) h6 {
  line-height: 1.1;
  margin-bottom: 10px;
}
:where(.cmsContent) h1,
:where(.cmsContent) h2,
:where(.cmsContent) h3 {
  margin-top: 20px;
}
:where(.cmsContent) h4,
:where(.cmsContent) h5,
:where(.cmsContent) h6 {
  margin-top: 10px;
}
/* Phones: production keeps the records off the screen edge.

   Measured on /store-duesseldorf/ at 390px — production insets the content 15px (its table sits at
   x=15 w=360, the accordion bars at x=16 w=358), while this theme's container collapses to no
   horizontal padding at all and the same table ran the full 390px, hard against both edges. That is
   the "mobile does not look like prod" of #70072.

   The full-bleed bands are unaffected on purpose: they break out with
   `margin-inline: calc(50% - 50vw)`, and `50%` simply resolves against the narrower column, so the
   band still starts at 0 and spans the viewport. Verified rather than assumed.  */
@media (max-width: 767.98px) {
  /* 10px here plus the 5px the surrounding `.container` already contributes is production's 15px.
       The rows below used to make up the difference with their negative gutter margin; now that the
       margin is gone, the inset has to come from here, or every record would sit 5px too far in. */
  .cmsContent {
    padding-right: 10px;
    padding-left: 10px;
  }
  /* The record's grid adds another 5px of column gutter on top of that inset, which production
       does not have — the accordion bars came out 348px wide against prod's 358px. Every column
       stacks to full width at this size anyway, so the gutter only pushes content inwards. */
  .cmsContent [class*="col-"] {
    padding-right: 0;
    padding-left: 0;
  }
  /* Zeroing the column padding on its own leaves the rows with the negative half-gutter margin
       they subtract it from, so every row hung 5px past its parent on either side. Harmless while a
       row only holds text, but on /kontakt/ the contact form's own row inherits it: its inputs came
       out 370px wide inside a 360px panel, overhanging the grey background and running up against
       both screen edges. `.dd-fullwidth` sets its breakout margins with `!important` and is
       unaffected. */
  .cmsContent .row {
    margin-right: 0;
    margin-left: 0;
  }
  /* The grey panels carry `col-sm-12 col-xs-12` themselves, so the reset above also stripped the
       padding they are given further up (production's 10px 12px 1px 10px) and their content sat
       hard against the panel edge — the contact form filled its panel corner to corner. Restoring
       it has to happen after the reset: `[class*="col-"]` and `.cms-background` weigh the same, so
       source order decides. */
  .cmsContent .cms-background {
    padding: 10px 12px 1px 10px;
  }
  /* The page heading is a sibling of `.cmsContent` inside the same container, so the inset above
       never reached it and the title stood 10px to the left of everything under it. Reading the
       container off the heading would need `:has()`, which this theme stays clear of, so the two
       shapes the CMS pages use carry it instead: `.dd-ve-content > .container` (VisualCMS records,
       /agb/ and /kontakt/) and `.container-xxl` (APEX's plain content page). */
  .dd-ve-content > .container > h1,
  .container-xxl > h1 {
    padding-right: 10px;
    padding-left: 10px;
  }
}
/* ===================================================================
 * #70178 — the Magazin teaser image on a brand page.
 *
 * `kussin/visualcms-shortcodes` ships the Magazin card styling as an inline `\3c style>` inside the
 * shortcode, and it gives every card image a fixed landscape box:
 *
 *     .dd-shortcode-wmdkblogfeed .wmdk-blog-feed-post img {
 *         width: 100%; height: clamp(340px, 26vw, 440px); object-fit: cover;
 *     }
 *
 * That works on the homepage, where three cards share the row. On a brand page there is a single
 * post, so the card is 750px wide — and the teaser photo is PORTRAIT: 255×420. `cover` scaled it
 * to 750×374 and threw away about 70% of the picture, leaving the zoomed strip of a ski pole the
 * ticket shows. Production renders the same file at 319×525, i.e. its own 0.61 ratio, uncropped.
 *
 * Keep the image's aspect ratio and cap its height instead of its box, and let the card shrink to
 * the picture so the teal caption bar still lines up with it. The inline `\3c style>` renders after
 * the head stylesheet and would win on equal specificity, hence the `#wrapper` prefix. The
 * homepage band keeps its fixed row height — restated at the same weight for the same reason.
 * =================================================================== */
#wrapper .dd-shortcode-wmdkblogfeed .wmdk-blog-feed-post img {
  width: auto;
  max-width: 100%;
  height: auto;
  max-height: 420px;
  -o-object-fit: contain;
     object-fit: contain;
  margin-inline: auto;
}
/* #70178 — production does NOT shrink the card to its picture. Measured on /stoeckli/ at 1440: the
   card keeps the full 758px column, the portrait teaser sits centred inside it at its own 255x420,
   and the caption bar runs the whole width. Only the picture is centred, never the card. */
#wrapper .dd-shortcode-wmdkblogfeed .wmdk-blog-feed-post-inner {
  width: auto;
}
/* ===================================================================
 * #70168 — the Magazin band on the home page.
 *
 * Measured against warehouse-one.de at 1440: the posts column starts at x=150 and is 763 wide, each
 * card is 249x420 with its caption bar 18px, and the support box sits at x=913, 377 wide, its top
 * edge level with the cards. On the relaunch the band was inset to x=157 (the cards to 162), the
 * cards were cropped to a 240px landscape box, and the caption was 14px — so the column came out
 * 240 tall against the support box's 462 and the two no longer lined up.
 *
 * The inset is the shortcode's own doing: VisualCMS adds `col-12` to the widget wrapper *and* the
 * wrapper carries `row`, so the band pays the 12px column gutter twice while every other band on
 * the page pays it once. Production's markup has no such column, hence x=150.
 *
 * The card height is production's picture ratio, not a fixed box: its three teasers are all
 * 255x420, so `aspect-ratio` reproduces the 420 exactly while keeping the cards equal to each other
 * whatever the feed delivers — ours currently mixes a 900x595 in, which a bare `height: auto` would
 * render two thirds shorter than its neighbours.
 * =================================================================== */
#wrapper .cms-home .dd-shortcode-wmdkblogfeed {
  /* Production prints the "Magazin" heading inside the widget, 10px above the cards. On the home
       page ours comes from the CMS text cell in the row above, so the band also pays the 24px top
       margin every home page row carries — 34px in total, visibly more air than the live shop. */
  margin-top: -24px;
}
/* VisualCMS wraps the widget in a grid column whose padding has no negative row margin to pair
   with, so the band sat inside the container edge: 12px on the home page (whose CMS rows are
   centred with `margin-inline: auto`) and 5px on a brand page at desktop. Below 768 the brand
   page's own chain already lands on the container edge — production's cards start at 15 there and
   so do ours — so that one is corrected only where the columns sit side by side. */
#wrapper .cms-home .dd-shortcode-wmdkblogfeed {
  padding-inline: 0;
}
/* On the home page VisualCMS puts a second column class on the widget's own row, so the band paid
   the gutter twice; the row's negative margins already carry it.

   #70322 — mobile alignment: dropping the padding was only half of it. The element is `row` and
   `col-12` at once, and `col-12` is `flex: 0 0 auto; width: 100%`: a definite width, so `.row`'s
   `margin-inline: -5px` (half the widget's 10px gutter) cannot widen the box, it only slides it
   5px left. The band therefore came out one gutter narrow and off-centre — measured at 390 it ran
   10…370, and after its columns paid their 5px back the cards and the mint support box painted
   15…365 against the 15…375 every other block on the page uses. That is the uneven left/right
   gap the screenshot marks: flush on the left by luck, 10px short on the right. Desktop had the
   same 10px, at 1600 the box ended on 1360 inside a 1370 column.
   Let the width go back to auto so the negative margins widen the row the way Bootstrap's pair
   expects, and the columns' own 5px lands the content back on the container edge. */
#wrapper .cms-home .dd-shortcode-wmdkblogfeed > .wmdk-blog-feed-wrapper.col-12 {
  width: auto;
  padding-inline: 0;
}
#wrapper .cms-home .dd-shortcode-wmdkblogfeed .wmdk-blog-feed-post img {
  width: 100%;
  /* `height: 100%` where the row has a definite height — the support box beside the cards is a
       few pixels taller than their ratio alone would make them, and the cards have to reach the
       same bottom edge. Where nothing constrains the row, this resolves to auto and the ratio
       decides, as production's own three teasers do. */
  height: 100%;
  max-height: none;
  aspect-ratio: 255 / 420;
  -o-object-fit: cover;
     object-fit: cover;
}
#wrapper .cms-home .dd-shortcode-wmdkblogfeed .wmdk-blog-feed-post,
#wrapper .cms-home .dd-shortcode-wmdkblogfeed .wmdk-blog-feed-post > a {
  height: 100%;
}
/* ===================================================================
 * #70238 — "Android homepage: Magazin images are blown up".
 *
 * The rule above is right on a desktop, where the row has a definite height and the cards have to
 * reach the same bottom edge. On a phone the cards are stacked, the row stretches to whatever the
 * tallest card wants, and `height: 100%` then resolves against that — measured on a 360px Android
 * viewport: each 900x595 photo rendered into a 320x1601 box with `object-fit: cover`, so the visitor
 * saw one enormously magnified crop per card and the widget stood 2059px tall.
 *
 * `pages/home/bands.less` already asks for production's 240px band below 768. It never applied,
 * because it is scoped `.cms-home …` (three classes) while the rule above is `#wrapper .cms-home …`
 * — an id outranks it at every width. The same intent is repeated here, at the weight it needs.
 * =================================================================== */
@media (max-width: 767px) {
  #wrapper .cms-home .dd-shortcode-wmdkblogfeed .wmdk-blog-feed-post img {
    height: 240px;
    /* The ratio is what pinned the box; below 768 the fixed band is the shape production has. */
    aspect-ratio: auto;
  }
  #wrapper .cms-home .dd-shortcode-wmdkblogfeed .wmdk-blog-feed-post,
  #wrapper .cms-home .dd-shortcode-wmdkblogfeed .wmdk-blog-feed-post > a {
    height: auto;
  }
}
/* …and the chain the cards hang from, or the column's stretched height never reaches them. */
#wrapper .cms-home .dd-shortcode-wmdkblogfeed .wmdk-blog-feed,
#wrapper .cms-home .dd-shortcode-wmdkblogfeed .wmdk-blog-feed-posts,
#wrapper .cms-home .dd-shortcode-wmdkblogfeed .wmdk-blog-feed-posts > .row {
  height: 100%;
}
#wrapper .cms-home .dd-shortcode-wmdkblogfeed .wmdk-blog-feed-post-inner {
  width: auto;
}
#wrapper .dd-shortcode-wmdkblogfeed .wmdk-blog-feed-post h4 {
  font-size: 18px;
  line-height: 1.1;
  /* #70709: prod stacks the title and the arrow with no gap, the arrow on the right edge */
  gap: 0;
  /* #70709: two title lines, the arrow row and the padding (prod 71px), so a one-line title's
       caption bar starts at the same height as its neighbours' */
  min-height: 71px;
}
/* #70709 — prod's caption title is 14px, only the h4 around it is 18px (measured on
   warehouse-one.de: span 14/15.4, h4 18/19.8). At 18px the titles wrapped to three lines and the
   caption bars of the three cards started at three different heights. */
#wrapper .dd-shortcode-wmdkblogfeed .wmdk-blog-feed-post h4 > span:first-child {
  font-size: 14px;
  line-height: 1.1;
}
#wrapper .dd-shortcode-wmdkblogfeed .wmdk-blog-feed-post h4 .icon {
  align-self: flex-end;
  width: 18px;
  height: 20px;
  /* prod's arrow is the solid Font Awesome glyph, so the module's line arrow gets a heavier stroke */
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='3.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 12h15M13 5.5l6.5 6.5-6.5 6.5'/%3E%3C/svg%3E");
}
/* #70709 — the mint support box stood 10px off the third card while the cards leave 5px between
   each other: both columns pay their 5px gutter. Prod's columns pad on the right only, so the box
   sits on the same 5px rhythm as the cards. Only while the columns are side by side. */
@media (min-width: 768px) {
  #wrapper .cms-home .dd-shortcode-wmdkblogfeed > .wmdk-blog-feed-wrapper > .col-md-4 {
    padding-left: 0;
  }
}
/* 4. The widget's own "Magazin" heading. The module hides it because the home page carries the
      title in a CMS text cell above the band — but a brand page has no such cell, so hiding it
      left that page with no title at all. Show it everywhere except the home page, and give the
      support box beside it production's 52px offset so its top edge stays level with the card. */
#wrapper .dd-shortcode-wmdkblogfeed .wmdk-blog-feed-head {
  display: block;
}
#wrapper .cms-home .dd-shortcode-wmdkblogfeed .wmdk-blog-feed-head {
  display: none;
}
#wrapper .dd-shortcode-wmdkblogfeed .wmdk-blog-feed-head h3 {
  margin: 20px 0 10px;
  font-size: 20px;
  font-style: normal;
}
/* Only while the two columns sit side by side: production drops the offset once the support box
   stacks under the cards (measured at 390: margin-top 0). */
@media (min-width: 768px) {
  #wrapper .dd-shortcode-wmdkblogfeed .wmdk-blog-feed-support-content {
    margin-top: 52px;
    /* the module stretches this to the column's full height, which the 52px offset then pushes
           past the card's bottom edge — take the offset off the height as well */
    height: calc(100% - 52px);
  }
  #wrapper .cms-home .dd-shortcode-wmdkblogfeed .wmdk-blog-feed-support-content {
    margin-top: 0;
    height: 100%;
  }
}
/* Production's grid gutter here is 10px, not Bootstrap 5's 24px default that the widget narrows to
   16px: with 16px the three cards lose 10px of width each, which the picture ratio then turns into
   26px of height, and the support box next to them is squeezed enough that its heading wraps onto a
   second line. */
#wrapper .dd-shortcode-wmdkblogfeed > .wmdk-blog-feed-wrapper {
  --bs-gutter-x: 0.625rem;
}
/* Between the cards production leaves 5px, not 10: its card columns are 254 wide carrying a 249
   card, i.e. a single 5px gutter for the pair rather than 5px on each side. */
#wrapper .dd-shortcode-wmdkblogfeed .wmdk-blog-feed-posts > .row {
  --bs-gutter-x: 0.3125rem;
}
/* Nothing zeroes a column's padding here on purpose: each nested Bootstrap row already pairs a
   -gutter/2 margin with +gutter/2 of column padding, so the chain nets to the container edge on
   its own. Removing one side of that pair pushes the cards outside the container — on a phone it
   put the first card 5px off-screen.
   
   The pairing does have to be restated, though: where `kussin/cnc-contentinjector` wraps the band —
   every brand page on dev1 and live, though not locally — its stylesheet flattens `.row` margins to
   zero while the columns keep their padding, so each of the three nesting levels added half a
   gutter and the card ended up 13px inside the heading above it. */
/*
 * `kussin/cnc-contentinjector` flattens `.row` margins to zero inside everything it wraps — every
 * brand and product page on dev1 and live — while the columns keep their padding. Bootstrap's grid
 * is a pair: a -gutter/2 row margin against +gutter/2 of column padding. With one half gone each
 * nesting level pushes its content another half-gutter inwards, which is how the magazine card
 * ended up 13px inside the heading above it and the image text box 30px right of every other band.
 * Restore the half the injector removed; where it was never removed this computes to the value
 * already in force.
 */
@media (min-width: 768px) {
  #wrapper .cnc-contentinjector .row {
    margin-inline: calc(var(--bs-gutter-x, 1.5rem) * -0.5);
  }
}
/* On a phone the columns stack, so a negative row margin has nothing to cancel against and would
   only drag the band under the viewport edge — production keeps its single 15px gutter there. */
@media (max-width: 767.98px) {
  #wrapper .cnc-contentinjector .row {
    margin-inline: 0;
  }
}
/* With the row margins flat on a phone, the magazine band's own three column levels each add their
   half-gutter and the card sat 18px inside the band it belongs to; stacked columns need no gutter
   at all. Production's card starts on the same 15px as the band. */
@media (max-width: 767.98px) {
  #wrapper .cnc-contentinjector .dd-shortcode-wmdkblogfeed [class*="col-"],
  #wrapper .cnc-contentinjector .dd-shortcode-wmdkblogfeed .wmdk-blog-feed-post {
    padding-inline: 0;
  }
}
/* The support box carried 1.75rem of its own horizontal padding on top of the 20px its column
   already has. That left 266px for the heading, which is 4px short of "Warehouse One Support" at
   24px, so it wrapped to two lines and pushed the box 40px taller than the cards beside it — the
   mismatch the ticket shows. Production pads the column and nothing else. */
#wrapper .dd-shortcode-wmdkblogfeed .support-wrapper {
  padding-inline: 0;
}
/* ===================================================================
 * #70178 — the image-text box under the brand magazine band.
 *
 * `kussin/visualcms-shortcodes` declares the box background as a ColorOption whose default is
 * `#E0EFF0`, and writes it into the box's inline style. That default only applies when the option
 * carries a value: of 2,313 migrated `wmdkimagetextbox` cells 1,370 have no `box_bg` key at all,
 * so their inline style has no `background-color` and the box renders transparent — production
 * paints the same box light teal with its 25px radius (measured on /stoeckli/: rgb(224,239,240)).
 *
 * Restate the default in CSS rather than back-filling the data: an inline style still wins, so
 * every cell that does carry a colour keeps it, and nothing has to be migrated. No cell expresses
 * "no background" — all 943 that have the key have a non-empty value.
 * =================================================================== */
#wrapper .wmdk-imagetextbox-wrapper > div {
  background-color: var(--wh1-color-surface-soft);
}
/* ===================================================================
 * #70230 — two image-text boxes stacked on top of each other with no gap.
 *
 * Production separates them: its `.flex-wrapper` — the rounded, coloured box itself — carries
 * `margin: 10px 0`, so two boxes in the same column stand 20px apart. The OXID 7 shortcode
 * template gives that element only inline flex and radius rules, no margin, so consecutive boxes
 * touch and read as one panel with a seam through it. Measured on /burton-step-on/ at 390: gap 0
 * here against production's 20px, on every stacked pair on the page.
 *
 * The margin belongs on the box rather than on the wrapper because the wrapper's own margins are
 * already spoken for — the horizontal ones are what centre the box and what
 * `kussin/cnc-contentinjector` overrides on brand and product pages (see the block further down).
 * =================================================================== */
#wrapper .wmdk-imagetextbox-wrapper > div {
  margin-block: 10px;
}
/*
 * …and the same box's geometry and type, which `kussin/cnc-contentinjector` overrides wherever it
 * wraps CMS output — i.e. on every brand and product page, but not locally, which is why this only
 * shows on dev1 and live. Its stylesheet sets `margin: 10px 30px` on the widget, beating the
 * module's own `margin-inline: auto`, so the box hangs 30px right of every other band on the page;
 * and it renders the copy at 16px/24 where production renders 14px/20.
 *
 * Measured on production's /stoeckli/ at 1440: box 150…1290, copy 14px/20px, the heading 24px with
 * 20px of air above it. The mobile block further down keeps its own `margin-inline: 0` — there the
 * box is anchored to the column start rather than centred.
 */
@media (min-width: 768px) {
  /* #70233 — an authored offset has to survive the box's own centring.

       Half of the boxes under a product carry `offset-md-2`. Bootstrap expresses that as
       `margin-left: 16.667%`, but the shortcode template ships an inline `\3c style>` in the body
       setting `margin-left: auto; margin-right: auto` on `.wmdk-imagetextbox-wrapper` — same
       specificity, later in the document, so it wins and the offset is lost. The pair production
       lays out as two columns, the left one pushed in by its offset and the right one at the
       column edge, then drifts together toward the middle: measured on
       /burton/step-on-bindung-2026-black-m.html at 1440, a 202px gully between the two boxes where
       production leaves 49.

       Restating Bootstrap's own offset at a specificity the inline block cannot reach gives the
       authored layout back. Only inside the injector — that is where the defect was reported, and
       the centring #70178 added for the boxes that carry no offset stays exactly as it is. */
  #wrapper .cnc-contentinjector .dd-shortcode-wmdkimagetextbox.wmdk-imagetextbox-wrapper.offset-md-1 {
    margin-right: 0;
    margin-left: 8.333333%;
  }
  #wrapper .cnc-contentinjector .dd-shortcode-wmdkimagetextbox.wmdk-imagetextbox-wrapper.offset-md-2 {
    margin-right: 0;
    margin-left: 16.666667%;
  }
  #wrapper .cnc-contentinjector .dd-shortcode-wmdkimagetextbox.wmdk-imagetextbox-wrapper.offset-md-3 {
    margin-right: 0;
    margin-left: 25%;
  }
  #wrapper .cnc-contentinjector .dd-shortcode-wmdkimagetextbox.wmdk-imagetextbox-wrapper.offset-md-4 {
    margin-right: 0;
    margin-left: 33.333333%;
  }
  #wrapper .cnc-contentinjector .dd-shortcode-wmdkimagetextbox.wmdk-imagetextbox-wrapper.offset-md-5 {
    margin-right: 0;
    margin-left: 41.666667%;
  }
  #wrapper .cnc-contentinjector .dd-shortcode-wmdkimagetextbox.wmdk-imagetextbox-wrapper.offset-md-6 {
    margin-right: 0;
    margin-left: 50%;
  }
  #wrapper .cnc-contentinjector .dd-shortcode-wmdkimagetextbox.wmdk-imagetextbox-wrapper.offset-md-7 {
    margin-right: 0;
    margin-left: 58.333333%;
  }
  #wrapper .cnc-contentinjector .dd-shortcode-wmdkimagetextbox.wmdk-imagetextbox-wrapper.offset-md-8 {
    margin-right: 0;
    margin-left: 66.666667%;
  }
  #wrapper .cnc-contentinjector .dd-shortcode-wmdkimagetextbox.wmdk-imagetextbox-wrapper.offset-md-9 {
    margin-right: 0;
    margin-left: 75%;
  }
  #wrapper .cnc-contentinjector .dd-shortcode-wmdkimagetextbox.wmdk-imagetextbox-wrapper.offset-md-10 {
    margin-right: 0;
    margin-left: 83.333333%;
  }
  #wrapper .cnc-contentinjector .dd-shortcode-wmdkimagetextbox.wmdk-imagetextbox-wrapper.offset-md-11 {
    margin-right: 0;
    margin-left: 91.666667%;
  }
  /* `offset-md-0` is an authored offset too — it is what the right-hand cell of a pair carries,
       and Bootstrap expresses it as `margin-left: 0`, i.e. "sit where the grid puts you". Left to
       the centring below it took `margin: 0 116px` instead and stood 116px right of its own column,
       which is the whole remaining gully between the two boxes under a product. A cell with no
       offset class at all is a different thing — that is the single full-width group #70178
       centred, and it keeps the centring. */
  #wrapper .cnc-contentinjector .dd-shortcode-wmdkimagetextbox.wmdk-imagetextbox-wrapper.offset-md-0 {
    margin-right: 0;
    margin-left: 0;
  }
  #wrapper .cnc-contentinjector .dd-shortcode-wmdkimagetextbox.wmdk-imagetextbox-wrapper {
    margin-inline: auto;
  }
  /* …and the inset production leaves inside each cell, which is what sets the gully between a
       pair. Production's wrapper carries `margin: 10px 15px 10px 30px`, so its 481.7px cell holds a
       432px box inset 32.7 left and 17 right — 50px of air between the two boxes. This theme's
       cells carry a 5px gutter on each side, so the boxes nearly touched: 10px between them.
       Restating the inset as padding rather than margin keeps the offsets above intact, since the
       cell and the box are the same element here. */
  #wrapper .cnc-contentinjector .dd-shortcode-wmdkimagetextbox.wmdk-imagetextbox-wrapper[class*="col-md-"]:not([class*="col-md-12"]) {
    padding-right: 18px;
    padding-left: 32px;
  }
}
/* Below that the injector's own `margin: 10px 25px` still wins over the theme's older override in
   `wh1-overrides.less`, which sits at the same specificity but earlier in the cascade: the box came
   out 330 wide at x=30 where production runs the full 360 from x=15. */
@media (max-width: 767.98px) {
  #wrapper .cnc-contentinjector .dd-shortcode-wmdkimagetextbox.wmdk-imagetextbox-wrapper {
    max-width: calc(100vw - 30px);
    margin-inline: 0;
  }
}
/* The injector nests two padded containers: its own 15px and its inner container's 15px. On a wide
   screen the inner one also carries the centring margin, so the pair lands on the container edge
   and is correct; on a phone there is no margin to absorb it and the content sat on a 30px gutter
   where production has 15. */
@media (max-width: 767.98px) {
  #wrapper .cnc-contentinjector > div {
    padding-inline: 0;
  }
}
#wrapper .wmdk-imagetextbox-wrapper,
#wrapper .wmdk-imagetextbox-wrapper p,
#wrapper .wmdk-imagetextbox-wrapper div {
  font-size: 14px;
  line-height: 20px;
}
#wrapper .wmdk-imagetextbox-wrapper h2 {
  margin: 20px 0 10px;
  font-size: 24px;
  line-height: 1.1;
}
/* ===================================================================
 * #70228 — the copy in an image-text box runs from edge to edge.
 *
 * The shortcode template pads its text pane inline — `padding:20px 40px` — but only on the branch
 * without a text cap. The moment a cell carries `maximal_text_height` (the "- Mehr anzeigen -"
 * accordion, which is what every box on the Burton Step On page uses on a phone) it takes the
 * other branch, whose inline style is `flex:1;overflow:hidden;max-height:…;position:relative`
 * with no padding at all. The heading and the copy then start on the box's own edge, and at the
 * rounded corner the 25px radius eats into the first and last line.
 *
 * Production pads the pane in both cases — `.text-wrapper` 20px 40px, and the capped variant
 * `.text-wrapper.with-accordion-trigger` 20px 40px 30px, the extra 10px at the bottom leaving room
 * for the trigger. Measured on production's /burton-step-on/ at 1440 and at 390.
 *
 * This restates the capped variant's padding in CSS. The pane is always the flex row's last child
 * — the image, when there is one, is emitted first regardless of `image_position`, which only
 * flips the flex direction. Where the template already sets padding inline, the inline value wins,
 * so the uncapped box keeps exactly the 20px 40px it has today and only the capped one changes.
 * =================================================================== */
#wrapper .wmdk-imagetextbox-wrapper > div > div:last-child {
  padding: 20px 40px 30px;
}
/* ===================================================================
 * #70228 (follow-up) — the "- Mehr anzeigen -" trigger does not read on a phone, and the box
 * looks as though it has no bottom padding.
 *
 * Both come from the same element. The shortcode template lays the trigger over the bottom of a
 * capped pane with `padding:20px 0 5px` and a transparent-to-box-colour gradient, which gives the
 * label 20px of fade to sit on and leaves it 5px off the box edge — so the clipped copy is still
 * legible straight through the label, and there is no band of quiet colour to read as padding.
 * Production gives the same trigger 80px: 40px of gradient, then a 40px label band whose bottom is
 * flush with the box, and it sets the label bold. Measured on production's /burton-step-on/ at 390.
 *
 * `!important` on the padding because the template writes it inline on the element, and this is the
 * one place where the author's inline value is the defect rather than the intent — the same
 * reasoning the heading rule further down uses.
 *
 * The third part is the expanded state: production REMOVES the trigger once the pane is open
 * (measured height 80 -> 0), while here it stayed on top of the last lines of the copy it had just
 * revealed. The script marks the open pane with `.expanded`, so that is what hides it.
 * =================================================================== */
#wrapper .wmdk-imagetextbox-wrapper [onclick^="wmdkTriggerWidgetTextAccordion"] {
  padding: 40px 0 0 !important;
}
#wrapper .wmdk-imagetextbox-wrapper [onclick^="wmdkTriggerWidgetTextAccordion"] > span {
  display: block;
  padding: 10px 0;
  font-weight: 700;
}
#wrapper .wmdk-imagetextbox-wrapper .expanded > [onclick^="wmdkTriggerWidgetTextAccordion"] {
  display: none;
}
/* ===================================================================
 * #70189 — "wrong text size".
 *
 * Migrated CMS copy contains paragraphs nested inside a heading, e.g. on the K2 VO2 S 90 W page:
 *
 *     <h3 style="…">4 Wheel&nbsp;</h3>
 *     <h3 style="…"><p style="font-size: 14px;">4-Wheel tracks have, like the name suggests, …</p></h3>
 *
 * That is invalid nesting an editor produced years ago, and on OXID 6 it happened to look fine
 * because the theme's headings were upright and 14px was close to body size. Here the paragraph
 * inherits the heading's italic and 600 weight while its own inline `font-size: 14px` keeps it
 * small, so a whole body paragraph renders as small bold italic text — measured 14px / 600 /
 * italic against 16px / 400 / normal for the paragraph right above it.
 *
 * The content cannot be relied on to be well-formed, so the theme normalises it: a paragraph is
 * body copy wherever it sits. The heading itself is untouched.
 * Note the inline `font-size` on the element, which is why the size needs `!important` here —
 * this is the one place where the author's inline style is the bug rather than the intent.
 * =================================================================== */
/* ===================================================================
 * #70189 — a CMS heading must not bring its own font and colour.
 *
 * The migrated panels carry the editor's inline styling from OXID 6, e.g. on the K2 VO2 S 90 W
 * product page:
 *
 *     <h3 style="font-family: 'Open Sans', …; color: rgb(51, 51, 51);">4 Wheel</h3>
 *
 * so the title renders dark grey in Open Sans while everything around it is the brand teal in
 * Muli — measured on that page: the heading at #333 / Open Sans against body copy at
 * rgb(15,85,92) / Muli, and against the theme's own CMS headings which are teal Muli. It reads as
 * a foreign block dropped into the page, which is what the ticket reports.
 *
 * The family and the colour are taken back for headings inside CMS content; the size, weight and
 * the italic are left alone, so an author can still tell one heading level from another. The
 * inline style has to be beaten, hence `!important` — the same reason the rule below needs it.
 *
 * Note this cannot make every panel identical: on the English version of that page the
 * neighbouring panel lost its `<h3>` during the migration and its title is a plain paragraph, so
 * it has no heading for any rule to style. That is a data repair, tracked separately.
 * =================================================================== */
.cmsContent h1,
.dd-shortcode-wmdkimagetextbox h1,
.dd-ve-container h1,
.cmsContent h2,
.dd-shortcode-wmdkimagetextbox h2,
.dd-ve-container h2,
.cmsContent h3,
.dd-shortcode-wmdkimagetextbox h3,
.dd-ve-container h3,
.cmsContent h4,
.dd-shortcode-wmdkimagetextbox h4,
.dd-ve-container h4,
.cmsContent h5,
.dd-shortcode-wmdkimagetextbox h5,
.dd-ve-container h5,
.cmsContent h6,
.dd-shortcode-wmdkimagetextbox h6,
.dd-ve-container h6 {
  color: var(--wh1-color-primary) !important;
  font-family: var(--wh1-font-family-heading) !important;
}
/*
 * ...except where the CMS puts a heading on a coloured surface.
 *
 * The rule above exists to beat an inline `color` the OXID 6 editor baked into migrated panels, so
 * it has to carry `!important` — and that also beats plain inheritance. The hero slider sets white
 * on its container and lets the heading inherit it, so the override repainted every hero headline
 * brand teal on a photo: measured on the home page, "Seit 1996 – Jubiläums-Sale" came out
 * rgb(15,85,92) where production renders rgb(255,255,255).
 *
 * Give those surfaces their inheritance back at the same weight. Listed explicitly rather than
 * guessed at: each is a container that paints its own background and expects the text to follow it.
 */
.wmdk-hero-content h1,
.wmdk-brand-mood h1,
.slom-slider-neo h1,
.wmdk-hero-content h2,
.wmdk-brand-mood h2,
.slom-slider-neo h2,
.wmdk-hero-content h3,
.wmdk-brand-mood h3,
.slom-slider-neo h3,
.wmdk-hero-content h4,
.wmdk-brand-mood h4,
.slom-slider-neo h4,
.wmdk-hero-content h5,
.wmdk-brand-mood h5,
.slom-slider-neo h5,
.wmdk-hero-content h6,
.wmdk-brand-mood h6,
.slom-slider-neo h6 {
  color: inherit !important;
}
/* #70400/#70469: BrandMood uses .wmdk-brand-mood on its image, not the heading's
   container. The wrapper selector also beats the injected-listing heading color.
   Retain these existing CMS hooks for compatibility only. */
.wmdk-brand-mood-content .wmdk-brand-claim,
#wrapper .wmdk-brand-mood-content .wmdk-brand-claim {
  color: var(--wh1-color-white) !important;
}
/*
 * The magazine tiles on the home page are the same defect with a different remedy. Their heading
 * sits on a teal band the module paints — `rgba(11, 66, 71, 0.8)` — and production colours it white
 * through `.dd-shortcode-wmdkblogfeed .wmdk-blog-feed-post h4`, a rule the override above outranks
 * by carrying `!important`, so all three tiles printed brand teal on teal and were unreadable.
 * Inheritance is no help here: the tile itself is `#333`, so the colour has to be stated.
 */
/* `#wrapper` and the anchor spelled out, because two other rules reach this caption and both would
   otherwise win: #70142's normalisation of unstyled injected headings is scoped to the listing body
   classes — `cl-manufacturerlist` included, i.e. every brand page — and carries `!important` at a
   higher specificity, and the shell's `#wrapper a` paints the caption's link teal, which the inner
   `<span>` then inherits. On a brand page that left "Unvergleichlich = Stöckli" teal on the teal
   caption bar. */
#wrapper .dd-shortcode-wmdkblogfeed .wmdk-blog-feed-post,
#wrapper .dd-shortcode-wmdkblogfeed .wmdk-blog-feed-post a,
#wrapper .dd-shortcode-wmdkblogfeed .wmdk-blog-feed-post span,
#wrapper .dd-shortcode-wmdkblogfeed .wmdk-blog-feed-post h1,
#wrapper .dd-shortcode-wmdkblogfeed .wmdk-blog-feed-post h2,
#wrapper .dd-shortcode-wmdkblogfeed .wmdk-blog-feed-post h3,
#wrapper .dd-shortcode-wmdkblogfeed .wmdk-blog-feed-post h4,
#wrapper .dd-shortcode-wmdkblogfeed .wmdk-blog-feed-post h5,
#wrapper .dd-shortcode-wmdkblogfeed .wmdk-blog-feed-post h6 {
  color: var(--wh1-color-white) !important;
}
/*
 * #70072 — the showroom accordion's headings, same collision.
 *
 * Bootstrap 3 painted `.panel-default > .panel-heading` white on the brand teal and let
 * `.panel-title` inherit it; the CMS heading override above is `!important`, so the title came out
 * teal on a teal bar and read as a blank strip. Restate the bar's own colour and let the title and
 * its link inherit at the same weight. Measured on production's /store-duesseldorf/:
 * rgb(255,255,255) on rgb(15,85,92).
 */
.cmsContent .panel-heading {
  color: var(--wh1-color-white);
}
#wrapper .cmsContent .panel-heading,
#wrapper .cmsContent .panel-title,
#wrapper .cmsContent .panel-title > a {
  color: inherit !important;
}
#wrapper .cmsContent .panel-default > .panel-heading {
  color: var(--wh1-color-white) !important;
}
.cmsContent h1 > p,
.dd-shortcode-wmdkimagetextbox h1 > p,
.dd-ve-container h1 > p,
.cmsContent h2 > p,
.dd-shortcode-wmdkimagetextbox h2 > p,
.dd-ve-container h2 > p,
.cmsContent h3 > p,
.dd-shortcode-wmdkimagetextbox h3 > p,
.dd-ve-container h3 > p,
.cmsContent h4 > p,
.dd-shortcode-wmdkimagetextbox h4 > p,
.dd-ve-container h4 > p,
.cmsContent h5 > p,
.dd-shortcode-wmdkimagetextbox h5 > p,
.dd-ve-container h5 > p,
.cmsContent h6 > p,
.dd-shortcode-wmdkimagetextbox h6 > p,
.dd-ve-container h6 > p {
  margin: 0;
  color: var(--wh1-color-primary);
  font-family: var(--wh1-font-family-base);
  font-size: 1rem !important;
  font-style: normal;
  font-weight: 400;
  line-height: 1.65;
  letter-spacing: 0;
}
/* ===================================================================
 * #70254 — the newsletter link on the product page renders as plain text.
 *
 * The block is injected content that came over from the OXID 6 shop, and it marks its call to
 * action with saltylemon's own class: `<a class="slom-btn-round" href="/newsletter/">`. Production
 * styles that class in its own bundle; the compatibility CSS this shop carries covers only
 * `.slom-page-header`, `.slom-subcat-tile` and `.slom-title`, so the link fell through to the
 * theme's ordinary link styling — teal text with an underline where production has a filled pill.
 *
 * Values are production's, read from its live stylesheet:
 *   .slom-btn-round a, a.slom-btn-round { background-color: #0F555C; border-radius: 50px;
 *     color: #fff; padding: 16px 56px; font-size: 14px; text-decoration: none;
 *     display: inline-block }
 *
 * It is written here rather than added to the "saltylemon-css" snippet in the backend because a
 * snippet lives in the database and does not travel with a deployment — this has to be true on
 * every environment. 98 Visual CMS widgets and one CMS page use the class.
 * =================================================================== */
/* Scoped to `#wrapper` on purpose: the theme's own `#wrapper a` sets the link colour and
   `#wrapper p a` the underline (#70207), both id selectors, and this button always sits inside a
   paragraph. A plain class rule loses to them on specificity — measured: the pill drew its
   background but kept teal text and an underline. */
#wrapper .slom-btn-round a,
#wrapper a.slom-btn-round {
  /* Production has no hover state for it; keep the target obvious all the same. */
}
#wrapper .slom-btn-round a,
#wrapper a.slom-btn-round,
#wrapper .slom-btn-round a:active,
#wrapper a.slom-btn-round:active,
#wrapper .slom-btn-round a:focus,
#wrapper a.slom-btn-round:focus,
#wrapper .slom-btn-round a:hover,
#wrapper a.slom-btn-round:hover {
  display: inline-block;
  padding: 16px 56px;
  border-radius: 50px;
  background-color: var(--wh1-color-primary);
  color: var(--wh1-color-white);
  font-size: 14px;
  text-decoration: none;
}
@media (max-width: 767px) {
  #wrapper .slom-btn-round a,
  #wrapper a.slom-btn-round,
  #wrapper .slom-btn-round a:active,
  #wrapper a.slom-btn-round:active,
  #wrapper .slom-btn-round a:focus,
  #wrapper a.slom-btn-round:focus,
  #wrapper .slom-btn-round a:hover,
  #wrapper a.slom-btn-round:hover {
    box-sizing: border-box;
    max-width: 100%;
    padding: 12px 24px;
    font-size: 16px;
    white-space: normal;
    overflow-wrap: anywhere;
    /* #70400: migrated CMS labels can carry inline 24px sizing. */
  }
  #wrapper .slom-btn-round a span,
  #wrapper a.slom-btn-round span,
  #wrapper .slom-btn-round a:active span,
  #wrapper a.slom-btn-round:active span,
  #wrapper .slom-btn-round a:focus span,
  #wrapper a.slom-btn-round:focus span,
  #wrapper .slom-btn-round a:hover span,
  #wrapper a.slom-btn-round:hover span {
    font-size: inherit !important;
  }
}
#wrapper .slom-btn-round a:hover,
#wrapper a.slom-btn-round:hover,
#wrapper .slom-btn-round a:focus-visible,
#wrapper a.slom-btn-round:focus-visible {
  background-color: var(--wh1-color-primary-dark, #0b4046);
}
.wh1-contact-form-right .wh1-contact-message textarea.form-control {
  min-height: 9rem;
}
@media (min-width: 768px) {
  .wh1-contact-form-right {
    display: flex;
    flex-direction: column;
  }
  .wh1-contact-form-right .wh1-contact-message {
    display: flex;
    flex: 1 1 auto;
    flex-direction: column;
  }
  .wh1-contact-form-right .wh1-contact-message textarea.form-control {
    flex: 1 1 auto;
    min-height: 11rem;
  }
}
@media (max-width: 767.98px) {
  .wh1-contact-form .row > * > .mb-3 {
    margin-bottom: 12px !important;
  }
}
.wh1-contact-intro {
  margin-bottom: 1.25rem;
}
.wh1-contact-actions .wh1-contact-required,
.wh1-contact-actions .wh1-contact-privacy {
  margin-bottom: 0.35rem;
}
.wh1-contact-actions .wh1-contact-submit {
  margin-top: 0.75rem;
  margin-bottom: 1.5rem;
}
body.cl-contact main.content {
  padding-top: 3rem;
}
.wmdk-visual-cms .hidden {
  display: none !important;
}
/* ===================================================================
 * #70256 — the Brevo newsletter form does not match production's typography.
 *
 * Family, size and weight already match to the pixel: Helvetica 16/700 on the labels,
 * Roboto 16/400 in the fields, Helvetica 32/700 on the heading. Brevo ships those in its
 * own stylesheet, which the module injects into this page's head.
 *
 * What Brevo does NOT set is a line-height, so every line in the form inherits the page's.
 * Production is Bootstrap 3, whose base is 1.428571429; the OXID 7 theme is Bootstrap 5,
 * whose base is 1.5. That single inherited number is the whole difference, and it shows up
 * on every measured element:
 *
 *      element        production            here (before)
 *      16px text      22.857px  (×1.42857)  24px  (×1.5)
 *      12px hint      17.143px              18px
 *      24px marker    34.286px              36px
 *      14px field     20px                  21px
 *
 * So the fix is one inherited value, scoped to the form, rather than a rule per element:
 * anything Brevo sizes explicitly keeps its own line-height, and the rest lands exactly
 * where production puts it. Scoped to `.sib-form` so the rest of the page keeps the
 * theme's 1.5.
 * =================================================================== */
.sib-form {
  line-height: 1.42857143;
  /* Nothing is restated per element on purpose. Brevo sets an explicit line-height on a
       few of its own controls — the 32px heading and the 16px intro at 1.5, the country
       prefix box at 1.8 — and those have to keep it; an earlier attempt here forced
       `line-height: inherit` on labels, inputs and paragraphs and flattened all three to
       the container value, which was measurably wrong against production. Inheritance
       already does the right thing: whatever Brevo sizes keeps its own, everything else
       takes the number above.

       The radios and checkboxes are the one exception. Production leaves them at `normal`
       because Bootstrap 3 never gave them a line-height, while inheriting one here would
       hand a replaced element a 22.857px line box it does not use on production. */
}
.sib-form input[type="radio"],
.sib-form input[type="checkbox"] {
  line-height: normal;
}
/* ===================================================================
 * #70256 — the two headings on the newsletter page.
 *
 * "Lass Dich informieren!" is the page title, "10€ Rabatt für Deine Newsletter-Anmeldung" is the
 * CMS record's own `h1.slom-headline`. Both are `<h1>`, so both took the wh1-2026 display style:
 * 40px, weight 600, italic, on a 48px line. Production sets neither — its h1 is the plain body
 * face at 30px, weight 400, upright, on 33px — so the two lines arrived a size too large, too
 * heavy and slanted, which is what reads as the wrong font on this page.
 *
 * Measured on www.warehouse-one.de/newsletter/:
 *
 *      element                     production            here (before)
 *      h1 (page title)             Muli 30/400 lh33      Muli 40/600 italic lh48
 *      h1.slom-headline (CMS)      Muli 30/400 lh33      Muli 40/600 italic lh48
 *
 * Scoped to `body.cl-newsletter` on purpose: the theme's italic display h1 is right everywhere
 * else, and this page is the one production sets apart.
 * =================================================================== */
body.cl-newsletter {
  /* The vertical rhythm production gives these two, measured on the same page. The page title
       carries its space below the text as padding, not margin — 9px, which is what makes its box
       43px tall against the 33px line — and the CMS headline sits 20px below whatever precedes it
       with 10px under it. Ours had 0/20 on the headline and no padding on the title, so the pair
       sat 20px apart instead of 40 and the form began 40px lower than it should. */
  /* The copy between the headline and the form. Production sets this page's CMS text a size
       down from the shop's body copy — 14px on a 20px line with 10px under each paragraph —
       where the theme was giving it 16/24/16, which is what pushed the form 30px further down
       the page than production puts it. Scoped to the CMS block so the Brevo form, which sizes
       its own text, is not touched. */
}
body.cl-newsletter h1,
body.cl-newsletter h1.slom-headline {
  font-size: 30px;
  font-weight: 400;
  font-style: normal;
  line-height: 33px;
}
body.cl-newsletter h1:not(.slom-headline) {
  padding-bottom: 9px;
}
body.cl-newsletter h1.slom-headline {
  margin: 20px 0 10px;
}
body.cl-newsletter .dd-shortcode-text p {
  margin-bottom: 10px;
  font-size: 14px;
  line-height: 20px;
}
/* ===================================================================
 * #70667 — the delivery address selector, on the address book and on the checkout address step.
 *
 * APEX draws the "use this address" control as a `.btn-outline-primary` label around a hidden
 * radio and shapes it into a 30px circle in its own stylesheet. This theme gives every outline
 * button a 44px minimum height, so the circle came out as a 30 by 44 oval that looked like a
 * toggle switch next to a plain checkbox. The markup and APEX's script stay as they are, the
 * control just gets the geometry of the theme's radio buttons: a small ring, a filled dot when
 * active, lined up with the first line of the address beside it.
 * =================================================================== */
.select-address {
  width: 36px;
  flex: 0 0 36px;
  padding-top: 2px;
}
.select-address .btn,
.select-address .btn.btn-outline-primary {
  position: relative;
  width: 22px;
  height: 22px;
  min-height: 0;
  margin: 0;
  padding: 0;
  border: 2px solid var(--wh1-color-primary);
  border-radius: 50%;
  background: var(--wh1-color-white);
  /* APEX sizes and places the dot itself (16px at 6px), so both are set explicitly here:
           the ring has 18px inside its 2px border, a 10px dot sits 4px from each side. */
}
.select-address .btn::after,
.select-address .btn.btn-outline-primary::after {
  content: "";
  position: absolute;
  top: 4px;
  left: 4px;
  width: 10px;
  height: 10px;
  border-radius: 50%;
  background: transparent;
}
.select-address .btn:hover,
.select-address .btn.btn-outline-primary:hover,
.select-address .btn:focus,
.select-address .btn.btn-outline-primary:focus,
.select-address .btn:focus-visible,
.select-address .btn.btn-outline-primary:focus-visible {
  background: var(--wh1-color-white);
  border-color: var(--wh1-color-primary);
}
.select-address .btn:hover::after,
.select-address .btn.btn-outline-primary:hover::after,
.select-address .btn:focus::after,
.select-address .btn.btn-outline-primary:focus::after,
.select-address .btn:focus-visible::after,
.select-address .btn.btn-outline-primary:focus-visible::after {
  background: var(--wh1-color-primary);
  opacity: 0.35;
}
.select-address .btn.active,
.select-address .btn.btn-outline-primary.active,
.select-address .btn.active:hover,
.select-address .btn.btn-outline-primary.active:hover,
.select-address .btn.active:focus,
.select-address .btn.btn-outline-primary.active:focus {
  background: var(--wh1-color-white);
  border-color: var(--wh1-color-primary);
}
.select-address .btn.active::after,
.select-address .btn.btn-outline-primary.active::after,
.select-address .btn.active:hover::after,
.select-address .btn.btn-outline-primary.active:hover::after,
.select-address .btn.active:focus::after,
.select-address .btn.btn-outline-primary.active:focus::after {
  background: var(--wh1-color-primary);
  opacity: 1;
}
/*
 * The "use billing address as delivery address" row. Bootstrap positions the box with a negative
 * margin inside the label's padding, and on some phones (Galaxy S21 Ultra with Edge, iPhone 14
 * in the ticket) the label dropped a line below the box. An explicit flex row with a gap keeps
 * the box and the first line of the label on one line whatever the font metrics, and a long label
 * wraps beside the box instead of under it.
 */
/* The checkout scope below matches `.is-checkout #user_form .form-check`, which sets the
   row to wrap and would otherwise outrank this rule on that page. */
.form-check:has(> #showShipAddress),
.is-checkout #user_form .form-check:has(> #showShipAddress) {
  display: flex;
  flex-wrap: nowrap;
  align-items: flex-start;
  gap: 10px;
  padding-left: 0;
}
.form-check:has(> #showShipAddress) > .form-check-input,
.is-checkout #user_form .form-check:has(> #showShipAddress) > .form-check-input {
  flex: 0 0 auto;
  margin: 3px 0 0;
}
.form-check:has(> #showShipAddress) > .form-check-label,
.is-checkout #user_form .form-check:has(> #showShipAddress) > .form-check-label {
  flex: 1 1 auto;
  min-width: 0;
}
.wh1-styleguide {
  --wh1-styleguide-sidebar-width: 260px;
  --wh1-styleguide-panel-bg: var(--wh1-color-white);
  --wh1-styleguide-page-bg: var(--wh1-color-apex-f8f9fa);
  min-height: 100vh;
  background: var(--wh1-styleguide-page-bg);
  color: var(--wh1-color-black);
}
.wh1-styleguide .wh1-styleguide-shell {
  display: grid;
  grid-template-columns: var(--wh1-styleguide-sidebar-width) minmax(0, 1fr);
  min-height: 100vh;
}
.wh1-styleguide .wh1-styleguide-nav {
  position: sticky;
  top: 0;
  height: 100vh;
  overflow-y: auto;
  padding: 24px 20px;
  background: var(--wh1-color-primary);
  color: var(--wh1-color-white);
}
.wh1-styleguide .wh1-styleguide-nav .wh1-styleguide-brand-title {
  display: block;
  color: var(--wh1-color-white);
  font-family: Oswald, system-ui, sans-serif;
  font-size: 1.3rem;
  line-height: 1.2;
  text-decoration: none;
  text-transform: uppercase;
}
.wh1-styleguide .wh1-styleguide-nav .wh1-styleguide-brand-help {
  display: block;
  margin-top: 8px;
  color: rgba(255, 255, 255, 0.78);
  font-size: var(--wh1-font-size-sm);
  line-height: 1.3;
  text-decoration: none;
}
.wh1-styleguide .wh1-styleguide-nav .wh1-styleguide-brand-help:hover,
.wh1-styleguide .wh1-styleguide-nav .wh1-styleguide-brand-help:focus {
  color: var(--wh1-color-white);
  text-decoration: underline;
}
.wh1-styleguide .wh1-styleguide-nav a {
  display: block;
  padding: 7px 0;
  color: var(--wh1-color-white);
  font-size: 0.92rem;
  text-decoration: none;
}
.wh1-styleguide .wh1-styleguide-nav a:hover,
.wh1-styleguide .wh1-styleguide-nav a:focus {
  text-decoration: underline;
}
.wh1-styleguide .wh1-styleguide-brand {
  margin-bottom: 28px;
}
.wh1-styleguide .wh1-styleguide-brand-meta {
  display: block;
  margin-top: 6px;
  color: rgba(255, 255, 255, 0.76);
  font-size: 0.85rem;
}
.wh1-styleguide .wh1-styleguide-nav-sub {
  margin: -2px 0 8px 12px;
  padding-left: 12px;
  border-left: 1px solid rgba(255, 255, 255, 0.28);
}
.wh1-styleguide .wh1-styleguide-nav-sub a {
  padding: 4px 0;
  color: rgba(255, 255, 255, 0.78);
  font-size: 0.8rem;
}
.wh1-styleguide .wh1-styleguide-main {
  min-width: 0;
  padding: 32px;
}
.wh1-styleguide .wh1-styleguide-header {
  max-width: 1180px;
  margin-bottom: 32px;
}
.wh1-styleguide .wh1-styleguide-eyebrow {
  margin-bottom: 8px;
  color: var(--wh1-color-primary);
  font-size: 0.8rem;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
}
.wh1-styleguide .wh1-styleguide-title {
  margin-bottom: 12px;
  font-size: 2.4rem;
}
.wh1-styleguide .wh1-styleguide-description {
  max-width: 820px;
  color: var(--wh1-color-muted);
  font-size: 1rem;
}
.wh1-styleguide .wh1-styleguide-section {
  max-width: 1320px;
  margin-bottom: 52px;
  padding-bottom: 44px;
  border-bottom: 1px solid var(--wh1-color-border);
}
.wh1-styleguide .wh1-styleguide-section:last-child {
  margin-bottom: 0;
  padding-bottom: 0;
  border-bottom: 0;
}
.wh1-styleguide .wh1-styleguide-section-title {
  margin-bottom: 22px;
  font-size: 1.85rem;
}
.wh1-styleguide .wh1-styleguide-page-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
  gap: 14px;
  max-width: 980px;
}
.wh1-styleguide .wh1-styleguide-page-card {
  display: grid;
  gap: 8px;
  min-height: 132px;
  padding: 18px;
  color: var(--wh1-color-black);
  text-decoration: none;
  background: var(--wh1-styleguide-panel-bg);
  border: 1px solid var(--wh1-color-border);
  border-radius: 8px;
}
.wh1-styleguide .wh1-styleguide-page-card:hover,
.wh1-styleguide .wh1-styleguide-page-card:focus {
  color: var(--wh1-color-black);
  border-color: var(--wh1-color-primary);
}
.wh1-styleguide .wh1-styleguide-page-card span {
  font-weight: 700;
}
.wh1-styleguide .wh1-styleguide-page-card small {
  color: var(--wh1-color-muted);
  line-height: 1.45;
}
.wh1-styleguide .wh1-styleguide-compare {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: 16px;
  align-items: stretch;
  margin-bottom: 18px;
}
.wh1-styleguide .wh1-styleguide-footer-compare {
  grid-template-columns: minmax(0, 1fr);
}
.wh1-styleguide .wh1-styleguide-footer-preview-host {
  padding: 0;
  overflow: hidden;
}
.wh1-styleguide .wh1-styleguide-footer-preview-host .footer {
  margin-top: 0;
}
.wh1-styleguide .wh1-styleguide-apex-footer-preview .footer {
  min-height: 360px;
}
.wh1-styleguide .wh1-styleguide-apex-footer-preview .nav-link {
  padding-right: 0;
  padding-left: 0;
}
.wh1-styleguide .wh1-styleguide-apex-footer-preview .legal {
  border-top: 1px solid var(--wh1-color-border);
}
.wh1-styleguide .wh1-styleguide-panel {
  min-width: 0;
  background: var(--wh1-styleguide-panel-bg);
  border: 1px solid var(--wh1-color-border);
  border-radius: 8px;
  overflow: hidden;
}
.wh1-styleguide .wh1-styleguide-panel-overflow-visible {
  overflow: visible;
}
.wh1-styleguide .wh1-styleguide-panel-header {
  display: flex;
  flex-direction: column;
  gap: 4px;
  min-height: 100px;
  padding: 12px 16px;
  border-bottom: 1px solid var(--wh1-color-border);
  background: var(--wh1-color-apex-f8f9fa);
}
.wh1-styleguide .wh1-styleguide-panel-label {
  font-weight: 700;
}
.wh1-styleguide .wh1-styleguide-panel-note {
  color: var(--wh1-color-muted);
  font-size: 0.82rem;
  line-height: 1.35;
}
.wh1-styleguide .wh1-styleguide-panel-body {
  padding: 18px;
}
.wh1-styleguide .wh1-styleguide-panel-body.wh1-styleguide-preview-host {
  padding: 0;
  overflow: hidden;
}
.wh1-styleguide .wh1-styleguide-source {
  margin-bottom: 10px;
  color: var(--wh1-color-muted);
  font-size: 0.78rem;
}
.wh1-styleguide .wh1-styleguide-meta {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  align-items: center;
  margin: 0 0 14px;
  color: var(--wh1-color-muted);
  font-size: var(--wh1-font-size-xs);
}
.wh1-styleguide .wh1-styleguide-meta span {
  display: inline-flex;
  align-items: center;
  min-height: 24px;
  padding: 3px 8px;
  border: var(--wh1-border-default);
  border-radius: var(--wh1-radius-pill);
  background: var(--wh1-color-white);
}
.wh1-styleguide .wh1-styleguide-status {
  color: var(--wh1-color-black);
  font-weight: 700;
}
.wh1-styleguide .wh1-styleguide-status-draft {
  border-color: var(--wh1-color-surface-soft);
  background: var(--wh1-color-surface-soft);
}
.wh1-styleguide .wh1-styleguide-status-captured-baseline {
  border-color: var(--wh1-color-border-strong);
}
.wh1-styleguide .wh1-styleguide-status-needs-decision {
  border-color: var(--wh1-color-warning);
  background: var(--wh1-color-apex-fff3cd);
}
.wh1-styleguide .wh1-styleguide-status-approved {
  border-color: var(--wh1-color-success-apex);
  background: var(--wh1-color-apex-d4edda);
}
.wh1-styleguide .wh1-styleguide-state-row {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  align-items: center;
}
.wh1-styleguide .wh1-styleguide-preview-frame {
  display: block;
  width: 100%;
  min-height: 132px;
  border: 0;
}
.wh1-styleguide #product-detail-mobile-brand .wh1-styleguide-preview-frame,
.wh1-styleguide #product-gallery-mobile .wh1-styleguide-preview-frame,
.wh1-styleguide #category-hero-mobile .wh1-styleguide-preview-frame {
  max-width: 430px;
  margin: 0 auto;
}
.wh1-styleguide #category-hero-mobile .wh1-styleguide-preview-frame,
.wh1-styleguide #manufacturer-brand-landing-mobile .wh1-styleguide-preview-frame {
  max-width: 390px;
}
.wh1-styleguide #category-hero-desktop .wh1-styleguide-compare,
.wh1-styleguide #manufacturer-brand-landing-desktop .wh1-styleguide-compare {
  grid-template-columns: minmax(0, 1fr);
}
.wh1-styleguide #category-hero-desktop .wh1-styleguide-panel-body,
.wh1-styleguide #manufacturer-brand-landing-desktop .wh1-styleguide-panel-body {
  overflow-x: auto;
}
.wh1-styleguide #category-hero-desktop .wh1-styleguide-preview-frame,
.wh1-styleguide #manufacturer-brand-landing-desktop .wh1-styleguide-preview-frame {
  min-width: 1200px;
}
.wh1-styleguide #manufacturer-brand-landing-mobile .wh1-styleguide-preview-frame {
  margin: 0 auto;
}
.wh1-styleguide #product-gallery-maximum .wh1-styleguide-compare {
  grid-template-columns: minmax(0, 1fr);
}
.wh1-styleguide #product-gallery-maximum .wh1-styleguide-panel-body {
  overflow-x: auto;
}
.wh1-styleguide #product-gallery-maximum .wh1-styleguide-preview-frame {
  min-width: 800px;
}
.wh1-styleguide #footer-mobile .wh1-styleguide-preview-frame {
  max-width: 390px;
  margin: 0 auto;
}
.wh1-styleguide #wishlist-product-row-mobile .wh1-styleguide-preview-frame,
.wh1-styleguide #wishlist-publish-mobile .wh1-styleguide-preview-frame {
  max-width: 390px;
  margin: 0 auto;
}
.wh1-styleguide .wh1-styleguide-sprite {
  display: none;
}
.wh1-styleguide .wh1-styleguide-static-menu {
  position: static;
  display: block;
  min-width: 260px;
}
.wh1-styleguide .wh1-styleguide-header-demo {
  background: var(--wh1-color-white);
}
.wh1-styleguide .wh1-styleguide-header-demo .header-container {
  align-items: start;
  min-height: 460px;
  width: 100%;
}
.wh1-styleguide .wh1-styleguide-header-demo .menu-dropdowns {
  display: block !important;
  position: relative;
}
.wh1-styleguide .wh1-styleguide-header-demo .wh1-styleguide-header-open-menu {
  position: absolute;
  top: calc(100% + 8px) !important;
  right: 0 !important;
  left: auto !important;
  display: block;
  transform: none !important;
}
.wh1-styleguide .wh1-styleguide-header-composite {
  min-width: 1050px;
}
.wh1-styleguide #header-controls-desktop .wh1-styleguide-compare {
  grid-template-columns: minmax(0, 1fr);
}
.wh1-styleguide #header-controls-desktop .wh1-styleguide-panel-body {
  overflow-x: auto;
}
.wh1-styleguide .wh1-styleguide-mobile-header-demo {
  position: static !important;
  width: 100%;
  max-width: 390px;
  margin: 0 auto;
}
.wh1-styleguide .wh1-styleguide-mobile-header-demo .mobile-nav {
  position: relative !important;
  display: flex !important;
  min-height: 50px;
  color: var(--wh1-color-white);
  background: var(--wh1-color-primary);
  box-shadow: none;
}
.wh1-styleguide .wh1-styleguide-mobile-header-demo .mobile-nav > .btn,
.wh1-styleguide .wh1-styleguide-mobile-header-demo .mobile-nav > .dropdowns {
  flex: 0 0 25%;
  min-width: 0;
  max-width: 25%;
}
.wh1-styleguide .wh1-styleguide-mobile-header-demo .mobile-nav > .btn,
.wh1-styleguide .wh1-styleguide-mobile-header-demo .mobile-nav > .dropdowns > .btn {
  display: flex;
  width: 100%;
  min-height: 50px;
  padding: 8px 12px;
  align-items: center;
  justify-content: center;
  color: var(--wh1-color-white);
  background: transparent;
  border: 0;
  border-radius: 0;
}
.wh1-styleguide .wh1-styleguide-mobile-header-demo .mobile-nav svg,
.wh1-styleguide .wh1-styleguide-mobile-header-demo .mobile-nav .kussin-header-control-icon {
  display: block;
  flex: 0 0 26px;
  width: 26px;
  height: 26px;
  fill: currentColor;
  vertical-align: middle;
}
.wh1-styleguide .wh1-styleguide-mobile-header-demo .mobile-nav .btn-minibasket {
  position: relative;
}
.wh1-styleguide .wh1-styleguide-mobile-header-demo .mobile-nav .badge {
  position: absolute;
  top: 3px;
  right: calc(50% - 24px);
}
.wh1-styleguide .wh1-styleguide-mobile-header-demo .mobile-nav .dropdowns {
  position: relative;
}
.wh1-styleguide .wh1-styleguide-mobile-header-demo .mobile-nav > a.btn {
  color: var(--wh1-color-white) !important;
}
.wh1-styleguide .wh1-styleguide-mobile-header-demo .header-container {
  display: flex;
  width: 100%;
  padding: 12px 0;
  flex-direction: column;
  gap: 10px;
  align-items: stretch;
}
.wh1-styleguide .wh1-styleguide-mobile-header-demo .logo-link {
  width: 100%;
  height: auto;
  min-height: 38px;
  padding: 0;
  justify-content: flex-start;
}
.wh1-styleguide .wh1-styleguide-mobile-header-demo .kussin-header-logo-picture {
  width: 100%;
  overflow: hidden;
}
.wh1-styleguide .wh1-styleguide-mobile-header-demo .logo-img {
  width: 100%;
  max-width: 100%;
  max-height: none;
  aspect-ratio: 1744 / 189.3527;
  -o-object-fit: cover;
     object-fit: cover;
  -o-object-position: left center;
     object-position: left center;
}
.wh1-styleguide .wh1-styleguide-mobile-header-demo .search,
.wh1-styleguide .wh1-styleguide-mobile-header-demo .search:not(.show) {
  position: static;
  display: block;
  width: 100%;
  min-width: 0;
  max-width: none;
  padding: 0;
  background: transparent;
}
.wh1-styleguide .wh1-styleguide-mobile-header-demo.is-mobile-compact .header-container {
  display: grid;
  grid-template-columns: 46px minmax(0, 1fr);
  gap: 10px;
  padding: 8px 0;
  align-items: center;
}
.wh1-styleguide .wh1-styleguide-mobile-header-demo.is-mobile-compact .logo-link {
  width: 46px;
  height: 38px;
  overflow: hidden;
}
.wh1-styleguide .wh1-styleguide-mobile-header-demo.is-mobile-compact .kussin-header-logo-picture {
  display: block;
  flex: 0 0 46px;
  width: 46px;
  height: 38px;
  overflow: hidden;
}
.wh1-styleguide .wh1-styleguide-mobile-header-demo.is-mobile-compact .logo-img {
  display: block;
  width: 46px;
  max-width: none;
  height: 38px;
  max-height: none;
  aspect-ratio: auto;
  -o-object-fit: cover;
     object-fit: cover;
  -o-object-position: left center;
     object-position: left center;
  transform: none;
}
.wh1-styleguide .wh1-styleguide-mobile-state-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--wh1-space-lg);
}
@media (max-width: 899.98px) {
  .wh1-styleguide .wh1-styleguide-mobile-state-grid {
    grid-template-columns: minmax(0, 1fr);
  }
}
.wh1-styleguide .wh1-styleguide-mobile-state-title {
  margin-bottom: 4px;
  color: var(--wh1-color-primary);
  font-size: 16px;
}
.wh1-styleguide .wh1-styleguide-mobile-scroll-frame-shell {
  width: min(100%, 430px);
  padding: 10px;
  background: var(--wh1-color-white);
  border: 1px solid var(--wh1-color-border);
  border-radius: var(--wh1-radius-md);
  box-shadow: var(--wh1-shadow-sm);
}
.wh1-styleguide .wh1-styleguide-mobile-scroll-frame {
  display: block;
  width: 100%;
  height: 560px;
  border: 0;
}
.wh1-styleguide .wh1-styleguide-mobile-state-note {
  margin-bottom: var(--wh1-space-sm);
  color: var(--wh1-color-muted-text);
  font-size: 13px;
}
.wh1-styleguide #header-controls-meta .wh1-styleguide-compare {
  grid-template-columns: minmax(0, 1fr);
}
.wh1-styleguide #category-description-rich-text .wh1-styleguide-compare,
.wh1-styleguide #category-description-tile-grid .wh1-styleguide-compare {
  grid-template-columns: minmax(0, 1fr);
}
.wh1-styleguide .wh1-styleguide-static-modal {
  position: static;
  display: block;
  height: auto;
  overflow: visible;
  opacity: 1;
}
.wh1-styleguide .wh1-styleguide-static-modal .modal-dialog {
  margin: 0;
  position: static;
  inset: auto;
  width: auto;
  max-width: none;
  transform: none;
}
.wh1-styleguide .wh1-styleguide-static-modal .modal-content {
  height: auto;
  min-height: 0;
}
.wh1-styleguide .wh1-styleguide-static-modal.modal.fade.basketFlyout .modal-dialog {
  position: static;
  inset: auto;
  width: auto;
  max-width: none;
  margin: 0;
  transform: none;
}
.wh1-styleguide .wh1-styleguide-static-modal.modal.fade.basketFlyout .modal-content {
  height: auto;
  min-height: 0;
}
.wh1-styleguide .wh1-styleguide-static-modal.modal.fade.basketFlyout .minibasket-items {
  max-height: none;
  overflow: visible;
}
.wh1-styleguide #product-gallery-modal-zoom .zoom-container {
  max-width: 220px;
  margin: 0 auto var(--wh1-space-md);
  cursor: zoom-in;
}
.wh1-styleguide #product-gallery-modal-zoom .zoom-modal .modal-body {
  height: 360px;
  overflow: hidden;
}
.wh1-styleguide #product-gallery-modal-zoom .zoom-modal .carousel-item img {
  width: 100% !important;
  height: 320px !important;
  max-width: 100% !important;
  max-height: 320px !important;
  -o-object-fit: contain;
     object-fit: contain;
}
.wh1-styleguide .wh1-styleguide-factfinder-capture {
  overflow-x: auto;
}
.wh1-styleguide .wh1-styleguide-factfinder-capture .kussin-factfinder-listing {
  margin-bottom: 0;
}
.wh1-styleguide .wh1-styleguide-factfinder-component {
  margin-bottom: 32px;
  padding-top: 26px;
  border-top: 1px solid var(--wh1-color-border);
}
.wh1-styleguide .wh1-styleguide-component-description {
  max-width: 920px;
  margin: -6px 0 18px;
  color: var(--wh1-color-muted);
  font-size: 0.9rem;
  line-height: 1.55;
}
.wh1-styleguide .wh1-styleguide-factfinder-component:last-child {
  margin-bottom: 0;
}
.wh1-styleguide .wh1-styleguide-preview-root[id^="factfinder-filter-"] .kussin-factfinder-listing {
  width: min(100%, 360px);
  margin: 0 auto;
}
.wh1-styleguide .wh1-styleguide-preview-root[id^="factfinder-filter-"] .kussin-factfinder-asn-column {
  position: static;
  width: 100%;
  height: auto;
  margin: 0;
  padding: 0;
}
.wh1-styleguide #factfinder-suggest .wh1-styleguide-compare {
  grid-template-columns: 1fr;
}
.wh1-styleguide #factfinder-suggest .wh1-styleguide-factfinder-capture {
  overflow-x: visible;
}
.wh1-styleguide #factfinder-suggest .wh1-styleguide-suggest-state + .wh1-styleguide-suggest-state {
  margin-top: var(--wh1-space-xl);
}
.wh1-styleguide #factfinder-suggest .wh1-styleguide-suggest-state-title {
  margin-bottom: var(--wh1-space-sm);
  color: var(--wh1-color-primary);
  font-size: var(--wh1-font-size-md);
}
.wh1-styleguide #factfinder-mobile-asn-controls .wh1-styleguide-compare {
  grid-template-columns: 1fr;
}
.wh1-styleguide #factfinder-mobile-asn-controls .kussin-factfinder-results-column {
  width: min(100%, 500px);
}
.wh1-styleguide #factfinder-product-list-item-campaign .wh1-styleguide-compare,
.wh1-styleguide #factfinder-product-list-item-campaign-responsive-voucher .wh1-styleguide-compare,
.wh1-styleguide #factfinder-product-list-interaction .wh1-styleguide-compare,
.wh1-styleguide #factfinder-product-records .wh1-styleguide-compare,
.wh1-styleguide #factfinder-campaign-pushed-products .wh1-styleguide-compare {
  grid-template-columns: 1fr;
}
.wh1-styleguide #factfinder-product-list-item-campaign .wh1-styleguide-factfinder-capture,
.wh1-styleguide #factfinder-product-list-item-campaign-responsive-voucher .wh1-styleguide-factfinder-capture,
.wh1-styleguide #factfinder-product-list-interaction .wh1-styleguide-factfinder-capture,
.wh1-styleguide #factfinder-product-records .wh1-styleguide-factfinder-capture,
.wh1-styleguide #factfinder-campaign-pushed-products .wh1-styleguide-factfinder-capture {
  overflow-x: visible;
}
.wh1-styleguide #factfinder-product-list-item-campaign .kussin-factfinder-results-column,
.wh1-styleguide #factfinder-product-list-item-campaign-responsive-voucher .kussin-factfinder-results-column,
.wh1-styleguide #factfinder-product-list-interaction .kussin-factfinder-results-column,
.wh1-styleguide #factfinder-product-records .kussin-factfinder-results-column,
.wh1-styleguide #factfinder-campaign-pushed-products .kussin-factfinder-results-column,
.wh1-styleguide #factfinder-product-list-item-campaign ff-record-list,
.wh1-styleguide #factfinder-product-list-item-campaign-responsive-voucher ff-record-list,
.wh1-styleguide #factfinder-product-list-interaction ff-record-list,
.wh1-styleguide #factfinder-product-records ff-record-list,
.wh1-styleguide #factfinder-campaign-pushed-products ff-record-list,
.wh1-styleguide #factfinder-product-list-item-campaign .ff-record-list,
.wh1-styleguide #factfinder-product-list-item-campaign-responsive-voucher .ff-record-list,
.wh1-styleguide #factfinder-product-list-interaction .ff-record-list,
.wh1-styleguide #factfinder-product-records .ff-record-list,
.wh1-styleguide #factfinder-campaign-pushed-products .ff-record-list {
  width: 100%;
  max-width: none;
}
.wh1-styleguide #factfinder-product-list-item-campaign .grid-row .ff-record-list-item,
.wh1-styleguide #factfinder-product-list-item-campaign-responsive-voucher .grid-row .ff-record-list-item,
.wh1-styleguide #factfinder-product-list-interaction .grid-row .ff-record-list-item,
.wh1-styleguide #factfinder-product-records .grid-row .ff-record-list-item,
.wh1-styleguide #factfinder-campaign-pushed-products .grid-row .ff-record-list-item {
  flex: 0 0 100%;
  max-width: 100%;
}
@media (min-width: 768px) {
  .wh1-styleguide #factfinder-product-list-item-campaign .grid-row .ff-record-list-item,
  .wh1-styleguide #factfinder-product-list-item-campaign-responsive-voucher .grid-row .ff-record-list-item,
  .wh1-styleguide #factfinder-product-list-interaction .grid-row .ff-record-list-item,
  .wh1-styleguide #factfinder-product-records .grid-row .ff-record-list-item,
  .wh1-styleguide #factfinder-campaign-pushed-products .grid-row .ff-record-list-item {
    flex-basis: 50%;
    max-width: 50%;
  }
}
@media (min-width: 1200px) {
  .wh1-styleguide #factfinder-product-list-item-campaign .grid-row .ff-record-list-item,
  .wh1-styleguide #factfinder-product-list-item-campaign-responsive-voucher .grid-row .ff-record-list-item,
  .wh1-styleguide #factfinder-product-list-interaction .grid-row .ff-record-list-item,
  .wh1-styleguide #factfinder-product-records .grid-row .ff-record-list-item,
  .wh1-styleguide #factfinder-campaign-pushed-products .grid-row .ff-record-list-item {
    flex-basis: 33.333333%;
    max-width: 33.333333%;
  }
}
.wh1-styleguide #product-carousel-related .wh1-styleguide-compare {
  grid-template-columns: 1fr;
}
.wh1-styleguide .wh1-styleguide-row {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  align-items: center;
}
.wh1-styleguide .wh1-styleguide-stack {
  display: grid;
  gap: 12px;
}
.wh1-styleguide .wh1-styleguide-subsection {
  display: grid;
  gap: 10px;
  padding-bottom: 16px;
  border-bottom: 1px solid var(--wh1-color-border);
}
.wh1-styleguide .wh1-styleguide-subsection:last-child {
  padding-bottom: 0;
  border-bottom: 0;
}
.wh1-styleguide .wh1-styleguide-field {
  display: grid;
  gap: 4px;
}
.wh1-styleguide .wh1-styleguide-field > .form-label,
.wh1-styleguide .wh1-styleguide-field > .valid-feedback,
.wh1-styleguide .wh1-styleguide-field > .invalid-feedback {
  margin-top: 0;
  margin-bottom: 0;
}
.wh1-styleguide .wh1-styleguide-subtitle {
  margin: 0 0 14px;
  color: var(--wh1-color-muted);
  font-size: 0.95rem;
  font-weight: 700;
  text-transform: uppercase;
}
.wh1-styleguide .wh1-styleguide-panel-body .wh1-styleguide-subtitle:not(:first-child) {
  margin-top: 28px;
}
.wh1-styleguide .wh1-styleguide-type-scale {
  display: grid;
  gap: 12px;
  margin-bottom: 24px;
}
.wh1-styleguide .wh1-styleguide-type-scale h1,
.wh1-styleguide .wh1-styleguide-type-scale h2,
.wh1-styleguide .wh1-styleguide-type-scale h3,
.wh1-styleguide .wh1-styleguide-type-scale h4,
.wh1-styleguide .wh1-styleguide-type-scale h5,
.wh1-styleguide .wh1-styleguide-type-scale h6 {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 8px;
  margin: 0;
}
.wh1-styleguide .wh1-styleguide-type-scale small {
  color: var(--wh1-color-muted);
  font-family: var(--wh1-font-family-base);
  font-size: 12px;
  font-style: normal;
  font-weight: 400;
  line-height: 1.2;
}
.wh1-styleguide .wh1-styleguide-typography-target {
  color: var(--wh1-color-primary);
  font-family: var(--wh1-font-family-base);
  font-size: 14px;
  line-height: 20px;
}
.wh1-styleguide .wh1-styleguide-typography-target p {
  color: var(--wh1-color-primary);
}
.wh1-styleguide .wh1-styleguide-color-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(130px, 1fr));
  gap: 12px;
}
.wh1-styleguide .wh1-styleguide-color {
  border: 1px solid var(--wh1-color-border);
  border-radius: 6px;
  overflow: hidden;
  background: var(--wh1-color-white);
}
.wh1-styleguide .wh1-styleguide-color-swatch {
  height: 58px;
  background: var(--wh1-styleguide-swatch);
}
.wh1-styleguide .wh1-styleguide-color-swatch-checker {
  background: linear-gradient(45deg, var(--wh1-color-apex-e9ecef) 25%, var(--wh1-color-transparent) 25%), linear-gradient(-45deg, var(--wh1-color-apex-e9ecef) 25%, var(--wh1-color-transparent) 25%), linear-gradient(45deg, var(--wh1-color-transparent) 75%, var(--wh1-color-apex-e9ecef) 75%), linear-gradient(-45deg, var(--wh1-color-transparent) 75%, var(--wh1-color-apex-e9ecef) 75%), var(--wh1-styleguide-swatch), var(--wh1-color-white);
  background-position: 0 0, 0 8px, 8px -8px, -8px 0;
  background-size: 16px 16px;
}
.wh1-styleguide .wh1-styleguide-color-body {
  display: grid;
  gap: 5px;
  padding: 10px;
  font-size: 0.8rem;
}
.wh1-styleguide .wh1-styleguide-color-body code {
  word-break: break-word;
}
.wh1-styleguide .wh1-styleguide-color-value {
  color: var(--wh1-color-muted);
  font-family: var(--bs-font-monospace);
  font-size: 0.75rem;
}
.wh1-styleguide .wh1-styleguide-token-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
  gap: 10px;
}
.wh1-styleguide .wh1-styleguide-token {
  display: grid;
  gap: 5px;
  align-content: start;
  padding: 12px;
  background: var(--wh1-color-white);
  border: var(--wh1-border-default);
  border-radius: var(--wh1-radius-sm);
  box-shadow: var(--wh1-shadow-sm);
  font-size: var(--wh1-font-size-sm);
}
.wh1-styleguide .wh1-styleguide-token span {
  color: var(--wh1-color-muted);
  font-family: var(--bs-font-monospace);
  font-size: var(--wh1-font-size-xs);
  word-break: break-word;
}
.wh1-styleguide .wh1-styleguide-state-note {
  margin: 0;
  color: var(--wh1-color-muted);
  font-size: var(--wh1-font-size-sm);
}
.wh1-styleguide .wh1-styleguide-command-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
  gap: var(--wh1-space-sm);
  margin-bottom: var(--wh1-space-md);
}
.wh1-styleguide .wh1-styleguide-command {
  display: grid;
  gap: 6px;
  align-content: start;
  padding: var(--wh1-space-sm);
  background: var(--wh1-color-apex-f8f9fa);
  border: var(--wh1-border-default);
  border-radius: var(--wh1-radius-md);
}
.wh1-styleguide .wh1-styleguide-command code {
  display: block;
  padding: 8px 10px;
  color: var(--wh1-color-primary);
  background: var(--wh1-color-white);
  border: var(--wh1-border-default);
  border-radius: var(--wh1-radius-sm);
  font-size: var(--wh1-font-size-sm);
  white-space: normal;
  word-break: break-word;
}
.wh1-styleguide .wh1-styleguide-command span {
  color: var(--wh1-color-muted);
  font-size: var(--wh1-font-size-sm);
  line-height: 1.4;
}
.wh1-styleguide .wh1-styleguide-state-demo-hover {
  border-color: var(--wh1-color-primary);
}
.wh1-styleguide .wh1-styleguide-state-demo-focus {
  box-shadow: var(--wh1-focus-ring);
}
.wh1-styleguide .wh1-styleguide-compare > .wh1-styleguide-panel:first-child > .wh1-styleguide-panel-body .wh1-styleguide-empty-state {
  color: var(--wh1-color-primary);
}
.wh1-styleguide .wh1-styleguide-button-cta {
  width: min(100%, 275px);
  margin: 8px auto;
}
.wh1-styleguide .wh1-styleguide-empty-state {
  padding: 18px;
  text-align: center;
  color: var(--wh1-color-muted);
  border: var(--wh1-border-default);
  border-radius: var(--wh1-radius-md);
  background: var(--wh1-color-apex-f8f9fa);
}
.wh1-styleguide .wh1-styleguide-copy-row {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin-top: 4px;
}
.wh1-styleguide .wh1-styleguide-copy {
  padding: 4px 7px;
  color: var(--wh1-color-black);
  background: var(--wh1-color-white);
  border: 1px solid var(--wh1-color-border-strong);
  border-radius: 4px;
  font-size: 0.72rem;
  line-height: 1.2;
}
.wh1-styleguide .wh1-styleguide-copy:hover,
.wh1-styleguide .wh1-styleguide-copy:focus {
  border-color: var(--wh1-color-primary);
  color: var(--wh1-color-primary);
}
.wh1-styleguide .wh1-styleguide-copy.is-copied {
  border-color: var(--wh1-color-primary);
  color: var(--wh1-color-white);
  background: var(--wh1-color-primary);
}
.wh1-styleguide .wh1-styleguide-sticky-cart-preview.is-sticky {
  min-height: 0;
  padding-top: 24px;
}
.wh1-styleguide .wh1-styleguide-sticky-cart-preview.is-sticky > .tobasketFunction {
  position: relative;
}
.wh1-styleguide .wh1-styleguide-worker-mode-preview {
  position: relative;
  min-height: 360px;
  overflow: hidden;
  background: linear-gradient(135deg, var(--wh1-color-surface-soft), var(--wh1-color-white) 65%);
}
.wh1-styleguide .wh1-styleguide-worker-mode-preview .wmdk-worker-toggle,
.wh1-styleguide .wh1-styleguide-worker-mode-preview .wmdk-worker-panel {
  position: absolute;
  top: 50%;
  right: 0;
  transform: translateY(-50%);
}
.wh1-styleguide .wh1-styleguide-worker-mode-preview .wmdk-worker-toggle {
  z-index: 2;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 64px;
  padding: 0;
  border-radius: 12px 0 0 12px;
}
.wh1-styleguide .wh1-styleguide-worker-mode-preview .wmdk-worker-panel {
  z-index: 1;
  width: 100%;
  max-height: 320px;
  padding-right: 44px;
}
.wh1-styleguide .wh1-styleguide-worker-mode-preview .wmdk-worker-panel__inner {
  max-height: 320px;
  overflow: auto;
  border-radius: 8px 0 0 8px;
}
.wh1-styleguide .wh1-styleguide-worker-mode-preview .wmdk-worker-table td {
  min-width: 144px;
  vertical-align: top;
}
.wh1-styleguide .wh1-styleguide-worker-mode-preview .wmdk-worker-table td:first-child {
  min-width: 192px;
  font-weight: 600;
}
.wh1-styleguide .wh1-styleguide-worker-mode-preview .wmdk-worker-toggle__icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 20px;
  height: 20px;
}
.wh1-styleguide .wh1-styleguide-worker-mode-preview .wmdk-worker-toggle__icon svg {
  display: block;
  width: 100%;
  height: 100%;
  transform: rotate(180deg);
}
@media (max-width: 991.98px) {
  .wh1-styleguide .wh1-styleguide-shell {
    display: block;
  }
  .wh1-styleguide .wh1-styleguide-nav {
    position: static;
    height: auto;
  }
  .wh1-styleguide .wh1-styleguide-main {
    padding: 20px;
  }
  .wh1-styleguide .wh1-styleguide-compare {
    grid-template-columns: 1fr;
  }
}
/* #70491: isolated scrollable fixtures use the real storefront button/controller. */
.wh1-styleguide .kussin-styleguide-back-to-top-frame {
  width: 100%;
  height: 520px;
  border: 1px solid var(--wh1-color-primary);
}
.wh1-styleguide .kussin-styleguide-back-to-top-mobile {
  max-width: 390px;
}
.wh1-styleguide .kussin-styleguide-scroll-page {
  min-height: 1800px;
  padding: 24px;
}
.wh1-styleguide .kussin-styleguide-trust-placeholder {
  position: fixed;
  right: 20px;
  bottom: 54px;
  width: 93px;
  height: 146px;
  padding: 8px;
  background: var(--wh1-color-surface-soft);
  z-index: 200;
}
.wh1-styleguide .kussin-styleguide-cart-placeholder {
  position: fixed;
  inset: auto 0 0;
  height: 138px;
  padding: 16px;
  background: var(--wh1-color-surface-soft);
  z-index: 1035;
}
@media (max-width: 649.98px) {
  .wh1-styleguide .kussin-styleguide-trust-placeholder {
    bottom: 0;
    height: 60px;
  }
}
.wh1-styleguide .kussin-styleguide-brand-mood-frame {
  width: 100%;
  height: 650px;
  border: 1px solid var(--wh1-color-primary);
}
/* ===================================================================
 * USP bars — prod parity (warehouse-one.de).
 * Content lives in oxcontents: OXLOADID 'oxheaderusps' (top/header
 * meta bar) and 'oxstartusps' (footer USP strip, homepage bottom).
 * =================================================================== */
/* Both bars share .usp-list; render their (new) links as plain text.
 * The #wrapper-prefixed selector out-specifies the theme's `#wrapper a`
 * primary-color rule so the strip's link matches the other items. */
.usp-list a,
.usp-list-content a,
#wrapper .usp-list a {
  color: inherit;
  text-decoration: none;
}
.usp-list a:hover,
.usp-list a:focus,
#wrapper .usp-list a:hover,
#wrapper .usp-list a:focus {
  color: inherit;
  text-decoration: underline;
}
/* Footer USP strip (homepage oxstartusps) — match warehouse-one.de's footer-header:
   a teal band whose four items lay out HORIZONTALLY (icon left, text right),
   left-aligned within four equal columns inside a 1140 shell; the strip stacks to a
   full-width vertical list on mobile (prod's col-xs-12). Prod computed values:
   band visible bg rgb(111,146,150); icon 30px white, margin-right 10px; text Muli
   16px/600 white, line-height 30px; band padding 30px. */
.usp-list-content {
  background: #6f9296;
  /* prod footer-header visible teal (#0F555C @ ~62% over white) */
  padding: 30px 0;
  /* the theme renders .slider-container as a horizontal scroll-snap slider; turn it
     into a static 1140-centred 4-column row. */
  /* each item = one of four columns; icon+text sit left-aligned and horizontal
     (the theme forces flex-direction:column + width:160px — override both). */
  /* (0,3,0) to beat the theme's `.usp-list-content .list-inline-item svg` (40px / mb 20px) */
  /* the "App installieren" item is a real <button> (the PWA install trigger, wired by the
     base_js script) — strip native button chrome so it lays out like the icon+text items. */
}
.usp-list-content .slider-container {
  display: flex;
  flex-wrap: wrap;
  overflow: visible;
  scroll-snap-type: none;
  max-width: 1140px;
  margin: 0 auto;
  padding-inline: 15px;
}
.usp-list-content .list-inline-item {
  flex: 0 0 25%;
  max-width: 25%;
  width: auto;
  min-width: 0;
  margin: 0;
  display: flex;
  flex-direction: row;
  /* was column (icon-over-text) — prod is icon-beside-text */
  align-items: center;
  justify-content: flex-start;
}
.usp-list-content .list-inline-item a {
  display: flex;
  flex-direction: row;
  align-items: center;
}
.usp-list-content .list-inline-item svg {
  width: 30px;
  height: 30px;
  flex: 0 0 30px;
  margin: 0 10px 0 0;
  fill: #fff;
  color: #fff;
}
.usp-list-content .usp-text {
  font-family: 'Muli', sans-serif;
  font-size: 16px;
  font-weight: 600;
  line-height: 30px;
  color: #fff;
  text-align: left;
}
.usp-list-content #pwa-install-btn {
  display: flex;
  align-items: center;
  margin: 0;
  padding: 0;
  border: 0;
  background: none;
  font: inherit;
  color: #fff;
  cursor: pointer;
}
.usp-list-content #pwa-install-btn[disabled] {
  cursor: default;
}
/* mobile: prod stacks the four items full-width (col-xs-12), still icon-left/text-right */
@media (max-width: 767px) {
  .usp-list-content {
    padding: 24px 0;
  }
  .usp-list-content .slider-container {
    flex-direction: column;
  }
  .usp-list-content .list-inline-item {
    flex: 0 0 100%;
    max-width: 100%;
    justify-content: flex-start;
    margin-bottom: 14px;
  }
  .usp-list-content .list-inline-item:last-child {
    margin-bottom: 0;
  }
}
/* #69763 / #70178: neutralise the 52px top margin on the blog-feed support box column — but only
   on the home page. Prod adds that margin to clear the widget's visible "Magazin" heading; the home
   page carries its title in a CMS text cell above the band and hides the widget's own, so there the
   box belongs level with the cards. Everywhere else the heading is shown and the margin has to stay,
   or the box rides 52px above the card next to it. */
.cms-home .col-sm-12.col-xs-12.wmdk-blog-feed-support-content {
  margin-top: 0 !important;
}
/* #69763: Bootstrap 3 responsive-visibility shim.
   The veparse->vetree migration preserves the prod hidden-xs/sm/md/lg classes on
   grid columns (ddoe/visualcms-module composer patches), but APEX is Bootstrap 5
   and ships no .hidden-* CSS, so the preserved classes were inert. Re-add the exact
   Bootstrap 3 visibility breakpoints so those columns hide on the same screens as
   warehouse-one.de. Constructive with VisualCMS's own d-*-none (both hide). */
@media (max-width: 767px) {
  .hidden-xs {
    display: none !important;
  }
}
@media (min-width: 768px) and (max-width: 991px) {
  .hidden-sm {
    display: none !important;
  }
}
@media (min-width: 992px) and (max-width: 1199px) {
  .hidden-md {
    display: none !important;
  }
}
@media (min-width: 1200px) {
  .hidden-lg {
    display: none !important;
  }
}
/* Widen the VisualCMS image-text box (wmdkimagetextbox shortcode). Its shortcode
   template ships an inline \3c style> capping .wmdk-imagetextbox-wrapper at 1140px;
   raise that cap to 1620px. The inline \3c style> renders in the body (after this
   head stylesheet), so match its selector at higher specificity — the box carries
   both `.dd-shortcode-wmdkimagetextbox` and `.wmdk-imagetextbox-wrapper`, so a
   two-class selector wins the cascade without !important. The template already
   centres the box (margin-inline auto), so only the width cap changes. */
.dd-shortcode-wmdkimagetextbox.wmdk-imagetextbox-wrapper {
  max-width: 1620px;
}
/* #70063 — the same box on a phone.
   Measured on /water/kneeboards/ at 390px: production renders it 360px wide inset 15px on both
   sides, while this theme rendered it 400px starting at x=-5 — i.e. 5px wider than the viewport on
   each side, so the panel bled off both edges and read as "not centered". The overflow comes from
   the grid's negative gutter, which has nothing to subtract from at the top level. Pin the box to
   the viewport with prod's 15px gutter. */
@media (max-width: 767.98px) {
  /* Two-class selector for the same reason as the rule above: the shortcode ships its own inline
     \3c style> in the body, which renders after this head stylesheet, so a single-class rule loses the
     cascade to it on equal specificity. */
  .dd-shortcode-wmdkimagetextbox.wmdk-imagetextbox-wrapper {
    max-width: calc(100vw - 30px);
    /* Not `auto`: the CMS markup differs between environments — dev1 still carries the OXID 6
       `col-xs-12` variant whose row measures 410px starting at x=15, so auto margins centre the
       box INSIDE that over-wide row and push it to x=40, i.e. 10px off the right edge. Local's
       newer `col` markup has a 360px row, where auto happens to compute to 0 and hides the bug.
       Anchoring to the column start gives prod's 15px gutter in both. */
    margin-inline: 0;
    padding-inline: 0;
  }
  /* The content-injector wraps CMS output on dev1 and live (it does not locally), and its own
     block sets `.cnc-contentinjector .dd-shortcode-wmdkimagetextbox { margin: 10px 25px }` below
     480px. That is the same specificity as the rule above and comes later, so it wins and pushes
     the box 25px right — 10px past the viewport. Match the wrapper to outrank it. */
  .cnc-contentinjector .dd-shortcode-wmdkimagetextbox.wmdk-imagetextbox-wrapper {
    max-width: calc(100vw - 30px);
    margin-inline: 0;
  }
}
/* "We recommend these products!" (FactFinder campaign-pushed-products) — the FF
   web-components styling hides the LAST record on mobile
   (`@media (max-width: 768px) { … ff-record:last-child { display: none } }`),
   which drops the 4th recommendation and leaves an odd stack. Keep every
   recommended product visible on mobile, as on desktop. Stricter selector
   (body.cl-* scope + campaign class + !important) beats the bundle rule; the
   element carries no inline style, so this override wins cleanly. Restore to
   `block` — the display value the visible sibling records already compute. */
@media (max-width: 768px) {
  body.cl-alist .kussin-factfinder-campaign-pushed-products ff-record:last-child,
  body.cl-search .kussin-factfinder-campaign-pushed-products ff-record:last-child,
  body.cl-manufacturerlist .kussin-factfinder-campaign-pushed-products ff-record:last-child {
    display: block !important;
  }
}
.kussin-faq {
  --kussin-faq-question-color: var(--wh1-color-primary);
  margin-block: 2rem;
}
.kussin-faq [hidden] {
  display: none !important;
}
.kussin-faq .kussin-faq-item {
  border-bottom: 1px solid var(--kussin-faq-question-color);
}
.kussin-faq h3 {
  margin: 0;
}
.kussin-faq h3 > button {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  width: 100%;
  padding: 1rem 0;
  border: 0;
  background: transparent;
  color: var(--kussin-faq-question-color);
  font: inherit;
  text-align: left;
  overflow-wrap: anywhere;
}
.kussin-faq h3 > button::after {
  content: '+';
  flex-shrink: 0;
}
.kussin-faq h3 > button[aria-expanded='true']::after {
  content: '−';
}
.kussin-faq h3 > button:focus-visible {
  outline: 2px solid currentColor;
  outline-offset: 3px;
}
.kussin-faq .kussin-faq-answer {
  padding-bottom: 1rem;
  overflow-wrap: anywhere;
}
.kussin-faq .kussin-faq-answer > :last-child {
  margin-bottom: 0;
}
.kussin-faq [data-kussin-faq-search] {
  margin-bottom: 1rem;
}
/* ===================================================================
 * #70524 — the EU guarantee and GARAN labels from ecs/eu-labels.
 *
 * The module's own sheet sets `margin: 1.5rem 0` on the notice, which pins it to the left edge of
 * whatever holds it. The label is a fixed width block (320px by default), so in the buy box, the
 * cart and the checkout it reads better centred in its column with a tighter gap above and below.
 *
 * The element selector is deliberate: the module's stylesheet loads after this one, so a bare
 * `.ecs-eulabel-notice` would lose on source order at equal specificity.
 * =================================================================== */
section.ecs-eulabel-notice {
  margin: 1rem auto;
}
/* The module's base rule left-aligns the trigger (`.ecs-eulabel-notice__trigger`, one class), so the
   width modifier is enough to win here on specificity alone, no element qualifier needed. Scoped to
   the 320px variant, which is the configured width. If the width setting is ever changed in the
   backend, move this onto the bare `.ecs-eulabel-notice__trigger` instead. */
.ecs-eulabel-notice--width-320 .ecs-eulabel-notice__trigger {
  text-align: center;
}
/* #70524 — on the basket page the notice goes below the coupon box.

   The module's own eulabels.js moves `#ecsEuBasketNotice` to sit directly after `#basket_form`, so
   the cart column holds the cart form, then the notice, then the coupon card, and the notice lands
   above the coupon. The wanted order is the other way round.

   It is done with flex `order` rather than by moving the markup, because neither element's position
   is ours to hold: the notice is placed by the module's script on every load, and the coupon card is
   re-rendered in place by the swap script at the end of summary_sidebar.html.twig whenever a code is
   applied or removed. A DOM change would be undone by one of the two, a layout rule survives both. */
body.cl-basket .col-lg-8:has(> #ecsEuBasketNotice) {
  display: flex;
  flex-wrap: wrap;
}
body.cl-basket .col-lg-8:has(> #ecsEuBasketNotice) > #basket_form {
  flex: 1 1 100%;
}
body.cl-basket .col-lg-8:has(> #ecsEuBasketNotice) > .kussin-voucher-box {
  order: 1;
  /* As a flex item the card would shrink to its content. A full width basis hands it back to its
       own `max-width: 480px`, which is the width it has in normal block flow. */
  flex: 1 1 100%;
}
body.cl-basket .col-lg-8:has(> #ecsEuBasketNotice) > #ecsEuBasketNotice {
  order: 2;
  flex: 1 1 100%;
  /* The coupon card insets its heading and its field by the theme's 20px card padding, while the
       notice sits on the card's outer edge, so the label started 20px to the left of everything it
       is stacked under. The same inset here lines it up with the heading and the code field. The
       number is the card inset the rest of the theme works to, see .kussin-voucher-box in
       components/ui/checkout-steps.less. */
  padding-left: 20px;
}
/* #70425 — last on purpose: the focus ring has to win over every component above. */
/*
  #70425 — keyboard focus that can be seen.

  APEX and Bootstrap mark the focused element with a faint tinted shadow (24 % alpha) or the
  browser's thin default outline. On the photo tiles and the dark header that ring all but vanished,
  so a keyboard user could not tell where they were. Every focus now gets the same two-tone ring:
  a white halo directly on the element and the teal ring outside it, which reads on white, on teal
  and on a photo alike. Only :focus-visible, so a mouse click does not draw it.

  Imported last so it wins over the component styles.
*/
:root {
  --wh1-focus-ring: 0 0 0 2px var(--wh1-color-white), 0 0 0 5px var(--wh1-color-primary);
  --bs-focus-ring-width: 3px;
  --bs-focus-ring-color: rgba(15, 85, 92, 0.9);
}
a:focus-visible,
button:focus-visible,
summary:focus-visible,
[role="button"]:focus-visible,
[tabindex]:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible,
.btn:focus-visible,
.form-control:focus-visible,
.form-select:focus-visible,
.form-check-input:focus-visible {
  outline: 3px solid var(--wh1-color-primary);
  outline-offset: 2px;
  box-shadow: 0 0 0 2px var(--wh1-color-white);
}
/* The skip link: hidden until it is focused (.visually-hidden-focusable), then a button top left. */
.wh1-skip-link {
  position: absolute;
  top: 8px;
  left: 8px;
  z-index: 2000;
  padding: 10px 16px;
  background: var(--wh1-color-primary);
  color: var(--wh1-color-white);
  border-radius: var(--wh1-radius-sm);
  font-weight: 600;
  text-decoration: none;
}
.wh1-skip-link:focus-visible {
  outline: 3px solid var(--wh1-color-white);
  outline-offset: 2px;
  box-shadow: 0 0 0 5px var(--wh1-color-primary);
}
/* The skip link's target takes the focus programmatically; it needs no ring of its own. */
#content:focus {
  outline: 0;
}
