/* ==========================================================================
   HairBi — design layer
   Loaded after the generated Astro stylesheets. Component rules are scoped
   under `.hb` (set on <body>) so they match the generated
   `[data-astro-cid-*]` specificity and win on source order.
   ========================================================================== */

/* --------------------------------------------------------------------------
   1. Tokens
   -------------------------------------------------------------------------- */

:root {
  /* Warm ground — the brand's existing terracotta identity, deepened. */
  --color-bg: #FAF6F0;
  --color-surface: #FFFFFF;
  --color-text: #241A15;
  --color-text-muted: #6B5A4E;
  --color-primary: #8C3A2B;
  --color-primary-deep: #6E2B1F;
  --color-secondary: #EDE3D6;
  --color-accent: #4E5D42;
  --color-border: #E3D7C7;

  /* Cool axis — silver is the subject, not the absence of colour.
     `--silver` is for rules and large type only (3.5:1); `--silver-ink`
     is the smallest safe size (5.6:1 on --color-bg). */
  --silver: #7E858C;
  --silver-ink: #5C646C;
  --silver-mist: #C9CDD2;
  --silver-wash: #EFF1F3;

  /* Tints used for washes and hairlines. */
  --wash-clay: color-mix(in srgb, var(--color-primary) 7%, transparent);
  --wash-silver: color-mix(in srgb, var(--silver) 12%, transparent);
  --rule: color-mix(in srgb, var(--color-text) 12%, transparent);
  --rule-soft: color-mix(in srgb, var(--color-text) 7%, transparent);

  /* Type ------------------------------------------------------------------
     The generated scale topped out at 37px for an h1. Replaced with a
     fluid scale so display type actually reads as display type. */
  --font-heading: "Fraunces", Georgia, "Times New Roman", serif;
  --font-body: "Inter", system-ui, -apple-system, "Segoe UI", sans-serif;

  --font-size-base: clamp(1.0625rem, 1rem + 0.25vw, 1.15rem);
  --font-body-min-size: var(--font-size-base);
  --font-size-sm: clamp(0.875rem, 0.85rem + 0.1vw, 0.9375rem);
  --font-size-xs: 0.8125rem;
  --font-size-lg: clamp(1.15rem, 1.05rem + 0.4vw, 1.375rem);
  --font-size-xl: clamp(1.375rem, 1.15rem + 1vw, 1.875rem);
  --font-size-2xl: clamp(1.9rem, 1.35rem + 2.2vw, 2.9rem);
  --font-size-3xl: clamp(2.4rem, 1.5rem + 3.7vw, 4.25rem);

  --tracking-display: -0.021em;
  --tracking-tight: -0.011em;
  --tracking-eyebrow: 0.14em;
  --leading-display: 1.04;
  --leading-title: 1.14;
  --leading-body: 1.62;

  /* Fraunces carries an optical-size axis, which the browser drives
     automatically from font-size — that is the axis worth paying for. The
     SOFT and WONK axes were dropped: carrying them cost 329KB of extra font
     data for a difference barely visible at these sizes. */
  --optical: auto;

  /* Space — fluid, so the 6rem gaps stop bloating small screens. */
  --space-3xs: 0.25rem;
  --space-2xs: 0.375rem;
  --space-xs: 0.5rem;
  --space-sm: 1rem;
  --space-md: 1.5rem;
  --space-lg: clamp(1.75rem, 1.4rem + 1.4vw, 2.5rem);
  --space-xl: clamp(2.5rem, 2rem + 2.2vw, 4rem);
  --space-2xl: clamp(3.5rem, 2.6rem + 3.8vw, 6rem);
  --space-3xl: clamp(5rem, 3.5rem + 6vw, 9rem);

  /* Shape */
  --border-radius: 10px;
  --border-radius-lg: 20px;
  --border-radius-xl: 28px;
  --radius-pill: 999px;

  /* Shadows — warm-tinted, never neutral grey on a cream ground. */
  --shadow-sm: 0 1px 2px rgba(36, 26, 21, 0.04);
  --shadow-md: 0 1px 2px rgba(36, 26, 21, 0.04), 0 10px 28px -14px rgba(36, 26, 21, 0.16);
  --shadow-lg: 0 2px 4px rgba(36, 26, 21, 0.04), 0 24px 56px -24px rgba(36, 26, 21, 0.22);
  --shadow-style: var(--shadow-md);

  /* Motion */
  --anim-duration: 0.28s;
  --anim-easing: cubic-bezier(0.22, 0.61, 0.36, 1);
  --anim-hover-lift: -2px;
  --anim-hover-scale: 1;

  --container-max-width: 1220px;
  --container-narrow: 760px;
  --header-height: 76px;
}

/* --------------------------------------------------------------------------
   2. Reset
   The generated stylesheet ships no box-sizing or margin reset, so every
   padded box (buttons, inputs, containers) rendered wider and taller than
   its declared size.
   -------------------------------------------------------------------------- */

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

/* No margin reset here on purpose: the generated stylesheet was authored
   against the UA's default heading and paragraph margins, and zeroing them
   collapsed spacing on every page that relied on them. Margins are set
   explicitly per component below instead. */

/* Whitespace text nodes around the generated <ul>s were creating stray line
   boxes; making the wrappers flex containers drops them. */
.hb.hb .nav__links {
  display: flex;
  flex-direction: column;
  justify-content: center;
}

/* --------------------------------------------------------------------------
   3. Base typography
   -------------------------------------------------------------------------- */

.hb.hb {
  font-size: var(--font-size-base);
  line-height: var(--leading-body);
  font-feature-settings: "kern" 1, "liga" 1, "calt" 1;
  text-rendering: optimizeLegibility;
}

.hb.hb h1,
.hb.hb h2,
.hb.hb h3,
.hb.hb h4,
.hb.hb h5,
.hb.hb h6 {
  letter-spacing: var(--tracking-tight);
  line-height: var(--leading-title);
  font-weight: 600;
  text-wrap: balance;
}

.hb.hb h1 {
  font-size: var(--font-size-3xl);
  line-height: var(--leading-display);
  letter-spacing: var(--tracking-display);
}

.hb.hb h2 {
  font-size: var(--font-size-2xl);
  line-height: 1.08;
  letter-spacing: var(--tracking-display);
}

.hb.hb h3 { font-size: var(--font-size-xl); }
.hb.hb h4 { font-size: var(--font-size-lg); }

.hb.hb p { text-wrap: pretty; }

/* Numerals in stats and prices should line up. */
.hb.hb .proof__stat-value,
.hb.hb .pricing__price,
.hb.hb .how__step-number {
  font-variant-numeric: lining-nums tabular-nums;
}

/* --------------------------------------------------------------------------
   4. Primitives
   -------------------------------------------------------------------------- */

.hb.hb .container {
  max-width: var(--container-max-width);
  padding-inline: clamp(1.25rem, 4vw, 2.5rem);
}

.hb.hb .btn {
  border-radius: var(--radius-pill);
  padding: 0.8em 1.6em;
  font-size: 1rem;
  font-weight: 600;
  letter-spacing: -0.005em;
  min-height: 48px;
  transition:
    transform var(--anim-duration) var(--anim-easing),
    background-color var(--anim-duration) var(--anim-easing),
    border-color var(--anim-duration) var(--anim-easing),
    box-shadow var(--anim-duration) var(--anim-easing);
}

.hb.hb .btn-primary {
  box-shadow: 0 1px 2px rgba(36, 26, 21, 0.12);
}

.hb.hb .btn-primary:hover,
.hb.hb .btn-primary:focus-visible {
  background-color: var(--color-primary-deep);
  border-color: var(--color-primary-deep);
  box-shadow: 0 6px 18px -8px rgba(110, 43, 31, 0.6);
}

.hb.hb .btn-secondary {
  border-color: var(--rule);
  color: var(--color-primary);
  background-color: color-mix(in srgb, var(--color-surface) 70%, transparent);
}

.hb.hb .btn-secondary:hover,
.hb.hb .btn-secondary:focus-visible {
  background-color: var(--color-primary);
  border-color: var(--color-primary);
  color: var(--color-on-primary);
}

.hb.hb .card {
  border-radius: var(--border-radius-lg);
  border-color: var(--rule-soft);
  box-shadow: var(--shadow-sm);
  padding: clamp(1.25rem, 2.5vw, 1.75rem);
  transition:
    transform var(--anim-duration) var(--anim-easing),
    border-color var(--anim-duration) var(--anim-easing),
    box-shadow var(--anim-duration) var(--anim-easing);
}

.hb.hb .card:hover {
  transform: translateY(-3px);
  border-color: var(--color-border);
  box-shadow: var(--shadow-md);
}

.hb.hb img,
.hb.hb picture,
.hb.hb video {
  border-radius: var(--border-radius-lg);
}

.hb.hb :focus-visible {
  outline: 3px solid var(--color-primary);
  outline-offset: 3px;
  border-radius: 4px;
}

.hb.hb .skip-link {
  border-radius: var(--radius-pill);
}

@media (prefers-reduced-motion: reduce) {
  .hb.hb .btn:hover,
  .hb.hb .card:hover {
    transform: none;
  }
}

/* --------------------------------------------------------------------------
   5. Header
   The generated markup ships two separate <nav> lists flanking a centred
   logo, with the CTA absolutely positioned. Re-ordered with flexbox into a
   conventional logo-left / links-right bar — no markup change needed.
   -------------------------------------------------------------------------- */

.hb.hb .nav {
  background-color: color-mix(in srgb, var(--color-bg) 82%, transparent);
  backdrop-filter: saturate(150%) blur(12px);
  -webkit-backdrop-filter: saturate(150%) blur(12px);
  border-bottom: 1px solid transparent;
  transition: border-color var(--anim-duration) var(--anim-easing);
}

.hb.hb .nav__container {
  display: flex;
  align-items: center;
  justify-content: flex-start;
  gap: clamp(1rem, 2.4vw, 2rem);
  min-height: var(--header-height);
  position: relative;
}

.hb.hb .nav__logo {
  order: 0;
  margin-right: auto;
  font-size: 1.6rem;
  font-weight: 700;
  letter-spacing: -0.025em;
  line-height: 1;
}

.hb.hb .nav__links--left { order: 1; }
.hb.hb .nav__links--right { order: 2; }
.hb.hb .nav__cta { order: 3; }

.hb.hb .nav__links ul {
  gap: clamp(1rem, 2.4vw, 2rem);
  align-items: center;
}

.hb.hb .nav__links a {
  position: relative;
  display: inline-block;
  padding-block: 0.4rem;
  font-size: 0.975rem;
  font-weight: 500;
  color: var(--color-text);
  white-space: nowrap;
}

/* Current page gets a rule, not just a colour shift. */
.hb.hb .nav__links a::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  height: 1.5px;
  background-color: currentColor;
  transform: scaleX(0);
  transform-origin: left;
  transition: transform var(--anim-duration) var(--anim-easing);
}

.hb.hb .nav__links a:hover::after,
.hb.hb .nav__links a:focus-visible::after,
.hb.hb .nav__links a[aria-current="page"]::after {
  transform: scaleX(1);
}

.hb.hb .nav__cta {
  position: static;
  transform: none;
  padding: 0.6em 1.35em;
  min-height: 44px;
  font-size: 0.95rem;
  flex-shrink: 0;
}

.hb.hb .nav__toggle {
  position: static;
  order: -1;
  transform: none;
  border-radius: var(--border-radius);
}

.hb.hb .nav__toggle-bar {
  width: 22px;
  height: 1.5px;
  border-radius: 2px;
}

@media (max-width: 980px) {
  .hb.hb .nav__links,
  .hb.hb .nav__cta {
    display: none;
  }
  .hb.hb .nav__toggle { display: flex; }
  .hb.hb .nav__container { justify-content: flex-start; }
  .hb.hb .nav__logo { margin-right: 0; }
}

@media (max-width: 980px) {
  .hb.hb .nav__panel {
    display: block;
    max-height: 0;
    overflow: hidden;
    background-color: var(--color-bg);
    border-top: 1px solid var(--rule-soft);
    transition: max-height var(--anim-duration) var(--anim-easing);
  }
  .hb.hb .nav__panel[data-open="true"] { max-height: 560px; }
  .hb.hb .nav__panel ul {
    padding: var(--space-sm) clamp(1.25rem, 4vw, 2.5rem) var(--space-md);
    gap: 0;
  }
  .hb.hb .nav__panel li + li { border-top: 1px solid var(--rule-soft); }
  .hb.hb .nav__panel a {
    padding-block: 0.85rem;
    font-size: 1.05rem;
  }
  .hb.hb .nav__panel li:last-child { border-top: 0; padding-top: var(--space-sm); }
  .hb.hb .nav__panel-cta { width: 100%; }
}

/* The generated anchors contain literal whitespace ("<a> Cennik </a>"), which
   rendered as visible space and broke the nav rhythm. Flex containers drop
   leading/trailing whitespace text nodes. */
.hb.hb .nav__links a,
.hb.hb .nav__panel a:not(.btn),
.hb.hb .footer a:not(.btn) {
  display: inline-flex;
  align-items: center;
}

/* --------------------------------------------------------------------------
   6. Hero
   -------------------------------------------------------------------------- */

.hb.hb .hero {
  padding-block: clamp(3rem, 2rem + 5vw, 6rem) clamp(3.5rem, 2.5rem + 5vw, 6.5rem);
}

.hb.hb .hero__grid {
  grid-template-columns: minmax(0, 1.08fr) minmax(0, 0.92fr);
  gap: clamp(2.5rem, 5vw, 5rem);
  align-items: center;
}

/* Eyebrow: a short silver rule sets the label apart from the headline
   without another colour or weight. */
.hb.hb .hero__eyebrow,
.hb.hb .feature__kicker {
  display: flex;
  align-items: center;
  gap: 0.75em;
  font-size: var(--font-size-xs);
  font-weight: 600;
  letter-spacing: var(--tracking-eyebrow);
  text-transform: uppercase;
  color: var(--silver-ink);
  margin-bottom: var(--space-md);
}

.hb.hb .hero__eyebrow::before,
.hb.hb .feature__kicker::before {
  content: "";
  width: clamp(24px, 3vw, 44px);
  height: 1.5px;
  flex-shrink: 0;
  background-image: linear-gradient(90deg, var(--color-primary), var(--silver));
}

.hb.hb .hero__heading {
  margin-bottom: var(--space-md);
  max-width: 15ch;
}

.hb.hb .hero__heading-accent {
  color: var(--color-primary);
  font-style: italic;
}

.hb.hb .hero__lead {
  font-size: var(--font-size-lg);
  line-height: 1.55;
  color: var(--color-text-muted);
  max-width: 44ch;
  margin-bottom: var(--space-lg);
}

.hb.hb .hero__reassure {
  margin-top: var(--space-md);
  font-size: var(--font-size-sm);
  color: var(--silver-ink);
}

/* The frame was padding around a picture with nothing in the margin. The
   image now fills it, and the frame survives only as an offset backdrop. */
.hb.hb .hero__media-frame {
  padding: 0;
  background-image: none;
  border-radius: var(--border-radius-xl);
  overflow: visible;
}

.hb.hb .hero__media-frame::before {
  border: 0;
  border-radius: var(--border-radius-xl);
  background-color: var(--color-secondary);
  transform: translate(clamp(10px, 1.4vw, 20px), clamp(10px, 1.4vw, 20px));
  z-index: 0;
}

.hb.hb .hero__media-frame > * {
  position: relative;
  z-index: 1;
}

.hb.hb .hero__media img {
  border-radius: var(--border-radius-xl);
  aspect-ratio: 4 / 5;
  object-fit: cover;
  object-position: 26% center;
  width: 100%;
  box-shadow: var(--shadow-lg);
}

@media (max-width: 900px) {
  .hb.hb .hero__grid { gap: var(--space-xl); }
  .hb.hb .hero__heading { max-width: none; }
  .hb.hb .hero__media { max-width: 420px; }
  .hb.hb .hero__media img { aspect-ratio: 5 / 4; }
}

/* Store badges: keep the platform-conventional dark slab, but match the
   button family's radius and height so the row reads as one control set. */
.hb.hb .store-badge {
  min-height: 52px;
  border-radius: var(--border-radius);
  background-color: var(--color-text);
  border-color: var(--color-text);
}

.hb.hb .store-badge:hover,
.hb.hb .store-badge:focus-visible {
  background-color: #120C09;
  border-color: #120C09;
  box-shadow: var(--shadow-md);
}

.hb.hb .store-badge__kicker {
  font-size: 0.6875rem;
  letter-spacing: 0.08em;
  opacity: 0.75;
}

.hb.hb .store-badges { gap: 0.75rem; }

/* --------------------------------------------------------------------------
   7. Section rhythm
   Section headers used to sit in a 60ch column with the right half of the
   page empty. Splitting title and lede across the full width fills it and
   sets a consistent editorial rhythm for every section intro.
   -------------------------------------------------------------------------- */

.hb.hb .section {
  padding-block: clamp(3.5rem, 2.5rem + 4.5vw, 6rem);
}

.hb.hb .features__intro {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: clamp(1.5rem, 4vw, 4rem);
  align-items: end;
  max-width: none;
  margin-bottom: var(--space-xl);
  padding-bottom: var(--space-md);
  border-bottom: 1px solid var(--rule-soft);
}

.hb.hb .features__intro h2 {
  margin-bottom: 0;
  max-width: 18ch;
}

.hb.hb .features__intro p {
  font-size: var(--font-size-lg);
  line-height: 1.5;
  color: var(--color-text-muted);
  max-width: 46ch;
}

@media (max-width: 820px) {
  .hb.hb .features__intro {
    grid-template-columns: 1fr;
    align-items: start;
  }
  .hb.hb .features__intro h2 { max-width: none; }
}

/* --------------------------------------------------------------------------
   8. Features
   Three parallel capabilities were stacked as alternating full-viewport
   rows — roughly 2,700px of scroll for nine lines of copy. They are
   siblings, not a sequence, so they belong side by side.
   -------------------------------------------------------------------------- */

.hb.hb .features__list {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: clamp(1.5rem, 3vw, 2.5rem);
}

.hb.hb .feature {
  display: flex;
  flex-direction: column;
  gap: var(--space-md);
  align-items: stretch;
}

.hb.hb .feature.feature--reverse .feature__media { order: 0; }

.hb.hb .feature__media img {
  aspect-ratio: 4 / 5;
  object-fit: cover;
  width: 100%;
  border: 1px solid var(--rule-soft);
  border-radius: var(--border-radius-lg);
}

.hb.hb .feature__kicker {
  margin-bottom: var(--space-xs);
}

.hb.hb .feature__content h3 {
  margin-bottom: var(--space-xs);
  text-wrap: balance;
}

.hb.hb .feature__body {
  color: var(--color-text-muted);
  font-size: var(--font-size-base);
  max-width: none;
}

.hb.hb .features__cta {
  margin-top: var(--space-xl);
  display: flex;
  justify-content: center;
}

@media (max-width: 900px) {
  .hb.hb .features__list { grid-template-columns: 1fr; gap: var(--space-xl); }
  .hb.hb .feature {
    display: grid;
    grid-template-columns: minmax(0, 0.85fr) minmax(0, 1.15fr);
    gap: var(--space-lg);
    align-items: center;
  }
  .hb.hb .feature__media img { aspect-ratio: 1 / 1; }
}

@media (max-width: 560px) {
  .hb.hb .feature { grid-template-columns: 1fr; }
}

/* --------------------------------------------------------------------------
   9. Empathy, community, how-it-works, proof
   -------------------------------------------------------------------------- */

.hb.hb .empathy__grid,
.hb.hb .community__grid,
.hb.hb .how__grid,
.hb.hb .proof__grid {
  gap: clamp(2rem, 5vw, 4.5rem);
}

.hb.hb .empathy__content p,
.hb.hb .community__lead,
.hb.hb .how__lead,
.hb.hb .proof__lead {
  color: var(--color-text-muted);
  max-width: 52ch;
}

.hb.hb .empathy__content h2,
.hb.hb .community__content h2,
.hb.hb .how__content h2,
.hb.hb .proof__content h2 {
  margin-bottom: var(--space-md);
}

.hb.hb .empathy__content p + p { margin-top: var(--space-sm); }

.hb.hb .empathy__media img,
.hb.hb .community__media img,
.hb.hb .proof__media img {
  aspect-ratio: 5 / 4;
  object-fit: cover;
}

.hb.hb .how__media img {
  aspect-ratio: 16 / 10;
  object-fit: cover;
}

/* --------------------------------------------------------------------------
   10. Overrides that must outrank the generated `.a[cid] .b[cid]` selectors
   -------------------------------------------------------------------------- */

.hb.hb.hb .nav__links a {
  display: inline-flex;
  align-items: center;
  font-size: 0.975rem;
  padding-block: 0.4rem;
  color: var(--color-text);
}

.hb.hb.hb .nav__links a:hover,
.hb.hb.hb .nav__links a[aria-current="page"] {
  color: var(--color-primary);
}

.hb.hb.hb .nav__links ul {
  gap: clamp(1rem, 2vw, 1.75rem);
  align-items: center;
}

.hb.hb.hb .features__intro h2 { margin-bottom: 0; }

.hb.hb.hb .features__intro p {
  font-size: var(--font-size-lg);
  line-height: 1.5;
}

.hb.hb.hb .feature__content h3 { margin-bottom: var(--space-xs); }

.hb.hb.hb .feature__media img {
  border: 1px solid var(--rule-soft);
  border-radius: var(--border-radius-lg);
}

.hb.hb.hb .hero__media img { border-radius: var(--border-radius-xl); }

.hb.hb.hb .empathy__content h2,
.hb.hb.hb .community__content h2,
.hb.hb.hb .how__content h2,
.hb.hb.hb .proof__content h2 { margin-bottom: var(--space-md); }

.hb.hb.hb .empathy__content p { max-width: 52ch; }
.hb.hb.hb .empathy__content p + p { margin-top: var(--space-sm); }

.hb.hb.hb .empathy__media img,
.hb.hb.hb .community__media img,
.hb.hb.hb .proof__media img {
  aspect-ratio: 5 / 4;
  object-fit: cover;
  border-radius: var(--border-radius-lg);
}

.hb.hb.hb .how__media img {
  aspect-ratio: 16 / 10;
  object-fit: cover;
}

.hb.hb.hb .footer a:not(.btn) {
  display: inline-flex;
  align-items: center;
}

/* --------------------------------------------------------------------------
   11. The strand
   "Jak to działa" is the one place on the site where the content really is
   a sequence, so it is the one place that earns numbered markers. A single
   line threads them, running clay to silver over its length — the same
   change the page is about. The eyebrow rules elsewhere are its quiet echo.
   -------------------------------------------------------------------------- */

.hb.hb .how__steps {
  position: relative;
  gap: var(--space-lg);
}

.hb.hb .how__steps::before {
  content: "";
  position: absolute;
  left: 23px;
  top: 24px;
  bottom: 24px;
  width: 2px;
  border-radius: 2px;
  background-image: linear-gradient(
    180deg,
    var(--color-primary) 0%,
    color-mix(in srgb, var(--color-primary) 45%, var(--silver)) 50%,
    var(--silver-mist) 100%
  );
}

.hb.hb .how__step {
  position: relative;
  gap: var(--space-md);
  align-items: flex-start;
}

.hb.hb .how__step-number {
  position: relative;
  z-index: 1;
  width: 48px;
  height: 48px;
  font-size: 1.15rem;
  font-weight: 600;
  box-shadow: 0 0 0 6px var(--color-bg);
}

/* Each step deepens toward silver as the sequence advances. */
.hb.hb .how__step:nth-child(2) .how__step-number {
  background-color: color-mix(in srgb, var(--color-primary) 78%, var(--silver-ink));
}

.hb.hb .how__step:nth-child(3) .how__step-number {
  background-color: color-mix(in srgb, var(--color-primary) 52%, var(--silver-ink));
}

.hb.hb.hb .how__step-text h3 {
  margin-bottom: var(--space-2xs);
  padding-top: 0.35rem;
}

.hb.hb.hb .how__step-text p {
  color: var(--color-text-muted);
  max-width: 46ch;
}

.hb.hb .how__lead { margin-bottom: var(--space-xl); }

/* Proof stats: one continuous rule instead of four detached stubs. */
.hb.hb .proof__stats {
  position: relative;
  gap: var(--space-md);
  padding-left: var(--space-md);
  border-left: 2px solid var(--rule);
}

.hb.hb .proof__stat {
  padding-left: 0;
  border-left: 0;
}

.hb.hb .proof__stat-value {
  font-size: var(--font-size-xl);
  line-height: 1.15;
  letter-spacing: var(--tracking-tight);
  color: var(--color-primary);
}

.hb.hb .proof__stat-label {
  color: var(--silver-ink);
  font-size: var(--font-size-sm);
}

/* `list-style: none` was set without clearing the UA's 40px list indent, so
   the strand was drawn inside the <ol>'s padding rather than through the
   step markers. Reset only on the lists this stylesheet lays out. */
.hb.hb .how__steps,
.hb.hb .pricing__features,
.hb.hb .nav__links ul,
.hb.hb .nav__panel ul,
.hb.hb .footer ul,
.hb.hb .store-badges {
  padding-inline-start: 0;
  margin-block: 0;
}

/* The steps column runs roughly twice the height of its illustration, which
   left a hole beside it. Top-align and let the image track the sequence. */
.hb.hb .how__grid {
  align-items: start;
  grid-template-columns: minmax(0, 0.85fr) minmax(0, 1.15fr);
}

.hb.hb .how__media {
  position: sticky;
  top: calc(var(--header-height) + var(--space-lg));
  order: -1;
}

@media (max-width: 900px) {
  .hb.hb .how__grid { grid-template-columns: 1fr; }
  .hb.hb .how__media { position: static; }
}

/* --------------------------------------------------------------------------
   12. Pricing
   Plan names wrap to one, two or three lines, so prices, descriptions and
   buttons all landed at different heights across the row. The badge is
   lifted out of flow and the name reserves two lines, which puts every
   card on the same baselines.
   -------------------------------------------------------------------------- */

.hb.hb .pricing__intro {
  max-width: 44rem;
  margin-inline: auto;
  margin-bottom: var(--space-xl);
  text-align: center;
}

.hb.hb .pricing__eyebrow {
  font-size: var(--font-size-xs);
  letter-spacing: var(--tracking-eyebrow);
  color: var(--silver-ink);
  margin-bottom: var(--space-sm);
}

.hb.hb .pricing__lead {
  margin-top: var(--space-md);
  gap: var(--space-sm);
  color: var(--color-text-muted);
  font-size: var(--font-size-lg);
  line-height: 1.5;
}

.hb.hb .pricing__disclaimer {
  margin-top: var(--space-lg);
  max-width: 52ch;
  margin-inline: auto;
  color: var(--silver-ink);
}

.hb.hb .pricing__accent { opacity: 0.28; }

.hb.hb .pricing__grid {
  gap: clamp(1rem, 2vw, 1.5rem);
  align-items: stretch;
}

.hb.hb .pricing__card {
  position: relative;
  padding: clamp(1.5rem, 3vw, 2rem);
  padding-top: clamp(2.25rem, 4vw, 2.75rem);
  border-radius: var(--border-radius-lg);
}

.hb.hb .pricing__card:hover { transform: none; }

.hb.hb .pricing__card--recommended {
  border-color: var(--color-primary);
  box-shadow: var(--shadow-md);
}

/* Out of flow, so the badge no longer pushes one card's content down.
   Scoped to the pricing page's cards — the home page's `.pricing__plan`
   uses the same badge class but a different card shell, and needs its own
   positioning context (see below). */
.hb.hb .pricing__card .pricing__badge {
  position: absolute;
  top: 0;
  left: clamp(1.5rem, 3vw, 2rem);
  transform: translateY(-50%);
  border-radius: var(--radius-pill);
  font-size: var(--font-size-xs);
  letter-spacing: 0.04em;
  padding: 0.4em 0.95em;
  box-shadow: 0 2px 8px -2px rgba(110, 43, 31, 0.45);
}

.hb.hb .pricing__name {
  font-size: var(--font-size-xl);
  min-height: calc(2 * var(--font-size-xl) * 1.14);
  margin-bottom: var(--space-sm);
  text-wrap: balance;
}

.hb.hb .pricing__price {
  align-items: baseline;
  gap: 0.4em;
  margin-bottom: var(--space-2xs);
}

.hb.hb .pricing__amount {
  font-size: clamp(2rem, 1.4rem + 2vw, 2.6rem);
  line-height: 1;
  letter-spacing: var(--tracking-display);
}

.hb.hb .pricing__period,
.hb.hb .pricing__billing {
  font-size: var(--font-size-sm);
}

.hb.hb .pricing__billing {
  color: var(--color-accent);
  min-height: 2.6em;
  margin-bottom: var(--space-sm);
}

.hb.hb .pricing__desc {
  color: var(--color-text-muted);
  margin-bottom: var(--space-md);
  padding-bottom: var(--space-md);
  border-bottom: 1px solid var(--rule-soft);
}

.hb.hb .pricing__features {
  gap: 0.7em;
  margin-bottom: var(--space-lg);
}

.hb.hb .pricing__check { color: var(--color-accent); }

/* "Co znajdziesz w każdym planie" — one continuous rule per column instead
   of a detached stub beside each item. */
.hb.hb .included__grid { gap: var(--space-lg) var(--space-2xl); }

.hb.hb .included__item {
  border-left: 2px solid var(--rule);
  padding-left: var(--space-md);
}

.hb.hb .included__title { margin-bottom: var(--space-2xs); }
.hb.hb .included__desc { color: var(--color-text-muted); }

/* --------------------------------------------------------------------------
   13. Section intros, site-wide
   The same two-column intro used on the home page, applied to every section
   header that previously sat in a narrow column with the right half empty.
   -------------------------------------------------------------------------- */

.hb.hb .testimonials-grid__intro,
.hb.hb .hair-journeys__intro,
.hb.hb .included__intro {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: clamp(1.5rem, 4vw, 4rem);
  align-items: end;
  max-width: none;
  margin-bottom: var(--space-xl);
  padding-bottom: var(--space-md);
  border-bottom: 1px solid var(--rule-soft);
}

.hb.hb .testimonials-grid__intro h2,
.hb.hb .hair-journeys__intro h2,
.hb.hb .included__intro h2 {
  max-width: 18ch;
}

.hb.hb .testimonials-grid__lede,
.hb.hb .hair-journeys__lede,
.hb.hb .included__lead {
  margin-top: 0;
  margin-bottom: 0;
  font-size: var(--font-size-lg);
  line-height: 1.5;
  max-width: 46ch;
}

@media (max-width: 820px) {
  .hb.hb .testimonials-grid__intro,
  .hb.hb .hair-journeys__intro,
  .hb.hb .included__intro {
    grid-template-columns: 1fr;
    align-items: start;
  }
  .hb.hb .testimonials-grid__intro h2,
  .hb.hb .hair-journeys__intro h2,
  .hb.hb .included__intro h2 { max-width: none; }
}

/* --------------------------------------------------------------------------
   14. Testimonials
   The quote takes the display face and the attribution the sans — the
   inverse of the site's usual pairing, so a woman's own words read as the
   voice on the page and the label stays a label.
   -------------------------------------------------------------------------- */

.hb.hb .testimonials-grid__list,
.hb.hb .hair-journeys__list {
  gap: clamp(1rem, 2vw, 1.5rem);
}

.hb.hb .testimonial-card { height: 100%; }

.hb.hb .testimonial-card__photo {
  margin-bottom: var(--space-md);
  border-radius: var(--border-radius);
}

.hb.hb.hb .testimonial-card__quote p {
  font-family: var(--font-heading);
  font-size: 1.0625rem;
  font-weight: 400;
  line-height: 1.55;
  letter-spacing: 0;
  color: var(--color-text);
}

.hb.hb .testimonial-card__meta {
  border-top: 1px solid var(--rule-soft);
  padding-top: var(--space-sm);
}

.hb.hb .testimonial-card__name {
  font-family: var(--font-body);
  font-size: var(--font-size-sm);
  font-weight: 600;
  letter-spacing: 0.02em;
  color: var(--color-text);
}

.hb.hb .testimonial-card__detail {
  color: var(--silver-ink);
  font-size: var(--font-size-xs);
  margin-top: 0.25em;
}

.hb.hb .journey-card__eyebrow {
  font-size: var(--font-size-xs);
  letter-spacing: var(--tracking-eyebrow);
  color: var(--silver-ink);
}

.hb.hb .journey-card__heading {
  font-size: var(--font-size-lg);
  margin-bottom: var(--space-sm);
}

.hb.hb .journey-card__story { color: var(--color-text-muted); }

.hb.hb .hair-journeys__image {
  max-width: none;
  aspect-ratio: 16 / 7;
  border-radius: var(--border-radius-lg);
}

.hb.hb .community__stat-value {
  font-size: var(--font-size-xl);
  letter-spacing: var(--tracking-tight);
  font-variant-numeric: lining-nums tabular-nums;
}

.hb.hb .community__stat-label {
  color: var(--silver-ink);
  font-size: var(--font-size-sm);
}

.hb.hb .feed-message {
  background-color: var(--color-bg);
  border-radius: var(--border-radius);
  padding: var(--space-md);
}

.hb.hb .feed-message__author {
  font-size: var(--font-size-xs);
  letter-spacing: 0.03em;
  color: var(--silver-ink);
  margin-bottom: 0.4em;
}

/* Cards without a photo share a row with cards that have one, which left the
   quote stranded at the top of a tall box. Centre it in the space instead. */
.hb.hb .testimonial-card:not(:has(.testimonial-card__photo)) .testimonial-card__quote {
  display: flex;
  align-items: center;
}

/* --------------------------------------------------------------------------
   15. FAQ
   Two pages ship a `.faq__intro` with different meanings — a wrapper on
   /cennik, a lede paragraph on /faq — so each is targeted by shape.
   -------------------------------------------------------------------------- */

.hb.hb .faq__inner { max-width: 54rem; }

.hb.hb .faq__intro:has(.faq__lead) {
  text-align: left;
  margin-bottom: var(--space-xl);
  padding-bottom: var(--space-md);
  border-bottom: 1px solid var(--rule-soft);
}

.hb.hb .faq__lead,
.hb.hb p.faq__intro {
  color: var(--color-text-muted);
  font-size: var(--font-size-lg);
  line-height: 1.5;
  max-width: 52ch;
}

.hb.hb p.faq__intro { margin-inline: auto; }

/* The list already opens with a rule; a second one under the header read as
   a double line. */
.hb.hb .faq__header { margin-bottom: var(--space-xl); }

.hb.hb .faq__heading { margin-bottom: var(--space-md); }

/* A stack of questions is an index, not a row of floating cards: one shared
   rule between rows, and the answers align with the questions. */
.hb.hb .faq__list { gap: 0; }

.hb.hb .faq__item {
  background-color: transparent;
  border: 0;
  border-top: 1px solid var(--rule-soft);
  border-radius: 0;
  padding: 0;
}

.hb.hb .faq__item:last-child { border-bottom: 1px solid var(--rule-soft); }
.hb.hb .faq__item[open] { border-color: var(--rule-soft); }

.hb.hb .faq__question {
  padding: var(--space-md) 0;
  font-size: var(--font-size-lg);
  line-height: 1.3;
  letter-spacing: var(--tracking-tight);
  transition: color var(--anim-duration) var(--anim-easing);
}

.hb.hb .faq__question:hover { color: var(--color-primary); }

.hb.hb .faq__answer {
  padding: 0 0 var(--space-lg);
  max-width: 62ch;
  color: var(--color-text-muted);
}

@media (max-width: 640px) {
  .hb.hb .faq__question { padding: var(--space-sm) 0; }
  .hb.hb .faq__answer { padding: 0 0 var(--space-md); }
}

/* --------------------------------------------------------------------------
   16. Forms
   -------------------------------------------------------------------------- */

.hb.hb .input,
.hb.hb input[type="text"],
.hb.hb input[type="email"],
.hb.hb input[type="tel"],
.hb.hb textarea,
.hb.hb select {
  min-height: 48px;
  padding: 0.7em 0.9em;
  border-radius: var(--border-radius);
  border-color: var(--color-border);
  background-color: var(--color-surface);
  font-size: 1rem;
  transition:
    border-color var(--anim-duration) var(--anim-easing),
    box-shadow var(--anim-duration) var(--anim-easing);
}

.hb.hb textarea { min-height: 8rem; resize: vertical; }

.hb.hb .input:focus,
.hb.hb input:focus,
.hb.hb textarea:focus,
.hb.hb select:focus {
  border-color: var(--color-primary);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-primary) 16%, transparent);
  outline: none;
}

.hb.hb .input:focus-visible,
.hb.hb input:focus-visible,
.hb.hb textarea:focus-visible,
.hb.hb select:focus-visible {
  outline: 2px solid var(--color-primary);
  outline-offset: 1px;
}

.hb.hb.hb .form-field label {
  font-size: var(--font-size-sm);
  font-weight: 600;
  color: var(--color-text);
  letter-spacing: 0.01em;
}

/* --------------------------------------------------------------------------
   17. Closing CTA
   -------------------------------------------------------------------------- */

.hb.hb .footer-cta {
  background-image: linear-gradient(
    165deg,
    var(--color-primary) 0%,
    var(--color-primary-deep) 100%
  );
  padding-block: clamp(3.5rem, 2.5rem + 4vw, 5.5rem);
}

.hb.hb .footer-cta__inner {
  max-width: 42rem;
  gap: var(--space-md);
}

.hb.hb.hb .footer-cta h2 {
  max-width: 20ch;
  margin-bottom: 0;
}

.hb.hb.hb .footer-cta p {
  font-size: var(--font-size-lg);
  line-height: 1.5;
  color: color-mix(in srgb, var(--color-on-primary) 88%, transparent);
  max-width: 46ch;
}

.hb.hb .footer-cta__badges { margin-top: var(--space-sm); }

/* Ink-on-terracotta measured 2.2:1, so the badges read as one dark smear on
   the band. Inverted to the paper tone they carry the CTA instead. */
.hb.hb .footer-cta .store-badge,
.hb.hb .cta-download .store-badge {
  background-color: var(--color-bg);
  border-color: var(--color-bg);
  color: var(--color-text);
}

.hb.hb .footer-cta .store-badge:hover,
.hb.hb .footer-cta .store-badge:focus-visible,
.hb.hb .cta-download .store-badge:hover,
.hb.hb .cta-download .store-badge:focus-visible {
  background-color: var(--color-surface);
  border-color: var(--color-surface);
  color: var(--color-text);
}

.hb.hb .cta__message,
.hb.hb .cta-download__lede,
.hb.hb .cta-contact__message {
  font-size: var(--font-size-lg);
  line-height: 1.5;
  color: var(--color-text-muted);
}

.hb.hb .cta__reassure { color: var(--silver-ink); }

/* --------------------------------------------------------------------------
   18. Footer
   -------------------------------------------------------------------------- */

/* The footer carries its own surface colour, so a cream gap above it after a
   full-bleed section just read as a hole. */
.hb.hb .footer {
  margin-top: 0;
  padding-block: var(--space-2xl) var(--space-lg);
}

.hb.hb .footer__grid {
  grid-template-columns: minmax(0, 1.6fr) repeat(3, minmax(0, 1fr));
  gap: var(--space-xl) var(--space-lg);
}

.hb.hb .footer__logo {
  font-size: 1.5rem;
  font-weight: 700;
  letter-spacing: -0.025em;
  margin-bottom: var(--space-sm);
}

.hb.hb .footer__tagline {
  color: var(--color-text-muted);
  max-width: 30ch;
}

/* Column headings are labels, so they take the same treatment as every
   other label on the site rather than a second heading style. */
.hb.hb .footer__heading {
  font-family: var(--font-body);
  font-size: var(--font-size-xs);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: var(--tracking-eyebrow);
  color: var(--silver-ink);
  margin-bottom: var(--space-md);
}

.hb.hb.hb .footer__nav ul,
.hb.hb.hb .footer__contact ul,
.hb.hb.hb .footer__legal-col ul {
  display: flex;
  flex-direction: column;
  gap: 0.65rem;
}

.hb.hb.hb .footer a:not(.btn) {
  color: var(--color-text-muted);
  transition: color var(--anim-duration) var(--anim-easing);
}

.hb.hb.hb .footer a:not(.btn):hover {
  color: var(--color-primary);
}

.hb.hb .footer__bottom {
  margin-top: var(--space-2xl);
  padding-top: var(--space-md);
  border-top: 1px solid color-mix(in srgb, var(--color-text) 12%, transparent);
  font-size: var(--font-size-sm);
  color: var(--color-text-muted);
}

/* --------------------------------------------------------------------------
   19. Mobile download bar
   -------------------------------------------------------------------------- */

.hb.hb .sticky-download {
  border-top: 1px solid var(--rule-soft);
  backdrop-filter: saturate(150%) blur(12px);
  -webkit-backdrop-filter: saturate(150%) blur(12px);
}

.hb.hb .sticky-download__btn { min-height: 52px; }

/* --------------------------------------------------------------------------
   20. Legal pages
   These templates reference tokens the stylesheet never defined
   (--color-background, --color-text-secondary, --space-3xl/4xl), so their
   colours fell back to inherit and their spacing to the hard-coded pixel
   defaults. Aliased here, then set for reading.
   -------------------------------------------------------------------------- */

:root {
  --color-background: var(--color-bg);
  --color-text-secondary: var(--color-text-muted);
  --space-4xl: var(--space-3xl);

  /* Tokens the blog variant consumes (docs/blog-schema.md, "Tokenization
     contract"). In a generated site the variant ships without its own
     :root fallback, so the host owns these. */
  --color-text-light: var(--silver-ink);
  --container-padding: clamp(1.25rem, 4vw, 2.5rem);
  --gap: var(--space-md);
  --radius: var(--border-radius-lg);
  --radius-small: var(--border-radius);
}

.hb.hb .legal-container { max-width: 46rem; }

.hb.hb .legal-title {
  font-size: var(--font-size-2xl);
  letter-spacing: var(--tracking-display);
}

.hb.hb .legal-effective {
  color: var(--silver-ink);
  font-size: var(--font-size-sm);
  margin-bottom: var(--space-2xl);
  padding-bottom: var(--space-md);
  border-bottom: 1px solid var(--rule-soft);
}

.hb.hb .legal-content { gap: var(--space-xl); }

.hb.hb.hb .legal-article h2 {
  font-family: var(--font-heading);
  font-size: var(--font-size-lg);
  font-weight: 600;
  letter-spacing: var(--tracking-tight);
  margin-bottom: var(--space-md);
}

.hb.hb.hb .legal-article ol,
.hb.hb.hb .legal-article ul {
  gap: var(--space-sm);
  padding-left: 1.4em;
}

.hb.hb.hb .legal-article li {
  color: var(--color-text-muted);
  line-height: 1.7;
}

.hb.hb.hb .legal-article li::marker { color: var(--silver-ink); }

/* Links took the moss accent here and terracotta everywhere else. */
.hb.hb.hb .legal-article a { color: var(--color-primary); }
.hb.hb.hb .legal-article a:hover { color: var(--color-primary-deep); }

/* --------------------------------------------------------------------------
   21. Responsive corrections
   The rules above outrank the generated `[data-astro-cid]` media queries, so
   every grid this stylesheet re-columns has to restate its own collapse.
   -------------------------------------------------------------------------- */

@media (max-width: 900px) {
  .hb.hb .hero__grid {
    grid-template-columns: 1fr;
    gap: var(--space-xl);
  }
  .hb.hb .hero__media {
    order: -1;
    max-width: 460px;
    margin-inline: auto;
  }
  .hb.hb .hero__heading { max-width: none; }

  .hb.hb .footer__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

@media (max-width: 640px) {
  .hb.hb .footer__grid { grid-template-columns: 1fr; }
  .hb.hb .footer__bottom {
    flex-direction: column;
    margin-top: var(--space-xl);
  }
}

/* The eyebrow rule is a nice-to-have; below the fold of a phone it costs a
   line of an already-wrapping label. */
@media (max-width: 480px) {
  .hb.hb .hero__eyebrow,
  .hb.hb .feature__kicker {
    display: block;
  }
  .hb.hb .hero__eyebrow::before,
  .hb.hb .feature__kicker::before {
    display: block;
    width: 32px;
    margin-bottom: 0.75em;
  }
}

/* The fixed download bar sits over the end of the page on phones. */
@media (max-width: 900px) {
  .hb.hb .footer { padding-bottom: calc(var(--space-2xl) + 4rem); }
}

/* --------------------------------------------------------------------------
   22. Motion
   The generated scroll reveal fired every element with the same 16px rise at
   the same moment. Softened, and given a small stagger inside a group so a
   row of cards arrives in reading order rather than all at once.
   -------------------------------------------------------------------------- */

.hb.hb [data-animate] {
  opacity: 0;
  transform: translateY(12px);
  transition:
    opacity 0.5s var(--anim-easing),
    transform 0.5s var(--anim-easing);
}

.hb.hb [data-animate].is-visible {
  opacity: 1;
  transform: none;
}

.hb.hb .features__list > [data-animate]:nth-child(2),
.hb.hb .pricing__grid > [data-animate]:nth-child(2),
.hb.hb .testimonials-grid__list > [data-animate]:nth-child(2) { transition-delay: 70ms; }

.hb.hb .features__list > [data-animate]:nth-child(3),
.hb.hb .pricing__grid > [data-animate]:nth-child(3),
.hb.hb .testimonials-grid__list > [data-animate]:nth-child(3) { transition-delay: 140ms; }

/* Reduced motion: reveal immediately and drop every transform. Restated here
   because the rules above are more specific than the generated reset. */
@media (prefers-reduced-motion: reduce) {
  .hb.hb [data-animate],
  .hb.hb [data-animate].is-visible {
    opacity: 1;
    transform: none;
    transition: none;
    transition-delay: 0s;
  }
  .hb.hb .nav__links a::after { transition: none; }
}

/* --------------------------------------------------------------------------
   23. Focus
   One visible ring everywhere, in the brand colour rather than the moss
   accent, and inset where an outset ring would be clipped.
   -------------------------------------------------------------------------- */

.hb.hb a:focus-visible,
.hb.hb button:focus-visible,
.hb.hb summary:focus-visible,
.hb.hb [tabindex]:focus-visible {
  outline: 3px solid var(--color-primary);
  outline-offset: 3px;
  border-radius: 6px;
}

.hb.hb .faq__question:focus-visible {
  outline-offset: -3px;
  border-radius: var(--border-radius);
}

.hb.hb .store-badge:focus-visible,
.hb.hb .btn:focus-visible {
  outline-offset: 3px;
  border-radius: var(--radius-pill);
}

.hb.hb .store-badge:focus-visible { border-radius: var(--border-radius); }

/* On the terracotta band an ink-coloured ring disappears. */
.hb.hb .footer-cta a:focus-visible,
.hb.hb .footer-cta button:focus-visible {
  outline-color: var(--color-bg);
}

/* --------------------------------------------------------------------------
   24. Home-page pricing teaser
   A different component from the pricing page's cards, sharing some class
   names. Two plans side by side, so the same baseline alignment applies.
   -------------------------------------------------------------------------- */

.hb.hb .pricing__grid { align-items: stretch; }

.hb.hb .pricing__plan {
  position: relative;
  gap: var(--space-xs);
  padding: clamp(1.5rem, 3vw, 2rem);
  padding-top: clamp(2.25rem, 4vw, 2.75rem);
}

.hb.hb .pricing__plan:hover { transform: none; }

.hb.hb .pricing__plan--featured {
  border-color: var(--color-primary);
  border-width: 2px;
  box-shadow: var(--shadow-md);
}

.hb.hb .pricing__plan .pricing__badge {
  position: absolute;
  top: 0;
  left: clamp(1.5rem, 3vw, 2rem);
  transform: translateY(-50%);
  border-radius: var(--radius-pill);
  font-size: var(--font-size-xs);
  letter-spacing: 0.04em;
  padding: 0.4em 0.95em;
  background-color: var(--color-primary);
  color: var(--color-on-primary);
  box-shadow: 0 2px 8px -2px rgba(110, 43, 31, 0.45);
}

.hb.hb.hb .pricing__plan h3 {
  font-size: var(--font-size-xl);
  margin-bottom: var(--space-2xs);
}

.hb.hb .pricing__plan .pricing__price {
  font-size: var(--font-size-lg);
  color: var(--color-primary);
  margin-bottom: 0;
}

.hb.hb .pricing__plan .pricing__detail {
  color: var(--color-text-muted);
  padding-bottom: var(--space-md);
  margin-bottom: var(--space-2xs);
  border-bottom: 1px solid var(--rule-soft);
}

.hb.hb .pricing__plan .pricing__features {
  gap: 0.7em;
  margin-top: var(--space-sm);
  margin-bottom: 0;
}

/* --------------------------------------------------------------------------
   25. Cookie consent overlay
   The generated rules have the two variants swapped:

     .cookie-consent[aria-hidden=false] .cookie-consent__overlay { display: block }
     .cookie-consent--center .cookie-consent__overlay { display: none !important }

   so the full-viewport dimming overlay is shown for the *bottom bar* and
   hidden for the *centred modal*. It is the modal that needs a scrim; a
   bottom bar is non-blocking by design.

   On this site (which uses `--bottom`) the effect was that the overlay
   covered the viewport at the banner's z-index and swallowed every click —
   `document.elementFromPoint()` at the centre of the page returned the
   overlay, so no link, button or form on the site was usable until the
   visitor accepted cookies. It also dimmed the page by 30% black.

   Restores the intended behaviour: scrim for the modal, none for the bar.
   -------------------------------------------------------------------------- */

.hb.hb.hb .cookie-consent:not(.cookie-consent--center) .cookie-consent__overlay {
  display: none;
  pointer-events: none;
}

.hb.hb.hb .cookie-consent--center[aria-hidden="false"] .cookie-consent__overlay {
  display: block;
  pointer-events: auto;
  z-index: -1;
}

/* Legal prose quotes full URLs (the ODR portal), which overflowed the
   viewport below ~340px. Break inside them only when there is no other
   opportunity. */
.hb.hb.hb .legal-article a,
.hb.hb .mag-prose a {
  overflow-wrap: anywhere;
}
