/* normalize.css */
/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
/**
 * 1. Set default font family to sans-serif.
 * 2. Prevent iOS and IE text size adjust after device orientation change,
 *    without disabling user zoom.
 */
html {
  font-family: sans-serif;
  /* 1 */
  -ms-text-size-adjust: 100%;
  /* 2 */
  -webkit-text-size-adjust: 100%;
  /* 2 */
}
/**
 * Remove default margin.
 */
body {
  margin: 0;
}
/* HTML5 display definitions
   ========================================================================== */
/**
 * Correct `block` display not defined for any HTML5 element in IE 8/9.
 * Correct `block` display not defined for `details` or `summary` in IE 10/11
 * and Firefox.
 * Correct `block` display not defined for `main` in IE 11.
 */
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
main,
menu,
nav,
section,
summary {
  display: block;
}
/**
 * 1. Correct `inline-block` display not defined in IE 8/9.
 * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
 */
audio,
canvas,
progress,
video {
  display: inline-block;
  /* 1 */
  vertical-align: baseline;
  /* 2 */
}
/**
 * Prevent modern browsers from displaying `audio` without controls.
 * Remove excess height in iOS 5 devices.
 */
audio:not([controls]) {
  display: none;
  height: 0;
}
/**
 * Address `[hidden]` styling not present in IE 8/9/10.
 * Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.
 */
[hidden],
template {
  display: none;
}
/* Links
   ========================================================================== */
/**
 * Remove the gray background color from active links in IE 10.
 */
a {
  background-color: transparent;
}
/**
 * Improve readability of focused elements when they are also in an
 * active/hover state.
 */
a:active,
a:hover {
  outline: 0;
}
/* Text-level semantics
   ========================================================================== */
/**
 * Address styling not present in IE 8/9/10/11, Safari, and Chrome.
 */
abbr[title] {
  border-bottom: 1px dotted;
}
/**
 * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
 */
b,
strong {
  font-weight: bold;
}
/**
 * Address styling not present in Safari and Chrome.
 */
dfn {
  font-style: italic;
}
/**
 * Address variable `h1` font-size and margin within `section` and `article`
 * contexts in Firefox 4+, Safari, and Chrome.
 */
h1 {
  font-size: 2em;
  margin: 0.67em 0;
}
/**
 * Address styling not present in IE 8/9.
 */
mark {
  background: #ff0;
  color: #000;
}
/**
 * Address inconsistent and variable font size in all browsers.
 */
small {
  font-size: 80%;
}
/**
 * Prevent `sub` and `sup` affecting `line-height` in all browsers.
 */
sub,
sup {
  font-size: 75%;
  line-height: 0;
  position: relative;
  vertical-align: baseline;
}
sup {
  top: -0.5em;
}
sub {
  bottom: -0.25em;
}
/* Embedded content
   ========================================================================== */
/**
 * Remove border when inside `a` element in IE 8/9/10.
 */
img {
  border: 0;
}
/**
 * Correct overflow not hidden in IE 9/10/11.
 */
svg:not(:root) {
  overflow: hidden;
}
/* Grouping content
   ========================================================================== */
/**
 * Address margin not present in IE 8/9 and Safari.
 */
figure {
  margin: 1em 40px;
}
/**
 * Address differences between Firefox and other browsers.
 */
hr {
  box-sizing: content-box;
  height: 0;
}
/**
 * Contain overflow in all browsers.
 */
pre {
  overflow: auto;
}
/**
 * Address odd `em`-unit font size rendering in all browsers.
 */
code,
kbd,
pre,
samp {
  font-family: monospace, monospace;
  font-size: 1em;
}
/* Forms
   ========================================================================== */
/**
 * Known limitation: by default, Chrome and Safari on OS X allow very limited
 * styling of `select`, unless a `border` property is set.
 */
/**
 * 1. Correct color not being inherited.
 *    Known issue: affects color of disabled elements.
 * 2. Correct font properties not being inherited.
 * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
 */
button,
input,
optgroup,
select,
textarea {
  color: inherit;
  /* 1 */
  font: inherit;
  /* 2 */
  margin: 0;
  /* 3 */
}
/**
 * Address `overflow` set to `hidden` in IE 8/9/10/11.
 */
button {
  overflow: visible;
}
/**
 * Address inconsistent `text-transform` inheritance for `button` and `select`.
 * All other form control elements do not inherit `text-transform` values.
 * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
 * Correct `select` style inheritance in Firefox.
 */
button,
select {
  text-transform: none;
}
/**
 * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
 *    and `video` controls.
 * 2. Correct inability to style clickable `input` types in iOS.
 * 3. Improve usability and consistency of cursor style between image-type
 *    `input` and others.
 * 4. CUSTOM FOR WEBFLOW: Removed the input[type="submit"] selector to reduce
 *    specificity and defer to the .w-button selector
 */
button,
html input[type="button"],
input[type="reset"] {
  -webkit-appearance: button;
  /* 2 */
  cursor: pointer;
  /* 3 */
}
/**
 * Re-set default cursor for disabled elements.
 */
button[disabled],
html input[disabled] {
  cursor: default;
}
/**
 * Remove inner padding and border in Firefox 4+.
 */
button::-moz-focus-inner,
input::-moz-focus-inner {
  border: 0;
  padding: 0;
}
/**
 * Address Firefox 4+ setting `line-height` on `input` using `!important` in
 * the UA stylesheet.
 */
input {
  line-height: normal;
}
/**
 * It's recommended that you don't attempt to style these elements.
 * Firefox's implementation doesn't respect box-sizing, padding, or width.
 *
 * 1. Address box sizing set to `content-box` in IE 8/9/10.
 * 2. Remove excess padding in IE 8/9/10.
 */
input[type='checkbox'],
input[type='radio'] {
  box-sizing: border-box;
  /* 1 */
  padding: 0;
  /* 2 */
}
/**
 * Fix the cursor style for Chrome's increment/decrement buttons. For certain
 * `font-size` values of the `input`, it causes the cursor style of the
 * decrement button to change from `default` to `text`.
 */
input[type='number']::-webkit-inner-spin-button,
input[type='number']::-webkit-outer-spin-button {
  height: auto;
}
/**
 * 1. CUSTOM FOR WEBFLOW: changed from `textfield` to `none` to normalize iOS rounded input
 * 2. CUSTOM FOR WEBFLOW: box-sizing: content-box rule removed
 *    (similar to normalize.css >=4.0.0)
 */
input[type='search'] {
  -webkit-appearance: none;
  /* 1 */
}
/**
 * Remove inner padding and search cancel button in Safari and Chrome on OS X.
 * Safari (but not Chrome) clips the cancel button when the search input has
 * padding (and `textfield` appearance).
 */
input[type='search']::-webkit-search-cancel-button,
input[type='search']::-webkit-search-decoration {
  -webkit-appearance: none;
}
/**
 * Define consistent border, margin, and padding.
 */
fieldset {
  border: 1px solid #c0c0c0;
  margin: 0 2px;
  padding: 0.35em 0.625em 0.75em;
}
/**
 * 1. Correct `color` not being inherited in IE 8/9/10/11.
 * 2. Remove padding so people aren't caught out if they zero out fieldsets.
 */
legend {
  border: 0;
  /* 1 */
  padding: 0;
  /* 2 */
}
/**
 * Remove default vertical scrollbar in IE 8/9/10/11.
 */
textarea {
  overflow: auto;
}
/**
 * Don't inherit the `font-weight` (applied by a rule above).
 * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
 */
optgroup {
  font-weight: bold;
}
/* Tables
   ========================================================================== */
/**
 * Remove most spacing between table cells.
 */
table {
  border-collapse: collapse;
  border-spacing: 0;
}
td,
th {
  padding: 0;
}

body{margin:0}


/* cl-article-rail.css */
/* ==========================================================================
   Related articles row. Port of section-related-articles
   (detail_wissenswertes.html, identical CSS on detail_blog.html): a
   .product1_heading bar with the heading and an underlined "Alle Ansehen"
   link, then a .blog_list grid of .blog2_item cards. blog.html's
   .section-blog2 uses the same .blog2_item with the same rules plus an author
   row (.blog-author_link under a .margin-top.margin-small) and an h2 title;
   that row is the only delta and it is not part of this rail.

   From the export:
     .section-related-articles      no rules (transparent)
     .padding-vertical.padding-xhuge  the base-class combo, i.e. cl-base's
                                    .is-tablet-tall (7rem; 991: 8rem; 767: 8/4rem;
                                    479: 3rem)
     .margin-bottom.margin-large    20px at desktop: `.margin-bottom { margin:
                                    0 0 20px }` is declared after the scale
                                    classes, so the scale only wins inside the
                                    breakpoints: 991: 2.5rem   767: 2rem.
                                    cl-base gives 3rem, so the head block has
                                    its own class here.
     .product1_heading              flex, space-between, align centre,
                                    margin-bottom 1rem
                                    991: column, flex-start, row-gap 1rem
                                    767: margin-right 0
     .max-width-medium              35rem   479: font-size 1rem   (cl-base has
                                    the width; the 479 font-size is inert here)
     .heading-medium                2.25rem; 991: 1.75rem; 767: 1.5rem / 1.4;
                                    479: line-height 1.2 (cl-base lacks the 1.4)
     .link-small                    border-bottom 2px cocoa, flex none,
                                    margin-top 1rem, padding-bottom .15rem,
                                    .9rem / 600 / 1.4, inline-block, overflow
                                    hidden, z-index 1000 (inert, static)
     .large-link_underline.is--brown  2px bar, width 100%, margin-top .2rem, cocoa
     .blog_list                     grid 1fr x3, column-gap 2rem, row-gap 4rem
                                    991: 1fr x2   767: 1fr, row-gap 3rem
     .blog-item                     flex, align flex-start
     .blog2_item                    flex column, space-between, width and
                                    height 100%
     .blog-item-content             margin-bottom 1.5rem
     .blog2_image-link              inline-block, width 100%, margin-bottom 1.5rem
     .blog2_image-wrapper           padding-top 66%, relative, overflow hidden
     .blog2_image                   absolute cover
     .blog2_meta-wrapper            flex, column-gap 1rem, align centre,
                                    margin-bottom 1rem
     .pill-medium                   bg pumice, letter-spacing .5px, uppercase,
                                    padding .2rem .4rem, .75rem / 400, inline-block
     .read-time                     flex, column-gap .2rem, flex none, weight 600
     .text-size-small.text-weight-semibold.text-inline  display inline
     .blog2_title-link              margin-bottom .5rem, block, no underline
     h3.text-size-large.text-weight-semibold  1.25rem / 600 / 1.2
                                    767: 1.125rem / 1.35
     .blog2_button-wrapper          margin-top auto, flex
     .button-wrapper                inline-block
     .button-link.with-icon         colour var(--black), flex, align centre,
                                    padding .25rem 0, line-height .8,
                                    column-gap .5rem, no underline
     .button-icon                   .8rem square, flex centre

   The export's cards are CMS-bound and empty (.w-dyn-bind-empty is
   display:none): no image, empty pill, no title, no excerpt. The fixture
   carries real articles, so the card, list and section are taller than the
   export's by the title and excerpt; see the probe file.

   Added round twelve, and not in the export, which never rendered a card with
   content in it:
     - a pumice ground behind the ratio box, and a lucidity ground with the tag
       and the reading time in Sanomat when the article has no image, so a
       missing, dead or slow image is a deliberate card and not a white hole;
     - the title clamps at three lines and the excerpt at two;
     - the author row joins the read-now link in one bottom cluster, pinned by
       the footer, so both align across a row (the rail passes no author, so
       its footer keeps the export's single-row shape);
     - a hover and :focus-within state on the whole card, and a focus ring on
       every link inside it.
   ========================================================================== */

.cl-article-rail { background-color: transparent; }
.cl-article-rail.is-lucidity { background-color: var(--cl-lucidity); }
.cl-article-rail.is-pumice { background-color: var(--cl-pumice); }

/* .margin-bottom.margin-large as the export's cascade resolves it */
.cl-article-rail__head { margin: 0 0 20px; }
/* EU round: on the article page the rail follows the body with no top
   padding of its own; the article's 1.5rem bottom margin is the whole gap
   to the "Related articles" title. Six classes so it outranks cl-base's
   .is-tablet-tall combo at every breakpoint. */
.cl.cl-article-rail .is-tablet-tall.padding-vertical.is-tight-top { padding-top: 0; }

/* .product1_heading */
.cl-article-rail__bar {
  flex: 1;
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: 1rem;
}
.cl-article-rail__bar .pre-heading { margin-bottom: 1rem; }

/* .link-small with .large-link_underline.is--brown inside */
.cl-article-rail__all {
  border-bottom: 2px solid var(--cl-cocoa);
  flex: none;
  margin-top: 1rem;
  padding-bottom: .15rem;
  font-size: .9rem;
  font-weight: 600;
  line-height: 1.4;
  display: inline-block;
  overflow: hidden;
  max-width: 100%;
  color: inherit;
  text-decoration: none;
}
.cl-article-rail__all > span { display: block; }
.cl-article-rail__underline { background-color: var(--cl-cocoa); width: 100%; height: 2px; margin-top: .2rem; }
.cl-article-rail__all:hover { opacity: .7; }

/* .blog_list */
.cl-article-rail__list {
  display: grid;
  grid-template-columns: repeat(var(--cl-rail-cols, 3), 1fr);
  grid-auto-columns: 1fr;
  column-gap: 2rem;
  row-gap: 4rem;
}
/* .blog-item */
.cl-article-rail__item { display: flex; align-items: flex-start; }

/* --------------------------------------------------------------------------
   Card (.blog2_item), rendered by snippets/cl-article-card.liquid
   -------------------------------------------------------------------------- */
.cl-article-card {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  width: 100%;
  height: 100%;
}
.cl-article-card__content { margin-bottom: 1.5rem; }
/* .blog2_image-link.w-inline-block: inline-block with nothing inline inside,
   so its baseline is its margin edge and there is no line gap; vertical-align
   top keeps that true whatever the font metrics */
.cl-article-card__image-link { display: inline-block; vertical-align: top; width: 100%; max-width: 100%; margin-bottom: 1.5rem; color: inherit; }
/* Not from the export: the pumice ground. The ratio box is the export's, but
   the export never had to render an article whose image is slow, gone or
   absent; without a ground those read as a white hole in the row. */
.cl-article-card__image { width: 100%; padding-top: 66%; position: relative; overflow: hidden; background-color: var(--cl-pumice); }
.cl-article-card__image img { object-fit: cover; width: 100%; height: 100%; position: absolute; inset: 0; transition: transform .4s ease; }
.cl-article-card:hover .cl-article-card__image img { transform: scale(1.03); }

/* No image: the same ratio box on a lucidity ground, with the tag and the
   reading time set in the heading face. Decorative, and a repeat of the meta
   row below it, so nothing is lost when it is not read out. */
.cl-article-card__image.is-empty { background-color: var(--cl-lucidity); }
.cl-article-card__ground {
  position: absolute;
  inset: 0;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  align-items: flex-start;
  padding: 1.25rem;
  color: var(--cl-cocoa);
  border-bottom: 2px solid var(--cl-lucid);
}
.cl-article-card__ground-tag {
  font-size: .75rem;
  font-weight: 400;
  letter-spacing: .5px;
  text-transform: uppercase;
  background-color: #fff9;
  padding: .2rem .4rem;
}
.cl-article-card__ground-read {
  font-family: var(--cl-font-heading);
  font-size: 2.5rem;
  line-height: 1;
  display: flex;
  flex-direction: column;
}
.cl-article-card__ground-unit {
  font-family: var(--cl-font-body);
  font-size: .8125rem;
  font-weight: 600;
  line-height: 1.2;
  letter-spacing: .3px;
  margin-top: .35rem;
}
.cl-article-card__meta { display: flex; column-gap: 1rem; align-items: center; margin-bottom: 1rem; min-height: 1.4rem; }
.cl-article-card__pill {
  background-color: var(--cl-pumice);
  letter-spacing: .5px;
  text-transform: uppercase;
  padding: .2rem .4rem;
  font-size: .75rem;
  font-weight: 400;
  display: inline-block;
  color: inherit;
  text-decoration: none;
}
.cl-article-card__read { display: flex; column-gap: .2rem; flex: none; font-weight: 600; }
.cl-article-card__title-link { margin-bottom: .5rem; text-decoration: none; color: inherit; display: block; max-width: 100%; }
.cl-article-card .cl-article-card__title { line-height: 1.2; }

/* Not from the export. One contract for every card: the title clamps at three
   lines and the excerpt at two, so a long headline or a long summary cannot
   set the height of its row. -webkit-line-clamp is the only clamp Safari has;
   every engine the theme targets supports the -webkit- prefixed form. */
.cl-article-card__title,
.cl-article-card__excerpt {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.cl-article-card__title { -webkit-line-clamp: 3; }
.cl-article-card__excerpt { -webkit-line-clamp: 2; }

/* The bottom cluster: the author row and the read link, pinned together, so
   both align across a row whatever the title and excerpt above them do. */
.cl-article-card__footer { margin-top: auto; display: flex; flex-direction: column; align-items: flex-start; row-gap: .75rem; }
.cl-article-card__button-wrap { display: inline-block; }
.cl-article-card__link {
  color: var(--cl-black);
  background-color: transparent;
  display: flex;
  align-items: center;
  column-gap: .5rem;
  padding: .25rem 0;
  line-height: .8;
  text-decoration: none;
  max-width: 100%;
}
.cl-article-card__link:hover { text-decoration: underline; }
.cl-article-card__icon { display: flex; flex-direction: column; justify-content: center; align-items: center; width: .8rem; height: .8rem; transition: transform .18s ease; }
.cl-article-card__icon svg { width: 100%; height: 100%; display: block; }

/* Not from the export: a hover state on the whole card, not only the image.
   The title underlines, the chevron slides, the ground darkens a shade. The
   card is not a link, so this is driven from :hover on the card and from
   :focus-within, which keeps the same feedback on the keyboard path. */
.cl-article-card:hover .cl-article-card__title-link,
.cl-article-card:focus-within .cl-article-card__title-link { text-decoration: underline; text-underline-offset: .12em; }
.cl-article-card:hover .cl-article-card__icon,
.cl-article-card:focus-within .cl-article-card__icon { transform: translateX(.2rem); }
.cl-article-card:hover .cl-article-card__image.is-empty { background-color: var(--cl-lucid); }
.cl-article-card__image.is-empty { transition: background-color .25s ease; }
.cl-article-card__pill { transition: background-color .18s ease, color .18s ease; }
a.cl-article-card__pill:hover { background-color: var(--cl-cocoa); color: var(--cl-white); }
/* the ring sits inside the box so a clipped image link cannot cut it */
.cl-article-card a:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: -2px; }

@media screen and (max-width: 991px) {
  .cl-article-rail__head { margin-bottom: 2.5rem; text-align: left; }
  .cl-article-rail__bar { flex-direction: column; justify-content: flex-start; align-items: flex-start; row-gap: 1rem; }
  .cl-article-rail__list { grid-template-columns: 1fr 1fr; }
}
@media screen and (max-width: 767px) {
  .cl-article-rail__head { margin-bottom: 2rem; }
  .cl-article-rail__bar { margin-right: 0; }
  .cl-article-rail__list { row-gap: 3rem; grid-template-columns: 1fr; }
  .cl-article-rail .heading-medium { line-height: 1.4; }
  .cl-article-card .cl-article-card__title { line-height: 1.35; }
}
@media screen and (max-width: 479px) {
  .cl-article-rail .heading-medium { line-height: 1.2; }
}
@media (prefers-reduced-motion: reduce) {
  .cl-article-card__image img,
  .cl-article-card__icon,
  .cl-article-card__pill,
  .cl-article-card__image.is-empty { transition: none; }
  .cl-article-card:hover .cl-article-card__icon,
  .cl-article-card:focus-within .cl-article-card__icon { transform: none; }
}

/* Author row (live blog grid), now the first line of the bottom cluster:
     .margin-top.margin-small > .blog-author_link   flex, align center, gap .5rem
     .blog-author_image1   2rem round            .text-style-link  underlined name */
.cl-article-card__author-row { display: flex; }
.cl-article-card__author { display: flex; align-items: center; column-gap: .5rem; justify-content: flex-start; color: inherit; text-decoration: none; }
.cl-article-card__avatar { width: 2rem; height: 2rem; border-radius: 5rem; object-fit: cover; flex: none; }
.cl-article-card__author .text-style-link { text-decoration: underline; text-underline-offset: .15em; }


/* cl-base.css */
/* ==========================================================================
   Clearlight base: tokens, spacing, type, layout, buttons.

   Ported from the Webflow build. Every value here was read out of
   reference/webflow/css/clearlight-saunas-germany.css, not eyeballed.

   Scoping
   -------
   Everything except the token block is scoped under .cl, so it cannot collide
   with the Concept theme's 344KB theme.css. Wrap any ported section in .cl.

   Why this file is short
   ---------------------
   The Webflow stylesheet carries 287 numeric-suffixed duplicate classes
   across 98 families (31 byte-identical to their base, 211 differing, 45 with
   no base at all), plus 14 more on a "-copy" suffix. On top of that it writes
   one rule per spacing combo, so .margin-bottom alone has 25 rules that all
   say the same three declarations.

   Both problems collapse here. Spacing sizes set a custom property and their
   own all-round value; direction classes come after and restrict it. Because
   custom properties resolve at use time, a responsive size only needs
   redeclaring once. That turns roughly 180 Webflow spacing rules into 27.

   Every collapsed class and the exact delta is recorded in docs/DEDUPE-MAP.md.
   ========================================================================== */

:root {
  /* Brand, from the Clearlight palette (round eighteen, 2026-08-27):
     Oxygen, Lucid, Volition, Nimbus, Zeal, Stratos, Terra. The Webflow
     build's cocoa and black both collapse to Volition, its greys become
     Nimbus tints. The old values and every literal they replaced are in
     tools/palette.mjs, which is what rewrote the section stylesheets. */
  --cl-white: #fff;             /* Oxygen */
  --cl-lucid: #ead8cb;          /* Lucid */
  --cl-cocoa: #251f20;          /* Volition: the ink and the dark fill */
  --cl-night: #050402;          /* the Black Friday artwork's own black (banner edges); campaign hero panel and sticky bar only */
  --cl-black: #251f20;          /* Volition again; the alias stays for the rules that read it */
  --cl-nimbus: #dedcdb;         /* Nimbus: hairlines and neutral fills */
  --cl-dark-red: #801c00;       /* Zeal: accents, error states, the accent fill */
  --cl-zeal: var(--cl-dark-red);
  --cl-stratos: #014560;        /* Stratos: available, used only where the export already had it */
  --cl-terra: #00433f;          /* Terra */
  --cl-golden: #db9729;         /* not in the palette: star-rating glyphs only */

  /* tints, mixed over white */
  --cl-lucidity: #f9f3ef;       /* Lucid 30%  — the light warm band */
  --cl-pumice: #eeedec;         /* Nimbus 50% */
  --cl-light-grey: #f5f4f4;     /* Nimbus 30% */
  /* Round eighteen: the one colour the brand sheet has no word for, a field
     that validates. Terra (#00433f) is the site's green but reads as teal at
     18px on white; this is the same hue family a step lighter, 4.6:1 on
     lucidity. Used only by .cl-field.is-valid. */
  --cl-valid: #1f7a4b;
  /* Round twenty: the same two states on a photo ground (the e-book and
     catalogue heroes, cl-contact-form.is-hero). Zeal and --cl-valid are
     1.5:1 on a dark photo; these are the hue families lifted until they
     read there (7:1 on #333), used with a 2px ring and a tinted fill so
     the state still carries where a photo runs light. */
  --cl-valid-on-dark:   #8ad8ab;
  --cl-invalid-on-dark: #ffb4a3;

  --cl-font-heading: "Sanomat", Georgia, serif;
  --cl-font-body: "Adelle Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;

  /* Volition at an opacity, named by the percentage so #251f2040 reads as
     ink-25 wherever it lands: hairlines, veils, scrims, muted type, the
     scrollbar. One token per opacity the stylesheets already used more than
     once; a one-off stays a literal #251f20xx. */
  --cl-ink-4:  #251f200a;
  --cl-ink-8:  #251f2014;
  --cl-ink-10: #251f201a;
  --cl-ink-12: #251f201f;
  --cl-ink-13: #251f2021;
  --cl-ink-14: #251f2024;
  --cl-ink-15: #251f2026;
  --cl-ink-16: #251f2029;
  --cl-ink-20: #251f2033;
  --cl-ink-22: #251f2038;
  --cl-ink-25: #251f2040;
  --cl-ink-28: #251f2047;
  --cl-ink-35: #251f2059;
  --cl-ink-40: #251f2066;
  --cl-ink-50: #251f2080;
  --cl-ink-60: #251f2099;
  --cl-ink-61: #251f209c;
  --cl-ink-65: #251f20a6;
  --cl-ink-70: #251f20b3;
  --cl-ink-75: #251f20bf;
  --cl-line: var(--cl-ink-25);  /* checkbox, radio and input hairlines (was the warm #b9a495) */

  /* Interaction steps for every button (see "Button interaction" below). Two
     opaque tones for a filled pill, two veils for a pill with no fill of its
     own. Nothing here is a new colour: the tones are Volition (or Zeal, for
     the accent pill) mixed with the brand's own lucid and black, the veils are
     Volition and white at low alpha. */
  --cl-cocoa-lift:  #413938;    /* Volition + 14% lucid — hover on a Volition fill */
  --cl-cocoa-press: #1c1718;    /* Volition x .75       — the press, and text-link hover ink */
  --cl-red-lift:    #8f361c;    /* Zeal + 14% lucid     — hover on a Zeal fill (.is-gold) */
  --cl-red-press:   #601500;    /* Zeal x .75           — its press */
  --cl-veil:        var(--cl-ink-10);  /* Volition 10%   — hover on a light/unfilled pill */
  --cl-veil-press:  #251f202e;  /* Volition 18%         — its press */
  --cl-veil-light:  #ffffff26;  /* white 15%            — the same two steps on a dark ground */
  --cl-veil-light-press: #ffffff40;
  --cl-focus:      var(--cl-cocoa);  /* focus ring, swapped to white on dark variants */
  --cl-focus-halo: var(--cl-white);  /* the 2px gap between pill and ring */
  /* the .is-done check, masked so it takes currentColor and no webfont */
  --cl-check: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'%3E%3Cpath d='M2.1 6.3l2.6 2.6 5.2-5.6' fill='none' stroke='%23000' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
}

/* --------------------------------------------------------------------------
   Document scrollbar and scroll lock. Top level on purpose: the viewport is
   not inside .cl.

   scrollbar-gutter keeps the scrollbar's space reserved while an overlay
   sets overflow: hidden on <html>, so the page does not shift sideways by a
   scrollbar width every time a drawer or the mobile menu opens (classic
   scrollbars: Windows, headless Chrome; macOS overlay scrollbars never took
   space). The gutter is drawn thin, in cocoa at 40%, so the reserved strip
   reads as part of the page. The -webkit- rules are the same for Safari.

   html.cl-lock is the one lock every overlay toggles: cl-topbar.liquid's two
   drawers and cl-nav.liquid's mobile menu. A class, not an inline style, so
   nothing has to save and restore whatever overflow was there before.
   -------------------------------------------------------------------------- */
html {
  scrollbar-gutter: stable;
  scrollbar-width: thin;
  scrollbar-color: var(--cl-ink-40) transparent;
}
html::-webkit-scrollbar { width: 8px; }
html::-webkit-scrollbar-thumb { background: var(--cl-ink-40); border-radius: 8px; }
html.cl-lock { overflow: hidden; }
/* The UA sheet's 8px body margin. The preview harness resets it in its own
   shell, which is how it went unnoticed until the store showed a gap down the
   left of the nav and the hero. */
body { margin: 0; }

/* Blur-up images: .cl-lqip is the tiny blurred copy under the real one,
   .cl-fade the real one, transparent until it has loaded (the script in
   theme.liquid marks it is-loaded; a browser without the script just shows
   it, since the class only lowers opacity when the script is present). */
html.cl-js .cl-fade { opacity: 0; transition: opacity .35s ease; }
html.cl-js .cl-fade.is-loaded { opacity: 1; }
.cl-lqip { pointer-events: none; user-select: none; transition: opacity .35s ease; }
.cl-lqip:has(+ .cl-fade.is-loaded) { opacity: 0; }

/* --------------------------------------------------------------------------
   Base
   -------------------------------------------------------------------------- */

.cl {
  color: var(--cl-cocoa);
  font-family: var(--cl-font-body);
  font-size: 1rem;
  font-weight: 300;
  line-height: 1.5;
}

.cl *,
.cl *::before,
.cl *::after { box-sizing: border-box; }

/* Every export page carries an inline `* { -webkit-font-smoothing: antialiased;
   -moz-osx-font-smoothing: grayscale }` in its head ("please keep this css code
   to improve the font quality"). Without it every glyph renders about a fifth
   heavier on macOS; no probe can see it. -webkit-appearance: none from the
   same rule is left to the form controls that need it. */
.cl,
.cl * { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }

.cl h1, .cl h2, .cl h3 { margin: 0; line-height: 1.2; }
.cl h4 { margin: 0; line-height: 1.3; }
.cl h5 { margin: 0; font-size: 1.5rem; font-weight: 700; line-height: 1.4; }
.cl h6 { margin: 0; font-size: 1.25rem; font-weight: 700; line-height: 1.4; }
.cl p  { margin: 0; }            /* UA sheet gives p margin-block: 1em; the export
                                    only zeroes the bottom, which leaked 28px into
                                    any heading slot that used a <p> */
.cl .text-rich-text p,
.cl .cl-richtext p { margin: 0 0 .5rem; }
.cl img { max-width: 100%; display: inline-block; vertical-align: middle; }   /* components.css: img {vertical-align: middle} */
.cl ul { margin: 1rem 0; padding-left: 1.25rem; }
.cl ol { margin: 1rem 0; padding-left: 2.5rem; }
.cl li { margin-bottom: .5rem; }
.cl blockquote {
  border-left: .1875rem solid var(--cl-black);
  margin-bottom: 0;
  padding: .75rem 1.25rem;
  font-size: 1.45rem;
  line-height: 1.5;
}

/* Webflow's stylesheet sets `a { text-decoration: line-through }` globally and
   then fights it everywhere. Not ported. */

.cl .hide { display: none; }
.cl .overflow-hidden { overflow: hidden; }
.cl .z-index-1 { position: relative; z-index: 1; }

/* --------------------------------------------------------------------------
   Spacing scale

   margin-* and padding-* share one set of values in the export, so they share
   one scale here. A size class sets --cl-space and applies it on all sides,
   matching Webflow. A direction class then restricts it, and must come after.
   -------------------------------------------------------------------------- */

.cl .margin-0       { --cl-space: 0;      margin: var(--cl-space); }
.cl .margin-tiny    { --cl-space: .25rem; margin: var(--cl-space); }
.cl .margin-xxsmall { --cl-space: .5rem;  margin: var(--cl-space); }
.cl .margin-xsmall  { --cl-space: 1rem;   margin: var(--cl-space); }
.cl .margin-small   { --cl-space: 1.5rem; margin: var(--cl-space); }
.cl .margin-medium  { --cl-space: 2rem;   margin: var(--cl-space); }
.cl .margin-large   { --cl-space: 3rem;   margin: var(--cl-space); }
.cl .margin-xlarge  { --cl-space: 4rem;   margin: var(--cl-space); }
.cl .margin-xxlarge { --cl-space: 5rem;   margin: var(--cl-space); }
.cl .margin-huge    { --cl-space: 6rem;   margin: var(--cl-space); }
.cl .margin-xhuge   { --cl-space: 7rem;   margin: var(--cl-space); }
.cl .margin-xxhuge  { --cl-space: 10rem;  margin: var(--cl-space); }

.cl .padding-0       { --cl-space: 0;      padding: var(--cl-space); }
.cl .padding-tiny    { --cl-space: .25rem; padding: var(--cl-space); }
.cl .padding-xxsmall { --cl-space: .5rem;  padding: var(--cl-space); }
.cl .padding-xsmall  { --cl-space: 1rem;   padding: var(--cl-space); }
.cl .padding-small   { --cl-space: 1.5rem; padding: var(--cl-space); }
.cl .padding-medium  { --cl-space: 2rem;   padding: var(--cl-space); }
.cl .padding-large   { --cl-space: 3rem;   padding: var(--cl-space); }
.cl .padding-xlarge  { --cl-space: 4rem;   padding: var(--cl-space); }
.cl .padding-xxlarge { --cl-space: 5rem;   padding: var(--cl-space); }
.cl .padding-huge    { --cl-space: 6rem;   padding: var(--cl-space); }
.cl .padding-xhuge   { --cl-space: 7rem;   padding: var(--cl-space); }
.cl .padding-xxhuge  { --cl-space: 10rem;  padding: var(--cl-space); }

/* Opt-in for the export's .padding-vertical + .padding-xhuge combo, which
   overrides the scale on the sections built with the base .padding-vertical
   (the reviews bar and the FAQ). Sections built on Webflow's numbered copies
   (.padding-vertical-4 on the hero, -13 on the CTA banner) never triggered it,
   which is the one case where a numbered duplicate changed behaviour rather
   than just repeating itself. Because the breakpoints are max-width, each step
   inherits the last: 991 pushes both sides to 8rem, 767 only pulls the bottom
   back to 4rem, 479 resets both to 3rem. */
.cl .is-tablet-tall.padding-vertical.padding-xhuge { padding-top: 7rem; padding-bottom: 7rem; }

/* direction restrictors, after the sizes so they win on equal specificity */
.cl .margin-top        { margin: var(--cl-space, 0) 0 0; }
.cl .margin-bottom     { margin: 0 0 var(--cl-space, 0); }
.cl .margin-vertical   { margin: var(--cl-space, 0) 0; }
.cl .margin-horizontal { margin: 0 var(--cl-space, 0); }

.cl .padding-top        { padding: var(--cl-space, 0) 0 0; }
.cl .padding-bottom     { padding: 0 0 var(--cl-space, 0); }
.cl .padding-vertical   { padding: var(--cl-space, 0) 0; }
.cl .padding-horizontal { padding: 0 var(--cl-space, 0); }

/* --------------------------------------------------------------------------
   Layout
   -------------------------------------------------------------------------- */

/* The page shell. layout/theme.liquid must carry these two. The export's
   .main-wrapper had padding-top: 2rem to sit under a fixed nav; the nav is a
   normal-flow sticky block now, so the shell needs no clearance and the hero
   carries its own top spacing. */
.cl.page-wrapper { background-color: transparent; flex-direction: column; min-height: 100vh; display: flex; }
.cl .main-wrapper { padding-top: 0; position: relative; }

/* Round nineteen: on the store the shell is Concept's .page-container and the
   footer group sits inside it after <main>. Concept's theme.css makes that
   group `position: absolute; z-index: -1` (its own footer reveals from behind
   the page). An absolutely positioned child of a flex container takes the
   container's top edge as its static position, so on every German page the
   footer landed at the top, behind the hero and over the cart, the blog and
   the search results. Back in normal flow inside our shell; the Concept
   markets never carry .cl.page-wrapper, so their footer keeps its trick. */
.cl.page-wrapper > .footer-group { position: static; z-index: auto; }

.cl .page-padding { padding-left: 5%; padding-right: 5%; }

.cl .container-small  { width: 100%; max-width: 52rem;  margin-inline: auto; display: block; }
.cl .container-medium { width: 100%; max-width: 64rem;  margin-inline: auto; }
.cl .container-large  { width: 100%; max-width: 80rem;  margin-inline: auto; }
.cl .container-xlarge { width: 100%; max-width: 100rem; margin-inline: auto; }

.cl .max-width-small   { width: 100%; max-width: 30rem; }
.cl .max-width-medium  { width: 100%; max-width: 35rem; }
.cl .max-width-large   { width: 100%; max-width: 48rem; }
.cl .max-width-xlarge  { width: 100%; max-width: 64rem; }
.cl .max-width-full    { width: 100%; max-width: none; }
.cl .align-center { margin-inline: auto; }

/* --------------------------------------------------------------------------
   Type
   -------------------------------------------------------------------------- */

.cl .heading-xlarge,
.cl .heading-large,
.cl .heading-medium,
.cl .heading-small,
.cl .heading-xsmall {
  font-family: var(--cl-font-heading);
  font-weight: 400;
}

.cl .heading-xlarge  { font-size: 5rem;   letter-spacing: -1.5px; line-height: 1.1; }
.cl .heading-xlarge.is-compact { letter-spacing: -1px; }
/* The export's .heading-large carries no letter-spacing; the -1px that used to
   sit here belongs to the .heading-xlarge twins. .heading-small's .5rem bottom
   margin and 1.4 leading are the export's own. line-height is restated on the
   class so it also applies on a <div>, which the .cl h1-h3 reset does not reach. */
.cl .heading-large   { font-size: 3rem;   line-height: 1.2; }
.cl .heading-medium  { font-size: 2.25rem; line-height: 1.2; }
.cl .heading-small   { font-size: 1.5rem; line-height: 1.4; margin-bottom: .5rem; }
.cl .heading-xsmall  { font-size: 1.25rem; }

.cl .text-size-tiny    { font-size: .75rem; }
.cl .text-size-small   { font-size: .875rem; }
.cl .text-size-regular { font-size: 1rem; }
.cl .text-size-medium  { font-size: 1.125rem; }
.cl .text-size-large   { font-size: 1.25rem; font-weight: 400; text-transform: none; }

/* Section lead paragraph. 1.75rem / 400 / 1.4 is where two of the export's
   three lead classes agreed (.text-large-3 and .subheading-large), so it is the
   canonical size. The third, .subheading-large-8 on the live promo slide, ran
   1.875rem with line-height 1.24 inherited from .text-weight-bold; .is-large
   reproduces it exactly for anyone who needs that slide pixel-identical. */
.cl .text-lead { font-size: 1.75rem; font-weight: 400; line-height: 1.4; }
.cl .text-lead.is-large { font-size: 1.875rem; line-height: 1.24; }

.cl .text-weight-light    { font-weight: 300; }
.cl .text-weight-normal   { font-weight: 400; }
.cl .text-weight-medium   { font-weight: 500; }
.cl .text-weight-semibold { font-weight: 600; }
.cl .text-weight-bold     { font-weight: 700; line-height: 1.24; }
.cl .text-weight-xbold    { font-weight: 800; }

.cl .text-align-left   { text-align: left; }
.cl .text-align-center { text-align: center; }
.cl .text-align-right  { text-align: right; }

.cl .text-color-white  { color: var(--cl-white); }
.cl .text-color-black  { color: var(--cl-black); }
.cl .text-color-cocoa  { color: var(--cl-cocoa); }
.cl .text-color-gold   { color: var(--cl-dark-red); }  /* the accent; gold is for stars only (round eighteen) */
.cl .text-color-lucid  { color: var(--cl-lucid); }

.cl .text-style-allcaps   { text-transform: uppercase; }
.cl .text-style-italic    { font-style: italic; }
.cl .text-style-underline { text-decoration: underline; }
.cl .text-style-nowrap    { white-space: nowrap; }
.cl .text-style-muted     { opacity: .6; }
.cl .text-inline          { display: inline; }
.cl .is-capitalized       { letter-spacing: .5px; text-transform: uppercase; }

/* --------------------------------------------------------------------------
   Buttons

   .button and .button-secondary are copied declaration for declaration. The
   export's hover is not: it only shifted the label to lucid and left the
   ground alone, so a filled pill went muddy while an outline pill did nothing
   at all. Every interaction state now lives in one place, "Button
   interaction" below.
   -------------------------------------------------------------------------- */

.cl .button,
.cl .button-secondary {
  min-width: 12rem;
  text-align: center;
  letter-spacing: 1.5px;
  text-transform: uppercase;
  border-radius: 100px;
  justify-content: center;
  align-items: center;
  padding: .75rem 1.5rem;
  font-size: .813rem;
  font-weight: 500;
  text-decoration: none;
  display: flex;
}

.cl .button {
  column-gap: .4rem;
  border: 1px solid var(--cl-cocoa);
  background-color: var(--cl-cocoa);
  color: var(--cl-white);
}

.cl .button-secondary {
  border: 1px solid var(--cl-cocoa);
  background-color: transparent;
  color: var(--cl-black);
}

/* modifiers */
/* A white pill only ever sits on a photo or a dark band, so its focus ring
   flips: white ring, cocoa halo, which is legible on both. */
.cl .button.is-white {
  color: var(--cl-cocoa);
  background-color: var(--cl-white);
  border-color: var(--cl-white);
  --cl-focus: var(--cl-white);
  --cl-focus-halo: var(--cl-cocoa);
}
/* Was the export's #131313 fill. The client wants every call to action in
   the accent, never black, so the "dark" fill is cocoa; the class stays for
   the templates that already carry it. */
.cl .button.is-dark {
  color: var(--cl-white);
  background-color: var(--cl-cocoa);
  border-color: var(--cl-cocoa);
}
/* The accent pill. Was golden with cocoa ink (5.0:1); round eighteen takes
   gold out of everything but the stars, so it is Zeal with white ink, which
   measures 10.1:1. (Nothing ships .is-gold today; the class is kept for the
   templates and passes if one uses it.) */
.cl .button.is-gold {
  border-color: var(--cl-dark-red);
  background-color: var(--cl-dark-red);
  color: var(--cl-white);
}
.cl .button.invert-colors,
.cl .button-secondary.invert-colors {
  border-color: var(--cl-white);
  color: var(--cl-white);
  background-color: transparent;
  flex-wrap: nowrap;
  --cl-focus: var(--cl-white);
  --cl-focus-halo: var(--cl-ink-75);
}
.cl .button.button-small {
  letter-spacing: 1px;
  min-width: auto;
  padding: .6rem 1.25rem .5rem;
}
.cl .button-secondary.button-small { min-width: auto; padding: .5rem 1.25rem; }
/* The bar's three weights: filled cocoa, outline, plain. */
.cl .button.is-navbar {
  background-color: var(--cl-cocoa);
  border-color: var(--cl-cocoa);
  letter-spacing: 1px;
  min-width: auto;
  padding: .6rem 2rem .5rem;
}
.cl .button.is-navbar.is-secondary {
  border-color: var(--cl-cocoa);
  color: var(--cl-cocoa);
  background-color: transparent;
}
.cl .button.is-navbar.is-plain {
  border-color: transparent;
  color: var(--cl-cocoa);
  background-color: transparent;
}

/* .button-secondary-4 in the export is .button-secondary with #131313 in place
   of var(--cocoa) for border and text. Collapsed; the 4px of colour difference
   between cocoa and near-black is not a design decision. */

/* Section eyebrow. .pre-heading in the export, which has ten numbered twins.
   The base carries weight 600 and a 4rem top margin; the twins used on the
   full-image and video sections drop to 400 with no top margin, which is
   .is-plain here. */
.cl .pre-heading {
  letter-spacing: 1px;
  text-transform: uppercase;
  margin-top: 4rem;
  margin-bottom: 2rem;
  font-size: .875rem;
  font-weight: 600;
}
.cl .pre-heading.is-plain { margin-top: 0; font-weight: 400; }
.cl .pre-heading.is-light { margin-bottom: 1rem; font-weight: 300; }

/* Hero eyebrow (round nineteen, client 2026-08-28): the letter-spaced line
   over the hero's heading ("Infrarot + Rotlichttherapie"), lifted out of
   cl-hero.css so the Stories band's head can carry the same one. Mixed
   case, .25rem tracking at 1.3rem, weight 400, 1rem under it; 1rem on a
   phone. */
.cl .cl-eyebrow {
  letter-spacing: .25rem;
  margin-bottom: 1rem;
  font-size: 1.3rem;
  font-weight: 400;
}
@media screen and (max-width: 479px) {
  .cl .cl-eyebrow { font-size: 1rem; line-height: 1.3; }
}

.cl .shadow { box-shadow: 0 4px 30px #0000001f; }

/* Underlined text link, .link-large in the export. */
.cl .link-large {
  border-bottom: 2px solid var(--cl-cocoa);
  flex: none;
  margin-top: 1rem;
  padding-bottom: .15rem;
  font-weight: 400;
  display: inline-block;
  position: relative;
  overflow: hidden;
  color: inherit;
  text-decoration: none;
}
.cl .link-large.is-white {
  border-bottom-color: var(--cl-white);
  color: var(--cl-white);
  --cl-focus: var(--cl-white);
  --cl-focus-halo: var(--cl-ink-75);
}

.cl .button-row { column-gap: 1rem; row-gap: 1rem; flex-wrap: wrap; align-items: center; display: flex; }
.cl .button-row.is-button-row-center { justify-content: center; }
.cl .button-row.is-button-row-right  { justify-content: flex-end; }

/* --------------------------------------------------------------------------
   Button interaction: one language, every variant
   (client, 2026-08-25: "button hover is odd and off brand", round 13 item 17)

   What it was: four different answers to the same gesture. A filled pill kept
   its ground and turned its label lucid, which reads as the label fading. An
   outline pill did nothing. The navbar's outline pill inverted to a cocoa fill
   and the plain one went #f4f4f4 grey, the only neutral grey in the palette.
   A text link dropped to opacity .7, which reads as disabled and takes the
   contrast down with it. None of it was timed, so all of it snapped.

   What it is: the pill steps one notch, never flips.
     filled       the ground moves to the next brand tone
                  (Volition -> Volition+lucid on hover, Volition x .75 pressed;
                   white -> lucidity -> lucid) and the ink never moves
     unfilled     the ground gains a veil of its own ink (cocoa 10%, 18%
                  pressed) and the label goes cocoa with it. The veil is an
                  alpha and not a hex because the same rule has to read on
                  white, on lucid (the CTA banner's ground) and on pumice. On
                  a dark ground the veil is white instead.
     text link    .button-tertiary and the drawer's "Weiter einkaufen" have a
                  box, so they take the veil too. .link-large has none, so it
                  takes the ink half of the step: it and its underline deepen
                  to Volition x .75. Contrast goes up, not down; nothing dims.
   Plus, on all three: 140ms ease on colour only (nothing moves, no shadow),
   an unmistakable two-tone :focus-visible ring, and a press that is one step
   past hover in the same direction.

   Section files may still override a variant they own; the two that do are
   cl-hero's frosted CTA (already a white veil, one step deeper than its
   resting scrim) and cl-footer's newsletter pill.
   -------------------------------------------------------------------------- */

.cl .button,
.cl .button-secondary,
.cl .button-tertiary,
.cl .link-large,
.cl .cl-cart__continue {
  transition: background-color 140ms ease, border-color 140ms ease, color 140ms ease;
}

/* Webflow's a:hover underlines; the pills never do. */
.cl .button:hover,
.cl .button-secondary:hover,
.cl .button-tertiary:hover { text-decoration: none; }

/* --- filled: the ground steps, the ink holds ----------------------------- */
.cl .button:hover           { background-color: var(--cl-cocoa-lift);  border-color: var(--cl-cocoa-lift); }
.cl .button:active          { background-color: var(--cl-cocoa-press); border-color: var(--cl-cocoa-press); }
.cl .button.is-white:hover  { background-color: var(--cl-lucidity);    border-color: var(--cl-lucidity); }
.cl .button.is-white:active { background-color: var(--cl-lucid);       border-color: var(--cl-lucid); }
/* The accent pill steps like the Volition one, on its own two tones. */
.cl .button.is-gold:hover  { background-color: var(--cl-red-lift);  border-color: var(--cl-red-lift); }
.cl .button.is-gold:active { background-color: var(--cl-red-press); border-color: var(--cl-red-press); }

/* --- unfilled: a veil of the button's own ink ---------------------------- */
/* The label goes cocoa with it: warm ink over a warm veil is the difference
   between this and the #f4f4f4 grey it replaces. */
.cl .button-secondary:hover,
.cl .button.is-navbar.is-secondary:hover,
.cl .button.is-navbar.is-plain:hover,
.cl .button-tertiary:hover,
.cl .cl-cart__continue:hover {
  background-color: var(--cl-veil);
  color: var(--cl-cocoa);
}
.cl .button-secondary:active,
.cl .button.is-navbar.is-secondary:active,
.cl .button.is-navbar.is-plain:active,
.cl .button-tertiary:active,
.cl .cl-cart__continue:active { background-color: var(--cl-veil-press); }

/* on a photo or a dark band the veil is white. Kept at .invert-colors
   specificity so a section that owns the variant (cl-hero) still wins. */
.cl .button.invert-colors:hover,
.cl .button-secondary.invert-colors:hover  { background-color: var(--cl-veil-light); }
.cl .button.invert-colors:active,
.cl .button-secondary.invert-colors:active { background-color: var(--cl-veil-light-press); }

/* --- text links: the ink deepens ----------------------------------------
   .link-large is the one control with no box to fill: inline-block, 2px of
   underline and .15rem of padding, so a veil would clamp to the glyphs. It
   takes the ink half of the same step instead, and the underline follows.
   ---------------------------------------------------------------------- */
.cl .link-large:hover  { color: var(--cl-cocoa-press); border-bottom-color: var(--cl-cocoa-press); }
.cl .link-large:active { color: var(--cl-black);       border-bottom-color: var(--cl-black); }
/* the two that do have a box keep their underline in step with the veil */
.cl .button-tertiary:hover,
.cl .cl-cart__continue:hover  { border-bottom-color: var(--cl-cocoa); }
.cl .button-tertiary:active,
.cl .cl-cart__continue:active { color: var(--cl-cocoa-press); border-bottom-color: var(--cl-cocoa-press); }
/* on a dark ground the step is towards lucid instead */
.cl .link-large.is-white:hover  { color: var(--cl-lucid); border-bottom-color: var(--cl-lucid); }
.cl .link-large.is-white:active { color: var(--cl-white); border-bottom-color: var(--cl-white); }

/* --- focus: one ring, two tones, so it reads on paper and on a photo ----- */
.cl .button:focus-visible,
.cl .button-secondary:focus-visible,
.cl .button-tertiary:focus-visible,
.cl .link-large:focus-visible,
.cl .cl-cart__continue:focus-visible {
  outline: 2px solid var(--cl-focus);
  outline-offset: 2px;
  box-shadow: 0 0 0 2px var(--cl-focus-halo);
}

@media (prefers-reduced-motion: reduce) {
  .cl .button,
  .cl .button-secondary,
  .cl .button-tertiary,
  .cl .link-large,
  .cl .cl-cart__continue { transition: none; }
}

/* --------------------------------------------------------------------------
   Waiting and done, shared (round 13 items 18 and 19)

   Two classes any control can carry, and the only contract between the
   delegated CTA script in layout/theme.liquid and a section that runs its own
   request (the product page's add-to-cart). Both marks are ::after on the
   control itself, so a section only has to toggle the class:

     .is-loading   spinner after the label, pointer events off. The script
                   swaps the label for its data-wait text and sets aria-busy;
                   a section that only toggles the class keeps its own label.
     .is-done      check mark, and terra, the palette's green, under it.

   The spinner keeps turning under prefers-reduced-motion, slower: it is the
   only thing saying the click was heard, and WCAG 2.2.2 exempts motion that
   carries the status. Nothing else about the state moves.
   -------------------------------------------------------------------------- */

.cl .is-loading,
.cl .is-done { pointer-events: none; column-gap: .4rem; }
.cl .is-loading { cursor: default; }

.cl .is-loading::after,
.cl .is-done::after {
  content: "";
  flex: none;
  display: inline-block;
  width: .875em;
  height: .875em;
  box-sizing: border-box;
}
.cl .is-loading::after {
  border: 2px solid currentColor;
  border-right-color: transparent;
  border-radius: 50%;
  animation: cl-spin 640ms linear infinite;
}
.cl .is-done::after {
  background-color: currentColor;
  -webkit-mask: var(--cl-check) center / contain no-repeat;
  mask: var(--cl-check) center / contain no-repeat;
}
.cl .button.is-done,
.cl .button-secondary.is-done,
.cl .button.is-navbar.is-done {
  background-color: var(--cl-terra);
  border-color: var(--cl-terra);
  color: var(--cl-white);
}

@keyframes cl-spin { to { transform: rotate(360deg); } }

@media (prefers-reduced-motion: reduce) {
  .cl .is-loading::after { animation-duration: 1400ms; }
}

/* --------------------------------------------------------------------------
   Media
   -------------------------------------------------------------------------- */

.cl .image-overlay { z-index: 1; background-color: #00000040; position: absolute; inset: 0; }
.cl .image-overlay.is-dark     { background-color: #2b1d1061; }
.cl .image-overlay.is-gradient { background-image: linear-gradient(84deg, var(--cl-ink-50), #08080800); }

.cl .image_cover-absolute {
  object-fit: cover;
  width: 100%;
  height: 100%;
  position: absolute;
  inset: 0;
}

.cl .icon-1x1-xsmall { width: 1rem;    height: 1rem; }
.cl .icon-1x1-small  { width: 2rem;    height: 2rem; }
.cl .social-icon     { width: 1.3rem;  height: 1.3rem; flex: none; flex-direction: column; justify-content: center; align-items: center; display: flex; }

/* --------------------------------------------------------------------------
   Breakpoints. Webflow uses three: 991, 767, 479.

   Spacing only needs the changed value redeclared, because the all-round and
   direction rules both read --cl-space at use time.
   -------------------------------------------------------------------------- */

@media screen and (max-width: 991px) {
  .cl .margin-large   { --cl-space: 2.5rem; }
  .cl .margin-xlarge  { --cl-space: 3.5rem; }
  .cl .margin-xxlarge { --cl-space: 4.5rem; }
  .cl .margin-huge    { --cl-space: 5rem; }
  .cl .margin-xhuge   { --cl-space: 6rem; }
  .cl .margin-xxhuge  { --cl-space: 7.5rem; }

  .cl .padding-large   { --cl-space: 2.5rem; }
  .cl .padding-xlarge  { --cl-space: 3.5rem; }
  .cl .padding-xxlarge { --cl-space: 4.5rem; }
  .cl .padding-huge    { --cl-space: 5rem; }
  .cl .padding-xhuge   { --cl-space: 6rem; }
  .cl .padding-xxhuge  { --cl-space: 7.5rem; }

  .cl .is-tablet-tall.padding-vertical.padding-xhuge { text-align: center; padding-top: 8rem; padding-bottom: 8rem; }

  .cl .heading-xlarge  { font-size: 5rem; }
  .cl .heading-large   { font-size: 2.25rem; }
  .cl .heading-medium  { font-size: 1.75rem; }
}

@media screen and (max-width: 767px) {
  .cl .pre-heading { font-size: .8rem; }

  .cl .margin-xsmall  { --cl-space: .75rem; }
  .cl .margin-small   { --cl-space: 1.25rem; }
  .cl .margin-medium  { --cl-space: 1.5rem; }
  .cl .margin-large   { --cl-space: 2rem; }
  .cl .margin-xlarge  { --cl-space: 2.5rem; }
  .cl .margin-xxlarge { --cl-space: 3rem; }
  .cl .margin-huge    { --cl-space: 3.5rem; }
  .cl .margin-xhuge   { --cl-space: 4rem; }
  .cl .margin-xxhuge  { --cl-space: 5rem; }

  .cl .padding-xsmall  { --cl-space: .75rem; }
  .cl .padding-small   { --cl-space: 1.25rem; }
  .cl .padding-medium  { --cl-space: 1.5rem; }
  .cl .padding-large   { --cl-space: 2rem; }
  .cl .padding-xlarge  { --cl-space: 2.5rem; }
  .cl .padding-xxlarge { --cl-space: 3rem; }
  .cl .padding-huge    { --cl-space: 3.5rem; }
  .cl .padding-xhuge   { --cl-space: 4rem; }
  .cl .padding-xxhuge  { --cl-space: 5rem; }

  .cl .is-tablet-tall.padding-vertical.padding-xhuge { text-align: left; padding-bottom: 4rem; }

  .cl .heading-xlarge  { font-size: 3.5rem; }
  .cl .heading-large   { font-size: 2rem; }
  .cl .heading-medium  { font-size: 1.5rem; line-height: 1.4; }
  .cl .heading-small   { font-size: 1.25rem; }
  .cl .heading-xsmall  { font-size: 1.125rem; }

  .cl .text-size-large  { font-size: 1.125rem; line-height: 1.35; }
  .cl .text-size-medium { font-size: 1rem; }
  .cl .text-lead,
  .cl .text-lead.is-large { font-size: 1.6rem; }
}

@media screen and (max-width: 479px) {
  .cl .is-tablet-tall.padding-vertical.padding-xhuge { padding-top: 3rem; padding-bottom: 3rem; }

  /* the export's 2.7 / 2.5 read too big on a phone (client, 2026-08-25) */
  .cl .heading-xlarge  { font-size: 2.4rem; }
  .cl .heading-xlarge.is-compact { font-size: 2.2rem; }
  .cl .heading-large   { font-size: 1.8rem; line-height: 1.3; }
  .cl .heading-medium  { line-height: 1.2; }

  .cl .text-lead { font-size: 1.3rem; line-height: 1.3; }
  .cl .text-lead.is-large { font-size: 1.125rem; }

  .cl .button,
  .cl .button-secondary { min-width: 14.5rem; }
  .cl .button-row { flex-direction: column; align-items: stretch; }
  .cl .button-row.is-button-row-center { align-items: center; }
}

/* --------------------------------------------------------------------------
   Product card and grid, shared by the carousel, collection pages and any
   product rail. Card geometry matches .product_image-wrapper in the export:
   a pumice aspect box at 67%.
   -------------------------------------------------------------------------- */

.cl .cl-card { text-decoration: none; color: inherit; display: flex; flex-direction: column; }
.cl .cl-card__image {
  background-color: var(--cl-pumice);
  width: 100%;
  padding-top: 67%;
  position: relative;
  overflow: hidden;
  margin-bottom: 1rem;
  display: block;
}
.cl .cl-card__image img {
  object-fit: cover;
  width: 100%;
  height: 100%;
  position: absolute;
  inset: 0;
  transition: transform .4s ease;
}
.cl .cl-card:hover .cl-card__image img { transform: scale(1.03); }
.cl .cl-card__badge {
  position: absolute;
  top: .75rem;
  left: .75rem;
  z-index: 1;
  background: var(--cl-cocoa);
  color: var(--cl-white);
  font-size: .75rem;
  letter-spacing: .5px;
  text-transform: uppercase;
  padding: .25rem .6rem;
  border-radius: 100px;
}
.cl .cl-card__badge.is-muted { background: #00000066; }
.cl .cl-card__body { display: flex; flex-direction: column; row-gap: .25rem; }
.cl .cl-card__price s { margin-left: .4rem; }

.cl .cl-grid {
  display: grid;
  grid-template-columns: repeat(var(--cl-grid-cols, 3), 1fr);
  column-gap: 1.5rem;
  row-gap: 4rem;
}

.cl .cl-skip-link {
  position: absolute;
  left: -9999px;
  top: 0;
  background: var(--cl-white);
  color: var(--cl-cocoa);
  padding: .75rem 1.25rem;
  z-index: 2000;
}
.cl .cl-skip-link:focus { left: 0; }

@media screen and (max-width: 991px) {
  .cl .cl-grid { grid-template-columns: repeat(2, 1fr); column-gap: 2rem; }
}
@media screen and (max-width: 767px) {
  .cl .cl-grid { grid-template-columns: 1fr; column-gap: 1.25rem; row-gap: 3rem; }
}
@media (prefers-reduced-motion: reduce) {
  .cl .cl-card__image img { transition: none; }
}

/* --------------------------------------------------------------------------
   Rich text. Renders page bodies, article bodies, product descriptions and
   FAQ answers, i.e. everything coming across from the Webflow CMS.
   -------------------------------------------------------------------------- */

.cl .cl-richtext > *:first-child { margin-top: 0; }
.cl .cl-richtext > *:last-child  { margin-bottom: 0; }
.cl .cl-richtext p { margin: 0 0 1rem; }
.cl .cl-richtext h2 {
  font-family: var(--cl-font-heading);
  font-size: 2.25rem;
  font-weight: 400;
  line-height: 1.2;
  margin: 2.5rem 0 1rem;
}
.cl .cl-richtext h3 {
  font-family: var(--cl-font-heading);
  font-size: 1.5rem;
  font-weight: 400;
  line-height: 1.3;
  margin: 2rem 0 .75rem;
}
.cl .cl-richtext h4 { font-size: 1.125rem; font-weight: 600; margin: 1.5rem 0 .5rem; }
.cl .cl-richtext h5,
.cl .cl-richtext h6 { margin: 1.25rem 0 1rem; }   /* .text-rich-text h5, h6 */
.cl .cl-richtext ul,
.cl .cl-richtext ol { margin: 0 0 1rem; padding-left: 1.5rem; }
.cl .cl-richtext li { margin-bottom: .4rem; }
.cl .cl-richtext a { color: inherit; text-decoration: underline; text-underline-offset: .15em; }
.cl .cl-richtext img { height: auto; margin: 1.5rem 0; }
.cl .cl-richtext blockquote { margin: 1.5rem 0; }
.cl .cl-richtext table { width: 100%; border-collapse: collapse; margin: 1.5rem 0; }
.cl .cl-richtext th,
.cl .cl-richtext td { border-bottom: 1px solid #00000026; padding: .6rem .5rem; text-align: left; }
.cl .cl-richtext figure { margin: 1.5rem 0; }
.cl .cl-richtext figcaption { font-size: .875rem; opacity: .8; border-left: 2px solid var(--cl-cocoa); padding-left: .5rem; margin-top: .5rem; }

/* wide content must scroll inside itself, never the page */
.cl .cl-richtext table,
.cl .cl-richtext pre { display: block; overflow-x: auto; max-width: 100%; }

/* A heading that carries .text-align-center is centred, whatever the
   section's own heading rule says (the Webflow export lost this to source
   order in three sections; client, 2026-08-25). */
.cl .heading-large.text-align-center,
.cl .heading-medium.text-align-center,
.cl .heading-xlarge.text-align-center { text-align: center; }

/* ==========================================================================
   Round eighteen: fields (2026-08-27, Sauna-Finder item 7)

   The validation pattern every form in the theme can adopt; the quiz's lead
   form is the first. Behaviour and markup are documented in
   snippets/cl-validate.liquid, which carries the script. In short: a field is
   neutral until it has been focused, filled and blurred; then a green check
   for a valid value, a red X plus an error line for an invalid one; and from
   that first register on it re-validates on every keystroke.

   Ported from neverover's Form/Input register (ValidatedInput.tsx): the
   1.5px state ring is an inset shadow because Chromium floors fractional
   border widths, the glyph sits in an 18px trailing slot inside the field,
   the message row sits under it. Colours are the theme's: cocoa for focus,
   dark red for the error, --cl-valid for the check.

   .cl-field            the wrapper; takes .is-valid / .is-invalid
   .cl-field__label     the label above
   .cl-field__control   position: relative, holds input + state glyph
   .cl-field__input     the input (or select / textarea)
   .cl-field__state     the glyph slot, one check and one X inside
   .cl-field__error     the message row, hidden until there is a message
   .cl-field.is-phone   a country control before the input (see .cl-phone
                        in cl-quiz.css for the first implementation)
   ========================================================================== */
.cl .cl-field { display: flex; flex-direction: column; gap: .375rem; min-width: 0; text-align: left; }
.cl .cl-field__label { font-size: .8125rem; letter-spacing: .04em; opacity: .8; }
.cl .cl-field__control { position: relative; display: flex; align-items: stretch; min-width: 0; }
.cl .cl-field__input {
  appearance: none;
  width: 100%; min-width: 0; min-height: 3.25rem;
  padding: .75rem 2.75rem .75rem 1rem;
  border: 1px solid var(--cl-ink-22); border-radius: .625rem;
  background: var(--cl-white); color: var(--cl-cocoa);
  font: inherit; font-size: 1rem; line-height: 1.4;
  transition: border-color .15s ease, box-shadow .15s ease;
}
.cl .cl-field__input::placeholder { color: #251f2073; }
.cl .cl-field__input:focus { outline: 0; border-color: var(--cl-cocoa); box-shadow: inset 0 0 0 1px var(--cl-cocoa); }
.cl .cl-field.is-valid .cl-field__input { border-color: var(--cl-valid); box-shadow: inset 0 0 0 1px var(--cl-valid); }
.cl .cl-field.is-invalid .cl-field__input { border-color: var(--cl-dark-red); box-shadow: inset 0 0 0 1px var(--cl-dark-red); }
/* the glyph slot: 18px, centred on the field's height, never in the way */
.cl .cl-field__state {
  position: absolute; right: .875rem; top: 50%;
  width: 1.125rem; height: 1.125rem;
  transform: translateY(-50%);
  pointer-events: none;
}
.cl .cl-field__state svg { display: none; width: 100%; height: 100%; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
.cl .cl-field.is-valid .cl-field__state { color: var(--cl-valid); }
.cl .cl-field.is-valid .cl-field__state .cl-field__ok { display: block; }
.cl .cl-field.is-invalid .cl-field__state { color: var(--cl-dark-red); }
.cl .cl-field.is-invalid .cl-field__state .cl-field__bad { display: block; }
.cl .cl-field__error { margin: 0; font-size: .8125rem; line-height: 1.4; color: var(--cl-dark-red); }
.cl .cl-field__error[hidden] { display: none; }
@media (prefers-reduced-motion: reduce) {
  .cl .cl-field__input { transition: none; }
}


/* cl-campaign-bar.css */
/* ==========================================================================
   CL Campaign bar. The fixed countdown strip of a sale campaign.

   No Webflow original. cl-base.css provides .button/.button-small and the
   page gutter (.page-padding); only the strip, the compact clock and the
   slide-in are below.

   Fixed against the viewport, under the nav bar on desktop (--cl-nav-h is the
   bar's bottom edge, written by cl-nav.js) and at the bottom edge on phones.
   It never takes layout space, so nothing shifts when it appears; it slides
   in from behind the nav (or up from the bottom) once the hero is scrolled
   past. z-index 900 sits under the nav's 1000 so open menus paint over it.
   ========================================================================== */

.cl-campaign-bar {
  position: fixed;
  top: var(--cl-nav-h, 0px);
  left: 0;
  right: 0;
  z-index: 900;
  transform: translateY(-100%);
  visibility: hidden;
  transition: transform .32s cubic-bezier(.2, .7, .2, 1), visibility 0s linear .32s;
  background-color: var(--cl-night);
  color: var(--cl-white);
  box-shadow: 0 1px 0 #ffffff14;
}
.cl-campaign-bar.is-visible { transform: none; visibility: visible; transition-delay: 0s; }
.cl-campaign-bar.is-cocoa { background-color: var(--cl-cocoa); }
.cl-campaign-bar.is-zeal  { background-color: var(--cl-zeal); }

.cl-campaign-bar__inner {
  display: flex;
  align-items: center;
  justify-content: center;
  column-gap: 1.5rem;
  row-gap: .5rem;
  min-height: 3rem;
  padding-top: .375rem;
  padding-bottom: .375rem;
}

/* The line: label · clock · detail, one row, tabular digits so the row does
   not jitter as the seconds change. The <p> is reset by `.cl p`, so the
   margin is restated here at (0,2,0). */
.cl-campaign-bar .cl-campaign-bar__text {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  column-gap: .75rem;
  row-gap: .125rem;
  margin: 0;
  font-size: .875rem;
  line-height: 1.4;
  min-width: 0;
}
.cl-campaign-bar__lead { letter-spacing: .06em; text-transform: uppercase; font-size: .75rem; opacity: .85; }
.cl-campaign-bar__clock {
  font-family: var(--cl-font-heading);
  font-size: 1.25rem;
  line-height: 1;
  font-variant-numeric: tabular-nums;
  font-feature-settings: "tnum";
  white-space: nowrap;
}
.cl-campaign-bar__u   { font-family: var(--cl-font-body); font-size: .75rem; margin: 0 .5rem 0 .3rem; opacity: .7; }
.cl-campaign-bar__sep { opacity: .6; }
.cl-campaign-bar__expired { font-family: var(--cl-font-body); font-size: .875rem; }
.cl-campaign-bar__clock [hidden] { display: none; }
.cl-campaign-bar__detail { opacity: .85; }
.cl-campaign-bar__detail::before { content: "·"; margin-right: .75rem; opacity: .6; }

/* The button: the base pill at its small size, no 12rem minimum in a 3rem bar. */
.cl-campaign-bar .cl-campaign-bar__cta { min-width: 0; padding: .5rem 1.125rem; font-size: .75rem; letter-spacing: 1px; flex: 0 0 auto; }

/* --------------------------------------------------------------------------
   Breakpoints, in the build's order: 991, 767, 479.
   -------------------------------------------------------------------------- */
@media screen and (max-width: 991px) {
  .cl-campaign-bar__detail { display: none; }
}

@media screen and (max-width: 767px) {
  /* Bottom edge on phones: the button lands under the thumb. */
  .cl-campaign-bar {
    top: auto;
    bottom: 0;
    transform: translateY(100%);
    padding-bottom: env(safe-area-inset-bottom, 0px);
    box-shadow: 0 -1px 0 #ffffff14;
  }
  .cl-campaign-bar__inner { justify-content: space-between; column-gap: 1rem; min-height: 3.5rem; }
  .cl-campaign-bar .cl-campaign-bar__text { flex-direction: column; row-gap: 0; align-items: flex-start; }
  /* Labels run to 23 characters ("Gratis Rückenlehne noch"). Tighter
     tracking and a smaller button keep them to two lines at most beside the
     button at 375px, inside the 3.5rem bar. */
  .cl-campaign-bar__lead { font-size: .625rem; letter-spacing: .04em; }
  .cl-campaign-bar__clock { font-size: 1.125rem; }
  .cl-campaign-bar .cl-campaign-bar__cta { padding: .5rem .875rem; font-size: .6875rem; letter-spacing: .5px; }
}

@media (prefers-reduced-motion: reduce) {
  .cl-campaign-bar { transition: none; }
}


/* cl-campaign-hero.css */
/* ==========================================================================
   CL Campaign hero. The phase-switchable campaign hero and its countdown.

   No Webflow original: the Black Friday pages in reference/webflow/campaigns
   were 404 on the live site and never ported. Built from cl-base.css
   primitives; the geometry follows cl-page-hero and cl-hero.

   cl-base.css already provides: .page-padding, .container-*, .padding-vertical,
   .padding-*, .button, .image-overlay(.is-dark/.is-gradient), .text-align-*.
   Only the two layouts, the trust pill, the clock and the on-dark colour flips
   are below.

   Round two (2026-09-22): `is-split` puts the artwork beside the copy on a
   panel in the artwork's own black (--cl-night), the trust widget sits above
   the kicker, the clock carries a label, and the separate offer line is gone.
   ========================================================================== */

.cl-campaign-hero { position: relative; background-color: var(--cl-lucid); color: var(--cl-cocoa); overflow: hidden; }
.cl-campaign-hero.is-night    { background-color: var(--cl-night); color: var(--cl-white); }
.cl-campaign-hero.is-cocoa    { background-color: var(--cl-cocoa); color: var(--cl-white); }
.cl-campaign-hero.is-pumice   { background-color: var(--cl-pumice); }
.cl-campaign-hero.is-lucidity { background-color: var(--cl-lucidity); }

/* --------------------------------------------------------------------------
   Split: copy left, artwork right, one row.

   46/54: the banners are 16:9 with the cabin dead-centre; at 54% of 1440 the
   right column is ~780px and cover-cropping the 16:9 into it keeps the towel
   and its type whole while the empty black to either side is what gets cut.
   The min-height matches the reference hero (889px at 1440) so the page
   starts where the other landing pages start.
   -------------------------------------------------------------------------- */
.cl-campaign-hero.is-split .cl-campaign-hero__grid {
  display: grid;
  grid-template-columns: minmax(0, 46fr) minmax(0, 54fr);
  min-height: 54rem;
}
/* Client, 2026-09-22: the copy panel read as stuffed against the nav. The
   padding-vertical chain gives the copy its own air (the template sets
   `huge`, 6rem); this keeps a floor under it so a shorter phase's copy still
   starts a comfortable way below the bar. */
.cl-campaign-hero.is-split .cl-campaign-hero__copy .padding-vertical { padding-top: max(var(--cl-space, 0px), 5rem); padding-bottom: max(var(--cl-space, 0px), 5rem); }
.cl-campaign-hero.is-split .cl-campaign-hero__copy  { grid-column: 1; grid-row: 1; display: flex; align-items: center; }
.cl-campaign-hero.is-split .cl-campaign-hero__media { grid-column: 2; grid-row: 1; position: relative; min-height: 100%; }
.cl-campaign-hero.is-split .cl-campaign-hero__inner { width: 100%; }
/* The grid sits in the page's own gutter + container chain (the frame), so
   its edges line up with every section below. The copy keeps a 3rem gap to
   the artwork on its inner edge. */
.cl-campaign-hero__frame { position: relative; z-index: 1; }
.cl-campaign-hero.is-split .cl-campaign-hero__copy { padding-right: 3rem; }
.cl-campaign-hero.is-split .cl-campaign-hero__column { width: 100%; }
.cl-campaign-hero.is-split .cl-campaign-hero__content { max-width: 36rem; }

.cl-campaign-hero__pic { display: block; width: 100%; height: 100%; }
.cl-campaign-hero__media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
  display: block;
}
.cl-campaign-hero.is-split .cl-campaign-hero__pic,
.cl-campaign-hero.is-split .cl-campaign-hero__media img { position: absolute; inset: 0; }

/* --------------------------------------------------------------------------
   Cover: the artwork is the background, the copy sits on it (round one's
   layout, kept for photography that has room for type).
   -------------------------------------------------------------------------- */
.cl-campaign-hero.is-cover { display: flex; align-items: center; min-height: 52rem; color: var(--cl-white); }
.cl-campaign-hero.is-cover .cl-campaign-hero__grid { position: relative; width: 100%; display: flex; align-items: center; min-height: 52rem; }
.cl-campaign-hero.is-cover .cl-campaign-hero__media { position: absolute; inset: 0; overflow: hidden; }
.cl-campaign-hero.is-cover .cl-campaign-hero__copy  { position: relative; z-index: 2; width: 100%; }
.cl-campaign-hero.is-cover:not(.has-media) { min-height: 0; display: block; }
.cl-campaign-hero.is-cover:not(.has-media) .cl-campaign-hero__grid { min-height: 0; }
.cl-campaign-hero.is-cover .cl-campaign-hero__content { max-width: 48rem; }
.cl-campaign-hero.is-cover .cl-campaign-hero__content.text-align-center { margin-inline: auto; }

/* --------------------------------------------------------------------------
   The copy. These are <p> and <h1> elements, and cl-base.css resets them with
   `.cl p` (0,1,1). A bare `.cl-campaign-hero__note` is (0,1,0) and loses, so
   every rule is scoped under the section root, (0,2,0).
   -------------------------------------------------------------------------- */

/* Trust pill: the homepage hero's treatment (cl-hero.css), so the two heroes
   read as one system. Three classes deep because cl-trust.css's
   .cl-trust.is-large loads later. */
.cl-campaign-hero .cl-campaign-hero__trust { display: flex; margin-bottom: 1.5rem; }
.cl-campaign-hero .text-align-center .cl-campaign-hero__trust { justify-content: center; }
.cl-campaign-hero .cl-campaign-hero__trust .cl-trust.is-large {
  padding: 0;
  border: 0;
  background: none;
  color: inherit;
  flex-wrap: nowrap;
  justify-content: flex-start;
  column-gap: .625rem;
  font-size: .875rem;
}
.cl-campaign-hero .cl-campaign-hero__trust .cl-trust.is-large .cl-trust__avatar { width: 1.75rem; height: 1.75rem; border-width: 1.5px; border-color: #ffffffcc; font-size: .5625rem; }
.cl-campaign-hero .cl-campaign-hero__trust .cl-trust.is-large .cl-trust__avatar + .cl-trust__avatar { margin-left: -.55rem; }
.cl-campaign-hero .cl-campaign-hero__trust .cl-trust.is-large .cl-trust__stars { column-gap: .1875rem; }
.cl-campaign-hero .cl-campaign-hero__trust .cl-trust.is-large .cl-trust__star { width: 1rem; height: 1rem; }
.cl-campaign-hero .cl-campaign-hero__trust .cl-trust.is-large .cl-trust__text { white-space: nowrap; }
.cl-campaign-hero .cl-campaign-hero__trust a.cl-trust:hover .cl-trust__text { text-decoration: underline; text-underline-offset: .15em; }

/* Kicker + chip. Lucid on the dark grounds so it reads as the accent line. */
.cl-campaign-hero .cl-campaign-hero__kicker {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: .625rem;
  font-size: .8125rem;
  letter-spacing: .12em;
  text-transform: uppercase;
  margin: 0 0 1.25rem;
}
.cl-campaign-hero.is-night .cl-campaign-hero__kicker,
.cl-campaign-hero.is-cocoa .cl-campaign-hero__kicker,
.cl-campaign-hero.is-cover .cl-campaign-hero__kicker { color: var(--cl-lucid); }
.cl-campaign-hero .text-align-center .cl-campaign-hero__kicker { justify-content: center; }
/* The one saturated accent on the page: Zeal, for the VIP tag only. */
.cl-campaign-hero .cl-campaign-hero__chip {
  display: inline-block;
  padding: .3rem .6rem .25rem;
  border-radius: 100px;
  background-color: var(--cl-zeal);
  color: var(--cl-white);
  font-size: .6875rem;
  font-weight: 600;
  letter-spacing: .14em;
  line-height: 1;
}

/* The headline: the offer itself, the page's one xlarge step. Fluid so a
   46% column at 1200 does not wrap a five-word offer onto four lines. */
.cl-campaign-hero .cl-campaign-hero__heading {
  font-family: var(--cl-font-heading);
  font-weight: 400;
  font-size: clamp(2.75rem, 4.4vw, 4.5rem);
  line-height: 1.06;
  letter-spacing: -1px;
  margin: 0 0 1.25rem;
}
.cl-campaign-hero .cl-campaign-hero__lead {
  font-size: 1.25rem;
  line-height: 1.5;
  margin: 0;
  max-width: 34rem;
}
.cl-campaign-hero .text-align-center .cl-campaign-hero__lead { margin-inline: auto; }

/* Small print: a step down from body, quiet. */
.cl-campaign-hero .cl-campaign-hero__note {
  font-size: .875rem;
  line-height: 1.5;
  margin: 1.25rem 0 0;
  opacity: .72;
  max-width: 34rem;
}

/* --------------------------------------------------------------------------
   The clock. A label saying what it counts, then four fixed-width cells so
   the row does not jitter as the digits change; tabular digits for the same
   reason.
   -------------------------------------------------------------------------- */
.cl-campaign-hero .cl-campaign-hero__timer { margin-top: 2rem; }
.cl-campaign-hero .cl-campaign-hero__timer-label {
  font-size: .75rem;
  letter-spacing: .12em;
  text-transform: uppercase;
  margin: 0 0 .75rem;
  opacity: .8;
}
.cl-campaign-hero .cl-campaign-hero__timer-units {
  display: flex;
  column-gap: 2rem;
  row-gap: 1rem;
  flex-wrap: wrap;
}
.cl-campaign-hero .text-align-center .cl-campaign-hero__timer-units { justify-content: center; }
.cl-campaign-hero .cl-campaign-hero__unit { display: flex; flex-direction: column; align-items: flex-start; min-width: 4rem; }
.cl-campaign-hero .text-align-center .cl-campaign-hero__unit { align-items: center; }
.cl-campaign-hero .cl-campaign-hero__num {
  font-family: var(--cl-font-heading);
  font-size: 3rem;
  line-height: 1;
  font-variant-numeric: tabular-nums;
  font-feature-settings: "tnum";
}
.cl-campaign-hero .cl-campaign-hero__unit-label {
  font-size: .6875rem;
  letter-spacing: .1em;
  text-transform: uppercase;
  margin-top: .5rem;
  opacity: .65;
}
/* The <time> is what a visitor without JS sees; the script hides it on the
   first tick. */
.cl-campaign-hero .cl-campaign-hero__timer-fallback { font-size: 1rem; display: block; }
.cl-campaign-hero .cl-campaign-hero__expired { font-size: 1.125rem; margin: 0; }
.cl-campaign-hero .cl-campaign-hero__timer [hidden] { display: none; }

/* --------------------------------------------------------------------------
   Actions: one button, one quiet link.
   -------------------------------------------------------------------------- */
.cl-campaign-hero .cl-campaign-hero__actions {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  column-gap: 1.5rem;
  row-gap: 1rem;
  margin-top: 2rem;
}
.cl-campaign-hero .text-align-center .cl-campaign-hero__actions { justify-content: center; }
.cl-campaign-hero .cl-campaign-hero__link {
  color: inherit;
  font-size: .9375rem;
  text-decoration: underline;
  text-underline-offset: .2em;
  text-decoration-color: #ffffff80;
}
.cl-campaign-hero .cl-campaign-hero__link:hover { text-decoration-color: currentColor; }

/* --------------------------------------------------------------------------
   Breakpoints, in the build's order: 991, 767, 479.
   -------------------------------------------------------------------------- */
@media screen and (max-width: 991px) {
  /* Stack: artwork first, 4:5 and capped to 60% of the screen so the
     headline is never more than one flick away; copy on the night panel. */
  .cl-campaign-hero.is-split .cl-campaign-hero__grid { grid-template-columns: minmax(0, 1fr); min-height: 0; }
  /* The artwork breaks out of the gutters to the viewport edges; the copy
     stays in the container. */
  .cl-campaign-hero.is-split .cl-campaign-hero__media { grid-column: 1; grid-row: 1; aspect-ratio: 4 / 5; max-height: 60vh; min-height: 0; width: 100vw; margin-left: calc(50% - 50vw); }
  .cl-campaign-hero.is-split .cl-campaign-hero__copy  { grid-column: 1; grid-row: 2; padding-right: 0; }
  .cl-campaign-hero.is-split .cl-campaign-hero__content { max-width: none; }
  .cl-campaign-hero.is-split .cl-campaign-hero__copy .padding-vertical { padding-top: max(var(--cl-space, 0px), 2.5rem); padding-bottom: max(var(--cl-space, 0px), 3rem); }
  .cl-campaign-hero.is-cover,
  .cl-campaign-hero.is-cover .cl-campaign-hero__grid { min-height: 44rem; }
  .cl-campaign-hero .cl-campaign-hero__num { font-size: 2.75rem; }
  .cl-campaign-hero .cl-campaign-hero__timer-units { column-gap: 1.5rem; }
}

@media screen and (max-width: 767px) {
  .cl-campaign-hero.is-cover,
  .cl-campaign-hero.is-cover .cl-campaign-hero__grid { min-height: 36rem; }
  .cl-campaign-hero .cl-campaign-hero__heading { font-size: 2.5rem; letter-spacing: -.5px; }
  .cl-campaign-hero .cl-campaign-hero__lead { font-size: 1.0625rem; }
  .cl-campaign-hero .cl-campaign-hero__num { font-size: 2.25rem; }
  .cl-campaign-hero .cl-campaign-hero__unit { min-width: 3.25rem; }
  .cl-campaign-hero .cl-campaign-hero__timer { margin-top: 1.5rem; }
  .cl-campaign-hero .cl-campaign-hero__actions { margin-top: 1.5rem; }
  .cl-campaign-hero .cl-campaign-hero__cta { width: 100%; }
}

@media screen and (max-width: 479px) {
  .cl-campaign-hero .cl-campaign-hero__heading { font-size: 2.25rem; }
  .cl-campaign-hero .cl-campaign-hero__num { font-size: 2rem; }
  .cl-campaign-hero .cl-campaign-hero__unit { min-width: 0; flex: 0 0 calc(25% - .75rem); }
  .cl-campaign-hero .cl-campaign-hero__timer-units { column-gap: 1rem; }
  .cl-campaign-hero .cl-campaign-hero__trust .cl-trust.is-large { column-gap: .5rem; font-size: .75rem; }
  .cl-campaign-hero .cl-campaign-hero__trust .cl-trust.is-large .cl-trust__avatar { width: 1.5rem; height: 1.5rem; }
  .cl-campaign-hero .cl-campaign-hero__trust .cl-trust.is-large .cl-trust__star { width: .875rem; height: .875rem; }
}

@media (prefers-reduced-motion: reduce) {
  .cl-campaign-hero * { transition: none !important; }
}


/* cl-campaign-offers.css */
/* ==========================================================================
   CL Campaign offers. Offer tiles with deadline chips, and the timeline rail.

   No Webflow original. cl-base.css provides the wrapper chain, .heading-large,
   .button and its fills; the tiles, the chip, the lock and the rail are below.
   ========================================================================== */

.cl-campaign-offers { position: relative; background-color: var(--cl-cocoa); color: var(--cl-white); }
.cl-campaign-offers.is-night    { background-color: var(--cl-night); }
.cl-campaign-offers.is-lucidity { background-color: var(--cl-lucidity); color: var(--cl-cocoa); }

/* Head. The <p> and <h2> are reset by `.cl p`/`.cl h2`, so margins are
   restated at (0,2,0). */
.cl-campaign-offers .cl-campaign-offers__head { text-align: center; max-width: 44rem; margin: 0 auto 3rem; }
.cl-campaign-offers .cl-campaign-offers__eyebrow { font-size: .8125rem; letter-spacing: .12em; text-transform: uppercase; margin: 0 0 1rem; color: var(--cl-lucid); }
.cl-campaign-offers.is-lucidity .cl-campaign-offers__eyebrow { color: var(--cl-ink-60); }
.cl-campaign-offers .cl-campaign-offers__heading { margin: 0; }
.cl-campaign-offers .cl-campaign-offers__intro { margin: 1.25rem 0 0; font-size: 1.125rem; line-height: 1.5; opacity: .85; }

/* --------------------------------------------------------------------------
   Tiles. Client, 2026-09-23 ("visually properly UP the whole offer area"):
   the hero row stays full width; every tile under it is the same width and
   the same shape (image on top, copy, then a foot with the deadline and the
   button pinned to the bottom), so a row reads as one set and no tile is a
   narrow text column beside a tall photo. `is-lead` marks the offer of the
   phase with its accent, not with double width.
   -------------------------------------------------------------------------- */
.cl-campaign-offers__grid { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); gap: 1.5rem; }
.cl-campaign-offers__tile { grid-column: span 4; }
.cl-campaign-offers__grid.has-2 .cl-campaign-offers__tile:not(.is-hero) { grid-column: span 6; }
.cl-campaign-offers__grid.has-1 .cl-campaign-offers__tile:not(.is-hero) { grid-column: 3 / span 8; }
.cl-campaign-offers__grid.has-4 .cl-campaign-offers__tile:not(.is-hero) { grid-column: span 3; }
.cl-campaign-offers__grid .cl-campaign-offers__tile.is-hero.is-hero { grid-column: 1 / -1; }

.cl-campaign-offers__tile {
  position: relative;
  display: flex;
  background-color: var(--cl-white);
  color: var(--cl-cocoa);
  border-radius: .5rem;
  overflow: hidden;
  min-width: 0;
}
.cl-campaign-offers__card { display: flex; flex-direction: column; flex: 1 1 auto; min-width: 0; }

/* Hero row: image left, copy right, the biggest type in the section. Two
   classes only, so the phone rules below can stack it again. */
.cl-campaign-offers__tile.is-hero .cl-campaign-offers__card { flex-direction: row; min-height: 24rem; }
.cl-campaign-offers__tile.is-hero .cl-campaign-offers__media { flex: 0 0 48%; aspect-ratio: auto; }
.cl-campaign-offers__tile.is-hero .cl-campaign-offers__body { flex: 1 1 auto; padding: 3rem 3rem 3rem 3.25rem; justify-content: center; gap: 1rem; }
.cl-campaign-offers .cl-campaign-offers__tile.is-hero .cl-campaign-offers__tile-heading { font-size: 2.75rem; line-height: 1.08; }
.cl-campaign-offers .cl-campaign-offers__tile.is-hero .cl-campaign-offers__tile-text { font-size: 1.0625rem; max-width: 32rem; }
.cl-campaign-offers__tile.is-hero .cl-campaign-offers__foot { margin-top: .75rem; flex-direction: row; align-items: center; gap: 1.5rem; border-top: 0; padding-top: 0; }
.cl-campaign-offers__tile.is-hero .cl-campaign-offers__cta { align-self: auto; flex: none; }

.cl-campaign-offers__media { position: relative; aspect-ratio: 4 / 3; background-color: var(--cl-pumice); overflow: hidden; }
.cl-campaign-offers__media img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; display: block; }
/* A transparent product cut-out stands whole on a warm floor instead of being
   cropped to the frame (the Sanctuary 1 jpg's own grey ground clashed). */
.cl-campaign-offers__media.is-contain { background: radial-gradient(120% 80% at 50% 100%, #eadccf 0%, #f6f0ea 55%, #faf7f4 100%); }
.cl-campaign-offers__media.is-contain img { inset: 9% 8% 6%; width: 84%; height: 85%; object-fit: contain; }

/* The badge: the number, set in the body face so it sits in the middle of its
   box (the heading face's metrics left it low in the old pill), with an
   optional note under it. */
.cl-campaign-offers__badge {
  position: absolute;
  top: 1rem;
  left: 1rem;
  z-index: 1;
  display: inline-flex;
  flex-direction: column;
  align-items: flex-start;
  gap: .3rem;
  padding: .6rem .8rem;
  border-radius: .375rem;
  background-color: var(--cl-cocoa);
  color: var(--cl-white);
  font-family: var(--cl-font-body);
  box-shadow: 0 6px 18px #00000026;
}
.cl-campaign-offers__badge.is-accent { background-color: var(--cl-zeal); }
.cl-campaign-offers__badge-value { display: block; font-size: 1.125rem; font-weight: 600; line-height: 1; letter-spacing: .01em; font-variant-numeric: tabular-nums; text-box: trim-both cap alphabetic; }
.cl-campaign-offers__badge-note { display: block; font-size: .6875rem; font-weight: 500; line-height: 1; letter-spacing: .08em; text-transform: uppercase; opacity: .8; }
.cl-campaign-offers__badge.is-blurred .cl-campaign-offers__badge-value { filter: blur(5px); user-select: none; }
.cl-campaign-offers__tile.is-hero .cl-campaign-offers__badge { top: 1.5rem; left: 1.5rem; padding: .8rem 1rem; }
.cl-campaign-offers__tile.is-hero .cl-campaign-offers__badge-value { font-size: 1.75rem; }

/* Locked / upcoming (older states): the picture goes quiet, the lock says why. */
.cl-campaign-offers__tile.is-locked .cl-campaign-offers__media img,
.cl-campaign-offers__tile.is-upcoming .cl-campaign-offers__media img { filter: grayscale(.6) brightness(.72); }
.cl-campaign-offers__lock {
  position: absolute; right: 1rem; top: 1rem; z-index: 1;
  width: 2.25rem; height: 2.25rem; border-radius: 100px;
  background-color: #ffffffd9; color: var(--cl-cocoa);
  display: inline-flex; align-items: center; justify-content: center;
}
.cl-campaign-offers__lock svg { width: 1.125rem; height: 1.125rem; }

.cl-campaign-offers__body { display: flex; flex-direction: column; align-items: flex-start; gap: .75rem; padding: 1.75rem; flex: 1 1 auto; }
.cl-campaign-offers .cl-campaign-offers__tile-eyebrow { margin: 0; font-size: .75rem; letter-spacing: .12em; text-transform: uppercase; color: var(--cl-ink-60); }
.cl-campaign-offers .cl-campaign-offers__tile-heading { margin: 0; font-family: var(--cl-font-heading); font-weight: 400; font-size: 1.875rem; line-height: 1.12; }
.cl-campaign-offers .cl-campaign-offers__tile-text { margin: 0; font-size: 1rem; line-height: 1.5; color: var(--cl-ink-75); }

/* The foot: deadline and button, pinned to the bottom so the buttons of a
   row line up whatever the copy length above them. */
.cl-campaign-offers__foot { margin-top: auto; align-self: stretch; display: flex; flex-direction: column; gap: 1.25rem; padding-top: 1.25rem; }
.cl-campaign-offers .cl-campaign-offers__deadline {
  margin: 0;
  display: grid;
  grid-template-columns: auto 1fr;
  column-gap: .6rem;
  row-gap: .15rem;
  align-items: start;
  padding-top: 1.1rem;
  border-top: 1px solid var(--cl-ink-12);
  font-size: .9375rem;
  line-height: 1.35;
}
.cl-campaign-offers__tile.is-hero .cl-campaign-offers__deadline { border-top: 0; padding-top: 0; }
.cl-campaign-offers__deadline-icon { grid-row: 1 / span 2; width: 1.05rem; height: 1.05rem; margin-top: .1rem; color: var(--cl-ink-60); }
.cl-campaign-offers__deadline-main { font-weight: 600; }
.cl-campaign-offers__deadline-then { grid-column: 2; font-size: .875rem; color: var(--cl-ink-60); }
.cl-campaign-offers__tile.is-lead .cl-campaign-offers__deadline-main,
.cl-campaign-offers__tile.is-lead .cl-campaign-offers__deadline-icon { color: var(--cl-zeal); }

.cl-campaign-offers .cl-campaign-offers__cta { align-self: stretch; text-align: center; }
/* On a white tile the "white" button is a cocoa pill. */
.cl-campaign-offers .cl-campaign-offers__tile .button.is-white { background-color: var(--cl-cocoa); border-color: var(--cl-cocoa); color: var(--cl-white); }
.cl-campaign-offers .cl-campaign-offers__tile .button.is-white:hover { background-color: var(--cl-cocoa-lift); border-color: var(--cl-cocoa-lift); }

/* Teaser: the whole card is blurred and a veil carries a countdown to the
   moment it opens (the offers section reloads the page then). */
.cl-campaign-offers__tile.is-teaser .cl-campaign-offers__card { filter: blur(7px) saturate(.7); opacity: .6; pointer-events: none; user-select: none; }
.cl-campaign-offers__veil {
  position: absolute;
  inset: 0;
  z-index: 2;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: .75rem;
  padding: 2rem;
  text-align: center;
  background: linear-gradient(180deg, #ffffff40 0%, #ffffffa6 100%);
}
.cl-campaign-offers__veil-lock { width: 3rem; height: 3rem; border-radius: 100px; background-color: var(--cl-cocoa); color: var(--cl-white); display: inline-flex; align-items: center; justify-content: center; }
.cl-campaign-offers__veil-lock svg { width: 1.3rem; height: 1.3rem; }
.cl-campaign-offers .cl-campaign-offers__veil-label { margin: .25rem 0 0; font-family: var(--cl-font-heading); font-size: 1.5rem; line-height: 1.2; max-width: 16rem; }
.cl-campaign-offers .cl-campaign-offers__veil-clock { margin: 0; font-size: 1rem; font-weight: 600; letter-spacing: .04em; font-variant-numeric: tabular-nums; color: var(--cl-zeal); }

/* --------------------------------------------------------------------------
   Timeline rail. Five stops on a hairline; the current one carries the
   lucid dot with a zeal ring, done stops are dim, coming stops are outlined.
   -------------------------------------------------------------------------- */
.cl-campaign-offers__timeline { margin-top: 4rem; }
.cl-campaign-offers .cl-campaign-offers__timeline-heading { text-align: center; margin: 0 0 2rem; font-size: .8125rem; letter-spacing: .12em; text-transform: uppercase; opacity: .8; }
.cl-campaign-offers .cl-campaign-offers__steps {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(5, minmax(0, 1fr));
  gap: 1rem;
  position: relative;
}
.cl-campaign-offers__steps::before {
  content: "";
  position: absolute;
  top: .5rem;
  left: 10%;
  right: 10%;
  height: 1px;
  background-color: #ffffff33;
}
.cl-campaign-offers.is-lucidity .cl-campaign-offers__steps::before { background-color: var(--cl-ink-20); }
.cl-campaign-offers__step { position: relative; text-align: center; padding-top: 1.75rem; }
.cl-campaign-offers__dot {
  position: absolute;
  top: 0;
  left: 50%;
  transform: translateX(-50%);
  width: 1.0625rem;
  height: 1.0625rem;
  border-radius: 100px;
  border: 2px solid #ffffff66;
  background-color: var(--cl-cocoa);
  box-sizing: border-box;
}
.cl-campaign-offers.is-night .cl-campaign-offers__dot { background-color: var(--cl-night); }
.cl-campaign-offers.is-lucidity .cl-campaign-offers__dot { background-color: var(--cl-lucidity); border-color: var(--cl-ink-35); }
.cl-campaign-offers__step.is-done .cl-campaign-offers__dot { background-color: #ffffff99; border-color: #ffffff99; }
.cl-campaign-offers__step.is-current .cl-campaign-offers__dot { background-color: var(--cl-lucid); border-color: var(--cl-zeal); box-shadow: 0 0 0 5px #801c0040; }
.cl-campaign-offers__step.is-done { opacity: .55; }
.cl-campaign-offers__step.is-next { opacity: .8; }
.cl-campaign-offers__step-date { display: block; font-size: .75rem; letter-spacing: .08em; text-transform: uppercase; opacity: .8; }
.cl-campaign-offers__step-title { display: block; margin-top: .35rem; font-family: var(--cl-font-heading); font-size: 1.125rem; line-height: 1.25; }
.cl-campaign-offers__step.is-current .cl-campaign-offers__step-title { color: var(--cl-lucid); }
.cl-campaign-offers.is-lucidity .cl-campaign-offers__step.is-current .cl-campaign-offers__step-title { color: var(--cl-zeal); }
.cl-campaign-offers__step-text { display: block; margin-top: .25rem; font-size: .875rem; line-height: 1.45; opacity: .8; }
/* A coming stop that is still a secret: blurred like the teaser tiles. */
.cl-campaign-offers__step-veil { display: block; filter: blur(5px); user-select: none; pointer-events: none; }

/* --------------------------------------------------------------------------
   Breakpoints, in the build's order: 991, 767, 479.
   -------------------------------------------------------------------------- */
@media screen and (max-width: 991px) {
  .cl-campaign-offers__grid .cl-campaign-offers__tile:not(.is-hero),
  .cl-campaign-offers__grid.has-4 .cl-campaign-offers__tile:not(.is-hero) { grid-column: span 6; }
  .cl-campaign-offers__grid.has-3 .cl-campaign-offers__tile.is-lead,
  .cl-campaign-offers__grid.has-1 .cl-campaign-offers__tile:not(.is-hero) { grid-column: span 12; }
  .cl-campaign-offers__tile.is-hero .cl-campaign-offers__body { padding: 2.25rem; }
  .cl-campaign-offers .cl-campaign-offers__tile.is-hero .cl-campaign-offers__tile-heading { font-size: 2.25rem; }
  .cl-campaign-offers__tile.is-hero .cl-campaign-offers__foot { flex-direction: column; align-items: stretch; }
  .cl-campaign-offers__steps { grid-template-columns: repeat(5, minmax(0, 1fr)); gap: .5rem; }
  .cl-campaign-offers__step-text { display: none; }
}

@media screen and (max-width: 767px) {
  .cl-campaign-offers .cl-campaign-offers__head { margin-bottom: 2rem; }
  .cl-campaign-offers__grid { gap: 1rem; }
  .cl-campaign-offers__grid .cl-campaign-offers__tile,
  .cl-campaign-offers__grid .cl-campaign-offers__tile:not(.is-hero),
  .cl-campaign-offers__grid.has-3 .cl-campaign-offers__tile.is-lead { grid-column: span 12; }
  .cl-campaign-offers__tile.is-hero .cl-campaign-offers__card { flex-direction: column; min-height: 0; }
  .cl-campaign-offers__tile.is-hero .cl-campaign-offers__media { flex: none; aspect-ratio: 4 / 3; }
  .cl-campaign-offers__tile.is-hero .cl-campaign-offers__body,
  .cl-campaign-offers__body { padding: 1.5rem; }
  .cl-campaign-offers .cl-campaign-offers__tile.is-hero .cl-campaign-offers__tile-heading,
  .cl-campaign-offers .cl-campaign-offers__tile-heading { font-size: 1.75rem; }
  .cl-campaign-offers__tile.is-hero .cl-campaign-offers__badge-value { font-size: 1.375rem; }
  .cl-campaign-offers__tile.is-teaser { min-height: 18rem; }
  /* The rail turns into a list: dots down the left, the line beside them. */
  .cl-campaign-offers__timeline { margin-top: 3rem; }
  .cl-campaign-offers .cl-campaign-offers__steps { grid-template-columns: 1fr; gap: 1.25rem; padding-left: 2rem; }
  .cl-campaign-offers__steps::before { top: .5rem; bottom: .5rem; left: .5rem; right: auto; width: 1px; height: auto; }
  .cl-campaign-offers__step { text-align: left; padding-top: 0; }
  .cl-campaign-offers__dot { left: -2rem; top: .1rem; transform: none; }
  .cl-campaign-offers__step-text { display: block; }
}

@media (prefers-reduced-motion: reduce) {
  .cl-campaign-offers * { transition: none !important; }
}


/* cl-cards.css */
/* ==========================================================================
   Card grid. Port of section-layoutcards1 and the other card layouts (see the
   section comment for the map).

   From the export, canonical (leitfaden-zur-wartung.html :: .section-layoutcards1):
     .container-large > div  no padding class at all: the eyebrow's 4rem top
                           margin is the only space above, nothing below
     .layoutcards1_component  flex column, align start
     .margin-bottom.margin-xlarge  20px at >= 992 (the stock .margin-bottom
                           declaration lands after the size classes), then the
                           scale: 3.5rem at 991, 2.5rem at 767
     .max-width-large      48rem
     .pre-heading          margin 4rem 0 2rem, .875rem / 600   767: .8rem
     .heading-large        3rem / 1.2   991: 2.25rem   767: 2rem   479: 1.8rem / 1.3
     .layoutcards1_list    grid 1fr 1fr 1fr, gap 1.5rem, place-items stretch start
                           991: 1fr 1fr, gap 1rem   767: 1fr, row-gap 1rem
     .layoutcards1_card    bg var(--lucidity)
     .layoutcards1_card-content  flex column, align start, gap .8rem,
                           min-height 14rem, padding 1.5rem
     .heading-medium.is--gold  golden, Adellesans, 300 (2.25rem / 1.2 from
                           .heading-medium; 991: 1.75rem; 767: 1.5rem / 1.4;
                           479: line-height 1.2)
     .text-rich-text.text-size-medium  1.125rem, p margin-bottom .5rem   767: 1rem

   Photo cards (infrarotkabine-hamburg.html :: .section-layout232):
     .margin-bottom.margin-medium  20px at >= 768, 1.5rem at 767
     .layout232_component.is-4col  grid 1fr x4, column-gap 1.25rem, row-gap 4rem,
                           place-items stretch start   991: place-items center
                           767: row-gap 3rem. The 767 and 479 single-column
                           rules are single-class and lose to .is-4col, so the
                           export keeps four 104px columns on a phone; the port
                           follows the breakpoint rules (one column).
     .layout232_item       flex column, align start, 100% x 100%
     .location-page-image-wrapper  margin-bottom -4rem   991: -2rem   767: -4rem
     img (.image-2 ...)    margin-bottom 60px
     .margin-bottom.margin-xsmall  20px at >= 768, .75rem at 767
     h3.text-size-regular.text-weight-semibold  1rem / 600 / 1.2
     .margin-top.auto      margin-top auto
     .link-small           border-bottom 2px cocoa, flex none, margin-top 1rem,
                           padding-bottom .15rem, .9rem / 600 / 1.4, inline-block

   Steps (infrarotkabine-hamburg.html :: .section-layout233):
     .layout233_component-2  grid 1fr 1fr 1fr, column-gap 3rem, row-gap 4rem,
                           place-items start   991: column-gap 2rem
                           767: 1fr, row-gap 3rem
     .layout233_item-2     block (its flex-direction is inert)
     .margin-bottom.margin-xsmall > .icon-1x1-small  2rem square
     .margin-bottom.margin-xxsmall  .5rem
     .text-weight-semibold 600
     .margin-top.margin-xlarge  4rem / 3.5rem / 2.5rem
     .button-row.is-double-vertical  column, row-gap 0   479: align stretch

   Discover (infrarotsauna.html :: .section_discover):
     section               bg var(--cocoa), color #fff, relative
     .discover_component   grid 1.1fr 1fr, gap 0, align center
                           991: 1fr, row-gap 2rem   767: padding-top 3rem
     left .page-padding    justify-self end   767: stretch
     .discover_left        flex, column-gap 2rem, align center, max-width 41rem
                           767: column, align start, max-width none
     .disover-left_text-wrapper  flex column, row-gap 3rem, align start
                           767: row-gap 1rem   479: align center
     .heading-medium-3     2rem / 1.1, margin-bottom .5rem, left
                           991: 1.75rem   767: 1.5rem / 1.4   479: 1.6rem
     .discover_right       flex column, padding-top 65%, padding-left 3rem, relative
                           479: padding-top 125%, padding-left 0
     .discover-right_text-wrapper  absolute inset 0, flex column centred,
                           row-gap 1.5rem, padding 0 4rem, 1.25rem, text centre
                           991: align start   479: align centre
     .button.is-white      inline-block

   Figure (tragbare-infrarotsauna.html :: .section_layout142):
     section               bg var(--lucidity)
     .padding-section-large  7rem / 6rem / 4rem, the plain xhuge scale
     .layout142_component  flex column, align centre
     .margin-bottom.margin-medium > .text-align-center > .max-width-large.align-center
     .margin-bottom.margin-small  margin 0
   ========================================================================== */

.cl-cards.is-bg-lucidity { background-color: var(--cl-lucidity); }
.cl-cards.is-bg-pumice   { background-color: var(--cl-pumice); }
.cl-cards.is-bg-cocoa    { background-color: var(--cl-cocoa); color: var(--cl-white); position: relative; }

.cl-cards__component { flex-direction: column; align-items: flex-start; display: flex; }
.cl-cards .cl-cards__intro p { margin: 0; }
.cl-cards .cl-cards__intro p + p { margin-top: 1rem; }

/* --------------------------------------------------------------------------
   Base gaps worked around locally (cl-base.css is not edited from a section):
   .heading-large has no letter-spacing in the export and line-height 1.3 at
   479; .heading-medium is 1.4 at 767 and 1.2 at 479; .margin-bottom + size
   resolves to 20px at desktop (see the header).
   -------------------------------------------------------------------------- */
.cl-cards .heading-large { letter-spacing: 0; }
.cl-cards .heading-medium { line-height: 1.2; }
.cl .cl-cards__head.margin-bottom { margin-bottom: 20px; }
/* components.css gives every img vertical-align: middle; cl-base does not, and
   a baseline-aligned inline-block icon adds its descender gap to the wrapper */
.cl-cards img { vertical-align: middle; }

/* --------------------------------------------------------------------------
   Grid and cards
   -------------------------------------------------------------------------- */
.cl-cards__list {
  display: grid;
  grid-template-columns: repeat(var(--cl-cards-cols, 3), 1fr);
  column-gap: 1.5rem;
  row-gap: 1.5rem;
  place-items: stretch start;
  width: 100%;
}
.cl-cards__list.is-cols-2 { --cl-cards-cols: 2; }
.cl-cards__list.is-cols-3 { --cl-cards-cols: 3; }
.cl-cards__list.is-cols-4 { --cl-cards-cols: 4; }
.cl-cards__card { width: 100%; }
.cl-cards__media img { display: block; max-width: 100%; height: auto; }
.cl-cards__title { margin: 0; }
.cl-cards__text p { margin: 0; }
/* the export's .w-richtext embed zeroes the first top and last bottom margin */
.cl-cards .cl-cards__text > :first-child { margin-top: 0; }
.cl-cards .cl-cards__text > :last-child { margin-bottom: 0; }

/* .link-small */
.cl-cards__link {
  border-bottom: 2px solid var(--cl-cocoa);
  flex: none;
  margin-top: 1rem;
  padding-bottom: .15rem;
  font-size: .9rem;
  font-weight: 600;
  line-height: 1.4;
  display: inline-block;
  overflow: hidden;
  color: inherit;
  text-decoration: none;
}
.cl-cards__link:hover { opacity: .7; }
.cl-cards .margin-top.auto { margin-top: auto; }

/* --------------------------------------------------------------------------
   is-numbered: layoutcards1
   -------------------------------------------------------------------------- */
.cl-cards.is-numbered .cl-cards__card { background-color: var(--cl-lucidity); }
.cl-cards.is-numbered .cl-cards__content {
  column-gap: .8rem;
  row-gap: .8rem;
  flex-direction: column;
  align-items: flex-start;
  min-height: 14rem;
  padding: 1.5rem;
  display: flex;
}
.cl-cards.is-numbered .cl-cards__number {
  color: var(--cl-dark-red);
  font-family: var(--cl-font-body);
  font-weight: 300;
}
.cl-cards.is-numbered .cl-cards__text { font-size: 1.125rem; }
.cl-cards.is-numbered .cl-cards__text p { margin-bottom: .5rem; }
.cl-cards.is-numbered .cl-cards__text > :last-child { margin-bottom: 0; }
.cl-cards.is-numbered .cl-cards__title { font-size: 1.5rem; font-weight: 400; line-height: 1.4; }

/* --------------------------------------------------------------------------
   is-image: layout232
   -------------------------------------------------------------------------- */
/* layout232 and layout233 have no component wrapper: the head, the grid and
   the buttons are block children of the padded column */
.cl-cards.is-image .cl-cards__component,
.cl-cards.is-steps .cl-cards__component { display: block; }
.cl-cards.is-image .cl-cards__list { column-gap: 1.25rem; row-gap: 4rem; }
.cl-cards.is-image .cl-cards__card { height: 100%; }
.cl-cards.is-image .cl-cards__content {
  flex-direction: column;
  align-items: flex-start;
  width: 100%;
  height: 100%;
  display: flex;
}
/* .location-page-image-wrapper pulls the next block 4rem up while its image
   keeps a 60px bottom margin: net 4px of overlap, reproduced as is. */
.cl-cards.is-image .cl-cards__media { margin-bottom: -4rem; }
.cl-cards.is-image .cl-cards__media img { display: inline-block; margin-bottom: 60px; }
/* .margin-bottom.margin-xsmall also carries width: 100% in the export */
.cl-cards.is-image .cl-cards__title-wrap { margin-bottom: 20px; width: 100%; }
.cl-cards.is-image .cl-cards__title { font-size: 1rem; font-weight: 600; line-height: 1.2; }
/* Round eighteen: `image_ratio` crops every photo card to one shape
   (aspect-ratio + object-fit), so a grid of mixed photos lines up; "" keeps
   the export's natural sizing above. A cropped photo fills its column, as the
   sauna renders on the city pages do. The export's 4px title overlap is for
   renders on white; a cropped photo gets a plain 1.25rem gap instead. */
.cl-cards.is-image .cl-cards__media.is-ratio-4-3,
.cl-cards.is-image .cl-cards__media.is-ratio-3-2,
.cl-cards.is-image .cl-cards__media.is-ratio-1-1 { margin-bottom: 0; }
.cl-cards.is-image .cl-cards__media.is-ratio-4-3 img,
.cl-cards.is-image .cl-cards__media.is-ratio-3-2 img,
.cl-cards.is-image .cl-cards__media.is-ratio-1-1 img { width: 100%; height: auto; object-fit: cover; display: block; margin-bottom: 1.25rem; }
.cl-cards.is-image .cl-cards__media.is-ratio-4-3 img { aspect-ratio: 4 / 3; }
.cl-cards.is-image .cl-cards__media.is-ratio-3-2 img { aspect-ratio: 3 / 2; }
.cl-cards.is-image .cl-cards__media.is-ratio-1-1 img { aspect-ratio: 1 / 1; }

/* --------------------------------------------------------------------------
   is-steps: layout233
   -------------------------------------------------------------------------- */
.cl-cards.is-steps .cl-cards__list { column-gap: 3rem; row-gap: 4rem; place-items: start; }
.cl-cards.is-steps .cl-cards__media { margin-bottom: 20px; }
.cl-cards.is-steps .cl-cards__media img { width: 2rem; height: 2rem; display: inline-block; }
.cl-cards.is-steps .cl-cards__title-wrap { margin-bottom: .5rem; }
.cl-cards.is-steps .cl-cards__title { font-size: 1rem; font-weight: 600; line-height: 1.5; }
.cl-cards .button-row.is-double-vertical { row-gap: 0; flex-direction: column; }
.cl-cards .button-row.is-double-vertical .cl-cards__link { display: block; }

/* --------------------------------------------------------------------------
   is-discover: discover_component
   -------------------------------------------------------------------------- */
.cl-cards.is-discover { background-color: var(--cl-cocoa); color: var(--cl-white); position: relative; }
.cl-cards__discover {
  grid-template-columns: 1.1fr 1fr;
  column-gap: 0;
  row-gap: 0;
  justify-content: center;
  align-items: center;
  display: grid;
}
.cl-cards__discover-cell { justify-self: end; }
.cl-cards__discover-left {
  column-gap: 2rem;
  flex: none;
  justify-content: flex-start;
  align-items: center;
  max-width: 41rem;
  display: flex;
}
.cl-cards__discover-thumb { flex: none; height: auto; }
.cl-cards__discover-text {
  row-gap: 3rem;
  flex-direction: column;
  align-items: flex-start;
  display: flex;
}
.cl-cards.is-discover .cl-cards__title {
  font-family: var(--cl-font-heading);
  text-align: left;
  margin-bottom: .5rem;
  font-size: 2rem;
  font-weight: 400;
  line-height: 1.1;
}
.cl-cards.is-discover .button.is-white { display: inline-block; }
.cl-cards__discover-right {
  flex-direction: column;
  justify-content: center;
  align-items: flex-start;
  width: 100%;
  padding-top: 65%;
  padding-left: 3rem;
  display: flex;
  position: relative;
}
.cl-cards__discover-overlay {
  z-index: 2;
  row-gap: 1.5rem;
  text-align: center;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  padding-left: 4rem;
  padding-right: 4rem;
  font-size: 1.25rem;
  display: flex;
  position: absolute;
  inset: 0;
}
.cl-cards__discover-overlay .cl-cards__title { text-align: center; }

/* --------------------------------------------------------------------------
   is-figure: layout142
   -------------------------------------------------------------------------- */
.cl-cards.is-figure .cl-cards__component { align-items: center; }
.cl-cards.is-figure .cl-cards__head .cl-cards__heading { margin-bottom: 0; }
.cl-cards__figure img { display: inline-block; max-width: 100%; height: auto; }

/* --------------------------------------------------------------------------
   Breakpoints
   -------------------------------------------------------------------------- */
@media screen and (max-width: 991px) {
  /* the size rules redeclared at 991 win over the stock 20px from here down */
  .cl .cl-cards__head.margin-bottom.margin-large,
  .cl .cl-cards__head.margin-bottom.margin-xlarge { margin-bottom: var(--cl-space); }
  .cl-cards.is-numbered .cl-cards__list { grid-template-columns: 1fr 1fr; column-gap: 1rem; row-gap: 1rem; }
  .cl-cards.is-image .cl-cards__list { place-items: center; }
  .cl-cards.is-image .cl-cards__media { margin-bottom: -2rem; }
  .cl-cards.is-steps .cl-cards__list { column-gap: 2rem; }
  .cl-cards__discover { grid-template-columns: 1fr; row-gap: 2rem; }
  .cl-cards.is-discover .cl-cards__title { font-size: 1.75rem; }
  .cl-cards__discover-overlay { align-items: flex-start; }
}

@media screen and (max-width: 767px) {
  .cl .cl-cards__head.margin-bottom { margin-bottom: var(--cl-space); }
  .cl-cards .heading-medium { line-height: 1.4; }
  .cl-cards.is-numbered .cl-cards__list { grid-template-columns: 1fr; row-gap: 1rem; }
  .cl-cards.is-numbered .cl-cards__text { font-size: 1rem; }
  .cl-cards.is-numbered .cl-cards__title { font-size: 1.25rem; }
  .cl-cards.is-image .cl-cards__list { grid-template-columns: 1fr; row-gap: 3rem; }
  .cl-cards.is-image .cl-cards__media { margin-bottom: -4rem; }
  .cl-cards.is-image .cl-cards__title-wrap { margin-bottom: .75rem; }
  .cl-cards.is-steps .cl-cards__list { grid-template-columns: 1fr; row-gap: 3rem; }
  .cl-cards.is-steps .cl-cards__media { margin-bottom: .75rem; }
  .cl-cards__discover { padding-top: 3rem; }
  .cl-cards__discover-cell { justify-self: stretch; }
  .cl-cards__discover-left { flex-direction: column; justify-content: flex-start; align-items: flex-start; width: 100%; max-width: none; }
  .cl-cards__discover-text { row-gap: 1rem; }
  .cl-cards.is-discover .cl-cards__title { font-size: 1.5rem; line-height: 1.4; }
}

@media screen and (max-width: 479px) {
  .cl-cards .heading-medium { line-height: 1.2; }
  .cl-cards .heading-large { line-height: 1.3; }
  .cl-cards .text-align-center .heading-large { font-size: 1.5rem; }
  .cl-cards.is-image .cl-cards__list,
  .cl-cards.is-steps .cl-cards__list { grid-template-columns: 1fr; }
  .cl-cards__discover-text { align-items: center; }
  .cl-cards.is-discover .cl-cards__title { font-size: 1.6rem; }
  .cl-cards__discover-right { padding-top: 125%; padding-left: 0; }
  .cl-cards__discover-overlay { align-items: center; }
}

/* blur-up under the card image (snippets/cl-product-card.liquid); only
   rendered under cover photos, a contain render on the pumice box would show
   the blurred copy as a halo */
.cl-card__image { position: relative; }
.cl-card__lqip { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; filter: blur(14px); transform: scale(1.08); }
.cl-card__image .cl-fade { position: relative; }


/* cl-cart.css */
.cl-cart__list { list-style: none; margin: 0; padding: 0; display: grid; row-gap: 1.5rem; }
.cl-cart__line {
  display: grid;
  grid-template-columns: 6rem 1fr 8rem;
  column-gap: 1.5rem;
  align-items: start;
  border-top: 1px solid #00000026;
  padding-top: 1.5rem;
  margin: 0;
}
.cl-cart__thumb { background: var(--cl-pumice); display: block; }
.cl-cart__thumb img { width: 100%; height: auto; display: block; }
.cl-cart__info { display: grid; row-gap: .3rem; }
.cl-cart__info a { color: inherit; text-decoration: none; }
.cl-cart__qty { display: grid; row-gap: .3rem; }
.cl-cart__foot {
  display: flex;
  justify-content: space-between;
  align-items: flex-end;
  gap: 1.5rem;
  flex-wrap: wrap;
  border-top: 1px solid #00000026;
  padding-top: 1.5rem;
}
.cl-cart__foot > div:first-child { display: grid; row-gap: .25rem; }

.cl-search__form { display: grid; row-gap: .5rem; }
.cl-search__row { display: flex; gap: .75rem; flex-wrap: wrap; }
.cl-search__row input { flex: 1; min-width: 12rem; }

.cl .visually-hidden {
  position: absolute; width: 1px; height: 1px; overflow: hidden;
  clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap;
}

@media screen and (max-width: 767px) {
  .cl-cart__line { grid-template-columns: 4.5rem 1fr; row-gap: .75rem; }
  .cl-cart__qty { grid-column: 2; }
}


/* cl-collection.css */
/* ==========================================================================
   Collection grid. Port of the .section-text-callout holding
   .product7_component on alle-modelle.html (canonical, the second instance),
   grosse/*.html, detail_groessen.html and detail_modelle.html.

   From the export. Base classes the port already carries (page-padding,
   container-large, is-tablet-tall padding-vertical padding-xhuge, heading-small,
   text-size-*, is-capitalized, button, button-small, button-row, cl-grid,
   cl-card__image) are not restated; the rules below are what cl-base.css
   lacks or gets differently.

     .section-text-callout          background-color #fff
     .padding-vertical.padding-xhuge 7rem; 991: 8rem/8rem + text-align center;
                                    767: bottom 4rem + text-align left; 479: 3rem/3rem
                                    (= .is-tablet-tall in cl-base)
     .product7_component            no rule
     .margin-bottom.margin-large    20px (stock .margin-bottom, declared after
                                    .margin-large, wins at base); 991: 2.5rem and
                                    text-align left; 767: 2rem. cl-base resolves the
                                    pair to 3rem, so the head owns its margin here.
     .max-width-large               48rem
     .margin-bottom.margin-xsmall   20px at base and 991 (same cascade); 767: .75rem.
                                    width 100%. Wraps the heading and the card image.
     .heading-small                 1.5rem / 400 / 1.4, margin-bottom .5rem; 767: 1.25rem
     .product7_list-wrapper         no rule
     .products_list                 grid 1fr 1fr 1fr, column-gap 1.5rem, row-gap 4rem,
                                    place-items start; 991: 1fr 1fr, column-gap 2rem;
                                    767: 1fr, column-gap 1.25rem, row-gap 3rem
                                    (= .cl-grid in cl-base, plus place-items)
     .products_item                 flex column, align-items stretch, width 100%
     .product_link                  text-decoration none; a.w-inline-block on the size
                                    pages, a div on alle-modelle; block either way, so
                                    the body's .5rem and the actions' 1.5rem collapse
     .product_image-wrapper         pumice, width 100%, padding-top 67%, relative,
                                    overflow hidden (= .cl-card__image); on alle-modelle
                                    it is an a.w-inline-block inside the margin div, so
                                    the div is one text descender taller than the box
     .product_image                 absolute, inset 0, cover
     .margin-bottom.margin-xxsmall  margin-bottom .5rem (explicit pair rule)
     .text-size-tiny.is-capitalized .75rem, letter-spacing .5px, uppercase;
                                    479: padding 4px 0
     .text-size-medium              1.125rem; 767: 1rem. .text-weight-medium 500 on the
                                    size pages, .text-weight-semibold 600 on alle-modelle
     .margin-top.margin-small       1.5rem; 767: 1.25rem (the buttons wrapper)
     .button-row                    flex, wrap, gap 1rem, align center; 479: column, stretch
     .button.button-small           letter-spacing 1px, min-width auto, padding .6rem 1.25rem .5rem
     .button-tertiary               flex, centred, column-gap .4rem, color var(--black),
                                    transparent, padding .5rem 0, 600, line-height 1,
                                    border-bottom 2px solid
     .button-tertiary.has-underline border none, text-decoration underline

   Departure, on purpose: the image box is 4:3 (padding-top 75%) and the image
   is object-fit contain when the card carries .is-contain (the store's sauna
   images are square transparent renders; the export's 3:2 cover crop cut the
   roof and floor off every one of them). A landscape photo keeps .is-cover.
   The box measures 8% of its width taller than the export's; the row below
   moves down by that much and nothing else changes.

   Residual, by design: the export's card fields are CMS-bound and empty; the
   probe binds them with the fixture's product names before measuring.
   ========================================================================== */

.cl-collection { background-color: var(--cl-white); }

/* --- heading ------------------------------------------------------------- */

.cl-collection__head { margin-bottom: 20px; }
.cl-collection__title-wrap { width: 100%; margin-bottom: 20px; }
.cl-collection__description { margin-top: 1rem; }

/* --- grid ---------------------------------------------------------------- */

.cl-collection__list { place-items: start; }
.cl-collection__item {
  flex-direction: column;
  align-items: stretch;
  width: 100%;
  display: flex;
}

/* --- card ---------------------------------------------------------------- */

/* .product_link: a block, not the flex column of the base card, so the
   sibling margins collapse as they do in the export. The price card the other
   collections use has no `layout` class and keeps the base flex column. */
.cl-collection .cl-card.is-grid,
.cl-collection .cl-card.is-actions { display: block; color: inherit; text-decoration: none; }
.cl-collection .cl-card__figure { width: 100%; margin-bottom: 20px; }
.cl-collection .cl-card__figure .cl-card__image { margin-bottom: 0; }

/* the 4:3 box; the render sits whole on the pumice, a photo still covers */
.cl-collection .cl-card__image { padding-top: 75%; }
.cl-collection .cl-card__image.is-contain img { object-fit: contain; }

/* alle-modelle: the image box is an inline-block link inside the margin div */
.cl-collection .is-actions .cl-card__image { display: inline-block; max-width: 100%; color: inherit; }
.cl-collection .cl-card__actions a { max-width: 100%; }
.cl-collection .is-grid .cl-card__body,
.cl-collection .is-actions .cl-card__body { display: block; row-gap: 0; margin-bottom: .5rem; }
.cl-collection .cl-card__actions { margin-top: 1.5rem; }

.cl-collection .button-tertiary {
  column-gap: .4rem;
  color: var(--cl-black);
  background-color: transparent;
  border-bottom: 2px solid;
  justify-content: center;
  align-items: center;
  padding: .5rem 0;
  font-weight: 600;
  line-height: 1;
  text-decoration: none;
  display: flex;
}
.cl-collection .button-tertiary.has-underline { border-style: none; text-decoration: underline; }

/* --- toolbar (Shopify filters and sort; no Webflow original) ------------- */

.cl-collection__toolbar {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  gap: 1rem 1.5rem;
  padding-bottom: 1.5rem;
  margin-bottom: 2rem;
  border-bottom: 1px solid #00000026;
}
.cl-collection__filter { position: relative; }
.cl-collection__filter > summary {
  cursor: pointer;
  list-style: none;
  border: 1px solid var(--cl-cocoa);
  border-radius: 100px;
  padding: .5rem 1rem;
}
.cl-collection__filter > summary::-webkit-details-marker { display: none; }
.cl-collection__filter[open] > summary { background: var(--cl-lucid); }
.cl-collection__filter-body {
  position: absolute;
  z-index: 5;
  top: calc(100% + .5rem);
  left: 0;
  min-width: 14rem;
  background: var(--cl-white);
  border: 1px solid #00000026;
  border-radius: .25rem;
  padding: .75rem;
  display: grid;
  row-gap: .4rem;
  box-shadow: 0 4px 30px #0000001f;
}
.cl-collection__check { display: flex; gap: .5rem; align-items: center; cursor: pointer; }
.cl-collection__sort { display: grid; row-gap: .35rem; margin-left: auto; }

/* --- pagination (other main sections read this) ------------------------- */


.cl-pagination { display: flex; align-items: center; justify-content: center; gap: 2rem; }


/* --- breakpoints --------------------------------------------------------- */

@media screen and (max-width: 991px) {
  /* .margin-bottom.margin-large at 991: the scale value, left-aligned under the
     centred padding-xhuge block */
  .cl-collection__head { margin-bottom: 2.5rem; text-align: left; }
}

@media screen and (max-width: 767px) {
  .cl-collection__head { margin-bottom: 2rem; }
  .cl-collection__title-wrap, .cl-collection .cl-card__figure { margin-bottom: .75rem; }
  .cl-collection .cl-card__actions { margin-top: 1.25rem; }
  .cl-collection__sort { margin-left: 0; width: 100%; }
}

/* --- grid density toggle, phones only (client, 2026-09-16) ----------------
   Below 768px cl-base's .cl .cl-grid is one column. The segmented control
   beside the title (sections/cl-main-collection.liquid, data-cl-grid-toggle)
   writes .is-two-up on the grid for two cards per row: tighter gaps, the
   card type a step smaller so a German name and the heater line fit half a
   phone, and the buttons card's pair stacked full width (cl-base gives
   .button a 14.5rem min-width below 767, which half a 390 screen cannot
   hold). Hidden above 767px, where `columns` and the 991 rule decide. The
   control is drawn in the theme's hairline language: the --cl-line square
   of the filters' summary, the pressed half filled cocoa. */
.cl-collection__grid-toggle { display: none; }

@media screen and (max-width: 767px) {
  .cl-collection__title-wrap {
    display: flex;
    align-items: center;
    justify-content: space-between;
    column-gap: 1rem;
    margin-bottom: 1.25rem;
  }
  /* the heading's own .5rem bottom margin would sit the title above the
     control's centre; the wrap carries the space instead (see above) */
  .cl-collection__title-wrap > .heading-small { margin-bottom: 0; min-width: 0; }

  .cl-collection__grid-toggle {
    display: inline-flex;
    flex: none;
    border: 1px solid var(--cl-line);
    border-radius: .375rem;
    overflow: hidden;
  }
  .cl-collection__grid-btn {
    appearance: none;
    -webkit-appearance: none;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 2.5rem;
    height: 2.25rem;
    margin: 0;
    padding: 0;
    border: 0;
    background: var(--cl-white);
    color: var(--cl-ink-65);
    cursor: pointer;
    transition: background-color .15s ease, color .15s ease;
  }
  .cl-collection__grid-btn + .cl-collection__grid-btn { border-left: 1px solid var(--cl-line); }
  .cl-collection__grid-btn svg { width: 1rem; height: 1rem; display: block; }
  .cl-collection__grid-btn:hover { color: var(--cl-cocoa); }
  .cl-collection__grid-btn[aria-pressed="true"] { background: var(--cl-cocoa); color: var(--cl-white); cursor: default; }
  .cl-collection__grid-btn:focus-visible { outline: 2px solid var(--cl-focus); outline-offset: -2px; }

  /* two per row: the phone grid, gaps closed up */
  .cl .cl-collection__list.is-two-up {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    column-gap: .75rem;
    row-gap: 2rem;
  }
  .cl .cl-collection__list.is-two-up .cl-card__figure { margin-bottom: .5rem; }
  .cl .cl-collection__list.is-two-up .cl-card__title { font-size: .9375rem; line-height: 1.35; overflow-wrap: anywhere; }
  .cl .cl-collection__list.is-two-up .cl-card__eyebrow { font-size: .6875rem; letter-spacing: .3px; }
  .cl .cl-collection__list.is-two-up .cl-card__price { font-size: .9375rem; }
  .cl .cl-collection__list.is-two-up .cl-card__actions { margin-top: 1rem; }
  .cl .cl-collection__list.is-two-up .button-row { flex-direction: column; align-items: stretch; gap: .5rem; }
  .cl .cl-collection__list.is-two-up .button-row .button {
    min-width: 0;
    width: 100%;
    justify-content: center;
    padding-inline: .5rem;
    font-size: .75rem;
    letter-spacing: .5px;
  }
  .cl .cl-collection__list.is-two-up .button-tertiary { font-size: .8125rem; }
  .cl .cl-collection__list.is-two-up .cl-compare-add { top: .375rem; right: .375rem; }
}

@media (prefers-reduced-motion: reduce) {
  .cl-collection__grid-btn { transition: none; }
}

@media screen and (max-width: 479px) {
  .cl-collection .text-size-tiny.is-capitalized { padding-top: 4px; padding-bottom: 4px; }
}

/* --- compare checkbox over the card image (client, round thirteen) --------
   A plain checkbox, top right on the card image, drawn in exactly the theme's
   checkbox language: the 1.5rem white square, the #b9a495 hairline, the
   .25rem radius and the cocoa fill with the white tick that
   .cl-contact-form__box and the .hs-form inputs use (assets/cl-contact-form.css),
   down to the same 16px tick data URI. Round eleven's filled disc with the
   two-arrow compare glyph is gone; the client read it as a decorated button
   rather than something to tick.

   It sits over a product photo, so the square keeps a hairline shadow the
   form checkbox does not need. Unchecked at rest; .is-on (written by
   cl-compare-modal from the sessionStorage list, never by a local toggle)
   fills it. Focus is the theme's golden ring. */
.cl-collection__item { position: relative; }
.cl-compare-add {
  position: absolute;
  top: .75rem;
  right: .75rem;
  z-index: 3;
  appearance: none;
  -webkit-appearance: none;
  display: block;
  flex: none;
  width: 1.5rem;
  min-width: 1.5rem;
  height: 1.5rem;
  min-height: 1.5rem;
  margin: 0;
  padding: 0;
  background-color: #fff;
  background-position: 50%;
  background-repeat: no-repeat;
  background-size: 16px 16px;
  border: 1px solid var(--cl-line);
  border-radius: .25rem;
  box-shadow: 0 .0625rem .1875rem #0000001a;
  line-height: normal;
  cursor: pointer;
  transition: background-color .2s, border-color .2s;
}
.cl-compare-add:hover { border-color: var(--cl-cocoa); }
.cl-compare-add:focus-visible { border-color: #000; outline: 2px solid var(--cl-focus); outline-offset: 2px; }
.cl-compare-add.is-on {
  background-color: var(--cl-cocoa);
  border-color: var(--cl-cocoa);
  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='%23fff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' d='M3.5 8.5l3 3 6-7'/%3E%3C/svg%3E");
}
@media screen and (max-width: 767px) {
  .cl-compare-add { top: .5rem; right: .5rem; }
}
@media (prefers-reduced-motion: reduce) {
  .cl-compare-add { transition: none; }
}


/* cl-compare-modal.css */
/* ==========================================================================
   Compare modal (snippets/cl-compare-modal.liquid). A centred card over a
   dimmed page on desktop, a bottom sheet below 768. Round seventeen: two
   columns, the picked models large on the left (the tapped one first, as
   "Ihre Auswahl"), the rest of the range smaller on the right, and the card
   widens with the count.
   Palette and type from cl-base.css: pumice image boxes, cocoa ink, Sanomat
   for the title. Loaded once, from the snippet.
   ========================================================================== */

.cl-cmp {
  --cl-cmp-ease: cubic-bezier(.32, .72, 0, 1);
  --cl-cmp-rule: var(--cl-ink-13);
  position: fixed;
  inset: 0;
  z-index: 1003;
  width: 100%;
  height: 100%;
  max-width: none;
  max-height: none;
  margin: 0;
  padding: 1.5rem;
  border: 0;
  background: transparent;
  color: var(--cl-cocoa);
  overflow: hidden;
  overflow: clip;
}
.cl-cmp:not([open]) { display: none; }
.cl-cmp[open] { display: flex; align-items: center; justify-content: center; }
.cl-cmp::backdrop { background-color: var(--cl-ink-60); opacity: 0; transition: opacity 260ms cubic-bezier(.32, .72, 0, 1); }
.cl-cmp.is-open::backdrop { opacity: 1; }

.cl-cmp__panel {
  position: relative;
  display: flex;
  flex-direction: column;
  width: min(64rem, 100%);
  max-height: min(100%, 54rem);
  border-radius: 1rem;
  background-color: var(--cl-white);
  box-shadow: 0 32px 80px var(--cl-ink-28);
  overflow: hidden;
  opacity: 0;
  transform: translateY(1rem) scale(.98);
  transition: transform 260ms var(--cl-cmp-ease), opacity 200ms ease, width 320ms var(--cl-cmp-ease);
}
.cl-cmp.is-open .cl-cmp__panel { opacity: 1; transform: none; }
/* Round seventeen: the dialog widens with the selection. One pick: 64rem,
   the pick large on the left and the range in three columns on the right.
   Two: 78rem, both picks side by side, the rest two-up. Three and four: 90
   and 100rem, the picks in a row and the rest a single column of compact
   rows. The width animates, so a tick reads as the panel making room. */
.cl-cmp[data-cl-cmp-n="2"] .cl-cmp__panel { width: min(78rem, 100%); }
.cl-cmp[data-cl-cmp-n="3"] .cl-cmp__panel { width: min(90rem, 100%); }
.cl-cmp[data-cl-cmp-n="4"] .cl-cmp__panel { width: min(100rem, 100%); }
.cl-cmp__panel.is-dragging { transition: none; }

.cl-cmp__grip { display: none; flex: none; width: 2.5rem; height: .25rem; margin: .625rem auto 0; border-radius: 100px; background-color: var(--cl-ink-20); }

.cl-cmp__close {
  position: absolute;
  top: 1rem;
  right: 1rem;
  z-index: 2;
  appearance: none;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 2.5rem;
  height: 2.5rem;
  padding: 0;
  border: 0;
  border-radius: 100px;
  background-color: var(--cl-pumice);
  color: inherit;
  cursor: pointer;
  transition: background-color .15s ease;
}
.cl-cmp__close:hover { background-color: var(--cl-lucid); }
.cl-cmp__close:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: 2px; }
.cl-cmp__close svg { width: 1.125rem; height: 1.125rem; display: block; }

/* --- head ----------------------------------------------------------------- */

.cl-cmp__head { flex: none; padding: 2rem 4.5rem 1.25rem 2rem; }
.cl-cmp__eyebrow { display: block; font-size: .75rem; letter-spacing: .12em; text-transform: uppercase; color: var(--cl-ink-65); margin-bottom: .5rem; }
.cl .cl-cmp__title { margin: 0; font-family: var(--cl-font-heading); font-size: 1.875rem; line-height: 1.15; font-weight: 400; color: var(--cl-cocoa); }
.cl .cl-cmp__lead { margin: .5rem 0 0; font-size: .9375rem; color: var(--cl-ink-65); }

/* --- body ----------------------------------------------------------------- */

.cl-cmp__body { flex: 1; min-height: 0; overflow-y: auto; -webkit-overflow-scrolling: touch; padding: .25rem 2rem 1.5rem; }
.cl-cmp__label { display: block; font-size: .75rem; letter-spacing: .1em; text-transform: uppercase; color: var(--cl-ink-65); margin: 0 0 .75rem; }

/* Round seventeen: two columns. .cl-cmp__picked (the slot) on the left holds
   every picked model, large and side by side in pick order; .cl-cmp__rest on
   the right holds the range that is still open. The split follows the count:
   the picks take n shares, the rest one, so the rest column narrows as the
   picks grow and its tiles step down from three-up to two-up to compact rows. */
.cl-cmp__layout { display: grid; grid-template-columns: minmax(0, 1fr); align-items: start; }
.cl-cmp[data-cl-cmp-n="1"] .cl-cmp__layout { grid-template-columns: minmax(16rem, 1fr) minmax(0, 2fr); }
.cl-cmp[data-cl-cmp-n="2"] .cl-cmp__layout { grid-template-columns: minmax(0, 2fr) minmax(16rem, 1fr); }
.cl-cmp[data-cl-cmp-n="3"] .cl-cmp__layout { grid-template-columns: minmax(0, 3fr) minmax(15rem, 1fr); }
.cl-cmp[data-cl-cmp-n="4"] .cl-cmp__layout { grid-template-columns: minmax(0, 4fr) minmax(15rem, 1fr); }
.cl-cmp__picked { min-width: 0; padding-right: 2rem; }
.cl-cmp__picked[hidden] { display: none; }
.cl-cmp__rest { min-width: 0; }
.cl-cmp:not([data-cl-cmp-n="0"]) .cl-cmp__rest { padding-left: 2rem; border-left: 1px solid var(--cl-cmp-rule); }

.cl-cmp__slot { display: grid; grid-auto-flow: column; grid-auto-columns: minmax(0, 1fr); gap: 1rem; }

.cl-cmp__grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 1rem; }
.cl-cmp[data-cl-cmp-n="2"] .cl-cmp__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .75rem; }
.cl-cmp[data-cl-cmp-n="3"] .cl-cmp__grid,
.cl-cmp[data-cl-cmp-n="4"] .cl-cmp__grid { grid-template-columns: minmax(0, 1fr); gap: .5rem; }

.cl-cmp__tile {
  position: relative;
  display: flex;
  flex-direction: column;
  row-gap: .625rem;
  padding: .625rem;
  border: 1px solid var(--cl-cmp-rule);
  border-radius: .875rem;
  background-color: var(--cl-white);
  cursor: pointer;
  transition: border-color .2s ease, box-shadow .2s ease, opacity .2s ease, transform .2s ease;
}
.cl-cmp__tile:hover { border-color: var(--cl-ink-40); }
.cl-cmp__tile.is-on { border-color: var(--cl-cocoa); box-shadow: 0 0 0 1px var(--cl-cocoa); }
.cl-cmp__tile.is-off { opacity: .4; cursor: default; }
.cl-cmp__tile:has(.cl-cmp__check:focus-visible) { outline: 2px solid var(--cl-cocoa); outline-offset: 3px; }
.cl-cmp__check { position: absolute; opacity: 0; width: 1px; height: 1px; pointer-events: none; }

.cl-cmp__image {
  position: relative;
  display: block;
  aspect-ratio: 4 / 3;
  border-radius: .5rem;
  background-color: var(--cl-pumice);
  overflow: hidden;
}
.cl-cmp__image img { width: 100%; height: 100%; object-fit: contain; display: block; padding: .5rem; transition: transform .3s ease; }
.cl-cmp__tile:hover .cl-cmp__image img { transform: scale(1.03); }

/* Round thirteen: the same plain checkbox the collection cards now carry
   (.cl-compare-add in cl-collection.css, itself the theme's
   .cl-contact-form__box), so the control the client ticks on a card and the
   control they tick in the modal are one language. */
.cl-cmp__tick {
  position: absolute;
  top: .5rem;
  left: .5rem;
  width: 1.5rem;
  height: 1.5rem;
  border-radius: .25rem;
  border: 1px solid var(--cl-line);
  background-color: #fff;
  color: var(--cl-white);
  display: flex;
  align-items: center;
  justify-content: center;
  box-shadow: 0 .0625rem .1875rem #0000001a;
  transition: background-color .2s, border-color .2s;
}
.cl-cmp__tick svg { width: .8125rem; height: .8125rem; opacity: 0; transition: opacity .15s ease; }
.cl-cmp__tile.is-on .cl-cmp__tick { background-color: var(--cl-cocoa); border-color: var(--cl-cocoa); }
.cl-cmp__tile.is-on .cl-cmp__tick svg { opacity: 1; }

.cl-cmp__badge {
  display: none;
  position: absolute;
  top: .5rem;
  left: .5rem;
  padding: .3rem .625rem .25rem;
  border-radius: 100px;
  background-color: var(--cl-cocoa);
  color: var(--cl-white);
  font-size: .6875rem;
  letter-spacing: .08em;
  text-transform: uppercase;
}

.cl-cmp__text { display: flex; flex-direction: column; row-gap: .125rem; min-width: 0; padding: 0 .125rem .125rem; }
.cl-cmp__name { font-size: .9375rem; line-height: 1.3; font-weight: 500; }
/* custom.sauna_short_description is a rich_text_field, so the tile sub is a
   sentence of prose (stripped and truncated to 120 in the snippet). Clamped so
   a long German sentence cannot stretch one tile taller than the rest. */
.cl-cmp__sub {
  font-size: .75rem;
  line-height: 1.35;
  color: var(--cl-ink-65);
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  overflow: hidden;
}
.cl-cmp__price { font-size: .8125rem; color: var(--cl-ink-65); margin-top: .125rem; }

/* the picks: large tiles on the lucidity ground, the name in the heading
   face; the tapped one is locked and wears the badge, the others keep their
   tick so they can be put back */
.cl-cmp__slot .cl-cmp__tile { padding: .875rem; row-gap: .875rem; border-color: var(--cl-cocoa); box-shadow: 0 0 0 1px var(--cl-cocoa); background-color: var(--cl-lucidity); }
.cl-cmp__slot .cl-cmp__tile:hover .cl-cmp__image img { transform: none; }
.cl-cmp__slot .cl-cmp__name { font-family: var(--cl-font-heading); font-size: 1.375rem; font-weight: 400; line-height: 1.2; }
.cl-cmp__slot .cl-cmp__sub { font-size: .8125rem; -webkit-line-clamp: 3; }
.cl-cmp__slot .cl-cmp__price { font-size: .9375rem; color: inherit; }
.cl-cmp__tile.is-primary { cursor: default; }
.cl-cmp__tile.is-primary .cl-cmp__tick { display: none; }
.cl-cmp__tile.is-primary .cl-cmp__badge { display: inline-block; }

/* the rest at three and four picks: compact rows, photo left, name and price
   right, so a narrow column still lists the whole range without scrolling */
.cl-cmp[data-cl-cmp-n="3"] .cl-cmp__grid .cl-cmp__tile,
.cl-cmp[data-cl-cmp-n="4"] .cl-cmp__grid .cl-cmp__tile { flex-direction: row; align-items: center; column-gap: .75rem; padding: .5rem; }
.cl-cmp[data-cl-cmp-n="3"] .cl-cmp__grid .cl-cmp__image,
.cl-cmp[data-cl-cmp-n="4"] .cl-cmp__grid .cl-cmp__image { flex: none; width: 4.5rem; }
.cl-cmp[data-cl-cmp-n="3"] .cl-cmp__grid .cl-cmp__sub,
.cl-cmp[data-cl-cmp-n="4"] .cl-cmp__grid .cl-cmp__sub { display: none; }
.cl-cmp[data-cl-cmp-n="3"] .cl-cmp__grid .cl-cmp__name,
.cl-cmp[data-cl-cmp-n="4"] .cl-cmp__grid .cl-cmp__name { font-size: .875rem; }
.cl-cmp[data-cl-cmp-n="3"] .cl-cmp__grid .cl-cmp__tick,
.cl-cmp[data-cl-cmp-n="4"] .cl-cmp__grid .cl-cmp__tick { top: .25rem; left: .25rem; width: 1.25rem; height: 1.25rem; }

/* --- foot ----------------------------------------------------------------- */

.cl-cmp__foot {
  flex: none;
  display: flex;
  align-items: center;
  justify-content: space-between;
  column-gap: 1rem;
  padding: 1rem 2rem 1.5rem;
  border-top: 1px solid var(--cl-cmp-rule);
  background-color: var(--cl-white);
}
.cl-cmp__count { font-size: .9375rem; }
.cl-cmp__hint { color: var(--cl-ink-65); }
.cl .cl-cmp__go { min-width: 0; }
.cl-cmp__go.is-disabled { opacity: .45; pointer-events: none; }

/* --- breakpoints ---------------------------------------------------------- */

/* Under 992 the two columns stack: the picks in a row across the top, the
   rest under a hairline, three-up whatever the count. The compact rows are
   undone here (same specificity, later in the file). */
@media screen and (max-width: 991px) {
  .cl-cmp__layout,
  .cl-cmp[data-cl-cmp-n] .cl-cmp__layout { grid-template-columns: minmax(0, 1fr); row-gap: 1.5rem; }
  .cl-cmp__picked { padding-right: 0; }
  .cl-cmp:not([data-cl-cmp-n="0"]) .cl-cmp__rest { padding-left: 0; border-left: 0; padding-top: 1.5rem; border-top: 1px solid var(--cl-cmp-rule); }
  .cl-cmp__grid,
  .cl-cmp[data-cl-cmp-n] .cl-cmp__grid { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: .75rem; }
  .cl-cmp[data-cl-cmp-n] .cl-cmp__grid .cl-cmp__tile { flex-direction: column; align-items: stretch; column-gap: 0; padding: .625rem; }
  .cl-cmp[data-cl-cmp-n] .cl-cmp__grid .cl-cmp__image { width: auto; }
  .cl-cmp[data-cl-cmp-n] .cl-cmp__grid .cl-cmp__sub { display: -webkit-box; }
  .cl-cmp[data-cl-cmp-n] .cl-cmp__grid .cl-cmp__name { font-size: .9375rem; }
  .cl-cmp[data-cl-cmp-n] .cl-cmp__grid .cl-cmp__tick { top: .5rem; left: .5rem; width: 1.5rem; height: 1.5rem; }
  .cl-cmp__slot .cl-cmp__tile { padding: .625rem; row-gap: .625rem; }
  .cl-cmp__slot .cl-cmp__name { font-size: 1.125rem; }
}

/* Below 768 the modal is a bottom sheet: rises from the foot of the screen,
   rounded at the top, capped short of the top edge; the grip drags it down
   (window.clSheetDrag from cl-topbar). The picks become stacked rows, photo
   left, so four of them still fit above the rest. */
@media screen and (max-width: 767px) {
  .cl-cmp { padding: 0; }
  .cl-cmp[open] { flex-direction: column; justify-content: flex-end; align-items: stretch; }
  .cl-cmp__panel {
    width: 100%;
    max-height: min(92%, 100% - 2.5rem);
    border-radius: 1.25rem 1.25rem 0 0;
    opacity: 1;
    transform: translateY(100%);
    transition: transform 320ms var(--cl-cmp-ease);
  }
  /* only the width here: an attribute selector counts as a class, so this
     selector ties with .cl-cmp.is-open .cl-cmp__panel and, being later, would
     hold the sheet off-screen if it also carried the transform */
  .cl-cmp[data-cl-cmp-n] .cl-cmp__panel { width: 100%; }
  .cl-cmp__grip { display: block; }
  .cl-cmp__close { top: 1.125rem; right: 1rem; width: 2.25rem; height: 2.25rem; }
  .cl-cmp__head { padding: 1rem 3.75rem 1rem 1.25rem; }
  .cl .cl-cmp__title { font-size: 1.5rem; }
  .cl-cmp__body { padding: 0 1.25rem 1.25rem; }
  .cl-cmp__layout,
  .cl-cmp[data-cl-cmp-n] .cl-cmp__layout { row-gap: 1.25rem; }
  .cl-cmp:not([data-cl-cmp-n="0"]) .cl-cmp__rest { padding-top: 1.25rem; }
  .cl-cmp__slot { grid-auto-flow: row; grid-template-columns: minmax(0, 1fr); gap: .75rem; }
  .cl-cmp__slot .cl-cmp__tile { flex-direction: row; align-items: center; column-gap: 1rem; padding: .625rem; }
  .cl-cmp__slot .cl-cmp__image { flex: none; width: 7rem; }
  .cl-cmp__slot .cl-cmp__name { font-size: 1.0625rem; }
  .cl-cmp__grid,
  .cl-cmp[data-cl-cmp-n] .cl-cmp__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .75rem; }
  .cl-cmp[data-cl-cmp-n] .cl-cmp__grid .cl-cmp__tile { padding: .5rem; row-gap: .5rem; }
  .cl-cmp__foot { padding: .875rem 1.25rem max(1.25rem, env(safe-area-inset-bottom)); }
  .cl-cmp__count { font-size: .875rem; }
  .cl-cmp__hint { display: none; }
}
@media screen and (max-width: 479px) {
  .cl-cmp__name { font-size: .875rem; }
  /* the 2-up grid tiles have no room for prose; the picked rows do, and they
     are the ones that have to say which model you tapped */
  .cl-cmp[data-cl-cmp-n] .cl-cmp__grid .cl-cmp__sub { display: none; }
  .cl-cmp__slot .cl-cmp__sub { display: -webkit-box; -webkit-line-clamp: 3; }
  .cl .cl-cmp__go { padding-left: 1.5rem; padding-right: 1.5rem; }
}
@media (prefers-reduced-motion: reduce) {
  .cl-cmp::backdrop, .cl-cmp__panel, .cl-cmp__tile, .cl-cmp__tick, .cl-cmp__image img { transition: none; }
  .cl-cmp__panel { opacity: 1; transform: none; }
}

/* --- tray (round nineteen, client 2026-08-28) ------------------------------
   The fixed bar at the foot of the page that keeps the compare set in view
   while the dialog is closed (snippets/cl-compare-modal.liquid renders it
   after the dialog and fills it from the same sessionStorage list). Drawn
   in the compare page's pill-bar language (.cl-compare__bar: white, 100px,
   the ink-12 hairline, the 12/32 ink-15 shadow): the picks as chips on the
   left, "Auswahl öffnen", the hint and the "Vergleichen (n)" pill on the
   right. Slides up from below the viewport on .is-in; visibility follows
   the transform so a hidden tray can neither be tabbed into nor clicked.
   z-index 900: above the locale card (60), below the drawers (1002/1003)
   and the nav (1000). Below 768 it is a full-width bottom sheet, the
   chips two per row, the actions on their own row, the safe area kept.
   -------------------------------------------------------------------------- */
.cl-cmp-tray {
  --cl-cmp-ease: cubic-bezier(.32, .72, 0, 1);
  position: fixed;
  left: 0;
  right: 0;
  bottom: max(1.25rem, env(safe-area-inset-bottom));
  z-index: 900;
  display: flex;
  align-items: center;
  justify-content: space-between;
  column-gap: 1.5rem;
  /* left/right 0 with auto margins, not left 50% and a translate: a fixed
     box's percentages read the viewport minus the scrollbar, 100vw reads it
     with, and the two disagreed by the scrollbar's width */
  width: min(64rem, 100% - 2.5rem);
  margin: 0 auto;
  padding: .5rem .5rem .5rem .75rem;
  border-radius: 100px;
  background-color: var(--cl-white);
  border: 1px solid var(--cl-ink-12);
  box-shadow: 0 12px 32px var(--cl-ink-15);
  color: var(--cl-cocoa);
  opacity: 0;
  visibility: hidden;
  transform: translateY(calc(100% + 3rem));
  transition: transform 320ms var(--cl-cmp-ease), opacity 200ms ease, visibility 0s linear 320ms;
}
.cl-cmp-tray.is-in { opacity: 1; visibility: visible; transform: none; transition-delay: 0s; }

.cl-cmp-tray__picks { display: flex; align-items: center; flex-wrap: wrap; gap: .5rem; flex: 1; min-width: 0; }
.cl-cmp-tray__pick {
  display: inline-flex;
  align-items: center;
  column-gap: .5rem;
  min-width: 0;
  padding: .25rem .375rem .25rem .25rem;
  border-radius: 100px;
  background-color: var(--cl-lucidity);
}
.cl-cmp-tray__thumb { flex: none; width: 2.5rem; height: 2.5rem; border-radius: 100px; background-color: var(--cl-pumice); overflow: hidden; }
.cl-cmp-tray__thumb img { width: 100%; height: 100%; object-fit: contain; display: block; padding: .25rem; }
.cl-cmp-tray__name { font-size: .8125rem; line-height: 1.2; max-width: 12rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.cl-cmp-tray__remove {
  appearance: none;
  -webkit-appearance: none;
  flex: none;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 1.5rem;
  height: 1.5rem;
  margin: 0;
  padding: 0;
  border: 0;
  border-radius: 100px;
  background-color: transparent;
  color: var(--cl-ink-65);
  cursor: pointer;
  transition: background-color .15s ease, color .15s ease;
}
.cl-cmp-tray__remove:hover { background-color: var(--cl-ink-10); color: var(--cl-cocoa); }
.cl-cmp-tray__remove:focus-visible { outline: 2px solid var(--cl-focus); outline-offset: 1px; }
.cl-cmp-tray__remove svg { width: .75rem; height: .75rem; display: block; }

.cl-cmp-tray__actions { display: flex; align-items: center; column-gap: 1rem; flex: none; }
.cl-cmp-tray__open {
  appearance: none;
  -webkit-appearance: none;
  margin: 0;
  padding: 0;
  border: 0;
  background-color: transparent;
  font: inherit;
  font-size: .875rem;
  color: var(--cl-cocoa);
  text-decoration: underline;
  text-underline-offset: .15em;
  cursor: pointer;
  white-space: nowrap;
}
.cl-cmp-tray__open:hover { color: var(--cl-cocoa-press); }
.cl-cmp-tray__open:focus-visible { outline: 2px solid var(--cl-focus); outline-offset: 2px; border-radius: 2px; }
/* the "2 bis 4" hint shows only while the pill is inert */
.cl-cmp-tray__hint { display: none; font-size: .8125rem; color: var(--cl-ink-65); white-space: nowrap; }
.cl-cmp-tray.is-short .cl-cmp-tray__hint { display: inline; }
.cl .cl-cmp-tray__go { min-width: 0; white-space: nowrap; }
.cl-cmp-tray__go.is-disabled { pointer-events: none; opacity: .6; }

@media screen and (max-width: 767px) {
  .cl-cmp-tray {
    left: 0;
    right: 0;
    bottom: 0;
    width: auto;
    margin: 0;
    flex-direction: column;
    align-items: stretch;
    row-gap: .75rem;
    padding: .875rem 1rem max(1rem, env(safe-area-inset-bottom));
    border-radius: 1.25rem 1.25rem 0 0;
    border-bottom: 0;
    box-shadow: 0 -12px 32px var(--cl-ink-15);
    transform: translateY(calc(100% + 1rem));
  }
  .cl-cmp-tray__picks { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .5rem; }
  .cl-cmp-tray__pick { min-width: 0; }
  /* half a phone is too narrow for "Sanctuary 2 Personen Sauna" on one line: two lines, then the clamp */
  .cl-cmp-tray__name { flex: 1; max-width: none; font-size: .75rem; white-space: normal; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; }
  .cl-cmp-tray__thumb { width: 2.25rem; height: 2.25rem; }
  .cl-cmp-tray__actions { justify-content: space-between; }
  .cl-cmp-tray__hint { display: none; }
  .cl-cmp-tray.is-short .cl-cmp-tray__hint { display: inline; margin-left: auto; }
  .cl .cl-cmp-tray__go { padding-left: 1.5rem; padding-right: 1.5rem; }
}
@media (prefers-reduced-motion: reduce) {
  .cl-cmp-tray { transition: opacity 120ms ease, visibility 0s linear 120ms; transform: none; }
  .cl-cmp-tray.is-in { transform: none; }
  .cl-cmp-tray__remove { transition: none; }
}


/* cl-compare.css */
/* ==========================================================================
   Sauna comparison (sections/cl-compare.liquid). Picker cards with a tick,
   a selection bar, then the table: sticky first column, one column per
   sauna, rows dimmed where every column agrees.
   ========================================================================== */

.cl-compare { background-color: var(--cl-white); overflow-x: clip; }
.cl-compare.is-lucidity { background-color: var(--cl-lucidity); }

/* Round seventeen: the eyebrow, heading and text sit on the centre line. The
   markup carried title_row.is-centered, but that rule lives in
   cl-feature-video.css and this page never loads it, so the head was flush
   left the whole time. */
.cl-compare__head { max-width: 48rem; margin: 0 auto 3rem; display: flex; flex-direction: column; align-items: center; text-align: center; row-gap: .5rem; }
.cl .cl-compare__head .pre-heading, .cl .cl-compare__head .heading-large { margin: 0; }
.cl-compare__head .text-size-large { font-weight: 300; }

/* --- picker --------------------------------------------------------------- */

/* Round fifteen item 12. `auto-fill, minmax(11rem, 1fr)` let the viewport
   decide how many columns there were, and with seven saunas the answer at the
   client's width was six and one: a full row, then a single card alone against
   a row of white. The count is deliberate now -- four -- so seven reads as
   four over three, and the short row is CENTRED, which is what makes it look
   chosen rather than left over. Flex, not grid, because a grid row cannot
   centre its own leftovers. Four also gives each card half again the width it
   had, which is the other half of the ask: the photo is what is being picked. */
.cl-compare__picker {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 1rem;
}
.cl-compare__card {
  flex: 0 1 calc((100% - 3rem) / 4);
  position: relative;
  display: flex;
  flex-direction: column;
  row-gap: .25rem;
  padding: .75rem;
  border: 1px solid var(--cl-ink-12);
  border-radius: .75rem;
  background-color: var(--cl-white);
  cursor: pointer;
  transition: border-color .2s ease, box-shadow .2s ease, opacity .2s ease;
}
.cl-compare__card:hover { border-color: var(--cl-ink-40); }
.cl-compare__card.is-on { border-color: var(--cl-cocoa); box-shadow: 0 0 0 1px var(--cl-cocoa); }
.cl-compare__card.is-off { opacity: .45; cursor: default; }
.cl-compare__check { position: absolute; opacity: 0; width: 1px; height: 1px; pointer-events: none; }
.cl-compare__card:has(.cl-compare__check:focus-visible) { outline: 2px solid var(--cl-cocoa); outline-offset: 2px; }
.cl-compare__card-image {
  position: relative;
  display: block;
  aspect-ratio: 4 / 3;
  border-radius: .5rem;
  background-color: var(--cl-pumice);
  overflow: hidden;
  margin-bottom: .5rem;
}
.cl-compare__card-image img { width: 100%; height: 100%; object-fit: contain; display: block; padding: .5rem; }
/* Round thirteen: the picker card's tick is the theme's plain checkbox, the
   same box the collection cards and the compare modal now carry, so one
   control reads one way everywhere. Round eleven drew a round disc. */
.cl-compare__tick {
  position: absolute;
  top: .5rem;
  left: .5rem;
  width: 1.5rem;
  height: 1.5rem;
  border-radius: .25rem;
  border: 1px solid var(--cl-line);
  background-color: #fff;
  color: var(--cl-white);
  display: flex;
  align-items: center;
  justify-content: center;
  transition: background-color .2s, border-color .2s;
}
.cl-compare__tick svg { width: .75rem; height: .75rem; opacity: 0; }
.cl-compare__card.is-on .cl-compare__tick { background-color: var(--cl-cocoa); border-color: var(--cl-cocoa); }
.cl-compare__card.is-on .cl-compare__tick svg { opacity: 1; }
.cl-compare__card-name { font-size: .9375rem; line-height: 1.3; }
.cl-compare__card-sub { font-size: .8125rem; }

/* --- bar ------------------------------------------------------------------ */

/* Round seventeen: the bar sits ABOVE the picker, not under it, and it is a
   full pill (100px) so it reads as one shape with the pill button inside it.
   Still sticky, but to the top now, just under the nav (--cl-nav-h is the
   bar's bottom edge, written by cl-nav.liquid): the count, the differences
   toggle and the button stay in reach while the cards and the table scroll
   past. The .5rem right padding is the button's own gutter inside the pill. */
.cl-compare__bar {
  position: sticky;
  top: calc(var(--cl-nav-h, 6.5rem) + .75rem);
  z-index: 5;
  display: flex;
  align-items: center;
  justify-content: space-between;
  column-gap: 1rem;
  row-gap: .5rem;
  flex-wrap: wrap;
  margin: 0 0 1.5rem;
  padding: .5rem .5rem .5rem 1.5rem;
  border-radius: 100px;
  background-color: var(--cl-white);
  border: 1px solid var(--cl-ink-12);
  box-shadow: 0 12px 32px var(--cl-ink-15);
}
.cl-compare__count { font-size: .9375rem; }
.cl-compare__diff { display: inline-flex; align-items: center; column-gap: .5rem; font-size: .875rem; cursor: pointer; margin-left: auto; }
.cl-compare__diff input { accent-color: var(--cl-cocoa); width: 1rem; height: 1rem; margin: 0; }
.cl .cl-compare__go { min-width: 0; }
.cl-compare__go.is-disabled { opacity: .45; pointer-events: none; }

/* --- table ---------------------------------------------------------------
   Round thirteen: the table and every rule in it stay INSIDE container-large.
   Round eleven ran it to the screen edge with a negative margin that undid
   page-padding (5vw) and container-large (80rem centred in the 90vw band);
   the client saw the criteria rules cutting across the full viewport and
   asked for them back inside the column, where every other rule on the site
   sits. So there is no bleed and no edge maths left: the scroll container is
   the width of its parent, and the sideways scrolling happens inside that
   contained box.

   Everything else round eleven built stays: one scroll container, one sticky
   criteria column, per-column snap, the criteria line above and the "Wischen"
   pill and right fade switched by the scroll classes the section script sets.
   overflow-x: clip stays on the section as a belt-and-braces guard (and clip,
   unlike hidden, does not turn the section into a scroll container, which
   would break the sticky first column).
   -------------------------------------------------------------------------- */

/* Round nineteen (client, 2026-08-28, "spacing problems between sections"):
   the page gets a rhythm. The picker sat directly on the "Kriterien im
   Vergleich" rule (no margin at all between the last row of cards and the
   criteria line) and the table's head sat directly under that rule. Now:
   the bar keeps 1.5rem above the picker, the picker keeps 3.5rem above the
   table block (2.5rem on a phone), the criteria label keeps 1rem above its
   rule, and the head row keeps 1.5rem under it. The section's own vertical
   padding stays the template's padding-xlarge, as on the rest of the site. */
.cl-compare__table-block {
  --cl-cmp-label: 11rem;
  position: relative;
  margin-top: 3.5rem;
  /* the nav plus the sticky bar above it; the section script measures the
     bar's real height into the inline style before it scrolls (round
     nineteen: the bar is three rows tall on a phone, not 5rem) */
  scroll-margin-top: calc(var(--cl-nav-h, 6.5rem) + 5rem);
}

.cl-compare__criteria {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  column-gap: .75rem;
  row-gap: .25rem;
  padding-bottom: 1rem;
  border-bottom: 1px solid var(--cl-cocoa);
  margin-bottom: 0;
}
.cl-compare__criteria-label { font-size: .75rem; letter-spacing: .1em; text-transform: uppercase; color: var(--cl-cocoa); }
.cl-compare__criteria-text { font-size: .8125rem; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; flex: 1; }

.cl-compare__swipe {
  display: inline-flex;
  align-items: center;
  column-gap: .375rem;
  margin-left: auto;
  padding: .3rem .75rem .25rem;
  border-radius: 100px;
  background-color: var(--cl-cocoa);
  color: var(--cl-white);
  font-size: .75rem;
  letter-spacing: .02em;
  white-space: nowrap;
  animation: cl-cmp-nudge 2.4s ease-in-out 3;
}
.cl-compare__swipe[hidden] { display: none; }
.cl-compare__swipe svg { width: .875rem; height: .875rem; display: block; }
@keyframes cl-cmp-nudge {
  0%, 60%, 100% { transform: translateX(0); }
  75% { transform: translateX(.25rem); }
}

.cl-compare__scroll {
  overflow-x: auto;
  overflow-y: hidden;
  -webkit-overflow-scrolling: touch;
  scroll-snap-type: x proximity;
  scroll-padding-left: var(--cl-cmp-label);
  overscroll-behavior-x: contain;
}
.cl-compare__scroll:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: -2px; }

/* the fade sits over the scroller's right edge, outside it so it does not
   scroll away; gone at the end of the run and when there is nothing to pan */
.cl-compare__table-block::after {
  content: "";
  position: absolute;
  top: 2.5rem;
  bottom: 0;
  right: 0;
  width: 4.5rem;
  z-index: 2;
  pointer-events: none;
  opacity: 0;
  transition: opacity .2s ease;
  background: linear-gradient(to left, var(--cl-white) 20%, #ffffffe0 55%, #ffffff00);
}
.cl-compare.is-lucidity .cl-compare__table-block::after { background: linear-gradient(to left, var(--cl-lucidity) 20%, #f9f3efe0 55%, #f9f3ef00); }
.cl-compare__table-block:has(.cl-compare__scroll.is-scrollable:not(.is-end))::after { opacity: 1; }

.cl-compare__table { width: 100%; border-collapse: separate; border-spacing: 0; min-width: 40rem; }
.cl-compare__table[hidden] { display: none; }
.cl-compare__table th,
.cl-compare__table td { padding: .875rem 1rem; border-bottom: 1px solid var(--cl-ink-10); vertical-align: top; text-align: left; font-size: .9375rem; }
/* contained now, so the first and last cells sit flush with the column edge
   instead of one cell gutter inside it */
.cl-compare__table tr > *:first-child { padding-left: 0; }
.cl-compare__table tr > *:last-child { padding-right: 0; }
/* round nineteen: the head row breathes under the criteria rule (was .875rem) */
.cl-compare__table thead th { padding-top: 1.5rem; padding-bottom: 1.25rem; vertical-align: bottom; border-bottom: 1px solid var(--cl-cocoa); }
.cl-compare__table tbody th,
.cl-compare__corner {
  position: sticky;
  left: 0;
  z-index: 1;
  width: var(--cl-cmp-label);
  min-width: var(--cl-cmp-label);
  background-color: var(--cl-white);
}
.cl-compare.is-lucidity .cl-compare__table tbody th,
.cl-compare.is-lucidity .cl-compare__corner { background-color: var(--cl-lucidity); }
.cl-compare__table tbody th { font-weight: 500; display: table-cell; }
/* hairline between the pinned criteria and the columns sliding under it */
.cl-compare__table tbody th::after,
.cl-compare__corner::after {
  content: "";
  position: absolute;
  top: 0;
  bottom: 0;
  right: 0;
  width: 1px;
  background-color: var(--cl-ink-10);
  opacity: 0;
  transition: opacity .2s ease;
}
.cl-compare__scroll.is-scrollable:not(.is-start) .cl-compare__table tbody th::after,
.cl-compare__scroll.is-scrollable:not(.is-start) .cl-compare__corner::after { opacity: 1; }
.cl-compare__corner { font-size: .75rem; letter-spacing: .1em; text-transform: uppercase; font-weight: 400; color: var(--cl-ink-65); }

.cl-compare__row-icon { float: left; width: 1.125rem; height: 1.125rem; margin: .0625rem .5rem 0 0; color: var(--cl-cocoa); }
.cl-compare__row-icon svg { width: 100%; height: 100%; display: block; }
.cl-compare__row-label { display: block; hyphens: auto; }

.cl-compare__col { min-width: 12rem; scroll-snap-align: start; }
.cl-compare__table tbody td { scroll-snap-align: start; }
.cl-compare__prod { display: flex; flex-direction: column; row-gap: .5rem; color: inherit; text-decoration: none; }
.cl-compare__prod:hover .cl-compare__prod-name { text-decoration: underline; text-underline-offset: .15em; }
.cl-compare__prod-image { display: block; width: 100%; max-width: 11rem; aspect-ratio: 4 / 3; border-radius: .5rem; background-color: var(--cl-pumice); overflow: hidden; }
.cl-compare__prod-image img { width: 100%; height: 100%; object-fit: contain; display: block; padding: .5rem; }
.cl-compare__prod-name { font-family: var(--cl-font-heading); font-size: 1.25rem; line-height: 1.2; font-weight: 400; }
.cl-compare__table tr.is-same td { color: var(--cl-ink-65); }
.cl-compare__table tr.is-diff td { font-weight: 500; }
.cl-compare__na { color: var(--cl-ink-35); }
/* the CTA row closes the table: no hairline under the buttons, and none under
   the pinned cell beside them either (the row's th kept one, which read as a
   stray border under the very bottom of the table) */
.cl-compare__actions th,
.cl-compare__actions td { border-bottom: 0; }
.cl-compare__actions td { padding-top: 1.25rem; }
.cl-compare__actions .button { min-width: 0; width: 100%; }
.cl-compare__sheet { display: block; text-align: center; margin-top: .5rem; color: inherit; text-decoration: underline; text-underline-offset: .15em; }
.cl-compare__empty[hidden] { display: none; }
.cl-compare__empty { margin-top: 1.5rem; }

@media screen and (max-width: 767px) {
  .cl-compare__picker { gap: .75rem; }
  .cl-compare__card { flex-basis: calc((100% - .75rem) / 2); }
  .cl-compare__head { margin-bottom: 2rem; }
  .cl-compare__bar { top: calc(var(--cl-nav-h, 5rem) + .5rem); padding: .5rem .5rem .5rem 1rem; border-radius: 1.75rem; }
  .cl-compare__count { font-size: .875rem; }
  .cl-compare__table-block { --cl-cmp-label: 7.5rem; margin-top: 2.5rem; }
  .cl-compare__criteria-text { display: none; }
  .cl-compare__table th, .cl-compare__table td { padding: .75rem; font-size: .875rem; }
  .cl-compare__table thead th { padding-top: 1.25rem; padding-bottom: 1rem; }
  .cl-compare__table tbody th { font-size: .8125rem; }
  .cl-compare__col { min-width: 11rem; }
  .cl-compare__prod-name { font-size: 1.0625rem; }
  .cl-compare__row-icon { width: 1rem; height: 1rem; margin-right: .375rem; }
  .cl-compare__table-block::after { width: 3rem; }
}
@media screen and (max-width: 479px) {
  .cl-compare__table-block { --cl-cmp-label: 7rem; }
  .cl-compare__table { min-width: 0; }
  .cl-compare__col { min-width: 9.5rem; }
  .cl-compare__swipe { font-size: .6875rem; }
}
@media (prefers-reduced-motion: reduce) {
  .cl-compare__card, .cl-compare__tick, .cl-compare__table-block::after, .cl-compare__table tbody th::after, .cl-compare__corner::after { transition: none; }
  .cl-compare__swipe { animation: none; }
}

/* Round seventeen: no hover choreography on the picker. Round sixteen lifted
   the hovered card and faded and blurred its siblings; the client wants that
   on the nav dropdown's model strip (cl-nav.css) and NOT here. A card under
   the pointer darkens its border, and that is all. */


/* cl-contact-form.css */
/* ==========================================================================
   Contact / lead form. Port of section-contact (canonical), section_rd-contact,
   header2_component form heroes, form-section (sale band) and section-pop-up.

   Every value below was read with tools/extract-section.mjs from
     kontakt/infrarotkabine-fuer-ihr-unternehmen.html :: .section-contact
     katalog-anfordern.html :: .section-header
     promotions/sauna-sale-detox.html :: .form-section
     index.html :: .section-pop-up (+ its .pop-up wrapper)
   plus the Webflow framework (css/components.css) and the <style> snippet in
   every page <head>, which the compiled stylesheet does not contain but which
   decides the input type: `.w-input, .w-select { color: inherit; font-size:
   inherit }`, `* { -webkit-appearance: none }`, `textarea { resize: none }`.

   Shared form parts
     .w-form                       margin 0 0 15px                       → __component (inline/popup)
     .contact4_form                grid 1fr, gap 1.5rem, padding 1.5rem 0   → __form (inline/popup)
     .form-field-2col              grid 1fr 1fr, gap 1.5rem               → __row
     .form-field-2col.is-mobile-1col   767: 1fr                          → .is-stack-767
     .form-field-2col-2            same, 479: 1fr                        → .is-stack-479
     .form-field-wrapper           position relative                     → __field
     .field-label (+ label)        display block, mb .5rem, weight 300   → __label
     .w-input/.w-select + .form-input
                                   display block, width 100%, bg #fff, color inherit,
                                   font-size inherit, line-height 1.6, padding .5rem .75rem,
                                   min-height 2.75rem, border 0 0 1px solid lucid, radius 0
                                   focus: border-bottom cocoa   placeholder #0009
     .form-input.select            bg #fff, chevron (images/BiChevronDown.svg) at 98% / 1rem
     .form-input.text-area         min-height 11.25rem, padding-block .75rem, overflow auto
     .w-checkbox + .checkbox-wrapper
                                   display flex, align center, mb 0, padding-left 1.25rem,
                                   weight 500 (from label)
     .w-checkbox-input + .form-checkbox
                                   1.5rem square, border 1px solid cocoa, bg #fff, radius 0,
                                   margin 0 0 0 -1.25rem, transition all .2s
     .form-checkbox.w--redirected-checked   bg cocoa, checkmark, background-size 16px
     .form-checkbox-label.w-form-label      padding-left 1rem, .94rem, weight 300, mb 0, left
     .form-checkbox-label-3 (band)          same without the .94rem
     .form-button-wrap             flex column, align center, row-gap 1rem, padding-top 10px,
                                   text-align center
     .form-button-wrap-2 (band)    padding-top 20px
     .button.pointer               = .button from cl-base.css (cocoa fill)
     .success-message-2            bg light-grey, padding 1.5rem; .success-text weight 600
     .error-message                mt 1.5rem, padding .875rem 1rem; .error-text #e23939

   Tabs (contact-button-tabs_wrapper)
     .contact-button-tabs_wrapper  display block, mb 2rem (column-gap is inert on a block)
     .contact-button-tab.w-inline-block
                                   inline-block, max-width 100%, padding .2rem,
                                   border-bottom 1px solid #8d464600, radius 2rem 2rem 0 0,
                                   transition all .14s; hover: 2px #3e303733;
                                   .w--current: 2px solid cocoa; .tab-2: margin-left 1rem
     .button.form-tab              .button minus fill: min-width 0, padding 0, border none,
                                   bg transparent, color cocoa; 479: font-size .7rem

   Inline section (section-contact)
     .section-contact              bg lucid, margin-bottom 20px
     .header-extra-pad_global      height 4rem
     .margin-bottom.margin-large   20px, because the stock .margin-bottom lands after the
                                   scale class; 991: 2.5rem  767: 2rem (the scale wins there)
     .margin-bottom.margin-small   0 (combo rule restates margin-bottom: 0)
     .margin-bottom (bare)         0 0 20px
     .heading-medium               767: line-height 1.4  479: 1.2 (cl-base keeps 1.2)
     .container-small-3 (rd)       48rem; .heading-medium-6 text-align center; .margin-bottom-4 20px

   Hero (header2_component, katalog-anfordern / ebook page)
     .section-header               color #fff, padding-top 4rem, position relative; 991: 5rem
     .header-short                 flex, center both, text-align center, min-height 80vh,
                                   max-height 60rem; 991: 50rem  767: 36rem
     .header2_component            grid 1fr 1fr, col-gap 5rem, row-gap 4rem, align center;
                                   991: 1fr, col-gap 0  767: row-gap 3rem
     .header2_image-wrapper        empty cell; 991: display none
     .heading-large                text-align left, 3rem, no letter-spacing; 479: 1.8rem / 1.3
     .pre-heading                  991: text-align left
     .header2_form-block           text-align center, max-width 30rem, mb 0
     .header2_form                 grid 1fr, gap 1rem, color cocoa, mb 1rem; 479: row-gap .75rem
     .form-privacy-check-wrap      color #fff, padding 5px
     .button-wrapper               inline-block
     .header_background-image-wrapper   absolute inset 0; img cover
                                   991: object-position 100% 50%  767: 75%  479: 57%

   Band (form-section, sauna-sale-detox)
     .page-padding.background-color-lucid.margin-top   bg lucid, margin-top 0
     .sale-form-component          flex column, align center; 991: mb 40px  479: mt 20px
     .heading-large-2              3rem / 400 / 1.2; 991: 2.25rem + mb 2rem  767: 2rem
     .subheading-medium-2          1.375rem / 400; 767: 1.3rem  479: 1.2rem
     .sale-contact-form            text-align center, max-width 40rem, mb 0
     .sale-form                    flex column, align stretch, gap 15px, margin-top 40px
     .text-link-under-button       margin-top 20px

   Popup (section-pop-up, index.html; present on 63 pages after the footer)
     .pop-up                       fixed inset 0, z 1001, bg #3e303766, overflow scroll,
                                   display none (IX2 fades opacity 400ms in / 500ms out)
     .pop-up_contact-form-wrapper  bg lucid, max-width 80rem, margin auto, padding 0 1rem,
                                   position relative, z 1
     .x-box                        absolute top right, mt 1rem, mr 2rem, padding 1.2rem, z 2
     .icon-embed-xsmall            1.5rem square flex
     .pop-up_close                 absolute inset 0, z 0 (the backdrop click target)

   Deviations, all deliberate:
     - The privacy checkbox renders unticked. The export pre-ticks a mandatory
       consent box, which is not valid consent under the GDPR.
     - Keyboard focus on the custom checkbox gets a 2px golden outline; the
       export only turned the 1px border black.
     - The select chevron is inlined as a data URI instead of the export's
       images/BiChevronDown.svg (same path data, same 1rem size).
   ========================================================================== */

/* --- backgrounds ----------------------------------------------------------- */
.cl-contact-form.is-inline,
.cl-contact-form.is-popup .cl-contact-form__panel,
.cl-contact-form.is-band .page-padding { background-color: var(--cl-lucid); }
.cl-contact-form.is-inline.is-bg-white,
.cl-contact-form.is-band.is-bg-white .page-padding { background-color: var(--cl-white); }
.cl-contact-form.is-inline.is-bg-lucidity,
.cl-contact-form.is-band.is-bg-lucidity .page-padding { background-color: var(--cl-lucidity); }
.cl-contact-form.is-inline.is-bg-pumice,
.cl-contact-form.is-band.is-bg-pumice .page-padding { background-color: var(--cl-pumice); }

/* .section-contact carries a 20px bottom margin in the export: a white gap
   below the lucid band on every contact page. Round fifteen item 27 takes it
   off, with the wrapper's own 7rem of bottom padding: on a page whose whole
   point is the form, 132px of empty ground between the last step and the
   section under it read as the page having ended. The next band now follows
   the card. */
.cl-contact-form.is-inline { margin-bottom: 0; }
.cl-contact-form.is-inline > .page-padding > .container-large > .padding-vertical { padding-bottom: 3rem; }

/* .header-extra-pad_global, the spacer that clears the fixed navigation */
.cl-contact-form__spacer { height: 4rem; }

/* .container-small-3 on the campaign instance */
.cl-contact-form .container-small.is-narrow { max-width: 48rem; }

/* --- heading block (inline, popup) ------------------------------------------ */
/* .margin-bottom.margin-large: the stock 20px wins at desktop, the scale at the
   breakpoints. cl-base resolves the same classes to 3rem / 2.5rem / 2rem. */
.cl-contact-form__head { margin-bottom: 20px; }
/* Round fifteen item 22: eyebrow, headline and subtext are one block, so the
   two gaps inside it are the same and small. The eyebrow carried .pre-heading's
   own 2rem, which read as three separate things stacked. */
.cl-contact-form__head .pre-heading, .cl-contact-form__head .cl-contact-form__title { margin-bottom: .5rem; }
.cl-contact-form__title { margin-bottom: 0; }          /* .margin-bottom.margin-small → 0 */
.cl-contact-form__intro { margin-bottom: 20px; }       /* bare .margin-bottom */
.cl-contact-form__intro.is-tight { margin-bottom: 0; } /* .margin-bottom.margin-small inside the head */
.cl-contact-form__intro.is-spaced { margin-bottom: 0; }  /* the head owns the space below now */
.cl-contact-form .text-align-center .max-width-medium,
.cl-contact-form .text-align-center .max-width-large { margin-inline: auto; }

/* the heading steps cl-base lacks */
.cl-contact-form .heading-large { text-align: left; letter-spacing: normal; }
.cl-contact-form.is-band .heading-large,
.cl-contact-form .text-align-center .heading-large { text-align: inherit; }


/* --- contact page head, steps and model picker (round eleven) ---------------
   The "Preise anfordern" page (/pages/infrarotkabine-fuer-zuhause, the
   HubSpot price form) was a heading, a paragraph and a bare form on a sand
   band. It now reads as a page: a two-column head with a photo and three
   reassurance lines, then two numbered steps, "Modell wählen" and "Ihre
   Daten". Every value here is the theme's own scale; nothing is ported from
   the export, which has none of it. Off for the other layouts, so the
   catalogue hero, the sale band and the popup are untouched. */
.cl-contact-form__lead.has-image {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 28rem;
  column-gap: 4rem;
  align-items: center;
}
.cl-contact-form__lead-media {
  position: relative;
  border-radius: .75rem;
  overflow: hidden;
  aspect-ratio: 4 / 3;
}
.cl-contact-form__lead-media img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; display: block; }
.cl-contact-form__eyebrow { margin-bottom: .75rem; }

.cl-contact-form__trust {
  list-style: none;
  margin: 1.5rem 0 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  column-gap: 1.75rem;
  row-gap: .5rem;
  font-size: .9375rem;
  font-weight: 300;
}
.cl-contact-form__trust li { position: relative; padding-left: 1.5rem; }
.cl-contact-form__trust li::before {
  content: "";
  position: absolute;
  left: 0;
  top: .2em;
  width: 1rem;
  height: 1rem;
  background-color: currentColor;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' d='M3 8.5l3.2 3.2L13 4.8'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' d='M3 8.5l3.2 3.2L13 4.8'/%3E%3C/svg%3E") center / contain no-repeat;
  opacity: .8;
}

/* --- the stepped flow (round thirteen 21, 22) --------------------------------
   Round eleven put the model picker and the form in two cards, one under the
   other, both always open. The client read them as two unrelated things and
   asked for a stepped flow. Now one frame carries a progress indicator, one
   step body at a time, a compact summary of what is already answered, and one
   submit at the end. Everything is server-rendered visible; the engine in the
   section hides what is not the current step, so with no JavaScript this is
   the long form it used to be. */
.cl-contact-form__flow {
  position: relative;
  margin-top: 3rem;
  border: 1px solid var(--cl-lucid);
  border-radius: .875rem;
  background-color: var(--cl-white);
}
.cl-contact-form.is-bg-white .cl-contact-form__flow,
.cl-contact-form.is-bg-lucidity .cl-contact-form__flow { background-color: var(--cl-lucidity); }
.cl-contact-form__flow-body { position: relative; z-index: 1; padding: 1.75rem 2.25rem 2rem; }

/* item 23: the frame's ground and accent morph with the customer type.
   Two layers cross-fade on opacity (privat is the warm lucid wash, gewerblich
   the cooler terra one) while the frame's own ground and border transition to
   the matching value. 240ms, and nothing at all under reduced motion. */
.cl-contact-form__flow { transition: background-color .24s ease, border-color .24s ease; }
/* Round fifteen item 24: the two radial washes are gone, element and all. They
   were the private/commercial cue, but read as a stray gradient across the top
   left of step one -- the client's word for it was that it has nothing to do
   with anything. The cue survives in the frame itself, whose ground and border
   still cross-fade between the two panes; that is the half that reads as a
   change of context rather than as a decoration. */
.cl-contact-form.is-pane-commercial .cl-contact-form__flow {
  background-color: var(--cl-light-grey);
  border-color: var(--cl-nimbus);
}
/* the accent follows the ground: the same hairlines inside the frame */
.cl-contact-form__progress,
.cl-contact-form__nav,
.cl-contact-form__echo,
.cl-contact-form__summary,
.cl-contact-form__model { transition: border-color .24s ease, background-color .24s ease; }
.cl-contact-form.is-pane-commercial .cl-contact-form__progress,
.cl-contact-form.is-pane-commercial .cl-contact-form__nav,
.cl-contact-form.is-pane-commercial .cl-contact-form__echo,
.cl-contact-form.is-pane-commercial .cl-contact-form__summary { border-color: var(--cl-nimbus); }
.cl-contact-form.is-pane-commercial .cl-contact-form__summary { background-color: #00433f0b; }

/* Round fifteen items 23 and 25, one cause. Every list in this section sets
   `padding: 0` on its own single class, and cl-base's `.cl ul` (1.25rem) and
   `.cl ol` (2.5rem) outspecify that, so all three sat indented: the trust ticks
   under the hero by 20px, the step row by 40px, the summary by 20px. None is a
   bulleted list -- all three are `list-style: none` -- so the indent was dead
   space, and on the step row it put the whole progress line 40px right of the
   card, the echo and every field under it. */
.cl .cl-contact-form__progress,
.cl .cl-contact-form__trust,
.cl .cl-contact-form__summary-list { padding-left: 0; }

/* The step row's `is-done` also collides with cl-base's `.cl .is-done::after`,
   a utility that appends a check glyph to anything carrying the class: the step
   drew its own tick inside the dot AND inherited a second one after the label.
   The dot's is the one that was designed. */
.cl .cl-contact-form__progress-step.is-done::after { content: none; }

/* progress: one row of numbered dots joined by hairlines, the passed ones
   ticked. The dot is the only thing left under 480, plus the current name. */
.cl-contact-form__progress {
  list-style: none;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: .5rem .25rem;
  margin: 0 0 1.75rem;
  padding: 0 0 1.5rem;
  border-bottom: 1px solid var(--cl-lucid);
}
.cl-contact-form__progress-step { display: flex; align-items: center; min-width: 0; }
.cl-contact-form__progress-step + .cl-contact-form__progress-step::before {
  content: "";
  flex: none;
  width: 1.75rem;
  height: 1px;
  margin: 0 .5rem;
  background-color: var(--cl-nimbus);
}
.cl-contact-form__progress-btn {
  display: flex;
  align-items: center;
  column-gap: .625rem;
  min-width: 0;
  margin: 0;
  padding: 0;
  border: 0;
  background: transparent;
  color: inherit;
  font: inherit;
  text-align: left;
  cursor: pointer;
}
.cl-contact-form__progress-btn:disabled { cursor: default; }
.cl-contact-form__progress-btn:focus-visible { outline: 2px solid var(--cl-focus); outline-offset: 3px; border-radius: 100px; }
.cl-contact-form__progress-dot {
  position: relative;
  flex: none;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 1.75rem;
  height: 1.75rem;
  border: 1px solid var(--cl-line);
  border-radius: 50%;
  background-color: var(--cl-white);
  font-size: .8125rem;
  font-weight: 500;
  transition: background-color .2s ease, border-color .2s ease, color .2s ease;
}
.cl-contact-form__progress-name {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-size: .875rem;
  font-weight: 400;
  opacity: .6;
}
.cl-contact-form__progress-step.is-current .cl-contact-form__progress-dot {
  background-color: var(--cl-cocoa);
  border-color: var(--cl-cocoa);
  color: var(--cl-white);
}
.cl-contact-form__progress-step.is-current .cl-contact-form__progress-name { opacity: 1; font-weight: 500; }
.cl-contact-form__progress-step.is-done .cl-contact-form__progress-dot {
  background-color: var(--cl-lucid);
  border-color: var(--cl-lucid);
  color: transparent;
}
.cl-contact-form__progress-step.is-done .cl-contact-form__progress-dot::after {
  content: "";
  position: absolute;
  inset: 0;
  background-color: var(--cl-cocoa);
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' d='M3.5 8.5l3 3 6-7'/%3E%3C/svg%3E") center / .875rem no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' d='M3.5 8.5l3 3 6-7'/%3E%3C/svg%3E") center / .875rem no-repeat;
}
.cl-contact-form__progress-step.is-done .cl-contact-form__progress-name { opacity: .85; }

/* item 22: the model picked in step 1, echoed at the top of every later step
   with its thumbnail and a link back, so the two halves read as one request
   rather than two unrelated things. The thumbnail is the picked card's own
   node, cloned, so there is one image to keep right. */
.cl-contact-form__echo {
  display: flex;
  align-items: center;
  column-gap: 1rem;
  margin: 0 0 1.5rem;
  padding: .625rem .875rem;
  border: 1px solid var(--cl-nimbus);
  border-radius: .625rem;
  background-color: var(--cl-white);
}
.cl-contact-form__echo-thumb {
  position: relative;
  flex: none;
  width: 3.25rem;
  height: 3.25rem;
  border-radius: .5rem;
  overflow: hidden;
  background-color: var(--cl-lucidity);
}
.cl-contact-form__echo-thumb > * { position: absolute; inset: 0; width: 100%; height: 100%; border-radius: 0; }
.cl-contact-form__echo-text { display: block; min-width: 0; }
.cl-contact-form__echo-label {
  display: block;
  font-size: .6875rem;
  font-weight: 500;
  letter-spacing: 1px;
  text-transform: uppercase;
  opacity: .55;
}
.cl-contact-form__echo-name { display: block; margin-top: .125rem; font-size: .9375rem; font-weight: 500; }
.cl-contact-form__echo-change {
  margin-left: auto;
  padding: 0;
  border: 0;
  background: transparent;
  color: inherit;
  font: inherit;
  font-size: .8125rem;
  text-decoration: underline;
  cursor: pointer;
  opacity: .7;
}
.cl-contact-form__echo-change:hover { opacity: 1; }
.cl-contact-form__echo-change:focus-visible { outline: 2px solid var(--cl-focus); outline-offset: 2px; }

.cl-contact-form__stephead { margin-bottom: 0; }
.cl-contact-form__step-title {
  font-family: var(--cl-font-heading);
  font-size: 1.5rem;
  font-weight: 400;
  line-height: 1.3;
  margin: 0;
}
.cl-contact-form__step-text {
  margin: .375rem 0 0;
  font-size: .9375rem;
  font-weight: 300;
}
/* the form inside the frame already pads itself top and bottom */
.cl-contact-form__flow .cl-contact-form__component { margin-bottom: 0; }
.cl-contact-form__flow .cl-contact-form__form { padding-bottom: 0; }
/* one step of the form is one grid item of it, so it repeats its own row gap */
.cl-contact-form__formstep { display: grid; grid-template-columns: 1fr; row-gap: 1.5rem; }

/* a compact record of everything answered so far, one change link per step */
.cl-contact-form__summary {
  margin: 0 0 1.5rem;
  padding: .875rem 1rem;
  border: 1px solid var(--cl-lucid);
  border-radius: .625rem;
  background-color: #ead8cb38;
}
.cl-contact-form__summary-label {
  display: block;
  margin-bottom: .5rem;
  font-size: .6875rem;
  font-weight: 500;
  letter-spacing: 1px;
  text-transform: uppercase;
  opacity: .55;
}
.cl-contact-form__summary-list {
  list-style: none;
  display: flex;
  flex-wrap: wrap;
  gap: .375rem .5rem;
  margin: 0;
  padding: 0;
}
.cl-contact-form__summary-item {
  display: inline-flex;
  align-items: baseline;
  column-gap: .375rem;
  padding: .25rem .625rem;
  border: 1px solid var(--cl-lucid);
  border-radius: 100px;
  background-color: var(--cl-white);
  font-size: .8125rem;
  max-width: 100%;
}
.cl-contact-form__summary-key { opacity: .6; }
.cl-contact-form__summary-value { font-weight: 500; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cl-contact-form__summary-change {
  margin: 0 0 0 .125rem;
  padding: 0;
  border: 0;
  background: transparent;
  color: inherit;
  font: inherit;
  font-size: .75rem;
  text-decoration: underline;
  opacity: .6;
  cursor: pointer;
}
.cl-contact-form__summary-change:hover { opacity: 1; }

/* back / next. The last step has no next: the form's own submit ends it. */
.cl-contact-form__nav {
  display: flex;
  align-items: center;
  column-gap: 1rem;
  margin-top: 2rem;
  padding-top: 1.5rem;
  border-top: 1px solid var(--cl-lucid);
}
.cl-contact-form__nav .cl-contact-form__next { margin-left: auto; }
.cl-contact-form .cl-contact-form__back,
.cl-contact-form .cl-contact-form__next {
  min-width: 9rem;
  cursor: pointer;
  font-family: inherit;
  -webkit-appearance: none;
  appearance: none;
}
.cl-contact-form__step-error { margin: .875rem 0 0; font-size: .8125rem; font-weight: 400; color: var(--cl-dark-red); }

/* --- model picker ----------------------------------------------------------
   Item 21: a compact card with a thumbnail of that sauna. The photo comes off
   the store (all_products[handle].featured_image); a handle the store does not
   have leaves the initial square, never a broken card. */
/* 17rem is the width at which "Sanctuary Outdoor 2" stops wrapping beside a
   4rem thumbnail: three across in container-medium, two in container-small */
.cl-contact-form__models {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(17rem, 1fr));
  gap: .75rem;
  margin-top: 1.25rem;
}
.cl-contact-form__model {
  position: relative;
  display: flex;
  align-items: center;
  column-gap: .875rem;
  margin: 0;
  padding: .625rem .875rem .625rem .625rem;
  border: 1px solid var(--cl-nimbus);
  border-radius: .625rem;
  cursor: pointer;
  background-color: var(--cl-white);
  transition: border-color .15s ease, box-shadow .15s ease, background-color .15s ease;
}
.cl-contact-form__model:hover { border-color: var(--cl-line); }
.cl-contact-form__model input {
  position: absolute;
  width: 1px;
  height: 1px;
  opacity: 0;
  margin: 0;
  pointer-events: none;
}
.cl-contact-form__model:has(input:checked),
.cl-contact-form__model.is-on {
  border-color: var(--cl-cocoa);
  box-shadow: 0 0 0 1px var(--cl-cocoa);
  background-color: #ead8cb4d;
}
.cl-contact-form__model:has(input:focus-visible) { outline: 2px solid var(--cl-focus); outline-offset: 2px; }
/* the photo is absolute inside the square: with height:100% on the <img> the
   intrinsic ratio wins over the box (it is a preference, not a clamp) and
   every card in a row ends up a different height */
.cl-contact-form__model-img {
  position: relative;
  flex: none;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 4rem;
  height: 4rem;
  border-radius: .5rem;
  overflow: hidden;
  background-color: var(--cl-lucidity);
}
.cl-contact-form__model-img img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; display: block; }
.cl-contact-form__model-initial { font-family: var(--cl-font-heading); font-size: 1.375rem; line-height: 1; opacity: .45; }
.cl-contact-form__model-text { display: block; min-width: 0; }
.cl-contact-form__model-name { display: block; font-size: .9375rem; font-weight: 500; }
.cl-contact-form__model-sub { display: block; margin-top: .125rem; font-size: .8125rem; font-weight: 300; opacity: .75; }
.cl-contact-form__model-tick {
  flex: none;
  margin-left: auto;
  width: 1.375rem;
  height: 1.375rem;
  border-radius: 50%;
  border: 1px solid var(--cl-line);
  background-color: var(--cl-white);
}
.cl-contact-form__model:has(input:checked) .cl-contact-form__model-tick,
.cl-contact-form__model.is-on .cl-contact-form__model-tick {
  background-color: var(--cl-cocoa);
  border-color: var(--cl-cocoa);
  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='%23fff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' d='M3.5 8.5l3 3 6-7'/%3E%3C/svg%3E");
  background-position: 50%;
  background-repeat: no-repeat;
  background-size: 14px 14px;
}

/* --- tabs ------------------------------------------------------------------
   Round eleven: the export's text tabs with a hairline underline read as two
   links, and on the HubSpot page the switch did nothing. Now a segmented pill
   (real role=tab buttons, panes below), the same on every contact page. */
.cl-contact-form__tabs {
  position: relative;
  display: inline-flex;
  max-width: 100%;
  margin-bottom: 1.5rem;
  padding: .25rem;
  background-color: var(--cl-white);
  border: 1px solid var(--cl-nimbus);
  border-radius: 100px;
}

/* item 23: the highlight behind the active tab slides instead of cutting.
   The tab's own fill below is the no-JavaScript state; .is-glide arrives once
   the script has measured a tab, and hands the fill to the highlight. */
.cl-contact-form__tab-glider {
  position: absolute;
  top: .25rem;
  left: 0;
  z-index: 0;
  width: var(--cl-glide-w, 0);
  height: calc(100% - .5rem);
  border-radius: 100px;
  background-color: var(--cl-cocoa);
  opacity: 0;
  transform: translateX(var(--cl-glide-x, 0));
  transition: transform .24s cubic-bezier(.4, 0, .2, 1), width .24s cubic-bezier(.4, 0, .2, 1), background-color .24s ease;
}
.cl-contact-form__tabs.is-glide .cl-contact-form__tab-glider { opacity: 1; }
/* a window resize repositions the highlight without animating; the script
   suppresses the transition inline for that one write, because a class left on
   for a frame also silenced the next real switch */
.cl-contact-form__tab {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  margin: 0;
  padding: 0;
  background-color: transparent;
  border: 0;
  border-radius: 100px;
  color: var(--cl-cocoa);
  font-family: inherit;
  cursor: pointer;
  transition: background-color .18s ease, color .18s ease;
}
.cl-contact-form__tab + .cl-contact-form__tab { margin-left: .25rem; }
.cl-contact-form__tab:hover { background-color: var(--cl-lucidity); }
.cl-contact-form__tab.is-current,
.cl-contact-form__tab[aria-selected="true"] { background-color: var(--cl-cocoa); color: var(--cl-white); }
.cl-contact-form__tabs.is-glide .cl-contact-form__tab.is-current,
.cl-contact-form__tabs.is-glide .cl-contact-form__tab[aria-selected="true"] { background-color: transparent; }
/* the label rides above the highlight */
.cl-contact-form .button.form-tab { position: relative; z-index: 1; }
.cl-contact-form__tab:focus-visible { outline: 2px solid var(--cl-focus); outline-offset: 2px; }
.cl-contact-form .button.form-tab {
  min-width: 0;
  padding: .625rem 1.25rem;
  color: inherit;
  background-color: transparent;
  border-style: none;
  font-size: .75rem;
  letter-spacing: 1.2px;
  white-space: nowrap;
}
.cl-contact-form.is-hero .cl-contact-form__tabs { border-color: transparent; }

/* panes: the [hidden] one is display:none through the rule below */
.cl-contact-form__pane:focus-visible { outline: 2px solid var(--cl-focus); outline-offset: 4px; }

/* --- component and form ------------------------------------------------------ */
.cl-contact-form__component { margin: 0 0 15px; scroll-margin-top: 8rem; } /* .w-form; the margin clears the fixed nav when a #gewerblich link scrolls here */
.cl-contact-form.is-hero .cl-contact-form__component,
.cl-contact-form.is-band .cl-contact-form__component { margin-bottom: 0; }

.cl-contact-form__form {
  display: grid;
  grid-template-columns: 1fr;
  grid-auto-columns: 1fr;
  column-gap: 1.5rem;
  row-gap: 1.5rem;
  padding-top: 1.5rem;
  padding-bottom: 1.5rem;
  background-color: transparent;
}

.cl-contact-form__row {
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-auto-columns: 1fr;
  column-gap: 1.5rem;
  row-gap: 1.5rem;
}

.cl-contact-form__field { position: relative; }
.cl-contact-form [hidden] { display: none !important; }

/* .cl-contact-form__label and .cl-contact-form__req are declared further down,
   after the input rules they have to win against on order */

.cl-contact-form__input {
  display: block;
  width: 100%;
  height: auto;
  min-height: 3rem;
  margin: 0;
  padding: .625rem .875rem;
  color: var(--cl-cocoa);
  font-family: inherit;
  font-size: 1rem;
  font-weight: inherit;
  line-height: 1.5;
  vertical-align: middle;
  background-color: var(--cl-white);
  border: 1px solid var(--cl-nimbus);
  border-radius: .375rem;
  -webkit-appearance: none;
  appearance: none;
  transition: border-color .15s ease, box-shadow .15s ease;
}
.cl-contact-form__input:where(:hover) { border-color: var(--cl-line); }
.cl-contact-form__input:where(:focus) {
  outline: 0;
  border-color: var(--cl-cocoa);
  box-shadow: 0 0 0 3px var(--cl-ink-12);
}
.cl-contact-form__input::placeholder { color: var(--cl-ink-50); opacity: 1; }
/* the chevron, the message box, the muted placeholder and the invalid border
   are declared further down, after this base rule */

/* checkbox: real input, visually hidden, drives the custom box through :checked.
   The row is the positioning context, not .cl-contact-form__field: a checkbox
   GROUP has four rows under one label in the same field, and with the field as
   the context all four hidden inputs stacked at its top-left corner, under the
   group label. Their own row puts each one back under its own box. A field
   with a single checkbox measures the same either way (the row starts at the
   field's origin), so nothing else moves. */
.cl-contact-form__check {
  position: relative;
  display: flex;
  align-items: center;
  margin-bottom: 0;
  padding-left: 1.25rem;
  font-weight: 500;
  cursor: pointer;
}
.cl-contact-form__check input {
  position: absolute;
  top: 0;
  left: 0;
  width: 1.5rem;
  height: 1.5rem;
  margin: 0;
  opacity: 0;
  z-index: -1;
}
.cl-contact-form__box {
  display: block;
  flex: none;
  width: 1.5rem;
  min-width: 1.5rem;
  height: 1.5rem;
  min-height: 1.5rem;
  margin: 0 0 0 -1.25rem;
  background-color: #fff;
  border: 1px solid var(--cl-line);
  border-radius: .25rem;
  line-height: normal;
  cursor: pointer;
  transition: all .2s;
}
.cl-contact-form__check input:checked ~ .cl-contact-form__box {
  background-color: var(--cl-cocoa);
  border-color: var(--cl-cocoa);
  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='%23fff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' d='M3.5 8.5l3 3 6-7'/%3E%3C/svg%3E");
  background-position: 50%;
  background-repeat: no-repeat;
  background-size: 16px 16px;
}
.cl-contact-form__check input:focus-visible ~ .cl-contact-form__box {
  border-color: #000;
  outline: 2px solid var(--cl-focus);
  outline-offset: 2px;
}
.cl-contact-form__check-label {
  display: block;
  margin-bottom: 0;
  padding-left: 1rem;
  font-size: .94rem;
  font-weight: 300;
  text-align: left;
  cursor: pointer;
}
.cl-contact-form.is-band .cl-contact-form__check-label { font-size: inherit; }
.cl-contact-form__check-label a { color: inherit; text-decoration: underline; }

/* honeypot: off-screen, never display:none so bots still fill it */
.cl-contact-form__hp {
  position: absolute;
  left: -9999px;
  width: 1px;
  height: 1px;
  opacity: 0;
}

/* --- submit ---------------------------------------------------------------- */
.cl-contact-form__actions {
  display: flex;
  flex-direction: column;
  align-items: center;
  row-gap: 1rem;
  text-align: center;
  padding-top: 10px;
}
.cl-contact-form.is-band .cl-contact-form__actions { padding-top: 20px; }
.cl-contact-form .cl-contact-form__submit {
  cursor: pointer;
  font-family: inherit;
  width: auto;
  -webkit-appearance: none;
  appearance: none;
}
.cl-contact-form__note.padding-top { padding-top: 16px; } /* bare .padding-top in the export */

.cl-contact-form__success { background-color: var(--cl-light-grey); padding: 1.5rem; }
.cl-contact-form__success p { font-weight: 600; }
.cl-contact-form__error { margin-top: 1.5rem; padding: .875rem 1rem; color: var(--cl-dark-red); }
.cl-contact-form__error ul { margin: 0; padding-left: 1.25rem; }

/* --- hero (header2_component) --------------------------------------------- */
/* z-index: 0 is not in the export. It makes the section its own stacking
   context so the z-index: -1 photo cannot fall behind a parent background in
   the live theme; the export relied on every ancestor being transparent. */
.cl-contact-form.is-hero {
  color: var(--cl-white);
  margin-top: 0;
  padding-top: 4rem;
  position: relative;
  z-index: 0;
}
.cl-contact-form__bg { position: absolute; inset: 0; z-index: -1; }
.cl-contact-form__bg img { object-fit: cover; width: 100%; height: 100%; position: absolute; inset: 0; }

.cl-contact-form__hero {
  display: flex;
  justify-content: center;
  align-items: center;
  text-align: center;
  min-height: 80vh;
  max-height: 60rem;
}
.cl-contact-form__grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-auto-columns: 1fr;
  column-gap: 5rem;
  row-gap: 4rem;
  align-items: center;
}
.cl-contact-form.is-hero .cl-contact-form__title { margin-bottom: 0; }
.cl-contact-form.is-hero .cl-contact-form__component {
  text-align: center;
  max-width: 30rem;
}
.cl-contact-form.is-hero .cl-contact-form__form {
  column-gap: 1rem;
  row-gap: 1rem;
  padding: 0;
  margin-bottom: 1rem;
  color: var(--cl-cocoa);
  justify-items: stretch;
}
/* the export wraps only the country select in .max-width-full.text-align-left */
.cl-contact-form.is-hero .cl-contact-form__field.is-select { text-align: left; }
/* .form-privacy-check-wrap, a static wrapper around the checkbox's field wrapper */
.cl-contact-form.is-hero .cl-contact-form__privacy { color: var(--cl-white); padding: 5px; }
.cl-contact-form.is-hero .cl-contact-form__actions {
  display: block;
  padding-top: 0;
  margin-top: 1.5rem;               /* .margin-top.margin-small */
}
.cl-contact-form.is-hero .cl-contact-form__button-wrap { display: inline-block; }
.cl-contact-form.is-hero .cl-contact-form__note { font-size: .75rem; }

/* Round twenty (client, 2026-08-30, the e-book page: "alignment and styling
   are off"). The hero form sat as a centred column of white boxes on the
   photo: heading centred, inputs flush left, button centred, note centred.
   Now the whole content column is flush left, and the fields belong to the
   photo instead of sitting on it: white 10% fill, a 12px backdrop blur,
   a white 60% hairline (white on focus), white text, white 60% placeholder.
   The consent row loses the export's 5px inset so its box starts on the
   inputs' vertical; the note under the button is .75rem, white 62%, its
   privacy link underlined. Scoped to .is-hero, the photo variant: the light
   price-request form (.is-inline / .is-band / .is-popup) is untouched.
   The two validation tones are the dark-ground twins from cl-base.css:
   Zeal is 1.5:1 on the catalogue's wood, so the invalid ring is
   --cl-invalid-on-dark, 2px (border plus inset shadow, as .cl-field), over
   a Zeal 35% fill; the message reads in the same tone. Where a photo runs
   light (the e-book's grey right half) the weight and the fill carry the
   state, since no one colour clears 3:1 on both grounds. */
.cl-contact-form.is-hero {
  --cl-focus: var(--cl-white);
  --cl-focus-halo: var(--cl-ink-75);
}
.cl-contact-form.is-hero .cl-contact-form__content { text-align: left; }
.cl-contact-form.is-hero .cl-contact-form__component { text-align: left; }
.cl-contact-form.is-hero .cl-contact-form__form,
.cl-contact-form.is-hero .cl-contact-form__label,
.cl-contact-form.is-hero .cl-contact-form__req,
.cl-contact-form.is-hero .cl-contact-form__check-label { color: var(--cl-white); }
.cl-contact-form.is-hero .cl-contact-form__input {
  color: var(--cl-white);
  background-color: rgb(255 255 255 / 10%);
  -webkit-backdrop-filter: blur(12px);
  backdrop-filter: blur(12px);
  border-color: rgb(255 255 255 / 60%);
}
.cl-contact-form.is-hero .cl-contact-form__input::placeholder { color: rgb(255 255 255 / 60%); }
.cl-contact-form.is-hero .cl-contact-form__input:where(:hover) { border-color: rgb(255 255 255 / 80%); }
.cl-contact-form.is-hero .cl-contact-form__input:where(:focus) {
  border-color: var(--cl-white);
  box-shadow: 0 0 0 3px rgb(255 255 255 / 20%);
}
/* the select: white chevron, the unchosen state as muted as a placeholder,
   the options list is the OS's own and stays dark on light */
.cl-contact-form.is-hero select.cl-contact-form__input {
  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='%23ffffff' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round' d='M3 6l5 5 5-5'/%3E%3C/svg%3E");
}
.cl-contact-form.is-hero select.cl-contact-form__input:has(option[value=""]:checked) { color: rgb(255 255 255 / 60%); }
.cl-contact-form.is-hero select.cl-contact-form__input option { color: var(--cl-cocoa); background-color: var(--cl-white); }
/* the checkbox: the same glass as the inputs, white with a cocoa tick once checked */
.cl-contact-form.is-hero .cl-contact-form__privacy { padding: 0; }
.cl-contact-form.is-hero .cl-contact-form__box {
  background-color: rgb(255 255 255 / 10%);
  -webkit-backdrop-filter: blur(12px);
  backdrop-filter: blur(12px);
  border-color: rgb(255 255 255 / 60%);
}
.cl-contact-form.is-hero .cl-contact-form__check input:checked ~ .cl-contact-form__box {
  background-color: var(--cl-white);
  border-color: var(--cl-white);
  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='%23251f20' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' d='M3.5 8.5l3 3 6-7'/%3E%3C/svg%3E");
}
.cl-contact-form.is-hero .cl-contact-form__check input:focus-visible ~ .cl-contact-form__box { border-color: var(--cl-white); }
/* button and note flush left with the fields */
.cl-contact-form.is-hero .cl-contact-form__actions { text-align: left; }
.cl-contact-form.is-hero .cl-contact-form__note {
  margin-top: 1rem;
  font-size: .75rem;
  line-height: 1.5;
  color: rgb(255 255 255 / 62%);
  text-align: left;
}
.cl-contact-form.is-hero .cl-contact-form__note p { margin: 0; }
.cl-contact-form.is-hero .cl-contact-form__note a { color: inherit; text-decoration: underline; text-underline-offset: .15em; }
/* validation on the photo */
.cl-contact-form.is-hero .cl-contact-form__input.invalid.error,
.cl-contact-form.is-hero .cl-contact-form__input:user-invalid {
  border-color: var(--cl-invalid-on-dark);
  box-shadow: inset 0 0 0 1px var(--cl-invalid-on-dark);
  background-color: #801c0059;
}
.cl-contact-form.is-hero .cl-contact-form__check input:user-invalid ~ .cl-contact-form__box,
.cl-contact-form.is-hero .cl-contact-form__check input.invalid.error ~ .cl-contact-form__box {
  border-color: var(--cl-invalid-on-dark);
  box-shadow: inset 0 0 0 1px var(--cl-invalid-on-dark);
}
.cl-contact-form.is-hero .cl-contact-form__error-msg,
.cl-contact-form.is-hero .cl-contact-form__error { color: var(--cl-invalid-on-dark); }
.cl-contact-form.is-hero .cl-contact-form__success { color: var(--cl-cocoa); }

/* --- band (form-section) ---------------------------------------------------- */
.cl-contact-form.is-band .page-padding { margin-top: 0; }
.cl-contact-form__band {
  display: flex;
  flex-direction: column;
  align-items: center;
}
.cl-contact-form.is-band .cl-contact-form__heading {
  font-family: var(--cl-font-heading);
  font-size: 3rem;
  font-weight: 400;
  line-height: 1.2;
  letter-spacing: normal;
}
.cl-contact-form__lead { font-size: 1.375rem; font-weight: 400; }
.cl-contact-form.is-band .cl-contact-form__component {
  display: block;
  position: static;
  text-align: center;
  max-width: 40rem;
}
.cl-contact-form.is-band .cl-contact-form__form {
  display: flex;
  flex-direction: column;
  align-items: stretch;
  column-gap: 15px;
  row-gap: 15px;
  margin-top: 40px;
  padding: 0;
}
.cl-contact-form.is-band .cl-contact-form__label { text-align: left; }
/* .form-input-3.select and .form-input-3.text-area keep their #131313 against
   the head snippet's color: inherit (two classes beat one); the text-area twin
   runs 6rem instead of 11.25rem */
.cl-contact-form.is-band select.cl-contact-form__input,
.cl-contact-form.is-band textarea.cl-contact-form__input { color: var(--cl-black); }
.cl-contact-form.is-band textarea.cl-contact-form__input { min-height: 6rem; }
/* .form-checkbox-label-3 inherits the centred text of .sale-contact-form */
.cl-contact-form.is-band .cl-contact-form__check-label { text-align: inherit; }
.cl-contact-form__after { margin-top: 20px; }
.cl-contact-form__after a { color: inherit; }

/* --- popup (section-pop-up) --------------------------------------------------- */
.cl-contact-form__dialog {
  position: fixed;
  inset: 0;
  z-index: 1001;
  width: 100%;
  height: 100%;
  max-width: none;
  max-height: none;
  margin: 0;
  padding: 0;
  border: 0;
  color: var(--cl-cocoa);
  background-color: var(--cl-ink-40);
  overflow: auto;
  opacity: 0;
  transition: opacity .4s;
}
.cl-contact-form__dialog::backdrop { background: transparent; }
.cl-contact-form__dialog[open] { display: block; }
.cl-contact-form__dialog.is-open { opacity: 1; }
.cl-contact-form__dialog.is-closing { opacity: 0; transition-duration: .5s; }
/* no-JS fallback: a link to #<id> shows the dialog in place */
.cl-contact-form__dialog:target { display: block; opacity: 1; }

/* .pop-up_close. Fixed rather than absolute so it still covers the viewport
   once the overlay has scrolled; the export's absolute box scrolled away. */
.cl-contact-form__backdrop { position: fixed; inset: 0; z-index: 0; }
.cl-contact-form__panel {
  position: relative;
  z-index: 1;
  display: block;
  max-width: 80rem;
  margin-left: auto;
  margin-right: auto;
  padding-left: 1rem;
  padding-right: 1rem;
}
.cl-contact-form__close {
  position: absolute;
  top: 0;
  right: 0;
  z-index: 2;
  margin-top: 1rem;
  margin-right: 2rem;
  padding: 1.2rem;
  background: transparent;
  border: 0;
  color: inherit;
  cursor: pointer;
  text-align: start;
}
.cl-contact-form__close:hover { color: var(--cl-cocoa); }
.cl-contact-form__close:focus-visible { outline: 2px solid var(--cl-focus); outline-offset: 2px; }
.cl-contact-form__close-icon {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  width: 1.5rem;
  height: 1.5rem;
}
.cl-contact-form__close-icon svg { width: 100%; height: 100%; }

/* --- the rest of one field: label, required mark, error, chevron ----------
   Round fourteen: the HubSpot block that used to live here is gone. HubSpot
   renders this form as a v4 "forms embed components" app inside a
   cross-origin iframe (js-ap1.hsforms.net/ui-forms-embed-components-app),
   so no rule of ours could ever reach its DOM and every .hs-* selector was
   dead weight. Both panes are the theme's own form now, which is why the
   parity these rules used to chase is structural instead of styled.

   These rules stayed here rather than moving up with .cl-contact-form__input:
   the chevron, the message box, the muted placeholder and the error border
   have to come AFTER the base rule at the same specificity, so they win on
   order rather than by accident. */
.cl-contact-form__label {
  display: block;
  margin-bottom: .375rem;
  font-size: .875rem;
  font-weight: 500;
  line-height: 1.5;
  color: var(--cl-cocoa);
}
.cl-contact-form__req { color: var(--cl-cocoa); margin-left: .125rem; font-weight: inherit; }
/* the error border: the flow's validation writes .invalid.error on the
   control, the browser's own :user-invalid catches a native block */
.cl-contact-form .cl-contact-form__input.invalid.error,
.cl-contact-form__input:user-invalid { border-color: var(--cl-dark-red); }
/* the unchosen dropdown reads muted: its own empty option is selected */
.cl-contact-form select.cl-contact-form__input:has(option[value=""]:checked) { color: var(--cl-ink-60); }

.cl-contact-form select.cl-contact-form__input {
  padding-right: 2.5rem;
  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='%23251f20' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round' d='M3 6l5 5 5-5'/%3E%3C/svg%3E");
  background-position: right .875rem center;
  background-repeat: no-repeat;
  background-size: 1rem;
}
.cl-contact-form textarea.cl-contact-form__input {
  min-height: 9rem;
  padding-top: .75rem;
  padding-bottom: .75rem;
  overflow: auto;
  resize: vertical;
}

/* a checkbox group (HubSpot's multi checkbox): the same tick rows as any
   single checkbox, stacked at the row rhythm of the .5rem list step */
.cl-contact-form__checks { display: flex; flex-direction: column; row-gap: .5rem; }

/* the consent block: intro line, the boxes, the privacy notice */
.cl-contact-form__consent { display: flex; flex-direction: column; row-gap: .75rem; }
/* the communication consent sentence wraps to three lines on a phone, and a
   box floating in the middle of them reads as a mistake. Only this row: the
   shared .cl-contact-form__check is measured against the Webflow export at
   four widths, and every other row's label is one line. */
.cl-contact-form__check:has([data-cl-hs-comms]) { align-items: flex-start; }
.cl-contact-form__consent-intro {
  margin: 0;
  font-size: .875rem;
  font-weight: 300;
  line-height: 1.5;
}
.cl-contact-form__consent-note { font-size: .875rem; font-weight: 300; line-height: 1.5; }
.cl-contact-form__consent-note p { margin: 0; }
.cl-contact-form__consent-note a,
.cl-contact-form__check-label a { color: inherit; text-decoration: underline; }

/* per-field errors, written by the flow's validation around any control */
.cl-contact-form .cl-contact-form__errors {
  list-style: none;
  margin: .375rem 0 0;
  padding: 0;
}
.cl-contact-form .cl-contact-form__errors li { margin: 0; }
.cl-contact-form__error-msg {
  display: block;
  margin: 0;
  font-size: .8125rem;
  font-weight: 400;
  line-height: 1.5;
  color: var(--cl-dark-red);
}

/* --------------------------------------------------------------------------
   Breakpoints
   -------------------------------------------------------------------------- */

@media screen and (max-width: 991px) {
  .cl-contact-form__head { margin-bottom: 2.5rem; }        /* .margin-large at 991 */
  .cl-contact-form .pre-heading { text-align: left; }
  .cl-contact-form.is-hero { padding-top: 5rem; }
  .cl-contact-form__hero { min-height: 50rem; }
  .cl-contact-form__grid {
    grid-template-columns: 1fr;
    grid-auto-flow: row;
    column-gap: 0;
    row-gap: 4rem;
    min-height: auto;
  }
  .cl-contact-form__media { display: none; }
  .cl-contact-form__bg img { object-position: 100% 50%; }
  .cl-contact-form__lead.has-image { grid-template-columns: 1fr; row-gap: 2rem; }
  .cl-contact-form__lead-media { order: -1; aspect-ratio: 16 / 9; }
  .cl-contact-form__flow { margin-top: 2.5rem; }
  .cl-contact-form.is-band .cl-contact-form__heading { margin-bottom: 2rem; font-size: 2.25rem; }
  .cl-contact-form__band { margin-bottom: 40px; }
}

@media screen and (max-width: 767px) {
  .cl-contact-form__head { margin-bottom: 2rem; }          /* .margin-large at 767 */
  .cl-contact-form .heading-medium { line-height: 1.4; }
  .cl-contact-form__row.is-stack-767 { grid-template-columns: 1fr; }
  .cl-contact-form__flow-body { padding: 1.5rem 1.25rem 1.75rem; }
  .cl-contact-form__models { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .cl-contact-form__hero { min-height: 36rem; }
  .cl-contact-form__grid { row-gap: 3rem; }
  .cl-contact-form__bg img { object-position: 75% 50%; }
  .cl-contact-form.is-hero .cl-contact-form__actions { margin-top: 1.25rem; }
  .cl-contact-form.is-band .cl-contact-form__heading { font-size: 2rem; }
  .cl-contact-form__lead { font-size: 1.3rem; }
}

@media screen and (max-width: 479px) {
  .cl-contact-form .heading-medium { line-height: 1.2; }
  .cl-contact-form .heading-large { font-size: 1.8rem; line-height: 1.3; }
  .cl-contact-form__tabs { display: flex; width: 100%; }
  .cl-contact-form__tab { flex: 1 1 0; }
  .cl-contact-form .button.form-tab { font-size: .7rem; padding: .625rem .75rem; width: 100%; }
  .cl-contact-form__row.is-stack-479,
  .cl-contact-form.is-band .cl-contact-form__row { grid-template-columns: 1fr; }
  .cl-contact-form.is-hero .cl-contact-form__form { row-gap: .75rem; flex-direction: column; }
  .cl-contact-form__bg img { object-position: 57% 50%; }
  .cl-contact-form.is-band .cl-contact-form__heading { font-size: 2rem; } /* -2 twin has no 479 step */
  .cl-contact-form__lead { font-size: 1.2rem; }
  .cl-contact-form__flow-body { padding: 1.25rem 1rem 1.5rem; }
  .cl-contact-form__step-title { font-size: 1.25rem; }
  .cl-contact-form__models { grid-template-columns: 1fr; gap: .5rem; }
  /* only the step you are on is named; the rest are dots */
  .cl-contact-form__progress { gap: .25rem; }
  .cl-contact-form__progress-step:not(.is-current) .cl-contact-form__progress-name { display: none; }
  .cl-contact-form__progress-step + .cl-contact-form__progress-step::before { width: 1rem; margin: 0 .375rem; }
  .cl-contact-form__nav { column-gap: .5rem; }
  .cl-contact-form .cl-contact-form__back,
  .cl-contact-form .cl-contact-form__next { min-width: 0; flex: 1 1 0; padding-inline: 1rem; }
  .cl-contact-form__trust { row-gap: .375rem; column-gap: 1.25rem; font-size: .875rem; }
  .cl-contact-form__band { margin-top: 20px; }
  .cl-contact-form.is-band .cl-contact-form__check-label { text-align: left; }
}

@media (prefers-reduced-motion: reduce) {
  .cl-contact-form__dialog,
  .cl-contact-form__model,
  .cl-contact-form__tab,
  .cl-contact-form__tab-glider,
  .cl-contact-form__flow,
  .cl-contact-form__progress,
  .cl-contact-form__nav,
  .cl-contact-form__echo,
  .cl-contact-form__summary,
  .cl-contact-form__progress-dot,
  .cl-contact-form__box { transition: none; }
}


/* cl-cta-banner.css */
/* The base .is-tablet-tall combo pads 8rem above and 4rem below at 767;
   the banner wants equal air on both sides at every width (client, 2026-08-25). */
@media screen and (max-width: 767px) and (min-width: 480px) {
  .cl-cta-banner .is-tablet-tall.padding-vertical.padding-xhuge { padding-top: 5rem; padding-bottom: 5rem; }
}
/* On a phone the banner sits right under the Sanctuary / Outdoor cards
   (client, 2026-08-25: "glued" was meant for mobile only), so it breathes
   3rem on both sides there instead of 5rem; desktop keeps its own air. */
@media screen and (max-width: 767px) {
  .shopify-section:has(> .cl-split-cards) + .shopify-section .cl-cta-banner .is-tablet-tall.padding-vertical.padding-xhuge { padding-top: 3rem; padding-bottom: 3rem; }
}

/* ==========================================================================
   CTA banner. Port of section-cta_banner.

   From the export:
     .section-cta_banner   bg #e8d7ca (lucid), position relative
     .page-padding-6       = .page-padding plus a dead margin-top: 0
     .padding-vertical-13  = .padding-vertical
     .margin-bottom-20.margin-small resolves to margin-bottom: 0, padding-top: 0
                           (the .margin-small is dead CSS, as everywhere in this
                           build where a .margin-bottom-N combo appears)
     .heading-medium-20    2rem / 400 / 1.1, margin-bottom 1rem
                           991: 1.75rem   767: 1.5rem, line-height 1.4
     .text-size-medium-11  = .text-size-medium
   ========================================================================== */

.cl-cta-banner { background-color: var(--cl-lucid); position: relative; }
.cl-cta-banner.is-cocoa  { background-color: var(--cl-cocoa); color: var(--cl-white); }
.cl-cta-banner.is-terra  { background-color: var(--cl-terra); color: var(--cl-white); }
.cl-cta-banner.is-pumice { background-color: var(--cl-pumice); }

/* .heading-medium-20 is .heading-medium at 2rem with tighter leading and its own
   bottom margin. Kept as a modifier rather than a fourth heading step. */
.cl-cta-banner .heading-medium {
  font-size: 2rem;
  line-height: 1.1;
  margin-bottom: 1rem;
}

/* .margin-bottom-20.margin-small in the export zeroes the bottom margin and the
   padding-top but leaves the stock margin-top: 1rem standing, and only drops it
   at 991. Sixteen pixels that exist for no reason, reproduced. */
.cl-cta-banner__head { margin-top: 1rem; }
@media screen and (max-width: 991px) { .cl-cta-banner__head { margin-top: 0; } }

@media screen and (max-width: 991px) { .cl-cta-banner .heading-medium { font-size: 1.75rem; } }
@media screen and (max-width: 767px) { .cl-cta-banner .heading-medium { font-size: 1.5rem; line-height: 1.4; } }

/* .section-cta-main: stock .heading-medium, no margins of its own; the head
   wrapper's .margin-bottom.margin-small resolves to 0 in the export (stock
   .margin-bottom is declared after the sizes and the -small combo zeroes it).
   The .is-tablet-tall chain on the padding box does the rest. */
.cl-cta-banner.is-main .heading-medium { font-size: 2.25rem; line-height: 1.2; margin-bottom: 0; }
.cl-cta-banner.is-main .cl-cta-banner__head { margin: 0; }
@media screen and (max-width: 991px) { .cl-cta-banner.is-main .heading-medium { font-size: 1.75rem; } }
@media screen and (max-width: 767px) { .cl-cta-banner.is-main .heading-medium { font-size: 1.5rem; line-height: 1.4; } }
@media screen and (max-width: 479px) { .cl-cta-banner.is-main .heading-medium { line-height: 1.2; } }


/* cl-downloads.css */
/* ==========================================================================
   Download cards. Port of section-handy-guides.

   From the export (infrarotsauna-aufbau.html and leitfaden-zur-wartung.html
   :: .section-handy-guides):
     .section-handy-guides bg var(--lucidity)
     .padding-bottom.padding-xhuge  7rem / 6rem / 4rem, no top padding: the
                           eyebrow's 4rem top margin is the space above
     .layout-downoads_component  flex column, align start
     .margin-bottom.margin-xlarge  20px at >= 992 (the stock .margin-bottom
                           declaration lands after the size classes), then the
                           scale: 3.5rem at 991, 2.5rem at 767
     .max-width-large      48rem
     .pre-heading          margin 4rem 0 2rem, .875rem / 600   767: .8rem
     .heading-medium       2.25rem / 1.2   991: 1.75rem   767: 1.5rem / 1.4
                           479: line-height 1.2
     .heading-large        3rem / 1.2   991: 2.25rem   767: 2rem   479: 1.8rem / 1.3
     .layout-downloads_list  grid 1fr 1fr 1fr, gap 4rem, place-items start,
                           width 100%   991: 1fr 1fr, gap 1rem
                           767: 1fr, row-gap 1.5rem
     .layout-downloads_card  bg var(--lucidity)
     .layout-downloads_card-content  flex column, align start,
                           column-gap .8rem, row-gap 1.5rem
     .layout-downloads_heading-wrap  flex column, row-gap .5rem
     .subheading-small     1.375rem / 400 / 1.4
     .heading-small        1.5rem / 400 / 1.4, margin-bottom .5rem   767: 1.25rem
     h4 a                  no underline (the page's embed makes links inherit)
     .button-secondary     = cl-base .button-secondary (#131313 text)
   ========================================================================== */

.cl-downloads.is-bg-lucidity { background-color: var(--cl-lucidity); }
.cl-downloads.is-bg-pumice   { background-color: var(--cl-pumice); }

.cl-downloads__component { flex-direction: column; align-items: flex-start; display: flex; }

/* --------------------------------------------------------------------------
   Base gaps worked around locally (cl-base.css is not edited from a section):
   .margin-bottom + size resolves to 20px at desktop; .heading-large has no
   letter-spacing and is 1.3 at 479; .heading-medium is 1.4 at 767 and 1.2 at
   479; .heading-small has line-height 1.4 and margin-bottom .5rem;
   .subheading-small does not exist in the base.
   -------------------------------------------------------------------------- */
.cl .cl-downloads__head.margin-bottom { margin-bottom: 20px; }
.cl-downloads .heading-large { letter-spacing: 0; }
.cl-downloads .heading-medium { line-height: 1.2; }
.cl-downloads .heading-small { line-height: 1.4; margin-bottom: .5rem; }
.cl-downloads .subheading-small { font-size: 1.375rem; font-weight: 400; line-height: 1.4; }
.cl-downloads .cl-downloads__intro p { margin: 0; }
.cl-downloads .cl-downloads__intro p + p, .cl-downloads .cl-downloads__intro { margin-top: 1rem; }

/* --------------------------------------------------------------------------
   List and cards
   -------------------------------------------------------------------------- */
.cl-downloads__list {
  display: grid;
  grid-template-columns: repeat(var(--cl-downloads-cols, 3), 1fr);
  column-gap: 4rem;
  row-gap: 4rem;
  place-items: start;
  width: 100%;
}
.cl-downloads__list.is-cols-2 { --cl-downloads-cols: 2; }
.cl-downloads__list.is-cols-3 { --cl-downloads-cols: 3; }
.cl-downloads__list.is-cols-4 { --cl-downloads-cols: 4; }

.cl-downloads__card { background-color: var(--cl-lucidity); }
.cl-downloads__content {
  column-gap: .8rem;
  row-gap: 1.5rem;
  flex-direction: column;
  align-items: flex-start;
  display: flex;
}
.cl-downloads__title-wrap { row-gap: .5rem; flex-direction: column; display: flex; }
.cl-downloads__title { margin: 0; }
.cl-downloads__title a { color: inherit; text-decoration: none; }
.cl-downloads__title a:hover { text-decoration: underline; }
.cl-downloads__text p { margin: 0; }
.cl-downloads__media img { display: block; max-width: 100%; height: auto; }
.cl-downloads__button { max-width: 100%; }

/* --------------------------------------------------------------------------
   Breakpoints
   -------------------------------------------------------------------------- */
@media screen and (max-width: 991px) {
  .cl .cl-downloads__head.margin-bottom { margin-bottom: var(--cl-space); }
  .cl-downloads__list { grid-template-columns: 1fr 1fr; column-gap: 1rem; row-gap: 1rem; }
}
@media screen and (max-width: 767px) {
  .cl-downloads .heading-medium { line-height: 1.4; }
  .cl-downloads .heading-small { font-size: 1.25rem; }
  .cl-downloads__list { grid-template-columns: 1fr; row-gap: 1.5rem; }
}
@media screen and (max-width: 479px) {
  .cl-downloads .heading-medium { line-height: 1.2; }
  .cl-downloads .heading-large { line-height: 1.3; }
}

/* --------------------------------------------------------------------------
   Round twenty-four (client 2026-09-18, EU manuals page): outlined cards.
   No band fill behind the card; a 10% ink border, the cell filled so a grid
   of eleven reads as a grid, and a download glyph in the button.
   -------------------------------------------------------------------------- */
.cl-downloads[id] { scroll-margin-top: 6rem; }
.cl-downloads__list.is-outlined { column-gap: 1.5rem; row-gap: 1.5rem; place-items: stretch; }
.cl-downloads__list.is-outlined .cl-downloads__card {
  background-color: transparent;
  border: 1px solid rgba(0, 0, 0, .1);
  border-radius: .75rem;
  padding: 1.5rem;
  height: 100%;
  box-sizing: border-box;
}
.cl-downloads__list.is-outlined .cl-downloads__content { height: 100%; }
.cl-downloads__list.is-outlined .cl-downloads__title-wrap { flex: 1 1 auto; }
.cl-downloads__list.is-outlined .cl-downloads__text { font-size: .9375rem; }
.cl-downloads__button.has-icon { display: inline-flex; align-items: center; column-gap: .5rem; }
.cl-downloads__icon { width: 1rem; height: 1rem; flex: none; }
@media screen and (max-width: 991px) {
  .cl-downloads__list.is-outlined { column-gap: 1rem; row-gap: 1rem; }
}


/* cl-faq.css */
/* ==========================================================================
   FAQ accordion. Port of section-faq and its variants.

   From the export (index.html .section-faq, tragbare-infrarotsauna.html
   .section-faqs, hauefig-gestellte-fragen.html + detail_faq.html .section-faq,
   campaigns/infrarotsauna.html .section-faq-accordion):
     .section-faq          bg var(--lucid);  .is-bg-white -> #fff
     .section-faqs         bg var(--lucid)
     .section-faq-accordion bg #fff
     .section-health-benefits-icons.is-grey  bg var(--pumice) (display:none
                           in the export and live, see cl-faq.liquid)
     .header-extra-pad_global  height 4rem (FAQ page, under the fixed nav)
     .faq1_component       border-bottom 1px cocoa      991: text-align left
     .faq1_accordion       border-top 1px cocoa, flex column, align stretch
     .faq1_question        flex, space-between, align centre, padding-block 1.25rem,
                           1.3rem / 400, cursor pointer     767: padding-block 1rem
       .text-size-medium   1.125rem (content page)         767: 1rem
       h2.text-size-large  1.25rem / 400 (campaign band)   767: 1.125rem / 1.35
     .faq1_answer          overflow hidden
     .faq-content_wrap     flex, col-gap 1rem, margin-bottom 1rem
       p                   margin 0 (components.css 0 0 10px, site p { margin-bottom: 0 })
       .text-rich-text p   margin-bottom .5rem (campaign band)
     .faq1_icon            1.5rem square, flex none, margin-left 1.5rem
                           767: 1.75rem
     .blog14_category-menu.no-scrollbar  flex, col-gap 1.5rem, border-top 1px cocoa,
                           align start, width 100%, margin-bottom 4rem, padding-top .5rem
                           767: width 100vw, margin-left -5vw, padding-left 5vw,
                                overflow scroll, margin-bottom 3rem
     .blog-categories_list flex wrap, col-gap 1.5rem    991: nowrap, items flex none
     .blog-category-links  inline-block, flex none, padding-bottom .4rem, .875rem
       .w--current         border-bottom 1px cocoa, padding-bottom 1rem, 400

   Spacing quirks reproduced from the export's cascade, flagged for the design
   pass like the hero's (docs/DEDUPE-MAP.md):
     .margin-bottom { margin: 0 0 20px } is declared after every .margin-<size>,
       so the heading block's .margin-bottom.margin-xxlarge is 20px at >=992 and
       only takes the scale (4.5rem, 3rem) where the breakpoints redeclare it.
     .margin-bottom.margin-small { margin-bottom: 0 } at every width.
     .heading-large { text-align: left } is global in the export, so the FAQ
       heading is left even inside .text-align-center; 479: line-height 1.3;
       no letter-spacing anywhere in the .heading-large family.
   cl-base.css carries none of these, so they are scoped here.

   Built on <details>/<summary> so it is keyboard and screen-reader correct with
   no JavaScript. Webflow animated the open and close from IX2 data; that is
   re-added progressively in the section's script and the accordion still works
   without it.

   Not from the export: min-width 0 and overflow-wrap on the question and the
   answer, and the category menu's bleed rewritten off percentages instead of
   the export's width: 100vw. Both are scoped here, not pushed into
   cl-base.css.
   ========================================================================== */

.cl-faq { background-color: var(--cl-lucid); }
.cl-faq.is-bg-white { background-color: var(--cl-white); }
.cl-faq.is-bg-lucidity { background-color: var(--cl-lucidity); }
.cl-faq.is-bg-pumice { background-color: var(--cl-pumice); }

.cl-faq__extra-pad { height: 4rem; }

/* heading block: the export's resolved margins, not the scale */
.cl .cl-faq__head.margin-bottom { margin-bottom: 20px; }
.cl .cl-faq__title { margin-bottom: 0; }
/* no .heading-large rule in the export carries letter-spacing; cl-base's -1px
   belongs to the hero's .heading-xlarge-N twins */
.cl-faq .heading-large { text-align: left; letter-spacing: normal; overflow-wrap: anywhere; }
.cl-faq .text-align-center .heading-large { text-align: center; }
.cl-faq__head .text-size-medium,
.cl-faq__category { overflow-wrap: anywhere; }

/* category jump nav (.blog14_category-menu.no-scrollbar) */
.cl-faq__nav {
  column-gap: 1.5rem;
  border-top: 1px solid var(--cl-cocoa);
  justify-content: flex-start;
  align-items: flex-start;
  width: 100%;
  margin-bottom: 4rem;
  padding-top: .5rem;
  display: flex;
}
.cl-faq__nav-list { column-gap: 1.5rem; flex-wrap: wrap; display: flex; }
/* .blog-categories_item: a block around each inline-block link, so the link
   sits on a line box and the list runs 2px taller than the link (the export's
   render, from the 16px strut under a 14px inline-block) */
.cl-faq__nav-item { display: block; }
.cl-faq__nav-link {
  flex: none;
  padding-bottom: .4rem;
  font-size: .875rem;
  display: inline-block;
  color: inherit;
  text-decoration: none;
}
/* .w--current, minus its 1rem padding-bottom: the current marker moves while
   scrolling and must not change the nav's height when it does */
.cl-faq__nav-link.is-current { border-bottom: 1px solid var(--cl-cocoa); font-weight: 400; }
.cl-faq__nav-link:hover { text-decoration: underline; }

/* category groups: no Webflow original, the export never rendered headings
   between FAQ rows. heading-small with the list's own rhythm. */
.cl-faq__group + .cl-faq__group { margin-top: 3rem; }
.cl-faq__category { margin-bottom: 1rem; }

.cl-faq__list { border-bottom: 1px solid var(--cl-cocoa); }

.cl-faq__item {
  border-top: 1px solid var(--cl-cocoa);
  display: flex;
  flex-direction: column;
  justify-content: flex-start;
  align-items: stretch;
}

.cl-faq__question {
  cursor: pointer;
  justify-content: space-between;
  align-items: center;
  padding-top: 1.25rem;
  padding-bottom: 1.25rem;
  font-size: 1.3rem;
  font-weight: 400;
  display: flex;
  list-style: none;
}
.cl-faq__question::-webkit-details-marker { display: none; }
.cl-faq__question::marker { content: ''; }
.cl-faq__question:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: 2px; }
/* the question is a flex child next to the fixed-width chevron: min-width 0
   so a long word shrinks the text instead of widening the row, overflow-wrap
   so it breaks rather than spilling. No hyphens: auto — the page is lang="de"
   and Chrome would re-break the ported copy and move every text probe. */
.cl-faq__q { margin: 0; min-width: 0; overflow-wrap: anywhere; }

.cl-faq__icon {
  flex-direction: column;
  flex: none;
  justify-content: center;
  align-items: center;
  width: 1.5rem;
  height: 1.5rem;
  margin-left: 1.5rem;
  display: flex;
}
.cl-faq__icon svg { width: 100%; height: auto; display: block; transition: transform .25s ease; }
.cl-faq__item[open] .cl-faq__icon svg { transform: rotate(180deg); }

.cl-faq__answer { overflow: hidden; }
.cl-faq__answer-inner { column-gap: 1rem; margin-bottom: 1rem; display: flex; }
.cl-faq__richtext { flex: 1; min-width: 0; overflow-wrap: anywhere; }
.cl-faq__answer p { margin: 0; }
.cl-faq.is-grey .cl-faq__answer p { margin-bottom: .5rem; }
/* webflow.css: .w-richtext > :last-child, .w-richtext li:last-child { margin-bottom: 0 } */
.cl-faq .cl-faq__answer .cl-faq__richtext > :last-child,
.cl-faq .cl-faq__answer .cl-faq__richtext li:last-child { margin-bottom: 0; }
.cl-faq__answer a { color: inherit; text-decoration: underline; }

/* progressive height animation, only once the script marks the item */
.cl-faq__item[data-animating] .cl-faq__answer { transition: height .28s ease; }

@media screen and (max-width: 991px) {
  .cl .cl-faq__head.margin-bottom { margin-bottom: 4.5rem; }
  .cl-faq__list { text-align: left; }
  .cl-faq__nav-list { flex-wrap: nowrap; }
  .cl-faq__nav-item { flex: none; }
}
@media screen and (max-width: 767px) {
  .cl .cl-faq__head.margin-bottom { margin-bottom: 3rem; }
  .cl-faq__question { padding-top: 1rem; padding-bottom: 1rem; }
  .cl-faq__icon { width: 1.75rem; height: 1.75rem; }
  .cl-faq .text-size-large { line-height: 1.35; }
  /* the export's menu scrolls its overflow; the scrollbar is hidden by its
     .no-scrollbar embed.

     The export bleeds it to the page edges with width: 100vw and margin-left:
     -5vw. vw counts the classic scrollbar the layout viewport does not have,
     so that overflows the document by the scrollbar width on every browser
     that still paints one. The gutter is .page-padding's 5% of the viewport
     and this column is the remaining 90%, so 5vw is exactly one eighteenth of
     the column: the same bleed measured off the element's own containing
     block, which cannot exceed the viewport. 100vw is then 10/9 of the column,
     so every declaration keeps its export shape and the box is identical bar
     6/1000 of a pixel of rounding. Only valid under 767, where no container
     is near its max-width. */
  .cl-faq__nav {
    width: calc(100% * 10 / 9);
    margin-left: calc(-100% / 18);
    padding-left: calc(100% / 18);
    margin-bottom: 3rem;
    overflow-x: auto;
    scrollbar-width: none;
  }
  .cl-faq__nav::-webkit-scrollbar { display: none; }
}
@media screen and (max-width: 479px) {
  .cl-faq .heading-large { line-height: 1.3; }
}
@media (prefers-reduced-motion: reduce) {
  .cl-faq__icon svg,
  .cl-faq__item[data-animating] .cl-faq__answer { transition: none; }
}


/* cl-feature-video.css */
/* ==========================================================================
   Video feature. Port of section-clearlight-difference-2 (homepage) and
   section-featured-video_white-background (guide and product pages).

   From the export:
     .section-clearlight-difference-2  bg #f8f3ef (lucidity)
     .section-featured-video_white-background  bg #fff, position relative
     .colored-background-strip  z-index 0, bg var(--pumice), height 30%,
                               absolute, inset auto 0 0
     .page-padding-7.padding-top-small  padding 7rem 5% (no breakpoint rules;
                               the port takes the scale, see below)
     .container-small-16       = .container-small capped to 48rem, padding 0
     .padding-vertical-14      padding-left/right 0 only, no size class
     .margin-bottom-20.margin-small  margin 1rem 0 0 (stock top, bottom zeroed)
                               991: margin-top 0
     .pre-heading-10, -11      = .pre-heading at 400 with no margin-top
     .heading-medium-21        2.25rem / 1.2    991: 1.75rem   767: 1.5rem / 1.4
     .text-size-large-2        1.25rem, text-transform none, weight inherited (300)
                               767: 1.125rem / 1.35
     .margin-top-9.margin-large  = .margin-top.margin-large
     .link-large-3             = .link-large
     .padding-top-2.padding-xhuge  7rem 0 0, scale at the breakpoints
     .padding-vertical.padding-xhuge  the base combo (.is-tablet-tall in cl-base)
     .video-feature_component  grid 1fr 1fr, col-gap 5rem, row-gap 4rem,
                               align items centre, z-index 1
                               .shadow adds bg #fff and the box-shadow
                               991: col-gap 3rem   767: 1 column, row-gap 3rem
                               767 + .shadow: row-gap 0
     .video-feature_lightbox   flex centred, 100% x 100%, relative, overflow hidden
                               (.w-inline-block: max-width 100%)
     .layout2_lightbox-image   object-fit cover, width 100%    991: height 100%
     .lightbox-play-icon-2     6rem square, #fff on #131313, z-index 2,
                               absolute, inset auto auto 0 0 (bottom left),
                               padding 1.4rem 1.2rem 1.4rem 1.6rem, hover #daa520
     .video-feature_content    padding-block 2.4rem, padding-right 8rem
                               991: padding-right 2rem   767: padding 2rem
       .margin-bottom-20.margin-xsmall  margin 1rem 0 20px   991: top 0
       .margin-bottom.margin-xsmall     margin 0 0 20px      767: bottom .75rem
         (both collapse under the eyebrow's own 2rem bottom margin)
       .pre-heading (white)    margin-top 4rem, margin-bottom 2rem, 600
       .margin-bottom-20.margin-small   margin 1rem 0 0      991: top 0
       .margin-bottom.margin-small      margin 0
       .heading-medium-22      2rem / 1.1, margin-bottom 1rem
                               991: 1.75rem, text-align left   767: 1.5rem / 1.4
       .heading-medium-2       2.25rem / 1.1    991: 1.75rem   767: 1.5rem / 1.4

   Deviation, same policy as the CTA banner (docs/DEDUPE-MAP.md): the
   homepage's .page-padding-7.padding-top-small is a numbered class with no
   breakpoint rules, so its 7rem holds at every width. The port renders it with
   the padding scale (6rem at 991, 4rem at 767), 16px then 48px tighter above
   the intro and below the video on narrow screens.

   The lightbox is a <dialog> with the iframe injected on open, so nothing from
   YouTube or Vimeo loads until someone asks for it.

   Not from the export: min-width 0 on the grid children and overflow-wrap on
   the text blocks. The export never met a word wide enough to matter; the
   product template did, and the section overflowed the page by 238px at 390.
   Both are scoped here rather than pushed into cl-base.css.

   Also not from the export: the media box is a fixed 4:3 (16:10 under 768)
   with the poster covering it. The export let the poster's own height size
   the grid row, which worked on a page where the img carried no dimensions.
   Shopify's image_tag writes width and height attributes from the requested
   width, and with only `width: 100%` in the CSS the height attribute stood:
   the 1301x1242 homepage poster rendered 600px wide by 1527px tall. A box
   with its own ratio and an absolutely placed cover image ignores whatever
   the attributes say.
   ========================================================================== */

.cl-feature-video { background-color: var(--cl-lucidity); }
.cl-feature-video.is-white { background-color: var(--cl-white); position: relative; }

.cl-feature-video__strip {
  z-index: 0;
  background-color: var(--cl-pumice);
  height: 30%;
  position: absolute;
  inset: auto 0 0;
}

/* .container-small-16 caps at 48rem where the global .container-small is 52rem */
.cl-feature-video .container-small { max-width: 48rem; }

/* .title_row: eyebrow, heading, copy and the underlined link as one column,
   .5rem apart, the link a full 1rem below (its own .5rem margin plus the gap).
   .is-centered centres it. Generic on purpose: other sections can adopt it. */
.cl .title_row { display: flex; flex-direction: column; align-items: flex-start; row-gap: .5rem; }
.cl .title_row.is-centered { align-items: center; text-align: center; }
.cl .title_row .pre-heading { margin: 0; }
.cl .title_row .link-large { margin-top: .5rem; }
.cl-feature-video__intro .text-size-large { font-weight: 300; }

.cl-feature-video__component {
  z-index: 1;
  position: relative;
  display: grid;
  grid-template-columns: 1fr 1fr;
  column-gap: 5rem;
  row-gap: 4rem;
  align-items: center;
}
.cl-feature-video__component.shadow { background-color: var(--cl-white); }
.cl-feature-video__component.is-media-right { direction: rtl; }
.cl-feature-video__component.is-media-right > * { direction: ltr; }
/* 1fr is minmax(auto, 1fr) and `auto` floors the track at the item's
   min-content width, so one unbreakable token sets the column. At 767 the
   grid is a single track and the product page's placeholder heading, 544px of
   unbreakable "{{ product.metafields… }}", resolved that track to 608px inside
   a 351px box: 238px of page overflow. The media already floors at 0 through
   its own overflow:hidden; the text column does not. */
.cl-feature-video__component > * { min-width: 0; }

.cl-feature-video__media {
  width: 100%;
  max-width: 100%;
  aspect-ratio: 4 / 3;
  display: block;
  position: relative;
  overflow: hidden;
  background-color: var(--cl-pumice);
}
/* the muted loop covers the box over the poster, which stays as the frame
   painted before the file arrives */
.cl-feature-video__bg {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  z-index: 1;
}
/* The poster covers the 4:3 box. Absolutely placed so neither the width and
   height attributes image_tag writes nor a percentage-height quirk can size
   it; the box's own ratio is the only geometry. */
.cl-feature-video__media img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
/* Browsers without aspect-ratio (Safari 14) would collapse the box to 0 with
   nothing in flow; a padding-top pseudo keeps the ratio there. */
@supports not (aspect-ratio: 4 / 3) {
  .cl-feature-video__media::before { content: ""; display: block; width: 100%; padding-top: 75%; }
}

/* The play button, centred: a frosted white disc with a white hairline
   (client, 2026-08-25), replacing the export's black square in the corner. */
.cl-feature-video__play {
  z-index: 2;
  position: absolute;
  inset: 0;
  margin: auto;
  width: 4.5rem;
  height: 4.5rem;
  padding: 0;
  border: 1px solid var(--cl-white);
  border-radius: 100px;
  color: var(--cl-white);
  background-color: #ffffff33;
  -webkit-backdrop-filter: blur(.75rem);
  backdrop-filter: blur(.75rem);
  justify-content: center;
  align-items: center;
  display: flex;
  cursor: pointer;
  appearance: none;
  transition: background-color .2s ease, transform .2s ease;
}
.cl-feature-video__play:hover,
.cl-feature-video__play:focus-visible { background-color: #ffffff59; transform: scale(1.04); }
.cl-feature-video__play:focus-visible { outline: 2px solid var(--cl-white); outline-offset: 3px; }
.cl-feature-video__play svg { width: 1.25rem; height: 1.25rem; margin-left: .2rem; display: block; }

.cl-feature-video__content { padding-top: 2.4rem; padding-bottom: 2.4rem; padding-right: 8rem; }

/* A German compound or a pasted URL is one word to the line breaker and would
   otherwise run out of the column whatever the track does. `anywhere` only
   adds break opportunities where a word does not fit, so ordinary wrapping is
   untouched; it also lets these blocks report a small min-content width, which
   is what keeps the grid honest above. No hyphens: auto, the page is lang="de"
   and Chrome would then re-break the ported copy and move every text probe. */
.cl-feature-video__intro .heading-medium,
.cl-feature-video__intro .text-size-large,
.cl-feature-video__content .heading-medium,
.cl-feature-video__content .pre-heading,
.cl-feature-video__content .cl-richtext { overflow-wrap: anywhere; }

/* the export's wrappers resolve to: eyebrow wrapper top 1rem (stock, homepage
   only), heading wrapper top 1rem and bottom 0; the spacing below the heading
   is the heading's own margin */
.cl .cl-feature-video__eyebrow { margin-top: 1rem; margin-bottom: 20px; }
.cl .cl-feature-video__head { margin-top: 1rem; margin-bottom: 0; }
.is-white .cl-feature-video__eyebrow,
.is-white .cl-feature-video__head { margin-top: 0; }

/* .heading-medium-22 (homepage) and .heading-medium-2 (white) */
.cl-feature-video__content .heading-medium { font-size: 2rem; line-height: 1.1; margin-bottom: 1rem; }
.is-white .cl-feature-video__content .heading-medium { font-size: 2.25rem; margin-bottom: 0; }

.cl-feature-video__dialog {
  border: 0;
  padding: 0;
  background: transparent;
  /* % of the initial containing block, not vw: vw counts a classic scrollbar
     that the layout viewport does not have. The open player has to be BIGGER
     than the inline one (container-large, 80rem), not smaller, and the 16:9
     frame plus the close button above it must still fit the viewport height. */
  width: min(94%, 88rem, calc((100vh - 7rem) * 16 / 9));
  max-width: none;
}
/* the same white-at-75% + blur the nav puts behind an open dropdown */
.cl-feature-video__dialog::backdrop { background: #ffffffbf; -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px); }
.cl-feature-video__frame { position: relative; padding-top: 56.25%; background: #000; border-radius: .75rem; overflow: hidden; box-shadow: 0 24px 64px var(--cl-ink-25); }
.cl-feature-video__frame iframe,
.cl-feature-video__frame video { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; background: #000; }
.cl-feature-video__close {
  position: absolute;
  top: -2.75rem;
  right: 0;
  appearance: none;
  background: none;
  border: 0;
  color: var(--cl-cocoa);
  font-size: 1.75rem;
  cursor: pointer;
  line-height: 1;
}

/* --- cinema: the video alone, container-large wide, rounded --------------- */
.cl-feature-video.is-cinema .cl-feature-video__component { display: block; }
.cl-feature-video.is-cinema .cl-feature-video__media { aspect-ratio: 16 / 9; border-radius: .75rem; }
@supports not (aspect-ratio: 16 / 9) {
  .cl-feature-video.is-cinema .cl-feature-video__media::before { padding-top: 56.25%; }
}
@supports (width: min(1px, 1dvh)) {
  .cl-feature-video__dialog { width: min(94%, 88rem, calc((100dvh - 7rem) * 16 / 9)); }
}
@media screen and (max-width: 767px) {
  .cl-feature-video.is-cinema .cl-feature-video__media { aspect-ratio: 4 / 3; border-radius: .5rem; }
}

@media screen and (max-width: 991px) {
  .cl .cl-feature-video__eyebrow,
  .cl .cl-feature-video__head { margin-top: 0; }
  .cl-feature-video__component { column-gap: 3rem; }
  .cl-feature-video__content { padding-right: 2rem; }
  .cl-feature-video .cl-feature-video__content .heading-medium { font-size: 1.75rem; }
  /* .heading-medium-22 goes left; .heading-medium-2 inherits the centre the
     base .padding-vertical.padding-xhuge combo sets at this width */
  .cl-feature-video:not(.is-white) .cl-feature-video__content .heading-medium { text-align: left; }
  /* the export's global .pre-heading { text-align: left } at 991 */
  .cl-feature-video__content .pre-heading { text-align: left; }
}
@media screen and (max-width: 767px) {
  .cl-feature-video__intro .heading-medium { line-height: 1.4; }
  .cl-feature-video__intro .text-size-large { line-height: 1.35; }
  .cl-feature-video__component { grid-template-columns: 1fr; row-gap: 3rem; }
  .cl-feature-video__component.shadow { row-gap: 0; }
  /* one column: a shallower box, the card is now stacked */
  .cl-feature-video__media { aspect-ratio: 16 / 10; }
  .cl-feature-video__component.is-media-right { direction: ltr; }
  .cl-feature-video__content { padding: 2rem; }
  .cl .cl-feature-video__eyebrow { margin-bottom: .75rem; }
  .cl-feature-video .cl-feature-video__content .heading-medium { font-size: 1.5rem; line-height: 1.4; }
}

/* --- cinema caption: eyebrow + heading + credits bottom left, play bottom
   right, over a dark foot gradient (client, 2026-08-25) ----------------- */
.cl-feature-video.is-cinema .cl-feature-video__media::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  background-image: linear-gradient(to top, var(--cl-ink-60) 0%, var(--cl-ink-20) 35%, transparent 60%);
}
.cl-feature-video.is-cinema .cl-feature-video__caption {
  position: absolute;
  z-index: 2;
  left: 2.5rem;
  right: 9rem;
  bottom: 2.25rem;
  color: var(--cl-white);
  text-align: left;
  display: flex;
  flex-direction: column;
  row-gap: .5rem;
  pointer-events: none;
}
.cl-feature-video__cap-eyebrow { font-size: .8125rem; letter-spacing: 1px; text-transform: uppercase; font-weight: 500; opacity: .9; }
.cl .cl-feature-video__cap-title { font-family: var(--cl-font-heading); font-size: 2.25rem; line-height: 1.1; margin: 0; color: inherit; font-weight: 400; }
.cl-feature-video__credits { font-size: .9375rem; opacity: .85; margin-top: .25rem; }
.cl-feature-video.is-cinema .cl-feature-video__play {
  inset: auto 2.5rem 2.25rem auto;
  margin: 0;
  width: 4rem;
  height: 4rem;
}
@media screen and (max-width: 991px) {
  .cl-feature-video.is-cinema .cl-feature-video__caption { left: 1.5rem; right: 7rem; bottom: 1.5rem; }
  .cl .cl-feature-video__cap-title { font-size: 1.75rem; }
  .cl-feature-video.is-cinema .cl-feature-video__play { inset: auto 1.5rem 1.5rem auto; width: 3.5rem; height: 3.5rem; }
}
@media screen and (max-width: 767px) {
  .cl-feature-video.is-cinema .cl-feature-video__caption { left: 1.25rem; right: 5.5rem; bottom: 1.25rem; row-gap: .25rem; }
  .cl .cl-feature-video__cap-title { font-size: 1.375rem; line-height: 1.25; }
  .cl-feature-video__credits { font-size: .8125rem; }
  .cl-feature-video.is-cinema .cl-feature-video__play { inset: auto 1.25rem 1.25rem auto; width: 3rem; height: 3rem; }
  .cl-feature-video.is-cinema .cl-feature-video__play svg { width: 1rem; height: 1rem; }
}

/* Round twenty-one (2026-08-30), delivery: the loop is preload="none" and
   starts on intersection (section script), so until it is painting frames
   the poster <img> underneath is the picture; .is-playing is set on the
   video's first 'playing' event. */
.cl-feature-video__bg { opacity: 0; transition: opacity .35s ease; }
.cl-feature-video__bg.is-playing { opacity: 1; }


/* cl-footer.css */
/* ==========================================================================
   Clearlight footer.

   Values read from the export:
     .footer                    bg cocoa, colour #fff, margin-top auto, overflow hidden
     .footer_column-layout      grid 1fr x5, col-gap 3vw, row-gap 1rem, align start
                                991: 3 cols, row-gap 3rem   767: 1 col   479: row-gap 40px
     .footer_top-wrapper        col-gap 8vw, row-gap 1rem
                                991: row-gap 4rem  767: 3rem  479: 48px
     .footer-link               opacity .6, .875rem, padding-block .5rem, transition .14s
                                hover opacity 1
     .footer_column-headings    .75rem, 500, uppercase, letter-spacing 1px, mb .5rem
     .footer2_bottom-wrapper    grid .5fr .75fr, space-between, align end
                                991: column-reverse, flex-start   479: 1fr
     .footer2_logo-link         width 9rem   991: max-width 15rem (inert, width stays 9rem)
                                479: width 8rem
     .footer2_socials-wrapper   auto-flow column, max-content, place-items end start, mt 1rem
                                991: mb 2rem
     .footer_right-wrapper      columns 4 and 5: heading in .margin-bottom.margin-xxsmall
                                (+.5rem under the heading), links in
                                .margin-bottom.margin-xsmall (stock 20px after, 1rem at 767)
     .footer2_social-link       mr .8rem, hover colour golden
     .form_input.is-footer      transparent, .5px #fff border   767: text-align center
     .newsletter-form_input-wrapper1  grid 10rem 10rem 15rem 1fr, gap 1rem, max-width 30rem
                                991: 1fr, no max-width
     .newsletter_form-wrapper   max-width 37.5rem, mb 3rem

   One naming lie carried across for fidelity: .footer_column-headings
   .text-color-gold resolves to var(--lucid), not the golden token. The heading
   colour here is lucid, and the class is no longer called gold.
   ========================================================================== */

.cl-footer {
  background-color: var(--cl-cocoa);
  color: var(--cl-white);
  margin-top: auto;
  overflow: hidden;
}

/* --- newsletter ---------------------------------------------------------- */

.cl-footer__newsletter { max-width: 37.5rem; margin-bottom: 3rem; }

.cl-footer__form {
  display: flex;
  flex-direction: column;
  row-gap: 1rem;
  justify-content: flex-start;
  align-items: stretch;
}

/* One long field, the button inside it (client, 2026-08-25) */
.cl-footer__fields { display: block; max-width: 100%; }
.cl-footer__field { position: relative; display: block; }
.cl-footer__field .form_input { width: 100%; padding-right: 9.5rem; min-height: 3.5rem; }

.cl-footer .form_input {
  background-color: transparent;
  border: .5px solid var(--cl-white);
  border-radius: .25rem;
  min-height: 3rem;
  color: var(--cl-white);
  padding: .5rem 1rem;
  font-family: inherit;
  font-size: 1rem;
  line-height: 1.42857; /* Webflow's .w-input value, to the digit */
}
.cl-footer .form_input::placeholder { color: #ffffff8c; }
.cl-footer .form_input:focus { outline: 2px solid var(--cl-lucid); outline-offset: 1px; }

/* the white button sits inside the field: .25rem of air on the top, bottom
   and right, cocoa text, its own radius one step under the field's */
.cl-footer .button.is-newsletter-footer {
  position: absolute;
  top: .25rem;
  right: .25rem;
  bottom: .25rem;
  min-width: 0;
  padding: 0 1.5rem;
  border: 0;
  border-radius: .2rem;
  color: var(--cl-cocoa);
  background-color: var(--cl-white);
  cursor: pointer;
  font-family: inherit;
  line-height: 1;
  transition: background-color .2s ease, color .2s ease;
}
.cl-footer .button.is-newsletter-footer:hover { background-color: var(--cl-lucid); color: var(--cl-cocoa); }

.cl-footer__success,
.cl-footer__error {
  background-color: var(--cl-cocoa-press);
  border: 1px solid #ffffff40;
  border-radius: .25rem;
  padding: 1rem;
}
.cl-footer__error { border-color: #801c0080; }

/* --- columns ------------------------------------------------------------- */

.cl-footer__columns {
  display: grid;
  grid-template-columns: repeat(5, 1fr);
  column-gap: 3vw;
  row-gap: 1rem;
  align-items: start;
}

.cl-footer__column {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
}

/* .footer_top-wrapper contributed row-gap between the newsletter and the
   columns; with the newsletter in its own padded block this is the group gap. */
.cl-footer__group { display: flex; flex-direction: column; align-items: flex-start; align-self: stretch; }
.cl-footer__group + .cl-footer__group { margin-top: 1rem; }

/* The export's columns four and five (.footer_right-wrapper) wrap the heading
   in .margin-bottom.margin-xxsmall and the rows in .margin-bottom.margin-xsmall.
   Both wrappers are flex items, so nothing collapses: 1rem lands under the
   heading and the stock 20px (1rem at 767) after the rows, and that trailing
   margin counts in the column's height even when nothing follows, which is
   what sets the grid rows at 991 and below. Tied to the small row style,
   which is what those two columns use. The socials block sits in its own
   heading wrapper (.5rem after) followed by an empty rows wrapper (20px), so
   28px trail it, 24px at 767. */
.cl-footer__group.is-small > .footer_column-headings { margin-bottom: 1rem; }
.cl-footer__group.is-small { margin-bottom: 20px; }
.cl-footer__group.is-socials { margin-bottom: 28px; }
.cl-footer__group.is-small + .cl-footer__group,
.cl-footer__group.is-socials + .cl-footer__group { margin-top: 0; }

.cl-footer .footer_column-headings {
  color: var(--cl-lucid);
  letter-spacing: 1px;
  text-transform: uppercase;
  margin-bottom: .5rem;
  font-size: .75rem;
  font-weight: 500;
}

.cl-footer .footer-link {
  opacity: .6;
  color: var(--cl-white);
  padding-top: .5rem;
  padding-bottom: .5rem;
  font-size: .875rem;
  text-decoration: none;
  transition: opacity .14s;
  display: flex;
}
.cl-footer .footer-link:hover { opacity: 1; }
.cl-footer .footer-link.no-pad { padding-top: 0; padding-bottom: 0; }

/* Any link inside the footer, including the ones inside rich text from the
   theme editor, was falling back to the UA blue. */
.cl-footer a { color: inherit; }
.cl-footer__form a,
.cl-footer__richtext a { color: var(--cl-white); text-decoration: underline; text-underline-offset: .15em; }
.cl-footer__form a:hover,
.cl-footer__richtext a:hover { opacity: .75; }

.cl-footer__richtext p { margin: 0 0 .5rem; }
.cl-footer__form p { margin: 0; }

/* --- socials ------------------------------------------------------------- */

.cl-footer__socials {
  display: grid;
  grid-auto-flow: column;
  grid-auto-columns: max-content;
  place-items: end start;
  margin-top: 1rem;
  /* The export's grid is a block inside a block, so it spans the column.
     In a flex group with align-items: flex-start it would shrink-wrap. */
  align-self: stretch;
}
/* In the export the heading (margin-bottom .5rem) and this grid (margin-top
   1rem) are block siblings, so the margins collapse to 1rem. Flex items do
   not collapse, so the heading drops its own margin in this group. */
.cl-footer__group.is-socials > .footer_column-headings { margin-bottom: 0; }

.cl-footer .footer2_social-link {
  color: var(--cl-white);
  align-items: center;
  max-width: 100%; /* .w-inline-block */
  margin-right: .8rem;
  text-decoration: none;
  display: flex;
  transition: color .14s;
}
.cl-footer .footer2_social-link:hover { color: var(--cl-lucid); }

.cl-footer .social-icon svg { width: 100%; height: 100%; fill: currentColor; display: block; }

/* --- bottom bar ---------------------------------------------------------- */

/* The export's .padding-top carries Webflow's stock `padding: 16px 0 0`,
   declared after .padding-medium and with no .padding-top.padding-medium
   combo rule to restore the scale, so the bottom block has 16px of top
   padding at desktop and tablet, not 2rem. Same pattern as the hero's
   .margin-bottom-12 (DEDUPE-MAP). Matching the render; the base scale would
   give 2rem. */
.cl-footer .padding-top.padding-medium { padding-top: 1rem; }

.cl-footer__bottom {
  display: grid;
  grid-template-columns: .5fr .75fr;
  column-gap: 1rem;
  row-gap: 1rem;
  justify-content: space-between;
  align-items: flex-end;
  width: 100%;
}

.cl-footer__brand { display: flex; flex-direction: column; row-gap: 1.5rem; }
/* Round twenty: the logo and the market pill share a row; the pill wraps
   under the mark when the .5fr track gets too narrow for both. */
.cl-footer__brand-row { display: flex; flex-wrap: wrap; align-items: center; column-gap: 1.25rem; row-gap: 1rem; }
.cl-footer__logo  { width: 9rem; padding-left: 0; display: block; position: relative; color: inherit; text-decoration: none; }
.cl-footer__logo img { width: 100%; height: auto; display: block; }
/* The export sets justify-content: space-between on a grid whose .5fr .75fr
   tracks always fill, so it does nothing and the copyright lands 40% across
   with the left edge of a track. Right-aligning it is what that declaration
   was reaching for. */
.cl-footer__legal { display: flex; align-items: flex-end; justify-content: flex-end; }

/* --- market switch (round twenty) ---------------------------------------- */

/* The topbar's region chip on the cocoa ground: a hairline pill, flag, the
   country and language in one line, a chevron. The flag box itself is
   cl-topbar.css's .cl-flag (the nav loads it on every page this footer is
   on); the pill only sizes and spaces it. */
.cl-footer .cl-footer__market {
  appearance: none;
  display: inline-flex;
  align-items: center;
  column-gap: .625rem;
  max-width: 100%;
  min-height: 2.25rem;
  padding: .375rem .875rem .375rem .75rem;
  background: none;
  border: 1px solid var(--cl-veil-light-press);
  border-radius: 100px;
  font: inherit;
  font-size: .8125rem;
  line-height: 1.3;
  letter-spacing: .25px;
  color: var(--cl-white);
  text-align: left;
  cursor: pointer;
  transition: border-color .15s ease, background-color .15s ease;
}
.cl-footer .cl-footer__market:hover { border-color: var(--cl-white); background-color: var(--cl-veil-light); }
.cl-footer .cl-footer__market:focus-visible { outline: 2px solid var(--cl-lucid); outline-offset: 2px; }
.cl-footer .cl-footer__market[hidden] { display: none; }
.cl-footer__market-text { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cl-footer__market-chevron { flex: none; width: .625rem; height: .375rem; opacity: .7; }
.cl-footer__market-chevron svg { width: 100%; height: 100%; display: block; }
.cl-footer .cl-footer__market:hover .cl-footer__market-chevron { opacity: 1; }

/* --- breakpoints --------------------------------------------------------- */

@media screen and (max-width: 991px) {
  .cl-footer__legal { justify-content: flex-start; }
  .cl-footer__columns { grid-template-columns: repeat(3, 1fr); row-gap: 3rem; }
  .cl-footer__socials { margin-bottom: 2rem; }
  /* The export sets flex-direction: column-reverse here on a display:grid box,
     which does nothing. The original stays a two column grid at 991; only the
     alignment changes. Matching the render, not the apparent intent. */
  .cl-footer__bottom { justify-content: flex-start; align-items: flex-start; }
  /* The export adds max-width: 15rem here and keeps width: 9rem, so the
     max-width never bites. An earlier width: auto let the image grow to it. */
  .cl-footer__logo { max-width: 15rem; }
}

@media screen and (max-width: 767px) {
  .cl-footer__columns { grid-template-columns: 1fr; }
  .cl-footer__group.is-small { margin-bottom: 1rem; }   /* .is-small-mobile */
  .cl-footer__group.is-socials { margin-bottom: 1.5rem; }
  /* .padding-medium steps to 1.5rem here, later in the file than the stock
     .padding-top rule, so the scale value is live again. */
  .cl-footer .padding-top.padding-medium { padding-top: 1.5rem; }
  .cl-footer__field .form_input { padding-right: 8.5rem; }
  .cl-footer .button.is-newsletter-footer { padding: 0 1rem; }
  .cl-footer__bottom { padding-bottom: 1rem; }
}

@media screen and (max-width: 479px) {
  .cl-footer__columns { row-gap: 40px; }
  .cl-footer__bottom { grid-template-columns: 1fr; }
  .cl-footer__logo { width: 8rem; max-width: none; }
}

/* --- link columns as accordions on a phone (client, 2026-08-25) ---------- */

/* the heading is a button at every width so the markup never changes; above
   767 it is inert and looks exactly like the heading did */
.cl-footer .cl-footer__acc-head {
  appearance: none;
  background: none;
  border: 0;
  padding: 0;
  margin: 0 0 .5rem;
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: space-between;
  column-gap: 1rem;
  text-align: left;
  font-family: inherit;
  cursor: default;
  pointer-events: none;
}
.cl-footer__acc-icon { display: none; width: 1.25rem; height: 1.25rem; flex: none; transition: transform .35s ease; }
.cl-footer__acc-panel { display: grid; grid-template-rows: 1fr; }
.cl-footer__acc-inner { min-height: 0; display: flex; flex-direction: column; align-items: flex-start; }
.cl-footer__group.is-small .cl-footer__acc-head { margin-bottom: 1rem; }

@media screen and (max-width: 767px) {
  .cl-footer__columns { row-gap: 0; }
  .cl-footer__group.is-acc { border-top: 1px solid #ffffff26; margin: 0 !important; }
  .cl-footer__column:last-child .cl-footer__group.is-acc:last-child { border-bottom: 1px solid #ffffff26; }
  .cl-footer__group.is-acc + .cl-footer__group.is-acc { border-top: 1px solid #ffffff26; }
  .cl-footer .cl-footer__acc-head {
    pointer-events: auto;
    cursor: pointer;
    margin: 0;
    padding: 1.125rem 0;
    color: var(--cl-white);
    font-size: 1rem;
    letter-spacing: 1.5px;
  }
  .cl-footer .cl-footer__acc-head:focus-visible { outline: 2px solid var(--cl-lucid); outline-offset: 2px; }
  .cl-footer__acc-icon { display: block; color: var(--cl-lucid); }
  .cl-footer__group.is-open .cl-footer__acc-icon { transform: rotate(180deg); }
  .cl-footer__acc-panel {
    grid-template-rows: 0fr;
    overflow: hidden;
    transition: grid-template-rows .4s cubic-bezier(.2, 0, 0, 1), opacity .3s ease;
    opacity: 0;
  }
  .cl-footer__group.is-open .cl-footer__acc-panel { grid-template-rows: 1fr; opacity: 1; }
  .cl-footer__acc-inner { padding-bottom: .5rem; }
  .cl-footer__group.is-open .cl-footer__acc-inner { padding-bottom: 1rem; }
  /* the socials group is not an accordion; give it the same breathing room */
  .cl-footer__group.is-socials { margin-top: 2rem; }
}
@media (prefers-reduced-motion: reduce) {
  .cl-footer__acc-panel, .cl-footer__acc-icon { transition: none; }
}

/* The phone-only logo above the newsletter, and its desktop twin below it.
   Exactly one of the pair is ever in the document's accessibility tree, because
   display:none removes the other from it as well as from the page. */
.cl-footer__logo--m { display: none; }

@media screen and (max-width: 767px) {
  .cl-footer__logo--m { display: block; width: 8rem; margin-bottom: 2rem; }
  .cl-footer__bottom .cl-footer__logo { display: none; }
  /* the pill stands alone in the bottom row (the mark is at the top of the
     footer here) and runs the full width, chevron on the right edge */
  .cl-footer__brand-row { display: block; }
  .cl-footer .cl-footer__market { display: flex; width: 100%; min-height: 2.75rem; padding: .5rem 1rem; }
  .cl-footer__market-text { flex: 1 1 auto; }
}

/* Round twenty-three (client 2026-09-16): on a phone the socials' bottom
   margin, the columns block's 3rem bottom padding and the bottom bar's top
   padding stacked to 96px above the market pill; 2.5rem now. */
@media screen and (max-width: 767px) {
  .cl-footer .padding-bottom.padding-xxlarge { padding-bottom: 0; }
  .cl-footer__group.is-socials { margin-bottom: 1rem; }
}


/* cl-full-image.css */
/* ==========================================================================
   Full-bleed statement. Port of section-full-image.

   From the export:
     .section-full-image        position relative
     .full-width-image_content  z-index 1, height 80vh, colour #fff,
                                flex column centred, padding-top 8rem
     .background-image_wrapper  z-index -1, absolute inset 0, overflow hidden
     .colored-image-overlay     z-index 1, absolute inset 0
     .heading-xlarge-12         5rem / -1px / 1.1   767: 4rem   479: 2.5rem
     .subheading-large-10       2rem / 400          767: 1.4rem 479: 1.125rem/1.4
     .pre-heading-12            = .pre-heading.is-plain
     .margin-bottom-20.margin-small  (heading wrapper) margin 1rem 0 0 at
                                desktop, 0 0 0 from 991 down: the twin's stock
                                `margin: 1rem 0 20px` with the bottom zeroed
     .margin-bottom.margin-large  20px at desktop: the export's base
                                .margin-bottom carries Webflow's stock
                                `margin: 0 0 20px` after every size class;
                                the scale (2.5rem, 2rem) returns inside the
                                breakpoints

   The heading here is .heading-xlarge with .is-compact, which is the same
   -1px / 2.5rem pairing the hero's promo slide uses.
   ========================================================================== */

/* `overflow: clip` rather than `hidden`: hidden makes the box a scroll
   container, and the scroll-driven animations below would then measure
   against it instead of the viewport. Browsers without clip keep hidden. */
.cl-full-image { position: relative; overflow: hidden; overflow: clip; }

.cl-full-image__media { z-index: 0; position: absolute; inset: 0; overflow: hidden; overflow: clip; }
.cl-full-image__media img { object-fit: cover; width: 100%; height: 100%; position: absolute; inset: 0; }
.cl-full-image__overlay { z-index: 1; position: absolute; inset: 0; }

.cl-full-image__content {
  z-index: 2;
  position: relative;
  min-height: var(--cl-fi-height, 80vh);
  height: auto;
  color: var(--cl-white);
  flex-direction: column;
  justify-content: center;
  align-items: center;
  padding-top: 8rem;
  padding-bottom: 8rem;
  display: flex;
}

.cl-full-image__lead { font-size: 2rem; font-weight: 400; }

/* The stock-margin twins, reproduced because they are what renders (see
   DEDUPE-MAP, "A pattern in the margin-bottom copies"). The heading wrapper
   keeps a 1rem top and no bottom; the block above the link keeps 20px at
   desktop, where cl-base.css would give the 3rem of .margin-large. */
.cl-full-image .margin-bottom.margin-small { margin-bottom: 0; }
@media screen and (min-width: 992px) {
  .cl-full-image .margin-bottom.margin-small { margin-top: 1rem; }
  .cl-full-image__content > .margin-bottom.margin-large { margin-bottom: 20px; }
}

@media screen and (max-width: 767px) {
  .cl-full-image__lead { font-size: 1.4rem; }
}
@media screen and (max-width: 479px) {
  .cl-full-image__lead { font-size: 1.125rem; line-height: 1.4; }
}

/* is-cta: kontakt/*.html :: .section-full-image
     .container-small > .full-width-image_content (80vh, padding 8rem 0, flex column centred, white)
       > .max-width-medium (35rem) > .text-align-center > .heading-medium
       > .margin-top.margin-small > .button-wrapper > .button.is-white (inline-block, <strong> label)
     .image-overlay  stock #00000040 (the template sets overlay 25%, rgb 0,0,0) */
.cl-full-image.is-cta .max-width-medium { margin-inline: auto; }
.cl-full-image.is-cta .cl-full-image__button-wrap { display: flex; justify-content: center; }
.cl-full-image.is-cta .button.is-white { display: inline-flex; }
@media screen and (max-width: 767px) {
  .cl-full-image.is-cta .max-width-medium { font-size: 1rem; }
}

/* --------------------------------------------------------------------------
   Round eleven, item 2: scroll-linked growth and parallax (statement layout,
   `is-grow`, desktop only). The media layer is clipped to 80% width when the
   section's top edge enters the viewport and reaches 100% once the section
   is fully in (`entry 0%` to `entry 100%`); the image, 12% taller than its
   box, drifts 6% down to 6% up across the whole pass (`cover`). Only
   clip-path and transform animate: no layout, no reflow, the section keeps
   its 80vh. The custom properties are the JS fallback's handles (the script
   in cl-full-image.liquid sets them where `animation-timeline` is missing);
   the animations override them where it is supported.
   -------------------------------------------------------------------------- */
@media screen and (min-width: 992px) {
  .cl-full-image.is-grow .cl-full-image__media {
    clip-path: inset(0 var(--cl-fi-inset, 0%));
    will-change: clip-path;
  }
  .cl-full-image.is-grow .cl-full-image__media img {
    inset: -6% 0;
    height: 112%;
    transform: translate3d(0, var(--cl-fi-shift, 0%), 0);
    will-change: transform;
  }
  @supports (animation-timeline: view()) {
    .cl-full-image.is-grow .cl-full-image__media {
      animation: cl-fi-grow linear both;
      animation-timeline: view();
      animation-range: entry 0% entry 100%;
    }
    .cl-full-image.is-grow .cl-full-image__media img {
      animation: cl-fi-drift linear both;
      animation-timeline: view();
      animation-range: cover 0% cover 100%;
    }
  }
}
@keyframes cl-fi-grow { from { clip-path: inset(0 10%); } to { clip-path: inset(0 0%); } }
@keyframes cl-fi-drift { from { transform: translate3d(0, 6%, 0); } to { transform: translate3d(0, -6%, 0); } }
@media (prefers-reduced-motion: reduce) {
  .cl-full-image.is-grow .cl-full-image__media,
  .cl-full-image.is-grow .cl-full-image__media img { animation: none; clip-path: none; transform: none; will-change: auto; }
}


/* cl-gallery.css */
/* ==========================================================================
   Image grid. Port of gallery4_component (katalog-anfordern.html ::
   .section-gallery-4) and gallery3_component
   (tipps-um-das-meiste-aus-der-sauna-zu-holen.html :: .section-gallery3).

   From the export:
     .section-gallery-4, .section-gallery3   no rules: transparent, no padding
     .padding-vertical (no size class)       padding-inline 0, nothing vertical
     .gallery4_component (.w-layout-grid)    grid 1fr x4, gap 16px,
                                             place-items start center; no
                                             991 or 767 rule, so four columns
                                             down to 479 where it turns to
                                             display: block and the squares
                                             stack with no gap at all   -> .is-tight
     .gallery3_component (.w-layout-grid)    grid 1fr x3, gap 1.5rem,
                                             place-items start center
                                             991: gap 1rem   767: 1 column,
                                             gap 1.5rem   479: gap 1rem   -> ""
     .gallery3_image-wrapper                 width 100%, padding-top 100%, relative
                                                                         -> __item
     .image                                  object-fit fill, width and height
                                             100%, absolute, inset 0 0 auto  -> __img
     .text-rich-text figcaption              opacity .8, border-left 2px #000,
                                             margin-top .5rem, padding-left .5rem,
                                             .875rem. The galleries carry no
                                             captions; the optional caption
                                             block setting borrows this   -> __caption

   The export's object-fit: fill stretches every photo into the square (the
   sources are 800x694 and 648x804). That is the `fit` select's "is-fill";
   the default is cover (same box, no distortion, cropped) and "is-contain"
   letterboxes, which suits the catalogue page's cut-out product shots.
   ========================================================================== */

.cl-gallery { background-color: transparent; }
.cl-gallery.is-lucidity { background-color: var(--cl-lucidity); }
.cl-gallery.is-lucid    { background-color: var(--cl-lucid); }
.cl-gallery.is-pumice   { background-color: var(--cl-pumice); }

.cl-gallery__grid {
  grid-column-gap: 1.5rem;
  grid-row-gap: 1.5rem;
  grid-template-rows: auto;
  grid-template-columns: 1fr 1fr 1fr;
  grid-auto-columns: 1fr;
  place-items: start center;
  display: grid;
}
.cl-gallery__grid.is-cols-2 { grid-template-columns: 1fr 1fr; }
.cl-gallery__grid.is-cols-4 { grid-template-columns: 1fr 1fr 1fr 1fr; }
.cl-gallery__grid.is-tight { grid-column-gap: 16px; grid-row-gap: 16px; }

/* the figure only exists for the optional caption; it must fill its grid
   area because place-items centres rather than stretches */
.cl-gallery__figure { width: 100%; margin: 0; }
.cl-gallery__item { width: 100%; padding-top: 100%; position: relative; }
.cl-gallery__img {
  object-fit: cover;
  width: 100%;
  height: 100%;
  position: absolute;
  inset: 0 0 auto;
}
.cl-gallery.is-contain .cl-gallery__img { object-fit: contain; }
.cl-gallery.is-fill    .cl-gallery__img { object-fit: fill; }
.cl-gallery__caption {
  opacity: .8;
  text-align: left;
  border-left: 2px solid #000;
  margin-top: .5rem;
  padding-left: .5rem;
  font-size: .875rem;
}

@media screen and (max-width: 991px) {
  .cl-gallery__grid:not(.is-tight) { grid-column-gap: 1rem; grid-row-gap: 1rem; }
}

@media screen and (max-width: 767px) {
  .cl-gallery__grid:not(.is-tight) {
    grid-column-gap: 1.5rem;
    grid-row-gap: 1.5rem;
    grid-template-rows: auto auto auto;
    grid-template-columns: 1fr;
  }
}

@media screen and (max-width: 479px) {
  .cl-gallery__grid:not(.is-tight) { grid-column-gap: 1rem; grid-row-gap: 1rem; }
  /* the export's gallery4 drops to display: block here, which is what makes
     the squares stack edge to edge */
  .cl-gallery__grid.is-tight { align-content: start; display: block; }
}


/* cl-hero.css */
/* ==========================================================================
   Clearlight hero slider.

   Layout values read from the export:
     .section-header   colour #fff. Its padding-top 4rem (991: 5rem) cleared
                       the fixed navbar; the nav is a normal-flow sticky bar
                       now, so the hero starts directly under it and the
                       padding is gone.
     .header-vh        min-height 100vh, 991: 50rem, 767: 36rem
     .home-hero_preheading-2  1.3rem, letter-spacing .25rem, margin-bottom 1rem

   Webflow's slider chrome (.w-slider, .w-slider-mask, .w-slide) is replaced by
   a flex track, because the original was driven by webflow.js.

   Pagination and arrows are not from the export. They mirror the neverover
   hero (HeroSlider.tsx + hero-dot-fill): a frosted pill (#ffffff1f, blur 12,
   radius 100, padding 3/6, gap 8) of 6x6 dots at white 50%; the active dot is
   a 24x6 track whose white fill charges scaleX(0 -> 1) over the autoplay
   delay. The section script advances the slider on that animation's end.
   Arrows: one frosted pill at the bottom right on the container's edge,
   prev | next split by a hairline, white glyphs; hidden below 768px.
   ========================================================================== */

.cl-hero {
  --cl-hero-tuck: 1.5rem;   /* how far the next section rises over the hero */

  position: relative;
  color: var(--cl-white);
  overflow: hidden;
  margin-bottom: calc(var(--cl-hero-tuck) * -1);
}

/* Whatever follows the hero rises over its foot by --cl-hero-tuck with its
   top corners rounded, so the two tie in instead of butting. On Shopify each
   section sits in a .shopify-section wrapper; the harness wraps the same way,
   and the bare-sibling selector covers a section rendered on its own. */
.shopify-section:has(> .cl-hero) + .shopify-section > .cl,
.cl-hero + .cl {
  position: relative;
  z-index: 1;
  border-radius: 1.5rem 1.5rem 0 0;
}

/* no text selection: a mouse drag across the copy used to select it all */
.cl-hero__viewport { position: relative; overflow: hidden; touch-action: pan-y; user-select: none; -webkit-user-select: none; }

.cl-hero__track {
  display: flex;
  will-change: transform;
  transition: transform var(--cl-hero-duration, 500ms) cubic-bezier(.4, 0, .2, 1);
}
.cl-hero__track.is-dragging { transition: none; }

.cl-hero__slide { position: relative; flex: 0 0 100%; min-width: 100%; overflow: hidden; }

/* The export's hero column is 48rem (.container-small-11), not the 52rem of
   the global .container-small. Scoped here rather than changing the global,
   which other sections use at 52rem. */
.cl-hero .container-small { max-width: 48rem; }

/* The export's heading block resolves to margin-bottom: 20px at desktop only,
   not the 4rem its .margin-xlarge implies: .margin-bottom-12's stock
   `margin: 1rem 0 20px` is declared after the base .margin-xlarge and never
   restates the bottom. Inside the breakpoints the order flips: the responsive
   .margin-xlarge rules (3.5rem at 991, 2.5rem at 767) come later in the file
   than .margin-bottom-12, so below 992px the scale value is live again and the
   block carries 56px / 40px / 40px. Only the desktop value is pinned here; the
   base scale supplies the rest.

   Why this hid for so long: the block's bottom margin collapses with the CTA
   wrapper's 2rem top margin (.margin-top.margin-medium). At desktop both sides
   resolve to max(20, 32) = 32, so every probe was exact, and every padding and
   child height stayed identical at the narrower widths while the collapsed gap
   differed: max(56, 32) = 56 against max(20, 32) = 32 at 991 (24px), and
   max(40, 32) = 40 against max(20, 24) = 24 at 767 and 479 (16px). A margin is
   not part of any element's box, which is why the raw rectangles all matched.
   20px is off the spacing scale, which is why this is an override rather than a
   step. Flagged for the design pass; matching the render for now. */
@media screen and (min-width: 992px) {
  .cl-hero .max-width-large > .margin-bottom { margin-bottom: 20px; }
}

/* The CTA wrapper's 2rem top margin never steps down in the export:
   .margin-top-9.margin-medium { margin: 2rem 0 0 } is a two-class rule with no
   767 twin, so it beats the base .margin-medium { margin: 1.5rem } at every
   width. Held at 2rem so the collapsed gap above the buttons matches even when
   a slide carries no heading block margin (fine print only, no subheading). */
.cl-hero .max-width-large > .margin-top.margin-medium { --cl-space: 2rem; }

.cl-hero__media   { position: absolute; inset: 0; z-index: 0; }

/* --- background film (round twenty-three) -------------------------------- */
/* The film sits over the poster photo and fades in once it is playing, so
   the LCP photo is what paints first and a slow network shows a still. */
.cl-hero__video {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  opacity: 0;
  transition: opacity .6s ease;
  pointer-events: none;
}
.cl-hero__video.is-playing { opacity: 1; }
@media (prefers-reduced-motion: reduce) { .cl-hero__video { display: none; } }

/* --- bottom-left placement (round twenty-three, EU home) ----------------- */
.cl-hero__slide.is-corner .cl-hero__frame { align-items: flex-end; justify-content: flex-start; }
.cl-hero__slide.is-corner .cl-hero__frame > .padding-vertical { width: 100%; }
/* .cl .max-width-large centres itself with auto margins; the corner layout
   pins it to the container's left edge, on the logo's vertical. */
.cl .cl-hero__slide.is-corner .max-width-large { margin-left: 0; margin-right: 0; max-width: 44rem; }
/* one step under the 5rem display size (client 2026-09-16) */
.cl .cl-hero .heading-xlarge.is-step { font-size: 4rem; }
@media screen and (max-width: 991px) { .cl .cl-hero .heading-xlarge.is-step { font-size: 3rem; } }
@media screen and (max-width: 767px) { .cl .cl-hero .heading-xlarge.is-step { font-size: 2.2rem; } }
/* bottom-up wash: dark at the foot where the copy sits, clear at the top */
.cl .cl-hero .image-overlay.is-rise { background-color: transparent; background-image: linear-gradient(to top, #000000b3 0%, #00000066 38%, #00000000 72%); }
.cl-hero .container-large { max-width: 80rem; }
/* clear the dots / arrow pill and the next section's tuck */
.cl-hero__slide.is-corner .cl-hero__frame > .padding-vertical { padding-bottom: calc(var(--cl-hero-tuck) + 4.5rem); }
.cl-hero.is-single .cl-hero__slide.is-corner .cl-hero__frame > .padding-vertical { padding-bottom: calc(var(--cl-hero-tuck) + 3.5rem); }

/* --- trust row over the film (client 2026-09-16: no pill, smaller, left) -- */
.cl-hero__trust { display: flex; margin-bottom: 1.25rem; }
.cl .text-align-center .cl-hero__trust { justify-content: center; }
/* Three classes deep because cl-trust.css's .cl-trust.is-large loads later. */
.cl-hero__trust .cl-trust.is-large {
  padding: 0;
  border: 0;
  background: none;
  color: var(--cl-white);
  flex-wrap: nowrap;
  justify-content: flex-start;
  column-gap: .625rem;
  font-size: .875rem;
}
.cl-hero__trust .cl-trust.is-large .cl-trust__avatar { width: 1.75rem; height: 1.75rem; border-width: 1.5px; border-color: #ffffffcc; font-size: .5625rem; }
.cl-hero__trust .cl-trust.is-large .cl-trust__avatar + .cl-trust__avatar { margin-left: -.55rem; }
.cl-hero__trust .cl-trust.is-large .cl-trust__stars { column-gap: .1875rem; }
.cl-hero__trust .cl-trust.is-large .cl-trust__star { width: 1rem; height: 1rem; }
.cl-hero__trust .cl-trust.is-large .cl-trust__text { white-space: nowrap; }
/* the lead under the headline: text-size-medium, 1.25rem, 1.125rem on a phone */
.cl .cl-hero__slide.is-corner .text-lead { font-size: 1.25rem; line-height: 1.5; font-weight: 400; }
/* the corner slide's buttons: white fill, and a 15% white hairline on the second */
.cl .cl-hero__slide.is-corner .button.is-dark,
.cl .cl-hero__slide.is-corner .button.is-white { background-color: var(--cl-white); border-color: var(--cl-white); color: var(--cl-cocoa); }
.cl .cl-hero__slide.is-corner .button.is-dark:hover,
.cl .cl-hero__slide.is-corner .button.is-white:hover { background-color: var(--cl-lucidity); border-color: var(--cl-lucidity); }
.cl .cl-hero__slide.is-corner .button-secondary.invert-colors { border-color: #ffffff26; }
@media screen and (max-width: 767px) {
  .cl .cl-hero__slide.is-corner .text-lead { font-size: 1.125rem; }
}
@media screen and (max-width: 479px) {
  .cl-hero__trust { margin-bottom: 1rem; }
  .cl-hero__trust .cl-trust.is-large { column-gap: .5rem; font-size: .75rem; }
  .cl-hero__trust .cl-trust.is-large .cl-trust__avatar { width: 1.5rem; height: 1.5rem; }
  .cl-hero__trust .cl-trust.is-large .cl-trust__avatar + .cl-trust__avatar { margin-left: -.5rem; }
  .cl-hero__trust .cl-trust.is-large .cl-trust__star { width: .875rem; height: .875rem; }
}
.cl-hero__media img { -webkit-user-drag: none; user-select: none; }
.cl-hero__content { position: relative; z-index: 1; }

.cl-hero__frame {
  display: flex;
  justify-content: center;
  align-items: center;
  min-height: var(--cl-hero-height, 100vh);
}
/* The header is a normal-flow sticky bar now, so a viewport-height hero has to
   give the bar's height back or its bottom edge (and the pagination) sits below
   the fold. --cl-nav-h is written on <html> by cl-nav.liquid; the is-vh flags
   come from the height settings so rem heights are left alone. */
@media screen and (min-width: 992px) {
  .cl-hero.is-vh .cl-hero__frame { min-height: calc(var(--cl-hero-height, 100vh) - var(--cl-nav-h, 0px)); }
}

/* Webflow wrapped the eyebrow and heading in .text-appear_animation-container-2,
   a flex row that wraps. Both children are wider than the 48rem column so they
   always wrap to their own line; the flex centring is what survives. */
.cl-hero__lines { display: flex; flex-wrap: wrap; justify-content: center; }
.cl .text-align-left .cl-hero__lines { justify-content: flex-start; }

/* Round nineteen: the eyebrow's treatment (letter-spaced .25rem at 1.3rem,
   weight 400, 1rem under it) is .cl-eyebrow in cl-base.css, shared with the
   Stories band; .cl-hero__eyebrow stays on the element as the hook. */

/* The export's two live slides disagree on tablet padding: the promo slide is
   built on .padding-vertical-4, which never picks up the
   .padding-vertical.padding-xhuge combo, while the evergreen slide uses the
   base class and gets 8rem at 991. The hero takes the plain scale, matching the
   promo slide, and the combo is opt-in via .is-tablet-tall for the sections
   that really render it. */

/* --- secondary CTA on the image: frosted ---------------------------------- */

.cl-hero .button-secondary.invert-colors {
  border-color: var(--cl-white);
  color: var(--cl-white);
  background-color: #ffffff26;
  -webkit-backdrop-filter: blur(.75rem);
  backdrop-filter: blur(.75rem);
  transition: background-color .2s ease;
}
.cl-hero .button-secondary.invert-colors:hover { background-color: #ffffff40; }

/* --- arrows -------------------------------------------------------------- */

/* One frosted pill in the very corner, bottom right, above the next section's
   tuck, split prev | next by a hairline and kept quiet (small, low-contrast).
   The dots stay centred and sit on the pill's vertical centre. */
.cl-hero__arrows {
  position: absolute;
  right: 1.5rem;
  bottom: calc(var(--cl-hero-tuck) + 1.5rem);
  z-index: 3;
  display: flex;
  border: 1px solid #ffffff40;
  border-radius: 100px;
  background-color: var(--cl-ink-15);
  -webkit-backdrop-filter: blur(.75rem);
  backdrop-filter: blur(.75rem);
  overflow: hidden;
}

.cl-hero__arrow {
  display: flex;
  justify-content: center;
  align-items: center;
  width: 2.75rem;
  height: 2.25rem;
  margin: 0;
  padding: 0;
  border: 0;
  background-color: transparent;
  color: var(--cl-white);
  cursor: pointer;
  appearance: none;
  transition: background-color .2s ease;
}
.cl-hero__arrow.is-next { border-left: 1px solid #ffffff40; }
.cl-hero__arrow svg { display: block; width: 1rem; height: 1rem; opacity: .85; }
@media (hover: hover) {
  .cl-hero__arrow:hover { background-color: #ffffff2e; }
}
.cl-hero__arrow:focus-visible { outline: 2px solid var(--cl-white); outline-offset: -3px; }

/* --- dots ---------------------------------------------------------------- */

.cl-hero__dots {
  position: absolute;
  bottom: calc(var(--cl-hero-tuck) + 2.3125rem);   /* the arrow pill's vertical centre: 1.5rem + (2.375rem - .75rem) / 2 */
  left: 50%;
  z-index: 2;
  display: flex;
  align-items: center;
  gap: .5rem;
  padding: .1875rem .375rem;
  border-radius: 100px;
  background-color: #ffffff1f;
  -webkit-backdrop-filter: blur(.75rem);
  backdrop-filter: blur(.75rem);
  transform: translateX(-50%);
}

/* The button is the 6x6 layout box; ::before widens the hit area without
   touching the pill's geometry, so the clip lives on the inner track. */
.cl-hero__dot {
  position: relative;
  width: .375rem;
  height: .375rem;
  margin: 0;
  padding: 0;
  border: 0;
  border-radius: 100px;
  background: transparent;
  cursor: pointer;
  appearance: none;
  transition: width 250ms linear;
}
.cl-hero__dot::before { content: ''; position: absolute; inset: -.5rem -.25rem; }
.cl-hero__dot[aria-current="true"] { width: 1.5rem; }
.cl-hero__dot:focus-visible { outline: 2px solid var(--cl-white); outline-offset: 3px; }

.cl-hero__dot-track {
  display: block;
  width: 100%;
  height: 100%;
  border-radius: 100px;
  background-color: rgba(255, 255, 255, .5);
  overflow: hidden;
}

.cl-hero__dot-fill {
  display: block;
  width: 100%;
  height: 100%;
  border-radius: 100px;
  background-color: var(--cl-white);
  transform: scaleX(0);
  transform-origin: left center;
}
.cl-hero__dot-fill.is-charging {
  animation-name: cl-hero-dot-fill;
  animation-duration: var(--cl-hero-delay, 6000ms);
  animation-timing-function: linear;
  animation-fill-mode: forwards;
}
.cl-hero.is-paused .cl-hero__dot-fill { animation-play-state: paused; }
/* No autoplay (setting off, or reduced motion): the active dot reads as filled. */
.cl-hero.is-static .cl-hero__dot[aria-current="true"] .cl-hero__dot-fill { transform: scaleX(1); }

@keyframes cl-hero-dot-fill {
  from { transform: scaleX(0); }
  to   { transform: scaleX(1); }
}

.cl-hero.is-single .cl-hero__dots,
.cl-hero.is-single .cl-hero__arrows { display: none; }

/* --- breakpoints --------------------------------------------------------- */

@media screen and (max-width: 991px) {
  .cl-hero__frame { min-height: var(--cl-hero-height-tablet, 50rem); }
  .cl-hero.is-vh-t .cl-hero__frame { min-height: calc(var(--cl-hero-height-tablet, 50rem) - var(--cl-nav-h, 0px)); }
}

@media screen and (max-width: 767px) {
  .cl-hero__frame { min-height: var(--cl-hero-height-mobile, 40rem); }
  .cl-hero.is-vh-m .cl-hero__frame { min-height: calc(var(--cl-hero-height-mobile, 40rem) - var(--cl-nav-h, 0px)); }
  /* the copy sits at the foot of the frame on a phone, clear of the dots and
     the next section's tuck */
  .cl-hero__frame { align-items: flex-end; }
  /* client 2026-09-16: the copy ends 1.5rem above the next section's edge */
  .cl-hero .cl-hero__frame > .padding-vertical,
  .cl-hero.is-single .cl-hero__slide.is-corner .cl-hero__frame > .padding-vertical { padding-bottom: calc(var(--cl-hero-tuck) + 1.5rem); }
  .cl-hero__arrows { display: none; }
  .cl-hero__dots { bottom: calc(var(--cl-hero-tuck) + 1.25rem); }
}

@media screen and (max-width: 479px) {
  .cl-hero__slide.is-padded-mobile { padding-top: 3rem; }
}

/* --- reduced motion: cross-fade in place, no autoplay -------------------- */

@media (prefers-reduced-motion: reduce) {
  .cl-hero__track { display: grid; transition: none; transform: none !important; }
  .cl-hero__slide[data-cl-hero-clone] { display: none; }
  .cl-hero__slide {
    grid-area: 1 / 1;
    min-width: 0;
    opacity: 0;
    transition: opacity .3s ease;
  }
  .cl-hero__slide[aria-hidden="false"] { opacity: 1; }
  .cl-hero__dot { transition: none; }
  .cl-hero__dot-fill.is-charging { animation: none; }
  .cl-hero__dot[aria-current="true"] .cl-hero__dot-fill { transform: scaleX(1); }
}


/* cl-logos.css */
/* ==========================================================================
   Partner logo row. Port of section-logos, rebuilt.

   From the export:
     .logo1_component  grid 1fr x4, col-gap 2rem, row-gap 3rem,
                       justify-content space-around, place-items center,
                       padding-block .5rem
                       991: 1 column   767: padding-top 1rem   479: justify centre
     .logo1_logo       max-width 13rem, max-height 4.5rem
                       767: max-height 3rem   479: max-width 13rem (restated)
     #w-node-_0b5cc58c… (the heading)
                       grid-area: span 1 / span 4   991: grid-column: span 1
     .section-logos    no rule of its own

   Why it no longer copies that: only one of the export's four logos carried
   .logo1_logo; the other three were sized by a hand-typed width attribute,
   which the first port reproduced as a per-logo px setting. On Shopify the
   image_tag width/height attributes, the inline px widths and the cap fought
   each other and the logos came out at four unrelated sizes with the 4-column
   grid stranding them. Now every logo is a box of one height — 3.25rem,
   2.5rem under 768 — with width auto, a 12rem cap and object-fit contain, in
   a wrapping flex row (3.5rem between boxes, 2rem between rows), centred.
   Logos sit at 85% and lift to full on hover. The heading is centred above
   the row (cl-logos.liquid, heading_position "above"); the old in-row
   position is a full-width first flex line, left-aligned like the export.

   Measuring note: three of the export's logos are loading="lazy" 4000px down
   index.html, so they measure 0px tall unless the probe's prep forces them
   eager. That, not the stylesheet, was the "logo h+37" at every width.

   Round eighteen (8-14 logos): `.is-marquee` turns the row into one line of
   two identical tracks sliding left, each by its own width, so the second
   takes over exactly where the first left (3s per logo, --cl-logos-n from
   the section). Edges fade through a mask, hover pauses, reduced motion
   gets the wrapping row instead with the copy hidden. `.is-mono` on the
   section greys every file at rest. In rows, a phone shows two per line.
   ========================================================================== */

/* Round twenty-three (client 2026-09-16): the band sits right under the hero
   and rises over it with rounded corners (cl-hero.css); the corners only
   read against a painted ground, so the section is white. 1rem above the
   line and 1rem under the logos, plus the hero tuck the band covers. */
.cl-logos { position: relative; background-color: var(--cl-white); }
.cl-logos .padding-vertical { padding-top: 2.5rem; padding-bottom: 1rem; }
.cl-logos .cl-logos__eyebrow { margin-bottom: 1rem; }

.cl-logos__component {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: center;
  gap: 2rem 3.5rem;
  padding-top: .5rem;
  padding-bottom: .5rem;
}

/* heading_style "is-text": a quiet line over the row instead of a heading */
.cl .cl-logos__eyebrow { margin: 0; font-weight: 400; letter-spacing: 0; }

/* heading_position "": the export's heading spanning all four columns */
.cl-logos__heading { flex: 0 0 100%; }

.cl-logos__item {
  flex: none;
  display: flex;
  align-items: center;
  justify-content: center;
  max-width: 100%;
  text-decoration: none;
}
.cl-logos__item:hover { text-decoration: none; }

/* One height for every file. width: auto follows the file's own ratio up to
   the cap; contain keeps a wide logo whole inside it rather than cropping.
   Written as .cl-logos .cl-logos__logo because cl-base.css's `.cl img`
   (max-width: 100%, display: inline-block) outranks a lone class and would
   lift the cap: the 2062x277 Radiance Health file then ran 387px wide. */
.cl-logos .cl-logos__logo {
  display: block;
  height: 3.25rem;
  width: auto;
  max-width: 12rem;
  object-fit: contain;
  opacity: .85;
  transition: opacity .2s ease;
}
.cl-logos .cl-logos__item:hover .cl-logos__logo,
.cl-logos .cl-logos__logo:hover { opacity: 1; }

/* ---- marquee (round eighteen) ------------------------------------------ */
.cl-logos__component.is-marquee {
  flex-wrap: nowrap;
  justify-content: flex-start;
  gap: 0;
  overflow: hidden;
  -webkit-mask-image: linear-gradient(to right, transparent, #000 6%, #000 94%, transparent);
  mask-image: linear-gradient(to right, transparent, #000 6%, #000 94%, transparent);
}
.cl-logos__track {
  display: flex;
  flex: none;
  align-items: center;
  column-gap: 3.5rem;
  padding-right: 3.5rem;
  animation: cl-logos-marquee calc(var(--cl-logos-n, 8) * var(--cl-logos-speed, 3s)) linear infinite;
  will-change: transform;
}
.cl-logos__component.is-marquee:hover .cl-logos__track,
.cl-logos__component.is-marquee:focus-within .cl-logos__track { animation-play-state: paused; }
@keyframes cl-logos-marquee {
  from { transform: translateX(0); }
  to { transform: translateX(-100%); }
}

/* ---- edge to edge (round twenty-three) --------------------------------- */
/* The component leaves the container and spans the viewport; the heading
   above it stays in the container. The fade is longer so the logos are
   born and die well inside the edges. */
.cl-logos.is-bleed .cl-logos__component.is-marquee {
  width: 100vw;
  margin-left: calc(50% - 50vw);
  -webkit-mask-image: linear-gradient(to right, transparent, #000 12%, #000 88%, transparent);
  mask-image: linear-gradient(to right, transparent, #000 12%, #000 88%, transparent);
}
.cl-logos.is-bleed { overflow-x: clip; }

/* ---- monochrome (round eighteen) --------------------------------------- */
.cl-logos.is-mono .cl-logos__logo { filter: grayscale(1); opacity: .65; transition: opacity .2s ease, filter .2s ease; }
.cl-logos.is-mono .cl-logos__item:hover .cl-logos__logo,
.cl-logos.is-mono .cl-logos__logo:hover { filter: none; opacity: 1; }

@media screen and (max-width: 991px) {
  /* Base-class rule the export carries and cl-base.css does not:
     .button-row.is-button-row-center { text-align: center } at 991. No
     geometry rides on it (the link is a one-line inline-block); kept so the
     computed style matches. Belongs in cl-base.css. */
  .cl-logos .button-row.is-button-row-center { text-align: center; }
}
@media screen and (max-width: 767px) {
  .cl-logos__component { gap: 1.5rem 2.5rem; padding-top: 1rem; }
  /* Round twenty-three: a phone shows three or four marks per screen, not one
     and a half; 2rem tall, 7rem wide at most, tighter gaps, shorter fade. */
  .cl-logos .cl-logos__logo { height: 2rem; max-width: 7rem; }
  .cl-logos.is-bleed .cl-logos__component.is-marquee {
    -webkit-mask-image: linear-gradient(to right, transparent, #000 8%, #000 92%, transparent);
    mask-image: linear-gradient(to right, transparent, #000 8%, #000 92%, transparent);
  }
  /* rows: two logos per line (round eighteen); the marquee keeps its line */
  .cl-logos__component:not(.is-marquee) .cl-logos__item { flex: 0 0 calc(50% - 1.25rem); }
  .cl-logos__component.is-marquee { gap: 0; }
  .cl-logos__track { column-gap: 2rem; padding-right: 2rem; }
}

@media (prefers-reduced-motion: reduce) {
  .cl-logos .cl-logos__logo { transition: none; }
  /* the marquee stands still as a wrapping row; the duplicate track goes */
  .cl-logos__component.is-marquee { flex-wrap: wrap; -webkit-mask-image: none; mask-image: none; }
  .cl-logos__track { animation: none; flex-wrap: wrap; justify-content: center; row-gap: 2rem; padding-right: 0; }
  .cl-logos__track[aria-hidden] { display: none; }
}


/* cl-main-article.css */
/* ==========================================================================
   Article. Port of detail_blog.html :: .section-blogpost, including the
   inline e-book CTA (.section-cta16) it holds between the two body halves,
   the Finsweet ad banners and comparison table from the page's hidden style
   guide, and the share pills. Every value was read with
   tools/extract-section.mjs; the base element rules come from
   reference/webflow/css/components.css.

   Shell (base, then 991 / 767 / 479)
     .header-extra-pad_global       height 4rem
     .padding-top.padding-huge      16px: `.padding-top { padding: 16px 0 0 }` is
                                    declared after `.padding-huge { padding: 6rem }`,
                                    so the scale only wins inside the breakpoints:
                                    991: 5rem   767: 3.5rem (cl-base would give 6rem)
     .margin-bottom.margin-large    20px (same cascade); 991: 2.5rem  767: 2rem
     .margin-bottom.margin-xlarge   20px; 991: 3.5rem  767: 2.5rem
     .blogpost_header               text-align centre, flex column, align centre,
                                    padding-top 4rem
     .blogpost_meta-wrapper         flex, centre, margin-bottom 1.5rem
     .pill-medium.is-wrapper        pill (pumice, .2rem .4rem, .75rem, uppercase,
                                    .5px) as flex, column-gap .6rem, align centre
     .breadcrumb-arrow              flex column centre, width .4rem
     .blogpost_title-wrapper        flex column centre, row-gap 1rem, max-width
                                    60rem, margin auto; 991: margin-bottom 1rem
     .heading-large                 3rem / 1.2, left; 991: 2.25rem  767: 2rem
                                    479: 1.8rem / 1.3 and text-align left (cl-base
                                    has the sizes, not the 479 alignment)
     .text-size-large               1.25rem / 400; 767: 1.125rem / 1.35 (cl-base)
     .blogpost_content-top          flex, space-between, align stretch, width 100%,
                                    margin-bottom 1rem
                                    767: column, margin-bottom 3rem
                                    479: column, align flex-start
     .blogpost_author-wrapper.nav-text  flex, align centre, .75rem / 600, uppercase,
                                    letter-spacing .25px; 767: margin-bottom 2rem
                                    479: 1rem
     .blog-vertical-divider         1.5px x .6rem, black, margin 0 .4rem
     .read-time                     flex, column-gap .2rem, flex none, 600
     .blog-author_link              flex, gap .5rem, align centre
     .blog-author_image1            2rem circle
     .text-style-link               underline
     .blogpost_share (.w-layout-grid)  grid, auto-flow column, columns max-content,
                                    column-gap 16px, row-gap .5rem, justify-items start
     .share-link                    flex, align centre, padding .25rem, bg light-grey,
                                    radius 20px; .clipboard: position relative
     .blogpost_social-icon          1.5rem square, flex centre
     .copied                        absolute -2rem / -1rem, white, radius .4rem,
                                    padding .2rem, shadow, opacity 0 (IX2 shows it)
     .copied-icon                   .8rem x 1rem, margin-left .2rem
     .blogpost_image-wrapper        width 100%, padding-top 40%, margin 0 auto 2rem,
                                    relative, overflow hidden
                                    991: 56.25%, margin-bottom 3rem  767: 2rem
     .blogpost_image                absolute cover
     .disclaimer_component          bg lucidity
     .disclaimer_question           flex, space-between, align centre, padding
                                    1.25rem 1.5rem, 1.3rem / 500, pointer
                                    767: padding 1rem 1.5rem
     .faq1_icon                     1.5rem square, flex centre, margin-left 1.5rem
                                    767: 1.75rem
     .disclaimer_answer             padding 0 1.5rem, overflow hidden (IX2 height)
     .disclaimer_content            padding-bottom 1rem
     .container-blog                grid minmax(20rem, 20rem) 1fr, gap 3rem, place-items
                                    start, width 100%, margin 3rem 0
                                    991: flex column-reverse, 1fr
     .blog-inner_left               flex column, gap 2rem, align flex-start, sticky
                                    top 12rem; 991: width 100%, static
     .share-post_wrap               flex column, row-gap .8rem, align flex-start
     .fs-toc_sidebar                flex column, gap 1rem, colour #801c00, bg white,
                                    radius .5rem, width 100%
     .fs-toc_heading                Sanomat 1.125rem, black
     .fs-toc_link-content           grid 1fr, gap .75rem
     .fs-toc_link-wrapper.is-h2     flex, gap 1rem, width 100%, space-between,
                                    align flex-start, colour #801c00
     .fs-toc_link                   flex row, gap .5rem, width 100%, black, border-bottom
                                    1px transparent, padding .25rem, 400, no underline
     .blogpost_content              max-width 50rem; 991: order -9999, margin-bottom
                                    3rem  767: 2rem

   Body (.text-rich-text + components.css)
     h1   margin 2rem 0 1.5rem, Sanomat 3rem / 400 / 1.2 (the site's h1-h3 rule)
     h2   margin 1.5rem 0 1rem, Sanomat 2.25rem / 400 / 1.2
     h3   margin 1.5rem 0, body font 1.375rem / 400 / 1.2
     h4   margin 1.5rem 0 1.25rem, 1rem / 600 / 1.3
     h5, h6  margin 1.25rem 0 1rem
     p    margin-bottom .5rem; the box's first and last child lose their outer
          margin and a table pseudo-element clears the floats (components.css)
     a    underline
     blockquote  margin 1.5rem 0
     figure  max-width 60%, relative, margin 0 0 10px; .w-richtext-align-center
             centred; .w-richtext-align-fullwidth 100%; img width 100%;
             767: margin 2.5rem 0
     figcaption  opacity .8, left, border-left 2px #000, margin-top .5rem,
             padding-left .5rem, .875rem
     .table_component  width 100%, margin 1.75rem 0; 767: block, overflow auto
     .table_header  left, border 1px #000, padding .45rem; 767: flex none, 14rem
     .table_cell    border 1px #000, padding .25rem .45rem; 767: 14rem; 479: 11rem
     .table_body    .875rem; 767: width 100%   .table_row 767: flex
     .table_head    767: block

   Inline CTA (.section-cta16)
     .section-cta16                 white text, flex, justify flex-end, margin 2rem 0,
                                    padding 1.5rem, relative
     .padding-vertical.padding-medium  padding 2rem 0 and margin-right 20px (a combo
                                    rule); 767: 1.5rem 0, margin-right 0
     .blog-cta_content              max-width 36rem
     p.pre-heading                  cl-base (4rem top, 2rem bottom)
     .blog-cta-heading              1.85rem / 400 / 1.2, margin-bottom .5rem
     .margin-top.margin-medium      2rem; 767: 1.5rem (cl-base)
     .cta16_form-block              margin-bottom 0   .cta16_form  colour black
     .signup-form-wrapper.shadow    grid max-content x3, column-gap 0, row-gap 1rem,
                                    margin-bottom 1rem, shadow 0 4px 30px #0000001f
                                    767: 1fr   479: row-gap .75rem
     .form-input_blog-cta (.w-input)  block, width 100%, bg white, black, min-height
                                    2.75rem, border-left 1px solid #75786f (the other
                                    sides are `1px #000` with no style), padding
                                    .5rem .75rem, 1rem / 1.6; placeholder #0006 .9rem
     .button_blog-cta (.w-button)   inline-block, golden, white, centre, border none,
                                    padding .75rem 1.5rem, .9rem, line-height inherit
     .form-privacy-check-wrap       white text, padding 5px
     .checkbox-wrapper / .form-checkbox / .form-checkbox-label
                                    as cl-contact-form.css (1.5rem box, cocoa when
                                    checked, label .94rem / 300, padding-left 1rem)
     .cta16_background-image-wrapper  absolute inset 0, z-index -1, gradient
                                    #00000080 over the cover image
     .success-message  cocoa text, .success-text 600
     .error-message    margin-top 1.5rem, padding .875rem 1rem, .error-text #e23939

   Author card (.blog-post_author-bottom-wrapper)
     wrapper    flex, gap 2rem, align centre, bg light-grey, radius .25rem, padding 1rem
                991: column, gap 1rem, align flex-start
     .blog-post_buttom-author-image  7.5rem circle, flex none, relative, overflow hidden
                991: width 5rem, padding-top 12%  767: 17%  479: 30%
     .blog-post_bottom-text-wrapper  flex column, gap .5rem, align flex-start
     .pill-medium-copy  pumice, uppercase, .5px, margin-bottom .25rem, padding .1rem 0,
                .75rem / 400, inline-block
     .blog-post-author_bottom-title-wrapper  flex, align centre
     .text-size-large.text-weight-bold  1.25rem / 1.24, and 400: .text-size-large's
                weight is declared after .text-weight-bold's
     .image_cover-absolute  479: object-position 68% 50% (a global rule in the export)

   Ad banner (.ad-banner_component)
     .ad-banner_component   flex, align centre, column-gap 1rem, white on cocoa,
                            border 1px transparent, radius .5rem, width 100%, margin
                            1.75rem 0, padding 1.5rem, relative, overflow hidden,
                            hover translateY(-.25rem); 767: column, align flex-start
     .is-inverted           cocoa on white, border 1px #3e303780; hover bg #f5f5f5
     .ad-banner_text-wrapper  block, max-width 30rem; 767: none
     .text-pill (h5)        inline, cocoa, uppercase, bg #ffffff94, radius .25rem,
                            padding .25rem .65rem, .75rem / 400; .is-inverted #bdbdbd94
     .ad-banner_text-title  margin .5rem 0 .75rem, 1.25rem / 600 / 1.25
     .ad-banner_image       width 10rem, absolute, right 7%; 767: display none
     .ad-banner_image-wrapper  20rem wide, full height (min 11.4rem), absolute top right
                            767: relative, width 110%, height 9rem, margins -1.5rem
                            479: width 119%
     .ad-banner_image-gradient  linear-gradient(93deg, cocoa, transparent), absolute
                            left; 767: vertical gradient
     .ad-banner_arrow-wrapper  1.5rem square, #e4e4e4, #131313, absolute top right;
                            .is-inverted white on cocoa
     .ad-banner_arrow       1rem square flex

   Deviations, all deliberate:
     - The author card's LinkedIn pill only renders with a URL; the export prints
       it with href="#" for authors without one (7px taller title row).
     - The disclaimer is a <details>; Webflow animated .disclaimer_answer's height.
     - The privacy checkbox renders unticked (the export pre-ticks it; not consent).
     - The copied bubble is toggled by a class from a small inline script instead
       of IX2, and the network share links are plain share URLs.

   Not from the export: min-width 0 on the layout's grid children,
   overflow-wrap: anywhere on the text blocks, and .cl-main-article__table-scroll,
   the wrapper sections/cl-main-article.liquid puts around every <table> in the
   CMS body. The export's own copy never met a token wide enough to matter; the
   migrated Tableizer comparison table does, and it pushed the article page 56px
   wide at 390 and 122px at 320. All three are scoped here, not pushed into
   cl-base.css.

   Round twelve, deliberate departures from the export (each one is a probe
   that will read red; the export's own render is the bug in every case):

   1. Reading measure. The body column is still the export's 50rem box, but
      the text inside it caps at 46rem (--cl-art-measure). At 800px the ported
      German copy ran to about 95 characters a line. Tables, the ad banners,
      the inline CTA and a full-width figure keep the whole 50rem, so the
      column still reads as one edge.
   2. Body rhythm. The export's richtext margins are off the theme's spacing
      scale in four places (h4 bottom 1.25rem, h5/h6 top 1.25rem, figure
      bottom 10px, ad banner and .table_component 1.75rem) and its h2 opened
      a section with the same 1.5rem an h3 got. They are now .25/.5/1/1.5/2/3rem
      steps, with h2 opening on 3rem so a section break reads as one.
   3. The table of contents is a <details>: open and sticky beside the body at
      desktop, closed under 992 where the layout stacks it above the article.
      The export's Finsweet sidebar was always open at every width.
   4. Table affordance. The scroller now carries the compare page's pill and
      right-edge fade and pins its first column. Mirrored from
      assets/cl-compare.css, not imported: that file is not loaded here.
   5. The author card's photo is a circle at every width. The export's is
      80 x 120 under 992 (width: 5rem lands on a padding-top percentage box
      that was never square), so the live site shows a stretched oval on every
      tablet and phone. The port shows a 5rem circle.
   6. overflow-x: clip on the section, so no CMS body can ever widen the page.
      clip, not hidden: hidden would make the section a scroll container and
      break the sticky sidebar.

   EU round (client feedback on the English article page), each marked
   "EU round" where it lands: 1.5rem from the bar to the crumb at every
   width (the spacer div is gone); date and read time under the title
   (.cl-main-article__stamp); the lead one step smaller (.text-size-medium);
   the byline names Author blocks only, after "Written by"; the header's
   share pills are gone (the aside keeps the row); the hero bleeds edge to
   edge on a phone with 1.5rem above and below; the inline CTA runs the
   whole column and is 20rem tall on a phone so its photo shows; 1.5rem
   above the author card; and a reading progress hairline under the nav
   (snippets/cl-reading-progress.liquid, self-styled).
   ========================================================================== */

/* No CMS body may widen the page: clip, not hidden, so the sticky sidebar
   still resolves against the viewport (see the header, note 6). */
.cl-main-article { overflow-x: clip; }
/* EU round: the export's 4rem header pad (.header-extra-pad_global, a div
   the section no longer renders), 16px of section padding and the header's
   own 4rem stacked to 8rem of white between the bar and the crumb. The nav is
   sticky and in flow, so the section starts at the bar's bottom edge: 1.5rem
   here is 1.5rem to the crumb, at every width. */
.cl-main-article__pad { padding: 1.5rem 0 0; }
.cl-main-article__head { margin: 0 0 20px; }                /* .margin-bottom.margin-large */

/* --- header ------------------------------------------------------------------ */
.cl-main-article__header {
  display: flex;
  flex-direction: column;
  align-items: center;
  padding-top: 0;
  text-align: center;
}
.cl-main-article__meta {
  display: flex;
  justify-content: center;
  align-items: center;
  margin-bottom: 1.5rem;
}
.cl-main-article__crumb {
  display: flex;
  align-items: center;
  column-gap: .6rem;
  padding: .2rem .4rem;
  background-color: var(--cl-pumice);
  font-size: .75rem;
  font-weight: 400;
  letter-spacing: .5px;
  text-transform: uppercase;
}
.cl-main-article__crumb a { color: inherit; text-decoration: none; }
.cl-main-article__crumb a:hover { text-decoration: underline; }
.cl-main-article__crumb-arrow {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  width: .4rem;
}
.cl-main-article__crumb-arrow svg { width: 100%; height: auto; display: block; }
.cl-main-article__title-wrap {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  row-gap: 1rem;
  width: 100%;
  max-width: 60rem;
  margin-left: auto;
  margin-right: auto;
}
/* the export left the title flush-left inside a centred header (client, 2026-08-25: misaligned); centred with its crumbs and excerpt */
.cl-main-article .heading-large { text-align: center; }
/* EU round: date and read time directly under the title, in the byline's
   type (.75rem / 600 / uppercase). A <p>, so cl-base's paragraph margin is
   zeroed and the title-wrap's row-gap is the only rhythm. */
.cl-main-article .cl-main-article__stamp {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: center;
  margin: 0;
  font-size: .75rem;
  font-weight: 600;
  letter-spacing: .25px;
  text-transform: uppercase;
}
/* EU round: the lead paragraph is one step down from .text-size-large.
   cl-base's .text-size-medium is 1.125rem; the article's lead reads 1.25rem
   at desktop and 1.125rem on a phone, weight 400 like the large it replaces. */
.cl-main-article__title-wrap .text-size-medium { font-size: 1.25rem; font-weight: 400; }

/* --- byline ---------------------------------------------------------------------- */
/* EU round: the share pills that sat on the row's right are gone (the aside
   keeps the one share row), so the row holds the author line alone and is
   centred with the header above it; 479 left-aligns it with the rest. */
.cl-main-article__top {
  display: flex;
  justify-content: center;
  align-items: stretch;
  width: 100%;
  margin-bottom: 1rem;
}
.cl-main-article__byline-label { margin-right: .5rem; }
.cl-main-article__byline {
  display: flex;
  align-items: center;
  font-size: .75rem;
  font-weight: 600;
  letter-spacing: .25px;
  text-transform: uppercase;
  /* Not from the export, which leaves .blogpost_meta-wrapper at nowrap and
     stops at 479. Date, read time and author add up to ~295px, so the row fits
     every width the export designed for and only wraps below a ~328px viewport,
     where nowrap ran the page 46px wide. Geometrically inert at 1440 / 991 /
     767 / 479 / 390. */
  flex-wrap: wrap;
  justify-content: center;
}
.cl-main-article__divider {
  flex: none;
  width: 1.5px;
  height: .6rem;
  margin: 0 .4rem;
  background-color: var(--cl-black);
}
.cl-main-article__read { display: flex; column-gap: .2rem; flex: none; font-weight: 600; }
.cl-main-article__author { display: flex; justify-content: flex-start; align-items: center; column-gap: .5rem; row-gap: .5rem; max-width: 100%; min-width: 0; }
.cl-main-article .cl-main-article__avatar { width: 2rem; height: 2rem; border-radius: 5rem; object-fit: cover; }
.cl-main-article .text-style-link { text-decoration: underline; }   /* not in cl-base */

.cl-article-share {
  display: grid;
  grid-auto-flow: column;
  grid-template-columns: max-content;
  grid-auto-columns: 1fr;
  column-gap: 16px;
  row-gap: .5rem;
  justify-items: start;
}
.cl-article-share__link {
  display: flex;
  align-items: center;
  padding: .25rem;
  background-color: var(--cl-light-grey);
  border: 0;
  border-radius: 20px;
  max-width: 100%;
  color: inherit;
  font: inherit;
  text-align: left;
  text-decoration: none;
  cursor: pointer;
  position: relative;
}
.cl-article-share__link:hover { background-color: var(--cl-lucid); }
.cl-article-share__icon {
  display: flex;
  flex-direction: column;
  flex: none;
  justify-content: center;
  align-items: center;
  width: 1.5rem;
  height: 1.5rem;
}
.cl-article-share__icon svg { width: 100%; height: 100%; display: block; }
/* Round seventeen: no bubble. The status span is a live region for screen
   readers and is never drawn; the glyph swaps to a green tick and the pill
   tints to match while .is-copied is on. */
.cl-article-share__copied { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
.cl-article-share__link.is-clipboard { transition: background-color .2s ease; }
.cl-article-share__icon .cl-article-share__icon-check { display: none; }
.cl-article-share__link.is-copied { background-color: #00433f1a; }
.cl-article-share__link.is-copied .cl-article-share__icon .cl-article-share__icon-link { display: none; }
.cl-article-share__link.is-copied .cl-article-share__icon .cl-article-share__icon-check { display: block; color: var(--cl-terra); }

/* --- hero image ------------------------------------------------------------------ */
.cl-main-article__image {
  width: 100%;
  margin: 0 auto 2rem;
  padding-top: 40%;
  position: relative;
  overflow: hidden;
}
.cl-main-article .cl-main-article__img {
  object-fit: cover;
  width: 100%;
  height: 100%;
  position: absolute;
  inset: 0;
}

/* --- disclaimer ---------------------------------------------------------------- */
.cl-main-article__disclaimer-wrap { margin: 0 0 20px; }     /* .margin-bottom.margin-xlarge */
.cl-main-article__disclaimer { background-color: var(--cl-lucidity); }
.cl-main-article__disclaimer-q {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 1.25rem 1.5rem;
  font-size: 1.3rem;
  font-weight: 500;
  cursor: pointer;
  list-style: none;
}
.cl-main-article__disclaimer-q::-webkit-details-marker { display: none; }
.cl-main-article__disclaimer-q:focus-visible { outline: 2px solid var(--cl-focus); outline-offset: -2px; }
.cl-main-article__disclaimer-icon {
  display: flex;
  flex-direction: column;
  flex: none;
  justify-content: center;
  align-items: center;
  width: 1.5rem;
  height: 1.5rem;
  margin-left: 1.5rem;
  transition: transform .3s;
}
.cl-main-article__disclaimer-icon svg { width: 100%; height: 100%; display: block; }
.cl-main-article__disclaimer[open] .cl-main-article__disclaimer-icon { transform: rotate(180deg); }
.cl-main-article__disclaimer-a { padding: 0 1.5rem; overflow: hidden; }
.cl-main-article__disclaimer-content { padding-bottom: 1rem; }

/* --- two-column layout ---------------------------------------------------------- */
.cl-main-article__layout {
  display: grid;
  grid-template-columns: minmax(20rem, 20rem) 1fr;
  grid-auto-columns: 1fr;
  column-gap: 3rem;
  row-gap: 3rem;
  place-items: start;
  width: 100%;
  /* EU round: 1.5rem under the column, which is the whole gap to the
     related-articles rail (its top padding is off on the article page) */
  margin: 3rem 0 1.5rem;
}
.cl-main-article__aside {
  display: flex;
  flex-direction: column;
  justify-content: flex-start;
  align-items: flex-start;
  column-gap: 2rem;
  row-gap: 2rem;
  position: sticky;
  top: 12rem;
}
.cl-main-article__share-wrap {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  row-gap: .8rem;
}
.cl-main-article__share-wrap p { opacity: 1; }
.cl-main-article__toc {
  display: flex;
  flex-direction: column;
  justify-content: flex-start;
  align-items: stretch;
  column-gap: 1rem;
  row-gap: 1rem;
  width: 100%;
  color: var(--cl-dark-red);
  background-color: var(--cl-white);
  border-radius: .5rem;
}
/* The TOC is a <nav> holding a <details>: the nav stays the aside's flex item
   (and keeps the export's box), the details is the flex column inside it, so
   the heading-to-list gap is unchanged when it is open. */
.cl-main-article__toc-box {
  display: flex;
  flex-direction: column;
  row-gap: 1rem;
  width: 100%;
}
.cl-main-article__toc-heading {
  display: flex;
  justify-content: space-between;
  align-items: center;
  column-gap: 1rem;
  color: var(--cl-black);
  font-family: var(--cl-font-heading);
  font-size: 1.125rem;
  cursor: pointer;
  list-style: none;
}
.cl-main-article__toc-heading::-webkit-details-marker { display: none; }
.cl-main-article__toc-heading:focus-visible { outline: 2px solid var(--cl-focus); outline-offset: 2px; }
.cl-main-article__toc-icon {
  flex: none;
  width: 1.25rem;
  height: 1.25rem;
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--cl-cocoa);
  transition: transform .2s ease;
}
.cl-main-article__toc-icon svg { width: 100%; height: auto; display: block; }
.cl-main-article__toc-box[open] .cl-main-article__toc-icon { transform: rotate(180deg); }
/* A long article's h2 list can outrun a sticky box; it pans inside itself
   rather than pushing the sidebar past the fold. */
@media screen and (min-width: 992px) {
  .cl-main-article__toc-list { max-height: calc(100vh - 22rem); overflow-y: auto; }
}
.cl-main-article__toc-list { display: grid; grid-template-columns: 1fr; grid-auto-columns: 1fr; column-gap: .75rem; row-gap: .75rem; }
.cl-main-article__toc-item {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  column-gap: 1rem;
  row-gap: 1rem;
  width: 100%;
}
.cl-main-article__toc-link {
  position: relative;
  display: flex;
  flex-direction: row;
  justify-content: flex-start;
  align-items: center;
  column-gap: .5rem;
  row-gap: .5rem;
  width: 100%;
  max-width: 100%;
  margin: 0;
  padding: .375rem .5rem;
  border-radius: .375rem;
  color: var(--cl-black);
  font-weight: 400;
  text-decoration: none;
  transition: padding-left .25s cubic-bezier(.2, 0, 0, 1), color .2s ease, background-color .2s ease;
}
/* Round twenty: the same hover as the Wissenswertes list (cl-main-page.css):
   the entry steps in and a 1rem rule draws from the left on the first line,
   at the middle of its x-height, .75rem clear of the text. The export's
   bottom border is gone here as it is there. */
.cl-main-article__toc-link::before {
  content: "";
  position: absolute;
  left: .5rem;
  top: calc(.375rem + .65em);
  width: 0;
  height: 1px;
  background-color: var(--cl-dark-red);
  transition: width .25s cubic-bezier(.2, 0, 0, 1);
}
.cl-main-article__toc-link:hover,
.cl-main-article__toc-link.is-current { color: var(--cl-dark-red); background-color: #f5f4f49e; padding-left: 2.25rem; }
.cl-main-article__toc-link:hover::before,
.cl-main-article__toc-link.is-current::before { width: 1rem; }
.cl-main-article__content { max-width: 50rem; min-width: 0; width: 100%; }
/* Round twenty: no aside (share links off, no H2 to list): one track, the
   column centred in it, instead of a 20rem gutter beside the body. */
.cl-main-article__layout.is-solo { grid-template-columns: minmax(0, 1fr); justify-items: center; }
/* Reading measure (header note 1). The column keeps the export's 50rem box;
   the prose inside it caps at 46rem, and the things that are not prose --
   a table, an ad banner, a full-width figure, the CMS rich-text embed that
   carries a table -- keep the whole column. */
.cl-main-article__body { --cl-art-measure: 46rem; }
.cl-main-article__body > * { max-width: var(--cl-art-measure); }
.cl-main-article__body > .cl-main-article__table-block,
.cl-main-article__body > [data-rt-embed-type],
.cl-main-article__body > .cl-article-banner,
.cl-main-article__body > .table_component,
.cl-main-article__body > figure.w-richtext-align-fullwidth { max-width: none; }
/* Not from the export. The aside is the layout's other grid child; both are
   floored at their min-content width unless min-width says otherwise, and the
   TOC inside it holds whole heading texts. */
.cl-main-article__aside { min-width: 0; }
/* A German compound or a pasted URL is one word to the line breaker and would
   run out of the column whatever the track does. `anywhere` only adds break
   opportunities where a word does not fit, so ordinary wrapping is untouched,
   and it lets these blocks report a small min-content width, which is what
   keeps the grid honest. No hyphens: auto, the page is lang="de" and Chrome
   would re-break the ported copy and move every text probe. */
.cl-main-article__title-wrap,
.cl-main-article__byline,
.cl-main-article__richtext,
.cl-main-article__toc-heading,
.cl-main-article__toc-link,
.cl-main-article__share-wrap,
.cl-main-article__disclaimer-q,
.cl-main-article__disclaimer-content,
.cl-main-article__cta-content,
.cl-main-article__author-name,
.cl-main-article__author-bio { overflow-wrap: anywhere; }

/* --- body: .text-rich-text + the element defaults of components.css ------------- */
.cl-main-article__richtext { margin-top: 0; }
/* components.css clearfix on .w-richtext: keeps the last margin inside the box
   and clears the floated figures */
.cl-main-article__richtext::before,
.cl-main-article__richtext::after { content: " "; display: table; }
.cl-main-article__richtext::after { clear: both; }
.cl-main-article__richtext > :first-child { margin-top: 0; }
.cl-main-article__richtext > :last-child { margin-bottom: 0; }
/* Heading scale and rhythm, on the theme's spacing steps (header note 2).
   h2 opens on 3rem so a section break reads as one; every heading closes on
   the step above the paragraph's own .5rem. */
.cl-main-article__richtext h1 { margin: 3rem 0 1.5rem; font-family: var(--cl-font-heading); font-size: 3rem; font-weight: 400; line-height: 1.2; }
.cl-main-article__richtext h2 { margin: 3rem 0 1rem; font-family: var(--cl-font-heading); font-size: 2.25rem; font-weight: 400; line-height: 1.2; }
.cl-main-article__richtext h3 { margin: 2rem 0 .5rem; font-size: 1.375rem; font-weight: 400; line-height: 1.2; }
.cl-main-article__richtext h4 { margin: 1.5rem 0 .5rem; font-size: 1rem; font-weight: 600; line-height: 1.3; }
.cl-main-article__richtext h5,
.cl-main-article__richtext h6 { margin: 1.5rem 0 .5rem; }
/* the sticky header plus air, so a TOC jump does not land under the chrome */
.cl-main-article__richtext h2[id] { scroll-margin-top: 7rem; }
.cl-main-article__richtext p { margin: 0 0 .5rem; }
.cl-main-article__richtext a { color: inherit; text-decoration: underline; }
/* Lists: .cl ul indents 1.25rem and .cl ol 2.5rem, which read as two
   different columns inside one article. One indent, one step of air. */
.cl-main-article__richtext ul,
.cl-main-article__richtext ol { margin: 1rem 0 1.5rem; padding-left: 1.5rem; }
.cl-main-article__richtext li { margin-bottom: .5rem; }
.cl-main-article__richtext li > ul,
.cl-main-article__richtext li > ol { margin: .5rem 0 0; }
.cl-main-article__richtext li > p { margin: 0; }
.cl-main-article__richtext blockquote { margin: 2rem 0; }
.cl-main-article__richtext img { height: auto; }
/* an inline image the CMS left alone (no <figure>) still gets its own air */
.cl-main-article__richtext > img,
.cl-main-article__richtext > p > img:only-child { display: block; margin: 2rem 0; }
.cl-main-article__richtext figure { margin: 2rem 0; max-width: 60%; position: relative; }
.cl-main-article__richtext figure img { width: 100%; }
.cl-main-article__richtext figure > div { font-size: 0; color: transparent; }
.cl-main-article__richtext figure.w-richtext-align-center { margin-left: auto; margin-right: auto; clear: both; }
.cl-main-article__richtext figure.w-richtext-align-normal { clear: both; }
.cl-main-article__richtext figure.w-richtext-align-fullwidth { width: 100%; max-width: 100%; margin-left: auto; margin-right: auto; text-align: center; clear: both; display: block; }
.cl-main-article__richtext figure.w-richtext-align-floatleft { float: left; max-width: 35%; margin-right: 15px; clear: none; }
.cl-main-article__richtext figure.w-richtext-align-floatright { float: right; max-width: 35%; margin-left: 15px; clear: none; }
.cl-main-article__richtext figcaption {
  display: block;
  margin-top: .5rem;
  padding-left: .5rem;
  border-left: 2px solid #000;
  font-size: .875rem;
  text-align: left;
  opacity: .8;
}
.cl-main-article__richtext iframe,
.cl-main-article__richtext video { max-width: 100%; }
/* Round twenty-three: migrated bodies carry fixed 560x315 YouTube iframes;
   they fill the column at 16:9 instead of sitting small and off-centre. */
.cl-main-article__richtext iframe[src*="youtube"],
.cl-main-article__richtext iframe[src*="youtu.be"],
.cl-main-article__richtext iframe[src*="vimeo"] { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; margin: 2rem 0; }
/* wide content scrolls inside itself, never the page */
.cl-main-article__richtext table { max-width: 100%; }
.cl-main-article__richtext pre, .cl-main-article__richtext .w-embed { max-width: 100%; overflow-x: auto; }
/* Not from the export. sections/cl-main-article.liquid wraps every <table> in
   the CMS body in this scroller. The migrated Tableizer comparison table has a
   426px min-content width (three columns of German copy with 1px borders and
   .25rem cells), so at 390 it pushed the document 56px wide and at 320 122px.
   The table keeps its real width and scrolls inside the column instead. Height
   stays auto, so the box is exactly as tall as the table and nothing is clipped
   vertically; overflow-y computes to auto only because overflow-x is not
   visible. */
.cl-main-article__table-block {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  row-gap: .5rem;
  width: 100%;
  margin: 2rem 0;
}
.cl-main-article__table-frame { position: relative; width: 100%; }
.cl-main-article__table-scroll {
  max-width: 100%;
  overflow-x: auto;
  overflow-y: hidden;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior-x: contain;
}
.cl-main-article__table-scroll:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: 2px; }
/* Mirrored from assets/cl-compare.css (.cl-compare__swipe / the block's fade),
   not imported: that stylesheet is not loaded on an article. */
.cl-main-article__table-swipe {
  display: inline-flex;
  align-items: center;
  column-gap: .375rem;
  padding: .3rem .75rem .25rem;
  border-radius: 100px;
  background-color: var(--cl-cocoa);
  color: var(--cl-white);
  font-size: .75rem;
  letter-spacing: .02em;
  white-space: nowrap;
  animation: cl-art-nudge 2.4s ease-in-out 3;
}
.cl-main-article__table-swipe[hidden] { display: none; }
.cl-main-article__table-swipe svg { width: .875rem; height: .875rem; display: block; }
@keyframes cl-art-nudge {
  0%, 60%, 100% { transform: translateX(0); }
  75% { transform: translateX(.25rem); }
}
/* the fade sits over the scroller's right edge, outside it so it never scrolls
   away, and is gone at the end of the run and when there is nothing to pan */
.cl-main-article__table-frame::after {
  content: "";
  position: absolute;
  inset: 0 0 0 auto;
  width: 3.5rem;
  z-index: 2;
  pointer-events: none;
  opacity: 0;
  transition: opacity .2s ease;
  background: linear-gradient(to left, var(--cl-white) 20%, #ffffffe0 55%, #ffffff00);
}
.cl-main-article__table-frame:has(.cl-main-article__table-scroll.is-scrollable:not(.is-end))::after { opacity: 1; }
/* One sticky column: the row labels stay readable while the value columns pan
   under them. The CMS table's own <style> paints the header row, so only the
   body cells need a ground of their own; the inset hairline redraws the right
   border, which a collapsed border model hands to the table and not the cell. */
.cl-main-article__table-scroll table tr > *:first-child {
  position: sticky;
  left: 0;
  z-index: 1;
  min-width: 6.5rem;
  max-width: 12rem;
}
.cl-main-article__table-scroll table tbody tr > *:first-child {
  background-color: var(--cl-white);
  box-shadow: inset -1px 0 0 var(--cl-line);
}
/* A table sizes its columns from its cells' min-content width, and `anywhere`
   is the one wrapping mode that changes min-content. Inside a table it would
   re-balance every column and change the table's height, and it squashed the
   migrated comparison table to the column width instead of letting it scroll.
   `break-word` breaks the same long words at layout time but leaves intrinsic
   sizing alone, so tables keep the export's columns and a wide one stays wide
   inside its scroller. */
.cl-main-article__richtext table { overflow-wrap: break-word; }
/* the comparison table component */
.cl-main-article__richtext .table_component { width: 100%; margin: 2rem 0; border-collapse: collapse; }
.cl-main-article__richtext .table_header { text-align: left; border: 1px solid #000; padding: .45rem; }
.cl-main-article__richtext .table_cell { border: 1px solid #000; padding: .25rem .45rem; }
.cl-main-article__richtext .table_body { font-size: .875rem; }

/* --- inline e-book CTA (.section-cta16) ----------------------------------------- */
/* EU round: the export pushed a 36rem content box to the right edge of the
   block; the copy and the form now run the whole column at every width.
   The cocoa ground is a fallback under the photo, so the white copy is never
   white on white while the image loads or when none is set. */
.cl-main-article__cta {
  display: flex;
  justify-content: flex-start;
  margin: 2rem 0;
  padding: 1.5rem;
  color: var(--cl-white);
  background-color: var(--cl-cocoa);
  position: relative;
  isolation: isolate;
}
.cl-main-article__cta-pad { width: 100%; margin-right: 0; padding: 2rem 0; }   /* .padding-vertical.padding-medium */
.cl-main-article__cta-content { width: 100%; max-width: none; }
.cl-main-article__cta .pre-heading { text-align: left; }
.cl .cl-main-article__cta-heading { margin: 0 0 .5rem; font-size: 1.85rem; font-weight: 400; line-height: 1.2; }
.cl-main-article__cta-block { margin-bottom: 0; }
.cl-main-article__cta-form { color: var(--cl-black); }
.cl-main-article__cta-fields {
  display: grid;
  grid-template-columns: max-content max-content max-content;
  grid-auto-columns: 1fr;
  column-gap: 0;
  row-gap: 1rem;
  margin-bottom: 1rem;
}
.cl-main-article__cta-input {
  display: block;
  width: 100%;
  height: auto;
  min-height: 2.75rem;
  margin: 0;
  padding: .5rem .75rem;
  color: var(--cl-black);
  font-family: inherit;
  font-size: 1rem;
  font-weight: inherit;
  line-height: 1.6;
  vertical-align: middle;
  background-color: var(--cl-white);
  border: 1px solid #000;
  border-width: 0 0 0 1px;
  border-left-color: var(--cl-ink-60);
  border-radius: 0;
  -webkit-appearance: none;
  appearance: none;
}
.cl-main-article__cta-input:focus { outline: 0; border-color: #000; }
.cl-main-article__cta-input::placeholder { color: #0006; font-size: .9rem; opacity: 1; }
.cl-main-article__cta-submit {
  display: inline-block;
  margin: 0;
  padding: .75rem 1.5rem;
  color: var(--cl-white);
  background-color: var(--cl-dark-red);
  border: 0;
  border-radius: 0;
  font-family: inherit;
  font-size: .9rem;
  font-weight: inherit;
  line-height: inherit;
  text-align: center;
  text-decoration: none;
  cursor: pointer;
  -webkit-appearance: none;
  appearance: none;
}
.cl-main-article__cta-submit:hover { background-color: var(--cl-cocoa); }
.cl-main-article__cta-privacy { color: var(--cl-white); padding: 5px; }
.cl-main-article__cta-field { position: relative; }
.cl-main-article__cta-check {
  display: flex;
  align-items: center;
  margin-bottom: 0;
  padding-left: 1.25rem;
  font-weight: 500;
  cursor: pointer;
}
.cl-main-article__cta-check input {
  position: absolute;
  top: 0;
  left: 0;
  width: 1.5rem;
  height: 1.5rem;
  margin: 0;
  opacity: 0;
  z-index: -1;
}
.cl-main-article__cta-box {
  display: block;
  flex: none;
  width: 1.5rem;
  min-width: 1.5rem;
  height: 1.5rem;
  min-height: 1.5rem;
  margin: 0 0 0 -1.25rem;
  background-color: #fff;
  border: 1px solid var(--cl-cocoa);
  border-radius: 0;
  line-height: normal;
  transition: all .2s;
}
.cl-main-article__cta-check input:checked ~ .cl-main-article__cta-box {
  background-color: var(--cl-cocoa);
  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='%23fff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' d='M3.5 8.5l3 3 6-7'/%3E%3C/svg%3E");
  background-position: 50%;
  background-repeat: no-repeat;
  background-size: 16px 16px;
}
.cl-main-article__cta-check input:focus-visible ~ .cl-main-article__cta-box { border-color: #000; outline: 2px solid var(--cl-focus); outline-offset: 2px; }
.cl-main-article__cta-check-label {
  display: block;
  margin-bottom: 0;
  padding-left: 1rem;
  font-size: .94rem;
  font-weight: 300;
  text-align: left;
}
.cl-main-article__cta-check-label a { color: inherit; text-decoration: underline; }
.cl-main-article__cta-success { color: var(--cl-white); }
.cl-main-article__cta-error { margin-top: 1.5rem; padding: .875rem 1rem; background-color: var(--cl-white); }
.cl-main-article__cta-error-text { color: var(--cl-dark-red); }
.cl-main-article__cta-bg {
  position: absolute;
  inset: 0;
  z-index: -1;
  background-image: linear-gradient(#00000080, #00000080);
}
.cl-main-article__cta-bg img {
  object-fit: cover;
  object-position: center;
  width: 100%;
  height: 100%;
  position: absolute;
  inset: 0;
  z-index: -1;
}

/* --- author card --------------------------------------------------------------- */
.cl-main-article__author-card {
  display: flex;
  justify-content: flex-start;
  align-items: center;
  column-gap: 2rem;
  row-gap: 2rem;
  padding: 1rem;
  background-color: var(--cl-light-grey);
  border-radius: .25rem;
}
/* Card contract, as on the carousel and the article cards: the picture slot
   is a pumice ground, so an author with no photo reads as an empty slot and
   not as a hole in the card. The export leaves it transparent. */
.cl-main-article__author-photo {
  flex: none;
  width: 7.5rem;
  height: 7.5rem;
  border-radius: 5rem;
  background-color: var(--cl-pumice);
  position: relative;
  overflow: hidden;
}
/* Two cards stacked (the article's author plus the "always" one) shared one
   ground in the export and read as a single grey block. */
.cl-main-article__author-card + .cl-main-article__author-card { margin-top: 1rem; }
/* EU round: 1.5rem between the body and the first card. The old selector
   (:first-of-type) never matched: the body's own <div> is the first div in
   the column, so the card sat wherever the body's last margin left it. */
.cl-main-article__content > * + .cl-main-article__author-card { margin-top: 1.5rem; }
.cl-main-article__content > .cl-main-article__author-card + .cl-main-article__author-card { margin-top: 1rem; }
.cl-main-article__author-text {
  display: flex;
  flex-direction: column;
  justify-content: flex-start;
  align-items: flex-start;
  column-gap: .5rem;
  row-gap: .5rem;
}
.cl-main-article__author-pill {
  display: inline-block;
  margin-bottom: .25rem;
  padding: .1rem 0;
  background-color: var(--cl-pumice);
  font-size: .75rem;
  font-weight: 400;
  letter-spacing: .5px;
  text-transform: uppercase;
}
.cl-main-article__author-title { display: flex; justify-content: flex-start; align-items: center; }
/* .text-size-large.text-weight-bold: the export's .text-size-large (400) is declared
   after .text-weight-bold, so the name renders at 400 with the bold rule's 1.24 leading */
.cl-main-article__author-name { line-height: 1.24; }
.cl-main-article__author-text .text-style-link { color: inherit; }

/* --- ad banner ----------------------------------------------------------------- */
.cl-article-banner {
  display: flex;
  justify-content: flex-start;
  align-items: center;
  column-gap: 1rem;
  row-gap: 1rem;
  width: 100%;
  margin: 2rem 0;
  padding: 1.5rem;
  color: var(--cl-white);
  background-color: var(--cl-cocoa);
  border: 1px solid transparent;
  border-radius: .5rem;
  text-decoration: none;
  position: relative;
  overflow: hidden;
  transition: transform .2s;
}
.cl-article-banner:hover { border-color: var(--cl-ink-50); transform: translate(0, -.25rem); }
.cl-article-banner.is-inverted { color: var(--cl-cocoa); background-color: var(--cl-white); border-color: var(--cl-ink-50); }
.cl-article-banner.is-inverted:hover { background-color: var(--cl-light-grey); }
.cl-article-banner__text { display: block; max-width: 30rem; position: relative; z-index: 1; }
/* The body's own `a { color: inherit; text-decoration: underline }` is one
   class more specific than .cl-article-banner, so every ad banner swapped into
   a body rendered its title and text in body ink on the cocoa ground -- unread
   able -- and underlined the whole card. Five migrated articles carry a banner
   marker, four of them the cocoa style. Scoped back here. */
.cl-main-article__richtext .cl-article-banner { color: var(--cl-white); text-decoration: none; }
.cl-main-article__richtext .cl-article-banner.is-inverted { color: var(--cl-cocoa); }
.cl-main-article__richtext .cl-article-banner__pill,
.cl-article-banner__pill {
  display: inline;
  margin: 0;
  padding: .25rem .65rem;
  color: var(--cl-cocoa);
  background-color: #ffffff94;
  border-radius: .25rem;
  font-size: .75rem;
  font-weight: 400;
  line-height: 1.4;
  text-transform: uppercase;
}
.cl-article-banner.is-inverted .cl-article-banner__pill { background-color: var(--cl-nimbus); }
.cl-article-banner__title { margin: .5rem 0 .75rem; font-size: 1.25rem; font-weight: 600; line-height: 1.25; }
.cl-article-banner p { margin: 0; }
.cl-main-article .cl-article-banner__image { width: 10rem; height: auto; position: absolute; top: auto; left: auto; right: 7%; }
.cl-article-banner__photo { width: 20rem; height: 100%; min-height: 11.4rem; position: absolute; inset: 0 0 auto auto; }
.cl-article-banner__gradient { width: 100%; position: absolute; inset: 0 auto 0 0; background-image: linear-gradient(93deg, var(--cl-cocoa), #fff0); }
.cl-article-banner__arrow-wrap {
  display: flex;
  justify-content: center;
  align-items: center;
  width: 1.5rem;
  height: 1.5rem;
  color: var(--cl-black);
  background-color: var(--cl-nimbus);
  position: absolute;
  inset: 0 0 auto auto;
}
.cl-article-banner.is-inverted .cl-article-banner__arrow-wrap { color: var(--cl-white); background-color: var(--cl-cocoa); }
.cl-article-banner__arrow { display: flex; flex-direction: column; justify-content: center; align-items: center; width: 1rem; height: 1rem; }
.cl-article-banner__arrow svg { width: 100%; height: 100%; display: block; }

/* No hero image: the byline row carries the air the picture used to
   (.cl-main-article__image had margin-bottom 2rem). */
.cl-main-article.is-no-hero .cl-main-article__top { margin-bottom: 2rem; }

@media screen and (max-width: 991px) {
  .cl-main-article__head { margin-bottom: 2.5rem; }
  .cl-main-article__title-wrap { margin-bottom: 1rem; }
  .cl-main-article__image { margin-bottom: 3rem; padding-top: 56.25%; }
  .cl-main-article__disclaimer-wrap { margin-bottom: 3.5rem; }
  .cl-main-article__layout { display: flex; flex-direction: column-reverse; grid-template-columns: 1fr; }
  .cl-main-article__layout.is-solo { align-items: center; }
  .cl-main-article__aside,
  .cl-main-article__toc { width: 100%; position: relative; top: 0; }
  .cl-main-article__content { order: -9999; margin-bottom: 3rem; }
  /* stacked, the aside is the column's full width while the body is capped, so
     the two ran to different right edges; they now share one measure */
  .cl-main-article__aside { max-width: 50rem; }
  /* collapsed: the summary is the whole control, the list its drawer */
  .cl-main-article__toc-box { row-gap: 0; background-color: var(--cl-lucidity); }
  .cl-main-article__toc-heading { padding: 1rem 1.5rem; }
  .cl-main-article__toc-box[open] .cl-main-article__toc-list { padding: 0 1.5rem 1rem; }
  .cl-main-article .pre-heading { text-align: left; }
  .cl-main-article__author-card { flex-flow: column; justify-content: flex-start; align-items: flex-start; column-gap: 1rem; row-gap: 1rem; }
  /* header note 5: the export lands `width: 5rem` on a box that still carries
     height: 7.5rem, so its avatar is an 80 x 120 oval on every narrow width */
  .cl-main-article__author-photo { width: 5rem; height: 5rem; padding-top: 0; }
}
@media screen and (max-width: 767px) {
  .cl-main-article__head { margin-bottom: 2rem; }
  .cl-main-article__top { flex-direction: column; align-items: center; margin-bottom: 0; }
  /* EU round: the hero runs edge to edge on a phone, with 1.5rem above and
     below it. The block is a child of the 5% page padding, so the negative
     side margins take it to the viewport edges (the section clips overflow-x,
     so a classic scrollbar's width is swallowed, not scrolled). The row above
     drops its margin, and the layout that follows takes 1.5rem instead of
     its 3rem so the two collapse to exactly 1.5rem. */
  .cl-main-article__image {
    width: 100vw;
    max-width: none;
    margin: 1.5rem calc(50% - 50vw);
    /* the padding-top box was a percentage of the column, not of the
       viewport-wide picture; a real ratio keeps 16:9 at the new width */
    padding-top: 0;
    aspect-ratio: 16 / 9;
  }
  .cl-main-article__head:has(+ .cl-main-article__image) { margin-bottom: 1.5rem; }
  .cl-main-article__image + .cl-main-article__layout { margin-top: 1.5rem; }
  .cl-main-article__disclaimer-wrap { margin-bottom: 2.5rem; }
  .cl-main-article__disclaimer-q { padding-top: 1rem; padding-bottom: 1rem; }
  .cl-main-article__disclaimer-icon { width: 1.75rem; height: 1.75rem; }
  .cl-main-article__content { margin-bottom: 2rem; }
  .cl-main-article__richtext figure { margin-top: 2rem; margin-bottom: 2rem; }
  /* the section's own wrapper is the only scroll container now, so the
     component table keeps its readable fixed columns without nesting a
     second scroller inside the first */
  .cl-main-article__richtext .table_component { display: block; overflow: visible; }
  .cl-main-article__richtext .table_head { display: block; }
  .cl-main-article__richtext .table_body { display: block; width: 100%; }
  .cl-main-article__richtext .table_row { display: flex; justify-content: flex-start; align-items: stretch; }
  .cl-main-article__richtext .table_header, .cl-main-article__richtext .table_cell { flex: none; width: 14rem; }
  .cl-main-article__cta-pad { margin-right: 0; padding: 1.5rem 0; }
  /* EU round: a short block on a phone showed the overlay's flat grey and
     none of the photo; 20rem of height gives the picture room, the copy
     sits in the middle of it. */
  .cl-main-article__cta { min-height: 20rem; align-items: center; }
  /* the block's photo is a wide strip (the face sits on its left third), so
     a centred cover crop on a tall phone box showed only its grey middle */
  .cl-main-article__cta-bg img { object-position: 12% 50%; }
  .cl-main-article__cta-fields { grid-template-columns: 1fr; }
  .cl-main-article__title-wrap .text-size-medium { font-size: 1.125rem; }
  .cl-article-banner { flex-flow: column; justify-content: flex-start; align-items: flex-start; }
  .cl-article-banner__text { max-width: none; }
  .cl-main-article .cl-article-banner__image { display: none; bottom: -15%; }
  .cl-article-banner__photo { width: 110%; height: 9rem; min-height: 9rem; margin-bottom: -1.5rem; margin-left: -1.5rem; position: relative; }
  .cl-article-banner__gradient { background-image: linear-gradient(var(--cl-cocoa), #fff0); }
}
@media screen and (max-width: 479px) {
  /* Round twenty-three: the crumb and excerpt were centred while the title
     and byline sat left; the whole header is left-aligned on a phone. The
     disclaimer and contents summaries were 1.3rem desktop rows and read as
     banners; they take body size and less padding here. */
  .cl-main-article__header { align-items: flex-start; text-align: left; }
  .cl-main-article__meta { justify-content: flex-start; }
  .cl-main-article__title-wrap { align-items: flex-start; }
  .cl-main-article__disclaimer-q { padding: .875rem 1.125rem; font-size: 1.0625rem; }
  .cl-main-article__disclaimer-icon { width: 1.25rem; height: 1.25rem; margin-left: 1rem; }
  .cl-main-article__disclaimer-a { padding: 0 1.125rem; }
  .cl-main-article__toc-heading { padding: .875rem 1.125rem; font-size: 1.0625rem; }
  .cl-main-article__toc-box[open] .cl-main-article__toc-list { padding: 0 1.125rem .875rem; }
  .cl-main-article__table-swipe { font-size: .6875rem; }
  .cl-main-article__table-frame::after { width: 2.5rem; }
  .cl-main-article__table-scroll table tr > *:first-child { min-width: 5.5rem; max-width: 8rem; }
  .cl-main-article .heading-large { text-align: left; }
  .cl-main-article .cl-main-article__stamp { justify-content: flex-start; }
  .cl-main-article__byline { justify-content: flex-start; }
  .cl-main-article__top { flex-direction: column; align-items: flex-start; }
  .cl-main-article__cta-fields { flex-direction: column; row-gap: .75rem; }
  .cl-main-article .image_cover-absolute { object-position: 68% 50%; }
  .cl-main-article__richtext .table_cell,
  .cl-main-article__richtext .table_header { width: 11rem; }
  .cl-article-banner__photo { width: 119%; }
}
@media (prefers-reduced-motion: reduce) {
  .cl-main-article__table-swipe { animation: none; }
  .cl-main-article__table-frame::after,
  .cl-main-article__toc-link,
  .cl-main-article__toc-link::before,
  .cl-main-article__toc-icon,
  .cl-main-article__disclaimer-icon,
  .cl-article-share__copied,
  .cl-article-banner,
  .cl-main-article__cta-box { transition: none; }
}

.cl-main-article__cta-link { display: inline-flex; align-items: center; justify-content: center; text-decoration: none; }

/* Round twenty-four (Vlad, 2026-09-18): Webflow video figures
   (figure.w-richtext-figure-type-video) carry an inline padding-bottom that
   Webflow's CSS used as an aspect box for an absolutely positioned iframe.
   Without that CSS the iframe sat at its default size on top of an empty
   band. The figure box is dissolved (its inline padding with it) and the
   iframe itself fills the column at 16:9. */
.cl-main-article__richtext figure.w-richtext-figure-type-video { display: contents; }
.cl-main-article__richtext figure.w-richtext-figure-type-video > div { display: block; width: 100%; }
.cl-main-article__richtext figure.w-richtext-figure-type-video iframe { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; margin: 2rem 0; }

/* EU blog, 2026-09-21: snapshot block ahead of the body. Left rule in the
   Terra accent, Nimbus-30% ground, the heading row small caps; a table inside
   it is a plain grid on the 30% hairline. Rendered from the article metafield
   custom.article_snapshot (sections/cl-main-article.liquid). */
.cl-snapshot {
  margin: 0 0 2.5rem;
  padding: 1.5rem 1.75rem 1.5rem 1.5rem;
  border-left: 4px solid var(--cl-terra);
  border-radius: 0 .5rem .5rem 0;
  background: var(--cl-light-grey);
  color: var(--cl-cocoa);
  font-size: 1.0625rem;
  line-height: 1.55;
}
.cl-snapshot > :first-child { margin-top: 0; }
.cl-snapshot > :last-child { margin-bottom: 0; }
.cl-snapshot__label {
  margin: 0 0 .75rem;
  font-size: .75rem;
  font-weight: 500;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--cl-terra);
}
.cl-snapshot p { margin: 0 0 .75rem; }
.cl-snapshot ul { margin: 0 0 .75rem; padding-left: 1.25rem; }
.cl-snapshot li { margin: 0 0 .5rem; }
.cl-snapshot li:last-child { margin-bottom: 0; }
.cl-snapshot strong { font-weight: 500; }
.cl-snapshot table {
  width: 100%;
  margin: 1rem 0 0;
  border-collapse: collapse;
  font-size: .9375rem;
}
.cl-snapshot th, .cl-snapshot td {
  padding: .55rem .75rem;
  border-bottom: 1px solid var(--cl-nimbus);
  text-align: left;
  vertical-align: top;
}
.cl-snapshot th { font-weight: 500; }
.cl-snapshot thead th { border-bottom: 1px solid var(--cl-cocoa); }
.cl-snapshot tbody tr:last-child td { border-bottom: 0; }
@media (max-width: 767px) {
  .cl-snapshot { padding: 1.25rem 1.25rem 1.25rem 1.125rem; font-size: 1rem; }
  .cl-snapshot table { display: block; overflow-x: auto; }
}


/* cl-main-blog.css */
/* ==========================================================================
   Blog index. Port of blog.html :: .section-blog14 + .section-blog2 and of
   detail_blog-kategorien.html (the category variant of the same header).

   Every value below was read with tools/extract-section.mjs. The card rules
   (.blog2_item and children) live in cl-article-rail.css, which this section
   loads; only the shell, the header and the promo card are here.

   From the export (base, then 991 / 767 / 479):
     .header-extra-pad_global        height 4rem
     .padding-top.padding-xhuge      padding 7rem 0 0, an explicit combo rule that
                                     outranks the .padding-xhuge steps, so 7rem at
                                     every width (cl-base would step 6rem / 4rem)
     .margin-bottom.margin-xxlarge   20px: `.margin-bottom { margin: 0 0 20px }` is
                                     declared after the scale, so the scale only wins
                                     inside the breakpoints: 991: 4.5rem  767: 3rem
     .margin-bottom (bare)           20px, around the h1 on the index
     .margin-bottom.margin-xsmall    20px (the bare rule again), around the eyebrow on a
                                     category page; 767: .75rem
     .margin-bottom.margin-small     0 (the combo restates margin-bottom: 0), around
                                     the h1 on a category page
     .max-width-large.align-center   48rem, centred; 991: text-align center
     .heading-xlarge                 Sanomat 5rem / 1.1, -1.5px, centred; 767: 4rem;
                                     479: 2.7rem (cl-base)
     .text-size-medium               1.125rem; 767: 1rem (cl-base)
     .blog-filter_form-wrapper       width 100%, max-width 25rem, margin 2rem auto
                                     991: max-width none, margin-top 1rem
     .filter_search-field (+.w-input) block, width 100%, height 38px under a 3.25rem
                                     min-height, bg #f4f4f4 with BxSearch.svg at 10px
                                     (1.5rem), border 1px solid #3e303740, padding
                                     1rem 1.5rem 1rem 4rem, 1rem / 1.42857, mb 0;
                                     focus: border golden
     .blog14_component               flex column, margin-top 40px
                                     991: margin-right -2.5rem  767: -1.95rem  479: 0
     .blog14_category-menu           flex, column-gap 1.5rem, border-top 1px cocoa,
                                     align centre, width 100%, mb 4rem, padding-top .5rem
                                     767: width 100vw, margin-left -5vw, padding-left
                                     5vw, overflow scroll, mb 3rem
     .blog14_category-menu.has-searchbar  column-gap 1rem, border-top transparent,
                                     border-bottom 1px #3e303740, align flex-start
                                     991: overflow scroll
     .blog14_category-menu.no-scrollbar   align flex-start, scrollbar hidden (embed)
     .blog-category-links            flex none, padding-bottom .4rem, .875rem, inline-block
     .blog-category-links.w--current border-bottom 1px cocoa, padding-bottom 1rem, 400
     .blog-categories_list-wrapper   align-self stretch
     .blog-categories_list           flex, wrap, column-gap 1.5rem; 991: nowrap
     .blog-categories_item           991: flex none
     .blog-featured_component        grid 1fr 1fr, column-gap 2rem, row-gap 16px;
                                     767: 1fr. Carries .hide on the live site.
     .blog14_list                    grid 1fr, column-gap 3rem, row-gap 4rem, height 100%
                                     767: row-gap 3rem
     .pre-heading                    cl-base (4rem top, 2rem bottom, 600); the export
                                     adds text-align left below 991, cl-base does not
     h2.subheading-medium            the bare h2 (700 from components.css, margin 0 and
                                     line-height 1.2 from the site) at 1.375rem
     .padding-vertical.padding-xlarge  4rem; 991: 3.5rem; 767: 2.5rem (cl-base)
     .blog1_component                flex column, align stretch
     .blog_list / .blog-item         cl-article-rail.css (.cl-article-rail__list/__item)
     .blog-item_featured             flex column, row-gap 2rem, white on cocoa,
                                     padding 2rem, align flex-start
                                     479: margin-bottom 1rem, padding 1.5rem
     .blog-item_featured-content     flex column, row-gap 1rem; 479: 1.5rem
     h2 (bare, in the promo)         2rem / 700 / 1.2, margin 0, body font;
                                     991: 2.75rem  767: 2.25rem
     .w-inline-block                 max-width 100% on the promo link
     .pill-medium.is-inverted        colour cocoa
     .button-6.invert-colors         = .button.invert-colors (cl-base)
     .w-pagination-wrapper.pagination  margin-top 2rem; the "Mehr anzeigen" pill is
                                     cocoa, radius 5rem. Not reproduced: pagination is
                                     snippets/cl-pagination.liquid, shared site-wide.

   Residuals, all content:
     - The export's cards are CMS-bound and empty; the fixture's are full, so the
       list, the card and both sections are taller here (see the probe file).

   Deliberate departures from the export, round twelve. The export is a Webflow
   page whose blog list never rendered content, so three of its choices do not
   survive a grid of real articles; each is marked style-only in the probe file:
     - the tag row is the theme's pill in a segmented row, not text links under
       a rule with the current one underlined (see the category block below);
     - the grid rows are equal (grid-auto-rows: 1fr) and the card stretches, so
       the read-now line is common to a row. The export's .blog-item is
       align-items: flex-start, which left every card its own height;
     - the promoted cocoa card grows with its row rather than sitting at its
       content height, and the card's title and excerpt clamp (three lines and
       two, in cl-article-rail.css).
   Page one carries the promoted card on top of the twelve articles, so its
   last row holds one card; every later page is four full rows.

   Not from the export: min-width 0 on the grid and flex children, overflow-wrap
   on the text blocks, and the category rail's bleed rewritten off percentages
   instead of the export's width: 100vw (same treatment as cl-faq.css, with one
   extra term, see the 767 block). The export's own copy never met a token wide
   enough to matter; the promoted card's title does, and it floored the single
   grid track at 322px inside a 288px column: 18px of page overflow at 320. All
   are scoped here, not pushed into cl-base.css.
   ========================================================================== */

.cl-main-blog__spacer { height: 4rem; }                 /* .header-extra-pad_global */
.cl-main-blog__pad { padding: 7rem 0 0; }               /* .padding-top.padding-xhuge */
.cl-main-blog__head { margin: 0 0 20px; }               /* .margin-bottom.margin-xxlarge at desktop */
.cl-main-blog__title { margin: 0 0 20px; }              /* bare .margin-bottom */
.cl-main-blog__title.is-tight { margin-bottom: 0; }     /* .margin-bottom.margin-small */
.cl-main-blog .heading-xlarge { text-align: center; }

.cl-main-blog__eyebrow-wrap { margin: 0 0 20px; }       /* .margin-bottom.margin-xsmall */

/* --- search ---------------------------------------------------------------- */
.cl-main-blog__search { width: 100%; max-width: 25rem; margin: 2rem auto; }
.cl-main-blog__search-form { margin: 0; }
.cl-main-blog__search-field {
  display: block;
  width: 100%;
  height: 38px;
  min-height: 3.25rem;
  margin: 0;
  padding: 1rem 1.5rem 1rem 4rem;
  color: inherit;
  font-family: inherit;
  font-size: 1rem;
  font-weight: inherit;
  line-height: 1.42857;
  vertical-align: middle;
  background-color: var(--cl-light-grey);
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M10 18a7.952 7.952 0 0 0 4.897-1.688l4.396 4.396 1.414-1.414-4.396-4.396A7.952 7.952 0 0 0 18 10c0-4.411-3.589-8-8-8s-8 3.589-8 8 3.589 8 8 8zm0-14c3.309 0 6 2.691 6 6s-2.691 6-6 6-6-2.691-6-6 2.691-6 6-6z'/%3E%3C/svg%3E");
  background-position: 10px 50%;
  background-repeat: no-repeat;
  background-size: 1.5rem;
  border: 1px solid var(--cl-ink-25);
  border-radius: 0;
  -webkit-appearance: none;
  appearance: none;
}
.cl-main-blog__search-field:focus { outline: 0; border-color: var(--cl-focus); }
.cl-main-blog__search-field::placeholder { color: #0009; opacity: 1; }
.cl-main-blog__search-field::-webkit-search-decoration,
.cl-main-blog__search-field::-webkit-search-cancel-button { -webkit-appearance: none; }
/* the export hides its submit; kept reachable for assistive tech, Enter submits */
.cl-main-blog__search-submit {
  position: absolute;
  width: 1px;
  height: 1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
  padding: 0;
  margin: -1px;
}

/* --- category menu --------------------------------------------------------- */
.cl-main-blog__component {
  display: flex;
  flex-direction: column;
  justify-content: flex-start;
  margin-top: 40px;
}
/* Not from the export. Webflow left this row as bare text links under a rule
   with the current one underlined, which on a page of pill-marked cards reads
   as unstyled text rather than as a control. It is the theme's own pill now
   (the card's .pill-medium geometry: pumice ground, .5px tracking, uppercase),
   laid out as a segmented row: the active tag is filled cocoa, the rest are
   pumice, hover warms to lucid, and the focus ring sits inside the pill so the
   scrolling row under 991 cannot clip it. The export's hairline stays as the
   row's base line. The header probes for this row are style-only in
   tools/probes/cl-main-blog.mjs for this reason. */
.cl-main-blog__menu {
  display: flex;
  column-gap: .5rem;
  justify-content: flex-start;
  align-items: center;
  width: 100%;
  margin-bottom: 4rem;
  padding-top: .75rem;
  padding-bottom: .75rem;
  border-top: 1px solid var(--cl-cocoa);
}
.cl-main-blog__menu.has-searchbar {
  column-gap: .5rem;
  align-items: center;
  border-top-color: transparent;
  border-bottom: 1px solid var(--cl-ink-25);
}
.cl-main-blog__menu.no-scrollbar {
  align-items: center;
  scrollbar-width: none;
  -ms-overflow-style: none;
}
.cl-main-blog__menu.no-scrollbar::-webkit-scrollbar { display: none; }
.cl-main-blog__cat {
  flex: none;
  display: inline-block;
  padding: .55rem 1rem;
  border: 1px solid transparent;
  border-radius: 5rem;
  background-color: var(--cl-pumice);
  font-size: .8125rem;
  font-weight: 500;
  line-height: 1.2;
  letter-spacing: .5px;
  text-transform: uppercase;
  white-space: nowrap;
  color: inherit;
  text-decoration: none;
  transition: background-color .18s ease, color .18s ease, border-color .18s ease;
}
.cl-main-blog__cat:hover { background-color: var(--cl-lucid); text-decoration: none; }
.cl-main-blog__cat.is-current {
  background-color: var(--cl-cocoa);
  border-color: var(--cl-cocoa);
  color: var(--cl-white);
  font-weight: 600;
}
.cl-main-blog__cat.is-current:hover { background-color: var(--cl-cocoa); }
.cl-main-blog__cat:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: -3px; }
.cl-main-blog__cat.is-current:focus-visible { outline-color: var(--cl-lucid); }
.cl-main-blog__cats { align-self: center; }
.cl-main-blog .cl-main-blog__cat-list {
  display: flex;
  flex-wrap: wrap;
  column-gap: .5rem;
  row-gap: .5rem;
  margin: 0;
  padding: 0;
  list-style: none;
}
.cl-main-blog .cl-main-blog__cat-item { margin: 0; flex: none; display: block; }
@media (prefers-reduced-motion: reduce) {
  .cl-main-blog__cat { transition: none; }
}

/* --- featured pair ----------------------------------------------------------- */
.cl-main-blog__featured {
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-auto-columns: 1fr;
  column-gap: 2rem;
  row-gap: 16px;
}
.cl-main-blog__featured-list {
  display: grid;
  grid-template-columns: 1fr;
  grid-auto-columns: 1fr;
  column-gap: 3rem;
  row-gap: 4rem;
  height: 100%;
}
.cl-main-blog__featured-item { display: flex; align-items: flex-start; }
.cl-main-blog .cl-main-blog__featured-title {
  font-family: inherit;
  font-size: 1.375rem;
  font-weight: 700;
  line-height: 1.2;
  margin: 0;
}

/* Not from the export. A grid or flex child is floored at its own min-content
   width unless min-width says otherwise, so one long word in a card title sets
   the track: at 320 the promoted card's title floored the single track at 322px
   inside a 288px column. `anywhere` only adds break opportunities where a word
   does not fit, so ordinary wrapping is untouched, and it lets these blocks
   report a small min-content width, which is what keeps the grid honest. No
   hyphens: auto, the page is lang="de" and Chrome would re-break the ported copy
   and move every text probe. */
.cl-main-blog__grid > *,
.cl-main-blog__item > *,
.cl-main-blog__featured > *,
.cl-main-blog__featured-list > *,
.cl-main-blog__featured-item > * { min-width: 0; }
.cl-main-blog__head,
.cl-main-blog__title,
.cl-main-blog__promo-title,
.cl-main-blog__promo p,
.cl-main-blog__featured-title,
.cl-main-blog .cl-article-card__title,
.cl-main-blog .cl-article-card__excerpt { overflow-wrap: anywhere; }

/* --- grid ------------------------------------------------------------------- */
.cl-main-blog__component2 {
  display: flex;
  flex-direction: column;
  justify-content: flex-start;
  align-items: stretch;
}

/* Not from the export. The export's .blog-item is align-items: flex-start, so
   each card is only as tall as its own content and every "Jetzt Lesen" in a
   row lands at a different height; with a promoted cocoa card in the row and
   an article whose image is missing, the row reads as broken rather than as a
   grid. Equal tracks plus a stretched item makes the card fill its row, which
   is what .cl-article-card's height: 100% was always written for. Scoped to
   the blog index: the related rail keeps the export's geometry. */
.cl-main-blog__grid { grid-auto-rows: 1fr; }
.cl-main-blog__item { align-items: stretch; }
/* the "no articles yet" line is a child of the grid, so it would otherwise
   sit in one 1fr track a third of the way across the page */
.cl-main-blog__empty { grid-column: 1 / -1; margin: 0; }

/* .blog-item_featured, the promoted article slotted into the grid */
.cl-main-blog__promo {
  max-width: 100%;
  display: flex;
  flex-direction: column;
  justify-content: flex-start;
  align-items: flex-start;
  row-gap: 2rem;
  padding: 2rem;
  color: var(--cl-white);
  background-color: var(--cl-cocoa);
  text-decoration: none;
  position: relative;
}
.cl-main-blog__promo-content {
  display: flex;
  flex-direction: column;
  justify-content: flex-start;
  align-items: flex-start;
  row-gap: 1rem;
  position: relative;
  z-index: 3;
  /* not from the export: the card now fills its grid row (see the grid block
     below), so the content has to grow for the footer's margin-top: auto to
     put the button on the row's bottom line with every other card's */
  flex: 1;
  width: 100%;
}
/* not from the export: the promo is a link and had no hover state */
.cl-main-blog__promo .button { transition: background-color .18s ease, color .18s ease; }
.cl-main-blog__promo:hover .cl-article-card__icon { transform: translateX(.2rem); }
.cl-main-blog__promo:focus-visible { outline: 2px solid var(--cl-lucid); outline-offset: -4px; }
@media (prefers-reduced-motion: reduce) {
  .cl-main-blog__promo .button { transition: none; }
  .cl-main-blog__promo:hover .cl-article-card__icon { transform: none; }
}
.cl-main-blog .cl-main-blog__promo-title {
  font-family: inherit;
  font-size: 2rem;
  font-weight: 700;
  line-height: 1.2;
  margin: 0;
}
.cl-main-blog__promo p { margin: 0; }
.cl-main-blog .cl-article-card__pill.is-inverted { color: var(--cl-cocoa); }
.cl-main-blog__promo .cl-article-card__icon { width: .8rem; height: .8rem; }

@media screen and (max-width: 991px) {
  .cl-main-blog__head { margin-bottom: 4.5rem; }
  .cl-main-blog .max-width-large.align-center { text-align: center; }
  .cl-main-blog .pre-heading { text-align: left; }
  .cl-main-blog__search { max-width: none; margin-top: 1rem; }
  .cl-main-blog__component { margin-right: -2.5rem; }
  .cl-main-blog__menu.has-searchbar { overflow-x: auto; overflow-y: hidden; }
  .cl-main-blog .cl-main-blog__cat-list { flex-wrap: nowrap; }
  .cl-main-blog .cl-main-blog__cat-item { flex: none; }
  .cl-main-blog .cl-main-blog__promo-title { font-size: 2.75rem; }
}
@media screen and (max-width: 767px) {
  .cl-main-blog__head { margin-bottom: 3rem; }
  .cl-main-blog__eyebrow-wrap { margin-bottom: .75rem; }
  .cl-main-blog__component { margin-right: -1.95rem; }
  /* the export bleeds the rail to the page edges with width: 100vw and
     margin-left: -5vw. vw counts the classic scrollbar the layout viewport does
     not have, so that overflows the document by the scrollbar's width on every
     browser that still paints one (cl-faq.css carries the same note on the same
     component). The same bleed measured off the element's own containing block
     cannot. That containing block is .cl-main-blog__component, which is the 90%
     column plus the 1.95rem it is pulled right by at this width, so the column
     is (100% - 1.95rem): the 5% gutter is one eighteenth of it and 100vw is
     10/9 of it. Every declaration keeps its export shape and the box is
     identical bar sub-pixel rounding. */
  .cl-main-blog__menu {
    width: calc((100% - 1.95rem) * 10 / 9);
    margin-left: calc((1.95rem - 100%) / 18);
    padding-left: calc((100% - 1.95rem) / 18);
    overflow-x: auto;
    overflow-y: hidden;
  }
  .cl-main-blog__menu.no-scrollbar,
  .cl-main-blog__menu.has-searchbar { justify-content: flex-start; align-items: center; margin-bottom: 3rem; }
  .cl-main-blog__featured { grid-template-columns: 1fr; }
  .cl-main-blog__featured-list { row-gap: 3rem; }
  .cl-main-blog .cl-main-blog__promo-title { font-size: 2.25rem; }
}
@media screen and (max-width: 479px) {
  .cl-main-blog__component { margin-right: 0; }
  /* the containing block is the plain 90% column again from here down */
  .cl-main-blog__menu {
    width: calc(100% * 10 / 9);
    margin-left: calc(-100% / 18);
    padding-left: calc(100% / 18);
  }
  .cl-main-blog__promo { margin-bottom: 1rem; padding: 1.5rem; }
  .cl-main-blog__promo-content { row-gap: 1.5rem; }
}


/* cl-main-page.css */
/* ==========================================================================
   Page body. Port of header.section-resources (detail_wissenswertes.html),
   header.section-legal-doc (detail_legal.html), .section-pillar-1-col with
   its neighbours (lern-mehr/beste-infrarotkabine-deutschland.html) and
   .section-blogpost (lern-mehr/infrarotsauna-gesundheit.html).

   From the export (base, then 991 / 767 / 479):

   Shared
     .header-extra-pad_global   height 4rem
     .text-rich-text            the CMS body (element rules + .text-rich-text):
       h2   1.5rem 0 1rem, Sanomat 2.25rem / 400 / 1.2
       h3   1.5rem 0 1.5rem, Adelle 1.375rem / 400 / 1.2
       h4   1.5rem 0 1.25rem, 1rem / 600 / 1.3
       h5   1.25rem 0 1rem, 1.5rem / 700 / 1.4      h6  1.25rem 0 1rem, 1.25rem / 700 / 1.4
       p    0 0 .5rem        ul  1rem 0, padding-left 1.25rem   ol  1rem 0, padding-left 40px
       li   margin-bottom .5rem, last 0          blockquote  1.5rem 0
       a    underline, colour inherited (the site's <style> snippet)
       figure  3rem 0, position relative, max-width 60%; 767: 2.5rem 0
               .w-richtext-align-fullwidth  100%, centred, display block
               .w-richtext-align-center     margin auto
               .w-richtext-figure-type-video  width 60% (100% fullwidth), height 0,
               padding-bottom from the inline style, iframe absolute
               figure > div  inline-block, font-size 0 (no descender gap)
       figcaption  opacity .8, left, border-left 2px #000, margin-top .5rem,
               padding-left .5rem, .875rem
       > :first-child margin-top 0, > :last-child margin-bottom 0
     .table_component  100% wide, 1.75rem 0; .table_header left, border 1px #000,
               padding .45rem; .table_cell border 1px #000, padding .25rem .45rem;
               .table_body .875rem. 767: table block + overflow auto, rows flex,
               cells 14rem wide; 479: 11rem
     .margin-bottom.margin-medium  20px (the .margin-bottom quirk, DEDUPE-MAP);
               767: 1.5rem
     .subheading-small  1.375rem / 400 / 1.4

   Wissenswertes (header.section-resources)
     .padding-top.padding-xhuge  7rem; 991: 6rem; 767: 4rem  (cl-base)
     .container-blog     grid minmax(20rem,20rem) 1fr, gap 3rem, place-items
                         start, margin 3rem 0; 991: flex column-reverse
     .blog-inner_left    flex column, gap 2rem, sticky top 12rem;
                         991: width 100%, position relative, top 0
                         .is-gap (health pillar) gap 1rem, colour cocoa
     .resources_content.is-smaller  max-width 50rem; 991: margin-bottom 3rem; 767: 2rem
     .share-post_wrap    flex column, row-gap .8rem, align-items flex-start
     .blogpost_share     grid, auto-flow column, column-gap 16px, row-gap .5rem
     .share-link         bg light-grey, radius 20px, padding .25rem, flex
     .blogpost_social-icon  1.5rem square, flex centred
     .copied             opacity 0, #666769 on #fff, radius .4rem, padding .2rem,
                         absolute top -2rem left -1rem, shadow 0 1px .4rem #00000040
     .fs-toc_sidebar     flex column, gap 1rem, #801c00, bg #fff, radius .5rem
     .fs-toc_heading     #131313, Sanomat 1.125rem;  .is-red #7f1c01
     .fs-toc_link-content  grid, row-gap .75rem
     .fs-toc_link-wrapper.is-h2  flex, gap 1rem, space-between, align start
     .fs-toc_link        flex, gap .5rem, 100%, #131313, border-bottom 1px
                         transparent, padding .25rem, 400, no underline
                         .w--current  #7f1c01, bg #f4f4f49e, border-bottom #13131340
     .ad-banner_component  flex, gap 1rem, #fff on #3e3037, border 1px
                         transparent, radius .5rem, align center, 1.75rem 0,
                         padding 1.5rem, relative, overflow hidden;
                         hover: border #1b1b1b80, translateY(-.25rem)
                         .is-inverted  #3e3037 on #fff, border 1px #3e303780;
                         hover bg #f5f5f5
                         767: column, align start
     .ad-banner_text-wrapper  max-width 30rem; 767: none
     .text-pill          #3e3037 on #ffffff94, uppercase, radius .25rem,
                         padding .25rem .65rem, .75rem / 400, inline
                         .is-inverted bg #bdbdbd94
     .ad-banner_text-title  .5rem 0 .75rem, 1.25rem / 600 / 1.25
     .ad-banner_image    10rem wide, absolute right 7%; 767: hidden
     .ad-banner_image-wrapper  20rem wide, 100% tall, min 11.4rem, absolute
                         right; 767: 110% wide, 9rem tall, relative, -1.5rem
                         margins; 479: 119%
     .ad-banner_image-gradient  linear-gradient(93deg, #3e3037, #fff0);
                         767: vertical
     .ad-banner_arrow-wrapper  1.5rem square, #131313 on #e4e4e4, absolute
                         top right; .is-inverted #fff on #3e3037
     .ad-banner_arrow    1rem square

   Legal (header.section-legal-doc)
     .padding-vertical.padding-xhuge  the tablet-tall combo (cl-base .is-tablet-tall)
     .margin-bottom.margin-large      20px; 991: 2.5rem; 767: 2rem
     .legal-doc_content-top  flex, space-between, align end; 479: column, start
     .legal-doc_date-updated-wrap  uppercase, flex, align center, 500, .875rem;
                         479: margin-bottom 1rem
     .legal-doc_date-updated  margin-left .4rem, flex
     .legal-doc_rich-text  991: margin-bottom 3rem; 767: 2rem

   Pillar (.section-pillar-1-col and friends)
     .section-pillar-1-col  padding 2.5rem 0
     .container-1000-wide   100%, max-width 1000px, centred
     .section-pillar-intro > .padding-vertical.padding-huge  6rem; 991: 5rem; 767: 3.5rem
     .section-pillar-highlight-points  bg #f8f3ef, margin 8rem 0 4rem, inner
                         padding-huge
     .section-pillar-image  margin-top 2rem; .image-wrapper-16-9(-2) padding-top
                         56.25%, relative; img absolute cover
     .margin-top.margin-medium > .button-row  2rem; 767: 1.5rem
     .section-cta-book-a-call  container-medium, padding-vertical padding-large
                         (3rem; 991: 2.5rem; 767: 2rem), centred heading-small,
                         text-size-medium, cocoa button under margin-medium
     .comparison-table   margin-top 5rem; 991: hidden (a .table9 twin with
                         min-width 72rem scrolls instead)
     .pricing21_top-row  grid 1.5fr 1fr 1fr 1fr 1fr 1fr, bg #fff, border-top
                         1px #00000040, border-bottom 1px #13131340, sticky top 5rem
     .pricing21_empty-space  padding 2rem 2rem 0 0
     .pricing21_top-row-content  border-left 1px #13131340, padding 2rem 1.2rem,
                         600, centred column with .5rem gaps
     .pricing21_heading-row  bg #eee, padding 1rem 0 1rem 1rem, .heading-xsmall
     .pricing21_row      border-bottom 1px #13131340
     .pricing21_feature  padding 1rem 1.5rem 1rem 0, .875rem / 600
     .pricing21_row-content  centred, border-left 1px #13131340, padding
                         .8rem .9rem, .875rem / 400; .is-grey bg #f7f7f7
     .icon-1x1-xsmall    1.5rem (check); .is-red 1.25rem wide, #b12224 (cross)
     .blogpost_content   max-width 50rem; 991: order -9999, margin-bottom 3rem;
                         767: 2rem. Its sections keep their own 5% page-padding.

   Deviations, on purpose:
   - cl-base's .cl-richtext has its own heading and list margins; the export's
     .text-rich-text values are restated here under .cl-main-page__body so the
     bodies measure against their source.
   - The comparison grid ships twice in the export (pricing21 for desktop,
     table9 for tablets). Here it is one semantic <table class="cl-compare">
     that scrolls below 992px.
   - The legal page's tablet text-align: center (the padding-xhuge combo leak)
     is not reproduced; the document stays left-aligned.

   Not from the export: min-width 0 on the grid children and overflow-wrap on
   the text blocks. The export's copy never met a token wide enough to matter;
   the legal document's pasted LinkedIn URL (58 characters, no break
   opportunity) did, and it pushed the page 23px wide at 320. Both are scoped
   here, not pushed into cl-base.css. The one vw left in this file is the pillar
   band's full-bleed, which .cl-main-page.is-pillar clips; see the note there.

   Open, and the same as the export: above 767 a CMS table is a plain <table>
   with no scroller (the export only makes it `display: block; overflow: auto`
   at 767 and below, and .cl-compare at 991 and below). A cell holding a single
   token wider than its share of the column therefore still widens the page at
   991 and 1440. No content in the theme does; a 63-character token injected
   into one cell of the four-column table on the Wissenswertes body does, by
   56px at 991. Closing it needs a scroll wrapper around each table, which moves
   the table's block margins out of the collapsing they do now: measured at
   13 probes and +28px on the pillar page, so it is left for a measured change
   of its own rather than taken here.
   ========================================================================== */

.cl-main-page__extra-pad { height: 4rem; }

/* --------------------------------------------------------------------------
   Body copy: the export's .text-rich-text on top of cl-base's .cl-richtext
   -------------------------------------------------------------------------- */

.cl-main-page .cl-richtext h2 { margin: 1.5rem 0 1rem; font-family: var(--cl-font-heading); font-size: 2.25rem; font-weight: 400; line-height: 1.2; }
.cl-main-page .cl-richtext h3 { margin: 1.5rem 0; font-family: var(--cl-font-body); font-size: 1.375rem; font-weight: 400; line-height: 1.2; }
.cl-main-page .cl-richtext h4 { margin: 1.5rem 0 1.25rem; font-size: 1rem; font-weight: 600; line-height: 1.3; }
.cl-main-page .cl-richtext h5 { margin: 1.25rem 0 1rem; font-size: 1.5rem; font-weight: 700; line-height: 1.4; }
.cl-main-page .cl-richtext h6 { margin: 1.25rem 0 1rem; font-size: 1.25rem; font-weight: 700; line-height: 1.4; }
.cl-main-page .cl-richtext p { margin: 0 0 .5rem; }
.cl-main-page .cl-richtext ul { margin: 1rem 0; padding-left: 1.25rem; }
.cl-main-page .cl-richtext ol { margin: 1rem 0; padding-left: 2.5rem; }
.cl-main-page .cl-richtext li { margin-bottom: .5rem; }
.cl-main-page .cl-richtext li:last-child { margin-bottom: 0; }
.cl-main-page .cl-richtext blockquote { margin: 1.5rem 0; }
.cl-main-page .cl-richtext a { text-decoration: underline; text-underline-offset: auto; }
.cl-main-page .cl-richtext img { margin: 0; height: auto; }

.cl-main-page .cl-richtext figure { position: relative; max-width: 60%; margin: 3rem 0; }
.cl-main-page .cl-richtext figure img { width: 100%; }
.cl-main-page .cl-richtext figure > div { display: inline-block; font-size: 0; color: transparent; }
.cl-main-page .cl-richtext figure.w-richtext-figure-type-image { display: table; }
.cl-main-page .cl-richtext figure.w-richtext-figure-type-image > figcaption { display: table-caption; caption-side: bottom; }
.cl-main-page .cl-richtext figure.w-richtext-figure-type-video { width: 60%; height: 0; }
.cl-main-page .cl-richtext figure.w-richtext-figure-type-video > div { width: 100%; }
.cl-main-page .cl-richtext figure.w-richtext-figure-type-video iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: 0; }
.cl-main-page .cl-richtext figure.w-richtext-align-center { margin-left: auto; margin-right: auto; clear: both; }
.cl-main-page .cl-richtext figure.w-richtext-align-center > div { max-width: 100%; }
.cl-main-page .cl-richtext figure.w-richtext-align-normal { clear: both; }
.cl-main-page .cl-richtext figure.w-richtext-align-fullwidth { width: 100%; max-width: 100%; text-align: center; clear: both; display: block; margin-left: auto; margin-right: auto; }
.cl-main-page .cl-richtext figure.w-richtext-align-fullwidth > div { display: inline-block; padding-bottom: inherit; }
.cl-main-page .cl-richtext figure.w-richtext-align-fullwidth > figcaption { display: block; }
.cl-main-page .cl-richtext figcaption { opacity: .8; text-align: left; border-left: 2px solid #000; margin-top: .5rem; padding-left: .5rem; font-size: .875rem; }

/* .table_component: the styleguide table, applied to any table in a body.
   A table sizes its columns from its cells' min-content width, and `anywhere`
   is the one wrapping mode that changes min-content. Inside a table it would
   re-balance every column and change the table's height, and it squashed the
   migrated comparison table to the column width instead of letting it scroll.
   `break-word` breaks the same long words at layout time but leaves intrinsic
   sizing alone, so tables keep the export's columns and a wide one stays wide
   inside its scroller. */
.cl-main-page .cl-richtext table { display: table; width: 100%; max-width: 100%; margin: 1.75rem 0; border-collapse: collapse; overflow: visible; overflow-wrap: break-word; }
.cl-main-page .cl-richtext th { text-align: left; border: 1px solid #000; padding: .45rem; font-weight: 700; }
.cl-main-page .cl-richtext td { border: 1px solid #000; padding: .25rem .45rem; }
.cl-main-page .cl-richtext tbody { font-size: .875rem; }

/* --------------------------------------------------------------------------
   Wissenswertes: the grid, the aside, the content column
   -------------------------------------------------------------------------- */

/* .padding-top.padding-xhuge is 7rem at every width in the export: the combo
   rule (two classes) outranks the one-class breakpoint steps of .padding-xhuge,
   so the header never drops to 6rem / 4rem like the scale does. Reproduced,
   because the live page renders it. */
/* Round seventeen: less air under the nav. The export stacked a 4rem
   header pad (for a fixed nav this theme does not have: the nav is sticky and
   in flow), 7rem of section padding and the grid's 3rem top margin, 14rem
   before the title. The client asked for less: the pad is gone on this layout
   and the section keeps 6rem, then 5rem and 4rem down the breakpoints. */
.cl-main-page.is-resources .cl-main-page__extra-pad { height: 0; }
.cl-main-page.is-resources .padding-top.padding-xhuge { padding-top: 6rem; }
.cl-main-page.is-resources .cl-main-page__grid { margin-top: 0; }

.cl-main-page__grid {
  display: grid;
  grid-template-columns: minmax(20rem, 20rem) 1fr;
  grid-template-rows: auto;
  column-gap: 3rem;
  row-gap: 3rem;
  place-items: start;
  width: 100%;
  margin-top: 3rem;
  margin-bottom: 3rem;
}
.cl-main-page__aside {
  display: flex;
  flex-direction: column;
  justify-content: flex-start;
  align-items: flex-start;
  row-gap: 2rem;
  column-gap: 2rem;
  position: sticky;
  top: 12rem;
}
.cl-main-page__aside.is-gap { row-gap: 1rem; column-gap: 1rem; color: var(--cl-cocoa); }
.cl-main-page__content { width: 100%; min-width: 0; }
/* Round twenty: no aside (share row off, no H2 to list): one track instead of
   the 20rem aside column plus an empty gutter, the reading measure centred in
   it the way the legal layout centres its column. */
.cl-main-page__grid.is-solo { grid-template-columns: minmax(0, 1fr); justify-items: center; }
/* EU round: the section now decides the aside from what it would hold (share
   row on, or at least one contents entry), so a text-article page with
   neither runs solo; the column is centred by its own margins too, in case
   the track is ever not a grid. */
.cl-main-page__grid.is-solo > .cl-main-page__content { margin-left: auto; margin-right: auto; }
/* Not from the export. The aside is the grid's other child and holds whole
   heading texts in its table of contents; a grid or flex child is floored at
   its own min-content width unless min-width says otherwise. */
.cl-main-page__aside { min-width: 0; }
/* A German compound or a pasted URL is one word to the line breaker and would
   run out of the column whatever the container does. `anywhere` only adds break
   opportunities where a word does not fit, so ordinary wrapping is untouched.
   No hyphens: auto, the page is lang="de" and Chrome would re-break the ported
   copy and move every text probe. */
.cl-main-page__title,
.cl-main-page__sub,
.cl-main-page__body,
.cl-main-page__legal,
.cl-main-page__toc-heading,
.cl-main-page__toc-link,
.cl-main-page__share,
.cl-main-page__cta-head,
.cl-main-page__banner-title,
.cl-main-page__banner-copy { overflow-wrap: anywhere; }
.cl-main-page__content.is-smaller,
.cl-main-page__content.is-blogpost { max-width: 50rem; }

/* .margin-bottom.margin-medium resolves to 20px at desktop (the stock
   .margin-bottom beats the size class), 1.5rem from 767 */
.cl-main-page__title,
.cl-main-page__sub { margin-bottom: 20px; }
.cl-main-page .subheading-small { opacity: 1; font-size: 1.375rem; font-weight: 400; line-height: 1.4; }

/* share row */
.cl-main-page__share { display: flex; flex-direction: column; align-items: flex-start; row-gap: .8rem; }
.cl-main-page__share p { opacity: 1; }
.cl-main-page__share-list {
  display: grid;
  grid-auto-flow: column;
  grid-template-columns: max-content;
  grid-auto-columns: 1fr;
  column-gap: 16px;
  row-gap: .5rem;
  justify-items: start;
}
.cl-main-page__share-link {
  background-color: var(--cl-light-grey);
  border: 0;
  border-radius: 20px;
  align-items: center;
  padding: .25rem;
  display: flex;
  color: inherit;
  cursor: pointer;
  font: inherit;
  text-decoration: none;
}
.cl-main-page__share-link.is-copy { position: relative; text-align: start; }
/* .w-inline-block */
.cl-main-page__share-link,
.cl-main-page__toc-link { max-width: 100%; }
.cl-main-page__share-icon { flex: none; flex-direction: column; justify-content: center; align-items: center; width: 1.5rem; height: 1.5rem; display: flex; }
.cl-main-page__share-icon svg { width: 100%; height: 100%; }
.cl-main-page__copied {
  opacity: 0;
  color: var(--cl-ink-65);
  background-color: #fff;
  border-radius: .4rem;
  padding: .2rem;
  display: flex;
  align-items: center;
  position: absolute;
  top: -2rem;
  left: -1rem;
  box-shadow: 0 1px .4rem #00000040;
  white-space: nowrap;
  pointer-events: none;
  transition: opacity .2s;
}
/* Round seventeen: no bubble. The link glyph swaps to a green tick and the
   pill tints to match while .is-copied is on; the status span is the live
   region for screen readers and is never drawn. */
.cl-main-page__copied { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
.cl-main-page__share-link.is-copy { transition: background-color .2s ease; }
.cl-main-page__icon-check { display: none; }
.cl-main-page__share-link.is-copied { background-color: #00433f1a; }
.cl-main-page__share-link.is-copied .cl-main-page__icon-link { display: none; }
.cl-main-page__share-link.is-copied .cl-main-page__icon-check { display: block; color: var(--cl-terra); }

/* table of contents */
.cl-main-page__toc {
  display: flex;
  flex-direction: column;
  justify-content: flex-start;
  align-items: stretch;
  row-gap: 1rem;
  column-gap: 1rem;
  width: 100%;
  color: var(--cl-dark-red);
  background-color: var(--cl-white);
  border-radius: .5rem;
}
.cl-main-page__toc-heading { color: var(--cl-black); font-family: var(--cl-font-heading); font-size: 1.125rem; }
.cl-main-page__toc-heading.is-red { color: var(--cl-dark-red); }
.cl-main-page__toc-list { display: grid; grid-template-columns: 1fr; grid-auto-columns: 1fr; row-gap: .75rem; column-gap: .75rem; }
.cl-main-page__toc-item { display: flex; justify-content: space-between; align-items: flex-start; width: 100%; column-gap: 1rem; row-gap: 1rem; color: var(--cl-dark-red); }
.cl-main-page__toc-link {
  position: relative;
  display: flex;
  flex-direction: row;
  justify-content: flex-start;
  align-items: center;
  column-gap: .5rem;
  row-gap: .5rem;
  width: 100%;
  color: var(--cl-black);
  margin: 0;
  padding: .375rem .5rem;
  border-radius: .375rem;
  font-weight: 400;
  text-decoration: none;
  transition: padding-left .25s cubic-bezier(.2, 0, 0, 1), color .2s ease, background-color .2s ease;
}
/* Round seventeen: the current entry (and the hovered one) steps in and a
   short rule draws from the left to meet it; the grey ground stays, the
   bottom border the export had is gone.
   Round twenty: the rule sat at 50% of the link, so on an entry that wraps
   to two lines it floated in the gap between them. It now sits on the first
   line, at the middle of its x-height (the .375rem top padding plus .65em of
   the 1.5 line box), and keeps .75rem to the text: 1rem of rule from .5rem in,
   so the indented padding is 2.25rem. */
.cl-main-page__toc-link::before {
  content: "";
  position: absolute;
  left: .5rem;
  top: calc(.375rem + .65em);
  width: 0;
  height: 1px;
  background-color: var(--cl-dark-red);
  transition: width .25s cubic-bezier(.2, 0, 0, 1);
}
.cl-main-page__toc-link:hover,
.cl-main-page__toc-link.is-current { color: var(--cl-dark-red); background-color: #f5f4f49e; padding-left: 2.25rem; }
.cl-main-page__toc-link:hover::before,
.cl-main-page__toc-link.is-current::before { width: 1rem; }
/* the nav is sticky, so a jump has to land under it, not behind it */
.cl-main-page__body h2[id] { scroll-margin-top: calc(var(--cl-nav-h, 6.5rem) + 1.5rem); }

/* the phone contents list: a closed details under the title, below 992 only */
.cl-main-page__toc-mobile { display: none; }
.cl-main-page__toc-mobile-head {
  display: flex;
  justify-content: space-between;
  align-items: center;
  column-gap: 1rem;
  padding: 1rem 1.25rem;
  color: var(--cl-black);
  font-family: var(--cl-font-heading);
  font-size: 1.125rem;
  cursor: pointer;
  list-style: none;
}
.cl-main-page__toc-mobile-head::-webkit-details-marker { display: none; }
.cl-main-page__toc-mobile-head:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: 2px; }
.cl-main-page__toc-mobile-icon { flex: none; width: .75rem; height: .5rem; color: var(--cl-cocoa); transition: transform .2s ease; }
.cl-main-page__toc-mobile-icon svg { width: 100%; height: 100%; display: block; }
.cl-main-page__toc-mobile[open] .cl-main-page__toc-mobile-icon { transform: rotate(180deg); }
.cl-main-page__toc-mobile .cl-main-page__toc-list { padding: 0 1rem 1rem; }
@media (prefers-reduced-motion: reduce) {
  .cl-main-page__toc-link, .cl-main-page__toc-link::before, .cl-main-page__toc-mobile-icon { transition: none; }
}

/* ad banner (.ad-banner_component), placed by its token */
.cl-main-page__banner {
  display: flex;
  justify-content: flex-start;
  align-items: center;
  column-gap: 1rem;
  row-gap: 1rem;
  width: 100%;
  max-width: 100%;
  margin-top: 1.75rem;
  margin-bottom: 1.75rem;
  padding: 1.5rem;
  color: var(--cl-white);
  background-color: var(--cl-cocoa);
  border: 1px solid #251f2000;
  border-radius: .5rem;
  text-decoration: none;
  position: relative;
  overflow: hidden;
  transition: transform .2s;
}
.cl-main-page .cl-richtext a.cl-main-page__banner { text-decoration: none; color: var(--cl-white); }
.cl-main-page__banner:hover { border-color: var(--cl-ink-50); transform: translate(0, -.25rem); }
.cl-main-page__banner.is-inverted,
.cl-main-page .cl-richtext a.cl-main-page__banner.is-inverted { color: var(--cl-cocoa); background-color: var(--cl-white); border: 1px solid var(--cl-ink-50); }
.cl-main-page__banner.is-inverted:hover { background-color: var(--cl-light-grey); }
.cl-main-page__banner-text { display: block; max-width: 30rem; }
.cl-main-page__pill {
  display: inline;
  color: var(--cl-cocoa);
  background-color: #ffffff94;
  border-radius: .25rem;
  padding: .25rem .65rem;
  font-size: .75rem;
  font-weight: 400;
  line-height: 1.4;
  text-transform: uppercase;
}
.cl-main-page__pill.is-inverted { background-color: var(--cl-nimbus); }
.cl-main-page__banner-title { display: block; margin-top: .5rem; margin-bottom: .75rem; font-size: 1.25rem; font-weight: 600; line-height: 1.25; }
.cl-main-page__banner-copy { display: block; }
.cl-main-page .cl-main-page__banner-image { display: inline-block; width: 10rem; position: absolute; top: auto; left: auto; right: 7%; margin: 0; }
.cl-main-page__banner-media { display: block; width: 20rem; height: 100%; min-height: 11.4rem; position: absolute; inset: 0 0 auto auto; }
.cl-main-page__banner-gradient { display: block; background-image: linear-gradient(93deg, var(--cl-cocoa), #fff0); width: 100%; position: absolute; inset: 0 auto 0 0; }
.cl-main-page__banner-arrow {
  display: flex;
  justify-content: center;
  align-items: center;
  width: 1.5rem;
  height: 1.5rem;
  color: var(--cl-black);
  background-color: var(--cl-nimbus);
  position: absolute;
  inset: 0 0 auto auto;
}
.cl-main-page__banner-arrow.is-inverted { color: #fff; background-color: var(--cl-cocoa); }
.cl-main-page__banner-arrow-icon { display: flex; flex-direction: column; justify-content: center; align-items: center; width: 1rem; height: 1rem; }
.cl-main-page__banner-arrow svg { width: 1rem; height: 1rem; }

/* --------------------------------------------------------------------------
   Legal
   -------------------------------------------------------------------------- */

.cl-main-page.is-legal .cl-main-page__head { margin-bottom: 20px; text-align: left; }
.cl-main-page.is-legal .cl-main-page__title.is-legal { margin-bottom: 20px; }
.cl-main-page.is-legal .cl-main-page__legal { text-align: left; }
.cl-main-page__meta { display: flex; justify-content: space-between; align-items: flex-end; width: 100%; }
.cl-main-page__updated { display: flex; align-items: center; text-transform: uppercase; font-weight: 500; }
.cl-main-page__date { display: flex; margin-left: .4rem; }

/* --------------------------------------------------------------------------
   Pillar
   -------------------------------------------------------------------------- */

.cl-main-page.is-pillar { padding-top: 2.5rem; padding-bottom: 2.5rem; overflow-x: clip; }
.cl-main-page.is-pillar.has-aside { padding-top: 0; padding-bottom: 0; }
.cl-main-page__column { display: flow-root; width: 100%; max-width: 1000px; margin-left: auto; margin-right: auto; }
/* .blogpost_content: its sections keep a 5% gutter and 2.5rem of padding inside the 50rem column */
.cl-main-page__content.is-blogpost .cl-main-page__column { padding: 2.5rem 5%; }

/* the intro (.section-pillar-intro): padding-huge above and below the text,
   minus the 2.5rem the column already starts with, plus the stock 20px of the
   .margin-bottom wrapper under it */
.cl-main-page .cl-richtext .cl-lead { font-size: 1.375rem; font-weight: 400; line-height: 1.4; margin: 3.5rem 0 calc(6rem + 20px); }

/* the highlight band (.section-pillar-highlight-points), bled to the viewport
   edges; 8rem above, and the 4rem below plus the 2.5rem the next text section
   starts with. After the intro the two gaps add up (margins would collapse). */
/* The one vw in this file. The band bleeds from a column that is capped at
   1000px, so its width is not a fixed fraction of the viewport and the
   percentage breakout cl-faq.css and cl-main-blog.css use cannot express it.
   50vw counts a classic scrollbar the layout viewport does not have, so the
   bleed overshoots each edge by half of it; .cl-main-page.is-pillar above sets
   overflow-x: clip, which swallows the overshoot and keeps it off the document.
   Clip, not hidden or auto: it does not make a scroll container, so the sticky
   aside still sticks. Verified at 1440 / 991 / 767 / 479 / 390 / 320 with and
   without a classic scrollbar. */
.cl-main-page .cl-richtext .cl-band {
  background-color: var(--cl-lucidity);
  margin: 8rem calc(50% - 50vw) 6.5rem;
  padding: 6rem calc(50vw - 50%);
}
.cl-main-page .cl-richtext .cl-lead + .cl-band { margin-top: calc(5rem + 20px); }
.cl-main-page .cl-richtext .cl-band > :first-child { margin-top: 0; }
.cl-main-page .cl-richtext .cl-band > :last-child { margin-bottom: 0; }

/* .section-pillar-image: 2rem after the 2.5rem the text section ends with, 2.5rem before the next */
.cl-main-page .cl-richtext figure.cl-figure {
  display: block;
  width: 100%;
  max-width: none;
  margin: 4.5rem 0 2.5rem;
  padding-top: 56.25%;
  position: relative;
}
.cl-main-page .cl-richtext figure.cl-figure > a,
.cl-main-page .cl-richtext figure.cl-figure > img { display: block; position: absolute; inset: 0; width: 100%; height: 100%; }
.cl-main-page .cl-richtext figure.cl-figure img { object-fit: cover; }

/* "mehr erfahren": .margin-top.margin-medium > .button-row */
.cl-main-page .cl-richtext .cl-button { display: flex; flex-wrap: wrap; align-items: center; column-gap: 1rem; row-gap: 1rem; margin: 2rem 0 0; }
.cl-main-page .cl-richtext .cl-button a { text-decoration: none; }

/* inline call to action (.section-cta-book-a-call): its 3rem padding plus the 2.5rem of the sections around it */
.cl-main-page__cta { margin: 2.5rem 0; padding: 3rem 0; }
.cl-main-page__cta-head { margin-bottom: 0; }
/* .heading-small, restated because the body's h2 rule above outranks the class */
.cl-main-page .cl-richtext .cl-main-page__cta h2 { margin: 0 0 .5rem; font-size: 1.5rem; line-height: 1.4; }
.cl-main-page .cl-richtext .cl-main-page__cta p { margin-bottom: 0; }
.cl-main-page .cl-richtext .cl-main-page__cta a { text-decoration: none; }

/* buttons inside the body: the rich text's `a { color: inherit }` outranks .button */
.cl-main-page .cl-richtext a.button { color: var(--cl-white); }
/* Round thirteen: the button family holds its ink on hover and moves its
   ground instead, so the old label fade must not come back here. */
.cl-main-page .cl-richtext a.button.is-white { color: var(--cl-cocoa); }
.cl-main-page .cl-richtext a.button-secondary { color: var(--cl-black); }

/* comparison table (.pricing21_component). The 33px under it is an empty
   .pricing21_row.is-overview the export leaves after the grid: 2rem of top
   padding and a 1px transparent border. Reproduced, because it renders.
   Borders are single-sided (left and bottom of each cell), so the separate
   border model draws them like the grid's and lets the table carry padding. */
.cl-main-page .cl-richtext table.cl-compare {
  table-layout: fixed;
  border-collapse: separate;
  border-spacing: 0;
  margin: 5rem 0 0;
  padding: 0 0 33px;
  font-size: 1rem;
  border: 0;
}
.cl-main-page .cl-richtext .cl-compare th,
.cl-main-page .cl-richtext .cl-compare td { border: 0; vertical-align: middle; }
.cl-main-page .cl-richtext .cl-compare th:first-child,
.cl-main-page .cl-richtext .cl-compare td:first-child { width: 23.0769%; }
.cl-main-page .cl-richtext .cl-compare thead { position: sticky; top: 5rem; z-index: 2; background-color: var(--cl-white); }
.cl-main-page .cl-richtext .cl-compare thead th {
  border-top: 1px solid #00000040;
  border-bottom: 1px solid var(--cl-ink-25);
  border-left: 1px solid var(--cl-ink-25);
  padding: 2rem 1.2rem;
  font-weight: 600;
  text-align: center;
  vertical-align: top;
}
.cl-main-page .cl-richtext .cl-compare thead th:first-child { border-left: 0; padding: 2rem 2rem 0 0; }
.cl-main-page .cl-richtext .cl-compare thead th > * { display: block; margin: 0 auto; }
.cl-main-page .cl-richtext .cl-compare thead th > strong,
.cl-main-page .cl-richtext .cl-compare thead th > span { width: fit-content; max-width: 100%; }
.cl-main-page .cl-richtext .cl-compare thead th > * + * { margin-top: .5rem; }
.cl-main-page .cl-richtext .cl-compare thead th strong { font-weight: 600; }
.cl-main-page .cl-richtext .cl-compare thead th span { font-size: .875rem; font-weight: 400; }
.cl-main-page .cl-richtext .cl-compare tbody { font-size: inherit; }
.cl-main-page .cl-richtext .cl-compare tbody th { border-bottom: 1px solid var(--cl-ink-25); padding: 1rem 1.5rem 1rem 0; font-size: .875rem; font-weight: 600; text-align: left; }
.cl-main-page .cl-richtext .cl-compare tbody td { border-bottom: 1px solid var(--cl-ink-25); border-left: 1px solid var(--cl-ink-25); padding: .8rem .9rem; font-size: .875rem; font-weight: 400; text-align: center; }
.cl-main-page .cl-richtext .cl-compare tr.cl-compare__group th { background-color: var(--cl-nimbus); border-bottom: 1px solid #251f2000; padding: 1rem 0 1rem 1rem; font-family: var(--cl-font-heading); font-size: 1.25rem; font-weight: 400; line-height: 1.2; }
.cl-main-page .cl-richtext .cl-compare td.is-no { background-color: var(--cl-light-grey); border-left-color: #251f2000; }
.cl-main-page .cl-richtext .cl-compare td.is-yes > span,
.cl-main-page .cl-richtext .cl-compare td.is-no > span { display: block; font-size: 1.25rem; line-height: 1.5rem; }
.cl-main-page .cl-richtext .cl-compare td.is-no > span { color: var(--cl-dark-red); }

/* --------------------------------------------------------------------------
   Breakpoints
   -------------------------------------------------------------------------- */

@media screen and (max-width: 991px) {
  .cl-main-page__grid { display: flex; flex-direction: column-reverse; grid-template-columns: 1fr; }
  .cl-main-page__grid.is-solo { align-items: center; }
  .cl-main-page__aside,
  .cl-main-page__toc { width: 100%; position: relative; top: 0; }
  .cl-main-page.is-resources .padding-top.padding-xhuge { padding-top: 5rem; }
  /* the contents list moves up under the title (see .cl-main-page__toc-mobile) */
  .cl-main-page__aside .cl-main-page__toc { display: none; }
  .cl-main-page__toc-mobile { display: block; margin: 0 0 2rem; background-color: var(--cl-lucidity); border-radius: .75rem; }
  .cl-main-page__content.is-smaller,
  .cl-main-page__content.is-blogpost { margin-bottom: 3rem; }
  .cl-main-page__content.is-blogpost { order: -9999; }
  .cl-main-page.is-legal .cl-main-page__title.is-legal { margin-bottom: 2.5rem; }
  .cl-main-page__legal { margin-bottom: 3rem; }
  .cl-main-page .cl-richtext .cl-lead { margin-top: 2.5rem; margin-bottom: calc(5rem + 20px); }
  .cl-main-page .cl-richtext .cl-band { padding-top: 5rem; padding-bottom: 5rem; }
  .cl-main-page .cl-richtext .cl-lead + .cl-band { margin-top: calc(4.5rem + 20px); }
  .cl-main-page__cta { padding: 2.5rem 0; }
  /* the export swaps the grid for a scrolling twin with min-width 72rem */
  .cl-main-page .cl-richtext table.cl-compare { display: block; overflow-x: auto; }
  .cl-main-page .cl-richtext .cl-compare thead,
  .cl-main-page .cl-richtext .cl-compare tbody { display: table; width: 72rem; table-layout: fixed; }
  .cl-main-page .cl-richtext .cl-compare thead { position: static; }
  /* the feature column stays put while the brands scroll (.pricing21_feature at 991) */
  .cl-main-page .cl-richtext .cl-compare th:first-child { position: sticky; left: 0; z-index: 1; background-color: var(--cl-white); }
  .cl-main-page .cl-richtext .cl-compare tr.cl-compare__group th { position: sticky; left: 0; background-color: var(--cl-nimbus); }
}

@media screen and (max-width: 767px) {
  .cl-main-page.is-resources .padding-top.padding-xhuge { padding-top: 4rem; }
  .cl-main-page .cl-richtext figure { margin-top: 2.5rem; margin-bottom: 2.5rem; }
  /* the export's h5 / h6 element rules step down; .text-rich-text only sets their margins */
  .cl-main-page .cl-richtext h5 { font-size: 1.25rem; }
  .cl-main-page .cl-richtext h6 { font-size: 1.125rem; }
  .cl-main-page__title,
  .cl-main-page__sub,
  .cl-main-page.is-legal .cl-main-page__head { margin-bottom: 1.5rem; }
  .cl-main-page.is-legal .cl-main-page__title.is-legal, .cl-main-page__legal,
  .cl-main-page__content.is-smaller,
  .cl-main-page__content.is-blogpost { margin-bottom: 2rem; }
  .cl-main-page .cl-richtext .cl-lead { margin-top: 1rem; margin-bottom: calc(3.5rem + 20px); }
  .cl-main-page .cl-richtext .cl-band { padding-top: 3.5rem; padding-bottom: 3.5rem; }
  .cl-main-page .cl-richtext .cl-lead + .cl-band { margin-top: calc(4rem + 20px); }
  .cl-main-page .cl-richtext .cl-button { margin-top: 1.5rem; }
  .cl-main-page__cta { padding: 2rem 0; }
  .cl-main-page .cl-richtext .cl-main-page__cta h2 { font-size: 1.25rem; }
  /* .table_component on phones: block, each row a flex line, fixed cell widths */
  .cl-main-page .cl-richtext table:not(.cl-compare) { display: block; overflow: auto; }
  .cl-main-page .cl-richtext table:not(.cl-compare) thead { display: block; }
  .cl-main-page .cl-richtext table:not(.cl-compare) tbody { width: 100%; }
  .cl-main-page .cl-richtext table:not(.cl-compare) tr { display: flex; justify-content: flex-start; align-items: stretch; }
  .cl-main-page .cl-richtext table:not(.cl-compare) th { flex: none; width: 14rem; }
  .cl-main-page .cl-richtext table:not(.cl-compare) td { width: 14rem; }
  .cl-main-page__banner { flex-direction: column; justify-content: flex-start; align-items: flex-start; }
  .cl-main-page__banner-text { max-width: none; }
  .cl-main-page .cl-main-page__banner-image { display: none; bottom: -15%; }
  .cl-main-page__banner-media { width: 110%; height: 9rem; min-height: 9rem; margin-bottom: -1.5rem; margin-left: -1.5rem; position: relative; }
  .cl-main-page__banner-gradient { background-image: linear-gradient(var(--cl-cocoa), #fff0); }
}

@media screen and (max-width: 479px) {
  .cl-main-page .cl-richtext table:not(.cl-compare) td,
  .cl-main-page .cl-richtext table:not(.cl-compare) th { width: 11rem; }
  .cl-main-page__banner-media { width: 119%; }
  .cl-main-page__meta { flex-direction: column; align-items: flex-start; }
  .cl-main-page__updated { margin-bottom: 1rem; }
  .cl-main-page .cl-richtext .cl-button { flex-direction: column; align-items: stretch; }
}


/* cl-map.css */
/* ==========================================================================
   City map block. Port of section-map (infrarotkabine-hamburg.html): a
   .layout3_component.is--top-aligned two-column grid, copy on the left and
   .map-content-wrap on the right holding the .map-locations-grid.
   infrarotkabine-muenchen.html is the same section with an empty
   .map-content-wrap.

   Neither the export nor the live site puts a map element in
   .map-content-wrap (no iframe, no image, no CSS background): the block is a
   map by name only. The embed_url / map_image settings here are an addition;
   the geometry they add (a 4:3 frame above the location grid) is not from the
   export and the fixture leaves them empty so the probes measure the real
   thing.

   From the export:
     .section-map                   bg var(--lucid)
     .padding-vertical.padding-huge 6rem   991: 5rem   767: 3.5rem   (cl-base)
     .layout3_component             grid, column-gap 5rem, row-gap 4rem,
                                    grid-auto-flow column, auto-columns 1fr,
                                    align-items center
                                    991: column-gap 3rem, columns 1fr 1fr, flow row
                                    767: row-gap 3rem, columns 1fr
       .is--top-aligned             align-items start
     .layout3_content               no rules; a block
     .margin-bottom.margin-small    resolves to margin 0 on every side: the
                                    export's own `.margin-bottom.margin-small
                                    { margin-bottom: 0 }` beats the scale class.
                                    cl-base would give 1.5rem, so the head block
                                    carries its own class here.
     .pre-heading.is--light         = cl-base .pre-heading.is-light (4rem top
                                    margin kept, 1rem bottom, weight 300); it is
                                    an <h2> in the export, so line-height 1.2
     .text-rich-text p              margin-bottom .5rem (cl-richtext says 1rem,
                                    restated locally); last child 0
     .margin-top.margin-small       1.5rem   767: 1.25rem   (cl-base)
     .button-wrapper                inline-block, so the flex .button shrink-wraps
     .map-content-wrap              no rules
     .map-locations-grid            grid 1fr 1fr 1fr, column-gap 1.5rem, row-gap 1rem
                                    991: 1fr
     .map-location-wrap             font-size .9rem
   ========================================================================== */

.cl-map { background-color: var(--cl-lucid); }
.cl-map.is-lucidity { background-color: var(--cl-lucidity); }
.cl-map.is-white { background-color: var(--cl-white); }

/* .layout3_component.is--top-aligned */
.cl-map__component {
  display: grid;
  grid-template-columns: 1fr;
  grid-auto-columns: 1fr;
  grid-auto-flow: column;
  column-gap: 5rem;
  row-gap: 4rem;
  align-items: start;
}
.cl-map__component.is-reverse > .cl-map__content { order: 2; }

/* .margin-bottom.margin-small, which the export resolves to zero */
.cl-map__head { margin: 0; }
/* The export's eyebrow is an <h2 class="pre-heading">, so it sits on the
   heading line-height of 1.2 instead of the body's 1.5. A div here, same leading. */
.cl-map__head .pre-heading { line-height: 1.2; }

/* .text-rich-text p */
.cl-map .cl-richtext p { margin: 0 0 .5rem; }
.cl-map .cl-richtext > :last-child { margin-bottom: 0; }

/* .button-wrapper, and .w-inline-block on the button itself */
.cl-map__button-wrap { display: inline-block; }
.cl-map__button-wrap .button { max-width: 100%; }

/* Map frame: not in the export, see the header. */
.cl-map__embed {
  position: relative;
  width: 100%;
  padding-top: 75%;
  margin-bottom: 1.5rem;
  background-color: var(--cl-pumice);
  overflow: hidden;
}
.cl-map__embed iframe,
.cl-map__embed img { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; object-fit: cover; }

/* .map-locations-grid and .map-location-wrap */
.cl-map__locations {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  grid-auto-columns: 1fr;
  column-gap: 1.5rem;
  row-gap: 1rem;
}
.cl-map__location { font-size: .9rem; }
.cl-map__location p { margin: 0; }
.cl-map__location a { color: inherit; }

@media screen and (max-width: 991px) {
  .cl-map__component { column-gap: 3rem; grid-template-columns: 1fr 1fr; grid-auto-flow: row; min-height: auto; }
  .cl-map__locations { grid-template-columns: 1fr; }
}
@media screen and (max-width: 767px) {
  .cl-map__component { row-gap: 3rem; grid-template-columns: 1fr; }
  /* copy first again once the columns stack */
  .cl-map__component.is-reverse > .cl-map__content { order: 0; }
  /* .heading-medium opens its leading to 1.4 at 767 and closes it at 479 in
     the export; cl-base carries only the sizes */
  .cl-map .heading-medium { line-height: 1.4; }
}
@media screen and (max-width: 479px) {
  .cl-map__component { grid-template-columns: 1fr; }
  .cl-map .heading-medium { line-height: 1.2; }
}


/* cl-nav.css */
/* ==========================================================================
   Clearlight navigation.

   Values read from the export (navbar5), and what happened to each once the
   two stacked rows were collapsed into one:

     .nav-wrapper              fixed, z 1000, inset 0 0 auto        now sticky,
                                                                    see 1 below
     .navbar5_component        bg #fff, flex column, align center   the bar
                               767: min-height 4rem
     .navbar_top               bg light-grey, padding 1rem 5%       gone; the
                               991: padding 0                       single row
                                                                    carries the
                                                                    5% gutter
     .navbar5_container        space-between, align center,         page-padding
                               max-width 90rem, height 100%         > container-
                               991: column-reverse                  large, then
                                                                    a 1fr auto
                                                                    1fr grid
     .navbar5_logo-link        width 10rem, margin-bottom -4px      kept
                               .is-bigger 13rem, 767: 8rem
     .navbar5_menu             flex 1, centre, height 100%          the centre
                               991: absolute, 100vh drawer          zone; the
                                                                    overlay is
                                                                    separate
                                                                    markup
     .navbar5_menu-left        flex, gap 1rem   991: column         kept
     .navbar5_dropdown-toggle  flex, gap .4rem, space-around,       padding
                               padding 1rem .5rem, open bg #f4f4f4  .75rem 1rem
     .nav-text                 .75rem, 600, uppercase, ls .25px     .6875rem
     .navbar5_dropdown-list    width 100vw; open: absolute          replaced by
                               inset 7.5rem 0 auto, bg #fff         .cl-nav__stage
     .nav-dropdown_wrapper     bg lucidity, 100vw, space-around,    kept, sized
                               align start, padding-inline 5%       by the box
     .navbar5_dropdown-content-left   grid 1fr x3, col-gap 4rem,    content-
                                      min-width 30rem, pad 2rem     sized cols
     .navbar5_dropdown-content-right  flex column, max-width 18rem  19rem, white
     .navbar5_dropdown-link    grid, colour cocoa, border-bottom    kept; the
                               2px transparent, hover 1px cocoa     thumb row
                                                                    is new
     .navbar5_dropdown-link-list  grid, row-gap .4rem, start        kept
     .nav-small-headings       dark-red, 1rem, 400, ls .1px         kept
     .navbar5_blog-item        flex column, gap 1rem, py .5rem      kept
     .navbar5_blog-image-wrapper  100% wide, padding-top 66.66%     125% (4/5),
                                                                    radius 4px,
                                                                    per-block
                                                                    ratio + fit
     .nav-dropdown_contact-bar    flex column, gap 1rem, black      kept
     .menu-icon (991)          48x48 flex, three 24x2 bars          kept

   What is new, none of it from the export:

   1. Sticky, not fixed. The section root is position: sticky with top set
      to minus the utility strip's height (--cl-nav-strip-h, written in px
      by the section's script), so the strip scrolls away with the page and
      only the bar stays at the top. On Shopify the section sits in a
      .shopify-section wrapper, and a sticky box can only move inside its
      parent, so the same rule goes on that wrapper (:has). The nav takes
      normal-flow height, so .main-wrapper needs no padding-top to clear it.

   2. The panel box. .cl-nav__stage is absolute under the bar and repeats
      the row's page-padding > container-large chain, so .cl-nav__panels is
      the bar's content width plus a 1.5rem overhang each side (the logo and
      the CTAs sit inset in it) and every dropdown is the same width; only
      the box's height animates, to the active panel's. The first open grows
      the box from 0 (a top-to-bottom reveal of the white surface) while the
      rows rise into it; moving to a later toggle slides the panels right to
      left, an earlier one the reverse; a close fades the stage out. Rows
      stagger in 24ms apart, capped at 200ms.

   3. Thumbnail rows (.navbar5_dropdown-link.is-thumb): a 3.5rem square on
      pumice, the title beside it and a muted blurb under the title. Plain
      rows keep the underline style.

   4. The mobile overlay: fixed, inset 0, over the bar, with its own header
      row. It fades in (220ms) and the rows stagger top to bottom once, 25ms
      apart and capped at 220ms; drilling down only slides. A thumbs_N
      column's rows carry the 3rem photo and the blurb there too
      (.cl-nav__row.is-thumb, 2026-09-16).

   Round eighteen (client release feedback, 2026-08-27):

   5. The panels fit a MacBook without scrolling inside. The client saw every
      dropdown scroll at 1440x900 ("make it static fit"). The content was
      trimmed first (duplicates, showrooms, Dome, catalogue and legal rows are
      gone, see cl-nav.liquid), and the box is tighter: 1.5rem instead of 2rem
      of vertical inset in both columns, .25rem under a text row, the feature
      column's gap and the contact bar's top inset a step smaller, the model
      strip's tiles square instead of 5/6 and its rule closer to the columns.
      The tallest panel is now ~485px at 1440 against ~575px before (the
      feature column sets that floor: card, text, contact bar). The
      inner-scroll fallback (max-height, overflow-y auto) only applies below
      720px of viewport height, where a 13" window with the browser chrome
      lands; above that the panel is never a scroll container.

   6. "Some menu points break on hover": the row chevron (::after on the
      title, round sixteen) was an inline-block with a .35rem margin INSIDE
      the title's inline-block, so a title within ~10px of the column's 15rem
      cap ("Vergleich zu anderen Herstellern", "True Wave™ Infrarot
      Technologie", "E-Book zum besseren Saunieren") wrapped the invisible
      chevron onto a phantom second line: the row grew a blank line between
      title and blurb, and on hover the chevron slid in on that line, under
      the title. The chevron now takes no layout width (width .3rem with a
      -.3rem right margin, offset visually by .35rem), so it can never wrap
      on its own. And every text row is .is-blurb now, so the export's
      2px-transparent to 1px-drawn border swap on hover, which shifted the
      rows under a bare menu row by a pixel, has no row left to hit; the
      generic hover keeps the 2px transparent border regardless.

   7. No cart circle, no favourites heart, no favourites strip item, and the
      outline pill reads "Infos & Preise anfordern". The rules for those
      controls went with them.

   Breakpoints: 991, 767, 479, in that order, plus one desktop band the single
   row needs and the export did not: 992 to 1279, where the toggles close up
   so five German labels, the logo and the CTA share a 1152px container.
   ========================================================================== */

.cl-nav {
  /* ONE gutter for the overlay's header, panels and footer. .page-padding is
     5% site-wide and the bar's row uses that class, so every level of the
     nav lands on the logo's vertical. */
  --cl-nav-gutter: 5%;
  /* Round twenty: the same gutter in container units (.cl-nav__stack is the
     container, and the panels span it), for the phone panel's model slider:
     its scroll padding cannot take a percentage (that is of the scrollport)
     and its bleed has to match the panel's padding to the pixel. Keep the
     two figures together. */
  --cl-nav-gutter-cq: 5cqw;
  /* the strip's height; the script replaces this with the measured px */
  --cl-nav-strip-h: 2.125rem;

  position: sticky;
  top: calc(var(--cl-nav-strip-h) * -1);
  z-index: 1000;
  width: 100%;
}

/* Shopify wraps every section of a group in a div, and that wrapper, not the
   section root, is the child of .main-wrapper: it is the box that has to
   stick. The script writes --cl-nav-strip-h on it as well. The harness
   renders the section bare, which the rule above covers. */
.shopify-section:has(> .cl-nav) {
  position: sticky;
  top: calc(var(--cl-nav-strip-h, 2.125rem) * -1);
  z-index: 1000;
}

/* --- the bar --------------------------------------------------------------- */

.cl-nav__bar {
  position: relative;
  z-index: 2;
  width: 100%;
  background-color: var(--cl-white);
  box-shadow: 0 1px 0 var(--cl-ink-8);
}

/* The row is minmax(max-content,1fr) auto minmax(max-content,1fr): the
   centre track is the toggles' own width and the two side tracks split what
   is left, equally, so the centre is optically centred in the container.
   The max-content floor is what keeps three CTAs from overflowing their
   track and running under the toggles: when the right cluster needs more
   than its equal share it takes it, the left gives it up, and the toggles
   shift left a little instead of being overlapped. Column placement is
   explicit: the centre zone is display: none below 991, and a display: none
   grid item is not a grid item at all, so auto-placement would put the
   right-hand cluster into column 2 where it overlapped the logo. */
.cl-nav__bar-row {
  display: grid;
  grid-template-columns: minmax(max-content, 1fr) auto minmax(max-content, 1fr);
  align-items: center;
  column-gap: 1rem;
  padding: .75rem 0;
}
.cl-nav__zone { min-width: 0; }
.cl-nav__zone.is-left   { grid-column: 1; justify-self: start; display: flex; align-items: center; }
.cl-nav__zone.is-centre { grid-column: 2; justify-self: center; }
.cl-nav__zone.is-right  { grid-column: 3; justify-self: end; column-gap: .75rem; align-items: center; display: flex; }

.cl-nav .navbar5_logo-link {
  width: 10rem;
  margin-bottom: -4px;
  padding-left: 0;
  display: block;
  color: inherit;
  text-decoration: none;
}
.cl-nav .navbar5_logo-link.is-bigger { width: 13rem; }
.cl-nav .navbar5_logo-link img { width: 100%; height: auto; display: block; }

.cl-nav .navbar5_menu {
  justify-content: center;
  align-items: center;
  display: flex;
  position: static;
}

.cl-nav .navbar5_menu-left {
  column-gap: .25rem;
  justify-content: center;
  align-items: stretch;
  display: flex;
}

.cl-nav .navbar5_dropdown-toggle {
  column-gap: .375rem;
  justify-content: space-around;
  align-items: center;
  padding: .75rem .75rem;
  border-radius: .25rem;
  transition: background-color .15s;
  display: flex;
  appearance: none;
  background: none;
  border: 0;
  color: inherit;
  font: inherit;
  /* a <button> inherits text-align: center from the UA sheet; the export's
     toggle is a div, so it inherits left */
  text-align: left;
  white-space: nowrap;
  cursor: pointer;
  text-decoration: none;
}
.cl-nav .navbar5_dropdown-toggle:hover,
.cl-nav .navbar5_dropdown-toggle.is-open { background-color: var(--cl-light-grey); }
.cl-nav .navbar5_dropdown-toggle:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: -2px; }

/* The export sets .75rem. Five German labels at .75rem plus the logo and the
   CTA overrun a 1152px container; .6875rem closes the row at 1280. */
.cl-nav .nav-text {
  letter-spacing: .25px;
  text-transform: uppercase;
  font-size: .6875rem;
  font-weight: 600;
}

.cl-nav .dropdown-icon {
  width: .7rem;
  height: .7rem;
  flex: none;
  justify-content: center;
  align-items: center;
  display: flex;
}
.cl-nav .dropdown-icon svg { width: 100%; height: auto; display: block; transition: transform .2s ease; }
.cl-nav .navbar5_dropdown-toggle.is-open .dropdown-icon svg { transform: rotate(180deg); }

.cl-nav .button.is-navbar { white-space: nowrap; padding-inline: 1rem; }
/* the plain one is a <button> when it opens the contact drawer */
.cl-nav button.button.is-navbar { appearance: none; font-family: inherit; cursor: pointer; }
.cl-nav .button.cl-nav__cta { font-size: .75rem; letter-spacing: .5px; padding-inline: .875rem; }
.cl-nav .button.cl-nav__cta.is-plain { padding-inline: .75rem; }
.cl-nav .cl-nav__cta.is-mobile { display: none; }

/* What the row can hold. Five German toggles at full size are 740px, the
   logo 160, and container-large tops out at 1280, which leaves 348px for
   the CTA cluster: two pills (outline + filled, ~390px since round eighteen
   made the outline one "Infos & Preise anfordern") fit once the toggles
   close up, a third does not unless they close further (see the :has rule
   at 1440). Below 1440 the plain one goes, below 1340 the outline one (it
   was 1280 with "Jetzt kaufen"; measured at 1280 and 1300 the wider label
   ran the toggles into the logo); the filled one stays at every width.
   Scoped to .cl-nav so the rule outranks .cl .button's display: flex
   whatever the sheet order. */
@media screen and (max-width: 1439px) {
  .cl-nav .cl-nav__cta.is-plain { display: none; }
}
@media screen and (max-width: 1339px) {
  .cl-nav .cl-nav__cta.is-secondary { display: none; }
}
/* The optional plain CTA at 1440 and up: the toggles close up to make its
   ~130px, the same tightening the 992-1439 band applies unconditionally. */
@media screen and (min-width: 1440px) {
  .cl-nav__bar-row:has(.cl-nav__cta.is-plain) .navbar5_menu-left { column-gap: .25rem; }
  .cl-nav__bar-row:has(.cl-nav__cta.is-plain) .navbar5_dropdown-toggle { padding-inline: .625rem; column-gap: .3rem; }
}

/* --- scrim and stage ----------------------------------------------------- */

/* Fixed against the viewport and painted under the bar: z-index 1 against
   the bar's 2 inside the root's stacking context, so the strip above the
   bar is dimmed with the page while the bar and its panel stay clear. */
.cl-nav__scrim {
  position: fixed;
  inset: 0;
  z-index: 1;
  background-color: #ffffffbf;
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  opacity: 0;
  transition: opacity .3s ease;
}
.cl-nav__scrim[hidden] { display: none; }
.cl-nav__scrim.is-on { opacity: 1; }

/* The stage hangs off the bar's bottom edge and repeats the row's wrapper
   chain, so the panel box shares the row content's left and right edges. It
   is pointer-events: none itself: only the box is hoverable, so the gutters
   beside the panel count as outside for the hover intent and for clicks. */
/* The stage only fades; the reveal is the box below growing from the bar's
   bottom edge. The clip-path stops the box's shadow painting upwards over
   the bar, so bar and box read as one white surface. */
.cl-nav__stage {
  position: absolute;
  top: 100%;
  left: 0;
  right: 0;
  z-index: 3;
  pointer-events: none;
  opacity: 0;
  clip-path: inset(0 -6rem -6rem -6rem);
  transition: opacity .18s ease;
}
.cl-nav__stage[hidden] { display: none; }
.cl-nav__stage.is-open { opacity: 1; }

/* ONE box, every dropdown a sibling panel inside it. The height is written
   by the script from the active panel and animates: from 0 on the first
   open (the top-to-bottom reveal), and between panels afterwards. The box
   overhangs the container by --cl-nav-panel-out on each side, so the bar's
   logo and CTAs sit inset inside it rather than flush with its edges, and
   the container's own max-width is untouched. It is white like the bar and
   never scrolls itself: overflow hidden, so the height transition can never
   raise a scrollbar (which used to shrink the panel, rewrap it and leave the
   bar stuck). A panel taller than the viewport scrolls inside itself. */
.cl-nav {
  --cl-nav-panel-out: 1.5rem;
}
.cl-nav__panels {
  position: relative;
  height: 0;
  margin-inline: calc(var(--cl-nav-panel-out) * -1);
  overflow: hidden;
  pointer-events: auto;
  border-radius: 0 0 .75rem .75rem;
  background-color: var(--cl-white);
  box-shadow: 0 16px 40px var(--cl-ink-14), 0 2px 8px #251f200f;
  transition: height .3s cubic-bezier(.2, 0, 0, 1);
}

/* --- a panel ------------------------------------------------------------- */

.cl-nav__panel {
  /* the export's .navbar5_dropdown-list carried both of these and the shared
     box replaced it; without them the panel inherits .cl's 300 and the bar's
     uppercase, so every link in the dropdown rendered a weight light of the
     original */
  font-weight: 400;
  text-transform: none;
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  opacity: 0;
  transition: opacity .22s ease, transform .26s cubic-bezier(.2, 0, 0, 1);
}
/* Round eighteen: the inner-scroll fallback is for short windows only. At
   720px and up every panel fits by design (see 5 in the header), and a panel
   that is never a scroll container cannot show the scrollbar the client saw.
   Below that, the panel, not the box, is what scrolls when it outgrows the
   viewport, so the scrollbar sits inside the rounded card, and it never
   shows a bar. */
@media screen and (max-height: 719px) {
  .cl-nav__panel {
    max-height: calc(100vh - var(--cl-nav-h, 6.5rem) - 1rem);
    overflow-x: hidden;
    overflow-y: auto;
    overscroll-behavior: contain;
    scrollbar-width: none;
  }
  .cl-nav__panel::-webkit-scrollbar { display: none; }
}
.cl-nav__panel[hidden] { display: none; }
.cl-nav__panel.is-active  { z-index: 2; opacity: 1; transform: none; }
.cl-nav__panel.is-leaving { z-index: 1; }

/* entry and exit offsets, by direction of travel through the bar; the first
   open has no direction and only fades, under the stage's own slide */
.cl-nav__panel.is-entering { transition: none; }
.cl-nav__stage.is-forward .cl-nav__panel.is-entering { transform: translateX(2rem); }
.cl-nav__stage.is-back    .cl-nav__panel.is-entering { transform: translateX(-2rem); }
.cl-nav__stage.is-forward .cl-nav__panel.is-leaving  { transform: translateX(-2rem); }
.cl-nav__stage.is-back    .cl-nav__panel.is-leaving  { transform: translateX(2rem); }

.cl-nav .nav-dropdown_wrapper {
  justify-content: flex-start;
  align-items: stretch;
  display: flex;
}

.cl-nav .navbar5_dropdown-content { width: 100%; align-items: stretch; display: flex; }

/* Columns are content-sized: a thumbnail column is wider than a plain one,
   and when the three together overrun the space the wide ones give first
   (auto tracks grow from min-content together, the narrow one stops at its
   max-content). The count class is the number of groups the Liquid emitted. */
.cl-nav .navbar5_dropdown-content-left {
  flex: 1 1 auto;
  min-width: 0;
  column-gap: 2.5rem;
  row-gap: 0;
  justify-content: start;
  /* left inset = the box's overhang, so the first heading starts on the
     logo's vertical; 1.5rem of vertical inset since round eighteen (was 2) */
  padding: 1.5rem 2.5rem 1.5rem var(--cl-nav-panel-out);
  display: grid;
}
.cl-nav .navbar5_dropdown-content-left.is--1col { grid-template-columns: auto; }
.cl-nav .navbar5_dropdown-content-left.is--2col { grid-template-columns: repeat(2, auto); }
.cl-nav .navbar5_dropdown-content-left.is--3col { grid-template-columns: repeat(3, auto); }
/* with the model strip: the link columns take the first row and whatever
   height the feature column leaves, the strip sits on the foot of the box and
   spans every track. The trailing 1fr filler soaks up the free width so the
   auto columns stay content-sized, and because the strip crosses a flexible
   track its seven photos do not take part in sizing the auto ones. */
.cl-nav .navbar5_dropdown-content-left:has(> .cl-nav__models) { grid-template-rows: minmax(0, 1fr) auto; }
.cl-nav .navbar5_dropdown-content-left.is--1col:has(> .cl-nav__models) { grid-template-columns: auto minmax(0, 1fr); }
.cl-nav .navbar5_dropdown-content-left.is--2col:has(> .cl-nav__models) { grid-template-columns: repeat(2, auto) minmax(0, 1fr); }
.cl-nav .navbar5_dropdown-content-left.is--3col:has(> .cl-nav__models) { grid-template-columns: repeat(3, auto) minmax(0, 1fr); }

.cl-nav .navbar5_dropdown-link-list {
  row-gap: .4rem;
  grid-auto-rows: max-content;
  align-content: start;
  justify-items: start;
  min-width: 0;
  display: grid;
}
.cl-nav .navbar5_dropdown-link-list.has-thumbs { row-gap: .125rem; justify-items: stretch; }

.cl-nav .nav-small-headings-wrapper { margin-bottom: .3rem; }
.cl-nav .nav-small-headings {
  color: var(--cl-dark-red);
  letter-spacing: .1px;
  font-size: 1rem;
  font-weight: 400;
}

.cl-nav .navbar5_dropdown-link {
  color: var(--cl-cocoa);
  border-bottom: 2px solid transparent;
  align-items: flex-start;
  margin-bottom: .2rem;
  padding-top: .3rem;
  padding-bottom: .1rem;
  display: block;
  text-decoration: none;
}
/* The export drew a 1px cocoa border here on hover in place of the 2px
   transparent one, which moved every row below by a pixel. Round eighteen:
   the border is left alone at every state; the underline is the title's
   own pseudo-element (see the round sixteen block at the foot). */
.cl-nav .navbar5_dropdown-link:hover,
.cl-nav .navbar5_dropdown-link:focus-visible {
  border-bottom: 2px solid transparent;
  opacity: 1;
}

/* a text row (with or without a blurb since round eighteen): title over the
   muted second line, no photo */
.cl-nav .navbar5_dropdown-link.is-blurb {
  max-width: 15rem;
  margin-bottom: .25rem;
  padding-bottom: .2rem;
}
.cl-nav .navbar5_dropdown-link.is-blurb:hover,
.cl-nav .navbar5_dropdown-link.is-blurb:focus-visible { border-bottom-color: transparent; }
.cl-nav .navbar5_dropdown-link.is-blurb:hover .cl-nav__link-title,
.cl-nav .navbar5_dropdown-link.is-blurb:focus-visible .cl-nav__link-title { text-decoration: underline; text-underline-offset: .2em; }

/* the thumbnail row: square photo, title, muted blurb */
.cl-nav .navbar5_dropdown-link.is-thumb {
  grid-template-columns: 3.5rem minmax(0, 1fr);
  column-gap: .875rem;
  align-items: center;
  margin: 0 -.5rem;
  padding: .375rem .625rem .375rem .5rem;
  border: 0;
  border-radius: .375rem;
  display: grid;
  transition: background-color .15s ease;
}
.cl-nav .navbar5_dropdown-link.is-thumb:hover,
.cl-nav .navbar5_dropdown-link.is-thumb:focus-visible { border: 0; background-color: var(--cl-lucidity); }
.cl-nav .navbar5_dropdown-link.is-thumb:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: -2px; }

.cl-nav__thumb {
  width: 3.5rem;
  height: 3.5rem;
  border-radius: .25rem;
  background-color: var(--cl-pumice);
  overflow: hidden;
  flex: none;
  display: block;
}
.cl-nav .cl-nav__thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }

.cl-nav__link-text { min-width: 0; display: block; }
.cl-nav__link-title { line-height: 1.3; display: block; }
.cl-nav__link-blurb {
  margin-top: .125rem;
  font-size: .8125rem;
  line-height: 1.35;
  color: var(--cl-ink-65);
  display: block;
}

/* the feature column, on lucidity against the white box, with the contact
   bar pinned at its foot; its right inset is the box's overhang so the text
   ends on the CTA cluster's edge */
.cl-nav .navbar5_dropdown-content-right {
  flex: 0 0 20rem;
  flex-direction: column;
  justify-content: space-between;
  row-gap: 1.25rem;
  min-width: 0;
  /* 1.5rem top and bottom since round eighteen (was 2 / 1.75) */
  padding: 1.5rem var(--cl-nav-panel-out) 1.5rem 2rem;
  background-color: var(--cl-lucidity);
  display: flex;
}

.cl-nav .navbar5_dropdown-content-wrapper {
  grid-template-columns: 1fr;
  grid-auto-rows: max-content;
  row-gap: .875rem;
  width: 100%;
  display: grid;
}

.cl-nav .navbar5_blog-list-wrapper { color: var(--cl-black); }

.cl-nav .navbar5_blog-item {
  row-gap: .625rem;
  flex-direction: column;
  text-decoration: none;
  color: inherit;
  display: flex;
}

/* 4/5 portrait on pumice by default, 4px radius; the block's feature_ratio
   setting writes --cl-feature-ratio inline for artwork that is not portrait
   (the catalogue cover is 7:5, the eBook mockup 630x450). feature_fit writes
   --cl-feature-fit: artwork that carries type edge to edge, like the eBook
   covers, is set to contain so a ratio mismatch letterboxes on the pumice
   instead of cutting the title off. The image scales a touch on hover. */
.cl-nav .navbar5_blog-image-wrapper {
  width: 100%;
  padding-top: var(--cl-feature-ratio, 125%);
  border-radius: 4px;
  background-color: var(--cl-pumice);
  overflow: hidden;
  position: relative;
  display: block;
}
.cl-nav .navbar5_blog-image {
  object-fit: var(--cl-feature-fit, cover);
  width: 100%;
  height: 100%;
  position: absolute;
  inset: 0;
  transition: transform .4s ease;
}
.cl-nav .navbar5_blog-item:hover .navbar5_blog-image { transform: scale(1.03); }

/* the small link row under the image, "Clearlight Blog ->" */
.cl-nav__feature-row {
  align-items: center;
  column-gap: .5rem;
  font-size: .8125rem;
  font-weight: 500;
  letter-spacing: .25px;
  display: flex;
}
.cl-nav__feature-arrow { width: .875rem; height: .875rem; flex: none; transition: transform .2s ease; }
.cl-nav__feature-arrow svg { width: 100%; height: 100%; display: block; }
.cl-nav .navbar5_blog-item:hover .cl-nav__feature-arrow { transform: translateX(.125rem); }

.cl-nav .navbar5_large-item-content { flex-direction: column; justify-content: flex-start; display: flex; }
.cl-nav .cl-nav__feature-text { line-height: 1.4; color: var(--cl-ink-70); }

/* --- contact bar inside a panel ------------------------------------------ */

.cl-nav .nav-dropdown_contact-bar {
  column-gap: .75rem;
  row-gap: .625rem;
  color: var(--cl-black);
  flex-direction: column;
  padding-top: 1rem;
  border-top: 1px solid var(--cl-lucid);
  display: flex;
}
.cl-nav .nav-dropdown_contact-bar-info {
  column-gap: .4rem;
  align-items: center;
  display: flex;
  color: inherit;
  text-decoration: none;
}
.cl-nav .nav-dropdown_contact-bar-info:hover { text-decoration: underline; }
.cl-nav .icon-1x1-xsmall { width: 1.25rem; height: 1.25rem; flex: none; }
.cl-nav .icon-1x1-xsmall svg { width: 100%; height: 100%; display: block; }

/* --- the staggered reveal ------------------------------------------------ */

/* The whole content wrapper rises into the box as one piece (client,
   2026-08-25: the per-item stagger let column links land before their own
   heading). The --i counters the Liquid still writes are unused. A leaving
   panel keeps its content where it is: the panel itself slides and fades. */
.cl-nav__panel .navbar5_dropdown-content {
  opacity: 0;
  transform: translateY(.75rem);
  transition: opacity .22s ease .04s, transform .28s cubic-bezier(.2, 0, 0, 1) .04s;
}
.cl-nav__panel.is-active .navbar5_dropdown-content { opacity: 1; transform: none; }
.cl-nav__panel.is-leaving .navbar5_dropdown-content { opacity: 1; transform: none; transition: none; }

/* --- burger and overlay are hidden above 991 ----------------------------- */

.cl-nav__burger { display: none; }
.cl-nav__drawer { display: none; }

/* ==========================================================================
   992 to 1439: the container is 90% of the viewport, 893 to 1280px, and it
   has to hold the logo, five toggles and one or two CTA pills in one row.
   The toggles close up (padding .75rem .625rem, .25rem between them) and
   the logo drops to 8rem; the chevrons stay, they fit. The outline pill is
   shown from 1280 (container 1152: 128 + 620 + 296 + gaps), the filled one
   always.
   ========================================================================== */

@media screen and (min-width: 992px) and (max-width: 1439px) {
  .cl-nav .navbar5_logo-link { width: 8rem; }
  .cl-nav .navbar5_logo-link.is-bigger { width: 10rem; }
  .cl-nav .navbar5_menu-left { column-gap: .25rem; }
  .cl-nav .navbar5_dropdown-toggle { padding-inline: .625rem; column-gap: .3rem; }
  .cl-nav__bar-row { column-gap: .75rem; }
}

/* 992 to 1099: the container is under 990px, which the symmetric grid cannot
   close (each side track would have to hold the CTA in under 133px). The
   grid goes auto 1fr auto, so the toggles take whatever the logo and the CTA
   leave and centre themselves in it, the labels drop to .625rem and the
   chevrons go, as the export's own 1100 rule had it. */
@media screen and (min-width: 992px) and (max-width: 1099px) {
  .cl-nav__bar-row { grid-template-columns: auto minmax(0, 1fr) auto; }
  .cl-nav .cl-nav__zone.is-right { column-gap: 0; }
  .cl-nav .nav-text { font-size: .625rem; }
  .cl-nav .dropdown-icon { display: none; }
  .cl-nav .navbar5_dropdown-toggle { padding-inline: .5rem; column-gap: 0; }
}

/* ==========================================================================
   991 and below: no dropdown stage, no toggles. The bar is logo | outline CTA
   + burger, sticky at the very top (the strip is display: none here, so the
   sticky offset is 0), and everything else lives in the overlay.
   ========================================================================== */

@media screen and (max-width: 991px) {
  .cl-nav,
  .shopify-section:has(> .cl-nav) { top: 0; }

  /* The centre zone is gone at this width, so the symmetric 1fr auto 1fr
     would give each side an equal share it cannot fit in and the logo and
     the CTA cluster would meet in the middle. Left takes what it needs, the
     cluster takes the rest. */
  /* 48px burger + .5rem either side = the 4rem bar the export had at 767 */
  .cl-nav__bar-row {
    grid-template-columns: auto 0 minmax(0, 1fr);
    column-gap: .5rem;
    padding-block: .5rem;
  }
  .cl-nav .navbar5_menu { display: none; }
  .cl-nav__scrim,
  .cl-nav__stage { display: none !important; }

  .cl-nav__burger {
    flex-direction: column;
    justify-content: center;
    align-items: center;
    width: 48px;
    height: 48px;
    margin-right: -.75rem;
    display: flex;
    appearance: none;
    background: none;
    border: 0;
    cursor: pointer;
  }
  .cl-nav__burger:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: -4px; }
  .cl-nav__burger span { background-color: #000; width: 24px; height: 2px; display: block; }
  .cl-nav__burger .menu-icon_line-middle { margin-top: 6px; margin-bottom: 6px; }

  .cl-nav .button.is-navbar { font-size: .75rem; padding-inline: 1rem; }
  /* the bar's pill below 991 is the contact one; the filled quote pill lives
     in the drawer footer */
  .cl-nav .cl-nav__cta.is-primary { display: none; }
  .cl-nav .cl-nav__cta.is-mobile { display: flex; }
}

@media screen and (max-width: 767px) {
  .cl-nav .navbar5_logo-link { width: 8rem; }
  .cl-nav .button.is-navbar { padding-inline: .875rem; letter-spacing: .5px; }
}

@media screen and (max-width: 479px) {
  .cl-nav__zone.is-right { column-gap: .25rem; }
  .cl-nav .button.is-navbar { font-size: .6875rem; padding-inline: .75rem; }
  .cl-nav .navbar5_logo-link { width: 7rem; }
}

/* ==========================================================================
   Mobile overlay, 991 and below.

   Full screen: fixed, inset 0, white, over the bar (z 4 against the bar's 2
   inside the root's stacking context), no rounded corners. Its header row
   repeats the logo on the same gutter as the bar's, so opening reads as the
   bar staying put while the page underneath is replaced, and carries the
   region chip and the close button on the right.

   A drill-down rather than an accordion: level one is the top-level items,
   level two a dropdown's column headings, level three the links inside a
   heading. Panels are stacked absolutely and slide, so only the active one is
   in the tab order and the others are `hidden`. Three levels is the depth the
   export's data supports; a fourth would need a fourth link_list per
   dropdown, not more CSS.

   is-menu-open mounts the overlay, is-menu-in fades it in and releases the
   rows (top to bottom, 25ms apart, capped at 220ms), is-menu-out holds the
   rows still while the sheet fades out. Every level pads with the same
   --cl-nav-gutter the bar's .page-padding resolves to, so rows, back row,
   title, feature card and footer all start on the logo's vertical.
   ========================================================================== */

@media screen and (max-width: 991px) {
  .cl-nav__drawer {
    display: none;
    position: fixed;
    inset: 0;
    z-index: 4;
    flex-direction: column;
    background: var(--cl-white);
    opacity: 0;
    transition: opacity .22s cubic-bezier(.2, 0, 0, 1);
  }
  .cl-nav.is-menu-open .cl-nav__drawer { display: flex; }
  .cl-nav.is-menu-in .cl-nav__drawer { opacity: 1; }

  /* Round fifteen item 1. The bar's magnifier is gone on a phone: search is in
     the open menu, first thing, and one affordance is enough. */
  .cl-nav__search-field {
    appearance: none;
    display: flex; align-items: center; gap: .625rem;
    width: 100%;
    margin-bottom: .5rem;
    padding: .875rem 1rem;
    border: 1px solid transparent;
    border-radius: .625rem;
    background: var(--cl-ink-4);
    color: var(--cl-ink-60);
    font: inherit; font-size: .9375rem; line-height: 1.2;
    text-align: left;
    cursor: pointer;
  }
  .cl-nav__search-field svg { width: 1.0625rem; height: 1.0625rem; flex: none; opacity: .8; }
  .cl-nav__search-field:hover { background: #251f2012; }
  .cl-nav__search-field:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: 2px; }

  /* Round fifteen item 2 put a favourites heart (.cl-nav__head-fav) beside
     the region chip; round eighteen removed the favourites list, and its
     rules with it. */

  .cl-nav__drawer-head {
    flex: none;
    display: flex;
    align-items: center;
    justify-content: space-between;
    column-gap: .75rem;
    min-height: 4rem;
    padding: .5rem var(--cl-nav-gutter);
    box-shadow: 0 1px 0 var(--cl-ink-8);
  }
  .cl-nav__drawer-tools { display: flex; align-items: center; column-gap: .25rem; }

  /* the X glyph's right edge lands on the gutter, like the burger's bars */
  .cl-nav__close {
    appearance: none;
    background: none;
    border: 0;
    flex: none;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 48px;
    height: 48px;
    margin-right: -1rem;
    padding: 0;
    color: var(--cl-black);
    cursor: pointer;
  }
  .cl-nav__close svg { width: 1rem; height: 1rem; display: block; }
  .cl-nav__close:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: -4px; }

  .cl-nav__stack { position: relative; flex: 1; min-height: 0; overflow: hidden; }

  .cl-nav__panel-m {
    position: absolute;
    inset: 0;
    overflow-y: auto;
    -webkit-overflow-scrolling: touch;
    padding: .75rem var(--cl-nav-gutter) 2rem;
    background: var(--cl-white);
    transform: translateX(100%);
    transition: transform .28s cubic-bezier(.4, 0, .2, 1);
  }
  .cl-nav__panel-m[hidden] { display: none; }
  .cl-nav__panel-m.is-active { transform: translateX(0); }
  .cl-nav__panel-m.is-behind { transform: translateX(-30%); }
  .cl-nav__panel-m.is-ahead  { transform: translateX(100%); }
  /* entry positions, committed for one frame before the class is removed */
  .cl-nav__panel-m.is-entering      { transform: translateX(100%); transition: none; }
  .cl-nav__panel-m.is-entering-back { transform: translateX(-30%); transition: none; }

  /* .cl ul and .cl li in cl-base.css claim these at (0,1,1) with a 1.25rem
     left padding, which is what used to push the rows 20px past the logo;
     the scope prefix outranks it. */
  .cl .cl-nav__rows { list-style: none; margin: 0; padding: 0; }
  .cl .cl-nav__rows li {
    margin: 0;
    opacity: 0;
    transform: translateY(-.375rem);
    transition: opacity .2s ease, transform .2s cubic-bezier(.2, 0, 0, 1);
  }
  /* top to bottom, a small step each, and nothing waits past 220ms */
  .cl-nav.is-menu-in .cl-nav__rows li {
    opacity: 1;
    transform: none;
    transition-delay: min(220ms, calc(var(--i, 0) * 25ms));
  }
  /* on the way out only the sheet fades; the rows hold still under it */
  .cl-nav.is-menu-out .cl-nav__rows li { opacity: 1; transform: none; transition: none; }

  .cl-nav__row {
    appearance: none;
    background: none;
    border: 0;
    border-bottom: 1px solid var(--cl-ink-15);
    width: 100%;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    padding: 1.05rem 0;
    font: inherit;
    font-size: 1.125rem;
    color: inherit;
    text-align: left;
    text-decoration: none;
    cursor: pointer;
    transition: color .15s ease;
  }
  .cl-nav__row:active { color: var(--cl-dark-red); }
  .cl-nav__row:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: -2px; }
  .cl-nav__row.is-static {
    cursor: default;
    color: var(--cl-dark-red);
    font-size: 1rem;
    text-transform: uppercase;
    letter-spacing: .5px;
  }

  /* Thumbnail rows in the drawer (client, 2026-09-16): a column with
     thumbs_N on shows the same square photo the desktop panel shows, 3rem
     here, a 1rem gap, the title on one line and the muted blurb under it.
     The base row is space-between (title left, chevron right); this one
     packs from the left. Vertical padding drops to .75rem so a photo row
     stands about a line taller than a text row rather than two. The photo
     is the shared .cl-nav__thumb; only its size differs from desktop. */
  .cl-nav__row.is-thumb {
    justify-content: flex-start;
    gap: 1rem;
    padding: .75rem 0;
  }
  .cl-nav__row.is-thumb .cl-nav__thumb { width: 3rem; height: 3rem; }
  .cl-nav__row.is-thumb .cl-nav__link-text { flex: 1 1 auto; min-width: 0; }
  .cl-nav__row.is-thumb .cl-nav__link-title {
    display: block;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }
  .cl-nav__row.is-thumb .cl-nav__link-blurb {
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 2;
    overflow: hidden;
    font-size: .8125rem;
    color: var(--cl-ink-65);
  }

  .cl-nav__chev { flex: none; width: .5rem; height: .875rem; color: var(--cl-cocoa); opacity: .55; }
  .cl-nav__chev svg { width: 100%; height: 100%; display: block; }
  .cl-nav__chev.is-back { transform: rotate(180deg); opacity: 1; }

  .cl-nav__back {
    appearance: none;
    background: none;
    border: 0;
    display: flex;
    align-items: center;
    gap: .6rem;
    padding: .5rem 0 1rem;
    font: inherit;
    font-size: .875rem;
    letter-spacing: .5px;
    text-transform: uppercase;
    color: var(--cl-cocoa);
    cursor: pointer;
  }
  .cl-nav__back:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: 2px; }

  .cl-nav__panel-title {
    font-family: var(--cl-font-heading);
    font-size: 1.75rem;
    line-height: 1.2;
    margin-bottom: 1rem;
  }

  .cl-nav__feature {
    display: grid;
    grid-template-columns: 6rem 1fr;
    gap: 1rem;
    align-items: start;
    margin-top: 1.5rem;
    padding-top: 1.5rem;
    border-top: 1px solid var(--cl-lucid);
    color: inherit;
    text-decoration: none;
  }
  .cl-nav__feature img { width: 100%; height: auto; border-radius: 4px; display: block; }
  .cl-nav__feature > span { display: grid; row-gap: .35rem; }

  /* Pinned under the stack as a flex sibling, at every level. env() clears
     the iOS home indicator; max() keeps a real 1rem where there is no inset. */
  /* Round fifteen item 3: stacked and full width. Side by side, two German
     labels ("Angebot anfordern") each had half a phone and set their own type
     smaller than anything else in the drawer. */
  .cl-nav__drawer-foot {
    flex: none;
    display: grid;
    grid-auto-flow: row;
    row-gap: .625rem;
    padding: 1rem var(--cl-nav-gutter) max(1rem, env(safe-area-inset-bottom));
    background: var(--cl-white);
    border-top: 1px solid var(--cl-ink-15);
  }
  /* .cl .button sets min-width: 14.5rem below 767, which two side by side
     cannot honour on a 390 screen */
  .cl-nav__drawer-foot .button {
    min-width: 0;
    width: 100%;
    justify-content: center;
    padding-inline: .75rem;
  }
}

@media screen and (max-width: 479px) {
  .cl-nav__drawer-foot { column-gap: .5rem; }
  .cl-nav__drawer-foot .button { padding-inline: .5rem; letter-spacing: .5px; }
}

/* ==========================================================================
   Reduced motion: the end states stay, the transitions go.
   ========================================================================== */

@media (prefers-reduced-motion: reduce) {
  .cl-nav__scrim,
  .cl-nav__stage,
  .cl-nav__panels,
  .cl-nav__panel,
  .cl-nav__panel-m,
  .cl-nav__drawer,
  .cl .cl-nav__rows li,
  .cl-nav.is-menu-in .cl-nav__rows li,
  .cl-nav .navbar5_blog-image,
  .cl-nav .cl-nav__model-img,
  .cl-nav__feature-arrow,
  .cl-nav .dropdown-icon svg,
  .cl-nav__panel .navbar5_dropdown-content { transition: none; }
  .cl-nav.is-menu-in .cl-nav__rows li { transition-delay: 0s; }
}

/* The last row of a panel used to close with its own hairline right above
   the feature card's top border, or the pinned foot's (client, 2026-08-25:
   a double border under Erweiterungen). One line, never two. */
.cl-nav__rows > li:last-child > .cl-nav__row { border-bottom: 0; }
.cl-nav__panel-m > .cl-nav__rows:last-child > li:last-child > .cl-nav__row { border-bottom: 1px solid var(--cl-ink-15); }
.cl-nav__panel-m[data-cl-panel="root"] > .cl-nav__rows > li:last-child > .cl-nav__row { border-bottom: 0; }

/* --- search ---------------------------------------------------------------
   Round fifteen item 1: the bar's magnifier is gone. It only ever showed below
   992 (the strip carries "Suche" above that), and below 992 search is now the
   grey field at the top of the open menu. A control that is hidden at every
   width is not a control, so the button and its rules went with the ask. */

/* --- compare: the model strip under the link columns ---------------------- */
/* One link (the compare page) reading as a comparison: a caption on the left
   and one hairline-separated tile per sauna model, photo over a short name.
   No pill, no chevron, no bordered CTA; the hairlines are the only rule work,
   the same #3e303726 the thumb rows and mobile rows use. */
.cl-nav .cl-nav__models {
  grid-column: 1 / -1;
  align-self: end;
  align-items: stretch;
  /* round eighteen: 1rem / 1rem, was 1.5 / 1.25 */
  margin-top: 1rem;
  padding-top: 1rem;
  border-top: 1px solid var(--cl-ink-15);
  color: var(--cl-cocoa);
  text-decoration: none;
  min-width: 0;
  display: flex;
}
.cl-nav__models-lead {
  flex: 0 0 10rem;
  flex-direction: column;
  justify-content: center;
  row-gap: .25rem;
  padding-right: 1.25rem;
  display: flex;
}
.cl-nav__models-title { color: var(--cl-dark-red); font-size: 1rem; letter-spacing: .1px; line-height: 1.3; }
.cl-nav__models-sub { font-size: .8125rem; line-height: 1.35; color: var(--cl-ink-65); }
.cl-nav__models-row {
  flex: 1 1 auto;
  min-width: 0;
  grid-auto-flow: column;
  grid-auto-columns: minmax(0, 1fr);
  display: grid;
}
.cl-nav__model {
  min-width: 0;
  flex-direction: column;
  row-gap: .375rem;
  padding: .125rem .625rem;
  border-left: 1px solid var(--cl-ink-15);
  transition: background-color .15s ease;
  display: flex;
}
/* square since round eighteen (was 5/6): the renders are wider than tall
   once the white ground is counted, and the strip lost 18px */
.cl-nav__model-pic {
  aspect-ratio: 1;
  width: 100%;
  border-radius: .25rem;
  overflow: hidden;
  display: block;
}
/* the product photos are white-ground renders, so the whole sauna shows,
   uncropped, and the tile has no frame of its own */
.cl-nav .cl-nav__model-img {
  width: 100%;
  height: 100%;
  object-fit: contain;
  display: block;
  transition: transform .4s ease;
}
.cl-nav__model-name {
  font-size: .75rem;
  line-height: 1.3;
  color: var(--cl-ink-65);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  display: block;
}
.cl-nav .cl-nav__models:hover .cl-nav__models-title,
.cl-nav .cl-nav__models:focus-visible .cl-nav__models-title { text-decoration: underline; text-underline-offset: .2em; }
/* Round seventeen: the strip answers as a group. Hovering one tile lifts its
   photo and the other tiles step back (opacity down, a whisper of blur). The
   client asked for this HERE, on the dropdown's models, and not on the compare
   page, where round sixteen had put it. `:has()` on the row, no script, and
   only for pointers that can hover. */
.cl-nav .cl-nav__model:hover .cl-nav__model-img { transform: scale(1.04); }
@media (hover: hover) {
  .cl-nav__model { transition: background-color .15s ease, opacity .25s ease, filter .25s ease; }
  .cl-nav__models-row:has(.cl-nav__model:hover) .cl-nav__model:not(:hover) { opacity: .5; filter: blur(1px); }
}
@media (prefers-reduced-motion: reduce) {
  .cl-nav__models-row:has(.cl-nav__model:hover) .cl-nav__model:not(:hover) { filter: none; }
}
.cl-nav .cl-nav__models:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: 4px; }
/* 992 to 1279: the left box is under 700px, the names go, the lead narrows */
@media screen and (min-width: 992px) and (max-width: 1279px) {
  .cl-nav__models-lead { flex-basis: 9rem; padding-right: .875rem; }
  .cl-nav__models-sub { display: none; }
  .cl-nav__model { padding: .125rem .375rem; }
  .cl-nav__model-name { display: none; }
}
/* the phone panel: caption row, then the tiles as a slider.
   Round twenty (client, 2026-08-30): seven tiles squeezed into one row edge
   to edge were 46px thumbnails with no names. Now the row is a scroll-snap
   track, the shared slider's pattern (assets/cl-slider.css: snap, hidden
   scrollbar, smooth scroll) restated here without its arrow pill and its
   mouse-drag script, since this is the touch panel and the panel does not
   load cl-slider.css. 2.75 tiles show at the start, the track runs out to
   the panel's right edge, one snap per tile, the names back under the
   photos, the hairlines kept between the tiles.
   The bleed is the panel's own gutter, --cl-nav-gutter-cq (the stack is the
   size container the unit reads): the negative margin takes the track out
   to both panel edges, the matching padding keeps the first tile on the
   caption's vertical at rest and lets the last tile scroll up to the
   content edge, not the screen edge, and scroll-padding puts every snap
   point on that same vertical. A tile is (content width + one gutter) /
   2.75: two whole tiles and most of a third between the caption's left
   edge and the panel's right edge (4.75 on a tablet, below). A browser
   without cqw drops the four
   declarations that use it and the track scrolls inside the content box,
   still snapping. */
@media screen and (max-width: 991px) {
  .cl-nav__stack { container-type: inline-size; }
  .cl-nav .cl-nav__models.is-m {
    flex-direction: column;
    row-gap: .875rem;
    margin-top: 0;
    padding: 1.05rem 0 .25rem;
    border-top: 0;
    /* the feature card below brings its own top rule, so the strip carries
       none: two hairlines a row apart was the round-ten look being fixed */
    border-bottom: 0;
  }
  .cl-nav .cl-nav__models.is-m .cl-nav__models-lead { flex-basis: auto; padding-right: 0; row-gap: .125rem; }
  .cl-nav .cl-nav__models.is-m .cl-nav__models-title { color: var(--cl-cocoa); font-size: 1.125rem; }
  .cl-nav .cl-nav__models.is-m .cl-nav__models-row {
    --cl-nav-per-view: 2.75;
    --cl-nav-tile: calc((100% + var(--cl-nav-gutter-cq)) / var(--cl-nav-per-view));
    /* the first tile has no hairline and no left padding, so its column is
       narrower by exactly that: every photo is the same square and the
       seven names sit on one line */
    grid-template-columns: calc(var(--cl-nav-tile) - .625rem - 1px);
    grid-auto-columns: var(--cl-nav-tile);
    margin-inline: calc(-1 * var(--cl-nav-gutter-cq));
    padding-inline: var(--cl-nav-gutter-cq);
    scroll-padding-inline: var(--cl-nav-gutter-cq);
    scroll-behavior: smooth;
    overflow-x: auto;
    overflow-y: hidden;
    overscroll-behavior-x: contain;
    scroll-snap-type: x mandatory;
    scrollbar-width: none;
    -webkit-overflow-scrolling: touch;
  }
  .cl-nav .cl-nav__models.is-m .cl-nav__models-row::-webkit-scrollbar { display: none; }
  .cl-nav .cl-nav__models.is-m .cl-nav__model { padding: 0 .625rem; row-gap: .375rem; scroll-snap-align: start; }
  .cl-nav .cl-nav__models.is-m .cl-nav__model-pic { aspect-ratio: 1; }
  .cl-nav .cl-nav__models.is-m .cl-nav__model:first-child { border-left: 0; padding-left: 0; }
  .cl-nav .cl-nav__models.is-m .cl-nav__model-name { display: block; font-size: .8125rem; color: var(--cl-cocoa); }
  .cl-nav .cl-nav__models.is-m:active .cl-nav__models-title { color: var(--cl-dark-red); }
}
/* a tablet's panel is 600 to 991px wide: 2.75 tiles there would be 200 to
   300px photos in a menu, so it shows four and most of a fifth instead */
@media screen and (min-width: 600px) and (max-width: 991px) {
  .cl-nav .cl-nav__models.is-m .cl-nav__models-row { --cl-nav-per-view: 4.75; }
}
@media screen and (max-width: 991px) and (prefers-reduced-motion: reduce) {
  .cl-nav .cl-nav__models.is-m .cl-nav__models-row { scroll-behavior: auto; }
}

/* --- cart ----------------------------------------------------------------
   Round eighteen (2026-08-27): the cart circle (.cl-nav__cart, its count and
   the :has(.cl-nav__cart) row tightening from 2026-08-25) is gone; the
   header carries no cart on any page. */

/* ===========================================================================
   Round sixteen: the open bar reads as one box with its panel
   ===========================================================================

   With a dropdown open the panel has a rounded, shadowed bottom while the bar
   above it had no edges at all, so the two read as a panel floating under an
   unrelated strip. The frame closes it: a hairline left of the logo, right of
   the CTA cluster and across the top, with the panel's own .75rem radius on
   the top corners, so bar and panel are one shape.

   Drawn on a pseudo-element rather than a border on the row, because a real
   border would shift the row's height by 2px the moment a dropdown opened and
   drag every probe in the nav set with it. It also has to reach the panel's
   outer edge, not the row's: the panel overhangs by --cl-nav-panel-out.

   10% cocoa, which is the weight of the existing --cl-topbar-rule rather than
   a new value. */
.cl-nav__bar-row { position: relative; }
/* The frame paints in the row's own stacking context, so the zones are lifted
   over it: otherwise the hairline crosses the logo and the CTA at their edges. */
.cl-nav__bar-row > .cl-nav__zone { position: relative; z-index: 1; }

.cl-nav__bar-row::before {
  content: "";
  position: absolute;
  inset: 0 calc(var(--cl-nav-panel-out) * -1);
  border: 1px solid var(--cl-ink-10);
  border-bottom: 0;
  border-radius: .75rem .75rem 0 0;
  opacity: 0;
  pointer-events: none;
  transition: opacity .22s ease;
}
.cl-nav.is-dd-open .cl-nav__bar-row::before { opacity: 1; }

/* The frame belongs to the desktop dropdown. Below 991 the panels are a
   drill-down drawer and there is no box for the bar to close. */
@media screen and (max-width: 991px) {
  .cl-nav__bar-row::before { content: none; }
}

/* --- dropdown rows: the underline draws, the chevron arrives ---------------

   Every row in every dropdown is either .is-blurb (a title over a muted second
   line, or the title alone since round eighteen) or .is-thumb (a photo row).
   There is no such thing as a plain row, which is what the first pass of this
   scoped itself to, so it styled nothing at all.

   The blurb row's title is the thing that behaves: the export underlined it
   with text-decoration on hover, which lands all at once. It now draws from the
   left and the theme's chevron arrives behind it. The title goes inline-block
   so both hug the words rather than the column.

   The thumb row keeps its filled ground, because that is a stronger signal than
   a line and two of them at once reads as a bug. It gets the chevron only. */
.cl-nav .navbar5_dropdown-link.is-blurb:hover .cl-nav__link-title,
.cl-nav .navbar5_dropdown-link.is-blurb:focus-visible .cl-nav__link-title {
  text-decoration: none;
}

/* The row must not change size when it lights up. The base carries a 2px
   transparent bottom border and the inherited hover rule replaces it with a 1px
   one, so every row lost a pixel of height on hover and the rows under it slid
   up by one. Measured, not guessed: rows 1 and 2 moved on every hover of row 0.
   The width is pinned; only the drawn underline moves. */
.cl-nav .navbar5_dropdown-link.is-blurb,
.cl-nav .navbar5_dropdown-link.is-blurb:hover,
.cl-nav .navbar5_dropdown-link.is-blurb:focus-visible {
  border-bottom: 2px solid transparent;
}

.cl-nav .navbar5_dropdown-link.is-blurb .cl-nav__link-title,
.cl-nav .navbar5_dropdown-link.is-thumb .cl-nav__link-title {
  position: relative;
  display: inline-block;
}

.cl-nav .navbar5_dropdown-link.is-blurb .cl-nav__link-title::before {
  content: "";
  position: absolute;
  left: 0;
  bottom: -.125rem;
  width: 100%;
  height: 1px;
  background-color: currentColor;
  transform: scaleX(0);
  transform-origin: left center;
  transition: transform .28s cubic-bezier(.2, 0, 0, 1);
}
.cl-nav .navbar5_dropdown-link.is-blurb:hover .cl-nav__link-title::before,
.cl-nav .navbar5_dropdown-link.is-blurb:focus-visible .cl-nav__link-title::before {
  transform: scaleX(1);
}

/* Inlined as a data URI for the same reason the contact form's select chevron
   is: not one row of markup changes. currentColor through the mask, so it
   inherits whatever the row's ink is.

   Round eighteen: zero layout width. The .3rem box is cancelled by a -.3rem
   right margin and pushed .35rem right with a relative offset, so the line
   box never has to make room for it: a title that fills the column keeps its
   last word and the chevron overhangs into the column gap, instead of the
   chevron wrapping onto a phantom line of its own (see 6 in the header). */
.cl-nav .navbar5_dropdown-link.is-blurb .cl-nav__link-title::after,
.cl-nav .navbar5_dropdown-link.is-thumb .cl-nav__link-title::after {
  content: "";
  display: inline-block;
  position: relative;
  left: .35rem;
  width: .3rem;
  height: .5rem;
  margin-right: -.3rem;
  vertical-align: baseline;
  background-color: currentColor;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 10'%3E%3Cpath d='M1 1l4 4-4 4' fill='none' stroke='%23000' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat center / contain;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 10'%3E%3Cpath d='M1 1l4 4-4 4' fill='none' stroke='%23000' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat center / contain;
  opacity: 0;
  transform: translateX(-.25rem);
  transition: opacity .28s ease, transform .28s cubic-bezier(.2, 0, 0, 1);
}
.cl-nav .navbar5_dropdown-link.is-blurb:hover .cl-nav__link-title::after,
.cl-nav .navbar5_dropdown-link.is-blurb:focus-visible .cl-nav__link-title::after,
.cl-nav .navbar5_dropdown-link.is-thumb:hover .cl-nav__link-title::after,
.cl-nav .navbar5_dropdown-link.is-thumb:focus-visible .cl-nav__link-title::after {
  opacity: 1;
  transform: translateX(0);
}

@media (prefers-reduced-motion: reduce) {
  .cl-nav .navbar5_dropdown-link .cl-nav__link-title::before,
  .cl-nav .navbar5_dropdown-link .cl-nav__link-title::after,
  .cl-nav__bar-row::before { transition-duration: 1ms; }
}


/* cl-page-hero.css */
/* ==========================================================================
   Page header.

   is-plain / is-lucidity / is-lucid / is-image were built without a Webflow
   original (collection and contact pages) and keep their first rules below.

   header-short / header-short-3 / header-vh port Webflow's .section-header,
   read from infrarotkabine-hamburg.html, infrarotsauna.html,
   partner/formslim.html and ueber-uns.html:
     .section-header           colour #fff, padding-top 4rem, position relative
                               991: padding-top 5rem
     .header-extra-pad_global  height 4rem
     .header_background-image-wrapper  z-index -1, absolute, inset 0
     .header_background-image  object-fit cover, absolute, inset 0
                               991: object-position 100% 50%   767: 75% 50%
                               479: 57% 50%   (-6 twin on the partner pages:
                               38%, 50%, 47%)
     .image-overlay            #00000040; .is-dark #2b1d1061; .is-gradient
                               linear-gradient(84deg, #3e303780, #08080800)
                               (all three in cl-base.css)
     .header-short             flex centred, text-align center, min-height 80vh,
                               max-height 60rem   991: min-height 50rem
                               767: 36rem
     .header-short-3           flex centred, min-height 80vh, max-height none
                               991: flex-direction column, min-height 60rem
                               767: 40rem, margin-bottom -2px
                               479: justify-content flex-start, 36.6rem, mb 0
     .header-vh                flex centred, min-height 100vh
                               991: 50rem   767: 36rem
     .padding-vertical.padding-xhuge  the base combo (.is-tablet-tall)
     .padding-vertical.padding-large  display flex, column, align-items centre,
                               text-align center, padding-top 4rem, bottom from
                               .padding-large (3rem, 991: 2.5rem, 767: 2rem)
                               479: padding-top 2rem
     .location-header-content  flex column, align-items flex-start (hamburg)
     .max-width-large(-5)      48rem; -5 adds margin 0, display block and
                               text-align center at 991
     h2.pre-heading, h1.pre-heading  margin-top 4rem, margin-bottom 2rem,
                               .875rem / 600, line-height 1.2 from the h tag
                               991: text-align left (global .pre-heading rule)
                               767: .8rem
     .heading-xlarge           text-align center, 5rem / 1.1, -1.5px
                               991: 5rem   767: 4rem   479: 2.7rem
     .heading-xlarge-6         same without text-align (the class is on the
                               element), 479: 3rem
     .subheading-large.tex-al  1.75rem / 400, text-align center, line-height 1.4
                               767: 1.3rem   479: 1.2rem
     ._20px-spacer             height 20px   767: 10px
     .margin-bottom.margin-medium   20px (the .margin-bottom quirk), 767: 1.5rem
     .margin-bottom.margin-xlarge   20px, 991: 3.5rem, 767: 2.5rem
     .margin-bottom-small.margin-xlarge  margin 0 0 2rem at every width
     .margin-top(-6).margin-medium  2rem   767: 1.5rem
     .button-row(-3)           flex, gap 1rem, wrap, align centre, no justify
       .butt0n-center          justify-content center
     .button.is-white          cocoa on #fff, display inline-block
     .button-3.invert-colors   = .button; no .button-3.invert-colors rule exists,
                               so the partner button stays cocoa
     .google-reviews_component.is-horizontal  flex COLUMN, column-gap 1rem,
                               align-items flex-start, margin 1rem 0 2rem
                               (cl-reviews.css renders .is-horizontal as a row;
                               overridden here to the export's value)
     .rating-icon.is-white     #ffb133, 1.1rem x 1.3rem
     .rating_star-list         margin-top -.45rem, margin-right .5rem
                               479: margin-top 0, margin-bottom .5rem

   The .margin-bottom quirk: .margin-bottom { margin: 0 0 20px } is declared
   after every .margin-<size>, so the heading wrapper is 20px at >=992 and only
   takes the scale where a breakpoint redeclares the size (see cl-faq.css and
   docs/DEDUPE-MAP.md). Reproduced, flagged for the design pass.
   ========================================================================== */

.cl-page-hero { position: relative; overflow: hidden; }
.cl-page-hero.is-lucidity { background-color: var(--cl-lucidity); }
.cl-page-hero.is-lucid    { background-color: var(--cl-lucid); }
.cl-page-hero.is-image    { color: var(--cl-white); }

.cl-page-hero__media { position: absolute; inset: 0; z-index: 0; }
.cl-page-hero__media img { object-fit: cover; width: 100%; height: 100%; position: absolute; inset: 0; }
.cl-page-hero__scrim { position: absolute; inset: 0; display: block; }
.cl-page-hero__inner { position: relative; z-index: 1; }

.cl-page-hero__lead { font-size: 1.125rem; margin-top: 1rem; }
.cl-page-hero__lead p { margin: 0 0 .75rem; }
.cl-page-hero__lead p:last-child { margin-bottom: 0; }
.cl-page-hero__lead.align-center { margin-inline: auto; }

.cl-page-hero.is-image .cl-page-hero__inner { min-height: 22rem; display: flex; align-items: flex-end; }

/* --- image headers (.section-header) ------------------------------------ */

.cl-page-hero.is-header { color: var(--cl-white); padding-top: 4rem; }
.cl-page-hero.is-header .cl-page-hero__media img { object-position: 50% 50%; }
.cl-page-hero__extra-pad { height: 4rem; }

.cl-page-hero__frame { display: flex; justify-content: center; align-items: center; }
.cl-page-hero.header-short .cl-page-hero__frame { text-align: center; min-height: 80vh; max-height: 60rem; }
.cl-page-hero.header-short-3 .cl-page-hero__frame { min-height: 80vh; }
.cl-page-hero.header-vh .cl-page-hero__frame { min-height: 100vh; }

/* the export's .padding-vertical.padding-large combo, a flex column with its
   own top padding; cl-base carries only the plain scale for this pair */
.cl-page-hero.header-short-3 .padding-vertical.padding-large {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  padding-top: 4rem;
}

/* .location-header-content: the column the city pages put the button in */
.cl-page-hero__content.is-location { display: flex; flex-direction: column; align-items: flex-start; }

.cl-page-hero.is-header .heading-xlarge { text-align: center; }
/* .button.is-white is inline-block in the export, .w-inline-block caps it */
.cl-page-hero.is-header .button,
.cl-page-hero.is-header .button-secondary { max-width: 100%; }
.cl-page-hero.is-header .button.is-white { display: inline-block; }
/* .margin-bottom.margin-medium carries text-align left in the export */
.cl .cl-page-hero__title.margin-medium { text-align: left; }
/* the eyebrow is an h1/h2 in the export, so it takes the heading line-height */
.cl-page-hero.is-header .pre-heading { line-height: 1.2; }
/* no .heading-large rule in the export carries letter-spacing (cl-base's -1px
   belongs to the hero's .heading-xlarge-N twins); the band styles keep it */

.cl-page-hero__kicker { font-size: 1.75rem; font-weight: 400; line-height: 1.4; text-align: center; }
.cl-page-hero__spacer { height: 20px; }

/* heading wrapper: the export's resolved margins, not the scale */
.cl .cl-page-hero__title.margin-bottom { margin-bottom: 20px; }
.cl-page-hero.header-short-3 .cl-page-hero__title.margin-bottom { margin-bottom: 2rem; }

/* reviews strip under the heading */
.cl-page-hero .cl-reviews__component.is-horizontal { flex-direction: column; }
.cl-page-hero .cl-reviews__star { color: var(--cl-golden); width: 1.1rem; height: 1.3rem; font-size: 1.3rem; }

@media screen and (max-width: 991px) {
  .cl-page-hero.is-header { padding-top: 5rem; }
  .cl-page-hero.is-header .cl-page-hero__media img { object-position: 100% 50%; }
  .cl-page-hero.header-short .cl-page-hero__frame { min-height: 50rem; }
  .cl-page-hero.header-short-3 .cl-page-hero__frame { flex-direction: column; min-height: 60rem; }
  .cl-page-hero.header-vh .cl-page-hero__frame { min-height: 50rem; }
  .cl-page-hero.is-header .pre-heading { text-align: left; }
  .cl .cl-page-hero__title.margin-bottom.margin-xlarge { margin-bottom: 3.5rem; }
  .cl-page-hero.header-short-3 .cl-page-hero__title.margin-bottom { margin-bottom: 2rem; }
}
@media screen and (max-width: 767px) {
  .cl-page-hero.is-header .cl-page-hero__media img { object-position: 75% 50%; }
  .cl-page-hero.header-short .cl-page-hero__frame { min-height: 36rem; }
  .cl-page-hero.header-short-3 .cl-page-hero__frame { min-height: 40rem; }
  /* .header-short-3's -2px bottom margin collapses out of the export's header;
     the port's overflow:hidden would trap it, so it sits on the section */
  .cl-page-hero.header-short-3 { margin-bottom: -2px; }
  .cl-page-hero.header-vh .cl-page-hero__frame { min-height: 36rem; }
  .cl-page-hero__kicker { font-size: 1.3rem; }
  .cl-page-hero__spacer { height: 10px; }
  .cl .cl-page-hero__title.margin-bottom.margin-medium { margin-bottom: 1.5rem; }
  .cl .cl-page-hero__title.margin-bottom.margin-xlarge { margin-bottom: 2.5rem; }
  .cl-page-hero.header-short-3 .cl-page-hero__title.margin-bottom { margin-bottom: 2rem; }
  .cl-page-hero.is-image .cl-page-hero__inner { min-height: 16rem; }
}
@media screen and (max-width: 479px) {
  .cl-page-hero.is-header .cl-page-hero__media img { object-position: 57% 50%; }
  .cl-page-hero.header-short-3 .cl-page-hero__frame { justify-content: flex-start; min-height: 36.6rem; }
  .cl-page-hero.header-short-3 { margin-bottom: 0; }
  .cl-page-hero.header-short-3 .padding-vertical.padding-large { padding-top: 2rem; }
  .cl-page-hero.header-short-3 .heading-xlarge { font-size: 3rem; }
  .cl-page-hero__kicker { font-size: 1.2rem; }
  .cl-page-hero .cl-reviews__component.is-horizontal { align-items: flex-start; }
}

/* the reviews strip under the centred heading was flush-left (the band's
   .is-horizontal rules); centred with the heading (client, 2026-08-25) */
.cl-page-hero .cl-reviews__component.is-horizontal { justify-content: center; align-items: center; margin-inline: auto; text-align: center; }
.cl-page-hero .cl-reviews__component.is-horizontal .cl-reviews__stars { margin-top: 0; }

/* ===========================================================================
   Round sixteen: the section after a page hero ties into it
   ===========================================================================

   /pages/infrarotkabine-hamburg is the reference: the hero runs to a hard edge
   and the next section starts below it as a separate slab. Tying them means
   the second section climbs a little way up over the hero and rounds its top
   corners, so the page reads as one sheet lifting off the image rather than
   two stacked blocks.

   Written as a sibling rule rather than a setting on every template, because
   the ask was "on more pages" and every page hero has the same relationship to
   whatever follows it. Shopify wraps each section in an element carrying
   .shopify-section, and the tag is whatever the section's schema asked for:
   here it is <section>, not <div>, which is what the first pass matched on and
   why it styled nothing. Match the class, never the tag.

   The ground is set inside :where(), which carries no specificity at all, so a
   section that paints its own background (pumice, cocoa, lucidity) keeps it and
   only a section with no ground of its own falls back to white. Without that
   fallback an unpainted section would overlap the hero and show the photo
   through its own top corners.

   Both numbers are custom properties, so a template that wants a deeper tuck or
   square corners sets them on the section instead of fighting this rule, and
   .cl-no-tie opts out completely. */
:where(.shopify-section:has(> .cl-page-hero.is-header) + .shopify-section > .cl) {
  background-color: var(--cl-white);
}

.shopify-section:has(> .cl-page-hero.is-header:not(.cl-no-tie)) + .shopify-section > .cl {
  position: relative;
  z-index: 1;
  margin-top: calc(var(--cl-tie-overlap, 1.75rem) * -1);
  border-start-start-radius: var(--cl-tie-radius, 1.25rem);
  border-start-end-radius: var(--cl-tie-radius, 1.25rem);
}

/* The hero must not clip the section climbing over it, and it must sit under
   it: without the explicit 0 the hero's own stacking wins on the pages where
   its media is positioned. */
.shopify-section:has(> .cl-page-hero.is-header:not(.cl-no-tie)) { position: relative; z-index: 0; }

/* A phone has less room to give away, and a 1.25rem radius on a full-bleed
   section reads as a rendering error rather than a shape. */
@media screen and (max-width: 767px) {
  .shopify-section:has(> .cl-page-hero.is-header:not(.cl-no-tie)) + .shopify-section > .cl {
    --cl-tie-overlap: 1rem;
    --cl-tie-radius: .875rem;
  }
}

/* Round sixteen: the header hero stops disagreeing with itself.

   /pages/ueber-uns is the reference. The eyebrow sits left, the buttons sit
   left, and the heading between them is centred, so the block reads as three
   things that were laid out separately. That centring is a faithful port: the
   export's .heading-xlarge carries text-align center while the global
   .pre-heading rule leaves the eyebrow left, which is one of the CSS leaks
   already on the sign-off list as "port centres, one setting reverts".

   This is the revert, applied where it actually matters rather than page by
   page: on a header hero the heading takes the same edge as the eyebrow and
   the calls to action around it.

   The two genuinely centred variants keep what they have. .header-short and
   .header-short-3 centre the whole frame, eyebrow and buttons included, so
   there is nothing there to disagree with. */
.cl-page-hero.is-header:not(.header-short):not(.header-short-3) .heading-xlarge,
.cl-page-hero.is-header:not(.header-short):not(.header-short-3) .cl-page-hero__title,
.cl-page-hero.is-header:not(.header-short):not(.header-short-3) .pre-heading {
  text-align: left;
}

/* The eyebrow is the one that gave the game away. It was centred inside a
   768px box while the heading and the buttons sat at the container edge, so its
   text floated in the middle of the hero with nothing under it. The export only
   ever fixed this below 991, where a global .pre-heading rule pulls it left,
   which is why it looked right on a phone and wrong on a desktop. */

/* The kicker travels with the heading for the same reason. */
.cl-page-hero.is-header:not(.header-short):not(.header-short-3) .cl-page-hero__kicker {
  text-align: left;
}

/* Round nineteen (client, 2026-08-28, /pages/ueber-uns): a hero with
   align = center centres its whole column, not just the text inside a
   left-placed box. The eyebrow's 991 left rule above yields to it. */
.cl-page-hero__content.text-align-center { margin-inline: auto; display: flex; flex-direction: column; align-items: center; }
.cl-page-hero__content.text-align-center > * { margin-inline: auto; }
.cl-page-hero__content.text-align-center .pre-heading,
.cl-page-hero__content.text-align-center .cl-page-hero__title,
.cl-page-hero__content.text-align-center .cl-page-hero__lead,
.cl-page-hero.is-header .cl-page-hero__content.text-align-center .pre-heading { text-align: center; }
.cl-page-hero__content.text-align-center .button-row { justify-content: center; }
/* ...and the heading itself, whatever size class it carries (the export's
   heading rules set their own text-align). */
.cl-page-hero__content.text-align-center :is(h1, h2, h3, p, .heading-xlarge, .heading-large) { text-align: center; }
/* The header-vh/is-header variants pin their heading, title and eyebrow to
   the left with a four-class selector (above); a centred hero outranks it
   here, and the column itself centres in its frame. */
.cl-page-hero.is-header:not(.header-short):not(.header-short-3) .cl-page-hero__content.text-align-center .heading-xlarge,
.cl-page-hero.is-header:not(.header-short):not(.header-short-3) .cl-page-hero__content.text-align-center .cl-page-hero__title,
.cl-page-hero.is-header:not(.header-short):not(.header-short-3) .cl-page-hero__content.text-align-center .pre-heading { text-align: center; }
.cl-page-hero .padding-vertical:has(> .cl-page-hero__content.text-align-center) { display: flex; flex-direction: column; align-items: center; }


/* cl-pagination.css */
/* ==========================================================================
   Pagination, shared by the blog index, the collection pages and search
   (snippets/cl-pagination.liquid loads this file).

   Nothing here is ported: the Webflow blog had a Finsweet "Mehr anzeigen"
   load-more pill and no numbered pager at all, and the collection grid was
   CMS-bound with no paging. The vocabulary is the theme's own: the pill from
   the article card's category tag (pumice ground, radius 5rem, .5px tracking)
   and the cocoa fill the blog's active tag uses, so the pager reads as part of
   the same control family as the tag row above the grid.

   assets/cl-collection.css also declares .cl-pagination (flex, centred, 2rem
   gap). This file is linked from the snippet, i.e. later in the document, so
   it wins at equal specificity on every page that renders a pager.
   ========================================================================== */

.cl-pagination {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-wrap: wrap;
  gap: .75rem 1rem;
}

.cl-pagination__step {
  display: inline-flex;
  align-items: center;
  column-gap: .4rem;
  padding: .55rem 1rem;
  border: 1px solid var(--cl-cocoa);
  border-radius: 5rem;
  font-size: .8125rem;
  font-weight: 600;
  line-height: 1.2;
  letter-spacing: .5px;
  text-transform: uppercase;
  white-space: nowrap;
  color: var(--cl-cocoa);
  text-decoration: none;
  transition: background-color .18s ease, color .18s ease;
}
.cl-pagination__step:hover { background-color: var(--cl-cocoa); color: var(--cl-white); }
.cl-pagination__step.is-disabled { border-color: var(--cl-ink-20); color: var(--cl-ink-35); }
.cl-pagination__step.is-disabled:hover { background-color: transparent; color: var(--cl-ink-35); }
.cl-pagination__step-icon { display: flex; align-items: center; justify-content: center; width: .8rem; height: .8rem; }
.cl-pagination__step-icon svg { width: 100%; height: 100%; display: block; }

.cl-pagination__pages {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: .4rem;
  margin: 0;
  padding: 0;
  list-style: none;
}
.cl-pagination__page-item { margin: 0; display: block; }
.cl-pagination__page {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 2.5rem;
  padding: .55rem .5rem;
  border: 1px solid transparent;
  border-radius: 5rem;
  background-color: var(--cl-pumice);
  font-size: .8125rem;
  font-weight: 500;
  line-height: 1.2;
  font-variant-numeric: tabular-nums;
  color: inherit;
  text-decoration: none;
  transition: background-color .18s ease, color .18s ease;
}
a.cl-pagination__page:hover { background-color: var(--cl-lucid); }
.cl-pagination__page.is-current {
  background-color: var(--cl-cocoa);
  border-color: var(--cl-cocoa);
  color: var(--cl-white);
  font-weight: 600;
}
.cl-pagination__gap { display: inline-flex; min-width: 1.25rem; justify-content: center; color: var(--cl-ink-60); }
.cl-pagination__count { font-variant-numeric: tabular-nums; }

.cl-pagination a:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: 2px; }

@media screen and (max-width: 479px) {
  /* the steps keep their labels; the numbers get their own line rather than
     shrinking below a comfortable target */
  .cl-pagination { gap: .75rem; }
  .cl-pagination__pages { order: -1; width: 100%; justify-content: center; }
}

@media (prefers-reduced-motion: reduce) {
  .cl-pagination__step,
  .cl-pagination__page { transition: none; }
}


/* cl-price-cards.css */
/* ==========================================================================
   Price cards. Port of product-price_component (promotion and partner pages)
   and pricing-list_component (the price-list page).

   Promo row, from promotions/sauna-sale-detox.html :: .product-price_component:
     .product-price_component        padding-bottom 0; 991: 10px; 479: 20px   -> __item
     .container-large                = base
     .padding-vertical.padding-large the export's combo rule: display flex, column,
                                     align-items center, text-align center,
                                     padding-top 4rem; 479: padding-top 2rem.
                                     Bottom from .padding-large: 3rem, 991: 2.5rem,
                                     767: 2rem. cl-base.css only carries the plain
                                     scale, so the combo is scoped here   -> __pad
     .layout-image-right             grid 1fr 1.5fr, gap 3rem, align-items center,
                                     grid-auto-flow row; 991: 1 column; 767: row-gap 3rem
     .layout-image-left              same with 1.5fr 1fr and the image first
     .layout3_content-2              479: text-align left                  -> __content
     #w-node-…4db4 (the content)     991: order 9999, so below 991 the image
                                     always comes first, whichever side it
                                     sits on at desktop (DEDUPE-MAP: the
                                     #w-node rules are invisible in the markup)
     .margin-bottom.margin-small     margin-bottom 0 (the export's own combo rule)
                                                                          -> __title, __desc, __table-wrap
     h2.pre-heading-3                left, letter-spacing 1px, uppercase,
                                     margin-bottom 1.5rem, .875rem / 400, line-height
                                     1.2 from the h2 rule; 991: margin-bottom 1rem;
                                     767: .8rem                            -> __eyebrow
     h2.heading-medium-3             left, margin-bottom .5rem, Sanomat 2rem / 400 / 1.1
                                     991: 1.75rem  767: 1.5rem / 1.4  479: 1.6rem
                                                                          -> __heading
     .product-description            left, margin-top 10px                -> __text
     .product-price-grid (.w-layout-grid)
                                     grid 2.75fr .75fr 1fr, gap 12px, margin-top 10px
                                     479: one 2.75fr column, gap 2px, margin-top 20px
                                                                          -> __price-row
     .product-type                   left, width 100%, padding-top 6px     -> __type
     .old-price                      left, line-through                   -> __old
     .text-color-gold-3              #db9729, left                        -> __new
     .margin-top.margin-medium       = base (2rem; 767: 1.5rem)
     .button-row-2                   flex, wrap, gap 1rem, justify flex-start
                                     479: justify center                  -> __buttons
     .button-secondary-3             .button-secondary with #131313 text and border,
                                     transition opacity .2s; hover: white on #db9729
                                     479: min-width 14.5rem (= base)       -> __cta
     .image-wrapper-3-2              width 100%, padding-top 66.66%, relative -> __media
     .image-11                       object-fit cover, absolute, inset 0   -> __img

   Partner variant, partner/formslim.html :: .product-price_component:
     .affiliate-product-section-heading  centred flex column, padding 80px 100px 40px
                                     991: padding-inline 60px; 767: 60px top, 20px bottom
                                     479: padding 0 20px 20px             -> __intro
     .margin-bottom-4.margin-small   margin 0 0 20px (the numbered twin keeps its
                                     stock bottom where the base combo zeroes it; the
                                     canonical promo page is the base, so 0 here and
                                     the partner page reads 20px looser per block)
     .heading-medium-6.text-align-center  2.25rem / 400 / 1.2; 991: 1.75rem;
                                     767: 1.5rem / 1.4; 479: line-height 1.3 (and a
                                     text-align: left the combo overrides) -> __intro-heading
     ._20px-spacer                   height 20px; 767: 10px                -> __intro-spacer
     .image-14                       object-fit contain (767: height 90%) for the
                                     partner's cut-out product shot        -> .is-contain

   Price list, pricing/clearlight-saunas-preisliste.html :: .section_pricing-hero:
     .section_pricing-hero           bg #e8d7ca (lucid), padding-top 12rem, relative
                                     479: padding-top 3rem                 -> .is-lucid, .is-hero
     .page-padding-3                 = .page-padding
     .padding-vertical-4.padding-huge = the plain scale (6rem, 5rem, 3.5rem)
     .margin-bottom-7.margin-xsmall  margin 1rem 0 20px; 991: margin-top 0;
                                     767: bottom .75rem, because the 767
                                     .margin-xsmall rule lands after the twin's
                                     stock declaration                     -> __head-eyebrow
     .text-style-allcaps             = base
     h1.heading-large-6              3rem / 400 / 1.2; 991: 2.25rem; 767: 2rem and no
                                     479 step. The port prints .heading-large, which
                                     steps to 1.8rem at 479 like the base class
     .pricing-list_component         grid 1fr 1fr 1fr, gap 3rem, margin-top 5rem
                                     991: 1 column                         -> __grid
     .pricelist_item                 flex column, gap 2rem, text centre, bg #fff,
                                     justify center, align stretch         -> __card
     .pricelist_img-wrapper          width 100%, padding-top 56.25%, relative -> __media
     .image_cover-absolute-7         cover, absolute, inset 0; 767: object-position
                                     24% 50%; 479: 67% 50%                 -> __img
     .pricelist_text-wrapper         flex column, gap 1rem, justify flex-start,
                                     align stretch, height 100%, min-height 21rem,
                                     padding 0 2rem 2rem, 1.125rem         -> __body
     .heading-medium-12              margin-bottom 1rem, Sanomat 2rem / 400 / 1.1
                                     991: left, 1.75rem; 767: 1.5rem / 1.4 -> __heading
       .text-color-red / -blue       #801c00 / #004560
     .pricelist_text-row             border-top and -bottom 1px #00000080,
                                     padding-block 1rem                    -> __line
       .is-second                    border-top transparent, margin-top -1rem
     .button-12.push-auto-top        = .button, margin-top auto
     .show-tablet                    display none; 991: block              -> __tablet
     .button-12.is-outline           #000 on #fff, cocoa border, min-width auto,
                                     padding-inline 1.9rem                 -> __cta2

   pricing.html :: .section_pricing holds no cards, only a rich-text block on
   lucidity with a 12rem top; that is cl-rich-text's job.
   ========================================================================== */

.cl-price-cards { background-color: transparent; position: relative; }
.cl-price-cards.is-lucid    { background-color: var(--cl-lucid); }
.cl-price-cards.is-lucidity { background-color: var(--cl-lucidity); }
.cl-price-cards.is-pumice   { background-color: var(--cl-pumice); }
.cl-price-cards.is-hero     { padding-top: 12rem; }
/* Black Friday 2026: white cards on cocoa; the head flips to white. */
.cl-price-cards.is-cocoa    { background-color: var(--cl-cocoa); color: var(--cl-white); }
.cl-price-cards.is-cocoa .cl-price-cards__head { color: var(--cl-white); }
.cl-price-cards.is-cocoa .cl-price-cards__head-eyebrow { color: var(--cl-lucid); }
.cl-price-cards.is-cocoa .cl-price-cards__card { color: var(--cl-cocoa); }
.cl .cl-price-cards__card .cl-price-cards__chip {
  display: inline-flex; align-items: center; gap: .4rem; align-self: center;
  margin: -.25rem 0 .25rem; padding: .4rem .75rem; border-radius: 100px;
  background-color: var(--cl-lucidity); color: var(--cl-ink-75);
  font-size: .8125rem; font-weight: 500; line-height: 1.2; text-align: left;
}
.cl .cl-price-cards__card .cl-price-cards__chip svg { width: .9rem; height: .9rem; flex: none; }
.cl-price-cards__card .cl-price-cards__media .cl-card__badge { top: 1rem; left: 1rem; font-family: var(--cl-font-heading); font-size: 1.125rem; letter-spacing: 0; padding: .45rem .8rem .4rem; }

/* --- promo rows ----------------------------------------------------------- */

.cl-price-cards__item { padding-bottom: 0; }

/* the export's .padding-vertical.padding-large combo */
.cl-price-cards__pad.padding-large {
  text-align: center;
  flex-direction: column;
  align-items: center;
  padding-top: 4rem;
  display: flex;
}

.cl-price-cards__layout {
  grid-column-gap: 3rem;
  grid-row-gap: 3rem;
  grid-template-areas: ".";
  grid-template-rows: auto;
  grid-template-columns: 1fr 1.5fr;
  grid-auto-columns: 1fr;
  grid-auto-flow: row;
  align-content: stretch;
  align-items: center;
  display: grid;
}
.cl-price-cards__layout.is-image-left { grid-template-columns: 1.5fr 1fr; }

.cl-price-cards__title,
.cl-price-cards__desc,
.cl-price-cards__table-wrap { margin-bottom: 0; }

.cl-price-cards__eyebrow {
  text-align: left;
  letter-spacing: 1px;
  text-transform: uppercase;
  margin-bottom: 1.5rem;
  font-size: .875rem;
  font-weight: 400;
  line-height: 1.2;
}
.cl-price-cards__eyebrow a { color: inherit; text-decoration: none; }
.cl-price-cards__eyebrow a:hover { text-decoration: underline; }

.cl .cl-price-cards__heading {
  text-align: left;
  margin-bottom: .5rem;
  font-family: var(--cl-font-heading);
  font-size: 2rem;
  font-weight: 400;
  line-height: 1.1;
}

.cl-price-cards__text { text-align: left; margin-top: 10px; }

.cl-price-cards__price-row {
  display: grid;
  grid-column-gap: 12px;
  grid-row-gap: 12px;
  grid-template-rows: auto;
  grid-template-columns: 2.75fr .75fr 1fr;
  grid-auto-columns: 1fr;
  margin-top: 10px;
}
.cl-price-cards__type { text-align: left; width: 100%; padding-top: 6px; }
.cl-price-cards__old  { text-align: left; text-decoration: line-through; }
.cl-price-cards__new  { color: var(--cl-dark-red); text-align: left; }

.cl-price-cards__buttons {
  grid-column-gap: 1rem;
  grid-row-gap: 1rem;
  flex-wrap: wrap;
  justify-content: flex-start;
  align-items: center;
  display: flex;
}
.cl .cl-price-cards__cta {
  color: var(--cl-black);
  border-color: var(--cl-black);
  transition: opacity .2s;
}
.cl .cl-price-cards__cta:hover {
  color: #fff;
  background-color: var(--cl-dark-red);
  border-color: var(--cl-dark-red);
  text-decoration: none;
}

.cl-price-cards__media { width: 100%; padding-top: 66.66%; position: relative; }
.cl-price-cards__img {
  object-fit: cover;
  width: 100%;
  height: 100%;
  position: absolute;
  inset: 0;
}
.cl-price-cards__media.is-contain .cl-price-cards__img { object-fit: contain; }

/* partner page heading above the first row */
.cl-price-cards__intro {
  text-align: center;
  flex-direction: column;
  align-items: center;
  padding: 80px 100px 40px;
  display: flex;
}
.cl-price-cards__intro-title { margin: 0 0 20px; }
.cl .cl-price-cards__intro-heading { text-align: center; font-size: 2.25rem; line-height: 1.2; }
.cl-price-cards__intro-spacer { height: 20px; }

/* --- price list ----------------------------------------------------------- */

.cl-price-cards__head { text-align: center; }
.cl-price-cards__head-eyebrow { margin: 1rem 0 20px; }

.cl-price-cards__grid {
  grid-column-gap: 3rem;
  grid-row-gap: 3rem;
  grid-template-rows: auto;
  grid-template-columns: 1fr 1fr 1fr;
  grid-auto-columns: 1fr;
  margin-top: 5rem;
  display: grid;
}
.cl-price-cards__grid.is-cols-2 { grid-template-columns: 1fr 1fr; }
.cl-price-cards__grid.is-cols-4 { grid-template-columns: 1fr 1fr 1fr 1fr; }

.cl-price-cards__card {
  grid-column-gap: 2rem;
  grid-row-gap: 2rem;
  text-align: center;
  background-color: #fff;
  flex-direction: column;
  justify-content: center;
  align-items: stretch;
  display: flex;
}
.cl-price-cards__card .cl-price-cards__media { padding-top: 56.25%; }

.cl-price-cards__body {
  grid-column-gap: 1rem;
  grid-row-gap: 1rem;
  flex-direction: column;
  justify-content: flex-start;
  align-items: stretch;
  height: 100%;
  min-height: 21rem;
  padding-bottom: 2rem;
  padding-left: 2rem;
  padding-right: 2rem;
  font-size: 1.125rem;
  display: flex;
}
.cl .cl-price-cards__card .cl-price-cards__heading { text-align: inherit; margin-bottom: 1rem; }
.cl .cl-price-cards__heading.text-color-red  { color: var(--cl-dark-red); }
.cl .cl-price-cards__heading.text-color-blue { color: var(--cl-stratos); }

.cl-price-cards__line {
  border-top: 1px solid #00000080;
  border-bottom: 1px solid #00000080;
  padding-top: 1rem;
  padding-bottom: 1rem;
}
.cl-price-cards__line.is-second { border-top-color: transparent; margin-top: -1rem; }
.cl-price-cards__line s { margin-left: .4rem; opacity: .6; }

.cl .cl-price-cards__card .cl-price-cards__text { text-align: inherit; margin-top: 0; }
.cl .cl-price-cards__card .button { margin-top: auto; }

.cl-price-cards__tablet { display: none; }
.cl .cl-price-cards__cta2 {
  color: #000;
  background-color: #fff;
  min-width: auto;
  padding-left: 1.9rem;
  padding-right: 1.9rem;
}

/* --- breakpoints ---------------------------------------------------------- */

@media screen and (max-width: 991px) {
  .cl-price-cards__item { padding-bottom: 10px; }
  .cl-price-cards__layout,
  .cl-price-cards__layout.is-image-left { grid-column-gap: 3rem; grid-template-columns: 1fr; grid-auto-flow: row; min-height: auto; }
  .cl-price-cards__content { order: 9999; }
  .cl-price-cards__eyebrow { margin-bottom: 1rem; }
  .cl .cl-price-cards__heading { font-size: 1.75rem; }
  .cl-price-cards__intro { padding-left: 60px; padding-right: 60px; }
  .cl .cl-price-cards__intro-heading { font-size: 1.75rem; }
  .cl-price-cards__head-eyebrow { margin-top: 0; }
  .cl-price-cards__grid,
  .cl-price-cards__grid.is-cols-2,
  .cl-price-cards__grid.is-cols-4 { grid-template-columns: 1fr; }
  .cl .cl-price-cards__card .cl-price-cards__heading { text-align: left; }
  .cl-price-cards__tablet { display: block; }
}

@media screen and (max-width: 767px) {
  .cl-price-cards__layout,
  .cl-price-cards__layout.is-image-left { grid-row-gap: 3rem; grid-template-columns: 1fr; }
  .cl-price-cards__eyebrow { font-size: .8rem; }
  .cl .cl-price-cards__heading { font-size: 1.5rem; line-height: 1.4; }
  .cl-price-cards__intro { padding-top: 60px; padding-bottom: 20px; }
  .cl .cl-price-cards__intro-heading { font-size: 1.5rem; line-height: 1.4; }
  .cl-price-cards__intro-spacer { height: 10px; }
  .cl-price-cards__head-eyebrow { margin-bottom: .75rem; }
  .cl-price-cards__media.is-contain .cl-price-cards__img { height: 90%; }
  .cl-price-cards__card .cl-price-cards__img { object-position: 24% 50%; }
}

@media screen and (max-width: 479px) {
  .cl-price-cards.is-hero { padding-top: 3rem; }
  .cl-price-cards__item { padding-bottom: 20px; }
  .cl-price-cards__pad.padding-large { padding-top: 2rem; }
  .cl-price-cards__layout,
  .cl-price-cards__layout.is-image-left { grid-template-columns: 1fr; }
  .cl-price-cards__content { text-align: left; }
  .cl .cl-price-cards__heading { font-size: 1.6rem; }
  .cl .cl-price-cards__card .cl-price-cards__heading { font-size: 1.5rem; }
  .cl-price-cards__price-row {
    grid-column-gap: 2px;
    grid-row-gap: 2px;
    grid-template-areas: "." "." "Area";
    grid-template-rows: auto auto auto;
    grid-template-columns: 2.75fr;
    grid-auto-flow: row;
    margin-top: 20px;
  }
  .cl-price-cards__buttons { justify-content: center; }
  .cl-price-cards__intro { padding: 0 20px 20px; }
  .cl .cl-price-cards__intro-heading { line-height: 1.3; }
  .cl-price-cards__media.is-contain .cl-price-cards__img { height: 100%; }
  .cl-price-cards__card .cl-price-cards__img { object-position: 67% 50%; }
}

@media (prefers-reduced-motion: reduce) {
  .cl .cl-price-cards__cta { transition: none; }
}


/* cl-product-carousel.css */
/* ==========================================================================
   Product carousel. Port of the slider half of section-add-ons.

   From the export:
     .product1_heading         flex, space-between, align centre, mb 1rem
                               991: column, align start, row-gap 1rem
     .testimonial12_component  width 100%, padding-bottom 6rem, overflow visible
                               767: padding-bottom 5rem
     .testimonial12_mask       width 33.33%, overflow visible
                               991: 50%   767: 100%
     .testimonial12_slide      padding-right 2rem
                               991: margin-right 2.5rem, no padding
     .testimonial12_arrow      3rem circle, 1px lucid border, cocoa
                               hover bg lucid + scale(.9)
                               positioned bottom right, left arrow offset 4rem
     .product_image-wrapper    bg pumice, padding-top 67%, relative
     .products_list            grid 1fr x3   991: x2   767: x1

   Webflow's mask-width trick (a third of the track visible, overflow visible)
   is how the peek-ahead effect works. Reproduced with a scroll-snap track,
   which keeps it swipeable and keyboard reachable without a slider library.
   ========================================================================== */

.cl-carousel__heading {
  flex: 1;
  justify-content: space-between;
  align-items: center;
  margin-bottom: 1rem;
  display: flex;
  column-gap: 2rem;
}
.cl-carousel__heading.is-centered { justify-content: center; }

/* Round nineteen: the track's bleed to the screen edges, the scroll-snap,
   the mouse drag state and the prev | 1 / N | next pill moved to
   assets/cl-slider.css (.cl-slider__track, .cl-slider__arrows), shared with
   the Stories band; the driver is snippets/cl-slider-script.liquid. This
   file keeps the grid: three cards to the container, the fourth peeking in
   the bleed. The viewport is a size container so the card widths stay a
   share of the CONTAINER, not of the widened track; the section clips the
   half-scrollbar overshoot vw carries on Windows. */
.cl-carousel { overflow-x: clip; }
.cl-carousel__viewport { position: relative; padding-bottom: 6rem; container-type: inline-size; }

.cl-carousel__track {
  display: grid;
  grid-auto-flow: column;
  grid-auto-columns: calc(33.33cqw - 1.34rem);
  column-gap: 2rem;
}
.cl-carousel__slide { scroll-snap-align: start; }

.cl-carousel__card { text-decoration: none; color: inherit; display: flex; flex-direction: column; }
.cl-carousel__image {
  background-color: var(--cl-pumice);
  width: 100%;
  padding-top: 100%;   /* square: the add-on renders read as objects, not banners */
  position: relative;
  overflow: hidden;
  margin-bottom: 1rem;
}
.cl-carousel__image img { object-fit: cover; width: 100%; height: 100%; position: absolute; inset: 0; -webkit-user-drag: none; }
/* a hairline at black 10% over the image, so a white render still has an edge */
.cl-carousel__image::after { content: ""; position: absolute; inset: 0; box-shadow: inset 0 0 0 1px var(--cl-ink-10); pointer-events: none; }
.cl-carousel__card:hover .cl-carousel__image img { transform: scale(1.03); }
.cl-carousel__image img { transition: transform .4s ease; }

@media screen and (max-width: 991px) {
  .cl-carousel__heading { flex-direction: column; justify-content: flex-start; align-items: flex-start; row-gap: 1rem; }
  .cl-carousel__track { grid-auto-columns: calc(50cqw - 1.25rem); }
}
@media screen and (max-width: 767px) {
  .cl-carousel__viewport { padding-bottom: 5rem; }
  /* 1.25 cards in the container, the rest of the second one in the bleed */
  .cl-carousel__track { grid-auto-columns: 80cqw; column-gap: 1.25rem; }
}
@media (prefers-reduced-motion: reduce) {
  .cl-carousel__image img { transition: none; }
}

/* is-grid: .section-product ("Entdecken Sie die Modelle")
     .product_component > .margin-bottom.margin-large   20px at desktop (stock .margin-bottom
                                                        wins), 2.5rem at 991, 2rem at 767
     .product1_heading        flex, space-between, align center, margin-bottom 1rem
                              991: column, align start, row-gap 1rem
     .pre-heading             stock: 4rem top margin, 2rem bottom (reproduced via cl-base)
     .link-small              2px cocoa underline, .9rem / 600 / 1.4, margin-top 1rem
     .products_list           = .cl-grid tracks (1.5rem/4rem; 991: 2 cols 2rem; 767: 1 col 1.25rem/3rem) */
.cl-carousel.is-grid .cl-carousel__head-wrap { margin-bottom: 20px; }
.cl-carousel.is-grid .cl-carousel__heading-row {
  display: flex;
  justify-content: space-between;
  align-items: center;
  flex: 1;
  margin-bottom: 1rem;
}
.cl-carousel.is-grid .cl-carousel__heading-row.is-centered { justify-content: center; }
.cl-carousel.is-grid .link-small {
  z-index: 1;
  border-bottom: 2px solid var(--cl-cocoa);
  flex: none;
  margin-top: 1rem;
  padding-bottom: .15rem;
  font-size: .9rem;
  font-weight: 600;
  line-height: 1.4;
  display: inline-block;
  overflow: hidden;
  color: inherit;
  text-decoration: none;
  position: relative;
}
@media screen and (max-width: 991px) {
  .cl-carousel.is-grid .cl-carousel__head-wrap { margin-bottom: 2.5rem; }
  .cl-carousel.is-grid .cl-carousel__heading-row { flex-direction: column; justify-content: flex-start; align-items: flex-start; row-gap: 1rem; }
}
@media screen and (max-width: 767px) {
  .cl-carousel.is-grid .cl-carousel__head-wrap { margin-bottom: 2rem; }
}

/* The card snippet marks square product renders `is-contain` (see
   snippets/cl-product-card.liquid); the grid layout honours it so the saunas
   are not cropped at roof and floor. */
.cl-carousel.is-grid .cl-card__image.is-contain img { object-fit: contain; }


/* cl-product.css */
/* ==========================================================================
   Product page header. Port of detail_ausfuehrung.html :: .section-sauna-header,
   restructured for the client reviews of 2026-08-23 (gallery, add-to-cart)
   and 2026-08-25 (dominant image, three-level breadcrumbs, badge strip,
   stacked buttons, detail accordions in the column, sticky bar, review
   toast). The export is still the source of every value that survived the
   restructure; each departure is listed under it with its reason.

   From the export (clearlight-saunas-germany.css, components.css):
     .section-sauna-header        padding-top 5rem
     .padding-vertical.padding-xlarge  4rem; 991: 3.5rem; 767: 2.5rem (base)
     .layout-saunas_component     grid 1fr 1fr, col-gap 5rem, row-gap 4rem,
                                  align-items center
                                  991: col-gap 3rem   767: 1 column, row-gap 3rem
     .layout-saunas_content-left  bg #f3f3f3, flex, align stretch, 100% x 100%,
                                  relative
     .sauna-product-images-wrap   bg #f3f3f3, 100% x 100%, padding-top 100%,
                                  relative
     .sauna-product-image         object-fit contain, absolute inset 0, 100%
     .breadcrumbs_wrapper         flex, col-gap .5rem, letter-spacing .5px,
                                  uppercase, margin-bottom 1rem, .75rem, 400
     .breadcrumb-arrow            flex column centred, width .4rem
     .margin-bottom.margin-medium 20px at desktop (stock .margin-bottom beats
                                  the size); 767: 1.5rem
     .margin-bottom.margin-small  0 at every width
     .sauna-sizes-links_list      flex wrap, gap 1.2rem; 991: row-gap .6rem
     .saunas-pills                flex centred, col-gap .4rem, padding .5rem 0,
                                  .85rem, 500, line-height 1, border-bottom
                                  1px transparent; .w--current: cocoa
     .product-hero_description    1rem, 400, line-height 1.5
     .product-price               1.5rem, 400
     .button.is-inverted          cocoa text, transparent fill
     .product-badges_component    flex, gap 2rem, justify start, align centre,
                                  margin-top 3rem, .875rem
     .product-badges_item         flex, gap .5rem, align centre, 400
     .product_icon-feature        1.5rem square

   Departures from the export, all requested by the client:
     header gap   5rem + 4rem of padding above the hero read as an empty
                  band under the sticky nav; the hero now starts 2.5rem under
                  it at desktop (2rem on a phone).
     grid         1.25 : 1 at desktop, the image the larger share; the
                  export's 1 : 1 left the sauna "prea mică". align-items is
                  `start`: the text column is taller than the media at every
                  width now that the accordions live in it.
     frame ratio  4/3, not the export's 1/1 (2026-08-23); every sauna photo in
                  the CMS is 1.4:1, so `contain` renders it at the same size
                  in either box and the square only added pumice.
     thumbnails   a strip with a peek of the next one (5.4 per row at
                  desktop, 4.4 on a phone) and a white gradient + arrow on the
                  right edge that steps one image at a time.
     full bleed   below 767 the frame breaks out of .page-padding's 5% gutter
                  (-100%/18 per side, the exact inverse of that gutter); the
                  strip stays inside it.
     badges       one strip under the description: hairlines above and below,
                  three equal columns with a hairline between them (the
                  2026-08-25 evening bullets sat off-centre, see the rule).
     buttons      add-to-cart full width of the column with the price in it,
                  the enquiry button under it at the same width, the spec
                  sheet as a small centred link.
     accordions   the detail panels (cl-specs's former band) as <details>
                  rows right under the buttons, same hairline rhythm as the
                  badge strip.
     sticky bar   fixed to the bottom edge once the buttons scroll out
                  (neverover's pattern): 4.5rem tall, image, title, price,
                  the button, an arrow back to the top.
     toast        a review card at the bottom left, desktop only, that rises
                  for a few seconds at a time.

   Not in the export: the lightbox, the add-to-cart form, the sticky bar and
   the toast, styled on the base tokens.

   Round eighteen (client release feedback, 2026-08-27): no e-commerce. The
   add-to-cart form only renders with Theme settings > Commerce on, so its
   rules below are dormant; the three-state (wait, check, drawer) rules went
   with the drawer. The enquiry pill is the filled call to action, and a
   "Spezifikationen ansehen" outline pill under it scrolls to the
   Spezifikationen accordion (the panels and the spec card carry a
   scroll-margin-top for the sticky nav). The bundle's rows are links now.
   ========================================================================== */

/* Two things in this section bleed out of .page-padding on purpose: the phone
   gallery (margin-inline) and the video row (client, 2026-08-26, item 7). Both
   are computed to land exactly on the layout edge, and this is the belt under
   them, because the difference between the layout edge and 100vw is the
   reserved scrollbar gutter and getting it wrong is how this theme has twice
   put horizontal scroll on a page. `clip`, not `hidden`: it clips without
   becoming a scroll container, so the sticky gallery still sticks to the
   viewport, and the sticky bar, the toast and the dialogs are unaffected --
   the first two are fixed (a clip only reaches a fixed descendant when the
   clipping box is its containing block, which this is not) and the dialogs
   render in the top layer. overflow-y stays visible: paired with clip it is
   left as specified, so nothing here can grow a vertical scroller of its own. */
.cl-product { padding-top: 0; overflow-x: clip; overflow-y: visible; }
.cl .cl-product .padding-vertical.padding-xlarge { padding-top: 2.5rem; }

.cl-product__component {
  display: grid;
  grid-template-columns: minmax(0, 1.25fr) minmax(0, 1fr);
  column-gap: 4rem;
  row-gap: 3rem;
  align-items: start;
}

/* The buy column is two boxes -- .cl-product__content, the head down to the
   CTAs, and .cl-product__extras, everything under them -- so that a phone can
   put the Ausstattung chips between them (client, 2026-08-26, item 6). From
   768 up they are one column again and nothing about the desktop page moves:
   the head takes row 1 of column 2, the rest takes row 2 directly under it with
   no gap of its own (every block in it carries its own top margin, and the
   3rem row-gap above was inert while this grid had a single row), and the
   gallery spans both rows exactly as it spanned the one row before, so its
   sticky range is unchanged.

   `auto 1fr`, not `auto auto`: a grid item that spans two intrinsic rows and is
   taller than both grows them BOTH, which would open a gap between the head and
   the rest on a page whose gallery outruns its buy column (a short accessory).
   Spanning a flexible track takes the item out of intrinsic row sizing, so row
   one stays exactly the head's height and any excess lands in row two, below the
   content -- where it landed when the column was one box. */
@media screen and (min-width: 768px) {
  .cl-product__component { grid-template-rows: auto 1fr; row-gap: 0; }
  .cl-product__media { grid-column: 1; grid-row: 1 / span 2; }
  .cl-product__content { grid-column: 2; grid-row: 1; }
  .cl-product__extras { grid-column: 2; grid-row: 2; }
}

/* --------------------------------------------------------------------------
   Gallery: featured frame + thumbnail strip
   -------------------------------------------------------------------------- */

/* The gallery stays put while the column of accordions scrolls past it.

   Round eighteen (client, 2026-08-27, "on a MacBook only half the gallery is
   visible while scrolling"): a 5/4 frame on the 1.25fr column is 540px tall
   at 1440, and with the strip, the chips and an 88px offset the sticky
   column ran to ~900px, past any MacBook viewport once the browser's own
   chrome is taken off it (1440x900 leaves ~760px), so it stuck at the top
   and lost its bottom. The column is now capped at the viewport under the
   nav and the stage gives way: it is a flex column whose only shrinkable
   item is the stage, and the chain stage > track > slide > link > frame
   passes the shrink down (flex 0 1 auto and min-height 0 at every step; the
   automatic minimum of an aspect-ratio box is its own aspect height, which
   is exactly what must yield). The frame keeps its full width, so the photo
   sits `contain` inside a wider frame with pumice either side, the way the
   export's square frame already framed it. Nothing moves on a viewport with
   the room: every flex basis is the content height, and a cap above it is
   inert. The sticky top follows the nav's measured bottom edge (--cl-nav-h,
   written on <html> by cl-nav.liquid) plus 1rem instead of a guessed 5.5rem.
   Under 768 the column is display: contents, so none of this applies on a
   phone. */
.cl-product__media {
  min-width: 0;
  position: sticky;
  top: calc(var(--cl-nav-h, 4.5rem) + 1rem);
  display: flex;
  flex-direction: column;
  max-height: calc(100vh - var(--cl-nav-h, 4.5rem) - 2rem);
  max-height: calc(100dvh - var(--cl-nav-h, 4.5rem) - 2rem);
}
.cl-product__media > * { flex: none; }

/* the pumice box the export puts behind the image, and the positioning
   context the favourites button, the arrows and the zoom pill hang on */
.cl-product__stage {
  background-color: var(--cl-pumice);
  position: relative;
  border-radius: .5rem;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  flex: 0 1 auto;
  min-height: 0;
  cursor: zoom-in;
}

/* .w-slider-mask, driven by scroll-snap instead of Webflow's transforms */
.cl-product__track {
  display: flex;
  flex: 0 1 auto;
  min-height: 0;
  overflow-x: auto;
  overflow-y: hidden;
  scroll-snap-type: x mandatory;
  scrollbar-width: none;
  -webkit-overflow-scrolling: touch;
}
.cl-product__track::-webkit-scrollbar { display: none; }
.cl-product__track:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: -2px; }
/* Round eighteen: the script glides scrollLeft itself over 220ms and lets a
   mouse drag pull the frames; mandatory snap would fight both mid-way, so
   it is off while either runs (the glide lands on a snap point anyway) */
.cl-product__track.is-gliding,
.cl-product__track.is-dragging { scroll-snap-type: none; }
.cl-product__track.is-dragging,
.cl-product__track.is-dragging .cl-product__lightbox-link { cursor: grabbing; }

.cl-product__slide {
  flex: 0 0 100%;
  min-width: 0;
  scroll-snap-align: start;
  display: flex;
  flex-direction: column;
}
.cl-product__lightbox-link {
  display: flex;
  flex-direction: column;
  flex: 0 1 auto;
  min-height: 0;
  max-width: 100%;
  position: relative;
  color: inherit;
  cursor: zoom-in;
}
/* 5/4, a step taller than the 2026-08-23 frame (client, 2026-08-25) */
.cl-product__image-wrap {
  background-color: var(--cl-pumice);
  aspect-ratio: 5 / 4;
  position: relative;
  flex: 0 1 auto;
  min-height: 0;
  width: 100%;
}
.cl-product__image-wrap img,
.cl-product__image-wrap video,
.cl-product__image-wrap iframe {
  object-fit: contain;
  width: 100%;
  height: 100%;
  max-width: 100%;
  position: absolute;
  inset: 0;
}
/* a mouse drag slides the frames (round eighteen); the browser's own image
   drag, a ghost of the photo following the pointer, is what it used to do */
.cl-product__image-wrap img { -webkit-user-drag: none; user-select: none; }
/* Fit per product (client, 2026-08-25 night, accessory pages): `.is-cover`
   on the section when the liquid decides the photos are edge-to-edge (an
   accessory, custom.gallery_fit, a fit:cover tag). The frame goes square,
   which is what every accessory photo in the catalogue is (1080x1080,
   1194x1150, 1000x1000), so `cover` crops next to nothing; the pumice only
   shows while the file loads. Thumbnails follow the same rule. */
.cl-product.is-cover .cl-product__image-wrap { aspect-ratio: 1 / 1; }
.cl-product.is-cover .cl-product__image-wrap img, .cl-product.is-cover .cl-product__thumb img { object-fit: cover; }
.cl-product.is-contain .cl-product__thumb img { object-fit: contain; }

/* Round eighteen (client, 2026-08-27, "unintuitive, clicking does not
   work"): arrows on the stage, always there, and a zoom pill at the bottom
   right that rises on hover (always on, on a pointer that cannot hover) to
   say what a click on the photo does. White at 95% on a hairline, the
   modal's own button language. */
.cl-product__stage-arrow {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  z-index: 2;
  width: 2.75rem;
  height: 2.75rem;
  border-radius: 100px;
  border: 1px solid var(--cl-ink-15);
  background-color: #fffffff2;
  color: var(--cl-black);
  appearance: none;
  padding: 0;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 1rem;
  transition: background-color .15s ease;
}
.cl-product__stage-arrow.is-prev { left: 1rem; }
.cl-product__stage-arrow.is-next { right: 1rem; }
.cl-product__stage-arrow svg { width: 1em; height: 1em; display: block; }
.cl-product__stage-arrow:hover { background-color: var(--cl-white); }
.cl-product__stage-arrow:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: 2px; }
/* Round nineteen (client, 2026-08-28, no word next to the icon): the zoom
   control is the magnifier alone, a 2.5rem white disc on a soft shadow
   instead of the hairline pill, at the stage's bottom right. It still
   rises on hover and focus, and is always on where nothing hovers. */
.cl-product__zoom-hint {
  position: absolute;
  right: 1rem;
  bottom: 1rem;
  z-index: 2;
  width: 2.5rem;
  height: 2.5rem;
  padding: 0;
  border-radius: 100px;
  border: 0;
  background-color: var(--cl-white);
  color: var(--cl-black);
  box-shadow: 0 4px 14px var(--cl-ink-15);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  appearance: none;
  cursor: zoom-in;
  opacity: 0;
  transition: opacity .15s ease;
}
.cl-product__zoom-hint svg { width: 1.125rem; height: 1.125rem; display: block; }
.cl-product__stage:hover .cl-product__zoom-hint,
.cl-product__zoom-hint:focus-visible { opacity: 1; }
.cl-product__zoom-hint:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: 2px; }
@media (hover: none) { .cl-product__zoom-hint { opacity: 1; } }

/* the strip: a peek of the next thumbnail, the arrow on a white gradient.
   Round eighteen: the gradient is the wrapper's ::after and lets clicks
   through, the button is only as wide as its arrow, so the peeking
   thumbnail under the gradient answers a click of its own (it used to hit
   the 5rem button). */
.cl-product__thumbs-wrap { position: relative; margin-top: .75rem; }
.cl-product__thumbs-wrap::after {
  content: '';
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  width: 5rem;
  background: linear-gradient(to right, #ffffff00, var(--cl-white) 55%);
  pointer-events: none;
  transition: opacity .2s ease;
}
.cl-product__thumbs-wrap:has(.cl-product__thumbs-next.is-end)::after { opacity: 0; }
.cl-product__thumbs {
  display: flex;
  column-gap: .5rem;
  overflow-x: auto;
  scrollbar-width: none;
  -webkit-overflow-scrolling: touch;
  scroll-snap-type: x proximity;
}
.cl-product__thumbs::-webkit-scrollbar { display: none; }
.cl-product__thumb {
  flex: 0 0 auto;
  width: calc((100% - 2.5rem) / 5.4);
  aspect-ratio: 1 / 1;
  background-color: var(--cl-pumice);
  border: 1px solid #0000;
  border-radius: .25rem;
  padding: 0;
  cursor: pointer;
  appearance: none;
  opacity: .55;
  overflow: hidden;
  scroll-snap-align: start;
  transition: opacity .2s ease;
}
.cl-product__thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.cl-product__thumb:hover { opacity: 1; }
.cl-product__thumb.is-active { opacity: 1; border-color: var(--cl-cocoa); }
.cl-product__thumb:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: 2px; }
.cl-product__thumbs-next {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  z-index: 1;
  width: 2.5rem;
  padding: 0;
  border: 0;
  appearance: none;
  cursor: pointer;
  color: var(--cl-cocoa);
  background: none;
  display: flex;
  align-items: center;
  justify-content: flex-end;
  transition: opacity .2s ease;
}
.cl-product__thumbs-next svg { width: 1.25rem; height: 1.25rem; display: block; }
.cl-product__thumbs-next:hover svg { transform: translateX(2px); }
.cl-product__thumbs-next.is-end { opacity: 0; pointer-events: none; }
.cl-product__thumbs-next:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: -2px; }

/* --------------------------------------------------------------------------
   Text column
   -------------------------------------------------------------------------- */

.cl-product__content,
.cl-product__extras { min-width: 0; }

.cl-product__breadcrumbs {
  column-gap: .5rem;
  row-gap: .25rem;
  flex-wrap: wrap;
  align-items: center;
  letter-spacing: .5px;
  text-transform: uppercase;
  margin-bottom: 1rem;
  font-size: .75rem;
  font-weight: 400;
  display: flex;
}
.cl-product__breadcrumbs a { color: inherit; text-decoration: none; opacity: .65; }
.cl-product__breadcrumbs a:hover { text-decoration: underline; opacity: 1; }
.cl-product__crumb-arrow {
  flex-direction: column;
  justify-content: center;
  align-items: center;
  width: .4rem;
  display: flex;
  opacity: .65;
}
.cl-product__crumb-arrow svg { width: 100%; height: auto; display: block; }

/* the export's cascade: stock .margin-bottom (20px) wins at desktop, small is 0 */
.cl .cl-product__content > .margin-bottom.margin-medium { margin-bottom: 20px; }
.cl .cl-product__content .margin-bottom.margin-small { margin-bottom: 0; }

.cl-product__headline { display: flex; }
.cl .cl-product__headline h1 { min-width: 0; overflow-wrap: anywhere; font-size: 2.25rem; }

.cl-product__sizes { column-gap: .8rem; flex-wrap: wrap; display: flex; }
.cl-product__sizes-list { column-gap: 1.2rem; row-gap: 1.2rem; flex-wrap: wrap; display: flex; }
.cl-product__pill {
  column-gap: .4rem;
  border-bottom: 1px solid transparent;
  justify-content: center;
  align-items: center;
  max-width: 100%;
  padding-top: .5rem;
  padding-bottom: .5rem;
  font-size: .85rem;
  font-weight: 500;
  line-height: 1;
  color: inherit;
  text-decoration: none;
  display: flex;
}
.cl-product__pill:hover { text-decoration: none; border-bottom-color: var(--cl-ink-40); }
.cl-product__pill.is-current { border-bottom-color: var(--cl-cocoa); }

.cl-product__rating { display: flex; align-items: center; gap: .6rem; margin-top: 1rem; }
.cl-product__stars { display: inline-flex; gap: .15rem; }
.cl-product__star { width: 1rem; height: 1rem; color: var(--cl-golden); }
.cl-product__star.is-off { color: #00000026; }
.cl-product__star svg { width: 100%; height: 100%; fill: currentColor; display: block; }

/* .product-hero_description */
.cl-product__lead-block { margin-bottom: 1.5rem; }
.cl-product__lead { font-size: 1rem; font-weight: 400; line-height: 1.5; }
.cl .cl-product__lead p { margin: 0; }
.cl .cl-product__lead p + p { margin-top: 1rem; }

/* the badge strip (client, 2026-08-25 night): three EQUAL columns, not
   space-between. With space-between each item's own width decided where its
   bullet landed, so the bullets sat 24px after one label and 12px before the
   next and nothing lined up. Now every column is the same width, every icon
   sits at the same offset from its column's left edge, and a hairline between
   the columns replaces the bullets. Labels may wrap to two lines in a narrow
   column; the icon box is fixed so the text always starts at the same x.

   Refined (client, 2026-08-25 late, item 16): the space either side of a
   rule was not the same -- .5rem of padding-right before it and .75rem of
   padding-left after it, so each hairline sat 4px off centre in its gutter
   and the labels read as crowding the rule they follow. One token now sets
   both sides (`--cl-badge-gutter`), the strip's own outer edges stay flush
   with the column so the first icon lines up with the price and the buttons
   under it, and the items stretch so every rule is the same height whatever
   its neighbour's label does. Stacked (479) the rules turn horizontal with
   the same value above and below each one.

   .75rem a side is the widest gutter the three German labels take at 1440
   before "Kostenlose Lieferung**" wraps (measured: 1rem wraps it, the
   columns are 180px). Below 1440 every label wraps to two lines whatever
   the gutter, so 991 steps down to .625rem and buys back the text width. */
.cl-product__badges {
  --cl-badge-gutter: .75rem;
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  align-items: stretch;
  padding: 1rem 0;
  border-top: 1px solid var(--cl-ink-10);
  border-bottom: 1px solid var(--cl-ink-10);
  margin-bottom: 1.5rem;
  font-size: .75rem;
  line-height: 1.3;
}
.cl-product__badge {
  column-gap: .5rem;
  align-items: center;
  font-weight: 400;
  display: flex;
  min-width: 0;
  padding-inline: var(--cl-badge-gutter);
}
.cl-product__badge:first-child { padding-left: 0; }
.cl-product__badge:last-child { padding-right: 0; }
.cl-product__badge + .cl-product__badge { border-left: 1px solid var(--cl-ink-10); }
.cl-product__badge-icon {
  width: 1.25rem;
  height: 1.25rem;
  flex: none;
  display: flex;
  align-items: center;
  justify-content: center;
}
.cl-product__badge-icon svg,
.cl-product__badge-icon img { width: 100%; height: 100%; display: block; object-fit: contain; }

.cl-product__price-block { margin-bottom: 1rem; }
.cl-product__price { font-size: 1.5rem; font-weight: 400; }
.cl-product__compare { font-size: 1.125rem; margin-left: .3rem; }
.cl-product__tax { margin-left: .3rem; }
.cl-product__compare[hidden] { display: none; }

/* stacked, full width: the enquiry pill, the specs pill, the sheet link (and
   the add-to-cart form above them all while commerce is on) */
.cl-product__buttons {
  row-gap: .75rem;
  flex-flow: column;
  align-items: stretch;
  width: 100%;
  display: flex;
}
.cl-product__buy { width: 100%; }
.cl-product__button-wrap { display: block; }
.cl-product__buttons .button { width: 100%; max-width: 100%; min-width: 0; min-height: 3.5rem; padding-top: 0; padding-bottom: 0; white-space: nowrap; }
.cl-product .button.is-inverted { color: var(--cl-cocoa); background-color: #251f2000; }
.cl-product .button.is-inverted:hover { color: var(--cl-cocoa); background-color: var(--cl-lucid); }
.cl-product__sheet-link { display: block; text-align: center; margin-top: .6rem; color: inherit; text-decoration: underline; text-underline-offset: .15em; }

/* "Spezifikationen ansehen" (round eighteen). The client could not find the
   specifications: they were this small underlined link under the buttons. The
   pill is the theme's outline weight (the same stroke as .button.is-navbar
   .is-secondary in cl-base.css), full width like the CTA over it, with a
   chevron pointing where it goes -- down the page, not off it. The jump lands
   under the sticky nav: every panel and the spec card carry the same
   scroll-margin-top the Wissenswertes headings got in round seventeen. */
.cl-product__specs-btn { column-gap: .6rem; }
.cl-product__specs-btn-icon { width: .75rem; height: .5rem; flex: none; display: block; transition: transform .2s ease; }
.cl-product__specs-btn:hover .cl-product__specs-btn-icon { transform: translateY(.125rem); }
.cl-product__panels,
.cl-product__panel,
.cl-product__note { scroll-margin-top: calc(var(--cl-nav-h, 6.5rem) + 1.5rem); }
.cl-product__note:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: 4px; }
.cl-product__note:focus:not(:focus-visible) { outline: 0; }

/* --------------------------------------------------------------------------
   Add to cart: label + muted price, and the 15s sheen
   -------------------------------------------------------------------------- */

.cl-product__form, .cl-product__options { display: grid; row-gap: 1rem; }
.cl-product__option { display: grid; row-gap: .35rem; }
.cl-product__select {
  font: inherit;
  color: inherit;
  background: transparent;
  border: 1px solid var(--cl-cocoa);
  border-radius: .25rem;
  padding: .6rem .75rem;
  width: 100%;
}

.cl .cl-product__atc {
  position: relative;
  width: 100%;
  flex-wrap: wrap;
  padding-left: 1.75rem;
  padding-right: 1.75rem;
}
.cl-product__atc:disabled { opacity: .5; cursor: default; }
/* digits read better without the button's tracking; the dot is decoration, so
   it is drawn rather than written into the markup */
.cl-product__atc > span { white-space: nowrap; }
.cl-product__atc-price { letter-spacing: normal; }
.cl-product__atc-price::before { content: '·'; margin-right: .35rem; }
.cl-product__atc-price[hidden] { display: none; }

/* Superpower's "featured transparent" sweep: one pass, then a long wait. The
   band is a gradient inside a 300%-wide background, so what moves is
   background-position and the pseudo-element never leaves the button.

   ::before, not ::after: cl-base.css's .is-loading / .is-done draw their
   spinner and their check on ::after of the control, and this button uses
   both states (item 18). Absolutely positioned either way, so it still
   paints over the label. */
.cl-product__atc::before {
  content: '';
  position: absolute;
  inset: 0;
  border-radius: inherit;
  background-image: linear-gradient(100deg, #ffffff00 40%, #ffffff59 50%, #ffffff00 60%);
  background-size: 300% 100%;
  background-repeat: no-repeat;
  background-position: 100% 0;
  pointer-events: none;
  animation: cl-product-sheen 15s linear infinite;
}
@keyframes cl-product-sheen {
  0%   { background-position: 100% 0; }
  6%   { background-position: 0 0; }
  100% { background-position: 0 0; }
}
/* The working / done states of round thirteen (item 18) were removed in round
   eighteen with the /cart/add.js flow they marked; the form, when it renders
   at all, is a plain post. */


/* --------------------------------------------------------------------------
   Detail accordions, under the buttons
   -------------------------------------------------------------------------- */

.cl-product__panels { margin-top: 2rem; }
.cl-product__panel { border-top: 1px solid var(--cl-ink-10); }
.cl-product__panel:last-of-type { border-bottom: 1px solid var(--cl-ink-10); }
.cl-product__panel-head {
  cursor: pointer;
  list-style: none;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  padding: 1.125rem 0;
  font-size: 1.0625rem;
  font-weight: 500;
}
.cl-product__panel-head::-webkit-details-marker { display: none; }
.cl-product__panel-head::marker { content: ''; }
.cl-product__panel-head:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: 2px; }
.cl-product__panel-icon { flex: none; width: .625rem; color: var(--cl-cocoa); }
.cl-product__panel-icon svg { width: 100%; height: auto; display: block; transition: transform .3s ease; }
.cl-product__panel[open] .cl-product__panel-icon svg { transform: rotate(180deg); }
.cl-product__panel-body { overflow: hidden; }
.cl-product__panel[data-animating] .cl-product__panel-body { transition: height .4s ease; }
.cl-product__panel-inner { padding-bottom: 1.25rem; font-size: .9375rem; }

/* Garantie terms (client, 2026-08-25 late, item 14). The panel was a wall
   of legal prose; the summary a buyer scans for -- how long, what is
   covered, what is not -- now sits above it as a definition list on the
   same hairline rhythm as the accordions themselves, and the metafield
   prose stays under it as `.is-detail`: one step down in size, muted, with
   its own rule above. A drawer would have put the same two paragraphs a
   second click and a second surface away, and this panel is already one
   click deep. */
.cl .cl-product__terms {
  margin: 0 0 .25rem;
  display: grid;
  font-size: .875rem;
  line-height: 1.35;
}
.cl-product__term {
  display: grid;
  grid-template-columns: minmax(6rem, 34%) 1fr;
  column-gap: 1rem;
  padding: .5rem 0;
  border-top: 1px solid var(--cl-ink-10);
}
.cl-product__term:first-child { border-top: 0; padding-top: 0; }
.cl .cl-product__terms dt { font-weight: 500; }
.cl .cl-product__terms dd { margin: 0; color: var(--cl-ink-70); }
/* a line the merchant wrote with no "|" runs the full width */
.cl-product__term.is-note { grid-template-columns: 1fr; }
.cl-product__term.is-note dt { display: none; }
/* Three steps of contrast, so the summary is what the eye lands on: the term
   at full strength, its value one step back, the legal prose one step behind
   that. .75rem of air either side of the rule that separates them. */
.cl-product__panel-inner.is-detail {
  border-top: 1px solid var(--cl-ink-10);
  padding-top: .75rem;
  font-size: .875rem;
  color: var(--cl-ink-65);
}
.cl .cl-product__panel-inner p:last-child { margin-bottom: 0; }
/* the store's descriptions carry a <pre> from a translation tool around the
   dimensions line; as a <pre> it never wrapped and scrolled sideways under a
   bar (client, 2026-08-25). It reads as a paragraph here. */
.cl .cl-product__panel-inner pre { white-space: pre-wrap; overflow: visible; font: inherit; margin: 0 0 1rem; }
.cl .cl-product__panel-inner pre:last-child { margin-bottom: 0; }
/* custom.vat_description under the panels (client, 2026-08-26, item 8). It was
   one grey paragraph of "Label: value" lines -- the densest information on the
   page in its least readable form. cl-spec-terms cuts it on the newlines and on
   the first colon of each line and hands back the same .cl-product__terms list
   the Garantie panel uses, so the two blocks read as one language. Nothing new
   to style: the rows, the hairlines and the full-width no-colon line are the
   rules above, down to the first row carrying no rule of its own: the last
   panel's bottom hairline is already there, and a second one 20px under it
   would read as a double rule rather than as a new block. */
.cl-product__note { margin-top: 1.25rem; }

/* --------------------------------------------------------------------------
   Sticky bar
   -------------------------------------------------------------------------- */

.cl-product__sticky {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 60;
  background-color: var(--cl-white);
  border-top: 1px solid var(--cl-ink-10);
  box-shadow: 0 -8px 30px var(--cl-ink-12);
  padding: .625rem 5% calc(.625rem + env(safe-area-inset-bottom, 0px));
  transform: translateY(105%);
  transition: transform .34s cubic-bezier(.32, .72, 0, 1);
  pointer-events: none;
}
.cl-product__sticky.is-on { transform: none; pointer-events: auto; }
.cl-product__sticky-inner {
  max-width: 80rem;
  margin-inline: auto;
  display: flex;
  align-items: center;
  column-gap: 1rem;
}
.cl-product__sticky-image {
  flex: none;
  width: 3.25rem;
  height: 3.25rem;
  border-radius: .5rem;
  background-color: var(--cl-pumice);
  overflow: hidden;
  display: block;
}
.cl-product__sticky-image img { width: 100%; height: 100%; object-fit: cover; display: block; }
.cl-product__sticky-text { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; row-gap: .125rem; }
.cl-product__sticky-title { font-size: 1rem; font-weight: 500; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.cl-product__sticky-price { font-size: .875rem; }
.cl-product__sticky-top {
  flex: none;
  width: 2.75rem;
  height: 2.75rem;
  border-radius: 100px;
  border: 1px solid var(--cl-ink-15);
  background: var(--cl-white);
  color: var(--cl-cocoa);
  cursor: pointer;
  appearance: none;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  transition: background-color .2s ease;
}
.cl-product__sticky-top:hover { background-color: var(--cl-light-grey); }
.cl-product__sticky-top svg { width: 1.125rem; height: 1.125rem; display: block; }
.cl .cl-product__sticky-atc { flex: none; min-width: 0; padding-left: 1.75rem; padding-right: 1.75rem; }

/* --------------------------------------------------------------------------
   Review toast, bottom left on desktop
   -------------------------------------------------------------------------- */

.cl-product__toast {
  position: fixed;
  left: 1.5rem;
  bottom: 1.5rem;
  z-index: 55;
  width: 21rem;
  max-width: calc(100% - 3rem);
  display: flex;
  column-gap: .875rem;
  align-items: flex-start;
  padding: 1rem 2.25rem 1.125rem 1rem;
  border-radius: .75rem;
  overflow: hidden;
  background-color: var(--cl-white);
  border: 1px solid var(--cl-ink-10);
  box-shadow: 0 16px 40px var(--cl-ink-16);
  color: var(--cl-black);
  opacity: 0;
  transform: translateY(1rem);
  transition: opacity .4s ease, transform .5s cubic-bezier(.2, 0, 0, 1), bottom .34s cubic-bezier(.32, .72, 0, 1);
  pointer-events: none;
}
.cl-product__toast[hidden] { display: none; }
.cl-product__toast.is-on { opacity: 1; transform: none; pointer-events: auto; }
/* lifted over the sticky bar while that is up */
.cl-product.has-sticky .cl-product__toast { bottom: 6.25rem; }
.cl-product__toast-avatar {
  flex: none;
  width: 2.5rem;
  height: 2.5rem;
  border-radius: 100px;
  background-color: var(--cl-lucid);
  color: var(--cl-cocoa);
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 1rem;
  font-weight: 500;
}
.cl-product__toast-body { display: flex; flex-direction: column; row-gap: .125rem; min-width: 0; }
.cl-product__toast-stars { color: var(--cl-golden); font-size: .8125rem; letter-spacing: .1em; line-height: 1; }
.cl-product__toast-name { font-size: .875rem; font-weight: 500; }
.cl-product__toast-quote {
  font-size: .875rem;
  line-height: 1.45;
  opacity: .8;
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.cl-product__toast-close {
  position: absolute;
  top: .5rem;
  right: .625rem;
  appearance: none;
  background: none;
  border: 0;
  color: inherit;
  opacity: .5;
  font-size: 1.25rem;
  line-height: 1;
  cursor: pointer;
  padding: .25rem;
}
.cl-product__toast-close:hover { opacity: 1; }

/* --------------------------------------------------------------------------
   Lightbox (not in the export)
   -------------------------------------------------------------------------- */

/* Full screen (client, 2026-08-25, neverover's zoom): the dialog is the whole
   viewport on white, the image as large as the viewport minus the strip of
   thumbnails, arrows on the sides, a round close button top right. */
.cl-product__lightbox {
  border: 0;
  padding: 0;
  margin: 0;
  width: 100vw;
  height: 100vh;
  height: 100dvh;
  max-width: none;
  max-height: none;
  inset: 0;
  overflow: hidden;
  background: var(--cl-white);
  color: var(--cl-black);
  display: none;
  flex-direction: column;
}
.cl-product__lightbox[open] { display: flex; position: fixed; }
.cl-product__lightbox::backdrop { background: var(--cl-white); }
/* Round eighteen (client, 2026-08-27): touch-action none, because the pinch,
   the pan and the swipe are all the script's now (pan-y let the browser eat
   the pinch); the wrap transforms from its top left corner so the script's
   zoom-around-a-point sum is one line; .2s on the transform, none while a
   finger or the mouse is on it (.is-instant). The image's fitted size is
   set inline by the script, the max-* pair is the no-script fallback. */
.cl-product__lb-stage { position: relative; flex: 1 1 auto; min-height: 0; height: 100%; display: flex; align-items: center; justify-content: center; padding: 3.5rem 5rem 1rem; touch-action: none; overflow: hidden; }
.cl-product__lb-wrap { max-width: 100%; max-height: 100%; display: flex; align-items: center; justify-content: center; transform-origin: 0 0; transition: transform .2s ease; cursor: zoom-in; will-change: transform; }
.cl-product__lb-wrap.is-zoomed { cursor: grab; }
.cl-product__lb-wrap.is-instant { transition: none; }
.cl-product__lb-image { max-width: 100%; max-height: 100%; width: auto; height: auto; object-fit: contain; display: block; user-select: none; -webkit-user-drag: none; }
.cl-product__lb-count {
  position: absolute;
  left: 50%;
  bottom: 6.25rem;
  transform: translateX(-50%);
  z-index: 2;
  padding: .5rem 1rem;
  border-radius: 100px;
  background-color: #ffffffb3;
  border: 1px solid var(--cl-ink-8);
  -webkit-backdrop-filter: blur(4px);
  backdrop-filter: blur(4px);
  font-size: .75rem;
  letter-spacing: .05em;
  font-variant-numeric: tabular-nums;
  pointer-events: none;
}
.cl-product__lb-arrow,
.cl-product__lb-tool {
  appearance: none;
  border: 1px solid var(--cl-ink-15);
  background: var(--cl-white);
  color: var(--cl-black);
  cursor: pointer;
  padding: 0;
  border-radius: 100px;
  width: 2.75rem;
  height: 2.75rem;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: background-color .2s ease, opacity .2s ease;
}
.cl-product__lb-arrow:hover,
.cl-product__lb-tool:hover { background-color: var(--cl-light-grey); }
.cl-product__lb-arrow { position: absolute; top: 50%; transform: translateY(-50%); font-size: 1rem; z-index: 2; }
.cl-product__lb-arrow.is-prev { left: 1.5rem; }
.cl-product__lb-arrow.is-next { right: 1.5rem; }
.cl-product__lb-arrow svg { width: 1em; height: 1em; }
/* the tool row (round eighteen): minus, plus, close, top right */
.cl-product__lb-tools { position: absolute; top: 1.25rem; right: 1.5rem; z-index: 3; display: flex; column-gap: .5rem; }
.cl-product__lb-tool svg { width: 1.125rem; height: 1.125rem; display: block; }
.cl-product__lb-tool:disabled { opacity: .35; cursor: default; background-color: var(--cl-white); }
.cl-product__lb-thumbs { flex: none; display: flex; justify-content: center; gap: .5rem; padding: .5rem 1rem calc(1.25rem + env(safe-area-inset-bottom, 0px)); overflow-x: auto; scrollbar-width: none; }
.cl-product__lb-thumbs::-webkit-scrollbar { display: none; }
.cl-product__lb-thumb { flex: none; appearance: none; border: 1px solid transparent; border-radius: .25rem; background: var(--cl-pumice); padding: 0; width: 4rem; height: 4rem; cursor: pointer; overflow: hidden; opacity: .55; transition: opacity .2s ease; }
.cl-product__lb-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.cl-product__lb-thumb:hover { opacity: 1; }
.cl-product__lb-thumb.is-active { opacity: 1; border-color: var(--cl-cocoa); }
.cl-product__lb-thumb:focus-visible,
.cl-product__lb-arrow:focus-visible,
.cl-product__lb-tool:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: 2px; }

/* --------------------------------------------------------------------------
   Breakpoints
   -------------------------------------------------------------------------- */

/* the floor under the round-eighteen cap, on the stage because it is the
   outermost link of the shrink chain (a floor on the frame alone would be
   clipped by the track above it): a window shorter than this (a 1280x800
   MacBook with two toolbars) loses the bottom of the chips instead of
   squashing the photo to a letterbox */
@media screen and (min-width: 768px) {
  .cl-product__stage { min-height: 16rem; }
}
@media screen and (max-width: 1199px) {
  .cl-product__component { column-gap: 3rem; }
  .cl .cl-product__headline h1 { font-size: 2rem; }
}
@media screen and (max-width: 991px) {
  .cl-product__component { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); column-gap: 2.5rem; }
  .cl .cl-product__headline h1 { font-size: 1.75rem; }
  .cl-product__thumb { width: calc((100% - 1.5rem) / 4.4); }
  .cl-product__sizes-list { row-gap: .6rem; }
  /* the three columns stay; a long label wraps to a second line instead */
  .cl-product__badges { --cl-badge-gutter: .625rem; }
  .cl-product__toast { display: none; }
}
@media screen and (max-width: 767px) {
  /* Ausstattung under the CTAs (client, 2026-08-26, item 6). The chips block
     belongs to the media column, which is right on desktop -- it sits under the
     gallery -- but when the grid collapses to one column it landed between the
     gallery and the title, pushing the price and the buttons a screen down.

     The media wrapper leaves the box tree here (display: contents), which
     promotes the stage, the thumbnail strip and the chips block to grid items
     of .cl-product__component; with the buy column already split in two, `order`
     then reads: gallery, thumbs, title / price / CTAs, Ausstattung, everything
     else. One DOM, rendered once, and no desktop rule is touched.

     row-gap goes to 0 and every block spaces itself the way it already did
     inside the column, so nothing on a phone moves but the chips: the strip's
     1rem is its own margin, the head's 1.5rem is the gap this row-gap used to
     draw, and the chips and the blocks under them keep the margins they had.
     min-width: 0 is what .cl-product__media carried on the column's behalf and
     the promoted blocks now need for themselves. */
  .cl-product__component { grid-template-columns: minmax(0, 1fr); row-gap: 0; }
  /* position is inert on a box that is not there; it stays declared so the
     gallery cannot quietly become sticky again on a phone if this ever goes
     back to being a box */
  .cl-product__media { display: contents; position: static; }
  .cl-product__stage,
  .cl-product__thumbs-wrap,
  .cl-product__chips-block { min-width: 0; }
  .cl-product__content { margin-top: 1.5rem; }
  .cl-product__chips-block { order: 1; }
  .cl-product__extras { order: 2; }
  /* Round fifteen item 4: the gallery starts AT the bar. 1.5rem of nothing
     between a sticky bar and the photo under it is the whole first impression
     on a phone. The bottom of the wrapper is untouched. */
  .cl .cl-product .padding-vertical.padding-xlarge { padding-top: 0; }
  /* edge to edge: undo .page-padding's 5% gutter, which is 1/18 of the 90%
     this box measures its own percentages against. */
  .cl-product__stage { width: auto; margin-inline: calc(-100% / 18); border-radius: 0; }
  .cl-product__image-wrap { max-height: 55vh; }
  .cl-product__thumbs-wrap { margin-top: 1rem; }
  .cl-product__thumb { width: calc((100% - 1.5rem) / 4.4); }
  .cl-product__thumbs-wrap::after { width: 4rem; }
  /* the stage arrows shrink on a phone, where the swipe is the main move */
  .cl-product__stage-arrow { width: 2.25rem; height: 2.25rem; font-size: .875rem; }
  .cl-product__stage-arrow.is-prev { left: .75rem; }
  .cl-product__stage-arrow.is-next { right: .75rem; }
  .cl-product__zoom-hint { right: .75rem; bottom: .75rem; }
  .cl .cl-product__headline h1 { font-size: 2rem; }
  .cl .cl-product__atc { font-size: .813rem; letter-spacing: 1.5px; padding-left: 1.5rem; padding-right: 1.5rem; }
  .cl .cl-product__content > .margin-bottom.margin-medium { margin-bottom: 1.5rem; }
  .cl-product__lb-stage { padding: 3.5rem 1rem 1rem; }
  .cl-product__lb-arrow { display: none; }
  .cl-product__lb-tools { top: .75rem; right: .75rem; column-gap: .375rem; }
  .cl-product__lb-tool { width: 2.5rem; height: 2.5rem; }
  .cl-product__lb-thumb { width: 3.25rem; height: 3.25rem; }
  .cl-product__lb-count { bottom: 5.25rem; }
  /* sticky bar on a phone: no image, no back-to-top; title, price, button */
  .cl-product__sticky { padding-left: 1rem; padding-right: 1rem; }
  .cl-product__sticky-image,
  .cl-product__sticky-top { display: none; }
  .cl-product__sticky-title { font-size: .9375rem; }
  .cl .cl-product__sticky-atc { font-size: .75rem; letter-spacing: 1px; padding-left: 1.25rem; padding-right: 1.25rem; min-width: 0; }
}
@media screen and (max-width: 479px) {
  .cl .cl-product__headline h1 { font-size: 1.8rem; }
  /* the product's own name is the h1 right under it; two levels are enough on a phone */
  .cl-product__crumb-current,
  .cl-product__crumb-arrow:has(+ .cl-product__crumb-current) { display: none; }
  /* the Garantie terms stack, the term over its value */
  .cl-product__term { grid-template-columns: 1fr; row-gap: .125rem; }
  /* Round fifteen item 5: the three stay INLINE on a phone. Stacked, they
     spent three rows and two rules on three short promises and pushed the
     price down a screen. Three columns still hold at 390: the icon drops to
     1rem, the gutter to .375rem, and the labels take the two lines they need
     ("Lebenslange / Garantie*"). The rules stay vertical, which is what makes
     three columns read as one strip. */
  .cl-product__badges { --cl-badge-gutter: .375rem; font-size: .6875rem; }
  .cl-product__badge { column-gap: .375rem; align-items: flex-start; }
  .cl-product__badge-icon { width: 1rem; height: 1rem; margin-top: .0625rem; }
}
@media (prefers-reduced-motion: reduce) {
  .cl-product__track { scroll-behavior: auto; }
  .cl-product__thumb,
  .cl-product__thumbs-next,
  .cl-product__sticky,
  .cl-product__toast,
  .cl-product__panel-icon svg { transition: none; }
  .cl-product__atc::before { animation: none; }
}

/* --------------------------------------------------------------------------
   Trust widget, feature chips, included row, frequently bought together
   (client, 2026-08-25, Superpower's PDP)
   -------------------------------------------------------------------------- */

.cl-product__trust { margin-top: .5rem; margin-bottom: 1rem; }

/* Round fifteen item 6. The heading is a button now, and above 767 it has to
   look exactly like the div it replaced: no chrome of its own, no pointer, and
   the list under it always open. `is-accordion` is added by script only where
   the accordion is live, so nothing here fires on a desktop that never sees
   the class. */
.cl-product__chips-head {
  appearance: none; border: 0; background: none; padding: 0;
  font: inherit; color: inherit; text-align: left;
  display: flex; align-items: center; justify-content: space-between; gap: .75rem;
  width: 100%; cursor: default;
}
.cl-product__chips-chevron { display: none; width: .75rem; height: .5rem; flex: none; opacity: .6; transition: transform .25s ease; }
.cl-product__chips-block.is-accordion .cl-product__chips-head { cursor: pointer; }
.cl-product__chips-block.is-accordion .cl-product__chips-chevron { display: block; }
.cl-product__chips-block.is-accordion.is-open .cl-product__chips-chevron { transform: rotate(180deg); }
.cl-product__chips-block.is-accordion .cl-product__chips-head { margin-bottom: 0; padding-block: .875rem; border-top: 1px solid var(--cl-ink-10); border-bottom: 1px solid var(--cl-ink-10); }
.cl-product__chips-block.is-accordion.is-open .cl-product__chips-head { border-bottom-color: transparent; }
.cl-product__chips-block.is-accordion:not(.is-open) .cl-product__chips { display: none; }
.cl-product__chips-block.is-accordion.is-open .cl-product__chips { padding-top: .875rem; padding-bottom: .25rem; }
.cl-product__chips-head:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: 2px; }
@media (prefers-reduced-motion: reduce) {
  .cl-product__chips-chevron { transition: none; }
}

.cl-product__kicker {
  font-size: .75rem;
  letter-spacing: 1px;
  text-transform: uppercase;
  font-weight: 500;
  color: var(--cl-ink-65);
  margin-bottom: .875rem;
}

/* under the gallery (client, 2026-08-25): compact pills that wrap two or
   three to a line, not one per line.

   Aligned (client, 2026-08-25 late, item 15). Two faults, both real:

   1. The whole list sat 20px in from everything else in the column.
      `.cl ul { margin: 1rem 0; padding-left: 1.25rem }` in cl-base.css
      outspecifies a bare `.cl-product__chips { margin: 0; padding: 0 }`, so
      the reset never applied: the ticks started at x=104 while the kicker,
      the gallery frame and the thumbnail strip all started at x=75. The
      selector carries `.cl` now so it wins, and the loose gap under the
      kicker (its .875rem plus the list's inherited 1rem) goes with it.
   2. As a wrapping flex row every pill was as wide as its own label, so
      only the first tick in each line sat on a common left edge -- the
      second started wherever the label before it happened to end (x=331,
      397, 449 down the same block). The row is a grid now: `auto-fill,
      minmax(15rem, 1fr)` gives two equal columns while the gallery column
      is wide enough for them and one below that (991 and 479), each pill
      fills its cell, and the tick is a fixed 1rem box at the head of it.

   Every tick and every label therefore starts on one of two verticals at
   any width, and both gutters are the same .5rem. `align-items: start`
   keeps the tick on the first line of a label that wraps. */
.cl-product__chips-block { margin-top: 1.5rem; }
/* Round seventeen: a wrapping row again. The client wants the Ausstattung
   pills one after another, each as wide as its label, wrapping as they run
   out of line -- not the two-column grid round fifteen built, whose empty
   cell halves read as "big spacing between them" even after round sixteen
   shrank each pill inside its cell. */
.cl .cl-product__chips {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: .5rem;
}
.cl-product__chip {
  display: flex;
  align-items: start;
  column-gap: .4rem;
  padding: .375rem .7rem .375rem .5rem;
  border: 1px solid var(--cl-ink-12);
  /* a capsule on one line (the pill is 28px tall), a rounded box when a
     label wraps -- 100px turned a two-line cell into a lozenge */
  border-radius: 1rem;
  font-size: .8125rem;
  line-height: 1.2;
  background-color: var(--cl-white);
}
.cl-product__chip[hidden] { display: none; }
.cl-product__chip-check {
  flex: none;
  width: 1rem;
  height: 1rem;
  border-radius: 100px;
  background-color: var(--cl-cocoa);
  color: var(--cl-white);
  display: inline-flex;
  align-items: center;
  justify-content: center;
}
.cl-product__chip-check svg { width: .7rem; height: .7rem; display: block; }
/* the "+N mehr" control is not a feature: it keeps its own width and sits
   on the first column's left edge, under the last row of pills */
.cl-product__chip.is-toggle { padding: 0; border: 0; background: none; justify-self: start; }
.cl-product__chip-more {
  appearance: none;
  border: 1px solid var(--cl-ink-20);
  background-color: var(--cl-lucidity);
  color: var(--cl-cocoa);
  border-radius: 100px;
  padding: .375rem .7rem;
  font: inherit;
  font-size: .8125rem;
  font-weight: 500;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  column-gap: .4rem;
}
.cl-product__chip-more svg { width: .4rem; height: .7rem; }
.cl-product__chip-more:hover { background-color: var(--cl-lucid); }

/* --------------------------------------------------------------------------
   Videos (client, 2026-08-25 night; moved into the buy column 2026-08-25
   late). Cards in a row that scrolls with a peek of the next one, the play
   disc and a translucent label from the Stories band, a round arrow on
   either edge. Portrait 4:5 by default (the section's `videos_ratio`), 16:9
   for the YouTube films.

   The row now sits in the buy column, directly above the accordions, so
   every size is driven off the column and not the viewport: the track is a
   container (`container-type: inline-size`) and each card is a fraction of
   `100cqw`, which is ~540px at 1440, ~425px at 991 and ~430px at 479. That
   is a little over half the width the row had under the gallery, so the
   cards, the play disc, the label and the arrows all step down one size
   rather than the row scrolling four cards of a size that no longer fits.

   Bleeding to the right screen edge (client, 2026-08-26, item 7). The row
   started and ended on the column, so it read as a finished block of two and
   a bit cards rather than as something you can push. The SCROLL CONTAINER now
   runs from the column's left edge, past .page-padding's gutter, to the edge
   of the viewport: nothing is clipped at the start, the card after the fold is
   cut by the screen, and the row reads as scrollable without an affordance
   having to say so. Only the track is pulled. .cl-product__videos-viewport
   keeps the column's width, so the arrows stay on the column's edges (an
   arrow at the screen edge would sit in the scrollbar gutter) and the cards
   keep the size they were given for the column, because `container-type` is
   still on the viewport. The bleed shows more of the next card; it does not
   grow the cards.

   --cl-vbleed is that distance, and it is measured off the element's own
   containing block, NOT in vw: `scrollbar-gutter: stable` in cl-base.css
   reserves the scrollbar's width inside the layout viewport, so 100vw is
   wider than the page by that gutter and a vw bleed overflows the document by
   it at every width. This theme has shipped that bug twice; cl-faq.css and
   cl-main-blog.css carry the same note on the same mistake.

   The gutter is .page-padding's 5% of the layout width, which is one
   eighteenth of .container-large, and the column is a known fraction of the
   container at every breakpoint: one eighteenth of the container is
   100%/8 + gap/18 in the 1.25fr : 1fr grid, 100%/9 + gap/18 in the 1fr : 1fr
   one, and 100%/18 once the grid is a single column. All exact, no viewport
   units, nothing that can exceed the document.

   Past 1422px the container hits its 80rem cap and stops growing with the
   viewport, so the distance to the screen edge is (100vw - 80rem) / 2 and the
   column no longer knows it: that one case has to be a viewport unit. It
   overshoots by half the scrollbar gutter, and `overflow-x: clip` on the
   section absorbs it -- the row is clipped flush with the layout edge and the
   overflow never reaches the document.
   -------------------------------------------------------------------------- */
.cl-product__videos { margin-top: 2rem; --cl-vbleed: 0px; }
/* Round fifteen items 7 and 8. The bleed is a PHONE affordance and only that.
   Round fourteen pulled the row to the screen edge at every width, and on
   desktop that read as a row escaping its grid: there is no swipe on a mouse,
   the arrow is how the row moves, and a row that runs under the page's own
   right edge has nothing to say. So above 767 the track ends on the column and
   clips itself; on a phone it still runs to the edge, because that IS the
   affordance -- a card cut by the screen is what says "push me".

   The left never bleeds at any width: the first card is flush with the column
   at scroll 0, so nothing is clipped on that side until the visitor scrolls it
   there (item 7). One column on a phone, so the column IS the container and
   the bleed is exactly .page-padding's gutter, one eighteenth of it. */
@media screen and (max-width: 767px) {
  .cl-product__videos { --cl-vbleed: calc(100% / 18); }
}
.cl-product__videos-viewport { position: relative; container-type: inline-size; }
.cl-product__videos-track {
  display: grid;
  grid-auto-flow: column;
  grid-auto-columns: calc((100cqw - 2 * .5rem) / 2.85);
  column-gap: .5rem;
  /* the bleed. The snap positions are the card starts and there is no scroll
     padding either side, so the first card is flush with the column at scroll
     0 and the last one reaches the screen edge at the end of the scroll. */
  margin-right: calc(-1 * var(--cl-vbleed));
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  scroll-behavior: smooth;
  scrollbar-width: none;
  -webkit-overflow-scrolling: touch;
  padding-bottom: .25rem;
}
.cl-product__videos.is-landscape .cl-product__videos-track { grid-auto-columns: calc((100cqw - .5rem) / 1.85); }
.cl-product__videos-track::-webkit-scrollbar { display: none; }
.cl-product__videos-track:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: 2px; }
.cl-product__video-card {
  position: relative;
  aspect-ratio: 4 / 5;
  border-radius: .625rem;
  overflow: hidden;
  background-color: var(--cl-black);
  scroll-snap-align: start;
}
.cl-product__videos.is-landscape .cl-product__video-card { aspect-ratio: 16 / 9; }
.cl-product__video-open {
  appearance: none;
  border: 0;
  padding: 0;
  margin: 0;
  background: none;
  color: inherit;
  font: inherit;
  text-align: left;
  cursor: pointer;
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  display: block;
}
.cl-product__video-open:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: -3px; }
.cl-product__video-poster,
.cl-product__video-loop { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; display: block; }
.cl-product__video-loop { z-index: 1; opacity: 0; transition: opacity .25s ease; }
.cl-product__video-card.is-previewing .cl-product__video-loop { opacity: 1; }
.cl-product__video-open::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 2;
  pointer-events: none;
  background-image: linear-gradient(to top, var(--cl-ink-60) 0%, transparent 50%);
}
.cl-product__video-play {
  position: absolute;
  inset: 0;
  margin: auto;
  z-index: 3;
  width: 2.25rem;
  height: 2.25rem;
  border: 1px solid #ffffff80;
  border-radius: 100px;
  color: var(--cl-black);
  background-color: #ffffffd9;
  -webkit-backdrop-filter: blur(.5rem);
  backdrop-filter: blur(.5rem);
  display: flex;
  align-items: center;
  justify-content: center;
  transition: transform .2s ease, background-color .2s ease;
}
.cl-product__video-open:hover .cl-product__video-play { transform: scale(1.06); background-color: var(--cl-white); }
.cl-product__video-play svg { width: .6875rem; height: .6875rem; margin-left: .1rem; display: block; }
.cl-product__video-label {
  position: absolute;
  left: .5rem;
  right: .5rem;
  bottom: .5rem;
  z-index: 3;
  color: var(--cl-white);
  font-size: .6875rem;
  line-height: 1.25;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.cl-product__videos-arrow {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  z-index: 4;
  width: 2rem;
  height: 2rem;
  border-radius: 100px;
  border: 1px solid var(--cl-ink-15);
  background-color: var(--cl-white);
  color: var(--cl-black);
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  appearance: none;
  padding: 0;
  box-shadow: 0 8px 24px var(--cl-ink-15);
  transition: background-color .2s ease;
}
.cl-product__videos-arrow:hover { background-color: var(--cl-light-grey); }
.cl-product__videos-arrow[hidden] { display: none; }
/* Item 7: no arrows on a phone. The row is a swipe there, and the last card
   running off the screen edge says so without a control in the way. */
@media screen and (max-width: 767px) {
  .cl-product__videos-arrow { display: none; }
}
/* the buy column has no bleed room either side, so the arrows sit ON the
   row's edge instead of overhanging it the way the gallery strip's does */
.cl-product__videos-arrow.is-next { right: .25rem; }
.cl-product__videos-arrow.is-prev { left: .25rem; }
.cl-product__videos-arrow svg { width: .875rem; height: .875rem; display: block; }
.cl-product__video-dialog { border: 0; padding: 0; background: transparent; width: min(90vw, 26rem); max-width: none; }
.cl-product__video-dialog.is-wide { width: min(92vw, 64rem); }
.cl-product__video-dialog::backdrop { background: #ffffffbf; -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px); }
.cl-product__video-frame { position: relative; aspect-ratio: 9 / 16; max-height: 90vh; margin: auto; background: #000; border-radius: 1rem; overflow: hidden; box-shadow: 0 24px 64px var(--cl-ink-25); }
.cl-product__video-dialog.is-wide .cl-product__video-frame { aspect-ratio: 16 / 9; }
.cl-product__video-frame video,
.cl-product__video-frame iframe { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; object-fit: contain; background: #000; display: block; }
.cl-product__video-close { position: absolute; top: .5rem; right: .75rem; z-index: 2; appearance: none; background: none; border: 0; color: var(--cl-white); font-size: 1.75rem; line-height: 1; cursor: pointer; text-shadow: 0 1px 4px #00000080; }

/* four on one row (client, 2026-08-25): a square lifestyle photo per item,
   note and label under it; the icon tile is only the fallback while a block
   has no image */
.cl-product__included { margin-top: 2rem; }
.cl-product__included-row { display: grid; grid-template-columns: repeat(4, 1fr); gap: .75rem; }
.cl-product__included-card { display: flex; flex-direction: column; row-gap: .375rem; min-width: 0; }
.cl-product__included-media {
  display: block;
  width: 100%;
  aspect-ratio: 1 / 1;
  border-radius: .5rem;
  overflow: hidden;
  background-color: var(--cl-lucidity);
  color: var(--cl-cocoa);
  position: relative;
}
.cl-product__included-media img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; display: block; }
.cl-product__included-media svg { position: absolute; inset: 0; margin: auto; width: 1.375rem; height: 1.375rem; }
.cl-product__included-note { font-size: .6875rem; color: var(--cl-ink-50); line-height: 1.2; margin-top: .125rem; }
.cl-product__included-note s { text-decoration: line-through; }
.cl-product__included-label { font-size: .8125rem; line-height: 1.25; }

/* Passendes Zubehör (round eighteen; "Häufig zusammen gekauft" until then).
   The card and its hairline rows are unchanged; what sat in each row changed.
   A row was a label around a drawn checkbox, with a running total in a button
   under the list. With no cart the row IS the link: image, name, price, and a
   chevron on the right edge that says "there is a page behind this", where
   the tick used to say "this goes in". No foot, no button, no total. */
.cl-product__fbt { margin-top: 2rem; border: 1px solid var(--cl-ink-12); border-radius: .75rem; padding: 1.25rem; }
.cl-product__fbt-list { display: flex; flex-direction: column; }
.cl .cl-product__fbt-row {
  display: flex;
  align-items: center;
  column-gap: .875rem;
  padding: .75rem 0;
  border-top: 1px solid var(--cl-ink-10);
  color: inherit;
  text-decoration: none;
}
.cl-product__fbt-row:first-child { border-top: 0; padding-top: 0; }
.cl-product__fbt-image { flex: none; width: 2.75rem; height: 2.75rem; border-radius: .5rem; overflow: hidden; background-color: var(--cl-pumice); }
.cl-product__fbt-image img { width: 100%; height: 100%; object-fit: cover; display: block; }
.cl-product__fbt-text { display: flex; flex-direction: column; row-gap: .125rem; min-width: 0; }
.cl-product__fbt-title {
  font-size: .9375rem;
  line-height: 1.3;
  color: inherit;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
/* an accessory's own picks: tighter rows, one-line names */
.cl-product__fbt.is-compact { padding: 1rem; }
.cl-product__fbt.is-compact .cl-product__fbt-row { padding: .5rem 0; }
.cl-product__fbt.is-compact .cl-product__fbt-title { -webkit-line-clamp: 1; font-size: .875rem; }
.cl-product__fbt.is-compact .cl-product__fbt-image { width: 2.25rem; height: 2.25rem; }
.cl-product__fbt-row:hover .cl-product__fbt-title { text-decoration: underline; text-underline-offset: .15em; }
.cl-product__fbt-price { font-size: .875rem; color: var(--cl-ink-65); }
.cl-product__fbt-arrow { flex: none; margin-left: auto; width: .5rem; height: .875rem; color: var(--cl-ink-65); display: block; transition: transform .2s ease; }
.cl-product__fbt-arrow svg { width: 100%; height: 100%; display: block; }
.cl-product__fbt-row:hover .cl-product__fbt-arrow { transform: translateX(.125rem); color: var(--cl-cocoa); }
.cl-product__fbt-row:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: 2px; border-radius: .25rem; }

/* the toast's draining bar: full at show, empty when the card goes */
.cl-product__toast-bar { position: absolute; left: 0; right: 0; bottom: 0; height: 3px; background-color: var(--cl-ink-10); }
.cl-product__toast-fill { display: block; height: 100%; width: 100%; background-color: var(--cl-cocoa); transform-origin: left; transform: scaleX(1); }
.cl-product__toast-fill.is-run { animation: cl-toast-drain var(--cl-toast-stay, 7000ms) linear forwards; }
@keyframes cl-toast-drain { from { transform: scaleX(1); } to { transform: scaleX(0); } }

@media screen and (max-width: 767px) {
  .cl-product__videos-track { grid-auto-columns: calc((100cqw - 2 * .5rem) / 2.35); }
  .cl-product__videos.is-landscape .cl-product__videos-track { grid-auto-columns: calc((100cqw - .5rem) / 1.55); }
}
@media (prefers-reduced-motion: reduce) {
  .cl-product__videos-track { scroll-behavior: auto; }
  .cl-product__video-play, .cl-product__videos-arrow, .cl-product__video-loop { transition: none; }
}
@media screen and (max-width: 479px) {
  .cl-product__included-row { gap: .5rem; }
  .cl-product__included-label { font-size: .75rem; }
}
@media (prefers-reduced-motion: reduce) {
  .cl-product__toast-fill.is-run { animation: none; transform: scaleX(1); }
}

/* --------------------------------------------------------------------------
   No blur-up on the gallery or the thumbs (client, 2026-08-25): the renders
   are transparent PNGs on `contain`, so a blurred copy underneath stayed
   visible as a halo around the sauna. The frames only fade in (.cl-fade,
   cl-base.css). Cover images elsewhere keep their .cl-lqip.
   -------------------------------------------------------------------------- */
.cl-product__thumb { position: relative; }

/* ===========================================================================
   Round sixteen, product page
   =========================================================================== */

/* The Ausstattung chips: round sixteen shrank each pill inside its grid cell;
   round seventeen dropped the grid altogether (see .cl-product__chips above),
   so there is nothing left to align here. */

/* The spec block under the panels is its own card now.

   It carried the densest information on the page -- outside dimensions, load,
   plug type, warranty -- on the same white ground as everything above it, with
   no heading, directly under the last accordion, so it read as spillover from
   Garantie rather than as the specification it is.

   Grey ground, its own radius and padding, and a heading. Not an accordion:
   the client asked for it open, and it is the answer to the two questions a
   buyer actually has before they enquire. */
.cl-product__note {
  margin-top: 1.75rem;
  padding: 1.25rem 1.375rem 1.375rem;
  border-radius: .875rem;
  background-color: var(--cl-light-grey);
}

.cl-product__note-head {
  margin-bottom: .875rem;
  font-size: .6875rem;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--cl-ink-65);
}

/* Inside the card the rows carry an icon in the term column. The grid gets a
   third track for it so the labels still align on one vertical whether or not a
   row matched an icon, and the hairlines run edge to edge as before. */
.cl-product__note .cl-product__terms { --cl-term-icon: 1.125rem; }
.cl-product__note .cl-product__term { border-top-color: var(--cl-ink-12); }
.cl-product__note .cl-product__term:first-child { border-top: 0; padding-top: 0; }

.cl .cl-product__note .cl-product__terms dt {
  display: grid;
  grid-template-columns: var(--cl-term-icon) minmax(0, 1fr);
  align-items: start;
  column-gap: .5rem;
}
/* A row with no icon keeps the label on the same vertical as one that has it:
   the track is still there, it is just empty. */
.cl-product__term-icon {
  width: var(--cl-term-icon);
  height: var(--cl-term-icon);
  color: var(--cl-cocoa);
  opacity: .75;
}
.cl-product__term-icon svg { width: 100%; height: 100%; display: block; }
.cl-product__term-label { min-width: 0; }

/* The lead lines with no term (the model name, the plug type) span the row and
   have no icon track to reserve. */
.cl-product__note .cl-product__term.is-note dd { color: var(--cl-black); }

@media screen and (max-width: 767px) {
  .cl-product__note { padding: 1rem 1.125rem 1.125rem; }
}


/* cl-quiz.css */
/* ==========================================================================
   Sauna-Finder quiz (cl-quiz). Immersive variant: the section is a viewport-
   high stage over one constant blurred photo.

   Round thirteen items 1-3 still hold: the page has no site nav and no footer
   (layout/quiz.liquid), the section brings its own chrome, the progress rail
   is full-bleed, and step content sits in a WRAPPER (.cl-quiz__wrap) with its
   own ground and radius.

   Round fourteen:
   1. Answer cards are ONE column unless a step earns two.
   2. The select control is the theme's checkbox, empty at rest, cocoa when
      chosen (moved to the card's corner in round sixteen).
   3. An answer may carry a small thumbnail (Standort: indoors / outdoors).
   4. ONE blurred backdrop for the whole quiz, fixed to the viewport.
   5. The chrome is the logo and one pill; the rail sits below the row.
   D. Bottom right, a running summary of every answer, each row a way back to
      the question it came from.

   Round eighteen (2026-08-27, client brief items 1-8):
   1. The step's CTA carries the beat: .is-waiting fades "Weiter" out and a
      spinner plus "Alles klar, im Haus" in, inside the pill. The card that
      stood between two questions is gone, and with it the only width change
      on the page.
   3. The height morph is on the CARD (.cl-quiz__wrap), not the box around
      the panels: FLIP in script, `transition: height` here, and the card
      clips only while it moves, along its own rounded corners. Every panel is
      44rem, so nothing snaps.
   4. Zurück is centred above the question.
   5. A stroke icon per answer on a lucidity disc before the label.
   6. The thinking card: a reel of the model renders, one on at a time, over a
      spinner and the answers.
   7. The lead form uses cl-base's .cl-field pattern; the phone control's
      country face lives here (.cl-phone).
   8. The result is one column: render, name, price, why, facts, reasons,
      CTAs, runner-up, the send form, Von vorn.

   Tokens and type from cl-base.css. The chrome is white-on-photo, the wrapper
   is cocoa-on-lucidity, and gold carries the eyebrows.
   Decisions: docs/quiz-design.md.
   ========================================================================== */

.cl-quiz {
  position: relative;
  display: flex;
  flex-direction: column;
  min-height: var(--cl-quiz-height, 100vh);
  color: var(--cl-white);
  background: var(--cl-cocoa);
  overflow: hidden;
  isolation: isolate;
  --cl-quiz-ease: cubic-bezier(.4, 0, .2, 1);
}
@supports (height: 100svh) {
  .cl-quiz.is-vh { min-height: 100svh; }
}
/* When the site nav IS on the page it is a normal-flow sticky bar, so its
   height comes off the stage. On the quiz layout there is no nav: .cl-nav
   writes --cl-nav-h as an inline style on <html>, which would win over any
   class rule, so the whole declaration is skipped instead. */
@media screen and (min-width: 992px) {
  html:not(.cl-quiz-solo) .cl-quiz.is-vh { min-height: calc(100vh - var(--cl-nav-h, 0px)); }
}

/* ---- solo page ---------------------------------------------------------
   layout/quiz.liquid puts .cl-quiz-solo on <html> and renders no section
   groups at all, so these rules never fire there. They are the fallback for
   the same section on a template that does render the site chrome. */
.cl-quiz-solo .shopify-section-group-header-group,
.cl-quiz-solo .shopify-section-group-footer-group,
.cl-quiz-solo .cl-nav,
.cl-quiz-solo .cl-footer { display: none !important; }
.cl-quiz-solo .cl .main-wrapper { padding-top: 0; }
/* No overflow rule on body: `overflow-x: hidden` there promotes overflow-y to
   auto, which turns the backdrops' overhang into a real scrollbar and takes
   11px off the full-bleed rail. .cl-quiz's own `overflow: hidden` already
   clips them. */

/* ---- backdrop ----------------------------------------------------------
   Round fourteen item 4: ONE photo for the whole quiz, blurred, with a scrim
   over it. The blur is real (28px), which means the layer has to be oversized
   (`inset: -4%`) or its own blurred edges show as a soft frame. Both layers
   are FIXED to the viewport, not sized off the section, so the framing is a
   pure function of the window and never breathes with the card's height. */
.cl-quiz__backdrops { position: absolute; inset: 0; z-index: 0; background: var(--cl-cocoa); }
.cl-quiz__backdrop {
  position: fixed; inset: -4%;
  background-position: center;
  background-size: cover;
  background-repeat: no-repeat;
  filter: blur(28px) saturate(1.06);
  -webkit-user-drag: none; user-select: none;
}
.cl-quiz__backdrop.is-plain { background-image: linear-gradient(160deg, var(--cl-cocoa-lift), var(--cl-cocoa)); }
.cl-quiz__tint {
  position: fixed; inset: 0;
  background:
    linear-gradient(180deg, rgba(37, 31, 32, calc(var(--cl-quiz-tint, .45) + .2)) 0%, rgba(37, 31, 32, calc(var(--cl-quiz-tint, .45) + .06)) 38%, rgba(37, 31, 32, calc(var(--cl-quiz-tint, .45) + .24)) 100%);
}

/* ---- chrome: logo, one CTA, then the rail -------------------------------- */
.cl-quiz__chrome {
  position: relative; z-index: 2;
  display: flex; flex-direction: column;
  /* the backdrop can be bright exactly where the chrome sits, so it carries
     its own scrim; without it the logo vanishes on a light photo */
  background: linear-gradient(180deg, var(--cl-ink-50) 0%, var(--cl-ink-22) 60%, #251f2000 100%);
}
.cl-quiz__chrome-row {
  display: flex; align-items: center; justify-content: space-between;
  column-gap: 1.25rem;
  padding: 1rem 5%;
  min-height: 4rem;
}
.cl-quiz__brand { display: flex; align-items: center; min-width: 0; }
.cl-quiz__logo {
  display: block; width: auto;
  height: 1.875rem;
  /* one logo file for every ground: flattened to white over the photo */
  filter: brightness(0) invert(1) drop-shadow(0 1px 4px #251f2073);
  opacity: .95;
}
.cl-quiz__brand:hover .cl-quiz__logo { opacity: 1; }
.cl-quiz__wordmark { font-family: var(--cl-font-heading); font-size: 1.5rem; color: var(--cl-white); text-decoration: none; }
.cl-quiz__brand:focus-visible { outline: 2px solid var(--cl-white); outline-offset: 4px; border-radius: .25rem; }

/* The theme's outline-on-photo pill, .button.invert-colors.button-small. */
.cl-quiz__shop { flex: none; }

/* The rail is edge to edge, no padding, a hairline (round fifteen item 13),
   and the percentage rides it (round sixteen item 1). */
.cl-quiz__rail {
  position: relative;
  height: .125rem;
  background: rgba(255,255,255,.22);
  flex: none;
  overflow: visible;
}
.cl-quiz__rail[hidden] { display: none; }
.cl-quiz__rail-fill {
  display: block; height: 100%; width: 0;
  background: var(--cl-white);
  transition: width .525s cubic-bezier(.357, .007, .58, 1);
}
.cl-quiz__pct {
  position: absolute;
  top: 50%;
  /* clamped, so at 0% and 100% the pill tucks against the edge instead of
     hanging half off the viewport (round eighteen, seen on the result) */
  left: clamp(1.75rem, var(--cl-quiz-pct, 0%), calc(100% - 1.75rem));
  z-index: 2;
  transform: translate(-50%, -50%);
  padding: .1875rem .5rem;
  border-radius: 999px;
  border: 1px solid rgb(255 255 255 / 55%);
  background-color: rgb(255 255 255 / 10%);
  -webkit-backdrop-filter: blur(8px);
  backdrop-filter: blur(8px);
  color: var(--cl-white);
  font-size: .6875rem;
  letter-spacing: .06em;
  font-variant-numeric: tabular-nums;
  transition: left .525s cubic-bezier(.357, .007, .58, 1);
}
.cl-quiz__pct[hidden] { display: none; }
@media (prefers-reduced-motion: reduce) {
  .cl-quiz__rail-fill,
  .cl-quiz__pct { transition: none; }
}

@media screen and (max-width: 767px) {
  .cl-quiz__chrome-row { padding: .75rem 5%; min-height: 3.5rem; }
  .cl-quiz__logo { height: 1.5rem; }
  .cl-quiz__wordmark { font-size: 1.25rem; }
}

/* ---- stage, panels and the card ------------------------------------------ */
.cl-quiz__stage {
  position: relative; z-index: 1;
  flex: 1 1 auto;
  display: flex; align-items: center; justify-content: center;
  padding: 2.5rem 5% 3.5rem;
  min-height: 0;
}
/* Round eighteen item 3: the box holds the panels and does nothing else.
   It no longer carries a transition and never clips (the old
   `.is-morphing { overflow: hidden }` on this unrounded box is what cut the
   card's bottom corners flat while it grew). It stays centred in the stage,
   so the card resizes about its middle. */
.cl-quiz__morph {
  position: relative;
  width: 100%;
  display: flex; align-items: center; justify-content: center;
  overflow: visible;
}
/* Every panel is the same width. The result was 68rem and the between-steps
   card 30rem, and each of those was a width SNAP the height morph could not
   hide: that snap was the "reset" the client kept seeing. */
.cl-quiz__panel {
  width: 100%;
  max-width: 44rem;
  margin-inline: auto;
}
.cl-quiz__panel[hidden] { display: none; }

/* The card: its own ground and radius over the photo, no shadow (round
   fifteen item 18). It is what morphs: the script pins its height to the
   outgoing card's, then lets the transition carry it to its own. Overflow is
   clipped only while that runs, and since the clip is the card's own rounded
   box, the corners are the same 1.25rem at every frame. */
.cl-quiz__wrap {
  box-sizing: border-box;
  background: var(--cl-lucidity);
  color: var(--cl-cocoa);
  border-radius: 1.25rem;
  padding: 2.25rem 2.5rem 2.5rem;
  transition: height .45s var(--cl-quiz-ease);
}
.cl-quiz__wrap.is-morphing { overflow: hidden; }
@media (prefers-reduced-motion: reduce) {
  .cl-quiz__wrap { transition: none; }
}

/* ---- spinner -----------------------------------------------------------
   One spinner, three sizes: on the thinking card, inside the CTA (inverse,
   small) and on the busy submit. */
.cl-quiz__spinner {
  display: inline-block;
  width: 1.75rem; height: 1.75rem; flex: none;
  border-radius: 50%;
  border: 2px solid var(--cl-ink-16);
  border-top-color: var(--cl-cocoa);
  animation: cl-quiz-spin .8s linear infinite;
}
.cl-quiz__spinner.is-small { width: 1rem; height: 1rem; border-width: 2px; }
.cl-quiz__spinner.is-inverse { border-color: rgba(255,255,255,.28); border-top-color: var(--cl-white); }
@keyframes cl-quiz-spin { to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) {
  .cl-quiz__spinner { animation: none; }
}

/* ---- item D: the running summary, bottom right ------------------------- */
.cl-quiz__tally {
  position: absolute; z-index: 3;
  right: 2rem; bottom: 2rem;
  width: 17rem;
  display: flex; flex-direction: column;
  border-radius: .75rem;
  border: 1px solid rgba(255,255,255,.16);
  background: #251f206b;
  backdrop-filter: blur(14px); -webkit-backdrop-filter: blur(14px);
  box-shadow: 0 1rem 2.5rem var(--cl-ink-28);
  color: var(--cl-white);
  overflow: hidden;
}
.cl-quiz__tally[hidden] { display: none; }
.cl-quiz__tally-head {
  display: flex; align-items: center; gap: .5rem;
  padding: .75rem .875rem .5rem;
  border: 0; background: none; color: inherit; cursor: pointer;
  font-family: inherit; font-size: .75rem; letter-spacing: .08em; text-transform: uppercase;
  text-align: left;
}
.cl-quiz__tally-head:focus-visible { outline: 2px solid var(--cl-white); outline-offset: -2px; }
.cl-quiz__tally-title { flex: 1 1 auto; opacity: .82; }
.cl-quiz__tally-count {
  flex: none; min-width: 1.25rem; height: 1.25rem; padding: 0 .25rem;
  display: inline-flex; align-items: center; justify-content: center;
  border-radius: .25rem;
  background: var(--cl-lucid); color: var(--cl-cocoa);
  font-size: .75rem; letter-spacing: 0;
}
.cl-quiz__tally-chevron {
  width: .875rem; height: .875rem; flex: none; opacity: .7;
  transition: transform .3s var(--cl-quiz-ease);
}
.cl-quiz__tally.is-collapsed .cl-quiz__tally-chevron { transform: rotate(180deg); }
.cl-quiz__tally-list {
  list-style: none; margin: 0;
  padding: 0 .5rem .5rem;
  max-height: 44vh; overflow-y: auto;
}
.cl-quiz__tally.is-collapsed .cl-quiz__tally-list { display: none; }
.cl-quiz__tally-row + .cl-quiz__tally-row { border-top: 1px solid rgba(255,255,255,.1); }
.cl-quiz__tally-jump {
  width: 100%;
  display: flex; flex-direction: column; gap: .125rem;
  padding: .5rem .375rem;
  border: 0; border-radius: .375rem;
  background: none; color: inherit; cursor: pointer;
  font-family: inherit; text-align: left;
}
.cl-quiz__tally-jump:hover { background: rgba(255,255,255,.1); }
.cl-quiz__tally-jump:focus-visible { outline: 2px solid var(--cl-white); outline-offset: -2px; }
.cl-quiz__tally-q { font-size: .6875rem; letter-spacing: .06em; text-transform: uppercase; opacity: .6; }
.cl-quiz__tally-a { font-size: .875rem; line-height: 1.35; }
@media (prefers-reduced-motion: reduce) {
  .cl-quiz__tally-chevron { transition: none; }
}
@media screen and (max-width: 1279px) {
  .cl-quiz__tally {
    right: 1rem; bottom: 1rem;
    width: auto; overflow: visible;
    border: 0; background: none; box-shadow: none;
    backdrop-filter: none; -webkit-backdrop-filter: none;
  }
  .cl-quiz__tally-head {
    border-radius: 2rem;
    border: 1px solid rgba(255,255,255,.16);
    background: #251f208c;
    backdrop-filter: blur(14px); -webkit-backdrop-filter: blur(14px);
    box-shadow: 0 .75rem 2rem #251f204d;
  }
  .cl-quiz__tally-list {
    position: absolute; right: 0; bottom: calc(100% + .5rem);
    width: min(15rem, calc(100vw - 2rem));
    padding: .5rem;
    border-radius: .75rem;
    border: 1px solid rgba(255,255,255,.16);
    background: #251f209e;
    backdrop-filter: blur(16px); -webkit-backdrop-filter: blur(16px);
    box-shadow: 0 1rem 2.5rem var(--cl-ink-35);
    max-height: 50vh;
  }
}

/* ---- round eighteen item 4: Zurück, centred above the question ----------
   A quiet text control; `display: flex` with auto margins is what centres a
   button inside a block card (inline-flex would sit on the text baseline at
   the left). The gap under it is what used to separate it from the question
   when it stood top left. */
.cl-quiz__back {
  appearance: none; border: 0; background: none; padding: .125rem .375rem;
  margin: 0 auto 1rem;
  width: max-content;
  color: var(--cl-cocoa); font: inherit; font-size: .8125rem; line-height: 1;
  display: flex; align-items: center; gap: .3rem;
  letter-spacing: .02em; opacity: .58; cursor: pointer;
  transition: opacity .15s ease;
}
.cl-quiz__back:hover { opacity: 1; }
.cl-quiz__back:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: 3px; border-radius: .25rem; opacity: 1; }
.cl-quiz__back[hidden] { display: none; }
.cl-quiz__back svg { width: .875rem; height: .875rem; flex: none; }
@media (prefers-reduced-motion: reduce) {
  .cl-quiz__back { transition: none; }
}

.cl-quiz__copy { text-align: center; }
.cl-quiz__eyebrow {
  font-size: .75rem; letter-spacing: .18em; text-transform: uppercase;
  color: var(--cl-dark-red); font-weight: 500;
  margin-bottom: .75rem; min-height: 1em;
}
.cl-quiz__title, .cl-quiz__question { color: inherit; }
/* Round sixteen item 2: scoped under .cl so the hint's auto margins outrank
   cl-base's `.cl p { margin: 0 }` reset instead of racing it on order. */
.cl .cl-quiz__hint { margin-top: .75rem; margin-inline: auto; max-width: 34rem; font-size: .9375rem; opacity: .72; }
.cl .cl-quiz__lead { margin-top: 1rem; margin-inline: auto; max-width: 36rem; font-size: 1.0625rem; line-height: 1.55; color: var(--cl-cocoa); opacity: .82; }
.cl-quiz__actions { display: flex; flex-direction: column; align-items: center; gap: .75rem; margin-top: 1.75rem; }
.cl-quiz__meta { font-size: .8125rem; opacity: .65; }

/* ---- answer cards --------------------------------------------------------
   ONE column unless a step earns two (`.is-duo`, only from 1200px). */
.cl-quiz__answers {
  display: grid;
  grid-template-columns: 1fr;
  gap: .625rem;
  margin-top: 2.25rem;
  text-align: left;
}
@media screen and (min-width: 1200px) {
  .cl-quiz__answers.is-duo { grid-template-columns: 1fr 1fr; }
}
.cl-quiz__answer {
  appearance: none;
  position: relative;
  display: flex; align-items: center; gap: .875rem;
  width: 100%; min-height: 4rem;
  padding: .875rem 1rem;
  border: 1px solid var(--cl-ink-14); border-radius: .75rem;
  background: var(--cl-white);
  color: var(--cl-cocoa);
  font: inherit; text-align: left; line-height: 1.35;
  cursor: pointer;
  transition: background .15s ease, border-color .15s ease;
  -webkit-tap-highlight-color: transparent;
}
/* Round fifteen item 20: hover moves the border colour, nothing else. */
.cl-quiz__answer:hover { border-color: var(--cl-cocoa); }
.cl-quiz__answer:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: 2px; }
/* chosen = cocoa BORDER plus a filled checkbox; the inset ring doubles the
   border's weight without moving a pixel of layout */
.cl-quiz__answer.is-on {
  background: var(--cl-white);
  border-color: var(--cl-cocoa);
  box-shadow: inset 0 0 0 1px var(--cl-cocoa);
}
.cl-quiz__answer-main {
  display: flex; align-items: flex-start;
  flex: 1 1 auto; min-width: 0;
  /* the text keeps clear of the corner the tick sits in */
  padding-right: 2.25rem;
}
/* Round sixteen item 3: the theme's checkbox (.cl-contact-form__box,
   .cl-compare-add: white square, #b9a495 hairline, .25rem radius, cocoa with
   the white tick when on) in the card's top right, 1.375rem. */
.cl-quiz__box {
  position: absolute;
  top: .75rem; right: .75rem;
  width: 1.375rem; min-width: 1.375rem;
  height: 1.375rem; min-height: 1.375rem;
  background-color: #fff;
  background-position: 50%;
  background-repeat: no-repeat;
  background-size: 14px 14px;
  border: 1px solid var(--cl-line);
  border-radius: .25rem;
  line-height: normal;
  transition: background-color .2s, border-color .2s;
}
.cl-quiz__answer:hover .cl-quiz__box { border-color: var(--cl-cocoa); }
.cl-quiz__answer.is-on .cl-quiz__box {
  background-color: var(--cl-cocoa);
  border-color: var(--cl-cocoa);
  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='%23fff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' d='M3.5 8.5l3 3 6-7'/%3E%3C/svg%3E");
}
@media (prefers-reduced-motion: reduce) {
  .cl-quiz__box { transition: none; }
}
/* Round fourteen item 3: the optional per-answer thumbnail. */
.cl-quiz__thumb {
  flex: none;
  width: 4rem; height: 4rem;
  border-radius: .5rem; overflow: hidden;
  background: var(--cl-pumice);
}
.cl-quiz__thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.cl-quiz__answer.has-thumb { padding: .75rem .875rem; }
/* Round eighteen item 5: the icon. A 2.5rem lucidity disc, the glyph at
   1.375rem inside it, cocoa stroke; cocoa disc with a white glyph once the
   answer is chosen, so the card's two state marks agree. Same size at every
   width: the brief asks for the icons on a phone too. */
.cl-quiz__icon {
  flex: none;
  display: inline-flex; align-items: center; justify-content: center;
  width: 2.5rem; height: 2.5rem;
  border-radius: 50%;
  background: var(--cl-lucidity);
  color: var(--cl-cocoa);
  transition: background-color .2s, color .2s;
}
.cl-quiz__icon svg { width: 1.375rem; height: 1.375rem; display: block; }
.cl-quiz__answer.is-on .cl-quiz__icon { background: var(--cl-cocoa); color: var(--cl-white); }
@media (prefers-reduced-motion: reduce) {
  .cl-quiz__icon { transition: none; }
}

.cl-quiz__answer-text { display: flex; flex-direction: column; gap: .15rem; min-width: 0; flex: 1 1 auto; }
.cl-quiz__answer-label { font-size: 1rem; font-weight: 400; line-height: 1.35; }
.cl-quiz__answer-sub { font-size: .8125rem; line-height: 1.4; opacity: .68; }
@media screen and (max-width: 767px) {
  .cl-quiz__answer { min-height: 3.5rem; padding: .8125rem .875rem; gap: .75rem; }
  .cl-quiz__answer.has-thumb { padding: .625rem .75rem; }
  .cl-quiz__thumb { width: 3.25rem; height: 3.25rem; }
}

/* ---- round eighteen item 1: the CTA and its wait state --------------------
   The pill is the card's one primary button, under the answers, there from
   the first paint and disabled until something is chosen. When an answer is
   chosen the rest label fades out and the wait row fades in ON TOP of it,
   anchored to the button (not the label), so a long echo gets the whole
   pill and the button never changes size. One line, ellipsis: the echo is
   quoted in full by the summary. The width is fixed so the pill does not
   jump between "Weiter" and "Alles klar, etwa 140 × 125 cm an einer Wand". */
.cl-quiz__step-actions {
  display: flex; justify-content: center;
  margin-top: 1.75rem;
}
.cl-quiz__next {
  position: relative;
  width: min(100%, 22rem);
  overflow: hidden;
}
.cl-quiz__next[disabled] { opacity: .38; pointer-events: none; }
.cl-quiz__next.is-waiting[disabled],
.cl-quiz__next.is-waiting { opacity: 1; pointer-events: none; }
.cl-quiz__next-label {
  display: block;
  transition: opacity .15s ease;
}
.cl-quiz__next-wait {
  position: absolute; inset: 0;
  display: flex; align-items: center; justify-content: center; gap: .625rem;
  padding: 0 1.25rem;
  opacity: 0;
  transition: opacity .2s ease;
}
.cl-quiz__next-text {
  min-width: 0; max-width: 100%;
  overflow: hidden; white-space: nowrap; text-overflow: ellipsis;
}
.cl-quiz__next.is-waiting .cl-quiz__next-label { opacity: 0; }
.cl-quiz__next.is-waiting .cl-quiz__next-wait { opacity: 1; }
@media (prefers-reduced-motion: reduce) {
  .cl-quiz__next-label,
  .cl-quiz__next-wait { transition: none; }
}

/* ---- lead step (round eighteen item 7) ----------------------------------
   Fields are cl-base's .cl-field; only the layout and the phone's country
   face are the quiz's own. Name and e-mail share a row from 768px, the phone
   takes the whole row: a country face plus a number needs the width. */
.cl-quiz__form { margin-top: 1.5rem; text-align: left; }
.cl-quiz__fields { display: grid; grid-template-columns: 1fr; gap: .875rem; }
@media screen and (min-width: 768px) {
  .cl-quiz__fields { grid-template-columns: 1fr 1.4fr; }
  .cl-quiz__fields .cl-field.is-full { grid-column: 1 / -1; }
}
/* The country face: flag, dial code, chevron, and the native <select> laid
   over it at opacity 0 so the picker is the platform's own (and reachable by
   keyboard and screen reader). It shares the input's border and radius on
   the left, the input continues on the right. */
.cl-field.is-phone .cl-field__control { align-items: stretch; }
.cl-phone__country {
  position: relative;
  flex: none;
  display: inline-flex; align-items: center; gap: .5rem;
  min-height: 3.25rem;
  padding: 0 .75rem 0 .875rem;
  border: 1px solid var(--cl-ink-22); border-right: 0;
  border-radius: .625rem 0 0 .625rem;
  background: var(--cl-white);
  color: var(--cl-cocoa);
  font-size: .9375rem;
  font-variant-numeric: tabular-nums;
}
.cl-phone__country:focus-within { border-color: var(--cl-cocoa); box-shadow: inset 0 0 0 1px var(--cl-cocoa); }
.cl-phone__code { white-space: nowrap; }
.cl-phone__chevron { width: .875rem; height: .875rem; opacity: .6; flex: none; }
.cl-phone__select {
  position: absolute; inset: 0;
  width: 100%; height: 100%;
  opacity: 0; cursor: pointer;
  font-size: 1rem; /* iOS zooms into a select under 16px */
}
.cl .cl-field.is-phone .cl-phone__input { border-radius: 0 .625rem .625rem 0; }
/* the state ring on the phone runs across the face too */
.cl .cl-field.is-phone.is-valid .cl-phone__country { border-color: var(--cl-valid); box-shadow: inset 0 0 0 1px var(--cl-valid); }
.cl .cl-field.is-phone.is-invalid .cl-phone__country { border-color: var(--cl-dark-red); box-shadow: inset 0 0 0 1px var(--cl-dark-red); }

/* Round fifteen item 19: the submit stands clear of the inputs. */
.cl-quiz__form .cl-quiz__actions { margin-top: 2rem; }
.cl-quiz__skip {
  appearance: none; border: 0; background: none; color: inherit; font: inherit; font-size: .9375rem;
  text-decoration: underline; text-underline-offset: .2em; opacity: .7; cursor: pointer; padding: .25rem .5rem;
}
.cl-quiz__skip:hover { opacity: 1; }
.cl-quiz__consent { margin-top: 1.75rem; font-size: .75rem; line-height: 1.5; opacity: .62; text-align: center; }
.cl-quiz .button.is-busy { opacity: .6; pointer-events: none; }

/* ---- round eighteen item 6: the thinking card ----------------------------
   A 14rem by 10rem reel with every render stacked, one visible at a time;
   the crossfade is 180ms so seven models in two seconds read as a shuffle
   and not a strobe. Under it the model's name, the spinner, the line and
   the answers. */
.cl-quiz__thinking {
  display: flex; flex-direction: column; align-items: center;
  gap: .625rem; text-align: center;
}
.cl-quiz__reel {
  position: relative;
  width: min(100%, 16rem); aspect-ratio: 4 / 3;
  border-radius: .75rem;
  background: var(--cl-white);
  overflow: hidden;
}
.cl-quiz__reel-img {
  position: absolute; inset: 0;
  width: 100%; height: 100%;
  object-fit: contain; padding: .5rem;
  opacity: 0;
  transition: opacity .18s ease;
}
.cl-quiz__reel-img.is-on { opacity: 1; }
.cl-quiz__reel-name { font-family: var(--cl-font-heading); font-size: 1.125rem; min-height: 1.5em; }
.cl-quiz__thinking .cl-quiz__spinner { margin-top: .5rem; }
.cl .cl-quiz__thinking-title { font-size: 1.0625rem; line-height: 1.4; margin-top: .25rem; }
.cl .cl-quiz__thinking-line { font-size: .875rem; line-height: 1.5; opacity: .66; max-width: 30rem; margin-inline: auto; }
@media (prefers-reduced-motion: reduce) {
  .cl-quiz__reel-img { transition: none; }
}

/* ---- round eighteen item 8: the result, one column -----------------------
   Render on top, then the copy. The render sits on the theme's white ground
   at 4:3, contained, with the same radius as an answer card; the body is a
   left-aligned column so the facts and the reasons line up down one edge. */
.cl-quiz__wrap.is-result { padding: 2rem 2.5rem 2.25rem; }
.cl-quiz__result { display: flex; flex-direction: column; gap: 1.25rem; }
.cl-quiz__result-eyebrow { text-align: center; margin-bottom: 0; }
.cl-quiz__result-image {
  display: block;
  border-radius: .75rem;
  background: var(--cl-white);
  border: 1px solid var(--cl-ink-10);
  aspect-ratio: 16 / 10;
  overflow: hidden;
}
.cl-quiz__result-image img { width: 100%; height: 100%; object-fit: contain; display: block; padding: 1rem; }
.cl-quiz__result-body { display: flex; flex-direction: column; gap: .625rem; text-align: left; }
.cl-quiz__result-name { color: inherit; }
.cl-quiz__result-price { font-family: var(--cl-font-heading); font-size: 1.5rem; }
.cl .cl-quiz__result-why { font-size: 1.0625rem; line-height: 1.5; }
/* the four facts: icon on a lucid disc, label over value */
.cl .cl-quiz__facts {
  list-style: none; margin: .25rem 0 0; padding: 0;
  display: grid; grid-template-columns: 1fr 1fr; gap: .75rem 1rem;
}
.cl-quiz__fact { display: flex; align-items: center; gap: .625rem; min-width: 0; }
.cl-quiz__fact-icon {
  flex: none;
  display: inline-flex; align-items: center; justify-content: center;
  width: 2.25rem; height: 2.25rem; border-radius: 50%;
  background: var(--cl-white); color: var(--cl-cocoa);
}
.cl-quiz__fact-icon svg { width: 1.25rem; height: 1.25rem; display: block; }
.cl-quiz__fact-text { display: flex; flex-direction: column; min-width: 0; }
.cl-quiz__fact-label { font-size: .6875rem; letter-spacing: .08em; text-transform: uppercase; opacity: .6; }
.cl-quiz__fact-value { font-size: .9375rem; line-height: 1.35; }
.cl .cl-quiz__reasons { margin: .5rem 0 0; padding: 0; list-style: none; display: grid; gap: .5rem; }
.cl-quiz__reasons li { position: relative; padding-left: 1.5rem; line-height: 1.45; font-size: .9375rem; }
.cl-quiz__reasons li::before {
  content: ""; position: absolute; left: 0; top: .45em; width: .9375rem; height: .9375rem;
  background: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Ccircle cx='8' cy='8' r='8' fill='%23251f20'/%3E%3Cpath d='M4.6 8.4l2.2 2.2 4.6-5' fill='none' stroke='%23fff' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center / contain no-repeat;
}
.cl-quiz__addon { margin-top: .25rem; padding: .625rem .75rem; border-radius: .5rem; background: var(--cl-lucid); }
.cl-quiz__addon[hidden] { display: none; }
.cl-quiz__result-actions { display: flex; flex-wrap: wrap; gap: .75rem; margin-top: .75rem; }
.cl-quiz__result-actions .button,
.cl-quiz__result-actions .button-secondary { min-width: 0; flex: 1 1 14rem; }
.cl-quiz__result-link { align-self: center; color: inherit; font-size: .9375rem; text-decoration: underline; text-underline-offset: .2em; opacity: .8; }
.cl-quiz__result-link:hover { opacity: 1; }

/* runner-up: a quiet row with the render, the name and the line */
.cl-quiz__runner {
  border-top: 1px solid var(--cl-ink-12);
  padding-top: 1.25rem;
  display: flex; flex-direction: column; gap: .625rem;
}
.cl-quiz__runner[hidden] { display: none; }
.cl-quiz__runner-tag { font-size: .6875rem; letter-spacing: .14em; text-transform: uppercase; color: var(--cl-dark-red); font-weight: 500; }
.cl-quiz__runner-row { display: flex; align-items: center; gap: 1rem; color: inherit; text-decoration: none; }
.cl-quiz__runner-row:hover .cl-quiz__runner-name { text-decoration: underline; text-underline-offset: .2em; }
.cl-quiz__runner-image { flex: none; width: 5.5rem; height: 4.25rem; border-radius: .5rem; background: var(--cl-white); overflow: hidden; }
.cl-quiz__runner-image img { width: 100%; height: 100%; object-fit: contain; display: block; padding: .25rem; }
.cl-quiz__runner-text { display: flex; flex-direction: column; gap: .2rem; min-width: 0; }
.cl-quiz__runner-name { font-family: var(--cl-font-heading); font-size: 1.125rem; }
.cl-quiz__runner-sub { opacity: .7; }

/* the send form under the result */
.cl-quiz__send {
  border-top: 1px solid var(--cl-ink-12);
  padding-top: 1.25rem;
}
.cl-quiz__send[hidden] { display: none; }
.cl-quiz__send-title { font-family: var(--cl-font-heading); font-size: 1.25rem; font-weight: 400; }
.cl .cl-quiz__send-text { margin-top: .375rem; font-size: .9375rem; opacity: .72; }
.cl-quiz__send .cl-quiz__form { margin-top: 1rem; }
.cl-quiz__send .cl-quiz__form .cl-quiz__actions { margin-top: 1.25rem; }
.cl-quiz__note { opacity: .8; }
.cl-quiz__note[hidden] { display: none; }
/* Von vorn at the foot of the whole result, centred. */
.cl-quiz__result-foot { display: flex; justify-content: center; }
.cl-quiz__restart.is-result {
  appearance: none; border: 1px solid var(--cl-ink-28); background: none; color: var(--cl-cocoa);
  font: inherit; font-size: .875rem; line-height: 1;
  display: inline-flex; align-items: center; gap: .375rem;
  padding: .625rem 1rem; border-radius: 100px; cursor: pointer;
}
.cl-quiz__restart.is-result:hover { background: var(--cl-white); border-color: var(--cl-cocoa); }

@media screen and (max-width: 767px) {
  .cl-quiz__stage { padding: 1.5rem 5% 2.5rem; align-items: flex-start; }
  .cl-quiz__wrap { padding: 1.5rem 1.25rem 1.75rem; border-radius: 1rem; }
  .cl-quiz__wrap.is-result { padding: 1.25rem 1rem 1.5rem; }
  .cl-quiz__answers { margin-top: 1.25rem; }
  .cl .cl-quiz__question { font-size: 1.625rem; line-height: 1.22; }
  .cl .cl-quiz__lead { font-size: 1rem; }
  .cl .cl-quiz__facts { grid-template-columns: 1fr; gap: .625rem; }
  .cl-quiz__result-actions .button,
  .cl-quiz__result-actions .button-secondary { width: 100%; flex-basis: 100%; }
  .cl-quiz__next { width: 100%; }
}


/* cl-reasons.css */
/* ==========================================================================
   Reasons / benefits grid. Port of section-top-reasons and the five other
   benefit layouts in the export (see the section comment for the map).

   From the export, canonical (cl-thankyou.html :: .section-top-reasons):
     .padding-vertical.padding-large  combo: display flex, column, align centre,
                           text-align centre, padding-top 4rem  479: 2rem
                           (bottom follows the scale: 3rem / 2.5rem / 2rem)
     .margin-bottom.margin-small      combo: margin-bottom 0 (every width)
     .pre-heading-2        letter-spacing 1px, uppercase, margin-bottom 2rem,
                           .875rem / 400; it is an <h2>, so line-height 1.2
                           767: .8rem
     .heading-medium-2     2.25rem / 400 / 1.1   991: 1.75rem   767: 1.5rem / 1.4
     .padding-vertical.padding-small  1.5rem / 1.5rem   767: 1.25rem
     .top-reasons-grid     grid 1fr 1fr 1fr, gap 3rem, justify-items start
                           991: 1fr, place-items stretch center
     .heading-small        1.5rem / 400 / 1.4, margin-bottom .5rem   767: 1.25rem
     .margin-bottom.margin-large > .margin-top.margin-huge  two empty divs whose
                           collapsed margins add 6rem (5rem at 991, 3.5rem at 767)

   Icon grid (index.html, infrarotsauna.html :: .section-health-benefits-icons):
     section               bg #014560, display none (hidden in the export and live)
     .is-grey              bg var(--pumice)
     .margin-bottom-2.margin-small  margin 0
     .heading-large        3rem / 1.2, text-align left even inside .text-align-center
                           991: 2.25rem   767: 2rem   479: 1.8rem / 1.3
     .text-size-medium-3   1.125rem
     .health-benefits-icon-grid  grid 1fr 1fr 1fr, column-gap 140px, row-gap 20px,
                           margin 60px 0 50px   991: 80px   767: 50px   479: 1fr
     .health-benefit-block grid 1fr, row-gap 6px, justify-items center
     img                   hand-typed width attributes, 60 to 70
     .text-size-regular.text-color-white  1rem / 400
     .button-secondary-4.invert-colors  = .button-secondary.invert-colors

   Check list (katalog-anfordern.html :: .section-checkmarks):
     .checkmarks-grid      gap 1.5rem, two columns from .w-layout-grid
                           767: row-gap 1rem   479: 1fr
     .checkmark-wrapper    flex, column-gap 1rem
     .checkmarks-small     1.5rem square, golden, flex none, centred

   Photo cards (campaigns/vorteile-von-infrarotsaunen-1.html :: .section_rd-benefits):
     .section_rd-benefits  text-align center
     .margin-top-2.margin-small  margin-top 1.5rem   767: 1.25rem
     .container-small-2    max-width 48rem
     .rd-benefits_component  grid 1fr 1fr 1fr, column-gap 5rem, row-gap 3rem,
                           margin-top 3rem   991: 1fr
     .rd-benefits_item     flex column, align centre, gap 1rem, 1.25rem
                           991: text-align left, align stretch   479: gap .25rem
     .heading-small-3      1.5rem / 400 / 1.4, padding-top 10px   767: 1.25rem
     .text-size-medium-4   1.125rem   767: 1rem
     .rd-benefits_button-wrapper  max-width 15rem, margin-top 3rem, centred

   Icon + bold title (infrarotsauna.html :: .section-health-benefits-icons.is-grey):
     .title-wrapper_section  flex column centre, row-gap 2.5rem, max-width 64rem
     .infrared-sauna_benefits-grid  grid 1fr 1fr 1fr, column-gap 2rem, row-gap 4rem,
                           margin-top 5rem   991: column-gap 80px   767: 50px, 1fr
     .infrared-sauna_benefits-item  flex column, align start, row-gap 16px
     .icon-1x1-large       4.5rem square
     h5                    1.5rem / 700 / 1.4   767: 1.25rem

   Statement band (detail_ausfuehrung.html :: .section-health-benefits-short):
     section               bg var(--dark-red)
     .container-small-2    48rem
     .margin-bottom-3.margin-small  margin-bottom 1.5rem   767: 1.25rem
     .pre-heading-4.text-color-white  margin-bottom 1.5rem, .875rem / 600
     .heading-medium-5     2.25rem / 1.1, padding-bottom 10px
                           991: 1.75rem, padding-bottom 0   767: 1.5rem / 1.4
     .text-size-large      1.25rem / 400   767: 1.125rem

   Round badges (sauna-erweiterungen/salzinhalation-in-sauna-kaufen.html ::
   .add-on-benefits_wrapper, CMS-bound and empty in the export):
     .add-on-benefits_wrapper  margin-bottom 2.5rem
     .add-ons-benefits_list  flex, column-gap 2rem, space-between
                           991: wrap, centred, gap 2.5rem   767: gap 0
     .add-ons-benefits-card  flex column centred, text centre   767: padding 1.5rem
     .benefits-slider_image  6rem round, margin-bottom 1rem   767: 1.2rem
     .text-size-tiny.is-capitalized  .75rem, uppercase, letter-spacing .5px
                           479: padding 4px 0

   Deviations, all deliberate and flagged in the report:
     .heading-large carries text-align: left in the export, so the centred
     heading blocks of the icon grid, the grey grid and the photo cards render
     left-aligned over centred copy. The port lets them inherit the centre.
     .heading-medium-5 on the statement band does the same; same call.
     The export's .heading-large has no letter-spacing; cl-base gives it -1px.
     Reset here so the wrapping matches.
     is-short takes 4rem of vertical padding at 480-767 where the export's
     .is-tablet-tall combo leaves 8rem on top and 4rem underneath (client,
     2026-08-26: the empty band above the eyebrow). 479 and 768 up are the
     export's own values.
   ========================================================================== */

/* The coloured bands carry position: relative in the export; the plain ones
   do not. White copy sits on the text nodes, as the export's .text-color-white
   does, so the wrappers keep the cocoa colour they inherit there. */
.cl-reasons.is-bg-pumice   { background-color: var(--cl-pumice); position: relative; }
.cl-reasons.is-bg-lucidity { background-color: var(--cl-lucidity); position: relative; }
.cl-reasons.is-bg-teal     { background-color: var(--cl-stratos); position: relative; }
.cl-reasons.is-bg-dark-red { background-color: var(--cl-dark-red); position: relative; }
.cl-reasons.is-bg-cocoa    { background-color: var(--cl-cocoa); position: relative; }
.cl-reasons.is-bg-teal .cl-reasons__head,
.cl-reasons.is-bg-teal .cl-reasons__title,
.cl-reasons.is-bg-teal .cl-reasons__text,
.cl-reasons.is-bg-teal .cl-reasons__link,
.cl-reasons.is-bg-teal .cl-reasons__cta a,
.cl-reasons.is-bg-dark-red .cl-reasons__head,
.cl-reasons.is-bg-dark-red .cl-reasons__title,
.cl-reasons.is-bg-dark-red .cl-reasons__text,
.cl-reasons.is-bg-dark-red .cl-reasons__link,
.cl-reasons.is-bg-dark-red .cl-reasons__cta a,
.cl-reasons.is-bg-cocoa .cl-reasons__head,
.cl-reasons.is-bg-cocoa .cl-reasons__title,
.cl-reasons.is-bg-cocoa .cl-reasons__text,
.cl-reasons.is-bg-cocoa .cl-reasons__link,
.cl-reasons.is-bg-cocoa .cl-reasons__cta a { color: var(--cl-white); }
.cl-reasons.is-bg-teal .link-large,
.cl-reasons.is-bg-dark-red .link-large,
.cl-reasons.is-bg-cocoa .link-large { border-bottom-color: var(--cl-white); }

.cl-reasons .heading-large { letter-spacing: 0; }
.cl-reasons .cl-reasons__intro p { margin: 0; }
.cl-reasons .cl-reasons__intro p + p { margin-top: 1rem; }
.cl-reasons__cta a { max-width: 100%; }

/* --------------------------------------------------------------------------
   Base gaps worked around locally (cl-base.css is not edited from a section):
   .heading-small in the export has line-height 1.4 and margin-bottom .5rem;
   .heading-medium drops to line-height 1.4 at 767 and back to 1.2 at 479;
   .heading-large has line-height 1.3 at 479; h5 steps to 1.25rem at 767.
   -------------------------------------------------------------------------- */
.cl-reasons .heading-small { line-height: 1.4; margin-bottom: .5rem; }

/* --------------------------------------------------------------------------
   Grid
   -------------------------------------------------------------------------- */
.cl-reasons__grid {
  display: grid;
  grid-template-columns: repeat(var(--cl-reasons-cols, 3), 1fr);
  column-gap: 3rem;
  row-gap: 3rem;
  justify-items: start;
}
.cl-reasons__grid.is-cols-2 { --cl-reasons-cols: 2; }
.cl-reasons__grid.is-cols-3 { --cl-reasons-cols: 3; }
.cl-reasons__grid.is-cols-4 { --cl-reasons-cols: 4; }
.cl-reasons__item { width: 100%; min-width: 0; }
.cl-reasons__icon img,
.cl-reasons__icon svg { display: block; }

/* --------------------------------------------------------------------------
   is-text: section-top-reasons
   -------------------------------------------------------------------------- */
.cl-reasons.is-text .cl-reasons__top.padding-vertical {
  text-align: center;
  flex-direction: column;
  align-items: center;
  padding-top: 4rem;
  display: flex;
}
/* The export's eyebrow is an <h2 class="pre-heading-2">, so it takes the
   heading line-height; weight 400 and no top margin are .is-plain. */
.cl-reasons.is-text .cl-reasons__eyebrow { line-height: 1.2; }
.cl-reasons.is-text .cl-reasons__heading { line-height: 1.1; }
/* The grid block's trailing spacer is .cl-reasons__foot: margin-top margin-huge
   on an empty div reproduces the collapsed 6rem of the export's
   .margin-bottom.margin-large > .margin-top.margin-huge pair. */

/* --------------------------------------------------------------------------
   is-icons: health-benefits-icon-grid
   -------------------------------------------------------------------------- */
.cl-reasons.is-icons .cl-reasons__grid {
  column-gap: 140px;
  row-gap: 20px;
  margin-top: 60px;
  margin-bottom: 50px;
  justify-items: stretch;
  text-align: center;
}
/* The export's first block sits in an extra wrapper div, so it alone escapes
   the outer grid's stretch while blocks 2 to 9 spread their 2 rows by the
   slack. Rows are packed at the start here for every block; the first block
   measures 4px shorter in the export because of that wrapper. */
.cl-reasons.is-icons .cl-reasons__item {
  display: grid;
  grid-template-columns: 1fr;
  column-gap: 16px;
  row-gap: 6px;
  justify-items: center;
  align-content: start;
}
.cl-reasons.is-icons .cl-reasons__title { font-size: 1rem; font-weight: 400; line-height: 1.5; }
/* .margin-top.margin-medium on the button row: 2rem, 767: 1.5rem (the scale) */

/* --------------------------------------------------------------------------
   is-checks: checkmarks-grid
   -------------------------------------------------------------------------- */
.cl-reasons.is-checks .cl-reasons__grid {
  grid-template-columns: repeat(var(--cl-reasons-cols, 2), 1fr);
  column-gap: 1.5rem;
  row-gap: 1.5rem;
  justify-items: stretch;
}
/* A fixed 1.5rem icon column and a text column, both starting at the top of
   the row, so a two-line item keeps its check on the first line and every
   row's first baseline sits at the same height (client, 2026-08-25: the
   collection page's list rendered centred, bullets adrift). The check is
   1.5rem on a 1.125rem / 1.5 line (1.6875rem), so it drops .1rem to centre
   on that first line. */
.cl-reasons.is-checks .cl-reasons__head { margin-bottom: 3rem; }
.cl-reasons.is-checks .cl-reasons__item { column-gap: 1rem; display: flex; align-items: flex-start; text-align: left; }
.cl-reasons.is-checks .cl-reasons__icon {
  color: var(--cl-dark-red);
  flex-direction: column;
  flex: none;
  justify-content: center;
  align-items: center;
  width: 1.5rem;
  height: 1.5rem;
  margin-top: .1rem;
  display: flex;
}
.cl-reasons.is-checks .cl-reasons__icon svg,
.cl-reasons.is-checks .cl-reasons__icon img { width: 100%; height: 100%; }
.cl-reasons.is-checks .cl-reasons__body { min-width: 0; font-size: 1.125rem; line-height: 1.5; }
.cl-reasons.is-checks .cl-reasons__text p { margin: 0; }
.cl-reasons.is-checks .cl-reasons__title + .cl-reasons__text { margin-top: .25rem; }

/* --------------------------------------------------------------------------
   is-cards: rd-benefits_component
   -------------------------------------------------------------------------- */
.cl-reasons.is-cards { text-align: center; }
.cl-reasons.is-cards .cl-reasons__intro {
  max-width: 48rem;
  margin: 1.5rem auto 0;
}
.cl-reasons.is-cards .cl-reasons__grid {
  column-gap: 5rem;
  row-gap: 3rem;
  margin-top: 3rem;
  justify-items: stretch;
}
.cl-reasons.is-cards .cl-reasons__item {
  flex-direction: column;
  justify-content: flex-start;
  align-items: center;
  column-gap: 1rem;
  row-gap: 1rem;
  font-size: 1.25rem;
  display: flex;
}
/* The photo is a bare <img> flex child in the export: capped by the column at
   1440, stretched to it below 991 (align-items: stretch). The thumbnails are
   540px wide, so that is the column width at every breakpoint. */
.cl-reasons.is-cards .cl-reasons__icon { width: 100%; }
.cl-reasons.is-cards .cl-reasons__icon img { width: 100%; height: auto; }
/* Round eighteen: `image_ratio` crops every photo to one shape (aspect-ratio +
   object-fit), so a grid of mixed photos lines up; "" keeps the natural size. */
.cl-reasons.is-cards .cl-reasons__icon.is-ratio-4-3 img,
.cl-reasons.is-cards .cl-reasons__icon.is-ratio-3-2 img,
.cl-reasons.is-cards .cl-reasons__icon.is-ratio-1-1 img { object-fit: cover; }
.cl-reasons.is-cards .cl-reasons__icon.is-ratio-4-3 img { aspect-ratio: 4 / 3; }
.cl-reasons.is-cards .cl-reasons__icon.is-ratio-3-2 img { aspect-ratio: 3 / 2; }
.cl-reasons.is-cards .cl-reasons__icon.is-ratio-1-1 img { aspect-ratio: 1 / 1; }
.cl-reasons.is-cards .cl-reasons__title {
  font-family: var(--cl-font-heading);
  font-size: 1.5rem;
  font-weight: 400;
  line-height: 1.4;
  margin-bottom: 0;
  padding-top: 10px;
}
.cl-reasons.is-cards .cl-reasons__text { font-size: 1.125rem; }
.cl-reasons.is-cards .cl-reasons__cta.margin-top {
  max-width: 15rem;
  margin: 3rem auto 0;
}
/* .button-6.is-red: the cocoa button with border-style none */
.cl-reasons.is-cards .cl-reasons__cta .button { border-style: none; }

/* --------------------------------------------------------------------------
   is-grey: infrared-sauna_benefits-grid (.title-wrapper_section head)
   -------------------------------------------------------------------------- */
.cl-reasons.is-grey .cl-reasons__head {
  row-gap: 2.5rem;
  flex-direction: column;
  justify-content: flex-start;
  align-items: center;
  max-width: 64rem;
  margin-left: auto;
  margin-right: auto;
  display: flex;
}
.cl-reasons.is-grey .cl-reasons__grid {
  column-gap: 2rem;
  row-gap: 4rem;
  margin-top: 5rem;
  justify-items: stretch;
}
.cl-reasons.is-grey .cl-reasons__item {
  flex-direction: column;
  justify-content: flex-start;
  align-items: flex-start;
  column-gap: 16px;
  row-gap: 16px;
  display: flex;
}
.cl-reasons.is-grey .cl-reasons__icon img { width: 4.5rem; height: 4.5rem; }
/* the title is a bare h5: body face, 1.5rem / 700 / 1.4 */
.cl-reasons.is-grey .cl-reasons__title {
  font-family: var(--cl-font-body);
  font-size: 1.5rem;
  font-weight: 700;
  line-height: 1.4;
  margin: 0;
}

/* --------------------------------------------------------------------------
   is-short: section-health-benefits-short
   -------------------------------------------------------------------------- */
/* .container-small-2 is the 48rem twin of .container-small (52rem), the same
   pairing the hero capped locally. */
.cl-reasons.is-short .container-small { max-width: 48rem; }
.cl-reasons.is-short .cl-reasons__eyebrow { margin-bottom: 1.5rem; font-weight: 600; }
.cl-reasons.is-short .cl-reasons__heading { line-height: 1.1; padding-bottom: 10px; }
/* .margin-bottom-3.margin-small around eyebrow + heading: 1.5rem, 767: 1.25rem */
.cl-reasons.is-short .cl-reasons__intro { font-size: 1.25rem; font-weight: 400; margin-top: 1.5rem; }

/* --------------------------------------------------------------------------
   is-badges: add-ons-benefits_list
   -------------------------------------------------------------------------- */
/* the heading sits in .margin-bottom.margin-large: 20px at desktop (the stock
   .margin-bottom declaration), 2.5rem at 991, 2rem at 767 */
.cl-reasons.is-badges .cl-reasons__head { margin-bottom: 20px; }
.cl-reasons.is-badges .cl-reasons__grid {
  column-gap: 2rem;
  row-gap: 16px;
  justify-content: space-between;
  margin-bottom: 2.5rem;
  display: flex;
}
.cl-reasons.is-badges .cl-reasons__item {
  text-align: center;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  width: auto;
  display: flex;
}
.cl-reasons.is-badges .cl-reasons__icon img {
  border-radius: 100%;
  width: 6rem;
  height: 6rem;
  object-fit: cover;
  margin-bottom: 1rem;
}
.cl-reasons.is-badges .cl-reasons__title {
  font-size: .75rem;
  letter-spacing: .5px;
  text-transform: uppercase;
}

/* Whole product cut-outs (Black Friday "Passt zu jedem Modell", 2026-09-23):
   the round crop cut the cabins in half and made white-ground, transparent and
   room photos sit side by side. A transparent series at one height, uncropped,
   sitting on a shared baseline. */
.cl-reasons.is-badges.is-cutouts .cl-reasons__item { justify-content: flex-end; flex: 1 1 0; }
.cl-reasons.is-badges.is-cutouts .cl-reasons__icon img {
  border-radius: 0;
  width: auto;
  max-width: 100%;
  height: 10rem;
  object-fit: contain;
}

/* --------------------------------------------------------------------------
   Breakpoints
   -------------------------------------------------------------------------- */
@media screen and (max-width: 991px) {
  .cl-reasons.is-text .cl-reasons__grid { grid-template-columns: 1fr; place-items: stretch center; }
  .cl-reasons.is-icons .cl-reasons__grid { column-gap: 80px; }
  .cl-reasons.is-cards .cl-reasons__grid { grid-template-columns: 1fr; }
  .cl-reasons.is-cards .cl-reasons__item { text-align: left; align-items: stretch; }
  .cl-reasons.is-grey .cl-reasons__grid { column-gap: 80px; }
  .cl-reasons.is-short .cl-reasons__heading { padding-bottom: 0; }
  /* is-short defines no grid of its own, so it inherited the base three
     columns at every width and ran the third column off a phone screen
     (product page, 625px of horizontal scroll at 479). Collapse it. */
  .cl-reasons.is-short .cl-reasons__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: 2rem; row-gap: 2.5rem; }
  .cl-reasons.is-badges .cl-reasons__head { margin-bottom: 2.5rem; }
  .cl-reasons.is-badges .cl-reasons__grid { column-gap: 2.5rem; row-gap: 2.5rem; flex-wrap: wrap; justify-content: center; }
}

@media screen and (max-width: 767px) {
  .cl-reasons .heading-medium { line-height: 1.4; }
  .cl-reasons .heading-small { font-size: 1.25rem; }
  .cl-reasons.is-text .cl-reasons__heading { line-height: 1.4; }
  .cl-reasons.is-icons .cl-reasons__grid { column-gap: 50px; }
  .cl-reasons.is-checks .cl-reasons__grid { row-gap: 1rem; }
  .cl-reasons.is-checks .cl-reasons__head { margin-bottom: 2rem; }
  .cl-reasons.is-checks .cl-reasons__body { font-size: 1rem; }
  .cl-reasons.is-cards .cl-reasons__intro { margin-top: 1.25rem; }
  .cl-reasons.is-cards .cl-reasons__title { font-size: 1.25rem; }
  .cl-reasons.is-cards .cl-reasons__text { font-size: 1rem; }
  .cl-reasons.is-grey .cl-reasons__grid { grid-template-columns: 1fr; column-gap: 50px; text-align: left; }
  .cl-reasons.is-grey .cl-reasons__title { font-size: 1.25rem; }
  .cl-reasons.is-short .cl-reasons__heading { line-height: 1.4; }
  .cl-reasons.is-short .cl-reasons__grid { grid-template-columns: minmax(0, 1fr); row-gap: 2rem; }
  /* .text-size-large steps to 1.125rem / 1.35 at 767; cl-base only steps the size */
  .cl-reasons.is-short .cl-reasons__intro { font-size: 1.125rem; line-height: 1.35; margin-top: 1.25rem; }
  /* DELIBERATE DEPARTURE FROM THE EXPORT, phones only (client, 2026-08-26: "a
     large empty gap above the eyebrow"). The gap is cl-base's
     .is-tablet-tall.padding-vertical.padding-xhuge, whose breakpoints are
     max-width and inherit forwards: 991 pushes both sides to 8rem and 767 only
     pulls the BOTTOM back to 4rem, so from 767 down to 480 the band opens with
     128px of empty cocoa and closes with 64px. Take both sides to the theme's
     own padding-xhuge step at this width (4rem) so the band is symmetric and on
     the scale every other mobile section uses. 479 keeps the export's 3rem
     (restated below, because this selector outranks the base one at every
     width it covers) and 768 up is untouched. */
  .cl-reasons.is-short .cl-reasons__inner.is-tablet-tall.padding-vertical.padding-xhuge {
    padding-top: 4rem;
    padding-bottom: 4rem;
  }
  /* Rhythm on one scale: eyebrow 1.5rem heading 1.25rem intro, then 2rem to
     the items, 2rem between them and 2rem to the CTA. Without the first of
     those the intro paragraph butted straight into the first item's title. */
  .cl-reasons.is-short .cl-reasons__grid, .cl-reasons.is-short .cl-reasons__grid + .cl-reasons__cta.margin-top { margin-top: 2rem; }
  .cl-reasons.is-badges .cl-reasons__head { margin-bottom: 2rem; }
  .cl-reasons.is-badges .cl-reasons__grid { column-gap: 0; row-gap: 0; }
  .cl-reasons.is-badges .cl-reasons__item { padding: 1.5rem; }
  .cl-reasons.is-badges .cl-reasons__icon img { margin-bottom: 1.2rem; }
  .cl-reasons.is-badges.is-cutouts .cl-reasons__item { flex: 0 0 50%; padding: 1rem .5rem; }
  .cl-reasons.is-badges.is-cutouts .cl-reasons__icon img { height: 8rem; }
}

@media screen and (max-width: 479px) {
  .cl-reasons .heading-medium { line-height: 1.2; }
  .cl-reasons .heading-large { line-height: 1.3; }
  /* .heading-large.text-align-center steps to 1.5rem at 479 (and is the one
     place the export centres it). */
  .cl-reasons .text-align-center .heading-large { font-size: 1.5rem; }
  .cl-reasons.is-text .cl-reasons__top.padding-vertical { padding-top: 2rem; }
  .cl-reasons.is-icons .cl-reasons__grid, .cl-reasons.is-checks .cl-reasons__grid { grid-template-columns: 1fr; }
  /* the export's own 479 value, restated because the 767 rule above wins on
     specificity over cl-base's .is-tablet-tall combo at this width too */
  .cl-reasons.is-short .cl-reasons__inner.is-tablet-tall.padding-vertical.padding-xhuge {
    padding-top: 3rem;
    padding-bottom: 3rem;
  }
  .cl-reasons.is-cards .cl-reasons__item { column-gap: .25rem; row-gap: .25rem; }
  .cl-reasons.is-badges .cl-reasons__title { padding-top: 4px; padding-bottom: 4px; }
}


/* cl-reviews.css */
/* ==========================================================================
   Google reviews bar. Port of section-google-reviews.

   From the export:
     .section-google-reviews    text-align center, bg #fff
     .google-reviews_component  flex column, row-gap 1rem, centred, 1.25rem
       .is-horizontal           col-gap 1rem, align start, margin 1rem/2rem
     .rating_star-list          flex, align centre, margin-top -.45rem, mr .5rem
                                479: margin-top 0, mb .5rem
     .rating-icon               1.25rem square, colour golden, mr .35rem
       .is-white                #ffb133, 1.1 x 1.3rem
   ========================================================================== */

.cl-reviews { text-align: center; background-color: var(--cl-white); }
.cl-reviews.is-transparent { background-color: transparent; }

.cl-reviews__component {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  row-gap: 1rem;
  font-size: 1.25rem;
}
.cl-reviews__component.is-horizontal {
  flex-direction: row;
  column-gap: 1rem;
  justify-content: flex-start;
  align-items: flex-start;
  margin-top: 1rem;
  margin-bottom: 2rem;
}

.cl-reviews__stars {
  display: flex;
  align-items: center;
  margin-top: -.45rem;
  margin-right: .5rem;
}

.cl-reviews__star {
  width: 1.25rem;
  height: 1.25rem;
  color: var(--cl-golden);
  margin-right: .35rem;
  flex: none;
}
.cl-reviews__star svg { width: 100%; height: 100%; display: block; fill: currentColor; }
.cl-reviews.is-on-dark .cl-reviews__star { color: var(--cl-golden); width: 1.1rem; height: 1.3rem; }

/* Under the hero's tuck the export's 4rem / 3rem band read as a hole above
   the stars on a phone (client, 2026-08-25). */
@media screen and (max-width: 767px) {
  .cl-reviews .is-tablet-tall.padding-vertical.padding-xhuge { padding-top: 2rem; padding-bottom: 2.5rem; }
}
@media screen and (max-width: 479px) {
  .cl-reviews__stars { margin-top: 0; margin-bottom: .5rem; }
  .cl-reviews__component.is-horizontal { flex-direction: column; align-items: center; }
}


/* cl-rich-text.css */
/* ==========================================================================
   Rich text. Port of section-text-breakout-center and the seven other
   text-only containers it replaces (see sections/cl-rich-text.liquid).

   From the export. Base classes the port already carries (page-padding,
   container-*, padding-vertical + the scale, heading-*, text-size-*,
   pre-heading, button, link-large, cl-richtext) are not restated here; the
   rules below are what cl-base.css lacks or gets differently.

   Canonical, infrarotkabine-selber-bauen.html :: .section-text-breakout-center
     .section-text-breakout-center   no rule: transparent
     .padding-vertical.padding-xhuge  7rem; 991: 8rem/8rem + text-align center;
                                      767: bottom 4rem + text-align left; 479: 3rem/3rem
                                      (= .is-tablet-tall in cl-base, applied when space is xhuge)
     .margin-bottom.margin-small      margin-bottom: 0 (the two-class rule at line 1739 wins
                                      over .margin-bottom's stock `0 0 20px`)
     .pre-heading                     .875rem / 600, ls 1px, uppercase, margin 4rem 0 2rem
                                      991: text-align left   767: .8rem
     .heading-large                   3rem / 400 / 1.2, text-align LEFT, no letter-spacing
                                      991: 2.25rem   767: 2rem   479: 1.8rem / 1.3
     .heading-large.text-align-center still left (.text-align-center is declared before
                                      .heading-large); 479: center, 1.5rem
     .subheading-small                1.375rem / 400 / 1.4

   infrarotsauna-aufbau.html :: .section-text-callout (variant is-callout)
     .section-text-callout            bg #fff
     .padding-vertical.padding-large  flex column, align center, text-align center,
                                      padding-top 4rem (479: 2rem); bottom from the scale
     .padding-top                     padding: 16px 0 0 (on the lead paragraph)
     .subheading-medium               1.375rem; .text-weight-medium 500
                                      767: 1.255rem   479: 1.2rem
     .container-small-2               max-width 48rem, no vertical padding of its own
     .margin-bottom.margin-large      20px (stock .margin-bottom beats .margin-large at
                                      base); 991: 2.5rem; 767: 2rem (the breakpoint
                                      .margin-large rules come later in the cascade)
     .heading-medium                  2.25rem / 1.2; 991: 1.75rem; 767: 1.5rem / 1.4;
                                      479: line-height 1.2

   grosse/infrarotkabine-1-person.html :: .section-text-callout_bg-colored (band)
     .section-text-callout_bg-colored bg var(--lucidity)
     .max-width-large                 48rem, left aligned inside container-large
     .w-richtext                      unstyled CMS body (see the residual note below)

   kontakt/infrarotkabine-fuer-ihr-unternehmen.html :: .section-contact-large-text-banner
     .background-color-white          bg var(--white)
     h1.pre-heading                   the eyebrow as the page H1: line-height 1.2 from
                                      `h1, h2, h3 { line-height: 1.2 }`
     .contact-large-text_component    flex, centred; the 48rem paragraph column

   sauna-erweiterungen.html :: .section-small-link (variant is-line)
     .add-ons-callout-text_component  flex column, centred, row-gap 2.5rem
     p                                body copy, 1rem / 300

   campaigns/infrarotsauna.html :: .section-pillar-intro (variant is-pillar)
     .title-wrapper_section           flex column, align center, row-gap 2.5rem,
                                      max-width 64rem, margin auto, text-align center
     .text-large-3                    = .text-lead, plus text-align center;
                                      479: text-align left, 1.3rem / 1.3
     .margin-top.margin-medium        2rem; 767: 1.5rem (block heading wrapper)

   partner/formslim.html :: .section-affiliate-bio-breakout (variant is-bio)
     .section-affiliate-bio-breakout  bg #f4f4f4, padding-bottom 60px; 991: 20px
     .page-padding.no-margin          margin-bottom -67px (pulls the next section up)
     .text-align-center-3             flex column, centred
     .margin-bottom-4.margin-small    20px at every width (numbered twin, stock value)
     ._20px-spacer                    height 20px; 767: 10px
     .padding-bottom.padding-xxlarge  5rem; 991: 4.5rem; 767: 3rem
     .bio-image-right.is-align-top    grid 1fr 1.25fr, gap 3rem, align-items start
                                      991: 1fr   767: row-gap 1rem, margin-top -6px
                                      479: row-gap 2rem, margin-top -76px
     #w-node-…ad519ad                 align-self center on the text cell; 991: order 9999,
                                      the copy drops below the image
     .layout3_content-2               479: text-align left
     .product-description             text-align left, margin-top 10px

   campaigns/vorteile-von-infrarotsaunen-1.html :: .section_rd-message (variant is-message)
     .section_rd-message              text-align center
     .rd-message_component            flex column, align center, row-gap 2rem,
                                      max-width 53rem, margin auto
     .text-size-large                 1.25rem / 400; 767: 1.125rem / 1.35
     .rd-benefits_button-wrapper      max-width 15rem, margin-top 3rem, margin auto
     .button-6.is-red                 = .button with border-style none

   Residuals, by design:
     - The band and the bio render their CMS body through .cl-richtext (Sanomat h2
       with margins, 1rem paragraph gaps) where the export left .w-richtext
       unstyled: bold Adelle h2 at 2rem wrapped in <sup>, zero paragraph margins,
       empty <p>‍</p> spacers. Every box matches in x and width; the text column
       is taller (band +432px at 1440, bio +96px) and the boxes below it follow.
     - The pillar lead is .text-large-3 in the export, a twin with no base family
       and no 767 rule. It is .text-lead here, which steps to 1.6rem at 767 as
       the system does, so the pillar measures 6.72px shorter at that width only.
     - cl-base.css's .margin-bottom + size resolves to the scale value, the export
       resolves to 20px at desktop (stock .margin-bottom wins) and to the scale
       below 991. Head spacing is therefore owned here, per variant, not by the
       scale classes.

   Not from the export: overflow-wrap on the text blocks, min-width 0 on the
   grid children, and the badge's width capped by its own column (see is-badge).
   The export's copy never met a token wide enough to matter; a German compound
   in a section heading does, and it pushed the collection pages 35px wide at
   320. All are scoped here, not pushed into cl-base.css.
   ========================================================================== */

/* --- backgrounds ---------------------------------------------------------- */
.cl-rich-text.is-white      { background-color: var(--cl-white); }
.cl-rich-text.is-lucidity   { background-color: var(--cl-lucidity); }
.cl-rich-text.is-lucid      { background-color: var(--cl-lucid); }
.cl-rich-text.is-pumice     { background-color: var(--cl-pumice); }
.cl-rich-text.is-light-grey { background-color: var(--cl-light-grey); }
.cl-rich-text.is-cocoa      { background-color: var(--cl-cocoa); color: var(--cl-white); }
.cl-rich-text.is-terra      { background-color: var(--cl-terra); color: var(--cl-white); }
.cl-rich-text.is-cocoa .link-large,
.cl-rich-text.is-terra .link-large { border-bottom-color: var(--cl-white); }

/* --- type, where the base differs from the export ------------------------- */

/* .heading-large in the export is left-aligned by its own rule (which also
   beats .text-align-center, declared 800 lines earlier) and carries no
   letter-spacing; the base adds -1px, which moves every wrap point. The
   .heading-large.text-align-center combo only takes effect at 479. */
.cl-rich-text .heading-large { text-align: left; letter-spacing: normal; line-height: 1.2; }
/* the export's cascade bug (heading left, everything under it centred) is not
   reproduced any more (client, 2026-08-25): a centred block centres its heading */
.cl-rich-text .heading-large.text-align-center,
.cl-rich-text .text-align-center .heading-large { text-align: center; }
.cl-rich-text .heading-medium { line-height: 1.2; }

/* the eyebrow as the page H1 (contact pages): h1 line-height 1.2, not the body 1.5 */
.cl-rich-text h1.pre-heading { line-height: 1.2; }

.cl-rich-text .subheading-small  { opacity: 1; font-size: 1.375rem; font-weight: 400; line-height: 1.4; }
.cl-rich-text .subheading-medium { font-size: 1.375rem; }
/* leitfaden-zur-wartung.html :: .section-text-callout .subheading-medium: the bare class inherits
   .cl's 300 / 1.5; .text-weight-medium lifts it to 500 (and 1.255rem at 767 below) */
.cl-rich-text .subheading-medium:not(.text-weight-medium) { font-weight: 300; line-height: 1.5; }
.cl-rich-text .subheading-small.text-weight-bold { font-weight: 700; line-height: 1.24; }
.cl-rich-text .text-lead         { text-align: center; }

/* --- the stack ------------------------------------------------------------ */

/* .margin-bottom.margin-small resolves to 0 in the export, so the head block
   carries no spacing of its own; the eyebrow's 2rem bottom margin and the
   heading's leading are the only gaps. */
.cl-rich-text__head { margin-bottom: 0; }

/* Not from the export. A German compound or a pasted URL is one word to the
   line breaker and would run out of the column whatever the container does.
   `anywhere` only adds break opportunities where a word does not fit, so
   ordinary wrapping is untouched, and it lets these blocks report a small
   min-content width, which is what keeps the grids below honest. No
   hyphens: auto, the page is lang="de" and Chrome would re-break the ported
   copy and move every text probe. */
.cl-rich-text__head,
.cl-rich-text__lead,
.cl-rich-text__text,
.cl-rich-text__block-head,
.cl-rich-text__badge-label { overflow-wrap: anywhere; }
/* a grid child is floored at its own min-content width unless min-width says so */
.cl-rich-text__bio > *,
.cl-rich-text__badge-grid > *,
.cl-rich-text__blocks.is-2col > * { min-width: 0; }
/* `anywhere` is the one wrapping mode that changes min-content, and a table
   sizes its columns from it; break-word breaks the same words at layout time
   and leaves the columns alone */
.cl-rich-text__text table { overflow-wrap: break-word; }

.cl-rich-text__text.max-width-large  { width: 100%; max-width: 48rem; }
.cl-rich-text__text.max-width-xlarge { width: 100%; max-width: 64rem; }
.cl-rich-text__text.align-center { margin-inline: auto; }

/* a block's heading sits in .margin-top.margin-medium in the export (pillar) */
.cl-rich-text__block-head { margin-top: 2rem; }

/* --- variants ------------------------------------------------------------- */

/* is-line: .add-ons-callout-text_component */
.cl-rich-text.is-line .cl-rich-text__body {
  row-gap: 2.5rem;
  text-align: center;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  display: flex;
}
.cl-rich-text.is-line .cl-rich-text__actions { margin-top: 0; }

/* is-pillar: .title-wrapper_section */
.cl-rich-text.is-pillar .cl-rich-text__body {
  row-gap: 2.5rem;
  text-align: center;
  flex-direction: column;
  justify-content: flex-start;
  align-items: center;
  max-width: 64rem;
  margin-left: auto;
  margin-right: auto;
  display: flex;
}
.cl-rich-text.is-pillar .cl-rich-text__actions { margin-top: 0; }

/* is-message: .rd-message_component + .rd-benefits_button-wrapper */
.cl-rich-text.is-message { text-align: center; }
.cl-rich-text.is-message .cl-rich-text__body {
  column-gap: 2rem;
  row-gap: 2rem;
  flex-direction: column;
  justify-content: flex-start;
  align-items: center;
  max-width: 53rem;
  margin-left: auto;
  margin-right: auto;
  display: flex;
}
.cl-rich-text.is-message .cl-rich-text__actions { max-width: 15rem; margin: 3rem auto 0; }
.cl-rich-text.is-message .button-row { display: block; }
.cl-rich-text.is-message .button { border-style: none; }

/* is-callout: .section-text-callout on the assembly guide. The lead sits in
   the padded container; heading and body follow in a 48rem column that has
   no vertical padding of its own. */
.cl-rich-text .padding-vertical.padding-large {
  text-align: center;
  flex-direction: column;
  align-items: center;
  padding-top: 4rem;
  display: flex;
}
.cl-rich-text.is-callout .cl-rich-text__lead { padding-top: 16px; }
.cl-rich-text.is-callout .cl-rich-text__column { width: 100%; max-width: 48rem; margin-left: auto; margin-right: auto; }
.cl-rich-text.is-callout .cl-rich-text__head { margin-bottom: 20px; }

/* is-bio: .section-affiliate-bio-breakout */
.cl-rich-text.is-bio { background-color: var(--cl-light-grey); padding-bottom: 60px; }
.cl-rich-text.is-bio > .page-padding { margin-bottom: -67px; }
.cl-rich-text.is-bio .cl-rich-text__body { text-align: center; flex-direction: column; align-items: center; display: flex; }
.cl-rich-text.is-bio .cl-rich-text__head { margin-bottom: 20px; }
.cl-rich-text__spacer { height: 20px; }
.cl-rich-text__bio {
  column-gap: 3rem;
  row-gap: 3rem;
  grid-template-columns: 1fr 1.25fr;
  grid-auto-columns: 1fr;
  grid-auto-flow: row;
  align-content: stretch;
  align-items: start;
  display: grid;
}
.cl-rich-text__bio-content { align-self: center; }
.cl-rich-text__bio-text { margin-bottom: 20px; }
.cl-rich-text__bio-content .cl-rich-text__text { text-align: left; margin-top: 10px; }
.cl-rich-text__bio img { max-width: 100%; display: inline-block; }

/* --- breakpoints ---------------------------------------------------------- */

@media screen and (max-width: 991px) {
  .cl-rich-text .pre-heading { text-align: left; }
  .cl-rich-text.is-callout .cl-rich-text__head { margin-bottom: 2.5rem; }
  .cl-rich-text.is-bio { padding-bottom: 20px; }
  .cl-rich-text__bio { grid-template-columns: 1fr; min-height: auto; }
  .cl-rich-text__bio-content { order: 9999; }
}

@media screen and (max-width: 767px) {
  .cl-rich-text .heading-medium { line-height: 1.4; }
  .cl-rich-text .subheading-medium.text-weight-medium { font-size: 1.255rem; }
  .cl-rich-text .text-size-large { line-height: 1.35; }
  .cl-rich-text__block-head { margin-top: 1.5rem; }
  .cl-rich-text.is-callout .cl-rich-text__head { margin-bottom: 2rem; }
  .cl-rich-text__spacer { height: 10px; }
  .cl-rich-text__bio { row-gap: 1rem; margin-top: -6px; }
}

@media screen and (max-width: 479px) {
  .cl-rich-text .heading-large { line-height: 1.3; }
  .cl-rich-text .heading-large.text-align-center { text-align: center; font-size: 1.5rem; }
  .cl-rich-text .heading-medium { line-height: 1.2; }
  .cl-rich-text .subheading-medium.text-weight-medium { font-size: 1.2rem; }
  .cl-rich-text .text-lead { text-align: left; }
  .cl-rich-text .padding-vertical.padding-large { padding-top: 2rem; }
  .cl-rich-text__bio { row-gap: 2rem; margin-top: -76px; }
  .cl-rich-text__bio-content { text-align: left; }
}

/* is-badge: .why-clearlight_component (alle-modelle)
     .why-clearlight_component            grid 1.5fr 1fr, gap 16px, place-items start stretch
       991: flex column-reverse, text-align center   767: margin-top -5rem   479: margin-top 0
     .home-advanced_rotating-image        20rem square, flex centred, margin auto, sticky top 10rem
       991: 15rem, position relative
     .image_cover-absolute-14.is-rotating-image   opacity .15 (the export rotates it with IX2; not ported)
     .home-advanced_rotating-image-label  #30252a pill, radius 5rem, width 140%, padding 1.4rem 1.7rem,
                                          1.25rem / 700 / uppercase, white      991: .875rem
   The section itself is .section-text-callout_bg-colored.is-dark: cocoa, white text. */
.cl-rich-text.is-badge .cl-rich-text__badge-grid {
  display: grid;
  grid-template-columns: 1.5fr 1fr;
  column-gap: 16px;
  row-gap: 16px;
  place-items: start stretch;
  width: 100%;
}
/* The label is 140% of the badge, so the badge's own column has to be at least
   1.4x the badge wide or the pill hangs out of the page: at 320 it ran 8px past
   each edge. Not from the export, which stops at 479. min() caps the badge at
   the width its label can afford, and 100% here is the grid cell (desktop) or
   the 90% column (the flex stack from 991 down), so it only ever binds below a
   ~373px viewport and every measured width keeps the export's 20rem / 15rem. */
.cl-rich-text.is-badge .cl-rich-text__badge {
  position: sticky;
  top: 10rem;
  width: min(20rem, 100% / 1.4);
  height: 20rem;
  margin-inline: auto;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
}
.cl-rich-text.is-badge .cl-rich-text__badge-image {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  opacity: .15;
}
.cl-rich-text.is-badge .cl-rich-text__badge-label {
  position: relative;
  flex: none;
  width: 140%;
  padding: 1.4rem 1.7rem;
  border-radius: 5rem;
  background-color: var(--cl-cocoa-press);
  color: #fff;
  font-size: 1.25rem;
  font-weight: 700;
  text-transform: uppercase;
  text-align: center;
  display: flex;
  justify-content: center;
  align-items: center;
}
.cl-rich-text.is-badge .cl-rich-text__body a { color: inherit; }
@media screen and (max-width: 991px) {
  .cl-rich-text.is-badge .cl-rich-text__badge-grid { display: flex; flex-flow: column-reverse; text-align: center; }
  .cl-rich-text.is-badge .cl-rich-text__badge { position: relative; top: 0; width: min(15rem, 100% / 1.4); height: 15rem; }
  .cl-rich-text.is-badge .cl-rich-text__badge-label { font-size: .875rem; }
}
@media screen and (max-width: 767px) { .cl-rich-text.is-badge .cl-rich-text__badge-grid { margin-top: -5rem; } }
@media screen and (max-width: 479px) { .cl-rich-text.is-badge .cl-rich-text__badge-grid { margin-top: 0; } }
.cl-rich-text.is-badge blockquote { border-left-color: currentColor; }

/* Paragraph blocks in two columns: .title-wrapper_2col (alle-modelle)
     grid 1fr 1fr, column-gap 3rem, row-gap 3rem, margin-top 3rem, font-size 1.125rem
     991: one column, text-align left */
.cl-rich-text__blocks.is-2col {
  display: grid;
  grid-template-columns: 1fr 1fr;
  column-gap: 3rem;
  row-gap: 3rem;
  width: 100%;
  margin-top: 3rem;
  font-size: 1.125rem;
}
.cl-rich-text__blocks.is-2col .cl-rich-text__text { margin-top: 0; }
@media screen and (max-width: 991px) {
  .cl-rich-text__blocks.is-2col { grid-template-columns: 1fr; text-align: left; }
}

/* ueber-uns.html :: .section-text-breakout-center wraps heading and copy in a
   bare .margin-bottom (stock 20px) and puts the copy in .padding-top (stock
   16px): 36px more than the canonical instance. Opt-in per section. */
.cl-rich-text__body.has-gap .cl-rich-text__text { padding-top: 16px; margin-bottom: 20px; }


/* cl-saunas-nav.css */
/* ==========================================================================
   Saunas sub-navigation. Port of section-saunas-nav (alle-modelle.html, and
   identical on the model and size pages).

   From the export:
     .section-saunas-nav          no rule; no vertical padding of its own
     .padding-top.padding-xhuge   7rem at every width on the size pages: the two-class
                                  rule (line 1769) escapes the scale's breakpoints
     .saunas-nav_wrap             no rule
     .saunas-nav                  flex, justify space-between, column-gap 2rem,
                                  border-bottom 1px cocoa        991: overflow auto
     .saunas-nav_link             color var(--lucid), flex none, Sanomat 2.4rem / 400,
                                  transition all .14s            479: 2rem
     .saunas-nav_link:hover       color #3e303799
     .saunas-nav_link.w--current  color var(--cocoa)
     .saunas-nav_right-block      no rule
     .saunas-nav_list             flex, wrap, column-gap 2rem    991: nowrap, overflow auto
     .saunas-nav_item             no rule (the CMS items are empty in the export)
     .saunas-sub-nav              flex, justify space-between, margin-top 1.5rem
                                  767: nowrap, overflow auto
     .saunas-sub-nav_wrapper      flex, gap 1rem                 767: flex none
     .saunas-sub-nav_link         flex none, 500, transition all .14s; inherits cocoa
     .saunas-sub-nav_link:hover,
     .saunas-sub-nav_link.w--current  color var(--golden)

   Departures, on purpose:
     .is-offset    the export's 7rem existed to clear its fixed 7.5rem navbar
                   (with .main-wrapper's 2rem the bar landed at 9rem). The
                   theme's navbar is a normal-flow sticky bar, nothing has to
                   clear it, so the class is a 3rem top padding for a page that
                   opens with this bar. Measured against the export the offset
                   is 64px shorter; everything below it matches.
     model row     under 992 the row is the one scroll container (the export
                   nested a second one in the list); its scrollbar is hidden
                   and the links never wrap or shrink, so "Outdoor Modelle"
                   stays on one line and the next link peeks in from the edge.
     size row      wraps onto a second line instead of scrolling (the export
                   scrolled it under 768); every size stays visible.

   The lists are real <ul>/<li> here (role="list" kept, since list-style none
   drops the semantics in Safari), so the base's .cl ul / .cl li margins and
   padding are reset on them with the extra specificity that needs. The links
   are display block, as the export's anchors are once blockified as flex
   items.
   ========================================================================== */

/* a page that opens with the bar: 3rem, not the export's fixed-nav 7rem */
.cl-saunas-nav__offset.is-offset { padding-top: 3rem; }

.cl-saunas-nav__row {
  column-gap: 2rem;
  border-bottom: 1px solid var(--cl-cocoa);
  justify-content: space-between;
  display: flex;
  scrollbar-width: none;
  -webkit-overflow-scrolling: touch;
}
.cl-saunas-nav__row::-webkit-scrollbar { display: none; width: 0; height: 0; }

.cl-saunas-nav__link {
  color: var(--cl-lucid);
  flex: none;
  font-family: var(--cl-font-heading);
  font-size: 2.4rem;
  font-weight: 400;
  text-decoration: none;
  white-space: nowrap;
  transition: all .14s;
}
.cl-saunas-nav__link:hover { color: var(--cl-ink-60); }
.cl-saunas-nav__link[aria-current="page"] { color: var(--cl-cocoa); }

.cl-saunas-nav .cl-saunas-nav__list {
  column-gap: 2rem;
  flex-wrap: wrap;
  display: flex;
  margin: 0;
  padding: 0;
  list-style: none;
}
.cl-saunas-nav .cl-saunas-nav__item { margin: 0; display: block; }
.cl-saunas-nav__item .cl-saunas-nav__link { display: inline; }

.cl-saunas-nav__sub {
  justify-content: space-between;
  margin-top: 1.5rem;
  display: flex;
}
.cl-saunas-nav .cl-saunas-nav__sub-list {
  column-gap: 1rem;
  row-gap: 1rem;
  flex-wrap: wrap;
  display: flex;
  margin: 0;
  padding: 0;
  list-style: none;
}
.cl-saunas-nav .cl-saunas-nav__sub-item { margin: 0; flex: none; display: block; }
.cl-saunas-nav__sub-link {
  flex: none;
  font-weight: 500;
  color: inherit;
  text-decoration: none;
  white-space: nowrap;
  transition: all .14s;
  display: block;
}
.cl-saunas-nav__sub-link:hover,
.cl-saunas-nav__sub-link[aria-current="page"] { color: var(--cl-dark-red); }

/* the ring sits inside the link so the scrolling row cannot clip it */
.cl-saunas-nav a:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: -2px; }

@media (prefers-reduced-motion: reduce) {
  .cl-saunas-nav__link,
  .cl-saunas-nav__sub-link { transition: none; }
}

@media screen and (max-width: 991px) {
  /* one horizontal scroller: the row. The right block and its items keep
     their size so the list overflows the row instead of wrapping inside it. */
  .cl-saunas-nav__row { overflow-x: auto; overflow-y: hidden; }
  .cl-saunas-nav__right { flex: none; }
  .cl-saunas-nav .cl-saunas-nav__list { flex-wrap: nowrap; }
  .cl-saunas-nav .cl-saunas-nav__item { flex: none; }
}

@media screen and (max-width: 479px) {
  .cl-saunas-nav__link { font-size: 2rem; }
}


/* cl-search.css */
/* Search results page: the form row and grid. cl-base.css carries the rest. */
.cl-search__form { max-width: 40rem; }
.cl-search__form label { display: block; margin-bottom: .5rem; }
.cl-search__row { display: flex; gap: .6rem; }
.cl-search__row input[type="search"] {
  flex: 1;
  font: inherit;
  color: inherit;
  background: var(--cl-white, #fff);
  border: 1px solid var(--cl-line, #d5d3d2);
  padding: .7rem 1rem;
  border-radius: .25rem;
  min-width: 0;
}
.cl-search__row input[type="search"]:focus { outline: 2px solid var(--cl-focus, #0d4f4f); outline-offset: 1px; }


/* cl-slider.css */
/* ==========================================================================
   Slider track and arrow pill (round nineteen, client 2026-08-28: "the
   Stories slider should look and move like the homepage one"). The pieces
   the homepage add-ons carousel (cl-product-carousel) and the Stories band
   (cl-stories) share, lifted out of cl-product-carousel.css as they were,
   paired with snippets/cl-slider-script.liquid. A section adds
   .cl-slider__track to its scroll-snap track (the section's own class keeps
   the grid columns and the gap, its cards keep scroll-snap-align: start),
   wraps it in a relative, inline-size container with room at the bottom
   for the pill, and renders prev | 1 / N | next as .cl-slider__arrows.
   ========================================================================== */

/* The track bleeds out of the container to both screen edges (client,
   2026-08-25): margin-inline of 50cqw - 50vw is the distance from a centred
   container's edge to the viewport's, and the matching padding lets the
   first and last card still scroll up to the container edge. Only the
   screen edge clips it, never the container. The wrapper is a size
   container so the card widths stay a share of the CONTAINER, not of the
   widened track. The section carries overflow-x: clip (never hidden, which
   would make it a scroll container) for the half-scrollbar overshoot vw
   carries on Windows.
   scroll-padding in cqw, not %: a percentage there is of the scrollport,
   which is the widened track itself, so it resolved to 0 and every snap
   point sat on the screen edge instead of the container's. */
.cl-slider__track {
  margin-inline: calc(50cqw - 50vw);
  padding-inline: calc(50vw - 50cqw);
  scroll-padding-inline: calc(50vw - 50cqw);
  scroll-behavior: smooth;
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  scrollbar-width: none;
  -webkit-overflow-scrolling: touch;
  cursor: grab;
}
.cl-slider__track::-webkit-scrollbar { display: none; }
.cl-slider__track:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: 2px; }
/* While a mouse drags, every scrollLeft write must land at once: with
   scroll-behavior: smooth still on, each write started a new smooth scroll
   that the next one cancelled, and the track crept a few pixels per drag
   (client, 2026-08-25: "se mișcă puțin, dar nu e suficient"). */
.cl-slider__track.is-dragging { scroll-snap-type: none; scroll-behavior: auto; cursor: grabbing; user-select: none; }
.cl-slider__track img { -webkit-user-drag: none; }

/* One pill, prev | 1 / N | next: the hero's arrow pill on a white ground
   (border instead of frost), same 2.75 x 2.25rem buttons, bottom right of
   the wrapper (client screenshot, 2026-08-25). */
.cl-slider__arrows {
  position: absolute;
  bottom: 1.5rem;
  right: 0;
  display: flex;
  align-items: stretch;
  border: 1px solid var(--cl-ink-15);
  border-radius: 100px;
  background-color: var(--cl-white);
  overflow: hidden;
}
.cl-slider__arrow {
  width: 2.75rem;
  height: 2.25rem;
  margin: 0;
  padding: 0;
  border: 0;
  color: var(--cl-black);
  background-color: transparent;
  justify-content: center;
  align-items: center;
  display: flex;
  cursor: pointer;
  appearance: none;
  transition: background-color .2s ease;
}
.cl-slider__arrow:hover { background-color: var(--cl-light-grey); }
.cl-slider__arrow:disabled { opacity: .35; cursor: default; background-color: transparent; }
.cl-slider__arrow:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: -3px; }
.cl-slider__arrow svg { width: 1rem; height: 1rem; display: block; }
.cl-slider__count {
  display: flex;
  align-items: center;
  column-gap: .25rem;
  padding: 0 .875rem;
  border-inline: 1px solid var(--cl-ink-15);
  font-size: .9375rem;
  font-weight: 400;
  color: var(--cl-black);
  font-variant-numeric: tabular-nums;
}
.cl-slider__count-sep,
.cl-slider__count [data-cl-slider-total] { opacity: .5; }

@media (prefers-reduced-motion: reduce) {
  .cl-slider__track { scroll-behavior: auto; }
  .cl-slider__arrow { transition: none; }
}


/* cl-specs.css */
/* ==========================================================================
   Specification accordion. Port of specs1_accordion (section-specs on the
   Rotlicht and Salzinhalation pages, section_product-badges on the product
   page, the Dome page's section-specs).

   From the export, sauna-erweiterungen/rotlicht-therapie-geraet.html :: .section-specs:
     .section-specs                  bg var(--lucidity)
     .container-small                = base (52rem)
     .padding-vertical.padding-xlarge = base (4rem, 991: 3.5rem, 767: 2.5rem)
     .specs1_accordion               flex-direction column, align stretch, but no
                                     display: flex, so it lays out as a block
     .specs1_accordion.bottom-line   border-bottom 1px var(--cocoa)   -> __component
     .specs1_question.black-line-top uppercase, cursor pointer, border-top 1px cocoa,
                                     flex, space-between, align centre,
                                     padding-block 1.25rem, 1.125rem / 500
                                     767: padding-block 1rem   479: 1.25rem
     .specs1_icon                    img 32x32, width 1.5rem, margin-left 1.5rem
                                     767: 1.75rem. IX2 rotates it 180deg over
                                     400ms ease when the panel opens
     .specs1_answer                  overflow hidden, display block (its grid
                                     declarations are inert); IX2 animates
                                     height 0 -> auto over 400ms ease
     .specs-content                  margin-bottom 2rem                 -> __body
     .text-rich-text                 p margin-bottom .5rem. The port renders
                                     .cl-richtext (p margin-bottom 1rem), the
                                     theme's one rich-text style; the canonical
                                     body is a single <p> so no delta here

   detail_ausfuehrung.html :: .section_product-badges (CMS-bound, rows empty):
     .section_product-badges         bg #f8f3ef (= lucidity), margin-bottom 3rem
                                     (the margin is the product page's, not ported)
     .specifications-component       border-bottom 1px cocoa, max-width 37.5rem,
                                     margin-left auto              -> .is-right-column
     .text-block-7/8/9               text-transform none on the label -> .is-normal-case
     .specs1-content                 border-bottom 1px cocoa, margin-bottom 1rem,
                                     padding-bottom .8rem; .is-last: no border -> __item
     .specs1-grid_row (.w-layout-grid) grid .25fr .75fr, gap 16px, margin-bottom .4rem
                                     767: 1 column, row-gap .2rem, margin-bottom .2rem
                                                                        -> __row
     .specs1-label_wrap              font-weight 500                    -> __label
     .specs1-text_wrap               font-weight 300                    -> __value
     .specs-button-wrapper / .button-underline  the spec-sheet links; the product
                                     page renders those from cl-main-product
   ========================================================================== */

.cl-specs { background-color: var(--cl-lucidity); }
.cl-specs.is-white { background-color: var(--cl-white); }
.cl-specs.is-lucid { background-color: var(--cl-lucid); }

.cl-specs__component { border-bottom: 1px solid var(--cl-cocoa); }
.cl-specs__component.is-right-column { max-width: 37.5rem; margin-left: auto; }

.cl-specs__group { display: block; }

.cl-specs__question {
  text-transform: uppercase;
  cursor: pointer;
  border-top: 1px solid var(--cl-cocoa);
  justify-content: space-between;
  align-items: center;
  padding-top: 1.25rem;
  padding-bottom: 1.25rem;
  font-size: 1.125rem;
  font-weight: 500;
  display: flex;
  list-style: none;
}
.cl-specs__question::-webkit-details-marker { display: none; }
.cl-specs__question::marker { content: ''; }
.cl-specs__question:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: 2px; }
.cl-specs__component.is-normal-case .cl-specs__question > span { text-transform: none; }

/* icon_chevron.svg is a 32x32 chevron filled black; the export sizes the img
   by width only and the 1:1 ratio gives the height (the fill is on the path,
   the max-width is Webflow's img rule) */
.cl-specs__icon {
  width: 1.5rem;
  height: 1.5rem;
  max-width: 100%;
  margin-left: 1.5rem;
  flex: none;
  display: block;
  transition: transform .4s ease;
}
.cl-specs__group[open] .cl-specs__icon { transform: rotate(180deg); }

.cl-specs__answer { overflow: hidden; }
.cl-specs__body { margin-bottom: 2rem; }

/* label / value rows, the product page's shape */
.cl-specs__item {
  border-bottom: 1px solid var(--cl-cocoa);
  margin-bottom: 1rem;
  padding-top: 0;
  padding-bottom: .8rem;
}
.cl-specs__item:last-child { border-bottom: 0; }
.cl-specs__row {
  display: grid;
  grid-template-columns: .25fr .75fr;
  grid-template-rows: auto;
  column-gap: 16px;
  row-gap: 16px;
  margin-bottom: .4rem;
}
.cl-specs__label { font-weight: 500; }
.cl-specs__value { font-weight: 300; }

/* progressive height animation, only once the script marks the item */
.cl-specs__group[data-animating] .cl-specs__answer { transition: height .4s ease; }

@media screen and (max-width: 767px) {
  .cl-specs__question { padding-top: 1rem; padding-bottom: 1rem; }
  .cl-specs__icon { width: 1.75rem; height: 1.75rem; }
  .cl-specs__row { grid-template-columns: 1fr; row-gap: .2rem; margin-bottom: .2rem; }
}

@media screen and (max-width: 479px) {
  .cl-specs__question { font-size: 1.25rem; }
}

@media (prefers-reduced-motion: reduce) {
  .cl-specs__icon,
  .cl-specs__group[data-animating] .cl-specs__answer { transition: none; }
}

/* .section_product-badges carries margin-bottom: 3rem on the product page;
   the VAT note sits under the panels. */
.cl-specs.is-product-band { margin-bottom: 3rem; }
.cl-specs__note { margin-top: 1.5rem; }

/* custom.vat_description (client, 2026-08-26, item 8). The metafield is one
   spec per line, mostly "Label: value", and both this band and
   cl-main-product printed it as a single grey paragraph. The parsing is shared
   with the buy column through snippets/cl-spec-terms.liquid; the rhythm is not,
   and should not be: in this band the label/value shape is the export's own
   .25fr / .75fr row with a cocoa hairline (.cl-specs__row above), and the list
   has to match the rows two panels up, not the buy column's tighter version of
   the same idea. Same class shapes as the snippet's other caller: __terms on
   the list, __term on a row, .is-note on a line that carried no label. */
.cl .cl-specs__terms { display: grid; margin: 0; }
.cl-specs__term {
  display: grid;
  grid-template-columns: .25fr .75fr;
  column-gap: 16px;
  padding-top: .5rem;
  padding-bottom: .6rem;
  border-top: 1px solid var(--cl-cocoa);
}
.cl-specs__term:first-child { border-top: 0; padding-top: 0; }
.cl .cl-specs__terms dt { font-weight: 500; }
.cl .cl-specs__terms dd { margin: 0; font-weight: 300; }
/* a line the metafield carries with no label runs the full width */
.cl-specs__term.is-note { grid-template-columns: 1fr; }
.cl-specs__term.is-note dt { display: none; }

@media screen and (max-width: 767px) {
  /* the term over its value, the same stack .cl-specs__row takes here */
  .cl-specs__term { grid-template-columns: 1fr; row-gap: .2rem; }
}


/* cl-split-cards.css */
/* ==========================================================================
   Split image cards. Port of section-double-images.

   From the export:
     .layout172_component-2   grid 1fr 1fr, gap 2rem, place-items start center
                              767 and 479: 1 column
     .discover-now_trigger    100% x 100%, overflow hidden
     .double-images_card      colour #fff, centred, flex column,
                              padding-top 110% (the aspect box)
                              991: padding-top 70%   767: height auto
     .double-images_content   absolute inset 0, flex, centre, align start,
                              padding .5rem 1.5rem
     .double-images_description  flex row centred, max-width 100%
     .double-images_persons-row  flex, gap 1rem, centred, margin-top 1rem
       .is-grid               wraps; 991 and 479 become a 3-column grid
     .persons-item            border-bottom .5px #ffffffe6, flex row
     .background-image_wrapper  z-index -1, absolute inset 0, overflow hidden
     .image-overlay-8         = .image-overlay
     .pre-heading-8           .875rem / 600 / 1px, margin-bottom 1rem, no top
                              767: .8rem
     .heading-large-14        3rem / 1.2   991: 2.25rem   767: 2rem
                              (no 479 rule; the base steps to 1.8rem / 1.3)
     .margin-bottom-18.margin-small  margin 1rem 0 0, align-self center
                              991: margin-top 0   479: align-self flex-start
     .text-weight-normal.max-width-small  991: max-width 20rem (a base combo
                              cl-base.css does not carry)
     .double-images_description, .double-images_persons-row
                              opacity 0 from IX2 at desktop only; visible
                              from 991 down

   Deliberate departures from the export, both phones only (<= 767) and both
   from the client's 390 screenshot of 2026-08-26. Everything at 991 and 1440
   still measures against .section-double-images.
     1. The 70% ratio is a floor, not the height, below 768. The export leaves
        `padding-top: 70%` in force under its own `height: auto`, so the card is
        sized by ratio while the copy is an absolute overlay: at 390 that is
        265px of card holding 295px of copy, and the eyebrow plus half the
        heading are clipped by .discover-now_trigger's overflow. The copy flows
        in a one-cell grid it shares with a ratio spacer, so the card is still
        the export's box wherever the copy fits (exact at 767) and grows where
        it does not. At 479 and below the blur mask and the dark wash reach
        further up with it, because the eyebrow they never had to cover is now
        on screen.
     2. The size row is two up with the odd last link centred, not the
        export's 3-column grid, which leaves five links as 3 + 2 with a hole in
        the second row.
   ========================================================================== */

/* Under the reviews band (client, desktop review of 2026-08-25): 3rem from
   the rating to the cards, not the band's 7rem plus the section's own top.
   The band drops its bottom padding when these cards follow it; the cards'
   `space_top` (3rem, 2rem on a phone) is then the whole gap. */
.shopify-section:has(+ .shopify-section > .cl-split-cards) .cl-reviews .padding-vertical { padding-bottom: 0; }
/* Glued to the CTA banner on a PHONE only (client, 2026-08-25, twice): the
   section's `space` (3rem) holds at desktop and collapses under 768. */
@media screen and (max-width: 767px) {
  .cl .cl-split-cards .padding-bottom { padding-bottom: 0; }
}

.cl-split-cards__grid {
  display: grid;
  grid-template-columns: repeat(var(--cl-cards, 2), 1fr);
  column-gap: 2rem;
  row-gap: 2rem;
  place-items: start center;
}

.cl-split-cards__item { width: 100%; height: 100%; overflow: hidden; }

.cl-split-cards__card {
  color: var(--cl-white);
  text-align: center;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  width: 100%;
  padding-top: 110%;
  display: flex;
  position: relative;
}

.cl-split-cards__media { z-index: 0; position: absolute; inset: 0; overflow: hidden; }
.cl-split-cards__media img {
  object-fit: cover;
  width: 100%;
  height: 100%;
  position: absolute;
  inset: 0;
  transition: transform 1s cubic-bezier(.2, 0, 0, 1), filter .6s ease;
}
/* Legibility from the foot up (client, 2026-08-25): a blur that fades out
   towards the middle of the card, and a dark gradient under it, so the copy
   and the size links read on any photo. */
.cl-split-cards__media::before,
.cl-split-cards__media::after { content: ""; position: absolute; inset: 0; pointer-events: none; }
.cl-split-cards__media::before {
  z-index: 1;
  -webkit-backdrop-filter: blur(14px);
  backdrop-filter: blur(14px);
  -webkit-mask-image: linear-gradient(to top, #000 15%, transparent 60%);
  mask-image: linear-gradient(to top, #000 15%, transparent 60%);
}
.cl-split-cards__media::after {
  z-index: 2;
  background-image: linear-gradient(to top, var(--cl-ink-60) 0%, var(--cl-ink-25) 40%, transparent 70%);
}
.cl-split-cards__item:hover .cl-split-cards__media img,
.cl-split-cards__item:focus-within .cl-split-cards__media img { transform: scale(1.05); filter: blur(2px); }

.cl-split-cards__content {
  z-index: 3;
  justify-content: center;
  align-items: flex-end;
  padding: .5rem 1.5rem 2.5rem;
  display: flex;
  position: absolute;
  inset: 0;
}
/* .double-images_content is a centring flex row, so its child is content-width.
   Forcing 100% here made the description 176px wider than the export. */
.cl-split-cards__inner { text-align: center; }

.cl-split-cards__head { margin: 0; }

.cl-split-cards .pre-heading { margin-top: 0; margin-bottom: 1rem; }

/* The export leaves the description and links at opacity 0 and reveals them
   from IX2 on hover of .discover-now_trigger, which is what the class is named
   for. The animation data does not port, so the reveal is CSS here: hover,
   focus-within for keyboard, and always visible under reduced motion so the
   copy is never unreachable. */
.cl-split-cards__reveal {
  opacity: 0;
  transform: translateY(.5rem);
  transition: opacity .45s ease, transform .6s cubic-bezier(.2, 0, 0, 1);
}
.cl-split-cards__links.cl-split-cards__reveal { transition-delay: .08s; }
.cl-split-cards__item:hover .cl-split-cards__reveal,
.cl-split-cards__item:focus-within .cl-split-cards__reveal { opacity: 1; transform: none; }

@media (prefers-reduced-motion: reduce) {
  .cl-split-cards__reveal { opacity: 1; transform: none; transition: none; }
  .cl-split-cards__media img { transition: none; }
}
/* The export's reveal is a desktop-only interaction: from 991 down the copy
   and the size links are simply visible. */
@media (hover: none), screen and (max-width: 991px) {
  .cl-split-cards__reveal { opacity: 1; transform: none; }
}

.cl-split-cards__desc {
  text-align: center;
  flex-flow: row;
  justify-content: center;
  align-items: center;
  max-width: 100%;
  display: flex;
}

.cl-split-cards__links {
  column-gap: 1rem;
  row-gap: 1rem;
  justify-content: center;
  align-items: center;
  margin-top: 1rem;
  display: flex;
}
.cl-split-cards__links.is-grid { flex-wrap: wrap; }

.cl-split-cards__link {
  border-bottom: .5px solid #ffffffe6;
  flex-flow: row;
  justify-content: flex-start;
  align-items: center;
  display: flex;
  max-width: 100%; /* .w-inline-block */
  color: inherit;
  text-decoration: none;
}
.cl-split-cards__link:hover { border-bottom-color: var(--cl-white); opacity: .85; }

@media screen and (max-width: 991px) {
  .cl-split-cards__card { padding-top: 70%; }
  .cl-split-cards__content { padding-bottom: 1.5rem; }
  /* Base combo the export carries and cl-base.css does not; it is what keeps
     the description to four lines and the card's content block shrink-wrapped
     to the size-link grid. */
  .cl-split-cards .text-weight-normal.max-width-small { max-width: 20rem; }
  .cl-split-cards__links.is-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    column-gap: 1rem;
    row-gap: 1rem;
    place-items: center;
  }
}
/* Round fifteen item 11: exactly one of the two controls is ever on screen. */
.cl-split-cards__picker { display: none; }
@media screen and (max-width: 767px) {
  /* `.is-grid` sets its own display, so the hide has to match it */
  .cl-split-cards__links,
  .cl-split-cards__links.is-grid { display: none; }
  .cl-split-cards__picker {
    position: relative;
    display: block;
    width: min(16rem, 100%);
    margin: 1.25rem auto 0;
  }
  .cl-split-cards__select {
    appearance: none; -webkit-appearance: none;
    width: 100%;
    padding: .75rem 2.25rem .75rem 1rem;
    border-radius: 100px;
    border: 1px solid rgba(255,255,255,.55);
    background: #251f2052;
    -webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px);
    color: var(--cl-white);
    font: inherit; font-size: .9375rem; line-height: 1.2;
    text-align: center; text-align-last: center;
    cursor: pointer;
  }
  /* the popup is the platform's, and its list inherits nothing from the pill:
     on Android an unset colour there renders white on white */
  .cl-split-cards__select option { color: var(--cl-black); background: #fff; }
  .cl-split-cards__select:focus-visible { outline: 2px solid var(--cl-white); outline-offset: 2px; }
  .cl-split-cards__select-chevron {
    position: absolute; right: 1rem; top: 50%;
    width: .75rem; height: .5rem;
    transform: translateY(-50%);
    color: var(--cl-white); opacity: .8;
    pointer-events: none;
  }

  .cl-split-cards__grid { grid-template-columns: 1fr; row-gap: .5rem; }

  /* DELIBERATE DEPARTURE FROM THE EXPORT, phones only (client, 2026-08-26).
     The export keeps the aspect box below 767: .double-images_card sets
     `height: auto` but never drops `padding-top: 70%`, so the card's height is
     still a pure ratio of its width while the content is an absolutely
     positioned overlay anchored to the foot. At 390 that is a 265px card
     holding 295px of copy: the description escapes 54px out of the top, the
     item's `overflow: hidden` eats the eyebrow and cuts the heading in half,
     and both cards do it (Sanctuary by 54px, Outdoor by 21px). The export has
     the same bug; the client screenshotted it.
     So on a phone the 70% ratio becomes a FLOOR instead of the height. The
     card is a one-cell grid; a zero-content ::before spacer carrying the
     ratio's padding-top and the content share that cell, so the row is the
     taller of the two. Where the copy fits, the card is still exactly the
     export's box (at 767 it measures 529px either way); where it does not, the
     card grows instead of spilling. The media stays absolute at inset 0, so
     the photo covers whatever height comes out. `align-items: end` keeps the
     copy at the foot, which is where the overlay had it. */
  .cl-split-cards__card {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    align-items: end;
    height: auto;
    padding-top: 0;
  }
  .cl-split-cards__card::before {
    content: "";
    grid-area: 1 / 1;
    /* Round fifteen item 9. The export's 70% is what made these cards all copy
       and no photo: at 390 the ratio floor was 265px under 295px of text, so
       the text WAS the card and the only image anyone saw was the blur behind
       it. The floor is taller than the copy now, so the photo reads above it.
       (The size select buys some of that back: five links wrapped to three
       rows here.) */
    padding-top: 90%;
  }
  .cl-split-cards__content {
    grid-area: 1 / 1;
    position: static;
    inset: auto;
    padding: 2rem 1.5rem 1.5rem;
  }

  /* The two-up size grid that used to live here is gone with the row itself:
     round fifteen item 11 replaced it on phones with the select above, and
     `display: grid` here beat the hide that puts it away. */
}
@media screen and (max-width: 479px) {
  .cl-split-cards .heading-large { font-size: 2rem; line-height: 1.2; } /* the twin has no 479 rule */
  /* The blur mask and the dark wash were tuned to the bottom 15-40% of a card
     whose eyebrow was clipped away. On a phone the copy now runs from ~10% of
     the card up, eyebrow included, so both layers travel with it or that line
     lands on bare photo. 480 and up keeps the export-tuned pair: the card is
     still the export's box there and the copy still sits in its lower third. */
  /* Round fifteen items 9 and 10: with a taller card the copy no longer runs
     to 92% of it, so neither layer has to. Both start and end lower and the
     top of the photo comes back sharp and unwashed. */
  .cl-split-cards__card::before { padding-top: 118%; }
  .cl-split-cards__media::before {
    -webkit-mask-image: linear-gradient(to top, #000 45%, transparent 80%);
    mask-image: linear-gradient(to top, #000 45%, transparent 80%);
  }
  .cl-split-cards__media::after {
    background-image: linear-gradient(to top, var(--cl-ink-75) 0%, var(--cl-ink-35) 48%, transparent 80%);
  }
}


/* cl-split.css */
/* ==========================================================================
   Image and text row. Port of layout3_component (.section-learn-more,
   .section-location), layout1_component (.section-vision, .section-podcast)
   and sauna-collection_component (.section-product-collection,
   .section_infrared-collection-split). One section, three variants.

   From the export (node tools/extract-section.mjs … --all):
     .section-learn-more            no background
       .background-color-lucidity   background #fff, despite the name
     .section-location, .section_layout142   bg var(--lucidity)
     .section_infrared-collection-split      bg var(--pumice)
     .section-product-collection    bg #fff
     .section-podcast               bg var(--cocoa), colour var(--white)
     .padding-vertical.padding-medium   margin-right 20px; 767 and 479: 0
     .layout3_component    grid-template "." / 1fr, grid-auto-flow column,
                           grid-auto-columns 1fr (two children resolve to
                           1fr 1fr), col-gap 5rem, row-gap 4rem, align centre
                           991: col-gap 3rem, 1fr 1fr, auto-flow row
                           767: row-gap 3rem, 1fr      479: 1fr
     .layout1_component    grid 1fr 1fr, col-gap 5rem, row-gap 4rem, align centre
                           991: col-gap 3rem   767: row-gap 3rem, 1fr
                           479: 1fr, align-items stretch
     .image-wrapper-1-1    width 100%, padding-top 100%, relative
     .image-wrapper-4-3 / -3-2 / -16-9   padding-top 75% / 66.66% / 56.25%
     .layout1_image-wrap   padding-top 90%; .is--tall 100%
     .image                absolute, inset 0 0 auto, 100% x 100%, object-fit fill
     .layout3_content, .layout1_content   no rules of their own
     .margin-bottom.margin-small   the heading wrapper: margin-bottom 0
                           (.margin-bottom's stock 20px is then zeroed by the
                           combo rule, so the wrapper is a no-op and is not
                           emitted here)
     .pre-heading          = cl-base; .is--light = cl-base .is-light, always
                           on an h2/h3 in the export (line-height 1.2)
                           991: text-align left
     .subheading-medium    font-size 1.375rem
     .text-rich-text p     margin-bottom .5rem; the page embed zeroes the last
                           child (.w-richtext > :last-child), as cl-richtext does
     .layout3_button-row   flex, col-gap 1.5rem, align centre
     .button-row           479: flex-direction column, align stretch (the
                           podcast instance's button sits in this one)
     .button-wrapper       inline-block
     .link-small           border-bottom 2px var(--cocoa), flex none,
                           margin-top 1rem, padding-bottom .15rem, .9rem / 600 /
                           1.4, inline-block, overflow hidden. Its z-index 1000
                           is inert on a static box and is not ported.
     .text-lightbox-link   margin-bottom -1.05rem
     .w-inline-block       inline-block, max-width 100%
     .button-play_wrapper  flex, col-gap .25rem, justify start, align centre,
                           font-weight 400
     .icon-1x1-xsmall      1.5rem square (cl-base carries 1rem, see report)
     a (page embed)        color inherit, text-decoration inherit
     .sauna-collection_component   flex column, row-gap 5rem, margin-top 5rem
                           991: text-align left      479: row-gap 3rem
     .sauna-collection_item   grid 1fr 1fr, rows auto, auto-columns 1fr,
                           row-gap 2rem, no column gap, align centre,
                           box-shadow 0 20px 40px -10px #0003
                           .is-reverted  1fr 1fr (DOM order is text, image)
                           .no-dropshadow  col-gap 3rem, no shadow
                           991: 1fr; .is-reverted 991: flex column-reverse
     .sauna-collection_item-text-wrapper   flex column, row-gap 1rem, justify
                           start, align start, text left, padding-inline 2.5rem
                           991: padding-bottom 2rem
                           767: padding-bottom 1.5rem, padding-inline 1.2rem
                           .no-padding  padding-left 0
     .sauna-collection_image-wrapper   min-height 40rem, padding-top 77.25%,
                           relative.  991: width 100%, min-height auto
     .image_cover-absolute = cl-base. Its 479 object-position 68% 50% is a
                           global quirk aimed at one hero and is not ported.
     .button.space-above   margin-top 16px; 479: letter-spacing 1px
     .heading-medium       767: line-height 1.4; 479: 1.2 (cl-base only steps
                           the size, so the leading is restated here)
     .heading-large        no letter-spacing (cl-base carries -1px);
                           479: line-height 1.3 (same)

   Deviations, deliberate:
     object-fit: cover in place of the export's fill on .image. Every export
     image in these rows is pre-cropped to its box, so the two render alike
     there; cover keeps a merchant's uncropped upload from being squashed.
     .link-small underlines with currentColor rather than var(--cocoa): equal
     on every export instance, and it survives the cocoa background.
   ========================================================================== */

.cl-split.is-bg-white    { background-color: var(--cl-white); }
.cl-split.is-bg-lucidity { background-color: var(--cl-lucidity); }
.cl-split.is-bg-lucid    { background-color: var(--cl-lucid); }
.cl-split.is-bg-pumice   { background-color: var(--cl-pumice); }
.cl-split.is-bg-cocoa    { background-color: var(--cl-cocoa); color: var(--cl-white); }

/* .padding-vertical.padding-medium in the export carries a 20px right margin
   that nothing asked for, dropped at 767. Reproduced because it is what every
   learn-more row renders against; flagged for the design pass. */
.cl-split .padding-vertical.padding-medium { margin-right: 20px; }

/* --------------------------------------------------------------------------
   Row grid: .layout3_component and .layout1_component agree on every value.
   -------------------------------------------------------------------------- */

.cl-split__row {
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-auto-columns: 1fr;
  column-gap: 5rem;
  row-gap: 4rem;
  align-items: center;
}

/* Aspect box. The variant sets the family ratio, the optional ratio class on
   the box overrides it. */
.cl-split__media { width: 100%; padding-top: 100%; position: relative; }
.cl-split.is-layout1 .cl-split__media { padding-top: 90%; }
.cl-split.is-collection .cl-split__media { min-height: 40rem; padding-top: 77.25%; }
.cl-split .cl-split__media.is-ratio-1-1  { padding-top: 100%;   min-height: 0; }
.cl-split .cl-split__media.is-ratio-4-3  { padding-top: 75%;    min-height: 0; }
.cl-split .cl-split__media.is-ratio-3-2  { padding-top: 66.66%; min-height: 0; }
.cl-split .cl-split__media.is-ratio-16-9 { padding-top: 56.25%; min-height: 0; }

.cl-split__media img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

/* --------------------------------------------------------------------------
   Content column
   -------------------------------------------------------------------------- */

.cl-split__lead { font-size: 1.375rem; }

/* Every .pre-heading.is--light in the export sits on an h2 or h3 and takes
   the heading rule's 1.2 leading; the plain eyebrow is a div at 1.5. */
.cl-split .pre-heading.is-light { line-height: 1.2; }

/* .text-rich-text p is .5rem where cl-richtext's page-body default is 1rem */
.cl-split .cl-richtext p { margin: 0 0 .5rem; }

/* .layout3_button-row */
.cl-split__button-row {
  display: flex;
  column-gap: 1.5rem;
  align-items: center;
}

/* .link-small */
.cl-split .link-small {
  border-bottom: 2px solid currentColor;
  flex: none;
  margin-top: 1rem;
  padding-bottom: .15rem;
  font-size: .9rem;
  font-weight: 600;
  line-height: 1.4;
  display: inline-block;
  overflow: hidden;
  color: inherit;
  text-decoration: none;
}
.cl-split .link-small:hover { opacity: .7; }

/* .text-lightbox-link > a.w-inline-block > .button-play_wrapper */
.cl-split__play { margin-bottom: -1.05rem; }
.cl-split__play-link {
  display: inline-block;
  max-width: 100%;
  color: inherit;
  text-decoration: none;
}
.cl-split__play-link:hover { opacity: .7; }
.cl-split__play-inner {
  display: flex;
  column-gap: .25rem;
  justify-content: flex-start;
  align-items: center;
  font-weight: 400;
}
.cl-split__play-icon { width: 1.5rem; height: 1.5rem; max-width: 100%; flex: none; fill: currentColor; }

/* --------------------------------------------------------------------------
   Collection variant: .sauna-collection_component and its items
   -------------------------------------------------------------------------- */

.cl-split.is-collection .cl-split__rows {
  display: flex;
  flex-direction: column;
  row-gap: 5rem;
  margin-top: 5rem;
}

.cl-split.is-collection .cl-split__row {
  grid-template-rows: auto;
  column-gap: normal;
  row-gap: 2rem;
  box-shadow: 0 20px 40px -10px #0003;
}
.cl-split.is-collection .cl-split__row.no-dropshadow { column-gap: 3rem; box-shadow: none; }

.cl-split.is-collection .cl-split__content {
  display: flex;
  flex-direction: column;
  row-gap: 1rem;
  justify-content: flex-start;
  align-items: flex-start;
  text-align: left;
  padding-left: 2.5rem;
  padding-right: 2.5rem;
}
/* .sauna-collection_item-text-wrapper.no-padding, only ever used on the
   reverted rows of the flat (no-dropshadow) instance */
.cl-split.is-collection .no-dropshadow.is-reverse .cl-split__content { padding-left: 0; }

/* .button.space-above: the collection button carries its own fixed 16px,
   which unlike the .margin-xsmall scale does not step down at 767, so the
   actions wrapper gives way to it here. */
.cl-split.is-collection .cl-split__actions { margin-top: 0; }
.cl-split.is-collection .cl-split__button-row > .button,
.cl-split.is-collection .cl-split__button-row > .button-secondary { margin-top: 16px; }

/* .heading-large carries no letter-spacing in the export; cl-base's -1px
   comes from a numbered twin and lets the title fit one line at 479 where
   the export wraps to two. */
.cl-split .heading-large { letter-spacing: normal; }

/* --------------------------------------------------------------------------
   Lightbox. A <dialog>; the iframe is injected on open and removed on close.
   -------------------------------------------------------------------------- */

.cl-split__dialog {
  border: 0;
  padding: 0;
  background: transparent;
  width: min(90vw, 64rem);
  max-width: none;
  /* Chrome's UA sheet gives a modal dialog overflow: auto, which clips the
     close button that sits above the frame. */
  overflow: visible;
}
.cl-split__dialog::backdrop { background: #251f20d9; }
.cl-split__frame { position: relative; padding-top: 56.25%; background: #000; }
.cl-split__frame iframe { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; }
.cl-split__close {
  position: absolute;
  top: -2.75rem;
  right: 0;
  appearance: none;
  background: none;
  border: 0;
  color: var(--cl-white);
  font-size: 1.5rem;
  cursor: pointer;
  line-height: 1;
}
.cl-split__close:focus-visible { outline: 2px solid var(--cl-white); outline-offset: 2px; }

/* --------------------------------------------------------------------------
   Breakpoints
   -------------------------------------------------------------------------- */

@media screen and (max-width: 991px) {
  .cl-split__row { column-gap: 3rem; }
  /* .pre-heading 991 counters the centring .padding-vertical.padding-xhuge applies */
  .cl-split .pre-heading { text-align: left; }
  .cl-split.is-collection .cl-split__rows { text-align: left; }
  .cl-split.is-collection .cl-split__row { grid-template-columns: 1fr; }
  .cl-split.is-collection .cl-split__row.is-reverse { display: flex; flex-direction: column-reverse; }
  .cl-split.is-collection .cl-split__content { padding-bottom: 2rem; }
  .cl-split.is-collection .cl-split__media { width: 100%; min-height: auto; }
}

@media screen and (max-width: 767px) {
  .cl-split .padding-vertical.padding-medium { margin-right: 0; }
  /* Round nineteen (client, 2026-08-28): on a phone every row reads text
     first, then its image, and the two sit 1.5rem apart, not 3rem. Row
     order on desktop (reverse or not) is untouched. */
  .cl-split__row { row-gap: 1.5rem; grid-template-columns: 1fr; }
  .cl-split__row > .cl-split__content { order: 1; }
  .cl-split__row > .cl-split__media { order: 2; }
  .cl-split .heading-medium { line-height: 1.4; }
  .cl-split.is-collection .cl-split__content { padding: 0 1.2rem 1.5rem; }
}

@media screen and (max-width: 479px) {
  .cl-split .heading-medium { line-height: 1.2; }
  .cl-split .heading-large { line-height: 1.3; }
  .cl-split.is-layout1 .cl-split__row { align-items: stretch; }
  /* .button-row at 479: the layout1 instances put their button in one */
  .cl-split.is-layout1 .cl-split__button-row { flex-direction: column; align-items: stretch; }
  .cl-split.is-collection .cl-split__rows { row-gap: 3rem; }
  /* .button.space-above */
  .cl-split.is-collection .button { letter-spacing: 1px; }
}

@media (prefers-reduced-motion: reduce) {
  .cl-split .link-small,
  .cl-split__play-link { transition: none; }
}

/* .list_no-bullets (kontakt/*.html advantages rows): padding-left 0, no markers */
.cl-split__text.is-plain-list ul,
.cl-split__text.is-plain-list ol { padding-left: 0; list-style: none; }


/* cl-stories.css */
/* ==========================================================================
   Stories band (sections/cl-stories.liquid). Modelled on Superpower's
   "Member stories": portrait cards 3:4-ish (their 340 x 440), radius ~1rem,
   a frosted play disc in the middle, a translucent name pill at the foot,
   the row scrolling with a peek.

   Round nineteen (client 2026-08-28): the row is the homepage carousel's
   slider. The track bleeds to both screen edges (assets/cl-slider.css,
   .cl-slider__track: the container never clips a card, only the screen
   edge does), the arrows are the prev | 1 / N | next pill at the bottom
   right, and the head's eyebrow is the hero's (.cl-eyebrow, cl-base.css).
   overflow-x: clip on the section (never hidden) is for the half-scrollbar
   overshoot vw carries on Windows, as on the carousel.
   ========================================================================== */

.cl-stories { background-color: var(--cl-white); overflow-x: clip; }
.cl-stories.is-lucidity { background-color: var(--cl-lucidity); }
.cl-stories.is-dark { background-color: var(--cl-black); color: var(--cl-white); }
.cl-stories.is-dark .heading-medium,
.cl-stories.is-dark .cl-eyebrow,
.cl-stories.is-dark .link-small { color: var(--cl-white); }
.cl-stories.is-dark .cl-slider__arrows { background-color: var(--cl-black); border-color: #ffffff40; }
.cl-stories.is-dark .cl-slider__arrow,
.cl-stories.is-dark .cl-slider__count { color: var(--cl-white); }
.cl-stories.is-dark .cl-slider__count { border-color: #ffffff40; }
.cl-stories.is-dark .cl-slider__arrow:hover { background-color: #ffffff1a; }

.cl-stories__head {
  display: flex;
  justify-content: space-between;
  align-items: flex-end;
  column-gap: 2rem;
  row-gap: 1rem;
  margin-bottom: 2rem;
}
.cl .cl-stories__head .heading-medium { margin: 0; }
/* the eyebrow keeps the hero's 1rem under it only while a heading follows */
.cl .cl-stories__eyebrow:last-child { margin-bottom: 0; }
.cl-stories .link-small {
  border-bottom: 2px solid currentColor;
  padding-bottom: .15rem;
  font-size: .9rem;
  font-weight: 600;
  color: inherit;
  text-decoration: none;
  white-space: nowrap;
}

/* Round eighteen: with quotes in it the band is the reviews anchor
   (#cl-bewertungen) the trust widget scrolls to; land under the nav. */
.cl-stories .cl-reviews-anchor { scroll-margin-top: calc(var(--cl-nav-h, 6.5rem) + 1.5rem); }

/* the viewport is the size container the card widths are a share of, and
   leaves room under the row for the pill (as .cl-carousel__viewport) */
.cl-stories__viewport { position: relative; padding-bottom: 6rem; container-type: inline-size; }
/* photo cards: four to the container, the fifth peeking in the bleed */
.cl-stories__track {
  display: grid;
  grid-auto-flow: column;
  grid-auto-columns: calc((100cqw - 3 * 1rem) / 4);
  column-gap: 1rem;
}

.cl-stories__card {
  position: relative;
  aspect-ratio: 3 / 4;
  border-radius: 1rem;
  overflow: hidden;
  background-color: var(--cl-pumice);
  scroll-snap-align: start;
}
.cl-stories__card img,
.cl-stories__loop { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; display: block; }
.cl-stories__loop { z-index: 1; }
.cl-stories__link { position: absolute; inset: 0; z-index: 2; }
.cl-stories__card::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 2;
  pointer-events: none;
  background-image: linear-gradient(to top, var(--cl-ink-50) 0%, transparent 45%);
}
.cl-stories__play {
  position: absolute;
  inset: 0;
  margin: auto;
  z-index: 3;
  width: 3.5rem;
  height: 3.5rem;
  padding: 0;
  border: 1px solid #ffffff80;
  border-radius: 100px;
  color: var(--cl-black);
  background-color: #ffffffd9;
  -webkit-backdrop-filter: blur(.5rem);
  backdrop-filter: blur(.5rem);
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  appearance: none;
  transition: transform .2s ease, background-color .2s ease;
}
.cl-stories__play:hover { transform: scale(1.06); background-color: var(--cl-white); }
.cl-stories__play:focus-visible { outline: 2px solid var(--cl-white); outline-offset: 3px; }
.cl-stories__play svg { width: 1rem; height: 1rem; margin-left: .15rem; display: block; }
.cl-stories__pill {
  position: absolute;
  left: 1rem;
  bottom: 1rem;
  z-index: 3;
  padding: .5rem .875rem;
  border-radius: 100px;
  background-color: #ffffff33;
  border: 1px solid #ffffff40;
  -webkit-backdrop-filter: blur(.75rem);
  backdrop-filter: blur(.75rem);
  color: var(--cl-white);
  font-size: .9375rem;
  line-height: 1;
  white-space: nowrap;
  max-width: calc(100% - 2rem);
  overflow: hidden;
  text-overflow: ellipsis;
  pointer-events: none;
}
.cl-stories__meta { opacity: .85; }

/* Review card (round eighteen, sections/cl-stories.liquid): a real Google
   review instead of a stock photo. Not the 3:4 frame: a quote has to be
   readable in full, so the card takes the height of its text and the row
   stretches every review card to the tallest (a photo card in the same row
   keeps its ratio: a grid item with an aspect ratio aligns start, not
   stretch). With quotes in it the track shows three cards to the container
   and the fourth peeking in the bleed, as the homepage carousel (two on a
   tablet, one and a quarter on a phone). Sand on the white band, white on
   the lucidity band, a tint on the dark one. A pasted essay is capped at
   14 lines with an ellipsis; the source line sits on the foot. */
.cl-stories__track.is-quotes { grid-auto-columns: calc((100cqw - 2 * 1rem) / 3); }
.cl-stories__card.is-review {
  aspect-ratio: auto;
  min-height: 18rem;
  display: flex;
  flex-direction: column;
  padding: 1.5rem;
  background-color: var(--cl-lucidity);
  color: var(--cl-black);
}
.cl-stories.is-lucidity .cl-stories__card.is-review { background-color: var(--cl-white); }
.cl-stories.is-dark .cl-stories__card.is-review { background-color: #ffffff14; color: var(--cl-white); }
.cl-stories__card.is-review::after { display: none; }
.cl-stories__who { display: flex; align-items: center; column-gap: .75rem; min-width: 0; }
.cl-stories__avatar {
  flex: none;
  width: 2.75rem;
  height: 2.75rem;
  border-radius: 100px;
  overflow: hidden;
  background-color: var(--cl-lucid);
  color: var(--cl-cocoa);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-size: .8125rem;
  font-weight: 500;
  letter-spacing: .02em;
}
.cl-stories .cl-stories__avatar img { position: static; width: 100%; height: 100%; object-fit: cover; border-radius: 100px; }
.cl-stories.is-dark .cl-stories__avatar { background-color: #ffffff26; color: var(--cl-white); }
.cl-stories__byline { display: flex; flex-direction: column; row-gap: .125rem; min-width: 0; }
.cl-stories__name { font-weight: 600; font-size: .9375rem; line-height: 1.2; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cl-stories__date { font-size: .8125rem; line-height: 1.2; opacity: .7; }
.cl-stories__stars { display: inline-flex; column-gap: .2rem; margin-top: .875rem; color: var(--cl-golden); }
.cl-stories__star { width: 1rem; height: 1rem; display: inline-flex; }
.cl-stories__star svg { width: 100%; height: 100%; fill: currentColor; display: block; }
.cl-stories .cl-stories__quote {
  margin: .75rem 0 0;
  font-size: .9375rem;
  line-height: 1.5;
  flex: 1 1 auto;
  min-height: 0;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 14;
  overflow: hidden;
}
.cl-stories__source {
  margin-top: .75rem;
  display: inline-flex;
  align-items: center;
  column-gap: .5rem;
  font-size: .75rem;
  line-height: 1;
  letter-spacing: .04em;
  text-transform: uppercase;
  opacity: .85;
}
.cl-stories__g { width: 1.125rem; height: 1.125rem; flex: none; display: block; }


.cl-stories__dialog { border: 0; padding: 0; background: transparent; width: min(90%, 30rem); max-width: none; }
.cl-stories__dialog::backdrop { background: #ffffffbf; -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px); }
.cl-stories__frame { position: relative; aspect-ratio: 9 / 16; background: #000; border-radius: 1rem; overflow: hidden; box-shadow: 0 24px 64px var(--cl-ink-25); }
.cl-stories__dialog.is-wide { width: min(92vw, 64rem); }
.cl-stories__dialog.is-wide .cl-stories__frame { aspect-ratio: 16 / 9; }
.cl-stories__frame video,
.cl-stories__frame iframe { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; object-fit: contain; background: #000; display: block; }
.cl-stories__close { position: absolute; top: .5rem; right: .75rem; z-index: 2; appearance: none; background: none; border: 0; color: var(--cl-white); font-size: 1.75rem; line-height: 1; cursor: pointer; }

@media screen and (max-width: 991px) {
  .cl-stories__track { grid-auto-columns: calc((100cqw - 2 * .75rem) / 3); column-gap: .75rem; }
  .cl-stories__head { flex-direction: column; align-items: flex-start; }
  .cl-stories__track.is-quotes { grid-auto-columns: calc((100cqw - .75rem) / 2); }
}
@media screen and (max-width: 767px) {
  .cl-stories__viewport { padding-bottom: 5rem; }
  .cl-stories__track { grid-auto-columns: calc((100cqw - .75rem) / 1.5); }
  .cl-stories__pill { font-size: .875rem; }
  /* 1.25 cards in the container, the rest of the second one in the bleed */
  .cl-stories__track.is-quotes { grid-auto-columns: 80cqw; }
  .cl-stories__card.is-review { padding: 1.25rem; min-height: 0; }
  .cl-stories .cl-stories__quote { font-size: .875rem; }
}
@media (prefers-reduced-motion: reduce) {
  .cl-stories__play { transition: none; }
}


/* cl-testimonial-slider.css */
/* ==========================================================================
   Testimonial slider. Port of section_testimonial2 (alle-modelle.html),
   relaid in round ten as the "Member stories" pattern the client sent:

     .cl-testimonial-slider__head    heading, sub-line and the trust line on
                                     the left, the pill nav on the right
                                     (flex, space-between, align end)
     .cl-testimonial-slider__trust   snippets/cl-trust (is-large): the four
                                     reviewer photos, golden stars, review line
     .cl-testimonial-slider__nav     prev | 1/N | next, the product carousel's
                                     pill (cl-slider.css .cl-slider__arrows)
     .cl-testimonial-slider__track   scroll-snap row, two cards per view on
                                     desktop, one under 768px, 1.5rem gap,
                                     .is-dragging while a mouse drags it
     .cl-testimonial-slider__card    white, 2.5rem padding, the quote mark
                                     floating over its top right corner
     .cl-testimonial-slider__certs   the certificate row, unchanged from the
                                     export (grid 5 x 1fr, gap 16px,
                                     margin 5rem 0 3rem; 991: 2 x 1fr)

   Kept from the export: the section's lucid / lucidity backgrounds and the
   10rem top margin of the lucidity variant (991: 0, 767: 3rem), the card
   anatomy (.testimonial1_component: profile row with a 3.5rem photo, quote,
   bottom row with stars and the platform mark under a hairline), the
   certificate row. The `is-rd` variant (section_rd-testimonials on the
   landing pages) is untouched below.
   ========================================================================== */

.cl-testimonial-slider { background-color: var(--cl-lucid); }
/* Round eighteen: the inner wrapper is the reviews anchor (#cl-bewertungen)
   the trust widget scrolls to; land it under the sticky nav. */
.cl-testimonial-slider .cl-reviews-anchor { scroll-margin-top: calc(var(--cl-nav-h, 6.5rem) + 1.5rem); }
.cl-testimonial-slider.is-lucidity { background-color: var(--cl-lucidity); margin-top: 10rem; position: relative; }

/* --- head: copy left, pill nav right ------------------------------------- */
.cl-testimonial-slider__head {
  display: flex;
  justify-content: space-between;
  align-items: flex-end;
  column-gap: 2rem;
  row-gap: 1.5rem;
  margin-bottom: 2.5rem;
}
.cl-testimonial-slider__left {
  display: flex;
  flex-flow: column;
  align-items: flex-start;
  row-gap: 1rem;
  text-align: left;
  max-width: 40rem;
}
.cl-testimonial-slider__sub p { margin: 0; }
.cl-testimonial-slider__trust { padding-top: .25rem; }
.cl-testimonial-slider__trust .cl-trust { flex-wrap: wrap; }

/* prev | 1 / N | next, the product carousel's pill on a white ground */
.cl-testimonial-slider__nav {
  display: flex;
  align-items: stretch;
  flex: none;
  border: 1px solid var(--cl-ink-15);
  border-radius: 100px;
  background-color: var(--cl-white);
  overflow: hidden;
}
.cl-testimonial-slider__arrow {
  width: 2.75rem;
  height: 2.25rem;
  margin: 0;
  padding: 0;
  border: 0;
  color: var(--cl-black);
  background-color: transparent;
  justify-content: center;
  align-items: center;
  display: flex;
  cursor: pointer;
  appearance: none;
  transition: background-color .2s ease;
}
.cl-testimonial-slider__arrow:hover { background-color: var(--cl-light-grey); }
.cl-testimonial-slider__arrow:disabled { opacity: .35; cursor: default; background-color: transparent; }
.cl-testimonial-slider__arrow:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: -2px; }
.cl-testimonial-slider__arrow svg { width: 1rem; height: 1rem; display: block; }
.cl-testimonial-slider__count {
  display: flex;
  align-items: center;
  column-gap: .25rem;
  padding: 0 .875rem;
  border-inline: 1px solid var(--cl-ink-15);
  font-size: .9375rem;
  color: var(--cl-black);
  font-variant-numeric: tabular-nums;
}
.cl-testimonial-slider__count-sep,
.cl-testimonial-slider__count [data-cl-ts-total] { opacity: .5; }

/* --- track: a scroll-snap row, two cards per view ------------------------- */
.cl-testimonial-slider__slider { position: relative; container-type: inline-size; }
.cl-testimonial-slider__track {
  display: grid;
  grid-auto-flow: column;
  grid-auto-columns: calc(50cqw - .75rem);
  column-gap: 1.5rem;
  align-items: stretch;
  padding-top: 2rem; /* room for the quote mark that floats above the card */
  overflow-x: auto;
  overflow-y: hidden;
  scroll-snap-type: x mandatory;
  scroll-behavior: smooth;
  scrollbar-width: none;
  -webkit-overflow-scrolling: touch;
  cursor: grab;
}
.cl-testimonial-slider__track::-webkit-scrollbar { display: none; }
.cl-testimonial-slider__track:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: 2px; }
.cl-testimonial-slider__track.is-dragging { scroll-snap-type: none; scroll-behavior: auto; cursor: grabbing; user-select: none; }
.cl-testimonial-slider__slide { position: relative; scroll-snap-align: start; min-width: 0; display: flex; }
.cl-testimonial-slider__slide img { -webkit-user-drag: none; }

/* .testimonial1_component */
.cl-testimonial-slider__card {
  position: relative;
  width: 100%;
  background-color: #fff;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  padding: 2.5rem;
}
/* .testimonial1_profile-wrapper */
.cl-testimonial-slider__profile { display: flex; column-gap: 1rem; justify-content: flex-start; align-items: center; }
/* .testimonial_photo.is-foundershield.is-dark */
.cl-testimonial-slider__photo {
  background-color: var(--cl-cocoa);
  color: var(--cl-white);
  border-radius: 2rem;
  justify-content: center;
  align-items: center;
  width: 3.5rem;
  height: 3.5rem;
  font-size: 1.125rem;
  font-weight: 600;
  display: flex;
  flex: none;
  overflow: hidden;
}
.cl-testimonial-slider__photo img { width: 100%; height: 100%; object-fit: cover; }
/* the quote fills the card so the bottom rows of two cards line up */
.cl-testimonial-slider__quote { width: 100%; margin: 1.5rem 0 2rem; flex: 1 0 auto; }
.cl-testimonial-slider__quote .text-size-medium { line-height: 1.5; }
/* .testimonial3_bottom */
.cl-testimonial-slider__bottom {
  display: flex;
  justify-content: space-between;
  align-items: center;
  column-gap: 1rem;
  width: 100%;
  border-top: 1px solid #00000026;
  padding-top: .75rem;
}
.cl-testimonial-slider__stars { display: flex; justify-content: flex-start; align-items: center; }
.cl-testimonial-slider__star { color: var(--cl-golden); width: 1.125rem; margin-right: .25rem; display: inline-block; }
.cl-testimonial-slider__star svg { width: 100%; height: auto; display: block; }
/* Google's four-colour G, full strength (the faded cocoa copy read as missing) */
.cl-testimonial-slider__platform { width: 1.375rem; height: 1.375rem; flex: none; }
.cl-testimonial-slider__platform svg { width: 100%; height: 100%; display: block; }
/* .icon-embed-large.is-quote */
.cl-testimonial-slider__quote-icon {
  z-index: 2;
  color: var(--cl-cocoa);
  width: 4rem;
  height: 4rem;
  display: flex;
  justify-content: center;
  align-items: center;
  position: absolute;
  inset: -1.9rem 1.5rem auto auto;
  pointer-events: none;
}
.cl-testimonial-slider__quote-icon svg { width: 100%; height: 100%; }

/* the reviews button under the row */
.cl-testimonial-slider__cta { margin-top: 2rem; display: flex; }
.cl-testimonial-slider__cta .button-secondary { max-width: 100%; }

/* .certificates_component, .certificate_item, .certificate_logo */
.cl-testimonial-slider__certs {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr 1fr 1fr;
  grid-auto-columns: 1fr;
  column-gap: 16px;
  row-gap: 16px;
  margin-top: 5rem;
  margin-bottom: 3rem;
}
.cl-testimonial-slider__cert {
  background-color: var(--cl-white);
  display: flex;
  justify-content: center;
  align-items: center;
  padding: 1.5rem;
  text-decoration: none;
  color: inherit;
  max-width: 100%; /* .w-inline-block */
}
.cl-testimonial-slider__cert-logo { max-height: 4.5rem; width: auto; }
/* The export's .heading-medium opens its leading to 1.4 at 767 and closes it
   again at 479; cl-base carries only the sizes. */
@media screen and (max-width: 767px) { .cl-testimonial-slider .heading-medium { line-height: 1.4; } }
@media screen and (max-width: 479px) { .cl-testimonial-slider .heading-medium { line-height: 1.2; } }

/* --------------------------------------------------------------------------
   is-rd: section_rd-testimonials
   -------------------------------------------------------------------------- */
.cl-testimonial-slider.is-rd { background-color: var(--cl-black); margin-top: 0; }
/* Black Friday 2026: the quote slider on cocoa. Cards and certificates stay
   white; the head flips to white.

   Two things the light layout gets away with fail here (client, 2026-09-22):
   the cocoa quote mark hangs half outside the card and vanished into the
   cocoa ground, so on cocoa it sits inside the card in lucid, a watermark;
   and the white nav pill with a dimmed disabled arrow read as white on
   white, so the pill becomes an outlined pill with white arrows and counter. */
.cl-testimonial-slider.is-cocoa { background-color: var(--cl-cocoa); color: var(--cl-white); margin-top: 0; }
.cl-testimonial-slider.is-cocoa .cl-testimonial-slider__head { color: var(--cl-white); }
.cl-testimonial-slider.is-cocoa .cl-testimonial-slider__card { color: var(--cl-cocoa); }
.cl-testimonial-slider.is-cocoa .cl-testimonial-slider__quote-icon { inset: 1.25rem 1.25rem auto auto; width: 3rem; height: 3rem; color: var(--cl-lucid); }
.cl-testimonial-slider.is-cocoa .cl-testimonial-slider__nav { background-color: transparent; border-color: #ffffff59; }
.cl-testimonial-slider.is-cocoa .cl-testimonial-slider__arrow { color: var(--cl-white); }
.cl-testimonial-slider.is-cocoa .cl-testimonial-slider__arrow:hover { background-color: var(--cl-veil-light); }
.cl-testimonial-slider.is-cocoa .cl-testimonial-slider__arrow:disabled { opacity: .45; background-color: transparent; }
.cl-testimonial-slider.is-cocoa .cl-testimonial-slider__count { color: var(--cl-white); border-color: #ffffff59; }
.cl-testimonial-slider.is-cocoa .cl-testimonial-slider__track:focus-visible,
.cl-testimonial-slider.is-cocoa .cl-testimonial-slider__arrow:focus-visible { outline-color: var(--cl-white); }
.cl-testimonial-slider.is-cocoa .cl-testimonial-slider__cta .button-secondary { border-color: var(--cl-white); color: var(--cl-white); }
.cl-testimonial-slider.is-cocoa .cl-testimonial-slider__cta .button-secondary:hover { background-color: var(--cl-veil-light); }
.cl-testimonial-slider .cl-testimonial-slider__rd-title {
  color: #fff;
  text-align: center;
  margin-bottom: 5rem;
  padding-left: 0;
  font-family: var(--cl-font-heading);
  font-size: 2.6rem;
  font-weight: 400;
  line-height: 1.2;
  position: relative;
}
.cl-testimonial-slider__rd-item {
  display: flex;
  column-gap: 3rem;
  row-gap: 3rem;
  color: #fff;
  justify-content: flex-start;
  align-items: stretch;
  margin-bottom: 5rem;
}
.cl-testimonial-slider__rd-image { border-radius: 20rem; flex: none; width: 15rem; height: auto; align-self: flex-start; }
.cl-testimonial-slider__rd-text { display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; row-gap: 1rem; column-gap: 1rem; min-width: 0; }
/* h3 from components.css (24px / bold) plus .text-color-orange */
.cl-testimonial-slider .cl-testimonial-slider__rd-name { color: #ff4c25; font-size: 1.5rem; font-weight: 700; line-height: 1.2; }
.cl-testimonial-slider__rd-text .text-size-large { line-height: 1.5; }
/* the classless full-width <img> that closes the export's section: Webflow's
   img reset makes it inline-block with vertical-align middle, no line gap */
.cl-testimonial-slider .cl-testimonial-slider__rd-footer { display: inline-block; vertical-align: middle; width: 100%; height: auto; }

@media screen and (max-width: 991px) {
  .cl-testimonial-slider.is-lucidity { margin-top: 0; }
  .cl-testimonial-slider__certs { grid-template-columns: 1fr 1fr; }
  .cl-testimonial-slider__rd-item { flex-direction: column; justify-content: center; align-items: center; }
  .cl-testimonial-slider__rd-image { align-self: center; }
  .cl-testimonial-slider .cl-testimonial-slider__rd-name { font-size: 2.25rem; }
}
@media screen and (max-width: 767px) {
  .cl-testimonial-slider.is-lucidity { margin-top: 3rem; }
  /* one card per view, the next one's edge in the bleed; nav under the copy */
  .cl-testimonial-slider__head { flex-direction: column; align-items: flex-start; margin-bottom: 1.5rem; }
  .cl-testimonial-slider__track { grid-auto-columns: 88cqw; column-gap: 1rem; }
  .cl-testimonial-slider__card { padding: 2rem 1.5rem 1.5rem; }
  .cl-testimonial-slider__quote { margin: 1.25rem 0 1.5rem; }
  .cl-testimonial-slider__quote-icon { width: 3rem; height: 3rem; inset: -1.4rem 1rem auto auto; }
  .cl-testimonial-slider .cl-testimonial-slider__rd-title { font-size: 2.2rem; }
  .cl-testimonial-slider .cl-testimonial-slider__rd-name { text-align: center; font-size: 1.5rem; }
  .cl-testimonial-slider__rd-text .text-size-large { line-height: 1.35; }
}
@media screen and (max-width: 479px) {
  /* cl-trust centres its large size on a phone; here it sits under a left heading */
  .cl-testimonial-slider__trust .cl-trust.is-large { justify-content: flex-start; }
  .cl-testimonial-slider .cl-testimonial-slider__rd-title { text-align: left; margin-bottom: 2rem; font-size: 1.6rem; line-height: 1.3; }
  .cl-testimonial-slider__rd-item { margin-bottom: 4rem; }
  .cl-testimonial-slider .cl-testimonial-slider__rd-name { text-align: left; font-size: 1.4rem; }
}
@media (prefers-reduced-motion: reduce) {
  .cl-testimonial-slider__track { scroll-behavior: auto; }
  .cl-testimonial-slider__arrow { transition: none; }
}


/* cl-testimonials.css */
/* ==========================================================================
   Testimonial grid. Port of section-testimonials.

   From the export:
     .section-testimonials       bg lucidity, relative, overflow hidden
     .customer-testimonials_component  flex column, align start
     .testimonial_grid           grid 1fr 1fr, col-gap 2rem, row-gap 1rem
                                 767: 1 column, margin-top 2.5rem
     .testimonial1-column        display block, row-gap 4rem   767: 1.25rem
     .testimonial_card           bg #fff, radius .25rem, max-width 25rem,
                                 margin-bottom 2rem, padding 1.5rem
                                 991: max-width none
     .testimonial1_profile-wrapper  flex, gap 1rem, align centre, mb 1rem
     .testimonial_photo          3.5rem circle, bg #e4e4e4, 1.125rem
       .is-foundershield         #181818 on #f8f3ef, weight 600
     .testimonial1-bottom        uppercase, border-top 1px #00000040,
                                 space-between, margin-top 1rem, padding-top 1rem
     .testimonial-star           colour #3e3037, 1.25rem, margin-right .25rem
     .testimonial1_platform-icon opacity .25, 1.25rem, margin-left auto

     .section-testimonial_gradient-more  absolute, inset auto 0 0, 13rem,
                                 gradient #fff0 to #e8d7ca, flex column centred
     .heading-medium-2           the heading's twin: line-height 1.1 (base 1.2)
     .pre-heading > strong       eyebrow: 600, margin 4rem 0 2rem
     .margin-bottom.margin-large 20px at desktop: the export's base
                                 .margin-bottom carries Webflow's stock
                                 `margin: 0 0 20px` after every size class, so
                                 the scale only applies inside the breakpoints
     section (inline, IX2)       height: 53rem while collapsed

   .testimonial_grid declares both column-count: 3 and a two column
   grid-template, but it is display: flex, so neither applies: it is a flex
   row of three block columns, shrink-wrapped to three 25rem cards and the
   two 2rem gaps (1264px in a 1280px container).
   ========================================================================== */

.cl-testimonials { background-color: var(--cl-lucidity); position: relative; overflow: hidden; }
/* Round eighteen: the section is the reviews anchor (#cl-bewertungen) the
   trust widget scrolls to; land it under the sticky nav, not behind it. */
.cl-testimonials.cl-reviews-anchor { scroll-margin-top: calc(var(--cl-nav-h, 6.5rem) + 1.5rem); }
.cl-testimonials.is-white  { background-color: var(--cl-white); --cl-tm-fade: var(--cl-white); }
.cl-testimonials.is-pumice { background-color: var(--cl-pumice); --cl-tm-fade: var(--cl-pumice); }

/* The export's heading twin and eyebrow, and the stock 20px bottom margin
   the base .margin-bottom rule gives every size at desktop (cl-base.css
   applies the scale, 3rem here). Pinned at desktop only: the export's 991
   and 767 size rules come later in its file and win again. */
@media screen and (min-width: 768px) {
  .cl-testimonials .heading-medium { line-height: 1.1; } /* the twin's 767 rule is 1.4, like the base */
}
@media screen and (max-width: 479px) {
  .cl-testimonials .heading-medium { line-height: 1.4; } /* the twin has no 479 rule; the base steps to 1.2 */
}
/* 3rem between the title block and the grid at every width (client, 2026-08-25) */
.cl .cl-testimonials__component > .margin-bottom { margin-bottom: 3rem; }
/* the sub-line sits .5rem under the heading, not the export's 4rem */
.cl-testimonials .pre-heading { margin-top: .5rem; margin-bottom: 0; }

.cl-testimonials__component { display: flex; flex-direction: column; align-items: flex-start; }

/* The export's .testimonial_grid is a flex row of .testimonial1-column blocks,
   each stacking its own cards. That is a masonry column layout, not a card
   grid, and it is why cards of different quote length sit flush. The row is
   a flex item of a column with align-items: flex-start, so it shrink-wraps:
   each column is as wide as its widest card (25rem) and the row is 1264px
   in the 1280px container. Reproduced. */
.cl-testimonials__grid {
  display: flex;
  column-gap: 2rem;
  row-gap: 1rem;
  padding-bottom: 2rem;
}
.cl-testimonials__col { display: block; flex: 0 1 auto; min-width: 0; }

.cl-testimonials__card {
  background-color: var(--cl-white);
  border-radius: .25rem;
  max-width: 25rem;
  margin-bottom: 2rem;
  padding: 1.5rem;
}

/* Opt-in: equal columns that fill the container, no 25rem cap. The export's
   cap only works because its row runs three columns; at two it would leave
   224px of dead space per row. */
.cl-testimonials__grid.is-fill { width: 100%; }
.cl-testimonials__grid.is-fill .cl-testimonials__col { flex: 1; }
.cl-testimonials__grid.is-fill .cl-testimonials__card { max-width: none; }

.cl-testimonials__profile {
  column-gap: 1rem;
  justify-content: flex-start;
  align-items: center;
  margin-bottom: 1rem;
  display: flex;
}

.cl-testimonials__photo {
  background-color: var(--cl-lucidity);
  color: var(--cl-black);
  border-radius: 2rem;
  justify-content: center;
  align-items: center;
  width: 3.5rem;
  height: 3.5rem;
  font-size: 1.125rem;
  font-weight: 600;
  display: flex;
  flex: none;
  overflow: hidden;
}
.cl-testimonials__photo.is-dark { background-color: var(--cl-cocoa); color: var(--cl-white); }
.cl-testimonials__photo img { width: 100%; height: 100%; object-fit: cover; }

.cl-testimonials__bottom {
  font-size: .875rem;
  text-transform: uppercase;
  border-top: 1px solid #00000040;
  justify-content: space-between;
  align-items: center;
  margin-top: 1rem;
  padding-top: 1rem;
  display: flex;
}

/* The export applies .testimonial_star-wrapper without its .is-horizontal
   modifier, so the wrapper is a plain block and the stars flow inline:
   inline-block embeds whose inline svg sits on the baseline, so each star is
   the svg (18.9px) plus the line's descender, 24.9px, and the word space
   between embeds is part of the spacing. The platform mark is the same
   construction at 26.4px, which is what sets the row's height. */
.cl-testimonials__stars { display: block; }
.cl-testimonials__star { color: var(--cl-cocoa); width: 1.25rem; margin-right: .25rem; display: inline-block; }
.cl-testimonials__star svg { width: 100%; height: auto; display: inline; fill: currentColor; }
.cl-testimonials__platform { display: block; opacity: .25; width: 1.25rem; margin-left: auto; }
.cl-testimonials__platform svg { width: 100%; height: auto; display: inline; fill: currentColor; }

@media screen and (max-width: 991px) { .cl-testimonials__card { max-width: none; } }
@media screen and (max-width: 991px) { .cl-testimonials__grid { flex-direction: column; } }
@media screen and (max-width: 767px) { .cl-testimonials__grid { margin-top: 2.5rem; } }

/* --------------------------------------------------------------------------
   Collapsed section with a fade and a show-more control.

   The export's IX2 interaction writes `height: 53rem` on the section, whose
   overflow is hidden, and .section-testimonial_gradient-more is a 13rem
   absolute band on the section's bottom edge, fading from transparent to
   #e8d7ca (lucid) with the button centred in it. The band ends on lucid while
   the section sits on lucidity, so the fade lands on a visibly different
   colour than the background: reproduced as the default, with the end colour
   a token so it can be corrected in one place (the white and pumice variants
   fade to their own background).
   -------------------------------------------------------------------------- */

.cl-testimonials.is-collapsed { height: var(--cl-tm-max, 53rem); }

.cl-testimonials__fade {
  background-image: linear-gradient(#fff0, var(--cl-tm-fade, var(--cl-lucid)));
  flex-direction: column;
  justify-content: center;
  align-items: center;
  height: 13rem;
  display: flex;
  position: absolute;
  inset: auto 0 0;
}
.cl-testimonials__fade .button { cursor: pointer; }
.cl-testimonials:not(.is-collapsed) .cl-testimonials__fade { display: none; }

/* Round twenty-three: on a phone the 13rem fade landed mid-quote with the
   button over the text and the stars under a half-transparent wash. The
   band now reaches its colour by 55% and the button sits on the solid part. */
@media screen and (max-width: 767px) {
  .cl-testimonials__fade { height: 12rem; justify-content: flex-end; padding-bottom: 1.75rem; background-image: linear-gradient(#fff0 0%, var(--cl-tm-fade, var(--cl-lucid)) 55%); }
}

/* Round twenty-three: the rating row under the heading, and the smooth open */
.cl-testimonials__trust { margin-top: 1rem; }
.cl-testimonials.is-opening { overflow: hidden; transition: height .7s cubic-bezier(.2, 0, 0, 1); }
.cl-testimonials.is-opening .cl-testimonials__fade { display: flex; opacity: 0; transition: opacity .4s ease; pointer-events: none; }


/* cl-thank-you.css */
/* ==========================================================================
   Thank-you hero. Port of section-thankyou, with section-book-a-call folded
   in as an optional second block (it follows the hero on cl-thankyou.html and
   campaigns/vielen-dank.html).

   From the export, cl-thankyou.html :: .section-thankyou:
     .section-thankyou                 bg #cff7fe00 (alpha 0, i.e. transparent;
                                       the page behind it is lucidity from
                                       .main-wrapper.background-color-lucidity
                                       on all seven thank-you pages)
     .padding-vertical.padding_thankyou  padding-top 10rem, padding-bottom 4rem,
                                       no breakpoint rules          -> .is-hero
     .margin-bottom.margin-small       margin-bottom: 0 (the export's own
                                       combo rule, line 1739, beats .margin-small)
                                                                    -> __head
     h2.pre-heading                    base .pre-heading on an h2, so line-height
                                       1.2 from `h1, h2, h3`; the port prints a
                                       div and restates the 1.2
     h3.heading-medium                 2.25rem / 400 / 1.2
                                       991: 1.75rem  767: 1.5rem, line-height 1.4
                                       479: line-height 1.2
                                       cl-base.css carries the sizes but not the
                                       767 / 479 line-heights; restated here
     h2.heading-small                  (catalogue and ebook pages) 1.5rem / 1.4,
                                       margin-bottom .5rem; 767: 1.25rem.
                                       cl-base.css lacks the 1.4 and the .5rem
     p.text-size-medium                = .text-size-medium
     .button-copy.w-inline-block       = .button plus margin 40px -106px 40px 0
                                       and, from components.css .w-inline-block,
                                       max-width 100%. The negative margin
                                       widens the block-level flex pill to the
                                       column plus 106px, the max-width caps it
                                       at the column again, so it renders as a
                                       bar exactly as wide as the column.
                                       Reproduced as .is-wide (40px of margin
                                       above and below are real); flagged for
                                       the design pass
     .button-wrapper                   display inline-block (catalogue page)
     .margin-top.margin-small          = base

   cl-thankyou.html :: .section-book-a-call:
     .section-book-a-call              bg #cff7fe00 (transparent), margin-top 0
     .padding-vertical.padding-small   = base (1.5rem, 767: 1.25rem)
     .margin-bottom.margin-small       margin-bottom 0               -> __head
     .heading-medium-5.text-align-center
                                       2.25rem / 400 / 1.1, padding-bottom 10px
                                       991: 1.75rem, padding-bottom 0
                                       767: 1.5rem, line-height 1.4 (no 479 step)
     .text-size-medium-4               1.125rem; 767: 1rem (= .text-size-medium).
                                       The twin also sets text-align: left at 991
                                       under a centred parent; not reproduced,
                                       the text stays centred with its heading.
                                       Style-only deviation, no box change.
     .oncehub-calendar-block           margin-top 2rem               -> __embed
     .oncehub-code                     width 100%, height 600px      -> __embed-box
                                       (min-height now: the HubSpot meetings
                                       iframe is ~760px and grows as the visitor
                                       picks a date; a fixed 600px let it overlap
                                       the next section)
   ========================================================================== */

.cl-thank-you { background-color: #cff7fe00; }
.cl-thank-you.is-lucidity { background-color: var(--cl-lucidity); }
.cl-thank-you.is-pumice   { background-color: var(--cl-pumice); }

/* .padding_thankyou: the only section in the export with this combo, and it
   never steps down at any breakpoint. */
.cl-thank-you .padding-vertical.is-hero { padding-top: 10rem; padding-bottom: 4rem; }

/* .margin-bottom.margin-small resolves to 0 in the export (its combo rule
   restates the bottom), so the heading block carries no margin at all. */
.cl-thank-you__head { margin-bottom: 0; }

/* the export's eyebrow is an h2, which takes line-height 1.2 from the heading
   element rule; the port prints a div */
.cl-thank-you .pre-heading { line-height: 1.2; }

.cl-thank-you .heading-small { line-height: 1.4; margin-bottom: .5rem; }

/* .button-copy. The negative right margin and the 40px block margins are
   Webflow's, reproduced because they are what renders on cl-thankyou.html;
   the max-width is what keeps the bar inside the column (and the page inside
   the viewport on mobile). */
.cl-thank-you__cta.is-wide { margin: 40px -106px 40px 0; max-width: 100%; }

.cl-thank-you__button-wrap { display: inline-block; }

/* --- book-a-call block ---------------------------------------------------- */

.cl-thank-you-call { background-color: #cff7fe00; margin-top: 0; }
.cl-thank-you-call__head { margin-bottom: 0; }
.cl-thank-you-call .cl-thank-you-call__heading { line-height: 1.1; padding-bottom: 10px; }
.cl-thank-you-call__embed { margin-top: 2rem; }
.cl-thank-you-call__embed-box { width: 100%; }
/* the HubSpot meetings iframe (~760px, grows per step) sizes the box; when the
   script never runs (blocker, no consent), the box collapses instead of
   leaving an empty 600px hole */
.cl-thank-you-call__embed-box:has(iframe) { min-height: 600px; }

@media screen and (max-width: 991px) {
  .cl-thank-you-call .cl-thank-you-call__heading { padding-bottom: 0; }
}

@media screen and (max-width: 767px) {
  .cl-thank-you .heading-medium, .cl-thank-you-call .cl-thank-you-call__heading { line-height: 1.4; }
}

@media screen and (max-width: 479px) {
  .cl-thank-you .heading-medium { line-height: 1.2; }
}


/* cl-ticker.css */
/* ==========================================================================
   Ticker tape. Port of section_ticker-tape (partner/formslim.html) and its
   numbered twin section_ticker-tape-2 (promotions/sauna-sale-detox.html).

   From the export:
     .section_ticker-tape                 bg var(--lucid), color var(--black), overflow hidden
     .section_ticker-tape.background-color-cocoa
                                          color var(--white); .background-color-cocoa bg var(--cocoa)
     .section_ticker-tape-2               bg #3e3037 (cocoa), overflow hidden
     .ticker-tape_container               max-width 100rem, margin auto
     .padding-vertical.padding-xsmall     1rem / 0; 767: .75rem  (cl-base scale)
     .ticker-tape_grid                    flex (the .w-layout-grid display:grid is overridden),
                                          column-gap 3.5rem, justify-content space-around,
                                          align-items stretch, min-width 100%, flex none,
                                          overflow hidden
     .ticker-tape_symbol                  flex none, display flex
     .ticker-tape_content                 1rem / 400, uppercase, grid-column-gap 1rem (inert),
                                          no margin: the items touch, as on the live partner page
     .ticker-tape_content-2               1.2rem / 400, uppercase, color #e8d7ca (lucid),
                                          margin-right 3.5rem, display flex; 479: .9rem
     #w-node-…                            grid-area span 1, inert in a flex row

   Deviations, deliberate:
     - justify-content is flex-start, not space-around. With two copies wider
       than the viewport both resolve to the same start alignment (the export's
       measured geometry); with short content space-around would spread the
       copies apart and break the loop.
     - The marquee itself was a Webflow IX2 interaction; here it is a CSS
       keyframe on each copy, translating by its own width plus the 3.5rem gap
       so the second copy lands where the first began. Paused under
       prefers-reduced-motion and while hovered or focused.
   ========================================================================== */

.cl-ticker {
  background-color: var(--cl-lucid);
  color: var(--cl-black);
  overflow: hidden;
}
.cl-ticker.is-cocoa       { background-color: var(--cl-cocoa); color: var(--cl-white); }
/* the -2 twin leaves the section cocoa on cocoa and colours the items */
.cl-ticker.is-cocoa-lucid { background-color: var(--cl-cocoa); color: var(--cl-cocoa); }
.cl-ticker.is-cocoa-lucid .cl-ticker__item { color: var(--cl-lucid); }

.cl-ticker__container { max-width: 100rem; margin-left: auto; margin-right: auto; }

.cl-ticker__grid {
  column-gap: 3.5rem;
  row-gap: 3.5rem;
  flex: none;
  justify-content: flex-start;
  align-items: stretch;
  min-width: 100%;
  display: flex;
  overflow: hidden;
}

.cl-ticker__symbol {
  flex: none;
  display: flex;
  animation: cl-ticker var(--cl-ticker-duration, 15s) linear infinite;
}

.cl-ticker__item {
  column-gap: 1rem;
  text-transform: uppercase;
  align-items: stretch;
  font-size: 1rem;
  font-weight: 400;
}

/* .ticker-tape_content-2: the promotion tape's larger, spaced items */
.cl-ticker.is-spaced .cl-ticker__item {
  margin-right: 3.5rem;
  font-size: .85rem;
  letter-spacing: .14em;
  display: flex;
}

@keyframes cl-ticker {
  to { transform: translateX(calc(-100% - 3.5rem)); }
}

.cl-ticker:hover .cl-ticker__symbol,
.cl-ticker:focus-within .cl-ticker__symbol { animation-play-state: paused; }

@media (prefers-reduced-motion: reduce) {
  .cl-ticker__symbol { animation: none; }
}

@media screen and (max-width: 479px) {
  .cl-ticker.is-spaced .cl-ticker__item { font-size: .75rem; }
}


/* cl-topbar.css */
/* ==========================================================================
   Clearlight utility bar + the two drawers it opens.

   Nothing here comes from the Webflow export — the export had no top bar. The
   shape is ported from the neverover build instead:

     app/components/layout/Topbar.tsx
       34px strip on grey, container row inset 14, iconed links left at
       10/14 with 6px gap and 10/9 padding, 1x16 dividers at black 15%,
       locale control on the right = 20x15 r2 flag + currency code.
       Desktop only; mobile carries the region control in the menu drawer.
     app/components/drawers/RegionDrawer.tsx
       right-hand panel, 66h header (globe 20 + title + close 18), 56h r4
       fields with a chevron, each field's picker opening as a dropdown
       under it (never a nested view), 52h rows, selected row #F8F8F8 +
       semibold + check, search input on top of the list, delivery/duties
       summary card, commit button at the bottom.

   Translated into this theme's units and tokens: 34px -> 2.125rem, 10/14 ->
   .75rem, the greys become --cl-light-grey / --cl-lucidity, the accent is
   --cl-cocoa, and the type is the .nav-text letter-spacing (.25px) so the
   strip reads as part of the nav rather than a bolt-on.

   Alignment: the strip repeats the bar row's page-padding > container-large
   chain, so its first rule sits on the logo's vertical and its last on the CTA
   cluster's right edge at every width, with no measured gutter involved. Every
   item sits between two rules (one before each item, one closing the group).
   cl-topbar.css is emitted after cl-nav.css (the snippet renders inside the
   section body), so equal-specificity rules here win.

   .cl-nav.is-stuck .cl-topbar lives in this file, not cl-nav.css: the bar
   owns its own collapsed state. The height is a token so the transition has
   two real endpoints to interpolate between, and the top corners inherit the
   card's radius so the strip cannot square off the corner it is sitting in
   while it collapses.

   Flags are CSS gradients on a 20x15 rounded box — no image requests, and no
   dependence on an emoji font that Windows Chrome does not ship. Countries
   outside the drawn set fall back to .cl-flag--code, the same box with the
   ISO code in it, which is what neverover's Flag does with its emoji tail.

   Drawer motion: one 320ms cubic-bezier(.32,.72,0,1) slide, the same curve
   in and out, the backdrop fading on the same clock. The script flushes
   layout between showModal() and .is-open so the slide has a start value,
   and waits for the panel's transitionend before dialog.close() so the
   backdrop is gone before the top layer drops it. The page is locked with
   html.cl-lock (cl-base.css), which cl-nav's mobile menu shares.
   ========================================================================== */

/* One hairline value for the strip and both drawers. Declared on each root
   because the drawers are siblings of the strip, not descendants of it. */
.cl-topbar,
.cl-region-chip,
.cl-drawer { --cl-topbar-rule: var(--cl-ink-15); }

.cl-topbar {
  --cl-topbar-h: 2.125rem;

  width: 100%;
  height: var(--cl-topbar-h);
  border-top-left-radius: inherit;
  border-top-right-radius: inherit;
  background-color: var(--cl-light-grey);
  /* The hairline is an inset shadow rather than a border so it costs no
     layout height: with a 1px border the collapsed state below floors at 1px
     instead of 0 and leaves a grey line across the condensed bar. */
  box-shadow: inset 0 -1px 0 var(--cl-topbar-rule);
  color: var(--cl-black);
  font-size: .75rem;
  font-weight: 400;
  letter-spacing: .25px;
  overflow: hidden;
  transition: height .28s cubic-bezier(.4, 0, .2, 1), visibility 0s linear 0s;
}

/* The condensed floating bar. Height collapses to nothing and the strip is
   taken out of the tab order only once it has finished collapsing, hence the
   delayed visibility step. */
.cl-nav.is-stuck .cl-topbar {
  height: 0;
  visibility: hidden;
  transition: height .28s cubic-bezier(.4, 0, .2, 1), visibility 0s linear .28s;
}

.cl-topbar .page-padding,
.cl-topbar .container-large { height: 100%; }

.cl-topbar__inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  column-gap: 1rem;
  width: 100%;
  height: 100%;
}

.cl-topbar__group { display: flex; align-items: center; min-width: 0; height: 100%; }
.cl-topbar__group.is-left { overflow: hidden; }

.cl-topbar__divider {
  flex: none;
  width: 1px;
  height: 1rem;
  background-color: var(--cl-topbar-rule);
}

.cl-topbar__link {
  appearance: none;
  background: none;
  border: 0;
  display: flex;
  align-items: center;
  column-gap: .375rem;
  padding: .5rem .75rem;
  font: inherit;
  color: inherit;
  text-decoration: none;
  white-space: nowrap;
  cursor: pointer;
  transition: opacity .15s ease;
}
.cl-topbar__link:hover { opacity: .6; text-decoration: none; }
.cl-topbar__link:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: -2px; }

.cl-topbar__icon { flex: none; width: .75rem; height: .75rem; }
.cl-topbar__icon svg { width: 100%; height: 100%; display: block; }

.cl-topbar__label { overflow: hidden; text-overflow: ellipsis; }

/* The same control below 991, where the strip is gone: an inline pill the nav
   drops into its mobile drawer with
   {% render 'cl-topbar', settings: section.settings, place: 'drawer' %}.
   Deliberately layout-neutral — inline-flex, no width, no margin — so it works
   as a row above the drawer's links or as a column in its footer without this
   file reaching into cl-nav.css to decide. */
.cl-region-chip {
  appearance: none;
  display: inline-flex;
  align-items: center;
  column-gap: .5rem;
  min-width: 0;
  padding: .5rem .875rem;
  background: none;
  border: 1px solid var(--cl-topbar-rule);
  border-radius: 100px;
  font: inherit;
  font-size: .75rem;
  font-weight: 500;
  letter-spacing: .5px;
  color: inherit;
  cursor: pointer;
  transition: border-color .15s ease;
}
.cl-region-chip:hover { border-color: var(--cl-ink-35); }
.cl-region-chip:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: 2px; }
.cl-region-chip__code { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* --------------------------------------------------------------------------
   Flag box, 20x15 r2 (neverover Flag, Figma 234:298)
   -------------------------------------------------------------------------- */

.cl-flag {
  flex: none;
  display: block;
  width: 1.25rem;
  height: .9375rem;
  border-radius: 2px;
  overflow: hidden;
  background-repeat: no-repeat;
  box-shadow: inset 0 0 0 1px var(--cl-ink-10);
}

.cl-flag--code {
  display: flex;
  align-items: center;
  justify-content: center;
  background-color: var(--cl-ink-8);
  color: var(--cl-ink-65);
  font-size: .5rem;
  font-weight: 500;
  letter-spacing: 0;
}

/* three horizontal bands */
.cl-flag--de { background-image: linear-gradient(180deg, #000 0 33.34%, #dd0000 0 66.67%, #ffce00 0); }
.cl-flag--at { background-image: linear-gradient(180deg, #ed2939 0 33.34%, #fff 0 66.67%, #ed2939 0); }
.cl-flag--nl { background-image: linear-gradient(180deg, #ae1c28 0 33.34%, #fff 0 66.67%, #21468b 0); }
.cl-flag--lu { background-image: linear-gradient(180deg, #ed2939 0 33.34%, #fff 0 66.67%, #00a1de 0); }
.cl-flag--hu { background-image: linear-gradient(180deg, #ce2939 0 33.34%, #fff 0 66.67%, #477050 0); }
.cl-flag--bg { background-image: linear-gradient(180deg, #fff 0 33.34%, #00966e 0 66.67%, #d62612 0); }
.cl-flag--lt { background-image: linear-gradient(180deg, #fdb913 0 33.34%, #006a44 0 66.67%, #c1272d 0); }
.cl-flag--ee { background-image: linear-gradient(180deg, #0072ce 0 33.34%, #000 0 66.67%, #fff 0); }
.cl-flag--si { background-image: linear-gradient(180deg, #fff 0 33.34%, #0000a0 0 66.67%, #de2e12 0); }
.cl-flag--sk { background-image: linear-gradient(180deg, #fff 0 33.34%, #0b4ea2 0 66.67%, #ee1c25 0); }
.cl-flag--hr { background-image: linear-gradient(180deg, #ff0000 0 33.34%, #fff 0 66.67%, #171796 0); }
/* Spain's bands are 1:2:1, not thirds */
.cl-flag--es { background-image: linear-gradient(180deg, #aa151b 0 25%, #f1bf00 0 75%, #aa151b 0); }

/* two horizontal bands */
.cl-flag--pl { background-image: linear-gradient(180deg, #fff 0 50%, #dc143c 0); }
.cl-flag--ua { background-image: linear-gradient(180deg, #0057b7 0 50%, #ffd700 0); }

/* three vertical bands */
.cl-flag--fr { background-image: linear-gradient(90deg, #002395 0 33.34%, #fff 0 66.67%, #ed2939 0); }
.cl-flag--it { background-image: linear-gradient(90deg, #008c45 0 33.34%, #f4f5f0 0 66.67%, #cd212a 0); }
.cl-flag--be { background-image: linear-gradient(90deg, #000 0 33.34%, #fae042 0 66.67%, #ed2939 0); }
.cl-flag--ie { background-image: linear-gradient(90deg, #169b62 0 33.34%, #fff 0 66.67%, #ff883e 0); }
.cl-flag--ro { background-image: linear-gradient(90deg, #002b7f 0 33.34%, #fcd116 0 66.67%, #ce1126 0); }
/* Portugal's split is 2:3 */
.cl-flag--pt { background-image: linear-gradient(90deg, #060 0 40%, #f00 0); }

/* Nordic crosses: full-width bar plus an upright offset left of centre */
.cl-flag--dk,
.cl-flag--se,
.cl-flag--fi {
  background-image: linear-gradient(#fff 0 0), linear-gradient(#fff 0 0);
  background-size: 100% 22%, 16% 100%;
  background-position: 0 50%, 35% 0;
}
.cl-flag--dk { background-color: #c8102e; }
.cl-flag--se { background-color: #006aa7; background-image: linear-gradient(#fecc00 0 0), linear-gradient(#fecc00 0 0); }
.cl-flag--fi { background-color: #fff; background-image: linear-gradient(#003580 0 0), linear-gradient(#003580 0 0); }
/* Norway is a blue cross inside the white one, so the blue layers are listed
   first: in background-image the first layer paints on top. */
.cl-flag--no {
  background-color: #ef2b2d;
  background-image:
    linear-gradient(#00205b 0 0), linear-gradient(#00205b 0 0),
    linear-gradient(#fff 0 0), linear-gradient(#fff 0 0);
  background-size: 100% 20%, 15% 100%, 100% 38%, 28% 100%;
  background-position: 0 50%, 36.5% 0, 0 50%, 34% 0;
}

/* Switzerland: upright cross on red, arms 6/32 by 20/32 of the square */
.cl-flag--ch {
  background-color: #d52b1e;
  background-image: linear-gradient(#fff 0 0), linear-gradient(#fff 0 0);
  background-size: 50% 20%, 15% 66%;
  background-position: center, center;
}

/* Czechia: white over red with a blue wedge, the wedge drawn as two
   quarter-box triangles meeting at the centre of the flag */
.cl-flag--cz {
  background-color: #fff;
  background-image:
    linear-gradient(to top right, #11457e 50%, transparent 0),
    linear-gradient(to bottom right, #11457e 50%, transparent 0),
    linear-gradient(180deg, #fff 0 50%, #d7141a 0);
  background-size: 50% 50%, 50% 50%, 100% 100%;
  background-position: 0 0, 0 100%, 0 0;
}

/* United Kingdom: red cross over white cross over red saltire over white
   saltire on blue, in that paint order — the first background-image layer is
   the topmost, so listing the white first (the intuitive reading order) hides
   every red band under it. An approximation at 20x15: the saltires are
   symmetric rather than counterchanged. */
.cl-flag--gb {
  background-color: #012169;
  background-image:
    linear-gradient(#c8102e 0 0), linear-gradient(#c8102e 0 0),
    linear-gradient(#fff 0 0), linear-gradient(#fff 0 0),
    linear-gradient(to bottom right, transparent 46%, #c8102e 46%, #c8102e 54%, transparent 54%),
    linear-gradient(to bottom left, transparent 46%, #c8102e 46%, #c8102e 54%, transparent 54%),
    linear-gradient(to bottom right, transparent 40%, #fff 40%, #fff 60%, transparent 60%),
    linear-gradient(to bottom left, transparent 40%, #fff 40%, #fff 60%, transparent 60%);
  background-size:
    100% 20%, 12% 100%, 100% 34%, 20% 100%,
    100% 100%, 100% 100%, 100% 100%, 100% 100%;
  background-position: 0 50%, 50% 0, 0 50%, 50% 0, 0 0, 0 0, 0 0, 0 0;
}

/* United States: thirteen bands with the canton over the top seven */
.cl-flag--us {
  background-color: #fff;
  background-image:
    linear-gradient(#0a3161 0 0),
    repeating-linear-gradient(180deg, #b31942 0 7.69%, #fff 0 15.38%);
  background-size: 40% 53.8%, 100% 100%;
  background-position: 0 0, 0 0;
}

/* --------------------------------------------------------------------------
   Drawer shell. Shared by the region drawer and the contact drawer so the two
   read as one system; only the body differs.

   The <dialog> is the full viewport and stays transparent — the panel is the
   child that slides. That keeps the "click outside to close" test to
   `e.target === dialog`, which cannot false-positive on the panel's own
   padding, and gives ::backdrop the dim on its own timeline.

   overflow: clip rather than hidden: the panel parked at translateX(100%)
   extends the dialog's scrollable overflow to the right, and a hidden box is
   still scrollable by script, so the focus showModal() moves into the panel
   could scroll the dialog sideways and the slide then started from the wrong
   place. A clipped box cannot scroll at all. hidden stays as the fallback.
   -------------------------------------------------------------------------- */

.cl-drawer {
  --cl-drawer-slide: 320ms cubic-bezier(.32, .72, 0, 1);
  /* The panel floats: --cl-drawer-inset of air above, below and to its right,
     so it reads as a card over the page rather than a sheet glued to the
     viewport edge. The slide has to clear that inset too, hence the calc. */
  --cl-drawer-inset: 1rem;

  position: fixed;
  inset: 0;
  z-index: 1002;
  width: 100%;
  height: 100%;
  max-width: none;
  max-height: none;
  margin: 0;
  padding: var(--cl-drawer-inset) var(--cl-drawer-inset) var(--cl-drawer-inset) 0;
  border: 0;
  background: transparent;
  color: var(--cl-cocoa);
  overflow: hidden;
  overflow: clip;
}
.cl-drawer:not([open]) { display: none; }
.cl-drawer[open] { display: flex; justify-content: flex-end; }
.cl-drawer::backdrop { background-color: var(--cl-ink-60); opacity: 0; transition: opacity 320ms cubic-bezier(.32, .72, 0, 1); }
.cl-drawer.is-open::backdrop { opacity: 1; }

/* Closed is the base state, open is the class: removing .is-open is the whole
   close motion, so there is no separate closing class to keep in step. */
.cl-drawer__panel {
  display: flex;
  flex-direction: column;
  width: min(34rem, 100%);
  height: 100%;
  border-radius: .75rem;
  background-color: var(--cl-white);
  box-shadow: 0 24px 64px var(--cl-ink-25);
  overflow: hidden;
  transform: translateX(calc(100% + var(--cl-drawer-inset)));
  transition: transform var(--cl-drawer-slide);
}
.cl-drawer.is-open .cl-drawer__panel { transform: translateX(0); }
/* while a finger drags the sheet the panel follows it without easing */
.cl-drawer__panel.is-dragging { transition: none; }

/* the grip a phone sheet is dragged down by; hidden on the side drawer */
.cl-drawer__grip {
  display: none;
  flex: none;
  width: 2.5rem;
  height: .25rem;
  margin: .625rem auto 0;
  border-radius: 100px;
  background-color: var(--cl-ink-20);
}

.cl-drawer__head {
  flex: none;
  display: flex;
  align-items: center;
  column-gap: .625rem;
  min-height: 4.125rem;
  padding: 0 1.5rem;
  border-bottom: 1px solid var(--cl-topbar-rule);
}
.cl-drawer__head-icon { flex: none; width: 1.25rem; height: 1.25rem; }
.cl-drawer__head-icon svg { width: 100%; height: 100%; display: block; }

.cl-drawer__title {
  flex: 1;
  min-width: 0;
  font-family: var(--cl-font-heading);
  font-size: 1.25rem;
  font-weight: 400;
}

.cl-drawer__close {
  appearance: none;
  background: none;
  border: 0;
  flex: none;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 2.25rem;
  height: 2.25rem;
  margin-right: -.625rem;
  padding: 0;
  color: inherit;
  cursor: pointer;
  transition: opacity .15s ease;
}
.cl-drawer__close:hover { opacity: .6; }
.cl-drawer__close:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: -2px; }
.cl-drawer__close svg { width: 1.125rem; height: 1.125rem; display: block; }

.cl-drawer__body {
  flex: 1;
  min-height: 0;
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  padding: 1.5rem;
}

/* The same thin cocoa scrollbar the document gets in cl-base.css, on the two
   boxes in the drawers that scroll. */
.cl-drawer__body,
.cl-region__options {
  scrollbar-width: thin;
  scrollbar-color: var(--cl-ink-40) transparent;
}
.cl-drawer__body::-webkit-scrollbar,
.cl-region__options::-webkit-scrollbar { width: 8px; }
.cl-drawer__body::-webkit-scrollbar-thumb,
.cl-region__options::-webkit-scrollbar-thumb { background: var(--cl-ink-40); border-radius: 8px; }

.cl-drawer__lead { font-size: .8125rem; opacity: .65; }

.cl-drawer__foot {
  flex: none;
  padding: 1rem 1.5rem 1.5rem;
  border-top: 1px solid var(--cl-topbar-rule);
}
.cl-drawer__foot .button { width: 100%; min-width: 0; }
.cl-drawer__fine { margin-top: .75rem; font-size: .75rem; opacity: .55; text-align: center; }

/* --------------------------------------------------------------------------
   Region drawer
   -------------------------------------------------------------------------- */

/* The form owns the scrolling body and the pinned foot, so it has to be the
   flex child that fills the panel. display: contents would do it in one line
   and drop the <form> out of the accessibility tree in the browsers that
   still mishandle it. */
.cl-region__form {
  display: flex;
  flex-direction: column;
  flex: 1;
  min-height: 0;
}

.cl-region__field { position: relative; margin-top: 1.25rem; }

.cl-region__label {
  display: block;
  margin-bottom: .5rem;
  font-size: .625rem;
  font-weight: 500;
  letter-spacing: .5px;
  text-transform: uppercase;
  opacity: .55;
}

.cl-region__select {
  appearance: none;
  display: flex;
  align-items: center;
  justify-content: space-between;
  column-gap: .625rem;
  width: 100%;
  min-height: 3.5rem;
  padding: .625rem 1rem;
  background-color: var(--cl-white);
  border: 1px solid var(--cl-topbar-rule);
  border-radius: 4px;
  font: inherit;
  font-size: .9375rem;
  color: inherit;
  text-align: left;
  cursor: pointer;
  transition: border-color .15s ease;
}
.cl-region__select:hover { border-color: var(--cl-ink-35); }
.cl-region__select:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: -2px; }
.cl-region__select.is-open { border-color: var(--cl-ink-35); }

.cl-region__value { display: flex; align-items: center; column-gap: .625rem; min-width: 0; }
/* A wrapper the script can refill with the picked country's flag box in one
   assignment, rather than rewriting a class list it would then have to keep
   in step with the drawn-flag set. */
.cl-region__value-flag { flex: none; display: flex; }
.cl-region__value-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* The geolocation suggestion under the country field. Filled by the script,
   hidden until a hit differs from the served market; the button selects it. */
.cl-region__geo {
  display: flex;
  align-items: center;
  column-gap: .625rem;
  margin-top: .75rem;
  padding: .625rem .75rem .625rem .875rem;
  border-radius: 4px;
  background-color: var(--cl-lucidity);
  font-size: .8125rem;
}
.cl-region__geo[hidden] { display: none; }
.cl-region__geo > svg { flex: none; width: 1rem; height: 1rem; opacity: .7; }
.cl-region__geo-text { flex: 1; min-width: 0; }
.cl-region__geo-text strong { font-weight: 500; }
.cl-region__geo-btn {
  appearance: none;
  flex: none;
  padding: .375rem .75rem;
  border: 1px solid var(--cl-cocoa);
  border-radius: 100px;
  background: none;
  font: inherit;
  font-size: .75rem;
  font-weight: 500;
  letter-spacing: .5px;
  text-transform: uppercase;
  color: inherit;
  cursor: pointer;
  transition: background-color .15s ease, color .15s ease;
}
.cl-region__geo-btn:hover { background-color: var(--cl-cocoa); color: var(--cl-white); }
.cl-region__geo-btn:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: 2px; }

.cl-region__chevron { flex: none; width: 1rem; height: 1rem; transition: transform .15s ease; }
.cl-region__chevron svg { width: 100%; height: 100%; display: block; }
.cl-region__select.is-open .cl-region__chevron { transform: rotate(180deg); }

/* The picker is a popover under its own field, never a second drawer view
   (neverover ListDropdown). */
.cl-region__list {
  position: absolute;
  top: 100%;
  right: 0;
  left: 0;
  z-index: 2;
  display: flex;
  flex-direction: column;
  max-height: 21.25rem;
  margin-top: .25rem;
  background-color: var(--cl-white);
  border: 1px solid var(--cl-topbar-rule);
  border-radius: 4px;
  box-shadow: 0 8px 24px var(--cl-ink-13);
  overflow: hidden;
}
.cl-region__list[hidden] { display: none; }

.cl-region__search { flex: none; padding: .5rem .5rem .25rem; }
.cl-region__search-box {
  display: flex;
  align-items: center;
  column-gap: .625rem;
  height: 2.5rem;
  padding: 0 .75rem;
  border-radius: 2px;
  background-color: var(--cl-light-grey);
}
.cl-region__search-box svg { flex: none; width: 1rem; height: 1rem; opacity: .55; }
.cl-region__search-input {
  flex: 1;
  min-width: 0;
  height: 100%;
  padding: 0;
  border: 0;
  background: none;
  font: inherit;
  font-size: .875rem;
  color: inherit;
}
.cl-region__search-input:focus { outline: none; }
.cl-region__search-input::-webkit-search-cancel-button { display: none; }

.cl-region__options { flex: 1; min-height: 0; margin: 0; padding: 0; overflow-y: auto; list-style: none; }
.cl-region__options li { margin: 0; }
.cl-region__options li[hidden] { display: none; }

.cl-region__option {
  appearance: none;
  display: flex;
  align-items: center;
  justify-content: space-between;
  column-gap: .75rem;
  width: 100%;
  min-height: 3.25rem;
  padding: .5rem 1rem;
  background-color: var(--cl-white);
  border: 0;
  font: inherit;
  font-size: .9375rem;
  color: inherit;
  text-align: left;
  cursor: pointer;
  transition: background-color .15s ease;
}
.cl-region__option:hover { background-color: var(--cl-lucidity); }
.cl-region__option:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: -2px; }
.cl-region__option.is-selected { background-color: var(--cl-light-grey); font-weight: 500; }

.cl-region__option-main { display: flex; align-items: center; column-gap: .75rem; min-width: 0; }
.cl-region__option-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cl-region__option-meta { flex: none; font-size: .8125rem; opacity: .5; white-space: nowrap; }
.cl-region__option.is-selected .cl-region__option-meta { display: none; }

.cl-region__check { flex: none; width: 1.125rem; height: 1.125rem; display: none; }
.cl-region__check svg { width: 100%; height: 100%; display: block; }
.cl-region__option.is-selected .cl-region__check { display: block; }

.cl-region__empty { padding: 1rem; font-size: .8125rem; opacity: .55; }
.cl-region__empty[hidden] { display: none; }

.cl-region__notes {
  display: grid;
  row-gap: .625rem;
  margin-top: 1.5rem;
  padding: .875rem;
  border-radius: 4px;
  background-color: var(--cl-light-grey);
}
.cl-region__note { display: flex; align-items: flex-start; column-gap: .625rem; font-size: .8125rem; opacity: .8; }
.cl-region__note svg { flex: none; width: 1rem; height: 1rem; margin-top: .125rem; opacity: .7; }

.cl-region__reprice { margin-top: 1rem; font-size: .75rem; opacity: .55; }
.cl-region__reprice[hidden] { display: none; }

/* --------------------------------------------------------------------------
   Contact drawer
   -------------------------------------------------------------------------- */

.cl-contact__rows { display: grid; row-gap: .5rem; margin-top: 1.25rem; }

.cl-contact__row {
  display: flex;
  align-items: center;
  column-gap: .875rem;
  padding: .875rem 1rem;
  border: 1px solid var(--cl-topbar-rule);
  border-radius: 4px;
  color: inherit;
  text-decoration: none;
  transition: border-color .15s ease, background-color .15s ease;
}
.cl-contact__row:hover { border-color: var(--cl-ink-35); background-color: var(--cl-lucidity); text-decoration: none; }
.cl-contact__row:focus-visible { outline: 2px solid var(--cl-cocoa); outline-offset: -2px; }

.cl-contact__icon {
  flex: none;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 2.25rem;
  height: 2.25rem;
  border-radius: 100px;
  background-color: var(--cl-light-grey);
}
.cl-contact__icon svg { width: 1.125rem; height: 1.125rem; display: block; }

.cl-contact__text { display: grid; row-gap: .125rem; min-width: 0; }
.cl-contact__label { font-size: .9375rem; font-weight: 500; overflow: hidden; text-overflow: ellipsis; }
.cl-contact__sub { font-size: .75rem; opacity: .6; overflow: hidden; text-overflow: ellipsis; }

.cl-contact__arrow { flex: none; margin-left: auto; width: .5rem; height: .875rem; opacity: .4; }
.cl-contact__arrow svg { width: 100%; height: 100%; display: block; }

/* ==========================================================================
   991 and below: the strip is gone. The region control and the contact button
   are rendered again inside the nav's mobile drawer — the delegated listeners
   in cl-topbar.liquid bind on the trigger classes, not on one element, so a
   second copy of either trigger works wherever the nav puts it.
   ========================================================================== */

@media screen and (max-width: 991px) {
  .cl-topbar { display: none; }
}

@media screen and (max-width: 767px) {
  .cl-drawer__head { min-height: 3.75rem; padding: 0 1.25rem; }
  .cl-drawer__body { padding: 1.25rem; }
  .cl-drawer__foot { padding: 1rem 1.25rem 1.25rem; }
}

/* Below 768 the drawer is a bottom sheet (the neverover pattern): it rises
   from the foot of the screen, rounded at the top, capped short of the top
   edge, and the grip drags it back down. */
@media screen and (max-width: 767px) {
  .cl-drawer { --cl-drawer-inset: 0rem; padding: 0; }
  .cl-drawer[open] { flex-direction: column; justify-content: flex-end; }
  .cl-drawer__panel {
    width: 100%;
    height: auto;
    max-height: min(88%, 100% - 3rem);
    border-radius: 1.25rem 1.25rem 0 0;
    transform: translateY(100%);
  }
  .cl-drawer.is-open .cl-drawer__panel { transform: translateY(0); }
  .cl-drawer__grip { display: block; }
  .cl-drawer__head { min-height: 3.25rem; }
  .cl-drawer__foot { padding-bottom: max(1.25rem, env(safe-area-inset-bottom)); }
}
@media screen and (max-width: 479px) {
  .cl-region__list { max-height: 17rem; }
  .cl-region__option-meta { display: none; }
}

@media (prefers-reduced-motion: reduce) {
  .cl-topbar,
  .cl-drawer::backdrop,
  .cl-drawer__panel,
  .cl-region__chevron,
  .cl-region__option,
  .cl-region__geo-btn,
  .cl-contact__row { transition: none; }
}

/* --- search drawer (snippets/cl-search-drawer.liquid) --------------------- */
.cl-search .cl-drawer__body, .cl-search__default, .cl-search__results { display: flex; flex-direction: column; row-gap: 2.25rem; }
.cl-search__form { margin: 0; }
.cl-search__field { position: relative; display: block; }
.cl-search__field-icon { position: absolute; left: 1rem; top: 50%; transform: translateY(-50%); width: 1.125rem; height: 1.125rem; color: var(--cl-ink-60); pointer-events: none; }
.cl-search__field-icon svg { width: 100%; height: 100%; display: block; }
.cl-search__input {
  width: 100%;
  min-height: 3.25rem;
  padding: .75rem 3rem .75rem 2.875rem;
  border: 1px solid var(--cl-ink-15);
  border-radius: .75rem;
  background-color: var(--cl-white);
  font: inherit;
  font-size: 1rem;
  color: inherit;
  appearance: none;
  -webkit-appearance: none;
}
.cl-search__input::-webkit-search-decoration,
.cl-search__input::-webkit-search-cancel-button { -webkit-appearance: none; display: none; }
.cl-search__input:focus { outline: none; border-color: var(--cl-cocoa); box-shadow: 0 0 0 3px #251f2022; }
.cl-search__clear { position: absolute; right: .75rem; top: 50%; transform: translateY(-50%); appearance: none; background: none; border: 0; font-size: 1.5rem; line-height: 1; color: var(--cl-ink-60); cursor: pointer; padding: .25rem; }
.cl-search__clear[hidden] { display: none; }
.cl-search__group { display: flex; flex-direction: column; row-gap: 1rem; }
.cl-search__group[hidden] { display: none; }
.cl-search__kicker { font-size: .75rem; letter-spacing: 1px; text-transform: uppercase; font-weight: 500; color: var(--cl-ink-65); }
.cl-search__pills { display: flex; flex-wrap: wrap; gap: .5rem; }
.cl-search__pill {
  appearance: none;
  border: 1px solid var(--cl-ink-12);
  background-color: var(--cl-white);
  border-radius: .375rem;
  padding: .5625rem .875rem;
  font: inherit;
  font-size: .875rem;
  color: inherit;
  cursor: pointer;
  transition: background-color .15s ease, border-color .15s ease;
}
.cl-search__pill:hover { background-color: var(--cl-lucidity); border-color: var(--cl-ink-20); }
.cl-search__cards { display: grid; grid-template-columns: repeat(2, 1fr); gap: .875rem; }
.cl-search__card { display: flex; flex-direction: column; row-gap: .25rem; color: inherit; text-decoration: none; min-width: 0; }
.cl-search__card-image { display: block; aspect-ratio: 1 / 1; border-radius: .625rem; overflow: hidden; background-color: var(--cl-pumice); margin-bottom: .25rem; }
.cl-search__card-image img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform .4s ease; }
.cl-search__card:hover .cl-search__card-image img { transform: scale(1.03); }
.cl-search__card-title { font-size: .9375rem; line-height: 1.3; }
.cl-search__card-price { font-size: .8125rem; color: var(--cl-ink-65); }
.cl-search__results[hidden], .cl-search__default[hidden] { display: none; }
.cl-search__list { display: flex; flex-direction: column; }
.cl-search__row { display: flex; align-items: center; column-gap: .875rem; padding: .625rem 0; border-top: 1px solid var(--cl-ink-10); color: inherit; text-decoration: none; }
.cl-search__row:first-child { border-top: 0; padding-top: 0; }
.cl-search__row:hover .cl-search__row-title { text-decoration: underline; text-underline-offset: .15em; }
.cl-search__row-image { flex: none; width: 3.25rem; height: 3.25rem; border-radius: .5rem; overflow: hidden; background-color: var(--cl-pumice); }
.cl-search__row-image.is-article { background-color: var(--cl-lucidity); }
.cl-search__row-image img { width: 100%; height: 100%; object-fit: cover; display: block; }
.cl-search__row-text { display: flex; flex-direction: column; row-gap: .125rem; min-width: 0; }
.cl-search__row-title { font-size: .9375rem; line-height: 1.3; }
.cl-search__row-sub { font-size: .8125rem; color: var(--cl-ink-65); }
.cl-search__empty { margin: 0; }
.cl-search__empty[hidden] { display: none; }
.cl-search__all { align-self: flex-start; }
.cl-search__all[hidden] { display: none; }

/* --- cart drawer ----------------------------------------------------------
   Round eighteen (2026-08-27): the rules for snippets/cl-cart-drawer lived
   here (.cl-cart, .cl-cart__*). The header no longer renders that drawer on
   any page, so they went with it; the snippet carries no stylesheet of its own
   and would need one back should a section ever render it again. */

/* Sauna-Finder badge in the utility strip (round eleven). */
.cl .cl-topbar__badge {
  flex: none; margin-left: .125rem; padding: .05rem .375rem;
  border-radius: 100px; background: var(--cl-ink-10); color: var(--cl-cocoa);
  font-size: .5625rem; font-weight: 500; line-height: 1.4;
  text-transform: uppercase; letter-spacing: .06em;
}

/* ---------------------------------------------------------------------------
   Locale suggestion bar (snippets/cl-locale-bar.liquid)

   Bottom right, above nothing and blocking nothing. It is deliberately not a
   drawer: neverover's LocaleSuggestion is a card that comments on the page
   rather than interrupting it, and the drawer is still where a visitor goes to
   change region on purpose.

   Sits at the same stack level as the drawers minus one, so a drawer opened
   while the bar is up covers it rather than fighting it.
   --------------------------------------------------------------------------- */

.cl-locale-bar {
  position: fixed;
  right: 1rem;
  bottom: 1rem;
  z-index: 60;
  width: min(22rem, calc(100vw - 2rem));
  border-radius: 1.25rem;
  border: 1px solid rgb(255 255 255 / 18%);
  background-color: #251f20d1;
  -webkit-backdrop-filter: blur(14px);
  backdrop-filter: blur(14px);
  box-shadow: 0 12px 32px var(--cl-ink-22);
  color: var(--cl-white);
  opacity: 0;
  transform: translateY(0.75rem);
  transition: opacity 260ms ease, transform 260ms cubic-bezier(.32, .72, 0, 1);
}

.cl-locale-bar.is-in { opacity: 1; transform: translateY(0); }
.cl-locale-bar[hidden] { display: none; }

/* Round seventeen: a card, not a strip. The flag sits above the text, the
   close is pinned to the top right corner, the button is its own row under
   the copy. Bigger all round: 22rem wide, 1.5rem of padding, 17px title. */
.cl-locale-bar__form {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 0.875rem;
  margin: 0;
  padding: 1.5rem;
}

/* The flag reuses the drawn set from the drawer's rows, so there is one
   artwork source and a country outside it degrades the same way in both. */
.cl-locale-bar__flag {
  flex: 0 0 auto;
  width: 2.5rem;
  height: 1.8125rem;
  border-radius: 0.25rem;
  box-shadow: inset 0 0 0 1px rgb(255 255 255 / 25%);
}

.cl-locale-bar__body {
  display: grid;
  row-gap: 0.25rem;
  min-width: 0;
  width: 100%;
}

.cl-locale-bar__title {
  font-size: 1.0625rem;
  line-height: 1.35;
  color: var(--cl-white);
}

.cl-locale-bar__sub {
  font-size: 0.875rem;
  line-height: 1.45;
  color: rgb(255 255 255 / 62%);
}

.cl-locale-bar__actions {
  display: flex;
  align-items: center;
  width: 100%;
  margin-top: 0.125rem;
}

.cl-locale-bar__go {
  border: 0;
  border-radius: 999px;
  padding: 0.625rem 1.375rem;
  background-color: var(--cl-white);
  color: var(--cl-black);
  font-size: 0.875rem;
  letter-spacing: 0.25px;
  cursor: pointer;
  transition: background-color 160ms ease;
}
.cl-locale-bar__go:hover { background-color: rgb(255 255 255 / 86%); }
.cl-locale-bar__go:focus-visible { outline: 2px solid var(--cl-white); outline-offset: 2px; }

.cl-locale-bar__close {
  position: absolute;
  top: 0.875rem;
  right: 0.875rem;
  display: grid;
  place-items: center;
  width: 2rem;
  height: 2rem;
  border: 0;
  border-radius: 999px;
  background-color: transparent;
  color: rgb(255 255 255 / 62%);
  cursor: pointer;
  transition: color 160ms ease, background-color 160ms ease;
}
.cl-locale-bar__close svg { width: 0.9375rem; height: 0.9375rem; }
.cl-locale-bar__close:hover { color: var(--cl-white); background-color: rgb(255 255 255 / 12%); }
.cl-locale-bar__close:focus-visible { outline: 2px solid var(--cl-white); outline-offset: 1px; }

/* On a phone it spans the width. */
@media (max-width: 479px) {
  .cl-locale-bar { right: 0.75rem; left: 0.75rem; bottom: 0.75rem; width: auto; }
  .cl-locale-bar__form { padding: 1.25rem; }
}

@media (prefers-reduced-motion: reduce) {
  .cl-locale-bar { transition: opacity 120ms ease; transform: none; }
}

/* The row the geolocation lookup detected, labelled in the list.

   The lookup used to be silent unless it disagreed with the served market, so a
   visitor opening the picker had no way to tell a detected preselection from an
   arbitrary one. The badge is the whole answer: this row is where we think you
   are, and we think it rather than know it.

   It survives a manual override on purpose. Someone who has switched market
   still benefits from seeing what was detected, and hiding it after a pick is
   how the control stops explaining itself. */
.cl-region__option.is-auto .cl-region__option-name::after {
  content: "Automatisch erkannt";
  display: inline-block;
  margin-left: 0.5rem;
  padding: 0.0625rem 0.375rem;
  border-radius: 999px;
  background-color: var(--cl-lucidity);
  color: var(--cl-ink-65);
  font-size: 0.625rem;
  letter-spacing: 0.25px;
  text-transform: uppercase;
  vertical-align: 0.0625rem;
  white-space: nowrap;
}

/* Inside the search results the badge would push long country names into a
   second line, so below the drawer's narrow point it shortens to a mark. */
@media (max-width: 479px) {
  .cl-region__option.is-auto .cl-region__option-name::after { content: "Auto"; }
}


/* cl-trust.css */
/* ==========================================================================
   Trust widget (snippets/cl-trust.liquid): four small overlapping avatars,
   the reviews band's plain golden stars (same glyph, same colour), one
   line. Hover on an avatar: it lifts and scales, a pill above names the
   person, the neighbours slide a few pixels apart.
   ========================================================================== */

.cl-trust {
  display: inline-flex;
  align-items: center;
  column-gap: .75rem;
  row-gap: .5rem;
  flex-wrap: wrap;
  color: inherit;
  text-decoration: none;
  font-size: .9375rem;
}
a.cl-trust:hover .cl-trust__text { text-decoration: underline; text-underline-offset: .15em; }
.cl-trust__avatars { display: inline-flex; padding-top: .25rem; }
.cl-trust__avatar {
  position: relative;
  width: 1.625rem;
  height: 1.625rem;
  border-radius: 100px;
  border: 2px solid var(--cl-white);
  background-color: var(--cl-lucid);
  color: var(--cl-cocoa);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-size: .5rem;
  font-weight: 500;
  letter-spacing: .02em;
  transition: transform .25s cubic-bezier(.2, 0, 0, 1), margin .25s cubic-bezier(.2, 0, 0, 1);
  cursor: default;
  outline: none;
}
.cl-trust__avatar + .cl-trust__avatar { margin-left: -.7rem; }
.cl-trust__avatar img { width: 100%; height: 100%; object-fit: cover; border-radius: 100px; display: block; }
.cl-trust__avatar:nth-child(2) { background-color: var(--cl-lucid); }
.cl-trust__avatar:nth-child(3) { background-color: var(--cl-pumice); }
.cl-trust__avatar:nth-child(4) { background-color: var(--cl-nimbus); }
/* the morph: the hovered one grows and rises, the ones after it slide right */
.cl-trust__avatar:hover,
.cl-trust__avatar:focus-visible { transform: translateY(-2px) scale(1.18); z-index: 2; }
.cl-trust__avatar:hover + .cl-trust__avatar,
.cl-trust__avatar:focus-visible + .cl-trust__avatar { margin-left: -.4rem; }
.cl-trust__name {
  position: absolute;
  left: 50%;
  bottom: calc(100% + .4rem);
  transform: translate(-50%, .25rem);
  padding: .3rem .55rem;
  border-radius: 100px;
  background-color: var(--cl-black);
  color: var(--cl-white);
  font-size: .6875rem;
  font-weight: 400;
  letter-spacing: 0;
  white-space: nowrap;
  opacity: 0;
  pointer-events: none;
  transition: opacity .2s ease, transform .25s cubic-bezier(.2, 0, 0, 1);
}
.cl-trust__avatar:hover .cl-trust__name,
.cl-trust__avatar:focus-visible .cl-trust__name { opacity: 1; transform: translate(-50%, 0); }
.cl-trust__stars { display: inline-flex; align-items: center; column-gap: .25rem; }
.cl-trust__star { width: 1.125rem; height: 1.125rem; color: var(--cl-golden); display: inline-flex; }
.cl-trust__star.is-off { color: var(--cl-ink-12); }
.cl-trust__star svg { width: 100%; height: 100%; fill: currentColor; display: block; }
.cl-trust__text { white-space: nowrap; }
.cl-trust__google { display: inline-flex; width: 1rem; height: 1rem; opacity: .45; }
.cl-trust__google svg { width: 100%; height: 100%; fill: currentColor; display: block; }
.cl-trust.is-large { font-size: 1.125rem; column-gap: 1rem; }
.cl-trust.is-large .cl-trust__avatar { width: 2.25rem; height: 2.25rem; font-size: .6875rem; }
.cl-trust.is-large .cl-trust__star { width: 1.25rem; height: 1.25rem; }
@media screen and (max-width: 479px) {
  .cl-trust { font-size: .875rem; }
  .cl-trust__text { white-space: normal; }
  .cl-trust.is-large { font-size: 1rem; justify-content: center; }
}
@media (prefers-reduced-motion: reduce) {
  .cl-trust__avatar, .cl-trust__name { transition: none; }
}
