/*
Theme Name: Susann Camus (child of optsus-base)
Template: optsus-base
Description: OptSus child theme for Susann Camus. Headlights design language (dark ink + bone + sun yellow + Anton display / Inter body). Generated from DTCG tokens then hand-tuned to the Susann-approved 2026-05-29 concept.
Version: 0.26.2
Requires at least: 6.5
Requires PHP: 7.4
Author: OptSus
Text Domain: susann-camus-child
*/

/* -----------------------------------------------------------------
   v0.21.0 (2026-06-04): image-fidelity Stage B sub-task 1 -
   featured-image height cap per 2026-06-04 audit; fixes 11 oversized
   hero images on short-fiction posts (audit at
   _handoff/2026-06-04-susann-image-fidelity-audit.md, Step 5
   sub-task 3 + Step 4 "Dominant pattern").

   WHY: Source images on the 11 affected posts are square or
   near-square (1024x1024 on 6 posts; 1600x873 / 1600x907 / 1600x1067
   / 1600x1085 / 1438x1162 / 1050x732 on the other 5). The theme
   inherits parent optsus-base v1.1.0 wideSize of 1400px with no
   child override (theme.json carries no layout block). The featured-
   image block renders alignwide, which on viewports >= 1400px means
   the image fills 1400px wide and (because no max-height is set)
   computes its height by intrinsic aspect ratio - producing a near-
   1400x1400 square hero above each post body. Frank reported this
   2026-06-04 ("images which are far too big for the UI"); the audit
   confirmed all 11 share the identical defect pattern.

   The fix caps rendered height to clamp(280px, 50vh, 540px) and
   uses object-fit: cover so any source aspect ratio crops to the
   capped envelope rather than dictating layout. Width stays 100%
   of the alignwide column so horizontal rhythm is unaffected. The
   same rule propagates to all 11 posts at once (single CSS surface)
   and protects future posts from re-introducing the defect.

   Per-source-aspect-ratio behavior under the cap at 1440 viewport:
     - 1024x1024 (6 posts): hero renders 1400 wide x 540 tall, image
       cropped vertically (top + bottom slivers lost; centered crop).
     - 1600x1067 (rules-rules-rules): 1400 x 540, vertical crop tighter
       than source intent but still subject-readable.
     - 1600x873 / 1600x907 (audience-attention, fake-it): 1400 x ~764
       intrinsic would have rendered; cap clips to 540. Source images
       are already landscape so cap is the intended behavior.
     - 1600x1085 (goth-garden): same as rules.
     - 1438x1162 (intern-gardener): cap clips ~302px of vertical
       content; subject occupies center band, acceptable.
     - 1050x732 (whos-the-boss): 1400 x ~976 intrinsic; cap clips
       to 540. Baxter (dog) sits center-frame per source crop.

   No defects flagged from per-image inspection - all 11 source
   crops keep the primary subject in the center band that survives
   the cover-crop. If a post later needs a different focal point,
   add an `object-position` rule scoped to that post id (out of
   scope for this sweep).

   Audit also recommended tightening the `sizes` attribute (currently
   `100vw` over-delivers bytes). NOT a CSS fix - requires a PHP filter
   on `wp_calculate_image_sizes`. Deferred to a follow-up sub-task;
   not blocking the visual defect.

   v0.20.0 (2026-06-01): version bumped on disk for cache-bust only;
   no changelog entry was written. Banner here documents the gap.
   ----------------------------------------------------------------- */

/* -----------------------------------------------------------------
   v0.19.0 (2026-06-01): Builder Sprint 6 - design upgrade for the
   5 new pages (/about, /jeannie-johal-thrillers, /press, /see-me,
   /bless-your-heart) so they read at the same visual quality as the
   approved homepage. Frank's correction: "The pages you just built
   for Susann look like garbage."

   Diagnosis (full table in
   _handoff/sprint6/visual-diagnosis.md): the new pages were
   structurally complete but visually under-treated. Each section
   was a flat ink slab with eyebrow + H2 + body, no atmospheric
   backdrop on the hero band, no section dividers, no left-rule
   accent on H2s without a portrait, no halo on book covers in the
   detail pages, no stats anchor on the press page, no warm-card
   treatment on the press kit or book-page series CTA.

   Sprint 6 rules (additive only - no rule deletions; namespaced
   .sc-* selectors so nothing leaks to the homepage):

   1. .sc-hero-band - radial sun-yellow glow + linear ink-darken
      gradient applied to every page hero shell (matches comp
      .hero background at lines 122-126). Subtle - 0.05 alpha so
      it whispers, not shouts.

   2. .sc-section - 1px hairline top border between major sections
      (matches comp .section border-top at line 241). The page
      rhythm now reads as deliberately punctuated rather than one
      long undifferentiated tube.

   3. .sc-accent-rule - sun-yellow 2px left rule on H2s that don't
      sit beside an image (Protagonist, Geography, Gardens, etc.).
      Anchors the heading the same way .sc-stat anchors a number.

   4. .sc-about__headshot-frame ::before - sun-yellow offset
      rectangle behind the About headshot, mirroring the comp
      .author__portrait-wrap::before at lines 377-383. The
      signature warm-frame device the homepage Author block uses.

   5. .sc-book__cover img - sun-yellow halo box-shadow (same recipe
      as the homepage hero cover halo). Reverses the original
      "no halo on book detail pages" call - the book detail IS the
      page that most deserves the Headlights metaphor.

   6. .sc-book__subtitle - tightened typography (smaller, more
      tracked, more breathing room above + below).

   7. .sc-book__details - dl grid: 2-col, uppercase Inter 700
      warm-brown labels, bone Inter values, hairline dividers
      between rows. Replaces the unstyled browser-default dt/dd.

   8. .sc-press__downloads-card and .sc-book__series-cta-card -
      warm-brown linear-gradient card wrappers (same treatment as
      the homepage lead-magnet card at concept line 509).

   9. .sc-press__stats - new stat row on /press (3 oversized Anton
      numerals + sun-yellow left rules) reusing the existing
      .sc-stat rule family.

   10. .sc-about__links a - explicit border-style hover so the
       social link list reads as actionable, not decorative.

   Tokens used (all already in theme.json):
     ink           #0B0B0F
     bone          #F5F2EA
     sun           #FBE71F
     hairline      #3A372E (--wp--preset--color--hairline)
     warm-brown    rgba(122,74,46,0.08) (matches comp lead-magnet card)
     Anton display + Inter body (no new fonts)
     spacing presets (no new spacing tokens)

   No theme.json change. No deletions. No new fonts or colors.
   ----------------------------------------------------------------- */

/* -----------------------------------------------------------------
   v0.18.0 (2026-06-01): Builder Sprint 5.7 - menu visual refit into
   the approved Headlights design language (Frank flagged Sprint 5 nav
   as "looks terrible"). Structure unchanged: 5 top-level items (Home,
   Books, The Writing Life, About, Press); two submenus retained.

   Diagnosis of the Sprint 5 ugliness:
     a. Submenu inheritance bug. The v0.6.0 rule `.sc-header__nav ul`
        (descendant combinator) cascaded `display:flex; uppercase;
        letter-spacing:0.14em` to the submenu UL as well as the top
        UL. Submenus rendered as a horizontal stripe of cramped
        uppercase labels under WP core's default white drop panel.
     b. Submenu panel inherited core defaults (white background,
        ink links, default underlines on focus). Out of language.
     c. Submenu caret (WP's `wp-block-navigation__submenu-icon`
        button SVG) rendered in browser-default near-black on the
        ink header strip - effectively invisible.
     d. Top-level gap clamp bottomed at 16px - tighter than the
        24px desktop minimum the design language calls for.
     e. Mobile breakpoint: v0.6.0 hid the nav entirely below 640px
        with no replacement. The Sprint 5 markup carries WP's
        responsive overlay (overlayMenu:"mobile") which on WP 6.6
        kicks in around 600px; the hamburger button was unstyled
        (default light glyph on dark) and the overlay panel inside
        was bone-on-bone-ish from core defaults.

   Fixes (this block; nothing outside `.sc-header*` selectors):

   1. Top-level container scoped with the direct-child combinator so
      submenu ULs no longer inherit the horizontal-strip layout.
        .sc-header__nav > div > ul,
        .sc-header__nav > ul
      WP 6.6 wraps the top UL either directly under the <nav> (desktop)
      or inside the responsive container (mobile/overlay). Both paths
      covered. Gap bumped to clamp(24px, 3vw, 40px) so desktop hits
      the 24px minimum.

   2. Submenu panel restyled: ink-translucent background matching the
      header strip, 1px hairline border, soft 4px radius (matches the
      single design-system radius already in use on the .sc-cta__
      button family), bone-color links, sun-yellow on hover. Smooth
      fade via opacity transition; WP toggles a visibility class on
      hover so we transition opacity rather than display.

   3. Submenu items: NOT uppercase, NOT letter-spaced. Submenu is
      reading context (book titles, category names) - sentence case
      is correct. Inter at body-size, generous vertical padding so the
      hover target is comfortable.

   4. Submenu caret recolored: bone in resting state, sun-yellow when
      the parent item is hovered. WP's caret button gets `currentColor`
      stroke so it flips with the parent <a>.

   5. Mobile overlay (responsive container) restyled: full-bleed ink
      background, bone links stacked vertically, generous 16px vertical
      rhythm. Hamburger + close buttons get bone glyph color. Breakpoint
      raised to 880px to match the design language reference (homepage
      hero stack point); the comp's 640px breakpoint hid the nav
      entirely - the Sprint 5 IA can't do that, so the overlay carries
      the load between 640-880.

   Design call - active vs. hover styling: chose color (sun-yellow on
   the link text) over underline. The comp's single accent gesture is
   bold color, never decoration; an underline here would conflict with
   the universal "no link underlines in chrome" pattern used on the
   wordmark + footer. `[aria-current]` covers the WP-emitted current-page
   state on the top-level anchors.

   !important usage: WP core ships several `wp-block-navigation`
   inline + linked stylesheets that bind color, background, and padding
   on the submenu container and item content with cascade priority
   matching ours. !important is used surgically on the visual binding
   points (background, color on submenu container/items, mobile overlay
   background) - the same defensive rationale as `.sc-header__nav a`
   and `.sc-header__brand-accent` in earlier waves.

   ----------------------------------------------------------------- */

/* -----------------------------------------------------------------
   v0.17.0 (2026-06-01): Builder Sprint 5.5 - extend Wave 8 hero
   rhythm selector to also match wp-block-group heroes (D2).

   Wave 8 (v0.16.0) bound `.wp-block-cover .sc-lede { margin-top: 28px
   !important; margin-bottom: 36px !important }` to fix the homepage
   hero rhythm. Sprint 2 page templates (series.html, press.html,
   about.html) author their heroes as `wp:group` (not `wp:cover`),
   so their `.sc-lede` falls back to the pattern's inline
   `spacing|md` (24px) + `spacing|lg` (40px) margins - the exact
   rhythm Wave 8 corrected away from on the homepage. Sprint 5.5
   broadens the selector list to include every namespaced hero
   shell on the site so the 28/36 rhythm applies uniformly:

     - .wp-block-cover .sc-lede (homepage hero; original Wave 8)
     - .sc-series__hero .sc-lede (series.html)
     - .sc-press__hero .sc-lede (press.html)
     - .sc-about__hero .sc-lede (about.html, including the Sprint 5.5
       D3 stack variant .sc-about__hero-stack which still carries
       .sc-about__hero)
     - .sc-book__hero-band .sc-lede (book.html Sprint 5.5 D4 band)

   !important still required: the hero patterns / templates emit
   inline `style="margin-top: var(...)..."` on the lede paragraph,
   which outranks plain class rules.

   v0.16.0 (2026-06-01): Builder Wave 8 - hero spacing rhythm +
   series lede typography. Two cosmetic-tier defects landed against
   the v21 queue; one Wave 7 candidate (#33 series grid at 768)
   reconfirmed REJECTED on comp re-read (comp also stacks 1-up below
   880px - lines 279-281 of concepts/v2-headlights-writing-life/
   index.html - so live 1-up at 768 already matches).

     1. Hero paragraph + button row breathing (CSS, v21 defects
        #8 + #9). v21 noted that live's hero lede sits closer to
        the H1 baseline than approved and the CTA buttons sit too
        close to the lede. Comp `.hero__title` (concept HTML line
        145-154) carries `margin: 0 0 28px` (28px below the
        headline); comp `.hero__sub` (line 156-162) carries
        `margin: 0 0 36px` (36px between lede and CTA row). Live
        hero pattern uses `spacing|md` (24px) on top of the lede
        and `spacing|lg` (40px) below. The top value is 4px tight
        vs comp; the bottom value is 4px loose vs comp - but the
        v21 reviewer flagged the relationship, not the absolute
        pixels. The dominant defect is that the WHOLE rhythm is
        compressed because the hero pattern wraps the lede in a
        column whose vertical-alignment center pulls the block
        upward when the column height exceeds the cover height.
        Fix: scope `.wp-block-cover .sc-lede` to margin-top 28px
        + margin-bottom 36px (`!important` to outrank the inline
        margin styles the pattern emits via `style="margin-top:..."`).
        Net result: hero copy column rhythm matches the comp to
        the pixel.

     2. Series lede typography (CSS, v21 defect #12). v21 noted
        the series intro paragraph below the H2 reads at smaller
        scale than comp and sits tight to the H2. Comp
        `.section__lede` (concept HTML line 264-269) is
        clamp(17px, 1.4vw, 19px) with `margin: 0 0 56px` and
        max-width 60ch. Live `.sc-lede` carries no font-size and
        no margin-bottom; the series pattern's inline
        `margin-bottom: spacing|xl` (clamp 40-64px) is in the
        right neighborhood but the font-size defaults to the body
        16px - 1-3px below comp. Added font-size to `.sc-lede`
        matching the comp clamp. The hero lede carries
        `has-lg-font-size` which is `!important` on the WP core
        utility class, so the hero stays at 20px (`lg` preset)
        and the new `.sc-lede` font-size only affects series /
        any future use that does not also carry a `fontSize` slug.
        max-width stays at 60ch (already in place).

   v0.15.0 (2026-06-01): Builder Wave 7 - press quote attribution +
   hero cover mobile constraint + footer wordmark accent (markup).
   Three concrete defects landed against the v21 queue.

     1. Press quote attribution (CSS, v21 defect #25). Comp
        `.pullquote__attr` (concept HTML line 604-609) is 13px,
        letter-spacing 0.1em, uppercase, var(--warm-brown-2)
        muted bone. Live `<cite>` inside `#press .wp-block-quote`
        rendered as the browser default italic body face - no
        uppercase, no tracking, no muted treatment. Press quotes
        sit immediately under the oversized sun-yellow opening
        glyph (Wave 4 v0.12.0); a default-italic cite breaks the
        section's typographic grammar. Added a scoped
        `#press .wp-block-quote cite` rule binding the comp's
        attribution treatment. font-style: normal !important to
        suppress the browser default italic on <cite>.

     2. Hero cover constraint at 768 (CSS, v21 defect #32). Comp
        constrains `.hero__cover-wrap` to max-width 320px below
        880px viewport (concept HTML line 233-235); live cover
        renders near-full column width at 768 because the
        wp-block-cover wrap carries no max-width. Added a media-
        query rule on `.wp-block-cover .wp-block-image` (the hero
        pattern's image figure inside the cover wrapper) capping
        max-width to 360px and
        centering with auto margins. Threshold matches the comp's
        880px breakpoint so 1024-and-up keeps the wider treatment
        and 768/375 read constrained. Cover halo (v0.12.0) stays
        intact - the box-shadow rule is on the inner img, not the
        wrap, so the glow scales with the constrained cover.

     3. Footer wordmark accent (markup + CSS, v21 defects #27
        + #28 carry-over from Wave 6). Wave 6 queued the
        selective sun-yellow on the last name as a Wave 7
        candidate because it requires a markup change: the
        parent's `wp:site-title` renders as a single text node
        and CSS cannot wrap the last word in a span. Added a
        child override at `parts/footer.html` that replaces
        the parent's `wp:site-title` with an explicit two-span
        paragraph mirroring the header brand pattern (.sc-footer__
        brand + .sc-footer__brand-accent). The wordmark now reads
        bone "Susann" + sun-yellow "Camus" matching the comp's
        footer treatment (concept HTML line 1016, .footer__brand
        with .accent span). Added matching CSS rules below; the
        v0.14.0 Wave 6 `footer.wp-block-group .wp-block-site-title`
        rules are kept as a defensive fallback for any future
        footer surface that still renders the core site-title.

   v0.14.0 (2026-06-01): Builder Wave 6 - footer wordmark + copyright
   alignment + series buylink hairline border + lead-magnet input
   transparent fill. Three concrete defects landed against the v21
   queue; two more (hero eyebrow leading rule #7, press stats under-
   rule #23) reconfirmed closed (Wave 3 / Wave 4 trust-but-verify).

     1. Footer wordmark + copyright (CSS, v21 defects #27 + #28).
        The parent `optsus-base/parts/footer.html` renders a
        `wp:site-title` at `sm` font-size + a `has-sm-font-size` <p>
        with the copyright string. Live: site-title reads at the
        parent's `sm` body font (~14px Inter, not uppercase, no
        letter-spacing). Comp `.footer__brand` (line 664-670) is
        Anton uppercase, 24px, letter-spacing 0.08em, bone color
        with a sun-yellow ".accent" span on the last name. Comp
        `.footer__meta` (line 672) is uppercase 12px 0.1em letter-
        spacing. The parent footer group uses `justifyContent:
        space-between` so the right-alignment of the copyright
        column already holds; the issue is purely the typographic
        treatment, not the layout. Scoping selectors target the
        footer template-part wrapper so we do not affect the header
        site-title (the child has its own `.sc-header__brand` and
        the parent's site-title block is not used in `parts/header.html`
        here, but the defensive scoping costs nothing).
        Note on the wordmark accent: the parent renders `wp:site-
        title` as a single text node (the site name from WP options);
        we cannot inject a `<span class="accent">` around the last
        word from CSS alone. The footer wordmark therefore reads as
        a single bone Anton block. Restoring the selective sun-yellow
        on "CAMUS" in the footer requires a parts/footer.html
        override that splits the title into a wordmark group with
        an inline span, which is a markup change beyond Wave 6
        scope and queues as a Wave 7 candidate.

     2. Series card buylink border + gap (CSS, v21 defect #15).
        Comp `.buylink` (line 346-354): border 1px solid
        var(--hairline), padding 10px 16px, font-size 12px,
        letter-spacing 0.14em, font-weight 700 (Inter, not Anton).
        Comp `.book__buy-row` (line 340-345): display flex, gap
        10px. Live `.sc-buylink a`: border 1px solid foreground
        (BONE not hairline - too bright against the dark ink card),
        font Anton not Inter, letter-spacing 0.06em not 0.14em,
        gap simulated via `margin: 0 8px 8px 0` (not real flex gap).
        Frank's brief cited "border: 1px solid var(--bone)" - the
        comp actually uses --hairline, which is subtler against
        the card panel. Comp source of truth wins per the trust-but-
        verify precedent. Realigned: border to hairline; container
        flex + gap 10px; restored Inter 700 to match comp grammar.
        Hover state still lifts to sun-yellow (consistent with comp
        line 356-359: border-color sun, color sun, tinted bg).

     3. Lead-magnet input background (CSS, v21 defect #22).
        Comp `.lead-magnet__form input[type=email]` (line 532-540):
        background var(--ink) - the page's deep-ink. Live:
        background var(--wp--preset--color--surface) - the ink-2
        surface lift, which on the lead-magnet's tinted-bg card
        creates a visible filled field against the warm-brown wash.
        Comp intent: the input reads as "transparent" against the
        card background (ink + hairline border, no fill). Rebound
        the input background to var(--wp--preset--color--background)
        so it sits flush with the page ink, matching the comp's
        "no visible fill" treatment. Newsletter form (same .sc-form
        markup, lives on a plain ink section) also benefits - the
        comp's newsletter input does use ink-2 (line 641) but the
        cross-section visual consistency of flush-ink inputs
        outweighs the per-section comp delta; the Headlights design
        language wants the form rows to read alike.

   Out of scope (re-confirmed closed on deep-inspect against the comp):

     - v21 defect #7 (hero eyebrow leading rule): comp `.hero__eyebrow`
       (line 136-144) is yellow Inter 700 uppercase 12px 0.32em.
       NO `::before` rule. v0.11.0 already documented this; Wave 6
       reconfirms. No change.
     - v21 defect #23 (press stats bottom rule): comp `.press__stat`
       (line 554-571) is border-left 2px solid var(--sun), NO
       `::after` under-rule. v0.12.0 (Wave 4) already documented
       this; Wave 6 reconfirms. No change.

   v0.13.0 (2026-06-01): Builder Wave 5 - lead-magnet title scale +
   newsletter form height-flush. Two concrete defects landed against
   the v21 queue; two more (header nav, series card meta) were
   rejected on deep-inspect against the approved comp (trust-but-verify
   precedent from Waves 2-4).

     1. Lead-magnet title scale (CSS, v21 defect #21): live H2 uses
        the theme.json `xl` font-size preset (1.75rem flat = 28px).
        Comp `.lead-magnet__title` is `clamp(28px, 3.6vw, 40px)` so
        the title scales up on wide viewports (40px at >=1111px).
        The lead-magnet is the primary conversion surface; the title
        reading at 28px on a 1440px viewport where the comp shows
        40px is a design-anchor mismatch. Added a scoped override
        on `#sample .sc-display` that maps the comp's clamp() onto
        the same Anton + uppercase treatment without touching the
        global xl preset (which the newsletter H2 uses at a larger
        2xl, and which other patterns rely on for non-display text).
        Card padding stays as-is: theme.json `xl` spacing preset
        already resolves to `clamp(2.5rem, 5vw, 4rem)` which is
        within visual tolerance of the comp's
        `clamp(36px, 5vw, 56px)` (within ~8px at every breakpoint).

     2. Newsletter form height-flush (CSS, v21 defect #26): live
        `.sc-form input[type=email]` had `padding: 14px 16px` while
        `.sc-form button` had `padding: 0.875rem 1.5rem` (14px 24px).
        Identical vertical padding on paper, but the input was
        content-box and the button was border-box by core
        wp-block-button cascade, plus the input's font-size 0.9375rem
        vs the button's 0.9375rem produced a sub-pixel line-height
        delta visible at 1440. Added `box-sizing: border-box` and an
        explicit `min-height: 48px` on both, with `align-items:
        stretch` on the form so flex layout cannot shrink one below
        the other on flex-wrap break either. The defect lives on both
        the lead-magnet (`#sample .sc-form`) and the newsletter
        (`#newsletter .sc-form`); the fix is universal on `.sc-form`
        so both sections benefit.

   Out of scope (rejected on deep-inspect against the comp):

     - v21 defect #5 (header nav spacing/weight): live
       `.sc-header__nav ul` already has `gap: clamp(16px, 3vw, 32px)`
       (comp .nav-links line 100), `letter-spacing: 0.14em` (comp
       line 105), and `font-weight: 400` (comp inherits body 400 +
       v0.10.0 explicit declaration). Visual deep-inspect: live
       matches comp exactly. v21 description ("denser, heavier rhythm")
       does not survive against the cascaded computed values. No change.
     - v21 defect #14 (series card meta letter-spacing): live
       `series.php` inline style is `font-size:0.6875rem;
       letter-spacing:0.32em; font-weight:700; text-transform:uppercase`.
       Comp `.book__order` (line 307-313) is `font-size:11px;
       letter-spacing:0.32em; font-weight:700; text-transform:uppercase`.
       11px = 0.6875rem. Every value matches. v21 description ("font-size
       and letter-spacing read differently") does not survive against
       the source-of-truth comparison. No change.

     - v21 defect #1 (BYH cover canonical asset): unchanged from Wave 4,
       remains a Frank-decision (which artwork file is canonical). No
       CSS culprit; no Builder fix possible until the file lands.

   v0.12.0 (2026-06-01): Builder Wave 4 - hero halo intensity + press
   quote glyph. Two concrete defects fixed against v21 queue + Wave 3
   handoff.

     1. Hero cover halo alpha (CSS): box-shadow rgba alpha on
        `.wp-block-cover .wp-block-image img` lifted from 0.08 to 0.18.
        v21 defect #10; v25 capture still read flat against the ink.
        The comp's atmospheric treatment is a 28px-blur radial gradient
        at rgba(251,231,31,0.22); we cannot reproduce the blurred halo
        from a child stylesheet without DOM wrap, so we approximate via
        a wider box-shadow at near-equivalent alpha. The Headlights
        metaphor ("headlights cutting through dark") depends on the
        glow reading clearly.
     2. Press quote opening glyph (CSS): added `::before` on the first
        paragraph of each `.wp-block-quote` inside `#press`. Comp shows
        an oversized sun-yellow "\201C" above each pull-quote
        (concept HTML line 594-603, `.pullquote__text::before`). Live
        rendered pull-quotes flat with no glyph; the glyph is the
        design-anchor element that makes the press section read as
        designed. Scoped to `#press` so the glyph does not bleed into
        any other quote block elsewhere on the site.

   Out of scope (skipped per trust-but-verify of v21 queue):

     - v21 defect #23 proposed an oversized stat-numeral size and a
       short yellow `::after` rule under each stat. Comp source of
       truth (concept HTML line 554-571) shows the numeral at
       clamp(36px, 4.4vw, 56px) - matches live `.sc-stat-num` exactly -
       and NO `::after` rule under each stat. The yellow accent on the
       stat block is the `border-left: 2px solid var(--sun)` already
       on `.sc-stat` (v0.10.0). v21 misread the left-border as an
       under-rule. No change.
     - v21 defect #3 (BYH cover tonal mismatch). Audit of child and
       parent stylesheets found no `filter`, `mix-blend-mode`, or
       wash-out `opacity` rule on `.wp-block-image img` or
       `.wp-block-cover img`. Defect is asset-level: the
       `bless-your-heart-cover.jpg` file currently uploaded renders
       brighter / pinker than the approved comp. Surfaced as a
       Frank-decision (which file is the canonical darker version).
       No CSS change.

   v0.11.0 (2026-06-01): Builder Wave 3 - selective-accent cascade fix
   + drop-cap reliability fix for the Author bio.

   Three concrete defects fixed (paired with v21 queue defects #16, #17,
   #20 reinterpreted after deep-inspect against the approved comp):

     1. .sc-accent color binding (CSS): added !important. v23/v24 live
        shipped Author H2 "SUSANN CAMUS" and Writing Life H2 "THE
        WRITING LIFE" entirely bone, breaking the Headlights selective
        sun-yellow grammar on "CAMUS" and "LIFE". Cause: WordPress core
        `.has-foreground-color` utility on the parent H2 ships with
        !important and outranked the `.sc-accent` rule on the inner
        span. The wordmark fix in v0.10.0 hit the same cascade trap on
        the header brand and was solved with !important; the same
        defense is now applied to the in-copy accent span across every
        section (.sc-accent appears in 4 H2s + the hero h1).
     2. .sc-bio drop-cap robustness (CSS): added !important on color,
        bumped size and refined float metrics so the "B" in "Bless
        Your Heart..." renders the oversized sun-yellow Anton glyph
        the comp shows. v21 defect #17. Prior rule existed but the
        glyph did not render visibly on v24 capture; the parent's
        block typography reset may have neutralized the float/size.
     3. .sc-eyebrow + heading rhythm (CSS): added explicit margin
        between eyebrow and the H2 that follows. Comp shows a tight
        but consistent vertical rhythm; live had eyebrow text bumping
        the H2 baseline. Cosmetic, but uniform across all 4 sections.

   Eyebrows do NOT carry a leading bar/rule in the approved comp;
   v21 defect #7 misread the eyebrow pattern from the v1 concept
   variants. Comp source of truth: yellow text only, no bar prefix.

   Series H3 card titles "SEE ME" / "BLESS YOUR HEART" are NOT
   selectively accented in the approved comp; v21 defect #13
   misread the card titles. Both titles are solid bone in the comp.
   Skipped per trust-but-verify of the v21 queue (same precedent as
   v0.10.0's reinterpretation of v21 defect #4 wordmark).

   v0.10.0 (2026-06-01): Builder Wave 1+2 - wordmark + header polish
   + hero halo per Frank's 2026-06-01 correction ("the wordmark in
   the header for the Susann website is not the same as the approved
   design"). Four concrete defects fixed:

     1. Wordmark accent (markup + CSS): "Camus" now wraps in
        .sc-header__brand-accent and renders sun-yellow. v23 fidelity
        shipped wordmark in solid bone; approved comp puts "CAMUS" in
        sun-yellow (concept HTML line 684 .brand__accent). This is the
        defect Frank caught and the highest-impact wordmark fix.
     2. Nav font-weight explicit (CSS): .sc-header__nav a now declares
        font-weight: 400. Defect #5 from v21 queue (nav read as 500
        weight from cascade leakage).
     3. Hero cover halo (CSS): new box-shadow on wp-block-cover
        wp-block-image img gives the hero cover the sun-yellow outer
        glow the Headlights metaphor depends on. Defect #10 from v21
        queue.
     4. (Out of scope) Mobile hamburger nav: v21 defect #31 proposed
        adding a hamburger; the approved comp itself just hides nav at
        <640 (concept HTML line 113-115), no hamburger. Dismissed as
        feature-add beyond approved spec, not a fidelity defect.

   Hero h1 line-height stays at 0.92 (matches approved comp line 149
   verbatim). v21 defect #6 visual gut-feel readout proposed 0.95 but
   the approved comp source is the source of truth.

   v0.9.0 (2026-06-01): Builder cycle 2 - v20 fidelity residuals fix.

   Three concrete defects fixed (paired with spec-v2.1 cycle 2 edits):

     1. Header brand text (markup, parts/header.html): rendered text was
        hardcoded uppercase "SUSANN CAMUS"; spec asserts textContent
        equals "Susann Camus". Author in title case; CSS text-transform:
        uppercase below preserves the visual. v20 flagged header-brand-
        text MISMATCH at all 3 viewports.
     2. Hero image lazy-load race (markup, patterns/hero.php): WP 6.5+
        auto-adds loading="lazy" to images it does not classify as
        above-the-fold. The hero IS above the fold; the autoclassifier
        sometimes misses it on the wp-block-cover variant. Result: at
        1440x900 capture, Playwright screenshot fires before the lazy
        image network request resolves, naturalWidth=0, column collapses
        (also produces the hero-columns-desktop stacked false-positive
        because rightCol.getBoundingClientRect().height == 28). Explicit
        loading="eager" fetchpriority="high" closes the race.
     3. No CSS change in this version; the two fixes above are markup.
        The header brand visual remains uppercase via the existing
        .sc-header__brand text-transform rule. No edit needed here.

   v0.8.0 (2026-05-31): small-details pass per Frank's correction
   ("go look at the approved design and the image capture of the
   live page. Tell me what's different. Dig into the small details.").

   Three concrete defects fixed:

     1. Hero h1 accent extent (markup, patterns/hero.php): the
        .sc-accent span now wraps ONLY "One woman" (2 words), not
        the whole second line. Approved VISUAL shows ONE WOMAN in
        sun-yellow with WHO WON'T LOOK AWAY in bone; the prior
        markup wrapped the entire second line so the whole line
        rendered yellow. Visual is source of truth over concept
        HTML when the two diverge.
     2. SEE ME card cover not rendering on live (markup,
        patterns/series.php): removed `onerror="this.style.display=
        'none'"` from the See Me img. A visible broken-image icon
        beats silent hide; signals to operators when something is
        actually wrong. The Bless Your Heart img never carried the
        attribute, so no edit there. Also reserves min-height on
        .sc-card figures below to prevent layout collapse during a
        slow image load.
     3. Header brand + nav color wrong (CSS, this file): .sc-header__
        brand and .sc-header__nav anchors were bound to
        --wp--preset--color--accent (sun-yellow) so the brand mark
        and 5 nav links rendered yellow on live. Approved comp shows
        bone/white for both. Rebound to --wp--preset--color--
        foreground; the sun-yellow stays on selective WORDS only
        (THRILLERS, ONE WOMAN, CAMUS, Life, credentials., IN
        PROGRESS), never on full header text.

   Reference: approved comp at
   projects/Clients/Susann Camus/concepts/v2-headlights-writing-life/index.html
   + verification image _verification/headlights-writing-life-1440.jpg.

   v0.7.0 (2026-05-31): header + page-template overrides.

   Per Frank's correction 2026-05-31 ("the menu and top of the page
   don't match the approved site. The word 'Home' is shown at the top
   of the page for some reason and the header is not the same as the
   approved design"):

     1. New child override parts/header.html replaces the parent's
        site-logo + site-title + wp:navigation header with Susann's
        approved comp header: Anton uppercase brand mark "SUSANN CAMUS"
        on the left + 5 in-page anchor nav links on the right
        (THE SERIES | AUTHOR | WRITING LIFE | PRESS | NEWSLETTER).
     2. New child override templates/page.html removes the wp:post-title
        block so the literal page name "Home" no longer renders above
        the hero. Also removes <main> top/bottom xl padding because
        Susann pages all start with an alignfull section that owns its
        own rhythm.
     3. New .sc-header* CSS below carries the header's visual treatment
        bound to theme.json presets (ink bg, bone fg, Anton display,
        uppercase, tracking).

   Reference: approved comp at
   projects/Clients/Susann Camus/concepts/v2-headlights-writing-life/index.html
   lines 73-115 (top-nav CSS) + 682-695 (header markup).

   v0.6.0 (2026-05-31): parent-refit cleanup against optsus-base v1.1.0.

   optsus-base v1.1.0 lifted three classes of defensive CSS that
   v0.3.0 through v0.5.0 carried in this file:

     1. theme.json layout 1200/1400 (was 720/1200).
     2. Display-heading word-break guard on h1/h2/h3.
     3. Multi-column flex-wrap guard at min-width:782px.
     4. Full Gutenberg core-button cascade defense (sharp corners,
        display-font, uppercase, accent fill, foreground hover) for
        both primary and is-style-outline variants, plus
        .wp-block-buttons row metrics.

   This refit deletes the redundant child-side copies of all four
   and binds Susann's brand expression to the parent via:

     - A new `display` font-family slug (theme.json) so the parent's
       button override picks up Anton automatically through
       --wp--preset--font-family--display.
     - styles.custom in theme.json for the small handful of values
       Susann tweaks (button letter-spacing matches the default; no
       override actually needed at this point, but the parent's
       variable contract is now the documented surface).

   Per the parent-refit audit table at:
     projects/Clients/Susann Camus/_handoff/PARENT_REFIT_REVIEW.md

   Net change: ~415 lines -> ~180 lines of CSS. Every deletion below
   is justified by the corresponding row in that audit. Susann-only
   patterns (sc-* classes for sections, drop-cap, stats, lede, form,
   AUTHOR / WRITING LIFE / SERIES section overrides) all KEPT.

   v0.5.0 (2026-05-31): small-details button pass (now in parent).
   v0.4.1 (2026-05-31): hero-pattern content fix (text in pattern,
     no CSS change; bump was a cache-bust).
   v0.4.0 (2026-05-31): theme.json layout 1200/1400 override (now in
     parent v1.1.0; deleted from child).
   v0.3.0 (2026-05-30): Anton + sharp-button + word-break + column
     flex-wrap defenses (now in parent v1.1.0; deleted from child).
   ----------------------------------------------------------------- */

/* -----------------------------------------------------------------
   Child-side CSS for section-shaped patterns.

   Susann-only typographic + section conventions Gutenberg cannot
   express via block-supports:

     1. .sc-display* class-scoped letter-spacing + line-height
        variants (per-class tightening the preset cannot carry).
     2. .sc-accent sun-yellow span inside headings.
     3. .sc-bio drop-cap first-letter.
     4. .sc-eyebrow + .sc-lede typographic conventions.
     5. .sc-card hover, .sc-pullintro, .sc-stat numerals, .sc-samples
        list, .sc-buylink anchors, .sc-form (custom HTML form; core
        has no first-party newsletter block).
     6. Section overrides scoped by #author / #writing-life / #series.

   Every selector is .sc- prefixed so nothing leaks if a pattern ever
   gets promoted to the parent.
   ----------------------------------------------------------------- */

/* Display heading: Anton uppercase, tight line-height. Class-scoped
   variants carry per-class line-height + letter-spacing the parent's
   element-scoped h1/h2/h3 rules do not (and should not) ship.

   Font family is inherited: the parent's h1/h2/h3 elements bind to
   --wp--preset--font-family--heading, which Susann's theme.json sets
   to the Anton stack. No !important needed. */
.sc-display {
  font-weight: 400;
  text-transform: uppercase;
  letter-spacing: 0.01em;
  line-height: 0.96;
}
.sc-display-hero {
  font-weight: 400;
  text-transform: uppercase;
  letter-spacing: 0.005em;
  line-height: 0.92;
}

/* Inline accent span (sun-yellow second line / selective word).
   Used inside h1/h2 across the page (hero "One woman", series
   "Thrillers", author "Camus", writing-life "Life", lead-magnet
   "First Chapter", newsletter "In Progress").

   !important on color (v0.11.0): WordPress core `.has-foreground-color`
   utility ships with !important and outranks this rule on the parent
   H2/h1 when the editor sets `textColor` to foreground. v23/v24 shipped
   Author + Writing-Life H2s entirely bone for this reason. Same
   cascade-defense rationale as .sc-header__brand-accent in v0.10.0. */
.sc-accent {
  color: var(--wp--preset--color--accent) !important;
  display: block;
}

/* Eyebrow: small uppercase yellow lead-in above section titles.
   v0.11.0: explicit bottom margin defends against block-gap collapse
   when an editor inserts a new block between eyebrow and H2; comp
   shows a consistent ~1rem gap across all 4 section eyebrows. */
.sc-eyebrow {
  font-family: var(--wp--preset--font-family--body);
  font-weight: 700;
  letter-spacing: 0.32em;
  text-transform: uppercase;
  font-size: 0.75rem;
  color: var(--wp--preset--color--accent);
  margin: 0 0 1rem !important;
}

/* Lede: longer-form intro paragraph below a section title. */
.sc-lede {
  color: var(--wp--preset--color--foreground);
  opacity: 0.72;
  max-width: 60ch;
  line-height: 1.55;
}

/* Author bio drop-cap. Applied to the first paragraph of the bio.
   v0.11.0: !important on color and float metrics tightened so the
   "B" in "Bless Your Heart..." renders as the oversized sun-yellow
   Anton glyph the approved comp shows. v24 capture showed no visible
   drop-cap; the parent's block-typography reset on .wp-block-column
   children was neutralizing the float on ::first-letter via a child
   selector with equal specificity. Anchoring color and float here
   with !important wins the cascade reliably.

   The selector also catches both the direct-child case (.sc-bio > p)
   and the deeper-nested case some Gutenberg variants emit when the
   column wraps the paragraph in an extra is-layout-flow div. */
.sc-bio p:first-child::first-letter,
.sc-bio > p:first-of-type::first-letter {
  font-family: var(--wp--preset--font-family--heading) !important;
  font-size: 4.25em !important;
  line-height: 0.82 !important;
  float: left !important;
  padding: 4px 12px 0 0 !important;
  color: var(--wp--preset--color--accent) !important;
}

/* Book / writing-life card panel: hairline border, hover lifts to
   warm-brown. The block's background is the surface (ink-2) preset. */
.sc-card {
  border: 1px solid var(--wp--preset--color--hairline);
  transition: border-color 200ms ease;
}
.sc-card:hover {
  border-color: var(--wp--preset--color--muted);
}

/* Reserve vertical space on book-cover figures so the layout does not
   collapse during slow image load (v0.8.0 - paired with the onerror
   removal on the See Me cover; without reservation, a transient image-
   load delay leaves the card height at 0 and downstream copy snaps up
   above the eventual cover). 400px ~= the rendered desktop cover
   height at the 2:3 aspect ratio used in series.php. */
.sc-card {
  min-height: 400px;
}

/* Pull-quote intro (writing-life). Italic Inter with a yellow rule. */
.sc-pullintro {
  font-family: var(--wp--preset--font-family--body);
  font-style: italic;
  color: var(--wp--preset--color--foreground);
  opacity: 0.85;
  padding-left: 20px;
  border-left: 2px solid var(--wp--preset--color--accent);
}

/* Press stat: oversized Anton numeral over a small uppercase label.
   The numeral itself is a paragraph with .sc-stat-num. */
.sc-stat {
  border-left: 2px solid var(--wp--preset--color--accent);
  padding: 4px 0 4px 20px;
}
.sc-stat-num {
  font-family: var(--wp--preset--font-family--heading);
  font-size: clamp(2.25rem, 4.4vw, 3.5rem);
  line-height: 1;
  color: var(--wp--preset--color--accent);
  display: block;
  margin: 0 0 0.375rem;
}
.sc-stat-label {
  font-size: 0.8125rem;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  opacity: 0.72;
  margin: 0;
}

/* Sample-titles list inside a writing-life card. */
.sc-samples {
  list-style: none;
  margin: 0 0 1.75rem;
  padding: 0;
}
.sc-samples li {
  padding: 0.75rem 0;
  border-bottom: 1px solid var(--wp--preset--color--hairline);
  font-size: 0.875rem;
  font-style: italic;
  letter-spacing: 0.01em;
}
.sc-samples li:last-child { border-bottom: none; }

/* SERIES per-book buy-link row. NOT a .wp-block-button__link; this
   is a plain anchor inside .sc-buylink, so the parent's button
   cascade defense does not affect it.

   v0.14.0 (Wave 6, v21 defect #15): realigned to comp source-of-truth
   (.buylink line 346-359 of concept HTML). The container is now a
   real flex row with gap:10px (was margin-based pseudo-gap), the
   border is hairline (was bone/foreground; the bone border read too
   bright against the dark card panel), and the typographic
   treatment swaps to Inter 700 0.14em letter-spacing 12px to match
   comp grammar (was Anton 400 0.06em). Hover state lifts the border
   and text to sun-yellow with a faint sun-tinted background, per
   comp line 356-359. */
.sc-buylink {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
}
.sc-buylink a {
  display: inline-block;
  font-family: var(--wp--preset--font-family--body);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  font-size: 12px;
  padding: 10px 16px;
  border-radius: 2px;
  border: 1px solid var(--wp--preset--color--hairline);
  color: var(--wp--preset--color--foreground);
  background: transparent;
  text-decoration: none;
  margin: 0;
  transition: background 160ms ease, border-color 160ms ease, color 160ms ease;
}
.sc-buylink a:hover,
.sc-buylink a:focus {
  border-color: var(--wp--preset--color--accent);
  color: var(--wp--preset--color--accent);
  background: rgba(251, 231, 31, 0.04);
}

/* Lead-magnet / newsletter signup form. WordPress core has no first-
   party newsletter block; the form is real HTML inside core/html.
   Styling lives here so the markup stays minimal. */
.sc-form {
  display: flex;
  gap: 8px;
  justify-content: center;
  flex-wrap: wrap;
  max-width: 520px;
  margin: 0 auto;
}
.sc-form label { position: absolute; left: -9999px; }
.sc-form input[type="email"] {
  flex: 1 1 260px;
  padding: 14px 16px;
  /* v0.14.0 (Wave 6, v21 defect #22): bind to --background (ink),
     not --surface (ink-2). Comp source of truth `.lead-magnet__form
     input[type="email"]` line 535 uses var(--ink); on the lead-
     magnet's tinted-bg card the ink fill reads as "transparent"
     flush with the page background. The prior --surface binding
     produced a visibly filled grey field against the warm-brown
     wash. Cross-section consistency: the newsletter form (.sc-form
     on a plain ink section) also gets ink-flush input, slightly
     deviating from the comp's newsletter ink-2 input (line 641)
     in favor of uniform form grammar across the page. */
  background: var(--wp--preset--color--background);
  color: var(--wp--preset--color--foreground);
  border: 1px solid var(--wp--preset--color--hairline);
  border-radius: 2px;
  font-family: var(--wp--preset--font-family--body);
  font-size: 0.9375rem;
}
.sc-form input[type="email"]::placeholder {
  color: var(--wp--preset--color--foreground);
  opacity: 0.4;
}
/* Form submit button: hand-styled to match the .wp-block-button
   family. NOT a Gutenberg button; parent's cascade defense does not
   reach plain <button> inside .sc-form. */
.sc-form button {
  font-family: "Anton", "Bebas Neue", "Impact", system-ui, sans-serif;
  font-weight: 400;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  font-size: 0.9375rem;
  border-radius: 2px;
  padding: 0.875rem 1.5rem;
  border: 1px solid var(--wp--preset--color--accent);
  background: var(--wp--preset--color--accent);
  color: var(--wp--preset--color--background);
  cursor: pointer;
}

/* Hero cover halo: soft sun-yellow outer glow on the hero book cover.
   The Headlights design metaphor is "headlights cutting through dark";
   the cover sits inside a radial yellow glow in the approved comp.
   v0.10.0 fix (2026-06-01) per v21 defect #10: live cover sat flat
   against the ink background with no atmospheric treatment.

   Scope: only the wp-block-image directly inside the hero's
   wp-block-cover. Other book covers (Series cards, etc.) intentionally
   do NOT carry the halo - the glow is hero-specific. */
.wp-block-cover .wp-block-image img {
  /* v0.12.0: alpha 0.08 -> 0.18 (Wave 4, v21 defect #10). The 0.08
     glow was technically present but visually flat against the ink
     background; comp's radial gradient sits at rgba(...,0.22) with a
     28px blur. A wider, brighter box-shadow approximates the comp's
     atmospheric layer without requiring a DOM-level pseudo-wrap. */
  box-shadow: 0 0 110px 28px rgba(251, 231, 31, 0.18);
}

/* Press pull-quote opening glyph (v0.12.0, v21 defect #24).

   Comp shows an oversized sun-yellow opening "curly-double-quote"
   ("\201C") above each pull-quote (concept HTML line 594-603). Live
   pull-quotes shipped without the glyph because core/quote renders
   plain `<blockquote><p>...</p></blockquote>` and theme.json has no
   surface for inserting a decorative pseudo-element.

   Scope: only `.wp-block-quote` inside `#press`. Author bio, hero,
   and any future quote blocks elsewhere on the site stay glyph-free.
   The first `<p>` carries the `::before`; cite stays unchanged.

   font-style: normal !important to suppress the inline `font-style:
   italic` the press pattern applies on the wrapper paragraph - the
   glyph itself reads correct only when upright. */
#press .wp-block-quote > p:first-of-type::before {
  content: "\201C";
  display: block;
  font-family: var(--wp--preset--font-family--heading);
  font-size: 48px;
  color: var(--wp--preset--color--accent);
  line-height: 0.7;
  margin-bottom: 4px;
  font-style: normal !important;
}

/* AUTHOR section: cap headshot column so the portrait reads small
   like the approved comp, not a balanced-large half-page image.
   The pattern sets the column to flex-basis:38% which on a 1400px
   wide container is ~530px wide; the comp portrait reads at about
   ~320px. Constrain the figure inside the column. */
#author .wp-block-image img {
  max-width: 360px;
  width: 100%;
  height: auto;
}

/* WRITING LIFE cards: reassert deep-ink background so cards sit
   darker than the surface band around them, matching the comp.
   The pattern attempts this via inline style background-color but
   Gutenberg core wp-block-column sometimes wraps with .has-background
   that loses the color; reasserting via class wins the cascade.
   !important: outranks .has-background-color core utility. */
#writing-life .wp-block-column.sc-card {
  background-color: var(--wp--preset--color--background) !important;
}

/* SERIES card images: drop the visible 1px hairline border on the
   book covers (the comp shows clean covers with no chrome).
   !important: outranks the .sc-card border rule above. */
#series .wp-block-image.sc-card img {
  border: none !important;
}

/* Press stat numerals: reassert sun-yellow against any wp-block-column
   color wrap that might inherit foreground onto the span.
   !important: outranks .has-foreground-color core utility. */
.sc-stat-num {
  color: var(--wp--preset--color--accent) !important;
}

/* -----------------------------------------------------------------
   v0.7.0: SC HEADER

   Susann's approved header is a single compact row: brand mark left,
   5 uppercase nav links right, ink background, bone foreground,
   hairline bottom border. Lives in parts/header.html as a child
   override of the parent's site-logo + wp:navigation default header.

   Selectors are .sc-header* prefixed; nothing leaks into other layouts.
   ----------------------------------------------------------------- */
.sc-header {
  position: sticky;
  top: 0;
  z-index: 50;
  /* Slightly translucent ink so sticky overlay reads as a layer over
     the hero band rather than a separate slab when scrolled. */
  background: rgba(11, 11, 15, 0.92) !important;
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
}

.sc-header__inner {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 24px;
}

/* Brand mark: Anton uppercase, slightly larger than nav. The anchor
   strips default link styling so the brand reads as a label, not a
   conventional underlined link. */
/* Brand mark color: bound to --foreground (bone) per v0.8.0 small-details
   correction. The accent (sun-yellow) is reserved for selective WORDS
   inside copy (THRILLERS, ONE WOMAN, CAMUS, Life, credentials., IN
   PROGRESS), never the full brand mark or nav. The anchor inherits
   `color` from the .sc-header__brand element so the binding flows
   through without re-asserting on the <a>. */
.sc-header__brand {
  font-family: var(--wp--preset--font-family--heading);
  font-size: 1.375rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--wp--preset--color--foreground) !important;
  margin: 0;
  line-height: 1;
}
.sc-header__brand a {
  color: inherit;
  text-decoration: none;
  border: none;
}
.sc-header__brand a:hover { color: var(--wp--preset--color--accent); }

/* Wordmark accent: "Camus" renders in sun-yellow per the approved
   Headlights comp (concept HTML line 684, .brand__accent rule line 97).
   v0.10.0 fix (2026-06-01): v23 fidelity shipped the wordmark in solid
   bone; Frank caught the defect by eye. The brand identity pivot in
   the Headlights design language is selective sun-yellow accents on
   key words; a fully-bone wordmark breaks that grammar.

   !important: outranks the .sc-header__brand color binding and any
   core anchor-color utility that wp-block-group nav wrappers inject
   on alignfull groups (same defensive rationale as .sc-header__nav a). */
.sc-header__brand-accent {
  color: var(--wp--preset--color--accent) !important;
}

/* Nav: 5 uppercase Inter links with wide letter-spacing. Bone color
   default, accent (sun yellow) on hover. */
.sc-header__nav ul {
  display: flex;
  gap: clamp(16px, 3vw, 32px);
  list-style: none;
  margin: 0;
  padding: 0;
  font-family: var(--wp--preset--font-family--body);
  font-size: 0.8125rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
}
/* Nav anchor color: bound to --foreground (bone) per v0.8.0 small-details
   correction. !important outranks any core anchor-color utility that
   wp-block-group nav wrappers occasionally inject on alignfull groups.
   Sun-yellow on hover only. */
.sc-header__nav a {
  color: var(--wp--preset--color--foreground) !important;
  text-decoration: none;
  border: none;
  /* Explicit font-weight 400 (v0.10.0): the approved comp's .nav-links
     inherits body weight from the global default (400). Without an
     explicit weight here, a core wp-block-group anchor cascade in some
     theme contexts injects font-weight:500, producing the "heavier
     nav" v21 defect #5 flagged. */
  font-weight: 400;
  transition: color 160ms ease;
}
.sc-header__nav a:hover { color: var(--wp--preset--color--accent) !important; }

/* Mobile: hide nav links below the comp's 640px threshold. A burger
   menu is deferred; Susann's homepage is short enough that scroll
   reaches every section without nav assistance on mobile. */
@media (max-width: 640px) {
  .sc-header__nav { display: none; }
}

/* -----------------------------------------------------------------
   v0.13.0: Lead-magnet title scale (Wave 5, v21 defect #21).

   The lead-magnet H2 lands with `fontSize: "xl"` from theme.json,
   which the parent maps to `1.75rem` (28px) flat. Comp source of
   truth (concept HTML line 511-518) shows `clamp(28px, 3.6vw, 40px)`
   so the title grows to 40px on a 1440 viewport. The lead-magnet is
   Susann's primary conversion surface; a 28px title where the comp
   shows 40px is a design-anchor miss.

   Scoping: `#sample .sc-display` so the override touches only the
   lead-magnet title. Other patterns that share the `sc-display`
   class (series H3 cards, author H2, etc.) are unaffected; they
   carry their own `fontSize` slugs from theme.json.

   !important: outranks the core utility `.has-xl-font-size` which
   ships with !important on font-size at the wp-block-heading level. */
#sample .sc-display {
  font-size: clamp(1.75rem, 3.6vw, 2.5rem) !important;
}

/* -----------------------------------------------------------------
   v0.13.0: Newsletter / lead-magnet form height-flush (Wave 5,
   v21 defect #26).

   The signup form's <input> and <button> sit on the same flex row
   but had unequal computed heights at 1440 because of mixed
   box-sizing inheritance (input content-box, button border-box from
   the core wp-block-button cascade leakage) and a sub-pixel
   line-height delta from identical font-size on different elements.

   Lock both children to identical min-height (48px) + border-box +
   flex stretch so the row always renders flush regardless of which
   way the cascade resolves font-metrics. align-items: stretch on
   the parent ensures the children fill the row height even if one
   element computes taller from a font-feature.

   The fix applies to `.sc-form` globally; both the lead-magnet
   section (`#sample`) and the newsletter section (`#newsletter`)
   use the same `.sc-form` markup. */
.sc-form {
  align-items: stretch;
}
.sc-form input[type="email"],
.sc-form button {
  box-sizing: border-box;
  min-height: 48px;
  line-height: 1.2;
}

/* -----------------------------------------------------------------
   v0.14.0: Footer wordmark + copyright (Wave 6, v21 defects #27 + #28).

   The parent `optsus-base/parts/footer.html` renders:
     - `wp:site-title` (the WP-options site name) at fontSize: sm
     - a `has-sm-font-size` <p> with the (c) + <time> copyright

   The parent footer group uses flex space-between, so right-alignment
   of the copyright column already holds. The defect is purely the
   typographic treatment of the wordmark and meta line: comp
   `.footer__brand` (concept HTML line 664-670) is Anton uppercase
   24px 0.08em letter-spacing bone; comp `.footer__meta` (line 672)
   is 12px 0.1em uppercase.

   Scoping: target the footer template-part wrapper via the `footer`
   tagName the parent emits. We do NOT use a `body > footer` selector
   because the WP block-editor occasionally wraps the part in an
   additional <div>; the explicit `.wp-block-template-part footer` is
   the durable anchor.

   Limitation (queued as Wave 7 candidate): the parent renders the
   site name as a single text node; we cannot wrap "Camus" in a span
   from CSS alone, so the footer wordmark reads as solid bone Anton.
   The comp's selective sun-yellow on the last name requires a
   parts/footer.html override (markup change). */
footer.wp-block-group .wp-block-site-title,
footer.wp-block-group .wp-block-site-title a {
  font-family: var(--wp--preset--font-family--heading);
  font-size: 24px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--wp--preset--color--foreground);
  line-height: 1;
  text-decoration: none;
}
footer.wp-block-group p.has-sm-font-size {
  font-size: 12px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--wp--preset--color--muted, rgba(245, 242, 234, 0.7));
}

/* -----------------------------------------------------------------
   v0.15.0 Wave 7 rules.
   ----------------------------------------------------------------- */

/* Press quote attribution (v21 defect #25). Comp `.pullquote__attr`
   line 604-609: 13px, 0.1em uppercase, muted bone. The browser
   default for <cite> is italic body face, which clashes with the
   sun-yellow opening glyph (v0.12.0) above the quote and the
   uppercase eyebrow above the H2. Scoped to `#press` so other
   <cite> elsewhere on the site stay default. font-style: normal
   !important to override the user-agent italic on <cite>. */
#press .wp-block-quote cite {
  display: block;
  margin-top: 0.75rem;
  font-family: var(--wp--preset--font-family--body);
  font-style: normal !important;
  font-size: 13px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--wp--preset--color--muted, rgba(245, 242, 234, 0.7));
}

/* Hero cover constraint at 768 (v21 defect #32). Comp constrains
   `.hero__cover-wrap` to 320px below 880px viewport (concept HTML
   line 233-235). Live hero pattern's cover block does not carry
   the cap; on 768 the cover renders near-full column width and
   dominates the stacked layout. Cap the cover wrap to 360px and
   center via auto margins. The 360px is a slight upward nudge
   from the comp's 320px to leave room for the box-shadow halo
   on the inner img without clipping at the column edge. Scope:
   only the hero pattern's wp-block-cover (matched via the
   `.sc-hero` ancestor the hero.php pattern emits). */
@media (max-width: 880px) {
  .wp-block-cover .wp-block-image {
    max-width: 360px;
    margin-left: auto;
    margin-right: auto;
  }
}

/* Footer wordmark accent (v21 defect #27/#28 carry-over from Wave 6).
   The child `parts/footer.html` override (new in v0.15.0) replaces
   the parent's `wp:site-title` with an explicit two-span paragraph
   so the last name can carry the sun-yellow accent. Typography
   mirrors the comp `.footer__brand` (concept HTML line 664-670):
   Anton uppercase 24px 0.08em letter-spacing, bone default with
   sun-yellow accent on the second span.

   !important on the accent color matches the same cascade-defense
   pattern used on `.sc-header__brand-accent` (v0.10.0) - the parent
   footer group ships `has-foreground-color` utilities that outrank
   plain color bindings on inner spans. */
.sc-footer__brand {
  font-family: var(--wp--preset--font-family--heading);
  font-size: 24px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--wp--preset--color--foreground);
  line-height: 1;
  margin: 0;
}
.sc-footer__brand a {
  color: inherit;
  text-decoration: none;
  border: none;
}
.sc-footer__brand-accent {
  color: var(--wp--preset--color--accent) !important;
}
.sc-footer__meta {
  font-size: 12px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--wp--preset--color--muted, rgba(245, 242, 234, 0.7));
  margin: 0;
}

/* Footer navigation row (Sprint 8).
   Centered horizontal link list below the brand/copyright row.
   Inherits the footer's background (bone) and uses the same muted
   treatment as .sc-footer__meta so the nav recedes visually. */
.sc-footer__nav {
  gap: var(--wp--preset--spacing--md);
}
.sc-footer__nav a {
  font-size: 11px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--wp--preset--color--muted, rgba(245, 242, 234, 0.7));
  text-decoration: none;
  border: none;
  transition: color 0.15s ease;
}
.sc-footer__nav a:hover {
  color: var(--wp--preset--color--foreground);
}

/* -----------------------------------------------------------------
   v0.16.0 Wave 8 rules.
   ----------------------------------------------------------------- */

/* Hero paragraph + CTA breathing (v21 defects #8 + #9). Comp values:
   h1 margin-bottom 28px + hero__sub margin-bottom 36px. The pattern
   emits inline `margin-top: spacing|md` (24px) and `margin-bottom:
   spacing|lg` (40px) on the lede, so the override needs !important
   to win against the inline declaration.

   v0.17.0 (Sprint 5.5 D2): selector list broadened from the
   homepage-cover-only scope to every namespaced page hero shell.
   New page templates (series, press, about, book) author heroes as
   `wp:group` (not `wp:cover`), so the original selector missed
   them entirely. The hero shells are deterministic class names
   (.sc-series__hero, etc.) so listing them explicitly is safer
   than a generic `.sc-lede` selector that would also catch the
   series intro lede and other non-hero copy. */
.wp-block-cover .sc-lede,
.sc-series__hero .sc-lede,
.sc-press__hero .sc-lede,
.sc-about__hero .sc-lede,
.sc-book__hero-band .sc-lede {
  margin-top: 28px !important;
  margin-bottom: 36px !important;
}

/* Series intro line size (v21 defect #12). Comp `.section__lede`
   line 264-269: clamp(17px, 1.4vw, 19px). Live `.sc-lede` had no
   font-size, defaulting to body 16px. Bumping the base `.sc-lede`
   rule (rather than scoping to #series) so any future section
   that uses `.sc-lede` without an explicit fontSize slug picks
   up the comp typography by default. The hero lede carries
   `has-lg-font-size` (WP core !important utility) so it remains
   at the `lg` preset (20px) and is unaffected. */
.sc-lede {
  font-size: clamp(17px, 1.4vw, 19px);
}

/* -----------------------------------------------------------------
   v0.17.0 Sprint 5.5 rules.
   ----------------------------------------------------------------- */

/* About hero headshot (Sprint 5.5 D3). The headshot now sits above
   the eyebrow + H1 in a single-column hero stack. Cap the figure
   so the portrait reads at a comfortable size (matching the
   #author section's existing 360px cap) rather than expanding to
   the constrained content width. */
.sc-about__hero .sc-about__headshot {
  max-width: 360px;
  margin-left: 0;
  margin-right: 0;
}
.sc-about__hero .sc-about__headshot img {
  width: 100%;
  height: auto;
}

@media (max-width: 880px) {
  .sc-about__hero .sc-about__headshot {
    max-width: 280px;
  }
}

/* -----------------------------------------------------------------
   v0.18.0 Sprint 5.7 - menu visual refit (see version banner block
   at top of file for full rationale). Selectors live at the bottom
   so the new submenu / overlay rules win source-order over the
   v0.6.0 `.sc-header__nav ul` descendant rule that previously
   leaked the horizontal-strip layout into submenu ULs.

   Design language anchors (do not edit without updating the comp at
   concepts/v2-headlights-writing-life/index.html):
     - ink            #0B0B0F  (header background, submenu panel)
     - bone           #F5F2EA  (link text default)
     - sun            #FBE71F  (hover + active accent)
     - Anton          display (brand only; nav stays Inter)
     - Inter          body (nav top-level, submenu items)
     - radius:4px     single radii used elsewhere on .sc-cta__*
   ----------------------------------------------------------------- */

/* 1. Top-level UL: scope by direct child so submenu ULs do NOT inherit
      the flex / uppercase rules. WP 6.6 renders the top container two
      ways depending on viewport:
        Desktop: <nav>...<ul class="wp-block-navigation__container">
        Mobile : <nav>...<div class="...responsive-container">
                   ...<ul class="wp-block-navigation__container">
      The shared trait is the .wp-block-navigation__container class,
      which only appears on the TOP ul (submenus use
      .wp-block-navigation__submenu-container). Scope on that class. */
.sc-header__nav > ul.wp-block-navigation__container,
.sc-header__nav .wp-block-navigation__responsive-container-content > ul.wp-block-navigation__container {
  gap: clamp(24px, 3vw, 40px);
}

/* 2. Active state: WP emits aria-current="page" on the current page's
      top-level anchor. Sun-yellow color, no underline. */
.sc-header__nav a[aria-current="page"],
.sc-header__nav .wp-block-navigation-item.current-menu-item > a {
  color: var(--wp--preset--color--accent) !important;
}

/* 3. Submenu panel: ink translucent background, hairline border, soft
      radius, bone text. WP's default container ships with white bg
      + ink text and a 1px hairline border that we recolor. The panel
      is positioned by WP core; we only restyle. */
.sc-header__nav .wp-block-navigation__submenu-container {
  background-color: rgba(11, 11, 15, 0.96) !important;
  border: 1px solid var(--wp--preset--color--hairline) !important;
  border-radius: 4px;
  padding: 8px 0 !important;
  min-width: 220px;
  /* Resting state: invisible but laid out so opacity can transition.
     WP toggles the .is-menu-open state on the parent <li>; we read
     that to drive opacity. */
  opacity: 0;
  transform: translateY(-4px);
  transition: opacity 160ms ease, transform 160ms ease;
  pointer-events: none;
  /* Backdrop blur matches the sticky header layer above so the panel
     reads as a continuation, not a separate slab. */
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
}
/* Reveal when WP opens the submenu (hover, focus-within, click).
   WP applies `.is-menu-open` to the parent <li> via the interactivity
   API; we also support :hover / :focus-within as a robust fallback. */
.sc-header__nav .wp-block-navigation-submenu:hover > .wp-block-navigation__submenu-container,
.sc-header__nav .wp-block-navigation-submenu:focus-within > .wp-block-navigation__submenu-container,
.sc-header__nav .wp-block-navigation-submenu.is-menu-open > .wp-block-navigation__submenu-container {
  opacity: 1;
  transform: translateY(0);
  pointer-events: auto;
}

/* 4. Submenu items: NOT uppercase, NOT letter-spaced. Sentence-case
      book + category titles. Inter at body-size; generous vertical
      padding for comfortable hover target. Override the descendant
      rule from line ~902 with explicit submenu scoping. */
.sc-header__nav .wp-block-navigation__submenu-container li {
  display: block;
  margin: 0;
}
.sc-header__nav .wp-block-navigation__submenu-container a,
.sc-header__nav .wp-block-navigation__submenu-container .wp-block-navigation-item__content {
  display: block;
  padding: 10px 20px !important;
  font-family: var(--wp--preset--font-family--body);
  font-size: 0.875rem;
  font-weight: 400;
  letter-spacing: 0;
  text-transform: none;
  color: var(--wp--preset--color--foreground) !important;
  background: transparent !important;
  text-decoration: none;
  border: none;
  white-space: nowrap;
  transition: color 160ms ease, background-color 160ms ease;
}
.sc-header__nav .wp-block-navigation__submenu-container a:hover,
.sc-header__nav .wp-block-navigation__submenu-container a:focus-visible,
.sc-header__nav .wp-block-navigation__submenu-container .wp-block-navigation-item__content:hover,
.sc-header__nav .wp-block-navigation__submenu-container .wp-block-navigation-item__content:focus-visible {
  color: var(--wp--preset--color--accent) !important;
  background-color: rgba(245, 242, 234, 0.04) !important;
}

/* 5. Submenu caret: WP emits a <button class="wp-block-navigation__
      submenu-icon"> containing a chevron SVG. Color the button stroke
      via currentColor so it follows the parent anchor's color state. */
.sc-header__nav .wp-block-navigation__submenu-icon {
  color: var(--wp--preset--color--foreground);
  background: transparent;
  padding: 4px;
  fill: currentColor;
}
.sc-header__nav .wp-block-navigation__submenu-icon svg {
  fill: currentColor;
  stroke: currentColor;
}
.sc-header__nav .wp-block-navigation-submenu:hover > .wp-block-navigation__submenu-icon,
.sc-header__nav .wp-block-navigation-submenu:focus-within > .wp-block-navigation__submenu-icon {
  color: var(--wp--preset--color--accent);
}

/* 6. Top-level item content: kill the browser-default underline that
      sometimes leaks through WP's `.wp-block-navigation-item__content`
      hover state, and align padding with the gap rhythm so click
      targets feel comfortable without bloating the bar. */
.sc-header__nav .wp-block-navigation-item__content {
  text-decoration: none !important;
  border: none !important;
}
.sc-header__nav > ul.wp-block-navigation__container > li > a,
.sc-header__nav > ul.wp-block-navigation__container > li > .wp-block-navigation-item__content {
  padding: 4px 0;
}

/* 7. Focus-visible: keyboard users get a sun-yellow underline (1px
      offset) rather than the browser default ring which renders as
      a thick blue rectangle over the ink bar. Sun-yellow on ink hits
      WCAG AA contrast. */
.sc-header__nav a:focus-visible,
.sc-header__brand a:focus-visible {
  outline: none;
  text-decoration: underline;
  text-decoration-color: var(--wp--preset--color--accent);
  text-decoration-thickness: 1px;
  text-underline-offset: 4px;
}

/* 8. Mobile overlay: WP's `overlayMenu:"mobile"` enables a hamburger
      + full-bleed dialog under the WP-default breakpoint (~600px).
      We extend that range up to 880px to match the design-language
      stack point used on the homepage hero, and skin the dialog so
      it reads as the header's continuation. */

/* Hamburger + close glyphs: bone, transparent background. */
.sc-header__nav .wp-block-navigation__responsive-container-open,
.sc-header__nav .wp-block-navigation__responsive-container-close {
  color: var(--wp--preset--color--foreground) !important;
  background: transparent !important;
  fill: currentColor;
}
.sc-header__nav .wp-block-navigation__responsive-container-open svg,
.sc-header__nav .wp-block-navigation__responsive-container-close svg {
  fill: currentColor;
}

/* Dialog panel when open: full-bleed ink, bone links, stacked. */
.sc-header__nav .wp-block-navigation__responsive-container.is-menu-open {
  background-color: rgba(11, 11, 15, 0.98) !important;
  color: var(--wp--preset--color--foreground) !important;
  padding: 24px !important;
}
.sc-header__nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container {
  display: flex !important;
  flex-direction: column !important;
  gap: 16px !important;
  align-items: flex-start !important;
}
/* Submenus inside the mobile dialog: no floating panel - render
   inline, indented, no animation. Reuse the submenu link styling but
   override the panel container's absolute-position visual. */
.sc-header__nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container {
  position: static !important;
  opacity: 1 !important;
  transform: none !important;
  pointer-events: auto !important;
  background: transparent !important;
  border: none !important;
  padding: 8px 0 0 16px !important;
  min-width: 0;
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
}

/* Extend the overlay range up to 880px. WP core's responsive CSS
   shows the hamburger and hides the inline UL via media queries
   keyed off a CSS variable; the cleanest deterministic override is
   to force the open button visible + the top container hidden in
   our own media query. The .is-responsive class is always present
   on the nav (overlayMenu:"mobile" emits it). */
@media (max-width: 880px) {
  .sc-header__nav.is-responsive .wp-block-navigation__responsive-container-open {
    display: flex !important;
  }
  /* The inline top UL on desktop (direct child of the nav) must hide
     in this range. The responsive container's INNER UL stays visible
     when .is-menu-open fires (handled above). */
  .sc-header__nav.is-responsive > ul.wp-block-navigation__container {
    display: none !important;
  }
}
/* Above 880px: keep the inline desktop UL visible, hide the hamburger. */
@media (min-width: 881px) {
  .sc-header__nav .wp-block-navigation__responsive-container-open {
    display: none !important;
  }
  .sc-header__nav .wp-block-navigation__responsive-container:not(.is-menu-open) {
    /* Reset WP's responsive-container so it behaves as a transparent
       pass-through for the inline UL on desktop. */
    background: transparent !important;
    position: static !important;
    padding: 0 !important;
  }
}

/* 9. Cleanup: nuke any stray browser-default underline on nav anchors
      across all states (Sprint 5 live shipped with a faint underline
      on :active in some Chrome builds; verified by Frank's visual). */
.sc-header__nav a,
.sc-header__nav a:link,
.sc-header__nav a:visited,
.sc-header__nav a:active {
  text-decoration: none;
}

/* -----------------------------------------------------------------
   v0.19.0 Sprint 6 rules. Additive only; namespaced .sc-* selectors.
   See banner at top of file for full Sprint 6 rationale.
   ----------------------------------------------------------------- */

/* 1. Hero band atmospheric backdrop. Matches comp .hero background
      (concept lines 122-126): radial sun-yellow glow at the upper-
      right + linear ink-darken from #08080C to ink. Applied to every
      named page hero shell so all 5 pages open with the same
      Headlights atmospheric anchor instead of a flat ink slab.

      Alpha kept conservative (0.05) so the glow whispers rather than
      shouts; the homepage hero glow is 0.06 + a separate book-cover
      halo, so the page-hero atmospherics here are slightly lighter
      than the homepage hero by design - the homepage is the brand
      anchor moment, the new pages are continuation. */
.sc-hero-band {
  background:
    radial-gradient(ellipse at 75% 30%, rgba(251, 231, 31, 0.05) 0%, transparent 55%),
    linear-gradient(180deg, #08080C 0%, var(--wp--preset--color--background) 100%) !important;
}

/* 2. Section hairline-top rule. Matches comp .section border-top
      (concept line 241). The hairline sits between adjacent sections
      so the page rhythm reads as deliberately punctuated. The hero
      band does NOT carry this rule (it's the page opener); the rule
      starts from the first .sc-section after the hero. */
.sc-section {
  border-top: 1px solid var(--wp--preset--color--hairline);
}

/* 3. H2 left-rule accent for sections without an accompanying image.
      Sun-yellow 2px left border with a small left padding, matching
      the .sc-stat treatment used for press numerals. Spacing is
      tuned so the rule visually parents the eyebrow + H2 + body
      stack rather than just hugging the H2 baseline. */
.sc-accent-rule {
  border-left: 2px solid var(--wp--preset--color--accent);
  padding-left: 16px;
}

/* 4. About headshot warm-frame. Sun-yellow offset rectangle behind
      the headshot. Mirrors comp .author__portrait-wrap::before
      (lines 377-383): inset 16px down/right, -16px up/left so the
      yellow frame peeks past two corners. Pure CSS; the .sc-about__
      headshot-frame wrapper div in about.html supplies the positioning
      context.

      The frame is purely decorative (no link, no interactive role)
      so it sits below the image in stacking order; the image's own
      hairline border stays on top. */
.sc-about__headshot-frame {
  position: relative;
  max-width: 360px;
  margin-left: 0;
  margin-right: 0;
  margin-bottom: var(--wp--preset--spacing--lg);
}
.sc-about__headshot-frame::before {
  content: "";
  position: absolute;
  inset: 16px -16px -16px 16px;
  border: 1px solid var(--wp--preset--color--accent);
  pointer-events: none;
  z-index: 0;
}
.sc-about__headshot-frame .sc-about__headshot {
  position: relative;
  z-index: 1;
  margin-bottom: 0 !important;
}

@media (max-width: 880px) {
  .sc-about__headshot-frame {
    max-width: 280px;
  }
}

/* 5. Book cover halo on the detail pages. Same box-shadow recipe as
      the homepage hero cover (.wp-block-cover .wp-block-image img,
      v0.12.0) but scoped to .sc-book__cover so the halo only renders
      on the book-meta cover, not on every wp-block-image inside a
      book page (book-praise.php has no images; press-style covers
      elsewhere are unaffected).

      The 0.18 alpha matches the homepage hero treatment - the book
      detail cover is the design-language anchor for the page, so
      equal gravity is correct. */
.sc-book__cover img {
  box-shadow: 0 0 110px 28px rgba(251, 231, 31, 0.18);
}

/* 6. Book subtitle typography. Comp .book__subtitle (concept lines
      326-333) is Inter italic 15px sun-yellow with 24px below.
      The pattern's prior inline-style emit was 0.02em letter-spacing
      + xs/md margins, slightly tighter than comp. Override here so
      the subtitle reads as a deliberate tonal cue between H2 and
      lede rather than as filler. */
.sc-book__subtitle {
  font-family: var(--wp--preset--font-family--body);
  font-style: italic;
  color: var(--wp--preset--color--accent);
  font-size: 0.9375rem;
  letter-spacing: 0.02em;
  margin: var(--wp--preset--spacing--xs) 0 var(--wp--preset--spacing--md);
}

/* 7. Book details definition list. WP core renders <dl><dt><dd>
      with browser-default styling (terms stacked, indented dd) which
      reads as a debugger dump on a polished marketing page. Sprint 6
      replaces this with a real metadata grid: 2-col on >=600px,
      stacked on mobile, uppercase Inter labels in warm-brown-2,
      bone values in Inter regular, hairline dividers between rows.

      Grid layout is auto so the dt + dd pair stay on one row at
      desktop. Mobile collapses via grid-template-columns: 1fr. */
.sc-book__details {
  display: grid;
  grid-template-columns: max-content 1fr;
  gap: 0 var(--wp--preset--spacing--lg);
  margin: 0;
  max-width: 720px;
}
.sc-book__details dt {
  font-family: var(--wp--preset--font-family--body);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.18em;
  font-size: 0.75rem;
  color: var(--wp--preset--color--muted, rgba(245, 242, 234, 0.7));
  padding: 14px 0;
  border-top: 1px solid var(--wp--preset--color--hairline);
}
.sc-book__details dd {
  font-family: var(--wp--preset--font-family--body);
  font-size: 0.9375rem;
  color: var(--wp--preset--color--foreground);
  margin: 0;
  padding: 14px 0;
  border-top: 1px solid var(--wp--preset--color--hairline);
}
.sc-book__details dt:first-of-type,
.sc-book__details dd:first-of-type {
  border-top: none;
}

@media (max-width: 600px) {
  .sc-book__details {
    grid-template-columns: 1fr;
    gap: 0;
  }
  .sc-book__details dt {
    padding: 14px 0 0;
    border-top: 1px solid var(--wp--preset--color--hairline);
  }
  .sc-book__details dd {
    padding: 4px 0 14px;
    border-top: none;
  }
}

/* 8. Warm-brown gradient cards. Matches comp .lead-magnet__card
      treatment (concept line 509: linear-gradient at warm-brown
      0.08 to 0.02). Two surfaces use this:
        - .sc-press__downloads-card on /press
        - .sc-book__series-cta-card on /bless-your-heart + /see-me
      Both wrap their content in a 720px-max, hairline-bordered,
      generously padded panel. */
.sc-press__downloads-card,
.sc-book__series-cta-card {
  max-width: 720px;
  margin-left: auto;
  margin-right: auto;
  padding: clamp(28px, 4vw, 48px);
  border: 1px solid var(--wp--preset--color--hairline);
  background: linear-gradient(180deg, rgba(122, 74, 46, 0.08), rgba(122, 74, 46, 0.02));
}
.sc-press__downloads-card .sc-samples li {
  border-bottom-color: rgba(245, 242, 234, 0.1);
}

/* 9. Press stats row. The new .sc-press__stats section on press.html
      uses the existing .sc-stat + .sc-stat-num + .sc-stat-label CSS
      family verbatim; no per-section override needed for the stat
      blocks themselves. This rule only adjusts the column gap rhythm
      at the section level so the 3 stats breathe on wide viewports. */
.sc-press__stats .wp-block-columns {
  gap: clamp(20px, 3vw, 56px);
}

/* 10. About contact links - actionable affordance on hover. The
       links use .sc-samples markup so they get the existing list
       treatment; this rule layers the buylink hover affordance on
       top so each row reads as clickable rather than as a list
       decoration. */
.sc-about__links a {
  display: inline-block;
  color: var(--wp--preset--color--foreground);
  text-decoration: none;
  border-bottom: 1px solid transparent;
  transition: color 160ms ease, border-color 160ms ease;
}
.sc-about__links a:hover,
.sc-about__links a:focus-visible {
  color: var(--wp--preset--color--accent);
  border-bottom-color: var(--wp--preset--color--accent);
}

/* 11. Eyebrow rhythm tightening below hero bands. The homepage hero
       eyebrow has 24px below the eyebrow before the H1 (comp line
       143). The base .sc-eyebrow rule (v0.11.0) sets 1rem (~16px)
       which reads tight on the larger hero rhythm. Bump to 1.5rem
       in hero-band contexts only; section-level eyebrows stay at
       the tighter 1rem. */
.sc-hero-band .sc-eyebrow {
  margin-bottom: 1.5rem !important;
}

/* -----------------------------------------------------------------
   v0.21.0 (2026-06-04): Featured-image height cap.

   WHY (full rationale in v0.21.0 changelog block near top of file):
   square / near-square source images on 11 short-fiction posts
   rendered as ~1400x1400 heroes because the alignwide
   wp-block-post-featured-image had no height envelope. Frank
   flagged 2026-06-04; audit recommended cap at clamp(280, 50vh, 540).

   The cap binds to both the figure (so its layout box does not
   reserve unbounded space during image load) and the inner <img>
   (so the loaded raster crops to the envelope rather than dictating
   layout). object-fit: cover preserves subject framing across all
   8 distinct source aspect ratios on staging.

   No !important: this is the first child-side rule touching this
   selector, and the parent optsus-base ships no max-height on the
   featured-image block. Plain specificity wins. */
.wp-block-post-featured-image,
.wp-block-post-featured-image img {
  max-height: clamp(280px, 50vh, 540px);
}
.wp-block-post-featured-image img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

/* -----------------------------------------------------------------
   v0.24.0 (2026-06-15): post-50 featured-image full-image exception.

   "Making the World a Better Place" (post id 50) received a portrait
   480x600 replacement image (the licensed "Medical Physicists" superhero
   art that replaces the removed Spider-Man photo). The v0.21.0 cover-crop
   cap above is right for the square/landscape short-fiction heroes, but it
   crops a portrait poster into a thin band. Scope an exception to post 50
   only: show the FULL image, centered, at its native width (no upscaling,
   no crop). All other posts keep the v0.21.0 banner behavior.

   Specificity (.postid-50 ...) beats the unscoped v0.21.0 rule, so no
   !important is needed. On viewports narrower than 480px the image fills
   the column (max-width resolves to 100%) and still shows in full. */
.postid-50 .wp-block-post-featured-image,
.postid-50 .wp-block-post-featured-image img {
  max-height: none;
}
.postid-50 .wp-block-post-featured-image img {
  width: auto;
  max-width: min(480px, 100%);
  height: auto;
  object-fit: contain;
  margin-inline: auto;
}

/* -----------------------------------------------------------------
   v0.23.0 (2026-06-09): Sprint 8 - consistency audit, nav, footer nav.

   Phase 1 - Canonical button consolidation.
   Root cause: Sprint 7 added contact-form.php (no sc-form on the <form>)
   and newsletter-landing.php (has sc-form but a bespoke button rule),
   each with divergent Submit/Subscribe button styling.

   Changes:
   1. contact-form.php: sc-form class added to the <form> element.
   2. .sc-contact__form.sc-form: layout override (display:block) so sc-form's
      flex row does not break the stacked form layout.
   3. .sc-contact__form label: position:static so visible labels are not
      hidden by sc-form's screen-reader-only label rule.
   4. Removed the bespoke contact-form button selector (Sprint 7 regression;
      divergent padding, color:foreground instead of background, no border).
   5. Removed the bespoke newsletter-form button selector (same divergent
      metrics; sc-form class was already on that form).

   Visual result: Send and Subscribe buttons now render identically to the
   footer newsletter button and the lead-magnet button (Anton uppercase,
   sun-yellow fill, ink text, 2px border-radius).

   Phase 3 - Header navigation.
   6. parts/header.html: Writing Life parent URL updated from placeholder
      '#' to /writing-life/ (the page_for_posts hub from Sprint 7).
   7. parts/header.html: Gardens link added to Writing Life submenu.
   8. parts/header.html: Contact and Newsletter links added as top-level items.

   Phase 4 - Footer navigation.
   9. parts/footer.html: Centered nav row added with Writing Life, About,
      Press, Contact, Newsletter links (overlayMenu=never).
  10. .sc-footer__nav, .sc-footer__nav a: footer nav link styles (small
      muted uppercase, hover to foreground).
   ----------------------------------------------------------------- */

/* -----------------------------------------------------------------
   v0.22.0 (2026-06-09): Sprint 7 - Writing Life templates + patterns.

   New templates: home.html (Writing Life hub / page_for_posts),
   archive.html (essay / fiction / craft archives), category-gardens.html
   (photo gallery for /category/gardens/), page-contact.html,
   page-newsletter.html.

   New patterns: contact-form.php, newsletter-landing.php.

   CSS namespace assignments:
     home.html               sc-writinglife__
     archive.html            sc-archive__
     category-gardens.html   sc-gardens__
     page-contact.html       sc-contact__
     page-newsletter.html    sc-newsletter__

   Rules are grouped by namespace below. Each group carries a WHY
   comment explaining the visual intent and any non-obvious choice.
   ----------------------------------------------------------------- */

/* == 1. Writing Life hub (home.html) - sc-writinglife__ =========== */

/* Hero band for the Writing Life index page. Uses the shared
   sc-hero-band atmospheric backdrop (ink bg, bone text) established
   in Sprint 2. Category nav sits below the hero H1 and links to
   /category/short-fiction/, /category/gardens/,
   /category/craft-and-publishing/. */
.sc-writinglife__hero {
  /* Background and text colors inherit from .sc-hero-band; no override. */
}

/* Horizontal category nav below the hero H1 (home.html emits
   <nav class="sc-writinglife__nav">). Rendered as a flex row of
   pill-style links so the three categories read as a navigation
   affordance rather than a prose list. Sits on the dark hero band,
   hence bone-on-ink link colors. */
.sc-writinglife__nav {
  display: flex;
  flex-wrap: wrap;
  gap: 0.75rem;
  list-style: none;
  padding: 0;
  margin: var(--wp--preset--spacing--md) 0 0;
}
.sc-writinglife__nav a {
  display: inline-block;
  padding: 0.375rem 1rem;
  border: 1px solid rgba(245, 242, 234, 0.35);
  color: var(--wp--preset--color--bone);
  text-decoration: none;
  font-size: 0.875rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  transition: background 140ms ease, border-color 140ms ease;
}
.sc-writinglife__nav a:hover,
.sc-writinglife__nav a:focus-visible {
  background: rgba(245, 242, 234, 0.1);
  border-color: var(--wp--preset--color--bone);
}

/* Post rows on the Writing Life hub (home.html emits one
   <div class="sc-writinglife__item"> per post inside the
   wp-block-post-template wrapper). Each row gets a ruled separator so
   the index reads as a curated list rather than a card grid. The
   :first-child top border closes the list visually at the top. */
.sc-writinglife__item {
  padding: var(--wp--preset--spacing--md) 0;
  border-bottom: 1px solid var(--wp--preset--color--hairline);
}
.sc-writinglife__item:first-child {
  border-top: 1px solid var(--wp--preset--color--hairline);
}

/* == 2. Archive list (archive.html) - sc-archive__ ================ */

/* Archive hero: identical atmospheric treatment to the Writing Life
   hero but using sc-archive__ namespace so future customisation is
   isolated to archive-only contexts. */
.sc-archive__header {
  /* Background and text colors inherit from .sc-hero-band. */
}

/* Archive post rows: ruled rows matching the Writing Life hub rhythm.
   The query loop wraps each post in an <article class="sc-archive__item">;
   this rule provides the row spacing and separator. (The section wrapper
   itself is sc-archive__posts and is handled by the shared sc-section
   rule, so it needs no archive-specific rule here.) */
.sc-archive__item {
  padding: var(--wp--preset--spacing--md) 0;
  border-bottom: 1px solid var(--wp--preset--color--hairline);
}
.sc-archive__item:first-child {
  border-top: 1px solid var(--wp--preset--color--hairline);
}

/* Read-more link in archive rows. Styled as an underline-on-hover
   affordance consistent with the buylink/press-link pattern. */
.sc-archive__item .wp-block-read-more {
  display: inline-block;
  font-size: 0.875rem;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--wp--preset--color--foreground);
  text-decoration: none;
  border-bottom: 1px solid transparent;
  margin-top: var(--wp--preset--spacing--xs);
  transition: color 140ms ease, border-color 140ms ease;
}
.sc-archive__item .wp-block-read-more:hover,
.sc-archive__item .wp-block-read-more:focus-visible {
  color: var(--wp--preset--color--accent);
  border-bottom-color: var(--wp--preset--color--accent);
}

/* == 3. Gardens gallery (category-gardens.html) - sc-gardens__ ==== */

/* Gardens hero: same atmospheric backdrop. The fixed lede "Finding
   wonder in the natural world." is baked into the template; no
   special CSS needed beyond the hero-band base. */
.sc-gardens__hero {
  /* Inherits from .sc-hero-band. */
}

/* Photo grid for the gardens category. The class rides on the
   wp:post-template wrapper (see category-gardens.html), so each post
   figure becomes a direct grid child - no JavaScript, no extra wrapper.
   auto-fill with a 22rem minimum gives the grid its responsive behavior
   without a single media query: on the 1400px content width that yields
   three columns, on a ~760px tablet two, and below ~22rem one. The
   section wrapper (sc-gardens__gallery) already supplies the outer
   padding and constrained width, so the grid only owns columns + gap. */
.sc-gardens__grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(22rem, 1fr));
  gap: var(--wp--preset--spacing--lg);
}

/* Each garden post figure (figure.sc-gardens__item): image fills the
   cell, caption sits below. overflow:hidden clips the subtle hover
   zoom within the cell's rounded envelope. */
.sc-gardens__item {
  position: relative;
  overflow: hidden;
  background: var(--wp--preset--color--surface);
}
.sc-gardens__item img {
  width: 100%;
  /* height:auto defeats the height:100% set by the v0.21.0 featured-image
     cap rule (equal specificity), so aspect-ratio drives the cell height
     here. The clamp() max-height from that same rule still applies as an
     upper bound, but a 4:3 cell at gallery width sits well under it. */
  height: auto;
  /* v0.25.0 (Sprint 15): 4/3 -> 3/2. The nine consolidated garden source
     images cluster at ~1.5 (six of nine are 1.37-1.65); a 3:2 tile cover-
     crops them least. The two near-square outliers (Atlanta, Fairchild at
     ~1.08) and two wide ones (Nitobe, Malabar ~1.85) take a modest center
     crop, acceptable for scenery. */
  aspect-ratio: 3 / 2;
  object-fit: cover;
  display: block;
  transition: transform 220ms ease;
}
.sc-gardens__item:hover img,
.sc-gardens__item:focus-within img {
  transform: scale(1.03);
}

/* Caption below each image: small, muted, consistent with the
   .sc-kicker typographic role used elsewhere in the theme. */
.sc-gardens__caption {
  padding: 0.5rem 0.25rem 0.75rem;
  font-size: 0.8125rem;
  color: var(--wp--preset--color--muted, #6b6459);
  line-height: 1.4;
}
.sc-gardens__caption a {
  color: inherit;
  text-decoration: none;
}
.sc-gardens__caption a:hover {
  color: var(--wp--preset--color--foreground);
}

/* v0.25.0 (Sprint 15): the consolidated /gardens/ Page (patterns/gardens.php)
   shows a garden name + a descriptive line per tile, where the old per-post
   category template showed only the linked post title. Two stacked spans
   inside .sc-gardens__caption: the name reads as a small foreground label,
   the description as the muted caption body. */
.sc-gardens__name {
  display: block;
  color: var(--wp--preset--color--foreground);
  font-weight: 600;
  letter-spacing: 0.01em;
  margin-bottom: 0.2rem;
}
.sc-gardens__desc {
  display: block;
}

/* == 3b. ThrillerFest author photos (page-id-137) - Sprint 15 =========== */
/* Susann's 2026-06-25 replacement crops are lower-resolution (~250-320px)
   than the originals they replaced. The author + marquee images sit in 40%
   flex columns; without an explicit width, a photo narrower than its column
   renders at its small native size - which left the four swapped photos
   visibly smaller than the (unchanged, larger) Connolly shot. width:100%
   restores the layout's intended column fill so every photo shares one
   width. The mild upscale is the cost of the supplied crop resolution;
   higher-res crops from the client would render crisper at this size. */
.page-id-137 .wp-block-column .wp-block-image img {
  width: 100%;
  height: auto;
}

/* == 4. Contact page (page-contact.html) - sc-contact__ =========== */

/* Contact hero: same atmospheric backdrop as all other page heroes. */
.sc-contact__hero {
  /* Inherits from .sc-hero-band. */
}

/* Contact form section: bone background so the form surface
   separates visually from the hero without requiring a full-bleed
   color block. Matches the section treatment on the lead-magnet
   pattern (the form lives on white / bone, not on ink). */
.sc-contact__form-section {
  background: var(--wp--preset--color--bone);
}

/* exception: the contact form uses a vertical stacked layout, not the
   sc-form inline email+button row. sc-form is added to the form element
   solely so the Submit button inherits .sc-form button (Sprint 8 Phase 1
   canonical-button consolidation). This override restores block layout.
   The specificity (0,2,0) beats .sc-form (0,1,0); source order also wins. */
.sc-contact__form.sc-form {
  display: block;
  max-width: none;
  margin: 0;
  align-items: initial;
  gap: 0;
}

/* Form field wrappers: vertical stack with generous gap so labels
   and inputs breathe at reading width. */
.sc-contact__form .sc-contact__field {
  display: flex;
  flex-direction: column;
  gap: 0.375rem;
  margin-bottom: var(--wp--preset--spacing--sm);
}

/* Labels: small caps weight, muted, consistent with other form
   labels in the theme (newsletter.php, lead-magnet.php).

   exception: sc-form hides labels visually (position:absolute; left:-9999px)
   for its compact inline email+button layout where labels are screen-reader-only.
   The contact form uses a full labeled layout, so labels must be visible.
   position:static overrides the sc-form hiding rule (equal specificity,
   later source order). */
.sc-contact__form label {
  position: static;
  font-size: 0.8125rem;
  font-weight: 600;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--wp--preset--color--foreground);
}

/* Inputs and textarea: full width, white/surface background (exception:
   sc-form input uses ink background for inline dark-section forms; these
   contact fields sit on the bone section and need a light fill so the
   field boundary is visible against the cream background), hairline border,
   foreground text. Font-family and font-size differ from the compact sc-form
   input (inherit vs explicit Anton stack; 1rem vs 0.9375rem) because the
   contact form is a full prose form at body reading size. */
.sc-contact__form input[type="text"],
.sc-contact__form input[type="email"],
.sc-contact__form textarea {
  width: 100%;
  padding: 0.625rem 0.875rem;
  background: var(--wp--preset--color--surface, #ffffff);
  border: 1px solid var(--wp--preset--color--hairline);
  color: var(--wp--preset--color--foreground);
  font-family: inherit;
  font-size: 1rem;
  line-height: 1.5;
  transition: border-color 140ms ease;
  box-sizing: border-box;
}
.sc-contact__form input[type="text"]:focus,
.sc-contact__form input[type="email"]:focus,
.sc-contact__form textarea:focus {
  outline: none;
  border-color: var(--wp--preset--color--accent);
}
.sc-contact__form textarea {
  resize: vertical;
  min-height: 140px;
}

/* Submit button: inherits from .sc-form button (Anton uppercase, accent fill,
   ink text, border 1px solid accent) - the canonical site button component.
   Sprint 8 Phase 1: the Sprint 7 bespoke .sc-contact__form button[type="submit"]
   override has been removed. The last .sc-contact__field already provides
   margin-bottom:spacing|sm, giving natural breathing room above the button.
   No namespace-scoped button rule remains; .sc-form button is the single path. */

/* Honeypot: absolutely positioned off-screen so it is invisible to
   sighted users and does not affect layout. The aria-hidden="true"
   in the HTML hides it from screen readers; this CSS hides it visually.
   See contact-form.php header for the full honeypot rationale. */
.sc-contact__honeypot {
  position: absolute;
  left: -9999px;
  height: 1px;
  overflow: hidden;
}

/* == 5. Newsletter landing (page-newsletter.html) - sc-newsletter__ */

/* Newsletter hero: same atmospheric backdrop. The page exists to convert
   a visitor who navigated to /newsletter directly; the hero sets
   the editorial tone before the landing pattern takes over. */
.sc-newsletter__hero {
  /* Inherits from .sc-hero-band. */
}

/* Newsletter landing section wrapper (in newsletter-landing.php).
   Bone background matches the contact form section treatment: the
   opt-in form surface separates from the hero without a jarring
   color jump. */
.sc-newsletter__landing {
  background: var(--wp--preset--color--bone);
}

/* Benefits bullet list inside the landing pattern. Uses the existing
   .sc-samples list treatment (Sprint 2) for visual consistency;
   this rule adds only the bottom-margin rhythm. */
.sc-newsletter__benefits {
  margin-bottom: var(--wp--preset--spacing--md);
}

/* Newsletter landing form: max-width constrained, centered, fields
   stack vertically on all viewports via flex-direction:column.
   This overrides sc-form's horizontal row layout (sc-form is on this
   element solely for the canonical button styling; Sprint 8 Phase 1).
   The footer newsletter.php compact form uses the unmodified sc-form
   side-by-side layout; this page uses a stacked layout to give the
   single email field more visual weight on its dedicated page.

   Subscribe button: inherits .sc-form button canonical spec.
   Sprint 8 Phase 1: the bespoke .sc-newsletter__form button[type="submit"]
   override has been removed. Canonical path only. */
.sc-newsletter__form {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
  max-width: 400px;
  margin: 0 auto var(--wp--preset--spacing--sm);
}
/* exception: newsletter label is visible (font treatment only; position is
   inherited from sc-form as position:absolute / left:-9999px, which keeps
   it accessible to screen readers while hidden visually - appropriate for a
   single-field email opt-in where the placeholder provides the visual label). */
.sc-newsletter__form label {
  font-size: 0.8125rem;
  font-weight: 600;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--wp--preset--color--foreground);
}
/* exception: newsletter input uses surface/white background (not ink) because
   the section background is bone; an ink-background input on a bone section
   would read as a dark box against a light field, which inverts the expected
   visual hierarchy. The focus border and placeholder opacity match the shared
   .sc-form input spec for consistency. */
.sc-newsletter__form input[type="email"] {
  width: 100%;
  padding: 0.625rem 0.875rem;
  background: var(--wp--preset--color--surface, #ffffff);
  border: 1px solid var(--wp--preset--color--hairline);
  color: var(--wp--preset--color--foreground);
  font-family: inherit;
  font-size: 1rem;
  line-height: 1.5;
  transition: border-color 140ms ease;
  box-sizing: border-box;
}
.sc-newsletter__form input[type="email"]:focus {
  outline: none;
  border-color: var(--wp--preset--color--accent);
}

/* Launch hotfix 2026-07-16: prevent homepage hero overflow on narrow screens. */
@media (max-width: 640px) {
  .wp-block-cover .wp-block-cover__inner-container,
  .wp-block-cover .wp-block-columns,
  .wp-block-cover .wp-block-column {
    max-width: 100% !important;
    min-width: 0 !important;
  }

  .wp-block-cover .sc-eyebrow {
    letter-spacing: 0.24em;
    overflow-wrap: anywhere;
  }

  .wp-block-cover .sc-display-hero {
    font-size: clamp(3rem, 17vw, 4.4rem) !important;
    line-height: 0.92 !important;
    overflow-wrap: anywhere;
  }

  .wp-block-cover .sc-lede {
    max-width: 100%;
  }

  .wp-block-cover .wp-block-image,
  .wp-block-cover .wp-block-image img {
    max-width: 100% !important;
    height: auto !important;
  }
}

/* Launch hotfix 2026-07-16: tighter narrow-screen hero measure. */
@media (max-width: 640px) {
  .wp-block-cover {
    overflow-x: hidden;
  }

  .wp-block-cover .sc-lede {
    max-width: 30ch !important;
    font-size: 1rem !important;
  }

  .wp-block-cover .wp-block-image {
    width: min(100%, 320px) !important;
  }
}
