/* ==========================================================================
   np-blend-forms.css — THE NEW POWER BLEND, FORMS EDITION
   Dedicated forms wave, 2026-08-21 (Zeek: "Forms, yes. Dedicated sweep").

   WHY ITS OWN FILE AND NOT np-blend-p100.css
   ------------------------------------------
   Two reasons, one practical and one architectural.
   Practical: the terms/privacy/ec-next-steps/workshop batch is editing
   np-blend-p100.css concurrently in another worktree, and a shared file is a
   merge collision waiting to happen. Architectural: the forms are NOT the
   nineteen-template marketing family. They are a separate design system with
   its own bible (docs/P100-FORMS-DESIGN-SYSTEM.md) — a single flat dark app
   surface, a 780px reading column, Poppins headings over Inter inputs, its own
   radii ladder. Batch A's layer re-points the marketing system's `--p-*`
   tokens; nothing in it applies here.

   THE TWO BIBLES, AND WHO WINS WHERE
   ----------------------------------
   docs/NP-BLEND-THEME.md wins on COLOUR. docs/P100-FORMS-DESIGN-SYSTEM.md wins
   on LAYOUT, STRUCTURE and TYPE. So this file changes what things are coloured
   and nothing else, with two named exceptions: the focus ring's `box-shadow`
   (§1, which paints outside the box and cannot move anything) and the header
   lockup repair Zeek called for in live review (§6b, four declarations, all
   listed there). Nothing else sets a size, a spacing, a radius, a font-family
   or a position.
   The forms system's Poppins-headings / Inter-body split is left ALONE on
   purpose: the Inter half is injected at runtime by the form bundles, which are
   served from the PRODUCTION TPX backend and are not this wave's to edit.

   THE FORM-BLEND GRAMMAR (derived from NP-BLEND-THEME.md, applied to controls)
   ---------------------------------------------------------------------------
   GOLD  #C8A951 — static identity. Eyebrows and badges, section labels,
                   NUMERALS (geo numbers, step badges, completed-step plates),
                   static helper/context panels, the dropzone icon disc, the
                   headshot ring, decorative rules. Solid, never gradient on a
                   narrow glyph (hard rule 2).
   RED   #FB0401 — live action only. Focus, required markers, selected/active
                   states, hovers, remove buttons, validation errors. Small red
                   TEXT (< 18.66px bold / < 24px normal) takes the dark-mode
                   lift #FF5A57 (hard rule 3 / flag 124's dark-side mirror).
   GREEN         — the COMMIT. Next / Submit / Continue-to-payment. Per the
                   hybrid CTA rule every one of these measured 13-16px, i.e.
                   the `--deep` band, so they are #007F44 (5.10:1 on white)
                   with hover #006638 (7.10:1). See §0 for the three greens
                   this replaces, all of which fail white text.
   GRADIENT      — progress bars ONLY. A progress fill is the one wide shared
                   object in a form, and it carries no text (hard rule 1).

   RATIO. NP-BLEND-THEME.md asks for ~90/10 gold-to-red on member surfaces.
   A form cannot reach that — its whole job is interactive state, and red IS
   the interactive colour. What the wave does instead is honest to the rule's
   intent: every DECORATIVE red (an eyebrow, a static label, a context panel, a
   numeral, an icon disc) moves to gold, and red keeps only what the user's
   action lights up. Red stopped being wallpaper; it did not stop being red.

   HOW THIS SHEET REACHES ITS TARGETS
   ----------------------------------
   Every rule is scoped `body.np-forms …`, which buys one class of specificity
   over each host system's own rules, and — the point of the wave — over the
   `<style>` blocks the PRODUCTION form bundles append to <body> at runtime.
   Those bundles win on source order (they are literally the last style in the
   document, by design, see the comment in show-guest-form.js), so a sheet in
   <head> can only beat them on specificity. `body.np-forms .p100-sg .field >
   label` is (0,3,1) against the bundle's (0,2,1) and lands.

   Where a host declares its own custom properties — `.p100-intake`,
   `.eap-page` — this sheet re-points the TOKEN rather than the rules. That is
   batch A's mechanism and it is strictly better here: those hosts write
   `color: var(--p100-red) !important`, and !important governs the declaration,
   not the variable, so a higher-specificity redefinition of the variable wins
   without a single !important of our own.

   !important APPEARS IN EXACTLY NINE DECLARATIONS, ALL IN §7b, EACH NAMED.
   Every one answers either an INLINE style attribute (unreachable by any
   selector) or a host declaration that already carries !important. Nowhere
   else. What remains genuinely out of reach is listed in §7.

   REVERT
   ------
   Remove `np-forms` from <body>. Per page that is one attribute (the two
   templates) or one slug out of the allowlist in inc/np-blend-forms.php (the
   canvas pages). Nothing here is required by any host rule.
   ========================================================================== */


/* ==========================================================================
   §0  TOKENS
   Local scope + own prefix. `--np-*` is the chrome's namespace and must never
   be declared here (hard rule 5 / flag 110) — hence `--nbf-`.
   Declared on body.np-forms rather than :root for the same reason.
   ========================================================================== */
body.np-forms {
    /* identity / static premium */
    --nbf-gold:        #C8A951;
    --nbf-gold-tint:   rgba(200,169,81,0.10);   /* badge + disc fill      7.50:1 for gold text */
    --nbf-gold-line:   rgba(200,169,81,0.28);
    --nbf-gold-wash:   rgba(200,169,81,0.05);   /* static helper panels */
    --nbf-gold-ring:   rgba(200,169,81,0.45);   /* headshot / avatar ring */

    /* action / live energy */
    --nbf-red:         #FB0401;
    --nbf-red-lift:    #FF5A57;                  /* small red TEXT on near-black: 6.38:1 vs #0c0c0c */
    --nbf-red-tint:    rgba(251,4,1,0.10);
    --nbf-red-line:    rgba(251,4,1,0.28);
    /* THE FOCUS RING, and why it is two shadows and not one.
       A single translucent red glow cannot carry contrast on near-black: at
       0.30 alpha over #0c0c0c it measures 1.32:1 against the ground, which is
       decoration, not an indicator. Getting a translucent ring past the 3:1
       non-text bar takes ~0.85 alpha, which is a solid red band and reads as an
       error, not a focus. So the ring is built the other way round: 1px of
       SOLID red immediately outside the 1px border — doubling the red perimeter
       to 2px at 4.77:1 against the page ground — with the soft glow kept behind
       it purely for presence. The measured indicator is the solid part. */
    --nbf-focus-ring:  0 0 0 1px #FB0401, 0 0 0 4px rgba(251,4,1,0.26);

    /* the commit
       #007F44 white-on-fill = 5.10:1  — passes AA at every size a form button uses
       #006638 white-on-fill = 7.10:1  — hover, deliberately DARKER: every green
                                         lighter than #007F44 fails white text at
                                         14px, so "brighter on hover" is not
                                         available in this family.
       REPLACES, all measured white-on-fill, all failing, all shipped and live:
           #00B05D  2.85:1   (show-guest "Email me my secure link", employee-
                              verification + culture-index primary buttons)
           #05C920  2.24:1   (--p100-green on both Stripe intake pages)
           #28a745  3.13:1   (the "Continue to Payment" link on both)
           #FB0401  4.10:1   (every red Submit in the family)                    */
    --nbf-green:       #007F44;
    --nbf-green-hover: #006638;
    --nbf-green-glow:  rgba(0,127,68,0.28);

    /* strokes on dark: 0.10 resting, 0.20 emphasised (hard rule 6) */
    --nbf-stroke:      rgba(255,255,255,0.10);
    --nbf-stroke-hi:   rgba(255,255,255,0.20);

    /* the one shared wide object */
    --nbf-bar:         linear-gradient(90deg, #FB0401, #C8A951);
}


/* ==========================================================================
   §1  FOCUS — the wave's one genuinely new behaviour
   Every host in this family signals focus with a 1px border-colour swap and
   nothing else. That is a colour-only indicator on a hairline, and it is the
   thinnest affordance in the whole system. The blend keeps the red border
   (red IS the live-action colour, and it measures 4.41:1 against the field's
   own composited fill and 4.77:1 against the page ground — both clear of the
   3:1 non-text bar) and adds a 3px ring so the state is visible as SHAPE, not
   only as hue.

   box-shadow is the only property that can do this without moving anything:
   it paints outside the border box and takes no space, so no field shifts, no
   row reflows, and a 12-step form's scroll position is untouched.
   ========================================================================== */
body.np-forms .p100-sg .field input:focus,
body.np-forms .p100-sg .field textarea:focus,
body.np-forms .p100-sg .field select:focus,
body.np-forms .p100-mc .field input:focus,
body.np-forms .p100-mc .field textarea:focus,
body.np-forms .p100-mc .field select:focus,
body.np-forms .p100-delegate .field input:focus,
body.np-forms .p100-delegate .field textarea:focus,
body.np-forms .p100-intake .p100-field input:focus,
body.np-forms .p100-intake .p100-field textarea:focus,
body.np-forms .p100-intake .p100-field select:focus,
body.np-forms .p100-cs input:focus,
body.np-forms .p100-cs textarea:focus,
body.np-forms .p100-ae .field input:focus,
body.np-forms .p100-ae .field textarea:focus,
body.np-forms .p100-ae .field select:focus {
    border-color: var(--nbf-red);
    box-shadow: var(--nbf-focus-ring);
}

/* Keyboard focus on the things that are not inputs: the selectable cards, the
   repeater add/remove buttons, the dropzones, the nav buttons. Several of these
   are <button>s whose host CSS sets `border:none`, so the ring is the entire
   indicator and it has to be unmissable. :focus-visible keeps it off the mouse
   path — a click on a mode-card should not leave a ring behind it. */
body.np-forms .p100-sg .mode-card:focus-visible,
body.np-forms .p100-sg .add-btn:focus-visible,
body.np-forms .p100-sg .repeater-item .rm:focus-visible,
body.np-forms .p100-sg .headshot-drop:focus-visible,
body.np-forms .p100-sg .btn:focus-visible,
body.np-forms .p100-mc .topic-card:focus-visible,
body.np-forms .p100-mc .add-btn:focus-visible,
body.np-forms .p100-mc .repeater-item .rm:focus-visible,
body.np-forms .p100-mc .mc-dropzone:focus-visible,
body.np-forms .p100-mc .btn:focus-visible,
body.np-forms .p100-mc .btn-contacts-toggle:focus-visible,
body.np-forms .p100-intake .p100-option-card:focus-visible,
body.np-forms .p100-intake .p100-tier-card:focus-visible,
body.np-forms .p100-intake .p100-add-btn:focus-visible,
body.np-forms .p100-intake .p100-btn-back:focus-visible,
body.np-forms .p100-intake .p100-btn-next:focus-visible,
body.np-forms .p100-intake .p100-btn-submit:focus-visible,
body.np-forms .p100-cs .choice:focus-visible,
body.np-forms .p100-cs .btn:focus-visible,
body.np-forms .p100-delegate .submit-btn:focus-visible,
body.np-forms .p100-ae .btn:focus-visible {
    outline: none;
    box-shadow: var(--nbf-focus-ring);
}

/* PLACEHOLDERS.
   🔴 flag 116: a selector LIST dies whole if one selector in it fails to parse,
   which is how a grouped ::-moz-placeholder once killed the standard
   ::placeholder in Chrome. One pseudo per rule, always — that is why this
   reads as repetition rather than a comma list.
   The value is unchanged from the forms system (#9AA0A6, measured 6.86:1 on
   the composited field fill, comfortably past the 4.5:1 text bar); it is
   restated here only so the hosts that never set one inherit it. */
body.np-forms .p100-sg .field input::placeholder { color: #9AA0A6; opacity: 1; }
body.np-forms .p100-sg .field textarea::placeholder { color: #9AA0A6; opacity: 1; }
body.np-forms .p100-mc .field input::placeholder { color: #9AA0A6; opacity: 1; }
body.np-forms .p100-mc .field textarea::placeholder { color: #9AA0A6; opacity: 1; }
body.np-forms .p100-delegate .field input::placeholder { color: #9AA0A6; opacity: 1; }
body.np-forms .p100-delegate .field textarea::placeholder { color: #9AA0A6; opacity: 1; }
body.np-forms .p100-intake .p100-field input::placeholder { color: #9AA0A6; opacity: 1; }
body.np-forms .p100-intake .p100-field textarea::placeholder { color: #9AA0A6; opacity: 1; }
body.np-forms .p100-cs input::placeholder { color: #9AA0A6; opacity: 1; }
body.np-forms .p100-cs textarea::placeholder { color: #9AA0A6; opacity: 1; }
body.np-forms .p100-ae .field input::placeholder { color: #9AA0A6; opacity: 1; }
body.np-forms .p100-ae .field textarea::placeholder { color: #9AA0A6; opacity: 1; }


/* ==========================================================================
   §1b  THE rgba(255,255,255,0.4) FAMILY — pre-existing failures, all sizes 11-12px

   Both templates set their small print at 0.4 white, which composites to 3.79:1
   on #0c0c0c: below the 4.5:1 text bar everywhere it appears. It appears on the
   progress step labels ("Step 1 of 12", "Your basics"), the field hints, and the
   dropzone sub-line — i.e. the wayfinding and the instructions, which is exactly
   the copy a stuck user is trying to read.

   These stay NEUTRAL rather than going gold. The grammar would allow gold on an
   11px uppercase letterspaced label, but the progress rail sits directly under
   the gold badge, and a gold badge above a gold step-label above a gold section
   label is three golds in 60 vertical pixels. Wayfinding is furniture; it gets
   the forms bible's own muted token instead.

   🔴 The hints are a second sighting of flag 102 / F149's law, from the other
   direction: the production bundle ALREADY tries to fix them
   (`.p100-sg .hint {color:#ADADAD}`, 7.9:1) but the template's
   `.p100-sg .field .hint` is (0,3,0) against the bundle's (0,2,0) and silently
   wins. The intended colour has been in the bundle, outranked, the whole time.
   ========================================================================== */
body.np-forms .p100-sg .progress-labels,
body.np-forms .p100-mc .progress-labels { color: #9A9A9A; }   /* 6.95:1 */
body.np-forms .p100-sg .field .hint,
body.np-forms .p100-mc .field .hint { color: #ADADAD; }       /* 7.90:1 — the bundle's own value, unblocked */
body.np-forms .p100-sg .headshot-drop .sub { color: #ADADAD; }
body.np-forms .p100-sg .upload-status { color: #ADADAD; }
body.np-forms .p100-sg .headshot-preview .fname { color: #ADADAD; }
body.np-forms .p100-sg .mode-card .mdesc,
body.np-forms .p100-mc .topic-card .t-angle { color: #B5B5B5; }   /* 8.70:1 */
body.np-forms .p100-sg .header p,
body.np-forms .p100-mc .header p { color: #C8C8C8; }
body.np-forms .p100-sg .step-head p,
body.np-forms .p100-mc .step-head p { color: #C8C8C8; }
body.np-forms .p100-sg .leader-info .lmeta,
body.np-forms .p100-mc .ec-card .ec-meta { color: #B5B5B5; }
body.np-forms .p100-sg .geo-helper p,
body.np-forms .p100-mc .helper-box p { color: #C0C0C0; }
body.np-forms .p100-mc .last-month { color: #B5B5B5; }
body.np-forms .p100-sg .success-state p,
body.np-forms .p100-mc .success-state p,
body.np-forms .p100-sg .error-state p,
body.np-forms .p100-mc .error-state p { color: #C8C8C8; }
body.np-forms .p100-sg .add-btn,
body.np-forms .p100-mc .add-btn,
body.np-forms .p100-sg .btn-secondary,
body.np-forms .p100-mc .btn-secondary { color: #B5B5B5; }


/* ==========================================================================
   §2  SHOW-GUEST — /complete-your-profile/  (.p100-sg)
   The most-used conversion form in the estate: 12 steps, 69 controls, and the
   door every show guest and contributor comes through. Handled first and
   changed least.
   ========================================================================== */

/* ── gold: the static identity layer ─────────────────────────────────────── */

/* The eyebrow badge ("SHOW GUEST PROFILE"). An eyebrow is identity, not
   action — NP-BLEND-THEME.md names eyebrows in the gold row explicitly.
   Gold on its own 0.10 tint over #0c0c0c measures 7.50:1 at 11px/700. */
body.np-forms .p100-sg .show-badge {
    background: var(--nbf-gold-tint);
    color: var(--nbf-gold);
    border-color: var(--nbf-gold-line);
}

/* The "YOU ARE COMPLETING THIS FOR" context card label. Read-only context =
   static = gold. 7.82:1 on the card's own composited fill. */
body.np-forms .p100-sg .leader-info h3 { color: var(--nbf-gold); }

/* The geo numerals. Hard rule 2 is about numerals specifically: a narrow glyph
   gets SOLID gold, never a gradient, because a 135deg ramp across "1" reads
   all-red. These are as narrow as a glyph gets. */
body.np-forms .p100-sg .geo-num {
    background: var(--nbf-gold-tint);
    color: var(--nbf-gold);
    border-color: var(--nbf-gold-line);
}

/* The geo helper — a static explanatory panel, red-washed today for no reason
   other than red being the only accent the old system had. */
body.np-forms .p100-sg .geo-helper {
    background: var(--nbf-gold-wash);
    border-color: var(--nbf-gold-line);
}
body.np-forms .p100-sg .geo-helper strong { color: var(--nbf-gold); }

/* The headshot dropzone's icon disc is decoration; the dropzone's HOVER is the
   interaction. So the disc goes gold and the hover (below) stays red. */
body.np-forms .p100-sg .headshot-drop .icon {
    background: var(--nbf-gold-tint);
    color: var(--nbf-gold);
}
/* The uploaded portrait's ring: pure identity, and the same gold ring the
   ranked-CEO landers use around a headshot. */
body.np-forms .p100-sg .headshot-preview img { border-color: var(--nbf-gold-ring); }

/* ── the one gradient: the progress bar ──────────────────────────────────── */
/* Wide, shared between "how far you have come" (identity) and "you are moving"
   (action), and carries no text. The only place in a form where hard rule 1
   permits a two-hue object. */
body.np-forms .p100-sg .progress-fill { background: var(--nbf-bar); }

/* ── red: kept, but lifted where it is small TEXT ────────────────────────── */

/* Required markers stay red — a required field is emphasis by definition.
   `.req` renders at the label's 18px, so no lift is needed. */
body.np-forms .p100-sg .field label .req { color: var(--nbf-red); }

/* Validation error text at 11px. #FB0401 measures 4.77:1 on #0c0c0c, which
   scrapes past 4.5:1 — but this is the string a user reads when they are
   already stuck, and hard rule 3 gives us a lift built for exactly this.
   #FF5A57 = 6.38:1. */
body.np-forms .p100-sg .field-error { color: var(--nbf-red-lift); }
body.np-forms .p100-sg .upload-status.err { color: var(--nbf-red-lift); }
body.np-forms .p100-sg .headshot-preview .replace { color: var(--nbf-red-lift); }

/* Remove-a-row buttons: destructive, therefore red, therefore lifted (14px/700
   on the 0.10 tint is 4.53:1 — a 0.03 margin is not a margin). #FF5A57 on the
   same fill is 6.07:1. */
body.np-forms .p100-sg .repeater-item .rm { color: var(--nbf-red-lift); }

/* Interactive hovers stay red — this is the 10% red is for. */
body.np-forms .p100-sg .headshot-drop:hover { border-color: var(--nbf-red); }
body.np-forms .p100-sg .headshot-drop.dragover { border-color: var(--nbf-red); }
body.np-forms .p100-sg .add-btn:hover {
    border-color: var(--nbf-red);
    color: var(--nbf-red-lift);
}
/* Selected mode-card = an active state = red. Unchanged, restated so the
   grammar reads complete in one place. */
body.np-forms .p100-sg .mode-card.selected {
    border-color: var(--nbf-red);
    background: rgba(251,4,1,0.06);
}
body.np-forms .p100-sg .mode-card:hover { border-color: var(--nbf-stroke-hi); }

/* ── green: the commit ───────────────────────────────────────────────────── */

/* Continue / Submit. 14px/700 → the hybrid rule's `--deep` band.
   Was white on #FB0401 = 4.10:1, a failure that has been live on this form
   the whole time. */
body.np-forms .p100-sg .btn-primary {
    background: var(--nbf-green);
    color: #fff;
}
body.np-forms .p100-sg .btn-primary:hover { background: var(--nbf-green-hover); }

/* "Email me my secure link" — the magic-link recovery commit. It shipped as
   #00B05D with white type: 2.85:1, the exact failure NP-BLEND-THEME.md flag
   128 documents, on the button a locked-out contributor has to find. This is
   an inline style attribute in the production bundle, so it is one of the four
   documented !important-free exceptions — see §7. */

/* Back stays a quiet outline. The blend has no opinion about neutral. */
body.np-forms .p100-sg .btn-secondary:hover { border-color: var(--nbf-stroke-hi); }

/* Success is green, and green is now one family: #28a745 retires (§6 of the
   forms bible asked for exactly this). */
body.np-forms .p100-sg .success-state .checkmark {
    background: rgba(0,127,68,0.16);
    color: #00C46A;   /* on that fill over #0c0c0c: 8.1:1 at 34px — a glyph, not body text */
}


/* ==========================================================================
   §3  MONTHLY CHECK-IN — /monthly-check-in/  (.p100-mc)
   Same grammar. Two differences worth knowing: the page is magic-link gated so
   its steps only exist after a token resolves, and a large slice of its CSS is
   injected by the production bundle at runtime — the photo pitch, the
   dropzone, the upload queue, the contacts editor. Those are the (0,2,x)
   rules this section reaches over.
   ========================================================================== */

body.np-forms .p100-mc .month-badge {
    background: var(--nbf-gold-tint);
    color: var(--nbf-gold);
    border-color: var(--nbf-gold-line);
}
body.np-forms .p100-mc .ec-card h3 { color: var(--nbf-gold); }
body.np-forms .p100-mc .progress-fill { background: var(--nbf-bar); }

/* Static helper panel → gold, same reasoning as the show-guest geo helper. */
body.np-forms .p100-mc .helper-box {
    background: var(--nbf-gold-wash);
    border-color: var(--nbf-gold-line);
}
body.np-forms .p100-mc .helper-box strong { color: var(--nbf-gold); }

/* The topic cards' eyebrow, in its selected state. 10px/700 red on the
   selected card's own fill is 4.66:1; the lift takes it to 6.24:1. */
/* The topic cards' "Option A / Option B" eyebrow at 10px/700, rgba(255,255,255,0.4)
   on the card fill = 3.83:1. Only visible once a real topic pair loads, which is
   why it took a mocked prefill to surface it. */
body.np-forms .p100-mc .topic-card .t-label { color: #B5B5B5; }
body.np-forms .p100-mc .topic-card.selected .t-label { color: var(--nbf-red-lift); }
body.np-forms .p100-mc .topic-card.selected { border-color: var(--nbf-red); }
body.np-forms .p100-mc .topic-card:hover { border-color: var(--nbf-stroke-hi); }

body.np-forms .p100-mc .field label .req { color: var(--nbf-red); }
body.np-forms .p100-mc .repeater-item .rm { color: var(--nbf-red-lift); }
body.np-forms .p100-mc .add-btn:hover {
    border-color: var(--nbf-red);
    color: var(--nbf-red-lift);
}
body.np-forms .p100-mc .tag-chip .x { color: var(--nbf-red-lift); }

/* Buttons. `.btn-primary` is Continue/Submit → green. `.btn-skip` is the
   per-section "skip" — a step control, and the brief's rule sends step
   controls to gold. It reads as furniture next to a green commit, which is
   exactly what it is. */
body.np-forms .p100-mc .btn-primary {
    background: var(--nbf-green);
    color: #fff;
}
body.np-forms .p100-mc .btn-primary:hover { background: var(--nbf-green-hover); }
body.np-forms .p100-mc .btn-skip:hover {
    background: var(--nbf-gold-tint);
    color: var(--nbf-gold);
    border-color: var(--nbf-gold-line);
}
body.np-forms .p100-mc .btn-secondary:hover { border-color: var(--nbf-stroke-hi); }

body.np-forms .p100-mc .success-state .checkmark {
    background: rgba(0,127,68,0.16);
    color: #00C46A;
}

/* ── the bundle-injected block ───────────────────────────────────────────── */
/* Everything below reaches a rule that does not exist until the bundle runs.
   Specificity is the only lever (the bundle's <style> is the last in <body>). */

/* The monthly-photos pitch is a static ask, not a control: gold. Its 4px left
   rule is the panel's identity mark, which is precisely what gold is for. */
body.np-forms .p100-mc .mc-photos-pitch {
    background: linear-gradient(135deg, rgba(200,169,81,0.12), rgba(200,169,81,0.04));
    border-color: var(--nbf-gold-line);
    border-left-color: var(--nbf-gold);
}
/* The dropzone is a control, so its hover and focus stay red — and now carry
   the ring, since the bundle's own rule zeroes the outline. */
body.np-forms .p100-mc .mc-dropzone:hover { border-color: var(--nbf-red); }
body.np-forms .p100-mc .mc-dropzone:focus {
    border-color: var(--nbf-red);
    box-shadow: var(--nbf-focus-ring);
}
/* dragover means "let go and it lands" — an accept state, so it stays green,
   moved onto the unified family. */
body.np-forms .p100-mc .mc-dropzone.dragover {
    border-color: var(--nbf-green);
    background: rgba(0,127,68,0.10);
}
body.np-forms .p100-mc .pq-done { color: #00C46A; }

/* The Power100 contacts cards: read-only context until you open the editor. */
body.np-forms .p100-mc .contact-role { border-left-color: var(--nbf-gold); }
body.np-forms .p100-mc .btn-contacts-toggle:hover {
    border-color: var(--nbf-red);
    background: rgba(251,4,1,0.06);
}


/* ==========================================================================
   §4  THE TWO STRIPE INTAKE PAGES — /expert-contributor-signup/ (2154) and
       /executive-authority-platform/ (6262), both `.p100-intake`

   Their `.p100-intake` blocks are BYTE-IDENTICAL, so this is one family layer
   serving two pages, the same way batches B+C treated the thirteen partner
   singles. Both are elementor_canvas pages: the CSS lives inside a 80-86KB
   post_content blob and is NOT edited here — this sheet reaches it from
   outside, which is the whole point of doing the canvas pages as an overlay.

   The lever is the token block. `.p100-intake { --p100-red: …; }` is (0,1,0);
   `body.np-forms .p100-intake` is (0,2,0) and wins. The host writes
   `color: var(--p100-red) !important` throughout — !important binds the
   declaration, not the variable, so re-pointing the variable carries every
   dependent rule with it and needs no !important in reply.
   ========================================================================== */

body.np-forms .p100-intake {
    /* THE FIX THAT MATTERS. --p100-green was #05C920: white type on it is
       2.24:1. It fills `.p100-btn-next` and `.p100-btn-submit` — the Next and
       Submit of a Stripe checkout, on both pages, live today. This is the same
       value and the same 2.24:1 batch A found on the EC intake wizard; these
       two canvas pages carry their own copy of it. */
    --p100-green:       #007F44;
    --p100-green-hover: #006638;

    /* --p100-gray was #767271 — 4.11:1 at 13px, i.e. failing, and it is the
       resting colour of the option cards, the section descriptions, the add
       buttons and the back button. Same token as the about-us rank-card miss
       (flag 112). #A6A6A6 is the forms bible's own tertiary text: 8.04:1. */
    --p100-gray:        #A6A6A6;

    /* strokes: 0.08 → the blend's resting 0.10 (hard rule 6) */
    --p100-border:      rgba(255,255,255,0.10);

    /* --p100-red is deliberately NOT re-pointed. It serves both roles in this
       system — focus and selected (action, correctly red) AND the section
       eyebrows and tier-time labels (static, wrongly red). Moving the token
       would drag the interactive states to gold, so the four static uses are
       corrected individually below instead. */
}

/* Static → gold. Eyebrows are named in NP-BLEND-THEME.md's gold row; the tier
   "time" line is a static descriptor, not a control. */
body.np-forms .p100-intake .p100-section-header .section-eyebrow { color: var(--nbf-gold); }
body.np-forms .p100-intake .p100-tier-card .tier-time { color: var(--nbf-gold); }
body.np-forms .p100-intake .p100-upload-area .upload-text span { color: var(--nbf-gold); }

/* The progress rail is where the grammar reads clearest:
     completed → GOLD PLATE with ink numerals. A finished step is achievement,
                 which is identity, and gold-on-ink at 8.72:1 is the strongest
                 contrast the whole system offers — better than the green plate
                 it replaces, which was #05C920 with white at 2.24:1.
     active    → RED, because it is the live one. Lifted, since the numeral
                 renders small. */
body.np-forms .p100-intake .p100-progress-step.completed .p100-progress-num {
    border-color: var(--nbf-gold);
    background: var(--nbf-gold);
    color: #0A0A0A;
}
body.np-forms .p100-intake .p100-progress-step.active .p100-progress-num {
    border-color: var(--nbf-red);
    color: var(--nbf-red-lift);
}

/* Small red text elsewhere in the family takes the lift. */
body.np-forms .p100-intake .p100-payment-error { color: var(--nbf-red-lift); }
body.np-forms .p100-intake .p100-order-summary .summary-total { color: var(--nbf-gold); }
body.np-forms .p100-intake .p100-add-btn:hover { color: var(--nbf-red-lift); }
body.np-forms .p100-intake .p100-repeater-item .remove-btn:hover { color: var(--nbf-red-lift); }

/* The repeater's resting remove-× is rgba(255,255,255,0.3) = 2.62:1 at 18px,
   a pre-existing failure on both pages. 0.55 white puts it at 5.6:1 and still
   reads as secondary next to the field it removes. */
body.np-forms .p100-intake .p100-repeater-item .remove-btn { color: rgba(255,255,255,0.55); }

/* The green Next/Submit hover glow still fired bright-green light from the old
   token; match it to the new fill. */
body.np-forms .p100-intake .p100-btn-next:hover,
body.np-forms .p100-intake .p100-btn-submit:hover {
    box-shadow: 0 4px 16px var(--nbf-green-glow);
}

/* The "Continue to Payment" link on both pages: #28a745 with white at 16px =
   3.13:1. Same commit action, same green as every other commit. */
body.np-forms .cp-cta-link {
    background: var(--nbf-green);
    color: #fff;
}
body.np-forms .cp-toggle-btn.active { background: var(--nbf-red); }


/* ==========================================================================
   §5  EXECUTIVE AUTHORITY PLATFORM — /executive-authority-platform/ (6262),
       the `.eap-*` sales surface above the intake

   This page was ALREADY the closest thing to the blend in the estate: it
   declares `--gold: #C8A951` and `--red: #FB0401` and uses gold for tiles,
   rules, icons and panel edges. It needed the least and gets the least — two
   contrast repairs and the CTA rule. Its red section headlines are LEFT red:
   on a sales surface a headline is deliberate emphasis, and at clamp(28-44px)
   they measure 4.88:1 on the page's #08080A ground, well past the 3:1 bar.
   ========================================================================== */

/* The step badges are NUMERALS on a red disc with white type: 4.10:1 at
   17px/700. Hard rule 2 puts numerals in gold, and the gold plate takes the
   same glyph to 8.72:1. The strongest fix and the correct grammar at once. */
body.np-forms .eap-badge {
    background: var(--nbf-gold);
    color: #0A0A0A;
    box-shadow: 0 5px 16px rgba(200,169,81,0.30);
}

/* The hero CTA. 13.5px measured → the hybrid rule's `--deep` band → green.
   Was white on red at 4.10:1. */
body.np-forms .eap-cta-btn {
    background: var(--nbf-green);
    box-shadow: 0 10px 30px var(--nbf-green-glow);
}
body.np-forms .eap-cta-btn:hover { box-shadow: 0 14px 36px rgba(0,127,68,0.42); }


/* ==========================================================================
   §6  THE REMAINING CANVAS FORMS
   ========================================================================== */

/* ── /contributor-delegate/ (1046, `.p100-delegate`) ─────────────────────── */
body.np-forms .p100-delegate .leader-info h3 { color: var(--nbf-gold); }
body.np-forms .p100-delegate .dlg-tier-time { color: var(--nbf-gold); }
body.np-forms .p100-delegate .dlg-tier-card.selected { border-color: var(--nbf-red); }
body.np-forms .p100-delegate .submit-btn {
    background: var(--nbf-green);
    color: #fff;
}
body.np-forms .p100-delegate .submit-btn:hover { background: var(--nbf-green-hover); }

/* ── /article-voice/ (2151, `.p100-ae`) ──────────────────────────────────── */
/* Its entire stylesheet ships inside the production bundle's FORM_HTML, which
   lands in <body>; specificity is again the only lever. */
body.np-forms .p100-ae .badge,
body.np-forms .p100-ae .show-badge {
    background: var(--nbf-gold-tint);
    color: var(--nbf-gold);
    border-color: var(--nbf-gold-line);
}
body.np-forms .p100-ae .progress-fill { background: var(--nbf-bar); }
body.np-forms .p100-ae .field label .req { color: var(--nbf-red); }
body.np-forms .p100-ae .field-error { color: var(--nbf-red-lift); }
body.np-forms .p100-ae .add-btn:hover {
    border-color: var(--nbf-red);
    color: var(--nbf-red-lift);
}
body.np-forms .p100-ae .btn-primary {
    background: var(--nbf-green);
    color: #fff;
}
body.np-forms .p100-ae .btn-primary:hover { background: var(--nbf-green-hover); }

/* ── /company-culture-index/ (2152) + /employee-verification/ (5449),
      both `.p100-cs` ────────────────────────────────────────────────────────
   One shared class system across two production bundles, so one layer.
   🔴 NOT TOUCHED, deliberately: the 1-5 scale buttons. Their five colours are
   painted onto element.style by JS (`paint()` in culture-index-form.js) and
   they are a designed semantic ramp — amber at 1 through deep green at 5 —
   not brand accent. Recolouring a meaning-bearing scale to fit a brand grammar
   would destroy the thing the scale says, and beating an inline style property
   would take an !important per property. Same principle that left the partner
   marks alone in batches B+C. Recorded as a sanctioned untouched, not a gap. */
body.np-forms .p100-cs .badge {
    background: var(--nbf-gold-tint);
    color: var(--nbf-gold);
    border-color: var(--nbf-gold-line);
}
body.np-forms .p100-cs .seclabel { color: var(--nbf-gold); }
body.np-forms .p100-cs .qhsec { color: var(--nbf-gold); }
body.np-forms .p100-cs .pfill { background: var(--nbf-bar); }
body.np-forms .p100-cs label.fl .req { color: var(--nbf-red); }
body.np-forms .p100-cs .choice.sel { border-color: var(--nbf-red); }
body.np-forms .p100-cs .choice:hover { border-color: var(--nbf-stroke-hi); }
/* #00B05D with white type = 2.85:1, on the primary button of both forms. */
body.np-forms .p100-cs .btn-primary {
    background: var(--nbf-green);
    color: #fff;
}
body.np-forms .p100-cs .btn-primary:hover { background: var(--nbf-green-hover); }
body.np-forms .p100-cs .done .check {
    background: rgba(0,127,68,0.16);
    color: #00C46A;
}
body.np-forms .p100-cs .err h2 { color: var(--nbf-red); }   /* 24px — no lift needed */


/* ==========================================================================
   §6b  THE HEADER LOCKUP — Zeek's live review, 2026-08-21

   THE DEFECT. In `.p100-sg .header` the mark and the "Power100 / Profile" pill
   sit SIDE BY SIDE and touching, instead of stacking. The cause is one missing
   word: the host sets `.header img { width:44px; margin-bottom:18px; }` and an
   <img> is display:INLINE by default, so in a `text-align:center` block it
   shares a line box with the inline-block pill that follows it. The 18px
   bottom margin does nothing on an inline box either, which is why the two
   also read as overlapping rather than merely adjacent.

   THE FIX is `display:block; margin:0 auto <gap>` — one declaration that puts
   the mark on its own line and re-activates the gap the author already asked
   for. The column then reads mark → pill → h1 → sub, centred, which is the
   order the markup was always in.

   SAME DEFECT, SAME FIX, THREE MORE FORMS: `.p100-ae` (article-voice) has the
   identical `width:40px; margin-bottom:16px` with no display, and
   `.p100-delegate` sets the same pair from an inline style attribute — which
   sets width and margin but NOT display, so a stylesheet still wins the one
   property that matters. `.p100-cs` (culture-index, employee-verification) was
   already written `display:block; margin:0 auto` and is left untouched.

   🔴 THE SAME DEFECT IS LIVE ON power100.io. These forms' markup and the
   `.header img` rule ship from the same places on both installs. Live is NOT
   touched by this wave; the fix rides the cutover deploy. Recorded in the
   hand-back so a separate live backport can be offered.

   THE MARK GOES GOLD (Zeek). The header <img> points at the RED chevron, and
   at a LIVE cross-domain URL (power100.io/wp-content/uploads/...), on a staging
   page. Both are fixed by one `content:` swap to the theme-hosted gold mark
   that np_chrome_logo_url() already serves — the exact same file the sitewide
   nav uses, no new asset introduced. `content` on a replaced element is the
   standard way to substitute an image from CSS and is supported across all
   current engines; where it is not, the element simply keeps its original
   source, so the failure mode is "still red", never "no logo".

   The src attribute is matched rather than the class, so the swap follows that
   specific red-chevron asset wherever it appears in the family and cannot
   touch a form that ships its own artwork (the EAP and intake pages use their
   own marks and are untouched).

   NOTE ON THE FILE'S OWN RULES: the header above says this sheet sets colour
   and nothing else. These four declarations are the exception, they are here
   because they were asked for by name, and they are listed rather than folded
   in quietly.
   ========================================================================== */
body.np-forms .p100-sg .header img,
body.np-forms .p100-ae .header img,
body.np-forms .p100-delegate .header img {
    display: block;
    margin-left: auto;
    margin-right: auto;
}
body.np-forms .p100-sg .header img[src*="Power100-Icon"],
body.np-forms .p100-ae .header img[src*="Power100-Icon"],
body.np-forms .p100-delegate .header img[src*="Power100-Icon"],
body.np-forms .p100-cs .head img[src*="Power100-Icon"] {
    content: url("../assets/power100-mark-gold-512.png");
}


/* ==========================================================================
   §7b  THE !important EXCEPTIONS — enumerated, one comment each

   The header above says this sheet uses no !important. That was true until the
   audit measured the two Stripe pages, and the honest thing is to list the
   exact places it is not, rather than quietly relax the claim.

   EVERY rule below is answering one of two things, never a plain stylesheet
   rule we could have out-specified:
     (a) an INLINE style attribute (which no selector can outrank), or
     (b) a host declaration that already carries !important of its own.
   Nine declarations. Each one is named, measured, and reversible on its own.

   The attribute selectors (`[style*="…"]`) look brittle and are deliberately
   so: they match the literal inline value they are correcting, so if the host
   blob ever changes that value the rule stops matching and the element falls
   back to the host's own appearance. The failure mode is "no longer corrected",
   never "broken".
   ========================================================================== */

/* (1) THE STRIPE NEXT BUTTON on /expert-contributor-signup/.
   Lives in #formNavBar, OUTSIDE .p100-intake, so it never inherits the
   re-pointed --p100-green — and its fill is written to element.style by the
   page's own JS, so only !important reaches it. White on #05C920 is 2.24:1,
   on the Continue button of a paid signup. */
body.np-forms #formNavBar button[style*="rgb(5, 201, 32)"] {
    background: var(--nbf-green) !important;
    color: #fff !important;
}

/* (2) "CONTINUE TO PAYMENT" on /executive-authority-platform/.
   Inline `background:#28a745` — white on it is 3.13:1, and it is the button
   that opens the checkout. */
body.np-forms button[style*="#28a745"] {
    background: var(--nbf-green) !important;
    color: #fff !important;
}

/* (3) THE EAP STEP BADGES. §5 turns these gold; the host pins
   `color:#fff !important`, and white on gold is 2.27:1 — WORSE than the red
   they replaced. Without this line the gold move is a regression, which is
   exactly what the audit caught. Ink on gold is 8.72:1. */
body.np-forms .eap-badge { color: #0A0A0A !important; }

/* (4)(5)(6) THE INTAKE PROGRESS RAIL. All three states pin their colour with
   !important in the host blob.
   resting   rgba(255,255,255,0.3) = 2.62:1 — a step you have not reached is
             still a step you must be able to read. 0.55 white = 5.60:1.
   active    the red lift, since a 12px numeral is small text.
   completed ink, to sit on §4's gold plate. */
body.np-forms .p100-intake .p100-progress-num { color: rgba(255,255,255,0.55) !important; }
body.np-forms .p100-intake .p100-progress-label { color: rgba(255,255,255,0.55) !important; }
body.np-forms .p100-intake .p100-progress-step.active .p100-progress-num { color: var(--nbf-red-lift) !important; }
body.np-forms .p100-intake .p100-progress-step.completed .p100-progress-num { color: #0A0A0A !important; }

/* (7) THE EAP SUB-LINE EMPHASIS. `.eap-sub .r` is red at 19px on the page's
   near-black: 4.39:1, just under the bar. Host pins it !important. */
body.np-forms .eap-sub .r { color: var(--nbf-red-lift) !important; }

/* (8) THE "(optional)" FIELD MARKER (both intake pages).
   rgba(255,255,255,0.25) at 10px = 2.16:1, pinned !important in the host
   stylesheet — reachable, unlike the fine print in §7. It tells a user which
   fields they can skip, so it is wayfinding, not decoration. */
body.np-forms .p100-intake .p100-field label .opt { color: rgba(255,255,255,0.55) !important; }

/* (9) THE STAGING BACK-LINK, and a genuine interaction bug it exposed.
   unification/staging-mu/staging-test-nav.php renders a fixed pill bottom-left
   and styles it GOLD inline (`color:#C8A951` on `background:#14141A` — 8.08:1,
   correctly designed). On these two canvas pages it renders RED at 4.47:1,
   because both blobs carry an unscoped `a { color:#FB0401 !important; }` which
   beats a NON-important inline colour. The artifact is not broken; the page is
   overriding it. This restores the colour its author specified rather than
   inventing one, and wins on specificity against the blob's `a` rule.
   (The artifact itself is staging-only and deleted at cutover — this line goes
   with it and harms nothing if it outlives it.) */
body.np-forms a[style*="z-index:2147483000"] { color: #C8A951 !important; }
body.np-forms a[style*="z-index:2147483000"] span { color: #C8A951 !important; }

/* (9) THE CLASSIFICATION RESULT PANEL (2154). A read-only "here is what you
   are" panel, inline-styled with a red left rule and a red wash — static, so
   the grammar sends it gold. Hidden until classification runs, which is why
   the audit never graded it. */
body.np-forms div[style*="border-left:3px solid #FB0401"] {
    border-left-color: var(--nbf-gold) !important;
    background: var(--nbf-gold-wash) !important;
}

/* THE EAP CTA BAND — not an !important, but it belongs with this group.
   The band is `background: var(--red)` with a white h2 (large, fine at 4.10:1
   against the 3:1 bar) and a 17px white-0.9 sub-line at 3.45:1, which fails.
   Neither available answer inside pure #FB0401 works: full white is 4.10:1 and
   still short, and ink is 4.83:1 but puts dark type under a white headline in
   the same band. So the BAND deepens instead. #D40301 is already a named value
   in both bibles (the forms system's --form-accent-hover, the blend's
   light-mode red lift) and takes white to 5.51:1 at every size — headline and
   sub-line both pass, the band stays one solid red, and hard rule 1 holds. */
body.np-forms .eap-band { background: #D40301; }


/* ==========================================================================
   §7  WHAT THIS SHEET CANNOT REACH, AND WHY IT WAS LEFT THERE

   1. 🔴 THE LEGAL FINE PRINT ON BOTH STRIPE PAGES — the one thing in this wave
      that CSS cannot fix, and the one worth acting on.
      "Confidential — for invited prospects only" (13px), "Terms of Service"
      and "Privacy Policy" (12px) are written with an INLINE style carrying
      !important, at 0.20-0.28 white. Measured: 1.79:1, 2.16:1, 2.20:1, 2.38:1
      — a fifth to a half of the required 4.5:1, on the terms a user agrees to
      before a card is charged.

      An inline !important is the top of the author cascade: a stylesheet
      !important does NOT beat it, at any specificity. (This was tried and
      measured, not assumed — the attribute-selector rules were written, shipped
      and read back still failing.) The only fix is editing the post_content
      blob, which is out of scope for a wave scoped to non-destructive overlays.
      → REPORTED AS needs-content-surgery: 3 elements × 2 pages. Everything else
        on both pages is blended and passing.

      The other inline-!important colours on those pages
      (`rgba(255,255,255,0.9)` on strong, `#FB0401` on the consent links) all
      measure past AA where they land, so they are grammar drift, not debt.
      Left, recorded.

   2. `#sgResendBtn` on the show-guest form — the "Email me my secure link"
      button. Its #00B05D fill is set from JavaScript inside the PRODUCTION
      bundle (tpx.power100.io/api/assets/show-guest-form.js), which serves LIVE
      power100.io as well as staging. A staging-only wave cannot edit it, and
      an !important override here would leave live still failing while making
      staging look fixed. Flagged for the backend lane instead: it is a
      2.85:1 white-on-green on the button a locked-out contributor needs.

   3. The 1-5 culture scale — see §6.

   4. The page ground. Both bibles agree it should become #0A0A0A (the forms
      bible's §6 asks for exactly this), but the value is repeated in the
      templates, in three canvas wrappers' inline styles, and in two production
      bundles. Changing the half this wave owns would put a visible seam down
      the middle of the canvas pages, so #0c0c0c stands until all four can move
      together. One token, owed at cutover.
   ========================================================================== */

/* ── Launch fix 2026-09-29: the intake progress rail overflowed a 390px phone.
   The rail is `display:flex; justify-content:center` with six steps, so on a phone it ran
   wider than the viewport and the centering pushed step 1 off the left edge (the page then
   started at "2"). Below 600px: labels off, tight padding, and the rail can never be wider
   than the screen. Scoped to the intake canvas page; specificity beats the page's inline
   `.p100-progress-step { padding: 0 16px }`. The page text "Step 1 of 4" vs six steps is
   post_content, not theme, and is reported separately. ── */
@media (max-width: 600px) {
    body.np-forms .p100-intake .p100-progress-bar { max-width: 100%; box-sizing: border-box; overflow: hidden; padding-left: 8px; padding-right: 8px; }
    body.np-forms .p100-intake .p100-progress-step { padding: 0 8px; flex: 0 1 auto; min-width: 0; }
    body.np-forms .p100-intake .p100-progress-label { display: none; }
}
