/* =============================================================================
   Oxford Risk LLC — AGENCY THEME LAYER
   =============================================================================
   Created 2026-09-27 during the corrective visual theme port.

   WHY THIS FILE DID NOT EXIST BEFORE, AND WHY THE SITE LOOKED WRONG WITHOUT IT

   The portfolio's design contract is two files:

       assets/css/site.css   MASTER, shared byte-for-byte across every Mythic
                             agency site. Brand-neutral. Consumes per-agency
                             colour through var().
       assets/css/theme.css  PER-AGENCY, this file. The ONLY place Oxford
                             colour lives. MUST load AFTER site.css.

   Oxford had neither half of that contract:

     1. Its site.css was a STALE FORK of the master. The two files are
        identical for their first 3,306 bytes and diverge at line 112. Oxford's
        copy was 115,890 bytes / 3,376 lines against the current master's
        248,841 bytes / 7,206 lines, so roughly 133 KB and 3,830 lines of the
        current design generation had never reached this site.

     2. There was no theme layer at all. With no theme.css, the master falls
        back to its own UNBRANDED shell defaults, which are
        navy #0f2645, blue #1e6c99 and gold #c9a35c. Those are Absolute Risk's
        neutrals. They were never Oxford's colours, and they are what the
        rendered site was showing: navy headlines, blue links, and a tan
        "Get a Quote" pill inherited from seven literal #ccb7a3 values in the
        master's button block.

   So this is not a re-skin. It is the same two-part conversion Mythic
   Insurance itself went through on 2026-09-24: bring the site up to the
   current shared master, then give it the theme layer every branded agency
   already has.

   PALETTE PROVENANCE, stated plainly because inventing a brand is not allowed.
   Nothing below was chosen. Oxford's logo, assets/img/logo.png, is a two-colour
   mark. Sampling every opaque pixel returns exactly two values:

       #00853e   50.5% of opaque pixels   the Oxford green
       #231f20   49.4% of opaque pixels   the Oxford near-black

   Every other token here is one of those two mixed toward white or black at a
   stated ratio, for grounds, borders and hover states. No third hue is
   introduced anywhere in this file.

   Oxford palette:
     Near-black   #231f20   the wordmark / dark surfaces / primary CTA
     Green        #00853e   links, secondary CTA, eyebrows, rules, numerals
     Pale green   #f1f8f4   editorial ground
     Green edge   #dbeee4   borders / separators / muted UI
     White        #ffffff

   Accessibility, measured on the sampled values:
     white on Near-black    16.30:1  AAA
     Near-black on white    16.30:1  AAA
     white on Green          4.75:1  AA   (so Green IS usable as a filled
                                           button surface with white text,
                                           which Mythic's tan is not)
     Green on white          4.75:1  AA
     Near-black on Pale green 15.12:1 AAA
     Green on Near-black     3.43:1  AA-large ONLY. On dark bands the accent
                                     switches to --brand-accent-light
                                     (#40a46e, 5.24:1 on near-black), which is
                                     the same green lightened 25% toward white.
                                     See section 3h.
   ========================================================================= */


/* ─── 1. Canonical brand tokens ──────────────────────────────────────────
   The Oxford brand slots. To rebrand, edit ONLY this block. */
:root {
    /* CONCEPT D, approved 2026-10-22. The primary slot moves from Oxford's
       near-black to Deep Evergreen; the SECONDARY slot keeps Oxford's own
       #00853E, which is why the brand still reads as Oxford everywhere a
       button, link or focus ring appears.

       Measured on these values (WCAG 2.1 AA):
         #00853E on #FFFFFF ... 4.75:1   buttons, focus ring
         #FFFFFF on #00853E ... 4.75:1   button labels
         #00853E on #F3F7F3 ... 4.39:1   FAILS - which is why --brand-accent
                                         is the darker sibling, not this value
         #00753A on #F3F7F3 ... 5.38:1   small labels on the pale ground
         #173D31 on #FFFFFF .. 12.01:1   headings and body copy
         #FFFFFF on #173D31 .. 12.01:1   copy on evergreen
         #FFFFFF on #102D25 .. 14.75:1   footer navigation container
         #FFFFFF on #0B2019 .. 17.04:1   footer branding strip
         #C4D5C9 on #173D31 ... 7.84:1   sage accents on dark bands        */
    --brand-primary:   #173D31;   /* Deep Evergreen                        */
    --brand-secondary: #00853E;   /* Oxford green, unchanged - interactive */
    --brand-accent:    #00753A;   /* decorative on LIGHT grounds. The one
                                     step darker sibling, because the bright
                                     green is 4.39:1 on --brand-light and the
                                     master uses --gold for SMALL labels.   */
    --brand-light:     #F3F7F3;   /* soft green-white                      */
    --brand-neutral:   #C4D5C9;   /* muted sage: borders, rules            */
    --brand-charcoal:  #173D31;
    --brand-white:     #ffffff;

    /* One-step siblings for hover / raised states the master carries as -2. */
    --brand-primary-2:   #2E6852;   /* secondary green                     */
    --brand-secondary-2: #00753A;   /* green hover, 5.82:1 on white        */

    /* Darker sibling of primary for inset / recessed surfaces. This is the
       footer NAVIGATION container, zone 2 of the approved two-tone footer. */
    --brand-primary-dark: #102D25;

    /* Zone 3: the branding / legal / social strip INSIDE that container. */
    --brand-primary-deepest: #0B2019;

    /* Decorative accent for DARK surfaces only. Sage reads 7.84:1 on the
       evergreen primary, where the bright green is only 2.53:1 and would
       fail badly for the small uppercase eyebrows the master puts there. */
    --brand-accent-light: #C4D5C9;
}


/* ─── 2. Re-bind the master's legacy token names ─────────────────────────
   site.css consumes --navy, --blue, --gold, --cream, --ink and friends via
   var(). Redefining them here (this file loads AFTER site.css) redirects every
   consumer without touching a single master rule. Identical in shape to the
   Mythic Insurance and Prestige theme layers. */
:root {
    /* Dark / primary surfaces + strong UI emphasis */
    --navy-deep:  var(--brand-primary-dark);
    --navy:       var(--brand-primary);
    --navy-2:     var(--brand-primary-2);
    --ink:        var(--brand-charcoal);
    --ink-2:      var(--brand-charcoal);
    --charcoal:   var(--brand-charcoal);
    --charcoal-2: var(--brand-charcoal);

    /* Secondary brand colour */
    --blue:   var(--brand-secondary);
    --blue-2: var(--brand-secondary-2);

    /* Decorative accent (the master uses --gold for eyebrows + small labels) */
    --gold: var(--brand-accent);

    /* Backgrounds + panels */
    --cream:      var(--brand-light);
    --off-white:  var(--brand-light);
    --line:       var(--brand-neutral);
    --panel-warm: var(--brand-neutral);
    --panel-blue: var(--brand-primary);

    /* Text + supporting greys. --text-muted is #6d7685 not the master's
       #7a8595: the lighter value measures 3.74:1 on white and fails AA.
       Carried over from the Mythic Enterprises contrast pass. */
    --text:       var(--brand-charcoal);
    --text-2:     #4a5468;
    --text-muted: #6d7685;
    --slate:      #3a4657;
    --slate-2:    #4a5768;
}


/* ═════════════════════════════════════════════════════════════════════════
   3. COMPONENT-LOCAL PALETTES
   The master's newer editorial components each declare their own palette on
   their own selector with LITERAL hexes, so the token remap above cannot reach
   them. Each is redeclared here on the SAME selector, not escalated with
   !important, so specificity is matched rather than beaten. Each block is a
   to-shrink list: when the master learns to consume --brand-* directly, the
   matching block here can be deleted.
   ═════════════════════════════════════════════════════════════════════════ */

/* ── 3a. The Approach (two-column editorial intro) ── */
.prestige-approach {
    --pa-ivory:      var(--brand-light);
    --pa-ivory-edge: var(--brand-neutral);
    --pa-teal:       var(--brand-accent);
    --pa-ink:        var(--brand-primary);
    --pa-body:       #4a5468;
}

/* ── 3b. Coverage index (numbered editorial rows) ──
   The master's page rhythm steps through four distinct light grounds and never
   places two whites in the sequence. The role of this ground is "pale
   editorial", one step deeper than the grounds around it. #e9f5ef is that role
   filled from the Oxford green: one step deeper than --brand-light, one step
   lighter than --brand-neutral. Near-black on it measures 14.57:1. */
.coverage-index {
    --ci-bg:        var(--brand-light);
    --ci-ink:       var(--brand-primary);
    --ci-body:      #4a5468;
    --ci-teal:      var(--brand-accent);
    --ci-teal-soft: rgba(0, 133, 62, 0.35);
    --ci-rule:      var(--brand-neutral);
    --ci-hover:     rgba(0, 133, 62, 0.06);
}

/* ── 3c. Why (typographic benefit grid) ── */
.why-prestige {
    --wp-bg:        var(--brand-light);
    --wp-ink:       var(--brand-primary);
    --wp-body:      #4a5468;
    --wp-teal:      var(--brand-accent);
    --wp-rule:      var(--brand-neutral);
    --wp-rule-soft: rgba(0, 133, 62, 0.24);
}

/* ── 3d. Insights (editorial article index) ── */
.insights {
    --in-bg:   var(--brand-light);
    --in-ink:  var(--brand-primary);
    --in-body: #4a5468;
    --in-teal: var(--brand-accent);
    --in-rule: var(--brand-neutral);
}

/* ── 3e. FAQ (editorial two-column grid) ── */
.faq-editorial {
    --faq-bg:        var(--brand-light);
    --faq-ink:       var(--brand-primary);
    --faq-body:      #4a5468;
    --faq-turquoise: var(--brand-accent);
    --faq-rule:      var(--brand-neutral);
}

/* ── 3f. Client Perspectives (dark editorial testimonial band) ──
   Oxford's markup does not currently render this component, so these tokens
   are inert. They are declared anyway so the component is correct the moment
   it is used, and so no other agency's turquoise can appear on an Oxford page.
   The master's own background-image for it points at a Prestige asset that
   does not exist in Oxford's tree; because the component is unused, nothing
   requests it. It is NOT repointed here, since choosing a photograph for a
   band Oxford does not have is an imagery decision, not a theme decision. */
.client-perspectives {
    /* CORRECTED 2026-10-22. The note below said Oxford's markup does not render
       this component. It does: the homepage carries three testimonials in it.
       Concept D puts the band on --brand-primary (#173D31), NOT on the darker
       --brand-primary-dark, which is now reserved for the footer container. */
    --cp-ink:            #ffffff;
    --cp-muted:          rgba(255, 255, 255, 0.72);
    --cp-turquoise:      var(--brand-accent-light);
    --cp-turquoise-soft: rgba(196, 213, 201, 0.55);
    --cp-navy:           var(--brand-primary);
    --cp-overlay:        none;
    /* NO PHOTOGRAPH, DELIBERATELY. The master hard-codes a Prestige asset here
       that does not exist in Oxford's tree, so left alone this band would
       request a 404 on every homepage load. Choosing a replacement photograph
       is an IMAGERY decision, and imagery is explicitly out of scope for this
       pass, so the band ships as the overlay gradient over the near-black
       field. It reads as an intentional dark editorial band rather than a
       broken image. FLAGGED for the imagery pass: this is the one component on
       the site that is waiting on a photograph. */
    background-image: none !important;
    background-color: var(--brand-primary) !important;
}

/* ── 3g. Coverage / interior page shell ──
   The master declares every --cov-* token on a ZERO-SPECIFICITY :where() list.
   This list MIRRORS THE MASTER'S EXACTLY. :where() carries no specificity, so
   this wins on source order alone, which is the mechanism the master intends.
   If the master ever adds a selector to its list, add it here in the same
   change. Getting this list wrong is a known failure mode: name a class that
   does not exist in the markup and the components silently keep the master's
   literal values. */
:where(.cov-hero, .cov-fit, .cov-overview, .cov-what, .cov-who, .cov-types, .cov-faq, .cov-cta,
       .cov-editorial, .pp-index, .pp-team, .pp-carriers, .pp-form-shell, .pp-simple,
       .pp-sitemap, .pp-doc, .pp-bio, .pp-pairs, .pp-actions, .pp-list, .pp-legal,
       .pp-404-index),
.cov-momentum,
.cov-page,
.cov-lp {
    --cov-ink:            var(--brand-primary);
    --cov-body:           #4a5468;
    --cov-turquoise:      var(--brand-accent);
    --cov-turquoise-soft: rgba(0, 133, 62, 0.55);
    --cov-rule:           var(--brand-neutral);
    /* Interior dark bands match the homepage CTA band, not the footer. */
    --cov-navy:           var(--brand-primary);
    --cov-navy-deep:      var(--brand-primary);
    /* Concept D has exactly two light grounds, white and #F3F7F3. The master's
       four-step light ramp collapses onto them so interior pages alternate the
       same way the approved homepage does. */
    --cov-ivory:          var(--brand-light);
    --cov-ivory-soft:     var(--brand-light);
    --cov-paleblue:       var(--brand-light);
    --cov-onDark:         var(--brand-light);
}

/* ── 3h. The accent on DARK bands ──
   .cov-cta is a near-black band. Its eyebrow, rules and reach labels all draw
   on --cov-turquoise, and the base Oxford green measures only 3.43:1 there,
   which fails AA for small uppercase type. On this one component the accent
   switches to the lightened green, 5.24:1. Same hue, same brand, legible.
   Oxford's own site-local components on dark grounds do the same.

   .cov-what ADDED 2026-10-24. It was listed in 3g above, with the LIGHT
   grounds, but Concept D paints its band --brand-primary (#173D31). So its
   eyebrow and rule were drawing --brand-accent #00753A on #173D31, which
   axe-core 4.10.2 measures at 2.06:1 against a 4.5:1 requirement - the worst
   contrast reading on the site. It belongs here, with .cov-cta, for exactly
   the reason this section exists. Sage on evergreen is 7.84:1, the ratio the
   token block at the top of this file already documents. Listing it in BOTH
   places is correct and intentional: 3g uses :where() so it carries no
   specificity, and this plain class selector overrides it. */
.cov-cta,
.cov-what {
    --cov-turquoise:      var(--brand-accent-light);
    --cov-turquoise-soft: rgba(64, 164, 110, 0.55);
}

/* ── 3i. The accent on the RELATED-COVERAGE band ──
   ADDED 2026-10-24. .cov-rel was MISSING from the 3g mirror list, which is
   the failure mode the comment on that list warns about: with no
   --cov-turquoise defined, the master's `color: var(--cov-turquoise, #2fa39a)`
   fell back to its literal, so this one component shipped Prestige's
   turquoise rather than an Oxford colour. On white that measures 3.07:1 and
   fails AA.

   Only the two turquoise slots are set here, deliberately NOT the whole 3g
   block: this restores the brand colour without re-pointing the other
   --cov-* consumers inside the component, so the change is confined to the
   eyebrow and its rule. --brand-accent on white is 5.82:1. */
.cov-rel {
    --cov-turquoise:      var(--brand-accent);
    --cov-turquoise-soft: rgba(0, 133, 62, 0.55);
}


/* ═════════════════════════════════════════════════════════════════════════
   4. LITERAL-HEX OVERRIDES IN THE MASTER
   Each entry exists ONLY because the matching master rule uses a literal
   colour with !important, so the override matches that specificity rather than
   escalating past it. Delete an entry when its master counterpart learns to
   use a token.
   ═════════════════════════════════════════════════════════════════════════ */

/* ── 4a. Dark surfaces ── */

/* APPROVED TWO-TONE FOOTER, Concept D, 2026-10-22. Three zones, each a step
   darker. Zones 2 and 3 are siblings in the markup and are made to read as ONE
   rounded container: zone 2 takes the top corners, zone 3 the bottom, and the
   gap between them is removed. Zone 1 frames it on all four sides, which is
   what makes the transition obvious.

     ZONE 1  .cta-footer     #173D31  the CTA band
     ZONE 2  .footer-panel   #102D25  the DARKER container. Begins ABOVE the
                                      Insurance / Company / Get in Touch
                                      columns and holds everything below them.
     ZONE 3  .footer-bottom  #0B2019  an internal subdivision of zone 2, not a
                                      replacement for it.                     */
/* The Mythic utility bar at the very top of every page. The master paints it
   with a literal #1a1a1a that no token reaches, so it is overridden here
   alongside the other literal dark surfaces. It takes the same value as the
   footer's branding strip, which is the other place the Mythic mark appears,
   so the page opens and closes on the same tone.
   No !important: theme.css loads after site.css and the specificity matches,
   so source order is enough - the house rule for this section.
   White on #0B2019 is 17.04:1, so the emblem and label stay clearly legible.
   Height, padding, alignment, the emblem and the label are untouched. */
.powered-by-bar {
    background: var(--brand-primary-deepest);
}

.cta-footer {
    background-color: var(--brand-primary) !important;
    color: #ffffff !important;
}
.cta-footer .container { padding-bottom: 56px; }

.footer-panel {
    background: var(--brand-primary-dark) !important;
    border: none !important;
    border-radius: 24px 24px 0 0 !important;
    margin-bottom: 0 !important;
}
.footer-bottom {
    background: var(--brand-primary-deepest) !important;
    border-radius: 0 0 24px 24px !important;
    padding: 26px 60px 30px !important;
    margin: 0 !important;
    border-top: 1px solid rgba(196, 213, 201, 0.10);
}
.footer-panel .desc { border-top-color: rgba(196, 213, 201, 0.18) !important; }
.footer-bottom .social-ic        { background: rgba(196, 213, 201, 0.12); color: #ffffff; }
.footer-bottom .social-ic:hover  { background: var(--brand-secondary); color: #ffffff; }
@media (max-width: 720px) {
    .footer-bottom { padding: 24px 24px 26px !important; }
}

/* Mid-page dark callouts. */
.cta-section,
.fw-callout {
    background-color: var(--brand-primary) !important;
    color: #ffffff !important;
}
.cta-section h2,
.cta-section h3,
.fw-callout h2,
.fw-callout h3 {
    color: #ffffff !important;
}

.section-dark {
    background: var(--brand-primary) !important;
}

/* Fallback colour behind a hero image while it loads. */
.hero      { background-color: var(--brand-primary); }
.page-hero { background-color: var(--brand-primary); }

/* Relationship split panel. */
.why-agents {
    background: var(--brand-primary) !important;
}


/* ── 4b. Warm surfaces ──
   The master's "warm" grounds are ivory. Oxford's editorial ground is the pale
   green tint, so the same roles are filled from --brand-light. */

.carriers {
    background: #ffffff !important;
}

.cov-grid .cov-card,
.svc-explainer,
.value-card,
.value-card-grid .value-card,
.cov-lp-card {
    background: linear-gradient(180deg, var(--brand-light) 0%, #FAFDFB 100%) !important;
    border-color: var(--brand-neutral) !important;
}
.cov-grid .cov-card:hover {
    background: #ffffff !important;
}

.tc-carousel .testimonial-card {
    background: #ffffff !important;
    border: 1px solid var(--brand-neutral) !important;
}
.tc-carousel .testimonial-card::before {
    font-size: 88px !important;
    color: var(--brand-secondary) !important;
    opacity: 0.18 !important;
    top: 4px !important;
    left: 28px !important;
}
/* The master gradient still contains a literal rgba(201,163,92,...) that
   renders gold no matter what --gold holds. */
.tc-carousel .testimonial-card::after {
    background: linear-gradient(90deg, var(--brand-secondary), rgba(0, 133, 62, 0.15)) !important;
}
.cov-grid .cov-card::before,
.value-card::before {
    background: linear-gradient(90deg, var(--brand-accent), rgba(0, 133, 62, 0.35)) !important;
}

.callout-warm,
.section-warm,
.section-cream {
    background: var(--brand-light) !important;
}


/* ── 4c. Buttons ──
   CONCEPT D INVERTS THE POLARITY. The pill was an evergreen/near-black fill
   that turned green on hover. It is now BRIGHT OXFORD GREEN at rest, because
   the approved design makes #00853E the interactive colour everywhere. White
   on #00853E is 4.75:1 and the hover sibling #00753A is 5.82:1 on white. */
.pill-btn,
.pill-btn.blue,
.pill-btn.dark,
.pill-btn.tan {
    background: var(--brand-secondary) !important;
    color: #ffffff !important;
    border: 1px solid transparent !important;
}
.pill-btn:hover,
.pill-btn.blue:hover,
.pill-btn.dark:hover,
.pill-btn.tan:hover {
    background: var(--brand-secondary-2) !important;
    color: #ffffff !important;
}

/* Hero secondary CTA. A second bright-green pill beside the primary would
   compete with it, so this one takes the secondary green: white on #2E6852 is
   6.53:1 and it still reads as the same family. */
.pill-btn.outline-white,
.pill-btn.outline-light {
    background: var(--brand-primary-2) !important;
    color: #ffffff !important;
    border: 1px solid rgba(255, 255, 255, 0.38) !important;
}
.pill-btn.outline-white:hover,
.pill-btn.outline-light:hover,
.pill-btn.ghost:hover {
    background: var(--brand-primary) !important;
    border-color: rgba(255, 255, 255, 0.55) !important;
    color: #ffffff !important;
}

/* Outline button on a light ground: bright green rule, darker green label.
   The same treatment the current public Oxford site uses for "See All +". */
.pill-btn.outline-dark {
    background: transparent !important;
    color: var(--brand-secondary-2) !important;
    border: 1.5px solid var(--brand-secondary) !important;
}
.pill-btn.outline-dark:hover {
    background: var(--brand-secondary) !important;
    border-color: var(--brand-secondary) !important;
    color: #ffffff !important;
}

/* Buttons on dark grounds, split by what the ground actually is.

   PHOTOGRAPHIC grounds (heroes, the full-width callout) keep the bright green
   pill: it reads cleanly against a photograph and is what the approved hero
   shows. Nothing is needed beyond the default, so these are listed only to
   strip the old 2px border the previous near-black pill required. */
.hero       .pill-btn.blue, .hero       .pill-btn.dark,
.page-hero  .pill-btn.blue, .page-hero  .pill-btn.dark,
.cov-hero   .pill-btn.blue, .cov-hero   .pill-btn.dark,
.fw-callout .pill-btn.blue, .fw-callout .pill-btn.dark {
    background: var(--brand-secondary) !important;
    border: 1px solid transparent !important;
    color: #ffffff !important;
}

/* SOLID EVERGREEN bands are the exception. Bright green on #173D31 is 2.53:1
   and the button would barely separate from its own ground, so here the pill
   goes WHITE with an evergreen label at 12.01:1. This is the one place in the
   system where the primary button is not green, and it matches the approved
   closing-CTA screenshot. */
.cta-section  .pill-btn,
.cta-footer   .pill-btn,
.footer-panel .pill-btn,
.cov-cta      .pill-btn,
.section-dark .pill-btn,
.why-agents   .pill-btn {
    background: #ffffff !important;
    color: var(--brand-primary) !important;
    border: 1px solid transparent !important;
    font-weight: 600 !important;
}
.cta-section  .pill-btn:hover,
.cta-footer   .pill-btn:hover,
.footer-panel .pill-btn:hover,
.cov-cta      .pill-btn:hover,
.section-dark .pill-btn:hover,
.why-agents   .pill-btn:hover {
    background: var(--brand-neutral) !important;
    color: var(--brand-primary) !important;
}


/* ── 4d. Editorial blog index ──
   The master declares --eb-bg but then hard-codes `background: transparent` on
   .editorial-blog itself, so the token reaches nothing. Concept D puts this
   band on the pale ground, so the background is set here as well as the token.
   Delete the background line if the master ever consumes its own variable. */
.editorial-blog {
    background: var(--brand-light) !important;
    --eb-bg:   var(--brand-light);
    --eb-ink:  var(--brand-primary);
    --eb-body: #4a5468;
    --eb-rule: var(--brand-neutral);
    --eb-accent: var(--brand-accent);
}
.editorial-blog__grid > .editorial-item::before {
    background: var(--brand-accent) !important;
}
.editorial-blog__grid > .editorial-item .editorial-item__more {
    color: var(--brand-secondary) !important;
}

/* ── 4e. Navigation ── */
.nav-links li.nav-item .drop-head {
    color: var(--brand-secondary) !important;
}

/* ── 4f. Focus ring ──
   Green on white is 4.75:1, so the ring is visible on every light ground the
   site uses, and the offset keeps it clear of the control's own border. */
:focus-visible {
    outline: 2px solid var(--brand-secondary);
    outline-offset: 2px;
}

/* ── 4g. The two build-credit links in the legal strip ──
   ADDED 2026-10-24. axe-core 4.10.2 flags these as `link-in-text-block`
   (WCAG 1.4.1 Use of Color, Level A), 2 nodes on every one of the 104 URLs.
   They are "Image Design" and "Mythic Enterprises" inside <p class="copy">.
   The link is rgba(255,255,255,0.75) and the sentence around it is
   rgba(255,255,255,0.55); composited on #0B2019 that is 1.67:1 between link
   and surrounding text, against a 3:1 requirement, with no second cue.

   Measured alternatives: lifting the link to solid #ffffff gives only 2.86:1
   against the same sentence, so it still fails. An underline removes the
   dependency on colour entirely and is the technique the success criterion
   names, so that is what this does. The .copy paragraph itself is 5.94:1 on
   #0B2019 and already passes AA; it is not changed.

   Scoped to the legal strip's .copy paragraph so no other link on the site
   picks up an underline - the design deliberately has none elsewhere. The
   selector carries three classes plus the element because the master's
   `.footer-bottom .footer-bottom-text .copy a { text-decoration: none }`
   (site.css:6532) is (0,3,1) and would otherwise win on specificity
   regardless of load order. */
.footer-bottom .footer-bottom-text p.copy a {
    text-decoration: underline;
    text-underline-offset: 2px;
    text-decoration-thickness: 1px;
}

/* ── 4h. The lead-form focus ring colour ──
   ADDED 2026-10-24. The focus indicator on the quote and contact fields was
   already present and already passes: on focus the field border moves from
   the sage #C4D5C9 to --brand-secondary #00853E, which is 4.75:1 on the white
   field. (An earlier reading that reported "no focus indicator" was a
   measurement error - it sampled the computed style at t=0, inside the 150ms
   `transition: all` on those controls, and recorded the transition's starting
   value. Re-measured 400ms after a real Tab, every one of the first 20 focus
   stops on / and /contact-us shows a visible indicator.)

   What IS wrong is the colour of the 3px halo behind that border.
   includes/forms/render.php reads it from the schema slot 'focus-ring' and
   falls back to the Momentum default rgba(0,110,219,0.18) when a site does
   not set one. Oxford never set one, so the only blue left anywhere on the
   site was sitting on the two conversion forms.

   The slot is normally supplied through site_form_brand() in
   includes/forms/_site-common.php - but that file is asserted BYTE-IDENTICAL
   across _shell, Oxford and Mythic Insurance (suite assertion X17), so
   editing it here would either break that assertion or force a change to two
   other agencies. It is corrected in this agency theme layer instead, which
   is precisely what this file is for.

   render.php emits `#qf-oxford-contact-2026 { --qf-focus-ring: ... }` inline
   in the body, so it beats a head stylesheet on source order at equal
   specificity. The descendant selector below carries one ID plus one
   attribute, which outranks a single ID, so no !important is needed. */
#main-content [id^="qf-oxford-"] {
    --qf-focus-ring: rgba(0, 133, 62, 0.22);
}

/* ── 4i. The blog index eyebrow ──
   ADDED 2026-10-24. Same missing-token failure as .cov-rel in 3i:
   .pp-journal__eyebrow and .pp-journal__rule read
   `var(--cov-turquoise, #2fa39a)` (site.css:6226 and :6220) and neither
   .pp-journal nor .pp-journal-lead appears in the 3g mirror list, so the blog
   index shipped Prestige's turquoise at 3.07:1 on white. Both wrappers are
   named because the eyebrow on /blog sits inside SECTION.pp-journal-lead
   while the row headings sit inside .pp-journal. --brand-accent is 5.82:1 on
   white. */
.pp-journal,
.pp-journal-lead {
    --cov-turquoise:      var(--brand-accent);
    --cov-turquoise-soft: rgba(0, 133, 62, 0.55);
}

/* ── 4j. Inline prose links on the three legal pages ──
   ADDED 2026-10-24. `a.link` carries TWO axe failures at once on
   /privacy-policy, /terms-conditions and /accessibility, 44 nodes in total:

     color-contrast        #00853E on #F3F7F3 = 4.38:1  (needs 4.5:1)
     link-in-text-block    link #00853E vs sentence #4A5468 = 1.60:1
                           (needs 3:1) and no underline

   The colour half is a trap this file's own token block already names:
   "#00853E on #F3F7F3 ... 4.39:1 FAILS - which is why --brand-accent is the
   darker sibling". The master paints these links --blue (= --brand-secondary)
   through `.section .container p a:not(.pill-btn)`, which lands the bright
   green on the pale ground. Switching to --brand-accent gives 5.38:1 on
   #F3F7F3 and 5.82:1 on white, so it is correct on both of Concept D's light
   grounds. The underline removes the colour dependency for 1.4.1.

   The selector is #main-content-scoped because the master rule is (0,3,2);
   one ID outranks it without !important, and #main-content wraps all page
   content on every template. */
#main-content a.link {
    color: var(--brand-accent);
    text-decoration: underline;
    text-underline-offset: 2px;
    text-decoration-thickness: 1px;
}
#main-content a.link:hover,
#main-content a.link:focus-visible {
    color: var(--brand-secondary-2);
    text-decoration-thickness: 2px;
}

/* ── 4k. The phone number inside legal-page prose ──
   ADDED 2026-10-24. After 4j, one axe failure remained: the in-sentence
   `tel:` link on /privacy-policy, /terms-conditions and /accessibility.
   It is still `link-in-text-block`, because the link reads #00753A against a
   #4A5468 sentence (1.30:1, needs 3:1) and it has no second cue.

   It has no underline because the master deliberately strips one from EVERY
   tel: link with !important, in two separate rules, so phone numbers do not
   read as underlined links in the nav, the office cards or the call bars.
   That convention is right and is not changed here.

   axe accepts text-decoration, a border, an outline or a background-image as
   a non-colour cue; it does not accept font-weight. A border-bottom is
   therefore the one cue that satisfies 1.4.1 without touching the site-wide
   tel: treatment. !important is required only because the rules being
   overridden are themselves !important; the selector is narrowed to
   `a.link` inside a paragraph or a list item inside #main-content, which is
   prose and nothing else. /accessibility puts its contact details in a <ul>
   rather than a <p>, which is why both are named - measured, not assumed. */
#main-content p a.link[href^="tel:"],
#main-content li a.link[href^="tel:"] {
    border-bottom: 1px solid currentColor !important;
    text-decoration: none;
}
