/*
The Drop (FSE) - enqueued stylesheet, NOT the theme's identity file.
WP reads theme metadata from /style.css at the theme root; this file
is loaded via functions.php with filemtime() cache-busting.
*/

/* ── Base reset (global border-box, per house standard) ────────────── */
*, *::before, *::after {
    box-sizing: border-box;
}

/* §3.3 - the ONE gutter mechanism (2026-08-22 fix). This was missing
   entirely: theme.json had useRootPaddingAwareAlignments:true (the
   standard requires false - it changes how/where WP emits the
   constrained-layout max-width rule, and confirmed live it silently
   stopped emitting one at all for a `layout:constrained` block nested
   inside a custom flex container - .drop-home-layout__main measured
   max-width:none, is-layout-constrained class present but inert) plus
   a styles.spacing.padding block that only half-worked as a substitute
   gutter. Overriding WP's own content-size variables here is the real
   mechanism - every constrained container reads it directly, nested
   or not. */
:root {
    --wp--style--global--content-size: min(1310px, 100vw - 3rem) !important;
    --wp--style--global--wide-size: min(1310px, 100vw - 3rem) !important;
}
.alignfull { width: 100vw; max-width: 100vw; margin-inline: calc(50% - 50vw); }
/* 2026-08-23 - header moved from sticky to fixed (see .site-header below
   for the full why). `overflow-x: clip` no longer has anything sticky-
   specific to protect, but it's harmless for a fixed header too, so left
   as-is rather than touched for no reason. `padding-top` is the fixed
   header's real content offset - literal px, JS-written (site.js
   `measure()`), NEVER a bare var() per §4.2 ("height values must be
   literal pixels - transition cannot interpolate a custom-property
   change"). The value here is just a same-order-of-magnitude fallback
   for the instant before JS runs; it corrects itself on DOMContentLoaded
   before paint in practice.
   NO transition on the base rule (2026-08-23 fix) - `measure()` runs a
   SECOND time on the `load` event (images/fonts can shift the header's
   real height after DOMContentLoaded), and with a transition declared
   here unconditionally, that routine correction animated visibly on
   every page load ("the header seems to animate in" - Daniel). The
   `.has-header-transition` class opts in AFTER both initial
   measurements are done settling, so only an actual scroll-triggered
   shrink/expand animates - a page load never should. */
.wp-site-blocks {
    overflow-x: clip;
    /* Pre-JS default = the header's real full height (measured live 2026-10-30:
       118px below 1200, 200px from 1200), plus the admin bar. It used to be a
       320px placeholder that site.js then shrank, which shoved the whole page up
       on every load (Lighthouse CLS 0.21 on home, 0.32 on the Knowledge Bank).
       site.js still writes the exact literal value; this just means it normally
       has nothing to correct. */
    padding-top: calc(118px + var(--mca-admin-bar-h, 0px));
}
@media (min-width: 1200px) {
    .wp-site-blocks {
        padding-top: calc(200px + var(--mca-admin-bar-h, 0px));
    }
}
.wp-site-blocks.has-header-transition {
    transition: padding-top 0.3s ease;
}

:root {
    --drop-section-pad: clamp(2rem, 4vw, 3.125rem);
    /* Sole owner of column/card-grid gaps specifically (§0.4 pattern) -
       deliberately separate from theme.json's global blockGap
       (clamp(0.85rem, 2vw, 1.25rem), owns paragraph rhythm only) so
       bumping this for "ample white space" on an article-driven site
       (2026-08-22, Daniel's call) can't also blow out paragraph
       spacing everywhere else. Applied below to the specific
       column/grid contexts, not a blanket .is-layout-flex override -
       that would also hit button rows, icon groups, nav items, etc.
       that use flex layout for unrelated reasons and shouldn't get a
       2-4rem gap. */
    --drop-column-gap: clamp(2rem, 5vw, 4rem);
    --mca-admin-bar-h: 0px; /* JS-measured on init/load/resize only - see functions.php */
}

/* ── Typography & colour system (2026-08-28, headline/label split
   rewritten 29 Aug - Daniel's call from a live three-way comparison) ──
   Three-face system replacing the single Lato face: Archivo (display -
   EVERY headline, at every size, sentence case or not), Source Serif 4
   (reading - article body copy), Archivo Narrow (stamp - EXCLUSIVELY
   the caps label layer: kickers, dates, eyebrows, the venue list, the
   partner chip, search group labels - was Courier Prime, swapped
   2026-08-28 later same day - see the --font-stamp alias and the
   stamp-rule comment further down for the full reasoning, not repeated
   here).
   THE RULE: if it's sentence case, it's Archivo; if it's caps-and-
   tracked, it's Narrow. Card titles (and every other sentence-case
   title - sidebar module titles, the featured-article title, post-nav
   prev/next) moved OFF Narrow onto Archivo 700 this pass - Narrow was
   the right call when titles were ALL CAPS (condensed width bought back
   characters caps were wasting); sentence case removed that reason,
   and condensed lowercase at card-title size read tabloid where
   regular-width reads editorial (confirmed live: Narrow 20.5px vs
   Archivo 700/19px vs Archivo 600/20px - 700/19px matched the article
   H1's voice and still fit the longest real title in the same two-line
   clamp). This also gives the stamp layer its own voice back - it was
   flagged as "doing double duty, at its limit" while it also had to
   carry headlines.
   Still a three-face system, not four - Archivo Narrow's two woff2
   files stay loaded regardless (the label layer alone uses them
   everywhere), so this is a reassignment of who uses which face, not a
   payload change. Short `--font-*`/named-colour aliases below resolve to the real
   `--wp--preset--*` custom properties WP generates from theme.json,
   per the account-wide "`:root` aliases resolve to preset vars"
   convention - component rules below read the short form; existing
   pre-2026-08-28 rules elsewhere in this file were left on their
   original verbose `--wp--preset--color--*` references (just renamed
   to the new slugs) rather than migrated, to keep this pass a colour/
   type change only, not a wider refactor. */
:root {
    --font-display: var(--wp--preset--font-family--display);
    --font-body: var(--wp--preset--font-family--body);
    --font-stamp: var(--wp--preset--font-family--display-narrow); /* was --wp--preset--font-family--stamp
       (Courier Prime, REMOVED from theme.json 2026-08-28, later same day -
       mono-spacing opened craters around "GAMING / OPERATIONS" and made
       "23 AUG 2026" fall apart, and it was the wrong postal reference to
       begin with - a cancellation is stamped/stencilled, not typed).
       Points at `display-narrow` (Archivo Narrow 700) rather than adding
       a second family - do NOT re-declare Archivo Narrow under a new
       "stamp" slug pointing at the same woff2 files. Two @font-face
       blocks for one family is exactly what caused the earlier Archivo/
       Archivo-Narrow collision (the narrow file registered as plain
       "Archivo" 700, so every 700-weight element sitewide silently
       rendered condensed) - one family, one declaration, referenced by
       whichever alias needs it. All six --font-stamp call sites (this
       file's stamp rule below, .drop-card-kicker, .site-header__strap-
       venues, .drop-search__group-label, .drop-search-result__eyebrow/
       __partner-chip) get the new face for free through this one line.
       UPDATED 29 Aug (headline/label split): this comment used to say
       Archivo Narrow was "already loaded for card titles" - card titles
       (and every other sentence-case title) have since moved to Archivo
       (see the type-system comment above). `display-narrow` is now used
       EXCLUSIVELY by the caps label layer - the six --font-stamp call
       sites listed above plus `.drop-page-header__eyebrow` (its own
       direct reference, not through this alias) - nothing else. The two
       woff2 files stay loaded through those call sites alone. */
    --ink: var(--wp--preset--color--ink);
    --ink-heading: var(--wp--preset--color--ink-heading);
    --ink-muted: var(--wp--preset--color--ink-muted);
    --brand-red: var(--wp--preset--color--brand-red);
    --brand-red-flat: var(--wp--preset--color--brand-red-flat);
    --brand-navy: var(--wp--preset--color--brand-navy);
    --brand-navy-deep: var(--wp--preset--color--brand-navy-deep); /* nav-row
       navy pass, 2026-08-28 later same day - a half-step below brand-navy,
       enough to read as a distinct row without splitting the masthead into
       two blocks (contrast/rationale on each rule below, not repeated here) */
    /* Body-copy standard (2026-08-28 later still, Daniel's explicit 28 Aug
       call - ONE size sitewide, not "corrected" back to two tiers later).
       These three ONLY back the new rules this pass adds (the measure cap
       on prose elements/archive descriptions/search excerpts below) - the
       sitewide base itself lives in theme.json (body fontSize inherits the
       browser default 16px/1rem; lineHeight 1.6 is already set there too),
       not restated here as a second source of truth. Existing literal
       values elsewhere in this file (`body.single .wp-block-post-content`'s
       own `max-width: 68ch`, `.wp-block-post-excerpt__excerpt`'s `1rem`)
       are deliberately NOT swept to reference these - this pass is the
       measure-cap fix, not a wider token migration. */
    --text-body: 1rem;
    --leading-body: 1.6;
    --measure: 68ch;
}

/* ── Airmail ribbon (2026-08-28) - The Drop's postal-identity diagonal
   stripe, brought in from the static ad creative it currently only
   exists baked into. --air-red/--air-navy alias the EXISTING brand-red/
   brand-navy tokens above rather than duplicate them in theme.json's
   palette - both already carry the exact hex values this system wants
   (#c8151b / #3f586e), confirmed before adding anything.
   Governing rule: the ribbon edges things that arrive (page chrome, the
   newsletter unit, the lead hero, a section rule) - never a fill, never
   behind text, never on advertiser/partner content. Exactly ONE
   repeating-linear-gradient definition exists, here - nothing else in
   this file may declare a second one. */
:root {
    --air-red: var(--brand-red);
    --air-navy: var(--brand-navy);
    --air-ground: var(--wp--preset--color--white); /* the "paper" bar - no
        current consumer overrides this per-surface any more (.site-footer's
        override was removed as a mistaken premise 2026-08-28; .drop-house-
        ad's was removed 30 Aug along with that tile's whole frame, see its
        own comment) - every remaining framed element is a light-surface
        newsletter unit, so the sitewide default is what actually renders
        everywhere today. Comment history below kept for why --air-fill
        exists as a SEPARATE token, not restated as a currently-true list
        of overrides. */
    --air-fill: var(--air-ground); /* padding-box fill for a FRAMED unit (.air-frame) - separate from --air-ground
        2026-08-28 (ribbon refinements pass) because those are two different jobs: --air-ground is a stripe
        INGREDIENT (the paper-coloured bar between the red/navy bars), --air-fill is what sits inside the
        frame's border. They happen to be the same colour on a white panel (the newsletter modal), which is
        why this was never a bug until a framed unit needed a NON-white interior (.drop-house-ad, a navy
        tile, BEFORE its frame was removed 30 Aug) - overriding --air-ground there to get a visible paper bar
        would have also repainted the tile's own background white. Defaults to --air-ground so every existing
        framed unit is unchanged. */
    --air-pitch: 9px;      /* perpendicular width of ONE colour bar - the true bar width regardless of which way a strip runs, since gradient stops are measured perpendicular to the bars */
    --air-angle: -45deg;   /* stripes lean "/" - never change this anywhere */
}

/* Declared on every element (not :root) so `var(--air-pitch)` etc. RE-
   RESOLVE per element instead of baking :root's values into one gradient
   string that every consumer then inherits already-computed. Found live
   2026-08-28: three existing consumers (.drop-newsletter-modal at
   pitch 8, .drop-archive-title::after at pitch 7 - this second one
   ALSO now removed, 29 Aug, page-header pattern; see "RIBBON PLACEMENT
   RETIRED" further down - plus the already-removed .drop-hero-
   carousel::before at pitch 7) were ALL silently rendering at
   :root's 9px the whole time - their own `--air-pitch` overrides had no
   effect, because a custom property used inside another custom
   property's value resolves at the DECLARING element, not at each place
   the resulting value is later consumed. Moving the composition itself
   onto `*, *::before, *::after` makes it resolve fresh at whichever
   element actually sets an override. Do NOT move this back to :root -
   every local --air-pitch/--air-ground/--air-navy override in this file
   depends on it re-resolving here. */
*,
*::before,
*::after {
    --airmail: repeating-linear-gradient(
        var(--air-angle),
        var(--air-red)    0                          var(--air-pitch),
        var(--air-ground) var(--air-pitch)           calc(var(--air-pitch) * 2),
        var(--air-navy)   calc(var(--air-pitch) * 2) calc(var(--air-pitch) * 3),
        var(--air-ground) calc(var(--air-pitch) * 3) calc(var(--air-pitch) * 4)
    );
}

/* Two general-purpose utilities (available for future placements -
   phase 2's reading-progress bar and 404 page reuse these directly). */
.air-rule {
    height: 6px;
    background-image: var(--airmail);
}
.air-frame {
    border: 5px solid transparent;
    border-radius: 0; /* mitred gradient corners on a radius go muddy - square edges are what an envelope actually does */
    background:
        linear-gradient(var(--air-fill), var(--air-fill)) padding-box,
        var(--airmail) border-box;
}

/* ── drop/house-ad-linkedin (2026-08-28, ribbon refinements; FRAME
   REMOVED 30 Aug, button-system pass) - The Drop's own house promo
   ("Follow us on LinkedIn"). Ships as a synced pattern ("House ad —
   LinkedIn", a wp_block post referenced via `wp:block {"ref":ID}`) so
   an editor can place it in the sidebar, mid-article or the footer
   without a developer touching a template file - see sidebar.html/
   single-sidebar.html and the Top Jobs page's post_content for its
   three current placements.
   MUST NOT be registered wherever paid ad inventory is served/counted -
   this is a always-on house unit, not sold space.
   FRAME REMOVED, 30 Aug (Daniel's review) - this tile used to be a real
   four-sided airmail frame (`.air-frame`-style border-box gradient),
   with its own lifted-navy override (`#93aec6`) so the navy stripe bar
   stayed visible against the tile's identically-dark navy interior.
   That lifted navy read as off-brand blue on review - it was always a
   workaround for a genuine rendering problem (true navy merging with
   the fill at the border), not a colour anyone actually wanted. Rather
   than re-tune the workaround, the frame is REMOVED outright - flat
   brand-navy tile, square corners, no border, `--air-pitch`/`--air-
   ground`/`--air-navy`/`--air-fill` overrides all deleted with it.
   SYSTEM CONSEQUENCE, recorded here per the brief: the newsletter units
   (`.drop-newsletter-modal`, `.drop-newsletter--inline`) are now the
   ONLY framed elements left on the site, alongside the two page-edge
   ribbons (`.site-header::before`, `.site-footer::before`). That's a
   STRENGTHENING of what the frame means, not a loss - "envelope frame"
   now reads as "mail", unambiguously, everywhere it still appears.
   New treatment: a bird watermark (`.drop-house-ad__watermark`, below)
   replaces the frame - `drop-bird.png`, the SAME white-alpha asset used
   sitewide (no new file), right-anchored, ~140% of tile height, 0.08
   opacity (retuned from 0.14, 30 Aug, Daniel's review - see that rule's
   own comment for the "lighten" -> less-prominent correction), clipped
   by this tile's own `overflow:hidden` - the same franking-mark visual
   language as the `.drop-card-fallback` tiles' own postmark treatment
   (search "drop-card-fallback__postmark" in this file), scaled for
   this tile's own proportions.
   LinkedIn's own "in" glyph sits inline before the heading text (see
   `.drop-house-ad__title` below), ~20px. UPDATED 30 Aug (Daniel's
   request, "frame the LinkedIn icon with their official branding") -
   was rendering monochrome white (reusing this theme's own existing
   footer social-icon path, deliberately NOT a fresh reproduction of
   LinkedIn's real mark at the time, over caution about getting a
   trademarked asset wrong). Now the real two-colour "in" badge - blue
   square (#0A66C2, LinkedIn's own published brand blue) with the white
   "in" lettermark, matching how LinkedIn's own follow/share badges
   actually render everywhere else on the web. This is still a close
   reproduction of their standard mark, not their exact official SVG/PNG
   asset file - swap in the real file from LinkedIn's brand resource
   page if pixel-exact fidelity is needed. Still the one element on this
   tile that does NOT get the watermark/franking treatment everything
   else here does - don't tint or screen it; the blue is the badge's own
   real colour, not decoration to match this tile's palette. */
.drop-house-ad {
    position: relative;
    overflow: hidden; /* clips the watermark - see .drop-house-ad__watermark */
    border-radius: 0;
    background: var(--wp--preset--color--brand-navy);

    display: flex;
    flex-direction: column;
    gap: 10px;
    padding: 22px 24px;
    color: var(--wp--preset--color--white);
}
.drop-house-ad__watermark {
    position: absolute;
    right: 0;
    top: 50%;
    transform: translateY(-50%);
    height: 140%;
    width: auto;
    opacity: 0.08; /* was 0.14, briefly tried 0.32 - Daniel's first ask
        ("lighten the bird") meant LESS visual weight/more subtle, not
        literally brighter/more opaque; 0.32 went the wrong direction
        and was corrected same session before it ever shipped to a
        second review. 0.08 is deliberately below the original 0.14 -
        a genuinely subtle background texture, not a watermark anyone
        is meant to consciously notice. */
    pointer-events: none;
}
/* Logo intentionally not rendered yet - the brief asked for the site's
   existing script wordmark as an SVG, and no SVG version of the logo
   exists in the media library (the real asset is Logo.jpg, a raster
   file - confirmed live via the header's own <img src>). Rather than
   fake a vector trace of a raster mark or block the rest of this
   component on that gap, the tile ships without it; the heading below
   already carries the meaning on its own. Drop a real
   `drop-house-ad__logo` <img> (SVG, alt="") back in ahead of the
   heading once that asset exists - no CSS needed to reserve space for
   it, this is a plain flex column. */
.drop-house-ad__title {
    display: flex;
    align-items: center;
    gap: 8px;
    font-family: var(--font-display); /* Archivo */
    font-weight: 800;
    font-size: 1.45rem;
    line-height: 1.05;
    letter-spacing: 0; /* was 0.02em - caps-era tracking; sentence case
        now, per the button-system pass's sitewide rule: promo headings
        are headlines, and headlines are sentence case, not stamp-layer
        caps. */
    text-transform: none; /* was uppercase */
    margin: 0;
    color: var(--wp--preset--color--white);
    position: relative; /* stacks above the watermark by DOM/paint order
        alone (this element and the watermark are siblings, both direct
        children of .drop-house-ad, and this one comes second in source)
        - position:relative here only future-proofs against a stray
        z-index ever being added to the watermark, no z-index needed
        today. */
}
.drop-house-ad__title svg {
    flex-shrink: 0;
    width: 20px;
    height: 20px;
    border-radius: 4px; /* added 30 Aug (Daniel's request, "frame the
        LinkedIn icon with their official branding") - the glyph itself
        is now LinkedIn's real two-colour badge (blue square, white "in"
        mark - see the pattern's own post_content), this just keeps the
        square's corners consistent with how LinkedIn's own badge
        renders elsewhere (their brand assets ship it with a slight
        radius, not a hard square) - the tile AROUND it stays square-
        cornered per this component's own no-radius rule, this is
        scoped to the glyph alone. */
}
/* Body copy is Archivo, not the sitewide Source Serif default -
   deliberately: this is promotional furniture (a CTA card), not running
   editorial prose, the same distinction the sitewide typography system
   already draws for nav/buttons/pagination. Keep Source Serif for
   actual article copy. */
.drop-house-ad__body {
    font-family: var(--font-display);
    font-weight: 400;
    font-size: 0.95rem;
    line-height: 1.4;
    margin: 0;
    color: #e7edf3; /* audit-allow-hex: muted white-on-navy body text tint, decorative only - no existing token sits between white and ink-muted (which assumes a light background) */
    position: relative; /* same reasoning as the title above */
}
/* CTA now renders from `.drop-btn` (button-system pass, 30 Aug) - was
   its own caps+0.08em-tracked treatment, one of the three buttons that
   made the sitewide "buttons are sentence case" rule worth writing
   down (see `.drop-btn`'s own comment, this file). `align-self:flex-
   start` is the one property this class keeps of its own - `.drop-btn`
   doesn't set it, and without it this tile's flex-column parent would
   stretch the CTA to the tile's full width. */
.drop-house-ad__cta {
    align-self: flex-start;
    position: relative; /* same reasoning as the title above */
}

/* ── drop/newsletter-signup (2026-08-28 newsletter rebuild) - ONE
   component, three variants (modal/inline/footer), per the brief's §3.
   Base rule below is variant-agnostic (typography/layout/honeypot/
   status region); each `--modifier` only changes framing + heading
   size, never markup or behaviour, matching "same markup, same
   validation, same endpoint - do not build three separate forms". */
.drop-newsletter {
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
    padding: 1.5rem;
    background: var(--wp--preset--color--surface);
}
/* Inline variant (§2.2 - end of every article, the primary placement):
   the full airmail frame, reusing .air-frame's own rule directly rather
   than duplicating it - same class the LinkedIn house-ad tile uses, so
   a future frame-treatment change propagates to both automatically. */
.drop-newsletter--inline {
    border: 5px solid transparent;
    border-radius: 0;
    background:
        linear-gradient(var(--air-fill), var(--air-fill)) padding-box,
        var(--airmail) border-box;
}
/* Spacing around the inline unit (2026-09-14, Daniel's screenshot -
   crammed against the article's own "Sources:" list above and the
   Previous/Next row below, zero breathing room either side).
   FIRST FIX WAS WRONG, caught live before it actually helped: assumed
   this form is `#site-main`'s direct child (reading only single-post-
   body.html's own markup, where `wp:post-content`/this block/`wp:drop/
   post-nav` genuinely are three siblings) and wrote `#site-main >
   .drop-newsletter--inline { margin-block: var(--drop-section-pad) }`
   to beat `#site-main > * { margin-block: 0 }` (§4.7) on specificity.
   Live DOM walk showed the REAL ancestor chain is five levels deep:
   #site-main > .drop-single-layout (the is-section-flex row) >
   .drop-single-layout__main > .wp-block-template-part (single-post-
   body.html's own auto-generated wrapper) > this form - so `#site-main
   > *` was never even matching this element in the first place, and
   neither was my "fix". Corrected below to a plain, unqualified
   `.drop-newsletter--inline` selector, which reaches the real element
   regardless of how many wrapper levels sit in between.
   Margin, not the established `.is-section` padding-block pattern
   (§3.5) - padding here would grow INSIDE this same element's own
   airmail-framed border (border/background live on `.drop-newsletter--
   inline` itself), pushing the frame taller rather than separating it
   from its neighbours. Still the SAME `--drop-section-pad` token every
   other section gap uses, just applied as margin because this is a
   framed component, not a full-bleed section owning its own background.
   Scoped to this one modifier class only - the modal variant lives
   inside a `<dialog>`, the footer variant inside the footer template
   part, neither needs this. */
.drop-newsletter--inline {
    margin-block: var(--drop-section-pad);
}
/* Footer variant (§2.3) - deliberately LIGHTER than the inline unit:
   a top ribbon rule only, not a full 4-sided frame - the footer already
   carries its own top-edge ribbon (.site-footer::before), so a second
   full frame immediately below it would be the site's mark bordering
   its own mark. Reuses the same .air-rule proportions (short bar,
   `--airmail`) as a ::before rather than a new gradient definition. */
/* Top-edge ribbon REMOVED (2026-08-28, later still, Daniel's request) -
   this footer variant sits directly below the footer's own top-edge
   ribbon (.site-footer::before), and having a second ribbon rule
   immediately above the newsletter unit read as one too many marks in
   the same small stretch of page - the site's own top edge, then this
   unit's own top edge, right on top of each other.
   padding-top REMOVED too (same request, immediate follow-up) - it only
   ever existed as clearance for the ribbon's own height above the
   content; with no ribbon left to clear, it was just dead space.
   `background: transparent` stays (this variant intentionally has no
   fill, unlike the inline unit's .air-frame treatment). position:relative
   also dropped - it existed solely as the containing block for the
   removed ::before ribbon; nothing else here needs a positioning
   context.
   padding-top: 0 added explicitly (not just "no override left") -
   the BASE .drop-newsletter rule (search "drop/newsletter-signup"
   above) sets `padding: 1.5rem` on all four sides for every variant;
   simply deleting this variant's own override, as done in the edit
   just above, left that base 1.5rem top padding standing on its own -
   confirmed live (still rendered 24px) before making this second pass.
   Zeroed here, scoped to the footer variant ONLY, so the modal/inline
   variants keep their own top padding untouched. */
.drop-newsletter--footer {
    background: transparent;
    padding-top: 0;
}
/* Modal variant - no separate frame here; the .drop-newsletter-modal
   <dialog> ITSELF already carries the full airmail frame (see that
   rule further up this file) - the form inside is plain, unframed
   content within an already-framed panel, not framed twice. */
.drop-newsletter--modal {
    padding: 0;
    background: transparent;
}
.drop-newsletter__title {
    font-family: var(--font-display);
    margin: 0;
}
.drop-newsletter--modal .drop-newsletter__title,
.drop-newsletter--inline .drop-newsletter__title {
    font-size: 1.5rem;
}
.drop-newsletter--footer .drop-newsletter__title {
    font-size: 1.15rem; /* smaller heading in the footer's own narrower column - "framing and heading size differ", per the brief's own wording. */
}
.drop-newsletter__body {
    margin: 0;
    font-size: 0.95rem;
}
.drop-newsletter__row {
    display: flex;
    gap: 0.5rem;
    flex-wrap: wrap;
}
.drop-newsletter__row input[type="email"] {
    flex: 1 1 12rem;
    min-height: 44px;
    padding-inline: 0.75rem;
    border: 1px solid var(--wp--preset--color--ink-muted);
    font-family: var(--font-display);
    font-size: 0.9375rem;
    box-sizing: border-box;
}
/* Was its own navy-fill button (padding/font/hover all hand-tuned here)
   - NOW renders from `.drop-btn` (button-system pass, 30 Aug), markup
   updated to `<button type="submit" class="drop-btn">`. Nothing left to
   declare on the bare element selector; kept as a comment marker, not
   deleted outright, since `.drop-newsletter__row button` is still a
   useful anchor for anyone reading this file top-to-bottom looking for
   "where's the submit button styled" - it's the .drop-btn rule now,
   near the top of this file. */
/* Honeypot - visually off-screen, NOT display:none (per the brief's own
   note: some bots skip hidden fields entirely rather than filling every
   field they find, so a field that's merely off-screen catches more of
   them than one that's invisible via display). aria-hidden + tabindex
   -1 in the markup keep it out of the real keyboard/AT experience. */
.drop-newsletter__hp {
    position: absolute;
    left: -9999px;
    width: 1px;
    height: 1px;
    overflow: hidden;
}
.drop-newsletter__fine {
    margin: 0;
    font-size: 0.8rem;
    color: var(--wp--preset--color--ink-muted);
}
.drop-newsletter__fine a {
    color: inherit;
}
.drop-newsletter__status {
    font-size: 0.875rem;
    min-height: 1.2em; /* reserves the line so a message appearing doesn't shift layout underneath it */
}
/* Error state isn't colour-only (Part 24) - the ⚠ text marker is baked
   into the announced string itself (server-side in drop_render_
   newsletter_signup(), client-side in site.js's submit handler), so
   this colour is a reinforcing signal, not the only one. */
.drop-newsletter.has-error .drop-newsletter__status {
    color: var(--wp--preset--color--brand-red);
}
/* Profile-page "confirmation email is waiting" banner (§5 of the
   newsletter brief) - server-rendered via the_content filter in
   mu-plugins/drop-core.php, only present when ?awaiting_confirmation=1
   follows a real successful signup redirect. */
.drop-newsletter-awaiting {
    background: var(--wp--preset--color--surface);
    border-left: 4px solid var(--wp--preset--color--brand-red);
    padding: 1rem 1.25rem;
    margin-bottom: 1.5rem;
}
.drop-newsletter-awaiting p {
    margin: 0;
}

/* Windows High Contrast / forced-colours - background images are
   stripped entirely under forced-colours, so every ribbon above would
   otherwise just silently disappear with no fallback at all. CanvasText
   is the forced-colours system keyword for the user's chosen text
   colour, correct here since these are decorative borders/rules, not
   content that needs to preserve a specific hue. */
@media (forced-colors: active) {
    .site-header::before,
    .site-footer::before {
        background: none;
        border-top: 3px solid CanvasText;
    }
    .air-frame,
    .drop-newsletter-modal,
    .drop-newsletter--inline {
        border-color: CanvasText;
    }
    /* .drop-house-ad rule REMOVED here, 30 Aug (button-system pass) -
       it no longer has a border or background-image to strip; the
       tile's frame is gone (see that component's own comment), so
       forced-colours already renders it fine with no override needed. */
    /* .drop-newsletter--footer::before rule REMOVED here (2026-08-28,
       later still) along with the ribbon it targeted - nothing left to
       cover for this element under forced-colours. */
}
/* Print - diagonal gradients print badly and waste ink. */
@media print {
    .site-header::before,
    .site-footer::before,
    .drop-newsletter--inline {
        background-image: none;
    }
    /* .drop-house-ad REMOVED here too, 30 Aug, same reason - flat navy
       background now, nothing gradient-based to strip for print. */
}

/* Airmail ribbon - phase 2, NOT built this pass (2026-08-28 brief,
   explicit "do not build yet"). Noted here so the next session finds
   the plan instead of re-deriving it:
   - TODO: reading-progress bar, 3px / pitch 5px, pinned to the bottom
     of the fixed header, width driven by scroll position. The only
     ribbon instance where animation is justified (the motion is
     functional, not decorative) - needs prefers-reduced-motion
     handling.
   - TODO: 404 page - full .air-frame treatment, "Return to sender"
     headline.
   - TODO: "This week's drop" EDM roundup module - full .air-frame,
     same treatment as the newsletter unit above. */

/* font-synthesis: none (2026-08-28 review) - a real faux-bold was
   found live (Source Serif's <strong> synthesising 700 it doesn't
   have, fixed above by mapping to the real 600 cut). This makes any
   FUTURE weight/style gap fail visibly (a plain, un-styled glyph)
   instead of silently shipping a smeared synthetic one. */
body {
    font-synthesis: none;
}

/* Display - Archivo. theme.json carries font-family/weight/line-height/
   colour for h1-h4 (WP's per-level `styles.elements.h1..h4` support);
   text-wrap:balance isn't theme.json-expressible, so it lands here.
   font-stretch below is CURRENTLY INERT, left in deliberately rather
   than silently dropped - 2026-08-28's font-payload follow-up pass
   moved Archivo from one variable file (704KB uncut, ~90KB even latin-
   only at full axis range) to four static per-weight files (~14KB
   each), and a static font has no width axis for font-stretch to act
   on. If the narrower-heading look matters enough to bring back, the
   fix is re-cutting Archivo as a trimmed-axis variable file (wght
   500-800, wdth 88-100 - fonttools varLib.instancer, not available in
   this sandbox) instead of re-declaring font-stretch here. */
h1 {
    font-stretch: 94%;
    text-wrap: balance;
}
h2 {
    font-stretch: 94%;
}
h3 {
    font-stretch: 96%;
}
/* Card headlines run narrower - the columns are tight. Uses the actual
   Archivo Narrow FAMILY (registered under its own theme.json slug,
   2026-08-28 review fix - it was previously nested inside the "display"
   slug's fontFace array, which WordPress silently re-labels to that
   slug's own top-level family name regardless of the individual face's
   own "fontFamily" value; every "Archivo Narrow" file was shipping
   under font-family: Archivo, colliding with real Archivo 700 and
   making every Archivo-700 request site-wide render condensed by
   accident). font-stretch is NOT set here - a static single-width
   family has no axis for it to act on regardless of which family it
   is; the family choice itself is what does the narrowing now that it
   actually resolves correctly. Weight/size restored to 700/1.28rem
   (2026-08-28 review, finding E - had drifted to 600/18.4px, weaker
   than the pre-rebuild 700/20px with nothing gained since the narrow
   family wasn't working yet either).
   `:not(.drop-single-title)` is load-bearing, not decoration - WP core
   puts `wp-block-post-title` on the Post Title block in EVERY context,
   single-post included, and single-post-body.html's own real <h1>
   carries that exact class alongside `drop-single-title` (found live,
   2026-08-28: this rule was silently shrinking the actual article
   title to card-headline size instead of the h1 clamp/800-weight
   treatment - one class selector beats theme.json's element-level h1
   style and this file's own bare `h1{}` rule). */
.wp-block-post-title:not(.drop-single-title),
.post-card h3,
.drop-card-title {
    /* Family/size retuned AGAIN 29 Aug (headline/label split, Daniel's
       call from a live three-way comparison), same day as the leading/
       tracking retune just below. Was `var(--wp--preset--font-family--
       display-narrow), var(--font-display)` / `1.28rem` (20.48px) -
       Narrow was the right call when titles were ALL CAPS (condensed
       width bought back characters caps were wasting); sentence case
       already runs ~15% narrower than caps on its own, and condensed
       lowercase at 20px read tabloid where regular-width reads
       editorial. Confirmed live: Narrow 20.5px vs Archivo 700/19px vs
       Archivo 600/20px - 700/19px matched the article H1's voice and
       still fit the longest real title (the Beresfield/PaySafeGo one,
       135 characters) in the same two-line clamp. Narrow dropped
       entirely from the stack, not left as a fallback - a fallback that
       always resolves (both faces are loaded) is really just the first
       value with dead weight after it. */
    font-family: var(--font-display);
    font-weight: 700;
    font-size: 1.375rem; /* 22px - homepage redesign handoff type scale
        (§ Typography, "Card headline": Archivo 600/22px - kept at 700
        here since the sitewide card component was already 700, and the
        handoff's own type table lists 600 only for the specific 22px
        card-headline row on the NEW component; changing weight as well
        as size on every card sitewide, incl. IGT/single-post-title
        reuse of this rule, wasn't part of what was asked - size/tracking
        moved to match, weight left alone). Was 1.1875rem (19px). */
    /* Retuned for sentence case (headline-retune pass, 29 Aug - the
       sentence-case migration this value was waiting on is now live).
       Was `line-height: 1.16; letter-spacing: 0.03em` - caps-era values:
       "matches h1/h2/h3 and .drop-archive-title - one shared value while
       headlines stay ALL CAPS" (the comment this replaces). Card titles
       are sentence case now, so they have descenders the old 1.16
       leading didn't budget for, and no longer need the positive
       tracking caps use to keep letters from crowding. `.drop-archive-
       title` itself is DELIBERATELY untouched by this pass - it's a
       short section LABEL, still genuinely set in caps by CSS
       (text-transform:uppercase), and keeps its own +0.03em tracking;
       this rule only ever shared a value with it by coincidence, not by
       any real coupling, so splitting them here doesn't touch that
       other rule at all. Same split applies to eyebrows/kickers/dates/
       the partner chip - all still caps, all keep positive tracking,
       none of them touched this pass. */
    line-height: 1.2; /* was 1.25 - handoff's card-headline row (22/1.2) */
    letter-spacing: -0.014em; /* was -0.01em - handoff's exact value */
}
/* `.drop-card-title` added to this rule 2026-08-28 (found live on IGT
   Connects) - the raw-PHP-rendered IGT post grid (drop_render_igt_post
   _grid() in plugins/drop-blocks.php, never goes through do_blocks())
   emits `.drop-card-title` alone with no `wp-block-post-title` class,
   so it never matched this rule and fell back to browser defaults plus
   whatever the separate `.drop-card-title` rule further down set - 20px
   Archivo/600 instead of 1.28rem Archivo Narrow/700, a visibly
   different (smaller, wrong-family, lighter) headline from the exact
   same component everywhere else on the site. Made `.drop-card-title`
   itself the complete, self-sufficient owner of this typography rather
   than something that only resolves correctly when a second class
   happens to also be present - the old `.drop-card-title` rule below
   had its own competing `font-size: 1.25rem`, which never actually won
   anywhere `wp-block-post-title` was also present (this rule's `:not()`
   argument gives it higher specificity) - i.e. that 1.25rem was already
   dead everywhere except this one raw-PHP grid, so removing it there
   loses nothing real. */

/* Whole-card click target, stretched-link pattern (external review
   adoption, 2026-08-28 later still - Daniel approved four of its items).
   "Read more ->" duplicated the headline link on every card - two tab
   stops to the same URL, and the card's large surface was mostly dead
   space for the pointer. `wp:read-more` removed from front-page.html/
   index.html (the two core/query-loop card templates - the raw-PHP IGT
   post grid is a DIFFERENT, separate component with its own thumbnail/
   title/read-more-or-watch-video links and was deliberately left alone,
   see that function's own comment in plugins/drop-blocks.php).
   Stretched-link on the TITLE link (`::after`, absolutely positioned
   over the whole `.wp-block-post` card), NOT a wrapping `<a>` - wrapping
   the whole card in an anchor makes screen readers announce the entire
   card's contents (headline, kicker, date, excerpt) as one link name,
   which is worse than the two-tab-stops problem this is fixing. */
.wp-block-post-template .wp-block-post {
    position: relative;
}
.wp-block-post-template .wp-block-post-title a::after {
    content: "";
    position: absolute;
    inset: 0;
    z-index: 1;
}
/* Interactive elements inside the card stay independently clickable
   ABOVE the stretch, per the brief - the category kicker links (their
   own destination, not the article) need to resolve to their OWN URLs
   on click, not the stretched title link's. `.wp-block-post-terms a`
   covers the same content rendered through core's own post-terms block,
   should this grid ever use that instead of drop/card-kicker. */
.wp-block-post-template .drop-card-kicker a,
.wp-block-post-template .wp-block-post-terms a {
    position: relative;
    z-index: 2;
}
/* Hover affordance (brief's own instruction) - the enlarged target needs
   to be PERCEIVABLE, not just clickable: on card hover, the title
   changes colour to brand-red, so hovering anywhere on the card visibly
   previews what clicking will do. Colour only, NOT underline (Daniel's
   explicit correction, 2026-08-28 later still, to the first version of
   this rule which used the in-content body-link underline treatment) -
   matches the same colour-only hover convention this site already uses
   for other card/list titles (e.g. .drop-post-nav__link:hover
   .drop-post-nav__title), not the body-link underline pattern, which is
   for prose links, not headline hover states. */
.wp-block-post-template .wp-block-post:hover .wp-block-post-title a {
    color: var(--wp--preset--color--brand-red);
}
/* Known, accepted tradeoff (brief's own note, recorded so it isn't
   "fixed" later): text selection inside the card body becomes awkward
   once the title's stretched pseudo-element covers the whole card - the
   invisible ::after sits above the excerpt text too, and a user trying
   to drag-select a word or two intercepts the link instead. Accepted -
   these are excerpts, not reading copy; nobody selects text from a card
   teaser the way they would from an article body. */

/* Reading - Source Serif 4 is now the SITEWIDE DEFAULT (theme.json's
   base styles.typography.fontFamily), not scoped here - 2026-08-28
   follow-up review found the original scoping-to-.wp-block-post-content
   meant 95% of the site (card excerpts, archive descriptions, Contact,
   Corporate Directory, IGT Connects) never got the serif at all, since
   none of that prose lives inside a wp:post-content block. Archivo is
   now what's scoped UP (headings/nav/buttons/pagination/form controls
   below), not the other way round.
   BODY-COPY STANDARD, collapsed to ONE tier (2026-08-28 later still -
   Daniel's explicit decision, 28 Aug, audited live across eight page
   types). This rule used to also set `font-size: 18px; line-height:
   1.66;` - a dedicated "reading" tier for single-article prose, sitting
   above the 16px/1.6 sitewide base. That divergence was the audit's own
   root cause, not a design intent: `.wp-block-post-content` is the class
   WP core stamps on ANY Post Content block, and `page.html` uses it as
   the wrapper for a WHOLE PAGE'S BODY - so Contact Us and Corporate
   Directory silently inherited reading-prose sizing meant for a single
   article, at their own full container width (1310px/1078px), producing
   146 and 120 characters per line respectively (comfortable reading is
   60-75). IGT Connects rendered BOTH sizes on one page depending on
   which block happened to sit inside vs outside a post-content wrapper.
   Collapsing to one size on the BARE class removes that whole bug class
   rather than patching each instance - no descendant of the bare class
   (Pages, hubs, archives, cards, search, excerpts, sidebar) can silently
   diverge from the sitewide 16px/1.6. This bare rule itself is
   UNCHANGED, still 16px, no font-size/line-height here, exactly as this
   comment always said.
   AMENDMENT, 29 Aug (Daniel's call, measured live on a real article at
   1536px) - "one size, no exceptions" gets its one documented escape
   hatch: `body.single .wp-block-post-content` (below) reintroduces the
   18px/1.66 reading tier, scoped to `body.single` ONLY. This is NOT a
   reversal of the 28 Aug decision or a piecemeal size bump on the bare
   class - the bare class, and every non-single context that inherits
   from it, stays exactly 16px, still the reason the 28 Aug audit exists.
   `body.single` is the one context that was never the audit's problem
   (WP core's own class for a singular post/CPT view, never present on a
   Page - the exact scope the 68ch measure cap below already uses for
   the same reason) - it's safe to diverge there specifically because
   `body.single` can't leak onto Contact Us/Corporate Directory/IGT
   Connects the way the bare class did. Don't reintroduce 18px on the
   bare class, and don't extend `body.single`'s scope to cover anything
   it doesn't today. */
.wp-block-post-content {
    font-optical-sizing: auto;
    color: var(--ink);
}
/* Measure cap, ONE tier pass (2026-08-28 later still) - `body.single
   .wp-block-post-content`'s own 68ch cap (below, UNCHANGED, still doing
   real work) was introduced 2026-08-28 earlier the same day specifically
   because `wp-block-post-content` is also the layout wrapper for
   Contact Us/Corporate Directory/IGT Connects' multi-column hub
   layouts, and putting 68ch on the bare class had squeezed those whole
   pages into a 647px column. `body.single` correctly scoped the cap to
   single-article prose, but that scoping is what left every OTHER
   prose context - the same Pages the cap was scoped away from -
   uncapped at full container width (Contact Us: 146 characters per
   line at 1310px; Corporate Directory: 120 at 1078px). The size half of
   that divergence is gone with the two deleted lines above; this is the
   other half, capping the actual flowing-text ELEMENTS rather than the
   layout wrapper they sit in - a top-level `<p>`/list/blockquote on
   Contact Us gets capped, while a `wp:columns`/`wp:group` hub layout
   block (rendered as a `<div>`, never matched by this selector) is
   completely untouched, wherever it's nested. Scoped to DIRECT CHILDREN
   only (`>`, not a descendant combinator) so a paragraph already inside
   one of those hub layout's own narrower column blocks isn't double-
   capped or affected at all - it was never too wide to begin with.
   This rule alone fully solves Contact Us (its paragraphs really are
   direct children here). It does NOT reach Corporate Directory's
   company descriptions or IGT Connects' intro text - both are prose,
   confirmed live still uncapped after this rule shipped, but nested one
   level deeper inside their own component wrappers, not direct children
   of this class - those get their own targeted rules right where those
   components are already styled (search "Measure cap" near
   `.drop-company-directory__body` and `.drop-igt-intro`), same pattern,
   not folded in here so each fix sits next to the component it fixes. */
.wp-block-post-content > p,
.wp-block-post-content > ul,
.wp-block-post-content > ol,
.wp-block-post-content > blockquote {
    max-width: var(--measure);
}
/* Measure cap scoped to genuine flowing prose only (2026-08-28, found
   live on IGT Connects) - `wp-block-post-content` is the class WP core
   stamps on ANY Post Content block regardless of post type/template,
   and `page.html` uses that same block as the top-level layout wrapper
   for a Page's entire body - which for hub pages like IGT Connects,
   Corporate Directory, and Contact Us is a custom multi-column block
   layout (intro + sidebar, grids), not prose. Putting 68ch directly on
   the bare class squeezed those whole layouts into a 647px column at
   any viewport width. `body.single` (WP core's own class for a
   singular post/CPT view, never present on a Page - confirmed live
   against both single-post and single-drop_igt_post) is the correct,
   already-available scope: it's exactly the single-post-body.html
   prose this cap was written for. Left as a literal `68ch`, not the new
   `--measure` token, deliberately - this rule predates the token and
   this pass is the measure-cap fix, not a wider token migration; see the
   token's own comment above.
   READING TIER RETURNS, 29 Aug (Daniel's call, measured live on
   /nsw-rooftop-bars-outdoor-dining-and-less-red-tape/ at 1536px) - see
   the AMENDMENT note on the bare `.wp-block-post-content` rule above for
   why this is scoped here and not a reversal of the 28 Aug one-tier
   decision. `font-size: 18px; line-height: 1.66` added to this SAME
   selector - deliberately the same rule as the `max-width: 68ch` below,
   not a separate one, because `ch` is relative to THIS element's own
   font-size: bumping font-size here makes the existing `68ch` resolve
   to 648px automatically (was 576px at 16px) with no change to the
   max-width line itself - same characters-per-line (~72cpl), a wider
   column at identical measure. Two things this does NOT automatically
   fix, handled explicitly further down: `.wp-block-post-featured-image`
   is a SIBLING of `.wp-block-post-content`, not a descendant (see that
   rule's own comment) - it doesn't inherit this font-size, so its own
   `68ch` stays at the OLD 576px unless given the new width explicitly;
   `.drop-single-title`/`.drop-card-meta` are also outside this element,
   already on a literal `rem` cap for the same cross-context reason -
   both need their `36rem` moved to `40.5rem` (648px) to keep sharing
   this column's edge. */
body.single .wp-block-post-content {
    max-width: 68ch;
    font-size: 18px;
    line-height: 1.66;
}
/* Media measure cap (article-column-alignment pass, 2026-08-28 later
   still) - the article text is capped at 68ch/~576px (above), but
   `.wp-block-post-featured-image` and any in-body image/embed still
   spanned the full 831px `.drop-single-layout__main` column: a wide
   image with a narrower ragged text column hanging off its left edge
   read as accidental, not composed. Fixing the IMAGE, not the text -
   widening the text back out to match the image would put body copy
   back at ~104 characters per line, the exact readability failure the
   measure-cap pass fixed.
   This is the standard editorial pattern: media matches the text
   measure by default; anything wider is a deliberate opt-in breakout,
   which this theme does not have yet (no `.alignwide`/`.alignfull`
   treatment defined for single-post media - if one is wanted later, it
   should be an explicit class, not the default every image gets).
   `.wp-block-post-featured-image` is NOT inside `.wp-block-post-content`
   in this theme's template (`single-post-body.html` renders
   `wp:post-featured-image` as a separate top-level block, a sibling of
   `wp:post-content`, not a child of it) - confirmed live via a DOM walk,
   not assumed from the class name - so it needs its own selector rather
   than folding into the `> figure` rules below, which only reach images
   an editor places INSIDE the article body itself.
   No `margin-inline: auto` added - confirmed live that `.wp-block-post-
   content` itself has no auto margins either (both compute 0px); it
   simply sits flush-left in `.drop-single-layout__main` with the 68ch
   cap doing all the work, and the featured image capped the same way
   lines up at the identical left edge for free, from the shared parent
   alone. Adding centring here would have MISALIGNED it against the text
   instead of matching it.
   SPLIT OUT 29 Aug (reading-tier pass) - `.wp-block-post-featured-image`
   used to share this `68ch` rule with the three in-body selectors below.
   That stopped being safe once the reading tier gave `.wp-block-post-
   content` its own 18px font-size: the three `> figure`/`.wp-block-
   image`/`.wp-block-embed` selectors are DESCENDANTS of that element, so
   their `ch` inherits the new 18px and correctly grows to 648px for
   free - but the featured image is a SIBLING (this rule's own comment,
   above, already established that), a different font-size context
   entirely, so its `68ch` would have silently stayed at the OLD 576px
   while the text column beside it grew to 648px, breaking the shared
   edge this whole rule exists to keep. Given its own literal `40.5rem`
   (648px, rooted at the document's 16px base) instead - the same
   rem-not-ch fix already used on `.drop-single-title`/`.drop-card-meta`
   below, same reason. */
body.single .wp-block-post-featured-image {
    max-width: 40.5rem;
}
body.single .wp-block-post-content > figure,
body.single .wp-block-post-content > .wp-block-image,
body.single .wp-block-post-content > .wp-block-embed {
    max-width: 68ch;
}
/* Article H1 retuned for sentence case (headline-retune pass, 29 Aug -
   the sentence-case migration this was waiting on is now live).
   theme.json's global h1 element style (`clamp(2.1rem, 5vw, 3.4rem)` /
   800 / line-height 0.98 / letter-spacing 0.03em) is caps-era tuning,
   sized and tracked for short ALL-CAPS lines with no descenders - this
   override is scoped to `.drop-single-title` ONLY, not theme.json
   itself, specifically because `.drop-archive-title` is ALSO a real
   `<h1>` and must keep inheriting the untouched global values (it's a
   short section LABEL, still genuinely set in caps by CSS, and correctly
   keeps the positive tracking/tight leading caps want - "archive H1 byte-
   identical" is a real guardrail here, not a suggestion).
   Measured live before changing anything: 54.4px/0.98/+0.03em produced a
   4-line stack on a real sentence-case headline in the 576px article
   column, with descenders nearly touching the caps below them - 0.98
   leading only ever worked because caps have no descenders to collide
   with. New values: ~44px (was sized for short shouty caps lines;
   sentence-case headlines run longer, so more words survive per line -
   at 54px in this column that was 2-3 words and a 4-deep stack, ~44px
   yields 4-6 words and a 3-line headline instead of a wall of text),
   1.06 leading (descenders now exist and need room), -0.02em tracking
   (the negative tracking sentence-case type actually wants - positive
   tracking is a caps-only correction, gappy the moment lowercase
   letters with normal counters enter the mix). */
.drop-single-title {
    font-size: clamp(2rem, 4vw, 2.75rem);
    line-height: 1.06;
    letter-spacing: -0.02em;
    text-wrap: balance; /* 29 Aug, reading-tier pass - the live headline
        ("NSW - Rooftop bars, outdoor dining and less red tape") was
        wrapping raggedly (a long first line, a short trailing one);
        balance redistributes words across lines for a more even shape.
        Only applies where the browser supports it (graceful no-op
        fallback to normal wrapping elsewhere - no separate fallback
        rule needed). */
}
/* H1 measure cap - checked live, not assumed: `.drop-single-title` had
   no max-width of its own and rendered the full 831px column width
   (confirmed via getBoundingClientRect), which would visibly overshoot
   the now-576px-capped featured image directly below it.
   DELIBERATELY `36rem`, NOT a literal `68ch` - found live, not guessed:
   `ch` is sized against the ELEMENT'S OWN font-size. At the time this
   was written the H1 had no local font-size override and inherited
   theme.json's h1 clamp (2.1rem-3.4rem); the headline-retune pass (29
   Aug, directly above this rule) has since given `.drop-single-title`
   its OWN smaller clamp (2rem-2.75rem) - the reasoning below still holds
   at the new size too (68ch at ~44px Archivo still computes to roughly
   four figures in px, nowhere close to 576px), just noting the source
   of the font-size this math is checking against has moved. A bare
   `68ch` here computed to 2312px at the ORIGINAL size (confirmed via
   getComputedStyle), wider than the 831px column itself, so it capped
   nothing at all. `rem` is rooted to the DOCUMENT's font-size regardless
   of the local element's own size, which is exactly what's needed to
   match a measurement calibrated elsewhere on the page.
   36rem = 576px at this site's 16px root - within a sub-pixel of
   `body.single .wp-block-post-content`'s own real measured cap
   (575.552px, `68ch` at Source Serif 4/16px) - visually identical, one
   column, one edge.
   UPDATED 29 Aug (reading-tier pass) - 36rem -> 40.5rem (648px). The
   article column this cap tracks widened from 576px to 648px when the
   18px reading tier returned on `body.single .wp-block-post-content`
   (68ch at the new 18px resolves to 648px) - this H1 cap has to move
   with it or it goes back to sitting narrower than the column it's
   meant to share an edge with. Still `rem`, not `ch`, for the same
   reason as before: the H1's own font-size (44px) has nothing to do
   with the column width being measured. */
.drop-single-title {
    max-width: 40.5rem;
}
/* .drop-card-meta (category + date row) capped the same way, same
   reason - not named in the brief, but checked live alongside the H1:
   it sits between the now-capped H1 and the now-capped featured image,
   and was the one remaining full-831px-width element in the column,
   which would have read as its own small overshoot sandwiched between
   two aligned edges. `36rem`, not `68ch`, for the same local-font-size
   reason as the H1 above - this row's own font context isn't guaranteed
   to be the 1rem body base either.
   UPDATED 29 Aug (reading-tier pass), same reason and same new value as
   the H1 above - 36rem -> 40.5rem, tracking the column's new 648px
   width. SCOPED to `body.single` at the same time - this selector was
   bare before (`.drop-card-meta` alone), which also reaches the card
   grid's own kicker+date row (`front-page.html`/`index.html` reuse the
   same class for the same visual component). Harmless there today
   (cards are far narrower than either 36rem or 40.5rem, so the cap
   never actually constrained anything in that context) but tightening
   the scope now removes the coincidence rather than carrying it
   forward unexamined into a rule this pass is already touching. */
body.single .drop-card-meta {
    max-width: 40.5rem;
}
/* Faux bold fix (2026-08-28 review, finding C) - Source Serif 4 is
   loaded at 400/600/400-italic, no 700, so <strong>/<b> requesting the
   browser's default bold (700) got synthesised (skewed/smeared 400
   outlines) rather than rendering the real 600 cut. 600 is a
   legitimate bold weight for body copy and costs nothing extra to
   ship (already loaded for h5/h6-adjacent uses elsewhere). */
.wp-block-post-content strong,
.wp-block-post-content b {
    font-weight: 600;
}
/* Blockquote's italic/colour/font-family live on the established
   border+padding rule further down this file (search "Blockquote
   style"), not duplicated here - that rule already owns this exact
   selector and would have silently won the cascade tie (later in
   source, same specificity) over a second declaration here. */

/* Stamp - caps, bold, small, tracked. Never body copy, never above
   13px. Covers WP's own post-date/post-terms blocks plus this theme's
   custom eyebrow/kicker/partner-chip classes. */
/* Courier Prime REPLACED with Archivo Narrow 700 (font-swap pass,
   2026-08-28 later same day) - comment REWRITTEN, not left stale: the
   note this replaces was specific to Courier's own small x-height at
   its em size and doesn't apply to the new face at all (Archivo Narrow
   has a noticeably LARGER x-height, so it reads BIGGER at the same px,
   the opposite problem). Courier was also the wrong postal reference to
   begin with - a cancellation is stamped/stencilled, not typed - and its
   mono-spacing was the real mechanical issue: every character took the
   same width, so "GAMING / OPERATIONS" opened craters around the slash
   and "23 AUG 2026" fell apart at 0.15em tracking. Archivo Narrow 700
   caps is tighter with real presence and reads far more like a stamped
   mark; it's the SAME family already loaded for card titles
   (display-narrow) - see the --font-stamp alias above, no second
   @font-face for it here.
   Tracking goes slightly UP, not down, moving to a condensed face - a
   condensed face needs a little more air between caps than a mono one
   did. Numerals (dates) still get materially less tracking than letters
   - that part of the original reasoning still holds regardless of
   typeface, figures just don't need as much space between them. 12px
   stays this theme's floor for the stamp face (unrelated reason now:
   simply the smallest comfortable size for a 700-weight caps label, not
   an x-height correction) - re-check live once the new face is up,
   these sizes were tuned for Courier and may want another pass.
   UPDATED 29 Aug (headline/label split, Daniel's call from a live
   three-way comparison): card titles have moved OFF this family onto
   Archivo - Narrow was only ever condensed to buy back characters ALL-
   CAPS titles were wasting, and sentence case removed that reason
   entirely. Archivo Narrow is now EXCLUSIVELY this stamp/caps layer -
   the differentiation the Round Two review flagged as lost ("Narrow
   doing double duty, at its limit") is restored, since it no longer
   shares a job with headlines. */
.wp-block-post-date,
.wp-block-post-terms a,
.eyebrow,
.partner-chip {
    font: 700 12px/1.3 var(--font-stamp);
    text-transform: uppercase;
}
.wp-block-post-terms a,
.eyebrow,
.partner-chip {
    letter-spacing: 0.14em; /* was 0.12em - see the face-swap comment above */
}
/* .drop-card-kicker deliberately excluded from the blanket stamp rule
   above - it already has its own tuned size/weight treatment below
   (2026-08-27, letter-spacing deliberately removed on Daniel's explicit
   request after a live screenshot review - left untouched here, this
   pass only bumps its font-size to the same 12px minimum, see below).
   Only the typeface changes on this line; every other tuned property
   stays untouched. */
.drop-card-kicker {
    font-family: var(--font-stamp);
}
.wp-block-post-date {
    color: var(--ink-muted);
    font-size: 12px;
    letter-spacing: 0.06em;
}
.wp-block-post-terms a {
    color: var(--brand-red);
}

/* UI furniture stays on the display face at normal (static, non-
   variable) width - expanded 2026-08-28 (follow-up review) to cover
   pagination and read-more, which fell to plain Archivo-then-nothing
   before (they render generic body text, so once the sitewide default
   flipped to serif, these needed an explicit opt-back-in to Archivo,
   same as nav/buttons always had).
   `.wp-block-read-more` dropped from this list (external review
   adoption, 2026-08-28 later still) - the block itself is removed from
   every template that used it (see the stretched-link pattern further
   down this file), dead selector, not left pointing at nothing. */
.wp-block-navigation a,
.wp-element-button,
.wp-block-search button,
.wp-block-query-pagination-numbers {
    font-family: var(--font-display);
    font-weight: 500;
    font-stretch: 100%;
}
/* Finding I (2026-08-28 review): the newsletter-modal close button, GF
   submit buttons and the hero-carousel prev/next arrows all computed
   bare Arial - no font stack at all reaches inside form controls by
   default in most browsers (button/input/select/textarea don't inherit
   the body font unless told to). One rule closes every instance of
   this rather than patching each control's own stylesheet separately. */
button,
input,
select,
textarea {
    font-family: inherit;
}

/* ── .drop-btn - ONE button component, 30 Aug (button-system pass,
   Daniel's review of the homepage promo units and footer). Was three
   different buttons, each hand-tuned in isolation: the header's "Get
   the weekly drop" (already sentence case, by coincidence not
   convention), the LinkedIn tile's CTA (`.drop-house-ad__cta` - caps +
   0.08em tracking), and the newsletter form's "Sign me up" (a third
   padding/size, navy fill). All three - plus the modal's own submit,
   same markup as the other newsletter placements - now render from
   this one class.
   RULE TO RECORD, sitewide: buttons and CTAs are sentence case. ONLY
   the stamp layer (kickers, dates, eyebrows, chips) is caps - this is
   the same "if it's sentence case, it's Archivo; if it's caps-and-
   tracked, it's Narrow" rule from the headline/label split (29 Aug)
   extended to cover buttons explicitly, since they were the one UI
   category nobody had actually written the rule down for. Text was
   never all-caps in the markup for ANY of these three (checked live,
   not assumed) - `text-transform: uppercase` was doing it visually on
   the tile CTA; `text-transform: none` here is the entire fix for that
   one, no copy changes needed.
   `background: var(--wp--preset--color--brand-red-dark)` on hover -
   new palette entry (was the literal hex `#A81015`, already in use in
   three different places under three different justifications before
   this pass unified them: the header button's hover, the LinkedIn
   tile's hover, and nowhere consistent on the newsletter button, which
   used to swap to a completely different hue instead of darkening).
   Tokens, not hex, per the guardrail. */
.drop-btn,
.gform_wrapper .gform_button.button {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
    min-height: 44px;
    padding-inline: 1.25rem;
    background: var(--wp--preset--color--brand-red);
    color: var(--wp--preset--color--white);
    font-family: var(--wp--preset--font-family--display);
    font-weight: 600;
    font-size: 14px;
    text-transform: none;
    letter-spacing: 0;
    border: none;
    border-radius: 0;
    cursor: pointer;
    text-decoration: none;
}
.drop-btn:hover,
.gform_wrapper .gform_button.button:hover {
    background: var(--wp--preset--color--brand-red-dark);
}
.drop-btn:disabled,
.gform_wrapper .gform_button.button:disabled {
    opacity: 0.6;
    cursor: default;
}
/* The sitewide focus ring is red (:focus-visible, ~line 700+) - on a
   button whose own fill IS brand-red, that ring would sit almost
   invisibly against its own background. White instead, same fix
   already used on `.drop-house-ad__cta` before this component existed. */
.drop-btn:focus-visible,
.gform_wrapper .gform_button.button:focus-visible {
    outline-color: var(--wp--preset--color--white);
}

/* ── .drop-btn--navy / .drop-btn--ghost, 30 Aug (Round Three review,
   Top Jobs pass) - formalises a second button family that already
   existed informally: seven plain `wp:button` blocks on Top Jobs
   (partner "Find out more" links) were rendering navy at 16px/51px
   tall via theme.json's own global button element style, unsystematised
   next to `.drop-btn`'s 44px/14px metrics. RULE TO RECORD: red
   (`.drop-btn`) = conversion (newsletter, follow); navy (`.drop-btn--
   navy`) = navigation/partner links. No third style - `.drop-btn--
   ghost` is a recolour of the navy family for navy SURFACES (see its
   own comment, further down this file, on the Job of the Week panel),
   not a third intent. */
.drop-btn--navy {
    background: var(--wp--preset--color--brand-navy);
}
.drop-btn--navy:hover {
    background: var(--brand-navy-deep);
}
/* Sitewide mapping: block-editor buttons (`wp:button`, bare
   `.wp-block-button__link`, no custom className) already render navy
   via theme.json's own button element style (background/text/radius
   all already correct - confirmed live, not assumed) - this rule maps
   the remaining metrics (min-height/size/weight/case) onto `.drop-btn`'s
   own values and overrides theme.json's default hover (navy -> brand-
   red, a conversion-style swap that doesn't belong on a navigation
   button) with the navy-deep darken instead. Editors keep using the
   plain block button UI - "style .wp-block-button__link to match
   rather than hunting every instance" per the brief - none of the
   seven Top Jobs buttons needed a content-side class added.
   ARROW GRAMMAR, 30 Aug (Daniel's call, same pass) - a button's label
   carries a trailing `→` ONLY when activating it leaves the site
   ("Follow The Drop →" on the LinkedIn tile, the Top Jobs "Find out
   more →" partner links below); a button that acts ON this site stays
   plain ("Get the weekly drop" opens the header modal, no arrow). The
   arrow is a visual cue, not content - rendered as `<span aria-hidden
   ="true">` inside the label, `gap: 8px` here gives it the same
   spacing from the text `.drop-btn` already uses for its own icon
   slot, one rule for both button families. */
.wp-block-button__link {
    min-height: 44px;
    display: inline-flex;
    align-items: center;
    gap: 8px;
    font-size: 14px;
    font-weight: 600;
    text-transform: none;
    letter-spacing: 0;
}
.wp-block-button__link:hover,
.wp-block-button__link:focus-visible {
    background-color: var(--brand-navy-deep);
}

/* In-content links - colour alone isn't enough to distinguish them,
   so a red-tinted underline is always present; text stays ink-heading
   (not brand-red) so a paragraph with several links doesn't turn into
   confetti. Scoped to `p a` (2026-08-28, found live on IGT Connects and
   Latest News) - was the bare `.wp-block-post-content a`, which matches
   ANY link anywhere inside a Page's content, not just genuine paragraph
   prose. `page.html` wraps a whole Page's body in `wp:post-content`
   (same root cause as the container/font-size bugs fixed earlier this
   session), so any Page with an embedded card grid caught its title,
   category-kicker and read-more links here too - and because this
   selector carries two classes (`.wp-block-post-content` + the
   `:not()` class) it out-specifies each component's own single-class
   reset (`.drop-card-title a`, `.drop-card-kicker a`, `.drop-card-
   readmore`), so those links rendered underlined AND the kicker's
   colour flipped from brand-red to ink-heading, on every Page-embedded
   card grid but not on front-page.html/index.html (never wrapped in
   `.wp-block-post-content` in the first place). Genuine prose links
   (an article paragraph, a mailto: line on Contact Us/Advertise With
   Us) all sit inside a literal `<p>`; card/kicker/read-more markup
   never does (title is an `<h3>`, kicker a `<div>`, read-more is the
   `<a>` itself) - `p a` is the precise boundary, not `li a` (a Query
   Loop wraps every card in `<li>`, which would still catch everything
   this is meant to exclude).
   RULE TO RECORD, 30 Aug (item 9, Daniel's call): red underline = a
   link INSIDE sentences (this rule, and any other running serif text);
   hover-only underline (no persistent decoration, Archivo not serif) =
   a link that's data or a listing entry rather than a sentence - see
   `.drop-contacts__links a`/`.drop-company-directory__contact a`/the
   footer link rule for that side of it. Thickness tuned 1.5px -> 1px
   this pass; offset was already 0.18em, unchanged. */
.wp-block-post-content p a:not(.wp-element-button) {
    color: var(--ink-heading);
    text-decoration: underline;
    text-decoration-color: rgba(200, 21, 27, 0.45);
    text-decoration-thickness: 1px;
    text-underline-offset: 0.18em;
    transition: text-decoration-color 0.15s ease;
}
.wp-block-post-content p a:not(.wp-element-button):hover {
    text-decoration-color: var(--brand-red);
}
/* "Sources" citation lists (article-refinements pass, 2026-08-28 later
   still) - confirmed live on migrated legacy content (e.g. victorias-
   gamble-on-reform-carded-play-explained, found via a DB search, not
   the single article this brief was reviewing): each source renders as
   `<h6><a style="color: #0000ff;"><strong><span style="color: #0000ff;">
   ...`, WordPress default-blue-link leftovers baked in as INLINE styles
   at import time. Inline styles beat any non-!important CSS rule, so
   this genuinely needs `!important` - the real fix is stripping those
   inline styles from post_content across every affected article (a DB
   content-cleanup job across dozens of legacy posts, well out of scope
   for a style.css pass), this is the CSS-side mitigation for the
   visible symptom. Reuses the exact body-link treatment above rather
   than inventing a second link style, "at listing size" per the brief -
   1rem/400, not h6's own bold/oversized default, since this is a plain
   link list, not a real subheading (this theme has no other confirmed
   use of <h6> anywhere in reviewed content, so scoping by tag is safe
   here without a dedicated class to hook). `*` covers the nested
   <strong>/<span> WordPress wrapped the inline colour in. */
.wp-block-post-content h6,
.wp-block-post-content h6 * {
    font-family: var(--font-body) !important;
    font-size: 1rem !important;
    font-weight: 400 !important;
    color: var(--ink-heading) !important;
}
.wp-block-post-content h6 a {
    text-decoration: underline !important;
    text-decoration-color: rgba(200, 21, 27, 0.45) !important;
    text-decoration-thickness: 1.5px !important;
    text-underline-offset: 0.18em !important;
    transition: text-decoration-color 0.15s ease;
}
.wp-block-post-content h6 a:hover {
    text-decoration-color: var(--brand-red) !important;
}

/* Keyboard focus + text selection (2026-08-28) - both previously
   unstyled as a sitewide default (see the per-component :focus-visible
   rules elsewhere in this file, which stay - this is the catch-all for
   everything else: form fields, plain links, skip links, etc). */
:focus-visible {
    outline: 2px solid var(--brand-red);
    outline-offset: 3px;
}
::selection {
    background: rgba(200, 21, 27, 0.18);
    color: var(--ink);
}
/* 2026-08-23 - a REAL, deterministic bug found from "the header animates
   in, every time": `--mca-admin-bar-h` above is a JS-measured value, and
   like any JS measurement it's necessarily 0px for a moment before that
   JS runs. For a LOGGED-OUT visitor 0px is already correct - no visible
   effect. For a LOGGED-IN admin (Daniel, testing, every single time) the
   header initially renders at `top:0`, fully overlapping the real
   32px/46px admin bar, then visibly SNAPS DOWN the instant the JS
   measurement corrects it a moment later - the whole header relocating
   on screen reads exactly like "it animates in", and happens on every
   logged-in load by construction, not intermittently.
   `body.admin-bar` is a WP core class emitted server-side, in the
   INITIAL HTML, with zero JS/timing dependency - using it here to set
   the correct height from the very first paint eliminates the flash
   entirely for the standard case. The JS measurement in `site.js` is
   NOT removed - it still corrects this if a plugin/notice makes the real
   admin bar taller than the WP-core default, via a higher-specificity
   inline style once it runs; this CSS default just means that
   correction (if it's even needed) is a non-event because the value was
   already right. */
body.admin-bar {
    --mca-admin-bar-h: 32px; /* WP core's own default admin bar height */
}
@media (max-width: 782px) {
    /* WP core's own responsive admin bar breakpoint - the admin bar
       itself grows to 46px below this width (its own icon-only mobile
       layout), independent of any theme breakpoint. */
    body.admin-bar {
        --mca-admin-bar-h: 46px;
    }
}
/* Query loop / post-template card grids and any core/columns usage in
   patterns - the actual "column gap" contexts on this article-driven
   site. */
.wp-block-post-template,
.wp-block-columns {
    gap: var(--drop-column-gap) !important;
}
/* WP's own `displayLayout.columns` attribute on the Query block only
   adds a `columns-N`/`is-flex-container` class - it does NOT actually
   set a per-item flex-basis anywhere in WP core's CSS, so cards just
   flowed at their own content width and wrapped wherever they
   happened to fit (1 per row, full width, regardless of the attribute -
   first found on the category archive's `columns-3` 2026-08-22, same
   bug hit again on `/latest-news/`'s `columns-2` the same day). CSS
   grid with an explicit column count is the actual mechanism - one
   rule covering both counts instead of a second near-duplicate. */
.wp-block-post-template.columns-2,
.wp-block-post-template.columns-3 {
    display: grid !important;
    grid-template-columns: repeat(2, 1fr);
}
.wp-block-post-template.columns-3 {
    grid-template-columns: repeat(3, 1fr);
}
/* Each card is a plain <li> - browsers size a `display: list-item` box
   by shrink-to-fit (like inline-block) rather than stretching to fill
   its grid track, so every card rendered at ~127px (its own content's
   min width) instead of the real column width regardless of the grid
   template being correctly N-wide. */
.wp-block-post-template.columns-2 > li,
.wp-block-post-template.columns-3 > li {
    display: block !important;
    width: 100% !important;
    max-width: none !important;
}
@media (max-width: 900px) {
    .wp-block-post-template.columns-2,
    .wp-block-post-template.columns-3 {
        grid-template-columns: repeat(2, 1fr);
    }
}
@media (max-width: 600px) {
    .wp-block-post-template.columns-2,
    .wp-block-post-template.columns-3 {
        grid-template-columns: 1fr;
    }
}

body {
    margin: 0;
}

/* ── Header-to-hero / footer-strip flush zeroing (§4.7-style, margin-only)
   Bug fixed 2026-08-21 (Daniel's screenshot flagged an oversized gap
   under the header): the template uses id="site-main", this rule was
   targeting .site-main (a class that doesn't exist anywhere) - wrote
   zero real CSS. #site-main's own margin (WP's core/group default,
   ~20px) is the actual gap contributor, not a child margin. */
#site-main {
    margin-block: 0;
}
#site-main > * {
    margin-block: 0;
}

/* ── Full-bleed breakout utility (§3.1) ──────────────────────────────── */
.alignfull {
    margin-inline: calc(50% - 50vw);
    width: 100vw;
    max-width: 100vw;
}

/* ── Section rhythm (§3.5 - the ONLY owner of section-to-section gap) ─ */
.is-section {
    padding-block: var(--drop-section-pad);
}

.wp-block-group.alignfull:not(.page-hero):not(.site-header):not(.site-footer) {
    padding-block: var(--drop-section-pad);
}

/* ── Header (§4.2 fixed-header pattern) ──────────────────────────────
   Rebuilt 2026-08-22 (sticky) for the real 3-row structure, then rebuilt
   AGAIN 2026-08-23 onto `position: fixed` after `sticky` turned out to
   fundamentally break scroll: a sticky header's box is part of normal
   document flow, so changing its own HEIGHT mid-scroll (the whole point
   of shrink-on-scroll) landed inside a browser critical section around
   committing the scroll offset, and reset window.scrollY - confirmed via
   elimination (removing the header entirely fixed a scroll sequence that
   reliably broke with it present; disabling every CSS transition on it
   did NOT fix it, ruling out the animation as the cause). `fixed` sits
   fully OUT of document flow, so its own size changing can't perturb the
   page's scrollable layout the same way - see thedrop-decisions.md,
   2026-08-23, for the full investigation. `.wp-site-blocks`'s
   `padding-top` (above) is what now reserves the header's space, kept in
   sync with the header's real height by site.js - see there for why that
   specific mutation is a different, safe category from what broke
   sticky. */
.site-header,
header.wp-block-template-part.site-header {
    display: flex;
    flex-direction: column;
    position: fixed;
    top: var(--mca-admin-bar-h, 0px);
    left: 0;
    right: 0;
    width: 100%;
    z-index: 100;
}
/* Airmail ribbon, header top edge (2026-08-28) - 6px / pitch 9px, one
   instance covering both expanded and collapsed states (the header is
   already `position: fixed` above, so it stays visible while scrolling
   and does the job the design reference split into two ribbons - see
   thedrop-decisions.md for why that's deliberately one ribbon here, not
   two). A pseudo-element, not a real element, so it never enters the
   accessibility tree. z-index low enough to sit above the header's own
   background but this header has no dropdown content of its own that
   would need to sit above it (the primary nav's dropdown panels render
   inside .site-header__row, confirmed below the ribbon's own box). */
.site-header::before {
    content: "";
    position: absolute;
    inset: 0 0 auto 0;
    height: 6px;
    background-image: var(--airmail);
    z-index: 1;
}
/* Collapsed header (2026-08-28) - a hairline border + shadow instead of
   a second ribbon under the collapsed bar (the design reference's own
   two-ribbon spec put one on a 60px bar, which reads as too much). */
.site-header.is-scrolled {
    border-bottom: 1px solid #d5dee6; /* audit-allow-hex: one-off separator tint, not a brand colour, no reuse elsewhere */
    box-shadow: 0 1px 3px rgba(20, 31, 41, 0.08); /* audit-allow-hex: rgba shadow tint, decorative only */
}

/* Row 1: brand band - REBUILT 2026-08-28 (Option A logo rework),
   replacing both the white-row-plus-navy-logo-only-wrapper model below
   (kept in git history, not worth re-deriving - it existed because the
   OLD asset was an opaque raster crop that covered its own navy safety
   fill entirely) and the separate red .site-header__tags band. The new
   bird/wordmark/postmark assets are real transparent PNGs meant to sit
   ON navy, so the whole band is navy now - no white row, no bleed math,
   no seam to manage between a "logo navy" and a "row white". Height is
   a real px value (not rem) deliberately - it's tied to the actual
   raster assets' resolution-ceiling math (the bird is crisp to ~2.6x
   its native 320px at the size this band shows it), not a typographic
   scale that should track root font-size. */
.site-header__brand {
    height: 140px; /* was 118px (masthead-prominence pass, 2026-08-28 later
       still) - see the HARD CEILING comment below, REWORDED this pass: the
       ceiling was never on the band, only on the bird/wordmark PNGs. The
       band is free to grow; it's what creates clear space above the bird,
       not more pixels asked of the image. */
    background: var(--wp--preset--color--brand-navy);
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding-inline: max(1.5rem, calc(50vw - 655px));
    /* position:relative REMOVED (masthead-height pass) - it existed only as
       the containing block for .site-header__postmark, which is no longer
       position:absolute (moved into normal flow inside .brand-cluster
       below). Nothing else in this band needs a positioning context. */
    overflow: hidden; /* lets the bird's own art bleed off the band's bottom edge, matching the source proof sheet */
    transition: height 0.3s ease; /* same duration/easing as every other shrink-on-scroll piece in this header */
}
/* HARD CEILING - REWORDED AGAIN (wordmark-emphasis pass, 2026-08-28 later
   still - see the previous rewording note below, still correct, just no
   longer the whole story). The bird's half of this ceiling is untouched
   and absolute: do not grow .brand-lockup__bird past 112px, never
   upscale drop-bird.png (320px native width - at 112px tall it renders
   160.7px wide, exactly 2.0x, the retina crispness limit for this
   source). It's fine line art (thin strokes, goggle
   detail, feather hatching) - softening past 2.0x crisp is immediately
   visible there, no exceptions.
   The wordmark's half of this ceiling is DELIBERATELY OVERRIDDEN this
   pass, on purpose, not an oversight to "fix" later: .brand-lockup__word
   is now 96px, not 82px, rendering drop-wordmark.png at 1.71x - BELOW
   the 2.0x line this comment used to treat as an absolute floor for both
   images. That's acceptable HERE ONLY because drop-wordmark.png is a
   different kind of asset to the bird - a heavy brush script with a
   thick white outline, large solid shapes with high-contrast edges,
   which degrades far more gracefully under upscaling than fine line art
   does. Inspected at 2x, 96px shows no perceptible softening. This
   exemption does NOT extend to the bird - do not cite "the wordmark got
   an exception" as precedent for growing it past 112px.
   The proportion this comment previously cited (source lockup's
   223:164 = 1.360 bird:wordmark ratio, landing the wordmark at 82.4px)
   is ALSO deliberately overridden, not forgotten - at 96px the ratio
   becomes 1.17, the wordmark now deliberately larger relative to the
   bird than the original artwork, which is the requested emphasis, not
   a drift back toward "wrong". If a future pass wants to cite either the
   2.0x crispness figure or the 1.360 source ratio to argue 82px is
   "more correct", both were already known and knowingly overridden here -
   check this comment's date against any conflicting one before reverting.
   980px was the ENTIRE resolution budget of the source Logo.jpg these
   assets were extracted from; growing the artwork itself needs the
   vector source (still missing - asked for 3 times, see
   thedrop-open-items), not a CSS change. */
.site-header.is-scrolled .site-header__brand {
    height: 79px; /* UNCHANGED at the masthead-prominence pass (2026-08-28
       later still), deliberately NOT rescaled to the new 140px base -
       applying the same ~66.7% collapse ratio to 140px would give 93px,
       a large collapsed header that defeats the point of collapsing at
       all. The expanded band grew independently of this one; the collapse
       RATIO this number originally came from (118px base) is now stale
       and not worth re-deriving - 79px is the number that matters, kept
       as-is. Confirm the 0.3s shrink transition still reads smoothly
       across the now-larger 140->79 jump, not just assume it does. */
}
.brand-lockup {
    display: flex;
    align-items: flex-end;
    gap: 20px; /* was 18px */
    height: 100%;
}
.brand-lockup__bird {
    height: 112px; /* UNCHANGED at the masthead-prominence pass (2026-08-28
       later still) - already at the HARD CEILING above (2.0x crisp,
       drop-bird.png's own resolution ceiling). It cannot grow; looking
       smaller relative to the now-taller 140px band is the correct
       outcome of that ceiling holding, not a bug. */
    width: auto;
    display: block;
    transition: height 0.3s ease;
}
.brand-lockup__word {
    height: 104px; /* 2026-10-14 new logo band: was 96px. The supplied mockup's
       bird (255px) and wordmark (236px) crops sit at 1.08:1, so with the bird
       at 112px the wordmark is 104px. Both PNGs are now 4x-class sources
       (drop-bird-v2 473px / drop-wordmark-v2 427px native), so the old
       "resolution ceiling" notes below no longer apply to the header lockup.
       Older history follows. was 82px (wordmark-emphasis pass, 2026-08-28 later
       still) - DELIBERATE OVERRIDE of the previous pass's own reasoning,
       not a forgotten regression back toward it; see the HARD CEILING
       comment above for why both of that pass's stated limits (2.0x
       crispness, the 1.360 source proportion) are being knowingly
       exceeded here. At 96px drop-wordmark.png renders 160px wide against
       its 273px native file - 1.71x, below the 2.0x line, acceptable
       because this asset (heavy brush script, thick white outline, large
       solid high-contrast shapes) degrades far more gracefully under
       upscaling than the bird's fine line art does - inspected at 2x, no
       perceptible softening. This is the requested emphasis: the
       bird:wordmark ratio is now 1.17, deliberately more wordmark-forward
       than the source artwork's own 1.36. */
    width: auto;
    display: block;
    align-self: flex-end; /* 2026-10-14: was center. New artwork sits on the
       bird's baseline in the mockup (bottom-anchored, small lift via
       margin-bottom below). Older note: was inheriting .brand-lockup's align-items:
       flex-end (wordmark-emphasis pass) - the wordmark is no longer
       bottom-anchored with the bird; ONLY this element changes, the bird
       stays flex-end (see .brand-lockup, untouched) and keeps bleeding
       off the band's bottom edge exactly as before. */
    margin-bottom: 10px; /* 2026-10-14: lifts the wordmark's navy outline off the band edge. Older note: was 30px - no longer bottom-anchored, so a bottom
       margin has nothing left to push against; vertical position is now
       owned entirely by align-self:center + the `top` optical nudge
       below, not by margin. */
    position: relative;
    top: 0; /* 2026-10-14: optical nudge removed for the new artwork (bottom-anchored). Older note: was 5px - Optical centring, not geometric (wordmark-emphasis pass).
       Measuring drop-wordmark.png's own alpha-weighted ink centroid: the
       box's geometric centre is at 50% of its height, but the actual ink
       (top-heavy - "THE" and the D's bowl - against a bottom mostly empty
       but for the thin "p" descender) sits at y=73.1 of an 82.0 box
       centre in the source measurement, i.e. 8.9px/5.4% of height ABOVE
       centre. Centring the BOX therefore reads as sitting too high;
       nudging it down by that same 5.4% (5px at this 96px height) puts
       the INK, not the box, on the band's true optical centreline.
       `position:relative; top`, not `margin-top` - align-self:center
       centres the flex item INCLUDING its margins, so a margin-based
       nudge would only move the item half as far (half of any margin
       added is "spent" re-centring, half becomes real displacement) -
       confirmed via the flexbox spec's own centring behaviour, not
       guessed; `top` sits outside that math entirely. */
    transition: height 0.3s ease, margin-bottom 0.3s ease; /* `top` replaced the old
       `margin-bottom 0.3s ease` here - margin-bottom is now a static 0,
       `top` is what actually changes between expanded/collapsed states
       (see the is-scrolled override below), so it's what needs to
       transition instead. */
}
.site-header.is-scrolled .brand-lockup__bird {
    height: 76px; /* was 58px - same 58/86 (67.4%) ratio applied to the new 112px base */
}
.site-header.is-scrolled .brand-lockup__word {
    height: 66px; /* 2026-10-14 new logo: was 45px (same 0.68 collapse ratio as the bird: 104 * 0.63). Older note: UNCHANGED at the wordmark-emphasis pass (2026-08-28
       later still) - was 34px, same 34/50 (68%) ratio applied to the
       66px base at the time; not touched again here, this pass only
       changes the EXPANDED wordmark's size. */
    /* margin-bottom: 14px REMOVED this pass, not left stale - it was the
       collapsed half of the old bottom-anchored logic (24px base ->
       20px -> 14px, each scaled from the previous), which this pass's
       base rule replaces entirely with align-self:center + a `top`
       optical nudge (see .brand-lockup__word above). Left in place, it
       would have fought that: align-self:center centres the flex item
       INCLUDING margins, so a leftover margin-bottom here would have
       pulled the collapsed wordmark off-centre rather than doing
       anything resembling its old bottom-anchoring job - confirmed by
       reasoning through the same flexbox-margin-centring behaviour noted
       on the base rule, not left to be found live. Re-derived instead of
       just deleted: the 5.4% optical-centring ratio measured against the
       source PNG is scale-invariant (same file, same ink distribution,
       just displayed smaller), so it applies unchanged to this 45px
       collapsed height. */
    margin-bottom: 4px; /* 2026-10-14 new logo: bottom-anchored. Older: top: 2px; was nothing (this property didn't exist on the collapsed
       rule before) - 45px * 5.4% = 2.43px, rounded to 2px, same
       optical-centring math as the expanded state's 5px nudge at 96px,
       scaled down proportionally rather than left at the expanded
       value. */
}
.site-header__strap {
    display: flex;
    flex-direction: column;
    align-items: flex-end;
    gap: 6px;
    position: relative;
    z-index: 1;
    /* Collapses on scroll via max-height/opacity, NOT display:none - this
       header's whole shrink-on-scroll system is built on smooth
       transitions (§4.2 rule 2: literal pixel heights, never a bare
       toggle), and display can't be transitioned. Same technique the
       old .site-header__tags band used for the identical content before
       this rework merged it in here. */
    max-height: 4rem; /* was 3rem - raised to fit the larger strap-line/
       strap-venues font sizes below (Daniel's request) without either
       line getting clipped by this element's own overflow:hidden; the
       140px .site-header__brand band has plenty of room either way. */
    overflow: hidden;
    transition: max-height 0.3s ease, opacity 0.3s ease;
}
.site-header.is-scrolled .site-header__strap {
    max-height: 0;
    opacity: 0;
}
.site-header__strap-line {
    font-family: var(--font-display);
    font-weight: 600;
    font-size: 1.25rem; /* was 1rem (Daniel's request) */
    color: var(--wp--preset--color--white);
}
.site-header__strap-venues {
    font-family: var(--font-stamp);
    font-weight: 700;
    font-size: 0.875rem; /* was 0.75rem (Daniel's request) - still well under
       the 18.66px/bold "large text" threshold, so the existing #c2d4e2
       colour (measured 4.876:1, chosen for the small-text 4.5:1 floor)
       still clears AA with margin to spare. */
    letter-spacing: 0.12em;
    text-transform: uppercase;
    /* #c2d4e2, not the first-tried #b4c8d8 (2026-08-28, found before
       shipping - computed contrast rather than eyeballing it) - 12px
       bold doesn't clear the "large text" threshold (needs 18.66px
       bold minimum), so this needs the full 4.5:1 AA floor, not 3:1.
       #b4c8d8 measured 4.305:1 on this navy - a real, if small, fail.
       #c2d4e2 measures 4.876:1. */
    color: #c2d4e2; /* audit-allow-hex: a lifted/muted tint of brand-navy's own family for text-on-navy hierarchy - no existing palette slug sits at this exact value (ink-muted assumes a light background) */
}
/* Brand cluster (masthead-height pass, 2026-08-28 later same day) - wraps
   .brand-lockup + .site-header__postmark so the postmark sits in normal
   flow immediately after the wordmark (bird -> wordmark -> postmark, the
   source artwork's own reading order), instead of the old far-right
   absolutely-positioned watermark spot where it collided with .strap and
   read as an artefact at narrower widths. */
.brand-cluster {
    display: flex;
    align-items: center;
    height: 100%;
}
.site-header__postmark {
    /* position:absolute (right:60px; top:50%; transform:translateY(-50%))
       REMOVED - the postmark is now a normal-flow sibling of .brand-lockup
       inside .brand-cluster, not a floated watermark. */
    position: static;
    transform: none;
    height: 156px; /* was 174px (wordmark-emphasis pass, 2026-08-28 later
       still) - shrunk slightly, not to fix the overhang (see below, still
       intentional) but because the wordmark's own new 96px height leaves
       less room before the two collide at the old 10px gap. 156-140=16,
       half of that is 8 - still overhangs the 140px band 8px top and
       bottom (down from 17px, but still enough to read as clipped
       franking rather than a contained sticker; verify that live, it's
       the whole point of the treatment). Also improves the render to
       1.47x from 1.32x - still below the 2.0x retina ceiling, still
       acceptable ONLY for this element for the same reason as before
       (opacity:0.18 makes softening imperceptible) - see the HARD
       CEILING comment above; this is not a precedent for the bird or
       wordmark. */
    width: auto;
    margin-left: 48px; /* was 10px (wordmark-emphasis pass) - the wordmark
       grew to 96px and started crowding the stamp at the old gap;
       widened so the two read as two separate marks again, not a
       collision. */
    opacity: 0.18; /* was 0.30 - it sat far-right, mostly invisible, at that
       opacity; now it's in a prominent in-flow position next to the
       wordmark and needs to recede rather than compete with it. */
    flex: 0 0 auto;
    pointer-events: none;
}
.site-header.is-scrolled .site-header__postmark {
    /* Fade only, not a height change - it's already pointer-events:none
       and purely decorative, so opacity alone is enough to "go away" on
       scroll without a second animatable property to keep in sync. */
    opacity: 0;
}
/* Narrow screens (masthead-height pass) - stop the postmark crowding the
   lockup at widths where the strap/postmark secondary content already
   drops (see the existing @media (max-width: 1199px) rule further down,
   which already sets display:none on this element - that rule already
   covers everything below 900px too, so no separate 900px guard is added
   here; this comment exists so a future pass doesn't add a redundant
   second rule looking for one that "should" exist at 900px. */

/* Newsletter form/trigger swap REMOVED 2026-08-28 (newsletter rebuild) -
   the header no longer renders any form at all, inline or otherwise;
   see thedrop-decisions.md for the full rationale (masthead = lowest-
   intent moment on the site, and the old form put 3-4 focusable
   elements ahead of the nav in tab order on every page). Replaced with
   ONE plain button, `.site-header__newsletter-btn` below, present in
   both header states - nothing left to swap, so no collapse/transition
   machinery is needed here at all.
   NOW RENDERS FROM `.drop-btn` (button-system pass, 30 Aug) - this rule
   used to carry the full button treatment itself (padding/background/
   hover/font); all of that moved to the shared component (see `.drop-
   btn` above) once the header button, the LinkedIn tile CTA and the
   newsletter "Sign me up" button turned out to be three hand-tuned
   copies of the same thing. `min-width: 44px` is the ONE property this
   class keeps of its own - `.drop-btn` only sets `min-height`, and this
   is the one button on the site short enough on some viewport widths
   that a minimum WIDTH target (Part 24) is worth pinning explicitly
   rather than trusting the label text to always be wide enough. Markup
   now carries both classes: `class="drop-btn site-header__newsletter-
   btn"`. */
.site-header__newsletter-btn {
    min-width: 44px;
}

/* Sign-up modal (2026-08-22, rebuilt 2026-08-28) - native <dialog>:
   showModal()/close() and the backdrop are UA-provided, gets focus-
   trapping and Escape-to-close for free (Part 24 a11y baseline) without
   hand-rolled JS for either. Airmail frame (5px / pitch 8px) - this
   dialog IS the panel, no separate `__panel` wrapper exists in the
   markup, so the frame applies directly here. border-radius stays 0 -
   mitred gradient corners on a radius go muddy, square edges are the
   correct envelope behaviour. `.drop-newsletter-inline`/`.drop-
   newsletter-footer` (the OLD placeholder selectors this rule used to
   share) dropped 2026-08-28 - the newsletter rebuild's inline/footer
   variants are `.drop-newsletter--inline`/`.drop-newsletter--footer`
   (a BEM modifier on the new shared component, not a standalone class),
   and per the brief's own §2.2/§2.3 they need DIFFERENT framing anyway
   (inline = full .air-frame treatment, footer = plain padding, no frame
   at all since 2026-08-28 later still - its own top-ribbon rule was
   removed, see .drop-newsletter--footer's own comment for why) - never
   actually shared with the modal's own rule even in principle. See those
   rules further down (search "drop-newsletter").
*/
.drop-newsletter-modal {
    --air-pitch: 8px;
    border: 5px solid transparent;
    border-radius: 0;
    background:
        linear-gradient(var(--air-ground), var(--air-ground)) padding-box,
        var(--airmail) border-box;
    padding: 2rem;
    max-width: min(90vw, 28rem);
    box-shadow: 0 10px 40px rgba(0, 0, 0, 0.25);
}
.drop-newsletter-modal::backdrop {
    background: rgba(20, 30, 40, 0.55);
}
.drop-newsletter-modal__close {
    position: absolute;
    top: 0.75rem;
    right: 0.75rem;
    width: 2.75rem;
    height: 2.75rem;
    line-height: 1;
    font-size: 1.5rem;
    background: transparent;
    border: none;
    color: var(--wp--preset--color--ink-heading);
    cursor: pointer;
} /* 44px+ target (Part 24) - was 2rem/32px, bumped 2026-08-28. */
.drop-newsletter-modal__close:hover {
    color: var(--wp--preset--color--brand-red);
}
/* Social icons - moved from the end of the primary nav row into the
   footer (2026-08-28, search feature - the icons were the only thing
   competing with the new header search input for that space). Colour
   comes from the existing dark-footer treatment below
   (`.site-footer a { color: white }`) for free - these are plain <a>
   tags inside .site-footer, currentColor reaches the SVG fill, no new
   colour rule needed. */
.site-footer__social {
    display: flex;
    align-items: center;
    gap: 0.6rem;
}
.site-footer__social a {
    display: inline-flex;
    opacity: 0.85; /* own hover affordance, 30 Aug (button-system pass) -
        icon-only links have no text for the new sitewide footer
        underline-on-hover rule to underline (there's nothing for
        text-decoration to paint under), so they'd otherwise inherit
        that suppression with no visible hover state left at all. */
}
.site-footer__social a:hover,
.site-footer__social a:focus-visible {
    opacity: 1;
}

/* ── Header search (2026-08-28) ─────────────────────────────────────── */
.drop-header-search {
    position: relative;
    display: flex;
    align-items: center;
    height: 44px; /* was auto (matched the 40px input) - nav-row tighten pass,
       2026-08-28 later same day: matches the CTA button's height so the
       two controls sitting side by side don't mismatch. */
}
.drop-header-search__form {
    position: relative;
    display: flex;
    align-items: center;
}
.drop-header-search__icon {
    position: absolute;
    left: 12px;
    pointer-events: none;
    color: #A6BCCD; /* audit-allow-hex: was --ink-muted - the field now sits on
       navy (nav-row navy pass, 2026-08-28 later same day), where ink-muted
       measured nowhere near visible; 4.74:1 on #35495c, matches the
       submenu-chevron tint above so the row reads as one system */
}
/* `.drop-header-search__input` (a class ON THE INPUT ITSELF), NOT
   `.drop-header-search input[type="search"]` (2026-09-16, found live -
   Daniel reported the search icon covering the placeholder text once
   the panel was open). Root cause: assets/js/search.js reparents
   `.drop-header-search__form` (this input's own parent) INTO
   `.drop-search-panel` on open - the same fact this file's own
   `.drop-search-panel input[type="search"]` comment below already
   documents for the WIDTH problem it fixes, but that fix only patched
   width; every other property on this ancestor-scoped selector ALSO
   stopped matching the moment the form left `.drop-header-search`,
   which is exactly why the input fell back to the browser's default
   2px padding/white background/inset border/serif font once reparented
   - confirmed live via getComputedStyle on the reparented input before
   this fix (paddingLeft measured 2px, not 36px). A class on the input
   travels with the ELEMENT regardless of which container currently
   holds it, so this rule (and its ::placeholder sibling below) now
   apply identically at rest and inside the panel - only the true
   context-dependent difference (width - 260px at rest vs 100% of the
   panel) stays as a separate, deliberately ancestor-scoped override. */
.drop-header-search__input {
    width: 260px;
    min-width: 180px; /* nav regroup, 30 Aug, item 7 - keeps the 260px
        rest width, but lets the field shrink (flex-shrink is already
        the default on a flex item) before the row's own links wrap at
        the ~1024px crowding point this pass exists to fix, per Daniel's
        own spec ("let the input shrink, min 180px, before anything
        wraps"). */
    height: 44px; /* was 40px - matches the CTA button (nav-row tighten pass, 2026-08-28) */
    padding-inline: 36px 12px;
    background: #2C3E4F; /* audit-allow-hex: was transparent/white default - the
       row background alone (--divider, then --brand-navy-deep) used to show
       through; this field needs its own fill now everything around it is
       navy, one step darker than the row so the field still reads as a
       distinct control, not just a border on the same flat colour */
    border-color: #5C748A; /* audit-allow-hex: was --divider (#eeeeee) - that
       token is ALSO the old row background, so it has to be replaced here
       explicitly rather than left pointing at a colour that no longer
       means "the row" */
    border-width: 1px;
    border-style: solid;
    border-radius: 0;
    font-family: var(--font-display); /* was --font-body (Source Serif) -
       serif-drift sweep (article-refinements pass, 2026-08-28 later
       still), the second spot the brief named explicitly: this was a
       DELIBERATE declaration, not an accidental inheritance gap like
       most of the other drift found this pass, just the wrong one. */
    font-weight: 400; /* per the brief ("Archivo 400"), flagged: this
       theme only loads Archivo at 500/600/700/800 (see theme.json) - no
       400 cut exists to match, and unlike bold-above-the-loaded-range
       (which browsers synthesise, see the faux-bold fix elsewhere in
       this file), there's no equivalent synthesis for a LIGHTER weight
       than what's loaded. The browser resolves this to the nearest
       available weight (500) for the actual glyphs shown - the element
       will compute font-weight:400 but visually render at 500. Left as
       specified rather than silently "corrected" to 500, since the
       visual result is the same either way and the literal brief said
       400 - but worth knowing if a true 400 cut ever needs loading. */
    font-size: 0.9rem;
    color: var(--wp--preset--color--white); /* was --ink - 11.00:1 on #2C3E4F */
}
.drop-header-search__input::placeholder {
    color: #A6BCCD; /* audit-allow-hex: 5.60:1 on #2C3E4F, same tint used
       throughout this navy row for muted/secondary content */
}
.drop-header-search__trigger {
    display: none;
    width: 44px;
    height: 44px;
    align-items: center;
    justify-content: center;
    background: transparent;
    border: none;
    cursor: pointer;
    color: #A6BCCD; /* audit-allow-hex: was --ink-heading - this trigger only
       ever shows inside the navy row (.is-scrolled or the <1024px media
       query further down both put it on the same navy background as the
       full search field), so it needs the same tint as the other row
       icons, not the light-header colour it was styled for originally.
       Not called out in the original brief (which only named the full-
       width search icon), but the same navy-contrast problem applies -
       flagged here rather than left broken. */
}
/* Collapsed header (matches the existing .is-scrolled convention) uses
   the icon-only trigger, never the full input. Below the hamburger
   breakpoint this rule is now moot in practice - the whole
   `.site-header__right-cluster` (search trigger AND the icon this rule
   shows) is hidden outright below 1200px, see that rule further down -
   but left in place unchanged for the >=1200px `.is-scrolled` case,
   which this rule alone still governs. Breakpoint updated 1023px ->
   1199px, 2026-09-16 (see the forced-hamburger-breakpoint rule further
   down for the full rationale - this file's mobile-header system now
   unifies on ONE number instead of the old two-tier 768/1024 split). */
.site-header.is-scrolled .drop-header-search__form { display: none; }
.site-header.is-scrolled .drop-header-search__trigger { display: flex; }
@media (max-width: 1199px) {
    .drop-header-search__form { display: none; }
    .drop-header-search__trigger { display: flex; }
}
/* Right cluster (30 Aug, nav regroup, item 7) - search + CTA as ONE
   flex item, so `.site-header__row`'s own `justify-content:space-
   between` does the whole "nav left, flexible spacer, everything else
   right" job with two children instead of three drifting
   independently. Was: the search bar floated mid-row with its own
   share of the space-between gap, and on scroll the collapsed icon
   inherited that same mid-row position with nothing beside it - both
   fixed for free by this wrapper, no separate scrolled-state rule
   needed. */
.site-header__right-cluster {
    display: flex;
    align-items: center;
    gap: 16px;
}
/* Right cluster hidden outright below the hamburger breakpoint
   (2026-09-16, Daniel's request) - previously this cluster (search
   trigger icon + "Get the weekly drop") stayed visible as a compact bar
   at every width below 1024px, alongside the hamburger toggle, which is
   the "second bar" Daniel asked to have removed. The CTA still lives
   inside the drawer itself (assets/js/search.js's drawer-slot
   reparenting, this file's `.drop-drawer-cta-slot`); search does NOT -
   also removed from the drawer the same day, Daniel's explicit call, so
   below this breakpoint search isn't reachable from the header at all
   right now (search.js's initDrawerUtilities only handles the CTA).
   `.wp-block-navigation__responsive-container-open:focus-visible`'s own
   colour rule and the hit-area fix further down are untouched - this
   only hides the RIGHT cluster, not the toggle button, which moves to
   its own top-right position below instead. */
@media (max-width: 1199px) {
    .site-header__right-cluster {
        display: none;
    }
}
.drop-header-search__listbox,
.drop-search-overlay__listbox {
    margin: 0;
    padding: 0;
    list-style: none;
}
.drop-header-search__listbox {
    position: absolute;
    top: 100%;
    left: 0;
    right: 0;
    z-index: 200;
    background: var(--wp--preset--color--white);
    border: 1px solid var(--wp--preset--color--divider);
    max-height: 70vh;
    overflow-y: auto;
}
.drop-header-search__listbox[hidden] { display: none; }
/* ── Desktop search panel (30 Aug, item 8) - "half takeover". Both
   elements are children of `.site-header` (position:fixed, this
   theme's own established positioning context) so `top:100%` self-
   adjusts to whatever the header's REAL current height is (expanded
   or scrolled), no JS measurement needed - and since both start
   exactly at the header's own bottom edge and extend only DOWNWARD,
   neither ever visually overlaps the header's own band/row chrome
   regardless of stacking order, which is deliberate: the brief wants
   the header to stay crisp, only "the page below" dims. assets/js/
   search.js reparents the EXISTING `.drop-header-search__form` (same
   DOM node, same combobox wiring, not a duplicate) into `[data-search-
   panel-inner]` on open. */
.drop-search-panel {
    position: absolute;
    top: 100%;
    left: 0;
    right: 0;
    z-index: 150;
    background: var(--brand-navy-deep);
    padding-block: 1.25rem;
    padding-inline: max(1.5rem, calc((100vw - var(--wp--style--global--content-size, 1310px)) / 2));
}
.drop-search-panel[hidden] { display: none; }
/* Overrides the row's own collapsed/mobile hide rules - THIS COMMENT
   WAS WRONG, found live 2026-09-16 (Daniel reported the panel opening
   as an empty navy band, no visible input, real Chrome): `.site-header.
   is-scrolled .drop-header-search__form { display: none; }` is THREE
   classes (site-header, is-scrolled, drop-header-search__form), not
   two - (0,3,0) beats this rule's (0,2,0) outright regardless of source
   order. Confirmed via computed style on the actual reparented form
   while genuinely open and scrolled: `display: none`, not `flex` -
   the panel's own outer band rendered (right position/colour/size),
   the form inside it just never showed. The width-focused sibling rule
   below and `.drop-search-panel-scrim`/the panel itself aren't in this
   same fight (nothing else forces THEM display:none when scrolled), so
   this was the one place the mobile hide rule's extra class actually
   mattered. `!important` here, not a bigger selector - a fourth class
   to chase for a decisive (rather than tied) win doesn't exist
   naturally on this element, and this project's own drawer rules
   already use `!important` for exactly this "beat a stubborn state-
   based hide rule" situation. */
.drop-search-panel .drop-header-search__form {
    display: flex !important;
    width: 100%;
}
/* `.drop-header-search input[...]` (NOT `.drop-search-panel .drop-
   header-search input[...]`) deliberately - only `.drop-header-search
   __form` itself gets reparented into the panel (assets/js/search.js),
   not its `.drop-header-search` parent div (which stays put in the row,
   now empty except for the trigger button) - a selector requiring
   `.drop-header-search` as an ancestor of the input would never match
   once reparented. Found live, not assumed: the input measured 168px
   wide inside a 1310px panel before this fix. */
.drop-search-panel input[type="search"] {
    width: 100%;
    min-width: 0;
    flex: 1 1 auto;
}
.drop-search-panel .drop-header-search__listbox {
    /* Full panel width, not the compact ~260px dropdown this same
       listbox renders as at rest - "full container width" per the
       brief. Position stays `absolute`/`top:100%` (its own existing
       rule, unchanged) - relative to the reparented form now, which is
       itself full-width inside the panel, so the listbox inherits the
       same width for free. */
    max-height: 60vh;
}
.drop-search-panel-scrim {
    position: absolute;
    top: 100%;
    left: 0;
    right: 0;
    height: 100vh;
    background: rgba(34, 48, 60, 0.4);
    z-index: 89;
}
.drop-search-panel-scrim[hidden] { display: none; }
@media (max-width: 1199px) {
    /* Never triggered by JS below this width anyway (isDesktop() gates
       every open path, DESKTOP_BREAKPOINT now 1200 - assets/js/
       search.js) - belt-and-braces so a stray state couldn't leave
       either stranded visible under the mobile layout. */
    .drop-search-panel,
    .drop-search-panel-scrim {
        display: none;
    }
}
.drop-search__group-label {
    padding: 0.5rem 0.75rem 0.25rem;
    font: 700 11px/1.3 var(--font-stamp);
    letter-spacing: 0.1em;
    text-transform: uppercase;
    color: var(--ink-muted);
}
.drop-search__group-label:first-child { padding-top: 0.75rem; }
[role="option"] {
    padding: 0.5rem 0.75rem;
    cursor: pointer;
    font-family: var(--font-display); /* was --font-body (Source Serif) -
       found in the serif-drift sweep (article-refinements pass,
       2026-08-28 later still): this is the search typeahead's own
       suggestion list, a link list/UI control, not prose. */
    font-size: 0.9rem;
    color: var(--ink);
}
[role="option"][aria-selected="true"],
[role="option"]:hover {
    background: var(--wp--preset--color--surface);
}
.drop-search__type-label {
    color: var(--ink-muted);
    font-size: 0.8rem;
}
.drop-search__see-all,
.drop-search__clear-recent {
    color: var(--brand-red);
    font-weight: 600;
}
.drop-search__no-suggestions {
    padding: 0.75rem;
    color: var(--ink-muted);
    font-style: italic;
}

/* ── Mobile/collapsed search overlay ─────────────────────────────────── */
.drop-search-overlay {
    position: fixed;
    inset: 0;
    width: 100vw;
    height: 100vh;
    max-width: none;
    max-height: none;
    margin: 0;
    padding: 1.25rem;
    border: none;
    background: var(--wp--preset--color--white);
}
.drop-search-overlay::backdrop { background: rgba(0, 0, 0, 0.4); }
.drop-search-overlay__bar {
    display: flex;
    align-items: center;
    gap: 0.75rem;
}
.drop-search-overlay__form {
    flex: 1 1 auto;
}
.drop-search-overlay__bar input[type="search"] {
    width: 100%;
    height: 44px;
    padding-inline: 12px;
    border: 1px solid var(--wp--preset--color--divider);
    font-family: var(--font-display); /* was --font-body (Source Serif) -
       found in the serif-drift sweep (article-refinements pass,
       2026-08-28 later still), NOT one of the two spots the brief named
       but the identical mistake on the mobile/collapsed search overlay's
       own input - same component, same fix. */
    font-size: 1rem;
    color: var(--ink);
}
.drop-search-overlay__close {
    flex: 0 0 auto;
    width: 44px;
    height: 44px;
    background: transparent;
    border: none;
    font-size: 1.5rem;
    cursor: pointer;
    color: var(--ink);
}
.drop-search-overlay__listbox {
    margin-top: 1rem;
}

/* ── Results page (/, ?s=) ───────────────────────────────────────────── */
.drop-search-page__form {
    display: flex;
    gap: 0.5rem;
    max-width: 32rem;
}
.drop-search-page__form input[type="search"] {
    flex: 1 1 auto;
    height: 44px;
    padding-inline: 12px;
    border: 1px solid var(--wp--preset--color--divider);
    font-family: var(--font-display); /* was --font-body (Source Serif) -
       found in the same serif-drift sweep, not one of the two spots the
       brief named but the identical mistake on the /?s= results page's
       own search box. */
    font-size: 1rem;
    color: var(--ink);
}
.drop-search-page__form button {
    flex: 0 0 auto;
}
/* Result-count line, 30 Aug (Round Three review) - Archivo (UI copy,
   not running prose - same distinction the sitewide typography system
   already draws), muted, listing size (0.875rem - the same small-UI
   value already used for status/fine-print micro-copy elsewhere in
   this file, not a new scale). `aria-live="polite"` so a type-filter
   tab change (search.js re-fetches, no page reload) announces the new
   count - this is a SEPARATE element from `#drop-search-status`
   (screen-reader-only, a different job); this one is always visible.
   Empty and collapses to nothing on zero results (see the render_block
   filter in plugins/drop-blocks.php) - the zero-results block already
   has its own copy, this doesn't double up on it. */
.drop-search-page__count {
    font-family: var(--font-display);
    font-size: 0.875rem;
    color: var(--ink-muted);
    margin-block: 0.5rem 0;
}
.drop-search-page__type-filter {
    display: flex;
    gap: 0.5rem;
    margin-block: 1rem;
}
.drop-search-page__type-filter a {
    padding: 0.5rem 1rem;
    min-height: 44px;
    display: inline-flex;
    align-items: center;
    border: 1px solid var(--wp--preset--color--divider);
    color: var(--ink);
    text-decoration: none;
    font-family: var(--font-display);
    font-weight: 500;
}
.drop-search-page__type-filter a[aria-selected="true"] {
    background: var(--brand-navy);
    border-color: var(--brand-navy);
    color: var(--wp--preset--color--white);
}
.drop-search-page__results {
    display: flex;
    flex-direction: column;
    gap: var(--drop-column-gap);
}
.drop-search-result {
    display: flex;
    gap: 1.25rem;
}
.drop-search-result__media {
    flex: 0 0 auto;
    width: 180px;
}
.drop-search-result__media img {
    width: 100%;
    height: auto;
    aspect-ratio: 16 / 9;
    object-fit: cover;
}
.drop-search-result__meta {
    display: flex;
    align-items: center;
    gap: 0.5rem;
}
.drop-search-result__eyebrow {
    font: 700 11.5px/1.3 var(--font-stamp);
    letter-spacing: 0.15em;
    text-transform: uppercase;
    color: var(--brand-red);
}
.drop-search-result__partner-chip {
    font: 700 11.5px/1.3 var(--font-stamp);
    letter-spacing: 0.15em;
    text-transform: uppercase;
    color: var(--ink-muted);
}
.drop-search-result__title a {
    color: var(--ink-heading);
    text-decoration: none;
}
.drop-search-result__title a:hover {
    text-decoration: underline;
}
.drop-search-result__date {
    font-family: var(--font-stamp); /* was unset - found in the serif-
       drift sweep (article-refinements pass, 2026-08-28 later still); a
       plain <p>, not a heading (confirmed against plugins/drop-blocks.php
       - unlike .drop-search-result__title, an <h3> that theme.json's own
       element style already keeps on the display face), so it genuinely
       inherited the sitewide serif with nothing overriding it. Stamp
       face, matching this site's existing convention for dates. */
    font-size: 0.8rem; /* 12.8px - already >= the brief's 11px floor, left
        as-is */
    font-weight: 700; /* added 30 Aug (Round Three review, one-date-voice
        pass) - matches .wp-block-post-date's shared weight; this date's
        own PHP format was already correct ('j M Y'), only the stamp
        CASE/TRACKING treatment was missing. */
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--ink-muted);
}
.drop-search-result__excerpt strong {
    color: var(--ink-heading);
}
/* Measure cap (body-copy standard, 2026-08-28 later still) - no size or
   measure rule existed on the excerpt itself before this; it inherited
   the correct 16px/1.6 sitewide base already, but stretched to fill
   whatever was left of the row after the 180px thumbnail (164 cpl on a
   1310px row with no thumbnail, 139 on a 1110px remainder with one).
   Capped the EXCERPT directly, not the row (`.drop-search-result`,
   flex, above) - considered constraining the row instead, since a
   1310px row holding a thumbnail and two lines of text is arguably a
   layout problem more than a type one, but a row-width change reshapes
   the thumbnail/gap math too and this pass is scoped to measure, not a
   result-card redesign. A flex item with its own `max-width` simply
   stops growing at that width inside the row (the row's own layout is
   untouched), matching the same "cap the prose element, not its
   container" pattern used everywhere else in this pass. */
.drop-search-result__excerpt {
    max-width: var(--measure);
}
.drop-search-page__zero {
    padding-block: 2rem;
}
@media (max-width: 600px) {
    .drop-search-result { flex-direction: column; }
    .drop-search-result__media { width: 100%; }
}
/* .wp-block-heading.site-header__newsletter-title and the matching
   .site-header__newsletter-inline gap-zeroing rule REMOVED 2026-08-28
   (newsletter rebuild) - both styled the old header form's own title/
   wrapper, which no longer exist (see the header rewrite above). The
   new drop-newsletter component owns its own heading styling directly
   (.drop-newsletter__title, search this file) rather than via a
   shared header-specific class.

   Row 2 (the separate red tagline/industry-tags band) REMOVED 2026-08-28
   (Option A logo rework) - its content lives inside the navy brand band
   above now (.site-header__strap-line/.site-header__strap-venues), per
   Daniel's explicit confirmation. The nav row below and the footer
   still read the same §3.3 content-size variable for their gutter. */

/* Row 3: primary nav band. Navy, not grey (nav-row navy pass, 2026-08-28
   later same day) - the old #EEEEEE (--divider) made the header read as
   two stacked objects instead of one masthead, and --divider is a pure
   neutral with no relationship to the navy band above it.
   RED WAS CONSIDERED AND REJECTED for this row - recorded here so it
   isn't revisited: it out-shouts the masthead (nav becomes the loudest
   thing on the page when it's a service, not a headline), the white
   search field glares against it, and it spends the one colour that
   currently makes the airmail ribbon and the category eyebrows mean
   something. --brand-navy-deep (#35495c) is a half-step below
   --brand-navy (#3f586e) instead - enough to read as a distinct row
   (see the informal 1.25:1 delta measured between the two - a real,
   visible step, just not a hue change), not enough to split the header
   into two blocks. */
.site-header__row {
    background-color: var(--brand-navy-deep);
    /* Hairline seam against the band above (also §1.6 "also check" item) -
       --brand-navy and --brand-navy-deep are only 1.25:1 apart, a real but
       modest step; unscrolled that's next to a much bigger colour cue (the
       masthead is 118px of navy plus bird/wordmark art), but scrolled the
       masthead shrinks to a plain 79px navy strip with nothing else to read
       against, and two adjacent near-navy fills with no seam risked reading
       as one merged block rather than "masthead + nav". A low-opacity white
       line is cheap insurance in both states rather than something only
       switched on for .is-scrolled - judgement call, not measured against a
       specific fail threshold the way the text/icon colours above are;
       worth Daniel's eyes live. */
    border-top: 1px solid rgba(255, 255, 255, 0.08);
    padding-inline: max(1.5rem, calc((100vw - var(--wp--style--global--content-size, 1310px)) / 2));
    /* padding-inline is left alone (nav-row tighten pass, 2026-08-28 later
       same day) - it aligns the nav to the content grid; changing it knocks
       the nav out of line with the columns below. */
    padding-block: 0; /* was 0.75rem (12px top+bottom) */
    height: 60px; /* was 68px total (0.75rem padding-block + content) - the
       masthead is now 118px, so a nav strip at its old height read as the
       masthead's peer instead of clearly subordinate to it. 60px leaves
       8px of clearance around the 44px search/CTA controls; don't go
       below 56px, the CTA's hard edges start to feel crowded there. */
    width: 100%;
}
/* Row collapsed below the hamburger breakpoint (2026-09-16, Daniel's
   request) - both this row's visible children are gone below 1199px now
   (the nav itself renders as the off-canvas drawer, not a horizontal
   bar; `.site-header__right-cluster` is hidden outright, see that rule),
   and the hamburger toggle that used to live here is repositioned
   absolute against `.site-header` as a whole (see that rule) - so
   there's nothing left to reserve 60px of navy strip for. `height:0` +
   zeroed border/padding, NOT `display:none` - the toggle button is a
   real DOM descendant of this row, moved out of flow via
   `position:absolute`, and `display:none` on an ancestor would hide an
   absolutely-positioned descendant too (unlike zero height, which
   doesn't). */
@media (max-width: 1199px) {
    .site-header__row {
        height: 0;
        min-height: 0;
        padding-block: 0;
        border-top: none;
        overflow: visible;
    }
}
/* Full-height nav hit targets (nav-row tighten pass, 2026-08-28 later same
   day) - "Latest News" measured an 89x26 clickable box inside the old
   68px row: ~42px of the visible bar looked clickable and wasn't (WCAG
   2.5.5). Stretching the nav container + each TOP-LEVEL item's link/
   toggle to the row's full height makes the whole bar the target,
   whatever height it ends up at.
   `.wp-block-navigation-item__content` (not a bare `a`) - WP core renders
   both plain links AND the "Library"/"IGT Connects" submenu TOGGLE
   BUTTONS with this same class (see the hover/current-page rule below,
   which hit this same fact); a bare `a` selector would miss the two
   toggle buttons and leave them at the old cramped hit box.
   Scoped to `> .wp-block-navigation-item >` (direct children of the
   top-level container only) - the same class also appears on every
   submenu link inside `.wp-block-navigation__submenu-container` (the
   Library/IGT Connects flyouts), which must NOT stretch to "100% of the
   row" - that 100% would resolve against the dropdown panel's own height
   and blow every submenu row up to the whole panel's size. */
.site-header__row .site-nav-primary {
    align-self: stretch; /* the row is `align-items:center` by default (block
       layout attribute) - without this the nav wrapper itself stays at
       its own intrinsic height and the 100% below has nothing real to
       resolve against. */
}
/* Verified live (not just reasoned from the CSS) that the 100%/stretch
   chain above alone doesn't reach the actual link boxes: between
   `.site-nav-primary` and the `<ul class="wp-block-navigation__container">`
   WP interposes FOUR plain wrapper divs for the desktop/mobile overlay
   switcher - `.wp-block-navigation__responsive-container` (this
   project's own §4.6 desktop override forces it to `display:block`),
   `.wp-block-navigation__responsive-close` (the mobile scrim - inert at
   desktop), `.wp-block-navigation__responsive-dialog` (the mobile
   drawer - also inert at desktop) and
   `.wp-block-navigation__responsive-container-content` - and every one
   of them sits at its own auto/content height by default, so a `100%`
   declared only on the outermost or innermost link in that chain has
   nothing resolved to inherit from. Each one needs an explicit
   height:100% for the chain to actually reach the UL; confirmed via a
   real getBoundingClientRect walk up the parent chain, not assumed from
   the class names alone. Safe at the <1024px hamburger breakpoint too -
   the mobile drawer's own `!important` rules (§4.6, scoped to
   `max-width:1023px`) override every one of these on specificity/
   `!important` when the drawer is actually in its mobile role. */
.site-header__row .wp-block-navigation__responsive-container,
.site-header__row .wp-block-navigation__responsive-close,
.site-header__row .wp-block-navigation__responsive-dialog,
.site-header__row .wp-block-navigation__responsive-container-content {
    height: 100%;
}
.site-header__row .wp-block-navigation__container {
    height: 100%;
    align-items: stretch; /* WP core defaults this to `center`; overridden so
       each top-level <li> stretches to the container's (now full-row)
       height instead of sizing to its own link content. */
}
.site-header__row .wp-block-navigation__container > .wp-block-navigation-item > .wp-block-navigation-item__content {
    display: flex;
    align-items: center;
    height: 100%;
}
/* Nav-row link colour - REWRITTEN 30 Aug (tablet/mobile round, item 1),
   REPLACING the `@media (min-width: 1024px)` version this comment used
   to describe. That gate was reasoned from viewport width standing in
   for "is this the navy bar or the white drawer" - which broke the
   moment the bar started staying horizontal past 1024px (§2, this same
   pass): between (new) 768px and 1023px the bar is still navy, still
   horizontal, but this colour dropped out because the media query never
   matched there, and the UNGATED ink-heading rule further down this file
   (`.site-nav-primary .wp-block-navigation-item__content.wp-block-
   navigation-item__content`) painted these links #2B3E51 on #35495c -
   ~1.5:1, effectively invisible except the red current-page state.
   Confirmed live at 900px/768px before writing this fix.
   Fix binds colour to the REAL surface (is the drawer actually open),
   never to viewport width - the light/white rules below are now the
   permanent default (this selector's own (0,4,0) already wins over the
   ink rule's (0,3,0) regardless of width), and a second, higher-
   specificity block further down (search ".is-menu-open nav-colour
   override" in this file) restores ink/red ONLY when `.is-menu-open` is
   actually present - i.e. only when this markup is genuinely the open
   white-background drawer, whatever the viewport happens to be. Same
   principle applied to the current-page/focus/ancestor-colour trio
   below (was ALSO `@media (min-width:1024px)`-gated for the identical
   reason, same fix). */
.site-header__row .wp-block-navigation__container > .wp-block-navigation-item > .wp-block-navigation-item__content {
    color: #E7EEF4; /* audit-allow-hex: 7.94:1 on #35495c (measured, not
       eyeballed) - a cool off-white rather than pure white so the resting
       state reads slightly recessed against the hover/current states
       below, which both go to true white. */
}
.site-header__row .wp-block-navigation__container > .wp-block-navigation-item > .wp-block-navigation-item__content:hover {
    color: var(--wp--preset--color--white); /* 9.30:1 on #35495c */
}
/* Submenu chevrons and the search icon both confirmed LIVE (not assumed
   from the class names) to inherit `currentColor` - the chevron is a
   separate `<button class="wp-block-navigation__submenu-icon">` sibling
   of the link (not part of `.wp-block-navigation-item__content`), its
   `<svg fill="none">`/`<path>` carry no hardcoded stroke at all, and
   `getComputedStyle` confirmed `stroke` tracks the button's own `color`
   exactly (both read the same computed rgb before this change); the
   search icon is `stroke="currentColor"` explicitly in header.html.
   Both lifted to the same #A6BCCD tint used for the search placeholder/
   icon below (4.74:1 on #35495c) rather than left at the old dark
   ink colour, which was nowhere near visible here. Restored to ink in
   the `.is-menu-open`-scoped block below when the drawer is genuinely
   open - same surface-not-viewport rule as the link colour above. */
.site-header__row .wp-block-navigation__submenu-icon {
    color: #A6BCCD; /* audit-allow-hex: see --font-stamp block above for the
       account convention this follows; 4.74:1 on #35495c, matches the
       search icon/placeholder tint below so the row reads as one system */
}
/* Surface override - drawer genuinely open. Higher specificity than
   every rule above (one more class, `.is-menu-open`, prepended) so it
   wins outright whenever the real ancestor class is present, at any
   width - never gated on a breakpoint. */
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container > .wp-block-navigation-item > .wp-block-navigation-item__content {
    color: var(--wp--preset--color--ink-heading);
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container > .wp-block-navigation-item > .wp-block-navigation-item__content:hover {
    color: var(--wp--preset--color--brand-red);
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-icon {
    color: var(--wp--preset--color--ink-heading);
}
/* Focus ring - do NOT skip this. Brand red (#c8151b, the sitewide
   :focus-visible colour - see ~line 698 and the Part 24 duplicate at the
   end of this file) measures 1.58:1 on #35495c - effectively invisible,
   which would silently take the focus indicator away from every
   keyboard user across the whole nav bar.
   Deliberately NOT a blanket `.site-header__row :focus-visible` (that
   was the first version tried, and is wrong): the mobile drawer's nav
   links live inside `.site-header__row` in the DOM at every breakpoint
   (WP repositions the SAME markup full-screen via `position:fixed`
   rather than duplicating it - see the media-query comment above), and
   that drawer's own background computes plain white - a white focus
   ring there would be just as invisible as the red one is on navy.
   Named explicitly instead: the search input/trigger, the CTA button,
   and the hamburger toggle itself never leave the navy row at ANY
   width, so they're safe to cover unconditionally here. The nav
   LINK'S own focus-visible rule is a separate, desktop-only override
   further down this file, right next to its base rule (same
   specificity, needs to win on source order - see the comment there).
   Everywhere outside this row keeps the sitewide red ring untouched. */
.site-header__row .drop-header-search :focus-visible,
.site-header__row .site-header__newsletter-btn:focus-visible,
.site-header__row .wp-block-navigation__responsive-container-open:focus-visible {
    outline-color: var(--wp--preset--color--white); /* 9.30:1 on #35495c */
}

/* Same fix, the desktop search panel's own case (2026-09-16, found by
   the background audit task flagged after the input padding/background/
   font reparenting bug earlier this session) - `.drop-header-search__
   form` gets reparented into `.drop-search-panel` on open (assets/js/
   search.js), which sits OUTSIDE `.site-header__row` (a sibling in
   header.html, not a descendant) - so the rule above, scoped to
   `.site-header__row .drop-header-search`, stops matching the instant
   the form moves in here, same root cause as the two prior reparenting
   bugs this session. `.drop-search-panel` is the same `--brand-navy-
   deep` (#35495c) fill the row itself uses, so the identical white
   fixes it identically. */
.drop-search-panel :focus-visible {
    outline-color: var(--wp--preset--color--white); /* 9.30:1 on #35495c, same panel navy as the row */
}

/* Narrow viewports (2026-08-28, Option A logo rework - the media query
   this replaced dated back to an even earlier "full-height stretch"
   logo model, already dead before today's rebuild and referencing
   properties that no longer exist). Same breakpoint the header search
   already collapses to icon-only at (1023px, this file's established
   hamburger threshold) - the strap text and decorative postmark are
   secondary content, dropped here so the primary bird+wordmark lockup
   keeps its full size instead of being squeezed by content competing
   for the same band (90px at the time this rule was written; 118px
   after the masthead-height pass, 2026-08-28 later same day - the rule
   itself needs no change, the band's real height is read off the live
   CSS above, not restated here).
   BIRD/WORDMARK NOW SCALED HERE TOO, 30 Aug (Round Three review) -
   REVERSES the "keeps its full size" decision two paragraphs up, on
   purpose, not a regression of it: that comment's own reasoning (don't
   let secondary content squeeze the lockup) is still correct and still
   why strap/postmark stay hidden here, but "full size" turned out to
   mean the bird/wordmark PNGs never got their own mobile treatment at
   all - confirmed live at 390px, both were still rendering at their
   full 112px/96px DESKTOP heights inside this 118px mobile band,
   correct per the band height alone but the wrong scale for a phone
   column regardless. Using THIS breakpoint (1023px), not a new one,
   per the brief's own instruction to align with the existing collapse
   point rather than invent a second - this also means the shrink
   applies down through tablet widths (700-1023px), which is correct,
   not a side effect to guard against: that whole range already runs
   the 118px mobile band and hamburger nav today, so it was already
   "mobile mode" in every other respect before this pass. */
/* Breakpoint widened 1023px -> 1199px, 2026-09-16 - matches this file's
   new unified hamburger breakpoint (was 1024px, now 1200px). */
@media (max-width: 1199px) {
    .site-header__strap,
    .site-header__postmark {
        display: none;
    }
    .site-header__brand {
        justify-content: flex-start;
        height: 118px; /* masthead-prominence pass, 2026-08-28 later still -
           holds the band at its PREVIOUS value below the hamburger
           breakpoint. Without this, mobile would silently inherit the new
           140px desktop height for a bird+wordmark lockup alone (the strap/
           postmark that used to help fill a taller band are both already
           hidden here) - not a mobile redesign, just stops mobile
           regressing alongside the desktop change. */
    }
    /* Bird/wordmark left-anchored via `.site-header__brand`'s own
       `padding-inline` (shared with the nav row's inset, confirmed live
       both measure the same 24px) - no separate left-inset rule needed,
       this was already true before this pass and stays true after it;
       "the bird must not touch the screen edge" was already satisfied
       structurally, only the SIZE was wrong. Still far under the HARD
       CEILING (2.0x of the 320px-native bird / 273px-native wordmark
       source files) at these smaller sizes - nowhere close to the
       ceiling math the base rule's own comment documents, no need to
       re-derive it here. */
    .brand-lockup__bird {
        height: 80px; /* was 112px (desktop value, unscaled) */
    }
    .brand-lockup__word {
        height: 74px; /* 2026-10-14 new logo: was 68px (80 * 104/112 = 74). Older: was 96px (desktop value, unscaled) - the +5px
           optical-centring nudge (`top`, on the base `.brand-lockup__word`
           rule) is a proportion of the source PNG's own ink distribution,
           not a fixed pixel value, so it doesn't need a separate mobile
           override here: `top` is set in `em`-relative or scales with
           this element's own font-context in the base rule - confirmed
           live it still reads centred at 68px, not re-measured from
           scratch as a new ratio. */
    }
    .site-header.is-scrolled .brand-lockup__bird {
        height: 54px; /* Collapsed mobile state, scaled proportionally
           from the NEW 80px mobile base using this element's own
           existing collapse ratio (76/112 = 67.86%, the desktop
           collapse's own derivation) - 80 * 0.6786 = 54.3, rounded. NOT
           the desktop collapsed value (76px) reused as-is - a 76px bird
           in a 79px collapsed mobile band (see `.site-header.is-scrolled
           .site-header__brand`, unscoped, already correct for mobile
           unchanged) would leave almost no clearance. */
    }
    .site-header.is-scrolled .brand-lockup__word {
        height: 46px; /* 2026-10-14 new logo: was 32px (54 * 0.86). Older: Same technique as the bird above, this element's
           OWN collapse ratio (45/96 = 46.875%, deliberately different
           from the bird's ratio - the two never scaled together on
           desktop either), applied to the new 68px mobile base:
           68 * 0.46875 = 31.875, rounded. */
    }
}
/* Hit-area fix, 30 Aug (Round Three review) - the hamburger toggle's
   glyph is a correctly-sized 24x24 icon, but that was ALSO its entire
   clickable area (0 padding) - a real Part 24 target-size failure, not
   a visual one. `padding: 10px` grows the box to 44x44 (24 + 10 + 10);
   `margin: -10px` on all four sides keeps that bigger box centred
   exactly where the old 24x24 one sat, so neither the glyph's own
   position nor any sibling in `.site-header__row` shifts - the row's
   `align-items:center`/60px height already comfortably fits a 44px
   box with no other adjustment needed (confirmed live, not assumed).
   The header search trigger (`.drop-header-search__trigger`, this file)
   was checked the same pass and is ALREADY a real 44x44 target - no
   change needed there. */
.wp-block-navigation__responsive-container-open {
    padding: 10px;
    margin: -10px;
}
/* Hamburger toggle moved to the masthead's top-right corner (2026-09-16,
   Daniel's request: "standard position") - was sitting inline in
   `.site-header__row`, on the left (the collapsed right-cluster sat on
   the right of the same row). WP renders this button as part of the
   Navigation block's own generated markup, so it can't be relocated in
   header.html's source - repositioned visually instead, meant to
   resolve against `.site-header` (this file's established positioning
   context, position:fixed).
   REAL BLOCKER, found live (not assumed): WP core's own `<nav
   class="wp-block-navigation">` element ships `position: relative` by
   default - a CLOSER positioned ancestor than `.site-header`, so the
   button's `position:absolute` resolved against that tiny nav box
   instead (confirmed via `offsetParent`: the nav had collapsed to a
   literal 0x0 rect once its closed-state container went `display:none`
   below this breakpoint, putting the "repositioned" button off-screen
   to the left). Fixed by resetting the nav to `position:static` WITHIN
   this same breakpoint only - safe here because the only reason a nav
   needs its own positioning context is the desktop hover-flyout submenu
   system (§4.6/§4.6a), which doesn't apply below the hamburger
   breakpoint anyway (submenus render as a flattened list inside the
   drawer, not an absolutely-positioned panel) - so removing it here
   doesn't touch the desktop-only behaviour it exists for.
   The padding:10px/margin:-10px hit-area trick immediately above
   cancels out for positioning purposes (equal and opposite), so the
   glyph lands exactly at the offsets below regardless of that trick.
   Right offset matches the SAME gutter formula `.site-header__brand`'s
   own padding-inline already uses, so the toggle's right edge lines up
   with the CTA button's own right edge at desktop widths - one shared
   gutter value, not a second one invented for this element. Vertical
   centring is against `.site-header` as a whole (brand band + the now-
   collapsed row together), not just the brand band alone - correct
   because the row collapses to ~0 real height at this breakpoint (see
   `.site-header__row`'s own override further down), so the header's
   total box height is effectively just the brand band's. */
@media (max-width: 1199px) {
    .site-header__row .wp-block-navigation.site-nav-primary {
        position: static;
    }
    .wp-block-navigation__responsive-container-open {
        position: absolute;
        top: 50%;
        right: max(1.5rem, calc(50vw - 655px));
        transform: translateY(-50%);
        z-index: 110;
        color: var(--wp--preset--color--white); /* Daniel's request,
            2026-09-16 - the glyph's inherited colour read too dark
            against the masthead's navy once moved here (this button's
            SVG icon has no hardcoded stroke, so it tracks `color` via
            currentColor - confirmed the same pattern as the search
            icon/submenu chevrons elsewhere in this file). */
    }
}

/* ══ Drawer rebuilt to WORDPRESS-FSE-BUILD-STANDARDS.md §4.6's real
   pattern, 2026-09-16 (Daniel's explicit request, after asking to check
   the earlier close-X/hamburger mismatch against the standard) - a real
   320px slide-in panel from the right, replacing WP core's unstyled
   full-viewport white takeover this project had relied on since the
   30 Aug "mobile drawer quality pass" (that pass's own comment called
   this "an existing, already-accepted deviation" - superseded now by
   Daniel's direct instruction to actually build it).
   Background kept WHITE (not the standard's own `--wp--preset--color--
   primary` placeholder) deliberately - this project has an extensive,
   already-working colour system tuned for a white open-drawer surface
   (ink-heading/brand-red nav-item colours, the submenu-accordion
   toggle's ink-heading icon, the CTA slot's white sticky footer - all
   untouched below, all still correct against white). Rebuilding the
   GEOMETRY (a real 320px panel, proper scrim, close-X inside the
   dialog) without also redoing every colour decision that already works
   is the same "don't simplify away parts that work" principle this
   account's own house standards apply elsewhere.
   No `--header-height` CSS variable exists on this project (checked
   live - `getPropertyValue('--header-height')` returns empty), so the
   standard's own `var(--header-height, 80px)` is replaced with this
   project's own established two-state pattern instead
   (`.site-header__brand`'s real 140px/79px `.is-scrolled` values) -
   the same substitution already used for the masthead/footer-lockup
   sizing elsewhere in this file, not a new mechanism invented here. */
@media (max-width: 1199px) {
    /* Scrim - WP wires `.wp-block-navigation__responsive-close` as the
       click-to-close target already (confirmed live before this pass -
       hamburger/Escape/X/scrim all just toggle `.is-menu-open`); this
       only supplies the missing visual (a dark backdrop dimming the
       page behind the panel), same tint this file's own desktop search-
       panel scrim already uses rather than inventing a second one.
       `margin: 0` is NOT redundant - found live, this element inherits a
       24px left/right margin from somewhere in the cascade (this
       project's own gutter value, coincidentally - not chased to its
       exact source), which `inset:0` alone doesn't cancel (inset sets
       the offsets the margin box is measured FROM, not the margin
       itself) - without this, the scrim rendered ~327px wide inset 24px
       each side instead of covering the true full viewport. */
    .site-header__row .wp-block-navigation__responsive-close {
        position: fixed !important;
        inset: 0 !important;
        width: 100vw !important; /* found live - WP core's own default CSS
            sets an explicit width on this element (~327px of a 375px
            viewport, not a round number - never fully traced to its
            exact source rule), which wins over `inset:0`'s own left/
            right auto-stretch since `inset` is shorthand for the four
            offsets only, never `width`. Forcing it here is the only way
            to actually cover the full viewport, `margin:0` alone wasn't
            enough (confirmed live, in that order, before finding this). */
        max-width: none !important; /* the SAME WP default also sets a
            max-width at that same ~327px value, which silently capped
            the `width:100vw` line above on its own - found live via
            getComputedStyle AFTER the width fix still measured 327px,
            not assumed from the first fix alone. */
        height: 100vh !important;
        margin: 0 !important;
        background: rgba(34, 48, 60, 0.5) !important;
        z-index: 9998 !important;
    }
    /* Container -> transparent full-viewport wrapper. `animation:none`
       is the important line here, not decoration: WP applies its OWN
       open-animation to this element by default, and that animation is
       exactly what left a stray `transform: matrix(1,0,0,1,0,8)` on it
       (confirmed live, previous pass) - which, per spec, makes ANY
       transformed element a containing block for its own fixed/absolute
       descendants, silently breaking every attempt to position the
       close-X against the true viewport. Killing WP's container
       animation removes that transform entirely; the DIALOG below owns
       the only visible slide animation now, which is also the correct
       place for it per the standard (the panel slides, not the whole
       screen). */
    body .site-header__row .wp-block-navigation__responsive-container.is-menu-open {
        position: fixed !important;
        inset: 0 !important;
        width: 100% !important;
        height: 100% !important;
        background: none !important;
        z-index: 9998 !important;
        box-shadow: none !important;
        padding: 0 !important;
        animation: none !important;
        overflow: visible !important;
    }
    /* Drawer - the actual 320px panel. */
    .site-header__row .wp-block-navigation__responsive-dialog {
        position: fixed !important;
        top: 0 !important;
        right: 0 !important;
        bottom: 0 !important;
        left: auto !important;
        width: 320px !important;
        max-width: 85vw !important;
        height: 100dvh !important;
        background: var(--wp--preset--color--white) !important;
        z-index: 9999 !important;
        overflow-y: auto !important;
        padding: 140px 2rem 2rem !important; /* top = unscrolled masthead height */
        box-shadow: -4px 0 24px rgba(0, 0, 0, 0.25) !important;
        animation: drop-drawer-in 0.25s ease-out !important;
        display: flex !important;
        flex-direction: column !important;
    }
    .site-header.is-scrolled .wp-block-navigation__responsive-dialog {
        padding-top: 79px !important; /* matches .site-header.is-scrolled .site-header__brand */
    }
    @keyframes drop-drawer-in {
        from { transform: translateX(100%); }
        to { transform: translateX(0); }
    }

    /* Close X - position:ABSOLUTE inside the dialog (NOT fixed, and NOT
       the previous pass's viewport-fixed hack with an empirically-
       calibrated offset - that whole compensation is gone, because the
       problem it compensated for (the container's stray transform) no
       longer exists once the container's own animation is killed above).
       Absolute against the dialog means the X slides WITH the panel
       during the open/close animation, per the standard's own explicit
       reasoning for this exact choice. Sized/positioned so its glyph
       lands in the SAME spot the hamburger occupies when closed (top:0/
       right:0 of a box exactly as tall as the masthead, glyph centred
       inside via flex) - not a coincidence to maintain by hand, the
       hamburger uses the identical height values for the identical
       reason (see that rule above). ink-heading, not white - this
       drawer is white, not navy, so the glyph needs a colour that's
       actually visible against it (the previous pass's white-on-white
       mistake was never caught visually - fixed here). */
    .site-header__row .wp-block-navigation__responsive-container-close {
        position: absolute !important;
        top: 0 !important;
        right: 0 !important;
        bottom: auto !important;
        left: auto !important;
        width: 4rem !important;
        height: 140px !important;
        margin: 0 !important;
        padding: 0 !important;
        display: flex !important;
        align-items: center !important;
        justify-content: center !important;
        z-index: 1 !important;
        background: transparent !important;
        border: 0 !important;
        cursor: pointer !important;
        color: var(--wp--preset--color--ink-heading) !important;
    }
    .site-header.is-scrolled .wp-block-navigation__responsive-container-close {
        height: 79px !important;
    }

    /* Force the open menu UL back into flow (§4.6's own documented
       incident - some WP versions render it `position:absolute; left:
       -24px` inside the drawer) and stack it as a real vertical list -
       harmless where not needed, included per the standard regardless
       of whether this exact WP version needs it. */
    .site-header__row .is-menu-open .wp-block-navigation__container {
        position: static !important;
        flex-direction: column !important;
        align-items: stretch !important;
        width: 100% !important;
        gap: 0 !important;
        margin: 0 !important;
        padding: 0 !important;
        list-style: none;
    }
    .site-header__row .is-menu-open .wp-block-navigation-item {
        width: 100% !important;
    }
}

/* Scroll lock - global (safe: .is-menu-open only exists when open).
   A real, previously-missing gap: nothing on this project locked body
   scroll while the drawer was open (confirmed live - only the DESKTOP
   search panel had its own JS-driven scroll lock; the mobile drawer had
   none at all), so a tall page let the page scroll underneath the open
   panel. `:has()` already used elsewhere in this file
   (`.drop-company-directory__body:has(...)`), same browser-support
   assumption, no new dependency. */
body:has(.wp-block-navigation__responsive-container.is-menu-open) {
    overflow: hidden;
}

/* Drawer breakpoint - forced, 30 Aug (tablet/mobile round, item 2).
   Before this rule there was NO fixed CSS breakpoint governing hamburger
   vs horizontal bar at all - see the `.drop-nav-columns` comment just
   below, written before this pass: the switch was entirely WP's own
   content-overflow-measured Interactivity API behaviour, empirically
   showing the hamburger only below ~480-550px and letting the bar wrap
   to two lines (65px tall, measured live at 600px) anywhere it didn't
   quite fit above that. Per the brief: force a real, deterministic
   breakpoint instead.

   UNIFIED TO 1200px, 2026-09-16 (Daniel's request) - was 768px here,
   deliberately DIFFERENT from the search/CTA cluster's own 1024px
   breakpoint, on the reasoning that 768-1023px was a real "bar stays
   horizontal, search+CTA already icon/compact" tier the old brief
   wanted. That tier is gone now: Daniel asked for the hamburger to
   trigger as early as 1200px, AND for the collapsed search-icon/CTA bar
   to disappear entirely rather than staying as a compact row - so
   there's no longer a reason for two different numbers. Every other
   breakpoint in this file that used to reference 768px/1024px for this
   same "is this mobile-header mode" question (search-cluster hide,
   desktop search-panel hide, masthead strap/postmark/bird/wordmark
   sizing, the footer lockup that mirrors it, the Library submenu's
   desktop grid-columns) now reads 1199px/1200px too - one number, one
   owner, same principle as this file's own spacing-tripwire discipline
   applied to breakpoints instead of spacing.
   `!important` on both sides, same as the account's standard §4.6
   pattern - WP's own JS also toggles inline classes/attributes on this
   same element based on its own overflow measurement, and this rule
   needs to win outright regardless of what that measurement concluded. */
@media (max-width: 959px) {
    .wp-block-navigation__responsive-container-open { display: flex !important; }
    .wp-block-navigation__responsive-container:not(.is-menu-open) { display: none !important; }
}
/* 2026-10-23 (Daniel): tablet range 960-1199px - the menu now sits INLINE
   in the navy masthead band (no search, no CTA - the right cluster stays
   hidden below 1200 as before) and the hamburger only takes over below
   960px. Measured live at 1024px: the six items need ~612px beside the
   ~233px lockup, leaving ~116px clear; 960 is the floor where a
   comfortable gap remains (at 900 it is ~7px).
   The <=1199 drawer rules above style the container/scrim/dialog as an
   off-canvas panel even while closed, so each is neutralised here with a
   :not(.is-menu-open) selector (0,5,0 beats their (0,2,0) !importants);
   the open state is unreachable in this range (toggle hidden) but the JS
   auto-closes it on resize anyway (site.js). The container is positioned
   against .site-header (nav is position:static <=1199), top:0/bottom:0 =
   the band's height in both the 118px and scrolled 79px states, so the
   submenu flyouts drop from the band's bottom edge exactly as the
   desktop row's do. */
@media (min-width: 960px) and (max-width: 1199px) {
    .wp-block-navigation__responsive-container-open { display: none !important; }
    .site-header__row .wp-block-navigation__responsive-container:not(.is-menu-open) {
        display: block !important;
        position: absolute !important;
        top: 0;
        bottom: 0;
        right: max(1.5rem, calc(50vw - 655px));
        left: auto;
        width: auto !important;
        height: auto !important;
        background: none !important;
        animation: none !important;
        transform: none !important;
        padding: 0 !important;
        overflow: visible !important;
    }
    .site-header__row .wp-block-navigation__responsive-container:not(.is-menu-open) .wp-block-navigation__responsive-close {
        position: static !important;
        inset: auto !important;
        width: auto !important;
        max-width: none !important;
        height: 100% !important;
        margin: 0 !important;
        background: none !important;
        z-index: auto !important;
    }
    .site-header__row .wp-block-navigation__responsive-container:not(.is-menu-open) .wp-block-navigation__responsive-dialog {
        position: static !important;
        width: auto !important;
        max-width: none !important;
        height: 100% !important;
        background: none !important;
        box-shadow: none !important;
        padding: 0 !important;
        animation: none !important;
        display: block !important;
        overflow: visible !important;
    }
    .site-header__row .wp-block-navigation__responsive-container:not(.is-menu-open) .wp-block-navigation__responsive-container-close {
        display: none !important;
    }
    .site-header__row .wp-block-navigation__responsive-container:not(.is-menu-open) .wp-block-navigation__responsive-container-content {
        height: 100%;
        display: block;
    }
    /* The lockup is ~288px wide in this range, so at the 960px floor the
       default 16px/20px-gap bar (~611px) would touch it (measured: -12px
       gap); 15px type + 14px gaps (~549px) restores a ~75px clear gap.
       Above 1023px the default fits with room to spare. */
    /* `.site-header` prefix: the >=960px desktop type rule further down has the same
       specificity and comes later, so this needs one more class to win. */
    .site-header .site-header__row .wp-block-navigation__container > .wp-block-navigation-item > .wp-block-navigation-item__content {
        font-size: clamp(0.9375rem, 0.9375rem + (100vw - 960px) * 0.0156, 1rem);
    }
    .site-header .site-header__row .wp-block-navigation__container {
        gap: clamp(14px, 14px + (100vw - 960px) * 0.1, 20px);
    }
    /* The Library flyout opens from the RIGHT-hand side of the band here,
       so the desktop panel's left-anchored 2x280px grid would run off the
       viewport: anchor it to the item's right edge and use narrower
       columns (2 x 220px) instead. */
    .drop-nav-columns > .wp-block-navigation__submenu-container {
        left: auto !important;
        right: 0 !important;
        width: 440px !important; /* fixed: the item sits ~480px from the left edge at 960px wide */
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }
    .drop-nav-columns > .wp-block-navigation__submenu-container .wp-block-navigation-item__content {
        white-space: normal; /* long names ("Development and Construction") wrap instead of widening the panel */
    }
}
/* Hamburger (<960px): white, larger, three bars so it reads as the menu
   control (Daniel, 2026-10-23: "white and a bit bigger to stand out").
   The block's `icon:"menu"` attribute supplies the 3-bar glyph; the SVG
   is 24px natively, so it is scaled and given a stroke to thicken the
   hairline bars. */
@media (max-width: 959px) {
    .wp-block-navigation__responsive-container-open {
        color: var(--wp--preset--color--white);
    }
    .wp-block-navigation__responsive-container-open svg {
        width: 36px;
        height: 36px;
        fill: currentColor;
    }
    .wp-block-navigation__responsive-container-open svg path {
        stroke: currentColor;
        stroke-width: 0.6;
    }
}
@media (min-width: 1200px) {
    .wp-block-navigation__responsive-container-open { display: none !important; }
    .wp-block-navigation__responsive-container {
        display: block !important;
        position: static !important;
        background: transparent !important;
        width: auto !important;
        height: 100% !important; /* keeps the existing full-height hit-target
           chain above alive (`.site-header__row .wp-block-navigation__
           responsive-container{height:100%}`, no `!important`, (0,2,0)) -
           this rule doesn't need to beat that one on specificity (it isn't
           trying to), just restates the same value so the `!important`
           `display:block` two lines up can't be mistaken for a reset of
           the whole element's box model. */
    }
}
.site-header__row .wp-block-navigation__container { flex-wrap: nowrap; } /* never wrap above the breakpoint */

/* Nav fills the empty space before the search+CTA cluster (Daniel's
   request, 2026-09-18) - at rest the bar was 16px/500 with a 20px item
   gap, leaving a wide dead zone between "Contact Us" and the search
   field on anything wider than ~1300px. `clamp()`, not a fixed bump, so
   the increase tapers back down toward the 1200px hamburger breakpoint
   instead of pushing the bar closer to wrapping there (this file's own
   `flex-wrap:nowrap` rule above has zero tolerance for that) - confirmed
   the floor values below match the CURRENT computed 16px/20px so nothing
   regresses right at 1200px, only grows as the viewport does. Scoped to
   the same >=1200px desktop-bar range as everything else in this
   section; the mobile drawer's own sizing (§4.6) is untouched. */
@media (min-width: 960px) {
    .site-header__row .wp-block-navigation__container > .wp-block-navigation-item > .wp-block-navigation-item__content {
        font-size: clamp(1rem, 0.28vw + 0.85rem, 1.1875rem);
    }
    .site-header__row .wp-block-navigation__container {
        gap: clamp(20px, 1.94vw - 3.33px, 34px);
    }
}

/* ── "Library" nav dropdown, cascade into columns (2026-08-23) - it has
   14 children; as a single WP-core-default column it measured 200px
   wide x 661px tall, tall enough to run off the bottom of a real
   1280x900 viewport (last item landed at y=899). `.drop-nav-columns` is
   a className added directly to that one wp:navigation-submenu block in
   the wp_navigation post (127192) via wp-cli - NOT applied to "IGT
   Connects" (only 5 children, fine as-is).
   Scoped to >=700px only, ORIGINALLY - this nav's mobile/hamburger
   switch was WP's own content-overflow-measured Interactivity API
   behaviour, not a fixed CSS breakpoint, and empirically the hamburger
   was still hidden at 700px but visible at 550px - 700px was safely
   inside "real desktop dropdown" territory without guessing at the
   exact JS-measured threshold.
   BUMPED TO 768px, 30 Aug (tablet/mobile round, item 2) - a REAL fixed
   breakpoint now governs the hamburger/bar switch (see the "Drawer
   breakpoint - forced" rule above this whole component), and §4.6a's
   own rule is explicit: "Overlay breakpoint and drawer CSS breakpoint
   must match exactly." Left at 700 this grid would have applied to the
   SAME `.wp-block-navigation__submenu-container` at 700-767px - which,
   after the fix above, is now genuinely inside the mobile drawer (the
   hamburger is forced visible there), not the desktop flyout - forcing
   `display:grid !important` onto the drawer's own flattened Library
   list in that 68px band, breaking the flat stacked list the drawer
   pass (below) depends on. Below 768px the mobile drawer's own flat
   list (this whole component untouched otherwise) renders every child
   as a plain flattened item, not this absolutely-positioned flyout, so
   applying a grid here has no equivalent problem to fix on mobile
   anyway.
   Widened 2 -> 3 columns (2026-08-24, Daniel's request) - 14 children /
   3 columns = 5 rows (was 7), shorter panel, still comfortably within
   a real desktop viewport height.
   Back to 2 columns, wider (2026-08-27, Daniel's request) - goal this
   time is fitting every label on one line, not panel height. Measured
   live rather than guessing: longest label "Development and
   Construction" renders at 220px at the real submenu-link font (16px
   Lato), link padding is 8px 16px (32px horizontal overhead) = 252px
   tightest fit; 280px min leaves a real safety margin, same reasoning
   as every other measured-not-guessed threshold on this project.
   `white-space: nowrap` added as a backstop so a column that ever came
   up short would visibly clip/overflow rather than silently wrap
   (easier to spot and fix than a wrap that reads as "just how it is").
   14 children / 2 columns = 7 rows.
   2026-08-28 - nav links moved from Lato to Archivo 500 (typography/
   colour pass), which makes the "220px at 16px Lato" measurement
   stale. Not re-measured yet - the `white-space: nowrap` backstop above
   means a genuine regression here would clip/overflow visibly rather
   than fail silently; re-check "Development and Construction" live at
   >=700px after this deploy and bump 280px if it's now tight.
   Breakpoint widened 768px -> 1200px, 2026-09-16 - this grid-columns
   layout is the DESKTOP hover-flyout only; below the new unified
   hamburger breakpoint the drawer's own flattened stacked list must
   render instead (same reasoning the original 700-767px fix above
   already established for the old breakpoint gap - this just moves
   where that gap sits). */
@media (min-width: 960px) {
    .drop-nav-columns > .wp-block-navigation__submenu-container {
        display: grid !important;
        grid-template-columns: repeat(2, minmax(280px, 1fr));
        grid-auto-flow: column;
        grid-template-rows: repeat(7, auto);
        width: auto;
    }
    .drop-nav-columns > .wp-block-navigation__submenu-container .wp-block-navigation-item__content {
        white-space: nowrap;
    }
}

/* Submenu panel top offset (§4.6a hover-bridge pattern) - ORIGINALLY added
   2026-08-27 because the <li> trigger was only as tall as its own link
   content (26px), shorter than the visible grey bar (which had 0.75rem
   padding-block top+bottom the <li> didn't include), so WP's default
   `top: 100%` landed the panel 12px INSIDE the bar instead of at its
   true bottom edge - fixed then with a `+0.75rem` offset plus an
   invisible bridge pseudo-element to close the resulting hover dead
   zone (both per §4.6a: never delete the offset outright, bridge the
   gap it creates instead).
   REMOVED both the offset and the bridge (nav-row tighten pass,
   2026-08-28 later same day) - NOT by deleting a still-needed fix, but
   because its own cause no longer exists: the full-height hit-target
   change above makes each top-level <li> stretch to `.site-header__row`'s
   entire (now-padding-free) height, so the <li>'s real bounding box
   already ends exactly at the bar's true bottom edge - WP's own default
   `top: 100%` lands there with nothing left to correct and no gap left
   to bridge. Confirmed live, not assumed (per §4.6a's own "verify by
   measurement, not by eye"): trigger bottom edge and panel top edge were
   read via getBoundingClientRect and matched with 0px between them
   before this comment was written. If the row's padding or the
   full-height hit-target rule above is ever reverted, this offset+bridge
   pair needs to come back, re-derived the same way, not just restored
   as literally 0.75rem (that value was specific to the old 12px
   padding-block). Verify this reasoning live after deploy (real
   getBoundingClientRect reads on trigger vs panel, per §4.6a - a
   screenshot alone can't prove a hover-geometry claim either way)
   before trusting it beyond this session. */

/* ── Primary nav: hover/current-page/focus states (2026-08-24, Daniel's
   request) - real gap, not a design tweak: confirmed live that nav
   links had NO distinct colour at all (computed rgb(68,68,68), plain
   #444 body-copy grey) and consequently no hover feedback either.
   Cause, confirmed by walking every matching stylesheet rule live
   (not guessed): WP core's own navigation-block CSS deliberately
   DOUBLES its own class - `.wp-block-navigation-item__content.wp-
   block-navigation-item__content { color: inherit }` - specifically
   to sit at (0,3,0), one class higher than the account's usual "always
   two classes beats blockGap" fix reaches. A plain `.site-nav-primary
   .wp-block-navigation-item__content` (0,2,0) tried first and lost
   outright on specificity, not a source-order tie. Doubled the same
   class here too, matching WP core's own technique, to reach (0,3,0)
   and win the tie on source order (this stylesheet loads after WP
   core's block-library CSS, confirmed via document.styleSheets index).
   Reuses the sitewide primary/accent link/:hover pair from theme.json
   rather than inventing a third link treatment, scoped to
   .site-nav-primary only so it doesn't touch the footer nav's own
   already-correct white-on-navy treatment above. Covers submenu items
   for free (same shared class in WP core markup) and the "Library"/
   "IGT Connects" toggle buttons (also rendered with this class, not
   just <a> tags). */
.site-nav-primary .wp-block-navigation-item__content.wp-block-navigation-item__content {
    color: var(--wp--preset--color--ink-heading);
    transition: color 0.15s ease;
}
.site-nav-primary .wp-block-navigation-item__content.wp-block-navigation-item__content:hover {
    color: var(--wp--preset--color--brand-red);
}
/* Sub-menu hover underline (2026-08-27, Daniel's request) - scoped to
   items INSIDE a submenu panel only (Library's 14 categories, IGT
   Connects' 5 links), not the top-level "Library"/"IGT Connects"
   toggles themselves or the other top-level nav items - only the
   colour-change hover above applies there, same as before. No
   rest-state underline, matches the same "visible on interaction only"
   convention already used for card titles/kickers elsewhere on this
   theme. */
.site-nav-primary .wp-block-navigation__submenu-container .wp-block-navigation-item__content.wp-block-navigation-item__content:hover {
    text-decoration: underline;
}
.site-nav-primary .wp-block-navigation-item__content.wp-block-navigation-item__content:focus-visible {
    outline: 2px solid var(--wp--preset--color--brand-red);
    outline-offset: 2px;
}
/* Current-page indicator - WP core adds both the class (on the <li>)
   and aria-current="page" (on the link) for the actual current URL;
   covers a submenu child being the current page too (e.g. sitting on
   a Library category), not just a top-level item. */
.site-nav-primary .current-menu-item > .wp-block-navigation-item__content.wp-block-navigation-item__content,
.site-nav-primary .wp-block-navigation-item__content.wp-block-navigation-item__content[aria-current="page"] {
    color: var(--wp--preset--color--brand-red);
    font-weight: 700;
}
/* Ancestor indicator (2026-08-24, Daniel's request) - "Library"/"IGT
   Connects" reads as active when the current page is one of ITS
   submenu children (e.g. a Library category archive), not just when
   its own direct link is the current page. `.is-ancestor-current` is
   set by the same site.js pass that sets aria-current="page" above -
   deliberately a different class, not a second aria-current, since
   only the actual current page's own link should carry that attribute
   semantically. Colour only, no bold - keeps it visually distinct from
   "this exact page" (accent + bold) while still reading as "you're in
   this section". */
.site-nav-primary .is-ancestor-current > .wp-block-navigation-item__content.wp-block-navigation-item__content {
    color: var(--wp--preset--color--brand-red);
}

/* Nav-row navy pass, 2026-08-28 later same day - three brand-red-based
   rules just above (focus ring, current-page, ancestor-current) all
   measure ~1.58:1 on the new #35495c row background, effectively
   invisible. Every override below reuses the rule it corrects with one
   extra `.site-header__row` ancestor class prepended - that's one class
   more than the original (e.g. (0,5,0) vs (0,4,0) for the focus ring),
   so each override wins outright on specificity, regardless of where it
   sits in the file; placed directly after the rule it corrects anyway,
   for readability, not because source order is doing the work here.
   All three MUST be scoped to TOP-LEVEL items only, via the same
   `.wp-block-navigation__container > .wp-block-navigation-item >` direct-
   child chain the resting/hover colour rule above uses - NOT just a
   `.site-header__row .site-nav-primary` prefix. Caught and corrected
   before shipping (not found live after): the original `[aria-current=
   "page"]` rule's own comment says it deliberately ALSO matches "a
   submenu child being the current page too (e.g. sitting on a Library
   category)", and WP's `.current-menu-item` class is not reliably top-
   level-only either - a plain descendant-only override (no direct-child
   restriction) would have painted a current LIBRARY CATEGORY link white
   on the flyout's own white panel background, the exact "invisible"
   failure this whole navy pass is trying to fix, just relocated. The
   direct-child chain below only ever matches the six TOP-LEVEL items;
   the Library/IGT Connects flyout's own current-page/focus states keep
   brand-red untouched (5.87:1 on white, re-verified live).
   REWRITTEN 30 Aug (tablet/mobile round, item 1) - the `@media
   (min-width: 1024px)` wrapper this comment used to describe is GONE,
   same fix and same reasoning as the resting/hover colour block above:
   these elements now stay white/navy-safe at every width the bar is
   horizontal (which, after §2's breakpoint fix, means 768px and up, not
   just 1024px and up), and drop to brand-red ONLY inside the genuinely-
   open `.is-menu-open` drawer, in the dedicated override block below -
   never decided by viewport alone again. */
.site-header__row .wp-block-navigation__container > .wp-block-navigation-item > .wp-block-navigation-item__content.wp-block-navigation-item__content:focus-visible {
    outline-color: var(--wp--preset--color--white); /* was brand-red - 9.30:1 on #35495c */
}
/* Current-page/ancestor colour: NOT simply flipped to the same brand-red
   at higher contrast (no tint of it clears 4.5:1 without inventing an
   off-brand pink nobody has signed off - the closest that passes,
   #FFA0A3, was tested and rejected here for that reason). White instead,
   same treatment the focus ring above and the hover state already use -
   distinctiveness comes from `font-weight:700` (current-page) which
   plain hover text doesn't carry, not from a third colour. Flagged as a
   deviation from the literal brief (which only asked to "re-check" this
   rule) rather than silently left broken or silently redesigned. */
.site-header__row .wp-block-navigation__container > .wp-block-navigation-item.current-menu-item > .wp-block-navigation-item__content.wp-block-navigation-item__content,
.site-header__row .wp-block-navigation__container > .wp-block-navigation-item > .wp-block-navigation-item__content.wp-block-navigation-item__content[aria-current="page"] {
    color: var(--wp--preset--color--white); /* was brand-red - 1.58:1 on #35495c, a real fail */
}
.site-header__row .wp-block-navigation__container > .wp-block-navigation-item.is-ancestor-current > .wp-block-navigation-item__content.wp-block-navigation-item__content {
    color: var(--wp--preset--color--white); /* was brand-red - same 1.58:1 fail */
}
/* Surface override - drawer genuinely open (same `.is-menu-open`
   principle as the resting/hover block above). One extra ancestor class
   over the white versions above = higher specificity, wins outright
   whenever the drawer is actually the open white-background overlay. */
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container > .wp-block-navigation-item > .wp-block-navigation-item__content.wp-block-navigation-item__content:focus-visible {
    outline-color: var(--wp--preset--color--brand-red);
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container > .wp-block-navigation-item.current-menu-item > .wp-block-navigation-item__content.wp-block-navigation-item__content,
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container > .wp-block-navigation-item > .wp-block-navigation-item__content.wp-block-navigation-item__content[aria-current="page"] {
    color: var(--wp--preset--color--brand-red);
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container > .wp-block-navigation-item.is-ancestor-current > .wp-block-navigation-item__content.wp-block-navigation-item__content {
    color: var(--wp--preset--color--brand-red);
}

/* ══ Mobile drawer quality pass, 30 Aug (tablet/mobile round, item 5) ══
   "It works, but it's a wall" (brief) - three fixes on top of the
   drawer's own geometry: real 44px row targets, the Library/IGT
   Connects submenu collapsed behind a disclosure, and the header's
   newsletter CTA carried into it - "on phones the drawer IS the header"
   (brief; search REMOVED from this list 2026-09-16, see the CTA-slot
   comment further down). NOTE, 2026-09-16: the parenthetical this
   comment originally carried here - "the drawer itself is WP's default
   fullscreen white overlay, not a custom slide-in panel... an existing,
   already-accepted deviation" - is NO LONGER TRUE. The drawer was
   rebuilt to the real §4.6 320px slide-in pattern that same day (see
   the "Drawer rebuilt to WORDPRESS-FSE-BUILD-STANDARDS.md §4.6" block
   above) - everything below this comment (row targets, submenu
   disclosure, CTA slot) is unaffected by that rebuild and still applies
   exactly as written. */

/* 44px row targets (item 5b) - measured 26px live before this fix.
   `min-height` + flex + `align-items:center` (padding would also work,
   but flex sidesteps having to know this element's existing line-height/
   font metrics to land on exactly 44px) - text stays its existing size,
   only the clickable box grows, same "padding not font-size" intent the
   brief asks for. Applies at every depth (top-level AND the 14 Library/
   5 IGT Connects children) - deliberately NOT scoped to the `>` direct-
   child chain the colour rules above use, since every row in the drawer
   needs this, not just the top six. */
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item__content {
    display: flex;
    align-items: center;
    min-height: 44px;
    box-sizing: border-box;
}

/* Submenu disclosure (item 5a) - see site.js's own comment (search
   "Mobile drawer submenu disclosure") for why this doesn't use WP's
   native toggle/aria-expanded at all. The native toggle button still
   exists in the DOM (desktop hover-dropdown needs it, §4.6a) - just
   hidden here, since it's non-functional (permanently "expanded") once
   the container is the open drawer, and showing two toggle-look
   controls side by side would be real UI confusion.
   `position:relative` on the `<li>` gives the injected button (below)
   a sane positioning context - scoped to `.is-menu-open` only, so the
   desktop flyout's own (WP-supplied) positioning is untouched. */
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item.wp-block-navigation-submenu {
    position: relative;
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item.wp-block-navigation-submenu > .wp-block-navigation__submenu-icon {
    display: none;
}
/* Reserve room on the right of the link so the absolutely-positioned
   toggle (below) never overlaps the link text - only reserved once
   site.js confirms a working toggle actually landed (see the
   `html.drop-drawer-collapsible` gate below), matching the "no JS ->
   no reserved gap needed" no-op case. */
html.drop-drawer-collapsible .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item.wp-block-navigation-submenu > .wp-block-navigation-item__content {
    padding-right: 44px;
}
.drop-drawer-submenu-toggle {
    display: none; /* hidden everywhere except the open drawer, below */
}
.wp-block-navigation__responsive-container.is-menu-open .drop-drawer-submenu-toggle {
    display: flex;
    align-items: center;
    justify-content: center;
    position: absolute;
    top: 0;
    right: 0;
    width: 44px;
    height: 44px; /* Part 24 target - matches the row-height fix above */
    padding: 0;
    border: 0;
    background: transparent;
    color: var(--wp--preset--color--ink-heading);
    cursor: pointer;
}
.drop-drawer-submenu-toggle svg {
    transition: transform 0.15s ease;
}
.drop-drawer-submenu-toggle[aria-expanded="true"] svg {
    transform: rotate(180deg);
}
/* Collapsed by default ONLY once site.js's `html.drop-drawer-collapsible`
   class confirms every toggle is wired (guardrail: "degrade to
   expanded, never inaccessible") - `display:flex` on open matches WP's
   own default submenu-container layout (confirmed live: `display:flex`,
   column direction is WP core's default flex-direction for this
   element, not restated here). */
html.drop-drawer-collapsible .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item.wp-block-navigation-submenu > .wp-block-navigation__submenu-container {
    display: none;
}
html.drop-drawer-collapsible .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item.wp-block-navigation-submenu.drop-drawer-submenu-open > .wp-block-navigation__submenu-container {
    display: flex;
}

/* CTA carried into the drawer (item 5c; search REMOVED from the drawer
   2026-09-16, Daniel's explicit request - this used to carry search too,
   see assets/js/search.js's initDrawerUtilities for the removal) -
   search.js reparents the SAME newsletter CTA button into this slot on
   open, and back to its original header spot on close (identical
   technique to the desktop search panel elsewhere in this file - the
   DOM node moves, not a clone, so nothing needs re-wiring). Slot starts
   empty in the markup; JS is what populates it, so there's nothing to
   hide/show here beyond basic spacing.
   `.wp-block-navigation__responsive-container-content` (the slot's real
   parent - WP core markup, `display:flex`) is a ROW by default -
   confirmed live, a real bug caught before shipping: this slot and the
   nav `<ul>` were sharing that row instead of stacking, because flex
   children with no `flex-direction` override just lay out side by side.
   Forced to a column, scoped to `.is-menu-open` only - §2's forced
   breakpoint makes `.wp-block-navigation__responsive-container` (and
   everything inside it, including this slot) render as a normal,
   always-visible block at desktop widths too, not just when the drawer
   is genuinely open, so an ungated column direction would apply there
   as well with nothing to stack. Gated to the real surface, same
   principle as the nav-colour fix (item 1): invisible by default, shown
   only when `.is-menu-open` actually makes this the open drawer. */
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content {
    flex-direction: column;
}
.drop-drawer-cta-slot {
    display: none;
}
.wp-block-navigation__responsive-container.is-menu-open .drop-drawer-cta-slot {
    display: block;
}
/* Pinned to the bottom of the drawer's own scroll area (brief: "a
   full-width ... button pinned at the bottom") - `position:sticky`
   inside the dialog's scrollable content wrapper, so it stays in view
   while the 20-link list scrolls past above it, rather than just being
   DOM-last (which would put it below the fold on a genuinely tall
   list). */
.drop-drawer-cta-slot {
    width: 100%;
    position: sticky;
    bottom: 0;
    margin-block-start: 1rem;
    padding-block: 0.75rem;
    background: var(--wp--preset--color--white);
}
.drop-drawer-cta-slot .site-header__newsletter-btn {
    display: block;
    width: 100%;
    text-align: center;
}

.site-footer,
footer.wp-block-template-part.site-footer {
    /* display switched flex -> block, 2026-08-28 footer rebuild - this
       element used to hold three small flex-row items (copyright/
       social/nav) directly; it now holds two stacked top-level groups
       (.site-footer__main, .site-footer__bottom), each owning its own
       internal layout. Side gutters stay here (still the single §3.3
       owner for both stacked children); padding-block moved off this
       rule since the two parts need different vertical padding - see
       .site-footer__main/.site-footer__bottom below. */
    display: block;
    margin-block: 0; /* §4.7 flush zeroing, footer side - the #site-main
        fix above (2026-08-21) only zeroed the header-to-hero gap; the
        root .wp-site-blocks blockGap rule was still giving .site-footer
        a 20px margin-block-start, showing as a white strip against the
        navy footer background. Confirmed via computed styles 2026-08-22. */
    padding-inline: max(1.5rem, calc((100vw - var(--wp--style--global--content-size, 1310px)) / 2));
    background-color: var(--wp--preset--color--brand-navy);
    color: var(--wp--preset--color--white);
    position: relative;
}
/* Airmail ribbon, footer top edge (2026-08-28, override REMOVED
   2026-08-28 later still - ribbon-unification pass). This ribbon used to
   carry a local --air-ground/--air-navy override (paper tint #f1f4f7,
   lifted navy #93aec6) on the reasoning that pure white would glare
   against the navy footer and the navy bar would vanish into an
   identically-coloured background. That premise was wrong, and Daniel
   caught the visible result: the header edge (never overridden) and the
   footer edge (overridden) were two different-looking ribbons
   bookending the same page. The ribbon paints its OWN ground stripe as
   an opaque bar - the navy bar in the gradient sits on the ribbon's own
   white ground bar, not directly on the footer's navy background, so
   there was never anything for it to "vanish into"; the header's
   identical (unoverridden) ribbon proves this live, it's been fine the
   whole time. Removed the override entirely rather than re-tuning it -
   the two edges now render from the exact same --air-ground/--air-navy
   values (the sitewide :root defaults), by construction, not by keeping
   two numbers in sync. If this override is ever reinstated, re-derive
   the reasoning from scratch rather than restoring these two hex values -
   they were wrong, not just stale. */
.site-footer::before {
    content: "";
    position: absolute;
    inset: 0 0 auto 0;
    height: 6px;
    background-image: var(--airmail);
}
/* Dark footer band (2026-08-22, Daniel's call) - links need to flip to
   white for AA contrast against navy; the default link colour (navy-ish)
   was only ever styled for the old light-grey background. `.site-nav-
   footer` dropped from this selector 2026-08-28 - the footer rebuild
   replaced that wp:navigation block with hand-built link lists (see
   parts/footer.html's own comment: a ref-less nav block renders
   whichever wp_navigation post was most recently edited, the same one
   the header uses, §4.6 gotcha - not what a footer-only link needs). */
.site-footer a {
    color: var(--wp--preset--color--white);
}
/* Underline on hover/focus only, 30 Aug (button-system pass, replaces
   the plain hover-only rule this used to be) - acceptable pattern in a
   labelled footer nav, per the brief. `:not(.drop-btn)` excludes the
   LinkedIn house-ad CTA specifically - that tile's three documented
   placements include the footer (see .drop-house-ad's own comment), so
   its button needs to keep behaving like `.drop-btn` everywhere it can
   land, not pick up this footer's own link-underline convention just
   because it's technically an `<a>` sitting inside `.site-footer` on
   that one placement. text-underline-offset keeps the rule clear of
   descenders at this line-height. */
.site-footer a:not(.drop-btn) {
    text-decoration: none;
}
.site-footer a:not(.drop-btn):hover,
.site-footer a:not(.drop-btn):focus-visible {
    color: var(--wp--preset--color--surface);
    text-decoration: underline;
    text-underline-offset: 0.18em;
}
/* Focus ring, closing a gap flagged (not fixed) during the footer-logo
   pass - the sitewide red ring measures ~1.26:1 on this footer's own
   brand-navy background, effectively invisible. `.footer-lockup` got
   its own white override at the time; every OTHER footer link (these,
   plus the social icons below) didn't, "out of scope for add a logo".
   In scope now - this pass already touches every footer link's hover/
   focus treatment. */
.site-footer a:not(.drop-btn):focus-visible {
    outline-color: var(--wp--preset--color--white);
}
/* Heading colour override (2026-08-28) - theme.json's global heading
   element style paints every h1-h4 in `ink-heading` (dark navy), correct
   everywhere else on the site but invisible against this footer's own
   navy background. Column headings ("Sections"/"Company"/etc.) need
   their own explicit white. h3 added 2026-08-28 (newsletter rebuild) -
   the drop-newsletter component's own heading is an h3. */
.site-footer h3,
.site-footer h4 {
    color: var(--wp--preset--color--white);
}

/* ── Footer main: brand + 4 link/newsletter columns (2026-08-28 rebuild;
   Topics column + tighter padding added 2026-09-19, homepage redesign
   handoff §6 - "the current footer has ~400px of empty navy below its
   four columns... a fifth column plus tighter padding is the fix,
   the redesign uses the space rather than shrinking it"). Padding
   dropped from the shared `--drop-section-pad` (32-50px) to the
   handoff's literal 44px - a deliberate one-off, not a second
   `--{prefix}-section-pad`-scale token (§3.4 owns page-level section
   rhythm; the footer's own internal padding is a component detail). */
.site-footer__main {
    padding-block: 44px;
}
.site-footer__columns {
    display: grid;
    grid-template-columns: 1.4fr 1fr 1fr 1fr 1.5fr;
    gap: var(--drop-column-gap);
}
@media (max-width: 900px) {
    /* same breakpoint the card grid collapses 3->2 columns at
       (assets/css/style.css, .wp-block-query) - reused, not a new
       number. */
    .site-footer__columns {
        grid-template-columns: repeat(2, 1fr);
    }
}
@media (max-width: 600px) {
    .site-footer__columns {
        grid-template-columns: 1fr;
    }
}
.site-footer__col h4 {
    margin-top: 0;
    margin-bottom: 0.75rem;
}
/* .site-footer__wordmark (text "THE DROP" in Archivo caps) REMOVED,
   replaced with .footer-lockup, a real image lockup - see footer.html's
   own comment for the full reasoning (external review adoption,
   2026-08-28 later still). */
/* Scaled to the masthead's EXACT sizes, 30 Aug (button-system pass) -
   was 48px/40px/12px (bird rendered 69px wide, well under ceiling but a
   visibly smaller lockup than the header's own). Now bird 112px /
   wordmark 96px / gap 20px - the identical values `.brand-lockup`/
   `.brand-lockup__bird`/`.brand-lockup__word` use (search those class
   names in this file for the header's own HARD CEILING reasoning, not
   repeated here - same files, same 2.0x ceilings, this is the same
   lockup at the same size, not a new one). At ~343px wide (112 + 20 +
   ~211 for the wordmark's own aspect ratio at 96px tall) this fits the
   footer's brand column - confirmed live, not assumed, before shipping
   at this size. */
.footer-lockup {
    display: flex;
    align-items: flex-end;
    gap: 20px;
    margin: 0 0 0.5rem;
}
.footer-lockup img:first-child {
    height: 112px; /* bird - identical to .brand-lockup__bird */
    width: auto;
}
.footer-lockup img:last-child {
    height: 104px; /* wordmark - identical to .brand-lockup__word (2026-10-14 new logo, was 96px) */
    width: auto;
}
/* Footer lockup scales with the masthead, 30 Aug (tablet/mobile round,
   item 4) - confirmed live before this fix: at 390px the footer was
   still rendering the full 112/96 desktop lockup inside a 340px brand
   column, exactly the brief's complaint. Mirrors `.brand-lockup__bird`/
   `.brand-lockup__word`'s own mobile override EXACTLY - same 80px/68px
   values, same breakpoint. The brief describes the masthead's own
   breakpoint as "≤900" (informal, from eyeballing where the scaled
   lockup visibly kicks in); the REAL governing value in this file is
   `max-width: 1023px` (`.site-header__brand`/`.brand-lockup__bird`/
   `.brand-lockup__word`'s own mobile block, this file) - matched to
   THAT exact number, not re-derived as a new "900", so header and
   footer are provably bound to the same breakpoint rather than two
   coincidentally-close ones that could drift apart later.
   Breakpoint widened 1023px -> 1199px, 2026-09-16 - stays bound to the
   masthead's own (also-widened) breakpoint, unchanged principle. */
@media (max-width: 1199px) {
    .footer-lockup {
        gap: 14px;
    }
    .footer-lockup img:first-child {
        height: 80px; /* identical to .brand-lockup__bird's mobile value */
    }
    .footer-lockup img:last-child {
        height: 74px; /* identical to .brand-lockup__word's mobile value (2026-10-14 new logo, was 68px) */
    }
}
/* Focus ring - checked, not assumed safe: the sitewide red ring
   (:focus-visible, ~line 700) measures ~1.26:1 on this footer's own
   brand-navy background - effectively invisible, the same problem
   already fixed for the nav row during the navy-row pass earlier this
   session. This is a NEW focusable element added to the footer by this
   change, so it gets its own override rather than shipping onto a ring
   that doesn't work here. NOTE, not fixed this pass: the same 1.26:1
   problem already affects every OTHER footer link (.site-footer__links
   a, the social icons) - out of scope for "add a logo", flagged for a
   dedicated footer-focus-ring pass. */
.footer-lockup:focus-visible {
    outline-color: var(--wp--preset--color--white);
}
.site-footer__tagline {
    margin: 0 0 1rem;
    opacity: 0.8; /* muted against the wordmark, same intent as the header's
        ink-muted token - opacity used instead since this sits on a solid
        colour background, not white (a fixed muted colour token would
        need its own dark-ground variant just for this one line). */
}
.site-footer__links {
    list-style: none;
    margin: 0;
    padding: 0;
}
.site-footer__links li + li {
    margin-top: 0.6rem;
}
.site-footer__links a {
    font-family: var(--font-display); /* was unset - serif-drift sweep
       (article-refinements pass, 2026-08-28 later still), one of the two
       spots the brief named explicitly: these are the "Sections"/
       "Company" column links, silently inheriting the sitewide Source
       Serif body default since nothing here set a font-family. Weight
       500 (not the theme's default link weight) per the brief. */
    font-weight: 500;
}
/* .site-footer__newsletter-btn REMOVED 2026-08-28 (newsletter rebuild,
   same day as it was added during the ribbon refinements pass) - that
   modal-only trigger button is replaced by the real drop-newsletter
   unit (footer variant) in this same column. Its Anti-pattern #44
   colour-invert-on-hover reasoning is inherited by .drop-newsletter__
   row button below instead, which faces the identical problem (a
   button living on this same navy footer background).

   Footer variant text-colour overrides - the base .drop-newsletter__
   body/__fine/__status rules assume a light surface background (the
   inline/modal variants); this column's own background is the same
   dark navy as the rest of .site-footer, so they need the same white/
   translucent-white treatment already established for this footer's
   other text (.site-footer__tagline etc). The email input/button
   inside .drop-newsletter__row are unaffected - white input, `--air-
   red` button, `var(--font-display)` colour set explicitly regardless
   of surrounding context. */
.site-footer .drop-newsletter__body {
    opacity: 0.8;
}
.site-footer .drop-newsletter__fine {
    color: rgba(255, 255, 255, 0.7); /* audit-allow-hex: translucent white fine-print on the dark footer, decorative only - same convention as the bottom-bar copyright line */
}
.site-footer .drop-newsletter.has-error .drop-newsletter__status {
    color: var(--wp--preset--color--white); /* brand-red status text (the base rule) fails contrast on this footer's own navy - measured ~1.3:1, nowhere near AA - white plus the ⚠ text marker still distinguishes it from the success/neutral state. */
}
/* Anti-pattern #44 override REMOVED, 30 Aug (button-system pass) - was:
   the base .drop-newsletter__row button fill was brand-navy, THIS
   FOOTER'S OWN background, so a navy button here would vanish into a
   navy page; fixed at the time with a footer-specific brand-red fill +
   invert-to-white hover. That whole problem no longer exists: the
   button now renders from `.drop-btn`, whose resting fill is ALREADY
   brand-red (not navy) everywhere, including here - there's nothing
   left for this footer to override. `.drop-btn:hover`'s shared
   brand-red-dark darken is also visually fine against navy (still
   clearly a different, darker red, no invisibility risk) - didn't need
   the invert-to-white treatment kept as a special case. */

/* ── Footer bottom: copyright strip (2026-08-28 rebuild) - the original
   single-row footer's entire content, now alone in its own slim band
   under a hairline divider. */
.site-footer__bottom {
    padding-block: 1.25rem;
    border-top: 1px solid rgba(255, 255, 255, 0.15); /* audit-allow-hex: translucent divider tint on the dark footer, decorative only - matches the existing rgba shadow-tint precedent elsewhere in this file */
    font-size: 0.875rem;
}
.site-footer__bottom p {
    margin: 0;
    opacity: 0.8;
}
/* Sponsored-content disclaimer, right-aligned from the copyright line
   (Daniel's request) - the flex space-between on .site-footer__bottom
   already pushes it right at rest; stacked under the copyright on
   phones, same convention as this file's other two-child mobile fixes
   (Directory entries, Contact team cards). */
@media (max-width: 600px) {
    .site-footer__bottom {
        flex-direction: column;
        align-items: flex-start;
        gap: 0.5rem;
    }
}

/* ── Homepage hero carousel (drop/hero-carousel block, 2026-08-27,
   Daniel's request - replicating prod's top-of-page Enfold slideshow).
   Slides crossfade via opacity (deliberately simpler than a sliding
   transform-based track - no variable-width track math to get wrong,
   and the sitewide prefers-reduced-motion rule already kills all
   transition durations globally, so this needed no extra CSS for
   that). Autoplay/prev-next/dots/pause interaction is site.js, plain
   vanilla JS - this file is layout/visuals only.
   Moved into the left column above "Latest from The Drop" 2026-08-27
   (same session, later) - was full page width, sitting directly in
   <main> above the whole 2-column split; the sitewide-content-size
   max-width/auto-centring that made sense there was dropped once it
   became a plain flow child of .drop-home-layout__main, which is
   already its own constrained column - a second width cap nested
   inside the first would just never trigger, same "redundant
   constrained-inside-constrained" simplification already made on the
   IGT Connects intro block earlier this session. Width now simply
   100% of whatever column it's placed in. */
.drop-hero-carousel {
    position: relative;
    width: 100%;
    aspect-ratio: 16 / 9;
    overflow: hidden;
    background-color: var(--wp--preset--color--surface);
}
/* Airmail ribbon REMOVED from the hero top edge, 2026-08-28 (ribbon
   refinements pass) - do not re-add it here. The carousel is an
   advertiser rotator, not page chrome: it spends most of its life
   showing supplier creative (IGT's "Strike the Gong" at the time this
   was written), and the ribbon's whole governing rule is that it marks
   what belongs to The Drop, never advertiser/partner content - a strip
   across the top of a supplier's own slide branded that slide as The
   Drop's, the exact thing the rule exists to prevent. Two supporting
   reasons, not just the policy one: a single 5px line across the top of
   a full-bleed image doesn't enclose anything, so it read as a stray
   rule rather than a real edge; and the carousel imagery is already
   visually maximal, so the stripe was noise on noise. The site header's
   own top-edge ribbon (.site-header::before) is the correct structural
   instance and is untouched. */
.drop-hero-carousel__track {
    list-style: none;
    margin: 0;
    padding: 0;
    position: relative;
    width: 100%;
    height: 100%;
}
.drop-hero-carousel__slide {
    position: absolute;
    inset: 0;
    opacity: 0;
    visibility: hidden;
    transition: opacity 0.6s ease;
}
.drop-hero-carousel__slide.is-active {
    opacity: 1;
    visibility: visible;
}
.drop-hero-carousel__slide a,
.drop-hero-carousel__slide img {
    display: block;
    width: 100%;
    height: 100%;
    object-fit: cover;
}
.drop-hero-carousel__arrow {
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    width: 2.75rem; /* was 2.5rem (40px) - a real Part 24 target-size fail,
       bumped to 44px, 30 Aug (tablet/mobile round, item 7). */
    height: 2.75rem;
    display: flex;
    align-items: center;
    justify-content: center;
    border: none;
    border-radius: 50%;
    background: rgba(0, 0, 0, 0.4);
    color: var(--wp--preset--color--white);
    font-size: 1.75rem;
    line-height: 1;
    cursor: pointer;
    z-index: 1;
}
.drop-hero-carousel__arrow:hover,
.drop-hero-carousel__arrow:focus-visible {
    background: rgba(0, 0, 0, 0.65);
}
.drop-hero-carousel__arrow--prev { left: 1rem; }
.drop-hero-carousel__arrow--next { right: 1rem; }
.drop-hero-carousel__dots {
    position: absolute;
    bottom: 1rem;
    left: 50%;
    transform: translateX(-50%);
    display: flex;
    gap: 0.5rem;
    z-index: 1;
}
/* 24x24 hit area added via a ::before pseudo-element, 30 Aug (tablet/
   mobile round, item 7) - "10px visual is fine; give each a 24x24 hit
   area via padding" (brief). Plain `padding` alone doesn't do this: the
   button's own box IS what's painted (empty content, border-box reset
   sitewide), so growing padding while width/height stay at 0.625rem
   just reallocates space inside a box that's already the visible dot -
   there's no room for a bigger invisible hit area without also
   inflating the visible circle. Moved the actual paint (border +
   background) onto `::before`, sized at the ORIGINAL 0.625rem, kept
   perfectly centred inside a now-24x24, transparent, border-less
   button - the visual dot is pixel-identical, only the clickable box
   around it grew. */
.drop-hero-carousel__dot {
    width: 24px;
    height: 24px;
    display: flex;
    align-items: center;
    justify-content: center;
    border: none;
    background: none;
    padding: 0;
    cursor: pointer;
}
.drop-hero-carousel__dot::before {
    content: "";
    width: 0.625rem;
    height: 0.625rem;
    border-radius: 50%;
    border: 1px solid var(--wp--preset--color--white);
    background: rgba(255, 255, 255, 0.4);
}
.drop-hero-carousel__dot.is-active::before {
    background: var(--wp--preset--color--white);
}
.drop-hero-carousel__pause {
    position: absolute;
    top: 1rem;
    right: 1rem;
    width: 2rem;
    height: 2rem;
    display: flex;
    align-items: center;
    justify-content: center;
    border: none;
    border-radius: 50%;
    background: rgba(0, 0, 0, 0.4);
    color: var(--wp--preset--color--white);
    cursor: pointer;
    z-index: 1;
}
.drop-hero-carousel__pause:hover,
.drop-hero-carousel__pause:focus-visible {
    background: rgba(0, 0, 0, 0.65);
}
/* Pure-CSS pause/play glyphs (two bars vs a triangle) so the icon needs
   no image asset and updates for free just by site.js toggling
   [aria-pressed] - no separate JS-driven icon swap to keep in sync. */
.drop-hero-carousel__pause::before {
    content: "";
    width: 0;
    height: 0.75rem;
    border-left: 4px solid currentColor;
    border-right: 4px solid currentColor;
}
.drop-hero-carousel__pause[aria-pressed="true"]::before {
    border-left: none;
    border-right: none;
    border-top: 0.4rem solid transparent;
    border-bottom: 0.4rem solid transparent;
    border-left: 0.6rem solid currentColor;
    width: 0;
    height: 0;
}
@media (max-width: 700px) {
    .drop-hero-carousel {
        aspect-ratio: 4 / 3;
    }
}

/* ── Featured-story homepage lead (2026-09-16, Daniel's request) - the
   alternate-homepage comparison template's replacement for the hero
   carousel above (drop/featured-story in plugins/drop-blocks.php). Both
   `.drop-featured-story-eyebrow` and `.drop-featured-story` render as
   bare flow children of `.drop-home-layout__main` with nothing
   wrapping them (same as `.drop-hero-carousel` above), so the gap
   above/below/between both comes from the account's existing
   `:where(.is-layout-flow) > * + *` blockGap injection - no manual
   margin added here, per this file's own §0.4 spacing-tripwire
   discipline (don't add a second owner where one already exists). ── */
/* ── Featured block, option 1a (2026-09-19 homepage redesign handoff,
   §4a) - REBUILT, replacing the same-day earlier eyebrow-outside/image-
   left-text-right layout. One navy container: an airmail stripe (::before,
   8px), a header row (FEATURED label + spacer rule + date), then a single
   link wrapping the 16:9 image and the text block (category, headline,
   standfirst, decorative CTA span) - see drop_render_featured_story() in
   plugins/drop-blocks.php for why it's one anchor, not nested ones.
   Grid placement (column 1/3, row 1/4), the navy field and the stripe now
   live on `.drop-featured-carousel` (below) - the wrapper every featured
   card sits in since 2026-10-13, when this became a rotating carousel
   of one-to-five of these cards. `.drop-featured-story` itself is now
   just ONE slide: transparent, the card's content only. */
.drop-featured-story {
    display: flex;
    flex-direction: column;
    min-width: 0;
}

/* ── Featured carousel (2026-10-13, Daniel's request: select multiple
   featured posts, rotate them in a carousel). The wrapper owns what the
   single card used to: grid placement, navy field, airmail stripe.
   Slides are stacked in ONE grid cell (not translated side by side), so
   the cell is as tall as the tallest slide and the card - which spans
   three homepage-grid rows - never changes height as slides swap; only
   opacity/visibility change. A lone slide (nothing flagged, or one
   flagged post) renders through this same wrapper with no controls. ── */
.drop-featured-carousel {
    grid-column: 1 / 3;
    grid-row: 1 / 4;
    background: var(--wp--preset--color--brand-navy);
    display: flex;
    flex-direction: column;
    min-width: 0;
}
.drop-featured-carousel::before {
    content: "";
    display: block;
    flex: none;
    height: 8px;
    --air-pitch: 10px;
    background-image: var(--airmail);
}
.drop-featured-carousel__stack {
    display: grid;
    flex: 1 1 auto;
}
.drop-featured-carousel__stack > .drop-featured-story {
    grid-area: 1 / 1;
}
/* Slide visibility - only meaningful when there are several slides (a lone
   slide carries .is-active from PHP anyway). visibility is delayed on the
   way out so the fade completes before the old slide stops being
   hit-testable; the incoming slide becomes visible immediately. */
.drop-featured-carousel__stack > .drop-featured-story:not(.is-active) {
    visibility: hidden;
    opacity: 0;
    pointer-events: none;
    transition: opacity 0.45s ease, visibility 0s linear 0.45s;
}
.drop-featured-carousel__stack > .drop-featured-story.is-active {
    visibility: visible;
    opacity: 1;
    transition: opacity 0.45s ease;
}
.drop-featured-carousel__controls {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 16px;
    flex: none;
    padding: 0 30px 24px;
}
.drop-featured-carousel__controls[hidden] {
    display: none;
}
.drop-featured-carousel__dots {
    display: flex;
    align-items: center;
    gap: 4px;
}
/* Each dot is a 44px-tall hit target (Part 24) drawing a thin bar with a
   ::before - square-cornered, per the design system's "radius 0
   everywhere" rule (the only curve in the system is the postmark). */
.drop-featured-carousel__dot {
    position: relative;
    width: 36px;
    height: 44px;
    padding: 0;
    border: 0;
    background: transparent;
    cursor: pointer;
}
.drop-featured-carousel__dot::before {
    content: "";
    position: absolute;
    left: 4px;
    right: 4px;
    top: 50%;
    height: 4px;
    margin-top: -2px;
    background: rgba(255, 255, 255, 0.35);
    transition: background-color 0.2s ease;
}
.drop-featured-carousel__dot:hover::before {
    background: rgba(255, 255, 255, 0.7);
}
.drop-featured-carousel__dot.is-active::before {
    background: var(--wp--preset--color--brand-red);
}
.drop-featured-carousel__buttons {
    display: flex;
    gap: 8px;
}
.drop-featured-carousel__btn {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 44px;
    height: 44px;
    padding: 0;
    border: 1px solid rgba(255, 255, 255, 0.3);
    background: transparent;
    color: var(--wp--preset--color--white);
    cursor: pointer;
    transition: background-color 0.15s ease;
}
.drop-featured-carousel__btn:hover {
    background: rgba(255, 255, 255, 0.12);
}
/* White ring, not the sitewide red one - red on this navy measures far
   below the 3:1 non-text minimum (decisions log, footer focus-ring gap). */
.drop-featured-carousel__btn:focus-visible,
.drop-featured-carousel__dot:focus-visible {
    outline: 2px solid var(--wp--preset--color--white);
    outline-offset: 2px;
}
/* Pause/play share one button; which glyph shows follows .is-paused,
   which site.js sets alongside the button's aria-label. */
.drop-featured-carousel__btn--pause .drop-featured-carousel__icon-play,
.drop-featured-carousel__btn--pause.is-paused .drop-featured-carousel__icon-pause {
    display: none;
}
.drop-featured-carousel__btn--pause.is-paused .drop-featured-carousel__icon-play {
    display: block;
}
@media (prefers-reduced-motion: reduce) {
    .drop-featured-carousel__stack > .drop-featured-story,
    .drop-featured-carousel__dot::before {
        transition: none !important;
    }
}
.drop-featured-story__head {
    display: flex;
    align-items: baseline;
    gap: 14px;
    padding: 20px 30px 18px;
    flex: none;
}
.drop-featured-story__label {
    font-family: var(--font-narrow);
    font-weight: 700;
    font-size: 0.6875rem;
    letter-spacing: 0.2em;
    text-transform: uppercase;
    color: var(--wp--preset--color--white);
}
.drop-featured-story__rule {
    flex: 1 1 auto;
    height: 1px;
    background: rgba(255, 255, 255, 0.22);
}
.drop-featured-story__date {
    font-family: var(--font-narrow);
    font-weight: 700;
    font-size: 0.6875rem;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: rgba(255, 255, 255, 0.65);
    white-space: nowrap;
}
.drop-featured-story__link {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    min-height: 0;
    padding: 0 30px 30px;
    color: inherit;
    text-decoration: none;
}
.drop-featured-story__link:focus-visible {
    outline: 2px solid var(--wp--preset--color--brand-red);
    outline-offset: 2px;
}
.drop-featured-story__media {
    display: block;
    flex: none;
    overflow: hidden;
}
.drop-featured-story__media img,
.drop-featured-story__media .drop-card-fallback {
    display: block;
    aspect-ratio: 16 / 9;
    width: 100%;
    height: auto;
    object-fit: cover;
}
.drop-featured-story__text {
    display: block;
    padding: 26px 0 0;
}
.drop-featured-story__category {
    display: inline-block;
    background: var(--wp--preset--color--brand-red);
    color: var(--wp--preset--color--white);
    font-family: var(--font-narrow);
    font-weight: 700;
    font-size: 0.6875rem;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    padding: 4px 9px;
    margin-bottom: 16px;
}
.drop-featured-story__title {
    display: block;
    font-family: var(--font-display);
    font-weight: 700;
    font-size: clamp(1.625rem, 1.1rem + 2.2vw, 2.875rem);
    line-height: 1.03;
    letter-spacing: -0.03em;
    color: var(--wp--preset--color--white);
    max-width: 21em;
    text-wrap: pretty;
}
.drop-featured-story__standfirst {
    display: block;
    font-family: var(--font-body);
    font-size: clamp(1.0625rem, 0.95rem + 0.5vw, 1.25rem);
    line-height: 1.5;
    color: rgba(255, 255, 255, 0.78);
    margin-top: 20px;
    max-width: 33em;
    text-wrap: pretty;
}
.drop-featured-story__cta {
    display: inline-block;
    background: var(--wp--preset--color--brand-red);
    color: var(--wp--preset--color--white);
    font-family: var(--font-narrow);
    font-weight: 700;
    font-size: 0.75rem;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    padding: 12px 22px;
    margin-top: 26px;
    transition: background-color 0.15s ease;
}
.drop-featured-story__link:hover .drop-featured-story__cta,
.drop-featured-story__link:focus-visible .drop-featured-story__cta {
    background: var(--wp--preset--color--brand-red-dark);
}
.drop-featured-story__link:hover .drop-featured-story__media img {
    transform: scale(1.03);
}
.drop-featured-story__media img {
    transition: transform 0.3s ease-out;
}
@media (prefers-reduced-motion: reduce) {
    .drop-featured-story__media img { transition: none; }
}

/* ── Homepage two-column layout (main + sidebar), per the prod-review
   screenshot correction (2026-08-21) - a 75/25 split main+sidebar, not
   a single-column stack. STILL LIVE, but ALT-TEMPLATE ONLY as of
   2026-09-19 - home-featured-story.html is the one remaining place this
   exact class runs the full page height; the real homepage
   (front-page.html) now uses `.drop-home-hero` below instead, which
   only wraps the top hero row. Left fully alone, not merged with
   `.drop-home-hero`, so the alt template (a redundant duplicate, not
   deleted - see that file's own comment) keeps rendering exactly as it
   always has. ─────────────────────────────────────────────────────── */
.drop-home-layout {
    /* This custom flex wrapper was never capped at the site's content
       width at all (2026-08-22 fix) - WP's constrained-layout CSS caps
       the CHILDREN of a `layout:constrained` block, not the container
       itself, so wrapping the inner .drop-home-layout__main in that
       layout type (already done) only ever capped ITS children within
       whatever width the flex algorithm gave it (~994px, sharing space
       with the sidebar) - it never widened the OUTER row past 1310px
       because nothing was capping the outer row either. Same §4.1
       pattern the header/footer inners use: read the variable
       directly, since this isn't a WP-recognised constrained block. */
    max-width: var(--wp--style--global--content-size, 1310px);
    margin-inline: auto;
    align-items: flex-start;
    gap: var(--drop-column-gap);
}
.drop-home-layout__main {
    flex: 2 1 0%;
    min-width: 0;
}
/* Widened 2026-08-24 (was 3:1/~312px) to match .drop-single-layout__sidebar's
   2026-08-23 width exactly (2:1, min-width 320px) - Daniel's request,
   consistent sidebar width between the homepage and single-post layouts. */
.drop-home-layout__sidebar {
    flex: 1 1 0%;
    min-width: 320px;
}
@media (max-width: 800px) {
    .drop-home-layout {
        flex-wrap: wrap;
    }
    .drop-home-layout__main,
    .drop-home-layout__sidebar {
        flex-basis: 100%;
    }
}

/* ── Homepage main grid (2026-09-19, later same day - homepage redesign
   handoff, README §4 "Main grid") - REPLACES the same-day earlier
   drop-home-hero (flex row) + drop-home-grid (full-width grid below it)
   two-part layout with the handoff's central structural idea: "One CSS
   grid holds the featured block, the follow card, the section rule and
   all article cards, so they interlock." `.drop-home` is the outer
   `is-section` + `layout:constrained` wrapper (front-page.html) - WP's
   own constrained-layout CSS caps `.drop-home-grid` at 1310px for free.
   `minmax(0, 1fr)` (not `1fr`) per the handoff's own note - `1fr`'s
   implicit `min-width:auto` would let a long headline force a track
   wider than the container. */
.drop-home-grid {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 36px 32px;
    /* No margin-top here (§0.4 - a second owner) - `.drop-home-grid` is
       `.drop-home`'s ONLY child now that the hero row is gone, so
       `.is-section`'s own padding-block on `.drop-home` already owns
       the header-to-grid gap; a margin-top here would double it. */
}
/* Follow card - grid-column:3, row:1, pinned to the top of its row so
   the whitespace below it (the row is as tall as the featured block's
   own rows 1-3 combined) collects under it, not around it - this is
   what lets the section rule below sit flush above the first card. */
/* 2026-10-14 follow-card restyle (Daniel's mockup): big serif heading,
   airmail-slash divider under it (two slanted dashes + a thin red line),
   faded bird/postmark watermark behind, and rounded LinkedIn / Facebook
   buttons with an icon tile, "Follow us on" kicker, name and arrow.
   Buttons stack in the narrow right-hand column and sit side by side
   only where the card is wide (600-899px). */
.drop-follow-card {
    grid-column: 3;
    grid-row: 1;
    align-self: start;
    position: relative;
    isolation: isolate;
    overflow: hidden;
    background: var(--wp--preset--color--paper);
    border-top: 2px solid var(--wp--preset--color--brand-navy);
    padding-top: 18px;
}
.drop-follow-card::before {
    content: "";
    position: absolute;
    z-index: -1;
    top: 4px;
    right: -20px;
    width: 252px; /* 2026-10-14: +20% (was 210x143) */
    height: 172px;
    background: url('/wp-content/themes/drop/assets/img/drop-follow-watermark.png') no-repeat right top / contain;
    opacity: 0.8;
    pointer-events: none;
}
/* Heading + divider share a shrink-wrapped box, so the red line ends
   exactly where the heading text ends (2026-10-14). */
.drop-follow-card__head {
    width: fit-content;
    max-width: 100%;
}
.drop-follow-card__rule {
    display: flex;
    align-items: center;
    gap: 9px;
    margin: 12px 0 0;
}
.drop-follow-card__rule-a,
.drop-follow-card__rule-b {
    flex: none;
    width: 34px;
    height: 9px;
    transform: skewX(-32deg);
}
.drop-follow-card__rule-a { background: var(--wp--preset--color--brand-navy); }
.drop-follow-card__rule-b { background: var(--wp--preset--color--brand-red); }
.drop-follow-card__rule i {
    flex: 1;
    height: 2px;
    background: var(--wp--preset--color--brand-red);
}
.drop-follow-card__blurb {
    font-family: var(--font-body);
    font-size: 1.0625rem;
    line-height: 1.45;
    color: var(--wp--preset--color--ink);
    margin: 16px 0 0;
    max-width: 24ch;
    text-wrap: pretty;
}
.drop-follow-card__ctas {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 10px;
    margin-top: 20px;
}
.drop-follow-card__cta {
    position: relative;
    overflow: hidden;
    display: flex;
    align-items: center;
    gap: 9px;
    min-height: 60px;
    padding: 10px 12px 10px 10px;
    border-radius: 10px;
    text-decoration: none;
    transition: background-color 0.15s ease, box-shadow 0.15s ease;
}
.drop-follow-card__cta--linkedin {
    background-color: var(--wp--preset--color--brand-navy);
    background-image: linear-gradient(118deg, transparent 0 66%, rgba(255, 255, 255, 0.05) 66% 100%);
    box-shadow: 0 6px 14px rgba(20, 52, 74, 0.22);
    color: var(--wp--preset--color--white);
}
.drop-follow-card__cta--linkedin:hover,
.drop-follow-card__cta--linkedin:focus-visible {
    background-color: var(--wp--preset--color--brand-navy-deep);
}
.drop-follow-card__cta--facebook {
    background: var(--wp--preset--color--white);
    border: 2px solid var(--wp--preset--color--brand-navy);
    padding: 8px 10px 8px 8px;
    color: var(--wp--preset--color--brand-navy);
}
.drop-follow-card__cta--facebook::after {
    content: "";
    position: absolute;
    right: -18px;
    top: 50%;
    width: 96px;
    height: 96px;
    transform: translateY(-50%);
    background: currentColor;
    opacity: 0.07;
    -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M22 12.06C22 6.51 17.52 2 12 2S2 6.51 2 12.06c0 5 3.66 9.15 8.44 9.94v-7.03H7.9v-2.91h2.54V9.85c0-2.5 1.49-3.89 3.77-3.89 1.09 0 2.23.2 2.23.2v2.46h-1.26c-1.24 0-1.63.77-1.63 1.56v1.88h2.78l-.44 2.91h-2.34V22c4.78-.79 8.44-4.94 8.44-9.94Z'/%3E%3C/svg%3E") center / contain no-repeat;
    mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M22 12.06C22 6.51 17.52 2 12 2S2 6.51 2 12.06c0 5 3.66 9.15 8.44 9.94v-7.03H7.9v-2.91h2.54V9.85c0-2.5 1.49-3.89 3.77-3.89 1.09 0 2.23.2 2.23.2v2.46h-1.26c-1.24 0-1.63.77-1.63 1.56v1.88h2.78l-.44 2.91h-2.34V22c4.78-.79 8.44-4.94 8.44-9.94Z'/%3E%3C/svg%3E") center / contain no-repeat;
    pointer-events: none;
}
.drop-follow-card__cta--facebook:hover,
.drop-follow-card__cta--facebook:focus-visible {
    background: var(--wp--preset--color--paper);
}
.drop-follow-card__cta:focus-visible {
    outline: 2px solid var(--wp--preset--color--brand-red);
    outline-offset: 2px;
}
.drop-follow-card__icon {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 32px;
    height: 32px;
    flex: none;
}
.drop-follow-card__icon svg {
    width: 20px;
    height: 20px;
}
.drop-follow-card__cta--linkedin .drop-follow-card__icon {
    background: var(--wp--preset--color--white);
    color: var(--wp--preset--color--brand-navy);
    border-radius: 6px;
}
.drop-follow-card__cta--facebook .drop-follow-card__icon {
    color: var(--wp--preset--color--brand-navy);
}
.drop-follow-card__cta--facebook .drop-follow-card__icon svg {
    width: 32px;
    height: 32px;
}
.drop-follow-card__text {
    display: flex;
    flex-direction: column;
    gap: 2px;
    min-width: 0;
    flex: 1;
}
.drop-follow-card__kicker {
    font-family: var(--font-body);
    font-weight: 500;
    font-size: 0.625rem;
    letter-spacing: 0.03em;
    text-transform: uppercase;
    line-height: 1.1;
}
.drop-follow-card__label {
    font-family: var(--font-display);
    font-weight: 800;
    font-size: 1rem;
    letter-spacing: 0;
    text-transform: uppercase;
    line-height: 1.05;
}
/* Phones: two buttons share ~340px, which cannot fit icon + "FACEBOOK" +
   arrow (measured: label overflowed by 16px into the arrow), so the arrow
   drops out below 480px and the label gets the room. */
@media (max-width: 479px) {
    .drop-follow-card__cta .drop-follow-card__arrow { display: none; }
}
.drop-follow-card__arrow svg {
    width: 16px;
    height: auto;
}
.drop-follow-card__arrow {
    display: flex;
    flex: none;
    position: relative;
    z-index: 1;
}
.drop-follow-card__cta--linkedin .drop-follow-card__kicker,
.drop-follow-card__cta--linkedin .drop-follow-card__label {
    color: var(--wp--preset--color--white);
}
.drop-follow-card__cta--facebook .drop-follow-card__kicker,
.drop-follow-card__cta--facebook .drop-follow-card__label {
    color: var(--wp--preset--color--brand-navy);
}
/* "Latest news" section rule - grid-column:3, row:2, align-self:end so
   it hugs the card beneath it (row 3) rather than centring in the
   leftover space between the follow card and that card. */
.drop-home-section-rule {
    grid-column: 3;
    grid-row: 2;
    align-self: end;
}
.drop-home-section-rule__stripe {
    height: 8px;
    --air-pitch: 10px;
    background-image: var(--airmail);
}
.drop-home-section-rule__row {
    align-items: baseline !important;
    gap: 12px;
    border-bottom: 2px solid var(--wp--preset--color--brand-navy);
    padding: 14px 0 11px;
}
/* 2026-10-14: "Follow us" and "Latest news" share ONE heading style (the
   section-label face: narrow, tracked, navy). The earlier 40px display
   heading on the follow card out-shouted the featured headline and made
   the two stacked sidebar headings read as different systems. */
.drop-home-section-rule__label,
.drop-follow-card__heading {
    font-family: var(--font-narrow);
    font-weight: 700;
    font-size: 1.9663rem; /* 2026-10-14: was 1.375rem, +30% then +10% */
    letter-spacing: 0; /* 2026-10-14: was 0.09em */
    text-transform: uppercase;
    color: var(--wp--preset--color--brand-navy);
    white-space: nowrap;
    margin: 0;
}
.drop-home-section-rule__link {
    margin: 0;
    white-space: nowrap;
}
.drop-home-section-rule__link a {
    font-family: var(--font-narrow);
    font-weight: 700;
    font-size: 0.6875rem;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: var(--wp--preset--color--brand-red);
    text-decoration: none;
}
.drop-home-section-rule__link a:hover,
.drop-home-section-rule__link a:focus-visible {
    text-decoration: underline;
}
/* The query block and its post-template are both flattened with
   `display:contents` so their real DOM children - the `<li class="
   wp-block-post">` cards - become direct children of `.drop-home-grid`'s
   own grid and take part in ITS auto-placement, instead of the query
   block laying out a second, separate grid/flex row inside a single
   grid cell. This is the mechanism the handoff's "one CSS grid" note
   depends on; without it the cards would render as their own indented
   sub-grid, one cell wide. `display:contents` drops the element from
   layout but keeps its children's DOM order and any their own CSS -
   safe here since neither the query wrapper nor the post-template ever
   carried visual styling of their own on this page. */
.drop-home-grid .wp-block-query,
.drop-home-grid .wp-block-post-template {
    /* !important - WP's own generated layout-support CSS for the query/
       post-template blocks (`.is-layout-flex`/`.is-layout-grid` etc.)
       ties this selector on specificity; without it, source order alone
       decides the winner and this structural mechanism (the whole "one
       CSS grid" idea, README §4) would be silently defeated on any
       enqueue-order change. */
    display: contents !important;
}
/* First card of the 10 (this page's first query result) - grid-column:3,
   row:3, directly under the follow card. Cards 2-10 auto-place into
   rows 4-6 across all three columns (9 cards / 3 columns = exactly 3
   full rows - the reason the per-page count is 10, not fewer/more; see
   front-page.html's own comment). "No top rule" exception - the section
   rule immediately above this card already provides that line, so a
   second one here would double it. */
.drop-home-grid .wp-block-post-template > li:first-child {
    grid-column: 3;
    grid-row: 3;
}
.drop-home-grid .wp-block-post-template > li {
    border-top: 2px solid var(--wp--preset--color--brand-navy);
    padding-top: 16px;
}
.drop-home-grid .wp-block-post-template > li.is-sponsored {
    border-top-color: var(--wp--preset--color--brand-red);
}
.drop-home-grid .wp-block-post-template > li:first-child {
    border-top: none;
    padding-top: 0;
}
/* Pagination row - handoff §5: full 3-column width, hairline navy rule
   above, generous top margin separating it from the last card row. */
.drop-home-grid .drop-home-pagination {
    grid-column: 1 / -1;
    border-top: 2px solid var(--wp--preset--color--brand-navy);
    margin-top: 44px;
    padding-block: 20px 0;
}
@media (max-width: 1199px) {
    .drop-home-grid {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }
    .drop-featured-carousel {
        grid-column: 1 / 3;
        grid-row: 1;
    }
    /* Resolved 2026-09-19, two passes. FIRST attempt put the follow card
       and "Latest news" side by side, each getting half the grid width -
       the section rule's own stripe only ran under its own half,
       lopsided against the follow card's plain top rule. SECOND attempt
       (Daniel's screenshot) promoted the section rule to full width
       ABOVE the follow card - closer, but then flagged again live: put
       the follow card ABOVE "Latest news" instead, full width, with its
       own heading+blurb on the left and the two CTA tiles on the right
       (rather than the mobile-style stacked layout), so the card grid
       below can "cascade evenly" in a plain 2-up flow with no special-
       cased first card sharing a row with anything. Landed here:
       featured -> follow card (full width, internal left/right split,
       see the min/max-width rule further down) -> section rule (full
       width) -> cards, 2-up, no exceptions. */
    .drop-follow-card {
        grid-column: 1 / 3;
        grid-row: 2;
        align-self: auto;
    }
    .drop-home-section-rule {
        grid-column: 1 / 3;
        grid-row: 3;
    }
    /* No card shares a row with the follow card any more at this
       breakpoint (it's a full-width row of its own now), so the
       explicit grid-column:3/row:3 placement from the 3-column desktop
       rule needs resetting - left alone it would open a phantom 3rd
       column on this 2-column grid. Specificity note: the desktop rule
       this overrides is itself `li:first-child` (0,3,1) - a bare `> li`
       reset here (0,2,1) is LOWER specificity and silently loses despite
       being later in the cascade (found live: card 1 kept grid-column:3
       after a first attempt at this reset used the bare form). Must
       match `:first-child` explicitly to actually win. */
    .drop-home-grid .wp-block-post-template > li:first-child {
        grid-column: auto;
        grid-row: auto;
    }
    /* "No top rule" now applies to the whole FIRST ROW of cards (the
       first two, at 2-up), not just the literal first-child - found live
       (Daniel's screenshot) as a double line: the section rule's own
       border-bottom sits directly above this row, so if only the first
       card skipped its own top rule the second card in that same row
       would still draw one, an asymmetric half-fix. Both skip it, same
       "the rule above already provides this line" reasoning as the
       desktop version, just applied to a full row instead of one card. */
    .drop-home-grid .wp-block-post-template > li:nth-child(-n+2) {
        border-top: none;
        padding-top: 0;
    }
    .drop-featured-story__title {
        font-size: 2.25rem;
    }
    .drop-featured-story__standfirst {
        font-size: 1.125rem;
    }
}
/* Follow card's internal layout, THIS breakpoint only (900-1199px) -
   heading+blurb left, the two CTA tiles right, per Daniel's explicit
   request ("heading and text on left, then the 2 boxes to the right").
   Deliberately NOT reused at <900px - the mobile spec (README's own
   Responsive behavior table) keeps the simple stacked layout there
   ("the follow card's two CTA tiles stay side by side" is the only
   mobile requirement, already true of the base/mobile CSS regardless
   of this rule), and this scoped min/max-width range is what keeps this
   split from leaking down to mobile without a separate override. */
@media (min-width: 900px) and (max-width: 1199px) {
    .drop-follow-card {
        display: grid;
        grid-template-columns: minmax(0, 1fr) auto;
        column-gap: 32px;
        align-items: center;
    }
    .drop-follow-card__head {
        grid-column: 1;
        grid-row: 1;
    }
    .drop-follow-card__blurb {
        grid-column: 1;
        grid-row: 2;
    }
    .drop-follow-card__ctas {
        grid-column: 2;
        grid-row: 1 / 3;
        width: 400px;
        margin-top: 0;
    }
    .drop-follow-card::before {
        right: 390px;
    }
}
@media (max-width: 899px) {
    .drop-home-grid {
        grid-template-columns: 1fr;
    }
    .drop-featured-carousel,
    .drop-follow-card,
    .drop-home-section-rule,
    .drop-home-grid .wp-block-post-template > li:first-child {
        grid-column: 1;
        grid-row: auto;
    }
    .drop-featured-story__title {
        font-size: 1.875rem;
    }
    .drop-featured-story__standfirst {
        font-size: 1.0625rem;
    }
    .drop-card-title {
        font-size: 1.3125rem;
    }
}
@media (max-width: 599px) {
    .drop-featured-story__title {
        font-size: 1.625rem;
    }
    .drop-featured-story__head,
    .drop-featured-story__link {
        padding-left: 20px;
        padding-right: 20px;
    }
    .drop-featured-carousel__controls {
        padding: 0 20px 20px;
    }
    .wp-block-post-excerpt__excerpt {
        font-size: 1rem;
    }
}
/* Sidebar column grows to fill the stretched hero-row height, then its
   two nested boxes (the grey panel, then the LinkedIn tile inside it)
   each grow to fill THEIR parent in turn, so the navy tile's own
   background is what visibly reaches the featured story's height - not
   just an invisible box around it. Shared with `.drop-home-layout`'s
   OWN sidebar (parts/sidebar.html is the same template part either
   way) - harmless there: that row is never stretched (align-items:
   flex-start), so these rules have no extra space to distribute and
   change nothing visually on the alt template. */
.drop-home-layout__sidebar {
    display: flex;
}
.drop-home-sidebar-panel {
    display: flex;
    flex-direction: column;
    flex: 1;
}
.drop-house-ad {
    flex: 1;
    justify-content: center; /* centres title/body/CTA in the taller box
        until there's a real content decision for filling it - easy to
        swap for flex-start or a top/bottom split later. */
}

/* Only .drop-sidebar__related still gets a default grey box of its own
   (single-sidebar.html's Latest/Related section, canceled back to
   transparent by the panel-scoped override below - kept that way so
   the override rule below still makes sense at a glance). Every other
   .drop-sidebar__X class (linkedin/partners/slider/banner) now always
   lives inside a continuous panel (.drop-single-sidebar-panel or
   .drop-home-sidebar-panel below) that owns the background/padding
   itself, so none of them need their own box anymore.
   .drop-sidebar__cta/__directory/__instagram removed from here
   2026-08-27 - all three fully dead across the theme (Corporate
   Directory teaser + Instagram feed/LinkedIn button removed from
   parts/sidebar.html the same day; __instagram had already lost its
   single-sidebar.html use-site earlier the same session; __cta was
   already unused before either change). */
.drop-sidebar__related {
    background-color: var(--wp--preset--color--surface);
    padding: 1.25rem;
}
/* ── Single-post sidebar: ONE continuous grey panel (2026-08-24,
   Daniel's correction) - Featured Article, Latest/Related, Partner
   ads, and the LinkedIn banner all sit inside .drop-single-sidebar-panel
   now, not four separate grey boxes with white gaps between them. */
.drop-single-sidebar-panel {
    background-color: var(--wp--preset--color--surface);
    padding: 1.25rem;
}
.drop-single-sidebar-panel .drop-sidebar__related {
    background-color: transparent;
    padding: 0;
}
/* .drop-sidebar__banner img sizing rule REMOVED 2026-08-28 (ribbon
   refinements pass) - that wrapper's raster LinkedIn banner was
   replaced by the drop-house-ad pattern (see that component's own rule
   further down this file); nothing here still carries a bare <img>. */

/* ── Homepage sidebar: ONE continuous grey panel (2026-08-27, Daniel's
   request - previously four/three separate grey boxes with white gaps
   between them, same layout .drop-single-sidebar-panel replaced on the
   single-post page on 2026-08-24; homepage now gets the identical
   treatment under its own class since the two files' panels are never
   nested inside each other and don't need to share a selector). */
.drop-home-sidebar-panel {
    background-color: var(--wp--preset--color--surface);
    padding: 1.25rem;
}
/* .drop-sidebar__linkedin img sizing rule REMOVED 2026-08-28 (ribbon
   refinements pass) - same replacement as the single-post sidebar's
   .drop-sidebar__banner above, see drop-house-ad's own rule. */
/* .drop-sidebar__partners:empty / .drop-divider:has(...) guard rules
   REMOVED (Daniel's request, 2026-09-18) - both existed only to hide a
   dangling empty ad-list box; the ad-list unit itself is gone from
   both sidebars now, so there's nothing left for either selector to
   ever match. */

/* ── Single-post 2-column layout (2026-08-22 overhaul - structure
   pass; exact sidebar content/design is a later pass) ──────────────── */
.drop-single-layout {
    /* Same gap as .drop-home-layout above - never capped at the site's
       content width, for the same reason (2026-08-22 fix). */
    max-width: var(--wp--style--global--content-size, 1310px);
    margin-inline: auto;
    align-items: flex-start;
    gap: var(--drop-column-gap);
}
.drop-single-layout__main {
    flex: 2 1 0%;
    min-width: 0;
}
.drop-single-layout__sidebar {
    /* Widened 2026-08-23 (was 3:1, ~312px at desktop widths) - it's a
       premium advertising spot (same day's sidebar-column decision
       above), and the ad creative was cramped at the old width. */
    flex: 1 1 0%;
    min-width: 320px;
}
/* 2026-08-23, design review - tried reflowing this sidebar to a
   full-width row below the article (it naturally ends after ~875px of
   real content while a typical article runs to 3900px+, leaving a
   long empty rail beside the remainder - confirmed live,
   `align-items:flex-start` was already correct, never a stretch bug,
   just a genuine content-length mismatch). Reverted same day - Daniel
   flagged the sidebar as a premium advertising spot that needs to stay
   a visible side column, not get pushed below the fold with the rest
   of the article. Doesn't need to be sticky, just needs to stay a
   column. The empty-rail whitespace on longer articles is therefore a
   known, accepted trade-off, not something still open to fix. */
@media (max-width: 800px) {
    .drop-single-layout {
        flex-wrap: wrap;
    }
    .drop-single-layout__main,
    .drop-single-layout__sidebar {
        flex-basis: 100%;
    }
}

/* ── Centred column pair, 29 Aug (reading-tier pass, Daniel's call,
   measured live at 1536px) - at 831px main / 415px sidebar, the flex
   layout above left a 319px gap between text and sidebar (flex's
   default `justify-content: normal` just leaves unclaimed space
   trailing on the right, it doesn't redistribute it). Two changes
   together fix this: the reading tier above widens the article column
   (576px -> 648px) so less space goes unclaimed to begin with, and this
   rule switches the wrapper to CSS grid so the leftover can be
   distributed as symmetric outer margins via `justify-content: center` -
   flex has no equivalent to grid's `justify-content` acting on the
   TRACKS as a unit; it only ever distributes space between/around
   flex ITEMS, which isn't the same thing once there are only two.
   `body.single`-scoped (this pass's whole reading-tier change is
   deliberately scoped there, see the AMENDMENT note near the top of
   this file) even though `.drop-single-layout` only ever appears on
   single templates anyway - matches the brief's own selector, costs
   nothing, and makes the scoping intent explicit at the point of use.
   Two-tier breakpoint structure, checked against the REAL existing
   stack point (800px, immediately above) rather than the round 1024px
   the brief assumed: 800-1279px keeps the pair flush-left
   (`justify-content: start`, "fills the container"); >=1280px centres
   it. 1280px isn't arbitrary either - `--drop-column-gap`
   (`clamp(2rem, 5vw, 4rem)`) reaches its 4rem/64px ceiling exactly at
   5vw = 64px, i.e. at a 1280px viewport, matching the brief's target
   64px gap precisely with NO separate gap override needed here; below
   1280px the same token already tapers down on its own, which the
   brief's own spec only pins a value for at >=1280px anyway.
   `grid-template-columns: minmax(0, 40.5rem) minmax(300px, 415px)` -
   40.5rem (648px) is the SAME token-free literal used for the H1/
   featured-image/card-meta caps above, for the same one-column-one-edge
   reason; the sidebar's `minmax(300px, 415px)` keeps its existing
   320px-ish floor (300px, close enough to the current 320px min-width)
   while capping at its current 415px width - unchanged from the flex
   version, just expressed as a grid track instead of a flex-basis.
   `align-items: flex-start` (already set above, shared with the flex
   rule - grid accepts the flexbox legacy alignment keywords as
   equivalent to `start`) keeps the sidebar's top aligned with the H1's
   top; nothing new needed for that specific criterion.
   The existing `.drop-single-layout__main`/`__sidebar` flex properties
   (`flex: 2 1 0%` etc., above) are simply IGNORED by a grid parent, not
   removed - still load-bearing at <800px, where this whole block
   doesn't apply and the layout is still the original flex-wrap stack. */
@media (min-width: 800px) {
    body.single .drop-single-layout {
        display: grid;
        grid-template-columns: minmax(0, 40.5rem) minmax(300px, 415px);
        justify-content: start;
    }
}
@media (min-width: 1280px) {
    body.single .drop-single-layout {
        justify-content: center;
    }
}

/* ── Single-post title (2026-08-27 - the old `.drop-single-kicker`
   date-above-title treatment was retired the same day the header was
   rebuilt to mimic the card-grid's meta line: title first, then a
   combined category+date `.drop-card-meta` row below it, see
   single-post-body.html. `margin-top: 0` zeroes the title's own natural
   heading margin now it's the first child (no longer needed to fight
   WP's injected flow margin against a preceding kicker, which is gone -
   still needed regardless, or the browser's default h1 top margin would
   show). `margin-bottom: 0` is new the same pass - h1's ~21px UA-default
   bottom margin would otherwise WIN the collapse against
   `.drop-card-meta`'s own 0.5rem top margin below it (larger of the two
   wins, not the second element's alone - the same collapse trap already
   documented on `.drop-card-title` above), leaving the meta row's own
   margin as the sole, unopposed owner of that gap. */
.drop-single-title {
    margin-top: 0;
    margin-bottom: 0;
}

/* ── Blockquote style (2026-08-23, design review - quotes in existing
   content were plain unstyled paragraphs; this styles real
   core/quote blocks going forward). Red as a border, not text colour -
   same reasoning as the archive-title divider: decorative, not text,
   so it doesn't touch the flagged red-text-contrast issue. */
.wp-block-post-content blockquote {
    border-inline-start: 4px solid var(--wp--preset--color--brand-red-flat);
    padding-inline-start: 1.25rem;
    margin-inline-start: 0;
    /* Reading face, italic, larger than body copy (2026-08-28 typography
       pass) - was plain italic in the sitewide default face at body size;
       colour moved from brand-navy to ink-heading to match the rest of
       the new heading/emphasis ramp.
       1.35rem -> 1.25rem (body-copy standard, 2026-08-28 later still,
       FLAGGED not silently changed) - 1.35rem was a deliberate 1.2x step
       above the OLD 18px body (21.6/18 = 1.2). Against the new 16px base
       it had quietly become a 1.35x step (21.6/16), reading proportionally
       louder without anyone deciding that. 1.25rem restored something
       closer to the original relationship (20/16 = 1.25 vs the old 1.2)
       for the contexts that stayed at 16px.
       RESOLVED 29 Aug (reading-tier pass) for `body.single` specifically -
       Daniel's call, no longer an open recommendation there: now that
       `body.single .wp-block-post-content` is back to 18px, 1.35rem is
       AGAIN the correct 1.2x step (21.6/18 = 1.2), so it returns via the
       scoped override just below, single-post-only. This bare rule
       itself stays at 1.25rem, still correct for every context that's
       still 16px (Pages, hubs) - reverting IT to 1.35rem would have
       quietly reintroduced the exact 1.35x-against-16px problem this
       comment describes, just on a different set of pages than before. */
    font: italic 400 1.25rem/1.4 var(--wp--preset--font-family--body);
    color: var(--wp--preset--color--ink-heading);
}
body.single .wp-block-post-content blockquote {
    font-size: 1.35rem; /* 29 Aug, reading-tier pass - see the comment
        above. line-height stays the shorthand's own unitless 1.4, which
        recomputes against this new font-size automatically (21.6 * 1.4),
        no separate override needed. */
}

/* ── Card image aspect-ratio safety net (2026-08-23, design review -
   found a real stale-derivative bug live: `drop-card` is registered as
   a 800x450 HARD crop, but at least one attachment was still serving
   its old 800x425 derivative and others were falling back to an
   entirely different, un-cropped size (768x432 source), producing
   misaligned row heights in the grid. The real fix is regenerating
   those specific attachments' metadata (done separately, not a CSS
   job) - this is the belt-and-suspenders half: forces every card image
   to the same visual ratio regardless of which derivative actually
   got served, so a future stale file can't misalign a row again. */
.drop-card-media img {
    aspect-ratio: 16 / 9;
    object-fit: cover;
    width: 100%;
    height: auto;
    border: 1px solid var(--wp--preset--color--divider); /* 2026-08-24,
        design-review request - a thin frame so cards read as a
        consistent grid even when the underlying photos vary wildly in
        colour/contrast against the page background. */
    transition: transform 0.4s ease;
}
/* Fallback thumbnail for posts with no featured image - REBUILT
   2026-08-28 later still (external review adoption, 28 Aug - Daniel
   approved four of its items). See the render_block_core/post-featured-
   image filter's own comment in plugins/drop-blocks/drop-blocks.php for
   the full before/after reasoning. Same 16:9 box as a real card image
   so a missing photo doesn't collapse or misalign the row; navy ground
   + the masthead's own bird/postmark assets turn the defect into brand
   surface, replacing the old quiet grey-box-plus-icon placeholder that
   read as broken markup when several appeared together in a grid.
   Deliberately NO border/frame (unlike a real card image, which gets
   one) - this is a designed brand tile, not a photo needing a frame to
   read as part of the grid.
   Deliberately NO ribbon - the ribbon set is frozen (thedrop-decisions.
   md) and "never on cards" is one of its own rules; this tile recurs
   through a grid the way a single card never does, so a ribbon here
   would spend the ribbon's scarcity by the back door. Bird + postmark
   on brand navy alone reads as "The Drop", not "missing image", without
   needing it. */
.drop-card-fallback {
    aspect-ratio: 16 / 9;
    width: 100%;
    background: var(--wp--preset--color--brand-navy);
    position: relative;
    overflow: hidden;
}
.drop-card-fallback img {
    position: absolute;
    pointer-events: none;
}
.drop-card-fallback__bird {
    left: 24px;
    bottom: -6px;
    height: 72%;
    width: auto;
    opacity: 0.9;
}
.drop-card-fallback__postmark {
    right: 18px;
    top: 50%;
    transform: translateY(-50%);
    height: 115%;
    width: auto;
    opacity: 0.16;
}
/* Bird-position alternation (external review's own suggestion, verified
   necessary live on IGT Academy's real imageless-post run - the largest
   concentration of fallback tiles on this site, confirmed via a DB
   query before shipping this, not assumed): with every tile identical,
   several adjacent in one grid row read as a repeated rendering fault
   rather than a deliberate brand tile. Odd tiles keep the design's own
   default (bird left, postmark right); even tiles mirror both to the
   opposite side, so the pair trades sides rather than one mark ever
   disappearing behind the other. */
.wp-block-post:nth-child(even) .drop-card-fallback__bird {
    left: auto;
    right: 24px;
}
.wp-block-post:nth-child(even) .drop-card-fallback__postmark {
    right: auto;
    left: 18px;
}
/* Excerpt clamp (2026-08-24, design-review pass) - part of the same
   row-alignment fix as the title clamp above; WP core's post-excerpt
   block renders the actual text in .wp-block-post-excerpt__excerpt.
   font-size/line-height made EXPLICIT here (2026-08-28, found live -
   Latest News read 18px/1.66 while an identical card on a category
   archive read 16px/1.6). This element never had its own size; it was
   silently inheriting whatever ambient font-size cascaded from its
   container - the sitewide base (16px/1.6, no .wp-block-post-content
   ancestor) on front-page.html/index.html, but 18px/1.66 wherever the
   exact same card markup happens to sit inside a `.wp-block-post-
   content` wrapper instead (Latest News page, IGT post grid) - that
   rule's own 18px/1.66 is meant for single-article reading prose, not
   an ambient default every descendant should pick up. Pinned to the
   sitewide base (the majority case - homepage + every category/tag
   archive) so the card component reads identically everywhere it's
   used, regardless of which template happens to wrap it. */
.wp-block-post-excerpt__excerpt {
    font-size: 1rem;
    line-height: 1.6;
    display: -webkit-box;
    -webkit-line-clamp: 3;
    -webkit-box-orient: vertical;
    overflow: hidden;
}

/* ── Pagination (2026-08-23, design review - links measured 9x19px,
   far under the 24x24 WCAG 2.2 AA target-size minimum and low-
   prominence for a primary navigation action). Boxed like the chip
   component's border language, but distinct (square corners, larger)
   so it doesn't read as another category tag. */
.wp-block-query-pagination {
    gap: 0.5rem;
    align-items: center;
}
.wp-block-query-pagination-previous,
.wp-block-query-pagination-next,
.wp-block-query-pagination-numbers a.page-numbers,
.wp-block-query-pagination-numbers span.page-numbers {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 40px;
    min-height: 40px;
    padding-inline: 0.5rem;
    border: 1px solid var(--wp--preset--color--ink-muted);
    color: var(--wp--preset--color--ink-heading);
    text-decoration: none;
    font-size: var(--wp--preset--font-size--small);
}
.wp-block-query-pagination-previous:hover,
.wp-block-query-pagination-next:hover,
.wp-block-query-pagination-numbers a.page-numbers:hover {
    border-color: var(--wp--preset--color--brand-navy);
    background: var(--wp--preset--color--surface);
}
.wp-block-query-pagination-numbers span.page-numbers.current {
    background: var(--wp--preset--color--brand-navy);
    border-color: var(--wp--preset--color--brand-navy);
    color: var(--wp--preset--color--white);
}

/* ── Social icon tap target (2026-08-23, design review - 18px icons
   with no padding measure well under the 24x24 minimum). Padding only,
   no size/position change to the icon itself - review noted the
   surrounding padding budget was already fine, just not applied to
   the link's own hit area. Selector followed the icons into the footer
   2026-08-28 (search feature). */
.site-footer__social a {
    padding: 4px;
}

/* drop-latest-posts (2026-08-24) shares this exact treatment - same
   selector list rather than a duplicated block, so the two sidebar
   lists (Related / Latest) always look identical. */
.drop-related-posts,
.drop-latest-posts {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
}
/* 2026-08-24, Daniel's request - tighter overall: smaller title text
   (was un-set, inheriting the 1rem body size), and the thumbnail
   brought to the same 16:9 ratio as the card grid (.drop-card-media
   img) rather than its own one-off 80x60 (4:3) box, for visual
   consistency between the sidebar lists and the archive/homepage
   cards. Title re-centred against the image (2026-08-24 same-day
   follow-up - top-align tried first, Daniel asked to revert). Thin
   divider between items (2026-08-24) - the list is tight enough now
   (0.75rem gap) that item boundaries benefit from a visible seam, not
   just whitespace; skips the last item so it doesn't double up against
   the box's own bottom padding. */
.drop-related-posts__item a,
.drop-latest-posts__item a {
    display: flex;
    align-items: center;
    gap: 0.625rem;
    text-decoration: none;
    color: var(--wp--preset--color--ink-heading);
}
.drop-related-posts__item,
.drop-latest-posts__item {
    padding-bottom: 0.75rem;
    border-bottom: 1px solid var(--wp--preset--color--divider);
}
.drop-related-posts__item:last-child,
.drop-latest-posts__item:last-child {
    padding-bottom: 0;
    border-bottom: none;
}
.drop-related-posts__body,
.drop-latest-posts__body {
    display: flex;
    flex-direction: column;
    gap: 0.2rem;
}
/* Date kicker (2026-08-24, Daniel's request: "small red date in
   lighter font") - same --highlight-dark red as the single-post
   kicker for consistency. Was ALSO deliberately not bold and not
   uppercase ("a lighter touch appropriate to a secondary sidebar
   list") - that specific decision is REVERSED 30 Aug (Round Three
   review, one-date-voice-sitewide pass): this was rendering "August
   23, 2026" at 10px/lowercase beside a main meta row reading "23 Aug
   2026" in caps - two different date treatments on one page. Family/
   weight/case/tracking/size now match `.wp-block-post-date` exactly,
   per the brief's own explicit list; COLOUR is deliberately left as
   brand-red, NOT changed to `.wp-block-post-date`'s ink-muted - the
   brief enumerated family/case/tracking/size specifically and didn't
   name colour, and the red here has its own separate, still-valid
   reason (matching the single-post kicker, not the date). Flagged in
   the summary in case "one date voice" was meant to include colour
   too. */
.drop-related-posts__date,
.drop-latest-posts__date {
    display: block;
    font-family: var(--font-stamp); /* was unset - found in the same
       serif-drift sweep (article-refinements pass, 2026-08-28 later
       still); the STAMP face specifically, not the plain display one -
       matches this site's existing convention that dates go through
       --font-stamp (.wp-block-post-date, card-meta) wherever they
       appear, not just the display family every other UI label uses. */
    font-size: 0.6875rem; /* 11px - was 0.625rem (10px), the brief's own
        "raise 10px -> 11px minimum" */
    font-weight: 700; /* was 400 - matches .wp-block-post-date's shared
        `font: 700 12px/1.3 var(--font-stamp)` weight */
    text-transform: uppercase; /* was none */
    letter-spacing: 0.06em; /* was none - matches .wp-block-post-date's
        own letter-spacing exactly (not .eyebrow/.partner-chip's 0.14em,
        a different stamp consumer with its own tracking value) */
    color: var(--wp--preset--color--brand-red);
}
.drop-related-posts__title,
.drop-latest-posts__title {
    /* Family swapped Narrow -> Archivo 29 Aug (headline/label split
       pass) - was `var(--wp--preset--font-family--display-narrow)`, set
       when this rule was written for the "serif is for sentences,
       display is for everything else" split (article-refinements pass,
       2026-08-28); Narrow has since become the caps-label-only face, and
       these are sentence-case module titles, not labels. Size (13px)
       kept as-is per the brief - regular width shows slightly fewer
       characters before the clamp than condensed did, which is fine. */
    font-family: var(--font-display);
    letter-spacing: 0.02em; /* the CMS renders these ALL CAPS via
       text-transform elsewhere - wait, these are NOT text-transformed
       (title case titles, not caps) - tracking still added per the
       brief's own instruction, kept modest since it isn't compensating
       for an actual uppercase transform here. */
    font-size: 0.8125rem;
    line-height: 1.3;
    font-weight: 700;
}
.drop-related-posts__item img,
.drop-latest-posts__item img {
    width: 90px;
    aspect-ratio: 16 / 9;
    height: auto;
    object-fit: cover;
    flex-shrink: 0;
}
/* Heading-to-list gap (2026-08-24, Daniel's request) - explicit two-
   class selector (0,2,0), not a bare .drop-related-posts rule, because
   a single-class selector TIES WP's injected blockGap margin-top
   (:where(.is-layout-flow) > * + *) on specificity and consistently
   loses on source order - the account's own documented "always two
   classes" tripwire. Heading's own default margin-bottom zeroed so
   this margin-top is the sole, unambiguous owner of the gap (adjacent
   block margins collapse to the larger of the two otherwise). */
.drop-sidebar__related h3 {
    margin-bottom: 0;
}
.drop-sidebar__related .drop-related-posts,
.drop-sidebar__related .drop-latest-posts {
    margin-top: 1rem;
}
/* "View all" CTA under each list (2026-08-24, Daniel's request) - same
   small/bold/arrow treatment as .drop-card-readmore elsewhere on the
   site, for visual consistency between the two "keep reading" affordances.
   Two-class margin-top for the same blockGap-tie reason documented
   above - this <a> is a direct sibling of the <ul> inside the same
   flow-layout group (the block's render_callback output isn't wrapped
   in its own div), so it's just as exposed to the tie as the list
   itself was. */
.drop-sidebar__viewall {
    display: inline-block;
    font-size: var(--wp--preset--font-size--small);
    font-weight: 700;
    text-decoration: none;
}
.drop-sidebar__related .drop-sidebar__viewall {
    margin-top: 0.75rem;
}
.drop-sidebar__viewall::after {
    content: " \2192"; /* → */
}
.drop-sidebar__viewall:hover {
    text-decoration: underline;
}

/* .drop-partner-list (drop/ad-unit-list block) REMOVED (Daniel's
   request, 2026-09-18) - the block that emitted it was removed from
   both sidebars (its only two placements), see plugins/drop-blocks.php. */

/* ── drop/featured-article (2026-08-24, Daniel's request) - sponsored/
   paid placement, top of the single-post sidebar. Deliberately styled
   like the site's real card component (same 16:9 image ratio as
   .drop-card-media, same title/readmore visual language) rather than
   a distinct "ad" look - a paid placement earns its keep by reading as
   a real featured story, not by looking like a banner. The one visual
   difference is the sponsor label above the image - the actual
   disclosure, not just a style choice.
   2026-08-24, second correction - this no longer owns its own grey
   background/padding at all (that moved to the outer
   .drop-single-sidebar-panel wrapper, see below and single-sidebar.html -
   Daniel's real ask was one continuous grey sidebar, this card is just
   the top of it, not its own separate box). White text panel is BACK
   (his second correction reversed the first "no, just plain text on
   grey" pass) but flush against the image this time - no gap between
   image and white panel, the gap only exists WITHIN the white panel
   (its own padding) between the panel's top edge and the title text.
   2026-08-27, gap-above-label fix - the card div's `is-section` class
   (removed in drop-blocks.php) was applying the page-level
   `--drop-section-pad` (32-50px) as its heading-to-label gap, a
   section-rhythm value with no business inside a small sidebar card.
   Card-scale padding now lives here instead. */
.drop-featured-article {
    padding-top: 0.75rem;
}
.drop-featured-article__label {
    display: block;
    font-family: var(--font-display); /* was unset - same serif-drift
       sweep as .drop-post-nav__label above (article-refinements pass,
       2026-08-28 later still); another uppercase UI label, not named in
       the brief but the identical drift. */
    font-size: 0.6875rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--wp--preset--color--ink-muted);
    margin-bottom: 0.5rem;
}
.drop-featured-article__link {
    display: block;
    text-decoration: none;
    color: var(--wp--preset--color--ink-heading);
    overflow: hidden; /* 2026-08-27 - required for the image hover-zoom
        below, crops the scaled image to the card edge instead of
        spilling into the white body panel underneath it. Harmless on
        the title's own copy of this class (no overflow to clip). */
}
/* Hover/focus states added 2026-08-27 (Daniel's request). Underline on
   the link itself, same "no rest-state decoration, visible on
   interaction" convention as .drop-card-title a in the card grid -
   only shows visually on the title link (the image link has no text to
   underline). */
.drop-featured-article__link:hover,
.drop-featured-article__link:focus-visible {
    text-decoration: underline;
}
.drop-featured-article__image {
    display: block;
    width: 100%;
    aspect-ratio: 16 / 9;
    object-fit: cover;
    height: auto;
    transition: transform 0.4s ease; /* same duration/easing as the
        card-grid's image zoom (.drop-card-media img); killed globally
        by the sitewide prefers-reduced-motion rule below, no separate
        override needed here. */
}
/* Subtle hover/focus zoom on the featured-article image (2026-08-27,
   Daniel's request) - mirrors .drop-card-media's hover-zoom in the card
   grid. :focus-within covers keyboard nav onto the image link, not just
   mouse hover. */
.drop-featured-article__link:hover .drop-featured-article__image,
.drop-featured-article__link:focus-within .drop-featured-article__image {
    transform: scale(1.06);
}
.drop-featured-article__body {
    background-color: var(--wp--preset--color--white);
    padding: 1rem;
    margin-top: 0; /* flush against the image - the panel's own top
        padding is what creates breathing room around the title, not a
        gap between the image and the panel itself. */
}
.drop-featured-article__title {
    display: block;
    /* Family swapped Narrow -> Archivo 29 Aug (headline/label split
       pass), same reasoning as .drop-related-posts__title/.drop-latest-
       posts__title above - this is a sentence-case title, not a caps
       label, and Narrow is now exclusively the latter. Size kept as-is
       per the brief. */
    font-family: var(--font-display);
    letter-spacing: 0.02em;
    font-size: 1.125rem;
    font-weight: 700;
    line-height: 1.25;
}
/* .drop-featured-article__excerpt and the "Read more" link were removed
   2026-08-27 (Daniel's request) - card is now image + headline only.
   .drop-card-readmore/.drop-featured-article__readmore shared rule
   further down keeps .drop-card-readmore for the still-live card grid. */

/* ── drop/divider (2026-08-24) - see the block's own PHP doc comment
   for the full rationale. Flex so the two line segments always fill
   whatever space is left either side of the icon, regardless of the
   container's width. Type+class selector for margin (div.drop-divider,
   0,1,1) - beats WP's injected blockGap margin-top outright rather
   than tying it, the same reasoning as every other blockGap fix this
   session, but doesn't need a parent-scoped selector since this block
   gets dropped into different containers across the site. */
div.drop-divider {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    margin-block: 2rem 1.5rem;
}
.drop-divider__line {
    flex: 1 1 auto;
    height: 1px;
    background: var(--wp--preset--color--divider);
}
.drop-divider__icon {
    flex: 0 0 auto;
    width: 20px;
    height: 20px;
    color: var(--wp--preset--color--ink-muted);
}

/* ── Plain hairline (dividers-removal pass, 2026-08-28 later still) -
   the fallback the brief itself specified: "if any spot truly collapses
   without it, use a plain 1px --divider hairline, no icon". Used in
   exactly ONE place sitewide (single-sidebar.html, between the Related/
   Latest Articles list and the Partner-ads section) - the one spot with
   no heading on either side to carry the section break on its own. A
   core/separator block (`<hr>`), not a second div.drop-divider - the
   brief's whole point was that div.drop-divider's icon read as
   decoration nobody registered; a plain rule doesn't repeat that. */
.drop-hairline {
    border: none;
    border-top: 1px solid var(--wp--preset--color--divider);
    height: 0;
    margin-block: 1.5rem;
}

/* ── Prev/Next post nav (drop/post-nav block, 2026-08-24) - originally
   had no top margin/padding of its own because the drop/divider
   immediately above it owned the section-break line AND the spacing
   (avoiding a real "two owners" stack). REAL GAP, caught and fixed in
   the SAME pass that removed that divider (dividers-removal pass,
   2026-08-28 later still), not left as a silent regression - with the
   divider gone, this element had NO spacing owner left at all, not "one
   owner instead of two", and would have sat flush against the newsletter
   unit above it with nothing but ambient blockGap between them.
   margin-block-start restored here as the sole owner now - a plain
   margin, not a divider's margin-bottom, but the same rhythm scale. */
.drop-post-nav {
    display: flex;
    justify-content: space-between;
    gap: 1rem;
    margin-block-start: 2rem;
}
.drop-post-nav__link {
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
    max-width: 48%;
    text-decoration: none;
    color: var(--wp--preset--color--ink-heading);
}
.drop-post-nav__link--next {
    margin-inline-start: auto;
    text-align: right;
}
.drop-post-nav__label {
    font-family: var(--font-display); /* was unset - found in the same
       serif-drift sweep as the four named title classes (article-
       refinements pass, 2026-08-28 later still), not one of the four
       the brief named but the same drift: an uppercase "PREVIOUS"/"NEXT"
       label rendering in Source Serif instead of the display face. Uses
       the plain (non-narrow) display family - this is a short label, not
       a headline, matching how other UI labels on this site (nav,
       buttons) use the regular Archivo, not the narrow cut. */
    font-size: 0.8125rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--wp--preset--color--ink-muted);
}
.drop-post-nav__title {
    /* Family swapped Narrow -> Archivo 29 Aug (headline/label split
       pass) - same reasoning as the sidebar title classes above, this is
       a sentence-case title (the prev/next article's own headline), not
       a caps label. */
    font-family: var(--font-display);
    letter-spacing: 0.02em;
    font-weight: 700;
    line-height: 1.3; /* was unset (inherited the sitewide 1.6 body
       leading) - headline-retune pass, 29 Aug: the one straggler among
       the sidebar/module title group, which otherwise already sat at
       sensible sentence-case values (1.25-1.3) - matched to its
       siblings (.drop-featured-article__title etc.), not independently
       re-derived. */
}
.drop-post-nav__link:hover .drop-post-nav__title {
    color: var(--wp--preset--color--brand-red);
}
@media (max-width: 480px) {
    .drop-post-nav {
        flex-direction: column;
    }
    .drop-post-nav__link,
    .drop-post-nav__link--next {
        max-width: 100%;
        text-align: left;
        margin-inline-start: 0;
    }
}

/* ── Corporate directory list (drop/company-directory-list block) ────
   UNIFORM SCAFFOLD, 30 Aug (Directory pass) - real profiles measure
   83-272 words (3.3x variance), which read as randomly lumpy when each
   entry's actual height just follows its own copy length. Two things
   fix that TOGETHER: a fixed 2-column grid (was flex, same visual
   shape, switched to grid per the brief's own instruction) plus
   consistent block padding regardless of content, and the 6-line
   clamp + native expander further below, which is the part that
   actually stops a 272-word entry from dwarfing an 83-word one. This
   is presentational only - the full CPT rebuild stays a later phase,
   nothing here touches the underlying ACF fields/query. */
.drop-company-directory__item {
    display: grid;
    grid-template-columns: 160px 1fr; /* was flex + `flex:0 0 200px` on
        the logo - 200px -> 160px is the brief's own value, and a grid
        makes "logo column fixed, text column" a property of the PARENT
        (one place to read the two widths) rather than split across a
        flex-basis on one child and an implicit 1-auto on the other. */
    column-gap: clamp(1rem, 3vw, 2rem);
    align-items: start;
    padding-block: 2rem; /* consistent breathing room per entry
        regardless of copy length - was 0 (nothing but the hairline
        below), so a short 83-word entry and a long 272-word one sat
        flush against their neighbours at two completely different
        heights; this is the "consistent spacing" half of the brief's
        ask, the clamp below is the other half. */
    border-bottom: 1px solid var(--wp--preset--color--divider);
}
.drop-company-directory__item:first-child {
    padding-top: 0; /* don't add a gap above the very first entry that
        wasn't there before - only between/after entries. */
}
/* Mobile stack, found live at 390px while checking this pass, not in
   the brief - a fixed 160px logo column left only ~166px for the text
   column on a phone-width screen, unusably narrow. Same stacking
   convention as `.drop-company-detail-layout`/`.drop-single-layout`
   elsewhere in this file, just as a grid override instead of flex-wrap. */
@media (max-width: 480px) {
    .drop-company-directory__item {
        grid-template-columns: 1fr;
    }
    .drop-company-directory__logo {
        max-width: 160px;
    }
}
.drop-company-directory__logo img {
    width: 100%;
    height: auto;
}
/* ONE MEASURE PER ENTRY, 30 Aug (Round Three review) - was `min-width:
   0` only, no cap, so this column stretched to fill the full grid `1fr`
   track (up to 1078px on the real page) while its own intro paragraph
   stayed capped at 68ch (576px) below - narrow-then-wide inside one
   entry, confirmed live before this fix. Capping the WHOLE column here,
   not just the paragraph, means the Business Functions chips row and
   the Company Contact list now share the exact same right edge as the
   intro text, automatically - nothing else needed on those two
   elements' own rules. The grid's `1fr` text-column track (above) is
   now wider than its own content needs on most viewports; that's
   expected, not a bug - "the logo column plus this single text column
   defines the entry width" per the brief, and the item's own hairline
   (`border-bottom`, above) still runs the FULL grid width regardless,
   since it's on the grid container, not this narrower child. */
.drop-company-directory__body {
    min-width: 0;
    max-width: var(--measure);
}
/* Measure cap (body-copy standard, 2026-08-28 later still) - this
   directory's description text is NOT a direct child of `.wp-block-
   post-content` (it's nested one level deeper, inside this `__body`
   div, itself inside `.drop-company-directory__item`), so the generic
   `.wp-block-post-content > p` rule above never reaches it - confirmed
   live this was still 128 characters per line (worse than the audit's
   own 120 figure) after that rule shipped. `.drop-company-directory` is
   `display:block` - a single-column list of full-width `<article>`
   entries, not a grid/columns hub layout, so there is no multi-column
   layout here to protect the way `body.single`'s scoping protects IGT
   Connects/Corporate Directory's OWN hub structure elsewhere - capping
   the paragraph only leaves whitespace in the `__body` column, it
   doesn't reshape anything.
   CLAMPED to 6 lines, 30 Aug (Directory pass, "reads as randomly
   lumpy" fix) - `<details>/<summary>` (below) is the NATIVE, no-JS,
   keyboard-operable expander the brief specifically asked for; `:has()`
   is what wires the two together in pure CSS (removes the clamp on
   this SAME paragraph once its sibling `<details>` is opened) - no JS
   anywhere in this mechanism. */
.drop-company-directory__body > p {
    max-width: var(--measure);
    display: -webkit-box;
    -webkit-line-clamp: 6;
    -webkit-box-orient: vertical;
    overflow: hidden;
}
.drop-company-directory__body:has(.drop-company-directory__expand[open]) > p {
    -webkit-line-clamp: unset;
    overflow: visible;
}
.drop-company-directory__expand {
    margin-top: 0.5rem;
}
/* Styled as the body-link treatment, not a button, per the brief -
   plain underlined text, no native disclosure triangle (a triangle
   marker reads as an accordion control, which is explicitly NOT what
   was asked for). The native open/close behaviour and keyboard
   operability are unaffected by hiding the marker - `<details>` doesn't
   need its default marker to stay interactive. */
/* min-height + inline-flex added 30 Aug (tablet/mobile round, item 7) -
   measured 26px live before this fix, a real Part 24 target-size fail.
   `inline-flex`/`align-items:center` (not padding-block) so the box
   grows to 44px while the underlined text stays vertically centred in
   it, same technique already used for `.drop-company-directory__
   contact a`/`.drop-cat-chips a` elsewhere in this file - kept
   `inline-block`'s "sits in the flow of the paragraph around it"
   behaviour via `display:inline-flex`, not a block-level swap. */
.drop-company-directory__expand summary {
    display: inline-flex;
    align-items: center;
    min-height: 44px;
    list-style: none;
    color: var(--wp--preset--color--brand-red);
    text-decoration: underline;
    font-weight: 700;
    cursor: pointer;
}
.drop-company-directory__expand summary::-webkit-details-marker {
    display: none;
}
.drop-company-directory__expand summary:hover {
    text-decoration: none;
}
/* Sentence-length fallback, 30 Aug (Round Three review) - some
   companies' Business Functions are full sentences, not short tags
   (Banktech measured live: several entries over 100 characters). A
   width-capped chip still rendered those as a 3-line bordered box that
   doesn't read as a chip at all - see drop_render_company_directory_
   list() in plugins/drop-blocks.php for the >40-char per-entry guard
   that switches this whole set (not just the long item) to a plain
   list instead. Standard bulleted `<ul>` at body size - deliberately
   NOT the chip's compact 14px, this is prose-adjacent content once it
   stops being a short tag. Capped at the same `--measure` as the rest
   of the entry, per the "one measure per entry" fix above - inherits
   automatically from `.drop-company-directory__body`'s own new
   max-width, no separate override needed for the cap itself, only the
   list-specific type/spacing below. */
.drop-company-directory__functions-list {
    font-family: var(--font-display);
    font-size: 1rem;
    margin: 0;
    padding-inline-start: 1.25rem;
}
.drop-company-directory__functions-list li + li {
    margin-top: 0.35rem;
}
.drop-company-directory__contact li {
    list-style: none;
}
/* Contact links (email/website) - added 30 Aug, item 9. There was no
   rule here at all before this: confirmed live these were rendering
   the plain browser default - serif (the sitewide body inherit) and a
   persistent same-colour underline (no CSS ever set text-decoration:
   none, so the UA default just stood). Data, not a sentence, per the
   rule recorded on the prose-link comment above - Archivo, hover/
   focus-only underline, real 44px targets (Part 24). */
.drop-company-directory__contact a {
    display: inline-flex;
    align-items: center;
    min-height: 44px;
    font-family: var(--font-display);
    color: var(--ink-heading);
    text-decoration: none;
}
.drop-company-directory__contact a:hover,
.drop-company-directory__contact a:focus-visible {
    text-decoration: underline;
    text-decoration-thickness: 1px;
    text-underline-offset: 0.18em;
}

/* ── Single company/member detail templates ─────────────────────── */
.drop-company-detail-layout {
    align-items: flex-start;
    gap: clamp(1rem, 3vw, 2rem);
}
.drop-company-detail-layout__logo {
    flex: 0 0 240px;
}
.drop-company-detail-layout__body {
    flex: 1 1 auto;
    min-width: 0;
}
@media (max-width: 700px) {
    .drop-company-detail-layout {
        flex-wrap: wrap;
    }
}
.drop-member-detail__role {
    color: var(--wp--preset--color--ink-muted);
    font-style: italic;
}

/* drop-single-terms (2026-08-23 category-chip pill treatment) retired
   2026-08-27 - single posts now use the same `.drop-card-meta` +
   `wp:drop/card-kicker` combo as the card grid instead of their own
   pill-badge component. See single-post-body.html / thedrop-decisions.md
   for the full rationale. */

/* ── drop/card-kicker (2026-08-24, design-review request) - replaces
   the pill-badge row on archive/homepage cards specifically. Plain
   uppercase text, red, capped at 2 categories + "+n" so it can NEVER
   wrap to a second line (the actual fix for the row-misalignment bug
   the pill row caused) - white-space:nowrap is a backstop, the real
   fix is the PHP-side cap in drop_render_card_kicker().
   Colour: --highlight-dark, NOT the brief's literal #e8271e / this
   site's plain brand red (--highlight, #ec1d23) - deliberate
   deviation from the brief's spec. This account already has a
   documented, measured finding that the plain brand red fails AA at
   small text sizes (4.41:1 on the tag-band text, flagged not fixed
   elsewhere) - at 11px this kicker is nowhere near WCAG's "large text"
   threshold (18.66px bold), so full 4.5:1 applies, and --highlight-dark
   (5.87:1) is this account's own established fix for exactly this
   situation, not a substitution invented here. */
.drop-card-kicker {
    display: block;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    text-transform: uppercase;
    font-size: 12px; /* was 0.6875rem (11px) - bumped 2026-08-28, review
        finding F: Courier Prime's small x-height reads meaningfully
        smaller than a normal face at the same size; 12px is this
        theme's floor for the stamp face. */
    font-weight: 700;
    margin-block: 0; /* 2026-08-27 - the wrapper (.drop-card-meta below)
        is the sole owner of this row's vertical spacing now the kicker
        shares a line with the date, not this rule. Letter-spacing also
        removed the same pass (Daniel's call, live screenshot). */
}
.drop-card-kicker a {
    color: var(--wp--preset--color--brand-red);
    text-decoration: none;
}
.drop-card-kicker a:hover {
    text-decoration: underline;
}
.drop-card-kicker a:focus-visible {
    outline: 2px solid var(--wp--preset--color--brand-red);
    outline-offset: 2px;
}
.drop-card-kicker__sep {
    color: var(--wp--preset--color--ink-muted);
    margin-inline: 0.4em;
}
.drop-card-kicker__more {
    color: var(--wp--preset--color--ink-muted);
    margin-inline-start: 0.4em;
    font-weight: 400;
}

.drop-card-media {
    position: relative; /* harmless leftover from the old image-overlay
        badge (2026-08-22); no longer load-bearing since the badge moved
        into normal flow the same day, left in case anything else in
        this wrapper ever needs a positioning context. */
    overflow: hidden; /* 2026-08-23 - required for the hover-zoom below;
        without it the scaled image spills past the card's edges into
        the badge/title stacked underneath instead of cropping cleanly. */
}
/* Subtle hover/focus zoom on card images (2026-08-23, Daniel's request) -
   image only, container stays put, so the badge/title below never
   shifts. :focus-within covers keyboard nav onto the featured-image
   link, not just mouse hover. Transition duration is already covered by
   the sitewide `prefers-reduced-motion` rule below (kills all transition
   durations via `*`), so no separate override needed here. */
.drop-card-media:hover img,
.drop-card-media:focus-within img {
    transform: scale(1.06);
}
/* SUPPLEMENTAL rule, added 29 Aug - the query-loop card grid
   (front-page.html/index.html) silently lost the zoom above the moment
   the stretched-link pattern shipped (external review adoption,
   2026-08-28 later still): `.wp-block-post-title a::after` is
   `position:absolute; inset:0` on `.wp-block-post` (its containing
   block), so it covers the ENTIRE card at `z-index:1` - including the
   image, which sits in a separate sibling branch of the DOM
   (`.drop-card-media` is not an ancestor of the stretched-link overlay,
   nor vice versa). Confirmed live via `elementFromPoint()` at the
   image's centre: the hit target was the title's anchor, not the image
   or anything inside `.drop-card-media` - the browser was never
   dispatching a real hover onto `.drop-card-media` in this card
   context, `:hover`/`:focus-within` on it just never matched. Keyed off
   `.wp-block-post:hover`/`:focus-within` instead (ancestor-hover fires
   for the whole box regardless of which descendant/overlay was actually
   hit-tested - the exact mechanism the title's own colour-hover rule
   above already relies on) rather than fixing this by lowering the
   overlay's z-index, which would have broken the whole-card click
   target the overlay exists for. The original `.drop-card-media:hover`
   rule above is left in place, not replaced - it's still correct and
   still needed for every OTHER `.drop-card-media` context that has no
   such overlay (the IGT post grid, the single-post sidebar house-ad). */
.wp-block-post-template .wp-block-post:hover .drop-card-media img,
.wp-block-post-template .wp-block-post:focus-within .drop-card-media img {
    transform: scale(1.06);
}
.drop-card-title {
    margin-top: 0.5rem;
    margin-bottom: 0; /* 2026-08-23 - was inheriting a ~20px default
        heading bottom margin that WON the collapse against whatever
        sits directly below it (margins collapse to the larger of the
        two, not the second element's alone) - zeroed so that element's
        own margin-top is the sole, unopposed owner of the gap below the
        title. Still needed after the 2026-08-27 title->meta->excerpt
        reorder below - now it's `.drop-card-meta`'s margin-top that's
        the sole owner instead of the old post-date's. */
    /* 2026-08-24, design-review pass - row alignment. Line clamp (below)
       plus a min-height reserving that same clamped space so a short
       1-line title doesn't leave its card shorter than its neighbours -
       em-based, not px, so it scales with whatever font-size this
       heading level actually inherits rather than a hardcoded guess.
       UPDATED 29 Aug (headline-retune pass): this comment used to say
       "drop/card-title already caps the displayed text server-side
       (~60 chars)" - that server-side trim (in drop_render_card_title(),
       plugins/drop-blocks.php) has been REMOVED (it fired before this
       CSS clamp ever got a chance, causing mid-word truncation earlier
       than necessary). This clamp is now the ONLY thing cutting long
       titles - full titles reach the DOM, `-webkit-line-clamp: 2` below
       does 100% of the visual truncation.
       2026-08-27, Daniel's call from a live mockup - font-size dropped
       from the inherited ~24px browser h2 default to a deliberate
       1.25rem. Own `font-size` declaration REMOVED here 2026-08-28 -
       it never actually won anywhere `.wp-block-post-title` was also
       present (see the merged rule near the top of this file, which
       has higher specificity via its `:not()` argument and sets
       1.28rem instead), so this 1.25rem was already dead everywhere
       except the raw-PHP IGT post grid, where nothing else covered
       `.drop-card-title` at all - found live as a visibly smaller,
       wrong-family, lighter-weight card title on IGT Connects only.
       Font-size/family/weight/line-height/letter-spacing now live
       solely on that merged rule.
       min-height RECALCULATED 29 Aug (headline-retune pass) - was 2.4em,
       assuming the old ~1.16 line-height (2 x "~1.2" rounded); that rule
       just changed line-height to 1.25 for sentence case, which is now
       HIGHER than the value this min-height was budgeted against, not
       lower - left at 2.4em, a real 2-line title would render taller
       (2 x 1.25 = 2.5em) than the box reserved for a 1-line one, the
       exact row-misalignment bug this min-height exists to prevent.
       2.5em = 2 x 1.25, re-derived from the new leading, not guessed.
       RE-CHECKED 29 Aug (headline/label split pass) after the font-size
       dropped 1.28rem->1.1875rem alongside the family swap: still 2.5em,
       unchanged - `em` is relative to THIS element's own font-size, so
       the reserved box scales down with the new smaller size
       automatically (51.2px -> 47.5px) rather than needing a literal
       px value re-derived. line-height ratio (1.25) is also unchanged,
       so the 2x multiple still holds. */
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
    min-height: 2.5em;
}
/* Card titles never carried an explicit text-decoration rule, so they
   fell back to the browser's default underlined `<a>` (2026-08-27,
   Daniel's call from a live screenshot - navy colour + weight already
   give the title link affordance, the underline was redundant clutter).
   UPDATED 29 Aug (Daniel's explicit correction): this used to also
   underline on hover/focus ("kept for hover/focus... a visible one on
   interaction") - that's a SEPARATE, older rule from the colour-only
   hover convention adopted for this exact component in the external-
   review pass (`.wp-block-post-template .wp-block-post:hover .wp-block-
   post-title a`, further up this file) - the two rules don't conflict
   in specificity (different properties), so both were firing at once:
   colour changed to red from the wrapper-hover rule AND underlined from
   this one, the underline having never actually been removed. Hover/
   focus now colour-only, no text-decoration change at all - matches
   the sitewide convention (.drop-post-nav__title, the wrapper-hover
   rule above) instead of the old in-content body-link underline
   pattern. Keyboard focus still gets the sitewide `:focus-visible`
   outline (red ring) as its own visible affordance - removing the
   underline here doesn't leave focus unmarked. */
.drop-card-title a {
    text-decoration: none;
}
/* ── Card-grid date de-emphasised (2026-08-23, Daniel's call - the date
   is low-priority metadata, shouldn't compete with the title). Scoped
   to `.wp-block-post-template .wp-block-post-date` (0,2,0 specificity)
   rather than a bare `.wp-block-post-date`, both to beat WP's injected
   `:where(.is-layout-flow) > * + *` flow-content margin (the account's
   own documented "always two classes" fix - see MASTER-BUILD-PROCESS)
   and to keep this OUT of the single-post kicker/byline date, which is
   a deliberately different size/weight in a different template
   context. `--muted` is the account's AA-checked secondary-text token
   (darkened to #707070 2026-08-23 specifically so this kind of small
   text clears 4.5:1), not an arbitrary lighter grey. */
.wp-block-post-template .wp-block-post-date {
    margin-block-start: 0.15rem;
    margin-block-end: 0;
    font-size: 0.8rem;
    color: var(--wp--preset--color--ink-muted);
}
/* ── Card-grid meta line: kicker + date combined onto one row, date
   right-aligned (2026-08-27, Daniel's request from a live screenshot -
   previously two separate lines, kicker above the title and date below
   it). Markup: wp:drop/card-kicker and wp:post-date are now siblings
   inside a plain wp:group (index.html/front-page.html/the Latest News
   page's post_content all updated the same way). A `wp:group` with no
   `layout` attribute still renders `is-layout-flow` (confirmed live via
   `.drop-card-media`'s own markup), so flex display and the date's
   margin reset both have to be done explicitly here, not left to a
   block layout attribute. `.wp-block-post-template .wp-block-post-date`
   above already claims (0,2,0) for the old stacked layout - the override
   below goes to (0,3,0) deliberately, not just a same-weight sibling
   rule that would only win by source order (this account's own "always
   two classes" note is a MINIMUM, not a ceiling - see the WP-flow-
   margin-injection memory, 7 prior instances of exactly this tie).
   2026-08-27, same-day follow-up: markup order flipped from
   kicker/date -> title to title -> kicker/date (Daniel's call, from a
   live mockup) - the wrapper's own margin-top is now the title-to-meta
   gap owner instead of the image-to-kicker gap, and a hairline top
   border was added to read as a divider under the title, matching that
   mockup - `--divider`, the same token already used for this exact
   purpose elsewhere (company-directory rows), not a new colour. A
   matching bottom border added the same day (Daniel's follow-up call,
   another live screenshot) so the meta row reads as a bounded strip
   between the title and the excerpt, not just underlined on one side -
   `padding-block` on both sides keeps the kicker/date text off both
   rules. */
.drop-card-meta {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 0.75rem;
    margin-block: 0.5rem 0;
    padding-block: 0.5rem;
    border-top: 1px solid var(--wp--preset--color--divider);
    border-bottom: 1px solid var(--wp--preset--color--divider);
}
.drop-card-meta .drop-card-kicker {
    flex: 1 1 auto;
    min-width: 0; /* lets the nowrap/ellipsis kicker actually shrink
        inside the flex row instead of pushing the date out of it */
}
/* Single-post-only gap: meta line straight to the hero image (2026-08-27,
   Daniel's call from a live screenshot - the meta's own border-bottom
   was sitting flush against the image with zero gap). Scoped with the
   adjacent-sibling combinator (`.drop-card-meta + ...`) rather than a
   margin on `.drop-card-meta` itself, which would also add unwanted
   space before the excerpt on the card grid - meta is never followed by
   a featured image there, only on single-post-body.html. Matches the
   same blockGap token WP already uses for the grid's meta-to-excerpt
   gap, not a new hand-picked number. */
.drop-card-meta + .wp-block-post-featured-image {
    margin-top: var(--wp--style--block-gap, 1.25rem);
}
.drop-card-meta.wp-block-group .wp-block-post-date {
    flex: 0 0 auto;
    margin-block: 0;
    text-align: right;
    /* 2026-08-27 - font-size/colour restated here (not just relying on
       `.wp-block-post-template .wp-block-post-date` above) because this
       same `.drop-card-meta` wrapper now also renders on single posts
       (single-post-body.html), which are never inside a
       `.wp-block-post-template` - without this the single-post date
       would fall back to the browser's plain body-text size/colour
       instead of matching the grid's de-emphasised treatment. */
    font-size: 0.8rem;
    color: var(--wp--preset--color--ink-muted);
}

/* ── Card-grid meta row, wp:drop/card-meta (2026-09-19 homepage redesign
   handoff, §4d) - REPLACES the boxed kicker+date treatment above for
   grid-context cards only. Scoped by BODY class, not just
   `.wp-block-post-template` - the Latest News page (post 103814) embeds
   its OWN copy of this exact card markup/classes in its post_content
   (a real page, `page-template-default`, out of this handoff's scope),
   and a bare `.wp-block-post-template .drop-card-meta` selector would
   leak the new flat styling onto its old title-then-meta markup order,
   producing a half-old/half-new card (caught live, not assumed safe).
   `.home` = the real homepage, `.archive`/`.search` = index.html-driven
   listings, `.page-template-home-featured-story` = the one Page that
   deliberately mirrors the new design. `single-post-body.html`'s own
   `.drop-card-meta` byline use is excluded either way - it's not inside
   a `.wp-block-post-template`. */
:is(.home, .archive, .search, .page-template-home-featured-story, .page-template-home-split, .page-template-home-rail) .wp-block-post-template .drop-card-meta {
    display: flex;
    align-items: center;
    justify-content: flex-start;
    flex-wrap: wrap; /* a long advertiser name drops the Sponsored label to its own line instead of overflowing */
    gap: 2px 9px;
    margin-block: 0 11px;
    padding-block: 0;
    border-top: none;
    border-bottom: none;
}
/* Real bug, found live (Daniel's screenshot, 2026-09-19) - the category
   sat visibly higher than the divider/date, "GAMING" and "5 SEP" reading
   off-baseline from each other. Root cause: this row's wrapping
   `wp:group` block still carries WP's own `is-layout-flow` class (no
   `layout` type was set on it), so its children still match the
   sitewide flow-content blockGap injection (`:where(.is-layout-flow) >
   * + *`, `MASTER-BUILD-PROCESS.md`'s "wp-layout-flow-margin-injection"
   trap) even though THIS element's own `display:flex` above changes
   nothing about which CSS selectors still match it - `:where()` and `*`
   both carry zero specificity, so the injected `margin-top` (~20px,
   theme.json's blockGap ceiling) landed on the divider and date (2nd/3rd
   children - `+ *` never matches a first child) with nothing here
   overriding it. `align-items:center` on the flex row then centred each
   item within its OWN pushed-down box, which is exactly why the
   category (no injected margin) end up ~10px HIGHER than the other two
   rather than all three simply being off by the same amount. Zeroing
   every child's margin is the fix, not fighting alignment values. */
:is(.home, .archive, .search, .page-template-home-featured-story, .page-template-home-split, .page-template-home-rail) .wp-block-post-template .drop-card-meta > * {
    margin: 0;
}
/* Real bug, found live from a second screenshot (2026-09-19, same
   session) - the meta row sat flush against the image above it, "tight
   to the picture". `.drop-card-meta`'s own margin-top has been forced to
   0 since this component's very first rule above (`margin-block: 0
   11px`) - correct for the meta-to-title gap below it, but that same
   zeroing ALSO cancelled the image-to-meta gap that used to arrive for
   free via the sitewide flow-content blockGap injection (now that meta
   comes first and owns its own spacing explicitly, nothing was left to
   own the gap ABOVE it). `.drop-card-media` itself has never had a
   margin-bottom of its own (confirmed - no rule sets one). Per the
   handoff's own spacing table ("Card image -> meta: 16px"), giving the
   image wrapper an explicit, owned margin-bottom is the fix - same
   body-class scoping as the rest of this component. */
:is(.home, .archive, .search, .page-template-home-featured-story, .page-template-home-split, .page-template-home-rail) .wp-block-post-template .drop-card-media {
    margin-bottom: 16px;
}
/* Same recurring flow-injection pattern as the two fixes above, a fourth
   instance found live (Daniel's DevTools screenshot, 2026-09-19) -
   `.wp-block-post-excerpt` (a direct sibling of `.drop-card-title` on
   these templates) was picking up the sitewide `:where(.is-layout-flow)
   > * + *` blockGap injection at its ~20px ceiling, not the handoff's
   specified 12px. Owned explicitly here rather than left to the
   injection, same "always two classes" specificity fix as everywhere
   else in this component. */
:is(.home, .archive, .search, .page-template-home-featured-story, .page-template-home-split, .page-template-home-rail) .wp-block-post-template .drop-card-title + .wp-block-post-excerpt {
    margin-top: 12px;
}
/* Meta now comes BEFORE the title on these same templates (handoff §4d) -
   its own margin-bottom above is the sole owner of the meta-to-headline
   gap, so the title's margin-top (previously the sole owner when meta
   followed it) must yield here or the two collapse to whichever is
   larger, drifting off the handoff's specified 11px. Same body-class
   scoping as above - Latest News keeps its original title-first order
   and margin ownership untouched. */
:is(.home, .archive, .search, .page-template-home-featured-story, .page-template-home-split, .page-template-home-rail) .wp-block-post-template .drop-card-meta + .drop-card-title {
    margin-top: 0;
}
:is(.home, .archive, .search, .page-template-home-featured-story, .page-template-home-split, .page-template-home-rail) .wp-block-post-template .drop-card-meta .drop-card-kicker {
    flex: initial;
    min-width: 0;
}
.drop-card-meta__category {
    font-family: var(--font-narrow);
    font-weight: 700;
    font-size: 0.6875rem;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: var(--wp--preset--color--brand-red);
    text-decoration: none;
    white-space: nowrap;
}
.drop-card-meta__category:hover,
.drop-card-meta__category:focus-visible {
    text-decoration: underline;
}
.drop-card-meta__divider {
    flex: none;
    width: 1px;
    height: 11px;
    background: var(--wp--preset--color--meta-divider);
}
.drop-card-meta__date {
    font-family: var(--font-narrow);
    font-weight: 700;
    font-size: 0.6875rem;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: var(--wp--preset--color--brand-navy);
    opacity: 0.55;
    white-space: nowrap;
}
.drop-card-meta__sponsored {
    margin-left: auto;
    font-family: var(--font-body);
    font-style: italic;
    font-weight: 400;
    font-size: 0.8125rem;
    line-height: 1.2;
    color: var(--wp--preset--color--brand-navy);
    opacity: 0.55;
    white-space: nowrap;
}
/* The scoped `.drop-card-meta > * { margin: 0 }` flow-injection fix above
   outranks the single-class margin-left:auto, so the right-push needs the
   same scoping (found live 2026-11-05: label sat against the date). */
:is(.home, .archive, .search, .page-template-home-featured-story, .page-template-home-split, .page-template-home-rail) .wp-block-post-template .drop-card-meta > .drop-card-meta__sponsored {
    margin-left: auto;
}

/* ── "Read more" on archive/homepage cards (2026-08-23) - RETIRED 30 Aug
   (read-more sweep, §1/§3). Was: only the image and title were ever
   links, the excerpt gave no visual affordance the card was clickable,
   so this was added as a small, explicit, always-visible label.
   .drop-featured-article__readmore dropped 2026-08-27 (that card lost
   its excerpt/read-more entirely). The LAST remaining emitter -
   drop_render_igt_post_grid()'s "Read more"/"Watch Video" anchor - is
   removed the same pass this comment was rewritten (see plugins/
   drop-blocks.php and the stretched-link rules on .drop-igt-grid__item
   below): the IGT grid gets the same whole-card stretched-link
   affordance as the core card grid now, instead of a text label. No
   selector below still emits `.drop-card-readmore` anywhere in this
   theme - rule deleted, not left dead. */

/* ── Archive-page title (2026-08-22, revised 2026-08-23, made a
   structural default 2026-08-23) - deliberately distinct from single-
   post h1: uppercase + navy + a size bump reads as a section label /
   wayfinding heading, not a headline. Weight used to be a deliberate
   exception at the site-wide 300 - the 2026-08-23 design review's
   global heading weight bump to 700 (theme.json) now applies here too
   (no longer overridden locally), so this class only adds
   case/letter-spacing/size on top of the new global bold/tight-lh
   heading style.
   `.wp-block-post-content > h1:first-of-type` was added the same day
   Daniel caught the Latest News page had drifted from this treatment -
   it had its own hand-authored H1 that pre-dated this pass and nobody
   had gone back to add the class. Rather than keep hand-adding
   `className:"drop-archive-title"` to every page's H1 (real drift risk,
   proven by that exact bug), this selector makes it a structural
   default for every page: `wp:post-content` is only ever used by
   page.html (confirmed - no other template renders it), and a plain
   page body's H1 is always its first child there, so this can't reach
   single.html's h1 (a separate `wp:post-title` block, own
   `.drop-single-title` class, deliberately kept plain) or index.html's
   query-title (template-level, already carries this same class
   directly). One rule, no per-page opt-in required, nothing to forget
   on the next new page. */
.drop-archive-title,
.wp-block-post-content > h1:first-of-type {
    color: var(--wp--preset--color--ink-heading);
    text-transform: uppercase;
    letter-spacing: 0.03em;
    font-size: clamp(1.75rem, 3vw, 2.25rem);
    margin-block-end: 0.75rem;
}

/* ── "Latest from The Drop" section heading + keyline (2026-09-16,
   Daniel's request, "similar to the design" reference) - heading and a
   "View all news" link share one row, with a hairline closing it
   underneath before the card grid. Used on front-page.html and
   home-featured-story.html. */
.drop-section-heading {
    padding-bottom: 0.75rem;
    margin-bottom: 1.5rem;
    border-bottom: 1px solid var(--wp--preset--color--divider);
    gap: 1rem;
}
/* Two classes (0,2,0) - beats the base `.drop-archive-title` rule above
   ((0,1,0), margin-block-end: 0.75rem) on specificity, not source order,
   per this file's own standing spacing-tripwire convention - the row's
   OWN padding-bottom/margin-bottom above is the sole owner of the gap to
   the grid below; the heading keeps zero margin of its own inside this
   row so it doesn't throw off the flex row's vertical alignment. */
.drop-section-heading .drop-archive-title {
    margin-block: 0;
}
.drop-section-heading__link {
    margin: 0;
    flex-shrink: 0;
}
.drop-section-heading__link a {
    font-family: var(--font-display);
    font-weight: 600;
    font-size: 0.8125rem;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--brand-red);
    text-decoration: none;
    white-space: nowrap;
}
.drop-section-heading__link a:hover {
    text-decoration: underline;
}
.drop-section-heading__link a:focus-visible {
    outline: 2px solid var(--brand-red);
    outline-offset: 2px;
    text-decoration: underline;
}

/* RIBBON PLACEMENT RETIRED (page-header pattern, 29 Aug - decision from
   live mockups, Option A). This was ribbon placement ~3.4 in the
   original spec ("decorative accent between title and subtitle",
   converted 2026-08-28 from a plain rule to the 58px/5px airmail
   fragment below) - removed entirely, not shrunk or reworked. At 58px
   the diagonal shows ~3 dashes and reads as a rendering fault, not a
   decorative mark; tested at 120px live and it still read as confetti
   between the H1 and the description, wrong problem to solve by scaling.
   The ribbon set's own instance count was already at its documented
   ceiling (thedrop-decisions.md) before this removal, so retiring a
   whole placement is a real win, not a loss to offset - the ribbon now
   appears only at the page edges (header/footer) and on framed Drop-
   owned units (the newsletter frame, the LinkedIn house-ad tile), never
   as a standalone accent mark. Replaced by the page-header pattern
   below: eyebrow + H1 (unchanged type) + left-aligned muted description
   + a plain --divider hairline that actually closes the block (the old
   ribbon fragment gave the header no closing edge at all - it floated
   above the grid). If a future pass wants a decorative mark back here,
   it needs new reasoning, not a restoration of this one - both the
   58px and 120px sizes were tried and rejected live. */

/* ── Page header pattern (archives + Pages + search) - eyebrow, H1,
   description, hairline. Two delivery mechanisms, not one, because the
   H1 lives in two structurally different places:
   - Archives (index.html) and search (search.html): the H1/description/
     eyebrow are STATIC TEMPLATE MARKUP, so they're wrapped in a real
     `.drop-page-header` group and the hairline is that wrapper's own
     `::after` - the mechanism the brief itself specified.
   - Standard Pages (page.html): the H1 is the FIRST BLOCK OF THE PAGE'S
     OWN post_content (dynamic, editor-authored, not template markup) -
     there is no static wrapper to add a class to, so the hairline
     reuses the exact selector the old ribbon fragment used
     (`.wp-block-post-content > h1:first-of-type::after`), just pointed at
     a hairline instead of a ribbon. Same mechanism, new content - not
     two different systems by accident, one adapted to where it has to
     live. The old IGT-Connects/Corporate-Directory page-ID exclusion is
     GONE here on purpose - that existed only because those two hub
     pages were forbidden from getting the RIBBON specifically; a plain
     grey hairline isn't a ribbon and closing every page's H1 the same
     way is exactly what "every template that renders a page-level H1"
     means. */
.drop-page-header__eyebrow {
    font-family: var(--wp--preset--font-family--display-narrow);
    font-weight: 700;
    font-size: 12px;
    line-height: 1; /* was unset (browser default ~1.15-1.2 for this face) -
        found live: the resting gap to the H1 measured 20px against a
        specified 10px margin, the difference being this element's own
        leading, not the margin. Tightened so the margin below is the
        real, only gap. */
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: var(--wp--preset--color--brand-red);
    text-decoration: none; /* was unset - the "Library" variant is a real
        <a>, and the browser's own default link underline was showing at
        REST, not just on hover (Daniel's live screenshot caught this -
        the :hover rule below was only ever adding a SECOND underline on
        top of one already there). */
    margin-bottom: 4px; /* was 10px - "tighter to title", per the same screenshot */
    display: block; /* both an <a> (linked "Library") and a <span> (unlinked
        archive-type/parent labels) render this - block so either sits on
        its own line above the H1 regardless of which tag it is. */
}
.drop-page-header__eyebrow:hover {
    text-decoration: underline;
}
/* Description: kill the centring, mute it, keep the existing measure
   cap - the centred serif under a left-aligned H1 mixed alignment axes,
   the brief's first named problem. `.drop-archive-subtitle` is the REAL
   class this codebase uses (confirmed against templates/index.html's
   own `wp:term-description` markup, same fact already recorded on this
   rule before this pass) - `.drop-archive-intro`, named in the brief's
   own CSS snippet, does not exist anywhere in this theme; included here
   anyway alongside `.wp-block-term-description` (the OTHER real class
   already on this exact element) so the rule matches by NAME as well as
   by the class that's actually present, in case a future component ever
   uses that name for real. */
.drop-archive-subtitle,
.drop-archive-intro,
.wp-block-term-description {
    text-align: left; /* was inheriting core's own centred term-description default */
    color: var(--ink-muted); /* was --ink - it's a lead-in, not body copy */
    margin-block-end: 0;
    margin-top: 12px;
    max-width: var(--measure);
}
/* Sole-owner fix for the H1-to-description gap, per this file's own §0.4
   spacing convention - `.drop-archive-title`'s base rule (above) already
   carries `margin-block-end: 0.75rem` (=12px), which sits directly
   adjacent to the description's own new `margin-top: 12px` above. Both
   happen to be the same value, so an accidental margin-COLLAPSE would
   silently produce the right 12px gap anyway - but relying on that
   working (rather than the two margins STACKING to 24px, which happens
   the moment either element's parent stops being plain block flow) is
   exactly the "two owners, might double" trap this account's spacing
   tripwires exist to catch. Zeroed explicitly here so the description's
   margin-top is the sole, unambiguous owner.
   `margin-block-start: 0` added the same pass, found live from a
   screenshot (Daniel: "kicker should... be tighter to title") - the
   eyebrow's OWN spacing (line-height, margin-bottom) was already tight,
   but the visible gap stayed at 20px regardless. Traced to WP's own
   injected flow-gap rule (`:where(.is-layout-flow) > * + *`, `:where()`
   carries zero specificity) landing a `margin-top: 20px` on the H1
   itself (confirmed live via `getComputedStyle` - exactly the current
   blockGap clamp's value at this viewport) - the account's own
   documented `wp-layout-flow-margin-injection` trap, hit again here.
   Two classes (`.drop-page-header .drop-archive-title`) is what
   actually beats it, not the eyebrow's own margin - that's why this
   rule, not a bigger number on the eyebrow, is the real fix. */
.drop-page-header .drop-archive-title {
    margin-block-start: 0;
    margin-block-end: 0;
}
/* Hairline - closes the header block, `--divider` grey, NEVER the
   ribbon (the brief's own explicit distinction). Two-class selector
   (`.drop-page-header` is already a single class on a dedicated wrapper,
   at (0,1,0) - no WP-injected rule at that specificity to out-fight
   here, unlike the blockGap-margin cases elsewhere in this file that
   need the doubled-class treatment). */
.drop-page-header::after {
    content: "";
    display: block;
    height: 1px;
    background: var(--wp--preset--color--divider);
    margin-top: 22px;
}
/* Pages only - same hairline, direct-to-H1 mechanism (see the block
   comment above for why Pages can't use the wrapper). No eyebrow rule
   needed here for the common case (zero published Pages currently have
   a post_parent - confirmed via a DB query before writing this, not
   assumed) - see drop_render_page_header_eyebrow() in
   plugins/drop-blocks/drop-blocks.php for the parent-page eyebrow this
   theme is ready for the day one exists. */
.wp-block-post-content > h1:first-of-type::after {
    content: "";
    display: block;
    height: 1px;
    background: var(--wp--preset--color--divider);
    margin-block-start: 22px;
}
/* Category chip row (Review One #19, open item - groundwork only, NOT
   built this pass). When it exists, it sits between the description and
   the hairline, inside `.drop-page-header`, immediately before this
   `::after` - the eyebrow above already establishes the vertical
   rhythm/left alignment it would need to match. Do not build it here;
   this comment exists so the next pass finds the intended slot instead
   of guessing. */

/* ── Yoast breadcrumbs (2026-08-22) - the plugin owns generation
   (§ SEO plugin rule); this just brings the rendered trail into the
   type system instead of Yoast's unstyled default. Small/muted per the
   usual "secondary wayfinding, not competing with the h1" treatment -
   `--muted` was darkened to #707070 the same session specifically so
   this kind of small text clears AA (2.85:1 -> 4.95:1 on white). */
.drop-breadcrumbs {
    font-family: var(--font-display); /* was unset - found in the serif-
       drift sweep (article-refinements pass, 2026-08-28 later still): a
       link-list trail, not prose, silently inheriting the sitewide
       serif. */
    font-size: var(--wp--preset--font-size--small);
    color: var(--wp--preset--color--ink-muted);
    margin-block: 0 0.75rem;
}
.drop-breadcrumbs a {
    color: var(--wp--preset--color--ink-muted);
    text-decoration: underline;
}
.drop-breadcrumbs a:hover {
    color: var(--wp--preset--color--ink-heading);
}
.drop-breadcrumbs .breadcrumb_last {
    color: var(--wp--preset--color--ink);
}

/* ── Library hub pass, 30 Aug - category chip row (§2's component,
   the page-header-pass groundwork item landing in its planned slot).
   REPLACES the old .drop-single-terms reuse below (`drop_render_
   category_children()` used to emit `class="drop-single-terms drop-
   category-children"`, reusing a pill treatment that was RETIRED
   2026-08-27 - see that rule's own "retired" comment further down this
   file. `.drop-single-terms` has carried zero actual styling since
   that date, so this row rendered as a bare, unstyled, jammed run-on
   line of links - confirmed live before writing this component, not
   assumed from the brief alone.
   ONE component, TWO uses, per the guardrail ("chips are the §2
   component in both uses... one CSS block, a --static modifier") -
   link chips here (`<nav><a>`, hub/child-category navigation) and, in
   the Corporate Directory's Business Functions list (§4),
   `.drop-cat-chips--static` on a real `<ul>` of `<li>`s instead of
   `<a>`s - kept as a genuine list (not `<span>`s) because "a list of
   business functions" is real, useful list semantics for a screen-
   reader user, and it lets the Round Two review's own straggler
   ("Business Functions lis still measure ~130cpl") get fixed as a
   built-in property of the chip itself (`max-width: var(--measure)`
   below) rather than needing a second, separate rule - chips are
   short in practice, but this is the defensive backstop for whenever
   one company's copy isn't. */
.drop-cat-chips {
    display: flex;
    flex-wrap: wrap;
    gap: 10px 12px;
    margin-top: 18px;
    list-style: none; /* no-op on the <nav> use, needed for the <ul> use */
    padding: 0;        /* same */
}
.drop-cat-chips a,
.drop-cat-chips--static li {
    font-family: var(--wp--preset--font-family--display);
    font-weight: 500;
    font-size: 14px;
    color: var(--ink);
    border: 1px solid var(--wp--preset--color--divider);
    padding: 8px 14px;
    min-height: 38px;
    display: inline-flex;
    align-items: center;
    text-decoration: none;
    max-width: var(--measure);
}
.drop-cat-chips a:hover {
    border-color: var(--wp--preset--color--brand-navy);
    color: var(--wp--preset--color--brand-navy);
}
/* Current-page state, child category pages only (`drop_render_
   category_children()` marks the viewed term `.is-current` - Library's
   own archive never matches one of its own children, so this state
   never appears there, only on Gaming/Community/etc.). */
.drop-cat-chips a.is-current {
    background: var(--wp--preset--color--brand-navy);
    border-color: var(--wp--preset--color--brand-navy);
    color: var(--wp--preset--color--white);
}
/* ── Subcategory pills on a parent-category archive (Library, etc.) -
   only ever rendered when the current term IS Library or a descendant
   of it (see drop_render_category_children()) - was "only when the
   CURRENT term has children", changed 30 Aug so the chip row also
   appears on Library's own child/leaf pages (Gaming, Community, ...),
   listing all fourteen with the viewed one highlighted, not just on
   Library's own archive. Bottom margin clears the query grid below it
   cleanly on the hub page; harmless on child pages, which have the
   same grid-below-chips layout. */
.drop-category-children {
    margin-block-end: 1.5rem;
}
/* Child-category chip row -> single scroll row below 768px, 30 Aug
   (tablet/mobile round, item 6) - PHP only adds `.drop-cat-chips--scroll`
   on Library's DESCENDANT archives (drop_render_category_children(),
   plugins/drop-blocks.php); the hub keeps the full wrap at every width,
   untouched. At 390px the 14-chip wrap measured 340px tall before any
   article appeared - real screen real estate on a page where the chips
   are wayfinding, not the content, unlike the hub. Native overflow only
   (guardrail: "no scrollbar styling hacks") - no custom scrollbar CSS
   here, whatever the browser/OS default renders is left alone. */
@media (max-width: 767px) {
    .drop-cat-chips--scroll {
        flex-wrap: nowrap;
        overflow-x: auto;
        -webkit-overflow-scrolling: touch;
        scroll-snap-type: x proximity;
        padding-bottom: 8px;
    }
    .drop-cat-chips--scroll a {
        flex: 0 0 auto;
        scroll-snap-align: start;
    }
}

/* ── Top Jobs page (partner cards + job-of-week callout) ─────────── */
/* Navy/white treatment (2026-08-27, Daniel's request - "more like
   prod"). Checked prod live rather than guessing: real background is
   rgb(63,88,110), which IS this theme's own --wp--preset--color--brand-navy
   (#3f586e) already - no new colour needed, just applying the existing
   token here. Heading/body text both white per Daniel's literal ask
   (prod actually uses two tones - pure white heading, a soft
   off-white #dce2e8 body copy - but that's a new hex value this theme
   doesn't have a token for, and "white text" was the literal request;
   not introducing a new colour for a detail that wasn't asked for). */
.drop-job-of-week {
    background-color: var(--wp--preset--color--brand-navy);
    padding: 1.5rem;
    color: var(--wp--preset--color--white);
}
.drop-job-of-week h2,
.drop-job-of-week h4 {
    color: var(--wp--preset--color--white);
} /* was h3 - the section heading moved to h2 the same session (Daniel's
     request, matches the h2 level the partner-card titles also use). */

/* LinkedIn promo banner img-sizing rule REMOVED 2026-08-28 (ribbon
   refinements pass) - Top Jobs' own copy of the raster banner (sat as a
   plain sibling below .drop-job-of-week, outside the navy box) replaced
   with the drop-house-ad pattern - see that component's own rule
   further down this file. */
/* Button needs its own treatment inside this box - the sitewide button
   style (theme.json elements.button) is a navy FILL with white text,
   which would be invisible against this box's own navy background.
   Prod solves the same problem with a transparent/white-outline button
   here specifically (verified live: transparent bg, 1px solid white
   border, radius 0) - matched exactly, independent of the sitewide
   pill-radius question raised separately.
   NAMED `.drop-btn--ghost`, 30 Aug (Round Three review, button-system
   follow-up) - `.drop-btn--navy` (see the button-system section, near
   the top of this file) doesn't work here: this panel's OWN background
   IS navy, so a navy button would vanish into it the same way a navy
   button vanished into the newsletter footer before the button-system
   pass. This is a THIRD, deliberately-scoped variant for navy SURFACES
   specifically (transparent fill, white ring, white text) - reuses the
   metrics/family/weight/case `.wp-block-button__link`'s own sitewide
   mapping already sets (see below), just overrides colour/border. Not
   a fourth button style in the loose sense the brief's "no third
   style" rule warns against - that rule is about CONVERSION vs
   NAVIGATION intent (red vs navy), and this ghost variant is still
   navigation-family, just recoloured for the one surface where navy-
   on-navy would fail. */
.drop-btn--ghost {
    background-color: transparent;
    color: var(--wp--preset--color--white);
    border: 1px solid var(--wp--preset--color--white);
    border-radius: 0;
}
/* Job of the Week button -> red fill (Daniel's request, 2026-09-18) -
   was the white-outline `.drop-btn--ghost` treatment above (needed
   because a plain navy button vanishes on this panel's own navy
   background); red doesn't have that problem, so it takes over this
   ONE instance directly rather than being folded into `.drop-btn--
   ghost` itself, which stays available unchanged for any other navy
   surface that still needs the white-outline treatment. Same fill/hover
   tokens as `.drop-btn` (conversion red), metrics/family/weight/case
   still inherited from the sitewide `.wp-block-button__link` mapping
   above - only colour/border change here. */
.drop-job-of-week .wp-block-button__link {
    background-color: var(--wp--preset--color--brand-red);
    color: var(--wp--preset--color--white);
    border: none;
    border-radius: 0;
}
.drop-job-of-week .wp-block-button__link:hover,
.drop-job-of-week .wp-block-button__link:focus-visible {
    background-color: var(--wp--preset--color--brand-red-dark);
    color: var(--wp--preset--color--white);
}
.drop-btn--ghost:hover,
.drop-btn--ghost:focus-visible {
    background-color: var(--wp--preset--color--white);
    color: var(--wp--preset--color--ink-heading);
}
/* Partner cards: 2-column grid, logo above/title+text+CTA below
   (2026-08-27, Daniel's request - mirrors the homepage card grid's
   card shape now that this page has its own dedicated main column
   next to the new Job of the Week sidebar, rather than the full-width
   single-column row layout it briefly had). This is actually a
   REVERSION of the 2026-08-24 change below (which went row-layout FOR
   THE SAME REASON now being undone) - logo-left/text-right worked when
   this list ran full page width; it doesn't suit the narrower ~2/3
   main column this page has now. */
.drop-partner-cards {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: 1.5rem;
}
.drop-partner-cards__item {
    display: flex;
    flex-direction: column;
    background-color: var(--wp--preset--color--surface);
    padding: 1.25rem;
}
/* Real bug caught live, not assumed: WP's injected blockGap margin-top
   (`:where(.is-layout-flow) > * + *`) was landing on every card except
   the first (they're still DOM siblings, blockGap doesn't know this
   became a 2D grid) - each card's own `align-items:stretch` height
   still filled its grid cell correctly, but the margin pushed the card
   DOWN within that cell, so two cards sharing a grid row no longer
   shared a top edge (measured live: card 2 in row 1 sat 20px lower
   than card 1, same row). `.drop-partner-cards` is the sole gap owner
   via its own `gap`, same two-class-descendant guard used elsewhere on
   this project for exactly this trap. */
.drop-partner-cards .drop-partner-cards__item {
    margin-top: 0;
}
/* Fixed-height, contain-not-cover logo tile (2026-08-27) - these are
   varied-aspect-ratio brand logos (a 300x98 wide LinkedIn wordmark next
   to a 300x211 tall Expr3ss! lockup), not photos: cropping any of them
   with object-fit:cover would cut off real logo content, so this
   letterboxes each one inside a fixed height instead, keeping every
   card's logo area the same height regardless of the source image's
   own proportions (the point of a grid - consistent card shape). White
   background (not the card's own surface grey) so a transparent-bg PNG
   logo doesn't pick up a visible grey box around it. */
.drop-partner-cards__logo {
    display: flex;
    align-items: center;
    justify-content: center;
    height: 140px;
    margin: 0 0 1rem;
    background-color: var(--wp--preset--color--white);
}
.drop-partner-cards__logo img {
    display: block;
    max-width: 100%;
    max-height: 100%;
    width: auto;
    height: auto;
    object-fit: contain;
}
.drop-partner-cards__body {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    min-width: 0;
}
/* Two-class descendant selector, not the bare class above - guards
   against WP's injected blockGap margin-top on this element (it's the
   second flow child of .drop-partner-cards__item) tying with a
   single-class rule and stacking on top of .drop-partner-cards__logo's
   own explicit bottom margin, the same wp-layout-flow-margin-injection
   trap logged repeatedly elsewhere on this project. .drop-partner-cards__logo
   is the sole owner of the logo-to-body gap. */
.drop-partner-cards__item .drop-partner-cards__body {
    margin-top: 0;
}
/* CTA pinned to the card bottom (2026-08-27) - body copy length varies
   2-4 lines across these six partners; margin-top:auto on the button's
   own wrapper pushes it to the bottom of the flex column so every
   card's "Find out more" button lines up on the same row within a
   grid row (CSS Grid's default align-items:stretch already makes both
   cards in a row match height to the taller one - this is what makes
   that matched height actually look intentional instead of just
   leaving dead space under the shorter card's text). */
.drop-partner-cards__body .wp-block-buttons {
    margin-top: auto;
    padding-top: 1rem;
}
@media (max-width: 600px) {
    .drop-partner-cards {
        grid-template-columns: 1fr;
    }
}

/* ── IGT Connects: intro + Contact IGT sections (2026-08-24, Daniel's
   request - pulled from prod, https://thedrop.com.au/igt-connects/,
   which never had an FSE equivalent built for this page's intro/contact
   content, only the post grid). */
.drop-igt-intro {
    /* Left-aligned 2026-08-27 (Daniel's request) - was centred, matching
       prod's single-column hub page; this page has its own main column
       now, centred text/logo read as odd inside it. Content-level
       align:center attributes also removed from the post_content itself
       (post 1720) so there's no `.has-text-align-center` class fighting
       this. */
    padding-block: 1rem 0;
}
/* Measure cap (body-copy standard, 2026-08-28 later still) - this intro
   prose is NOT a direct child of `.wp-block-post-content` (nested one
   level deeper, inside this group), so the generic `.wp-block-post-
   content > p` rule above never reaches it - confirmed live it was
   still 95 characters per line at this column's own 804px width after
   that rule shipped, the exact "reads at the right size now but no
   measure cap" gap the one-tier pass exists to close. `.drop-igt-
   intro`'s own parent (`.drop-single-layout__main`) is a fixed content
   column, not something the paragraph's width drives - confirmed live
   (`display:block`, 804px regardless) - so capping the paragraph only
   leaves whitespace inside that column, it doesn't reshape the page's
   two-column layout. Scoped to `.drop-igt-intro` only, NOT `.drop-igt-
   section` (the sibling H2+grid sections below it, which hold the
   already-narrow `.drop-igt-grid__item` cards at 370px/44cpl - already
   fine, confirmed live, and must not be touched here). */
.drop-igt-intro > p {
    max-width: var(--measure);
}
/* MOVED to the top of the sidebar, 30 Aug (Library/IGT hub pass) - was
   the first thing in the main column at 220px (this class's own name
   still says "intro" for that reason - left as-is, renaming it would
   touch the Page content and the shared igt-sidebar.html template part
   for a cosmetic reason only). The main column now opens with "Welcome
   to IGT Connects" instead of a supplier mark at editorial scale - the
   logo sits where sponsor identification actually belongs. Shrunk
   220px -> 180px for its new, narrower home (this theme's sidebar
   column is ~415px, not the ~800px main column it used to sit in).
   `alt="IGT"` kept unchanged in both places this now renders (the IGT
   Connects page's own sidebar content, and igt-sidebar.html's shared
   single-post sidebar) - it's the page's sponsor identification, not
   decoration. */
.drop-igt-intro__logo {
    max-width: 180px;
    margin-bottom: 1.5rem;
}
.drop-igt-contact {
    background-color: var(--wp--preset--color--surface);
    padding: 1.5rem;
    margin-block-start: 2rem;
}
/* IGT Connects sidebar: one continuous grey panel + divider (2026-08-27,
   Daniel's request - "same as sidebar, use gray background, dividers
   etc.", matching .drop-single-sidebar-panel's treatment on single
   posts and .drop-home-sidebar-panel on the homepage). Reuses
   .drop-single-sidebar-panel directly rather than a third scoped
   panel class - it's a plain background+padding rule with no
   structural coupling to single-post markup, safe anywhere. Game of
   the Quarter's own .drop-igt-section wrapper never had a box of its
   own to begin with (nothing to neutralise); .drop-igt-contact DID
   (built 2026-08-24 for the old single-column hub page), so it needs
   the same "cancel the box, panel owns it now" override already used
   for every other panel on this project. */
.drop-single-sidebar-panel .drop-igt-contact {
    background-color: transparent;
    padding: 0;
    margin-block-start: 2rem; /* was 0 - REAL GAP found and fixed in the same
       pass that removed the drop/divider between this and "Game of the
       Quarter" above (dividers-removal pass, 2026-08-28 later still). The
       0 here was correct WHILE the divider existed (it, not this box, owned
       the section-break spacing - stacking both would have been "two
       owners"); with the divider gone this box had no spacing owner left
       at all. Restored to the same 2rem this element uses in its own
       non-panel context (the base .drop-igt-contact rule above, still
       margin-block-start:2rem there) - the SOLE owner again, not a divider
       substitute. */
}
/* Image-left/details-right (2026-08-27, Daniel's request - was image
   stacked above the name/region text, full-width photo up to 220px).
   .drop-igt-contact now lives in the sidebar's single narrow column
   (this section was rebuilt into the 2-column IGT Connects page the
   same session), so a wrapped 3-across row of stacked cards no longer
   fits the space the way it did on the old single-column hub page -
   one column of compact rows reads better here. */
.drop-igt-contact__list {
    display: flex;
    flex-direction: column;
    gap: 1.25rem;
    margin-block-start: 1rem;
}
.drop-igt-contact__item {
    display: flex;
    align-items: center;
    gap: 1rem;
}
.drop-igt-contact__photo {
    flex: 0 0 auto;
    margin: 0;
}
.drop-igt-contact__photo img {
    display: block;
    width: 4rem;
    height: 4rem;
    border-radius: 50%;
    object-fit: cover;
}
.drop-igt-contact__details {
    min-width: 0;
}
.drop-igt-contact__details h4 {
    margin: 0;
}
.drop-igt-contact__details p {
    margin: 0.15rem 0 0;
}

/* ── IGT post grid (drop/igt-post-grid block) - fixed 2 columns
   (2026-08-27, Daniel's request - was auto-fill/3+ columns at wide
   widths), card markup rewritten to literally reuse .drop-card-media/
   .drop-card-title/.wp-block-post-excerpt__excerpt/.drop-card-readmore
   (see drop_render_igt_post_grid() in plugins/drop-blocks.php) so it's
   the same component as the homepage/archive card grid, not a lookalike
   copy. This raw PHP-built markup never goes through do_blocks(), so
   none of it gets WP's usual is-layout-flow/blockGap treatment - every
   gap below is an explicit rule, not "relies on the same spacing the
   block editor would inject", which is what a straight copy of the
   card-grid's own CSS would have assumed. */
.drop-igt-grid {
    list-style: none;
    margin: 0;
    padding: 0;
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: var(--drop-column-gap);
    margin-top: var(--wp--style--block-gap, 1.25rem); /* 2026-08-27,
        Daniel's report from a live screenshot - the heading-to-grid gap
        used to be owned by the section-description paragraph's own
        margin (removed the same session); this list's `margin:0` reset
        above zeroed it out along with the rest, leaving the heading
        flush against the first row of cards. Sole owner now, same
        token the rest of the site uses for this scale of gap. */
}
/* Game of the Quarter's grid sits in the sidebar column (~390px), not
   the ~780px main column the other two grids live in - 2 columns there
   measured ~180px each, cramping the image and truncating every title
   to "…" (2026-08-27, Daniel's report from a live screenshot). Single
   column, sole owner is this selector's specificity over the base rule
   above (two classes beats one, standard practice on this project). */
.drop-single-sidebar-panel .drop-igt-grid {
    grid-template-columns: 1fr;
}
@media (max-width: 480px) {
    .drop-igt-grid {
        grid-template-columns: 1fr;
    }
}
.drop-igt-grid__item .wp-block-post-excerpt__excerpt {
    margin-top: 0.5rem; /* sole owner of the title-to-excerpt gap here -
        the homepage grid gets this for free from WP's blockGap
        injection (it sits between .drop-card-meta and the excerpt
        there); this markup has no meta row and no blockGap at all. */
}
/* Whole-card click target, 30 Aug (read-more sweep, §1/§3) - this
   raw-PHP component was the one deliberately left out of the 2026-08-28
   stretched-link pass (real risk at the time: its video-lightbox click-
   interception, not an oversight). Same pattern as the core card grid
   (`.wp-block-post-template .wp-block-post`/`.wp-block-post-title
   a::after`, near the top of this file) applied carefully here instead
   of skipped - stretch the TITLE link, not a wrapping anchor, for the
   same screen-reader-announcement reason documented there. */
.drop-igt-grid__item {
    position: relative;
}
.drop-igt-grid__item .drop-card-title a::after {
    content: "";
    position: absolute;
    inset: 0;
    z-index: 1;
}
/* The video-lightbox thumbnail link stays independently clickable ABOVE
   the stretch - for a video card it's a genuinely different destination
   (vimeo.com via the lightbox, not the article), the exact risk that
   held this template back from the earlier pass. Non-video thumbnail
   links don't need this: they already go to the SAME permalink as the
   stretched title link, so there's no functional difference to protect
   either way - confirmed against drop_render_igt_post_grid(), not
   assumed.
   REAL BUG found and fixed live, 30 Aug (Daniel's screenshot - play
   buttons rendering low/misaligned on real video cards) - `position:
   relative` here (needed for the z-index above) made this <a> the
   CONTAINING BLOCK for `.drop-igt-grid__play`'s absolute `top:50%`
   instead of `.drop-card-media` (the intended, outer positioned
   ancestor) - it's the NEARER positioned ancestor, so it wins
   regardless of which one the play-button rule's own comment assumed.
   A plain `<a>` is inline, and an inline element's own box reserves
   extra space below an inline image for the font's descender (the
   classic "image baseline gap", confirmed live: this anchor measured
   ~7.6px taller than the image it wraps) - the button centred on that
   TALLER, inline-quirky box instead of the image itself, reading as
   "low". `display: flex` sidesteps the whole inline-baseline mechanism
   (a flex item's size is its own content size, no descender reserved)
   - this anchor's box now exactly matches its image child, and by
   extension `.drop-card-media`'s own box too, so the play button
   centres correctly regardless of which of the two nested positioned
   ancestors actually resolves its percentage. Scoped to THIS class
   only (video thumbnails), not the sitewide `.drop-card-media img` -
   the same inline-gap quirk likely exists on every other card image
   too, but nothing else on the site positions a child against it by
   percentage, so it's invisible everywhere else; not swept sitewide
   here, out of scope for this specific bug. */
.drop-igt-grid__video-trigger {
    position: relative;
    z-index: 2;
    display: flex;
}
/* Hover affordance, colour only - the exact convention the core card
   grid uses (`.wp-block-post-template .wp-block-post:hover .wp-block-
   post-title a`), not a separate treatment invented for this template. */
.drop-igt-grid__item:hover .drop-card-title a {
    color: var(--wp--preset--color--brand-red);
}
/* Play-button affordance for video cards (2026-08-23, vimeo_video_id
   restoration) - .drop-card-media is already position:relative (see
   its own rule elsewhere in this file), so the play icon just needs
   its own absolute position within that, same as before.
   UPDATED 30 Aug: since the read-more sweep (29 Aug) gave the wrapping
   `.drop-igt-grid__video-trigger` `<a>` its own `position:relative`
   (for the stretched-link z-index fix), THAT anchor - not `.drop-card-
   media` - is now this element's actual containing block (it's the
   nearer positioned ancestor). See `.drop-igt-grid__video-trigger`'s
   own comment for the real bug this caused and the `display:flex` fix
   that made the two boxes match again - this rule itself needed no
   change, just noting where "within that" now actually resolves. */
.drop-igt-grid__play {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    width: 3rem;
    height: 3rem;
    border-radius: 50%;
    background-color: rgba(0, 0, 0, 0.6);
}
.drop-igt-grid__play::after {
    content: "";
    position: absolute;
    top: 50%;
    left: 55%;
    transform: translate(-50%, -50%);
    border-style: solid;
    border-width: 0.5rem 0 0.5rem 0.85rem;
    border-color: transparent transparent transparent var(--wp--preset--color--white);
}

/* Video lightbox <dialog>: rebuilt 2026-10-30, see the IGT Connects UX
   section at the end of this file. */

/* ── .drop-gf-facade styling block REMOVED WHOLESALE 2026-08-28
   (newsletter rebuild) - this scoped GF's default "gravity-theme" CSS
   down to the header's old compact utility-panel form. Nothing renders
   `.drop-gf-facade` markup anywhere on the site any more: the header
   rewrite (above) replaced its two instances (inline + modal) with the
   new drop-newsletter component, which is plain hand-built HTML, not a
   Gravity Forms shortcode/block at all - see mu-plugins/drop-core.php's
   drop_newsletter_submit() for the "why" (GFAPI::submit_form() handles
   the actual submission server-side; nothing in GF's own front-end
   rendering ever runs for this form now). The `drop_gf_facade` shortcode
   and its JS-defer machinery in plugins/drop-blocks.php are removed in
   the same pass - this was their only caller. Other real GF forms on
   the site (Articles/Socials/enquiry/the profile page) were never
   scoped to this class and are completely unaffected. ─────────────── */

/* ── Contact Us: single left axis, 30 Aug (structure pass) - same
   family of bug as Latest News (§1): a `layout:{type:"constrained"}`
   ancestor centres its capped children via auto margins by default,
   and a Page's own post_content sits inside exactly that kind of
   wrapper (`page.html`). Left H1/H2s next to a centred, indented block
   of intro paragraphs read as two different axes on one page - fixed
   by zeroing the auto margin `page.html` was otherwise happy to apply,
   scoped to `body.page` only so single-post prose (already correctly
   left-aligned via a different mechanism, confirmed live before
   writing this) is untouched. Matches every selector the measure-cap
   rule itself targets, not just `<p>`, so lists/blockquotes on ANY
   Page get the same fix.
   `!important` is REQUIRED here, not optional - checked live, not
   guessed: WP core's own constrained-layout centring rule
   (`.is-layout-constrained > :where(...)  { margin-left: auto
   !important; margin-right: auto !important; }`, injected sitewide)
   already carries `!important` itself. A first attempt at this rule
   without `!important` compiled fine and changed nothing live -
   `!important` vs a plain declaration isn't a specificity fight at all,
   the plain one simply never gets to compete. */
body.page .wp-block-post-content > p,
body.page .wp-block-post-content > ul,
body.page .wp-block-post-content > ol,
body.page .wp-block-post-content > blockquote {
    margin-inline: 0 !important;
}

/* ── Contact Us page contact-card grid, REBUILT 30 Aug (structure
   pass) - was background+padding only, layout coming entirely from the
   content's own `wp:group layout:{type:grid,columnCount:3}` attribute.
   No portraits exist yet (flagged to editorial, not blocking this
   build - "this is a relationship industry, faces matter") - a navy
   initial tile stands in until real photos exist.
   Mobile stack ADDED, found live at 390px while checking this pass -
   WP core's own `columnCount:3` grid support has no responsive
   behaviour of its own, so all three cards stayed in one row at
   105px each on a phone screen, unusably narrow (confirmed live, not
   assumed - same real bug as the Directory logo column just above).
   `.drop-contacts` is the real class on the grid wrapper (confirmed
   against the Page's own content, not guessed). */
@media (max-width: 600px) {
    .drop-contacts {
        grid-template-columns: 1fr !important; /* WP's own inline grid-
            template-columns on this block carries no !important, but
            checked live before adding one here anyway, matching the
            "verify, don't guess" convention this pass already needed
            once today (the alignment fix above) - belt and braces. */
    }
}
.drop-contacts__item {
    background-color: var(--wp--preset--color--surface);
    padding: 1.25rem;
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}
.drop-contacts__avatar {
    width: 56px;
    height: 56px;
    border-radius: 50%;
    background: var(--wp--preset--color--brand-navy);
    color: var(--wp--preset--color--white);
    font-family: var(--wp--preset--font-family--display);
    font-weight: 700;
    font-size: 1.1rem;
    display: flex;
    align-items: center;
    justify-content: center;
    margin-bottom: 0.5rem;
}
.drop-contacts__name {
    font-family: var(--wp--preset--font-family--display);
    font-weight: 700;
    font-size: 1.125rem; /* 18px, per the brief */
    margin: 0;
}
.drop-contacts__role {
    font: 700 12px/1.3 var(--font-stamp); /* stamp caps, matches the
        sitewide caps-label convention (.wp-block-post-date/.eyebrow/
        .partner-chip etc.) - this IS that same component, not a new
        treatment invented for this card. */
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: var(--ink-muted);
    margin: 0;
}
.drop-contacts__for {
    font-family: var(--wp--preset--font-family--body); /* body serif,
        per the brief - this is the one piece of running prose on the
        card, everything else on it is a UI label. */
    margin: 0;
}
.drop-contacts__links {
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
    margin-top: 0.25rem;
}
/* REAL BUG found and fixed live, 30 Aug (item 9) - this rule's own
   `text-decoration: none` was LOSING to `.wp-block-post-content p a
   :not(.wp-element-button)` (this file, search "In-content links"):
   `page.html` wraps the whole Contact Us body in `.wp-block-post-
   content`, and these links genuinely sit inside a `<p>` (`<p
   class="drop-contacts__links"><a>...`), so the prose rule's `p a`
   combinator matched them structurally. Confirmed live before fixing:
   computed style showed a persistent serif-coloured underline at rest.
   FIRST FIX ATTEMPT (`.wp-block-post-content .drop-contacts__links a`,
   two classes + one element) shipped, then was caught STILL losing on
   the same live check - `:not(.wp-element-button)` isn't specificity-
   free, it counts as a THIRD class (a `:not()`'s own weight is its
   argument's), so the prose rule is actually (0,2,2), not the (0,1,2)/
   (0,2,1) a quick read of it suggests - a real specificity-counting
   mistake, fixed this time by re-deriving the number properly instead
   of nudging it again by feel. Qualifying with the parent `.drop-
   contacts__item` class too gives this THREE classes (0,3,1), which
   clearly outranks the prose rule's (0,2,2) instead of narrowly losing
   to it again. `font-family: Archivo` - these are data (an email/phone
   number), not a sentence, per the rule recorded on the prose-link
   comment above. */
.wp-block-post-content .drop-contacts__item .drop-contacts__links a {
    display: inline-flex;
    align-items: center;
    min-height: 44px; /* real link targets, per the brief - WCAG 2.5.5 */
    font-family: var(--font-display);
    color: var(--ink-heading);
    text-decoration: none;
}
.wp-block-post-content .drop-contacts__item .drop-contacts__links a:hover,
.wp-block-post-content .drop-contacts__item .drop-contacts__links a:focus-visible {
    text-decoration: underline;
    text-decoration-thickness: 1px;
    text-underline-offset: 0.18em;
}

/* ── Shared inboxes, compact final row (structure pass, 30 Aug) - was
   a loose paragraph ("We can also be contacted at:" + two stacked
   mailto links). Same 44px-target convention as the team cards above,
   laid out as a single row rather than another block of body copy. */
.drop-contacts__shared {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem 2rem;
    align-items: center;
    margin-top: 2rem;
    padding-top: 1.5rem;
    border-top: 1px solid var(--wp--preset--color--divider);
}
.drop-contacts__shared a {
    display: inline-flex;
    align-items: center;
    min-height: 44px;
    font-family: var(--font-display); /* added 30 Aug, item 9 - was
        unset, inheriting the sitewide serif; this is a shared inbox
        address, not a sentence. This one's own `<div>` wrapper (not a
        `<p>`) was never actually caught by the `.wp-block-post-content
        p a` prose rule the way the team-card links were - checked live,
        not assumed - so no specificity fix was needed here, only the
        missing font-family. */
    color: var(--ink-heading);
    text-decoration: none;
}
.drop-contacts__shared a:hover,
.drop-contacts__shared a:focus-visible {
    text-decoration: underline;
    text-decoration-thickness: 1px;
    text-underline-offset: 0.18em;
}

/* ── A11y baseline (Part 24) ──────────────────────────────────────── */
.skip-link {
    position: absolute;
    left: -9999px;
    top: 0;
    z-index: 999;
    background: var(--wp--preset--color--brand-navy);
    color: var(--wp--preset--color--white);
    padding: 0.5rem 1rem;
}
.skip-link:focus {
    left: 0;
}

:focus-visible {
    outline: 2px solid var(--wp--preset--color--brand-red);
    outline-offset: 2px;
}

/* ── Advertise With Us - "What We Deliver" + stats sidebar (2026-09-14,
   Daniel's request: "leverage the space on right of intro to put stats
   etc. into something visually compelling"). Was a single stacked
   column - the intro copy reads at `--measure` width (68ch), leaving a
   genuinely empty right-hand rail at desktop; the stats (previously
   two more full-width sections further down the page) move into that
   rail instead, as one card, using the SAME devices this site already
   uses for "this is real mail" - `.air-frame`/`.air-rule` (§ near
   :root, "Airmail ribbon"), the postmark watermark technique
   (`.drop-house-ad__watermark`, this file), and the `--font-stamp`
   caps-label layer - rather than a generic stat-card-with-gradient.
   Deliberately flat navy, NOT `.air-frame` - a framed unit with a
   navy interior is a proven bad combination on this exact codebase
   (`.drop-house-ad`'s frame was removed 30 Aug for exactly this reason:
   the border's own navy stripe segment merges into a navy fill at the
   seam). Flat tile + postmark watermark is the SAME pattern that
   replaced it there - proven, not reinvented.
   Every number/label here is the rate sheet's own (Sept 2026) wording,
   just laid out as a card instead of a stacked list - no new copy. */
.drop-advertise-intro {
    display: flex;
    align-items: flex-start;
    gap: var(--drop-column-gap);
}
.drop-advertise-intro__copy {
    flex: 3 1 0%;
    min-width: 0;
}
.drop-advertise-stats {
    flex: 2 1 0%;
    min-width: 280px;
    position: relative;
    overflow: hidden; /* clips the watermark, same as .drop-house-ad */
    background: var(--brand-navy);
    color: var(--wp--preset--color--white);
    padding: 28px 28px 24px;
    display: flex;
    flex-direction: column;
    gap: 14px;
}
.drop-advertise-stats__watermark {
    position: absolute;
    right: -18px;
    bottom: -28px;
    height: 260px;
    width: auto;
    opacity: 0.1; /* same restrained texture-not-watermark intent as
        .drop-house-ad__watermark's own 0.08 - a touch higher here since
        this tile is taller and the mark reads smaller relative to it */
    pointer-events: none;
}
.drop-advertise-stats__eyebrow {
    position: relative; /* stacks above the watermark - z-index not
        needed, later in source + non-static watermark is enough, but
        explicit for clarity since this is the FIRST text after it */
    margin: 0;
    font-family: var(--font-stamp);
    font-weight: 700;
    font-size: 0.8rem;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: #E7EEF4; /* audit-allow-hex: same off-white-on-navy tint the
        nav row already uses, 7.94:1 on brand-navy */
}
.drop-advertise-stats__eyebrow span {
    display: block;
    font-weight: 500;
    letter-spacing: 0.04em;
    opacity: 0.8;
}
.drop-advertise-stats__hero-number {
    position: relative;
    margin: 0;
    font-family: var(--font-display);
    font-weight: 800;
    font-size: clamp(2.75rem, 6vw, 3.5rem);
    line-height: 1;
}
.drop-advertise-stats__hero-label {
    position: relative;
    margin: 0;
    font-family: var(--font-stamp);
    font-weight: 700;
    font-size: 0.85rem;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: #E7EEF4; /* audit-allow-hex: see eyebrow above */
}
.drop-advertise-stats .air-rule {
    position: relative;
    margin-block: 2px;
}
.drop-advertise-stats__row {
    position: relative;
    /* 3 equal columns, text centred (Daniel's request, 2026-10-14) - was a
       left-packed flex row whose three stats hugged the left edge of the
       card, leaving the right third empty. `minmax(0, 1fr)` so a long
       label wrapping can't force one column wider than its siblings. */
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 18px;
    text-align: center;
}
.drop-advertise-stats__row > div {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 2px;
}
.drop-advertise-stats__row strong {
    font-family: var(--font-display);
    font-weight: 800;
    font-size: 1.35rem;
    line-height: 1.1;
}
.drop-advertise-stats__row span {
    font-family: var(--font-stamp);
    font-weight: 700;
    font-size: 0.7rem;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: #E7EEF4; /* audit-allow-hex: see eyebrow above */
}
.drop-advertise-stats__manifest {
    position: relative;
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 10px 16px;
    margin: 0;
}
.drop-advertise-stats__manifest div {
    display: flex;
    justify-content: space-between;
    gap: 8px;
    border-bottom: 1px solid rgba(255, 255, 255, 0.14);
    padding-bottom: 6px;
}
/* One row (traffic-source split) is a genuinely longer value than every
   other manifest fact - forcing it into the same two-up grid cell as
   "8,353"/"1,043" wrapped BOTH the label and the value onto their own
   two lines each, reading as visibly messier than its neighbours
   (caught live, screenshotted, before calling this pass done).
   `--wide` spans both grid columns and stacks label above value
   instead, so it reads as a normal short paragraph rather than a
   cramped two-line pair. */
.drop-advertise-stats__manifest div.drop-advertise-stats__manifest-row--wide {
    grid-column: 1 / -1;
    flex-direction: column;
    align-items: flex-start;
    gap: 2px;
}
.drop-advertise-stats__manifest-row--wide dd {
    text-align: left;
}
.drop-advertise-stats__manifest dt {
    font-family: var(--font-stamp);
    font-weight: 500;
    font-size: 0.72rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: #E7EEF4; /* audit-allow-hex: see eyebrow above */
}
.drop-advertise-stats__manifest dd {
    margin: 0;
    font-family: var(--font-display);
    font-weight: 700;
    font-size: 0.85rem;
    text-align: right;
}
.drop-advertise-stats__manifest--compact {
    gap: 6px 16px;
}
.drop-advertise-stats__manifest--compact div {
    border-bottom: none;
    padding-bottom: 0;
}
.drop-advertise-stats__sublabel {
    position: relative;
    margin: 0;
    font-family: var(--font-stamp);
    font-weight: 700;
    font-size: 0.7rem;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: #E7EEF4; /* audit-allow-hex: see eyebrow above */
}

/* Rates & Specs pricing content REMOVED (Daniel's request, 2026-09-19 -
   no pricing displayed on this page any more). Was a 2026-09-16 pass
   that moved a rate list + "$2,500 minimum spend" line into this card;
   the card reverted to a stats/reach summary instead (sourced from the
   same Sept 2026 rate sheet's own audience numbers), reusing this same
   navy-fill/postmark-watermark/air-rule/--font-stamp visual system -
   only the content changed. `.drop-advertise-rates`/`__rate`/`__head`/
   `__channel`/`__price`/`__desc` and `__min-spend` deleted outright -
   zero remaining emitters anywhere in this page's content after the
   rewrite. `.drop-advertise-stats__value` stays - still used for the
   card's "contact us" lead-in line, see its own comment further down. */
.drop-advertise-stats__value {
    position: relative;
    margin: 0;
    font-family: var(--font-body);
    font-size: 0.9rem;
    line-height: 1.5;
    color: #E7EEF4; /* audit-allow-hex: see eyebrow above */
}

/* Contact block, moved INTO this card (2026-09-16, later still -
   Daniel's review: left/right copy duplicated the same "why advertise"
   message twice, and the contact details were an orphaned full-width
   block below both columns). The lead-in line reuses the existing
   `__value` paragraph style (was the removed Value paragraph's class,
   now doing double duty as this card's general on-navy body-text
   style) rather than a new one - same font/size/colour, no new rule
   needed for that line. */
.drop-advertise-stats__contact {
    position: relative;
    margin: 0;
    font-family: var(--font-body);
    font-size: 0.9rem;
    line-height: 1.5;
    color: #E7EEF4; /* audit-allow-hex: see eyebrow above */
}
.drop-advertise-stats__contact a {
    color: #E7EEF4; /* audit-allow-hex: see eyebrow above */
    text-decoration: underline;
}
.drop-advertise-stats__contact a:hover,
.drop-advertise-stats__contact a:focus-visible {
    color: var(--wp--preset--color--white);
}

@media (max-width: 800px) {
    /* Same stack breakpoint as .drop-single-layout elsewhere on this
       site - one owner for "when does a 2-column page layout stack",
       not a new number invented for this one component. */
    .drop-advertise-intro {
        flex-wrap: wrap;
    }
    .drop-advertise-intro__copy,
    .drop-advertise-stats {
        flex-basis: 100%;
    }
}

@media (prefers-reduced-motion: reduce) {
    * {
        animation-duration: 0.01ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: 0.01ms !important;
        scroll-behavior: auto !important;
    }
}

/* ═══════════════════════════════════════════════════════════════════════
   ALTERNATE HOMEPAGES - Option 3 "Split hero" + Option 5 "Rail hero"
   (2026-10-14, Daniel's brief; stakeholder review only)
   ───────────────────────────────────────────────────────────────────────
   Contents
     A. Page frame          .drop-alt, .drop-alt-top, .drop-alt-main
     B. Latest-news grid    .drop-latest (cards reuse the shared card CSS,
                            whose body-class scope now also lists
                            .page-template-home-split / -rail)
     C. Shared hero         .drop-hero (navy panel, controls, text bits)
     D. Option 3            .drop-hero--split
     E. Option 5            .drop-hero--rail (stage, band, rail)
     F. Responsive          <900px stacks, <768px single column

   Everything here is scoped to .drop-alt / .drop-hero / .drop-latest,
   which exist only in templates/home-split.html and home-rail.html, so
   the live homepage (front-page.html, .drop-home-grid) is untouched.
   Spacing owners (§0.4): section rhythm = .is-section padding + the
   explicit section gap below; paragraph rhythm inside the hero = flex
   gap; no ad-hoc margins. WP's flow blockGap injection
   (:root :where(.is-layout-flow) > * + *, 0,1,0) is beaten with two-class
   selectors (0,2,0) on every grid/flex child here.
   Breakpoint note: the sidebar layout starts at 1200px (not 1024px)
   because the Follow card already switches layout at 1200px and the
   split hero's control row needs ~270px of text column.
   ═══════════════════════════════════════════════════════════════════════ */

/* ── A. Page frame ──────────────────────────────────────────────────── */
.drop-alt.drop-alt > * {
    margin-block: 0;
}
.drop-alt.drop-alt > .drop-alt-latest,
.drop-alt.drop-alt > .drop-alt-main {
    margin-top: var(--drop-section-pad);
}
.drop-alt-top,
.drop-alt-main {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: 32px;
    align-items: start;
}
.drop-alt .drop-alt-top > *,
.drop-alt .drop-alt-main > * {
    margin: 0;
}
.drop-alt .drop-alt-top > .drop-follow-card,
.drop-alt .drop-alt-main > .drop-follow-card {
    grid-column: auto;
    grid-row: auto;
    align-self: start;
}
.drop-alt-main > .drop-follow-card {
    order: -1;
}
@media (min-width: 1200px) {
    .drop-alt-top,
    .drop-alt-main {
        grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);
    }
    /* Follow card stretches to the hero's height; heading/blurb stay at the
       top and the two buttons sit on the bottom edge, level with the hero. */
    .drop-alt .drop-alt-top > .drop-follow-card {
        align-self: stretch;
        display: flex;
        flex-direction: column;
    }
    .drop-alt .drop-alt-top > .drop-follow-card .drop-follow-card__ctas {
        margin-top: auto;
    }
    .drop-alt .drop-alt-top > .drop-follow-card .drop-follow-card__blurb {
        margin-bottom: 20px;
    }
    .drop-alt-main > .drop-follow-card {
        order: 0;
    }
}

/* ── B. Latest-news grid ────────────────────────────────────────────── */
.drop-latest .wp-block-post-template {
    display: grid !important;
    grid-template-columns: minmax(0, 1fr);
    gap: 36px 32px;
    list-style: none;
    margin: 0;
    padding: 0;
}
.drop-latest .wp-block-post-template > li {
    /* 2026-10-22 (Daniel): rule BENEATH each article only. The section rule
       above already closes the heading, so a top rule on every card made a
       double line there; the pagination row likewise follows the last
       row's rules, so it carries no top rule of its own. */
    margin: 0;
    border-top: none;
    padding-top: 0;
    border-bottom: 2px solid var(--wp--preset--color--brand-navy);
    padding-bottom: 20px;
}
.drop-latest .wp-block-post-template > li.is-sponsored {
    border-bottom-color: var(--wp--preset--color--brand-red);
}
.drop-latest .wp-block-query-pagination {
    margin-top: 28px;
    padding-block: 0;
}
.drop-alt .drop-home-section-rule {
    margin-bottom: 24px;
}
@media (min-width: 768px) {
    .drop-latest .wp-block-post-template {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }
}
@media (min-width: 1200px) {
    .drop-alt--split .drop-latest .wp-block-post-template {
        grid-template-columns: repeat(3, minmax(0, 1fr));
    }
}

/* ── C. Shared hero ─────────────────────────────────────────────────── */
.drop-hero {
    position: relative;
    display: grid;
    grid-template-rows: 8px auto;
    background: var(--wp--preset--color--brand-navy);
    color: var(--wp--preset--color--white);
}
.drop-hero::before {
    content: "";
    grid-row: 1;
    grid-column: 1 / -1;
    height: 8px;
    --air-pitch: 10px;
    background-image: var(--airmail);
}
.drop-hero__slide[hidden],
.drop-hero__controls[hidden],
.drop-hero__btn[hidden] {
    display: none;
}
.drop-hero a {
    color: inherit;
    text-decoration: none;
}
.drop-hero a:hover,
.drop-hero a:focus-visible {
    text-decoration: underline;
}
/* White ring: the sitewide red ring is ~1.3:1 on navy. */
.drop-hero a:focus-visible,
.drop-hero button:focus-visible {
    outline: 2px solid var(--wp--preset--color--white);
    outline-offset: 2px;
}
.drop-hero__media {
    display: block;
    position: relative;
    overflow: hidden;
    aspect-ratio: 16 / 9;
}
.drop-hero__media > * {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
}
.drop-hero__media img {
    display: block;
    width: 100%;
    height: 100%;
    object-fit: cover;
}
.drop-hero__label,
.drop-hero__kicker time {
    font-family: var(--font-narrow);
    font-weight: 700;
    font-size: 0.75rem;
    letter-spacing: 0.14em;
    text-transform: uppercase;
}
.drop-hero__cat {
    display: inline-block;
    background: var(--wp--preset--color--brand-red);
    color: var(--wp--preset--color--white);
    font-family: var(--font-narrow);
    font-weight: 700;
    font-size: 0.6875rem;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    line-height: 1;
    padding: 5px 9px 4px;
}
.drop-hero__title {
    margin: 0;
    font-family: var(--font-display);
    font-weight: 800;
    text-transform: none;
    letter-spacing: -0.012em;
    line-height: 1.12;
    color: var(--wp--preset--color--white);
    display: -webkit-box;
    -webkit-box-orient: vertical;
    overflow: hidden;
}
.drop-hero__excerpt {
    margin: 0;
    font-family: var(--font-body);
    font-size: 0.9375rem;
    line-height: 1.45;
    color: rgba(255, 255, 255, 0.84);
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 2;
    overflow: hidden;
}
.drop-hero__more {
    display: inline-block;
    font-family: var(--font-narrow);
    font-weight: 700;
    font-size: 0.75rem;
    letter-spacing: 0.12em;
    text-transform: uppercase;
}
.drop-hero__buttons {
    display: flex;
}
.drop-hero__btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 44px;
    height: 44px;
    padding: 0;
    background: transparent;
    color: var(--wp--preset--color--white);
    border: 1px solid rgba(255, 255, 255, 0.4);
    cursor: pointer;
    transition: background-color 0.15s ease;
}
.drop-hero__btn:hover {
    background: rgba(255, 255, 255, 0.12);
}
.drop-hero__btn + .drop-hero__btn {
    margin-left: -1px;
}
.drop-hero__btn--pause .drop-hero__ico-play,
.drop-hero.is-paused .drop-hero__btn--pause .drop-hero__ico-pause {
    display: none;
}
.drop-hero.is-paused .drop-hero__btn--pause .drop-hero__ico-play {
    display: block;
}
@keyframes drop-hero-in {
    from { opacity: 0; }
    to   { opacity: 1; }
}
/* Only the incoming slide animates, and only after the first change (a
   fade on the very first paint would delay the LCP image). */
.drop-hero.has-changed .drop-hero__slide.is-active {
    animation: drop-hero-in 0.35s ease;
}

/* ── D. Option 3 - Split hero ───────────────────────────────────────── */
.drop-hero--split .drop-hero__slides {
    grid-row: 2;
}
.drop-hero--split .drop-hero__slide {
    display: grid;
    grid-template-columns: minmax(0, 58fr) minmax(0, 42fr);
}
.drop-hero--split .drop-hero__slide[hidden] {
    display: none;
}
.drop-hero--split .drop-hero__media {
    /* aspect-ratio grid items default to start on BOTH axes - without an
       explicit width the image box took its width from the stretched
       height and spilled over the text column. */
    align-self: start;
    justify-self: stretch;
    width: 100%;
}
.drop-hero--split {
    container-type: inline-size; /* title size scales with the hero's own width (cqi) */
}
.drop-hero--split .drop-hero__text {
    /* 2026-10-22: the slide's height is owned by the 16:9 image ALONE.
       height:0 + min-height:100% takes the text column out of the row-height
       calculation, so a 3-line headline can no longer make one slide taller
       than another (which also stretched/cropped the image off 16:9). The
       column is sized to fit (headline clamped to 3 lines, excerpt to 2,
       type scaled by cqi) and clipped as a last resort. */
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 8px;
    min-width: 0;
    height: 0;
    min-height: 100%;
    overflow: hidden;
    padding: 18px 20px 12px 26px;
}
.drop-hero--split.drop-hero--multi .drop-hero__text {
    padding-bottom: 60px; /* room for the control row pinned below */
}
.drop-hero__kicker {
    display: flex;
    align-items: center;
    gap: 10px;
    width: 100%;
    margin: 0;
    color: rgba(255, 255, 255, 0.8);
}
.drop-hero__kicker .drop-hero__label {
    color: var(--wp--preset--color--white);
}
.drop-hero__rule {
    flex: 1;
    height: 1px;
    background: rgba(255, 255, 255, 0.3);
}
.drop-hero--split .drop-hero__title {
    font-size: clamp(1.0625rem, 2.6cqi, 1.75rem);
    -webkit-line-clamp: 3;
}
.drop-hero--split .drop-hero__excerpt {
    font-size: clamp(0.8125rem, 1.9cqi, 0.9375rem);
}
.drop-hero--split .drop-hero__controls {
    position: absolute;
    right: 0;
    bottom: 0;
    width: 42%;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 8px;
    padding: 0 20px 16px 26px;
}
.drop-hero__dots {
    display: flex;
}
.drop-hero__dot {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 28px; /* 44px tall; 28px wide so 4 dots + 3 buttons fit the 42% column */
    height: 44px;
    padding: 0;
    background: none;
    border: 0;
    cursor: pointer;
}
.drop-hero__dot span {
    display: block;
    width: 20px;
    height: 4px;
    background: rgba(255, 255, 255, 0.38);
    transition: background-color 0.15s ease;
}
.drop-hero__dot.is-active span {
    background: var(--wp--preset--color--brand-red);
}
.drop-hero__dot:hover span {
    background: rgba(255, 255, 255, 0.7);
}
.drop-hero__dot.is-active:hover span {
    background: var(--wp--preset--color--brand-red);
}

/* ── E. Option 5 - Rail hero ────────────────────────────────────────── */
.drop-hero--rail {
    grid-template-columns: minmax(0, 64fr) minmax(0, 36fr);
}
.drop-hero--rail:not(.drop-hero--multi),
.drop-hero--rail:not(.is-ready) {
    grid-template-columns: minmax(0, 1fr);
}
.drop-hero--rail:not(.is-ready) .drop-hero__rail {
    display: none;
}
.drop-hero__stage {
    grid-row: 2;
    grid-column: 1;
    width: 100%;
    position: relative;
    overflow: hidden;
    aspect-ratio: 16 / 9;
}
.drop-hero--rail .drop-hero__slide {
    position: absolute;
    inset: 0;
}
.drop-hero--rail .drop-hero__media {
    position: absolute;
    inset: 0;
    aspect-ratio: auto;
}
.drop-hero__band {
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: 2;
    padding: 14px 22px 16px;
    background: color-mix(in srgb, var(--wp--preset--color--brand-navy-deep) 94%, transparent);
}
.drop-hero__bandmeta {
    margin: 0 0 5px;
    font-family: var(--font-narrow);
    font-weight: 700;
    font-size: 0.75rem;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: rgba(255, 255, 255, 0.78);
}
.drop-hero--rail .drop-hero__band .drop-hero__title {
    font-size: clamp(1.125rem, 1.7vw, 1.5rem);
    -webkit-line-clamp: 2;
}
.drop-hero__reveal {
    max-height: 0;
    opacity: 0;
    visibility: hidden;
    overflow: hidden;
    transition: max-height 0.3s ease, opacity 0.25s ease, visibility 0s linear 0.3s;
}
.drop-hero__slide:hover .drop-hero__reveal,
.drop-hero__slide:focus-within .drop-hero__reveal {
    max-height: 150px;
    opacity: 1;
    visibility: visible;
    transition: max-height 0.3s ease, opacity 0.25s ease, visibility 0s;
}
.drop-hero__reveal .drop-hero__excerpt {
    margin-top: 10px;
}
.drop-hero__reveal .drop-hero__more {
    margin-top: 10px;
}

.drop-hero__rail {
    grid-row: 2;
    grid-column: 2;
    display: flex;
    flex-direction: column;
    height: 0;          /* the stage sets the row height; the rail fits it */
    min-height: 100%;
    min-width: 0;
    overflow: hidden;
    padding: 12px 18px 10px 22px;
}
.drop-hero__railhead {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 10px;
    flex: none;
    padding-bottom: 6px;
}
.drop-hero__list {
    display: flex;
    flex-direction: column;
    flex: 1;
    min-height: 0;
    margin: 0;
    padding: 0;
    list-style: none;
}
.drop-hero__item {
    position: relative;
    display: flex;
    flex-direction: column;
    flex: 1 1 0;
    min-height: 0;
    margin: 0;
    overflow: hidden;
    border-top: 1px solid rgba(255, 255, 255, 0.18);
}
.drop-hero__item.is-active.has-text {
    flex-grow: 2.4;
}
.drop-hero__item::before {
    content: "";
    position: absolute;
    top: -1px;
    left: 0;
    right: 0;
    height: 3px;
    background: transparent;
}
.drop-hero__item.is-active::before {
    background: var(--wp--preset--color--brand-red);
}
.drop-hero__itembtn {
    display: grid;
    grid-template-columns: 2rem minmax(0, 1fr);
    column-gap: 6px;
    align-items: start;
    width: 100%;
    padding: 12px 0 8px;
    text-align: left;
    background: none;
    border: 0;
    cursor: pointer;
    color: rgba(255, 255, 255, 0.72);
    font: inherit;
}
.drop-hero__itembtn:hover {
    color: var(--wp--preset--color--white);
}
.drop-hero__item.is-active .drop-hero__itembtn {
    color: var(--wp--preset--color--white);
}
.drop-hero__num {
    grid-row: 1 / span 2;
    font-family: var(--font-narrow);
    font-weight: 700;
    font-size: 0.8125rem;
    letter-spacing: 0.08em;
    padding-top: 2px;
    color: rgba(255, 255, 255, 0.6);
}
.drop-hero__item.is-active .drop-hero__num {
    color: var(--wp--preset--color--white);
}
.drop-hero__itemcat {
    grid-column: 2;
    font-family: var(--font-narrow);
    font-weight: 700;
    font-size: 0.6875rem;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: rgba(255, 255, 255, 0.62);
    margin-bottom: 3px;
}
.drop-hero__itemtitle {
    grid-column: 2;
    font-family: var(--font-display);
    font-weight: 600;
    font-size: 0.9375rem;
    line-height: 1.25;
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 3;
    overflow: hidden;
}
.drop-hero__item.is-active .drop-hero__itemtitle {
    font-weight: 800;
}
.drop-hero__itemmore {
    display: none;
    padding: 0 0 8px 2.5rem;
}
.drop-hero__item.is-active .drop-hero__itemmore {
    display: block;
}
.drop-hero__itemmore .drop-hero__excerpt {
    font-size: 0.875rem;
    margin-bottom: 6px;
}

/* ── F. Responsive ──────────────────────────────────────────────────── */
@media (min-width: 1200px) and (max-width: 1279px) {
    /* Narrow sidebar: two 2-up Follow buttons cannot hold the arrow. */
    .drop-alt .drop-follow-card__cta .drop-follow-card__arrow {
        display: none;
    }
}
@media (max-width: 899px) {
    /* Rail drops below the image; the band keeps kicker + headline only
       (no hover on touch - essential content is never behind hover). */
    .drop-hero--rail,
    .drop-hero--rail:not(.is-ready) {
        grid-template-columns: minmax(0, 1fr);
    }
    .drop-hero__rail {
        grid-row: 3;
        grid-column: 1;
        height: auto;
        min-height: 0;
        overflow: visible;
    }
    .drop-hero__list {
        flex: none;
    }
    .drop-hero__item {
        flex: none;
    }
    .drop-hero__reveal {
        display: none;
    }
}
@media (hover: none) {
    .drop-hero__reveal {
        display: none;
    }
}
@media (max-width: 767px) {
    .drop-hero--split .drop-hero__slide {
        grid-template-columns: minmax(0, 1fr);
    }
    .drop-hero--split .drop-hero__text {
        height: auto;
        min-height: 13.5rem; /* fits kicker + badge + 3-line headline + 2-line excerpt, so every slide is the same height */
        overflow: visible;
        padding: 18px 20px;
    }
    .drop-hero--split.drop-hero--multi .drop-hero__text {
        padding-bottom: 8px;
    }
    .drop-hero--split .drop-hero__title {
        font-size: 1.25rem;
    }
    .drop-hero--split .drop-hero__excerpt {
        font-size: 0.9375rem;
    }
    .drop-hero--split .drop-hero__controls {
        position: static;
        grid-row: 3;
        width: auto;
        padding: 0 12px 14px 20px;
    }
    .drop-hero__band {
        padding: 12px 16px 14px;
    }
}

/* Narrow phones (2026-10-14): at 360px the 80px bird + 74px wordmark
   (new logo artwork, same day) ran into the hamburger. Scale the header
   lockup down below 480px; the scrolled/collapsed sizes are already small
   enough and keep their own rules. Header only - the footer lockup has
   the room. */
@media (max-width: 479px) {
    .brand-lockup__bird {
        height: 64px;
    }
    .brand-lockup__word {
        height: 58px;
    }
    .brand-lockup {
        gap: 14px;
    }
}

/* Follow card, full-width layouts (2026-10-23, Daniel): once the card drops
   below the hero / above the grid (<1200px) it spans the page, so the blurb
   no longer stops at the sidebar-width 24ch cap - it flows out to the
   watermark's left edge (~250px reserved for the bird) instead of leaving a
   gap. 24ch stays as the floor so phones are unchanged. */
@media (max-width: 1199px) {
    .drop-follow-card__blurb {
        max-width: max(24ch, calc(100% - 250px));
    }
}

/* In-page anchors clear the fixed header (2026-10-29): nothing set
   scroll-padding, so "#igtcontact" (the new IGT Connects > Contact IGT
   nav link) - like #product-insights / #game-of-the-quarter before it -
   scrolled its heading UNDER the 200px header (measured: target top 0,
   header bottom 200). Anchor jumps happen after the header has shrunk to
   its ~79px scrolled height, so 110px (+ the admin-bar offset for logged-in
   users) leaves a clear gap in both states. */
html {
    scroll-padding-top: calc(135px + var(--mca-admin-bar-h, 0px));
}
/* Why these numbers (2026-10-29, fixed twice - Daniel's screenshot): an
   anchor jump from a fresh load happens while the masthead is still
   EXPANDED; the header then collapses and `.wp-site-blocks`'s JS-set
   padding-top shrinks with it, so the whole page - target included - shifts
   UP by the collapse delta (60px at >=1200: 140 -> 80 band; 39px below:
   118 -> 79). Measured: scroll-padding 165px landed the target at 105px,
   under the 140px scrolled header. So padding = scrolled header + gap +
   delta: >=1200 -> 140 + ~15 + 60 = 215; <1200 -> 79 + ~17 + 39 = 135.
   (Clicking the link from an already-scrolled page has no shift, so the gap
   is simply a little larger there.) */
@media (min-width: 1200px) {
    html {
        scroll-padding-top: calc(215px + var(--mca-admin-bar-h, 0px));
    }
}

/* IGT Connects sidebar promo tiles (2026-10-30, Daniel) - drop/igt-promo-tile
   (plugins/drop-blocks/igt-promo.php). White cards on the grey sidebar panel,
   16:9 image of the section's latest article, title, one-line blurb, the
   latest article's title and a "View all" cue. The whole tile is one link.
   Two classes so the (0,1,0) blockGap sibling margin cannot win. */
.drop-single-sidebar-panel .drop-igt-promo {
    display: block;
    margin: 0 0 20px;
    background: var(--wp--preset--color--white);
    border-top: 2px solid var(--wp--preset--color--brand-navy);
    color: var(--wp--preset--color--ink);
    text-decoration: none;
}
.drop-igt-promo__media {
    display: block;
    aspect-ratio: 16 / 9;
    overflow: hidden;
    background: var(--wp--preset--color--surface);
}
.drop-igt-promo__media > * {
    width: 100%;
    height: 100%;
}
.drop-igt-promo__media img {
    display: block;
    width: 100%;
    height: 100%;
    object-fit: cover;
}
.drop-igt-promo__body {
    display: block;
    padding: 14px 16px 16px;
}
.drop-igt-promo__title {
    display: block;
    font-family: var(--font-display);
    font-weight: 800;
    font-size: 1.25rem;
    line-height: 1.15;
    color: var(--wp--preset--color--ink-heading);
}
.drop-igt-promo__blurb {
    display: block;
    margin-top: 8px;
    font-family: var(--font-body);
    font-size: 0.9375rem;
    line-height: 1.45;
}
.drop-igt-promo__latest {
    display: block;
    margin-top: 10px;
    font-family: var(--font-body);
    font-size: 0.875rem;
    line-height: 1.35;
    color: var(--wp--preset--color--ink-muted);
}
.drop-igt-promo__latest-label {
    font-family: var(--font-narrow);
    font-weight: 700;
    font-size: 0.6875rem;
    letter-spacing: 0.12em;
    text-transform: uppercase;
}
.drop-igt-promo__cta {
    display: block;
    margin-top: 12px;
    font-family: var(--font-narrow);
    font-weight: 700;
    font-size: 0.75rem;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--wp--preset--color--brand-red);
}
.drop-igt-promo:hover .drop-igt-promo__title,
.drop-igt-promo:focus-visible .drop-igt-promo__title {
    text-decoration: underline;
}
.drop-igt-promo:focus-visible {
    outline: 2px solid var(--wp--preset--color--brand-red);
    outline-offset: 2px;
}

/* Contact IGT in the MAIN column (2026-10-30, Daniel: moved out of the right
   sidebar to sit under the section grid on the left). Wide column, so the
   three regional contacts sit side by side from tablet up; long addresses
   wrap rather than overflow. Stacks to one column on phones. */
.drop-single-layout__main .drop-igt-contact {
    margin-block-start: 2.5rem;
}
.drop-single-layout__main .drop-igt-contact__list {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: 1.25rem 1.5rem;
}
@media (min-width: 768px) {
    .drop-single-layout__main .drop-igt-contact__list {
        grid-template-columns: repeat(3, minmax(0, 1fr));
    }
}
.drop-single-layout__main .drop-igt-contact__details p {
    overflow-wrap: anywhere;
}

/* Logo variant of the IGT promo tile (2026-10-30): the IGT logo, contained on
   white, in place of an article photo (Industry Knowledge Bank tile). */
.drop-igt-promo__media.is-logo {
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--wp--preset--color--white);
    padding: 20px 36px;
}
.drop-igt-promo__media.is-logo img {
    width: auto;
    max-width: 100%;
    height: auto;
    max-height: 100%;
    object-fit: contain;
}

/* Contact IGT in the main column, wide layout: photo ABOVE the name/email so
   each of the three columns gives the address its full width (side-by-side
   left ~156px and broke "...@igt.com" mid-word at 1440). */
@media (min-width: 768px) {
    .drop-single-layout__main .drop-igt-contact__item {
        flex-direction: column;
        align-items: flex-start;
        gap: 0.75rem;
    }
    .drop-single-layout__main .drop-igt-contact__details p {
        overflow-wrap: break-word;
    }
}

/* IGT pages: close the gap between the H1 hairline and the content (Daniel,
   2026-10-30). Measured on /igt-connects/ at 1440: hairline 308px -> intro
   heading 394px = 86px, stacked from the H1's 12px bottom margin + the
   blockGap sibling margin (20px) + the .is-section padding-top (50px) + the
   intro's own 16px padding. Now ONE owner: the main column's 16px top padding
   (plus the H1's own 12px and a 4px layout pad) = ~32px on all three IGT pages
   (Game of the Quarter hub, Product Insights, Industry Knowledge Bank).
   Scoped via :has(.drop-igt-contact) - the Contact IGT block exists on exactly
   these pages - so Top Jobs and other single-layout pages keep their rhythm.
   Sidebar tile still lines up with the first heading (panel pad 20px vs main
   pad 16px + heading line gap, as before). */
.wp-block-post-content > h1:first-of-type + .drop-single-layout:has(.drop-igt-contact) {
    margin-block-start: 0;
    padding-block-start: 4px;
}
.drop-single-layout:has(.drop-igt-contact) .drop-single-layout__main {
    padding-block-start: 16px;
}
.drop-single-layout:has(.drop-igt-contact) .drop-igt-intro {
    padding-block-start: 0;
}

/* ══════════════════════════════════════════════════════════════════════
   IGT Connects UX round (2026-10-30) - blocks in plugins/drop-blocks/
   igt-connects.php, per the "IGT Connects - proposed changes" mockups.
   Everything is scoped to .drop-igt-* / .drop-video-modal / .drop-
   breadcrumb. Vertical rhythm between blocks has ONE owner: the
   two-class `.wp-block-post-content .drop-igt-*` margin (0,2,0 - beats
   the WP blockGap rule, which only ties a single class).
   Red TEXT on light uses brand-red-dark (AA); brand-red is for fills.
   ══════════════════════════════════════════════════════════════════════ */
.wp-block-post-content .drop-igt-hero,
.wp-block-post-content .drop-igt-gotq,
.wp-block-post-content .drop-igt-doors,
.wp-block-post-content .drop-igt-talk,
.wp-block-post-content .drop-igt-chips,
.wp-block-post-content .drop-igt-kb,
.wp-block-post-content .drop-igt-cta {
    margin-block: 0 clamp(2rem, 4vw, 3.25rem);
}

/* shared button */
.drop-igt-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-height: 48px;
    padding: 0 1.5rem;
    background: var(--brand-red);
    color: var(--wp--preset--color--white);
    font-family: var(--font-display);
    font-weight: 700;
    font-size: 1rem;
    line-height: 1.2;
    text-decoration: none;
    border-radius: 2px;
    white-space: nowrap;
}
.drop-igt-btn:hover {
    background: var(--wp--preset--color--brand-red-dark);
    color: var(--wp--preset--color--white);
}
.drop-igt-btn:focus-visible {
    outline: 3px solid var(--brand-navy);
    outline-offset: 2px;
}

/* ── intro card ───────────────────────────────────────────────────── */
.drop-igt-hero {
    display: grid;
    grid-template-columns: 260px minmax(0, 1fr);
    background: var(--wp--preset--color--white);
    border: 1px solid var(--wp--preset--color--divider);
    border-top: 4px solid var(--brand-navy);
}
.drop-igt-hero__brand {
    display: flex;
    flex-direction: column;
    justify-content: center;
    gap: 0.75rem;
    padding: 0 1.75rem;
    margin-block: 2rem;
    border-right: 1px solid var(--wp--preset--color--divider);
}
.drop-igt-hero__logo {
    display: block;
    width: 170px;
    max-width: 100%;
    height: auto;
}
.drop-igt-hero .drop-igt-hero__partner {
    margin: 0;
    font-size: 0.9375rem;
    color: var(--ink-muted);
}
.drop-igt-hero__partner strong {
    font-family: var(--font-display);
    color: var(--ink-heading);
}
.drop-igt-hero__body {
    padding: 2rem clamp(1.5rem, 3vw, 3rem) 2.25rem;
}
.drop-igt-hero .drop-igt-hero__eyebrow {
    margin: 0 0 0.5rem;
    font-family: var(--font-stamp);
    font-size: 0.8125rem;
    font-weight: 700;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: var(--wp--preset--color--brand-red-dark);
}
.drop-igt-hero .drop-igt-hero__title {
    margin: 0 0 1rem;
    font-family: var(--font-display);
    font-size: clamp(1.75rem, 3.2vw, 2.75rem);
    line-height: 1.12;
    color: var(--ink-heading);
    text-transform: none;
    letter-spacing: 0;
}
.drop-igt-hero .drop-igt-hero__text {
    margin: 0 0 1.5rem;
    max-width: 62ch;
    font-size: 1.125rem;
    line-height: 1.6;
}
.drop-igt-hero__actions {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 1rem 1.75rem;
}
.drop-igt-hero__links ul {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem 1.75rem;
    margin: 0;
    padding: 0;
    list-style: none;
}
.drop-igt-hero__links li {
    margin: 0;
}
.drop-igt-hero__link {
    font-family: var(--font-display);
    font-weight: 700;
    color: var(--wp--preset--color--brand-red-dark);
    text-decoration: underline;
    text-underline-offset: 3px;
}
.drop-igt-hero__link:hover {
    color: var(--brand-navy);
}

/* ── section header row (GotQ) ────────────────────────────────────── */
.drop-igt-sechead {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    justify-content: space-between;
    gap: 0.5rem 1.5rem;
    margin-bottom: 1.25rem;
    padding-bottom: 0.75rem;
    border-bottom: 1px solid var(--wp--preset--color--divider);
}
.drop-igt-sechead .drop-igt-sechead__title {
    margin: 0;
    font-family: var(--font-display);
    font-size: clamp(1.5rem, 2.4vw, 2rem);
    line-height: 1.15;
    color: var(--ink-heading);
    text-transform: none;
    letter-spacing: 0;
}
.drop-igt-sechead__link {
    font-family: var(--font-display);
    font-weight: 700;
    font-size: 0.9375rem;
    color: var(--wp--preset--color--brand-red-dark);
    text-decoration: underline;
    text-underline-offset: 3px;
}
.drop-igt-sechead__link:hover {
    color: var(--brand-navy);
}

/* ── Game of the Quarter: two EQUAL cards ─────────────────────────── */
.drop-igt-gotq__grid {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: clamp(1rem, 2.5vw, 2rem);
    margin: 0;
    padding: 0;
    list-style: none;
}
.drop-igt-gotq .drop-igt-gotq__card {
    position: relative;
    display: flex;
    flex-direction: column;
    margin: 0;
    background: var(--wp--preset--color--white);
    border: 1px solid var(--wp--preset--color--divider);
}
.drop-igt-gotq__media {
    display: block;
    aspect-ratio: 16 / 9;
    overflow: hidden;
    background: var(--wp--preset--color--surface);
}
.drop-igt-gotq__media img {
    display: block;
    width: 100%;
    height: 100%;
    object-fit: cover;
}
.drop-igt-gotq__body {
    display: flex;
    flex: 1 1 auto;
    flex-direction: column;
    gap: 0.5rem;
    padding: 1.25rem 1.5rem 1.5rem;
}
.drop-igt-gotq .drop-igt-gotq__title {
    margin: 0;
    font-family: var(--font-display);
    font-size: clamp(1.25rem, 2vw, 1.625rem);
    line-height: 1.2;
    color: var(--ink-heading);
    text-transform: none;
    letter-spacing: 0;
}
.drop-igt-gotq__title a {
    color: inherit;
    text-decoration: none;
}
/* one link, whole card clickable */
.drop-igt-gotq__title a::after {
    content: "";
    position: absolute;
    inset: 0;
}
.drop-igt-gotq__card:hover .drop-igt-gotq__title a {
    text-decoration: underline;
    text-underline-offset: 3px;
}
.drop-igt-gotq__card:focus-within {
    outline: 3px solid var(--brand-navy);
    outline-offset: 2px;
}
.drop-igt-gotq .drop-igt-gotq__excerpt {
    margin: 0;
    font-size: 1rem;
    line-height: 1.55;
}
.drop-igt-gotq__cta {
    margin-top: auto;
    padding-top: 0.25rem;
    font-family: var(--font-display);
    font-weight: 700;
    font-size: 0.9375rem;
    color: var(--wp--preset--color--brand-red-dark);
}

/* ── doorway cards ────────────────────────────────────────────────── */
.drop-igt-doors {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: clamp(1rem, 2.5vw, 2rem);
}
.drop-igt-door {
    display: grid;
    grid-template-columns: 42% minmax(0, 1fr);
    background: var(--wp--preset--color--white);
    border: 1px solid var(--wp--preset--color--divider);
    color: inherit;
    text-decoration: none;
}
.drop-igt-door:hover .drop-igt-door__title {
    text-decoration: underline;
    text-underline-offset: 3px;
}
.drop-igt-door:focus-visible {
    outline: 3px solid var(--brand-navy);
    outline-offset: 2px;
}
.drop-igt-door__media {
    position: relative;
    display: block;
    min-height: 100%;
    overflow: hidden;
    background: var(--wp--preset--color--surface);
}
.drop-igt-door__media img {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
}
.drop-igt-door__body {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    padding: 1.5rem;
}
.drop-igt-door__title {
    font-family: var(--font-display);
    font-weight: 700;
    font-size: clamp(1.25rem, 1.8vw, 1.5rem);
    line-height: 1.2;
    color: var(--ink-heading);
}
.drop-igt-door__blurb {
    font-size: 1rem;
    line-height: 1.55;
}
.drop-igt-door__cta {
    margin-top: auto;
    padding-top: 0.5rem;
    font-family: var(--font-display);
    font-weight: 700;
    font-size: 0.9375rem;
    color: var(--wp--preset--color--brand-red-dark);
}

/* ── Talk to IGT band ─────────────────────────────────────────────── */
.drop-igt-talk {
    padding: clamp(1.5rem, 3vw, 2.5rem) clamp(1.25rem, 3.5vw, 3rem);
    background: var(--brand-navy);
    color: var(--wp--preset--color--white);
}
.drop-igt-talk__head {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-start;
    justify-content: space-between;
    gap: 1.25rem 2rem;
    margin-bottom: 1.5rem;
}
.drop-igt-talk__intro {
    flex: 1 1 24rem;
    max-width: 44rem;
}
.drop-igt-talk .drop-igt-talk__title {
    margin: 0 0 0.5rem;
    font-family: var(--font-display);
    font-size: clamp(1.5rem, 2.4vw, 2rem);
    line-height: 1.15;
    color: var(--wp--preset--color--white);
    text-transform: none;
    letter-spacing: 0;
}
.drop-igt-talk .drop-igt-talk__text {
    margin: 0;
    font-size: 1.0625rem;
    line-height: 1.55;
    color: var(--wp--preset--color--white);
}
.drop-igt-talk .drop-igt-btn:focus-visible {
    outline-color: var(--wp--preset--color--white);
}
.drop-igt-talk__reps {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 1rem;
    margin: 0;
    padding: 0;
    list-style: none;
}
.drop-igt-talk .drop-igt-talk__rep {
    display: flex;
    align-items: flex-start;
    gap: 1rem;
    margin: 0;
    padding: 1rem 1.25rem;
    background: var(--brand-navy-deep);
}
.drop-igt-talk__photo {
    flex: none;
    width: 128px;
    height: 128px;
    border-radius: 50%;
    object-fit: cover;
    background: var(--wp--preset--color--white);
}
.drop-igt-talk__who {
    display: flex;
    min-width: 0;
    flex-direction: column;
    gap: 0.125rem;
}
.drop-igt-talk__state {
    font-family: var(--font-stamp);
    font-size: 0.8125rem;
    font-weight: 700;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: color-mix(in srgb, var(--brand-red) 45%, var(--wp--preset--color--white));
}
.drop-igt-talk__name {
    font-family: var(--font-display);
    font-weight: 700;
    font-size: 1.125rem;
    color: var(--wp--preset--color--white);
}
.drop-igt-talk__email {
    overflow-wrap: anywhere;
    color: var(--wp--preset--color--white);
    text-decoration: underline;
    text-underline-offset: 3px;
}
.drop-igt-talk__email:hover {
    text-decoration-thickness: 2px;
}

/* ── breadcrumb ───────────────────────────────────────────────────── */
.drop-breadcrumb {
    margin: 0 0 0.75rem;
}
.drop-breadcrumb ol {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.25rem 0.5rem;
    margin: 0;
    padding: 0;
    list-style: none;
    font-family: var(--font-stamp);
    font-size: 0.8125rem;
    font-weight: 700;
    letter-spacing: 0.12em;
    text-transform: uppercase;
}
.drop-breadcrumb li {
    margin: 0;
    color: var(--ink-muted);
}
.drop-breadcrumb li + li::before {
    content: "\203A";
    margin-right: 0.5rem;
    color: var(--ink-muted);
}
.drop-breadcrumb a {
    color: var(--wp--preset--color--brand-red-dark);
    text-decoration: none;
}
.drop-breadcrumb a:hover {
    text-decoration: underline;
    text-underline-offset: 3px;
}

/* ── Knowledge Bank: chips + series ───────────────────────────────── */
.drop-igt-chips ul {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
    margin: 0;
    padding: 0 0 1.5rem;
    list-style: none;
    border-bottom: 1px solid var(--wp--preset--color--divider);
}
.drop-igt-chips li {
    margin: 0;
}
.drop-igt-chip {
    display: inline-flex;
    align-items: center;
    min-height: 44px;
    padding: 0 1rem;
    background: var(--wp--preset--color--white);
    border: 1px solid var(--wp--preset--color--divider);
    font-family: var(--font-display);
    font-weight: 700;
    font-size: 0.9375rem;
    color: var(--ink-heading);
    text-decoration: none;
}
.drop-igt-chip:hover,
.drop-igt-chip.is-current {
    background: var(--brand-navy);
    border-color: var(--brand-navy);
    color: var(--wp--preset--color--white);
}
.drop-igt-chip:focus-visible {
    outline: 3px solid var(--brand-navy);
    outline-offset: 2px;
}
.drop-igt-kb {
    display: flex;
    flex-direction: column;
    gap: clamp(2rem, 4vw, 3rem);
}
.drop-igt-kb .drop-igt-series {
    margin: 0;
}
.drop-igt-series .drop-igt-series__title {
    margin: 0 0 1rem;
    font-family: var(--font-display);
    font-size: clamp(1.375rem, 2.2vw, 1.75rem);
    line-height: 1.15;
    color: var(--ink-heading);
    text-transform: none;
    letter-spacing: 0;
}

/* play badge, bottom-left of any still */
.drop-igt-play {
    position: absolute;
    left: 0.75rem;
    bottom: 0.75rem;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 44px;
    height: 44px;
    border-radius: 50%;
    background: var(--brand-red);
    color: var(--wp--preset--color--white);
}
.drop-igt-play svg {
    margin-left: 2px;
}

/* series with an episode list */
.drop-igt-feature {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    background: var(--wp--preset--color--white);
    border: 1px solid var(--wp--preset--color--divider);
}
.drop-igt-feature__still {
    position: relative;
    display: block;
    aspect-ratio: 16 / 9;
    overflow: hidden;
    background: var(--wp--preset--color--surface);
}
.drop-igt-feature__still img {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
}
.drop-igt-feature__list {
    display: flex;
    flex-direction: column;
    margin: 0;
    padding: 0;
    list-style: none;
}
.drop-igt-feature__list li {
    flex: 1 1 auto;
    margin: 0;
    border-bottom: 1px solid var(--wp--preset--color--divider);
}
.drop-igt-feature__list li:last-child {
    border-bottom: 0;
}
.drop-igt-ep {
    display: flex;
    align-items: center;
    gap: 1rem;
    height: 100%;
    min-height: 44px;
    padding: 0.5rem 1.25rem;
    font-family: var(--font-display);
    font-weight: 700;
    line-height: 1.3;
    color: var(--ink-heading);
    text-decoration: none;
}
.drop-igt-ep:hover .drop-igt-ep__title {
    text-decoration: underline;
    text-underline-offset: 3px;
}
.drop-igt-ep:focus-visible {
    outline: 3px solid var(--brand-navy);
    outline-offset: -3px;
}
.drop-igt-ep__num {
    display: inline-flex;
    flex: none;
    align-items: center;
    justify-content: center;
    width: 2rem;
    height: 2rem;
    border: 2px solid var(--brand-navy);
    border-radius: 50%;
    font-size: 0.875rem;
}

/* video cards */
.drop-igt-vgrid {
    display: grid;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    gap: clamp(1rem, 2vw, 1.5rem);
    margin: 0;
    padding: 0;
    list-style: none;
}
.drop-igt-vgrid .drop-igt-vcard {
    position: relative;
    display: flex;
    flex-direction: column;
    margin: 0;
    background: var(--wp--preset--color--white);
    border: 1px solid var(--wp--preset--color--divider);
}
.drop-igt-vcard__still {
    position: relative;
    display: block;
    aspect-ratio: 16 / 9;
    overflow: hidden;
    background: var(--wp--preset--color--surface);
}
.drop-igt-vcard__still img {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
}
.drop-igt-vcard__body {
    display: flex;
    flex: 1 1 auto;
    flex-direction: column;
    gap: 0.375rem;
    padding: 0.875rem 1rem 1rem;
}
.drop-igt-vcard__label {
    font-family: var(--font-stamp);
    font-size: 0.75rem;
    font-weight: 700;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--ink-muted);
}
.drop-igt-vcard .drop-igt-vcard__title {
    margin: 0;
    font-family: var(--font-display);
    font-size: 1.0625rem;
    line-height: 1.3;
    color: var(--ink-heading);
    text-transform: none;
    letter-spacing: 0;
}
.drop-igt-vcard__title a {
    color: inherit;
    text-decoration: none;
}
.drop-igt-vcard__title a::after {
    content: "";
    position: absolute;
    inset: 0;
}
.drop-igt-vcard:hover .drop-igt-vcard__title a {
    text-decoration: underline;
    text-underline-offset: 3px;
}
.drop-igt-vcard:focus-within {
    outline: 3px solid var(--brand-navy);
    outline-offset: 2px;
}

/* closing band (Knowledge Bank) */
.drop-igt-cta {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: 1rem 2rem;
    padding: clamp(1.25rem, 3vw, 2rem) clamp(1.25rem, 3.5vw, 2rem);
    background: var(--brand-navy);
    color: var(--wp--preset--color--white);
}
.drop-igt-cta .drop-igt-cta__title {
    margin: 0 0 0.25rem;
    font-family: var(--font-display);
    font-size: clamp(1.25rem, 2vw, 1.5rem);
    line-height: 1.2;
    color: var(--wp--preset--color--white);
    text-transform: none;
    letter-spacing: 0;
}
.drop-igt-cta .drop-igt-cta__text {
    margin: 0;
    color: var(--wp--preset--color--white);
}
.drop-igt-cta .drop-igt-btn:focus-visible {
    outline-color: var(--wp--preset--color--white);
}

/* ── Product Insights: card titles align across a row; odd-count featured
   card spans the full row (the sidebar is NOT sticky: Daniel, 2026-10-30,
   it is too deep to scroll well with a stuck column) ─────── */
.drop-igt-grid__item .drop-card-title {
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 3;
    line-clamp: 3;
    overflow: hidden;
}
.drop-igt-grid .drop-igt-grid__item.is-featured {
    grid-column: 1 / -1;
}
/* ── mobile (design: intro -> GotQ stacked -> doorways with 112px thumb ->
   contact) ─────────────────────────────────────────────────────────── */
@media (max-width: 1100px) {
    .drop-igt-vgrid {
        grid-template-columns: repeat(3, minmax(0, 1fr));
    }
}
@media (max-width: 900px) {
    .drop-igt-talk__reps {
        grid-template-columns: minmax(0, 1fr);
    }
    .drop-igt-vgrid {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }
}
@media (max-width: 768px) {
    .drop-igt-hero {
        grid-template-columns: minmax(0, 1fr);
    }
    .drop-igt-hero__brand {
        margin-block: 0;
        padding: 1.5rem 1.25rem 1rem;
        border-right: 0;
        border-bottom: 1px solid var(--wp--preset--color--divider);
    }
    .drop-igt-hero__logo {
        width: 150px;
    }
    .drop-igt-hero__body {
        padding: 1.5rem 1.25rem 1.75rem;
    }
    .drop-igt-hero__actions {
        flex-direction: column;
        align-items: stretch;
        gap: 1rem;
    }
    .drop-igt-hero__actions .drop-igt-btn {
        width: 100%;
    }
    .drop-igt-gotq__grid {
        grid-template-columns: minmax(0, 1fr);
    }
    .drop-igt-doors {
        grid-template-columns: minmax(0, 1fr);
    }
    .drop-igt-door {
        grid-template-columns: 112px minmax(0, 1fr);
    }
    .drop-igt-door__body {
        padding: 1rem;
    }
    .drop-igt-door__blurb {
        font-size: 0.9375rem;
    }
    .drop-igt-feature {
        grid-template-columns: minmax(0, 1fr);
    }
    .drop-igt-talk__head .drop-igt-btn {
        width: 100%;
    }
    .drop-igt-talk__photo {
        width: 96px;
        height: 96px;
    }
    .drop-igt-cta .drop-igt-btn {
        width: 100%;
    }
}
@media (max-width: 520px) {
    .drop-igt-vgrid {
        grid-template-columns: minmax(0, 1fr);
    }
}

/* ── video lightbox (rebuilt) ─────────────────────────────────────── */
html.drop-modal-open {
    overflow: hidden;
}
.drop-video-modal {
    width: min(94vw, 1100px);
    max-width: 94vw;
    max-height: 100dvh;
    margin: auto;
    padding: 0;
    border: 0;
    background: transparent;
    color: var(--wp--preset--color--white);
    overflow: visible;
}
.drop-video-modal::backdrop {
    background: rgba(14, 38, 55, 0.94); /* audit-allow-hex: rgba overlay, brand-navy-deep at 94% - no alpha token exists */
}
.drop-video-modal__bar {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 1rem;
    margin-bottom: 1rem;
}
.drop-video-modal__heading {
    min-width: 0;
}
.drop-video-modal .drop-video-modal__series {
    margin: 0 0 0.25rem;
    font-family: var(--font-stamp);
    font-size: 0.8125rem;
    font-weight: 700;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: color-mix(in srgb, var(--brand-red) 45%, var(--wp--preset--color--white));
}
.drop-video-modal .drop-video-modal__title {
    margin: 0;
    font-family: var(--font-display);
    font-size: clamp(1.25rem, 2.6vw, 2rem);
    line-height: 1.15;
    color: var(--wp--preset--color--white);
    text-transform: none;
    letter-spacing: 0;
}
.drop-video-modal__close {
    display: inline-flex;
    flex: none;
    align-items: center;
    justify-content: center;
    gap: 0.5rem;
    min-width: 44px;
    min-height: 44px;
    padding: 0 1.125rem;
    background: var(--wp--preset--color--white);
    border: 2px solid var(--wp--preset--color--white);
    border-radius: 2px;
    font-family: var(--font-display);
    font-weight: 700;
    font-size: 1rem;
    color: var(--brand-navy);
    cursor: pointer;
}
.drop-video-modal__close:hover {
    background: var(--wp--preset--color--surface);
}
.drop-video-modal__close:focus-visible {
    outline: 3px solid color-mix(in srgb, var(--brand-red) 45%, var(--wp--preset--color--white));
    outline-offset: 3px;
}
.drop-video-modal__body {
    position: relative;
    aspect-ratio: 16 / 9;
    max-height: calc(100dvh - 11rem);
    margin-inline: auto;
    background: #000; /* audit-allow-hex: video letterbox background - deliberate neutral black, never behind text */
}
.drop-video-modal__body iframe {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    border: 0;
}
.drop-video-modal__foot {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem 1.5rem;
    margin-top: 0.75rem;
    font-size: 0.9375rem;
}
.drop-video-modal__hint {
    color: color-mix(in srgb, var(--wp--preset--color--white) 80%, transparent);
}
.drop-video-modal__next {
    display: inline-flex;
    align-items: center;
    min-height: 44px;
    font-family: var(--font-display);
    font-weight: 700;
    color: var(--wp--preset--color--white);
    text-decoration: underline;
    text-underline-offset: 3px;
}
.drop-video-modal__next[hidden] {
    display: none;
}
.drop-video-modal__next:focus-visible {
    outline: 3px solid color-mix(in srgb, var(--brand-red) 45%, var(--wp--preset--color--white));
    outline-offset: 3px;
}

/* Knowledge Bank intro line (2026-10-30) - sits under the H1 hairline. */
.wp-block-post-content .drop-igt-lede {
    max-width: 62ch;
    margin: 0 0 1.5rem;
    font-size: 1.125rem;
    line-height: 1.6;
}

/* Card rows: titles start level across a row (same-height images); the
   excerpt follows its own title directly. A subgrid that also aligned the
   excerpts was tried 2026-10-30 and removed - it padded the shorter title
   with a large gap (Daniel's screenshot). */

/* ── IGT single-post sidebar (2026-10-30): "more" list + compact contact ── */
.drop-single-sidebar-panel .drop-igt-more,
.drop-single-sidebar-panel .drop-igt-sidecontact {
    margin-block: 1.5rem 0;
}
.drop-igt-more .drop-igt-more__title,
.drop-igt-sidecontact .drop-igt-sidecontact__title {
    margin: 0 0 0.75rem;
    font-family: var(--font-display);
    font-size: 1.25rem;
    line-height: 1.2;
    color: var(--ink-heading);
    text-transform: none;
    letter-spacing: 0;
}
.drop-igt-sidecontact__title a {
    color: inherit;
    text-decoration: none;
}
.drop-igt-sidecontact__title a:hover {
    text-decoration: underline;
    text-underline-offset: 3px;
}
.drop-igt-more ul,
.drop-igt-sidecontact__reps {
    margin: 0;
    padding: 0;
    list-style: none;
}
.drop-igt-more li {
    margin: 0;
    border-top: 1px solid var(--wp--preset--color--divider);
}
.drop-igt-more li:last-child {
    border-bottom: 1px solid var(--wp--preset--color--divider);
}
.drop-igt-more a {
    display: block;
    min-height: 44px;
    padding: 0.625rem 0;
    font-family: var(--font-display);
    font-weight: 700;
    line-height: 1.3;
    color: var(--ink-heading);
    text-decoration: none;
}
.drop-igt-more a:hover {
    text-decoration: underline;
    text-underline-offset: 3px;
}
.drop-igt-sidecontact .drop-igt-sidecontact__text {
    margin: 0 0 1rem;
    font-size: 0.9375rem;
    line-height: 1.5;
}
.drop-igt-sidecontact__reps li {
    display: flex;
    align-items: center;
    gap: 0.875rem;
    margin: 0 0 0.875rem;
}
.drop-igt-sidecontact__photo {
    flex: none;
    width: 64px;
    height: 64px;
    border-radius: 50%;
    object-fit: cover;
}
.drop-igt-sidecontact__reps li > div {
    display: flex;
    min-width: 0;
    flex-direction: column;
}
.drop-igt-sidecontact__state {
    font-family: var(--font-stamp);
    font-size: 0.75rem;
    font-weight: 700;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--ink-muted);
}
.drop-igt-sidecontact__name {
    font-family: var(--font-display);
    font-weight: 700;
    color: var(--ink-heading);
}
.drop-igt-sidecontact__reps a {
    overflow-wrap: anywhere;
    font-size: 0.9375rem;
    color: var(--wp--preset--color--brand-red-dark);
}

/* ── Gravity Forms fields (profile page, form 2) - 2026-11-04. GF 3.2's
   "no-framework" theme ships NO field styling, so every control was a
   native browser widget: macOS draws a <select> as a grey gradient bar
   (the computed background was white, the OS paints over it), and text
   inputs kept the UA inset border. One look for text, email and select,
   matching the newsletter form's own input (.drop-newsletter__row).
   The Submit joins the `.drop-btn` rule group above - one button
   definition, not a copy. Selects: appearance:none removes the OS
   chrome, so the arrow is supplied here as two gradient triangles
   (no hex, no data-URI, and gradients cannot tile into a hatch the way
   a hover-injected background-image can, STANDARDS 13.1). Base colour is
   set with `background-color`, never the `background` shorthand, which
   would wipe the arrow. Two-class selectors beat GF's single-class
   sheet without !important; the button is the same (0,3,0). */
.gform_wrapper .gfield input[type="text"],
.gform_wrapper .gfield input[type="email"],
.gform_wrapper .gfield select {
    box-sizing: border-box;
    width: 100%;
    /* !important on these two only (STANDARDS 13.1): GF's basic.min.css
       sizes inputs with `.gform_wrapper.gravity-theme input:not(...)x4`
       (specificity 0,6,1), which no sane selector here out-ranks. */
    min-height: 44px !important;
    padding: 0.5rem 0.75rem !important;
    border: 1px solid var(--wp--preset--color--ink-muted);
    border-radius: 0;
    background-color: var(--wp--preset--color--white);
    color: var(--wp--preset--color--ink);
    font-family: var(--font-display);
    font-size: 0.9375rem;
    line-height: 1.4;
}
.gform_wrapper .gfield select {
    appearance: none;
    padding-inline-end: 2.5rem !important;
    background-image:
        linear-gradient(45deg, transparent 50%, var(--wp--preset--color--brand-navy) 50%),
        linear-gradient(135deg, var(--wp--preset--color--brand-navy) 50%, transparent 50%);
    background-position: calc(100% - 1.25rem) 50%, calc(100% - 0.9rem) 50%;
    background-size: 0.35rem 0.35rem, 0.35rem 0.35rem;
    background-repeat: no-repeat;
    cursor: pointer;
}
.gform_wrapper .gfield input[type="text"]:focus-visible,
.gform_wrapper .gfield input[type="email"]:focus-visible,
.gform_wrapper .gfield select:focus-visible {
    border-color: var(--wp--preset--color--brand-navy);
}
.gform_wrapper .gfield input::placeholder {
    color: var(--wp--preset--color--ink-muted);
    opacity: 1;
}
.gform_wrapper .gfield_checkbox input[type="checkbox"] {
    accent-color: var(--wp--preset--color--brand-red);
}
.gform_wrapper .gfield_required {
    color: var(--wp--preset--color--brand-red);
}
.gform_wrapper .gform_footer,
.gform_wrapper .gform-footer {
    margin-top: 1.5rem;
}
