/* ==========================================================================
   MyCabin homepage (fresh conversion) — Page Pack frontend CSS
   Scoped entirely under .pp-home (Page Pack Spec §5). Every selector below
   is nested under that root class — no bare element or utility selectors.
   Re-derived independently from source-design/myc-homepage.zip's own
   styles.css — see manifest.json notes for what was migrated to native
   Gutenberg attributes vs. what stays here.

   01  Tokens (scoped custom properties, not :root)
   02  Base resets (scoped)
   03  Section / layout helpers + typography utilities
   04  Buttons, links, icon buttons, dots
   05  Hero + demo-day bars (inline + docked)
   06  Press marquee
   07  Popular homes rail
   08  Two routes
   09  Financing marquee
   10  Proof (video + grid)
   11  Client stories + customer portrait grid
   12  Reviews marquee
   13  Process shortlist (scroll-pinned hero + step rail)
   14  FAQ accordion
   15  Final CTA
   16  Flow-layout margin protection (Page Pack Spec §5 / rule 6)
   17  Desktop layer (min-width: 900px)
   18  Reduced motion
   ========================================================================== */


/* ==========================================================================
   01  TOKENS — scoped to .pp-home, never :root (Page Pack Spec §5, layer 2).
   ========================================================================== */

.pp-home {
  --pp-ink:          #27272C;
  --pp-bone:         #FFFFFF;
  --pp-paper:        #FFFFFF;
  --pp-surface:      #FBF6F3;
  --pp-olive:        #6E5C3C;
  --pp-accent:       #917EBC;
  --pp-accent-soft:  #CDCBFF;
  --pp-scrim:        var(--pp-ink);

  --pp-stone:    color-mix(in oklab, var(--pp-ink) 11%, var(--pp-bone));
  --pp-ink-hair: color-mix(in oklab, var(--pp-ink) 7%,  var(--pp-bone));
  --pp-ink-line: color-mix(in oklab, var(--pp-ink) 13%, var(--pp-bone));

  --pp-ink-72:  color-mix(in oklab, var(--pp-ink) 72%, transparent);
  --pp-ink-56:  color-mix(in oklab, var(--pp-ink) 65%, transparent);
  --pp-bone-80: color-mix(in oklab, var(--pp-bone) 80%, transparent);
  --pp-bone-60: color-mix(in oklab, var(--pp-bone) 60%, transparent);
  --pp-bone-line: color-mix(in oklab, var(--pp-bone) 22%, transparent);

  --pp-maxw:   1280px;
  --pp-gutter: clamp(18px, 4vw, 40px);
  --pp-sec-y:  clamp(64px, 10vw, 136px);
  /* Rail/marquee/demobar gutter — lets those full-bleed components still
     start their first item at the same content column as everything else. */
  --pp-rail-pad: max(var(--pp-gutter), calc((100% - var(--pp-maxw)) / 2 + var(--pp-gutter)));

  --pp-r-pill: 999px;
  --pp-r-card: 11px;
  --pp-r-lg:   10px;
  --pp-r-md:   9px;
  --pp-r-sm:   8px;

  --pp-ease:   cubic-bezier(.22, 1, .36, 1);
  --pp-t-med:  .25s;
  --pp-t-slow: .35s;

  position: relative;
  background: var(--pp-bone);
  color: var(--pp-ink);
  overflow-x: clip;
}


/* ==========================================================================
   02  BASE RESETS (scoped)
   ========================================================================== */

.pp-home h1, .pp-home h2, .pp-home h3, .pp-home h4,
.pp-home p, .pp-home blockquote, .pp-home figure {
  margin: 0;
}
.pp-home a { color: var(--pp-ink); text-decoration: none; }
.pp-home a:hover { color: var(--pp-accent); }
.pp-home img, .pp-home video { max-width: 100%; display: block; }
.pp-home button { font: inherit; color: inherit; }
.pp-home blockquote.wp-block-quote { border: 0; padding: 0; margin: 0; font-style: normal; }
.pp-home blockquote.wp-block-quote p { margin: 0; }


/* ==========================================================================
   03  SECTION / LAYOUT HELPERS
   --------------------------------------------------------------------------
   .pp-section itself carries no horizontal padding, so a full-bleed child
   (a rail or marquee) can still reach the true viewport edge. Any child
   that should instead sit in the normal maxw+gutter content column (the
   equivalent of the source's own `.wrap` div) gets that treatment directly,
   without an extra wrapper block — same visual result, flatter markup.
   ========================================================================== */

.pp-home .pp-section {
  position: relative;
  padding-block: var(--pp-sec-y);
}
.pp-home .pp-section--press  { overflow: hidden; }
/* Plain scoped top hairline — deliberately NOT Gutenberg's native border
   block-support (style.border.top + has-border-color class). That native
   attribute pulled in the theme/global-styles default border-width for the
   other three sides (confirmed live: a 3px solid frame appeared on the
   right/bottom/left of the financing section, from nothing in this pack's
   own files), a class of leak the previous accepted Homepage's own pack
   avoids entirely by never using the native border attribute. */
.pp-home .pp-section--rule-top { border-top: 1px solid var(--pp-ink-hair); }
/* Micro Fix 34: color only. Source's Financing <section> carries
   `style="border-top:1px solid var(--ink-hair)"` (7% ink on bone, the subtle
   hairline token); this rule used --pp-ink-line (13% ink on bone -- the
   heavier row-divider token), so the seam rendered visibly darker. Token
   corrected to the source's --pp-ink-hair (already defined, same formula as
   source's --ink-hair). Width/thickness/position/margins untouched. This class
   is used only by #financing. */
.pp-home .pp-section--homes,
.pp-home .pp-section--proof  { padding-block: clamp(32px, 5vw, 56px); }
.pp-home .pp-section--process {
  padding-top: 0;
  /* Micro Fix 19: the customer-photo mosaic's fade (.pp-portrait-grid-wrap::after,
     just above) already correctly resolves to var(--pp-surface) (#FBF6F3, matching
     source's --surface/--beige exactly) at its terminal stop -- but this section,
     which the mosaic's fade sits inside and which is immediately followed by
     "process", was never given a background-color of its own, so nothing painted
     underneath the fade's endpoint. Source's own process-shortlist <section> class
     list is `section process-shortlist bg-surface`, where `.bg-surface {
     background: var(--surface); }` -- the exact same token/value the fade already
     targets. This pack was missing the .bg-surface-equivalent entirely, leaving
     the section to render at the page's default background instead, producing the
     visible seam. Fixed by reusing the pack's own existing --pp-surface variable
     (already shared with the fade, per this round's preferred strategy) rather
     than introducing a second, independently-hardcoded color. */
  background-color: var(--pp-surface);
}
/* Micro Fix 20, issue 1 (white gap): Micro Fix 19 gave this section the correct
   background-color, but a visible white/lighter band still appeared between the
   mosaic's fade and this section's now-correct background. Root cause: the same
   un-neutralized WordPress default "Flow" block-gap mechanism already found and
   fixed at eight earlier top-level section boundaries this Homepage (Micro Fix
   05/06/07/10/15) -- .pp-section--process is .pp-home's 9th top-level child, and
   had never been added to that neutralization list, so it was silently pushed
   down from the true reviews/process seam by the theme's default block-gap
   margin. Both this section's own padding-bottom:0 (reviews) and padding-top:0
   (this section, confirmed matching source's own `style="padding-top:clamp(60px,
   9vw,120px);padding-bottom:0"` on the reviews <section> and process-shortlist's
   own plain, unpadded top exactly) already left zero intentional gap between
   them -- the visible band was entirely the injected margin, showing the page's
   own base background through the gap. Neutralizing it removes the gap outright;
   no separate "smoothness" fix was needed for issue 2 once this was fixed -- the
   fade's own gradient formula (`linear-gradient(180deg, transparent, var(--pp-
   surface) 78%)`) was re-verified character-for-character identical to source's,
   so the perceived abruptness was this gap creating a hard visual stop right
   after the gradual fade, not an actual difference in the fade itself. */
.pp-home > .pp-section--process {
  margin-block-start: 0;
}
.pp-home .pp-section--reviews {
  overflow: hidden;
  padding-top: clamp(60px, 9vw, 120px);
  padding-bottom: 0;
}

.pp-home .pp-section > .wp-block-heading,
.pp-home .pp-section > p,
.pp-home .pp-section > .pp-routes,
.pp-home .pp-section > .pp-proof-media-grid,
.pp-home .pp-section > .pp-reviews-head,
.pp-home .pp-section > .pp-head-row,
.pp-home .pp-section > .pp-ps-grid,
.pp-home .pp-section > .pp-faq-cols,
.pp-home .pp-section > .pp-stories,
.pp-home .pp-section > .pp-stories-controls,
.pp-home .pp-section > .pp-portrait-grid-wrap,
.pp-home .pp-section > .wp-block-buttons.pp-proof-cta,
.pp-home .pp-section > .wp-block-buttons.pp-reviews-cta {
  box-sizing: border-box;
  max-width: var(--pp-maxw);
  margin-inline: auto;
  padding-inline: var(--pp-gutter);
}
/* Micro Fix 29: `.pp-stories-controls` (mobile-only Customer Stories rail
   controls) was missing from this list -- `.pp-stories` (the rail itself,
   its sibling) was already here, but the controls row underneath it never
   got the same maxw+gutter treatment, so it rendered edge-to-edge against
   the full section width instead of the normal content column: the
   progress indicator sat flush against the true left edge and the arrows
   flush against the true right edge. Source's own controls row (`.rail__
   controls.stories-controls`) sits, like `.stories`, as a direct child of
   `.wrap` -- its own inline `style="padding-inline:0"` only means "no
   padding beyond what .wrap already provides," not "no inset at all." This
   pack has no separate `.wrap` wrapper element (see this section's own
   header comment above); the equivalent inset is applied directly to each
   qualifying child instead, and `.pp-stories-controls` simply wasn't one of
   them. Its own dedicated rule below already set `padding-inline:0` (now
   correctly relying on this shared rule for the actual inset, matching
   source's own equivalent intent) but also `max-width:none`, which is
   removed below since it fought the max-width this rule now provides. */

.pp-home .pp-head-row,
.pp-home .pp-reviews-head {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: 20px 24px;
  flex-wrap: wrap;
}

.pp-home h2.wp-block-heading {
  line-height: 1.04;
  letter-spacing: -.022em;
  font-weight: 500;
}
.pp-home h3.wp-block-heading {
  font-weight: 500;
  letter-spacing: -.018em;
}

.pp-home .pp-lead {
  margin-top: clamp(14px, 2vw, 18px);
  line-height: 1.55;
  color: var(--pp-ink-72);
}
.pp-home .pp-eyebrow {
  margin-top: clamp(28px, 5vw, 40px);
  font-size: 11px;
  font-weight: 400;
  letter-spacing: .18em;
  text-transform: uppercase;
  color: var(--pp-ink-56);
}

.pp-home .pp-mw-16 { max-width: 16ch; }
.pp-home .pp-mw-18 { max-width: 18ch; }
.pp-home .pp-mw-20 { max-width: 20ch; }
.pp-home .pp-mw-24 { max-width: 24ch; }
/* Micro Fix 17, issues A+B: source declares this reviews heading as `h2 h2--xs
   mw-24` -- NOT plain `.h2` -- where `.h2--xs { font-size: clamp(26px,4.6vw,40px);
   line-height:1.08; }` is a genuinely smaller size than plain `.h2`'s
   clamp(30px,6.4vw,58px), the same "wrong preset" bug already found and fixed for
   the Financing heading (Micro Fix 12) and proof-card titles (Micro Fix 13): this
   block uses `"fontSize":"mycabin-heading-xl"` (matching plain .h2), whose
   generated `.has-mycabin-heading-xl-font-size` class carries `!important` from
   WordPress core, so a plain override loses regardless of selector specificity.
   Because `ch` is font-size-relative, "24ch" at the wrong (larger) size renders
   wide enough to consume the ENTIRE .pp-reviews-head flex row on its own -- even
   though `.pp-reviews-head { display:flex; justify-content:space-between; ... }`
   already exactly matches source's `.head-row` mechanism -- leaving no room for
   `.pp-rating` to sit beside it, so `flex-wrap:wrap` (also already correct,
   matching source) wraps the rating onto its own line below. This single font-size
   correction is expected to resolve the header composition (issue A) as a direct
   structural consequence of the heading actually fitting at its correct width, not
   a separate layout fix -- exactly as this round's own instructions anticipated
   ("once the source header-row structure is restored, the cards should naturally
   begin higher" applies equally to the rating fitting beside the heading). */
.pp-home .pp-reviews-head h2.pp-mw-24 {
  font-size: clamp(26px, 4.6vw, 40px) !important;
  /* Micro Fix 18: the font-size fix above (Micro Fix 17) resolved the header
     composition, but the heading still wrapped too EARLY ("What people are /
     saying about MyCabin" instead of source's "What people are saying / about
     MyCabin") -- .pp-mw-24's max-width:24ch was already confirmed correctly
     applying (no competing max-width/width rule exists for this element,
     verified via a full-file search), so the effective available width itself
     was not the problem. The actual cause is the same one already found and
     fixed for every other heading on this page (Mentioned In, Two Routes,
     Financing): the active theme applies `text-wrap: balance` to headings by
     default, which deliberately picks a narrower-than-available wrap width to
     even out line lengths, independent of max-width -- this specific heading
     was simply the one place that override was never added. text-wrap:pretty
     cancels it, letting the already-correct 24ch width actually govern the
     wrap point, matching source's own inherited body-level value (this pack's
     paragraphs already compute text-wrap:pretty by default). */
  text-wrap: pretty;
}
.pp-home .pp-mw-26 { max-width: 26ch; }
.pp-home .pp-mw-34 { max-width: 34ch; }
.pp-home .pp-mw-38 { max-width: 38ch; }
.pp-home .pp-mw-42 { max-width: 42ch; }
.pp-home .pp-mw-46 { max-width: 46ch; }

/* Micro Fix 04 RETRY (v1.0.6): the generic .pp-section > h/p rule above sets
   box-sizing:border-box + margin-inline:auto + padding-inline:var(--pp-gutter) directly
   on these elements (this pack has no separate .wrap ancestor like source does). Three
   distinct bugs compounded in the v1.0.5 attempt, which only overrode max-width:
     1) margin-inline:auto was left unopposed, so the narrower box got centered instead
        of staying flush with the section's own text column (pushed the paragraph right).
     2) box-sizing:border-box subtracted the gutter padding from the ch-based width
        budget, narrowing the usable text width below genuine 34ch/46ch.
     3) the active theme applies `text-wrap: balance` to headings (confirmed live:
        paragraphs already correctly compute `text-wrap: pretty`, matching source's own
        body rule at source-design/homepage-original-new.zip/styles.css:141 -- only
        headings get the theme's balance override), which re-balances line lengths
        independent of max-width and was the dominant cause of the too-narrow wrap.
   Fix: box-sizing:content-box (ch measures pure content, matching source's separate
   wrap-padding architecture), text-wrap:pretty (cancels the theme's heading override,
   matching source's inherited body value), and margin-left:var(--pp-rail-pad) with
   margin-right:0 and padding-inline:0 -- --pp-rail-pad (defined above, already used by
   this pack's own bleed-rail components) is the exact "centered content-column left
   offset + gutter" quantity that plain full-width children (like the eyebrow) resolve
   to via their own max-width:var(--pp-maxw)+margin-inline:auto; using it here decouples
   the narrower elements' horizontal POSITION from their WIDTH, so they align flush with
   the section's text column at every viewport width instead of being independently (and
   differently) centered. Verified live via a disposable diagnostic Draft at 1470/800/500px
   viewports: heading/paragraph/eyebrow text all start at the identical x-offset at every
   width, and the heading wraps as "MyCabin -- the perfect choice for your / next home",
   matching source. */
.pp-home .pp-section--intro h2.pp-mw-34 {
  box-sizing: content-box;
  max-width: 34ch;
  margin-left: var(--pp-rail-pad);
  margin-right: 0;
  padding-inline: 0;
  text-wrap: pretty;
}
.pp-home .pp-section--intro p.pp-mw-46 {
  box-sizing: content-box;
  max-width: 46ch;
  margin-left: var(--pp-rail-pad);
  margin-right: 0;
  padding-inline: 0;
  /* Micro Fix 05: source's .lead rule (styles.css:249-254) sets font-weight:300 --
     the pack's own shared .pp-lead rule never declared it, so this paragraph fell
     back to the inherited body weight (400), rendering visibly heavier than source.
     Font-family, font-size (mycabin-body-l preset), line-height and color (--pp-ink-72)
     were all individually re-verified against source and already matched exactly --
     weight was the one real mismatch. Scoped here (not on the shared .pp-lead class)
     because .pp-lead is also used, unmodified, by the Two Routes and financing
     paragraphs -- both out of scope this round. */
  font-weight: 300;
}

/* Micro Fix 05, issue A: WordPress's default "Flow" layout (this pack's own root
   .pp-home group has no explicit `layout` attribute) generates
   `:where(.is-layout-flow) > * + * { margin-block-start: <theme blockGap> }` --
   the exact mechanism already documented and neutralized for several *inner*
   components in section 16 below, but never applied to .pp-home's own top-level
   section children. .pp-section--intro is the 3rd top-level child (after .pp-hero
   and the normally-hidden .pp-dock), so it silently receives that extra margin on
   top of its own, already-correct `padding-top: var(--wp--preset--spacing--mycabin-
   section-standard)` -- inflating the gap below the brown Demo Day lane beyond what
   source produces (source has no such mechanism: .hero and the "Mentioned In"
   <section> are plain siblings with no injected gap). :where() carries zero
   specificity, so this plain override needs no !important. Scoped to this one
   section only, not a global .pp-home > * reset, per this round's explicit scope --
   the same un-neutralized default likely affects other top-level section boundaries
   pack-wide, but that is out of scope for this round. */
.pp-home > .pp-section--intro {
  margin-block-start: 0;
}

/* Micro Fix 06: the same un-neutralized WordPress Flow block-gap mechanism
   documented for .pp-section--intro above (Micro Fix 05, issue A), one section
   boundary later. .pp-section--homes's own padding-block already matches source
   exactly (clamp(32px, 5vw, 56px), the same reduced value as source's own inline
   `style="padding-top:clamp(32px,5vw,56px)"` on <section id="homes">, deliberately
   smaller than the standard section padding since the marquee immediately above it
   already carries its own clamp(28px,6vw,44px) bottom padding) -- but as .pp-home's
   4th top-level child (after .pp-hero, .pp-dock and .pp-section--intro), it still
   silently receives the theme's default block-gap margin stacked on top of that
   already-correct padding, inflating the gap between the marquee and "Popular
   prefab homes" beyond what source produces (source has no such mechanism: the
   two <section> elements are plain siblings with no injected gap). Scoped to this
   one boundary only, matching the same minimal, non-global pattern as Micro Fix 05. */
.pp-home > .pp-section--homes {
  margin-block-start: 0;
}

/* Micro Fix 07, issue 2: same un-neutralized WordPress Flow block-gap mechanism as
   Micro Fix 05/06 above, one more section boundary along. The "Two Routes" section
   (.pp-section--surface, the top-level sibling immediately after .pp-section--homes)
   already has correct top padding -- var(--wp--preset--spacing--mycabin-section-
   standard), matching source's own plain, un-overridden `.section{padding-block:
   var(--sec-y)}` on <section class="section bg-surface"> exactly, since "Two Routes"
   carries no inline padding-top override in source (unlike "Popular prefab homes",
   which does) -- but as .pp-home's 5th top-level child it was still silently
   receiving the theme's default block-gap margin on top of that already-correct
   padding, inflating the gap below the rail's progress/arrow controls row. Scoped
   via an adjacent-sibling selector (.pp-section--homes + .pp-section--surface)
   rather than the bare .pp-section--surface class, because that class is reused by
   a second, unrelated, strictly out-of-scope section later on the page (the
   "stories" section) -- the sibling combinator matches only the one instance that
   directly follows "Popular prefab homes", since .pp-section--homes itself appears
   exactly once. No content.html change was needed. */
.pp-home > .pp-section--homes + .pp-section--surface {
  margin-block-start: 0;
}

/* Micro Fix 08: "Not starting from scratch?" headline/paragraph width. Source
   (styles.css) declares .mw-18{max-width:18ch} and .mw-42{max-width:42ch} literally
   (confirmed, not inferred from the class names) on this h2/p. This pack's generic
   .pp-section > .wp-block-heading / .pp-section > p rule (3-class / 3-class+element
   specificity) already beats the plain .pp-mw-18/.pp-mw-42 utility classes (2-class),
   the same mechanism already fixed for the "Mentioned In" section (Micro Fix 04
   Retry) -- so this heading/paragraph render at the section's full max-width
   instead of 18ch/42ch. Scoped via the same adjacent-sibling selector as the Micro
   Fix 07 spacing fix above (.pp-section--homes + .pp-section--surface), rather than
   a bare h2.pp-mw-18/p.pp-mw-42 selector, because .pp-mw-18 is reused by two other,
   out-of-scope headings ("stories" and FAQ) and .pp-section--surface itself is
   reused by the out-of-scope "stories" section -- this combinator matches only the
   "Two Routes" instance. Left alignment is explicitly frozen this round (user
   confirmed it is already correct): at the section's CURRENT, un-narrowed width the
   generic rule's max-width:var(--pp-maxw) + margin-inline:auto + padding-inline:
   var(--pp-gutter) (border-box) already resolves to the identical left offset as
   --pp-rail-pad (both variables share the same max(gutter, (100%-maxw)/2+gutter)
   formula) -- so replacing that coupled position+width mechanism with an explicit
   margin-left:var(--pp-rail-pad) + content-box max-width is mathematically the same
   left edge today, but (unlike leaving margin-inline:auto in place) does not shift
   it once the box is narrowed, exactly the same decoupling already proven correct
   for the "Mentioned In" heading/paragraph. text-wrap:pretty on the heading cancels
   the active theme's default text-wrap:balance on headings (already documented and
   fixed the same way for "Mentioned In"'s own heading) so the narrower width
   actually produces natural wrapping instead of a rebalanced, still-wide line; the
   paragraph needs no such override (this pack's paragraphs already compute
   text-wrap:pretty by default, per the same earlier finding). Section padding-top,
   background, and every other rule for this section are untouched. */
.pp-home > .pp-section--homes + .pp-section--surface h2.pp-mw-18 {
  box-sizing: content-box;
  max-width: 18ch;
  margin-left: var(--pp-rail-pad);
  margin-right: 0;
  padding-inline: 0;
  text-wrap: pretty;
}
.pp-home > .pp-section--homes + .pp-section--surface p.pp-mw-42 {
  box-sizing: content-box;
  max-width: 42ch;
  margin-left: var(--pp-rail-pad);
  margin-right: 0;
  padding-inline: 0;
  /* Micro Fix 09: source's shared .lead rule (styles.css) sets font-weight:300 --
     the same property this pack's own shared .pp-lead rule never declared, already
     found and fixed once for the "Mentioned In" paragraph (Micro Fix 05). Font-family
     (Poppins, inherited), font-size (the mycabin-body-l preset, matching source's own
     .lead{font-size:clamp(16px,2vw,20px)}), line-height (1.55) and color (--pp-ink-72,
     matching source's --ink-72 formula) were all re-verified and already match --
     weight was the one real mismatch again. Scoped here (not on the shared .pp-lead
     class) for the same reason as Micro Fix 05: .pp-lead is also used, unmodified, by
     the financing paragraph -- out of scope this round. */
  font-weight: 300;
}

/* Micro Fix 10: source's Financing <section> carries its own
   `style="border-top:1px solid var(--ink-hair)"` directly on the section wrapper --
   no separate divider element. This pack's equivalent, `.pp-section--rule-top {
   border-top: 1px solid var(--pp-ink-line); }` (below), is already structurally
   correct in the same way: a border on the #financing wrapper's own top edge,
   coinciding with its own box's top (border-box), which is exactly where Two
   Routes' own #FBF6F3 background ends and Financing's plain, background-less white
   begins. The reported "floating separator with whitespace above and below it" is
   the same un-neutralized WordPress Flow block-gap margin already found and fixed
   for five earlier section boundaries (Micro Fix 05/06/07) -- #financing is
   .pp-home's 6th top-level child and was never added to that list, so it was
   silently pushed down from the true Two-Routes/Financing seam by the theme's
   default block-gap. Because Financing has no background-color of its own (matching
   source's bg-paper, i.e. the plain page background), that pushed-down gap is
   visually indistinguishable white space -- making the border-top (which moved down
   together with the rest of #financing, still correctly at ITS OWN top edge) look
   like a divider floating independently inside the section, exactly matching the
   report. Fixed the same way as every prior instance: neutralize only this section's
   own top margin, restoring the border to sit exactly at the real background-change
   boundary. Financing's own padding-top (between the border and the heading) is
   untouched, so the heading's spacing below the line is unaffected. */
.pp-home > .pp-section--rule-top {
  margin-block-start: 0;
}

/* Micro Fix 15: same un-neutralized WordPress Flow block-gap mechanism already
   found and fixed at five earlier top-level section boundaries (Micro Fix 05/06/07/
   10). Source: the "proof" <section> (id="proof", "Nothing left to chance.") has no
   own bottom-whitespace element -- its CTA ("Learn more about MyCabin") is simply
   the last child before </section>, and the section's own padding-bottom
   (clamp(32px,5vw,56px), the same reduced value as its padding-top, already correct
   in this pack via .pp-section--proof) provides all the space below it. The
   following "Client stories" <section id="stories"> has no inline padding-top
   override, so it uses the plain, standard `.section{padding-block:var(--sec-y)}`
   rule -- also already correct in this pack via the mycabin-section-standard
   preset. Both paddings individually matched source exactly, but #stories
   (.pp-section--surface's 2nd instance) is .pp-home's next top-level child after
   .pp-section--proof and had never been added to the neutralization list, so it
   silently received the theme's default block-gap margin on top of its own correct
   padding-top -- inflating the gap below the CTA beyond what source produces.
   Scoped via an adjacent-sibling selector (.pp-section--proof + .pp-section--
   surface) rather than the bare .pp-section--surface class, since that class is
   also used by the earlier, already-protected "Two Routes" section -- .pp-section--
   proof appears exactly once, so this combinator matches only the "stories"
   instance. No content.html change needed; the CTA's own position relative to the
   content above it, and "stories"' own internal content, are both untouched. */
.pp-home > .pp-section--proof + .pp-section--surface {
  margin-block-start: 0;
}

/* Micro Fix 11, issues A/B: Financing headline/paragraph width. Source
   (styles.css) declares this heading as `h2 h2--sm mw-26` -- NOT plain `.h2` --
   where `.h2--sm { font-size: clamp(28px, 5.6vw, 52px); line-height: 1.08; }` is a
   genuinely smaller size than plain `.h2`'s clamp(30px,6.4vw,58px). This pack's
   block instead uses the `mycabin-heading-xl` preset (clamp(30px,6.4vw,58px) --
   matches plain .h2, confirmed already correct for "Mentioned In"/"Two Routes",
   but wrong here). Since `ch` is a font-size-relative unit, rendering "26ch" at the
   wrong (larger) font-size produces a wider box than genuine 26ch at .h2--sm's
   actual size -- a real, source-provable typography cause directly essential to
   reproducing the correct width/wrap, not a cosmetic change. Overriding font-size
   only (not the rest of the block's typography) is why the headline still wrapped
   too wide even before considering the max-width specificity conflict below;
   line-height was left untouched, since (unlike font-size) it does not affect
   ch-width math and is not itself a reported defect this round. `.mw-26`/`.mw-46`
   (26ch/46ch, confirmed literal) then lose to the generic `.pp-section > h/p` rule,
   the same specificity conflict already fixed for "Mentioned In" and "Two Routes"
   -- same proven remedy: box-sizing:content-box, text-wrap:pretty (heading only --
   paragraphs already compute text-wrap:pretty by default), and
   margin-left:var(--pp-rail-pad) in place of margin-inline:auto so left alignment
   is preserved instead of re-centering once narrowed (mathematically identical to
   the current, un-narrowed left edge, exactly as established for the two earlier
   sections). Scoped via #financing (a unique id, matching source's own id, no
   markup change needed) rather than a bare selector, since .pp-mw-26 is also used
   by the out-of-scope "Nothing Left to Chance" paragraph and .pp-mw-46 by the
   out-of-scope "Mentioned In" paragraph. Note: this pack's shared .pp-lead rule is
   still missing font-weight:300 (the same latent bug already fixed for "Mentioned
   In" and "Two Routes" in their own dedicated rounds) -- not fixed here, since
   weight is not one of this round's three confirmed issues. */
.pp-home #financing h2.pp-mw-26 {
  box-sizing: content-box;
  max-width: 26ch;
  margin-left: var(--pp-rail-pad);
  margin-right: 0;
  padding-inline: 0;
  text-wrap: pretty;
  /* Micro Fix 12: the Micro Fix 11 font-size correction above never actually took
     effect. WordPress core generates font-size PRESET utility classes (here,
     `.has-mycabin-heading-xl-font-size`, from this block's `"fontSize":
     "mycabin-heading-xl"` attribute) with `!important` baked in
     (wp-includes/class-wp-theme-json.php's preset-class output; the same general
     "Global Styles wins via importance, not specificity" mechanic already found and
     handled for this pack's body font-family, documented in
     class-mgds-fonts.php) -- so a plain, non-important font-size here, even at
     higher selector specificity, always lost to it. This round's `!important` is
     the narrowest possible fix: it targets only this one already-uniquely-scoped
     rule (#financing h2.pp-mw-26, not any shared/global selector), corrects exactly
     one property, and is required specifically because the competing rule is
     itself !important -- not used to "overpower Gutenberg" generally. The
     alternative (removing the `fontSize` attribute from content.html so the
     preset class is never applied at all) was available but rejected in favor of
     staying CSS-only, per this round's explicit file-ownership preference. */
  font-size: clamp(28px, 5.6vw, 52px) !important;
}
.pp-home #financing p.pp-mw-46 {
  box-sizing: content-box;
  max-width: 46ch;
  margin-left: var(--pp-rail-pad);
  margin-right: 0;
  padding-inline: 0;
  /* Micro Fix 12: source's shared .lead rule sets font-weight:300; this pack's
     shared .pp-lead rule never declares one, so this paragraph fell back to the
     inherited body weight (400) -- the same latent bug already fixed for
     "Mentioned In" and "Two Routes" in their own dedicated rounds, flagged but not
     yet fixed here at the time of Micro Fix 11. Font-family, font-size (mycabin-
     body-l preset, already correct), line-height and color were not touched --
     only weight was wrong. No !important needed here: unlike font-size, font-weight
     is not part of WordPress's preset-class system, so this plain declaration in
     the already most-specific rule for this element wins normally. */
  font-weight: 300;
}

/* Micro Fix 35: Financing headline -> paragraph gap, below desktop only.
   Source: `<p class="lead mw-46" style="margin-top:18px">` -- a fixed 18px at every
   width (the heading has `margin:0` via source's reset, so this is the whole gap).
   Pack: the shared `.pp-lead { margin-top: clamp(14px, 2vw, 18px) }` resolves to
   14px at phone widths (2vw < 14px until 700px) and only reaches 18px at 900px, so
   the paragraph sat 4px too close on mobile/narrow tablet. Not a WordPress
   block-gap effect: `.pp-lead` (0,2,0) already beats the flow-layout margin.
   Scoped to #financing's paragraph and the file's existing below-desktop
   breakpoint; at >=900px the shared rule already computes 18px, so desktop is
   untouched. Shared `.pp-lead`, the heading, typography, width and wrapping are
   not changed. */
@media (max-width: 899px) {
  .pp-home #financing p.pp-mw-46 {
    margin-top: 18px;
  }
}

/* Micro Fix 36: Reviews section top -> headline gap, below desktop only.
   Source: `<section class="section clip" style="padding-top:clamp(60px,9vw,120px);
   padding-bottom:0">` directly follows the Customer Stories <section> as a plain
   sibling with no injected gap, so the headline sits exactly clamp(60px,9vw,120px)
   below the seam. This pack's `.pp-section--reviews` padding-top is already that
   same value (rule near the top of this file, unchanged), and the headline/rating
   row add no top space of their own. The extra space is the same un-neutralized
   WordPress Flow block-gap mechanism already fixed at the other top-level section
   boundaries (Micro Fix 05/06/07/10/15): `.pp-home`'s flow layout injects
   `:where(.is-layout-flow) > * + * { margin-block-start: <theme blockGap> }` onto
   this section, stacked above its correct padding. Stories has a #FBF6F3
   background and Reviews none, so the injected margin shows as plain white
   space under the Stories seam, i.e. as extra top padding. Neutralized for this
   one section only (:where() has zero specificity, so no !important), scoped to
   the file's existing below-desktop breakpoint so the accepted desktop layout is
   untouched. The Stories section, the seam, the reviews padding, headline, rating
   row, rail and cards are not changed. */
@media (max-width: 899px) {
  .pp-home > .pp-section--reviews {
    margin-block-start: 0;
  }
}

/* Micro Fix 37: "Simple. Fast. Clear." line wrap, below desktop only. Source:
   `<h2 class="ps-display">` sits in a flex-centered `.ps-hero__inner` with the same
   gutter padding, size (clamp(38px,10vw,52px)), weight, letter-spacing and
   `text-align:center` this pack already has, no width/max-width/white-space rule,
   and inherits `text-wrap: pretty` from source's body (styles.css:141), so it
   wraps greedily: "Simple. Fast." / "Clear." This pack's box, typography and words
   (split into the same inline-block spans by frontend.js) already match; the only
   difference is that the active theme applies `text-wrap: balance` to headings
   (the same override already found for the Mentioned In, Two Routes, Financing and
   Reviews headings), which evens the two lines out as "Simple." / "Fast. Clear."
   Restores the source's `pretty` on this one heading only, inside the file's
   existing below-desktop breakpoint. No width, margin, position, typography, fade
   or markup is changed; at desktop the tagline is a single line, so nothing
   changes there. */
@media (max-width: 899px) {
  .pp-home .pp-ps-display {
    text-wrap: pretty;
  }
}

/* Micro Fix 38: three mobile-only FAQ corrections, all inside the file's existing
   below-desktop breakpoint and all scoped to the FAQ.

   (1) Section top -> headline gap. Source: `<section class="section" id="faq">`
   -> `.section { padding-block: var(--sec-y) }` (clamp(64px,10vw,136px)), a plain
   sibling of the process section with no injected gap. This pack's #faq padding-top
   is the same value (mycabin-section-standard preset, unchanged), but #faq is a
   top-level child of `.pp-home` that was never added to the block-gap
   neutralization list used at the other section boundaries (Micro Fix 05/06/07/10/
   15/36): the flow layout's `:where(.is-layout-flow) > * + * { margin-block-start:
   <theme blockGap> }` stacks on top of its padding, visible as extra white space
   because #faq has no background of its own. Neutralized for this one section.

   (2) Headline wrap. Source: `h2.h2.h2--sm.mw-18` (max-width 18ch) inherits
   `text-wrap: pretty` from body, so it wraps greedily: "Questions people" /
   "ask us." Box, size and max-width already match here; the active theme's default
   `text-wrap: balance` on headings evened it out as "Questions" / "people ask us."
   (the same override fixed for the other headings in earlier rounds). `pretty`
   restored on this one heading. Font size/weight/line-height/width unchanged.

   (3) Wrapped-row breathing room. Source's question is `<h3>` (`.faq h3 { font:
   inherit }`) around a `<button class="faq__q">` (`button { font: inherit }`), and
   neither sets a line-height, so the question renders at the browser's `normal`
   line-height. This pack's question is a real `<h3 class="wp-block-heading">` with
   no line-height of its own, so it inherits the active theme's tighter heading
   line-height, taking a fixed amount off every line: a small loss on a one-line row
   (padding is identical) that adds up on each extra line of a wrapped one. Same
   root cause and same one-property remedy as the Milla 47 pack's FAQ question
   (`line-height: normal`). It is a shared rule on `.pp-faq__q`, not per-question,
   and the row padding, font size/weight and the plus icon (absolutely positioned
   at top:20px) are unchanged. `text-wrap: pretty` (source's inherited value) is
   restored here too so a wrapped question breaks where source's does instead of
   being balanced by the theme. */
@media (max-width: 899px) {
  .pp-home > #faq {
    margin-block-start: 0;
  }
  .pp-home #faq .pp-head-row h2.pp-mw-18 {
    text-wrap: pretty;
  }
  .pp-home .pp-faq__q {
    line-height: normal;
    text-wrap: pretty;
  }
}

/* Micro Fix 11, issue C: bank-marquee -> CTA spacing. Source wraps the CTA in its
   own sibling `<div class="wrap" style="margin-top:clamp(30px,5vw,44px)">`, giving
   it an explicit top margin separate from the marquee's own bottom padding. This
   pack's CTA is a bare `<p><a href="#">How financing works -></a></p>` with no
   margin-top of its own (and, being a plain, unclassed paragraph, is not reached by
   any of the .pp-lead/.pp-mw-* rules elsewhere in this file) -- so the only gap
   above it was whatever the marquee's own bottom padding provided, too small
   relative to source. Reproduces the exact clamp value from source's own inline
   style. Scoped via `#financing p:last-child`, since this CTA paragraph is
   genuinely the last child of #financing -- avoids adding an unnecessary class to
   content.html. */
.pp-home #financing p:last-child {
  margin-top: clamp(30px, 5vw, 44px);
}

/* Micro Fix 13, issue D (base/both breakpoints): source's base `.h3 { font-weight:
   500; }` applies to this feature title at every width, but this pack never sets a
   font-weight for it anywhere (no generic h1-h6/.wp-block-heading weight rule
   exists in this file), so it fell back to whatever the active theme's own default
   heading weight is -- plausibly heavier than source's 500, matching the "too
   heavy" half of the report. Scoped to this section's feature-title heading only
   (.pp-proof-card__head is unique to "Nothing left to chance", confirmed via
   content.html), not a generic h3/.wp-block-heading rule, so other headings
   elsewhere are unaffected. */
.pp-home #proof .pp-proof-card__head h3 {
  font-weight: 500;
}

/* Micro Fix 14 RETRY: "Nothing left to chance." right-content-column vertical
   position. Micro Fix 14's own heading-only rule (`#proof h2.pp-mw-16 {
   margin-top: 0 }`) is REMOVED here -- confirmed the wrong abstraction, per manual
   QA showing the ENTIRE right column (heading + feature grid together, with their
   correct internal relationship preserved) sits low relative to the media, not the
   heading alone. A heading-only offset could only ever have fixed the top element
   while leaving the rest of the stack exactly as displaced as before; it needed
   superseding, not supplementing, to avoid two competing/redundant offset rules.
   Root cause, re-audited at the STACK level: .pp-proof-media-grid's
   align-items:flex-start (confirmed correct, matches source's .proof-media-grid
   exactly) governs the CROSS-AXIS start of both flex items (.pp-proof-media,
   .pp-proof-content) -- but align-items only sets the *default* alignment; an
   individual flex item's own align-self, if ever set to anything other than
   flex-start/auto, would override it for that one item and shift it down
   independent of the container rule, which is otherwise unremarkable and correct.
   No align-self was found set anywhere for .pp-proof-content in this pack's own
   CSS, and neither is one present in source -- but (matching the established
   precedent of external, unauditable-from-this-repo theme-level overrides already
   found for body font-family, font-size !important preset classes, and suspected
   again in the original Micro Fix 14) this is the same category of risk: a value
   this repo's own files cannot rule out. This rule explicitly re-asserts
   align-self:flex-start together with margin-top:0 (source's own implied value for
   this wrapper -- no margin-top exists on `.proof-content` at any width) directly
   on the CONTAINER that owns both the heading and the feature grid as a single
   unit, so both move together, preserving their already-correct internal spacing
   (untouched) while correcting the whole stack's position relative to the media.
   Scoped to #proof .pp-proof-content (unique to this section) -- no change to
   heading or feature-grid-specific rules, no separate offset on either. */
.pp-home #proof .pp-proof-content {
  margin-top: 0;
  align-self: flex-start;
}

/* Micro Fix 05, issue C: same WordPress default Flow block-gap mechanism as issue A
   above, one level down -- .pp-section--intro's own children (heading, paragraph,
   eyebrow) are un-protected the same way .pp-home's children are. The heading and
   paragraph are unaffected in practice because .pp-lead/the heading's own rules
   already declare their own margin-top, which (being a real selector) trivially
   outranks the zero-specificity :where() default. The eyebrow is likewise fine (its
   own margin-top is set). The press marquee group, however, has never carried a
   margin-top/margin-block-start of its own (correctly -- source's own .marquee--press
   sets none either, only padding-block), so nothing opposes the injected default here,
   and it stacks on top of the marquee's own correct clamp(28px,6vw,44px) top padding.
   Contrast with .pp-marquee--banks/.pp-marquee--reviews below, which both *do* declare
   an explicit margin-top of their own (matching source) and were never affected. */
.pp-home .pp-section--intro .pp-marquee--press {
  margin-block-start: 0;
}


/* ==========================================================================
   04  BUTTONS, LINKS, ICON BUTTONS, DOTS
   ========================================================================== */

.pp-home .wp-block-button .wp-block-button__link {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  height: 40px;
  padding-inline: 21px;
  border-radius: var(--pp-r-pill);
  font-size: 15px;
  font-weight: 500;
  white-space: nowrap;
  transition: background var(--pp-t-med), color var(--pp-t-med), border-color var(--pp-t-med), transform .15s var(--pp-ease);
}
.pp-home .wp-block-button .wp-block-button__link:active { transform: scale(.96); }

.pp-home .pp-btn-accent .wp-block-button__link:hover { background: var(--pp-accent) !important; }
.pp-home .pp-btn-bone .wp-block-button__link:hover { background: color-mix(in oklab, var(--pp-accent) 20%, var(--pp-bone)) !important; }
.pp-home .pp-btn-light .wp-block-button__link:hover { background: var(--pp-accent-soft) !important; }

.pp-home .pp-btn-outline .wp-block-button__link {
  background: transparent;
  color: var(--pp-ink);
  border: 1px solid var(--pp-ink);
}
.pp-home .pp-btn-outline .wp-block-button__link:hover { background: var(--pp-surface); }

.pp-home .pp-btn-ghost .wp-block-button__link {
  background: color-mix(in oklab, var(--pp-scrim) 30%, transparent);
  color: var(--pp-bone);
  border: 1px solid var(--pp-bone-60);
}
.pp-home .pp-btn-ghost .wp-block-button__link:hover {
  background: color-mix(in oklab, var(--pp-bone) 14%, transparent);
  border-color: var(--pp-bone);
}

/* Post-translation button fidelity -- font weight. Root cause (measured live on
   the translated page, staging #4216): the Gutenberg translation pass left a
   `<strong>` wrapped around the label of 17 of the 26 core/button blocks
   (hero x2, "Konfigurē"/"Apskati modeli" on the last cards, the Ready-houses /
   Alderi / About / process / final CTAs) and around "Uzzināt par finansējumu".
   Every CTA's OWN weight was already correct (.wp-block-button__link computed
   500, = source's .btn / .link-arrow / .link / .dock__btn / .demobar__cta, all
   font-weight:500), but UA `strong { font-weight: bolder }` made the inner label
   700 -- and this site only loads Poppins 300/400/500/600, so it rendered as the
   600 face: visibly heavier than the designer's 500. No theme/Gutenberg/specificity
   rule is involved; the buttons that carry no <strong> already rendered 500.
   Fix at the owner of the mismatch (the label's emphasis tag) without touching the
   translated markup: inside a CTA, <strong>/<b> keep the CTA's weight. Scoped to
   `.pp-home` button links and the pack's three underlined `p a` links only --
   body-copy <strong> elsewhere is untouched. */
.pp-home .wp-block-button__link :is(strong, b),
.pp-home p a :is(strong, b) { font-weight: inherit; }

.pp-home .pp-btn-dock .wp-block-button__link {
  height: 30px;
  padding-inline: 13px;
  background: var(--pp-bone);
  color: var(--pp-ink);
  font-size: 14px;
}
.pp-home .pp-btn-dock .wp-block-button__link:hover { background: var(--pp-accent-soft) !important; }

.pp-home .pp-btn-link-arrow .wp-block-button__link {
  height: auto;
  padding: 0;
  background: transparent;
  color: var(--pp-ink);
  font-size: 16px;
}
.pp-home .pp-btn-link-arrow .wp-block-button__link:hover { background: transparent; color: var(--pp-accent); }

/* Micro Fix 32, issue 2: source's `.btn-row--stack` doesn't declare its own
   gap -- it inherits the base `.btn-row { display:flex; flex-wrap:wrap;
   gap:10px; }`'s value (the same 10px the desktop-only `.pp-ps-cta .wp-
   block-buttons { ...; gap:10px; }` rule already reproduces explicitly).
   This pack has no equivalent base `.pp-btn-row` class -- `.pp-btn-row--
   stack` is used standalone (confirmed: the only element in content.html
   carrying this class is the process CTA's button row), so with no gap of
   its own, the stacked buttons fell through to the theme's own uncontrolled
   block-gap default instead of source's fixed 10px. Added directly here,
   matching source's inherited value exactly. */
.pp-home .pp-btn-row--stack { flex-direction: column; width: 100%; max-width: 360px; gap: 10px; }
.pp-home .pp-btn-row--stack .wp-block-button { width: 100%; }
.pp-home .pp-btn-row--stack .wp-block-button__link { width: 100%; }

/* Micro Fix 26: this is this pack's implementation of source's own separate
   `.link` component (see the .pp-demobar__cta comment below, which already
   documented this relationship) -- the three underlined arrow CTAs ("How
   financing works", "All stories", "More questions") are the only plain,
   unclassed `<p><a>` links anywhere in content.html, so this generic
   selector is, in practice, already scoped to exactly these three and
   nothing else (confirmed by an exhaustive scan of every `<p>` in the file).
   The previous hover mechanism (changing border-color + text color) was an
   approximation, not a reproduction: source's `.link:hover` never changes
   border-color or text color at all -- only `background-size`, animating a
   solid-color `background-image` line (positioned at the same bottom edge
   as the static border-bottom) from 0% to 100% width, a left-to-right
   "wipe." Resting-state values this round explicitly freezes (padding-
   bottom:3px, border-bottom color/thickness) are left exactly as they were;
   only the hover mechanism itself changed, matching source's `.link`/
   `.link:hover` property-for-property, including its exact timing
   (.45s, var(--pp-ease) === source's --ease: cubic-bezier(.22,1,.36,1)).

   Micro Fix 27: the animated background line and the static border-bottom
   line, though the same 1.5px thickness, occupy two DIFFERENT vertical
   reference boxes by default -- `border-bottom` is drawn in the outer
   1.5px of the border-box (from the padding-box's bottom edge outward to
   the border-box's own bottom edge), while `background-position:0 100%`
   anchors to the PADDING-box (its default `background-origin`), placing
   the line's bottom edge AT the padding-box's bottom edge and extending it
   inward/upward instead. The two lines share exactly one edge (the
   padding-box bottom) but extend in opposite directions -- an exact 1.5px
   mismatch, not a rounding artifact, and the source of the reported visible
   offset (a gap this pack introduces, not present in the original design,
   since source's own `.link` doesn't have this border-vs-background split
   -- source's border-bottom and the pack's border-bottom occupy the
   equivalent space either way; the mismatch is specific to how this pack's
   two DIFFERENT underline mechanisms interact with each other, not
   something reproducible from source alone). Fixed by adding
   `background-origin:border-box`, which moves the background's positioning
   reference to the SAME box the border already uses -- `100%` now resolves
   to the border-box's own bottom edge, so the 1.5px-tall background image
   renders in the identical outer strip the border-bottom already occupies.
   Both lines now derive from one shared reference frame (the border-box's
   bottom edge) by construction, not two independently-tuned offsets that
   happen to look close.

   Micro Fix 28: that fix corrected the geometry but silently broke the
   animation -- `background-origin:border-box` was the ONLY change (see the
   diff against v1.0.30), and it worked exactly as designed: it moved the
   animated background line into the identical outer strip the border-bottom
   occupies. The problem is CSS's own fixed paint order within a single box
   -- background is always painted first, border always painted on top of
   it (background, then border, then content; not configurable, not a
   browser quirk) -- so once the two layers shared the same strip, the
   opaque grey border-bottom was permanently painting OVER the animated
   purple background, at every size from 0% to 100%. The animation was
   still running the whole time; it was just invisible, hidden under an
   opaque layer that paints above it by definition.
   Fixed by removing the border/background paint-order conflict entirely:
   `border-bottom` is replaced with a SECOND, always-100%-width background
   layer (grey, static) underneath the existing animated purple layer --
   background layers listed later in a multi-layer `background-image` paint
   ON TOP of earlier ones, so the purple layer still visibly grows over the
   grey one exactly as before, but now there is no border in the mix to
   paint over anything. `padding-bottom` increased from 3px to 4.5px (3px +
   the 1.5px the removed border used to occupy) so the total content-to-
   border-box-bottom distance is unchanged -- the resting line's Y-position
   is pixel-identical to v1.0.30/v1.0.31 (verified by construction: former
   padding(3)+border(1.5)=4.5px total; new padding(4.5)+border(0)=4.5px
   total). `background-origin` is no longer needed/declared -- with no
   border at all, the padding-box and border-box coincide, so the default
   origin already resolves `100%` to the same edge both layers need. */
/* Micro Fix 40: CORRECTION to the Micro Fix 28 note above. It states that
   background layers listed LATER paint on top -- that is backwards: in CSS the
   FIRST layer in a `background-image` list is the TOPMOST one. With the grey
   `--pp-ink-line` layer listed first (full width, always), it painted over the
   purple `--pp-accent` layer at every size, so the left-to-right sweep was
   present in the cascade but never visible on hover. The geometry from Micro
   Fix 27/28 was already right (both layers: same 1.5px height, same
   `0 100%` position, same box, so the purple lands exactly on the grey with no
   offset); only the stacking order was wrong. Layer order is now purple (top),
   grey (bottom), so on hover the purple wipes over the grey from the left edge
   exactly as source's `.link:hover { background-size: 0% -> 100% 1.5px }` does.
   Sizes/positions/padding-bottom are unchanged, so the resting grey underline
   is pixel-identical to v1.0.43 and nothing shifts.
   Also here: `font-weight: 500`. Source's `.link` declares `font-weight: 500`;
   this pack's plain `<p><a>` never did, so it inherited the (lighter) paragraph
   weight, which is why the default text looked lighter than the original. Font
   size, line-height, letter-spacing and font-family are not touched.
   Unchanged and already matching source (verified, left as is): hover text color
   `.pp-home a:hover { color: var(--pp-accent) }` (= source's `a:hover`), the
   underline sweep color (same `--pp-accent` token, so text and line are the
   identical color), .45s `var(--pp-ease)` (= source's cubic-bezier(.22,1,.36,1)),
   hover-out (the same transition reversing, retracting toward the left origin,
   as in source), the arrow (a text glyph inside the link, so it takes the hover
   text color like source's currentColor SVG; source's arrow has no separate
   motion) and the reduced-motion entry. Scope is unchanged: these three links are
   the only plain `<p><a>` in the pack (the demobar CTA neutralizes this rule). */
.pp-home p a {
  padding-bottom: 4.5px;
  font-weight: 500;
  background-image:
    linear-gradient(var(--pp-accent), var(--pp-accent)),
    linear-gradient(var(--pp-ink-line), var(--pp-ink-line));
  background-repeat: no-repeat, no-repeat;
  background-position: 0 100%, 0 100%;
  background-size: 0% 1.5px, 100% 1.5px;
  transition: background-size .45s var(--pp-ease);
}
.pp-home p a:hover { background-size: 100% 1.5px, 100% 1.5px; }

.pp-home .pp-iconbtn {
  position: relative;
  width: 37px;
  height: 37px;
  flex: 0 0 auto;
  border-radius: var(--pp-r-pill);
  border: 1px solid var(--pp-ink-line);
  background: transparent;
  color: inherit;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  transition: background var(--pp-t-med), color var(--pp-t-med), border-color var(--pp-t-med), transform .15s var(--pp-ease);
}
.pp-home .pp-iconbtn:hover { background: var(--pp-ink); color: var(--pp-bone); border-color: var(--pp-ink); }
.pp-home .pp-iconbtn:active:not(:disabled) { transform: scale(.9); }
.pp-home .pp-iconbtn:disabled { opacity: .35; cursor: default; }
.pp-home .pp-iconbtn:disabled:hover { background: transparent; color: inherit; border-color: var(--pp-ink-line); }

.pp-home .pp-dots { display: flex; gap: 6px; }
.pp-home .pp-dot {
  display: block;
  height: 3px;
  width: 14px;
  border-radius: var(--pp-r-pill);
  background: var(--pp-ink-line);
  border: 0;
  padding: 0;
  cursor: pointer;
  transition: width .3s ease, background .3s ease;
}
.pp-home .pp-dot.pp-is-active { width: 26px; background: var(--pp-ink); }

/* Micro Fix 07: source's .gallery__controls (styles.css) carries no max-width and
   no auto margins -- it's a plain, full-bleed flow row whose own inline
   `style="padding-inline:var(--rail-pad)"` is what aligns the dots' left edge (and,
   via .rail__arrows's own margin-left:auto, the arrows' right edge) with the rail's
   cards, which use that same --rail-pad for their own padding. This rule instead
   used max-width:var(--pp-maxw) + margin:...auto 0 + padding-inline:var(--pp-gutter)
   -- the "wrap"-simulation mechanism meant for headings/paragraphs (see the
   .pp-section--intro fixes above), not the rail-alignment mechanism the footer
   controls actually need. --pp-gutter is smaller than --pp-rail-pad at desktop
   widths, so the dots sat measurably left of the first card. Fixed to match
   source's own mechanism exactly: no max-width, margin-top only (a longhand, so it
   doesn't disturb .pp-ps-controls/.pp-stories-controls, which already fully
   override margin/padding-inline/max-width for their own nested contexts), and
   padding-inline:var(--pp-rail-pad) -- the same variable the rail itself already
   uses for its cards' own left/right inset. */
.pp-home .pp-rail-controls {
  margin-top: clamp(20px, 3vw, 26px);
  padding-inline: var(--pp-rail-pad);
  display: flex;
  align-items: center;
  gap: 16px;
  flex-wrap: wrap;
}
.pp-home .pp-rail-controls__arrows { margin-left: auto; display: flex; gap: 8px; }
.pp-home .pp-rail-controls__progress {
  flex: 1 1 auto;
  max-width: 120px;
  height: 3px;
  border-radius: var(--pp-r-pill);
  background: var(--pp-ink-line);
  overflow: hidden;
}
.pp-home .pp-rail-controls__thumb {
  height: 100%;
  width: 25%;
  border-radius: var(--pp-r-pill);
  background: var(--pp-ink);
  transition: width .3s ease, margin-left var(--pp-t-slow) var(--pp-ease);
}
.pp-home .pp-rail-controls__count { font-size: 13px; color: var(--pp-ink-56); font-variant-numeric: tabular-nums; }


/* ==========================================================================
   05  HERO + DEMO-DAY BARS
   ========================================================================== */

.pp-home .pp-hero {
  position: relative;
  min-height: 100svh;
  display: flex;
  flex-direction: column;
  /* v1.0.59: was var(--pp-bone) (white). The stage's own video covers the whole hero except
     the inline Demo Day lane, so this colour is only ever seen (a) in the moment before the
     hero video's first frame, now that the stale `poster` photo is gone, and (b) as a hairline
     on a phone where the stage's fractional bottom edge (e.g. 776.75px) is snapped
     differently for the filtered video layer and the lane. A dark neutral (the page ink,
     which the white hero text and the .72 brightness video already sit on) shows neither as
     a white flash nor as a white seam above the brown lane. */
  background: var(--pp-ink);
  overflow: hidden;
}
.pp-home .pp-hero__stage {
  position: relative;
  flex: 1 1 auto;
  min-height: 0;
  display: flex;
  flex-direction: column;
}
.pp-home .pp-hero__photo {
  position: absolute;
  inset: 0;
  display: none;
}
.pp-home .pp-hero__photo img { width: 100%; height: 100%; object-fit: cover; object-position: center bottom; }

.pp-home .pp-hero__video {
  display: none;
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
}
.pp-home .pp-hero__video video {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center bottom;
  filter: brightness(.72);
}
.pp-home .pp-hero__video--mobile { display: block; }

.pp-home .pp-hero__content {
  position: relative;
  flex: 1 1 auto;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  text-align: left;
  justify-content: flex-end;
  padding: calc(clamp(58px, 7vw, 74px) + 18px) var(--pp-gutter) clamp(32px, 8vw, 56px);
}
.pp-home .pp-hero__title {
  max-width: 19ch;
  color: var(--pp-paper);
  font-size: clamp(34px, 8.6vw, 46px);
  line-height: 1.06;
  letter-spacing: -.026em;
  font-weight: 500;
}
.pp-home .pp-hero__sub {
  margin-top: clamp(12px, 1.4vw, 22px);
  color: var(--pp-bone-80);
  max-width: 44ch;
}
.pp-home .pp-hero__btns {
  margin-top: clamp(20px, 2.2vw, 32px);
  justify-content: flex-start;
  gap: 12px;
  width: 100%;
  max-width: 440px;
}
.pp-home .pp-hero__btns.wp-block-buttons .wp-block-button {
  flex: 1 1 0;
}
.pp-home .pp-hero__btns .wp-block-button__link {
  width: 100%;
  height: clamp(40px, 3.2vw, 46px);
  padding-inline: clamp(14px, 2.4vw, 29px);
  font-size: clamp(14px, 1.5vw, 16px);
}

.pp-home .pp-reveal   { animation: pp-home-reveal .8s var(--pp-ease) .07s both; }
.pp-home .pp-reveal-2 { animation: pp-home-reveal .8s var(--pp-ease) .16s both; }
.pp-home .pp-reveal-3 { animation: pp-home-reveal .8s var(--pp-ease) .25s both; }
@keyframes pp-home-reveal { from { opacity: 0; transform: translateY(22px); } to { opacity: 1; transform: none; } }
@keyframes pp-home-dock   { from { opacity: 0; transform: translateY(100%); } to { opacity: 1; transform: none; } }
@keyframes pp-home-marquee { from { transform: translateX(0); } to { transform: translateX(-50%); } }

/* Outer bar: full-width, background only — the 1280px constraint, padding
   and flex row all belong to the __inner element. A collapsed one-tier
   version (max-width put directly on this outer, fixed-position element)
   shrinks the whole olive bar to 1280px and centers it as a floating
   rectangle instead of spanning full viewport width — the exact live
   staging regression this split fixes. See docs/HOMEPAGE-WORDPRESS-FLOW-MARGIN-FIX-HANDOFF.md
   and page-packs/homepage-clean/frontend.css for the proven precedent. */
.pp-home .pp-demobar {
  position: relative;
  color: var(--pp-paper);
}
.pp-home .pp-demobar__inner {
  display: flex;
  align-items: center;
  gap: clamp(12px, 2vw, 24px);
  padding-inline: var(--pp-rail-pad);
  padding-block: clamp(11px, 1.4vw, 16px);
}
.pp-home .pp-demobar__glyph { width: 24px; height: 24px; flex: 0 0 24px; color: var(--pp-paper); }
.pp-home .pp-demobar__text {
  flex: 1 1 auto;
  min-width: 0;
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 1px 12px;
}
.pp-home .pp-demobar__title { font-size: 15px; font-weight: 500; }
.pp-home .pp-demobar__when {
  font-size: 14.5px;
  font-weight: 300;
  color: color-mix(in oklab, var(--pp-paper) 82%, transparent);
  white-space: nowrap;
}
.pp-home .pp-demobar__street { display: none; }
/* Micro Fix 01: the v1.0.1 conversion represented this CTA as a filled
   core/button (pill background, dark-ink text, trailing "→" as a literal
   character in the button's own text) instead of the original's plain
   inline-flex text link with a real leading SVG arrow. Root cause was
   three-fold: (1) wrong block type (button vs plain link), (2) wrong resting
   text color (inline style left it at the ink color meant for the OTHER,
   filled pill buttons on this page, never overridden — only the hover state
   had its own rule), (3) arrow placed as trailing text instead of a leading
   icon element. Markup changed to a plain paragraph + <a> + inline <svg>
   (see content.html), matching source-design/homepage-original-new.zip's
   own `.demobar__cta` exactly. This rule is scoped to .pp-demobar__cta only
   — no other Homepage button/link style was touched. */
.pp-home .pp-demobar__cta-wrap { flex: 0 0 auto; }
/* Placing this link inside a <p> (see content.html) makes it also match
   the generic ".pp-home p a" rule below, which underlines inline text
   links via border-bottom — correct for those other links (it's this
   pack's implementation of the source's own separate `.link` class, which
   genuinely has that underline), but `.demobar__cta` in source has no
   border/underline of any kind. Neutralized explicitly here rather than
   changing the shared `p a` rule, which other real inline links on this
   page still need.
   Micro Fix 26: `.pp-home p a` now also carries a background-image-driven
   hover sweep (see its own comment below) -- `background-image:none` here
   removes it too, for the same reason border-bottom/padding-bottom were
   already zeroed: `.pp-demobar__cta` has no underline of any kind, resting
   or hover.
   Micro Fix 28: `.pp-home p a` no longer declares its own `border-bottom`
   at all (both its underline layers are backgrounds now) -- the
   `border-bottom:none` line below is harmless/redundant rather than wrong,
   left as-is for clarity; `background-image:none` still fully cancels the
   base rule's two-layer list (a single `none` replaces the whole
   property), and `padding-bottom:0` still overrides the base rule's new
   4.5px value -- this component's own resting geometry is unaffected. */
.pp-home .pp-demobar__cta {
  display: inline-flex;
  align-items: center;
  gap: 9px;
  color: var(--pp-paper);
  font-size: 15px;
  font-weight: 500;
  border-bottom: none;
  padding-bottom: 0;
  background-image: none;
}
.pp-home .pp-demobar__cta:hover { color: var(--pp-accent-soft); }

/* Demo Day lane fidelity (1.0.49) -- two defects that came in with the Gutenberg
   translation edit of the lane (content.html 1.0.47 -> 1.0.48), not with any CSS:

   1. CTA not at the far right. Editing the lane in the block editor wrapped the
      title/date group and the CTA paragraph in one extra, unclassed core/group (flex,
      nowrap) -- a new direct child of .pp-demobar__inner. Source (and 1.0.47) place
      glyph, `.demobar__text { flex: 1 1 auto }` and `.demobar__cta` as three
      siblings of one flex row, which is what pushes the CTA to the far right. The
      wrapper made the text+CTA a single shrink-to-fit item, so the CTA sat right next
      to the date. The wrapper now takes the place of those siblings: it fills the
      row and re-creates the same row inside itself (same gap as the inner row), so
      the existing `.pp-demobar__text { flex: 1 1 auto }` again pushes the CTA to the
      far right. Selector = the lane's only direct group child (the glyph is an <svg>).
   2. Missing arrow. Source has a leading 15px inline SVG (`M2 8h11M9 4l4 4-4 4`,
      stroke 1.7) inside the link, 9px gap (the link's own `gap`). The block editor's
      rich-text field strips an <svg> from a paragraph on the next edit, which is how
      the arrow was lost from the translated label. It is restored as a decorative
      ::before (same path, painted with currentColor so the hover colour still
      applies) so the editable label stays plain "Reģistrējies" text and the arrow
      survives any further editing. If a version of the content still carries the
      inline SVG (1.0.47), the pseudo-element stands down. */
.pp-home .pp-demobar__inner > .wp-block-group {
  flex: 1 1 auto;
  min-width: 0;
  display: flex;
  flex-wrap: nowrap;
  align-items: center;
  gap: clamp(12px, 2vw, 24px);
}
.pp-home .pp-demobar__cta::before {
  content: "";
  flex: 0 0 15px;
  width: 15px;
  height: 15px;
  background-color: currentColor;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M2 8h11M9 4l4 4-4 4' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M2 8h11M9 4l4 4-4 4' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center / contain no-repeat;
}
.pp-home .pp-demobar__cta:has(> .pp-icon)::before { display: none; }

/* Demo Day CTA presentation (1.0.56). Root cause of the underlined, arrow-less
   "Reģistrējies": the Gutenberg-edited lane saves the link as a plain
   `<p class="pp-demobar__cta-wrap"><a href>` -- rich text cannot keep the source's
   `class="demobar__cta"` on the <a> (nor its inline <svg>) -- so every
   `.pp-demobar__cta` rule above (no underline, flex row, leading arrow) matched
   nothing, and the link fell through to the generic `.pp-home p a` inline-link
   underline (the two background gradients). The same treatment is therefore
   keyed on the wrapper's own link. Scope is this one paragraph class (the lane's
   `.pp-demobar__cta-wrap`, which only the inline lane uses); the docked bar's
   button (`.pp-btn-dock`) and the other inline links are untouched. Resting
   colour = source's `.demobar__cta` paper white (1.0.58: see the colour note
   below); hover takes source's `.demobar__cta:hover` colour. Arrow = the ::before mask above (the editable
   label stays plain text), so it also cannot be stripped by an edit. */
.pp-home .pp-demobar__cta-wrap a {
  display: inline-flex;
  align-items: center;
  gap: 9px;
  color: var(--pp-paper);
  border-bottom: none;
  padding-bottom: 0;
  background-image: none;
  text-decoration: none;
}
/* 1.0.58 colour: Gutenberg's own link colour for this paragraph
   (`.wp-elements-N a:where(:not(.wp-element-button))`, light = #fff, specificity
   0,1,1) ties with this pack's global `.pp-home a { color: var(--pp-ink) }`
   (0,1,1), and the pack stylesheet loads later, so the link rendered dark ink.
   The rule above (0,2,1) sets the source's paper white explicitly. */
.pp-home .pp-demobar__cta-wrap a:hover { color: var(--pp-accent-soft); text-decoration: none; }
.pp-home .pp-demobar__cta-wrap a::before {
  content: "";
  flex: 0 0 15px;
  width: 15px;
  height: 15px;
  background-color: currentColor;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M2 8h11M9 4l4 4-4 4' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M2 8h11M9 4l4 4-4 4' fill='none' stroke='%23000' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center / contain no-repeat;
}

/* Same outer/inner split as .pp-demobar above — the fixed bar itself spans
   the full viewport edge-to-edge; the 1280px constraint, padding and flex
   row belong to .pp-dock__inner only. */
.pp-home .pp-dock {
  position: fixed;
  left: 0; right: 0; bottom: 0;
  z-index: 70;
  background: var(--pp-olive);
  color: var(--pp-paper);
  box-shadow: 0 -10px 30px -18px color-mix(in oklab, var(--pp-scrim) 50%, transparent);
  display: none;
}
.pp-home .pp-dock.pp-is-visible { display: block; }
/* Demo Days integration (Page Pack 1.0.46): the event text in both brown lanes
   (this bar and the hero-bottom .pp-demobar) is owned by the MyCabin Demo Days
   plugin, which fills the placeholder in each lane and adds `.pp-is-live`
   when there is a real upcoming event (and outputs neither lane when there is
   none). A lane that never went live -- Demo Days inactive or too old -- must
   show nothing: no placeholder text, no stale event. Placed after the dock's own
   `.pp-is-visible` rule so it wins the equal-specificity tie. */
.pp-home .pp-home-demo-lane:not(.pp-is-live) { display: none; }
.pp-home .pp-dock.pp-is-visible .pp-dock__inner {
  display: flex;
  align-items: center;
  gap: 12px;
  max-width: var(--pp-maxw);
  margin-inline: auto;
  padding: clamp(10px, 1.4vw, 14px) clamp(14px, 4vw, 40px);
  animation: pp-home-dock var(--pp-t-slow) var(--pp-ease) both;
}
.pp-home .pp-dock .pp-demobar__glyph { width: 24px; height: 24px; flex: 0 0 24px; color: var(--pp-paper); }
.pp-home .pp-dock .pp-demobar__text { flex: 1 1 auto; min-width: 0; display: flex; flex-wrap: wrap; align-items: baseline; gap: 1px 12px; }
.pp-home .pp-dock__when {
  font-size: 14px;
  font-weight: 300;
  color: color-mix(in oklab, var(--pp-paper) 82%, transparent);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.pp-home .pp-dock__cta { flex: 0 0 auto; }
.pp-home .pp-dock__close {
  flex: 0 0 30px;
  width: 30px;
  height: 30px;
  border-radius: var(--pp-r-pill);
  border: 1px solid color-mix(in oklab, var(--pp-paper) 40%, transparent);
  background: transparent;
  color: var(--pp-paper);
  cursor: pointer;
  font-size: 16px;
  line-height: 1;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}


/* ==========================================================================
   06  PRESS MARQUEE
   ========================================================================== */

.pp-home .pp-marquee { position: relative; }
.pp-home .pp-marquee--press { padding-block: clamp(28px, 6vw, 44px); }
.pp-home .pp-marquee--press .pp-marquee__group { gap: clamp(40px, 10vw, 88px); padding-right: clamp(40px, 10vw, 88px); align-items: center; }

.pp-home .pp-marquee__track { display: flex; width: max-content; animation: pp-home-marquee 32s linear infinite; }
.pp-home .pp-marquee:hover .pp-marquee__track { animation-play-state: paused; }
.pp-home .pp-marquee__group { display: flex; align-items: center; }
.pp-home .pp-marquee__group .wp-block-image { margin: 0; }
.pp-home .pp-marquee__group img { width: auto; display: block; flex: 0 0 auto; }

/* The className from each core/image block's own attributes lands on the
   <figure class="wp-block-image ..."> wrapper, never on the <img> itself —
   a `height` set on .pp-press-logo therefore never reaches the actual
   rendered image, which is then left at its native pixel size (confirmed
   live: logos rendering ~5x the intended height). Every sizing rule below
   targets the img explicitly; opacity is fine on the figure since it has
   exactly one child. */
.pp-home .pp-press-logo { opacity: .55; }
.pp-home .pp-press-logo img { height: clamp(20px, 4.2vw, 30px); }
.pp-home .pp-press-logo--dwell img           { height: calc(clamp(20px, 4.2vw, 30px) * 2.0); }
.pp-home .pp-press-logo--designboom img      { height: calc(clamp(20px, 4.2vw, 30px) * 1.52); }
.pp-home .pp-press-logo--house-beautiful img { height: calc(clamp(20px, 4.2vw, 30px) * 1.74); }
.pp-home .pp-press-logo--yanko-design img    { height: calc(clamp(20px, 4.2vw, 30px) * 1.03); }
.pp-home .pp-press-logo--delfi img           { height: calc(clamp(20px, 4.2vw, 30px) * 1.72); }
.pp-home .pp-press-logo--dienas-bizness img  { height: calc(clamp(20px, 4.2vw, 30px) * 2.2); }


/* ==========================================================================
   07  POPULAR HOMES RAIL
   ========================================================================== */

.pp-home .pp-rail {
  display: flex;
  gap: clamp(12px, 2vw, 20px);
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  scroll-behavior: smooth;
  padding: 0 var(--pp-rail-pad) 6px;
  scroll-padding-left: var(--pp-rail-pad);
  scrollbar-width: none;
}
.pp-home .pp-rail::-webkit-scrollbar { display: none; }
.pp-home .pp-rail > * { scroll-snap-align: start; scroll-snap-stop: always; }

.pp-home .pp-model {
  position: relative;
  flex: 0 0 min(86vw, 380px);
  aspect-ratio: .58;
  overflow: hidden;
  border-radius: var(--pp-r-lg);
  background: var(--pp-surface);
}
.pp-home .pp-model__render {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
}
.pp-home .pp-model__render img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center 42%;
  transition: transform var(--pp-t-slow) var(--pp-ease);
}
.pp-home .pp-model:hover .pp-model__render img { transform: scale(1.04); }
.pp-home .pp-model::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  background:
    linear-gradient(180deg, rgba(0, 0, 0, .46) 0%, transparent 28%),
    linear-gradient(0deg, rgba(0, 0, 0, .54) 0%, transparent 36%);
}
.pp-home .pp-model__top {
  position: absolute;
  top: 0; left: 0; right: 0;
  z-index: 2;
  padding: clamp(14px, 2.2vw, 20px);
  text-align: center;
}
.pp-home .pp-model__badge {
  display: inline-flex;
  padding: 4px 10px;
  border-radius: var(--pp-r-pill);
  background: rgba(0, 0, 0, .34);
  backdrop-filter: blur(8px);
  color: var(--pp-paper);
  font-size: 11px;
  font-weight: 500;
}
.pp-home .pp-model__title {
  margin: 10px 0 0;
  font-size: 24px;
  font-weight: 500;
  letter-spacing: -.02em;
  color: var(--pp-paper);
}
.pp-home .pp-model__title a { color: inherit; }
.pp-home .pp-model__info {
  position: absolute;
  left: 0; right: 0;
  bottom: 132px;
  z-index: 2;
  padding: 0 clamp(14px, 2.2vw, 20px);
}
.pp-home .pp-model__specs { font-size: 13px; color: var(--pp-bone-80); }
.pp-home .pp-model__price {
  margin-top: 4px;
  font-size: 19px;
  font-weight: 400;
  letter-spacing: -.018em;
  color: var(--pp-paper);
}
.pp-home .pp-model__actions {
  position: absolute;
  left: 0; right: 0; bottom: 0;
  z-index: 3;
  display: flex;
  flex-direction: column;
  align-items: stretch;
  gap: 10px;
  padding: 28px clamp(14px, 2.2vw, 20px) clamp(16px, 2.2vw, 20px);
  background: linear-gradient(180deg, transparent 0%, rgba(0, 0, 0, .5) 45%, rgba(0, 0, 0, .72) 100%);
}
.pp-home .pp-model__actions .wp-block-button__link { width: 100%; height: 48px; font-size: 15px; }
/* Live-measured root cause (Micro Fix 03): this rule's own height:48px also
   applied to the Explore link — since it is a core/button just like
   Configure, sharing this exact selector — forcing it to the SAME 48px
   height as the real button instead of sizing naturally to its own text
   (source's plain <a class="link-arrow">, ~23px tall, has no forced
   height). That extra ~25px was eaten directly out of the price-to-
   Configure gap: confirmed live at 10px before this fix, 34px after,
   against a source-predicted value of ~34px (132px info-bottom offset -
   48px button - 10px action-gap - ~23px natural explore height - ~16px
   padding-bottom). Configure's own height/position is unaffected — the
   button block itself was never the problem, only the link-arrow one
   sharing its selector. */
.pp-home .pp-model__actions .pp-btn-link-arrow .wp-block-button__link { height: auto; justify-content: center; color: var(--pp-paper); font-size: 16px; }
/* Post-translation button fidelity: the explore link is source's `.link-arrow`
   (font-size:16px; weight 500, measured in the designer source). The shared
   `.pp-model__actions .wp-block-button__link { font-size: 15px }` rule above (same
   specificity, later) was also setting this link to 15px; 16px restores source. */
.pp-home .pp-model__actions .pp-btn-link-arrow .wp-block-button__link:hover { color: var(--pp-accent-soft); }


/* ==========================================================================
   08  TWO ROUTES
   ========================================================================== */

.pp-home .pp-routes {
  margin-top: clamp(28px, 4vw, 44px);
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: clamp(14px, 2vw, 20px);
}
.pp-home .pp-route {
  position: relative;
  border-radius: 12px;
  overflow: hidden;
  min-height: clamp(400px, 60vw, 520px);
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  background: var(--pp-ink);
}
.pp-home .pp-route__media { position: absolute; inset: 0; z-index: 0; margin: 0; }
.pp-home .pp-route__media img { width: 100%; height: 100%; object-fit: cover; }
.pp-home .pp-route::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  background: linear-gradient(180deg,
    transparent 0%,
    color-mix(in oklab, var(--pp-scrim) 8%, transparent) 38%,
    color-mix(in oklab, var(--pp-scrim) 55%, transparent) 66%,
    color-mix(in oklab, var(--pp-scrim) 82%, transparent) 100%);
}
.pp-home .pp-route__body { position: relative; z-index: 2; }
.pp-home .pp-route__body h3 {
  color: var(--pp-paper);
  line-height: 1.12;
  letter-spacing: -.02em;
}
.pp-home .pp-route__body p {
  margin-top: 10px;
  color: var(--pp-bone-80);
  font-size: 16px;
  line-height: 1.5;
  font-weight: 300;
}
.pp-home .pp-route__body .wp-block-buttons { margin-top: 20px; }


/* ==========================================================================
   09  FINANCING MARQUEE
   ========================================================================== */

.pp-home .pp-marquee--banks { margin-top: clamp(36px, 6vw, 60px); padding-block: clamp(8px, 2vw, 14px); }
.pp-home .pp-marquee--banks .pp-marquee__track { animation-duration: 34s; }
.pp-home .pp-marquee--banks .pp-marquee__group { gap: clamp(52px, 10vw, 120px); padding-right: clamp(52px, 10vw, 120px); }
.pp-home .pp-bank-logo--swedbank img { height: clamp(32px, 5.4vw, 50px); }
.pp-home .pp-bank-logo--luminor  img { height: clamp(27px, 4.6vw, 42px); }
.pp-home .pp-bank-logo--seb      img { height: clamp(32px, 5.4vw, 50px); }


/* ==========================================================================
   10  PROOF (VIDEO + GRID)
   ========================================================================== */

.pp-home .pp-proof-media-grid {
  display: flex;
  flex-direction: column;
  gap: clamp(28px, 5vw, 44px);
}
.pp-home .pp-proof-media { border-radius: var(--pp-r-lg); overflow: hidden; background: var(--pp-surface); }
.pp-home .pp-proof-media video { width: 100%; height: auto; }
.pp-home .pp-proof-content { min-width: 0; }

.pp-home .pp-proof-grid {
  margin-top: clamp(34px, 5vw, 64px);
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, max(270px, calc((100% - 2 * clamp(24px, 3vw, 40px)) / 3))), 1fr));
  gap: clamp(24px, 3vw, 40px);
}
.pp-home .pp-proof-card {
  display: flex;
  flex-direction: column;
  gap: 12px;
  padding-top: 20px;
  border-top: 1px solid color-mix(in oklab, var(--pp-ink) 10%, transparent);
}
.pp-home .pp-proof-grid > .pp-proof-card:first-child { border-top: 0; padding-top: 0; }
.pp-home .pp-proof-card__head { display: flex; align-items: center; gap: 12px; }
.pp-home .pp-proof-card__icon { flex: none; width: 32px; height: 32px; color: var(--pp-accent); }
.pp-home .pp-proof-card__desc { margin-left: 44px; font-size: 15.5px; line-height: 1.6; color: var(--pp-ink-72); font-weight: 300; }

.pp-home .wp-block-buttons.pp-proof-cta { margin-top: clamp(24px, 5vw, 36px); }
.pp-home .pp-proof-cta .wp-block-button { width: 100%; }
.pp-home .pp-proof-cta .wp-block-button__link { width: 100%; }
/* Post-translation button fidelity: source's proof CTA is `.btn.btn--outline.btn--48`
   (height:38px; padding-inline:19px -- measured 38 / 19px in the designer source);
   this pack's CTA only had the base 40px / 21px. Font-size 15px already matches. */
.pp-home .pp-proof-cta .wp-block-button__link { height: 38px; padding-inline: 19px; }
.pp-home .pp-proof-cta .pp-btn-outline .wp-block-button__link:hover { background: var(--pp-accent-soft) !important; border-color: var(--pp-accent-soft); }


/* ==========================================================================
   11  CLIENT STORIES + CUSTOMER PORTRAIT GRID
   ========================================================================== */

/* Micro Fix 29, issue 3: source's rail carries `class="stories no-bar
   stagger-group"` -- `.no-bar { scrollbar-width:none; -ms-overflow-style:
   none; } .no-bar::-webkit-scrollbar { display:none; }` -- but this pack's
   `.pp-stories` never received the equivalent treatment (`.pp-rail`, the
   Popular Homes rail, already has the scrollbar-width/::-webkit-scrollbar
   pair; `-ms-overflow-style` is added here too, matching source's `.no-bar`
   completely rather than reusing only the partial pattern already present
   elsewhere in this file). Scrolling itself is untouched -- these
   properties only hide the native scrollbar's own paint, they don't set
   `overflow` or otherwise disable scroll.

   Micro Fix 30: the remaining "first card too far left" issue was NOT a
   missing/overridden padding -- with the user's explicit one-time
   authorization, live inspection (getBoundingClientRect/getComputedStyle on
   the actual deployed v1.0.33 page) confirmed `.pp-stories` already
   computes `padding-left:20px` correctly (via the shared `.pp-section > *`
   wrap-simulation rule, §3 above), and that this pack's card width/gap
   already match source exactly -- yet the first card's rendered left edge
   was still 0, flush with the viewport. Root cause: on a FRESH page load,
   `.pp-stories.scrollLeft` was already `20` (exactly the padding amount),
   not `0` -- confirmed reproducible across repeated reloads, and confirmed
   NOT JS-driven (frontend.js only reads `.scrollLeft` for progress/arrow-
   disabled-state calculation and calls `.scrollTo()` solely in response to
   arrow clicks, never on init). This is a well-documented native CSS Scroll
   Snap behavior: a scroll container combining `padding` with `scroll-snap-
   type`/child `scroll-snap-align:start`, but no `scroll-padding`, has its
   *initial* snap resolution settle such that the first snap point (the
   padding-inset start of the first card) aligns with the scrollport's own
   edge -- scrolling exactly the padding amount away and visually erasing
   it, confirmed live: setting `scroll-padding-left` and resetting
   `scrollLeft:0` immediately produced the correct 20px-inset first-card
   position. `.pp-rail` (the Popular Homes rail, a few sections up)
   already carries this exact fix for the identical padding+snap
   combination (`scroll-padding-left:var(--pp-rail-pad)`, alongside its own
   `padding:0 var(--pp-rail-pad) 6px`) -- `.pp-stories` was simply never
   given the equivalent. Fixed by adding `scroll-padding-left:var(--pp-
   gutter)`, matching the exact value `.pp-stories` already receives via
   `padding-inline` from the shared wrap-simulation rule, so both stay in
   sync by using the same variable rather than a second hardcoded value. */
.pp-home .pp-stories {
  margin-top: 32px;
  display: flex;
  gap: 12px;
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  scroll-padding-left: var(--pp-gutter);
  scroll-behavior: smooth;
  padding-bottom: 6px;
  scrollbar-width: none;
  -ms-overflow-style: none;
}
.pp-home .pp-stories::-webkit-scrollbar { display: none; }
.pp-home .pp-story {
  flex: 0 0 82%;
  scroll-snap-align: start;
  position: relative;
  overflow: hidden;
  border-radius: var(--pp-r-card);
  min-height: min(560px, 72svh);
  background: var(--pp-ink);
}
.pp-home .pp-story__media { position: absolute; inset: 0; z-index: 0; margin: 0; }
.pp-home .pp-story__media img { width: 100%; height: 100%; object-fit: cover; }
.pp-home .pp-story::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  background: linear-gradient(180deg,
    transparent 0%,
    color-mix(in oklab, var(--pp-scrim) 6%, transparent) 50%,
    color-mix(in oklab, var(--pp-scrim) 82%, transparent) 100%);
}
.pp-home .pp-story__badge {
  position: absolute;
  top: clamp(14px, 2vw, 20px);
  left: clamp(14px, 2vw, 20px);
  z-index: 3;
  display: inline-flex;
  padding: 6px 12px;
  border-radius: var(--pp-r-pill);
  background: color-mix(in oklab, var(--pp-ink) 55%, transparent);
  backdrop-filter: blur(8px);
  color: var(--pp-paper);
  font-size: 12px;
  font-weight: 500;
}
.pp-home .pp-story__body {
  position: absolute;
  inset: 0;
  z-index: 2;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
}
.pp-home .pp-story__quote {
  font-size: 19px;
  line-height: 1.24;
  letter-spacing: -.022em;
  font-weight: 500;
  color: var(--pp-paper);
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 3;
  overflow: hidden;
}
.pp-home .pp-story__name { margin-top: 18px; font-size: 16px; font-weight: 500; color: var(--pp-paper); }
.pp-home .pp-story__fact { margin-top: 3px; font-size: 13.5px; color: var(--pp-bone-60); }
.pp-home .pp-story__cta { margin-top: 20px; align-self: flex-start; }
/* Micro Fix 16 RETRY: the extra empty space between the meta line and the CTA
   (quote/name/meta sitting too high while the CTA itself already sits close to its
   correct position) comes from a structural mismatch this pack's own markup
   necessarily introduces that source's plain HTML never has. Source's CTA wrapper
   is `.story__act` -- a plain block div, direct flex-column child of `.story__body`
   -- containing only the `<a class="story__cta" style="margin-top:20px">` link;
   since `.story__act` itself establishes no new formatting context (no
   display:flex/grid, no padding/border of its own), the link's margin-top
   collapses through it, making `.story__act` behave, for layout purposes, as if it
   itself carried that 20px top margin -- a single, real, outer gap between the
   meta text and the CTA. This pack's Gutenberg equivalent necessarily wraps the
   button in a `core/buttons` block (`<div class="wp-block-buttons">`), and
   WordPress's own `.wp-block-buttons` is a flex container by default -- so the
   inner `.pp-story__cta`'s margin-top:20px, being a flex item's own margin, does
   NOT collapse outward the way source's plain div does; it stays trapped as
   internal spacing inside `.wp-block-buttons`, and `.wp-block-buttons` itself (the
   real 4th flex-column child of `.pp-story__body`, never explicitly given a
   margin-top anywhere in this file) was left exposed to the same un-neutralized
   WordPress default Flow/block-gap margin already found and fixed at seven earlier
   locations across this page. The two effects compound: the button's own 20px
   still counts toward the column's total content height (pushing quote/name/meta
   up by that amount, same as source intends), PLUS the un-neutralized wrapper
   margin adds MORE height on top of it that source has no equivalent for --
   inflating the meta-to-CTA gap and pushing the text group higher than source
   without further displacing the CTA's own already-near-correct bottom position.
   Fixed by neutralizing only the wrapper's own top margin, leaving the button's
   correct, already-verified-in-Micro-Fix-16 20px/12px margin as the sole
   remaining source of spacing -- structure already matches source (a single flat
   flex column, no independent CTA sub-wrapper in source to reproduce), so no
   content.html change was needed, per this round's own guidance to prefer a CSS
   fix when the underlying architecture already matches. */
.pp-home .pp-story__body > .wp-block-buttons {
  margin-block-start: 0;
}
/* Micro Fix 16, issues A-D: source's .story__body carries a plain `padding: 24px`
   at every width (desktop overrides it further below). This Gutenberg block instead
   carries an inline style -- `style="padding:var(--wp--preset--spacing--mycabin-
   comfortable)"`, from its own `"spacing":{"padding":"var:preset|spacing|mycabin-
   comfortable"}` attribute -- and nothing in this file was setting `padding` on
   `.pp-story__body` to compete with it, so that inline declaration (clamp(24px,3vw,
   32px), NOT source's plain 24px, and -- critically -- the SAME value for every
   card, never reduced for the two smaller ones the way source's own desktop rules
   reduce it) was winning by default. Because `.story__body` is `display:flex;
   flex-direction:column; justify-content:flex-end`, its own padding-bottom is
   exactly what determines how far the whole quote/name/fact/CTA stack sits above
   the card's true bottom edge -- a too-large padding-bottom (as this pack had, via
   the wrong preset, especially uncorrected for the two smaller cards) pushes the
   entire stack up, matching the "content sits too high" symptom on all three cards
   (worse on the two smaller ones); the same padding's inline-start component is
   exactly the horizontal inset the "too far inward" symptom described. Only
   `!important` can override a same-property inline style, so it is used here,
   scoped to only this property on this one already-unique selector (`.pp-story__
   body`, confirmed used only inside this section) -- not to "overpower Gutenberg"
   generally. The inline `style` attribute itself was left in content.html rather
   than removed, since editing three separate blocks' JSON attributes for a
   CSS-only-achievable fix was unnecessary. */
.pp-home .pp-story__body {
  padding: 24px !important;
}
/* Micro Fix 16, issue E: source's story CTA is `.btn.btn--light.btn--46`, where
   `.btn--46 { height:37px; padding-inline:18px; font-size:14.5px; }` is a size
   modifier layered on top of the shared `.btn` base (height:40px; padding-inline:
   21px; font-size:15px). This pack's CTA (`.pp-btn-light.pp-story__cta`) only ever
   picked up the generic `.wp-block-button__link` base-button sizing (this pack's
   own equivalent of plain `.btn`, confirmed matching it exactly) -- no `.btn--46`
   equivalent was ever added, so the button rendered at the larger default size on
   all three cards (matching source's own uniform application of `.btn--46` to all
   three, not just the two smaller ones the visual report happened to flag). */
.pp-home .pp-story__cta .wp-block-button__link {
  height: 37px;
  padding-inline: 18px;
  font-size: 14.5px;
}

.pp-home .pp-stories-controls { margin-top: 20px; padding-inline: 0; }
.pp-home .pp-stories-controls .pp-rail-controls__progress { max-width: 120px; }

.pp-home .pp-portrait-grid-wrap { position: relative; margin-top: clamp(36px, 5vw, 56px); }
.pp-home .pp-portrait-grid-clip { max-height: 620px; overflow: hidden; }
.pp-home .pp-portrait-grid-wrap::after {
  content: "";
  position: absolute;
  left: 50%;
  bottom: 0;
  width: 100vw;
  margin-left: -50vw;
  height: 58%;
  background: linear-gradient(180deg, transparent, var(--pp-surface) 78%);
  pointer-events: none;
}
.pp-home .pp-portrait-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 14px; }
.pp-home .pp-portrait-col { min-width: 0; display: flex; flex-direction: column; gap: 14px; }
.pp-home .pp-portrait-col:nth-child(even) { transform: translateY(28px); }
.pp-home .pp-portrait-col img { display: block; width: 100%; border-radius: var(--pp-r-md); }
.pp-home .pp-portrait-col img:nth-child(2) { opacity: .55; }


/* ==========================================================================
   12  REVIEWS MARQUEE
   ========================================================================== */

.pp-home .pp-rating { display: flex; align-items: baseline; gap: 12px; flex: none; white-space: nowrap; }
.pp-home .pp-rating__stars { font-size: 19px; line-height: 1; color: var(--pp-ink-72); letter-spacing: .08em; }
.pp-home .pp-rating__score { font-size: 16px; font-weight: 500; }
.pp-home .pp-rating__count { font-size: 14px; color: var(--pp-ink-56); }

.pp-home .pp-marquee--reviews { margin-top: clamp(26px, 4vw, 40px); }
.pp-home .pp-marquee--reviews .pp-marquee__track { animation-duration: 58s; gap: 12px; }
.pp-home .pp-marquee--reviews .pp-marquee__group { gap: 12px; padding-right: 12px; align-items: stretch; }

.pp-home .pp-review {
  flex: 0 0 min(72vw, 270px);
  background: var(--pp-bone);
  border-radius: var(--pp-r-sm);
  padding: 16px;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  gap: 12px;
  box-shadow: 0 6px 20px color-mix(in oklab, var(--pp-ink) 7%, transparent);
}
.pp-home .pp-review blockquote { font-size: 14px; line-height: 1.5; color: var(--pp-ink-72); font-weight: 300; }
.pp-home .pp-review__who { display: flex; flex-direction: column; gap: 2px; }
.pp-home .pp-review__name { font-size: 14px; font-weight: 500; }
.pp-home .pp-review__model { font-size: 12.5px; color: var(--pp-ink-56); }

.pp-home .wp-block-buttons.pp-reviews-cta { display: flex; width: max-content; min-width: 260px; margin: clamp(28px, 4vw, 44px) auto 0; }
/* Micro Fix 17/18, issue E: source's `.reviews__cta { display:flex; width:max-
   content; min-width:260px; ... }` is applied DIRECTLY to the `<a>` tag itself --
   source has no separate wrapper, the link IS the visible pill. This pack's
   Gutenberg equivalent already carries the identical width/min-width/margin
   values (line above, confirmed matching source exactly) -- but scoped to
   `.wp-block-buttons`, the OUTER, invisible flex-row wrapper `core/buttons`
   necessarily introduces, TWO levels above the actual visible button.
   Micro Fix 17 first tried propagating `width:100%` down through the two
   intermediate levels, which did not fully resolve the mismatch: `width:100%` on
   a child whose own parent is sized with `width:max-content` is a circular
   reference (the parent's own width depends on its content's natural size, which
   now depends back on the parent) -- browsers do not reliably resolve this the
   way a fixed, absolute value would, so the 260px minimum still did not reach the
   visible pill consistently. Fixed instead by applying `min-width:260px`
   (source's own literal value) directly on the visible elements themselves,
   independent of the outer wrapper's own sizing -- exactly mirroring source's
   single-element mechanism instead of relaying a relative value through it. */
.pp-home .pp-reviews-cta .wp-block-button,
.pp-home .pp-reviews-cta .wp-block-button__link {
  min-width: 260px;
}


/* ==========================================================================
   13  PROCESS SHORTLIST
   ========================================================================== */

.pp-home .pp-ps-hero { position: relative; height: 180vh; height: 180dvh; }
.pp-home .pp-ps-hero__inner {
  position: sticky;
  top: 0;
  height: 100vh;
  height: 100dvh;
  display: flex;
  align-items: center;
  justify-content: center;
  padding-inline: var(--pp-gutter);
  overflow: hidden;
}
.pp-home .pp-ps-display {
  font-size: clamp(38px, 10vw, 52px);
  line-height: 1.02;
  letter-spacing: -.02em;
  font-weight: 500;
  text-align: center;
  transform: scale(.75);
  transform-origin: center;
  transition: transform .1s linear;
}
.pp-home .pp-ps-word { display: inline-block; opacity: .08; transition: opacity .1s linear; }

.pp-home .pp-ps-grid { margin-top: clamp(28px, 4vw, 40px); display: flex; flex-direction: column; gap: 0; }
.pp-home .pp-ps-rail { margin-top: clamp(28px, 4vw, 40px); padding-inline: 0; scroll-padding-left: 0; }
/* Unlike the models/stories rail controls, this one sits nested inside
   .pp-ps-grid (already centered by the generic .pp-section > .pp-ps-grid
   rule in §03) rather than directly under a full-bleed section — cancel
   the generic .pp-rail-controls centering here so it isn't padded twice. */
.pp-home .pp-ps-controls {
  max-width: none;
  margin: clamp(14px, 2vw, 18px) 0 0;
  padding-inline: 0;
}
.pp-home .pp-ps-cta { margin-top: clamp(24px, 3vw, 32px); }
/* Micro Fix 25, issue 2: unlike every other lead paragraph on this page
   (`.pp-ps-intro p`, `.pp-proof-card__desc`, `.pp-review blockquote`, all of
   which explicitly carry source's `.body` class values), this rule only ever
   declared `margin-bottom` -- font-size/line-height/color/font-weight were
   never set, so the paragraph fell through to the theme's default (heavier,
   full-opacity) paragraph styling instead of source's `.body { font-size:16px;
   line-height:1.5; color:var(--ink-72); font-weight:300; }`. Added here,
   matching source exactly.
   Micro Fix 25, issue 3: `.wp-block-buttons` below (the button row) had no
   margin-top of its own, so WordPress's un-neutralized Flow block-gap default
   (this group has no explicit "layout" attribute) collapsed against this
   paragraph's own margin-bottom to whichever was larger -- inflating the
   paragraph-to-buttons gap beyond the intended clamp(14-18px). Neutralized
   directly on the buttons wrapper below, the same one-off pattern already
   used for `.pp-story__body > .wp-block-buttons` (Micro Fix 16 RETRY) --
   deliberately NOT added to the shared §16 protection list, since that list
   zeroes both margin-block-start AND -end, which would have also erased this
   paragraph's own intentional margin-bottom. */
.pp-home .pp-ps-cta p { font-size: 16px; line-height: 1.5; color: var(--pp-ink-72); font-weight: 300; margin-bottom: clamp(14px, 2vw, 18px); }
/* Process fidelity (1.0.51), issue C -- root cause: the Gutenberg translation pass left
   the whole intro sentence wrapped in `<strong>`. Every value of this paragraph already
   matched source's `.body` (Poppins via the page, 16px, line-height 1.5, color ink-72,
   font-weight 300, letter-spacing normal -- verified in styles.css:257), but UA
   `strong { font-weight: bolder }` resolves from the parent's 300 to 400, so the text
   rendered one full weight step heavier than the designer's. The text and its markup
   are left exactly as translated; the emphasis tag simply keeps the paragraph's own
   weight. Scoped to this CTA paragraph only. */
.pp-home .pp-ps-cta p :is(strong, b) { font-weight: inherit; }
.pp-home .pp-ps-cta .wp-block-buttons { margin-block-start: 0; }
/* Micro Fix 25, issue 4: source's two buttons here carry `.btn--48`
   (`height:38px; padding-inline:19px`) on top of the base `.btn` (40px/21px)
   -- this pack's markup never applied an equivalent size override, so both
   buttons rendered at the larger base size. Scoped to this CTA's own buttons
   only, per this round's explicit instruction not to touch the shared
   `.wp-block-button .wp-block-button__link` base rule (used by other CTAs
   sitewide at the correct, unrelated 40px/21px size). */
.pp-home .pp-ps-cta .wp-block-buttons .wp-block-button__link { height: 38px; padding-inline: 19px; }

/* Micro Fix 21, issue 1: max-width (.pp-mw-16, 16ch) and font-size (clamp(22px,
   5.6vw,32px) base / clamp(28px,3vw,40px) desktop, both below) were re-verified
   character-for-character identical to source's .ps-intro__title -- the wrapping
   mismatch is the same theme-default `text-wrap: balance` issue already found and
   fixed for every other heading on this page (Mentioned In, Two Routes, Financing,
   Reviews); this heading was simply another place that override was never added.
   text-wrap:pretty lets the already-correct 16ch width actually govern the wrap
   point, matching source's own inherited body-level value. */
.pp-home .pp-ps-intro__title { font-size: clamp(22px, 5.6vw, 32px); line-height: 1.1; letter-spacing: -.02em; font-weight: 500; text-wrap: pretty; }
.pp-home .pp-ps-intro p { margin-top: 10px; font-size: 16px; line-height: 1.5; color: var(--pp-ink-72); font-weight: 300; }

.pp-home .pp-ps-line { display: none; }

.pp-home .pp-ps-step {
  flex: 0 0 min(78vw, 300px);
  display: grid;
  grid-template-columns: auto 1fr;
  grid-template-areas: "num title" "media media" "desc desc";
  column-gap: 10px;
  row-gap: 14px;
  align-items: center;
}
.pp-home .pp-ps-step__num {
  grid-area: num;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 30px;
  height: 30px;
  flex: none;
  border-radius: 50%;
  font-size: 12px;
  font-weight: 500;
  color: var(--pp-ink-56);
  background: var(--pp-surface);
  border: 1px solid var(--pp-ink-line);
}
.pp-home .pp-ps-step--01 .pp-ps-step__num { background: var(--pp-accent-soft); border-color: var(--pp-accent-soft); color: var(--pp-ink); }
.pp-home .pp-ps-step--04 .pp-ps-step__num { background: var(--pp-ink); border-color: var(--pp-ink); color: var(--pp-bone); }
/* Micro Fix 23: source's step title (`<h4 class="h3 h3--step ps-step__title">`)
   combines the shared `.h3` class (font-weight:500, letter-spacing:-.018em) with
   `.h3--step` (font-size only). This pack's own `.pp-ps-step__title` never
   declared its own font-weight at all -- unlike `.pp-home h2.wp-block-heading`/
   `h3.wp-block-heading` a few sections up, which both explicitly set
   font-weight:500, there was simply never an `h4.wp-block-heading` equivalent
   rule, and the step titles render as `<h4 class="wp-block-heading
   pp-ps-step__title">`. With nothing of this pack's own setting the weight, it
   fell back to the active theme's own default H4 weight, which renders
   visibly bolder than source's explicit 500. Fixed by adding font-weight:500
   directly to this shared selector -- the same one all four steps already use,
   so 01-04 get it identically with no per-step rule. font-size, line-height,
   letter-spacing and wrapping are untouched. */
.pp-home .pp-ps-step__title { grid-area: title; margin: 0; font-size: clamp(21px, 3vw, 26px); font-weight: 500; }
.pp-home .pp-ps-step__media {
  grid-area: media;
  aspect-ratio: 4 / 5;
  border-radius: var(--pp-r-lg);
  overflow: hidden;
  background: var(--pp-paper);
  margin: 0;
}
.pp-home .pp-ps-step__media img { width: 100%; height: 100%; object-fit: cover; }
.pp-home .pp-ps-step__desc { grid-area: desc; margin: 0; font-size: 14px; line-height: 1.55; color: var(--pp-ink-72); font-weight: 300; }

/* Process mobile fidelity (1.0.55) -- mobile only (below the source's 900px desktop
   breakpoint; the desktop grid layer is untouched). Root cause, from the CSS: each step card
   is its own grid (num+title / media / desc rows, all `auto`) inside a flex rail whose cards
   stretch to the tallest card (`align-items` default). A grid container taller than its
   content hands the free space to its `auto` rows (`align-content: normal` = stretch), and
   `align-items: center` then centres the photo and the description inside those enlarged rows.
   With source's short English copy the slack is a few px; with the Latvian titles (1-3 lines)
   and descriptions (3-6 lines) it differs card to card, so each card's photo sat at a different
   height with a different gap above/below it and every description began at a different Y.
   Fix = a shared row structure instead of per-card rows: the rail becomes a 3-row grid whose
   rows (title / photo / description) are sized by the tallest item in each row across ALL cards,
   and each card is a subgrid spanning those 3 rows (its own areas, 14px row gap and 2 columns
   are unchanged). Photos, photo->text gap and text start therefore line up across the rail for
   any copy length, with no copy-specific height. Card width is exactly the old `flex-basis`
   (`min(78vw, 300px)`), the column gap is the old rail gap, and the rail keeps its scroll
   container, snap points and children, which is all frontend.js reads (offsetLeft, scrollWidth,
   children). Browsers without subgrid keep the previous flex layout. */
@media (max-width: 899px) {
  /* Photo geometry never depends on the image file: the figure is the box (card width, 4/5,
     clipped); the picture is painted into it, so no intrinsic size / percentage-height
     resolution can make one step's photo wider or taller than another's. */
  .pp-home .pp-ps-step .pp-ps-step__media {
    position: relative;
    width: 100%;
    min-width: 0;
  }
  .pp-home .pp-ps-step .pp-ps-step__media img {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
  }
}
@supports (grid-template-rows: subgrid) {
  @media (max-width: 899px) {
    .pp-home .pp-rail--steps.pp-ps-rail {
      display: grid;
      grid-auto-flow: column;
      grid-auto-columns: min(78vw, 300px);
      grid-template-rows: auto auto auto;
      column-gap: clamp(12px, 2vw, 20px);
      row-gap: 0;
    }
    .pp-home .pp-rail--steps.pp-ps-rail > .pp-ps-step {
      grid-row: span 3;
      grid-template-rows: subgrid;
      align-items: start;
    }
    /* Number + title keep source's look (circle centred on a one-line title), but start at the
       top of the shared title row; a longer title simply grows the row for every card. */
    .pp-home .pp-ps-step .pp-ps-step__num { align-self: start; }
    .pp-home .pp-ps-step .pp-ps-step__title {
      align-self: start;
      min-height: 30px;
      display: flex;
      align-items: center;
    }
  }
}


/* ==========================================================================
   14  FAQ ACCORDION
   ========================================================================== */

/* Micro Fix 33: source's `.faq-cols` uses a single CSS Grid with `grid-
   template-columns: repeat(auto-fit, minmax(min(100%,380px),1fr))`, which
   collapses to one column at narrow widths without a hard breakpoint --
   its own border-bottom always sits correctly beneath whatever ends up as
   the single last row, by construction, since the grid container's own
   height always matches its (single, at that width) column's content.
   This pack instead uses WordPress's native `wp:columns` block (two real
   `.wp-block-column`s, matching source's HTML), which stacks via its own
   flex-based responsive mechanism -- a fundamentally different mechanic
   from source's grid auto-fit, and static file comparison could not
   confirm why the two produce different visual results for this specific
   border. Rather than leave `.pp-faq-cols`'s own border-bottom in place
   (which depends on however WordPress core's stacking actually resolves
   its box) or guess at a numeric compensating fix, ownership of the final
   divider is moved to the actual last `.pp-faq` row -- which, at any
   width, is guaranteed to share the exact same box/width as every other
   `.pp-faq` row, since they all render via the one shared `.pp-faq {
   border-top:... }` rule below. `.pp-faq-cols`'s own border-bottom is kept
   only at desktop (§media below), where source's underlying reason for
   NOT putting it on a single row still applies at mobile-scoped widths but
   not at desktop's genuinely side-by-side two-column layout (an
   uneven-height accordion could leave the last-row border under only the
   shorter column there). */
.pp-home .pp-faq-cols {
  margin-top: clamp(28px, 4vw, 52px);
}
.pp-home .pp-faq-cols.wp-block-columns { gap: 0 clamp(28px, 5vw, 64px); }
.pp-home .pp-faq { border-top: 1px solid var(--pp-ink-line); }
.pp-home .pp-faq-cols .wp-block-column:last-child .pp-faq:last-child {
  border-bottom: 1px solid var(--pp-ink-line);
}
.pp-home .pp-faq__q {
  padding: 20px 0;
  font-size: clamp(16.5px, 2vw, 19px);
  font-weight: 500;
  letter-spacing: -.015em;
  cursor: pointer;
  transition: color .2s;
  position: relative;
  padding-right: 34px;
}
.pp-home .pp-faq__q:hover { color: var(--pp-accent); }
.pp-home .pp-faq__q::after {
  content: "+";
  position: absolute;
  right: 0;
  top: 20px;
  font-size: 22px;
  line-height: 1;
  font-weight: 300;
}
.pp-home .pp-faq.pp-faq--open .pp-faq__q::after,
.pp-home .pp-faq.pp-is-open .pp-faq__q::after { content: "−"; }
.pp-home .pp-faq__a {
  padding: 0 0 22px;
  font-size: 16px;
  line-height: 1.6;
  color: var(--pp-ink-72);
  font-weight: 300;
  max-width: 52ch;
}
.pp-home .pp-faq__a[hidden] { display: none; }
/* FAQ right-column repair (1.0.52). Root cause of all five reported symptoms: in the
   translated Gutenberg content the right column's answers lost the `pp-faq__a` hook
   class -- three items had been re-authored as plain, unclassed paragraphs (two of them
   as TWO paragraphs, one with an empty spacer paragraph between). frontend.js (section
   04) finds each answer with `row.querySelector('.pp-faq__a')` and does `return` when
   there is none, so those rows were never initialised: no button role / tabindex /
   aria-expanded, no `hidden`, no click handler -> permanently open and uncollapsible
   (A, B), no +/- change. Every rule above keys off the same class, so the plain
   paragraphs also got the theme's default paragraph look instead of source's
   `.faq__a` (16px / 1.6 / weight 300 / ink-72 -> theme: darker and heavier, C) and
   lost its `padding: 0 0 22px`, which is the answer-to-divider breathing room (D);
   open rows being too tall with a cramped bottom is the sum of those (E).
   Fix = markup, left column untouched: content.html now wraps each multi-paragraph
   right-column answer in ONE `core/group.pp-faq__a` (the single answer element the
   script and the rules expect; the paragraphs and their text are unchanged). The group
   takes every `.pp-faq__a` rule above -- padding-bottom 22px, 16px / 1.6 / 300 / ink-72,
   52ch measure, `[hidden]` -- exactly like the left column's single paragraph, and the
   rules below only make the paragraphs inside it inherit that look instead of the
   theme's, with a modest gap where an answer has more than one paragraph. */
.pp-home .pp-faq .pp-faq__a > p {
  margin: 0;
  font-size: inherit;
  line-height: inherit;
  font-weight: inherit;
  color: inherit;
  max-width: none;
}
.pp-home .pp-faq .pp-faq__a > p + p { margin-top: .75em; }
/* FAQ right-column question -> answer gap (1.0.54). Owner of the oversized gap: the theme's
   Flow block-gap, `:where(.is-layout-flow) > * + * { margin-block-start: <theme blockGap> }`
   (the same mechanism neutralised in section 16 and in several Micro Fixes). Source's
   answer sits directly under the question row: the only space between them is the
   question's own `padding: 20px 0` -- `.faq__a` has no top margin or padding. The pack
   already cancels that default for paragraphs (`.pp-home p { margin: 0 }`, specificity
   0,1,1 > the :where() default), which is why the left column's single `<p class="pp-faq__a">`
   is correct. The right column's answers became a `core/group.pp-faq__a` in 1.0.52 -- a
   <div>, not a <p> -- so that reset does not reach it, and the theme's block-gap landed on top
   of the question's 20px padding: two spacing mechanisms stacked (question padding + Flow
   margin). This removes only the unintended second one, on the group answers only (the left
   column's paragraphs already compute to 0, so they are unchanged). The question row, the
   group's own `padding-bottom: 22px` (answer -> divider), the typography and the
   accordion logic are untouched. */
.pp-home .pp-faq .wp-block-group.pp-faq__a { margin-block-start: 0; }


/* ==========================================================================
   15  FINAL CTA
   ========================================================================== */

.pp-home .pp-cta {
  position: relative;
  overflow: hidden;
  background: var(--pp-ink);
  min-height: clamp(460px, 70vw, 640px);
  display: flex;
  align-items: center;
}
.pp-home .pp-cta__media { position: absolute; inset: 0; z-index: 0; margin: 0; }
.pp-home .pp-cta__media img { width: 100%; height: 100%; object-fit: cover; }
.pp-home .pp-cta__inner {
  position: relative;
  z-index: 2;
  width: 100%;
  max-width: var(--pp-maxw);
  margin-inline: auto;
  text-align: center;
  display: flex;
  flex-direction: column;
  align-items: center;
}
.pp-home .pp-cta__inner h2 { color: var(--pp-paper); line-height: 1.04; letter-spacing: -.022em; }
.pp-home .pp-cta__btns { margin-top: clamp(26px, 4vw, 38px); width: 100%; max-width: 520px; }
.pp-home .pp-cta__btns .wp-block-button { flex-grow: 1; }
.pp-home .pp-cta__btns .wp-block-button__link { min-width: 220px; width: 100%; }

/* Micro Fix 39: final CTA, below desktop only (existing 899px breakpoint).
   Source: `.cta__inner { padding: clamp(48px,9vw,96px) var(--gutter) }` (sides =
   clamp(18px,4vw,40px), i.e. 18px on phones); `.cta h2` is `mw-20` at
   clamp(30px,7vw,64px); buttons are `.btn.btn--58` in `.btn-row.cta__btns`
   (`.btn-row { gap:10px; flex-wrap:wrap }`, `.btn-row > .btn { flex:1 1 200px }`,
   `.cta__btns .btn { flex-grow:1; min-width:220px }`, `.btn--58 { height:46px;
   padding-inline:24px }`), so on a phone each button wraps onto its own row and
   fills it, 46px tall, 10px apart.
   Pack, and why each item differed:
   (a) WIDTH + HEADLINE WRAP -- one shared cause. `.pp-cta__inner` carries the
       block's inline `padding:var(--wp--preset--spacing--mycabin-section-compact)`
       on ALL FOUR sides (clamp(48px,7vw,96px) = 48px on a phone). Top/bottom
       already equal source's 48px on phones (left untouched: section top/bottom
       spacing is frozen), but the sides are 48px instead of source's 18px gutter,
       squeezing the content column by 60px: the buttons (which fill it) came out
       narrower and "Two ways to start a" no longer fit on the first line. Restored
       the side padding to the pack's own --pp-gutter (same clamp as source's
       --gutter). It has to be !important only because the competing value is an
       inline style attribute, which no normal selector can outrank; padding-inline
       leaves padding-top/bottom alone.
   (b) HEADLINE: box, font-size (mycabin-display-l = clamp(30px,7vw,64px)),
       max-width (20ch) and line-height already match source, so nothing else was
       changed; `text-wrap: pretty` (source's body-inherited value) is restored
       so the theme's heading `text-wrap: balance` cannot re-split it.
   (c) HEIGHT: the shared button base gives every pack button height:40px /
       padding-inline:21px; source's CTA buttons are `.btn--58` = 46px / 24px.
       Font, colors, border and radius untouched. Selector carries the extra
       .wp-block-button so it outranks the base rule regardless of file order.
   (d) STACK GAP: source's row gap is 10px; the pack's `.wp-block-buttons` had none
       of its own, so it fell through to the theme's flex block-gap. Set to 10px
       (same fix as the process CTA stack, Micro Fix 32). */
@media (max-width: 899px) {
  .pp-home .pp-cta__inner { padding-inline: var(--pp-gutter) !important; }
  .pp-home .pp-cta__inner h2 { text-wrap: pretty; }
  .pp-home .pp-cta__btns { gap: 10px; }
  .pp-home .pp-cta__btns .wp-block-button .wp-block-button__link {
    height: 46px;
    padding-inline: 24px;
  }
}

/* Micro Fix 41: final CTA buttons at desktop (>=900px, the file's existing desktop
   breakpoint). Source has NO desktop-specific rule for this component -- the values
   are identical at every width: `.btn-row { display:flex; flex-wrap:wrap; gap:10px }`,
   `.btn-row > .btn { flex:1 1 200px }`, `.cta__btns { width:100%; max-width:520px }`,
   `.cta__btns .btn { flex-grow:1; min-width:220px }`, `.btn--58 { height:46px;
   padding-inline:24px }`. Two 220px-min buttons plus a 10px gap fit inside the 520px
   row, so they share it equally: (520 - 10) / 2 = 255px each, 46px tall.
   Pack at desktop: the row width (100% / max 520px), the buttons' flex-grow and the
   220px min-width already match source; the differences are the two that Micro Fix
   39 corrected for phones only (its rules live inside max-width:899px, deliberately
   left alone here):
   - GAP (and, as a direct consequence, WIDTH): `.pp-cta__btns` is a
     `.wp-block-buttons` flex row with no gap of its own, so it takes the theme's
     larger flex block-gap instead of source's 10px. Because both buttons share a
     fixed 520px row, every extra pixel of gap comes straight out of the two
     buttons' width -- this one cause explains "too far apart" and "too narrow"
     together. Set to 10px so each grows to source's 255px. No per-button width,
     padding or margin is used to fake it.
   - HEIGHT: the shared button base gives every pack button height:40px /
     padding-inline:21px; source's `.btn--58` is 46px / 24px. Font, colors, border
     and radius are untouched. The selector carries the extra .wp-block-button so it
     outranks the base rule regardless of file order.
   The row's own position (centered, max 520px), headline, headline -> row gap,
   background, section padding/height and the whole mobile layer are untouched. */
@media (min-width: 900px) {
  .pp-home .pp-cta__btns { gap: 10px; }
  .pp-home .pp-cta__btns .wp-block-button .wp-block-button__link {
    height: 46px;
    padding-inline: 24px;
  }
}


/* ==========================================================================
   16  FLOW-LAYOUT MARGIN PROTECTION (Page Pack Spec §5 / rule 6)
   --------------------------------------------------------------------------
   Every custom horizontal/grid repeated-item component below is a plain
   core/group with no explicit `layout` attribute in content.html, left that
   way on purpose so each stays a normal, fully flexible Gutenberg container.
   WordPress's default "Flow" layout for a group with no layout override
   generates `<selector> > * + *{ margin-block-start: <blockGap> }`
   (wp_get_layout_style(), wp-includes/block-supports/layout.php),
   regardless of whether this Page Pack ever asked for a gap — correct for
   ordinary vertical content, but not for a component that already owns its
   own child positioning via CSS/JS. Neutralized narrowly, on exactly these
   components' own direct children — never a global reset, and never
   touching a card's own internal spacing. See
   docs/HOMEPAGE-WORDPRESS-FLOW-MARGIN-FIX-HANDOFF.md for the confirmed
   real-world case this rule is carried forward from.

   Micro Fix 17, issue D: `.pp-review` (the review-card component) was missing from
   this list -- every other repeated-item component was already protected, but this
   one was simply never added. Its own `blockquote` + `.pp-review__who` children
   (a plain core/group with no "layout" attribute, same as every sibling component
   here) were exposed to the un-neutralized default, inflating a card's total
   content height beyond source's (already-correct, already-matching)
   `padding:16px; gap:12px` alone -- and because `.pp-marquee--reviews
   .pp-marquee__group { align-items: stretch; }` already correctly matches source
   (confirmed), every card in a row stretches to match the tallest one, so even one
   inflated card's extra height visibly affected the whole visible row. Card width,
   padding, gap, and typography were all independently re-verified against source
   and already matched -- height alone was the mismatch, and only because of this
   one missing protection-list entry.

   Micro Fix 22: `.pp-ps-step > *` was REMOVED from this list (it is no longer
   present below). Unlike every other entry here, it was never actually needed:
   `.pp-ps-step__num` is always the FIRST child, so WP's own `* + *` block-gap
   selector never targets it regardless (no preceding sibling to satisfy the
   adjacency); and `.pp-ps-step__title`/`__desc`/`__media` each already carry
   their own real, non-!important margin (`margin:0` at mobile, matching
   source's `.ps-step__title/__desc { margin:0 }`; real `margin-top` values at
   desktop -- 14px/8px/clamp(16px,2vw,20px), matching source's `.ps-step__title/
   __desc/__media` exactly) that already wins against WP's zero-specificity
   `:where()` default on its own, same as every other heading/paragraph on this
   page. Because this entry used `!important`, it did not just neutralize the
   WP default -- it ALSO defeated this pack's own desktop `margin-top`
   declarations (which carry no !important), forcibly zeroing the marker-to-
   title, title-to-description, and description-to-image gaps that source's
   own margin-based desktop spacing model depends on entirely (source's own
   comment: "spacing between the number, title, description and photo comes
   only from their own margins"). Removing it restores all three gaps to their
   already-correct, already-matching values with no other change: mobile is
   unaffected (relies on `row-gap`, not margins, and its own `margin:0` rules
   are untouched), and `.pp-ps-step__num` still receives no margin from
   anywhere else, so its top-of-row position -- and therefore its centering on
   `.pp-ps-line` -- is unchanged either way.

   Micro Fix 24: the SAME class of bug, on a DIFFERENT list entry. Three prior
   rounds (Micro Fix 21 issue 4, 22 issue 1, 23 issue 1) found the timeline
   line's own rule (`.pp-ps-line{margin-top:15px}`, desktop) byte-identical to
   source and concluded no discrepancy existed -- true for the rule itself, but
   incomplete: `.pp-ps-line--r1`/`--r2` are direct children of `.pp-ps-grid`,
   not of `.pp-ps-step`, so the entry actually catching them was
   `.pp-home .pp-ps-grid > *` below, not the one removed in Micro Fix 22. With
   the user's explicit one-time authorization, a live render (dev.mycabin.lv,
   this pack's own deployed v1.0.27) was inspected via getComputedStyle and the
   CSSOM's matched-rules list, which confirmed the line's *computed*
   margin-top was 0px, not the declared 15px, sourced exactly to this entry --
   same specificity as `.pp-ps-line`'s own rule (both `.pp-home X > *`-shape,
   two classes), decided by this entry's `!important` alone. Restoring 15px
   live (via direct CSSOM edit, matching the fix below exactly) moved the
   line's center to within 0.5px of the circle's true center for both 01/02
   and 03/04 -- confirming this was the entire cause, with no further
   adjustment needed. (That 0.5px residual traces to the live circle
   rendering at `box-sizing:content-box`, 32px total instead of the 30px this
   pack's CSS assumes -- circle size is explicitly frozen this round and the
   residual is visually imperceptible, so it was left untouched.) Fixed by
   excluding `.pp-ps-line` from this entry via `:not()`, rather than removing
   the whole entry: `.pp-ps-intro`, `.pp-ps-rail`, and `.pp-ps-cta` -- the
   other direct children of `.pp-ps-grid` -- were confirmed (live, `.pp-ps-
   intro`'s computed margin-top) to still need this protection against the
   same un-neutralized WP default, so removing the entry outright (as was safe
   for `.pp-ps-step`'s children in Micro Fix 22, which all had adequate real-
   rule protection of their own) would have regressed the left intro column's
   position -- explicitly frozen this round. This is the first round this
   Homepage project has used the one-time Chrome exception; every prior fix
   was reached and verified through static file comparison alone.

   Micro Fix 25, issue 1: the SAME class of bug found again, on the SAME entry
   fixed in Micro Fix 24 -- `.pp-ps-cta` is also a direct child of `.pp-ps-
   grid` (a sibling of `.pp-ps-line`, `.pp-ps-intro` and `.pp-ps-rail`), so it
   was equally caught by this entry, which forcibly zeroed its own real
   `margin-top:clamp(24px,3vw,32px)` rule (above) via `!important` -- pulling
   the whole CTA column flush to the top of its grid row instead of the
   source-equivalent inset, which read as "sits too high." Unlike `.pp-ps-
   intro` (confirmed in Micro Fix 24 to genuinely need this protection, since
   it has no margin-top of its own to compete with the theme's Flow default),
   `.pp-ps-cta` -- like `.pp-ps-line` before it -- already has its own real,
   sufficiently-specific rule that would beat the zero-specificity WP default
   on its own, with no protection needed. Excluded via the same `:not()`
   mechanism, extended to cover both classes.

   Micro Fix 31, issue 2: the SAME bug, on the LAST remaining un-excluded
   direct child of `.pp-ps-grid` that actually needed it -- `.pp-rail.pp-
   rail--steps.pp-ps-rail` (the mobile step-card rail) has its own real
   `margin-top:clamp(28px,4vw,40px)` (matching source's `.ps-rail` exactly),
   which this entry's `!important` was forcibly zeroing, pulling the first
   process step up flush against the intro paragraph instead of the
   source-equivalent gap -- the "paragraph -> first step gap too small"
   symptom. Like `.pp-ps-line`/`.pp-ps-cta`, `.pp-ps-rail`'s own rule is
   already specific enough to beat the zero-specificity WP Flow default
   without needing this protection, so it is excluded the same way.

   Micro Fix 32, issue 1: the FOURTH instance of this exact bug in this
   exact entry -- `.pp-rail-controls.pp-ps-controls` (the mobile step
   progress/count/arrows row) is also a direct child of `.pp-ps-grid`
   (a sibling of `.pp-ps-rail`, confirmed in content.html: the controls
   markup follows immediately after `.pp-ps-rail`'s closing tag, both
   inside `.pp-ps-grid`). Its own real `margin: clamp(14px,2vw,18px) 0 0`
   (matching source's `.ps-controls { margin-top: clamp(14px,2vw,18px); }`
   exactly) was being forcibly zeroed by this entry's `!important`, pulling
   the entire controls row flush against the step description above --
   the "controls row sits too close to the description" symptom. Same
   safety reasoning as the three prior exclusions: `.pp-ps-controls`'s own
   two-class selector already beats the zero-specificity WP Flow default
   unaided, so excluding it from this list regresses nothing. */

.pp-home .pp-rail > *,
.pp-home .pp-stories > *,
.pp-home .pp-marquee__group > *,
.pp-home .pp-proof-grid > *,
.pp-home .pp-portrait-grid > *,
.pp-home .pp-portrait-col > *,
.pp-home .pp-model > *,
.pp-home .pp-route > *,
.pp-home .pp-story > *,
.pp-home .pp-review > *,
.pp-home .pp-cta > *,
.pp-home .pp-ps-grid > *:not(.pp-ps-line):not(.pp-ps-cta):not(.pp-ps-rail):not(.pp-ps-controls),
.pp-home .pp-hero > *,
.pp-home .pp-routes > *,
.pp-home .pp-demobar__inner > *,
.pp-home .pp-demobar__text > *,
.pp-home .pp-dock__inner > *,
.pp-home .pp-faq-cols .wp-block-column > * {
  margin-block-start: 0 !important;
  margin-block-end: 0 !important;
}


/* ==========================================================================
   17  DESKTOP LAYER (min-width: 900px)
   ========================================================================== */

@media (min-width: 900px) {

  .pp-home .pp-hero__video--mobile { display: none; }
  .pp-home .pp-hero__video--desktop { display: block; }

  .pp-home .pp-hero__title { font-size: clamp(40px, 3.8vw, 72px); }
  .pp-home .pp-hero__photo img { transform: scale(1.1); transform-origin: center top; }
  .pp-home .pp-hero__content {
    justify-content: flex-end;
    padding-left: var(--pp-rail-pad);
    padding-right: var(--pp-rail-pad);
    padding-bottom: clamp(48px, 6vw, 84px);
  }
  .pp-home .pp-hero__btns { margin-inline: 0; }
  /* Post-translation button fidelity -- hero CTA row. Source: a 440px row of two
     equal-width buttons (`.hero__btns { max-width:440px }` + `.btn { flex:1 1 0 }`,
     which only stays on one line because the English labels fit). Measured live:
     with the Latvian labels at the desktop type scale (16px, 29px side padding) the
     two buttons' unwrappable min widths (274px + 225px + 12px gap) exceed that fixed
     440px cap, so `flex-wrap: wrap` dropped the second button to its own line (both
     stretched to 440px) at every width above 900px. Below 900px the clamped 14px
     type / 14-22px padding still fit in 440px, so that range is deliberately left
     exactly as source. From the source's own 900px desktop breakpoint the row is
     content-driven instead: two EQUAL columns (grid 1fr, sized by the longer label,
     like source's equal split), never narrower than source's 440px
     (`min-width: min(440px, 100%)`), never wider than its column. Height, gap,
     padding, radius, font size and weight are untouched, so any label length
     renders as one clipped-free row of identical-width pills. The editor's own
     block-list layout (`.block-editor-block-list__layout`, which can also hold the
     inserter) is excluded so Gutenberg's button blocks keep their flex layout. */
  .pp-home .pp-hero__btns.wp-block-buttons:not(.block-editor-block-list__layout) {
    display: grid;
    grid-auto-flow: column;
    grid-auto-columns: 1fr;
    width: max-content;
    min-width: min(440px, 100%);
    max-width: 100%;
  }

  .pp-home .pp-demobar__street { display: inline; }

  .pp-home .pp-model { aspect-ratio: .68; }
  .pp-home .pp-model__badge { padding: 5px 12px; font-size: 12px; }
  .pp-home .pp-model__title { font-size: clamp(21px, 2.4vw, 26px); }
  .pp-home .pp-model__info { bottom: 20px; transition: transform .4s var(--pp-ease); }
  .pp-home .pp-model__actions {
    transform: translateY(100%);
    opacity: 0;
    padding-top: 54px;
    transition: transform .4s var(--pp-ease), opacity .3s ease;
  }
  .pp-home .pp-model:hover .pp-model__info,
  .pp-home .pp-model:focus-within .pp-model__info { transform: translateY(-108px); }
  .pp-home .pp-model:hover .pp-model__actions,
  .pp-home .pp-model:focus-within .pp-model__actions { transform: translateY(0); opacity: 1; }

  .pp-home .pp-proof-media-grid { flex-direction: row; align-items: flex-start; gap: clamp(32px, 4vw, 64px); }
  .pp-home .pp-proof-media { flex: 0 0 clamp(360px, 40vw, 520px); aspect-ratio: 4 / 5; }
  .pp-home .pp-proof-media video { height: 100%; object-fit: cover; }
  .pp-home .pp-proof-content { flex: 1 1 0; display: flex; flex-direction: column; }
  .pp-home .pp-proof-grid { grid-template-columns: repeat(2, 1fr); flex: 1; margin-top: clamp(20px, 2.8vw, 32px); }
  .pp-home .pp-proof-card { padding-top: 0; border-top: 0; gap: 10px; }
  .pp-home .pp-proof-card__head { flex-direction: column; align-items: flex-start; gap: 12px; }
  .pp-home .pp-proof-card__icon { width: 26px; height: 26px; }
  .pp-home .pp-proof-card__desc { margin-left: 0; font-size: 14px; }
  /* Micro Fix 13, issue C: source's `.proof-head { padding-bottom:
     clamp(20px,2.4vw,28px); }` desktop-only override wraps just the "Nothing left
     to chance." heading in its own dedicated element, adding this gap before the
     feature grid on top of .proof-grid's own (already-correct, already present in
     this pack) desktop margin-top: clamp(20px,2.8vw,32px). This pack never
     converted that wrapper (the heading is a direct child of .pp-proof-content,
     with no .pp-proof-head equivalent) -- reproduced as an equivalent margin-bottom
     directly on the heading itself, which is visually identical to padding-bottom
     on a single-child wrapper, without adding markup. #proof scoping (rather than
     the bare .pp-mw-16 class, which is also used by an unrelated "process" section
     heading) keeps this from leaking elsewhere. Desktop-only, matching source's own
     scope for this specific rule -- mobile relies solely on .proof-grid's own
     larger margin-top (clamp(34px,5vw,64px), unchanged, already correct). */
  .pp-home #proof h2.pp-mw-16 { margin-bottom: clamp(20px, 2.4vw, 28px); }
  /* Micro Fix 13, issue D (desktop-only): source's `.proof__head h3 { font-size:
     17px; }` desktop override is a flat value, smaller than the mobile clamp this
     heading otherwise inherits. This pack's h3 uses the `mycabin-heading-m` preset
     (clamp(19px,2.4vw,22px) -- correct at mobile, matches source's own base .h3
     rule exactly) via WordPress's `"fontSize":"mycabin-heading-m"` block attribute,
     which generates a `.has-mycabin-heading-m-font-size` class with `!important`
     baked in by WordPress core (the same "Global Styles wins via importance, not
     specificity" mechanic already found and fixed for the Financing heading in
     Micro Fix 12) -- so a plain override here would lose the same way. `!important`
     is used for the same reason as that precedent: the narrowest possible fix,
     required specifically because the competing rule is itself !important. */
  .pp-home #proof .pp-proof-card__head h3 { font-size: 17px !important; }
  .pp-home .wp-block-buttons.pp-proof-cta { width: max-content; margin: clamp(48px, 6vw, 72px) auto 0; }
  .pp-home .pp-proof-cta .wp-block-button { width: auto; }
  .pp-home .pp-proof-cta .wp-block-button__link { width: auto; }

  .pp-home .pp-portrait-grid-clip { max-height: 760px; }
  .pp-home .pp-portrait-grid { grid-template-columns: repeat(4, 1fr); gap: clamp(16px, 1.6vw, 24px); }
  .pp-home .pp-portrait-col { gap: clamp(16px, 1.6vw, 24px); }
  .pp-home .pp-portrait-col:nth-child(1) { transform: translateY(40px); }
  .pp-home .pp-portrait-col:nth-child(2) { transform: translateY(0); }
  .pp-home .pp-portrait-col:nth-child(3) { transform: translateY(24px); }
  .pp-home .pp-portrait-col:nth-child(4) { transform: translateY(64px); }

  .pp-home .pp-stories {
    display: grid;
    grid-template-columns: 1.6fr 1fr;
    grid-template-rows: 1fr 1fr;
    gap: clamp(12px, 1.6vw, 20px);
    margin-top: clamp(36px, 5vw, 60px);
    overflow: visible;
    padding-bottom: 0;
  }
  .pp-home .pp-story { flex: initial; }
  .pp-home .pp-story:first-child { grid-row: 1 / 3; min-height: clamp(420px, 52vw, 580px); }
  .pp-home .pp-story:not(:first-child) { min-height: clamp(204px, 25vw, 280px); }
  .pp-home .pp-story__quote { font-size: clamp(22px, 2.6vw, 36px); line-height: 1.1; max-width: 18ch; -webkit-line-clamp: unset; }
  .pp-home .pp-story__name { margin-top: 16px; }
  /* Micro Fix 16, issues A/D (desktop, all cards): source's desktop `.story__body
     { padding: clamp(22px,2.4vw,32px); }` -- still an inline-style override here,
     still needs !important. */
  .pp-home .pp-story__body { padding: clamp(22px, 2.4vw, 32px) !important; }
  .pp-home .pp-story:not(:first-child) .pp-story__quote { font-size: clamp(15px, 1.6vw, 18px); max-width: 26ch; }
  .pp-home .pp-story:not(:first-child) .pp-story__name { margin-top: 10px; font-size: 14px; }
  .pp-home .pp-story:not(:first-child) .pp-story__fact { font-size: 12px; }
  .pp-home .pp-story:not(:first-child) .pp-story__cta { margin-top: 12px; }
  /* Micro Fix 16, issues B/C/D (desktop, small cards only): source's desktop
     `.story:not(:first-child) .story__body { padding: clamp(16px,2vw,22px); }` --
     noticeably smaller than the large card's own clamp(22px,2.4vw,32px) above, the
     specific reduction this pack's inline-style-driven padding never applied,
     which is why the two smaller cards' content sat measurably higher/more inset
     than the large card's own (already closer-to-correct) padding value. */
  .pp-home .pp-story:not(:first-child) .pp-story__body { padding: clamp(16px, 2vw, 22px) !important; }
  .pp-home .pp-stories-controls { display: none; }

  .pp-home .pp-ps-display { font-size: clamp(52px, 5.4vw, 76px); }
  .pp-home .pp-ps-grid {
    display: grid;
    /* Process follow-up (1.0.53): `minmax(0, 1fr)` instead of source's `1fr`. A bare `1fr`
       is `minmax(auto, 1fr)`: a track can never be narrower than the min-content of any item
       in it, so one wide item inflates its column and the other `1fr` columns shrink to
       whatever is left -- the three columns, and every photo in them, stop being equal.
       With a 0 minimum the three columns are always exactly equal thirds, whatever the
       translated content is. Same gaps as source. */
    grid-template-columns: repeat(3, minmax(0, 1fr));
    column-gap: clamp(24px, 3vw, 40px);
    row-gap: clamp(40px, 5vw, 56px);
  }
  .pp-home .pp-ps-intro { grid-column: 1; grid-row: 1; }
  .pp-home .pp-ps-intro__title { font-size: clamp(28px, 3vw, 40px); }
  .pp-home .pp-ps-line { display: block; height: 1px; background: var(--pp-ink-line); align-self: start; margin-top: 15px; }
  .pp-home .pp-ps-line--r1 { grid-column: 2 / 4; grid-row: 1; }
  .pp-home .pp-ps-line--r2 { grid-column: 1 / 3; grid-row: 2; }
  .pp-home .pp-ps-rail { display: contents; }
  .pp-home .pp-ps-step {
    position: relative;
    z-index: 1;
    flex: none;
    display: flex;
    flex-direction: column;
    align-items: stretch;
    row-gap: 0;
  }
  .pp-home .pp-ps-step--01 { grid-column: 2; grid-row: 1; }
  .pp-home .pp-ps-step--02 { grid-column: 3; grid-row: 1; }
  .pp-home .pp-ps-step--03 { grid-column: 1; grid-row: 2; }
  .pp-home .pp-ps-step--04 { grid-column: 2; grid-row: 2; }
  .pp-home .pp-ps-step__num { align-self: flex-start; }
  .pp-home .pp-ps-step__title { order: 2; margin-top: 14px; }
  /* Process fidelity (1.0.51), issue A -- shared image row. Source keeps every photo on
     one line by padding each description to exactly three lines
     (`.ps-step__desc { min-height: calc(1.55em * 3) }`, a number measured for the English
     copy). The translated titles (up to 2 lines) and descriptions (4-5 lines) are taller
     and differ per step, so the cards' text blocks end at different heights and each
     photo, which simply followed its own text, started at a different Y. The row is now
     aligned structurally instead: the two (or three) cards sharing a grid row are already
     stretched to the same height by the grid, each card is a flex column, and the photo is
     pushed to the bottom of its card (`margin-top: auto`). Photos have the same width and
     the same 4/5 ratio, hence the same height, so equal bottoms mean an identical top
     edge, whatever number of lines the text above wraps to. The old gap between text
     and photo is kept as a minimum by moving it to the description's margin-bottom; the
     3-line min-height stays as source's floor. No height is tied to any copy length. */
  .pp-home .pp-ps-step__desc { order: 3; margin-top: 8px; margin-bottom: clamp(16px, 2vw, 20px); font-size: 16px; min-height: calc(1.55em * 3); }
  .pp-home .pp-ps-step__media { order: 4; margin-top: auto; aspect-ratio: 4 / 5; }
  /* Bigger cards so the four of them reliably overflow the rail and the
     arrow controls have something to scroll (see manifest.json notes). */
  .pp-home .pp-rail--steps.pp-ps-rail { flex: none; }
  .pp-home .pp-ps-step { flex: 0 0 min(34vw, 400px); min-width: 0; }
  .pp-home .pp-ps-controls { display: none; }
  .pp-home .pp-ps-cta { grid-column: 3; grid-row: 2; }
  /* Process follow-up (1.0.53) -- CTA buttons: deliberate vertical stack. 1.0.51 made the
     two translated buttons one row (`width: max-content`, allowed to overhang its column).
     That row was the width owner of the distortion QA found: a `max-content` box has a
     ~414px min-content contribution (its percentage max-width is cyclic, so it is ignored
     for intrinsic sizing), and under source's `repeat(3, 1fr)` that forced the CTA's track
     (max ~373px) to 414px and shrank the other columns -- columns and photos of different
     widths, which is also why the Step 01 photo (narrower column) ended up shorter and so
     lower than Step 02's when the row's photos are bottom-aligned. The grid no longer
     depends on this (tracks are `minmax(0, 1fr)`), and the buttons are kept inside their
     own column as a column of natural-width pills with source's 10px gap, so nothing here can
     widen or overhang the grid for any label length. Height / padding / radius / font are
     the accepted values from `.pp-ps-cta .wp-block-buttons .wp-block-button__link` above. */
  .pp-home .pp-ps-cta { min-width: 0; }
  .pp-home .pp-ps-cta .wp-block-buttons {
    flex-direction: column;
    flex-wrap: nowrap;
    align-items: flex-start;
    width: auto;
    max-width: 100%;
    gap: 10px;
  }
  .pp-home .pp-ps-cta .wp-block-buttons .wp-block-button,
  .pp-home .pp-ps-cta .wp-block-buttons .wp-block-button__link { flex: none; width: auto; }

  .pp-home .pp-faq-cols.wp-block-columns { flex-wrap: nowrap; }
  /* Micro Fix 33: restores source's desktop mechanism -- the outer grid's
     own border-bottom, unaffected by either column's individual height --
     for the genuinely side-by-side two-column layout at this breakpoint.
     The mobile-scoped last-row border above is turned off here so the two
     don't double up. */
  .pp-home .pp-faq-cols { border-bottom: 1px solid var(--pp-ink-line); }
  .pp-home .pp-faq-cols .wp-block-column:last-child .pp-faq:last-child { border-bottom: 0; }
}


/* ==========================================================================
   18  REDUCED MOTION
   ========================================================================== */

@media (prefers-reduced-motion: reduce) {
  .pp-home .pp-rail, .pp-home .pp-stories { scroll-behavior: auto; }
  .pp-home .pp-reveal, .pp-home .pp-reveal-2, .pp-home .pp-reveal-3 { animation: none; opacity: 1; transform: none; }
  .pp-home .pp-marquee__track { animation: none; }
  .pp-home .pp-ps-hero { height: auto; }
  .pp-home .pp-ps-hero__inner { position: static; height: auto; padding-block: clamp(48px, 8vw, 96px); }
  .pp-home .pp-ps-display { transform: none !important; }
  .pp-home .pp-ps-word { opacity: 1 !important; }
  /* Micro Fix 26: source neutralizes .link's background-size sweep here via
     its own sitewide `*,*::before,*::after{transition-duration:.001ms
     !important}` reset; this pack's reduced-motion block is component-
     scoped rather than global, so the equivalent entry is added directly. */
  .pp-home p a { transition: none; }
}
