/* Self-hosted Fraunces and Inter — SIL Open Font License 1.1.
   Built from the upstream variable fonts (google/fonts) and cut down for
   this site:
     - subset to Latin-1 plus the Polish diacritics and the punctuation the
       copy actually uses;
     - the SOFT and WONK axes instanced out, keeping `opsz` (which the
       browser drives from font-size) and `wght`.
   170KB for all three faces, down from 1.2MB when the same faces were
   requested from fonts.googleapis.com as discrete static weights. Serving
   them from our own origin also removes a render-blocking round-trip to a
   third-party stylesheet and a second TLS connection. */

@font-face {
  font-family: 'Fraunces';
  font-style: normal;
  font-weight: 400 700;
  font-display: swap;
  src: url('/fonts/fraunces.woff2') format('woff2-variations');
}

@font-face {
  font-family: 'Fraunces';
  font-style: italic;
  /* Italic Fraunces sets exactly one phrase on the site — the hero accent, at
     600. Pinning the weight axis (opsz still varies with font-size) took the
     file from 70KB to 40KB with no visible change, and it is now preloaded
     only on the page that actually uses it. */
  font-weight: 600;
  font-display: swap;
  src: url('/fonts/fraunces-italic.woff2') format('woff2-variations');
}

@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 400 700;
  font-display: swap;
  src: url('/fonts/inter.woff2') format('woff2-variations');
}

/* ==========================================================================
   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;
}

/* No `order` here any more: the logo now comes first in the markup, so the
   visual order and the focus order agree without CSS reordering. */
.hb.hb .nav__logo {
  margin-right: auto;
  font-size: 1.6rem;
  font-weight: 700;
  letter-spacing: -0.025em;
  line-height: 1;
}

.hb.hb .nav__cta { order: 1; }

.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) {
  /* Collapsing with max-height alone leaves the panel's links in the tab
     order (WCAG 2.4.3): the container clips to 1px, but focus still enters,
     and each link gets scrolled into that 1px slot in turn — eight invisible
     stops while the toggle still reports aria-expanded="false". visibility
     takes them out of the tab order without disturbing the transition, and
     also hides the border-top, which was drawing a hairline under the header
     the whole time the menu was closed. The 0s delay keeps the panel visible
     for the length of the collapse, so the close still animates. */
  .hb.hb .nav__panel {
    display: block;
    max-height: 0;
    overflow: hidden;
    visibility: hidden;
    background-color: var(--color-bg);
    border-top: 1px solid var(--rule-soft);
    transition: max-height var(--anim-duration) var(--anim-easing),
                visibility 0s linear var(--anim-duration);
  }
  .hb.hb .nav__panel[data-open="true"] {
    max-height: 560px;
    visibility: visible;
    transition: max-height var(--anim-duration) var(--anim-easing),
                visibility 0s;
  }
  .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);
}

/* align-items: start, not center. Centring makes the text column's own
   height decide its vertical position, so the moment Fraunces swaps in and
   the headline's metrics change, the whole block re-centres — a 0.277 layout
   shift, and the single largest CLS contributor on the page. Top-aligning
   pins it. (The shift predates this stylesheet; it was simply not counted
   while the hero was still being held at opacity 0.) */
.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;
}

/* No aspect-ratio here on purpose. The file is cropped to 4:5 and its
   width/height attributes say so, which reserves the right box from the HTML
   alone. Declaring a different ratio in CSS meant the image was first laid
   out 16:9 from its attributes and re-laid out when this stylesheet applied,
   jumping 107px and taking the whole hero with it. */
.hb.hb .hero__media img {
  border-radius: var(--border-radius-xl);
  width: 100%;
  height: auto;
  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; }
}

/* 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 .community__media img,
.hb.hb.hb .proof__media img {
  aspect-ratio: 5 / 4;
  object-fit: cover;
  border-radius: var(--border-radius-lg);
}

/* Cropped 5:4 in the file, so it needs no ratio override either. */
.hb.hb.hb .empathy__media img {
  width: 100%;
  height: auto;
  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 { 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 — no entry animation, on purpose
   The generated stylesheet hides every [data-animate] element at opacity 0
   and relies on JS to reveal it. That blanked /kontakt and /faq in
   production, and blanked every page with JS disabled.

   A scroll-driven CSS version fixed those cases but kept the same shape of
   risk: anything that never "enters" the viewport stays hidden, so printing
   or any capture that does not scroll still loses the content below the fold.

   For a page whose job is to be read, a fade-in is not worth a class of bug
   that hides the text. The reveal is gone; [data-animate] is now inert.
   Motion on this site lives where it cannot strand content: hover and focus
   transitions, and the nav underline.
   -------------------------------------------------------------------------- */

.hb.hb [data-animate],
.hb.hb [data-animate].is-visible {
  opacity: 1;
  transform: none;
  transition: none;
  animation: 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;
}

/* --------------------------------------------------------------------------
   26. Proof stats rhythm
   Value and label are separate paragraphs, so UA margins opened a gap wide
   enough that each stat read as two unrelated lines.
   -------------------------------------------------------------------------- */

.hb.hb .proof__stats { gap: var(--space-lg); }

/* Both are paragraphs; the flex gap owns the spacing between stats, so the
   UA margins only ever pulled them apart. */
.hb.hb.hb .proof__stat-value { margin: 0 0 0.15em; }

.hb.hb.hb .proof__stat-label {
  margin: 0;
  max-width: 34ch;
}

/* --------------------------------------------------------------------------
   27. "Jak to działa" step alignment
   The step title carried the UA's h3 top margin, which pushed it 26px below
   the centre of its numbered marker — so number and heading never lined up.
   -------------------------------------------------------------------------- */

.hb.hb.hb .how__step-text h3 {
  margin-top: 0;
  padding-top: 0.5rem;
}

.hb.hb.hb .how__step-text p {
  margin-top: var(--space-2xs);
  margin-bottom: 0;
}

/* A horizontally scrollable table is now keyboard-focusable, so it needs a
   visible focus ring like anything else that takes focus. */
.hb.hb .legal-table-wrapper:focus-visible {
  outline: 3px solid var(--color-primary);
  outline-offset: 3px;
  border-radius: 6px;
}

/* --------------------------------------------------------------------------
   28. Cookie consent bar
   On a 839px-tall phone the bar was 469px — the bottom 56% of the screen —
   because the three actions stack full-width under a long paragraph. On
   /kontakt that buried the form's submit button entirely:
   document.elementFromPoint() over the button returned the banner's own
   title. Consent has to be readable, but it should not swallow the page.
   -------------------------------------------------------------------------- */

.hb.hb .cookie-consent__banner {
  background: var(--color-bg);
  border-top: 1px solid var(--rule);
  box-shadow: 0 -8px 32px -12px rgba(36, 26, 21, 0.28);
}

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

.hb.hb .cookie-consent__title {
  font-family: var(--font-heading);
  font-size: var(--font-size-lg);
  font-weight: 600;
  letter-spacing: var(--tracking-tight);
  margin-bottom: var(--space-2xs);
}

.hb.hb .cookie-consent__description {
  font-size: var(--font-size-sm);
  line-height: 1.55;
  color: var(--color-text-muted);
  margin-bottom: var(--space-md);
  max-width: 78ch;
}

.hb.hb .cookie-consent__btn {
  border-radius: var(--radius-pill);
  border-color: var(--rule);
  font-size: var(--font-size-sm);
  min-height: 44px;
  padding: 0.55rem 1.2rem;
}

.hb.hb .cookie-consent__btn--reject {
  background: transparent;
  color: var(--color-primary);
  border-color: var(--color-primary);
}

.hb.hb .cookie-consent__btn--manage {
  border-color: transparent;
  text-decoration: underline;
  text-underline-offset: 3px;
}

/* Wide enough to sit the actions beside the text rather than beneath it. */
@media (min-width: 720px) {
  /* Title and copy stack in the first column; the actions sit beside them,
     spanning both rows. Without explicit placement the three siblings flow
     into the grid as title | copy / actions, which read as three unrelated
     blocks. */
  .hb.hb .cookie-consent__content {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    align-items: center;
    column-gap: var(--space-xl);
    row-gap: var(--space-2xs);
  }
  .hb.hb .cookie-consent__title { grid-column: 1; grid-row: 1; }
  .hb.hb .cookie-consent__description { grid-column: 1; grid-row: 2; margin-bottom: 0; }
  .hb.hb .cookie-consent__actions {
    grid-column: 2;
    grid-row: 1 / span 2;
    flex-direction: row;
    flex-wrap: nowrap;
    align-items: center;
  }
}

@media (max-width: 719px) {
  /* Three stacked full-width buttons is what made this half a screen tall.
     The two decisions sit side by side; "manage" is a link beneath. */
  .hb.hb .cookie-consent__actions {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: var(--space-xs);
  }
  .hb.hb .cookie-consent__btn--manage {
    grid-column: 1 / -1;
    min-height: 36px;
    padding: 0.25rem;
  }
  /* No max-height: clipping the paragraph cut it mid-word, which read as
     broken. The two-up button row already recovered the height that
     mattered. */
  .hb.hb .cookie-consent__description { margin-bottom: var(--space-sm); }
}

/* --------------------------------------------------------------------------
   29. One eyebrow, everywhere
   Section labels were styled six different ways across the site — plain
   terracotta uppercase on /o-nas, moss on the home features, a third
   treatment on /cennik. They all name the same thing, so they get the same
   clay-to-silver rule the home page and blog already use.
   -------------------------------------------------------------------------- */

.hb.hb .mission__eyebrow,
.hb.hb .philosophy__eyebrow,
.hb.hb .team__eyebrow,
.hb.hb .journey-card__eyebrow,
.hb.hb .pricing__eyebrow {
  display: flex;
  align-items: center;
  gap: 0.75em;
  font-family: var(--font-body);
  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 .mission__eyebrow::before,
.hb.hb .philosophy__eyebrow::before,
.hb.hb .team__eyebrow::before,
.hb.hb .journey-card__eyebrow::before,
.hb.hb .pricing__eyebrow::before {
  content: "";
  flex-shrink: 0;
  width: clamp(24px, 3vw, 44px);
  height: 1.5px;
  background-image: linear-gradient(90deg, var(--color-primary), var(--silver));
}

/* Centred intros (pricing) need the rule centred too. */
.hb.hb .pricing__intro .pricing__eyebrow {
  justify-content: center;
}

@media (max-width: 480px) {
  .hb.hb .mission__eyebrow,
  .hb.hb .philosophy__eyebrow,
  .hb.hb .team__eyebrow,
  .hb.hb .journey-card__eyebrow,
  .hb.hb .pricing__eyebrow { display: block; }

  .hb.hb .mission__eyebrow::before,
  .hb.hb .philosophy__eyebrow::before,
  .hb.hb .team__eyebrow::before,
  .hb.hb .journey-card__eyebrow::before,
  .hb.hb .pricing__eyebrow::before {
    display: block;
    width: 32px;
    margin-bottom: 0.75em;
  }
}

/* --------------------------------------------------------------------------
   30. /opinie corrections
   -------------------------------------------------------------------------- */

/* The image lives inside .hair-journeys__intro, which the site-wide
   two-column intro rule turned into a grid — so it landed in one column at
   541px of 1140. It is not part of the title/lede pair; span it. */
.hb.hb .hair-journeys__intro .hair-journeys__image {
  grid-column: 1 / -1;
  width: 100%;
  max-width: none;
  margin-top: var(--space-lg);
}

/* Three stats in a wrap-flex row broke 2 + 1, orphaning the third. A grid
   keeps them a set. */
.hb.hb .community__stats {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: var(--space-md);
  margin-top: var(--space-lg);
}

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

.hb.hb.hb .community__stat-value { margin: 0 0 0.15em; }
.hb.hb.hb .community__stat-label { margin: 0; }

@media (max-width: 560px) {
  .hb.hb .community__stats { grid-template-columns: 1fr 1fr; }
  .hb.hb .community__stat:last-child { grid-column: 1 / -1; }
}

/* --------------------------------------------------------------------------
   31. Belt-and-braces box reservation
   These ratios match the files exactly, so they never override anything —
   they just guarantee the box is reserved even in the window before the
   width/height attributes are used, which is where an intermittent 0.44 CLS
   was appearing in Lighthouse on the hero.
   -------------------------------------------------------------------------- */

.hb.hb .hero__media img { aspect-ratio: 864 / 1080; }
.hb.hb .empathy__media img { aspect-ratio: 1000 / 800; }
.hb.hb .how__media img { aspect-ratio: 1600 / 1000; }

/* --------------------------------------------------------------------------
   32. 404
   -------------------------------------------------------------------------- */

.hb.hb .notfound__inner {
  max-width: 40rem;
  padding-block: clamp(2rem, 6vw, 5rem);
}

.hb.hb .notfound__code {
  display: flex;
  align-items: center;
  gap: 0.75em;
  margin: 0 0 var(--space-md);
  font-family: var(--font-body);
  font-size: var(--font-size-xs);
  font-weight: 600;
  letter-spacing: var(--tracking-eyebrow);
  color: var(--silver-ink);
}

.hb.hb .notfound__code::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 .notfound__title { margin: 0 0 var(--space-md); }

.hb.hb .notfound__lead {
  margin: 0 0 var(--space-lg);
  font-size: var(--font-size-lg);
  line-height: 1.5;
  color: var(--color-text-muted);
  max-width: 46ch;
}

.hb.hb .notfound__actions {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-sm);
  margin-bottom: var(--space-xl);
}

.hb.hb .notfound__links {
  padding-top: var(--space-md);
  border-top: 1px solid var(--rule-soft);
}

.hb.hb.hb .notfound__links ul {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-sm) var(--space-lg);
  padding: 0;
  margin: 0;
}

.hb.hb.hb .notfound__links a {
  color: var(--color-text-muted);
  text-decoration: underline;
  text-underline-offset: 3px;
}

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

/* --------------------------------------------------------------------------
   33. Print
   The site had no print styles: a printed page carried the sticky header,
   the cookie bar, the fixed download bar and every CTA, and links lost their
   destinations.
   -------------------------------------------------------------------------- */

@media print {
  .hb.hb .nav,
  .hb.hb .nav__panel,
  .hb.hb .sticky-download,
  .hb.hb .cookie-consent,
  .hb.hb .footer-cta,
  .hb.hb .skip-link,
  .hb.hb .mag-appeal,
  .hb.hb .mag-related,
  .hb.hb .store-badges,
  .hb.hb .notfound__actions { display: none !important; }

  .hb.hb,
  .hb.hb body { background: #fff; color: #000; }

  .hb.hb .section { padding-block: 1.5rem; }

  /* Give a reader the URLs they cannot click. */
  .hb.hb .mag-prose a[href^="http"]::after,
  .hb.hb .legal-article a[href^="http"]::after {
    content: " (" attr(href) ")";
    font-size: 0.85em;
    word-break: break-all;
  }

  .hb.hb h1, .hb.hb h2, .hb.hb h3 { break-after: avoid-page; }
  .hb.hb p, .hb.hb li, .hb.hb figure, .hb.hb table { break-inside: avoid; }
  .hb.hb img { max-width: 100% !important; }
}

/* --------------------------------------------------------------------------
   34. Legible body copy
   Several body and lead paragraphs were set in absolute rem values below the
   base size — 1.05rem renders at 16.8px against a 18.4px base. For an
   audience of women 40+ that is the wrong direction. Leads take the large
   step, body copy takes the base, and nothing that carries prose renders
   smaller than the body default.
   -------------------------------------------------------------------------- */

.hb.hb.hb .hero__lead,
.hb.hb.hb .community__lead,
.hb.hb.hb .how__lead,
.hb.hb.hb .proof__lead,
.hb.hb.hb .empathy__content p:first-of-type {
  font-size: var(--font-size-lg);
  line-height: 1.5;
}

.hb.hb.hb .empathy__content p,
.hb.hb.hb .feature__body,
.hb.hb.hb .community__quote p,
.hb.hb.hb .contact-form__message,
.hb.hb.hb .journey-card__story,
.hb.hb.hb .included__desc,
.hb.hb.hb .faq__answer,
.hb.hb.hb .pricing__desc {
  font-size: var(--font-size-base);
}

/* Dense legal text is the hardest thing on the site to read, so it gets the
   tightest measure — it was running 74 characters per line. */
.hb.hb .legal-container { max-width: 42rem; }

/* --------------------------------------------------------------------------
   35. Touch targets and small text on phones
   Measured at 390px: footer links were 28px tall, the wordmark 26px and the
   contact email 25px. All clear WCAG 2.5.8's 24px minimum, but they are well
   under the 44px platform guidance — and this audience is the last one to
   give thin targets to. Table cells in the privacy policy rendered at 12px.
   -------------------------------------------------------------------------- */

@media (max-width: 900px) {
  .hb.hb.hb .footer a:not(.btn),
  .hb.hb.hb .notfound__links a {
    min-height: 44px;
    padding-block: 0.5rem;
  }

  .hb.hb.hb .footer__nav ul,
  .hb.hb.hb .footer__contact ul,
  .hb.hb.hb .footer__legal-col ul { gap: 0.15rem; }

  .hb.hb .nav__logo,
  .hb.hb .contact-info__email {
    display: inline-flex;
    align-items: center;
    min-height: 44px;
  }

  .hb.hb .mag-brand {
    display: inline-flex;
    align-items: center;
    min-height: 44px;
  }

  .hb.hb .mag-nav a { min-height: 44px; }
}

/* 12px is too small for anyone to read a data table, let alone this audience. */
.hb.hb.hb .legal-table th,
.hb.hb.hb .legal-table td {
  font-size: var(--font-size-sm);
  line-height: 1.5;
}

.hb.hb .cookie-consent__no-cookies { font-size: var(--font-size-sm); }

/* Remaining small targets found at 390px. */
.hb.hb .cookie-consent__btn--manage { min-height: 44px; }

@media (max-width: 980px) {
  .hb.hb .mag-site-footer__nav a {
    display: inline-flex;
    align-items: center;
    min-height: 44px;
  }
  .hb.hb .mag-site-footer__nav { gap: 0 var(--space-md); flex-wrap: wrap; }
}

/* The cookie preferences table rendered at 12px — the one place on the site
   where a visitor is asked to make an informed choice. */
.hb.hb.hb .cookie-consent__cookie-table th,
.hb.hb.hb .cookie-consent__cookie-table td {
  font-size: var(--font-size-sm);
  line-height: 1.5;
}

/* The hair-type descriptor under each name is prose, not a label; 13px is too
   small for it. (The pricing badge stays small — it is a label.) */
.hb.hb.hb .testimonial-card__detail { font-size: var(--font-size-sm); }
