/* ==========================================================================
   DermaClinix — home.css
   Every stylesheet for the landing page, concatenated into one request.

   ORDER IS LOAD-BEARING. Several sections end with mobile/tablet overrides
   that win on source order alone — a media query adds no specificity — so
   the blocks below must stay in this sequence, and `styles.css` must stay
   first because it defines the :root tokens, .btn, .container, .section and
   .ph-media that everything else builds on.

   Generated from the files in this folder by build-css.sh, in this order:
     styles
     hero
     treatments
     results
     doctors
     why-experience-steps
     outcome-principles-featured
     testimonials-contact-faq
   ========================================================================== */



/* ==========================================================================
   Base — design tokens, reset, typography, buttons, shared helpers
   (was css/styles.css)
   ========================================================================== */

/* ==========================================================================
   DermaClinix Landing Page
   Design tokens + base styles
   Note: This file contains ONLY the landing-page sections. No site header
   or footer markup/styles are included — integrate this into your existing
   header/footer templates.
   ========================================================================== */

html {
  --top-spacing: 140px;
  scroll-padding-top: var(--top-spacing);
}
:root {
  /* ---- Colors ---- */

  --color-ink: #3B3B3B;          /* primary heading / text */
  --color-body: #4a4340;         /* body copy */
  --color-coral: #EC7E73;        /* primary accent / CTA */
  --color-coral-dark: #d96c50;
  --color-coral-light: #f3ab97;
  --color-cream: #fdf4ef;        /* hero gradient bg */
  --color-cream-2: #faeae3;
  --color-surface: #ffffff;
  --color-surface-alt: #f4f3f1;  /* light gray section bg */
  --color-teal: #4E92A2;         /* hair treatment theme */
  --color-teal-bg: #eaf4f4;
  --color-gold: #B1965C;         /* skin treatment theme */
  --color-gold-bg: #faf1de;
  --color-terracotta: #CE9178;   /* beauty treatment theme */
  --color-terracotta-bg: #fbe9e2;
  --color-brown-900: #251511;
  --color-brown-700: #4b2a1f;
  --color-brown-500: #8B4E40;
  --color-border: #e7e1db;
  /* --color-border-coral: rgba(232, 132, 107, 0.45); */
  --color-border-coral: #EC7E73;


  


  /* ---- Typography ---- */
  --font-serif: "Playfair Display", "Georgia", "Times New Roman", serif;
  --font-sans: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;

  /* ---- Layout ---- */
  --container-max: 1320px;
  --gutter: clamp(1.25rem, 4vw, 3rem);
  --radius-sm: 10px;
  --radius-md: 16px;
  --radius-lg: 24px;
  --radius-pill: 999px;
  --shadow-card: 0 12px 32px rgba(43, 36, 32, 0.08);
  --shadow-card-hover: 0 18px 40px rgba(43, 36, 32, 0.12);

  /* ---- Motion ---- */
  --ease: cubic-bezier(0.4, 0, 0.2, 1);
  --dur: 240ms;
  --dur-slow: 420ms;      /* layout moves, e.g. the doctors column swap */
}

/* ---- Reset ---- */
*, *::before, *::after { box-sizing: border-box; }
html { scroll-behavior: smooth; }
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
}

body {
  margin: 0;
  font-family: var(--font-sans);
  color: var(--color-body);
  background: var(--color-surface);
  line-height: 1.6;
  font-size: 16px;
  -webkit-font-smoothing: antialiased;
}

/* Element resets, scoped to the page and wrapped in :where().
   The scope (.dc-page) lifts them above a bare `a {}` / `ul {}` in the host
   site's stylesheets, which load after this file and would otherwise win.
   :where() contributes no specificity of its own, so these stay at 0-1-0 and
   still lose to every component class further down — scoping them without it
   put `font: inherit` above .filter-pill and reset the pills to UA defaults. */
.dc-page :where(img) { max-width: 100%; display: block; }
.dc-page :where(button, input, textarea, select) { font: inherit; }
.dc-page :where(button) { cursor: pointer; }
.dc-page :where(a) { color: inherit; text-decoration: none; }
.dc-page :where(ul) { margin: 0; padding: 0; list-style: none; }

:focus-visible {
  outline: 2px solid var(--color-coral);
  outline-offset: 3px;
}

.dc-h1, .dc-h2, .dc-h3, .dc-h4 {
  font-family: var(--font-serif);
  color: var(--color-ink);
  line-height: 1.15;
  margin: 0;
  font-weight: 600;
}

.dc-container {
  max-width: calc(1440px + 2 * var(--gutter));
  /*max-width: var(--container-max);*/
  margin-inline: auto;
  padding-inline: var(--gutter);
}

.section {
  padding-block: clamp(3.5rem, 7vw, 6.5rem);
}

.section-head {
  max-width: 769px;
  margin-bottom: clamp(2rem, 5vw, 3rem);
}
.section-head.center { margin-inline: auto; text-align: center; }

.eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  font-size: 0.8rem;
  font-weight: 600;
  letter-spacing: 0.03em;
  color: var(--color-coral-dark);
  background: var(--color-cream-2);
  padding: 0.45rem 1.1rem;
  border-radius: var(--radius-pill);
  border: 1px solid var(--color-border-coral);
}

.dc-h2 {
  font-size: clamp(1.9rem, 3.4vw, 2.75rem);
  letter-spacing: -0.01em;
}

.dc-h2 .accent, .dc-h3 .accent, span.accent {
  color: var(--color-coral);
  /* font-style: italic; */
}

.lede {
  font-size: clamp(1rem, 1.2vw, 1.125rem);
  color: var(--color-body);
  /* max-width: 62ch; */
}

/* ---- Buttons ---- */
.dc-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.5rem;
  padding: 0.5rem 1rem;
  border-radius: var(--radius-pill);
  font-weight: 600;
  font-size: 0.95rem;
  border: 1px solid transparent;
  transition: transform var(--dur) var(--ease), box-shadow var(--dur) var(--ease), background var(--dur) var(--ease);
  white-space: nowrap;
}
.dc-btn:hover { transform: translateY(-2px); }

.dc-btn--primary {
  background: var(--color-coral);
  color: #fff;
  box-shadow: 0 10px 24px rgba(232, 132, 107, 0.35);
}
.dc-btn--primary:hover { background: var(--color-coral-dark); color: #fff;}

.dc-btn--outline {
  background: transparent;
  border-color: var(--color-ink);
  color: var(--color-ink);
}
.dc-btn--outline:hover { background: var(--color-ink); color: #fff; }

.dc-btn--outline-coral {
  background: transparent;
  border-color: var(--color-coral);
  color: var(--color-coral-dark);
}
.dc-btn--outline-coral:hover { background: var(--color-coral); color: #fff; }

.dc-btn--outline-white {
  background: transparent;
  border-color: rgba(255,255,255,0.7);
  color: #fff;
}
.dc-btn--outline-white:hover { background: #fff; color: var(--color-ink); }

.dc-btn--sm { padding: 0.6rem 1.3rem; font-size: 0.85rem; }

/* ---- Placeholder media block ----
   Marks every image slot to be swapped with real photography.
   Replace the element's background-image (via inline style or the
   [data-img] attribute) with your actual asset; remove the label span
   once a real image is in place. */
.ph-media {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  background: linear-gradient(135deg, var(--ph-a, #e9e3dd), var(--ph-b, #d9d0c6));
  color: rgba(43,36,32,0.45);
  overflow: hidden;
  isolation: isolate;
}
.ph-media::before {
  content: "";
  position: absolute;
  inset: 0;
  background-image:
    radial-gradient(circle at 30% 20%, rgba(255,255,255,0.35), transparent 60%);
}
.ph-media .ph-icon {
  width: 34%;
  max-width: 64px;
  opacity: 0.55;
}
.ph-media .ph-label {
  position: absolute;
  bottom: 10px;
  left: 10px;
  right: 10px;
  font-size: 0.68rem;
  font-weight: 600;
  letter-spacing: 0.02em;
  background: rgba(255,255,255,0.85);
  color: var(--color-ink);
  padding: 0.3rem 0.55rem;
  border-radius: 6px;
  z-index: 1;
}

/* Skip link */
.skip-link {
  position: absolute;
  left: -9999px;
  top: 0;
  background: var(--color-ink);
  color: #fff;
  padding: 0.75rem 1.25rem;
  z-index: 999;
  border-radius: 0 0 8px 0;
}
.skip-link:focus { left: 0; }

.visually-hidden {
  position: absolute !important;
  width: 1px; height: 1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
}

/* ---- Drag-to-pan on the native overflow sliders (see initDragScrollers) ---- */
.principles__track,
.video-track,
.press-strip__track { cursor: grab; }
/* The looping tracks get clone sets inserted in front of their real cards.
   Scroll anchoring exists to shift scrollLeft when content appears before
   the viewport, which is exactly what buildLoop does deliberately — so keep
   the browser from second-guessing the parked position. */
.principles__track,
.video-track { overflow-anchor: none; }
.principles__track.is-dragging,
.video-track.is-dragging,
.press-strip__track.is-dragging {
  cursor: grabbing;
  scroll-behavior: auto;   /* smooth scrolling fights a live drag */
  /* Mandatory snap re-snaps after every scrollLeft write, so a drag never
     accumulates and the track appears stuck. Suspend it while dragging. */
  scroll-snap-type: none;
  user-select: none;
  -webkit-user-select: none;
}

/* Scroll lock while the testimonial lightbox is open. On <html> rather than
   <body> so the sticky treatment stack keeps its scrollport. */
html.vt-lock { overflow: hidden; }

@media (max-width: 760px) {
 .section { padding-block: clamp(2.5rem, 6vw, 4.5rem); }

}
/* ---- Section CTA row ----
   A centred pair of actions closing a section. Used where a section earns a
   next step (results, process, social proof) rather than on every one. */
.section-cta {
  display: flex;
  flex-wrap: wrap;
  gap: 0.75rem;
  justify-content: center;
  margin-top: clamp(1.75rem, 4vw, 2.75rem);
}

/* ---- WhatsApp action ---- */
.dc-btn--whatsapp {
  background: #25D366;
  color: #fff;
  border-color: #25D366;
}
.dc-btn--whatsapp:hover { background: #1da851; border-color: #1da851; color: #fff; }
.dc-btn__wa { width: 18px; height: 18px; flex: none; }


/* ==========================================================================
   Hero — three zones, press strip, before/after slider
   (was css/hero.css)
   ========================================================================== */

/* ==========================================================================
   Hero — three zones on desktop:
     L.H.S  .hero__content  (copy)
     MID    .hero__person   (transparent PNG cut-out, bleeds to section floor)
     R.H.S  .hero__results  (before/after slider)
   ========================================================================== */

/* The section carries class="home_hero", not "hero" — renamed to avoid
   colliding with the host site's own .hero. This block was left addressing
   the old name, so it stopped applying: the hero lost its background and its
   top padding (clipping the headline under the sticky header), and nothing
   clipped the oversized wordmark, which overhangs the viewport by ~37px on a
   390px screen and was the horizontal scrollbar. */
.home_hero {
  position: relative;
  isolation: isolate;
  background:
    radial-gradient(120% 90% at 18% 10%, #fdf5f1 0%, rgba(253, 245, 241, 0) 60%),
    linear-gradient(150deg, var(--color-cream) 0%, var(--color-cream-2) 45%, #f7ddd4 100%);
  padding-block: clamp(1.75rem, 4vw, 3rem) 0;
  overflow: hidden;
}

/* Oversized brand wordmark washed into the floor of the hero content area.
   It lives inside .hero__grid so it stops at the grid's baseline rather than
   running on behind the press strip; .home_hero clips the overhang. */
.hero__watermark {
  position: absolute;
  left: 50%;
  bottom: -0.18em;
  transform: translateX(-50%);
  margin: 0;
  z-index: -1;
  font-family: var(--font-serif);
  font-weight: 500;
  font-size: clamp(5rem, 17vw, 15rem);
  line-height: 1;
  white-space: nowrap;
  color: var(--color-coral);
  opacity: 0.14;
  pointer-events: none;
  user-select: none;
}

.hero__grid {
  position: relative;
  display: grid;
  grid-template-columns: 1fr;
  gap: clamp(2rem, 5vw, 3rem);
  align-items: center;
}

/* Tablet: copy + person side by side, slider drops underneath */
@media (min-width: 760px) {
  .hero__grid {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    column-gap: clamp(1.25rem, 3vw, 2.5rem);
  }
  /* Full-bleed row would blow the shots up, so keep the card card-sized. */
  .hero__results {
    grid-column: 1 / -1;
    /* width:100% is load-bearing — auto margins suppress grid stretch, and the
       card's contents are all absolutely positioned, so it would collapse. */
    width: 100%;
    max-width: 460px;
    margin-inline: auto;
  }

}

/* Desktop: the three-zone layout from the design */
@media (min-width: 1100px) {
  .hero__grid {
    /* The cut-out is absolutely positioned and free to overflow its column,
       so the middle track can stay narrow — the copy needs the room more. */
    grid-template-columns: minmax(0, 1.2fr) minmax(0, 0.8fr) minmax(205px, 240px);
    column-gap: clamp(0.5rem, 1.2vw, 1rem);
    min-height: clamp(560px, 58vw, 690px);
  }
  .hero__results {
    grid-column: auto;
    width: auto;
    max-width: none;
    margin-inline: 0;
  }
}

/* --------------------------------------------------------------------------
   L.H.S — copy
   -------------------------------------------------------------------------- */
.hero__content {
  position: relative;
  z-index: 2;
  padding-bottom: clamp(2rem, 5vw, 3.25rem);
}

.hero__badge {
  display: inline-block;
  font-size: 0.75rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  color: var(--color-body);
  background: rgba(255, 255, 255, 0.7);
  border: 1px solid var(--color-border);
  padding: 0.5rem 1.1rem;
  border-radius: var(--radius-pill);
  margin-bottom: 1.5rem;
}

.hero__title {
  font-size: clamp(1.95rem, 3.7vw, 3.25rem);
  letter-spacing: -0.015em;
  margin-bottom: 1.25rem;
}
.hero__title em {
  color: var(--color-coral);
  font-style: normal;
}

.hero__lede {
  max-width: 42ch;
  margin-bottom: 1.75rem;
  font-size: clamp(0.98rem, 1.1vw, 1.05rem);
}

.hero__cta { margin-bottom: 2rem; }

.hero__facts {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 0.85rem 1.5rem;
  max-width: 480px;
}

.hero__fact {
  display: flex;
  align-items: flex-start;
  gap: 0.6rem;
  font-size: 0.92rem;
  color: var(--color-ink);
}

/* Concentric target dot: coral core, white ring, coral rim. The tiny stop
   overlaps keep the edges from aliasing into a hard staircase. */
.hero__fact .dot-icon {
  flex: none;
  width: 19px;
  height: 19px;
  border-radius: 50%;
  margin-top: 0.12rem;
  background: radial-gradient(circle at 50% 50%,
    var(--color-coral) 0 36%,
    #fff 38% 65%,
    var(--color-coral) 67% 100%);
    box-shadow: 0px 0px 20px 0px rgba(0, 0, 0, 0.5);

}

/* --------------------------------------------------------------------------
   MID — person cut-out. The PNG carries its own crosshair/reticle artwork and
   is anchored to the bottom of the section, so it reads as standing on the
   floor of the hero rather than sitting in a box.
   -------------------------------------------------------------------------- */
.hero__person {
  position: relative;
  align-self: end;
  min-height: 300px;
  z-index: 1;
}
@media (min-width: 760px)  { .hero__person { min-height: 420px; } }
@media (min-width: 1100px) { .hero__person { align-self: stretch; min-height: 0; } }

.hero__person-img {
  position: absolute;
  bottom: 0;
  /*left: 50%;*/
  left: 22%;
  transform: translateX(-50%);
  width: auto;
  max-width: none;
  height: 100%;
  max-height: 100%;
  object-fit: contain;
  object-position: bottom center;
}
/* Below the 3-column breakpoint the column has no intrinsic height to fill,
   so drive the image from its own box instead. */
@media (max-width: 1099px) {
  .hero__person-img { height: auto; width: 100%; max-height: 460px; left:50%; }
}

/* Dev-time stand-in shown only while assets/hero-person.webp is absent */
.hero__person.has-missing-img::after {
  content: "Drop in: assets/hero-person.webp";
  position: absolute;
  left: 50%;
  bottom: 0;
  transform: translateX(-50%);
  width: min(118%, 400px);
  aspect-ratio: 3 / 4;
  max-height: 100%;
  display: grid;
  place-items: end center;
  padding-bottom: 1rem;
  border: 2px dashed var(--color-border-coral);
  border-bottom: 0;
  border-radius: var(--radius-lg) var(--radius-lg) 0 0;
  background: linear-gradient(180deg, rgba(255, 255, 255, 0.45), rgba(255, 255, 255, 0));
  font-family: var(--font-sans);
  font-size: 0.75rem;
  font-weight: 600;
  color: var(--color-coral-dark);
}

/* --------------------------------------------------------------------------
   R.H.S — real results slider
   -------------------------------------------------------------------------- */
.hero__results {
  position: relative;
  z-index: 3;
  align-self: center;
  /* See .results-carousel__stage — horizontal drags are ours, vertical
     scrolling stays with the page. */
  touch-action: pan-y;
  cursor: grab;
  user-select: none;
  -webkit-user-select: none;
}
.hero__results:active { cursor: grabbing; }

.hero__results-card {
  background: #fff;
  border-radius: var(--radius-md);
  padding: 10px;
  box-shadow: var(--shadow-card);
}

.hero__results-viewport { overflow: hidden; border-radius: 10px; }

.hero__results-track {
  display: flex;
  transition: transform var(--dur) var(--ease);
}
@media (prefers-reduced-motion: reduce) {
  .hero__results-track { transition: none; }
}

/* One slide = one patient. Side by side until the column is narrow enough
   to stack them, which is how the design shows it on desktop. */
.hero-result {
  flex: 0 0 100%;
  margin: 0;
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 10px;
}
@media (min-width: 1100px) {
  .hero-result { grid-template-columns: minmax(0, 1fr); }
}
@media (max-width: 760px) {
 .hero__results{
  display: none;
 }

}

/* Phones: "Connect with Us" drops below the fact list. `order` moves it
   visually only; the badge is pinned left so the flex column doesn't
   stretch it full width. */
@media (max-width: 759px) {
  .hero__content { display: flex; flex-direction: column; }
  .hero__badge { align-self: flex-start; }
  .hero__cta { order: 1; margin-bottom: 0; margin-top: 2rem; }
}

.hero-result__shot {
  position: relative;
  overflow: hidden;
  border-radius: 10px;
  aspect-ratio: 1.05 / 1;
  --ph-a: #e5e0da;
  --ph-b: #cfc7bd;
}
.hero-result__shot img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.hero-result__shot .tag {
  position: absolute;
  left: 50%;
  bottom: 8px;
  transform: translateX(-50%);
  z-index: 1;
  font-size: 0.68rem;
  font-weight: 700;
  letter-spacing: 0.03em;
  color: #fff;
  padding: 0.25rem 0.7rem;
  border-radius: 6px;
}
.hero-result__shot .tag--before { background: rgba(30, 26, 24, 0.8); }
.hero-result__shot .tag--after { background: var(--color-coral); }

/* Treatment name for the slide on show. Sits between the card and the dots.
   The min-height holds one line open at all times so an empty or shorter
   name cannot move the dots — and the hero column with them — as the
   slider advances. */
.hero__results-caption {
  margin: 0.8rem 0 0;
  text-align: center;
  font-size: 0.95rem;
  font-weight: 600;
  line-height: 1.35;
  letter-spacing: 0.01em;
  color: var(--color-ink);
  min-height: 1.35em;
}

.hero__results-dots {
  display: flex;
  gap: 0.4rem;
  justify-content: center;
  margin-top: 1rem;
}
.hero__results-dots button {
  width: 7px;
  height: 7px;
  padding: 0;
  border: 0;
  border-radius: 50%;
  background: rgba(43, 36, 32, 0.18);
  transition: width var(--dur) var(--ease), background var(--dur) var(--ease);
}
.hero__results-dots button.is-active {
  width: 20px;
  border-radius: 4px;
  background: var(--color-coral);
}

/* ==========================================================================
   Press strip — white band between the hero and the treatments section,
   ruled top and bottom, logos separated by small coral dots.
   ========================================================================== */
.press-strip {
  background: var(--color-surface);
  border-top: 1px solid var(--color-border);
  border-bottom: 1px solid var(--color-border);
  padding-block: 1.6rem;
}

.press-strip__track {
  display: flex;
  align-items: center;
  /* One row at every width, as in the design. Wrapping would strand a
     separator dot at the start of each continuation line, so the strip
     scrolls instead. `safe` keeps the first logo reachable once it does. */
  flex-wrap: nowrap;
  justify-content: safe center;
  gap: clamp(0.85rem, 2.4vw, 2rem);
  overflow-x: auto;
  scrollbar-width: none;
  -ms-overflow-style: none;
}
.press-strip__track::-webkit-scrollbar { display: none; }

.press-logo {
  flex: none;
  display: flex;
  align-items: center;
  gap: clamp(0.85rem, 2.4vw, 2rem);
}

/* Coral dot between neighbours only — never leading or trailing. */
.press-logo + .press-logo::before {
  content: "";
  flex: none;
  width: 5px;
  height: 5px;
  border-radius: 50%;
  background: var(--color-coral);
  opacity: 0.8;
}

/* Desaturate the marks themselves, not the separators. */
.press-logo img {
  height: clamp(20px, 2.2vw, 30px);
  width: auto;
  object-fit: contain;
  opacity: 0.5;
  filter: grayscale(1);
}

/* Stand-in shown while a logo file is absent — see initImageFallbacks(). */
.press-logo__text {
  font-family: var(--font-serif);
  font-weight: 700;
  font-size: 1.05rem;
  line-height: 1;
  white-space: nowrap;
  color: var(--color-body);
  opacity: 0.45;
}


/* --------------------------------------------------------------------------
   Marquee — switched on by initPressMarquee(), which adds .is-marquee and
   fills the track with copies of the logos. Without JS, or with reduced
   motion, the strip above stays as it is: a static, swipeable row.
   -------------------------------------------------------------------------- */
.press-strip.is-marquee .dc-container {
  overflow: hidden;
  /* Logos fade in and out at the edges rather than being cut off. */
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 6%, #000 94%, transparent);
          mask-image: linear-gradient(90deg, transparent, #000 6%, #000 94%, transparent);
}

.press-strip.is-marquee .press-strip__track {
  width: max-content;
  overflow: visible;
  justify-content: flex-start;
  /* Spacing moves onto the items so every logo carries exactly the same
     width; with a flex gap the two halves would differ by one gap and the
     loop would jump. */
  gap: 0;
  animation: press-marquee var(--marquee-duration, 30s) linear infinite;
}

.press-strip.is-marquee .press-logo {
  padding-right: clamp(0.85rem, 2.4vw, 2rem);
}

/* In a loop there is no first logo, so every one gets its leading dot. */
.press-strip.is-marquee .press-logo::before {
  content: "";
  flex: none;
  width: 5px;
  height: 5px;
  border-radius: 50%;
  background: var(--color-coral);
  opacity: 0.8;
}

/* Hover stops the strip and brings the logo under the pointer to full colour. */
.press-strip.is-marquee:hover .press-strip__track { animation-play-state: paused; }

.press-logo img,
.press-logo__text { transition: opacity var(--dur) var(--ease), filter var(--dur) var(--ease), color var(--dur) var(--ease); }
.press-logo:hover img { opacity: 1; filter: none; }
.press-logo:hover .press-logo__text { opacity: 1; color: var(--color-ink); }

@keyframes press-marquee {
  to { transform: translateX(-50%); }
}


/* ==========================================================================
   Treatments — sticky card stack
   (was css/treatments.css)
   ========================================================================== */

/* ==========================================================================
   Treatments Crafted for You
   ========================================================================== */

.treatments__list {
  --stack-gap: 3rem;
  display: flex;
  flex-direction: column;
  gap: var(--stack-gap);
}

/* --------------------------------------------------------------------------
   Sticky card stack
   Each card parks a little lower than the one before it, so as you scroll the
   next card slides up over the last and leaves a coloured sliver showing.
   Pure CSS — no scroll listeners. Note this only works because nothing in the
   ancestor chain (.section, .dc-container, main) sets `overflow`, which would
   silently kill `position: sticky`.

   The last card is the reason for --stack-release. A sticky box can never be
   pushed past the bottom of its containing block, so with the list ending at
   the last card that card has zero travel and never pins. Padding the list
   gives it room; the results section is then pulled back up by the same
   amount so it scrolls over the parked stack instead of leaving a hole.

   This runs at every width now. The one hard requirement is that a card be
   shorter than the scrollport — a sticky box taller than the viewport pins
   with its foot below the fold and that part can never be scrolled to. The
   mobile card is trimmed below to keep it inside that budget, and
   initTreatmentStack() sets .no-card-stack on <html> as a backstop if it
   still does not fit.
   -------------------------------------------------------------------------- */
:root {
  /* How far .results travels over the pinned stack before the stack lets
     go, and the exact distance .results is pulled back up by.

     The correct value is the height of the pinned stack itself — the
     distance from the top of the first parked sliver to the bottom of the
     last card. Any smaller and the cards unpin while .results is still
     mid-way over them; any larger and the pin outlives .results, leaving
     the cards painting over whatever section comes next (they are
     positioned, the following sections are not).

     That depends on the rendered card height, so initTreatmentStack() in
     main.js measures it and overrides this on :root. This literal is the
     no-JS fallback. */
  --stack-release: 660px;

  /* How far .treatment-card's box-shadow reaches above its top edge
     (offset + blur). .results has to clear this too, or the shadow of the
     topmost parked card smudges above its edge at the handoff. */
  --stack-overshoot: 44px;
}

.treatments__list {
  /* Small screens get a shallower parking offset: the sliver only has to
     read as a stacked edge, and every pixel spent here is a pixel the card
     below loses from the viewport. */
  --stack-top: 140px;
  --stack-step: 25px;
}
@media (min-width: 860px) {
  .treatments__list {
    /* Raise --stack-top to clear a fixed site header if you add one. */
    --stack-top: 190px;
    --stack-step: 45px;   /* height of the sliver left by each parked card */
  }
}

/* Travel room for the last card. This has to be a real flex item: a sticky
   box is clipped to its containing block's CONTENT box (so padding on the
   list buys nothing) and that rect is then inset by the box's OWN margins
   (so margin-bottom on the card cancels itself out exactly). An empty
   ::after item is neither, and genuinely extends the range.
   Its negative margin-top cancels the flex `gap` the extra item would
   otherwise add, keeping the spacer exactly --stack-release tall. */
.treatments__list::after {
  content: "";
  flex: 0 0 auto;
  height: var(--stack-release);
  margin-top: calc(-1 * var(--stack-gap));
}

/* Spacing below the stack is owned by --stack-release now. */
.treatments { padding-bottom: 0; }

.treatment-card {
  position: sticky;
  top: calc(var(--stack-top) + var(--card-index, 0) * var(--stack-step));
  /* Lifts each card off the one it is covering. */
  box-shadow: 0 -12px 32px rgba(43, 36, 32, 0.07);
}

.treatments__list > .treatment-card:nth-child(1) { --card-index: 0; }
.treatments__list > .treatment-card:nth-child(2) { --card-index: 1; }
.treatments__list > .treatment-card:nth-child(3) { --card-index: 2; }
.treatments__list > .treatment-card:nth-child(4) { --card-index: 3; }
.treatments__list > .treatment-card:nth-child(5) { --card-index: 4; }

/* Lives here rather than in results.css because it exists only to serve the
   stack above: an opaque, raised panel that rides up over the parked cards. */
.results {
  position: relative;
  z-index: 1;
  margin-top: calc(-1 * var(--stack-release));
}

/* Backstop. Set by initTreatmentStack() when the tallest card still will not
   fit the scrollport, so nothing ends up pinned with unreachable content. */
.no-card-stack .treatment-card { position: static; box-shadow: none; }
.no-card-stack .treatments__list::after { content: none; }
.no-card-stack .treatments { padding-bottom: clamp(3.5rem, 7vw, 6.5rem); }
.no-card-stack .results { margin-top: 0; }

.treatment-card {
  display: grid;
  grid-template-columns: 1fr;
  border-radius: var(--radius-lg);
  overflow: hidden;
  background: var(--card-bg, var(--color-teal-bg));
}

@media (min-width: 860px) {
  .treatment-card {
    grid-template-columns: 1.05fr 1fr;
  }
}

.treatment-card__body {
  padding: clamp(1.75rem, 4vw, 3rem);
  display: flex;
  flex-direction: column;
  gap: 1.1rem;
  padding-top: 0;

}

.treatment-card__icon {
  width: 68px;
  height: 84px;
  border-radius: 0 0 40px 40px;
  background: var(--card-accent, var(--color-teal));
  display: flex;
  align-items: flex-start;
  justify-content: center;
  padding-top: 14px;
}

/* The badge supplies the card's accent colour, so the mark itself should be
   white on transparent — an <img> can't inherit `stroke` the way the old
   inline SVG did. */
.treatment-card__icon img {
  width: 50px;
  height: auto;
  object-fit: contain;
}

.treatment-card .dc-h3 {
  font-size: clamp(1.5rem, 2.6vw, 2rem);
}

.treatment-card__tags {
  display: flex;
  flex-wrap: wrap;
  gap: 0.6rem;
  margin: 0.25rem 0 0.5rem;
}

.treatment-card__tags .tag-pill {
  font-size: 0.78rem;
  font-weight: 600;
  letter-spacing: 0.02em;
  padding: 0.5rem 1rem;
  border-radius: var(--radius-pill);
  border: 1px solid var(--card-accent, var(--color-teal));
  color: var(--color-ink);
  background: rgba(255, 255, 255, 0.5);
}

.treatment-card__actions {
  display: flex;
  gap: 0.75rem;
  flex-wrap: wrap;
}

.treatment-card__actions .dc-btn--primary {
  background: var(--card-accent, var(--color-teal));
  box-shadow: none;
}

.treatment-card__actions .dc-btn--outline {
  border-color: var(--color-ink);
}

.treatment-card__media {
  position: relative;
  /* min-height: 260px; */
  min-height: 324px;
}

.treatment-card__media .ph-media {
  position: absolute;
  inset: 0;
  border-radius: 0;
}

.treatment-card__media img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position:top;
}

.treatment-card--hair {
  /* --card-bg: var(--color-teal-bg);  */
  --card-accent: var(--color-teal);
  background: linear-gradient(180deg, #EDFCFF 0%, #FFFFFF 100%);
  border: 1px solid #D1EBF0;;
}

.treatment-card--skin {
  background: linear-gradient(180deg, #FFF6E3 0%, #FFFFFF 100%);
  border: 1px solid #ECE0C9;
    /* --card-bg: var(--color-gold-bg);  */
    --card-accent: var(--color-gold);
}

.treatment-card--beauty {
  background: linear-gradient(180deg, #FFE7DD 0%, #FFFFFF 100%);
  border: 1px solid #ECD1C6;
    /* --card-bg: var(--color-terracotta-bg);  */
   --card-accent: var(--color-terracotta);
}
/* --------------------------------------------------------------------------
   Small-screen card budget
   The stack only works while a card is shorter than the scrollport. Stacked
   single-column the card came to ~900px, which overflows every phone, so the
   pieces that cost the most height are trimmed: the photo, the badge, the
   tag pills (four wrapped rows at 390px) and the buttons (two rows).
   -------------------------------------------------------------------------- */
@media (max-width: 859px) {
  /* Scales with the viewport so a tablet still gets a proper photo while a
     small phone stays inside the height budget. */
  /* .treatment-card__media { min-height: clamp(150px, 26vw, 230px); } */

  .treatment-card__body {
    padding: clamp(1.1rem, 4vw, 1.75rem);
    padding-top: 0;
    gap: 0.7rem;
  }

  .treatment-card__icon {
    width: 54px;
    height: 64px;
    border-radius: 0 0 32px 32px;
    padding-top: 10px;
  }
  .treatment-card__icon img { width: 36px; }

  .treatment-card .dc-h3 { font-size: clamp(1.25rem, 5vw, 1.5rem); }

  .treatment-card__tags { gap: 0.4rem; margin: 0 0 0.15rem; }
  .treatment-card__tags .tag-pill { font-size: 0.7rem; padding: 0.32rem 0.6rem; }

  /* Both buttons on one row rather than two. */
  .treatment-card__actions { gap: 0.5rem; flex-wrap: nowrap; }
  .treatment-card__actions .dc-btn {
    padding: 0.62rem 0.9rem;
    font-size: 0.82rem;
    flex: 1 1 auto;
    min-width: 0;
  }
}

/* The tags are links to their treatment pages now, so they need an affordance.
   Colour and border come from the card's accent, as the resting state does. */
.treatment-card__tags a.tag-pill { transition: background var(--dur) var(--ease), border-color var(--dur) var(--ease); }
.treatment-card__tags a.tag-pill:hover,
.treatment-card__tags a.tag-pill:focus-visible {
  background: #fff;
  border-color: var(--color-ink);
}


/* ==========================================================================
   Results — fanned deck carousel
   (was css/results.css)
   ========================================================================== */

/* ==========================================================================
   Results worth showing (carousel)
   ========================================================================== */

.results { background: var(--color-surface); }

.filter-pills {
  display: flex;
  gap: 0.6rem;
  flex-wrap: wrap;
  justify-content: center;
  margin-bottom: 2.5rem;
}
.filter-pill {
  padding: 0.65rem 1.4rem;
  border-radius: var(--radius-pill);
  border: 1px solid var(--color-border);
  background: #fff;
  font-weight: 600;
  font-size: 0.9rem;
  color: var(--color-ink);
  transition: background var(--dur) var(--ease), color var(--dur) var(--ease), border-color var(--dur) var(--ease);
}
.filter-pill.is-active {
  background: var(--color-coral);
  border-color: var(--color-coral);
  color: #fff;
}

/* --------------------------------------------------------------------------
   Fanned result deck
   All cards are stacked at the centre and placed purely by transform, driven
   by three custom properties that initResultsCarousel() writes per card:
     --offset  signed position in the fan, sets sideways travel and tilt
     --dist    absolute position, sets how far the card drops and shrinks
     --depth   integer rank from the middle, sets paint order
   With an odd --fan-visible the active card sits dead centre and upright;
   with an even one the group is centred instead, so the two middle cards
   straddle the centre line (offsets ±0.5) — a hand-of-cards fan.
   Keeping the geometry here means the look is tunable without touching JS.
   -------------------------------------------------------------------------- */
.results-carousel {
  /* How many cards are on stage. Every one of them is fully visible — no
     half cards bleeding off the edges — so the spread is capped by the
     stage width rather than fixed (see initResultsCarousel). */
  --fan-visible: 3;                       /* desktop, laptop and tablet */

  --fan-card: clamp(280px, 72vw, 370px);
  --fan-x-max: 1.205;                     /* widest spread, in card widths */
  --fan-x: calc(var(--fan-card) * var(--fan-x-max));  /* JS narrows this to fit */
  --fan-y: 46px;                          /* how far each step drops */
  --fan-rot: 15deg;                       /* tilt added per step */
  --fan-scale: 0;                         /* reference keeps all cards one size */
  --fan-edge: 16px;                       /* breathing room at the screen edges */

  position: relative;
  /* Clips the fan at the viewport edges; also why this block sits outside
     .dc-container, so the outer cards reach the screen edge rather than the
     container's gutter. */
  overflow: hidden;
  padding-block: 1rem;
}

/* Three cards will not share a narrow stage without burying each other, so
   the card has to track the stage continuously. A stepped value cannot: the
   old 300px/370px pair at the 1099px breakpoint left the deck overlapping by
   35px just below it and 57px just above, because the spread the JS can
   afford grows smoothly while the card jumped. */
@media (max-width: 1399px) {
  .results-carousel { --fan-card: clamp(210px, 25.5vw, 370px); }
}
/* Three cards only start fitting around 900px: below that they would have to
   drop under ~190px each, which is smaller than the before/after photos can
   usefully be. Two, at a readable size, beats three buried in each other. */
@media (min-width: 768px) and (max-width: 899px) {
  .results-carousel {
    --fan-visible: 2;
    --fan-card: clamp(240px, 33vw, 300px);
  }
}

@media (max-width: 767px) {
  .results-carousel {
    --fan-visible: 1;                       /* mobile: one card, upright */
    /* With a single card on stage there is nothing to make room for, so it
       fills the screen instead of inheriting the three-up tablet width —
       that was leaving ~85px of dead space either side of a 220px card. */
    --fan-card: min(88vw, 560px);
    --fan-edge: 10px;
  }
}

.results-carousel__stage {
  position: relative;
  /* Horizontal gestures are ours, vertical ones stay with the page so the
     slider never traps scrolling on a phone. */
  touch-action: pan-y;
  cursor: grab;
  user-select: none;
  -webkit-user-select: none;
}
.results-carousel__stage:active { cursor: grabbing; }

/* Cards outside the active category are out of the flow entirely. */
.result-card[hidden] { display: none; }

.results-carousel__stage {
  /* Replaced with the measured tallest card + fan drop by JS; this is the
     no-JS fallback. */
  height: 560px;
}

.result-card {
  position: absolute;
  top: 0;
  left: 50%;
  width: var(--fan-card);
  transform:
    translateX(calc(-50% + var(--offset, 0) * var(--fan-x)))
    translateY(calc(var(--dist, 0) * var(--fan-y)))
    rotate(calc(var(--offset, 0) * var(--fan-rot)))
    scale(calc(1 - var(--dist, 0) * var(--fan-scale)));
  /* Centre card on top, each step further back. */
  z-index: calc(10 - var(--depth, 0));
  transition: transform 460ms var(--ease), opacity 460ms var(--ease);
}

/* Anything past the second step is off-stage: hidden from the a11y tree too,
   not just faded, so screen readers don't announce cards nobody can see. */
.result-card[data-offstage] {
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
}

/* Side cards act as the "previous / next" affordance — the design has no
   arrow buttons, so without this the dots would be the only control. */
.result-card:not([data-active]) { cursor: pointer; }

@media (prefers-reduced-motion: reduce) {
  .result-card { transition: none; }
}

.result-card {
  background: #F5F5F5;
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-card);
  padding: 0.5rem ;
  border: 1px solid #E0E0E0
}
.result-card__photos {
  display: flex;
  gap: 0.5rem;
}
.result-card__photos .ph-media {
  flex: 1;
  aspect-ratio: 4 / 5;   /* portrait, as in the reference */
  border-radius: 12px;
  position: relative;
  overflow: hidden;
}
.result-card__photos img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.result-card__photos .tag {
  position: absolute;
  left: 50%;
  bottom: 0;
  transform: translateX(-50%);
  font-size: 0.7rem;
  font-weight: 700;
  color: #fff;
  padding: 0.25rem 0.6rem;
  border-radius: 6px;
  z-index: 1;
}
.result-card__photos .tag--before { background: rgba(30,26,24,0.82); }
.result-card__photos .tag--after { background: var(--color-coral); }

.result-card__caption {
  padding: 1rem 0.25rem 0;
  text-align: center;
  font-style: italic;
  color: var(--color-ink);
}
.result-card__caption strong { color: var(--color-coral); font-style: italic; }

.result-card__meta {
  display: grid;
  grid-template-columns: 1fr 1fr;
  margin-top: 1.1rem;
  border-top: 1px solid var(--color-border);
  font-size: 0.85rem;
}
.result-card__meta div {
  padding: 0.85rem 0.25rem;
  text-align: center;
  color: var(--color-body);
}
.result-card__meta div:first-child { border-right: 1px solid var(--color-border); }
.result-card__meta strong { color: var(--color-ink); }

.results-carousel__dots {
  display: flex;
  justify-content: center;
  gap: 6px;
  margin-top: 1.75rem;
}
/* Every dot is a pill in the reference, not a circle — the active one is
   just longer and coral. */
.results-carousel__dots button {
  width: 15px;
  height: 5px;
  border-radius: 3px;
  background: var(--color-border);
  border: none;
  padding: 0;
  transition: width var(--dur) var(--ease), background var(--dur) var(--ease);
}
.results-carousel__dots button.is-active {
  width: 38px;
  background: var(--color-coral);
}


/* ==========================================================================
   Doctors — expand / collapse pair
   (was css/doctors.css)
   ========================================================================== */

/* ==========================================================================
   Two Dermatologists (expand / collapse toggle)
   ========================================================================== */

.doctors { background: var(--color-surface-alt); }

.doctors__grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 1.25rem;
}
@media (min-width: 860px) {
  /* The OPEN card takes the wide column. The old rule matched any open card
     and always widened the second column, so opening the first card handed
     the space to the collapsed one instead. Match on position, not presence. */
  .doctors__grid {
    grid-template-columns: 2.2fr 1fr;
    /* The swap lives here, on the grid — the transition used to sit on
       .doctor-card, which never changes these tracks, so the columns jumped.
       Both states are two fr tracks, so they interpolate.

       The !important is not decoration. The site's main.css carries
       `* { transition-property: transform, opacity !important }`, which
       loads after this file and otherwise strips every transition on the
       page down to those two properties. Longhand, because only an
       !important declaration of the same sub-property can outrank it, and
       .doctors__grid (0-1-0) beats the universal selector (0-0-0). */
    transition-property: grid-template-columns !important;
    transition-duration: var(--dur-slow, 420ms) !important;
    transition-timing-function: var(--ease) !important;
  }
  .doctors__grid:has(> .doctor-card:last-child[data-open="1"]) {
    grid-template-columns: 1fr 2.2fr;
  }
  /* While the columns slide, initDoctorToggle pins the row to the height it
     already had and clips the cards. The incoming card's copy is laid out in
     a column that is still narrow for those few frames, so it wraps to twice
     its final height — without this the row lurched 445 -> 690 -> 445px on
     what should be a purely sideways move. transition-delay cannot help:
     coming out of `display: none`, the flip happens at the start of the
     transition no matter what delay is set. */
  .doctors__grid.is-swapping { overflow: hidden; }
  .doctors__grid.is-swapping > .doctor-card { overflow: hidden; }
}

.doctor-card {
  background: #fff;
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-card);
  --pad: clamp(1.5rem, 3vw, 2.25rem);
  --media-inset: 9px;      /* portrait stops just short of the card edge */
  padding: var(--pad);
  display: grid;
  gap: 1.5rem;
  /* The card's own inner split (portrait beside the copy) changes at the
     same moment, so it rides the same curve as the grid above it. */
  /* Same reason as the grid above — see the note there on main.css. */
  transition-property: grid-template-columns, box-shadow !important;
  transition-duration: var(--dur-slow, 420ms), var(--dur) !important;
  transition-timing-function: var(--ease) !important;
}

.doctor-card[data-open="1"] {
  grid-template-columns: 1fr;
}
@media (min-width: 640px) {
  .doctor-card[data-open="1"] { grid-template-columns: 1.1fr 1fr; align-items: stretch; }
}

.doctor-card__info { display: flex; flex-direction: column; gap: 0.9rem; }

.doctor-card__name { font-size: 1.6rem; }
.doctor-card__cred {
  font-size: 0.78rem;
  font-weight: 700;
  letter-spacing: 0.03em;
  color: var(--color-coral-dark);
}

.doctor-card__divider { border: none; border-top: 1px solid var(--color-border); margin: 0.4rem 0; }

.doctor-card__checklist { display: flex; flex-direction: column; gap: 0.65rem; }
.doctor-card__checklist li {
  display: flex;
  align-items: flex-start;
  gap: 0.65rem;
  font-size: 0.92rem;
  color: var(--color-body);
}
.doctor-card__checklist .check-icon {
  flex: none;
  width: 20px; height: 20px;
  border-radius: 50%;
  background: var(--color-coral);
  display: grid;
  place-items: center;
  margin-top: 0.15rem;
}
.doctor-card__checklist .check-icon svg { width: 11px; height: 11px; stroke: #fff; }

.doctor-card__actions {
  display: flex;
  gap: 0.75rem;
  flex-wrap: wrap;
  margin-top: 0.25rem;
}

/* The portrait runs almost to the card's edge in the design, so it bleeds
   back out through the card's own padding rather than sitting inside it. */
.doctor-card__media {
  --bleed: calc(-1 * (var(--pad) - var(--media-inset)));
  border-radius: var(--radius-md);
  overflow: hidden;
  min-height: 320px;
}
@media (min-width: 640px) {
  .doctor-card[data-open="1"] .doctor-card__media {
    margin: var(--bleed) var(--bleed) var(--bleed) 0;
  }
}
.doctor-card--collapsed .doctor-card__media {
  margin: 0 var(--bleed) var(--bleed);
}
.doctor-card__media .ph-media { height: 100%; min-height: 220px; position: relative; }
.doctor-card__media img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  /* The panel crops hard, especially when collapsed into a wide letterbox.
     Default to the top so faces survive; override per card with
     style="--portrait-pos: 70% top" when a subject sits off-centre. */
  object-position: var(--portrait-pos, top center);
}

.doctor-card--collapsed {
  cursor: pointer;
  grid-template-columns: 1fr;
  gap: 1.25rem;
  /* Header sizes to content, portrait takes the rest — otherwise the card
     stretches to match its open neighbour and leaves dead space below. */
  grid-template-rows: auto 1fr;
}
/* Both cards carry the same markup now — state decides what is shown. */
/* The copy that only the open card carries. `display` is not animatable on
   its own, so allow-discrete flips it at the right end of the fade instead
   of snapping the block in and out mid-move. */
.doctor-card__divider,
.doctor-card__checklist,
.doctor-card__actions {
  opacity: 1;
  /* Fades up as the columns arrive. The height it briefly occupies while
     the column is narrow is absorbed by the pinned row above. */
  transition-property: opacity !important;
  transition-duration: var(--dur) !important;
  transition-timing-function: var(--ease) !important;
  transition-delay: 160ms !important;
}
@starting-style {
  .doctor-card[data-open="1"] .doctor-card__divider,
  .doctor-card[data-open="1"] .doctor-card__checklist,
  .doctor-card[data-open="1"] .doctor-card__actions { opacity: 0; }
}
.doctor-card--collapsed .doctor-card__divider,
.doctor-card--collapsed .doctor-card__checklist,
.doctor-card--collapsed .doctor-card__actions {
  display: none;
  opacity: 0;
  /* Out of the flow at once. Fading it first keeps it occupying height in a
     column that is already narrowing, which is the other half of the lurch. */
  transition-property: none !important;
}

.doctor-card[data-open="1"] .doctor-card__toggle { display: none; }

.doctor-card__head {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  gap: 1rem;
}

.doctor-card--collapsed .doctor-card__toggle {
  width: 40px; height: 40px;
  border-radius: 50%;
  border: 1px solid var(--color-border);
  display: grid;
  place-items: center;
  align-self: flex-start;   /* sits level with the name, as in the design */
  flex: none;
  background: none;
}
/* .doctor-card--collapsed .doctor-card__media { min-height: 180px; } */
.doctor-card--collapsed .doctor-card__media .ph-media { min-height: 0; }


/* ==========================================================================
   Why Trust · Experience · Four Steps
   (was css/why-experience-steps.css)
   ========================================================================== */

/* ==========================================================================
   Why Trust DermaClinix
   ========================================================================== */

.why-trust {
  position: relative;
  color: #fff;
  /* Tracks the artwork's 1440x700 proportion so the crop stays close to the
     composition rather than slicing the two rooms unevenly. */
  min-height: clamp(520px, 48vw, 700px);
  display: flex;
  align-items: flex-end;
}
/* clinic.webp is already the two-room composition, seam included, so it goes
   in as one full-bleed photo rather than two panels. */
.why-trust__bg {
  position: absolute;
  inset: 0;
  background: #1c1310;   /* shows through until the photo loads */
}
.why-trust__photo {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
  display: block;
}
.why-trust__scrim {
  position: absolute;
  inset: 0;
  /* clinic_bg.webp already carries its own vignette, so this only has to
     guarantee contrast for the copy — the previous values stacked on top of
     the artwork and crushed the rooms to near-black. */
  background: linear-gradient(0deg, rgba(20,14,11,0.56) 4%, rgba(20,14,11,0.06) 52%, rgba(20,14,11,0) 100%);
}

.why-trust__content {
  position: relative;
  z-index: 2;
  width: 100%;
  /* Wider than the shared 1280px container: the design insets this content
     only ~5.4vw (79px at 1459), where .dc-container was pushing it to 138px. */
  max-width: none;
  padding-inline: clamp(1.25rem, 5.4vw, 82px);
  padding-block: clamp(2rem, 5vw, 3.5rem);
  display: grid;
  grid-template-columns: 1fr;
  gap: 2.5rem;
}
@media (min-width: 860px) {
  .why-trust__content {
    grid-template-columns: 1fr 1fr;
    /* Wide gutter, measured: the design's two columns are 599px each inside
       1301px of content, so ~103px between them. */
    column-gap: clamp(2rem, 7vw, 104px);
    align-items: end;
  }
}

.why-trust__text .dc-h2 {
  color: #fff;
  font-size: clamp(2rem, 3.15vw, 2.9rem);
  margin-bottom: 1.1rem;
}
.why-trust__text p {
  max-width: 54ch;
  margin-bottom: 1.6rem;
  font-size: 1.05rem;
  line-height: 1.65;
  color: rgba(255,255,255,0.88);
}

.why-trust__features {
  display: grid;
  grid-template-columns: repeat(2, minmax(0,1fr));
  gap: 1.75rem 1.25rem;
}
@media (min-width: 620px) {
  /* Content-sized items spread across the column, not four equal tracks.
     The design's badge centres are unevenly spaced (816 / 990 / 1166 / 1314),
     which only happens when each item is as wide as its own label. */
  .why-trust__features {
    display: flex;
    justify-content: space-between;
    align-items: flex-start;
    gap: 1.25rem;
  }
  .why-trust__feature { flex: 0 1 auto; }
}
/* Badge and label are both left-aligned in the design, not centred. */
.why-trust__feature { text-align: left; }
/* The supplied PNGs are complete badges — coral disc and white glyph baked
   in — so there is no CSS circle behind them to double up on. */
.why-trust__icon {
  display: block;
  width: 70px;
  height: 70px;
  margin: 0 0 0.9rem;
}
.why-trust__feature span {
  display: block;
  /* Caps the wrap at two lines without making every label the same width —
     a uniform cap forces evenly spaced badges, and the design's are not. */
  max-width: 7.5em;
  font-weight: 700;
  font-size: 0.95rem;
  line-height: 1.3;
  letter-spacing: 0.02em;
  text-transform: uppercase;
}

/* ==========================================================================
   Your Experience, Measured Honestly
   ========================================================================== */

.experience { background: var(--color-surface-alt); }
.experience__grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 1.5rem;
}
@media (min-width: 720px) {
  .experience__grid { grid-template-columns: 1fr 1fr; }
}
.metric-card {
  background: #fff;
  border: 1px solid var(--color-border-coral);
  border-radius: var(--radius-lg);
  padding: clamp(1.5rem, 3vw, 2.25rem);
}
.metric-card__code {
  font-size: 21px;
  color: var(--color-coral);
  font-weight: 700;
  letter-spacing: 0.02em;
  margin-bottom: 0.6rem;
  display: block;
}
.metric-card .dc-h3 { font-size: 1.35rem; margin-bottom: 0.75rem; }
.metric-card p { font-size: 0.95rem; }

/* ==========================================================================
   Four Steps timeline
   ========================================================================== */

/* No bottom padding: the progression photo is meant to sit flush on the
   section's bottom edge, so the shoulders run into the next section rather
   than floating above a band of white. */
.steps {
  position: relative;
  overflow: hidden;
  padding-bottom: 0;
}
.steps__timeline {
  position: relative;
  display: grid;
  grid-template-columns: 1fr;
  gap: 2.5rem;
}
@media (min-width: 760px) {
  .steps__timeline {
    grid-template-columns: repeat(4, minmax(0,1fr));
    gap: 1.5rem;
  }
  .steps__timeline::before {
    content: "";
    position: absolute;
    top: 46px;
    left: 5%;
    right: 5%;
    height: 1px;
    background: var(--color-border-coral);
    /* background: var(--color-border); */
    z-index: 0;
  }
}

.step {
  text-align: center;
  position: relative;
  z-index: 1;
}
.step__icon {
  width: 92px; height: 92px;
  margin: 0 auto 1.25rem;
  background: var(--color-coral);
  transform: rotate(45deg);
  border-radius: 22px;
  display: grid;
  place-items: center;
  box-shadow: 0 14px 24px rgba(232,132,107,0.35);
}
.step__icon svg { transform: rotate(-45deg); width: 38px; height: 38px; stroke: #fff; }
/* The badge is rotated 45deg, so its contents are counter-rotated. The
   supplied PNGs are white glyphs on transparent and vary in aspect, so
   `contain` keeps them all to one optical size. */
.step__icon img {
  transform: rotate(-45deg);
  width: 40px;
  height: 40px;
  object-fit: contain;
}

.step__label {
  font-size: 0.78rem;
  font-weight: 700;
  letter-spacing: 0.04em;
  color: var(--color-ink);
  margin-bottom: 0.4rem;
}
.step .dc-h3 { color: var(--color-coral); font-size: 1.4rem; margin-bottom: 0.6rem; }
.step p { font-size: 0.92rem; max-width: 32ch; margin-inline: auto; }

.steps__result {
  position: relative;
  margin: clamp(2rem, 6vw, 4rem) auto 0;
  /* Sized so the artwork's own circle lands at ~455px, as in the design. */
  max-width: 620px;
  margin-top:0;
  bottom: -75px;

}
.steps__result img {
  position: relative;
  z-index: 1;
  display: block;
  width: 100%;
  height: auto;
}

/* Oversized wordmark washed in behind the photo. It is deliberately much
   wider than its 460px parent — .steps clips the overhang. */
.steps__watermark-text {
  position: absolute;
  top: 32%;
  left: 50%;
  transform: translate(-50%, -50%);
  z-index: 0;
  font-family: var(--font-serif);
  font-size: clamp(4rem, 17vw, 16rem);
  line-height: 1;
  color: rgba(232, 132, 107, 0.13);
  white-space: nowrap;
  pointer-events: none;
  user-select: none;
}

/* --------------------------------------------------------------------------
   Why Trust — small screens
   The desktop scrim is bottom-weighted because the copy sits in the lower
   band beside the photo's bright rooms. Stacked on mobile the copy runs the
   full height, so the heading landed on bare, near-white photo. Darken the
   whole panel instead, and keep the gradient so the rooms still read.
   -------------------------------------------------------------------------- */
@media (max-width: 859px) {
  .why-trust {
    min-height: 0;
    align-items: stretch;
  }
  .why-trust__scrim {
    background: linear-gradient(180deg,
      rgba(20,14,11,0.74) 0%,
      rgba(20,14,11,0.62) 40%,
      rgba(20,14,11,0.70) 75%,
      rgba(20,14,11,0.80) 100%);
  }
  .why-trust__content {
    padding-block: clamp(2.25rem, 8vw, 3rem);
    gap: 2rem;
  }
  .why-trust__text .dc-h2 { font-size: clamp(1.7rem, 7vw, 2.2rem); }
  .why-trust__text p { font-size: 1rem; margin-bottom: 1.4rem; }
}

/* --------------------------------------------------------------------------
   Why Trust — tablet / small-laptop band
   min-height floors at 520px under ~1080px while the copy keeps its size, so
   the bottom-anchored heading climbs from 59% of the panel at 1459px to 37%
   at 860px — clear of the bottom-weighted scrim, on bare photo (1.7:1 at
   860px). Carry the dark band far enough up to cover it wherever it lands.
   -------------------------------------------------------------------------- */
@media (min-width: 860px) and (max-width: 1279px) {
  .why-trust__scrim {
    background: linear-gradient(0deg,
      rgba(20,14,11,0.74) 0%,
      rgba(20,14,11,0.68) 42%,
      rgba(20,14,11,0.60) 64%,
      rgba(20,14,11,0.28) 84%,
      rgba(20,14,11,0.04) 100%);
  }
}


/* ==========================================================================
   Outcome accordion · Five Principles · As Featured In
   (was css/outcome-principles-featured.css)
   ========================================================================== */

/* ==========================================================================
   Your Outcome Review Schedule (horizontal accordion)
   ========================================================================== */

.outcome {
  position: relative;
  background: linear-gradient(180deg, var(--color-brown-900) 0%, var(--color-brown-500) 100%);
  color: #fff;
}
.outcome .dc-h2 { color: #fff; text-align: center; margin-bottom: 2.5rem; }

.outcome__row {
  display: flex;
  flex-direction: column;
  gap: 1.25rem;
}
@media (min-width: 1100px) {
  /* Fixed, not min-height. All panels are the same height by design, and a
     min-height lets a mid-transition reflow push the whole row taller for a
     few frames — which reads as a vertical flicker on every toggle. */
  .outcome__row { flex-direction: row; align-items: stretch; height: 500px; }
}

.outcome-panel {
  --panel-pad: 1.5rem;
  background: #fff;
  color: var(--color-ink);
  border-radius: var(--radius-lg);
  /* No horizontal padding on the flex item itself. With `flex-basis: 0` and
     border-box sizing, side padding becomes an inflexible floor that sits
     outside the grow distribution — 48px per panel was quietly compressing
     the 4.3:1 ratio to 3.1:1. The children carry the inset instead. */
  padding: 0 0 var(--panel-pad);
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  cursor: pointer;
  /* flex-grow is the only geometry that changes here; naming it rather than
     the `flex` shorthand keeps the shorthand's flex-basis out of it.

     Longhand + !important throughout this section is not decoration. The
     site's main.css carries `* { transition-property: transform, opacity
     !important; transition-duration: .3s !important }`, which silently
     replaced every transition declared here — the panel was snapping between
     two widths with no interpolated frames at all. A universal selector
     carries no specificity, so matching its !important at class level wins. */
  transition-property: flex-grow !important;
  transition-duration: var(--dur) !important;
  transition-timing-function: var(--ease) !important;
  transition-delay: 0s !important;
  position: relative;
  overflow: hidden;
}
@media (min-width: 1100px) {
  /* The open panel is roughly 4.3x a closed one in the design. */
  .outcome-panel { flex: 1; min-width: 0; }
  .outcome-panel[data-open="1"] { flex: 3.5; cursor: default; }
}

/* Pale half-ellipse capping the panel: flat along the top edge, bulging down
   to a point at the centre. The 0/100% vertical radii are what make the
   curve span the badge's whole height rather than a corner of it. */
.outcome-panel__badge {
  width: 100%;
  margin: 0 auto 1.25rem;
  padding: 1.9rem 0.5rem 30px;
  transition-property: width, min-height, padding, font-size, letter-spacing !important;
  transition-duration: var(--dur) !important;
  transition-timing-function: var(--ease) !important;
  transition-delay: 0s !important;
  background: linear-gradient(180deg, #e3948200 0%, #e3948269 100%);
  border-radius: 0 0 50% 50% / 0 0 100% 100%;
  /* Coral on pink — not the white-on-coral the old badge used. */
  color: var(--color-coral);
  font-weight: 700;
  line-height: 1.2;
  font-size: 0.95rem;
  letter-spacing: 0.01em; 
  /* linear-gradient(90deg, #e3948200 32.6%, #e39482cc 100%) */

}
.outcome-panel[data-open="1"] .outcome-panel__badge {
  /* Inset, not full-bleed: in the design the open panel's badge is a near
     circle sitting inside the card, roughly 79% of its width. */
  width: 79%;
  min-height: 178px;
  padding: 3.6rem 1rem 3.6rem;
  font-size: 1.1rem;
  letter-spacing: 0.02em;
}

.outcome-panel__number {
  display: block;
  font-size: 2.1rem;
  line-height: 1;
  font-weight: 700;
}
.outcome-panel__unit {
  display: block;
  margin-top: 0.15rem;
  font-size: 0.72rem;
  letter-spacing: 0.05em;
}

/* `margin-top: auto` here and on the toggle splits the leftover space in
   two, so the title (plus copy, when open) sits centred between the badge
   and the toggle rather than tucked under the badge. */
.outcome-panel .dc-h3 {
  margin-top: auto;
  font-size: 20px;
  line-height: 1.35;
  margin-bottom: 0.6rem;
  padding-inline: 0.6rem;
  /* The collapsed columns are narrower than words like "Stabilisation", so
     let them break instead of spilling outside the card. */
  overflow-wrap: break-word;
  transition-property: font-size, padding, margin !important;
  transition-duration: var(--dur) !important;
  transition-timing-function: var(--ease) !important;
  transition-delay: 0s !important;
}
.outcome-panel[data-open="1"] .dc-h3 {
  font-size: 1.6rem;
  margin-bottom: 0.9rem;
  padding-inline: var(--panel-pad);
}
.outcome-panel p {
  font-size: 0.92rem;
  color: var(--color-body);
  display: none;
  opacity: 0;
  padding-inline: var(--panel-pad);
  /* `display` is not animatable, so the copy used to snap in mid-resize.
     allow-discrete + @starting-style fades it instead.

     This rule is the CLOSING direction and is deliberately near-instant: a
     slow fade-out leaves the copy on screen while its panel narrows to
     ~120px, reflowing it into a thin ragged column — that was the flicker. */
  transition-property: opacity, display !important;
  transition-duration: 80ms, 80ms !important;
  transition-timing-function: linear, linear !important;
  transition-delay: 0s, 0s !important;
  transition-behavior: allow-discrete !important;
}
.outcome-panel[data-open="1"] p {
  display: block;
  opacity: 1;
  max-width: 42ch;
  /* Opening direction. The `display` flip is delayed too, not just the
     fade: allow-discrete switches display at the START of the transition,
     so without this the full paragraph would lay out inside a 117px panel
     for a frame and wrap to ~12 lines before the width catches up. */
  transition-property: opacity, display !important;
  transition-duration: var(--dur), 0s !important;
  transition-delay: 150ms, 150ms !important;
  transition-timing-function: var(--ease), linear !important;
  transition-behavior: allow-discrete !important;
}
@starting-style {
  .outcome-panel[data-open="1"] p { opacity: 0; }
}

/* Centred under the copy, as in the design — it used to hang off the right. */
.outcome-panel__toggle {
  margin-top: auto;
  width: 44px; height: 44px;
  border-radius: 50%;
  background: var(--color-coral);
  border: none;
  color: #fff;
  display: grid;
  place-items: center;
  font-size: 1.35rem;
  line-height: 1;
}
/* The glyph follows the panel's state. It used to be hard-coded in the
   markup, so once you switched panels the closed one still read "−" and
   the newly opened one read "+". */
.outcome-panel__toggle::before { content: "+"; }
.outcome-panel[data-open="1"] .outcome-panel__toggle::before { content: "\2212"; }

/* Faint disc tucked into the open panel's bottom-right corner. Declared on
   every panel so it can fade rather than blink into existence. */
.outcome-panel::after {
  content: "";
  position: absolute;
  right: -46px;
  bottom: -46px;
  width: 150px;
  height: 150px;
  border-radius: 50%;
  background: #fdeae3;
  z-index: 0;
  opacity: 0;
  transition-property: opacity !important;
  transition-duration: var(--dur) !important;
  transition-timing-function: var(--ease) !important;
}
.outcome-panel[data-open="1"]::after { opacity: 1; }
.outcome-panel > * { position: relative; z-index: 1; }

/* ==========================================================================
   Five Principles (carousel)
   ========================================================================== */

.principles {
  background: var(--color-surface);
  /* The photo reaches the section's top and bottom edges, so the vertical
     rhythm lives on the text column instead. */
  padding-block: 0;
  overflow: hidden;
}
.principles__grid {
  display: grid;
  grid-template-columns: 1fr;
  align-items: stretch;
}
@media (min-width: 940px) {
  /* ~48.6 / 51.4, the split measured off the design at 1440px. */
  .principles__grid { grid-template-columns: 1fr 1.06fr; }
}

/* The artwork is 700x780 and the design shows all of it, so give the column
   that ratio rather than letting a shorter text side crop the photo. */
.principles__media { position: relative; min-height: 320px; }
@media (min-width: 940px) {
  .principles__media { aspect-ratio: 700 / 780; }
}
.principles__media img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
}

.principles__text {
  --text-pad-inline: clamp(1.5rem, 4.5vw, 4rem);
  --text-pad-right: clamp(1.5rem, 3vw, 2.5rem);
  /* How far the card track reaches back over the photo. Nothing on mobile,
     where the two stack. */
  --card-overlap: 0px;
  padding: clamp(2.5rem, 5vw, 5rem) var(--text-pad-right) clamp(2.5rem, 5vw, 4rem) var(--text-pad-inline);
  min-width: 0;
  /* The photo column sets the row height, so centre the copy in it rather
     than letting it sit against the top with dead space underneath. */
  align-self: center;
}
/* Must come after the `--card-overlap: 0px` default above: same specificity,
   so source order decides. */
@media (min-width: 940px) {
  .principles__text { --card-overlap: clamp(0px, 9vw, 130px); }
}

.principles__text .dc-h2 { margin-bottom: 1rem; }
.principles__text p { margin-bottom: 1.75rem; }

.principles__carousel {
  position: relative;
  /* Sits above the photo it now overlaps. */
  z-index: 2;
  /* The track runs off the right-hand edge and, on the left, back over the
     photo — so it bleeds out through both of the column's insets. */
  margin-right: calc(-1 * var(--text-pad-right));
  margin-left: calc(-1 * (var(--text-pad-inline) + var(--card-overlap)));
}
.principles__track {
  display: flex;
  gap: 1.25rem;
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  padding-bottom: 0.5rem;
  scrollbar-width: none;
}
.principles__track::-webkit-scrollbar { display: none; }

.principle-card {
  flex: 0 0 clamp(260px, 27vw, 395px);
  scroll-snap-align: start;
  background: var(--color-surface-alt);
  border-radius: var(--radius-md);
  /* Metrics read off the card screenshots: ~38px inset, 82px badge,
     ~22px title, 16px body. */
  padding: 2.4rem;
  /* Badge sits beside the title, with the copy spanning underneath. */
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  column-gap: 1.25rem;
  row-gap: 1.3rem;
  align-items: center;
}
.principle-card .icon-badge {
  grid-column: 1;
  grid-row: 1;
  width: 82px; height: 82px;
  border-radius: 50%;
  background: var(--color-coral);
  display: grid;
  place-items: center;
  margin-bottom: 0;
}
.principle-card .icon-badge svg { width: 34px; height: 34px; stroke: #fff; }
/* Supplied as white glyphs on transparent, so the coral disc stays in CSS. */
.principle-card .icon-badge img {
  width: 40px;
  height: 40px;
  object-fit: contain;
}
.principle-card .dc-h3 {
  grid-column: 2;
  grid-row: 1;
  font-size: 1.35rem;
  line-height: 1.45;
  margin-bottom: 0;
}
.principle-card p {
  grid-column: 1 / -1;
  grid-row: 2;
  font-size: 1rem;
  line-height: 1.6;
  margin-bottom: 0;
}

/* Pills, matching the results deck rather than the old dots. Centred on the
   track, which now starts left of the text column. */
.principles__dots {
  display: flex;
  justify-content: center;
  gap: 10px;
  margin-top: 1.5rem;
}
.principles__dots span {
  width: 22px;
  height: 5px;
  border-radius: 3px;
  background: var(--color-border);
}
.principles__dots span.is-active {
  width: 38px;
  background: var(--color-coral);
}

/* ==========================================================================
   As Featured In
   ========================================================================== */

.featured { background: var(--color-surface-alt); }

/* The design lays this section out on the same 1301px content band as
   why-trust, which is wider than the shared .dc-container (1280 max + 48 pad). */
.featured > .dc-container {
  max-width: none;
  padding-inline: clamp(1.25rem, 5.4vw, 82px);
}

/* Vertical rhythm measured off the design: 66px above the heading's line box,
   31px to the lede, 40px to the grid, 80px under it. */
.featured { padding-block: clamp(2.5rem, 4.9vw, 71px) clamp(3rem, 5.5vw, 80px); }

.featured .section-head {
  /* Narrow enough that "in" starts line two, as in the design. */
  max-width: 620px;
  margin-bottom: clamp(2rem, 2.8vw, 40px);
}
.featured .section-head .dc-h2 {
  font-size: clamp(1.9rem, 3.1vw, 2.82rem);
  margin-bottom: clamp(1.25rem, 1.95vw, 28px);
}
.featured .section-head .lede {
  font-size: clamp(1rem, 1.24vw, 1.125rem);
  line-height: 1.56;
}

.featured__grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0,1fr));
  gap: 17px 19px;
}
@media (min-width: 640px) { .featured__grid { grid-template-columns: repeat(3, minmax(0,1fr)); } }
@media (min-width: 960px) { .featured__grid { grid-template-columns: repeat(5, minmax(0,1fr)); } }

/* Every measurement below is the design's value at a ~1440px frame. The vw
   terms only take over under ~1340px, where five columns leave each card
   around 167px and the fixed sizes would overflow the longest titles. */
.featured-card {
  /* Vertical, light at the foot — the old 160deg ramp ran the other way. */
  /* background: linear-gradient(180deg, #ecc9c1 0%, #f1e7e4 100%); */
  background: linear-gradient(0deg, #e394822b 0%, #e394826b 100%);
  border-radius: 16px;
  padding: clamp(28px, 3.1vw, 41px) clamp(0.85rem, 1.6vw, 1.25rem) clamp(24px, 2.6vw, 35px);
  text-align: center;
}
.featured-card .icon-badge {
  width: clamp(56px, 5.2vw, 70px);
  height: clamp(56px, 5.2vw, 70px);
  border-radius: 50%;
  background: #fff;
  display: grid;
  place-items: center;
  margin: 0 auto clamp(22px, 2.7vw, 35.5px);
  box-shadow: 0 14px 26px rgba(140, 88, 70, 0.42), 0 5px 10px rgba(140, 88, 70, 0.14);
}
.featured-card .icon-badge img {
  /* The source PNGs are 30x30 with the glyph already inset to 24x26 —
     the size the design draws it at — so they render 1:1. */
  width: clamp(24px, 2.2vw, 30px);
  height: clamp(24px, 2.2vw, 30px);
  object-fit: contain;
}
.featured-card .icon-badge svg { width: 26px; height: 26px; stroke: var(--color-coral-dark); }
.featured-card .dc-h3 {
  font-size: clamp(1.05rem, 1.62vw, 1.36rem);
  line-height: 1.3;
  margin-bottom: clamp(9px, 0.95vw, 12.5px);
  overflow-wrap: break-word;
}
.featured-card span {
  display: block;
  text-transform: uppercase;
  font-size: clamp(0.68rem, 0.92vw, 0.775rem);
  line-height: 1.4;
  font-weight: 700;
  /* The design tracks these labels out hard — 0.03em was ~12% too tight. */
  letter-spacing: 0.12em;
  color: var(--color-coral-dark);
  overflow-wrap: break-word;
}
/* The cards are links to the coverage now. Keep the card's own colours
   (and Bootstrap's hover underline off), and lift it slightly on hover. */
a.featured-card {
  display: block;
  color: inherit;
  text-decoration: none;
  transition: transform var(--dur) var(--ease), box-shadow var(--dur) var(--ease);
}
a.featured-card:hover,
a.featured-card:focus-visible {
  color: inherit;
  text-decoration: none;
  transform: translateY(-4px);
  box-shadow: 0 14px 28px rgba(140, 88, 70, 0.18);
}
@media (prefers-reduced-motion: reduce) {
  a.featured-card:hover,
  a.featured-card:focus-visible { transform: none; }
}

/* --------------------------------------------------------------------------
   Five Principles — narrow cards
   The design's badge-beside-title arrangement needs a ~380px card to give
   the heading a usable measure. The card is clamp(260px, 27vw, 395px), so
   that only happens around 1400px and up; below it the title was getting an
   81-145px column and breaking into four lines. Stack the badge above the
   title until the card is wide enough to carry both side by side.
   -------------------------------------------------------------------------- */
@media (max-width: 1399px) {
  .principle-card {
    grid-template-columns: minmax(0, 1fr);
    align-items: start;
    /* 27vw bottomed out at the 260px floor through the whole tablet range,
       which is what left the copy in a 183px column. */
    flex-basis: clamp(300px, 34vw, 395px);
  }
  .principle-card .icon-badge { grid-column: 1; grid-row: 1; }
  .principle-card .dc-h3 { grid-column: 1; grid-row: 2; }
  .principle-card p  { grid-column: 1; grid-row: 3; }
}

/* --------------------------------------------------------------------------
   Five Principles — small screens
   Give the card more of the screen, shrink the furniture, and stop the track
   bleeding off the left: that overlap only exists to reach over the photo,
   and on mobile the photo is stacked above rather than beside.
   -------------------------------------------------------------------------- */
@media (max-width: 700px) {
  .principle-card {
    flex-basis: min(82vw, 340px);
    padding: 1.6rem;
    row-gap: 0.9rem;
  }
  .principle-card .icon-badge { width: 64px; height: 64px; }
  .principle-card .icon-badge img { width: 32px; height: 32px; }
  .principle-card .icon-badge svg { width: 28px; height: 28px; }
  .principle-card .dc-h3 { font-size: 1.15rem; line-height: 1.35; }
  .principle-card p { font-size: 0.95rem; }

  .principles__carousel { margin-left: 0; }
}


/* ==========================================================================
   Video + written testimonials · Consult form · FAQ · Articles · Final CTA
   (was css/testimonials-contact-faq.css)
   ========================================================================== */

/* ==========================================================================
   Video Testimonials
   ========================================================================== */

.video-testimonials__head {
  display: flex;
  flex-wrap: wrap;
  gap: 1.5rem;
  justify-content: space-between;
  align-items: flex-start;
  margin-bottom: 2rem;
}
.toggle-pills { display: flex; gap: 0.6rem; }
.toggle-pill {
  padding: 0.65rem 1.4rem;
  border-radius: var(--radius-pill);
  border: 1px solid var(--color-border);
  background: #fff;
  font-weight: 600;
  font-size: 0.88rem;
}
.toggle-pill.is-active { background: var(--color-coral); border-color: var(--color-coral); color: #fff; }

.video-panel[hidden] { display: none; }

.video-track {
  --vt-gap: 20px;
  display: flex;
  gap: var(--vt-gap);
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  padding-bottom: 0.5rem;
  scrollbar-width: none;
  /* No touch-action override here. This is a real overflow scroller, unlike
     the JS-stepped hero and results carousels, so the browser already gives
     it horizontal swipes and leaves vertical ones to the page. Setting
     pan-y would hand it only vertical and kill swiping altogether, since
     enableDragScroll deliberately ignores non-mouse pointers. */
}
.video-track::-webkit-scrollbar { display: none; }

.video-card {
  position: relative;
  /* Three in view, whatever the container width — a percentage basis rather
     than a fixed px one, so a card never lands half-clipped at the edge. */
  flex: 0 0 calc((100% - 2 * var(--vt-gap)) / 3);
  /* The source thumbnails are YouTube 640x480 stills, so the card is 4:3.
     The files on disk were padded into a 340x460 portrait canvas with black
     bars baked in top and bottom; a 4:3 box plus centred `cover` crops those
     bars back off instead of framing them. */
  aspect-ratio: 640 / 480;
  border-radius: var(--radius-md);
  overflow: hidden;
  scroll-snap-align: start;
  /* The live site's own CSS also has a `.video-card` class, and it sets
     `margin: 0 10px`. It loads after home.css, so at equal specificity it won
     — 20px of extra margin per card on top of the 20px gap, which pushed the
     last card in view over the edge. Zeroed here so the flex-basis maths
     below is the only thing deciding how many cards fit. */
  margin: 0 !important;
  /* It is a <button> now, so undo the UA chrome. */
  padding: 0;
  border: none;
  background: none;
  font: inherit;
  color: inherit;
  text-align: left;
  cursor: pointer;
  display: block;
}
@media (max-width: 767px)  { .video-card { flex-basis: calc((100% - var(--vt-gap)) / 2); } }
@media (max-width: 519px)  { .video-card { flex-basis: 100%; } }

.video-card .ph-media { position: absolute; inset: 0; border-radius: 0; }
.video-card .ph-media img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  /* Centred, because the baked-in letterbox is symmetrical — an off-centre
     origin would keep one bar and eat into the frame on the other side. */
  object-position: center;
  transition-property: transform !important;
  transition-duration: var(--dur) !important;
  transition-timing-function: var(--ease) !important;
}
/* The doctor portraits carry no letterbox, so a centred 4:3 crop would take
   the top off their heads. Bias the origin upward for those only. */
.video-card--overlay .ph-media img { object-position: center 22%; }
.video-card:hover .ph-media img,
.video-card:focus-visible .ph-media img { transform: scale(1.04); }

/* YouTube play badge, on every card in both panels. Centred rather than
   tucked into a corner: it is the affordance that tells you the still opens
   a video, so it wants to sit where the eye lands. */
.video-card__play {
  position: absolute;
  top: 50%;
  left: 50%;
  translate: -50% -50%;
  display: block;
  z-index: 2;
  /* The badge must never become the pointer target. The track is a drag
     scroller that reads `closest('.video-card')` off the event, and hover
     still reaches the card through it this way. */
  pointer-events: none;
  filter: drop-shadow(0 2px 10px rgba(0,0,0,0.45));
  transition-property: scale, filter !important;
  transition-duration: var(--dur) !important;
  transition-timing-function: var(--ease) !important;
}
.video-card__play svg {
  display: block;
  width: 58px;
  height: auto;
}
/* Split into two paths so the plate can light up without touching the arrow. */
.video-card__play-plate {
  fill: #ff0000;
  fill-opacity: 0.88;
  transition-property: fill-opacity !important;
  transition-duration: var(--dur) !important;
  transition-timing-function: var(--ease) !important;
}
.video-card__play-arrow { fill: #fff; }

.video-card:hover .video-card__play,
.video-card:focus-visible .video-card__play {
  scale: 1.09;
  filter: drop-shadow(0 4px 14px rgba(0,0,0,0.55));
}
.video-card:hover .video-card__play-plate,
.video-card:focus-visible .video-card__play-plate { fill-opacity: 1; }

@media (max-width: 767px) { .video-card__play svg { width: 48px; } }
@media (max-width: 519px) { .video-card__play svg { width: 54px; } }

@media (prefers-reduced-motion: reduce) {
  .video-card:hover .video-card__play,
  .video-card:focus-visible .video-card__play { scale: 1; }
}
.video-card__caption {
  position: absolute;
  left: 0; right: 0; bottom: 0;
  padding: 1rem;
  background: linear-gradient(0deg, rgba(0,0,0,0.72), transparent);
  color: #fff;
  z-index: 2;
}
.video-card__caption strong { display: block; font-family: var(--font-serif); font-size: 1.05rem; }
.video-card__caption span { display: block; font-size: 0.78rem; opacity: 0.85; margin-top: 0.15rem; }

.video-nav { display: flex; gap: 0.75rem; margin-top: 1.5rem; justify-content: center; }
.video-nav button {
  width: 44px; height: 44px;
  border-radius: 50%;
  border: 1px solid transparent;
  background: var(--color-surface-alt);
  color: var(--color-ink);
  display: grid;
  place-items: center;
  cursor: pointer;
  transition:
    background var(--dur) var(--ease),
    border-color var(--dur) var(--ease),
    color var(--dur) var(--ease),
    transform var(--dur) var(--ease);
}
/* The track loops, so neither end is ever reached and "the direction that
   still has room" no longer distinguishes the two buttons — both would sit
   in the same state forever. The filled arrow marks the direction of travel
   instead, and flips as soon as you page the other way. */
.video-nav button.is-active { background: var(--color-ink); color: #fff; }
.video-nav button:hover:not(:disabled) {
  background: var(--color-coral);
  border-color: var(--color-coral);
  color: #fff;
}
.video-nav button:active:not(:disabled) { transform: scale(0.93); }
.video-nav button svg { width: 16px; height: 16px; }
.video-nav button:disabled { opacity: 0.4; cursor: not-allowed; }

/* ==========================================================================
   Shorts Testimonials — YouTube Shorts that play inside their own card.
   Borrows the heading row (.video-testimonials__head), play badge
   (.video-card__play) and arrow buttons (.video-nav) from the section above;
   everything else is its own class so neither controller sees the other.
   ========================================================================== */
.shorts-track {
  --st-gap: 20px;
  display: flex;
  gap: var(--st-gap);
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  padding-bottom: 0.5rem;
  scrollbar-width: none;
  cursor: grab;
  overflow-anchor: none;          /* see buildLoop — clones go in front */
}
.shorts-track::-webkit-scrollbar { display: none; }
.shorts-track.is-dragging {
  cursor: grabbing;
  scroll-behavior: auto;
  scroll-snap-type: none;
  user-select: none;
  -webkit-user-select: none;
}

/* Shorts are 9:16, so the card is too — the player then fills it with no
   black bars once it takes over. Four up keeps a card from towering. */
.shorts-card {
  position: relative;
  flex: 0 0 calc((100% - 3 * var(--st-gap)) / 4);
  aspect-ratio: 9 / 16;
  border-radius: var(--radius-md);
  overflow: hidden;
  scroll-snap-align: start;
  background: #111;
}
@media (max-width: 1099px) { .shorts-card { flex-basis: calc((100% - 2 * var(--st-gap)) / 3); } }
@media (max-width: 767px)  { .shorts-card { flex-basis: calc((100% - var(--st-gap)) / 2); } }
/* Phones: one card with the next one peeking in, so it still reads as a row. */
@media (max-width: 519px)  { .shorts-card { flex-basis: 72%; } }

.shorts-card__thumb {
  position: absolute;
  inset: 0;
  display: block;
  width: 100%;
  height: 100%;
  padding: 0;
  border: 0;
  background: none;
  cursor: pointer;
}
.shorts-card__thumb img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform var(--dur) var(--ease);
}
.shorts-card__thumb:hover img,
.shorts-card__thumb:focus-visible img { transform: scale(1.04); }
.shorts-card__thumb:hover .video-card__play,
.shorts-card__thumb:focus-visible .video-card__play {
  scale: 1.09;
  filter: drop-shadow(0 4px 14px rgba(0,0,0,0.55));
}
.shorts-card__thumb:hover .video-card__play-plate,
.shorts-card__thumb:focus-visible .video-card__play-plate { fill-opacity: 1; }
@media (prefers-reduced-motion: reduce) {
  .shorts-card__thumb:hover .video-card__play,
  .shorts-card__thumb:focus-visible .video-card__play { scale: 1; }
}

/* Playing: the thumbnail steps aside and the player fills the card. */
.shorts-card.is-playing .shorts-card__thumb { display: none; }

/* Doctor Insight only: these are landscape videos, so the cards go back to
   the old section's layout — 4:3, three in view (two / one on smaller
   screens) — and the crop is biased up so heads are not cut off. */
.shorts-card--doctor {
  aspect-ratio: 640 / 480;
  flex-basis: calc((100% - 2 * var(--st-gap)) / 3);
}
@media (max-width: 767px) { .shorts-card--doctor { flex-basis: calc((100% - var(--st-gap)) / 2); } }
@media (max-width: 519px) { .shorts-card--doctor { flex-basis: 100%; } }
.shorts-card--doctor .shorts-card__thumb img { object-position: center 22%; }
.shorts-card__player {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  border: 0;
}

/* ==========================================================================
   Written Testimonials
   ========================================================================== */

.testimonials { background: var(--color-surface-alt); }

/* Same 1301px content band the rest of the design is laid out on — the
   shared .dc-container is 1184px and indents this section too far. */
.testimonials > .dc-container {
  max-width: none;
  padding-inline: clamp(1.25rem, 5.4vw, 82px);
}
.testimonials { padding-block: clamp(2.5rem, 4.75vw, 69px) clamp(3rem, 6.1vw, 89px); }

.testimonials .section-head {
  /* The heading sits on one line in the design at 752px wide — a narrower
     cap here wrapped it and added a whole line box to the section. */
  max-width: 800px;
  margin-bottom: clamp(2rem, 2.5vw, 36px);
}
.testimonials .section-head .dc-h2 {
  font-size: clamp(1.9rem, 3.1vw, 2.82rem);
  /* The global h2 tracks in by -0.01em; the design's does not, which is the
     whole of the 14px this heading was running short. */
  letter-spacing: normal;
  margin-bottom: clamp(1.25rem, 1.85vw, 27px);
}
.testimonials .section-head .lede {
  font-size: clamp(1rem, 1.24vw, 1.125rem);
  line-height: 1.56;
}

/* Slider rather than a grid: the same native-overflow track the video
   testimonials use, so it inherits drag-to-pan and the seamless loop. */
.testimonials__carousel { position: relative; }
.testimonials__track {
  --tm-gap: 28px;
  display: flex;
  gap: var(--tm-gap);
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  padding-bottom: 0.5rem;
  scrollbar-width: none;
  cursor: grab;
  /* Clones are inserted ahead of the real cards; stop scroll anchoring from
     second-guessing the parked position (see buildLoop). */
  overflow-anchor: none;
}
.testimonials__track::-webkit-scrollbar { display: none; }
.testimonials__track.is-dragging {
  cursor: grabbing;
  scroll-behavior: auto;
  scroll-snap-type: none;
  user-select: none;
  -webkit-user-select: none;
}
.testimonials__track > .testimonial-card {
  flex: 0 0 100%;
  scroll-snap-align: start;
}
/* Three up once each card can carry its quote comfortably — at 780px they
   came out 213px wide, leaving ~139px of text column. */
@media (min-width: 900px) {
  .testimonials__track > .testimonial-card {
    flex-basis: calc((100% - 2 * var(--tm-gap)) / 3);
  }
}
@media (min-width: 600px) and (max-width: 899px) {
  .testimonials__track > .testimonial-card {
    flex-basis: calc((100% - var(--tm-gap)) / 2);
  }
}
.testimonials__nav { margin-top: 1.25rem; }

.testimonial-card {
  /* It is a <blockquote>, so the UA hands it margin: 1em 40px — which was
     shrinking each card by 80px inside its grid track. */
  margin: 0;
  border-top: 3px solid var(--color-coral);
  border-radius: 14px;
  overflow: hidden;
  background: #fff;
  box-shadow: 0 2px 14px rgba(0, 0, 0, 0.07);
  display: flex;
  flex-direction: column;
}
.testimonial-card__quote {
  margin: 0;                       /* UA <p> margin, same story */
  padding: 47px clamp(1.25rem, 2.6vw, 37px) 40px;
  font-style: italic;
  font-size: clamp(1rem, 1.33vw, 1.2rem);
  line-height: 1.66;
  color: var(--color-ink);
  /* Absorbs the difference in quote length so every footer lines up. */
  flex: 1;
}

/* The pink block is notched: its top edge runs level with the card sides
   and dips to a point under the avatar, so the white above shows through as
   a downward wedge. Drawn on a pseudo-element because the avatar has to sit
   over the notch rather than be clipped with it. */
.testimonial-card__footer {
  position: relative;
  text-align: center;
  padding: 2px clamp(1rem, 1.5vw, 1.25rem) 19px;
}
.testimonial-card__footer::before {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, #fcf2ef 0%, #eec8bf 100%);
  /* The design's wedge runs at a 1-in-3 slope, so its depth has to follow
     the card's width — a fixed depth would steepen as the cards narrow.
     clip-path can't take a percentage of its own width, hence the vw. */
  --notch: clamp(26px, 15vw, 90px);
  clip-path: polygon(0 0, 50% var(--notch), 100% 0, 100% 100%, 0 100%);
}
@media (min-width: 900px) {
  .testimonial-card__footer::before { --notch: clamp(40px, 4.7vw, 69px); }
}
.testimonial-card__footer > * { position: relative; }

.testimonial-card__avatar {
  position: relative;
  width: 101px; height: 101px;
  border-radius: 50%;
  margin: 0 auto 24px;
  border: 3px solid #fff;
  background: #fff;
  box-shadow: 0 6px 16px rgba(0,0,0,0.1);
  overflow: hidden;
}
/* The supplied portraits are a 100px circle inside a 120px canvas, inset
   10px at the sides and 5px at the top. Blowing the canvas up by 120% and
   pulling it back by those same insets lands the circle exactly inside the
   ring — at natural size it left a band of backdrop showing around it. */
.testimonial-card__avatar img {
  position: absolute;
  /* left: -10%; */
  left: 0;
  top: -5%;
  width: 120%;
  height: 120%;
  object-fit: cover;
}
.testimonial-card__name {
  display: block;
  color: var(--color-coral);
  font-family: var(--font-serif);
  font-size: clamp(1.1rem, 1.47vw, 1.34rem);
  line-height: 1.3;
  font-style: normal;
  font-weight: 700;
}
.testimonial-card__meta {
  margin-top: 3px;
  font-size: clamp(0.85rem, 1.1vw, 1rem);
  line-height: 1.5;
  color: var(--color-body);
}

/* ==========================================================================
   Contact / Consultation CTA form
   ========================================================================== */

/* Anchor offset for every "Book Appointment" link on the page. The site
   header is position:fixed, so a bare #consult jump parks the section top at
   y=0 and the heading ends up behind it. Measured header heights: 155px at
   >=1100, 145px at 1024, 198px at 768, 127px at <=600 — each value below
   clears its own breakpoint with ~15px to spare. */
#consult { scroll-margin-top: 170px; }
@media (max-width: 1099px) { #consult { scroll-margin-top: 160px; } }
@media (max-width: 1023px) { #consult { scroll-margin-top: 215px; } }
@media (max-width: 767px)  { #consult { scroll-margin-top: 145px; } }

.consult {
  /* Straight vertical ramp in the design, not the 160deg diagonal. */
  background: linear-gradient(180deg, #2a1c18 0%, #8a4f42 100%);
  color: #fff;
  padding-block: clamp(2.5rem, 4.35vw, 63px) clamp(2.5rem, 4.6vw, 67px);
}
/* Same wide content band as the rest of the design; the shared .dc-container
   is on the same element here, so this has to override it. */
.consult .consult__grid {
  max-width: none;
  padding-inline: clamp(1.25rem, 5.23vw, 76px);
}
.consult__grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 2.5rem;
  align-items: center;
}
@media (min-width: 900px) {
  /* 600 / 640 either side of a 56px gutter, measured off the design. */
  .consult__grid {
    grid-template-columns: 600fr 640fr;
    column-gap: clamp(2rem, 3.85vw, 56px);
  }
  /* The design sits the copy a few pixels below the card's true centre
     rather than dead centre; this offsets the centring to match. */
  .consult__text { padding-top: 4px; }
}

.consult__text .dc-h2 {
  color: #fff;
  font-size: clamp(1.9rem, 3.08vw, 2.8rem);
  line-height: 1.116;
  letter-spacing: normal;
  margin-bottom: 29px;
}
.consult__text p {
  color: rgba(255,255,255,0.88);
  font-size: clamp(1rem, 1.24vw, 1.125rem);
  line-height: 1.56;
  /* The column governs the wrap — a ch-based cap broke it a word early. */
  max-width: none;
  margin-bottom: 0;
}
.consult__divider {
  border: none;
  border-top: 1px solid rgba(255,255,255,0.19);
  margin: 48px 0 48px;
}
.consult__list { display: flex; flex-direction: column; gap: 20px; }
.consult__list li {
  display: flex;
  gap: 14px;
  align-items: flex-start;
  font-family: var(--font-serif);
  font-size: clamp(1.05rem, 1.38vw, 1.25rem);
  line-height: 1.4;
}
/* Solid white disc with the tick knocked out in the backdrop's brown —
   it used to be a translucent disc with a white tick. */
.consult__list .check-icon {
  flex: none;
  width: 22px; height: 22px;
  border-radius: 50%;
  background: #fff;
  display: grid;
  place-items: center;
  margin-top: 3px;
}
.consult__list .check-icon svg { width: 12px; height: 12px; stroke: #683e34; }

.consult-form {
  background: #fff;
  border-radius: 18px;
  padding: 32px clamp(1.25rem, 3.16vw, 46px) 31px;
  color: var(--color-ink);
  display: flex;
  flex-direction: column;
  gap: 14px;
}
.consult-form input,
.consult-form textarea {
  width: 80%;
  border: none;
  background: #e5e5e5;
  border-radius: var(--radius-pill);
  padding: 0 30px;
  height: 48px;
  font-size: 0.95rem;
  color: var(--color-ink);
  margin:auto;
}
.consult-form input::placeholder,
.consult-form textarea::placeholder { color: #818181; }
.consult-form textarea {
  border-radius: 20px;
  resize: vertical;
  height: 138px;
  min-height: 138px;
  padding: 14px 30px;
  line-height: 1.5;
}
.consult-form input:focus, .consult-form textarea:focus { outline: 2px solid var(--color-coral); outline-offset: 1px; }
.consult-form button {
  align-self: center;
  /* Flat on white in the design — .dc-btn--primary's coral glow shows up as a
     pink halo under the card's own white. */
  box-shadow: none;
  margin-top: 8px;
  width: 130px;
  height: 50px;
  min-width: 0;
  padding: 0;
  border-radius: var(--radius-pill);
}
.consult-form__status { font-size: 0.85rem; text-align: center; }
/* Reserving a line for this pushed the card taller than the design; it only
   ever has content after a submit, so let it take no room until then. */
.consult-form__status:empty { display: none; }
.consult-form__status.success { color: #2f7d4f; }
.consult-form__status.error { color: #c0392b; }

/* ==========================================================================
   FAQ
   ========================================================================== */

.faq { padding-block: 74px 79px; border-bottom: 1px solid #eee0dc; }

/* The design lays this out on the same ~1300px content band as the rest. */
.faq .faq__grid {
  max-width: none;
  padding-inline: clamp(1.25rem, 4.86vw, 70px);
}
.faq__grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 2rem;
  align-items: start;
}
@media (min-width: 900px) {
  /* 448 / 752 either side of a 100px gutter, measured off the design. */
  .faq__grid {
    grid-template-columns: 448fr 752fr;
    column-gap: clamp(2rem, 6.94vw, 100px);
  }
  /* CSS aligns boxes, the design aligns the heading's cap with the top of
     the first card. Pull back the heading's half-leading to match. */
  .faq__text { margin-top: -9px; }
}

.faq__text .dc-h2 {
  font-size: clamp(1.9rem, 3.11vw, 2.8rem);
  line-height: 1.105;
  letter-spacing: normal;
  margin-bottom: 30px;
}
.faq__text p {
  font-size: clamp(1rem, 1.25vw, 1.125rem);
  line-height: 1.56;
  /* The column governs the wrap; a ch cap broke it a word early. */
  max-width: none;
  margin-bottom: 50px;
}
.faq__grid > .dc-btn {
  width: 145px;
  height: 40px;
  min-width: 0;
  padding: 0;
  font-size: 0.95rem;
}

/* "View More" sits outside .faq__text so the single-column layout can stack
   it after the questions — a button offering more of a list reads oddly above
   the list. Desktop puts it straight back under the copy in the left column,
   landing on exactly the same pixels as before: 145x40 at left 70, y 226..266
   on a 1440 viewport. */
@media (min-width: 900px) {
  .faq__grid { grid-template-rows: auto 1fr; row-gap: 0; }
  .faq__text { grid-column: 1; grid-row: 1; }
  .faq-list { grid-column: 2; grid-row: 1 / span 2; }
  .faq__grid > .dc-btn {
    grid-column: 1;
    grid-row: 2;
    justify-self: start;
    align-self: start;
  }
}
@media (max-width: 899px) {
  /* The 50px under the paragraph was the run-up to the button, which no
     longer follows it here; the grid's own 2rem gap takes over. */
  .faq__text p { margin-bottom: 0; }
  .faq__grid > .dc-btn { justify-self: start; }
    .consult-form input, .consult-form textarea{
        width:100%;
    }
}

.faq-list { display: flex; flex-direction: column; gap: 20px; }
/* Sides only: the design's cards have no top or bottom edge, just the two
   verticals curving into the corner arcs. */
.faq-item {
  border: none;
  border-left: 1px solid #dfdfdf;
  border-right: 1px solid #dfdfdf;
  border-radius: 14px;
  overflow: hidden;
}
.faq-item__q {
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  padding: 22px 25px 22px 30px;
  background: none;
  border: none;
  text-align: left;
  font-family: var(--font-serif);
  font-size: clamp(1.05rem, 1.39vw, 1.25rem);
  line-height: 1.4;
  color: var(--color-ink);
  font-weight:700;
}
/* A bare plus, not a ringed one — and drawn rather than typed so its size
   and stroke are exact. */
.faq-item__icon {
  flex: none;
  position: relative;
  width: 24px; height: 24px;
  border: none;
  border-radius: 0;
  font-size: 0;
  color: transparent;
  transition: transform var(--dur) var(--ease);
}
.faq-item__icon::before,
.faq-item__icon::after {
  content: "";
  position: absolute;
  left: 50%; top: 50%;
  background: var(--color-coral);
  transform: translate(-50%, -50%);
}
.faq-item__icon::before { width: 23px; height: 2px; }
.faq-item__icon::after  {
  width: 2px; height: 23px;
  transition: transform var(--dur) var(--ease);
}
/* Open rows read as a minus — the upright stroke collapses into the bar. */
.faq-item[data-open="1"] .faq-item__icon::after {
  transform: translate(-50%, -50%) scaleY(0);
}

/* The open card tightens the gap between question and answer. */
.faq-item[data-open="1"] .faq-item__q { padding-bottom: 18px; }
.faq-item__q {
  transition-property: padding-bottom !important;
  transition-duration: var(--dur) !important;
  transition-timing-function: var(--ease) !important;
}
/* The +/- already animated, but on main.css's 0.3s rather than the site's
   --dur, so it finished out of step with the panel. */
.faq-item__icon,
.faq-item__icon::after {
  transition-property: transform !important;
  transition-duration: var(--dur) !important;
  transition-timing-function: var(--ease) !important;
}

/* A 0fr -> 1fr grid row rather than max-height. The old cap was 320px while
   the answers measure 108-136px, so two thirds of every open and close was
   spent animating empty space — the panel appeared to snap open and then lag
   shut. A single fr track interpolates to the content's real height, and it
   cannot clip if an answer is ever rewritten longer.

   Longhand + !important because main.css carries
   `* { transition-property: transform, opacity !important }`, which had
   replaced the transition declared here: a real toggle moved through just
   2 distinct heights in 50 frames. */
.faq-item__a {
  display: grid;
  /* minmax(0, ...) rather than a bare 0fr. `grid-template-rows: 0fr` means
     minmax(auto, 0fr), and that auto floor is the item's min-content height —
     which includes the paragraph's 24px bottom padding, so a "closed" row
     still stood 24px tall. An explicit 0 floor lets it reach zero. */
  grid-template-rows: minmax(0, 0fr);
  overflow: hidden;
  transition-property: grid-template-rows !important;
  transition-duration: var(--dur) !important;
  transition-timing-function: var(--ease) !important;
}
/* A grid row can only collapse if its content is allowed to be clipped. */
.faq-item__a > * { min-height: 0; overflow: hidden; }
.faq-item[data-open="1"] .faq-item__a { grid-template-rows: minmax(0, 1fr); }
.faq-item__a p {
  padding: 0 30px 24px;
  margin: 0;
  font-size: clamp(0.92rem, 1.15vw, 1.03rem);
  line-height: 1.7;
  opacity: 0;
  transition-property: opacity !important;
  transition-duration: var(--dur) !important;
  transition-timing-function: var(--ease) !important;
}
.faq-item[data-open="1"] .faq-item__a p { opacity: 1; }
/* The global reduced-motion reset uses the universal selector, which carries
   no specificity and so loses to the class-level !important above. Restate it
   here for the parts this section overrode. */
@media (prefers-reduced-motion: reduce) {
  .faq-item__a,
  .faq-item__a p,
  .faq-item__q,
  .faq-item__icon,
  .faq-item__icon::after { transition-duration: 0.01ms !important; }
}


/* ==========================================================================
   Latest Articles
   ========================================================================== */

/* White section, tinted cards — the build had these the other way round. */
.articles {
  background: #fff;
  padding-block: 71px 80px;
}
.articles > .dc-container {
  max-width: none;
  padding-inline: clamp(1.25rem, 4.86vw, 70px);
}
.articles .section-head { margin-bottom: 32px; }
.articles .section-head .dc-h2 {
  font-size: clamp(1.9rem, 3.09vw, 2.78rem);
  letter-spacing: normal;
}

.articles__grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 35px;
}
/* Three up only once each card can carry its title — at 780px they came
   out 211px wide, leaving ~161px of text column. */
@media (min-width: 900px) { .articles__grid { grid-template-columns: repeat(3, minmax(0,1fr)); } }

.article-card {
  background: #f4f4f4;
  border-radius: 16px;
  overflow: hidden;
  display: flex;
  flex-direction: column;
}
/* The supplied still is 410x240; matching its ratio keeps object-fit from
   cropping it. */
.article-card__media { position: relative; aspect-ratio: 410 / 240; }
.article-card__media .ph-media { position: absolute; inset: 0; border-radius: 0; }
.article-card__media .ph-media img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

/* The photo links to the article too (same URL as Read More). */
a.article-card__media { display: block; overflow: hidden; color: inherit; text-decoration: none; }
a.article-card__media .ph-media img { transition: transform 0.5s var(--ease); }
a.article-card__media:hover .ph-media img { transform: scale(1.04); }
@media (prefers-reduced-motion: reduce) {
  a.article-card__media:hover .ph-media img { transform: none; }
}

.article-card__date {
  position: absolute;
  top: clamp(12px, 1.39vw, 20px);
  left: clamp(14px, 1.74vw, 25px);
  /* Reads as a flat neutral grey over the photo in the design. */
  background: rgba(145, 145, 146, 0.92);
  color: #fff;
  font-size: 0.8rem;
  font-weight: 600;
  letter-spacing: 0.01em;
  line-height: 1;
  padding: 12px;
  border-radius: var(--radius-pill);
  z-index: 1;
}

.article-card__body {
  padding: clamp(14px, 1.39vw, 20px) clamp(14px, 1.74vw, 25px) clamp(20px, 2.01vw, 29px);
  display: flex;
  flex-direction: column;
  flex: 1;
}
.article-card__body .dc-h3 {
  font-size: clamp(1.05rem, 1.39vw, 1.25rem);
  line-height: 1.4;
  margin-bottom: 16px;
}
.article-card__body p {
  font-size: clamp(0.85rem, 1vw, 0.9rem);
  line-height: 1.67;
  margin: 0 0 26px;                /* UA <p> margin-top was adding 14px */
  /* Absorbs the difference in title length so every Read More lines up. */
  flex: 1;
}
.article-card__body .dc-btn {
  align-self: flex-start;
  width: 120px;
  height: 36px;
  min-width: 0;
  padding: 0;
  font-size: 0.9rem;
}

/* ==========================================================================
   Final CTA banner
   ========================================================================== */

/* The banner is an inset rounded panel on the same 1300px content band, with
   no vertical padding of its own — the section is the panel. */
.final-cta {
  position: relative;
  color: #fff;
  padding-inline: clamp(1.25rem, 4.86vw, 70px);
  padding-bottom:70px;
}
.final-cta__media {
  position: relative;
  /* No aspect-ratio here: paired with min-height it resolves the other way
     and forces the panel 755px wide, overflowing narrow viewports. Below
     the breakpoint the content sets the height instead. */
  min-height: 320px;
  border-radius: 16px;
  overflow: hidden;
  display: flex;
  align-items: flex-end;
}
@media (min-width: 900px) {
  .final-cta__media { aspect-ratio: 1300 / 551; min-height: 0; }
}
.final-cta__media .ph-media { position: absolute; inset: 0; border-radius: 0; }
.final-cta__media .ph-media img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  /* The 4:3 source is much taller than this 2.36:1 panel. Centring it sat
     40px low against the design; this lifts the crop to match. */
  object-position: center 59%;
}
.final-cta__scrim {
  position: absolute;
  inset: 0;
  /* Solved against the design by comparing the same photo pixels: flat to
     ~40%, a steep ramp to 0.66 by 69%, then easing to 0.79 at the foot. */
  background: linear-gradient(180deg,
    rgba(20,14,11,0) 40%,
    rgba(20,14,11,0.66) 69%,
    rgba(20,14,11,0.74) 85%,
    rgba(20,14,11,0.79) 100%);
}
.final-cta__content {
  position: relative;
  z-index: 2;
  width: 100%;
  max-width: none;
  text-align: center;
  padding: 0 clamp(1.25rem, 3vw, 2.5rem) 39px;
}
.final-cta__content .dc-h2 {
  color: #fff;
  font-size: clamp(1.6rem, 2.78vw, 2.5rem);
  line-height: 1.275;
  /* Regular, not the 600 the global h1-h4 rule sets — at 600 the line ran
     9px wide and read visibly heavier than the design. */
  font-weight: 400;
  letter-spacing: normal;
  /* Narrow enough that "stronger," starts line two, as in the design. */
  max-width: 700px;
  margin: 0 auto 28px;
}
.final-cta__actions { display: flex; gap: 11px; justify-content: center; flex-wrap: wrap; }
.final-cta__actions .dc-btn { height: 40px; padding: 0 2.1rem; }

/* Below the breakpoint the panel is only as tall as its content, which packs
   the heading and buttons into the middle of the frame — where the desktop
   scrim (flat until 40% depth) has not started yet. Give it room and darken
   from the top.

   Placed after the base .final-cta rules on purpose: a media query adds no
   specificity, so sitting above them the later base rule simply won. */
@media (max-width: 899px) {
  .final-cta__media { min-height: 420px; }
  .final-cta__scrim {
    background: linear-gradient(180deg,
      rgba(20,14,11,0.18) 0%,
      rgba(20,14,11,0.55) 38%,
      rgba(20,14,11,0.78) 72%,
      rgba(20,14,11,0.84) 100%);
  }
  .final-cta__content { padding-bottom: clamp(24px, 7vw, 39px); }
  .final-cta__content .dc-h2 { margin-bottom: 22px; }
}

/* --------------------------------------------------------------------------
   Video modal (#video4p)
   Self-contained so the dialog is centred and legible whether or not the
   host site's Bootstrap CSS and custom modal rules are present on the page.
   Scoped to the id throughout, so nothing here can reach another modal.
   -------------------------------------------------------------------------- */
#video4p {
  position: fixed;
  inset: 0;
  z-index: 1055;
  display: none;
  overflow-x: hidden;
  overflow-y: auto;
  background: rgba(20, 14, 11, 0.8);
}
/* `block`, matching what Bootstrap's own JS sets inline. Centring is done on
   the dialog instead of the overlay, so it survives either way — driving it
   from the overlay (display:grid) worked only until Bootstrap overrode the
   display with an inline style of its own. */
#video4p.show { display: block; }
#video4p.show .modal-dialog { opacity: 1; transform: none; }

/* Bootstrap's .modal-dialog-centered technique, restated here so the dialog
   still sits in the middle on pages that do not load Bootstrap's CSS. */
#video4p .modal-dialog {
  display: flex;
  align-items: center;
  min-height: calc(100% - 2rem);
  width: auto;
  max-width: min(960px, calc(100% - 2rem));
  margin: 1rem auto;
  pointer-events: auto;
}
#video4p .modal-content {
  width: 100%;
  position: relative;
  background: #14100e;
  border: none;
  border-radius: 12px;
  overflow: hidden;
  box-shadow: 0 30px 80px rgba(0, 0, 0, 0.45);
}
#video4p .modal-header {
  display: flex;
  justify-content: flex-end;
  align-items: center;
  padding: 0.6rem 0.7rem;
  border: none;
  min-height: 0;
}
#video4p .modBtn {
  width: 38px;
  height: 38px;
  padding: 0;
  border: none;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.14);
  color: #fff;
  display: grid;
  place-items: center;
  cursor: pointer;
  opacity: 1;                      /* Bootstrap dims .btn-close by default */
  transition: background var(--dur) var(--ease);
}
#video4p .modBtn:hover { background: rgba(255, 255, 255, 0.28); }
#video4p .modBtn svg { width: 17px; height: 17px; display: block; }

#video4p .modal-body { padding: 0; }
/* Stands in for Bootstrap's .ratio when that CSS is not on the page. */
#video4p .ratio { position: relative; width: 100%; aspect-ratio: 16 / 9; }
#video4p .ratio > * { position: absolute; inset: 0; width: 100%; height: 100%; }
#video4p .testiIframe { border: 0; display: block; background: #000; }
