/* oig-fonts-space-grotesk-css /wp-content/themes/operation-iron-gate/oig/fonts-space-grotesk.min.css */
@font-face{font-family:'Space Grotesk';font-style:normal;font-weight:400;font-display:swap;src:url(/wp-content/themes/operation-iron-gate/oig/assets/fonts/space-grotesk-v22-latin-regular.woff2) format('woff2')}@font-face{font-family:'Space Grotesk';font-style:normal;font-weight:500;font-display:swap;src:url(/wp-content/themes/operation-iron-gate/oig/assets/fonts/space-grotesk-v22-latin-500.woff2) format('woff2')}@font-face{font-family:'Space Grotesk';font-style:normal;font-weight:600;font-display:swap;src:url(/wp-content/themes/operation-iron-gate/oig/assets/fonts/space-grotesk-v22-latin-600.woff2) format('woff2')}@font-face{font-family:'Space Grotesk';font-style:normal;font-weight:700;font-display:swap;src:url(/wp-content/themes/operation-iron-gate/oig/assets/fonts/space-grotesk-v22-latin-700.woff2) format('woff2')}
/* oig-elementor-bridge-css /wp-content/themes/operation-iron-gate/oig/elementor-bridge.css */
/*
 * elementor-bridge.css — operation-iron-gate (LIVE theme)
 * ---------------------------------------------------------------------------
 * Rules that exist ONLY to beat Elementor's own frontend resets, which target
 * elements inside .elementor and therefore outrank the design's plain classes.
 *
 * ⚠ THIS IS NOT A COPY OF THE LOCAL THEME'S elementor-bridge.css.
 *
 * The hello-elementor-oig bridge (8,824 B) also zeroes Elementor's default
 * container padding and gap:
 *     .elementor .e-con { --padding-inline-start:0; --gap:0; ... }
 * That is ONLY safe there because json/convert.py emits layout-<page>.css,
 * which re-supplies the design's own padding and gap afterwards.
 * THIS THEME HAS NO layout-<page>.css. Copying those rules here would strip
 * padding and gap site-wide with nothing to restore them. Do not port them
 * without porting the generated layout files first.
 *
 * ---------------------------------------------------------------------------
 * RULE 1 — the brand mark rendering at natural size over the hero
 *
 * MEASURED LIVE 2026-08-17 at 1440px, on every page:
 *     .nav__mark   attr 38x34   natural 869x767   RENDERED 869x767
 *     top -425px, bottom 342px, hero top 184px  ->  158px of hero overlap
 *
 * A ~869x767 navy family mark was hanging out of the header across the hero.
 * It is the SITE BRAND LOGO, not leftover content from an older build, and it
 * must not be deleted — .nav__brand would become an empty link on all six pages.
 *
 * CAUSE — a specificity loss, nothing more:
 *     .elementor img { height:auto; max-width:100% }   (0,1,1)  custom-frontend.min.css
 *     .nav__mark     { height:46px; width:auto }       (0,1,0)  styles.css:4380
 * Elementor's reset wins, height falls back to auto, and .nav__mark's own
 * width:auto then lets the image draw at its intrinsic 869x767.
 *
 * The header markup is an HTML widget inside a Theme Builder template, so the
 * mark is a descendant of .elementor on every page. There is no markup change
 * that avoids this — the fix belongs in CSS.
 *
 * Restores the design's declared sizes verbatim from styles.css:4380-4381
 * (46px at rest, 35px condensed — both deliberately 25% up from 38/28, per the
 * source comment at styles.css:4371). width:auto preserves the aspect ratio.
 *
 * SPECIFICITY, not load order, is what makes these win:
 *     .elementor .nav__mark                    (0,2,0) > .elementor img (0,1,1)
 *     .elementor .nav.is-condensed .nav__mark  (0,3,0) > the rule above
 * The condensed state therefore still overrides the resting state, exactly as
 * it does in styles.css. Do not "simplify" by dropping .elementor from the
 * first selector — at (0,1,0) it loses to Elementor's reset again.
 */

.elementor .nav__mark {
	height: 46px;
	width: auto;
}

.elementor .nav.is-condensed .nav__mark {
	height: 35px;
}

/*
 * ---------------------------------------------------------------------------
 * RULE 2 — heading widgets render at Elementor's sizes, not the design's
 *
 * In the source a heading carries its design class on the TAG:
 *     <h1 class="display-hero">        .display-hero{font-size:var(--fs-hero)}
 * Elementor's Heading widget cannot put a class on the tag. The class lands on
 * the widget WRAPPER and the tag renders with Elementor's classes only:
 *     <div class="display-hero oig-ht elementor-widget-heading">   <- 123.84px
 *       <h1 class="elementor-heading-title">                        <- 40px
 *
 * MEASURED LIVE 2026-08-17, homepage at 1440px: 29 heading widgets, 0 correct.
 * Every tag rendered at a flat Elementor size regardless of intent:
 *     H1  intended 123.84  ->  40      (--fs-hero clamp(46px,8.6vw,132px))
 *     H2  intended 120.96 / 77.76 / 68 / 67.68 / 54 / 31.68 / 12  ->  all 32
 *     H3  intended 74 / 16 / 13                                   ->  all 28
 * and custom-frontend.min.css additionally forces line-height:1 on every one.
 *
 * SEVEN DISTINCT INTENDED SIZES FOR <H2> ALONE. That is why this is fixed in
 * CSS and NOT by typing a px value into each widget: one number per tag is
 * wrong by construction. Setting "H2 = 68px" would be correct for one of the
 * fifteen H2s and would render .ledger__label and .cap__eyebrow — both
 * intended at 12px — at 68px. It would also freeze every clamp(), so the type
 * would stop scaling between 320px and widescreen, and would not touch
 * line-height at all.
 *
 * THE FIX — make the inner tag typographically transparent so the source class
 * on the wrapper governs, exactly as it does in the source markup.
 *
 * SCOPING IS THE LOAD-BEARING PART. Applies ONLY to widgets carrying .oig-ht,
 * which the generator adds only where the SOURCE class actually declares a
 * font-size. MEASURED on home: 21 widgets carry it (19 were wrong); the other
 * 8 do not, and 7 of those are ALREADY CORRECT — four <h4> at 10.5px and three
 * <h3> at 20px, styled by design descendant rules that target the bare tag
 * (ratios 0.656 and 1.25 against the 16px base, both matching source). A
 * blanket rule here would outrank those and break the seven while fixing the
 * nineteen. DO NOT WIDEN THIS SELECTOR.
 *
 * Specificity (0,3,0) beats hello-elementor's bare h1..h6 sizing and Elementor's
 * .elementor-heading-title, so this one does not depend on load order.
 */

.elementor-widget-heading.oig-ht > .elementor-heading-title {
	font: inherit;
}

/*
 * ---------------------------------------------------------------------------
 * RULE 3 — Elementor's forced line-height:1 on every heading title
 *
 * custom-frontend.min.css ships .elementor-heading-title{line-height:1}, which
 * discards the source line-heights. On this design they are mostly INHERITED
 * (body is 1.6) rather than set on the heading, so the forced 1 collapses them.
 * MEASURED live: every one of the 29 headings had line-height exactly equal to
 * its font-size, i.e. 1.0.
 *
 * ⚠ THE SELECTOR BELOW IS DELIBERATELY IDENTICAL TO ELEMENTOR'S, at the same
 * (0,1,0) specificity. It wins ONLY because this file is enqueued after
 * elementor-frontend. That is the whole point:
 *   - it displaces Elementor's rule and nothing else
 *   - it still LOSES to any design rule that is more specific, e.g.
 *     `.foo h3{line-height:1.3}` at (0,1,1) — which is what keeps the unclassed
 *     headings correct
 *
 * Do NOT "improve" this to .elementor-widget-heading .elementor-heading-title.
 * At (0,2,0) it outranks those design rules and breaks them — measured on the
 * local build: it fixed four headings and broke three.
 *
 * BECAUSE THIS RULE DEPENDS ON LOAD ORDER, verify it after any change to the
 * enqueue order in inc/asset-map.php. The theme's oig/*.css currently print
 * after uploads/elementor/css/custom-frontend.min.css, which is what makes it
 * work.
 */
.elementor-heading-title {
	line-height: inherit;
}

/*
 * ---------------------------------------------------------------------------
 * RULE 4 — nav overflows between 1081px and 1240px
 *
 * styles.css carries a FOUNDER RULING (see its own appended block, "NAV — LINKS
 * VISIBLE 1081-1240"): the eight nav items must stay on screen in that band
 * rather than collapse to the burger. Its companion rule tightens the links
 * "so they FIT between 1080 and 1240". MEASURED LIVE 2026-08-17 they do not:
 *
 *     viewport 1100 -> .nav__in available 1019
 *       brand 241 (mark 52 + gap 11 + .nav__names 178 @16px)
 *     + links 653 (ALREADY tightened: gap 10px, 12px type, 7 visible)
 *     + cta   101
 *     + gaps   48  (24 x 2)
 *     = 1043 needed  ->  24px SHORT. The Donate button sat 23px off-screen and
 *       body{overflow-x:clip} cut it.
 *
 * The links are already at their tightest, so the space has to come from the
 * brand. THE MARK IS NOT TOUCHED — styles.css:4371 records that 46/35px was a
 * deliberate 25% size-up, and this file's Rule 1 restores it. The wordmark text
 * beside it is the larger share (178px of the 241px) and carries the reduction.
 *
 * Scoped to the exact band that overflows. Below 1081 the burger takes over and
 * the nav is correct (measured at 1024: cta right 975 < 1024). Above 1240 the
 * design is untouched.
 *
 * Recovers ~38px against a 24px shortfall, leaving ~14px of headroom.
 */

@media (min-width: 1081px) and (max-width: 1240px) {
	.nav__in {
		gap: 12px;
	}
	.nav__names {
		font-size: 14px;
	}
	/* the design already tightens the CTA below 1080; do the same inside the band */
	.nav__cta .btn {
		padding: 11px 16px;
	}
}

/*
 * ---------------------------------------------------------------------------
 * RULE 5 — the footer wordmark runs out of room below ~1085px
 *
 * .close__mark is `white-space:nowrap` with `font-size:clamp(34px,11.3vw,190px)`
 * (styles.css:1465 and :4341). Anton renders "Pathfinders for Hope" at almost
 * exactly 7.47x the font-size, so the line grows nearly as fast as the viewport
 * while the padding and the fixed 57.6px body inset do not. MEASURED headroom:
 *
 *     1440px  text 1216 / avail 1259   +43
 *     1280px  text 1081 / avail 1106   +25
 *     1100px  text  929 / avail  931    +2
 *     1024px  text  865 / avail  861    -4   <- overflows its padding box
 *
 * At 1024 it spills 4px into its own padding rather than being cut by the
 * viewport, so the damage is small — but the margin is gone, and any fallback
 * font makes it severe: the same string in sans-serif measures 980 against
 * Anton's 865, a 115px penalty. During the font swap, or if Anton fails to
 * load, the line visibly overruns. (Verified Anton IS loading: document.fonts
 * reports "Anton 400 normal -> loaded" and the rendered width matches Anton.)
 *
 * Backing the coefficient off to 10.4vw ONLY where it is tight restores real
 * headroom (~66px at 1024) and absorbs the fallback penalty. Above 1240px the
 * design is untouched, so the desktop wordmark is unchanged.
 */

@media (max-width: 1240px) {
	.close__mark {
		font-size: clamp(34px, 10.4vw, 190px);
	}
}


/*
 * RULE 2 — Elementor's default container padding and gap, SITE-WIDE
 *
 * Elementor gives every .e-con a default 10px block padding and a 20px gap.
 * The design asks for neither: styles.css declares its own vertical rhythm
 * where it wants one (.sec is padding-block var(--section-y), .hero is 44/132,
 * .door is 16px). Nested up to five deep, Elementor's defaults compound on top
 * of the design's spacing on every container on every page.
 *
 * MEASURED LIVE 2026-08-17 at 1600x900, homepage, before this rule:
 *     157 containers
 *     Elementor default padding   1,960px   (98 containers x 20px)
 *     Elementor default gap       2,380px   (119 gaps x 20px)
 *     ELEMENTOR DRIFT             4,340px
 *     design padding              5,820px   (.sec alone 2,544 - correct)
 *     page height                21,644px
 *
 * After: page 18,866px. 2,778px reclaimed, 12.8% of the document.
 *
 * SCOPING, and both halves matter:
 *
 *   1. VERTICAL AXIS ONLY. The local hello-elementor-oig bridge also zeroes
 *      --padding-inline-*, but it can only do that safely because
 *      json/convert.py emits layout-<page>.css to re-supply the design's inline
 *      padding afterwards. THIS THEME HAS NO layout-<page>.css, so zeroing the
 *      inline axis would drop .shell's 24px gutter with nothing to restore it.
 *      Verified after: .shell inline still 24px/24px, max-width still 1440px.
 *
 *   2. The Elementor VARIABLES are zeroed, not the padding property. Every rule
 *      in styles.css that declares padding on a design class still wins, because
 *      it sets the property directly rather than the variable.
 *
 * PROVEN, not assumed. The rule was injected into the live page and reverted to
 * measure the delta before anything was written. Seven containers were flagged
 * as losing 10px; all seven were then checked against styles.css and each landed
 * EXACTLY on its declared design value, because the design declares only one
 * side and Elementor's default was supplying the other:
 *
 *     .crisis__top   design padding-bottom:18px            28 -> 18
 *     .ctb__direct   design padding-top:24px               34 -> 24
 *     .ev__grid      design clamp(30px,3.6vw,46px) = 46    56 -> 46
 *     .fhud          design padding-bottom:9px             19 ->  9
 *     .gpv__foot     design padding-top:18px               28 -> 18
 *     .vch           design padding-top:20px               30 -> 20
 *
 * Preserved after the change: .sec 104/104 (and 160/160 where --section-y is at
 * its 160px cap), .shell gutter 24/24, .shell max-width 1440px, .hero 44/132,
 * .door 16/16, .door__head 28/30, container min-heights unchanged at 190px total.
 *
 * NO font size, colour or design token is touched by this rule.
 *
 * Supersedes the hero-only version of this rule (2026-08-17). The hero was the
 * proving ground; this is the same fix with the scope widened after every design
 * padding carrier was verified to survive it.
 */

.elementor .e-con,
.elementor .e-con-full,
.elementor .e-con-boxed {
	--padding-block-start: 0px;
	--padding-block-end: 0px;
	--gap: 0px;
	--row-gap: 0px;
}

/*
 * RULE 2B — Elementor's default container INLINE padding, SITE-WIDE
 * (companion to RULE 2 above, which only zeroed the BLOCK axis)
 *
 * FOUNDER DECISION 2026-08-18, reversing the "leave it" call from earlier the
 * same day: zero it site-wide after all, since the un-zeroed inline default
 * was confirmed identical (not vdt/footer-specific) on every full-bleed
 * section measured — .vdt, .ctb, .nav, .close all showed the same 10px each
 * side at 1200px viewport.
 *
 * MECHANISM — traced in uploads/elementor/css/custom-frontend.min.css:
 *     .e-con{--padding-inline-start:var(--padding-left);
 *            --padding-inline-end:var(--padding-right);...}
 *     body.rtl .e-con{--padding-inline-start:var(--padding-right);...}   (RTL swap, not used on this site)
 *     .e-con{...;padding-inline-end:var(--padding-inline-end);
 *               padding-inline-start:var(--padding-inline-start)}
 * The REAL applied properties are padding-inline-start/end, consuming the
 * --padding-inline-start/end variables, which default to --padding-left/right
 * (var(--container-default-padding-left/right,10px)). Same pattern RULE 2
 * already used successfully for the block axis — override the CUSTOM PROPERTY
 * at higher specificity, let Elementor's own consuming rule apply the zero.
 *
 * .shell GUTTER IS SAFE — PROVEN, not assumed. styles.css:102:
 *     .shell{width:100%;max-width:var(--shell);margin-inline:auto;padding-inline:var(--outer)}
 * .shell's gutter is a real longhand `padding-inline` declaration in the
 * design's OWN stylesheet, which loads AFTER Elementor's base CSS (RULE 1's
 * load-order note applies here too) and overrides just the inline component
 * of whatever Elementor's `padding-inline-start/end` properties set —
 * regardless of what --padding-inline-start/end resolve to. .shell was never
 * reading FROM the Elementor variable in the first place, so zeroing that
 * variable cannot touch it. This is exactly why RULE 2's own before/after
 * sweep already logged ".shell gutter 24/24" as preserved through the block-
 * axis version of this same fix.
 *
 * RESIDUAL RISK, not fully swept — unlike RULE 2's block-axis change, this
 * one has NOT been measured against every container on every page the way
 * RULE 2 was (that sweep found seven containers whose values changed and
 * verified each landed exactly on its own declared design value). A
 * container that has no padding-inline/margin-inline of its own AND was
 * relying on Elementor's un-zeroed 10px default for its only left/right
 * breathing room would lose it. Spot-checked home page vdt/ctb/nav/close
 * plus the live footer template (post 116) after this change — all correct.
 * If a specific container elsewhere on the site loses its inline spacing,
 * give IT its own padding-inline in styles.css or elementor-bridge.css,
 * the same way .shell already has one — do not revert this rule wholesale.
 */
.elementor .e-con,
.elementor .e-con-full,
.elementor .e-con-boxed {
	--padding-inline-start: 0px;
	--padding-inline-end: 0px;
}


/*
 * RULE 3 — Elementor wrappers break the design's grid and flex parents
 *
 * The design puts its layout on a parent and expects ITS OWN elements to be the
 * direct children. Elementor wraps every widget in a .elementor-element div, so
 * the div becomes the grid/flex item and the design element is one level down,
 * where flex/grid properties no longer reach it.
 *
 * `display:contents` removes the wrapper's box from the tree without removing
 * the element, so the design's children become the real grid/flex items and the
 * source markup is reproduced exactly. Safe here because these wrappers carry no
 * styling of their own - no background, no border, and RULE 2 already zeroes
 * their padding.
 *
 * ---------------------------------------------------------------------------
 * 3A — .vs__row  (the "current system vs Operation Iron Gate" comparison)
 *
 * The design:
 *     .vs__row { display:grid; grid-template-columns: 1fr auto 1fr }   THREE columns
 *     .vs__n   { position:absolute; left:...; top:50% }                NOT a grid item
 * so only three elements are grid items: .vs__then, .vs__arrow, .vs__now.
 *
 * In the build all FOUR children were bare Elementor wrappers. .vs__n's
 * position:absolute sat on an inner element and never reached the wrapper, so
 * the wrapper still consumed a column - four items in a three-column grid, and
 * the fourth (.vs__now) wrapped onto a second implicit row.
 *
 * MEASURED LIVE 2026-08-17 at 1600x900, all five rows: the .vs__now text sat
 * 47px BELOW its own .vs__then, so row 01's checkmark lined up beside row 02's
 * struck-through text.
 *
 *     before   row spread 47 47 47 47 47
 *     after    row spread  0  0  0  0  0
 *              .vs__then left 342 - .vs__arrow left 802 - .vs__now left 872
 *              identical on all five rows; .vs__n position:absolute, out of flow
 *
 * ---------------------------------------------------------------------------
 * 3B — .sig__spine  (the signature rail's vertical line)
 *
 * The design:
 *     .sig        { position:fixed; top:0; bottom:0; display:flex; flex-direction:column }
 *     .sig__spine { flex:1 1 auto; width:1px; background:var(--hairline) }
 *     .sig__spine::before { height: calc(var(--sig-p,0) * 100%) }   progress fill
 *     .sig__tok           { top:    calc(var(--sig-p,0) * 100%) }   the orange diamond
 *
 * .sig__spine is a <span> inside a text-editor widget, so it was never a flex
 * child of .sig. `flex:1 1 auto` did not apply and a bare <span> is display:inline,
 * which ignores width and height.
 *
 * MEASURED before: .sig__spine display:inline, 0x0 - the vertical line was not
 * drawn at all, and because .sig__tok is positioned as a percentage OF THE SPINE,
 * a zero-height spine gave the diamond ZERO TRAVEL RANGE. That is why the rail
 * read as "too short" and why the marker did not track scroll.
 *
 *     after    .sig__spine display:block, 243x1
 *              243px is exactly the design's clamp(170px,27vh,270px) at a 900px
 *              viewport, so the spine is now at its declared height.
 *
 * NOT A BUG, do not "fix" it: .sig is position:fixed with top/bottom:0, so it
 * spans the VIEWPORT by design, not the document. Its height is 766px at a 900px
 * viewport (900 minus the 134px header offset from `body:has(.nav) .sig{top:var(--hdr-h)}`).
 * It is not meant to run the full page height and is unaffected by page height.
 *
 * signature.js computes --sig-p as scrollY / (scrollHeight - innerHeight), read
 * live on every scroll, so it self-corrects to the current page height. The
 * container-padding work in RULE 2 required no change here.
 */

.vs__row > .elementor-element,
.sig > .elementor-element {
	display: contents;
}


/*
 * RULE 3C — three more wrapper-intercepts-item-property cases, found by sweep
 *
 * SWEEP METHOD (2026-08-17). A naive sweep for "design class with display:grid
 * or flex whose children are bare Elementor wrappers" returns 80 elements / 56
 * signatures on the homepage. THAT LIST IS MOSTLY FALSE POSITIVES and applying
 * display:contents to it would wreck the page — measured:
 *     .crisis__grid   621 -> 1383   (+762)   the 2-column grid collapses
 *     .dsrt__in      1031 -> 1579   (+548)
 *     .gpv__in        592 ->  965   (+373)
 *     .hero__doors    445 ->  691   (+246)
 * Those wrappers are correctly filling their columns already.
 *
 * The real signal is narrower: a bare wrapper is only a defect when the DESIGN
 * CHILD inside it carries a property that ONLY works on a real grid/flex item —
 * position:absolute, flex-grow, flex-basis, align-self, justify-self,
 * grid-column, grid-row, order. The wrapper intercepts it and the property never
 * applies. That criterion returns 18 on the homepage.
 *
 * SECOND GATE: display:contents promotes EVERY child of the wrapper, not just
 * the design element. It is only safe where each wrapper holds exactly ONE
 * child, otherwise the parent's item count changes and the layout breaks. Of the
 * 18, only these three pass both gates, and all three are genuinely defective:
 *
 *   .fkey > .fkey__i--hollow   grid-column:1/-1, must span the whole grid.
 *                              MEASURED 242px against a 503px grid — one column.
 *   .vch__plot > .vch__stop    position:absolute; offsetParent was the WRAPPER,
 *                              not .vch__plot, so it positioned against the
 *                              wrong box.
 *   .pcm__panel > .pcm__num    position:absolute; same — offsetParent was the
 *                              wrapper. It happens to land inside the panel
 *                              today, so this one is latent rather than visible.
 *
 * Height deltas 0 / 0 / -3, so none of these disturbs surrounding layout.
 *
 * THE OTHER SEVEN ARE LEFT ALONE ON PURPOSE — each has a wrapper holding 2-4
 * children, so this pattern is the wrong tool and would change the item count:
 *     .oig-header > .skip           wrapper holds 2
 *     .hero__doors > .desc          wrapper holds 2   (contents = +246px, worse)
 *     .door > .door__d              wrapper holds 2
 *     .rcpt__c > .stat__src         wrapper holds 3   (contents = +43px, worse)
 *     .vs__legend > .vs__key        wrapper holds 3   (contents = +9px, worse)
 *     .closer > .clbg / .clbk       wrapper holds 4
 *     .vdt > .vdt__bk               wrapper holds 2
 * They need per-case fixes — put the property on the wrapper, or change the
 * markup — each measured on its own. Do NOT extend this selector to them.
 */

.fkey > .elementor-element,
.vch__plot > .elementor-element,
.pcm__panel > .elementor-element {
	display: contents;
}


/*
 * RULE 3E — .field Elementor wrapper must not consume flow in .hero__grid
 *
 * The source design: .field is position:absolute inside .hero__grid
 * (position:relative), overlaying the right side of the hero. The graphic
 * is NOT in document flow — it sits on top of the copy.
 *
 * In the Elementor build, .hero__grid has three children wrapped in
 * .elementor-element divs. Those wrappers ARE in flow (display:block).
 * The .field div inside its wrapper has position:absolute, but its wrapper
 * does not — so the wrapper consumes a full block row BELOW the copy and
 * doors, making the hero ~2x taller than the source. The graphic is there;
 * it just positions off the wrapper, not off .hero__grid.
 *
 * FIX: Apply position:absolute and the source geometry directly to the
 * Elementor wrapper for .field (element ID c029). This makes the wrapper
 * itself the absolute overlay, matching the source exactly.
 *
 * .field Elementor wrapper = .elementor-element-c029
 * Source geometry from styles.css line 315:
 *   position:absolute; right:-10%; top:-14%;
 *   width:var(--field-w,68vw); min-width:620px;
 *   z-index:1; pointer-events:none
 *
 * display:contents is NOT used here — it was tried and breaks the field
 * because the SVG canvas inside needs a sized positioned ancestor to
 * compute its own dimensions against.
 */

/*
 * RULE 3E FIX 2026-08-18 — Elementor element IDs are per-document, not
 * site-wide, and are not stable across pages. Elementor independently
 * assigned the same ID "c029" to a completely different element on Get
 * Help — .tnt, the entire "Tonight / 211" band wrapping
 * <a class="enr211" href="tel:211">. The unscoped rule below (originally
 * unscoped; position:absolute + pointer-events:none) hijacked that band on
 * /get-help/: pointer-events:none is inheritable and nothing re-enabled it
 * on .enr211 or its children, so the crisis-line button was unclickable at
 * EVERY viewport (the @media max-width:1180px companion further down
 * resets position but never resets pointer-events). Confirmed via live
 * server-rendered HTML: .tnt on /get-help/ carries data-id="c029" and
 * class elementor-element-c029.
 *
 * FIX: scope both c029 rules to the homepage only, matching this file's
 * own established convention for other homepage-only overrides (see
 * body.home .display-hero / body.home .hero__sub / body.home .hero__now
 * elsewhere in this file).
 */
body.home .elementor-element-c029 {
	position: absolute !important;
	right: -10% !important;
	top: -14% !important;
	width: var(--field-w, 68vw) !important;
	min-width: 620px !important;
	z-index: 1 !important;
	pointer-events: none !important;
	/* Elementor sets max-width on containers — override it */
	max-width: none !important;
}

/* Hero headline — pull back ~10% from source spec (132px -> 116px max) */
body.home .display-hero { font-size: clamp(42px, 7.6vw, 116px); }

/* .cap__head eyebrow — must be centred; Elementor default alignment overrides justify-content:center */
.cap__head { justify-content: center !important; }
.cap__head .cap__eyebrow { justify-content: center; }

/* .crisis__top — source: justify-content:space-between (left/right ends)
 * Elementor container c079 — target by both class and ID to win the specificity war */
.crisis__top,
body.home .elementor-element-c079 {
	justify-content: space-between !important;
	flex-direction: row !important;
	align-items: center !important;
	text-align: left !important;
	width: 100% !important;
}

/* .gband__title — source: max-width:min(23ch,88%), text-align:center, margin-inline:auto
 * Elementor stretches it full width. Enforce the source measure and centering. */
.gband__title {
	max-width: min(23ch, 88%) !important;
	text-align: center !important;
	margin-inline: auto !important;
}

/* .dsrt__cols — source uses CSS columns:2 for the two-column split with divider.
 * Elementor renders container c132 as a flex row, which destroys columns layout.
 * Force display:block on the wrapper so columns:2 on .dsrt__cols can work. */
/* SCOPED to body.home 2026-08-18 -- c132 also exists on For Organizations
 * as .ojs (the numbered step list in '04 Terms of Engagement'), where
 * source already wants display:block (the default for <ol>, unset in
 * org-chrome.css) so the unscoped version was a silent no-op collision
 * there, not a visible bug -- scoped anyway per the same per-document-ID
 * hazard documented above, before a future edit makes it a real one. */
body.home .elementor-element-c132 {
	display: block !important;
}
.dsrt__cols {
	columns: 2 !important;
	column-gap: clamp(26px, 2.6vw, 44px) !important;
	column-rule: 1px solid var(--hairline) !important;
}
.dsrt__cols > .elementor-element {
	display: block;
	break-inside: avoid;
	margin-top: 15px;
}
.dsrt__cols > .elementor-element:first-child {
	margin-top: 0;
}

/* .fstage__ks — labels above each panel must be space-between not centered */
.fstage__ks {
	justify-content: space-between !important;
	width: 100% !important;
}

/* .fstage layout — Elementor wrappers break position:absolute on fstage__back
 * and fstage__front. Target by element ID to restore source geometry.
 *
 * fstage__back (c142): position:absolute, top:0, left:40%, right:0
 * fstage__front (c170): position:relative, z-index:2, width:min(320px,86%)
 * fstage__figs (c180): display:grid, 3-column, sits below the stage
 */

/* SCOPED to body.home 2026-08-18 -- Elementor element IDs are per-document,
 * not site-wide. c142/c170 collided with For Organizations (c142 = .otm__wall,
 * the "joining involves / who can see what" two-column grid; c170 = .ofq__l,
 * the Q05 FAQ row's label column), forcing position:absolute on .otm__wall
 * (which source declares position:relative) and collapsing its parent .shell
 * to near-zero height -- the grid rendered visually detached from its own
 * section, overlapping the FAQ section below it. MEASURED live before this
 * fix: .otm computed height 157.6px while its own .otm__wall child measured
 * 766.5px and rendered position:absolute, top:0, left:40% -- exactly this
 * rule's Home-only geometry, hijacking a completely unrelated section on a
 * different page. Same bug class as the c029 collision fixed earlier the same
 * day (RULE 3E FIX above) -- that fix scoped c029 to body.home; this pair was
 * missed in that same pass. Confirmed c142/c170 are Home-only (.fstage__back /
 * .fstage__front, styles.css) via grep across every page's source HTML. */
/* RULE 32 -- MOBILE FIX 2026-08-21: c142/c170 were unconditional (no media
 * scoping), so their !important always beat styles.css's own mobile fold
 * for .fstage__back/.fstage__front at max-width:640px (position:relative,
 * width:100%, no !important). Same class of collision as the c029 fix in
 * RULE 3E FIX above -- an element-ID override with no upper bound outranks
 * the design's own responsive rule at every viewport, including phones.
 * CONFIRMED live: .elementor-element-c142 carries BOTH the ID class and
 * .fstage__back; computed position stayed "absolute" regardless of
 * viewport because this rule has no min-width floor. Scoping to
 * min-width:641px (matching styles.css's own max-width:640px breakpoint
 * exactly, no gap or overlap) restores the intended mobile stack: the
 * terminal (fstage__back) and chart (fstage__front) drop into normal flow
 * full-width, one above the other, instead of the terminal staying pinned
 * absolute at left:40% over a relatively-positioned front panel. */
@media (min-width: 641px) {
	body.home .elementor-element-c142 {
		position: absolute !important;
		top: 0 !important;
		left: 40% !important;
		right: 0 !important;
		max-width: none !important;
		width: auto !important;
	}

	body.home .elementor-element-c170 {
		position: relative !important;
		z-index: 2 !important;
		width: min(320px, 86%) !important;
		max-width: none !important;
	}
}

/* fstage__figs — 3-column grid; Elementor wrappers inside it must be block */
/* Source targets .fstage__figs>div — bridge to .elementor-element wrappers */
.fstage__figs > .elementor-element {
	display: block !important;
	padding: clamp(15px,1.8vw,24px) clamp(10px,1.3vw,18px) !important;
	text-align: center !important;
}
.fstage__figs > .elementor-element + .elementor-element {
	border-left: 1px solid var(--hairline) !important;
}

/* b tags — navy extrusion text-shadow */
.fstage__figs b {
	text-shadow:
		-.5px -.5px 0 rgba(255,252,247,.55),
		1px .6px 0 rgba(20,35,63,.26), 2px 1.2px 0 rgba(19,33,60,.2),
		3px 1.8px 0 rgba(18,31,56,.15), 4px 2.4px 0 rgba(17,29,53,.1),
		5px 3px 0 rgba(16,27,49,.07),
		7px 4.5px 14px rgba(20,35,63,.14) !important;
}

/* Middle figure ($9.4B) — orange with orange extrusion */
.fstage__figs > .elementor-element:nth-child(2) b {
	color: #C25E14 !important;
	text-shadow:
		-.5px -.5px 0 rgba(255,250,243,.6),
		1px .6px 0 rgba(120,52,12,.26), 2px 1.2px 0 rgba(116,50,11,.2),
		3px 1.8px 0 rgba(110,47,10,.15), 4px 2.4px 0 rgba(104,44,10,.1),
		5px 3px 0 rgba(97,41,9,.07),
		7px 4.5px 14px rgba(120,52,12,.14) !important;
}

/* sec--center (system section c194) — Elementor overrides text-align:center */
body.home .elementor-element-c194,
.sec--center {
	text-align: center !important;
}
.sec--center .shell {
	text-align: center !important;
}
.sec--center .lede {
	margin-inline: auto !important;
}

/* Target the system section children directly by element ID */
#system-h,
body.home .elementor-element-w185,
body.home .elementor-element-w186,
body.home .elementor-element-w187 {
	text-align: center !important;
	margin-inline: auto !important;
}

/* The heading title inside the widget */
#system-h .elementor-heading-title,
body.home .elementor-element-w186 .elementor-heading-title {
	text-align: center !important;
}

/* shell container c193 inside system section —
 * Elementor flex column defaults align-items:flex-start which left-aligns children.
 * Must be center so every child widget sits centered. */
body.home .elementor-element-c193 {
	align-items: center !important;
	text-align: center !important;
}

/* vch__plot — the bar chart columns need their Elementor wrappers transparent */
.vch__plot > .elementor-element,
.vch__axis > .elementor-element {
	display: contents;
}

/* vch__col must be a real grid item — restore flex layout for the bar inside */
.vch__col {
	display: flex !important;
	align-items: flex-end !important;
	height: 100% !important;
	position: relative !important;
}

/* vch__col > .elementor-element — the bar itself is one level DEEPER than the
 * .vch__plot > .elementor-element rule above reaches. That rule only makes
 * .vch__plot's DIRECT children transparent (.vch__col itself, plus .vch__stop's
 * own wrapper, which sits as a direct sibling of the .vch__col columns). The
 * .vch__bar span is a GRANDCHILD of .vch__plot — nested one level deeper inside
 * each .vch__col — so its own Elementor widget wrapper was never neutralized.
 *
 * MEASURED: that wrapper computed display:block, height:0px. .vch__bar's own
 * height:var(--h,100%) and width:100% are percentages, and a percentage height
 * only resolves against an ancestor with a DEFINITE height — an auto-height
 * block wrapper has none, so both height and width resolved to 0px and the bar
 * was a literal 0x0 box. transform:scaleY(1) on a 0x0 element is still
 * invisible, which is why forcing that transform alone (below) never fixed it.
 */
.vch__col > .elementor-element {
	display: contents;
}

/* vch__bar — ensure scaleY(0) is set so animation works; reduced-motion skips */
.vch__bar {
	transform: scaleY(1) !important;
}

/* vch__bar--empty hatch pattern stripped by Elementor's own lazy-load-background
 * inline CSS: `.e-con.e-parent:nth-of-type(n+4):not(.e-lazyloaded):not(.e-no-lazyload) *
 * { background-image: none !important; }`. .vch__col (c151, c153 — the two
 * "n/a" columns) are .e-con.e-parent and past the 4th child, so every
 * descendant's background-image is force-cleared until Elementor's lazy-load JS
 * marks them .e-lazyloaded — which never happens, since .vch__bar--empty's
 * hatch is plain CSS, not an Elementor background-image setting.
 *
 * MEASURED: box-shadow (the orange inset border) survives — only
 * background-image is targeted — so the two hatched bars rendered as bare
 * outlined boxes with no fill.
 *
 * Their selector is 5 class-level simple selectors + !important. This one uses
 * 6 real ancestor classes (no artificial duplication) to safely outrank it
 * regardless of source order. */
.dsrt .vch .vch__plot .vch__col .vch__bar.vch__bar--empty {
	background-image: repeating-linear-gradient(135deg, rgba(224, 122, 47, .34) 0 2px, transparent 2px 7px) !important;
}

/* dsrt__h spacing — too much gap below THE DATA DESERT eyebrow in live site */
.dsrt__lead > .elementor-element:nth-child(2) {
	margin-top: clamp(8px, 1vw, 14px) !important;
}

/* fstage__ks — two labels, space-between */
body.home .elementor-element-c136,
.fstage__ks {
	justify-content: space-between !important;
	flex-direction: row !important;
	width: 100% !important;
	align-items: baseline !important;
}

/* Hero lede + 211 line — slightly smaller than source */
body.home .hero__sub { font-size: clamp(16px, 1.3vw, 20px); }
body.home .hero__now { font-size: clamp(15px, 1.2vw, 19px); }

/*
 * RULE 7 — .lock dividers missing: adjacent-sibling selector broken by Elementor wrappers
 *
 * Source: .lock__c+.lock__c { border-left:1px solid var(--hairline) }
 * .lock__c is inside an .elementor-element wrapper, so the + selector
 * never fires — the wrappers are the actual siblings, not .lock__c.
 *
 * Fix: apply the left border and top hairline to the Elementor wrappers
 * inside .lock directly, matching the source exactly.
 */

.lock > .elementor-element + .elementor-element > .lock__c {
	padding-left: clamp(18px, 2vw, 30px);
	border-left: 1px solid var(--hairline);
}

.lock > .elementor-element + .elementor-element > .lock__c::before {
	left: calc(-1 * clamp(18px, 2vw, 30px) - 1px);
}

/* At ≤1180px the field stacks below (position:relative) — match source */
@media (max-width: 1180px) {
	body.home .elementor-element-c029 {
		position: relative !important;
		right: auto !important;
		top: auto !important;
		width: 100% !important;
		min-width: 0 !important;
		margin-top: 44px !important;
	}
}


/*
 * RULE 3D — the same defect on ABOUT, found by the same sweep
 *
 * About uses absolutely-positioned decorative and structural layers inside
 * design parents. Each was positioning against its Elementor wrapper instead of
 * the design parent, and several were rendering at ZERO SIZE as a result.
 *
 * MEASURED LIVE 2026-08-17, before -> after:
 *     .vfield > .vfield__fill            0x0     -> 0x210
 *     .portrait > .portrait__hint      271x0     -> 271x303     x6 instances
 *     .bio-modal__panel > .bmx__grid   296x0     -> 946x160
 *     .nhd > .nhd__grid                864x80    -> 884x287
 *     .phz__rail > .phz__fill            0x0     -> 0x3
 *     .band.g-navy > .abg              516x189   -> 516x189   (offsetParent corrected)
 *     .stage > .stage__node             14x14    -> 14x14     (offsetParent corrected, x4)
 *
 * All seven pass both gates: the child carries position:absolute, and each
 * wrapper holds exactly one child so display:contents is a clean 1:1 swap.
 *
 * .vfield WAS in this list and was REMOVED after measuring: applying it made
 * things worse, 0x0 -> 0x814. The real defect there is that .vfield ITSELF
 * renders 0 WIDE despite computed height:210px and position:relative, so
 * `#vision .vfield__fill{width:100%}` resolves against a zero-width containing
 * block. display:contents only let the fill escape to a taller positioned
 * ancestor. .vfield needs its own fix - do not re-add it here.
 *
 * About's OTHER 22 hits are left alone — their wrappers hold 2 or more children
 * (.band.g-stone > .abg/.mgrid, .hof__rail > four segments, .bio-modal__photo >
 * three, .msc__ph > two, .shell.bhd > two, and so on). They need per-case fixes.
 */

.band.g-navy > .elementor-element:not(.vfield),
.stage > .elementor-element:not(.figure-out),
.portrait > .elementor-element,
.bio-modal__panel > .elementor-element,
.nhd > .elementor-element,
.phz__rail > .elementor-element,
.vfield > .elementor-element {
	display: contents;
}

/* .vfield's OWN direct child (w055's widget wrapper) added 2026-08-18 --
   this is the safe, single-child-wrapper pattern this file already uses
   for .stage/.portrait/etc, just one level deeper: .vfield itself must
   stay a real box (excluded above, needs its own explicit height/width/
   background), but .vfield__fill's position:absolute;top:0;bottom:0
   needs its DIRECT parent (.elementor-widget-container) to not be an
   intervening positioned ancestor with 0 intrinsic height -- Elementor
   defaults that wrapper to position:relative, so .vfield__fill was
   resolving top/bottom against a 0-height box instead of .vfield's real
   192px. display:contents on just this one wrapper removes it from the
   box tree so .vfield__fill's containing block becomes .vfield itself. */

/* .vfield excluded 2026-08-18 -- this file's own comment above already
   documented .vfield must NOT get display:contents (measured 0x0 -> 0x814,
   made it worse), but the broad .band.g-navy > .elementor-element selector
   re-caught it anyway since #vision carries both .band and .g-navy and
   .vfield is its direct child. Confirmed live via computed style: .vfield
   was display:contents, getBoundingClientRect() 0 height -- nothing could
   render regardless of the background-image fix below. */


/*
 * RULE 8 — 05 Contact CTA row (.ctb__cta): missing flex_direction + inherited
 * 58ch reading-width cap
 *
 * c336 (.ctb__cta) had no flex_direction set in Elementor, so it fell back to
 * Elementor's Container factory default of COLUMN (not the design's implied
 * ROW — .ctb__cta{display:flex;flex-wrap:wrap} in styles.css never states a
 * direction explicitly, relying on the CSS default of row, but Elementor's own
 * --flex-direction custom-property mechanism has its own separate default that
 * is NOT the CSS spec default). Fixed via the native flex_direction control
 * (elementor-edit-element), not CSS — this rule is the width-only follow-up.
 *
 * MEASURED 2026-08-18 after the flex_direction fix: 3 buttons + 2x14px gaps
 * need 670.03px. .ctb__cta lives inside .ctb__copy{max-width:58ch} = 594.85px
 * — present in the ORIGINAL source design too, not introduced by the port —
 * so button 3 still wrapped, 75.18px short.
 *
 * FOUNDER DECISION 2026-08-18: let the CTA row escape the 58ch reading-width
 * cap rather than shrink the buttons. Scoped to .ctb__cta only — the heading,
 * paragraph, urgency line and .ctb__direct 2-column grid all keep the 58ch cap
 * for readability. width:max-content plus max-width:none lets the row take its
 * natural content width past .ctb__copy's right edge; .ctb overflow:hidden
 * (styles.css:1291) clips only if it overflows further right than that —
 * MEASURED clear at 1600px, verify at any new breakpoint if this reflows.
 */
@media (min-width: 1081px) {
	.ctb__cta {
		max-width: none;
		width: max-content;
	}
}

/* MOBILE FIX 2026-08-18: the rule above must NOT apply below 1081px. Below
 * that breakpoint styles.css's own @media(max-width:1080px) already sets
 * .ctb__copy{max-width:none}, removing the 58ch cap entirely — the button
 * row gets real, viewport-scaled room without any forcing needed. Applying
 * width:max-content unconditionally (the original version of this rule) kept
 * the row locked to 690.03px on EVERY viewport, including phones — measured
 * at 413px: row right edge landed at x:700px, ~287px past the screen edge.
 * .ctb{overflow:hidden} (styles.css:1291) then clipped the overflow instead
 * of letting the design's own .ctb__cta{flex-wrap:wrap} do its job: "Partner
 * with us" was fully hidden, "Donate" partially cut off. Scoping to
 * min-width:1081px keeps the desktop one-row fix and restores mobile wrap. */


/*
 * RULE 9 — signature rail (.sig) too wide at large screens — founder decision
 *
 * signature.css declares `:root{--sig-w:clamp(46px,4vw,62px)}`, one lever used
 * in four places: .sig's own width, body's left padding (room for the fixed
 * rail), .ticker's negative-margin compensation, and the header-corner overlay
 * width. Overriding the SAME custom property (not .sig{width:...} alone) keeps
 * all four in sync, matching the source file's own "one lever" design intent
 * documented at signature.css:92-99.
 *
 * FOUNDER DECISION 2026-08-18: 62px at rest reads as a wide sidebar rather than
 * a thin rail on large screens. Target ~28-32px. The 1px .sig__spine line
 * itself is untouched — this only narrows the column that holds it plus the
 * vertical labels (.sig__file, .sig__now) and the 26px .sig__seal circle.
 *
 * LIVE SITE ONLY — this file is the live-only bridge (see file banner at top),
 * not a port of the local theme's copy. Does not touch signature.css itself.
 *
 * MUST be set on :root, not .sig alone — body{padding-left:var(--sig-w)} and
 * .ticker{margin-left:calc(-1 * var(--sig-w))} both read the SAME variable
 * from their own ancestor chain, which does not include .sig. Scoping the
 * override to .sig only would narrow the rail while leaving body's left
 * padding and the ticker's compensation on the old 46-62px value — a visible
 * mismatch. :root is the one place all four consumers actually inherit from.
 */
:root {
	--sig-w: clamp(28px, 2vw, 32px);
}

/*
 * RULE 10 — 02 The System / The data desert: tighter section-to-section gaps
 * (founder decision 2026-08-18) — per-section override, same precedent as
 * styles.css's own [aria-labelledby="who-h"]{padding-block:...} block.
 *
 * NOT an --section-y / global RULE 2 change — tried that path first via
 * elementor-edit-element's native Container "padding" control and PROVED it
 * inert: that control writes --padding-top/--padding-bottom custom properties,
 * but RULE 2 (above) already unconditionally zeroes the --padding-block-start/
 * --padding-block-end variables those feed into, sitewide, on purpose, for a
 * different reason. The 120px actually rendering here comes entirely from
 * .sec{padding-block:var(--section-y)} (styles.css:390) — a class rule RULE 2
 * was never meant to touch and Elementor's own padding system can't reach.
 * MEASURED: --padding-bottom custom property correctly generated at 66px in
 * post-10.css after the elementor-edit-element write; computed padding-bottom
 * on the live element still 120px regardless — confirms the override never
 * had a path to the screen. Reverted that data-layer attempt; this CSS rule
 * is the only mechanism that actually reaches the rendered padding.
 *
 * GAP 1 — "02 The System": empty navy space below the four law items,
 * before "03 The Glass" starts. MEASURED equal to .sec's own padding-bottom
 * (120px) exactly — confirmed by gap == system.getBoundingClientRect().bottom
 * - laws.getBoundingClientRect().bottom — so the section's own bottom padding
 * is the sole contributor. Halved to 66px (45% reduction).
 *
 * GAP 2 — "too much cream space above 02 The System": MEASURED zero gap
 * between the data-desert section's box and the system section's box
 * (system.top - desert.bottom == 0px) — they are flush, no double-margin.
 * The visible cream is therefore desert's OWN padding-bottom (120px,
 * cream-coloured because it's inside desert's box, band-canvas) — NOT
 * system's padding-top (which would render navy, not cream, since it's
 * inside system's own band-deep box). Reducing system's padding-top alone
 * would not have shrunk the cream area at all; fixed the actual source
 * instead. Halved desert's padding-bottom to 66px (45% reduction).
 *
 * Both scoped by aria-labelledby, reaching only these two sections — no
 * other band's padding, and --section-y itself, are untouched.
 */
[aria-labelledby="system-h"] {
	padding-bottom: 66px;
}
[aria-labelledby="desert-h"] {
	padding-bottom: 66px;
}

/*
 * RULE 11 — closing verdict ("Every case seen...") font-size, ~12.5% down
 * (founder decision 2026-08-18)
 *
 * .vdt__l is a text-editor widget's raw <p> content — checked
 * elementor-get-schema first: text-editor has ZERO style-tab controls, no
 * typography setting exists to write to at all (not even the padding-style
 * workaround RULE 10 tried). CSS is the only mechanism; same precedent as
 * RULE 10 and styles.css's own [aria-labelledby="who-h"] override.
 *
 * SOURCE (styles.css, "second pass" declaration that wins by cascade order):
 *     .vdt__l{max-width:26ch;font-size:clamp(46px,7.4vw,104px);
 *       line-height:.88;letter-spacing:-.026em}
 * MEASURED live at 1200px before: 88.8px (7.4vw of 1200, confirms clamp was
 * mid-range, not capped at either end).
 *
 * All three clamp values scaled by the same 0.875 factor (12.5% reduction,
 * middle of the requested 10-15% range) so the responsive curve shape is
 * preserved, not just the desktop value:
 *     46px  -> 40px      104px -> 91px      7.4vw -> 6.5vw
 * line-height/letter-spacing/max-width untouched — font-size only, as
 * instructed. No selector scoping needed beyond .vdt__l itself; it's a
 * unique class used only in this one closing section.
 */
.vdt__l {
	font-size: clamp(40px, 6.5vw, 91px);
}

/*
 * RULE 12 — closing verdict (.vdt) section padding-block, ~45% down
 * (founder request 2026-08-18, second session)
 *
 * Tried the native Container "padding" control FIRST, per instruction.
 * PROVED IT INERT, same mechanism as RULE 10: set padding-top/bottom:20px
 * via elementor-edit-element on c361, purged _elementor_css + post-10.css +
 * element-render cache + LiteSpeed, re-measured live at 1200px — computed
 * padding-top/bottom stayed 156px (unchanged from baseline). Confirmed the
 * write itself DID succeed (--padding-top / --padding-bottom custom props
 * read back as 20px on the live element) — it's just that .vdt's own
 * padding-block declaration below doesn't consume those variables at all,
 * so the native control has nothing to feed into. Reverted the per-element
 * setting on c361 cleanly (back to empty/unset) before writing this rule.
 *
 * SOURCE (styles.css, "second pass" declaration that wins by cascade order):
 *     .vdt { padding-block:clamp(104px,13vw,210px) }
 * MEASURED live at 1200px before: 156px each side (13vw of 1200, confirms
 * clamp was mid-range, not capped at either end).
 *
 * All three clamp values scaled by the same 0.55 factor (45% reduction,
 * middle of the requested 40-50% range) so the responsive curve shape is
 * preserved, not just the desktop value:
 *     104px -> 57px      210px -> 116px      13vw -> 7.15vw
 * font-size / color / everything else on .vdt and .vdt__l is untouched, as
 * instructed.
 *
 * SELECTOR: .vdt.band-navy — two real ancestor classes already present on
 * the element (css_classes: "vdt band-navy rv"), specificity (0,2,0),
 * which outranks styles.css's own plain .vdt at (0,1,0) regardless of file
 * load order. No artificial class duplication needed.
 */
.vdt.band-navy {
	padding-block: clamp(57px, 7.15vw, 116px);
}

/*
 * RULE 13 — Contact section terminal card (.term) width + height compaction
 * (founder request 2026-08-18, third task — vs. Figma)
 *
 * PART A — WIDTH. Neither .term nor .term__frame carries a max-width
 * anywhere in styles.css — the card is a plain block child of .ctb__stage
 * (one column of .ctb__in's 2-col grid) and simply fills 100% of that
 * column's width. MEASURED live before: .term 528.66px == .ctb__stage
 * 528.66px, exactly full-column, confirming "stretching wide." The card's
 * own animation is literally named term-float (styles.css) — a floating
 * plate, not a full-width stretched panel — consistent with the Figma's
 * compact card. Scoped to desktop (min-width:1081px), matching .ctb__in's
 * own breakpoint where it collapses to a single mobile column
 * (@media max-width:1080px) — same mobile-safety scoping precedent as the
 * Contact CTA row fix earlier in this file; a 52%-width floating card would
 * be cramped on the single-column mobile layout.
 *
 * PART B — HEIGHT. .term__screen has NO height/min-height rule anywhere in
 * styles.css — it is purely intrinsic: padding (22px top / 20px bottom) +
 * .term__body's 7 .tml line-rows, each sized by .tml's own
 * line-height:2.02 / min-height:2.02em. MEASURED live before: term__screen
 * height ≈217px (padding 42px + body ≈174px for 7 lines). Checked for a
 * responsive .tml override first (per RULE 10/11 precedent) — only
 * font-size (@media max-width:560px) and opacity (@media
 * prefers-reduced-motion:reduce) are overridden elsewhere; line-height and
 * min-height are not touched by any other rule, so a global change here is
 * safe. Reduced padding-block (22\/20 -> 16\/14, longhand only — horizontal
 * padding untouched) and .tml's line-height\/min-height together (2.02 ->
 * 1.56, ~23% tighter) to land term__screen at the requested ~160-170px.
 * Font-size, the 7-line count, actual terminal text/content, and the
 * typing-animation JS/opacity logic are all untouched — vertical spacing
 * only, as instructed.
 */
@media (min-width: 1081px) {
	.term {
		max-width: 52%;
		margin-inline: auto;
	}
}
.term__screen {
	padding-top: 16px;
	padding-bottom: 14px;
}
.tml {
	line-height: 1.56;
	min-height: 1.56em;
}

/*
 * RULE 14 — Story page: six multi-item components broken by the same
 * wrapper-intercepts-sibling-relationship pattern as RULE 3/3A-3E, found on
 * page 15 (founder request 2026-08-18, "Story Page Fix")
 *
 * Two distinct sub-cases, both needing the same display:contents fix:
 *
 * A) .idc__row (identification strip) already had 3 SEPARATE widgets in
 *    Elementor — one per .idc__c paragraph — but each sits inside its own
 *    .elementor-widget-container wrapper, so .idc__c + .idc__c (adjacent-
 *    sibling, draws the seam divider between cells) never matched: the
 *    wrappers are the real siblings, not .idc__c itself. Same root cause as
 *    RULE 7's .lock__c fix elsewhere in this file.
 *
 * B) .inv, .rte__l, .qpr, .ech, .swp were each ONE merged text-editor widget
 *    holding 2-4 <span> items as raw HTML, not separate widgets at all.
 *    MEASURED live before fixing content: .rte__l's 4 stops (Colorado
 *    Springs / Denver / Salt Lake City / Las Vegas) all rendered inside a
 *    single grid cell of a 4-column grid — visually overlapping and
 *    unreadable, the most severe instance. .qpr's two sentences ran
 *    together with zero gap (flex-column gap had only one child to act on).
 *    .inv/.ech/.swp's flex gaps collapsed to the browser's ~4-5px default
 *    inline-whitespace distance instead of their designed clamp() gap.
 *    Split into one native text-editor widget per item first (content fix,
 *    matching source markup and Founder Ruling 6 — still native widgets,
 *    just one per item instead of one merged) — THEN this same wrapper
 *    problem from case A applies to the new structure too, since each new
 *    widget is its own wrapped child.
 *
 * Both cases need exactly the same fix: each wrapper holds exactly ONE
 * child (the safety gate RULE 3C/3D established before using
 * display:contents), so promoting the wrapper out of the tree makes the
 * design elements true direct children again — restoring .idc__c's
 * adjacent-sibling divider, .rte__l's 4-column grid placement, .qpr's flex
 * column + nth-child(2) stagger delay, and .inv/.ech/.swp's flex gap and
 * nth-child stagger delays, all of which depend on true DOM sibling
 * adjacency, not just presence in the subtree.
 */
.idc__row > .elementor-element,
.inv > .elementor-element,
.rte__l > .elementor-element,
.qpr > .elementor-element,
.ech > .elementor-element,
.swp > .elementor-element {
	display: contents;
}

/*
 * RULE 14 FOLLOW-UP — display:contents fixes GRID\/FLEX ITEM PARTICIPATION
 * (a render-tree concern) but does NOT change the DOM tree, which is what
 * adjacent-sibling (+) and :nth-child() selectors actually match against.
 * MEASURED after the display:contents rule above: .idc__c border-left
 * still "0px none" on every cell (divider never drew) and every stagger
 * transition-delay this page relies on (.rte__s, .qpr span, .inv__i,
 * .ech__i, .swp__i) still computed "0s" — confirmed live before writing
 * this, not assumed. DOM structure verified live: each item is exactly one
 * level under its wrapper (.rte__l > .elementor-element-XXX > .rte__s,
 * no extra nesting), so a single child-combinator step reaches it — same
 * depth RULE 7's .lock__c fix already established for this exact class of
 * problem. Re-targets every source rule that depended on true DOM sibling
 * adjacency, at the wrapper's position instead of the design element's.
 */
.idc__row > .elementor-element + .elementor-element > .idc__c {
	border-left: 1px solid var(--hairline);
}
.rte.is-in .rte__l > .elementor-element:nth-child(2) > .rte__s {
	transition-delay: 0.1s;
}
.rte.is-in .rte__l > .elementor-element:nth-child(3) > .rte__s {
	transition-delay: 0.2s;
}
.rte.is-in .rte__l > .elementor-element:nth-child(4) > .rte__s {
	transition-delay: 0.3s;
}
.qpr.is-in > .elementor-element:nth-child(2) > span {
	transition-delay: 0.14s;
}
.inv.is-in > .elementor-element:nth-child(2) > .inv__i > span {
	transition-delay: 0.18s;
}
.inv.is-in > .elementor-element:nth-child(3) > .inv__i > span {
	transition-delay: 0.36s;
}
.ech.is-in > .elementor-element:nth-child(2) > .ech__i {
	transition-delay: 0.14s;
}
.ech.is-in > .elementor-element:nth-child(3) > .ech__i {
	transition-delay: 0.28s;
}
.swp.is-in > .elementor-element:nth-child(2) > .swp__i {
	animation-delay: 0.55s;
}
.swp.is-in > .elementor-element:nth-child(3) > .swp__i {
	animation-delay: 0.8s;
}
.swp.is-in > .elementor-element:nth-child(2) > .swp__i > span {
	transition-delay: 1.2s;
}
.swp.is-in > .elementor-element:nth-child(3) > .swp__i > span {
	transition-delay: 1.45s;
}

/*
 * RULE 15 — Story page "02 how this started" section: ghost year + record
 * grid both broken by the SAME Elementor-container-default-position bug
 * (founder request 2026-08-18, "Story Page Section Fix")
 *
 * .sta__sheet (record grid texture) and .sta__yr ("2021" ghost number) are
 * two sibling <span>s in source (story.html), both direct children of
 * <section class="sec sta">, both position:absolute against .sta
 * (.sta{position:relative;overflow:hidden}). Live, Elementor merged both
 * into ONE text-editor widget (id w019) — same pattern already fixed for
 * .rte__l etc. above — but the defect here is different: MEASURED live,
 * w019's own wrapper div computes position:relative (an Elementor default,
 * not anything in our CSS) with height:0 (collapsed, since both its
 * children are position:absolute and removed from flow). That makes the
 * WRAPPER — not .sta — the containing block .sta__yr's top/left resolve
 * against, and the wrapper's own collapsed position (wherever it fell in
 * normal flow, which landed right at the heading) is what the ghost year
 * was really positioning from. Rendered top was 1369px against .sta's own
 * top of 1151px and an intended offset of ~77-110px — i.e. ~140-220px
 * lower than the source's "large, centered behind the headline" placement,
 * and .sta__sheet's background-image was computing correctly but on a
 * 0-height box, so the grid texture was invisible despite the CSS matching.
 *
 * NOT the same fix as RULE 14 above: .sta ALSO has .shell as a direct
 * sibling child (c039), and .shell carries the base elementor-element
 * class too — checked live before writing this, per RULE 3D/3E's own
 * false-positive caution — so a bare ".sta > .elementor-element" selector
 * would ALSO collapse .shell's own box (breaking its max-width\/padding).
 * Targets the specific widget id instead, exactly RULE 3E's precedent for
 * an unscoped selector risk, not the generic RULE 14 pattern.
 *
 * Scoped to this one section only, per instruction — the other three .sta
 * sections on this page ("the calls," "Vallejo," "the founding") likely
 * carry the same defect on their own sheet\/yr widgets, each with a
 * different widget id, but were not in scope for this fix and were not
 * touched.
 */
.sta > .elementor-element-w019 {
	display: contents;
}

/*
 * RULE 15 FOLLOW-UP — identical bug, sitewide on the Story page (founder
 * request 2026-08-18, "Story Page Section Fix" claim 4 + "Fix Remaining
 * Sections")
 *
 * Checked all 8 remaining .stg\/.sta__sheet\/.sta__yr widgets on page 15
 * (full inventory pulled from _elementor_data) before touching anything.
 * MEASURED every one live: textureHeight 0px on all 8, exact same cause as
 * w019 — the wrapper computes position:relative with height:0. This is
 * genuinely sitewide on this page, not isolated to the one section fixed
 * above:
 *   w006  #story-open (hero)         .stg only
 *   w046  "the calls" (.sta)          .sta__sheet only (no year in source here)
 *   w073  "Vallejo" (.sta)            .sta__sheet + .sta__yr (2023)
 *   w103  "the founding" (.sta)       .sta__sheet + .sta__yr (2024)
 *   w041  "account 01" (.ham)         .stg only
 *   w068  "account 02" (.ham--big)    .stg only
 *   w098  "account 03" (.ham)         .stg only
 *   w120  "account 04" (.ham--close)  .stg only
 *
 * Same false-positive risk checked and confirmed present on every one of
 * these 8 sections too: each has exactly two direct children, the texture
 * widget and a sibling .shell container, and .shell also carries the base
 * elementor-element class — so every rule below targets its specific
 * widget id, never a bare "> .elementor-element".
 */
#story-open > .elementor-element-w006,
.sta > .elementor-element-w046,
.sta > .elementor-element-w073,
.sta > .elementor-element-w103,
.ham > .elementor-element-w041,
.ham > .elementor-element-w068,
.ham > .elementor-element-w098,
.ham > .elementor-element-w120 {
	display: contents;
}

/*
 * RULE 16 — Story page route rail (.rte): dots floating off the line +
 * all four dots orange instead of first-three-navy/last-orange (founder
 * request 2026-08-18, "Story Page: Route Timeline Fix")
 *
 * PART A — GAP. .rte__rail (+ its child .rte__fill) and .rte__dash are
 * both merged into widget w033, a direct sibling of .rte__l (c035) inside
 * .rte (c036). Same bug as RULE 15\/15-followup: w033's own wrapper div
 * computes position:relative (Elementor default) and collapses to the
 * flow position right after .rte's 26px padding-top (measured live:
 * wrapper\/.rte__l both landed at the same top, 2075px, because the
 * zero-height collapsed w033 takes no flow space of its own). .rte__rail's
 * top:9px then resolves against THAT wrapper (2075+9=2084 measured) instead
 * of .rte itself (.rte top 2049+9=2058 intended) — a 26px gap, matching
 * .rte's own padding-top exactly. .rte__l's positioning was never wrong;
 * only the rail\/dash's containing block was.
 *
 * PART B — COLOR. Source: .rte.is-in .rte__s:last-child::before{background:
 * orange}. Splitting .rte__l into 4 separate widgets (done fixing the
 * overlap bug earlier) means each .rte__s is now the ONLY child of its own
 * wrapper — so :last-child is trivially true for all four, and the source
 * rule (still live, unmodified, in story-chrome.css) paints every dot
 * orange. Same root cause as the :nth-child() stagger-delay bug already
 * fixed above; this one was missed at the time because it's a color
 * override, not a timing one. Fixed here by re-deriving true "last of the
 * four" from the WRAPPER's position (which is a real, correct DOM sibling
 * set) instead of the design element's, at higher specificity so it
 * overrides the still-present original rule for the first three too —
 * without this, items 1-3 would keep getting orange from the unmodified
 * source rule even after the true-last item is corrected.
 */
.rte > .elementor-element-w033 {
	display: contents;
}
.rte.is-in .rte__l > .elementor-element:not(:last-child) > .rte__s::before {
	background: var(--navy);
	border-color: var(--navy);
}
.rte.is-in .rte__l > .elementor-element:last-child > .rte__s::before {
	background: var(--orange);
	border-color: var(--orange);
}

/*
 * RULE 17 — Story page: record-grid textures (.stg, .sta__sheet) stripped
 * by Elementor's own lazy-load-background-images inline CSS, same bug class
 * already found+fixed on the homepage (.vch__bar--empty) and For
 * Organizations (.ofw\/.oof). MEASURED live: Elementor's
 * ".e-con.e-parent:nth-of-type(n+4):not(.e-lazyloaded):not(.e-no-lazyload) *
 * {background-image:none!important}" strips 4 of 5 .stg instances (all four
 * .ham bands — only #story-open's, an earlier sibling, survives) and 3 of 4
 * .sta__sheet instances (only "how this started", the first .sta section,
 * survives) — none of these are Elementor background-image widget settings,
 * so they never receive .e-lazyloaded and the strip is permanent, not a
 * timing issue.
 *
 * Selectors use 6 real ancestor\/self attributes each (matching the
 * .vch__bar--empty precedent's "outrank Elementor's 5-class selector"
 * approach) rather than inventing classes: .sec.ham[data-screen-label] (3)
 * + .stg[data-live][aria-hidden] (3) for the hammer bands; .sec.sta
 * [data-screen-label][data-prog] (4) + .sta__sheet[aria-hidden] (2) for the
 * account sections. #story-open's own .stg is already correct (an earlier
 * sibling, past Elementor's rule doesn't reach it) and unaffected by this
 * rule since #story-open carries no .ham\/.sta class.
 *
 * mask-image values use each element's OWN final (cascade-winning) source
 * declaration — .sta__sheet has two mask-image declarations in
 * story-chrome.css (one in its original block, one in the later "CENTRED"
 * section that supersedes it by load order); this rule reproduces the
 * winning one (64% 58% at 50% 42%), not the superseded one.
 */
.sec.ham[data-screen-label] .stg[data-live][aria-hidden] {
	background-image: linear-gradient(to right, rgba(221, 231, 228, .09) 1px, transparent 1px), linear-gradient(to bottom, rgba(221, 231, 228, .09) 1px, transparent 1px) !important;
}
.sec.sta[data-screen-label][data-prog] .sta__sheet[aria-hidden] {
	background-image: linear-gradient(to right, rgba(20, 35, 63, .06) 1px, transparent 1px), linear-gradient(to bottom, rgba(20, 35, 63, .06) 1px, transparent 1px) !important;
}

/*
 * RULE 18 — Story page: the SAME Elementor lazy-load-background-images bug
 * as RULE 17, found on seven more decorative elements while verifying a
 * founder-reported "animated lines" claim in the "the calls" section
 * (2026-08-18). MEASURED live: the real animated feature there is
 * .dead__spine — ONE vertical dashed line down the centre that marches
 * downward (background-position keyframe), not "horizontal lines with
 * inward-pointing arrows" — the screenshot's red arrows read as Figma
 * comment\/review annotations pointing at the gap sizing, not real page
 * elements; nothing resembling them exists in story.html or story-chrome.css.
 * The real defect: .dead__spine's transform (scaleY reveal) was fine —
 * confirmed by disabling its transition and reading the resolved value
 * (matrix(1,0,0,1,0,0), i.e. scaleY(1)) — but its dashed background-image
 * computed "none" live. Same root cause as RULE 17: none of these are
 * Elementor background-image widget settings, so none ever receive
 * .e-lazyloaded and Elementor's own
 * ".e-con.e-parent:nth-of-type(n+4):not(.e-lazyloaded):not(.e-no-lazyload) *
 * {background-image:none!important}" strips them permanently. A full sweep
 * of every background-image-bearing decorative element on the page (not
 * solid background-color ones — confirmed those are unaffected, e.g.
 * .qpr span::after, .dead__stop, .rec__b all use a plain color and were
 * never touched) found six more casualties beyond .dead__spine: .bld__spine,
 * .rte__dash, .rte__fill, .nbc .cw>span, .thes .cw>span, and
 * .ham--close .ham__lit specifically (NOT the bare .ham__lit used in the
 * first three hammer bands, which correctly has no background-image at all
 * — those three use a text-shadow glow instead, per story-chrome.css; only
 * the closing band's marker-highlight variant uses background-image and was
 * actually affected).
 *
 * Selectors use 6-9 real ancestor\/self attributes each, same technique as
 * RULE 17, reproducing each element's exact source value.
 */
.sec.sta[data-prog] .dead[data-rv] .dead__spine[data-live][aria-hidden] {
	background-image: repeating-linear-gradient(to bottom, rgba(224, 122, 47, .75) 0 6px, rgba(224, 122, 47, 0) 6px 14px) !important;
}
.sec.sta[data-prog] .bld[data-rv] .bld__spine[aria-hidden] {
	background-image: linear-gradient(to bottom, rgba(46, 125, 91, .28), var(--green)) !important;
}
.sec.sta[data-prog] .rte[data-rv] .rte__dash[data-live][aria-hidden] {
	background-image: repeating-linear-gradient(90deg, rgba(20, 35, 63, .34) 0 5px, rgba(20, 35, 63, 0) 5px 12px) !important;
}
.sec.sta[data-prog] .rte[data-rv] .rte__rail[aria-hidden] .rte__fill {
	background-image: linear-gradient(90deg, #14233F, #14233F 72%, #E07A2F) !important;
}
.sec.sta[data-prog] .nbc[data-live] .cw[data-rv] > span {
	background-image: linear-gradient(rgba(224, 122, 47, .26), rgba(224, 122, 47, .26)) !important;
}
.sec.sta[data-prog] .thes .cw[data-rv] > span {
	background-image: linear-gradient(rgba(224, 122, 47, .24), rgba(224, 122, 47, .24)) !important;
}
.sec.ham.ham--close[data-screen-label] .ham__l[data-live] .cw[data-rv] .ham__lit {
	background-image: linear-gradient(rgba(224, 122, 47, .26), rgba(224, 122, 47, .26)) !important;
}




/* ===========================================================================
   RULE 19 — FOR ORGANIZATIONS: Elementor lazy-load-background-images bug,
   same recurring pattern already fixed on Home/For-Orgs(bar chart)/Story.
   Elementor's own inline CSS: '.e-con.e-parent:nth-of-type(n+4):not
   (.e-lazyloaded):not(.e-no-lazyload) * { background-image:none!important }'
   strips every descendant background-image inside any e-parent container past
   the 4th sibling, whether or not it was ever meant to lazy-load. On this
   page it hit THREE decorative background-image layers that are plain CSS
   gradients, not Elementor background-image widget settings, so they never
   earn the .e-lazyloaded class that would exempt them:
     .ogt__bg  — the hairline grid behind '03 What your organization gets'
     .oof      — the whole green-glow navy offer plate's own gradient+shadow
                 background ('Free for the entire pilot')
     .oof__grid — the hairline grid inside that same offer plate
   MEASURED 2026-08-18 live: all three computed backgroundImage:'none',
   confirmed via getComputedStyle. Each override below chains enough real
   ancestor classes (5-7, matching this file's own established pattern) to
   outrank Elementor's 5-class selector regardless of cascade order. */
.ogt.e-con.e-parent.e-flex.e-con-full .ogt__bg{background-image:linear-gradient(to right,rgba(20,35,63,.05) 1px,transparent 1px),linear-gradient(to bottom,rgba(20,35,63,.05) 1px,transparent 1px)!important}
.ogt .oof.e-con.e-parent.e-flex.e-con-full{background:radial-gradient(120% 130% at 8% 0%,rgba(63,191,132,.2),transparent 56%),linear-gradient(168deg,#132744 0%,var(--navy-deep) 62%)!important}
.ogt .oof.e-con.e-parent.e-flex.e-con-full .oof__grid{background-image:linear-gradient(to right,rgba(221,231,228,.07) 1px,transparent 1px),linear-gradient(to bottom,rgba(221,231,228,.07) 1px,transparent 1px)!important}

/* ===========================================================================
   RULE 20 — GET HELP: Elementor lazy-load-background-images bug, same
   recurring pattern now confirmed on 5 of 6 pages (Home, For-Orgs x2, Story,
   now Get Help). Hit two decorative hairline-grid layers:
     .gate__grid — the grid behind "02 The Gate" (what you do not need / your file)
     .intk__grid — the diagonal-hatch grid behind "03 The Intake"
   MEASURED 2026-08-18 live: both computed backgroundImage:'none'. .tnt__grid
   (the Tonight/211 band) was NOT affected — it sits within the first 3
   e-parent siblings, below Elementor's nth-of-type(n+4) threshold. */
.gate.e-con.e-parent.e-flex.e-con-full .gate__grid{background-image:linear-gradient(to right,rgba(20,35,63,.055) 1px,transparent 1px),linear-gradient(to bottom,rgba(20,35,63,.055) 1px,transparent 1px)!important}
.intk.e-con.e-parent.e-flex.e-con-full .intk__grid{background-image:repeating-linear-gradient(-45deg,rgba(20,35,63,.045) 0 2px,transparent 2px 16px)!important}

/* ===========================================================================
   RULE 21 — HOME: Elementor lazy-load-background-images bug, whole-page
   sweep. Checked every element on Home whose class name suggests a
   decorative background (__grid/__bg/__plot/__sheen — 9 candidates); 7 were
   false positives (pure layout grids with no background-image declared in
   source: .hero__grid, .doors__grid, .crisis__grid, .gpv__grid, .ev__grid,
   plus .cap__grid which is display:none by design, plus .vch__plot which is
   the grid container — .vch__bar is the element with a background and it
   was already fixed earlier this session). Two were real:
     .pull__grid — drifting hairline grid behind "The auditor's finding" pull-quote
     .clbg__grid — the closer band's scan-line grid, "04 The Pilot" section
   MEASURED 2026-08-18 live: both computed backgroundImage:'none'. */
.elementor-element.pull__grid.e-con.e-parent.e-flex.e-con-full{background:linear-gradient(rgba(221,231,228,.2) 1px,transparent 1px) 0 0/100% 34px,linear-gradient(90deg,rgba(221,231,228,.2) 1px,transparent 1px) 0 0/34px 100%!important}
.closer.e-con.e-parent.e-flex.e-con-full .clbg__grid{background-image:repeating-linear-gradient(90deg,rgba(20,35,63,.13) 0 1px,transparent 1px 34px),repeating-linear-gradient(0deg,rgba(20,35,63,.13) 0 1px,transparent 1px 34px)!important}

/* ===========================================================================
   RULE 22 — FOR ORGANIZATIONS: "What you are probably worried about" (.ofr
   fear rows) — broken two-column layout on all four rows, founder report
   2026-08-18.

   .ofr{display:grid;grid-template-columns:minmax(220px,32%) 1fr} expects
   exactly TWO grid items per row: a narrow left column (the docket number +
   NO/stamp + "Our answer" label) and a wide right column (the question +
   answer). Source markup (for-organizations.html) puts a decorative
   <span class="ofr__fill"> — source CSS: position:absolute, the scroll-
   progress top rule — as the FIRST child of each .ofr, ahead of the two
   real content divs.

   MEASURED LIVE (post 13, .ofr c034 and its three siblings c043/c052/c061):
   Elementor wraps that decorative span in its own widget wrapper div (w026
   and counterparts), and that WRAPPER — not the absolutely-positioned span
   inside it — is what actually sits in the grid. The wrapper itself stays
   position:relative, so it consumes a real grid cell instead of the span's
   own position:absolute removing it from flow. Result: 3 grid items in a
   2-column grid — fill-wrapper (col 1), stamp column (col 2, wrong slot),
   question/answer column (wraps to a NEW row, col 1 again) — exactly the
   "NO floating independently, question column disconnected" symptom
   reported. Same root cause as RULE 3/3B/3C above (Elementor wrapper
   intercepting a child's own position:absolute), same fix: display:contents
   on the wrapper, scoped to :first-child only — the OTHER two children each
   hold 3 and 2 real content widgets (RULE 3C's own documented reason not to
   blanket display:contents every .ofr child).

   BEFORE (measured, 1350px-wide .shell): grid-template-columns computed
   445.4px / 904.97px (correct, matches minmax(220px,32%) 1fr at this
   width) but 3 children — col1=fill-wrapper(w026) 445px @ left 112.5,
   col2=stamp(c030) 904.97px @ left 599.5 (WRONG slot, wide column),
   col3=question(c033) wraps to row 2, 445px @ left 112.5 (WRONG slot,
   narrow column). Confirmed identical structure on all 4 rows
   (w026/w035/w044/w053 each hold only .ofr__fill, each is childCount-3
   .ofr's first child). */
.ofr > .elementor-element:first-child{display:contents}

/* ===========================================================================
   RULE 23 — ABOUT: hero section-nav tab bar (.hro__idx) rendering as
   unstyled stacked plain text, founder report 2026-08-18.

   Source markup is <nav class="hro__idx"><ul><li><a>...</a></li>...</ul></nav>
   and about-chrome.css targets the row layout with ".hro__idx ul{display:
   flex;list-style:none;margin:0 auto;padding:0;max-width:var(--shell)}" — a
   TAG selector requiring a literal <ul> element.

   Elementor never emits a <ul> for a container: each of the six links is its
   own raw-HTML text-editor widget (<li><a>...) wrapped in a plain <div>
   (elementor-element c020, no class of its own), and THAT div is the actual
   immediate parent of the six <li> elements — there is no <ul> anywhere in
   the live DOM for this component. ".hro__idx ul{...}" therefore matches
   nothing, so the six <li> elements never receive flex row layout and each
   falls back to the browser default block/list-item stacking — confirmed
   live: each <li> computed 1553px wide (full container width) and stacked
   vertically, ~27px apart. ".hro__idx li{flex:1 1 0;...}" and ".hro__idx
   a{...}" (both real descendant selectors, no tag requirement) DO still
   match and were already applying — only the row-layout declaration was
   missing, which is why the links still had their border/padding/hover
   rules but no row structure: flex properties on children are inert without
   a flex parent.

   Fix: apply the same properties ".hro__idx ul" was supposed to supply,
   directly to the real wrapper div, scoped as a direct child of .hro__idx so
   it cannot reach anything else on the page. */
.hro__idx > .elementor-element{display:flex;flex-direction:row;flex-wrap:nowrap;list-style:none;margin:0 auto;padding:0;max-width:var(--shell)}
/* Each of the six <li> is its own text-editor widget; the widget's OWN
 * wrapper div is the actual flex item Elementor lays out, not the <li>
 * inside it -- same wrapper-intercepts-flex-item-property pattern as RULE
 * 3/3C above. ".hro__idx li{flex:1 1 0;border-left:...}" was matching the
 * <li> (a real descendant selector, no tag requirement) but having no
 * layout effect since the <li> was never itself a flex item. Each wrapper
 * holds exactly one child (the <li>), so display:contents is safe per this
 * file's own established gate. */
.hro__idx > .elementor-element > .elementor-element{display:contents}

/* ===========================================================================
   RULE 24 — FOR ORGANIZATIONS "What you are probably worried about" (.ofw):
   three defects, founder report 2026-08-18.

   DEFECT 1 — background grid/checker texture completely absent.
   .ofw__grid (and .ofw__ghost, the giant watermark word "Straight") are both
   <span>s inside ONE text-editor widget (w022), the first child of .ofw.
   Source CSS: .ofw__grid{position:absolute;inset:0;...} — an absolutely
   positioned element sizes against its nearest POSITIONED ancestor. .ofw
   itself is position:relative (the intended containing block, real height
   ~1490px). But Elementor's own widget-wrapper default is ALSO position:
   relative, and that wrapper collapses to 0 height once its only children
   are taken out of flow by their own position:absolute — so it becomes
   .ofw__grid's containing block INSTEAD of .ofw, and inset:0 resolves
   against a 0-height box. MEASURED LIVE: wrapper (w022) height 0px,
   .ofw__grid computed height 0px despite backgroundImage being present and
   opacity:1 (this is NOT the Elementor lazy-load bug fixed elsewhere this
   session — the image was never stripped, the box it paints into was zero-
   size). Same root cause as RULE 3/3B/3E — wrapper intercepting a child's
   own position:absolute containing-block. Fix: display:contents on the
   wrapper (holds exactly two children, both position:absolute, both exempt
   from grid/flex placement — same safety gate as every other display:
   contents rule in this file).

   DEFECT 2 — orange .ofw__bar "not animating": investigated, NOT a bug.
   MEASURED LIVE across two scroll positions: html.ofx and html.ofx-live
   both present, org-fx.js enqueued and running, [data-ofx-fears] present on
   .ofw, --fp read 0.0000 (unscrolled) → 0.3529 → 0.2631 as the page was
   scrolled, and .ofw__bar's computed transform tracked the clamp(.3,
   fp*2.6,1) formula exactly at each reading (matrix scaleX 0.3 → 0.9175).
   The mechanism works. No CSS or JS change made for this item.

   DEFECT 3 — green .ofr__fill "not animating": REAL bug, different cause
   than defect 2. Source markup sets a per-row stagger threshold inline:
   <article class="ofr" style="--t:.14"> (and .26/.38/.5 for rows 2-4),
   consumed by .ofr__fill{width:clamp(0%,calc((var(--fp) - var(--t)) *
   420%),100%)}. MEASURED LIVE: the rendered .ofr container carries NO
   style attribute at all — confirmed via raw HTML fetch, not just DOM
   inspection (<div class="elementor-element elementor-element-c034 ofr
   ..." data-id="c034" ... > with no style=). --t was therefore undefined at
   every row, making the calc() invalid at computed-value time and the width
   permanently 0px regardless of --fp (confirmed: fp 0.26, all four
   .ofr__fill widths 0px). Elementor's container settings have no field that
   maps to an arbitrary inline custom-property the way the source's plain
   HTML style attribute does, so this restores the same four values by
   position instead. */
.ofw > .elementor-element:first-child{display:contents}
.ofw__rows > .ofr:nth-of-type(1){--t:.14}
.ofw__rows > .ofr:nth-of-type(2){--t:.26}
.ofw__rows > .ofr:nth-of-type(3){--t:.38}
.ofw__rows > .ofr:nth-of-type(4){--t:.5}

/* ===========================================================================
   RULE 25 — ABOUT: Our Board grid, founder request 2026-08-18.
   Deleted the empty 6th ("FULL NAME") board slot, leaving 5 real members --
   3 in row 1, 2 in row 2. Source's own .board{display:grid;grid-template-
   columns:repeat(3,minmax(0,1fr))} has no way to center a ragged last row
   (CSS Grid never auto-centers a short final row; the 2 leftover cells stay
   left-flush in columns 1-2, column 3 empty). Switched to flexbox, which
   centers a wrapped short row for free via justify-content. Same 3-per-row
   sizing and the same 2px hairline gap the grid version used, just laid out
   with flex instead of grid so the leftover pair centers automatically. */
.board.e-con.e-parent{display:flex!important;flex-direction:row!important;flex-wrap:wrap!important;justify-content:center!important;gap:2px!important}
.board.e-con.e-parent>.member{flex:0 0 calc(33.333% - 1.334px)!important;max-width:calc(33.333% - 1.334px)!important}

/* RULE 26 -- #words 'In Our Words' record-grid texture (.tgrid) missing,
   founder-reported 2026-08-18. Two stacked bugs, same pattern as RULE 25's
   .vfield fix on Our Vision:

   1. Elementor's lazy-load-background-images CSS (.e-con.e-parent:
      nth-of-type(n+4):not(.e-lazyloaded):not(.e-no-lazyload) *
      {background-image:none!important}) was stripping .tgrid's two
      linear-gradient grid-line layers. Confirmed live via computed style:
      backgroundImage was 'none'.

   2. .tgrid{position:absolute;inset:0} needs a definite-size positioned
      ancestor to stretch against. Its immediate parent is w059's Elementor
      widget-container wrapper (position:relative by Elementor default, 0
      intrinsic height since its only content is this one absolutely-
      positioned span) -- so .tgrid's containing block was that 0-height
      wrapper, not #words itself. Confirmed live: rect height 0px despite
      inset:0. Same root cause as .vfield__fill on Vision.

   Fix: restore the background-image with !important (#words is an ID
   selector, already outranks Elementor's class-only selector once matched
   with !important), and add .tgrid's direct wrapper to the safe single-
   child display:contents list so inset:0 resolves against #words. */
#words .tgrid{background-image:
    linear-gradient(to right,rgba(221,231,228,.085) 1px,transparent 1px),
    linear-gradient(to bottom,rgba(221,231,228,.085) 1px,transparent 1px) !important}
#words > .elementor-element:has(.tgrid) {
	display: contents;
}


/* RULE 27 -- #how-we-work .stage .figure-out (ghost numerals 01-04)
   missing/misplaced, founder-reported 2026-08-18. .figure-out (e.g. c106)
   is a direct child of .stage and IS itself .elementor-element-classed, so
   it was ALSO caught by the .stage > .elementor-element safe-list rule
   above -- but unlike .stage's other single-child wrappers (.stage__node
   etc.), .figure-out is not a middleman: it IS the element that needs
   position:absolute;right:0 (about-chrome.css). display:contents removed
   its own box entirely. Confirmed live: position:absolute + display:
   contents + rect 0x0 -- the '01' text was rendering in normal block flow
   instead (stacked above ARRIVAL), because its wrapper had no box to
   position against. Excluded .figure-out from the rule, same technique
   as RULE 25's .vfield exclusion. */


/* RULE 28 -- #how-we-work .stage .figure-out width, follow-up to RULE 27.
   With display:contents removed, .figure-out got a real box again but
   still spanned the FULL stage width (1125px) instead of shrinking to its
   own text -- Elementor's own e-con-full utility class (present on every
   container, including this one) sets width:100%, and about-chrome.css's
   #how-we-work .stage .figure-out rule never declares its own width, so
   nothing overrode it. With width:100% + position:absolute;right:0, the
   box exactly filled its containing block edge-to-edge, making 'right:0'
   invisible and pushing the '01' text to render at the LEFT edge of that
   full-width box (in normal flex flow) instead of hugging the right side. */
#how-we-work .stage .figure-out{width:auto}


/* RULE 29 -- Story page founder photo (.sto__ph) not filling its
   container, founder-reported 2026-08-18. .sto__ph{aspect-ratio:4/5} gives
   the container a real, definite height (measured 517.5x646.9px, correct
   ratio). story-chrome.css's own #story-open .sto__ph img{width:100%;
   height:100%;object-fit:cover} SHOULD stretch the image to fill it -- but
   the real <img> sits inside an Elementor image WIDGET's own wrapper divs
   (.elementor-widget-image > .elementor-widget-container), which have no
   explicit height of their own and auto-size to the img's INTRINSIC
   dimensions (1200x1200, a perfect square) instead of stretching to fill
   .sto__ph. img{height:100%} then resolves against that auto-sized square
   wrapper, not .sto__ph, so the image renders as a 517.5x517.5 square
   with 129.4px of empty .sto__ph background showing below it -- exactly
   the reported dead gap. Same root cause as RULE 25's .vfield__fill and
   RULE 26's .tgrid. Flattening the widget wrapper lets height:100%
   resolve directly against .sto__ph, which has the real definite height. */
.sto__ph > .elementor-element {
	display: contents;
}


/* RULE 30 -- .oof__grid and .oof__sheen (For Organizations, 03 offer
   plate) both 0-height, founder-reported (light sweep + grid never show).
   Both share ONE text-editor widget wrapper (w106, direct child of .oof)
   holding both decorative spans as raw HTML. That wrapper has zero
   intrinsic height (its only content is two position:absolute spans), so
   .oof__grid{inset:0} and .oof__sheen{top:-60%;bottom:-60%} -- both
   percentage-based -- resolved against a 0-height containing block instead
   of .oof itself. Confirmed live: both measured width correct (1117px /
   380px) but height 0px. Same root cause as RULE 25/26/29 this session.
   Flattening just this one wrapper (scoped via :has(), not a blanket
   .oof > .elementor-element -- .oof's other children like .oof__t3 hold
   multiple real widgets and must stay real boxes). */
.oof > .elementor-element:has(.oof__sheen) {
	display: contents;
}


/* RULE 31 -- Story page 'The Calls' (.dead) dashed spine not rendering,
   founder-reported. .dead__spine{position:absolute;top:0;bottom:26px}
   needs .dead (position:relative) as its containing block, but its direct
   parent is a text-editor widget wrapper with zero intrinsic height (only
   content is this one absolutely-positioned span) -- same root cause as
   RULE 25/26/29/30 this session. Confirmed live: width correct (2px),
   height 0px. NOTE: .sta__sheet (the background grid texture, also
   reported this session) was checked and is ALREADY correct live --
   background-image present, real 1237x1168px box -- not touched. */
.dead > .elementor-element:has(.dead__spine) {
	display: contents;
}


/* RULE 32 -- IN-COPY INTERNAL LINKS (Home body copy, SEO internal linking)
   Founder ruling 2026-08-21: internal links must sit in the LANDING PAGE'S
   BODY COPY, not nav/footer -- Google discounts boilerplate chrome and
   weights in-body contextual links.

   REUSES the design's OWN in-copy link treatment verbatim from
   styles.css: .hero__now a{color:var(--navy);font-weight:700;
   border-bottom:2px solid var(--orange);text-decoration:none}. No new
   colour and no new token is introduced here -- only the scope changes,
   because .hero__now a is scoped to the 211 line and the new links live in
   .hero__sub and .trio.

   The 2px orange border-bottom IS the underline. It is a non-colour signal,
   so the link does not rely on colour alone (colour-only link marking fails
   for colour-blind readers). --orange #E07A2F is 3.0:1 on light grounds and
   is documented GRAPHIC-ONLY there -- a rule under the word is exactly that
   permitted graphic use, not text.

   SCOPED body.home + real design classes deliberately. Bare
   .elementor-element-cNNN selectors are a confirmed repeat hazard on this
   site (Elementor ids are unique per-document, not sitewide).

   MEASURED CAVEAT, reported to founder: inside .hero__sub the anchors sit
   within a <b> that styles.css already paints navy at weight 600
   (.hero__sub b{color:var(--navy);font-weight:600}). So in the HERO the
   distinction is weight 600->700 plus the orange rule -- there is NO colour
   delta there. In .trio the surrounding text is --muted #6B6F78, so navy
   #14233F IS a real visible colour change. Not 'fixed' by inventing a
   colour, per instruction. */
body.home .hero__sub a,
body.home .trio a,
body.home .crisis__lede a {
	font-weight: 700;
	border-bottom: 2px solid var(--orange);
	text-decoration: none;
}

/* .trio and .crisis__lede -- surrounding copy is --muted #6B6F78 (.lede sets
   it), so navy IS already a real visible colour delta (measured 3.11:1).
   These take the .hero__now a treatment unchanged. Only .hero__sub needed the
   green override, because there the surrounding <b> is already navy. */
body.home .trio a,
body.home .crisis__lede a {
	color: var(--navy);
}

/* .hero__sub -- FOUNDER RULING 2026-08-21. The anchors sit inside a <b> that
   styles.css already paints navy #14233F at weight 600, so navy produced NO
   colour delta and weight 600->700 + the orange rule was ruled insufficient
   signal. Use var(--green) #2E7D5B -- the site's OWN base link colour
   (styles.css: a{color:var(--green)}). Token reuse, not invention.

   MEASURED contrast, not assumed:
     green #2E7D5B vs surrounding navy body text #14233F .... 3.13:1
       (clears the 3:1 bar for distinguishing a link from adjacent text)
     green #2E7D5B on canvas ground #FBF8F3 ................. 4.72:1
       (clears WCAG AA 4.5:1 for normal-size text)
   The orange border-bottom REMAINS as the non-colour signal, so the link is
   never marked by colour alone.

   NEVER extend these selectors to band-deep / band-navy grounds. */
body.home .hero__sub a {
	color: var(--green);
}

body.home .trio a:hover,
body.home .trio a:focus-visible,
body.home .crisis__lede a:hover,
body.home .crisis__lede a:focus-visible {
	color: var(--green);
	border-bottom-color: var(--green);
	text-decoration: none;
}

/* Hero inverts on hover -- green at rest, navy on hover -- so the hover state
   is still a visible change (green->green would have been a dead hover). */
body.home .hero__sub a:hover,
body.home .hero__sub a:focus-visible {
	color: var(--navy);
	border-bottom-color: var(--navy);
	text-decoration: none;
}

/* ---------------------------------------------------------------------
   RULE 33 -- footer kicker: .eyebrow--orange text-colour override,
   scoped to .close (the footer template's own root class).

   .eyebrow--orange's real dark-ground override only fires inside a
   .band-navy / .band-deep ancestor (see the .eyebrow--orange rule in
   styles.css). The footer template's root class is .close, not
   band-navy/band-deep, so without this the "01" kicker in
   .close__nav .eyebrow--orange would render var(--navy) text on the
   footer's var(--navy-deep) background -- ~1.05:1, functionally
   invisible. This mirrors the existing band-navy/band-deep pattern,
   scoped to .close instead of inventing a new colour.

   Measured 2026-08-24: --orange-soft on --navy-deep = 9.75:1 (AAA).
   The bar itself (.eyebrow--orange.sec__head::before) is unaffected --
   it already resolves to a fixed var(--orange), which is fine as a
   decorative (non-text) accent regardless of ground. */
.close .eyebrow--orange {
	color: var(--orange-soft);
}

/* ---------------------------------------------------------------------
   RULE 34 -- footer claim em: cross-page colour consistency fix.

   styles.css: .close__claim em{color:var(--green-bright);font-style:normal}
   motion-plus.css (HOME-ONLY enqueue, see inc/asset-map.php case 'home'):
     .close__claim em{color:var(--orange-soft);font-style:italic}

   Both share specificity (0,1,1), so which one rendered depended on load
   order -- meaning the SAME shared footer template (post 116) rendered
   the punch-word two different colours/styles depending on which page it
   was on: orange-soft italic on Home only, green-bright upright everywhere
   else. Discovered live 2026-08-24 while shipping the '01 / NO DEAD ENDS
   HERE.' rework -- confirmed empirically on Home, Get Help and cluster
   page 391 (not inferred from source).

   Marco's ruling 2026-08-24: green-bright, non-italic, sitewide -- matches
   what every page except Home was already rendering. Forced here with an
   extra .close ancestor class so specificity (0,2,1) wins on EVERY page
   regardless of enqueue order, including Home where motion-plus.css also
   loads. */
.close .close__claim em {
	color: var(--green-bright);
	font-style: normal;
}


/* ==========================================================================
   RULE 35 -- THE CLOSER'S RECORD GROUND WAS TRAPPED IN A 3px WRAPPER (Home)

   Founder report 2026-08-25: the light grid behind the closing monument
   ("THE DATA DESERT HAS A COST ... THE FIX EXISTS NOW.") stopped short and
   never reached below the last line.

   MEASURED live at 1585px, logged in, reveal state forced and transitions
   killed (the automation tab never fires the scroll observer, so a
   transformed box reads wrong -- see the standing gotcha):

     .clbg declares  height: calc(100% + clamp(110px,14vw,220px))
     .closer is 387px tall, so the intended height is 387 + 220 = 607px
     ACTUAL computed height was 223px  ==  3px + 220px

   The 100% was resolving against 3px, not 387px. .clbg is absolutely
   positioned and its containing block is NOT .closer -- it is the Elementor
   text-editor WIDGET WRAPPER it happens to live inside (w311), which is
   position:relative by default and collapses to 3px because its only
   in-flow child is the 3px .closer__seam. offsetParent confirmed it live.

   Same consequence for both corner brackets, which live in that wrapper too:
   .clbk (top:-16px) and .clbk--b (bottom:-16px) were resolving against the
   same 3px box, so instead of framing the 387px block from opposite corners
   they sat 19px apart near the top centre. Visible in the founder's own
   screenshot as two orange corners bunched together above the headline.

   FIX: drop the wrapper out of the positioning chain so .clbg and .clbk
   resolve against .closer, which already carries position:relative and
   isolation:isolate for exactly this purpose.

   position:static, NOT display:contents. Both restore the ground, but
   display:contents also promotes .closer__seam to a direct grid item, which
   takes it from 0px to 760px wide -- i.e. it makes a currently-invisible
   3px orange/green seam appear above the headline while its twin below
   (.closer__seam--b, in the separate w313 wrapper) stays invisible. That is
   an asymmetric, unrequested visual change. MEASURED with position:static:
   both seams and the w311 wrapper box are byte-identical before and after.

   MEASURED after, same conditions:
     .clbg height        223px  ->  607px   (the declared value)
     ground vs last line -225px ->  +159px  (was ending ABOVE the text)
     bracket A           left 857 -> left 161      (frames top-left)
     bracket B           right 761/bottom 14211 -> right 1457/bottom 14579
     .closer height, headline box, both seams, page overflow  ALL UNCHANGED

   Scoped by the real design class .closer, which a full sweep of all 16
   published Elementor documents found on post 10 (Home) ONLY -- never a
   bare .elementor-element-cNNN selector, per this site's repeat hazard.
   RULE 21's lazy-load defence for .clbg__grid is untouched and still
   required; without it Elementor erases the gradient entirely.
   ========================================================================== */
body.home .closer > .elementor-element:first-child {
	position: static;
}


/* =============================================================================
 * RULE 36 -- THE CLOSING GATE (footer, template 116)          2026-08-25
 *
 * Founder: the footer "looks incomplete", wants more graphics and animation,
 * and the claim changed to NO ONE GETS LOST.
 *
 * !!! THIS IS SHARED CHROME. IT RENDERS ON ALL 12 PAGES. !!!
 * Three constraints follow from that, and they are why this is built the way
 * it is rather than the way the page-level figures on post 392 are built:
 *
 * 1. NO JAVASCRIPT. NONE. Every page runs a DIFFERENT reveal engine --
 *    motion.js on home, cluster-fx.js on the cluster, wof-fx.js on 392,
 *    about-inline.js on about, and nav-lite.js only on get-help. There is no
 *    gate class that exists on all of them, so a JS-gated footer would be
 *    invisible on whichever pages lack that engine. That is exactly the
 *    About-page failure this project already paid for once.
 *
 * 2. SCROLL ANIMATION COMES FROM `animation-timeline: view()`, BEHIND
 *    @supports. The footer is below the fold on every page, so a plain
 *    on-load animation would finish before anyone saw it. view() is
 *    scroll-driven and needs no observer. Browsers without it (Safari,
 *    Firefox at time of writing) never enter the @supports block and get the
 *    finished static state -- which is the correct picture, not a broken one.
 *
 * 3. FAIL-VISIBLE BY CONSTRUCTION. There is no hidden base state anywhere in
 *    this rule. Nothing is opacity:0 or scaleX(0) outside the @supports +
 *    prefers-reduced-motion block. With no CSS animation support at all the
 *    footer renders complete.
 *
 * GET HELP IS THE CRISIS DOOR AND IS PROTECTED: this adds ZERO requests, zero
 * JS, and no layout change to tel:211 / tel:911 or the enrolment lock. Every
 * decoration is a pseudo-element on an existing decorative div.
 *
 * WHY PSEUDO-ELEMENTS FOR EVERY GRADIENT: Elementor ships
 * `.e-con.e-parent:nth-of-type(n+4):not(.e-lazyloaded) * {background-image:
 * none!important}` which matches descendant ELEMENTS but never an element's
 * own pseudo. Structural immunity, so no !important is needed here.
 *
 * DELIBERATELY NOT DONE: no background-clip:text sheen on .close__mark. If a
 * browser or Elementor's lazy-load rule dropped that background-image, the
 * `color:transparent` it requires would render the site's largest wordmark
 * INVISIBLE. Depth is done with text-shadow instead, which cannot fail that
 * way. Do not "upgrade" this to a clipped gradient.
 * ========================================================================== */

.close {
	--cg-warm:  var(--orange-soft);
	--cg-live:  var(--green-bright);
	--cg-edge:  rgba(221, 231, 228, .22);
	--cg-dim:   rgba(221, 231, 228, .55);
}

/* --- corner brackets: 8 gradient layers on ONE pseudo --------------------- */
.close__frame {
	position: absolute;
	inset: clamp(14px, 1.8vw, 26px);
	pointer-events: none;
	z-index: 0;
}
.close__frame::after {
	content: "";
	position: absolute;
	inset: 0;
	background-repeat: no-repeat;
	background-size: 26px 2px, 2px 26px, 26px 2px, 2px 26px,
	                 26px 2px, 2px 26px, 26px 2px, 2px 26px;
	background-position:
		left top, left top, right top, right top,
		left bottom, left bottom, right bottom, right bottom;
	background-image:
		linear-gradient(var(--cg-warm), var(--cg-warm)),
		linear-gradient(var(--cg-warm), var(--cg-warm)),
		linear-gradient(var(--cg-warm), var(--cg-warm)),
		linear-gradient(var(--cg-warm), var(--cg-warm)),
		linear-gradient(var(--cg-warm), var(--cg-warm)),
		linear-gradient(var(--cg-warm), var(--cg-warm)),
		linear-gradient(var(--cg-warm), var(--cg-warm)),
		linear-gradient(var(--cg-warm), var(--cg-warm));
	opacity: .5;
}

/* --- a soft green ground behind the claim -------------------------------- */
.close__glow {
	position: absolute;
	inset: 0;
	pointer-events: none;
	z-index: 0;
	overflow: hidden;
}
.close__glow::after {
	content: "";
	position: absolute;
	left: 50%;
	top: clamp(120px, 16vw, 260px);
	width: min(1100px, 120%);
	aspect-ratio: 2 / 1;
	transform: translateX(-50%);
	background-image: radial-gradient(closest-side,
		rgba(63, 191, 132, .13) 0%, rgba(63, 191, 132, .05) 45%, transparent 72%);
}

/* --- the travelling sheen on the existing 3px topline -------------------- */
.close__topline {
	position: relative;
	overflow: hidden;
}
.close__topline::after {
	content: "";
	position: absolute;
	inset: 0;
	opacity: 0;
	background-image: linear-gradient(90deg,
		transparent 0 42%, rgba(255, 255, 255, .85) 49% 51%, transparent 58% 100%);
}

/* -------------------------------------------------------------------------
 * THE CONVERGENCE -- the picture for "no one gets lost".
 * Five inbound paths, a collector bar, one confirmed arrival node. Nothing
 * drops out between them. Sits directly above the claim.
 * ---------------------------------------------------------------------- */
.close__conv {
	position: relative;
	z-index: 1;
	width: min(520px, 74%);
	margin: clamp(46px, 6vw, 86px) auto 0;
	display: block;
}
.close__conv-t {
	display: flex;
	justify-content: space-between;
	align-items: flex-end;
	height: clamp(26px, 3vw, 42px);
}
.close__conv-t span {
	display: block;
	width: 2px;
	height: 100%;
	transform-origin: top center;
	background-image: linear-gradient(180deg,
		transparent 0%, var(--cg-edge) 22%, var(--cg-dim) 100%);
}
.close__conv-b {
	position: relative;
	display: block;
	height: 2px;
	margin-top: 7px;
	overflow: hidden;
	transform-origin: center;
}
.close__conv-b::before {
	content: "";
	position: absolute;
	inset: 0;
	background-image: linear-gradient(90deg,
		transparent 0%, var(--cg-dim) 12%, var(--cg-dim) 88%, transparent 100%);
}
.close__conv-s {
	display: block;
	width: 2px;
	height: clamp(18px, 2.2vw, 30px);
	margin: 0 auto;
	transform-origin: top center;
	background-image: linear-gradient(180deg, var(--cg-dim) 0%, var(--cg-live) 100%);
}
.close__conv-n {
	display: block;
	width: 13px;
	height: 13px;
	margin: 0 auto;
	border-radius: 50%;
	background-color: var(--cg-live);
	box-shadow: 0 0 0 6px rgba(63, 191, 132, .16);
}
.close__conv-l {
	display: block;
	margin-top: 12px;
	text-align: center;
	font-family: var(--font-mono);
	font-size: 11px;
	font-weight: 600;
	letter-spacing: .18em;
	line-height: 1;
	text-transform: uppercase;
	color: var(--cg-live);
}

/* --- the claim and the wordmark get real depth --------------------------- */
.close__claim {
	position: relative;
	z-index: 1;
}
.close__mark {
	position: relative;
	z-index: 1;
	text-shadow:
		0 1px 0 rgba(11, 23, 41, .5),
		0 0 46px rgba(63, 191, 132, .16);
}

/* --- meta links: a real focus/hover affordance --------------------------- */
.close__meta a {
	transition: color 180ms linear, border-color 180ms linear;
}
.close__meta a:focus-visible {
	outline: 2px solid var(--cg-live);
	outline-offset: 3px;
	border-radius: 3px;
}

/* =========================== MOTION ======================================
 * Scroll-driven, one pass, no loop. Everything below is inside BOTH a
 * reduced-motion guard AND an @supports gate, so the static finished state
 * above is what ships anywhere either is unavailable.
 * ======================================================================== */
@media (prefers-reduced-motion: no-preference) {
	@supports (animation-timeline: view()) {

		.close__conv-t span {
			animation: cg-drop both linear;
			animation-timeline: view();
			animation-range: entry 8% cover 32%;
		}
		.close__conv-t span:nth-child(1) { animation-delay: 0s }
		.close__conv-b {
			animation: cg-wide both linear;
			animation-timeline: view();
			animation-range: entry 16% cover 38%;
		}
		.close__conv-s {
			animation: cg-drop both linear;
			animation-timeline: view();
			animation-range: entry 24% cover 44%;
		}
		.close__conv-n {
			animation: cg-pop both linear;
			animation-timeline: view();
			animation-range: entry 30% cover 48%;
		}
		.close__conv-l {
			animation: cg-fade both linear;
			animation-timeline: view();
			animation-range: entry 34% cover 52%;
		}
		.close__topline::after {
			animation: cg-sheen both linear;
			animation-timeline: view();
			animation-range: entry 0% cover 40%;
		}

		@keyframes cg-drop  { from { transform: scaleY(0) }   to { transform: scaleY(1) } }
		@keyframes cg-wide  { from { transform: scaleX(0) }   to { transform: scaleX(1) } }
		@keyframes cg-pop   { from { transform: scale(0); opacity: 0 } to { transform: scale(1); opacity: 1 } }
		@keyframes cg-fade  { from { opacity: 0; transform: translateY(6px) } to { opacity: 1; transform: none } }
		@keyframes cg-sheen {
			0%   { opacity: 0; transform: translateX(-100%) }
			18%  { opacity: .9 }
			82%  { opacity: .9 }
			100% { opacity: 0; transform: translateX(100%) }
		}
	}
}

/* =========================== RESPONSIVE ================================== */
@media (max-width: 767px) {
	.close__frame { inset: 10px; }
	.close__frame::after {
		background-size: 18px 2px, 2px 18px, 18px 2px, 2px 18px,
		                 18px 2px, 2px 18px, 18px 2px, 2px 18px;
	}
	.close__conv { width: min(320px, 84%); margin-top: 38px; }
	.close__conv-l { font-size: 10px; letter-spacing: .14em; }
	.close__mark { text-shadow: 0 1px 0 rgba(11, 23, 41, .5), 0 0 26px rgba(63, 191, 132, .16); }
}


/* =============================================================================
 * RULE 37 -- THE FOOTER DECORATION LAYER HAD COLLAPSED TO 3px   2026-08-25
 *
 * MEASURED live, logged out, on /get-help/ at 375px BEFORE this rule:
 *     .close                     height 644px
 *     widget wrapper             height   3px   <- the containing block
 *     .close__field  (PRE-EXISTING) height 3px  <- should be 644
 *     .close__glow                 height 3px
 *     .close__frame                height 0px
 *
 * Every decoration in the footer is position:absolute with inset, so it sizes
 * against its nearest POSITIONED ancestor. Elementor makes every widget
 * wrapper position:relative, and this wrapper's only in-flow child is the 3px
 * .close__topline -- so the wrapper is 3px tall and every absolute child
 * resolved against 3px instead of against .close.
 *
 * !!! .close__field IS NOT NEW. THE FOOTER'S BACKGROUND TEXTURE HAS BEEN
 * RENDERING AT 3px HEIGHT FOR ITS ENTIRE LIFE. !!! This is very likely part
 * of why the footer read as "incomplete" -- it was missing its ground.
 *
 * Same wrapper-collapse trap already recorded for .vch__bar (percentage
 * height), .ofr__fill (grid placement) and .clbg (absolute offsets, RULE 35).
 * Fixed the same way RULE 35 fixes it: position:static on the wrapper, so the
 * absolutely positioned children re-anchor to .close.
 *
 * position:static is the NARROWER tool than display:contents here, and that
 * matters: this wrapper has a real IN-FLOW child (.close__topline, 3px).
 * display:contents would re-parent it into .close's own layout; position:
 * static re-anchors ONLY the absolutely positioned children and leaves the
 * topline exactly where it is.
 * ========================================================================== */
.close > .elementor-element:first-child { position: static; }

/* ---------------------------------------------------------------------------
 * ABOUT - .phz__steps grid items (added 2026-09-05)
 *
 * about-chrome.css declares #next .phz__steps{display:grid;grid-template-columns:
 * repeat(3,minmax(0,1fr));list-style:none} and #next .phz__step{padding:...;
 * border-right:1px solid var(--hairline)}. The three <li class="phz__step">
 * are each wrapped in their own Elementor text-editor widget, so the GRID ITEMS
 * were the wrappers and .phz__step was only ever an ordinary block inside one.
 * The cell padding and the vertical divider therefore drew around the text
 * rather than at the column edge.
 *
 * The neighbouring .phz__rail wrapper was already neutralised this way; this is
 * the same treatment for its sibling. Safe here for the reason stated in the
 * block above: each of these three wrappers holds EXACTLY ONE child, so nothing
 * else is promoted into the grid.
 *
 * Rollback: option oig_bridge_bk_phz.
 * --------------------------------------------------------------------------- */
.phz__steps > .elementor-element { display: contents; }

/* oig-nav-cta-css /wp-content/themes/operation-iron-gate/oig/nav-cta.css */
/* ============================================================================
   NAV CTA — THE DONATE BUTTON, LIT.            extracted sitewide 2026-09-06

   FOUNDER REPORT 2026-09-06: "the 2 buttons on the right ... on OUR TEAM,
   FOUNDERS STORY, ORGANIZATIONS, and all the pages in the HOW IT WORKS tab is
   not the same look and style as the home page."  ACCURATE.

   ROOT CAUSE, MEASURED before this file existed. The header markup is one
   Theme Builder template (post 82, condition include/general) and rendered
   BYTE-IDENTICAL on every page - same <a class="btn btn--primary btn--sm">,
   same popup href, same <button class="btn btn--outline btn--sm">. The
   difference was never markup. It was that the button's ENTIRE animated
   treatment lived in motion-plus.css, which inc/asset-map.php enqueues only
   inside `case 'home':`. Grep of the served CSS bundle, logged out:

       donate-breathe   home 2   our-team 0   story 0
                        for-organizations 0   closed-loop-referral 0
                        no-dead-end-referral-system 0
       donate-shine     identical result

   So on the homepage the button breathes, a shine crosses it on its own
   clock, and it lifts 2px on hover. On every other page it was a flat static
   pill. The FILL was already correct sitewide - styles.css's appended
   `.nav .nav__cta .btn--primary,.nav__cta .btn--primary.btn--sm` (0,3,0)
   bright-green block ships in styles.min.css on every page - which is why the
   colour matched and only the life was missing.

   This file is a VERBATIM lift of the motion-plus.css block, enqueued
   sitewide and unconditionally, same tier as signature.css and
   elementor-bridge.css. Nothing is retuned. The two `background` declarations
   and the box-shadow below are outranked identically on EVERY page by that
   same (0,3,0) rule in styles.css, exactly as they already were on the
   homepage - they are carried across unchanged so the cascade behaves
   byte-for-byte as it always has rather than depending on my reasoning about
   specificity.

   --ease-enter is declared in styles.css (:root, sitewide) and is present in
   styles.min.css on every page - verified before extraction, not assumed.

   SINGLE SOURCE OF TRUTH: the matching block has been removed from
   motion-plus.css. Do not restore it there. Edit the button here.
   ========================================================================== */

/* Same luminance ceiling as .door__go, for the same reason: the white 13px/600
   label sets it, not taste. #1B8055 = 4.92:1, #14663F = 7.0:1, so the whole
   glyph band clears AA with margin — and it needs margin here, because
   donate-shine lays rgba(255,255,255,.42) across the label as it crosses. */
.nav__cta .btn--primary{position:relative;overflow:hidden;
  background:linear-gradient(180deg,#1B8055,#14663F);
  box-shadow:0 10px 24px -12px rgba(32,103,74,.9),inset 0 1px 0 rgba(255,255,255,.28);
  animation:donate-breathe 3.6s var(--ease-enter) infinite}
@keyframes donate-breathe{
  0%,100%{box-shadow:0 10px 24px -12px rgba(32,103,74,.9),inset 0 1px 0 rgba(255,255,255,.28),0 0 0 0 rgba(63,191,132,0)}
  55%{box-shadow:0 12px 30px -12px rgba(32,103,74,.95),inset 0 1px 0 rgba(255,255,255,.34),0 0 22px 2px rgba(63,191,132,.45)}
}
/* a shine crosses it on its own clock, not only on hover */
.nav__cta .btn--primary::after{content:"";position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(105deg,transparent 34%,rgba(255,255,255,.42) 50%,transparent 66%);
  transform:translateX(-130%);animation:donate-shine 4.8s var(--ease-enter) infinite}
@keyframes donate-shine{0%,62%{transform:translateX(-130%)}86%,100%{transform:translateX(130%)}}
.nav__cta .btn--primary:hover{background:linear-gradient(180deg,#1A7D53,#12603C);transform:translateY(-2px)}

/* Reduced motion: the button keeps its full static appearance, loses only the
   two wall-clock loops. Carried across from motion-plus.css; the .door part of
   the original selector list stays there, since .door is homepage-only. */
@media (prefers-reduced-motion:reduce){
  .nav__cta .btn--primary,.nav__cta .btn--primary::after{animation:none}
}
/* oig-close-band-css /wp-content/themes/operation-iron-gate/oig/close-band.css */

/* ==========================================================================
   CLOSE-BAND "THE SEAL" v2 - every page (footer template 116) - 2026-09-23
   Founder: "this section looks all jacked up and not aligned at all ... get
   everything aligned in order then make it look really bad ass", and
   "you need to change that in all pages" (one shared footer = all pages).
   MEASURED at 1600 before: claim text centred at x283-1301 while every board
   above it is left-aligned x96-1488; a hairline seam showed where the claim
   widget (250px) met the CTA widget (113px); claim 79.2px.
   Fix: both widgets keep the canvas ground, the content now snaps to the
   board's own left edge with an orange rail, an eyebrow and corner ticks, and
   the seam is closed with a 1px overlap.
   Inks: claim --navy, punch --green #2E7D5B (4.4:1 on canvas, passes the 3:1
   large-text bar), rule hairline --hairline.
   Rollback: oig_backup_closeband_pre_seal_20260923.
   ========================================================================== */

/* ---- the ground: one continuous canvas band, seam closed ---- */
html body .elementor-element-close-claim,
html body .elementor-element-close-cta {
  position: relative;
  z-index: 1;
  background-color: var(--canvas, #FBF8F3);
  box-shadow: 0 0 0 100vmax var(--canvas, #FBF8F3);
  clip-path: inset(0 -100vmax);
}
html body .elementor-element-close-claim { margin-bottom: -1px; padding-bottom: 1px; }

/* ---- the claim: left-aligned to the board, on a rail ---- */
html body .close .close__claim {
  margin-left: 0;
  margin-right: 0;
  margin-top: clamp(56px, 6vw, 92px);
  width: 100%;
  max-width: clamp(520px, 66vw, 1040px);
  padding-left: clamp(18px, 1.6vw, 26px);
  border-left: 3px solid var(--orange, #E07A2F);
  text-align: left;
  color: var(--navy, #14233F);
  text-shadow: none;
}
html body .close .close__claim em,
html body .close .close__claim .em {
  color: var(--green, #2E7D5B);
  text-shadow: none;
  background-image: linear-gradient(var(--green, #2E7D5B), var(--green, #2E7D5B));
}
/* eyebrow above the claim, in the site's label voice */
html body .elementor-element-close-claim > .close__claim::before {
  content: "The standard";
  display: block;
  margin-bottom: clamp(14px, 1.4vw, 20px);
  padding-left: 44px;
  font: 600 13px/1 var(--font-body, "Space Grotesk", system-ui, sans-serif);
  letter-spacing: .16em;
  text-transform: uppercase;
  color: var(--navy, #14233F);
  background: linear-gradient(var(--orange, #E07A2F), var(--orange, #E07A2F)) left 50% / 30px 2px no-repeat;
}

/* ---- the CTA: same left edge as the claim, with a hairline above ---- */
html body .close .close__cta {
  margin-top: clamp(26px, 2.6vw, 38px);
  padding-top: clamp(22px, 2.2vw, 32px);
  border-top: 1px solid var(--hairline, #D6D2CA);
  text-align: left;
  color: var(--body, #3A4760);
}

html body .close .close__cta > a,
html body .close .close__cta .btn,
html body .close .close__cta .elementor-button {
  margin-left: 0;
  margin-right: auto;
}

/* ---- corner ticks marking the board edges ---- */
html body .elementor-element-close-cta::before,
html body .elementor-element-close-cta::after {
  content: "";
  position: absolute;
  bottom: 4px;
  width: 22px;
  height: 22px;
  pointer-events: none;
  opacity: .5;
}
html body .elementor-element-close-cta::before {
  left: 0;
  border-left: 2px solid var(--orange, #E07A2F);
  border-bottom: 2px solid var(--orange, #E07A2F);
}
html body .elementor-element-close-cta::after {
  right: 0;
  border-right: 2px solid var(--orange, #E07A2F);
  border-bottom: 2px solid var(--orange, #E07A2F);
}

/* the decorative field is drawn for a dark ground - keep it off the light band */
html body .elementor-element-close-claim .close__field,
html body .elementor-element-close-cta .close__field { display: none; }

@media (max-width: 900px) {
  html body .close .close__claim { max-width: none; }
  html body .elementor-element-close-cta::before,
  html body .elementor-element-close-cta::after { display: none; }
}

/* ---- 2026-09-23: founder - the CTA is centred and the band gets macro
   white space under it before the navy footer starts.
   MEASURED before at 1600: button bottom y5492, navy nav began y5525 = 33px
   of cream under the button; button was left-aligned at x96. ---- */
html body .close .close__cta { text-align: center; }
html body .close .close__cta > a,
html body .close .close__cta .btn,
html body .close .close__cta .elementor-button { margin-left: auto; margin-right: auto; }
html body .elementor-element-close-cta { padding-bottom: clamp(96px, 10vw, 180px); }

/* ==========================================================================
   CLOSE-BAND v3 "ONE AXIS" - every page (footer 116) - 2026-09-23
   Founder, after the centred CTA shipped: "still not aligned ... get
   everything aligned in order". MEASURED at 1600: eyebrow + headline sat left
   (x96-113) while the button was centred at x808 - two competing axes in one
   band. v3 puts the whole band on ONE centred axis.
   Rail -> a centred accent bar above the eyebrow; headline centred and
   width-capped so it breaks in two even lines; hairline, button and macro
   space already centred. Corner ticks keep the board edges readable.
   ========================================================================== */
html body .close .close__claim {
  margin-left: auto;
  margin-right: auto;
  padding-left: 0;
  border-left: 0;
  text-align: center;
  max-width: clamp(520px, 62vw, 980px);
}
html body .elementor-element-close-claim > .close__claim::before {
  width: fit-content;
  margin-left: auto;
  margin-right: auto;
  padding-left: 44px;
  padding-right: 44px;
  background:
    linear-gradient(var(--orange, #E07A2F), var(--orange, #E07A2F)) left 50% / 30px 2px no-repeat,
    linear-gradient(var(--orange, #E07A2F), var(--orange, #E07A2F)) right 50% / 30px 2px no-repeat;
}
html body .close .close__cta { text-align: center; }
/* the hairline reads as a centred rule, not a full-width divider */
html body .close .close__cta {
  border-top: 0;
  position: relative;
}
html body .close .close__cta::before {
  content: "";
  position: absolute;
  top: 0;
  left: 50%;
  transform: translateX(-50%);
  width: min(420px, 60%);
  height: 1px;
  background: linear-gradient(90deg, transparent, var(--hairline, #D6D2CA) 22%, var(--hairline, #D6D2CA) 78%, transparent);
}

/* ==========================================================================
   CLOSE-BAND v4 "THE SEAL" - every page (footer 116) - 2026-10-06
   Founder (redesign night): make "The Standard" band bad ass.
   Keeps v3: canvas ground, one centred axis, macro space under the button.
   MEASURED before at 1600: a 1px grey line crossed the whole viewport at
   y=277 through the base of "PROVEN. NO ONE GETS LOST." - the claim widget
   ends at y275.72 and the CTA widget's canvas fill starts there, so the navy
   footer root anti-aliased through the sub-pixel seam (pixel 206,206,205).
   Adds: seam closed (claim fill overlaps 3px down), a gauge ruler across the
   board top, an outline STANDARD watermark, a green ink seal stamped on the
   claim's right side (>=1400px), a highlighter stroke under the
   punch line, a centred diamond on the hairline, a ring pulse on the CTA.
   Decorative pieces are pseudo-elements; motion is off under
   prefers-reduced-motion and every end state is the visible state.
   ========================================================================== */
html body .elementor-element-close-claim {
  clip-path: inset(0 -100vmax -3px -100vmax);
  padding-bottom: 3px;
  margin-bottom: -3px;
}
html body .elementor-element-close-cta { z-index: 0; }

/* gauge ruler: minor ticks every 12px, majors every 120px, faded at the ends */
html body .elementor-element-close-claim::before {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  top: clamp(22px, 2.4vw, 36px);
  height: 18px;
  pointer-events: none;
  background:
    linear-gradient(90deg, rgba(20,35,63,.34) 0 1.5px, transparent 1.5px) 0 0 / 120px 18px repeat-x,
    linear-gradient(90deg, rgba(20,35,63,.18) 0 1px, transparent 1px) 0 0 / 12px 8px repeat-x,
    linear-gradient(rgba(20,35,63,.16), rgba(20,35,63,.16)) 0 0 / 100% 1px no-repeat;
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 14%, #000 86%, transparent);
          mask-image: linear-gradient(90deg, transparent, #000 14%, #000 86%, transparent);
}

/* outline watermark behind the claim */
html body .elementor-element-close-claim::after {
  content: "Standard";
  position: absolute;
  left: 50%;
  top: 56%;
  transform: translate(-50%, -50%);
  z-index: 0;
  font-family: var(--font-display, "Anton", "Arial Narrow", Impact, sans-serif);
  font-size: clamp(110px, 18.5vw, 300px);
  line-height: 1;
  text-transform: uppercase;
  letter-spacing: .02em;
  white-space: nowrap;
  color: rgba(20,35,63,.045);
  pointer-events: none;
  user-select: none;
}
@supports (-webkit-text-stroke: 1px #000) {
  html body .elementor-element-close-claim::after {
    color: transparent;
    -webkit-text-stroke: 1.5px rgba(20,35,63,.1);
  }
}
html body .close .close__claim {
  position: relative;
  z-index: 1;
  margin-top: clamp(84px, 8vw, 128px);
}

/* highlighter stroke under the punch line */
html body .close .close__claim em,
html body .close .close__claim .em {
  background: linear-gradient(transparent 66%, rgba(63,191,132,.26) 66% 94%, transparent 94%) 0 0 / 100% 100% no-repeat;
  padding: 0 .06em;
  -webkit-box-decoration-break: clone;
          box-decoration-break: clone;
}

/* the seal: stamped on the claim's lower-right corner */
html body .close .close__claim::after {
  content: "";
  position: absolute;
  right: clamp(-150px, -9vw, -110px);
  bottom: 4px;
  width: clamp(140px, 10.5vw, 168px);
  aspect-ratio: 1;
  height: auto;
  background: url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 200 200%22%3E%3Cdefs%3E%3Cfilter id=%22r%22%3E%3CfeTurbulence type=%22fractalNoise%22 baseFrequency=%22.8%22 numOctaves=%222%22 seed=%227%22/%3E%3CfeDisplacementMap in=%22SourceGraphic%22 scale=%222.4%22/%3E%3C/filter%3E%3Cpath id=%22c%22 d=%22M100,100 m-73,0 a73,73 0 1,1 146,0 a73,73 0 1,1 -146,0%22/%3E%3C/defs%3E%3Cg filter=%22url%28%23r%29%22 fill=%22none%22 stroke=%22%232E7D5B%22%3E%3Ccircle cx=%22100%22 cy=%22100%22 r=%2295%22 stroke-width=%225%22/%3E%3Ccircle cx=%22100%22 cy=%22100%22 r=%2286%22 stroke-width=%221.6%22/%3E%3Ccircle cx=%22100%22 cy=%22100%22 r=%2257%22 stroke-width=%222.4%22/%3E%3Cpath d=%22M73 101 l18 18 l37 -40%22 stroke-width=%2211%22 stroke-linecap=%22square%22 stroke-linejoin=%22miter%22/%3E%3C/g%3E%3Cg filter=%22url%28%23r%29%22 fill=%22%232E7D5B%22%3E%3Ctext font-family=%22Impact,Haettenschweiler,'Arial Narrow Bold',sans-serif%22 font-size=%2213.5%22 letter-spacing=%221%22%3E%3CtextPath href=%22%23c%22 textLength=%22455%22 lengthAdjust=%22spacing%22%3EEVERY CASE SEEN %E2%98%85 EVERY DOLLAR PROVEN %E2%98%85 NO ONE GETS LOST %E2%98%85%3C/textPath%3E%3C/text%3E%3Ctext x=%22100%22 y=%22146%22 text-anchor=%22middle%22 font-family=%22Impact,Haettenschweiler,'Arial Narrow Bold',sans-serif%22 font-size=%2212.5%22 letter-spacing=%222.5%22%3ESTANDARD%3C/text%3E%3C/g%3E%3C/svg%3E") center / contain no-repeat;
  transform: rotate(-12deg);
  opacity: .9;
  pointer-events: none;
}

/* centred diamond on the hairline between claim and CTA */
html body .close .close__cta::after {
  content: "";
  position: absolute;
  top: -4px;
  left: 50%;
  width: 9px;
  height: 9px;
  background: var(--orange, #E07A2F);
  transform: translateX(-50%) rotate(45deg);
}

/* CTA: bigger, with a quiet ring pulse */
html body .close .close__cta .btn {
  position: relative;
  padding: 20px 36px;
  font-size: 17px;
  box-shadow: 0 16px 34px -16px rgba(46,125,91,.8);
  transition: transform .25s cubic-bezier(.22,1,.36,1), box-shadow .25s;
}
html body .close .close__cta .btn:hover,
html body .close .close__cta .btn:focus-visible {
  transform: translateY(-2px);
  box-shadow: 0 22px 40px -16px rgba(46,125,91,1);
}
html body .close .close__cta .btn .btn__arrow { display: inline-block; transition: transform .25s cubic-bezier(.22,1,.36,1); }
html body .close .close__cta .btn:hover .btn__arrow { transform: translateX(5px); }

@media (prefers-reduced-motion: no-preference) {
  html body .close .close__cta .btn { animation: pfhCbRing 3.2s ease-out 1.5s infinite; }
  @supports (animation-timeline: view()) {
    html body .close .close__claim::after {
      animation: pfhCbStamp linear both;
      animation-timeline: view();
      animation-range: entry 30% cover 42%;
    }
    html body .close .close__claim em,
    html body .close .close__claim .em {
      animation: pfhCbMark linear both;
      animation-timeline: view();
      animation-range: entry 40% cover 45%;
    }
  }
}
@keyframes pfhCbRing {
  0% { box-shadow: 0 16px 34px -16px rgba(46,125,91,.8), 0 0 0 0 rgba(46,125,91,.45); }
  70%, 100% { box-shadow: 0 16px 34px -16px rgba(46,125,91,.8), 0 0 0 16px rgba(46,125,91,0); }
}
@keyframes pfhCbStamp {
  from { opacity: 0; transform: rotate(-24deg) scale(1.9); }
  to { opacity: .9; transform: rotate(-12deg) scale(1); }
}
@keyframes pfhCbMark {
  from { background-size: 0 100%; }
  to { background-size: 100% 100%; }
}

@media (max-width: 1399px) {
  html body .close .close__claim::after { display: none; }
}
@media (max-width: 767px) {
  html body .elementor-element-close-claim::before { height: 14px; background-size: 96px 14px, 8px 6px, 100% 1px; }
  html body .close .close__claim { margin-top: 76px; }
  html body .close .close__cta .btn { padding: 18px 26px; font-size: 16px; }
}

/* ---- v4c 2026-10-06: founder "I want the stamp on the right side of DOLLAR ... on all the
   pages". The seal stays right of the claim at every width (v4b's centred-above
   placement was removed by restoring the pre-v4b file). Below 1400px the claim is
   narrowed so the seal always has its own gutter and never touches "DOLLAR".
   Highlighter moved from an em background (stopped painting in the regenerated
   bundle, even forced) to an em::after bar behind the words. ---- */
html body .close .close__claim em,
html body .close .close__claim .em {
  position: relative;
  background: none;
  animation: none;
}
html body .close .close__claim em::after,
html body .close .close__claim .em::after {
  content: "";
  position: absolute;
  left: -.06em;
  right: -.06em;
  bottom: .04em;
  height: .3em;
  z-index: -1;
  background: rgba(63,191,132,.28);
  transform-origin: left center;
  pointer-events: none;
}
@media (prefers-reduced-motion: no-preference) {
  @supports (animation-timeline: view()) {
    html body .close .close__claim em::after,
    html body .close .close__claim .em::after {
      animation: pfhCbBar linear both;
      animation-timeline: view();
      animation-range: entry 40% cover 45%;
    }
  }
}
@keyframes pfhCbBar { from { transform: scaleX(0); } to { transform: scaleX(1); } }

@media (max-width: 1399px) {
  html body .close .close__claim {
    max-width: min(62vw, calc(100% - 2 * (clamp(92px, 9.4vw, 128px) + 22px)));
  }
  html body .close .close__claim::after {
    display: block;
    width: clamp(92px, 9.4vw, 128px);
    right: calc(-1 * clamp(92px, 9.4vw, 128px) - 14px);
    bottom: 2px;
  }
}
@media (max-width: 900px) {
  html body .close .close__claim {
    max-width: calc(100% - 2 * (clamp(92px, 9.4vw, 128px) + 22px));
  }
}
@media (max-width: 767px) {
  html body .close .close__claim {
    margin-left: 0;
    margin-right: auto;
    max-width: calc(100% - 82px);
  }
  html body .close .close__claim::after {
    width: 72px;
    right: -80px;
    bottom: 0;
  }
}


/* ==========================================================================
   CLOSE-FOOT v1 "THE TRAILHEAD" - every page (footer 116, navy part) - 2026-10-06
   Founder (redesign night): NEXT SECTION after "The Standard" band.
   MEASURED before at 1600: 12 links in a 7+5 centred wrap; meta links and
   legal lines 12px (below the ~14px small-print floor); legal column 554px
   wide so "EIN 99-5142558" broke mid-number; wordmark 142.6px, 1120px of a
   1392px board; phone menu numbers 8.8px.
   Adds: topographic contour map behind the footer (on the existing .close__field
   layer, grid kept), menu as a 4x3 index board (2-up phone, 3-up tablet) with
   number / destination / arrow and a green hover bar, wordmark sized to the
   board with a fade + one sheen sweep, 14px meta + legal at higher contrast,
   EIN kept on one line, tricolor bar at the bottom edge.
   ========================================================================== */
html body .elementor-element-oig-footer-root .close__field {
  background-image:
    url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 1600 900%22 preserveAspectRatio=%22xMidYMax slice%22%3E%3Cg fill=%22none%22 stroke=%22%23DDE7E4%22 stroke-opacity=%22.085%22 stroke-width=%221.2%22%3E%3Cpath d=%22M573 640 L567 643 L562 646 L559 649 L560 652 L562 656 L564 662 L564 667 L562 671 L557 674 L551 674 L544 673 L537 671 L532 670 L528 670 L524 672 L520 676 L515 680 L508 683 L501 685 L495 685 L489 683 L485 679 L482 674 L480 670 L478 665 L476 662 L474 658 L472 655 L470 651 L468 648 L468 644 L467 640 L467 636 L466 632 L465 628 L464 623 L465 618 L468 614 L473 612 L480 611 L488 611 L496 613 L502 615 L507 616 L510 615 L512 612 L516 606 L520 601 L526 596 L533 593 L539 593 L545 596 L549 600 L551 605 L554 609 L558 612 L562 614 L569 616 L575 618 L581 621 L584 626 L583 631 L579 636Z%22/%3E%3Cpath d=%22M616 640 L604 646 L596 651 L592 656 L594 663 L598 671 L602 680 L602 690 L598 698 L589 702 L576 703 L563 700 L552 697 L542 695 L535 696 L528 700 L520 707 L510 715 L498 722 L485 725 L473 724 L463 719 L455 712 L450 703 L447 694 L443 687 L440 680 L435 674 L431 667 L427 661 L424 654 L423 647 L422 640 L421 633 L419 625 L417 617 L417 608 L419 600 L425 593 L435 588 L449 587 L463 589 L477 592 L488 595 L495 596 L501 593 L505 586 L511 576 L520 565 L531 557 L544 552 L555 553 L565 559 L573 567 L578 576 L583 583 L590 588 L599 592 L611 595 L623 599 L633 605 L637 614 L635 623 L627 632Z%22/%3E%3Cpath d=%22M656 640 L640 649 L629 656 L626 664 L629 673 L636 686 L641 700 L641 714 L634 724 L620 730 L601 730 L583 727 L566 722 L553 720 L542 722 L532 730 L520 741 L505 753 L487 762 L468 766 L451 763 L437 756 L426 744 L419 731 L414 718 L409 707 L403 698 L397 689 L390 680 L385 670 L381 661 L378 650 L376 640 L374 629 L372 618 L370 606 L369 594 L373 582 L383 572 L398 566 L418 565 L439 567 L458 572 L474 576 L484 576 L491 570 L498 559 L507 543 L520 528 L537 516 L555 510 L572 513 L586 522 L596 534 L604 547 L612 557 L622 564 L636 569 L654 574 L671 580 L684 590 L689 602 L685 616 L673 629Z%22/%3E%3Cpath d=%22M694 640 L674 651 L661 661 L659 671 L665 684 L674 701 L681 720 L680 737 L669 751 L650 757 L626 757 L601 752 L580 747 L563 745 L550 750 L536 761 L520 776 L500 792 L476 803 L452 807 L429 803 L411 791 L398 775 L389 758 L382 742 L376 728 L368 715 L359 704 L350 692 L342 680 L337 667 L333 654 L331 640 L328 626 L325 611 L322 595 L322 579 L328 564 L342 552 L363 545 L389 543 L417 547 L441 552 L460 556 L472 555 L481 546 L490 529 L502 508 L520 488 L542 473 L566 468 L589 472 L607 485 L620 502 L630 518 L640 531 L655 540 L674 546 L697 552 L719 561 L735 574 L740 590 L733 609 L716 626Z%22/%3E%3Cpath d=%22M730 640 L706 654 L693 666 L693 679 L702 696 L714 717 L722 740 L720 761 L705 777 L680 784 L649 783 L619 778 L594 772 L574 771 L557 778 L540 794 L520 813 L494 832 L465 845 L435 849 L407 842 L385 826 L370 806 L360 785 L351 765 L343 748 L332 733 L321 719 L309 705 L299 690 L293 673 L288 657 L285 640 L281 623 L277 604 L274 585 L275 565 L284 546 L302 532 L329 524 L362 523 L395 527 L424 534 L446 537 L460 534 L471 520 L482 498 L498 471 L520 446 L548 429 L578 424 L605 432 L627 449 L643 470 L655 490 L669 506 L687 516 L712 523 L741 531 L768 542 L786 558 L790 579 L779 602 L757 623Z%22/%3E%3Cpath d=%22M764 640 L738 656 L725 670 L728 687 L740 708 L756 733 L764 761 L760 786 L740 803 L709 811 L673 809 L637 802 L608 797 L584 797 L565 808 L545 828 L520 852 L489 874 L453 888 L417 891 L385 881 L361 861 L343 836 L331 810 L321 787 L310 767 L297 750 L283 734 L269 717 L257 699 L249 680 L243 660 L239 640 L234 619 L229 597 L226 574 L228 550 L240 529 L263 513 L296 504 L336 503 L375 509 L408 516 L432 518 L448 511 L460 493 L473 464 L492 432 L520 403 L554 384 L590 381 L622 392 L647 413 L665 439 L680 463 L697 480 L720 492 L751 500 L785 509 L816 523 L835 543 L838 569 L823 595 L795 620Z%22/%3E%3Cpath d=%22M796 640 L769 658 L758 675 L763 695 L780 720 L798 750 L807 782 L800 810 L776 829 L738 837 L695 834 L655 827 L621 821 L596 825 L573 839 L550 864 L520 892 L483 917 L442 932 L400 933 L364 919 L336 895 L317 865 L304 835 L292 809 L279 787 L263 767 L245 749 L228 730 L214 709 L204 686 L198 664 L192 640 L186 616 L181 590 L178 563 L182 536 L197 512 L226 494 L265 485 L311 485 L355 491 L392 498 L418 498 L435 487 L448 463 L463 428 L487 390 L520 358 L560 338 L601 337 L638 352 L666 378 L687 409 L705 435 L725 455 L754 467 L790 476 L829 487 L864 504 L884 528 L884 558 L864 589 L831 617Z%22/%3E%3Cpath d=%22M826 640 L799 660 L790 680 L800 703 L821 732 L842 768 L851 804 L841 835 L810 855 L766 862 L717 859 L672 851 L635 846 L607 852 L582 872 L555 901 L520 934 L477 962 L430 976 L383 974 L343 957 L313 927 L292 893 L277 859 L263 830 L247 806 L228 784 L207 764 L188 742 L172 718 L160 693 L152 667 L146 640 L139 612 L132 583 L130 552 L136 522 L155 496 L189 476 L236 467 L287 468 L336 474 L376 480 L403 478 L421 462 L435 432 L453 390 L481 347 L520 311 L566 292 L613 293 L654 313 L685 344 L708 379 L729 408 L754 429 L787 442 L829 452 L874 465 L911 485 L931 514 L928 548 L903 584 L865 615Z%22/%3E%3Cpath d=%22M856 640 L829 663 L823 685 L839 712 L864 746 L888 786 L896 826 L881 860 L845 881 L794 887 L739 883 L689 874 L650 872 L619 881 L591 905 L560 940 L520 977 L471 1007 L418 1021 L366 1016 L322 993 L290 959 L268 920 L251 883 L235 851 L217 824 L194 801 L170 779 L147 754 L129 728 L116 700 L107 670 L99 640 L91 609 L84 576 L82 542 L91 508 L115 479 L155 459 L207 450 L265 451 L318 457 L360 462 L388 457 L406 435 L421 398 L442 350 L475 301 L520 263 L573 245 L625 250 L670 274 L704 311 L729 350 L753 382 L782 404 L821 417 L869 428 L918 443 L957 467 L977 500 L970 539 L940 578 L897 612Z%22/%3E%3Cpath d=%22M884 640 L859 665 L858 690 L879 721 L909 759 L934 804 L941 848 L922 884 L879 906 L821 911 L760 906 L706 898 L664 898 L631 911 L601 941 L565 981 L520 1022 L465 1053 L406 1066 L349 1057 L302 1029 L268 989 L244 946 L226 905 L208 871 L186 843 L160 818 L132 794 L106 767 L86 738 L71 706 L61 674 L52 640 L43 605 L35 569 L34 531 L46 495 L75 464 L121 443 L180 433 L243 435 L300 441 L343 444 L371 434 L390 407 L406 362 L431 307 L469 254 L520 214 L579 197 L636 207 L685 237 L722 279 L750 322 L776 356 L810 379 L854 392 L908 404 L962 421 L1003 449 L1021 486 L1010 530 L975 573 L927 610Z%22/%3E%3Cpath d=%22M912 640 L889 667 L894 695 L920 730 L956 774 L983 823 L987 871 L962 909 L912 930 L847 935 L781 929 L723 922 L679 924 L644 943 L611 978 L571 1024 L520 1068 L459 1100 L394 1110 L333 1097 L283 1064 L247 1018 L222 970 L202 927 L181 891 L156 861 L126 835 L94 809 L65 780 L43 747 L26 713 L15 677 L4 640 L-6 602 L-13 561 L-13 520 L3 481 L37 449 L89 427 L155 418 L222 419 L282 425 L326 425 L354 410 L372 376 L391 324 L419 262 L462 204 L520 164 L585 150 L648 164 L700 201 L739 248 L769 295 L799 330 L838 353 L888 367 L948 380 L1006 400 L1048 431 L1063 473 L1047 521 L1007 568 L956 608Z%22/%3E%3Cpath d=%22M1222 520 L1224 523 L1226 527 L1228 531 L1228 535 L1226 538 L1221 540 L1214 541 L1206 539 L1199 537 L1194 536 L1191 535 L1189 536 L1188 540 L1187 546 L1184 552 L1180 557 L1175 560 L1169 561 L1164 558 L1161 554 L1159 549 L1158 545 L1157 540 L1157 537 L1155 535 L1153 533 L1150 532 L1147 530 L1145 528 L1143 525 L1142 523 L1141 520 L1140 517 L1139 514 L1138 511 L1138 507 L1139 504 L1142 501 L1145 499 L1149 497 L1153 496 L1157 495 L1161 494 L1164 492 L1168 490 L1172 489 L1176 488 L1180 488 L1184 490 L1188 492 L1190 495 L1193 497 L1195 499 L1198 500 L1201 501 L1206 501 L1210 502 L1214 503 L1218 505 L1220 508 L1221 511 L1221 514 L1221 517Z%22/%3E%3Cpath d=%22M1270 520 L1275 527 L1279 535 L1283 543 L1282 551 L1276 558 L1265 562 L1250 563 L1234 560 L1220 556 L1209 552 L1203 552 L1200 556 L1198 565 L1195 577 L1189 590 L1180 600 L1169 606 L1157 607 L1147 601 L1140 592 L1136 581 L1134 571 L1133 563 L1131 556 L1127 552 L1122 549 L1116 545 L1110 542 L1104 537 L1101 532 L1098 526 L1095 520 L1093 514 L1091 507 L1090 500 L1090 492 L1093 485 L1098 480 L1106 475 L1114 471 L1123 469 L1132 467 L1139 464 L1147 460 L1154 457 L1162 454 L1171 452 L1180 453 L1189 456 L1196 461 L1202 467 L1207 472 L1212 476 L1218 478 L1226 479 L1235 479 L1245 480 L1255 483 L1261 488 L1265 494 L1267 500 L1267 507 L1268 514Z%22/%3E%3Cpath d=%22M1319 520 L1326 531 L1333 543 L1337 555 L1335 568 L1325 577 L1307 583 L1284 583 L1259 579 L1238 573 L1224 568 L1215 569 L1212 577 L1209 592 L1204 611 L1195 631 L1180 646 L1162 654 L1144 653 L1130 643 L1119 628 L1114 612 L1111 596 L1110 584 L1106 575 L1100 569 L1091 564 L1081 559 L1071 553 L1063 546 L1057 538 L1052 529 L1049 520 L1045 510 L1042 500 L1040 489 L1041 477 L1046 467 L1055 458 L1067 451 L1080 446 L1094 442 L1107 439 L1118 434 L1129 429 L1140 423 L1153 419 L1166 417 L1180 418 L1193 423 L1204 431 L1213 440 L1220 448 L1229 453 L1239 455 L1251 456 L1266 456 L1282 458 L1296 463 L1306 470 L1311 480 L1313 490 L1314 500 L1315 510Z%22/%3E%3Cpath d=%22M1369 520 L1379 534 L1388 551 L1392 568 L1388 584 L1372 596 L1347 602 L1315 602 L1283 596 L1256 588 L1238 584 L1228 587 L1224 599 L1221 621 L1214 648 L1200 674 L1180 693 L1156 702 L1132 698 L1113 684 L1100 663 L1093 640 L1090 620 L1087 604 L1082 593 L1072 586 L1059 580 L1045 573 L1032 565 L1021 556 L1013 545 L1006 533 L1001 520 L996 507 L992 492 L990 477 L992 462 L1000 449 L1012 437 L1028 428 L1047 421 L1065 416 L1082 411 L1097 405 L1111 397 L1127 390 L1143 384 L1162 382 L1180 384 L1197 392 L1212 403 L1223 414 L1234 423 L1245 429 L1260 432 L1278 432 L1298 432 L1320 435 L1338 442 L1351 452 L1358 465 L1360 480 L1361 493 L1363 507Z%22/%3E%3Cpath d=%22M1420 520 L1432 538 L1442 559 L1447 580 L1439 599 L1418 614 L1384 621 L1344 620 L1304 612 L1272 603 L1252 599 L1242 605 L1238 624 L1234 653 L1225 687 L1206 719 L1180 741 L1149 750 L1120 743 L1097 723 L1082 695 L1074 667 L1070 642 L1066 623 L1058 611 L1044 602 L1027 596 L1009 588 L992 578 L978 565 L967 551 L959 536 L952 520 L946 503 L941 485 L940 466 L943 447 L953 430 L970 416 L991 405 L1014 397 L1037 390 L1057 384 L1076 376 L1094 366 L1113 357 L1134 350 L1157 347 L1180 351 L1201 361 L1219 374 L1234 388 L1248 399 L1263 405 L1282 407 L1305 407 L1332 408 L1358 412 L1381 421 L1396 434 L1405 451 L1407 469 L1408 486 L1412 503Z%22/%3E%3Cpath d=%22M1471 520 L1485 542 L1497 567 L1500 592 L1489 615 L1461 631 L1419 638 L1370 636 L1324 627 L1288 617 L1266 615 L1256 625 L1253 650 L1248 687 L1236 728 L1213 766 L1180 791 L1143 798 L1109 786 L1082 760 L1065 726 L1056 692 L1051 663 L1045 642 L1034 628 L1016 619 L995 612 L971 603 L950 590 L933 575 L921 558 L911 540 L903 520 L895 499 L890 477 L889 455 L894 432 L907 412 L928 395 L954 383 L982 373 L1009 365 L1033 357 L1055 347 L1077 335 L1100 324 L1125 316 L1153 314 L1180 319 L1205 331 L1226 347 L1244 363 L1261 375 L1280 381 L1304 382 L1334 381 L1366 382 L1398 387 L1425 399 L1443 416 L1451 437 L1454 458 L1456 479 L1461 499Z%22/%3E%3Cpath d=%22M1523 520 L1539 546 L1552 575 L1553 604 L1537 630 L1502 647 L1451 654 L1395 650 L1342 640 L1303 631 L1280 631 L1271 647 L1269 679 L1263 724 L1248 773 L1219 815 L1180 841 L1137 845 L1097 828 L1067 795 L1049 755 L1039 715 L1033 683 L1025 660 L1010 646 L988 637 L961 628 L933 618 L908 603 L888 586 L873 565 L862 543 L852 520 L844 495 L838 470 L837 443 L845 417 L862 394 L887 375 L918 360 L950 350 L981 340 L1009 330 L1034 318 L1059 304 L1086 291 L1116 282 L1148 280 L1180 288 L1209 302 L1234 321 L1255 338 L1275 350 L1298 356 L1328 356 L1363 355 L1402 355 L1439 362 L1469 377 L1489 398 L1499 422 L1502 448 L1504 472 L1511 496Z%22/%3E%3Cpath d=%22M1575 520 L1593 550 L1606 583 L1605 616 L1583 644 L1540 663 L1481 669 L1417 664 L1360 653 L1318 645 L1296 648 L1288 670 L1286 710 L1280 763 L1260 819 L1226 865 L1180 891 L1131 892 L1086 869 L1054 829 L1034 781 L1024 737 L1016 701 L1005 678 L986 664 L959 654 L926 646 L893 633 L864 617 L842 596 L825 572 L812 547 L801 520 L791 492 L785 462 L786 431 L796 402 L817 376 L846 355 L882 339 L919 327 L954 316 L985 304 L1013 289 L1042 273 L1073 258 L1107 249 L1144 248 L1180 257 L1213 274 L1241 294 L1265 313 L1289 325 L1317 330 L1352 329 L1394 327 L1439 328 L1481 337 L1515 354 L1536 379 L1546 408 L1549 437 L1552 465 L1560 492Z%22/%3E%3Cpath d=%22M1628 520 L1648 554 L1660 591 L1656 627 L1628 657 L1576 677 L1509 683 L1437 676 L1376 665 L1333 658 L1312 666 L1306 695 L1305 743 L1297 805 L1273 868 L1233 917 L1180 942 L1124 938 L1076 908 L1041 860 L1020 806 L1009 757 L1000 719 L986 695 L962 682 L929 673 L891 663 L853 650 L820 631 L794 607 L775 580 L760 551 L748 520 L738 488 L732 454 L734 420 L747 387 L772 359 L807 335 L848 318 L889 304 L927 292 L961 278 L993 261 L1025 242 L1059 226 L1098 216 L1140 216 L1180 227 L1216 246 L1247 269 L1275 288 L1303 300 L1336 303 L1378 301 L1426 298 L1477 300 L1524 311 L1560 332 L1583 361 L1593 393 L1596 427 L1600 458 L1610 489Z%22/%3E%3Cpath d=%22M1681 520 L1702 558 L1713 599 L1705 638 L1670 670 L1610 690 L1534 695 L1456 688 L1391 677 L1349 672 L1329 685 L1326 722 L1325 780 L1315 850 L1287 918 L1240 969 L1180 992 L1119 982 L1066 944 L1029 889 L1007 829 L995 776 L984 737 L966 713 L937 700 L898 691 L854 682 L810 666 L774 645 L745 618 L725 587 L709 554 L695 520 L684 484 L679 446 L683 408 L699 373 L729 341 L769 316 L814 298 L860 283 L901 268 L938 252 L972 232 L1007 211 L1046 193 L1090 184 L1135 185 L1180 198 L1220 219 L1254 243 L1285 263 L1318 274 L1356 276 L1404 272 L1459 268 L1516 271 L1568 284 L1606 309 L1629 342 L1639 379 L1643 416 L1648 451 L1661 485Z%22/%3E%3Cpath d=%22M956 980 L958 987 L954 994 L947 999 L937 1004 L928 1007 L921 1010 L917 1015 L915 1021 L913 1028 L910 1035 L904 1041 L896 1045 L886 1044 L876 1041 L867 1036 L860 1031 L854 1027 L848 1025 L842 1025 L834 1026 L826 1027 L817 1027 L809 1026 L801 1023 L795 1020 L789 1015 L783 1010 L777 1005 L772 1000 L768 994 L767 987 L769 980 L775 974 L783 969 L791 965 L798 961 L802 957 L803 952 L801 944 L800 935 L800 926 L804 918 L812 914 L823 913 L834 916 L845 922 L853 929 L860 933 L866 935 L873 933 L881 930 L890 926 L900 924 L909 926 L916 930 L919 936 L919 944 L919 951 L921 956 L925 960 L932 964 L941 968 L950 973Z%22/%3E%3Cpath d=%22M1012 980 L1014 991 L1007 1002 L994 1010 L979 1017 L965 1022 L955 1027 L949 1034 L946 1044 L944 1055 L938 1067 L929 1076 L916 1080 L901 1080 L885 1074 L871 1066 L860 1058 L850 1053 L841 1050 L831 1051 L819 1053 L806 1055 L792 1055 L779 1053 L767 1049 L757 1043 L747 1036 L738 1028 L730 1020 L722 1011 L716 1001 L715 991 L719 980 L729 970 L741 963 L754 956 L764 950 L769 944 L769 935 L766 923 L764 909 L765 894 L772 883 L785 876 L802 877 L820 883 L836 892 L850 901 L860 908 L869 909 L880 906 L893 900 L908 894 L924 892 L937 894 L947 902 L951 912 L952 924 L953 934 L955 942 L962 949 L974 954 L989 961 L1003 970Z%22/%3E%3Cpath d=%22M1069 980 L1069 995 L1059 1009 L1041 1021 L1020 1029 L1002 1036 L989 1044 L982 1054 L979 1068 L975 1084 L967 1099 L954 1110 L936 1116 L915 1114 L894 1106 L875 1095 L860 1085 L847 1078 L834 1076 L820 1078 L803 1081 L785 1084 L766 1084 L748 1081 L732 1075 L718 1066 L706 1056 L693 1046 L681 1035 L671 1022 L665 1009 L664 994 L671 980 L684 967 L701 957 L717 948 L729 940 L735 930 L734 917 L729 901 L727 881 L729 862 L740 847 L759 840 L782 841 L807 850 L829 863 L846 875 L860 883 L873 883 L887 878 L905 869 L926 862 L947 859 L966 863 L978 874 L984 888 L985 904 L986 918 L990 928 L1001 937 L1019 944 L1039 954 L1057 966Z%22/%3E%3Cpath d=%22M1125 980 L1124 999 L1109 1017 L1085 1031 L1059 1041 L1037 1050 L1023 1060 L1015 1074 L1011 1092 L1006 1112 L996 1131 L979 1145 L955 1150 L928 1147 L902 1136 L879 1123 L860 1110 L844 1103 L827 1102 L809 1105 L787 1110 L763 1114 L739 1114 L716 1110 L696 1101 L679 1090 L663 1077 L648 1064 L633 1050 L621 1034 L613 1016 L614 998 L623 980 L641 964 L662 951 L682 940 L695 929 L700 917 L697 900 L692 878 L688 853 L693 829 L708 812 L733 804 L763 807 L794 819 L821 836 L843 850 L860 858 L876 857 L895 849 L918 837 L945 828 L972 825 L994 832 L1008 846 L1015 865 L1017 885 L1019 901 L1026 914 L1041 924 L1065 934 L1091 946 L1113 962Z%22/%3E%3Cpath d=%22M1182 980 L1178 1003 L1158 1024 L1129 1040 L1098 1053 L1072 1064 L1056 1077 L1048 1095 L1045 1117 L1039 1141 L1025 1163 L1003 1179 L974 1184 L941 1178 L910 1165 L882 1149 L860 1135 L840 1128 L820 1128 L797 1133 L770 1140 L741 1145 L711 1145 L684 1139 L660 1128 L639 1114 L620 1099 L602 1082 L585 1065 L570 1045 L563 1024 L565 1002 L578 980 L599 961 L624 945 L647 932 L661 919 L665 903 L660 881 L652 854 L649 824 L656 796 L677 777 L708 769 L745 775 L782 790 L814 810 L840 826 L860 834 L880 831 L903 819 L932 804 L964 793 L996 791 L1022 800 L1039 819 L1046 842 L1048 865 L1052 885 L1062 900 L1083 912 L1112 923 L1144 938 L1170 957Z%22/%3E%3Cpath d=%22M1239 980 L1231 1007 L1206 1031 L1171 1050 L1135 1064 L1107 1078 L1090 1094 L1082 1115 L1078 1142 L1071 1170 L1055 1196 L1028 1212 L992 1216 L954 1209 L917 1193 L886 1174 L860 1160 L837 1153 L813 1155 L785 1163 L753 1171 L718 1177 L683 1176 L651 1169 L623 1155 L599 1139 L577 1120 L556 1100 L536 1079 L520 1056 L513 1031 L517 1005 L533 980 L559 958 L587 940 L612 924 L626 908 L628 888 L621 862 L612 829 L609 794 L620 763 L645 742 L683 735 L728 744 L771 763 L808 786 L836 803 L860 809 L883 803 L912 788 L946 770 L984 758 L1021 757 L1050 769 L1069 791 L1077 819 L1080 846 L1085 869 L1099 885 L1126 898 L1161 912 L1198 930 L1227 953Z%22/%3E%3C/g%3E%3C/svg%3E"),
    linear-gradient(rgba(221,231,228,.035) 1px, transparent 1px),
    linear-gradient(90deg, rgba(221,231,228,.035) 1px, transparent 1px);
  background-size: 100% auto, 48px 48px, 48px 48px;
  background-position: center bottom, 0 0, 0 0;
  background-repeat: no-repeat, repeat, repeat;
  opacity: 1;
  -webkit-mask-image: linear-gradient(180deg, transparent 0, transparent 34%, #000 56%, #000 74%, rgba(0,0,0,.25) 90%);
          mask-image: linear-gradient(180deg, transparent 0, transparent 34%, #000 56%, #000 74%, rgba(0,0,0,.25) 90%);
}
html body .elementor-element-oig-footer-root::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  height: 4px;
  z-index: 2;
  background: linear-gradient(90deg, #E07A2F 0 34%, #2E7D5B 34% 67%, #9FB0C8 67% 100%);
}

/* ---- the index board ---- */
html body .close .close__nav::before,
html body .close .close__nav::after { display: none; }
html body .close .close__nav {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 0;
  justify-content: stretch;
  align-items: stretch;
  padding-top: 0;
  padding-bottom: 0;
  border-top: 1px solid rgba(221,231,228,.16);
  border-left: 1px solid rgba(221,231,228,.1);
}
html body .close .close__nav a {
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  justify-content: flex-end;
  gap: 8px;
  min-height: 112px;
  padding: 22px 56px 22px 22px;
  border-right: 1px solid rgba(221,231,228,.1);
  border-bottom: 1px solid rgba(221,231,228,.1);
  font-size: clamp(22px, 2vw, 32px);
  line-height: 1;
  text-align: left;
  color: #fff;
  text-decoration: none;
  transition: background-color .25s, color .25s;
}
html body .close .close__nav a i {
  font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace;
  font-style: normal;
  font-size: 13px;
  font-weight: 700;
  letter-spacing: .16em;
  line-height: 1;
  color: #F2B183;
  transform: none;
  margin: 0;
}
html body .close .close__nav a::after {
  content: "\2197";
  position: absolute;
  top: 20px;
  right: 20px;
  left: auto;
  bottom: auto;
  width: auto;
  height: auto;
  background: none;
  font: 400 22px/1 system-ui, sans-serif;
  color: rgba(221,231,228,.35);
  transform: none;
  transition: transform .3s cubic-bezier(.22,1,.36,1), color .25s;
}
html body .close .close__nav a::before {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  bottom: -1px;
  height: 3px;
  background: #3FBF84;
  transform: scaleX(0);
  transform-origin: left;
  transition: transform .4s cubic-bezier(.22,1,.36,1);
}
html body .close .close__nav a:hover,
html body .close .close__nav a:focus-visible {
  background-color: rgba(63,191,132,.09);
  color: #fff;
}
html body .close .close__nav a:hover::before,
html body .close .close__nav a:focus-visible::before { transform: scaleX(1); }
html body .close .close__nav a:hover::after,
html body .close .close__nav a:focus-visible::after { color: #3FBF84; transform: translate(4px, -4px); }
html body .close .close__nav a:hover i { color: #3FBF84; }
html body .close .close__nav a:focus-visible { outline: 2px solid #F2B183; outline-offset: -2px; }

/* ---- meta row + legal ---- */
html body .close .close__meta a { font-size: 14px; color: rgba(221,231,228,.82); }
html body .close .close__meta a:hover { color: #fff; }
html body .close .close__meta > span { font-size: 13px; }
html body .close .close__legal.pfh-nnc span { font-size: 13px !important; }
html body .close .close__legal {
  max-width: min(100%, 920px);
  margin-left: auto;
  margin-right: auto;
  font-size: 14px !important;
  line-height: 1.6;
  color: rgba(221,231,228,.78);
}
html body .close .close__legal b { color: #fff; }

/* ---- the wordmark: sized to the board, fades into the ground ---- */
html body .close .close__mark {
  font-size: clamp(50px, 10.9vw, 176px);
  letter-spacing: -.035em;
  text-shadow: none;
}
@supports ((-webkit-background-clip: text) or (background-clip: text)) {
  html body .close .close__mark {
    background:
      linear-gradient(100deg, transparent 38%, rgba(159,240,198,.95) 48%, transparent 58%) 160% 0 / 250% 100% no-repeat,
      linear-gradient(180deg, #F3F6FA 0%, #E3EAF2 48%, rgba(227,234,242,.2) 100%);
    -webkit-background-clip: text;
            background-clip: text;
    color: transparent;
    -webkit-text-fill-color: transparent;
  }
  @media (prefers-reduced-motion: no-preference) {
    @supports (animation-timeline: view()) {
      html body .close .close__mark {
        animation: pfhCfSheen linear both;
        animation-timeline: view();
        animation-range: entry 20% cover 60%;
      }
    }
  }
}
@keyframes pfhCfSheen {
  from { background-position: 160% 0, 0 0; }
  to { background-position: -60% 0, 0 0; }
}

@media (max-width: 1100px) {
  html body .close .close__nav { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
@media (max-width: 767px) {
  html body .close .close__nav { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  html body .close .close__nav a { min-height: 84px; padding: 16px 34px 16px 14px; font-size: 19px; gap: 7px; }
  html body .close .close__nav a::after { top: 14px; right: 12px; font-size: 17px; }
  html body .close .close__nav a i { font-size: 13px; }
  html body .close .close__meta a { font-size: 14px; }
}

/* ==========================================================================
   TICKER v2 - every page (header 82 nav-ticker) - 2026-10-06, redesign night
   with the "We're open" bar's GATE SIGNAL pass. "/" separators become small
   orange diamonds, the live dot pulses, a signal line runs under the ticker.
   Motion off under prefers-reduced-motion.
   ========================================================================== */
html body .ticker .ticker__sep {
  font-size: 0 !important;
  display: inline-block;
  width: 6px;
  height: 6px;
  background: #E07A2F;
  transform: rotate(45deg);
  vertical-align: middle;
  opacity: .9;
}
html body .ticker .ticker__live i {
  box-shadow: 0 0 0 3px rgba(63,191,132,.25), 0 0 8px #3FBF84;
}
html body .ticker .ticker__motto { color: #F2B183; }
@media (prefers-reduced-motion: no-preference) {
  html body .ticker .ticker__live i { animation: pfhTkLamp 2.4s ease-in-out infinite; }
}
@keyframes pfhTkLamp {
  0%, 100% { box-shadow: 0 0 0 3px rgba(63,191,132,.25), 0 0 8px #3FBF84; }
  50% { box-shadow: 0 0 0 6px rgba(63,191,132,0), 0 0 3px #3FBF84; }
}

/* ==== HEADER v2 "THE GATE RAIL" (2026-10-06, redo at high effort) - header 82, all pages. Appended after ticker v2. ==== */
/* 1. the rail: hairline + gauge ticks along the bottom edge of the header */
html body .nav#nav{border-bottom:0!important}
html body .nav#nav::after{content:"";position:absolute;left:0;right:0;bottom:0;height:9px;pointer-events:none;
  background:
   linear-gradient(90deg,var(--orange) 0 72px,transparent 72px) left bottom/100% 2px no-repeat,
   linear-gradient(#14233F,#14233F) left bottom/100% 1px no-repeat,
   repeating-linear-gradient(90deg,rgb(20 35 63 / .34) 0 1px,transparent 1px 60px) left bottom/100% 9px no-repeat,
   repeating-linear-gradient(90deg,rgb(20 35 63 / .2) 0 1px,transparent 1px 12px) left bottom/100% 5px no-repeat}
html body .nav#nav.is-condensed{background:rgb(251 248 243 / .94);-webkit-backdrop-filter:saturate(1.3) blur(10px);backdrop-filter:saturate(1.3) blur(10px);box-shadow:0 14px 30px -24px rgb(11 23 41 / .55)}

/* 2. brand: framed gate plate + hairline divider */
html body .nav .nav__brand{position:relative;gap:13px;padding-right:22px}
html body .nav .nav__brand::after{content:"";position:absolute;right:0;top:4px;bottom:4px;width:1px;background:linear-gradient(transparent,rgb(20 35 63 / .28) 20%,rgb(20 35 63 / .28) 80%,transparent)}
html body .nav .nav__mark{padding:4px;border:1px solid rgb(20 35 63 / .18);border-radius:10px;background:#fff;box-shadow:0 6px 16px -10px rgb(11 23 41 / .5),inset 0 -2px 0 rgb(224 122 47 / .55);box-sizing:content-box;height:40px}
html body .nav.is-condensed .nav__mark{height:30px}
html body .nav .nav__brand::before{content:"";position:absolute;left:44px;top:1px;width:9px;height:9px;border-radius:50%;background:#3FBF84;border:2px solid #FBF8F3;box-shadow:0 0 0 3px rgb(63 191 132 / .22);z-index:1}
html body .nav.is-condensed .nav__brand::before{left:34px;top:3px}
@media (prefers-reduced-motion:no-preference){html body .nav .nav__brand::before{animation:pfhHdrLamp 2.6s ease-in-out infinite}}
@keyframes pfhHdrLamp{0%,100%{box-shadow:0 0 0 3px rgb(63 191 132 / .22)}50%{box-shadow:0 0 0 6px rgb(63 191 132 / 0)}}
html body .nav .nav__names b{color:#14233F}
html body .nav .nav__names span{color:#A9501A;display:inline-flex;align-items:center;gap:6px}
html body .nav .nav__names span::before{content:"";width:6px;height:6px;flex:none;background:#E07A2F;transform:rotate(45deg)}

@media (min-width:1081px){
  /* 3. links: tighter pads buy room; hover = gate bar with a diamond head */
  html body .nav .nav__links{gap:4px}
  html body .nav .nav__links .nav__link{padding:16px 11px}
  html body .nav .nav__links>.nav__link::after,
  html body .nav .nav__links>.nav__case>.nav__case-t::after{left:11px;right:11px;width:auto;bottom:8px;height:3px;background:#E07A2F;transform:scaleX(0);transform-origin:left;transition:transform 260ms var(--ease-enter)}
  html body .nav .nav__links>.nav__link:hover::after,
  html body .nav .nav__links>.nav__link:focus-visible::after,
  html body .nav .nav__links>.nav__case:hover>.nav__case-t::after,
  html body .nav .nav__links>.nav__case:focus-within>.nav__case-t::after{transform:scaleX(1)}
  html body .nav .nav__links>.nav__link[aria-current="page"]::after{transform:scaleX(1);background:#2E7D5B}
  /* contact keeps its dot + standing underline */
  html body .nav .nav__links>.nav__link--contact::after{left:24px;transform:scaleX(1)}
  /* dropdown triggers: chevron that flips when open */
  html body .nav .nav__links .nav__case-t{padding-right:25px;background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' fill='none' stroke='%23E07A2F' stroke-width='1.8'/%3E%3C/svg%3E") no-repeat right 10px center/9px 6px}
  html body .nav .nav__case:hover>.nav__case-t,
  html body .nav .nav__case:focus-within>.nav__case-t{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 6'%3E%3Cpath d='M1 5l4-4 4 4' fill='none' stroke='%232E7D5B' stroke-width='1.8'/%3E%3C/svg%3E")}
  html body .nav .nav__links>.nav__case>.nav__case-t::after{right:25px}

  /* 4. dropdowns: navy dispatch panels, numbered rows */
  html body .nav .nav__links .nav__case-m{left:0;top:calc(100% - 4px);min-width:262px;padding:8px 0 10px;background:#0B1729;border:0;border-top:3px solid #E07A2F;border-radius:0 0 14px 14px;box-shadow:0 28px 50px -22px rgb(11 23 41 / .7);counter-reset:pfhnc}
  html body .nav .nav__links .nav__case-m::before{content:"";position:absolute;left:22px;top:-9px;border:6px solid transparent;border-bottom-color:#E07A2F}
  html body .nav .nav__links .nav__case-m .nav__case-i{display:flex;align-items:center;gap:14px;padding:12px 20px;margin:0 8px;border-radius:8px;color:#E9EEF5;background:none;white-space:nowrap}
  html body .nav .nav__links .nav__case-m .nav__case-i::before{counter-increment:pfhnc;content:counter(pfhnc,decimal-leading-zero);font-family:var(--font-mono);font-size:11px;letter-spacing:.06em;color:#F2B183;flex:none}
  html body .nav .nav__links .nav__case-m .nav__case-i::after{content:"\2192";position:static;width:auto;height:auto;background:none;margin-left:auto;padding-left:16px;color:#3FBF84;opacity:0;transform:translateX(-6px);transition:opacity 200ms,transform 200ms var(--ease-enter)}
  html body .nav .nav__links .nav__case-m .nav__case-i:hover,
  html body .nav .nav__links .nav__case-m .nav__case-i:focus-visible{color:#fff;background:rgb(255 255 255 / .07)}
  html body .nav .nav__links .nav__case-m .nav__case-i:hover::after,
  html body .nav .nav__links .nav__case-m .nav__case-i:focus-visible::after{opacity:1;transform:none}

  /* 5. CTAs: Apply = navy plate with an orange edge */
  html body .nav .nav__cta .btn--outline{background:#14233F;color:#fff;border-color:#14233F;box-shadow:inset 0 -3px 0 #E07A2F,0 10px 22px -14px rgb(11 23 41 / .9)}
  html body .nav .nav__cta .btn--outline:hover,
  html body .nav .nav__cta .btn--outline:focus-visible{background:#0B1729;color:#fff;border-color:#0B1729;transform:translateY(-2px)}
}
/* the 1081-1240 squeeze (was 16px of page overflow at 1084) */
@media (min-width:1081px) and (max-width:1240px){
  html body .nav .nav__brand{padding-right:16px}
  html body .nav .nav__links .nav__link{padding:16px 8px}
  html body .nav .nav__links .nav__case-t{padding-right:21px;background-position:right 7px center}
  html body .nav .nav__links>.nav__link::after{left:8px;right:8px}
  html body .nav .nav__links>.nav__case>.nav__case-t::after{left:8px;right:21px}
  html body .nav .nav__links>.nav__link--contact::after{left:21px}
  html body .nav .nav__cta .btn{padding:11px 13px}
}

/* 6. burger + phone/tablet drawer */
@media (max-width:1080px){
  html body .nav .nav__burger{width:46px;height:46px;padding:0;display:grid;place-content:center;gap:5px;background:#14233F;border-radius:12px;box-shadow:inset 0 -3px 0 #E07A2F}
  html body .nav .nav__burger span{width:20px;height:2px;margin:0;background:#fff;transition:transform 240ms var(--ease-enter),opacity 200ms}
  html body .nav .nav__burger[aria-expanded="true"] span:nth-child(1){transform:translateY(7px) rotate(45deg)}
  html body .nav .nav__burger[aria-expanded="true"] span:nth-child(2){opacity:0}
  html body .nav .nav__burger[aria-expanded="true"] span:nth-child(3){transform:translateY(-7px) rotate(-45deg)}
  html body .nav .nav__links.is-open{background:#0B1729;border:0;border-top:3px solid #E07A2F;padding:6px var(--outer) 22px;max-height:calc(100dvh - 110px);overflow-y:auto;box-shadow:0 30px 50px -20px rgb(11 23 41 / .7)}
  html body .nav .nav__links.is-open .nav__link,
  html body .nav .nav__links.is-open .nav__case-m .nav__case-i{color:#E9EEF5;border-bottom:1px solid rgb(255 255 255 / .1);padding:14px 2px;font-size:14px}
  html body .nav .nav__links.is-open .nav__link:hover,
  html body .nav .nav__links.is-open .nav__case-m .nav__case-i:hover{color:#fff;background:none}
  /* groups separated by an orange rule (the trigger buttons stay hidden: no dead tab stops) */
  html body .nav .nav__links.is-open .nav__case{margin-top:12px;padding-top:6px;border-top:2px solid rgb(242 177 131 / .55)}
  html body .nav .nav__links.is-open .nav__case + .nav__link{margin-top:12px;border-top:2px solid rgb(242 177 131 / .55)}
  html body .nav .nav__links.is-open .nav__link--contact{color:#F2B183}
  html body .nav .nav__links.is-open .nav__menu-donate{margin-top:22px;background:linear-gradient(#45CE8D,#35AE76);color:#14233F;border-color:#2E9E68;box-shadow:0 1px 0 rgb(255 255 255 / .45) inset}
  html body .nav .nav__brand{padding-right:0}
  html body .nav .nav__brand::after{display:none}
  html body .nav .nav__links.is-open{counter-reset:pfhdr}
  html body .nav .nav__links.is-open .nav__link:not(.nav__case-t),
  html body .nav .nav__links.is-open .nav__case-m .nav__case-i{display:flex;align-items:center;gap:14px}
  html body .nav .nav__links.is-open .nav__link:not(.nav__case-t)::before{counter-increment:pfhdr;content:counter(pfhdr,decimal-leading-zero);width:auto;height:auto;border-radius:0;background:none;box-shadow:none;font-family:var(--font-mono);font-size:11px;letter-spacing:.06em;color:#F2B183;flex:none}
  html body .nav .nav__links.is-open .nav__link:not(.nav__case-t)::after{content:"\2192";display:block;position:static;width:auto;height:auto;background:none;margin-left:auto;color:#3FBF84;transform:none;opacity:1;box-shadow:none}
}
@media (prefers-reduced-motion:reduce){
  html body .nav .nav__links .nav__link::after,html body .nav .nav__burger span,html body .nav .nav__case-i::after{transition:none!important}
}
html body .nav .nav__links .nav__link:focus-visible,html body .nav .nav__brand:focus-visible,html body .nav .nav__cta .btn:focus-visible,html body .nav .nav__burger:focus-visible{outline:3px solid #E07A2F;outline-offset:3px;border-radius:8px}

/* ==========================================================================
   CLOSE-CENTER 1 - 8 Oct 2026. Marco: "look how this looks out of place...
   align 'Every case seen...' in between the middle of the footer and the
   flexbox above". The CTA widget that used to sit under the claim is gone, so
   the claim sat 3px off the navy (highlighter clipped). Equal space above
   (card -> eyebrow) and below (highlighter -> navy). Rollback: option
   oig_backup_closeband_pre_center1_20261008.
   ========================================================================== */
html body footer .close .close__claim{margin-top:clamp(44px,4vw,64px)}
html body footer .elementor-element-close-claim{padding-bottom:calc(clamp(44px,4vw,64px) + 76px)}
@media (max-width:767px){
html body footer .close .close__claim{margin-top:48px}
html body footer .elementor-element-close-claim{padding-bottom:104px}
}

/* FOOT-TABS COMPACT 1 - 8 Oct 2026. Marco: 'make the footer tabs smaller.. they take up alot of room'. Boxes only (padding, min-height, top gap); label text size unchanged. Rollback: option oig_backup_closeband_pre_tabs1_20261008. */
html body footer .close .close__nav{margin-top:clamp(36px,3.4vw,52px)}
html body footer .close .close__nav a{min-height:0!important;padding:14px 44px 14px 18px!important}
@media (max-width:767px){html body footer .close .close__nav{margin-top:28px}html body footer .close .close__nav a{padding:12px 36px 12px 14px!important}}

/* FOOT-TABS ONE-LINE 1 - 8 Oct 2026. Marco: 'make the two-line labels fit on one line'. The arrow sits on the number row, so the 44px right padding was dead space: 18px gives the labels room at full 32px on desktop (>=1440). Labels never wrap at >=768; between 768 and 1439 the label scales with the screen so the longest (Vallejo food & shelter) fits. Phones keep wrapping (2 columns too narrow). Rollback: option oig_backup_closeband_pre_oneline1_20261008. */
@media (min-width:768px){html body footer .close .close__nav a{padding-right:18px!important;white-space:nowrap}}
@media (min-width:1101px) and (max-width:1439px){html body footer .close .close__nav a{font-size:min(32px,2.25vw)}}
@media (min-width:768px) and (max-width:1100px){html body footer .close .close__nav a{font-size:min(32px,2.95vw)}}

/* FOOT-PHONE COMPACT 1 - 8 Oct 2026. Marco: 'make the footer smaller on the phone too'. Phone only (<=767): spacing + box padding cut, text sizes unchanged; wordmark side padding 18->6 and capped at 12.3vw so it stops running 18px off-screen. Rollback: option oig_backup_closeband_pre_phone1_20261008. */
@media (max-width:767px){html body footer .close .close__claim{margin-top:32px!important}html body footer .elementor-element-close-claim{padding-bottom:64px!important}html body footer .close .close__nav{margin-top:16px!important}html body footer .close .close__nav a{padding:9px 28px 9px 12px!important}html body footer .close .close__meta{margin-top:14px!important}html body footer .close .close__mark{margin-top:24px!important}html body footer .close .close__legal{margin-top:20px!important}html body footer .close .close__legal.pfh-vft{margin-top:10px!important}html body footer .close .close__legal.pfh-nnc{margin-top:8px!important}html body footer .elementor-element-oig-footer-root{padding-bottom:20px!important}}@media (max-width:767px){html body footer .close .close__mark{padding-left:6px!important;padding-right:6px!important;font-size:min(50px,12.3vw)!important}}

/* HEAD-PHONE COMPACT 1 - 8 Oct 2026. Marco: 'make the header smaller on the phone too'. Phone only (<=767): open bar padding + button and 'What is GATEHOUSE?' on one row; logo bar 98 -> 68px. Text and logo size unchanged. Rollback: option oig_backup_closeband_pre_headphone1_20261008. */
@media (max-width:767px){html body #pfh-obar .pfh-obar__in{padding:7px 40px 8px 14px!important;row-gap:6px!important;gap:6px!important}html body #pfh-obar .pfh-obar__acts{flex-direction:row!important;flex-wrap:wrap!important;align-items:center!important;gap:6px 14px!important}html body #pfh-obar .pfh-obar__cta{padding:6px 12px!important}html body .oig-header .nav__in{height:68px!important}}

/* HEAD-TABLET COMPACT 1 - 8 Oct 2026. Marco: 'make the header smaller on the tablet too'. 768-1100px only: open bar top/bottom padding cut, logo bar 98 -> 68px (820 was already 68). Text and logo unchanged. Rollback: option oig_backup_closeband_pre_headtab1_20261008. */
@media (min-width:768px) and (max-width:1100px){html body #pfh-obar .pfh-obar__in{padding-top:6px!important;padding-bottom:7px!important;row-gap:4px!important}html body .oig-header .nav__in{height:68px!important}}

/* FOOT-TABLET COMPACT 1 - 8 Oct 2026. Marco: 'make the footer smaller on the tablet too'. 768-1100px only: claim band 28/104 (still balanced above vs below), nav gap 22, menu cells 10px top/bottom, meta 14, wordmark gap 26, legal gap 22, bottom 20. Text unchanged. Rollback: option oig_backup_closeband_pre_foottab1_20261008. */
@media (min-width:768px) and (max-width:1100px){html body footer .close .close__claim{margin-top:28px!important}html body footer .elementor-element-close-claim{padding-bottom:104px!important}html body footer .close .close__nav{margin-top:22px!important}html body footer .close .close__nav a{padding-top:10px!important;padding-bottom:10px!important}html body footer .close .close__meta{margin-top:14px!important}html body footer .close .close__mark{margin-top:26px!important}html body footer .close .close__legal{margin-top:22px!important}html body footer .elementor-element-oig-footer-root{padding-bottom:20px!important}}

/* OBAR-TABLET COMPACT 1 - 8 Oct 2026. Marco: 'make the open bar smaller on the tablet too'. 768-1100px only: the OPEN NOW pill moves from its own row onto the button row (message first, then pill + Register + What is GATEHOUSE?). Nothing hidden; bar 129 -> 95px at 820. Rollback: option oig_backup_closeband_pre_obartab1_20261008. */
@media (min-width:768px) and (max-width:1100px){html body #pfh-obar .pfh-obar__in{flex-wrap:wrap!important;align-items:center!important;column-gap:14px!important}html body #pfh-obar .pfh-obar__msg{order:1!important;flex:1 1 100%!important}html body #pfh-obar .pfh-obar__tag{order:2!important}html body #pfh-obar .pfh-obar__acts{order:3!important}}

/* FOOT-PHONE COMPACT 2 - 8 Oct 2026. Marco asked again: 'make the footer smaller on the phone too'. Phone only (<=767), same selectors as COMPACT 1 so it wins by order: claim band 12px top (56/56 balanced, was 76/56), nav gap 12, menu cells 6px top/bottom, meta 10, wordmark gap 14, legal gaps 12/8/6, verified-by button 6px, bottom 14. Text unchanged. Rollback: option oig_backup_closeband_pre_phone2_20261008. */
@media (max-width:767px){html body footer .close .close__claim{margin-top:12px!important}html body footer .close .close__nav{margin-top:12px!important}html body footer .close .close__nav a{padding:6px 26px 6px 12px!important;min-height:0!important}html body footer .close .close__meta{margin-top:10px!important}html body footer .close .close__mark{margin-top:14px!important}html body footer .close .close__legal{margin-top:12px!important}html body footer .close .close__legal.pfh-vft{margin-top:8px!important}html body footer .close .close__legal.pfh-vft .pfh-vft__a{padding-top:6px!important;padding-bottom:6px!important}html body footer .close .close__legal.pfh-nnc{margin-top:6px!important}html body footer .elementor-element-oig-footer-root{padding-bottom:14px!important}}

/* OBAR-PHONE COMPACT 1 - 8 Oct 2026. Marco: 'make the open bar smaller on the phone too'. <=767 only, same selectors as HEAD-PHONE COMPACT 1 so it wins by order: bar padding 5/36/5/14, gaps 4, Register button 4px top/bottom, close X 4px from top. Text unchanged. Bar 126 -> 115px at 390. Rollback: option oig_backup_closeband_pre_obarphone1_20261008. */
@media (max-width:767px){html body #pfh-obar .pfh-obar__in{padding:5px 36px 5px 14px!important;row-gap:4px!important;gap:4px!important}html body #pfh-obar .pfh-obar__acts{gap:4px 14px!important}html body #pfh-obar .pfh-obar__cta{padding:4px 12px!important}html body #pfh-obar .pfh-obar__x{top:4px!important}}

/* FOOT-TABLET COMPACT 2 - 8 Oct 2026. Marco asked again: 'make the footer smaller on the tablet too'. 768-1100px only, same selectors as COMPACT 1 so it wins by order: claim band 12/88 (balanced 72/76), nav gap 14, menu cells 6px top/bottom, meta 10, wordmark gap 14, legal gaps 12, bottom 14. Text unchanged. Rollback: option oig_backup_closeband_pre_foottab2_20261008. */
@media (min-width:768px) and (max-width:1100px){html body footer .close .close__claim{margin-top:12px!important}html body footer .elementor-element-close-claim{padding-bottom:88px!important}html body footer .close .close__nav{margin-top:14px!important}html body footer .close .close__nav a{padding-top:6px!important;padding-bottom:6px!important}html body footer .close .close__meta{margin-top:10px!important}html body footer .close .close__mark{margin-top:14px!important}html body footer .close .close__legal{margin-top:12px!important}html body footer .elementor-element-oig-footer-root{padding-bottom:14px!important}}

/* OBAR-TABLET COMPACT 2 - 8 Oct 2026. Marco asked again: 'make the open bar smaller on the tablet too'. 768-1100px only, same selectors as OBAR-TABLET COMPACT 1 so it wins by order: bar padding 4 top / 5 bottom, row gap 2, Register button and OPEN NOW pill 4/3px top+bottom. Text unchanged. Bar 95 -> 81px at 820. Rollback: option oig_backup_closeband_pre_obartab2_20261008. */
@media (min-width:768px) and (max-width:1100px){html body #pfh-obar .pfh-obar__in{padding-top:4px!important;padding-bottom:5px!important;row-gap:2px!important}html body #pfh-obar .pfh-obar__cta{padding-top:4px!important;padding-bottom:4px!important}html body #pfh-obar .pfh-obar__tag{padding-top:3px!important;padding-bottom:3px!important}}

/* LOGOBAR-TABLET COMPACT 1 - 8 Oct 2026. Marco: 'make the logo bar smaller on the tablet too'. 768-1100px only, after HEAD-TABLET COMPACT 1 (68px) so it wins by order: bar 68 -> 56px; logo box 50 -> 44px (img 34 + 4px padding), Support the Launch button 46 -> 38px, menu button 46 -> 38px. Text unchanged. Rollback: option oig_backup_closeband_pre_logobartab1_20261008. */
@media (min-width:768px) and (max-width:1100px){html body .oig-header .nav__in{height:56px!important}html body .oig-header .nav__mark{height:34px!important;width:auto!important}html body .oig-header .nav__cta .btn{padding-top:7px!important;padding-bottom:7px!important}html body .oig-header .nav__burger{width:38px!important;height:38px!important}}

/* HEAD-DESKTOP COMPACT 1 - 10 Oct 2026. Marco: 'make the header smaller on the desktop too'. >=1101px only: open bar padding 5/6, logo bar 98 -> 66px, logo box 50 -> 44, menu links 10px top/bottom (52 -> 40), Support the Launch 8px (46 -> 42). Text, Donate button and dropdowns unchanged. Header at 1600: 196 -> 154px. Rollback: option oig_backup_closeband_pre_headdesk1_20261010. */
@media (min-width:1101px){html body #pfh-obar .pfh-obar__in{padding-top:5px!important;padding-bottom:6px!important}html body .oig-header .nav__in{height:66px!important}html body .oig-header .nav__mark{height:34px!important;width:auto!important}html body .oig-header .nav__links a{padding-top:10px!important;padding-bottom:10px!important}html body .oig-header .nav__cta .btn{padding-top:8px!important;padding-bottom:8px!important}}

/* FOOT-DESKTOP COMPACT 1 - 10 Oct 2026. Marco: 'make the footer smaller on the desktop too'. >=1101px only: claim band 32/108 (balanced ~92/89 at 1600), nav gap 28, menu cells 10px top/bottom (84 -> 76), meta gap 18, wordmark gap 80 -> 36, legal gap 64 -> 28 (Verified button 14, last line 10 kept), bottom 56 -> 28. Text and the wordmark size unchanged. Rollback: option oig_backup_closeband_pre_footdesk1_20261010. */
@media (min-width:1101px){html body footer .close .close__claim{margin-top:32px!important}html body footer .elementor-element-close-claim{padding-bottom:108px!important}html body footer .close .close__nav{margin-top:28px!important}html body footer .close .close__nav a{padding-top:10px!important;padding-bottom:10px!important}html body footer .close .close__meta{margin-top:18px!important}html body footer .close .close__mark{margin-top:36px!important}html body footer .close .close__legal{margin-top:28px!important}html body footer .elementor-element-oig-footer-root{padding-bottom:28px!important}}@media (min-width:1101px){html body footer .close .close__legal.pfh-vft{margin-top:14px!important}html body footer .close .close__legal.pfh-nnc{margin-top:10px!important}}
/* FOOT-FIT 1 (17 Oct 2026): full wordmark fits, 01-12 grid compact */
html body footer .close .close__mark{font-size:min(7.2vw,150px)!important;padding-left:2vw!important;padding-right:2vw!important}
html body footer .close .close__nav{max-width:1100px;margin-left:auto;margin-right:auto}
html body footer .close .close__nav a{font-size:17px!important;gap:4px!important;padding:9px 30px 9px 14px!important;white-space:nowrap}
html body footer .close .close__nav a i{font-size:10px!important}
html body footer .close .close__nav a::after{font-size:14px!important;inset:9px 10px auto auto!important}
@media (max-width:767px){html body footer .close .close__nav a{font-size:14px!important;padding:7px 24px 7px 10px!important;white-space:normal!important}}
/* FOOT-FONT 1 (17 Oct 2026): thick Epilogue wordmark + nav labels */
html body:not(#pfh-fnt) footer .close p.close__mark.close__mark.close__mark{font-family:Epilogue,Inter,sans-serif!important;font-weight:900!important;letter-spacing:-0.045em!important;font-size:min(8.4vw,172px)!important}
html body:not(#pfh-fnt) footer .close .close__nav.close__nav.close__nav a{font-family:Epilogue,Inter,sans-serif!important;font-weight:800!important;letter-spacing:0!important}

/* OXN-NAV: keep the desktop nav inside 1081-1143px */
@media (min-width:1081px) and (max-width:1143px){
  html body .oig-header .nav__in{gap:8px!important;padding-inline:16px!important}
  html body .oig-header .nav__links .nav__link{padding-inline:6px!important}
  html body .oig-header .nav__cta{gap:8px!important}
}
@media (min-width:1081px) and (max-width:1089px){
  html body .oig-header .nav__links .nav__link{padding-inline:4px!important}
  html body .oig-header .nav__cta{gap:6px!important}
  html body .oig-header .nav__cta .btn{padding-inline:10px!important}
}

/* oig-related-guides-css /wp-content/themes/operation-iron-gate/oig/related-guides.css */
/* ============================================================
   RELATED GUIDES — "the departures board"  (ALL pages)
   Added 2026-09-13. Enqueued sitewide from inc/asset-map.php.

   WHY THIS FILE EXISTS. The 13 Sep internal-link run appended a
   `related-guides` nav to 13 pages with NO theme classes:
     - 8 Elementor pages: a bare top-level e-con (html_tag nav)
       carrying inline Elementor bg #EFEAE1, hairline borders and
       padding 48/40. elementor-bridge.css zeroes
       --padding-block-start / --padding-inline-start on every
       .elementor .e-con (0,2,0), which outranks the per-element
       --padding-top/--padding-left Elementor feeds them through
       .e-con (0,1,0). MEASURED on post 387: computed padding 0px,
       heading and links flush at x=0 under the 29px fixed sig rail.
     - 5 classic pages (1569 1570 1572 1576 1590): a plain
       <nav id="related-guides"> appended to post_content.
   Both shapes carry data-id="related-guides" + aria-label, so one
   component styles all 13. No markup or text is changed.

   SPECIFICITY. Elementor's own inline-settings rules are (0,4,0)
   (.elementor-NNN .elementor-element.elementor-element-related-
   guides:not(...)). The E selector below is (0,5,3); no !important.

   New visible strings are CSS-generated and hidden from the
   accessibility tree with the `content: x / ""` alt syntax.
   Browsers without it drop the declaration and fall back to "".
   ============================================================ */

html body nav[data-id="related-guides"][aria-label="Related guides"],
html body nav.e-con.elementor-element.elementor-element-related-guides[data-id="related-guides"]{
  --rg-pad-x: max(var(--outer, 24px), calc((100% - var(--shell, 1440px)) / 2 + var(--outer, 24px)));
  position: relative;
  isolation: isolate;
  overflow: hidden;
  display: grid;
  grid-template-columns: minmax(240px, 4fr) minmax(0, 8fr);
  align-items: start;
  gap: clamp(32px, 4vw, 56px) clamp(32px, 5vw, 88px);
  margin: 0;
  padding: clamp(64px, 7.5vw, 112px) var(--rg-pad-x);
  background: var(--navy, #14233F);
  border: 0;
  border-top: 1px solid rgba(239,234,225,.12);
  counter-reset: rg;
  color: #fff;
  text-align: left;
}

/* ghost watermark */
html body nav[data-id="related-guides"][aria-label="Related guides"]::after{
  content: "";
  content: "Routes" / "";
  position: absolute;
  left: calc(var(--rg-pad-x) - .04em);
  bottom: -.14em;
  z-index: -1;
  font-family: var(--font-display);
  font-size: clamp(110px, 15vw, 240px);
  line-height: .8;
  letter-spacing: -.02em;
  text-transform: uppercase;
  white-space: nowrap;
  color: rgba(239,234,225,.045);
  pointer-events: none;
}

/* ---------- heading column ---------- */
html body nav[data-id="related-guides"][aria-label="Related guides"] h2{
  margin: 0;
  padding: 0;
  font-family: var(--font-display);
  font-size: clamp(42px, 4.6vw, 72px);
  font-weight: 400;
  line-height: .92;
  letter-spacing: -.01em;
  text-transform: uppercase;
  color: #fff;
}
/* eyebrow — names the job, not the topic (Ruling 18) */
html body nav[data-id="related-guides"][aria-label="Related guides"] h2::before{
  content: "";
  content: "Next routes" / "";
  display: block;
  margin-bottom: 22px;
  padding-left: 44px;
  /* the .eyebrow--orange 30x2 bar. A gradient on a PSEUDO is safe from
     Elementor's lazy-background `*` rule, which cannot match ::before. */
  background: linear-gradient(var(--orange, #E07A2F), var(--orange, #E07A2F)) no-repeat 0 50% / 30px 2px;
  font-family: var(--font-body);
  font-size: 13px;
  font-weight: 600;
  letter-spacing: .16em;
  line-height: 1;
  text-transform: uppercase;
  color: rgba(239,234,225,.78);
}

/* ---------- the board ---------- */
html body nav[data-id="related-guides"][aria-label="Related guides"] ul{
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(min(100%, 250px), 1fr));
  gap: 14px;
  margin: 0;
  padding: 0;
  list-style: none;
}
html body nav[data-id="related-guides"][aria-label="Related guides"] li{
  position: relative;
  margin: 0;
  padding: 0;
  counter-increment: rg;
}
html body nav[data-id="related-guides"][aria-label="Related guides"] li::before{ content: none; }

html body nav[data-id="related-guides"][aria-label="Related guides"] a{
  display: flex;
  flex-direction: column;
  height: 100%;
  min-height: 200px;
  box-sizing: border-box;
  padding: 20px 22px 22px;
  border: 1px solid rgba(239,234,225,.16);
  border-radius: 3px;
  background: rgba(11,23,41,.62);
  box-shadow: inset 0 0 0 0 var(--orange, #E07A2F);
  font-family: var(--font-display);
  font-size: clamp(22px, 1.85vw, 29px);
  font-weight: 400;
  line-height: 1.02;
  letter-spacing: -.005em;
  text-transform: uppercase;
  text-decoration: none;
  color: #fff;
  transition: transform 420ms var(--ease-enter, cubic-bezier(.22,1,.36,1)),
              border-color 240ms ease, background-color 240ms ease, box-shadow 300ms ease;
}
/* route number */
html body nav[data-id="related-guides"][aria-label="Related guides"] a::before{
  content: "";
  content: "Route " counter(rg, decimal-leading-zero) / "";
  display: block;
  margin-bottom: 30px;
  font-family: var(--font-mono);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: .16em;
  line-height: 1;
  color: var(--orange-soft, #F2B183);
}
/* destination path */
html body nav[data-id="related-guides"][aria-label="Related guides"] a::after{
  content: "";
  content: attr(href) / "";
  display: block;
  margin-top: auto;
  padding-top: 26px;
  padding-right: 48px;
  font-family: var(--font-mono);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: .06em;
  line-height: 1.4;
  text-transform: none;
  overflow-wrap: anywhere;
  color: var(--green-bright, #3FBF84);
}
/* arrow key */
html body nav[data-id="related-guides"][aria-label="Related guides"] li::after{
  content: "\2192";
  content: "\2192" / "";
  position: absolute;
  right: 18px;
  bottom: 18px;
  display: grid;
  place-items: center;
  width: 36px;
  height: 36px;
  border: 1px solid rgba(239,234,225,.28);
  border-radius: 3px;
  font-family: var(--font-body);
  font-size: 17px;
  line-height: 1;
  color: #fff;
  pointer-events: none;
  transition: transform 420ms var(--ease-punch, cubic-bezier(.34,1.56,.64,1)),
              background-color 240ms ease, border-color 240ms ease, color 240ms ease;
}

html body nav[data-id="related-guides"][aria-label="Related guides"] a:hover,
html body nav[data-id="related-guides"][aria-label="Related guides"] a:focus-visible{
  transform: translateY(-4px);
  border-color: var(--orange, #E07A2F);
  background: rgba(224,122,47,.1);
  box-shadow: inset 0 3px 0 0 var(--orange, #E07A2F), 0 24px 40px -28px rgba(0,0,0,.7);
  color: #fff;
}
html body nav[data-id="related-guides"][aria-label="Related guides"] a:focus-visible{
  outline: 3px solid var(--orange-soft, #F2B183);
  outline-offset: 3px;
}
html body nav[data-id="related-guides"][aria-label="Related guides"] li:hover::after,
html body nav[data-id="related-guides"][aria-label="Related guides"] li:focus-within::after{
  transform: translate(4px, -4px);
  background: var(--orange, #E07A2F);
  border-color: var(--orange, #E07A2F);
  color: var(--navy-deep, #0B1729);
}

/* ---------- entrance: scroll-driven, progressive ----------
   Only where the browser supports view timelines AND the reader
   has not asked for reduced motion. Everywhere else: static and
   fully visible. No JS, so nothing can strand a tile hidden. */
@supports (animation-timeline: view()){
  @media (prefers-reduced-motion: no-preference){
    html body nav[data-id="related-guides"][aria-label="Related guides"] li{
      animation: rg-rise linear both;
      animation-timeline: view();
      animation-range: entry 10% entry 85%;
    }
    html body nav[data-id="related-guides"][aria-label="Related guides"] li:nth-child(2){ animation-range: entry 16% entry 91%; }
    html body nav[data-id="related-guides"][aria-label="Related guides"] li:nth-child(3){ animation-range: entry 22% entry 97%; }
    html body nav[data-id="related-guides"][aria-label="Related guides"] li:nth-child(4){ animation-range: entry 28% cover 50%; }
    html body nav[data-id="related-guides"][aria-label="Related guides"]::after{
      animation: rg-drift linear both;
      animation-timeline: view();
    }
  }
}
@keyframes rg-rise{
  from{ opacity: 0; transform: translate3d(0, 36px, 0); }
  to  { opacity: 1; transform: none; }
}
@keyframes rg-drift{
  from{ transform: translate3d(9%, 0, 0); }
  to  { transform: translate3d(-3%, 0, 0); }
}
@media (prefers-reduced-motion: reduce){
  html body nav[data-id="related-guides"][aria-label="Related guides"] a,
  html body nav[data-id="related-guides"][aria-label="Related guides"] li::after{ transition: none; }
}

/* ---------- classic pages: the nav sits inside .page-content ---------- */
html body nav[data-id="related-guides"][aria-label="Related guides"]:not(.e-con){
  --rg-pad-x: clamp(24px, 4vw, 56px);
  grid-template-columns: 1fr;
  margin: clamp(48px, 6vw, 80px) 0 0;
  padding-block: clamp(44px, 5vw, 72px);
  border-radius: 6px;
}

/* ---------- narrow ---------- */
@media (max-width: 1024px){
  html body nav[data-id="related-guides"][aria-label="Related guides"],
  html body nav.e-con.elementor-element.elementor-element-related-guides[data-id="related-guides"]{
    grid-template-columns: 1fr;
  }
}
@media (max-width: 767px){
  html body nav[data-id="related-guides"][aria-label="Related guides"],
  html body nav.e-con.elementor-element.elementor-element-related-guides[data-id="related-guides"]{
    --rg-pad-x: 20px;
    padding-block: 56px 64px;
  }
  html body nav[data-id="related-guides"][aria-label="Related guides"] ul{ grid-template-columns: 1fr; gap: 10px; }
  html body nav[data-id="related-guides"][aria-label="Related guides"] a{ min-height: 0; padding: 18px 18px 20px; font-size: 23px; }
  html body nav[data-id="related-guides"][aria-label="Related guides"] a::before{ margin-bottom: 18px; }
  html body nav[data-id="related-guides"][aria-label="Related guides"] a::after{ padding-top: 18px; }
  html body nav[data-id="related-guides"][aria-label="Related guides"] li::after{ right: 14px; bottom: 14px; }
}

/* ---------- honour Elementor's Advanced > Responsive > Hide switches ----------
   Added 2026-09-15. The board's display:grid above is (0,5,3) and outranks
   Elementor's .elementor-hidden-{device}{display:none}, so switching the section
   off in the editor did nothing on the front end (post 13). Ranges mirror this
   site's active Elementor breakpoints: mobile 480, tablet 768, tablet_extra 900,
   laptop 1024, widescreen 1440. To show the section again, turn the Hide switches
   off in Elementor; no CSS change needed. Scoped off the Elementor editor\n   (body.elementor-editor-active) so the section stays visible and editable there. */
@media (max-width: 480px){ html body:not(.elementor-editor-active) nav[data-id="related-guides"][aria-label="Related guides"].elementor-hidden-mobile{ display: none !important; } }
@media (min-width: 481px) and (max-width: 768px){ html body:not(.elementor-editor-active) nav[data-id="related-guides"][aria-label="Related guides"].elementor-hidden-tablet{ display: none !important; } }
@media (min-width: 769px) and (max-width: 900px){ html body:not(.elementor-editor-active) nav[data-id="related-guides"][aria-label="Related guides"].elementor-hidden-tablet_extra{ display: none !important; } }
@media (min-width: 901px) and (max-width: 1024px){ html body:not(.elementor-editor-active) nav[data-id="related-guides"][aria-label="Related guides"].elementor-hidden-laptop{ display: none !important; } }
@media (min-width: 1025px) and (max-width: 1439px){ html body:not(.elementor-editor-active) nav[data-id="related-guides"][aria-label="Related guides"].elementor-hidden-desktop{ display: none !important; } }
@media (min-width: 1440px){ html body:not(.elementor-editor-active) nav[data-id="related-guides"][aria-label="Related guides"].elementor-hidden-widescreen{ display: none !important; } }

/* ==========================================================================
   HOME-CASE-FILE (2026-09-20)  homepage ONLY (body.home.page-id-10).
   The single collapsed Read-more row under The Verdict (c361) was an unstyled
   65px hairline row. Now a compact navy "case file" cabinet on the Verdict
   board's exact geometry (var(--bd-w), shifted sig-w/2; measured 84/1445 =
   board 84/1445). Ported from post 900 RM2 "Sealed Files". + gate kept.
   Markup untouched. Rollback: related-guides.css.bak-pre-homecasefile-2026-09-20
   ========================================================================== */
html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"]{ --rm-ink:#FBF8F3; --rm-line:rgba(251,248,243,.09); --rm-acc:#E07A2F; --rm-deep:#0B1729; --rm-pad:clamp(18px,3vw,44px);
 position:relative; box-sizing:border-box; width:var(--bd-w,calc(100% - 136px)); max-width:none; margin:0 auto clamp(44px,5vw,80px); padding:52px 0 12px; border:0; border-radius:16px; overflow:hidden;
 background-color:var(--rm-deep); background-image:radial-gradient(60% 140% at 100% 0%,rgba(224,122,47,.14),rgba(224,122,47,0) 60%),linear-gradient(rgba(251,248,243,.035) 1px,transparent 1px),linear-gradient(90deg,rgba(251,248,243,.035) 1px,transparent 1px); background-size:auto,34px 34px,34px 34px;
 box-shadow:inset 0 0 0 1px var(--rm-line), inset 0 2px 0 rgba(224,122,47,.8), 0 44px 80px -40px rgba(11,23,41,.55); color:var(--rm-ink); }
@media (min-width:900px){ html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"]{ transform:translateX(calc(var(--sig-w, 32px) / 2)); } }
html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"]::before{ content:"THE CASE FILE" / ""; position:absolute; top:20px; left:var(--rm-pad); padding-left:42px; font:600 12px/1 ui-monospace,"SF Mono",Menlo,Consolas,monospace; letter-spacing:.24em; color:var(--rm-acc); }
html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"]::after{ content:""; position:absolute; top:25px; left:var(--rm-pad); width:30px; height:2px; background:var(--rm-acc); }
html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"] > .oig-more__sum{ position:relative; display:grid; grid-template-columns:auto minmax(0,1fr); align-items:center; column-gap:clamp(16px,2.2vw,32px); width:auto; margin:0; min-height:70px; overflow:hidden;
 padding:clamp(12px,1.3vw,18px) calc(var(--rm-pad) + 130px) clamp(12px,1.3vw,18px) calc(var(--rm-pad) + 18px); border:0; color:var(--rm-ink); background:transparent; transition:background-color .25s ease; list-style:none; cursor:pointer; }
html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"] > .oig-more__sum::-webkit-details-marker{ display:none; }
html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"] > .oig-more__sum::before{ content:""; position:absolute; left:var(--rm-pad); top:16px; bottom:16px; width:7px; border-radius:2px; background:repeating-linear-gradient(135deg,var(--rm-acc) 0 5px,transparent 5px 10px); opacity:.45; transition:opacity .25s ease; }
html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"] > .oig-more__sum::after{ content:""; position:absolute; left:0; right:0; bottom:0; height:2px; background:linear-gradient(90deg,var(--rm-acc),rgba(224,122,47,0)); transform:scaleX(0); transform-origin:left center; transition:transform .45s cubic-bezier(.22,1,.36,1); }
html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"] > .oig-more__sum:hover{ background-color:rgba(251,248,243,.035); }
html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"] > .oig-more__sum:hover::before, html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"][open] > .oig-more__sum::before{ opacity:1; }
html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"] > .oig-more__sum:hover::after, html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"][open] > .oig-more__sum::after{ transform:scaleX(1); }
html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"] .oig-more__k{ grid-column:1; font:600 11px/1 ui-monospace,"SF Mono",Menlo,Consolas,monospace; letter-spacing:.2em; text-transform:uppercase; color:var(--rm-acc); padding:8px 11px; border:1px solid rgba(224,122,47,.55); border-radius:999px; white-space:nowrap; transition:background-color .25s ease,color .25s ease; }
html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"][open] .oig-more__k{ background:var(--rm-acc); color:var(--rm-deep); }
html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"] .oig-more__t{ grid-column:2; font-family:"Anton","Arial Narrow",Impact,sans-serif; font-weight:400; font-size:clamp(20px,1.8vw,28px); line-height:1.02; letter-spacing:.01em; text-transform:uppercase; color:var(--rm-ink); transition:transform .35s cubic-bezier(.22,1,.36,1); }
html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"] .oig-more__sum:hover .oig-more__t{ transform:translateX(8px); }
html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"] .oig-more__sum > .oig-more__t::after{ content:"FILE 01" / ""; position:absolute; top:50%; right:calc(var(--rm-pad) + 64px); transform:translateY(-50%); font:600 11px/1 ui-monospace,"SF Mono",Menlo,Consolas,monospace; letter-spacing:.2em; color:rgba(251,248,243,.55); padding:8px 0 8px 14px; border-left:1px solid rgba(251,248,243,.14); }
html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"][open] .oig-more__sum > .oig-more__t::after{ color:var(--rm-acc); border-left-color:rgba(224,122,47,.5); }
html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"] .oig-more__i{ position:absolute; right:var(--rm-pad); top:50%; margin-top:-22px; width:44px; height:44px; border-radius:12px; border:1.5px solid rgba(251,248,243,.3); color:var(--rm-ink); transition:background-color .25s ease,border-color .25s ease,color .25s ease,transform .35s cubic-bezier(.34,1.56,.64,1); }
html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"] .oig-more__i::before, html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"] .oig-more__i::after{ width:18px; height:2px; background:currentColor; }
html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"] .oig-more__sum:hover .oig-more__i{ border-color:var(--rm-acc); background:rgba(224,122,47,.14); }
html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"][open] .oig-more__i{ background:var(--rm-acc); border-color:var(--rm-acc); color:var(--rm-deep); transform:rotate(45deg); }
html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"][open] .oig-more__i::after{ transform:translate(-50%,-50%) rotate(90deg); }
html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"] .oig-more__sum:focus-visible{ outline:2px solid var(--rm-acc); outline-offset:-4px; }
html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"][open] > .oig-more__sum{ border-bottom:1px dashed rgba(224,122,47,.55); }
html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"] > .oig-more__body{ padding:clamp(12px,1.4vw,20px); box-sizing:border-box; }
html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"] > .oig-more__body > .e-con{ border-radius:12px; overflow:hidden; margin:0 !important; }
html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"][open] > .oig-more__body{ animation:hp-rm-in .5s cubic-bezier(.22,1,.36,1) both; }
@keyframes hp-rm-in{ from{opacity:0;transform:translateY(-10px)} to{opacity:1;transform:none} }
@media (max-width:899px){ html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"]{ width:auto; margin-left:16px; margin-right:16px; transform:none; }
 html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"] > .oig-more__sum{ grid-template-columns:minmax(0,1fr); row-gap:10px; min-height:0; padding-right:calc(var(--rm-pad) + 60px); }
 html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"] .oig-more__k{ justify-self:start; } html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"] .oig-more__t{ grid-column:1; font-size:20px; }
 html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"] .oig-more__sum > .oig-more__t::after{ display:none; } html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"] .oig-more__i{ width:40px; height:40px; margin-top:-20px; border-radius:10px; } }
@media (prefers-reduced-motion:reduce){ html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"] *, html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"] *::before, html body.home.page-id-10 details.oig-more[data-oig-more="related-guides"] *::after{ transition:none !important; animation:none !important; } }

/* ==========================================================================
   NDE-INK FIX - opened read-more rows re-ink for their own band - 2026-09-23
   Founder: "whats going on here.. i cant read any of this" (Why This Matters).
   MEASURED at 1600 logged out: .nde-why heading 58px and its 18px body painted
   #FBF8F3 on band-mist #DDE7E4 = 1.19:1 - invisible.
   MECHANISM: the read-more row sets color:var(--rm-ink) (#FBF8F3, chosen for
   the dark summary row) on the <details>, so it INHERITS into
   .oig-more__body, where every light-band section inside renders cream.
   FIX: set the page ink on light-band sections inside an opened row and let
   inheritance do the rest - elements that carry their own colour (the green
   +33 pts figure, the .72-alpha captions, link inks) are untouched.
   ========================================================================== */
html body details.oig-more > .oig-more__body > .sec:is(.band-canvas, .band-mist, .band-stone) {
  color: var(--navy, #14233F);
}

/* oig-motion-plus-css /wp-content/themes/operation-iron-gate/oig/motion-plus.css */
/* ============================================================================
   MOTION-PLUS — 2026-08-09
   The award pass. Loaded AFTER styles.css and signature.css on the marketing
   pages. Every effect here performs the site's argument; none is decoration.

   NOT LOADED ON get-help.html. That page carries no motion.js, no .rv and no
   third-party JS by founder ruling — it is read by someone in crisis, possibly
   on an old phone on cellular data. Nothing in this file may ever be linked
   from it. The same goes for anything that would delay reaching 211.

   Everything degrades to a finished static state under prefers-reduced-motion.
   ========================================================================== */

/* --- 1. THE RAIL STAMPS ----------------------------------------------------
   Crossing into a section stamps the readout like a docket stamp hitting
   paper, and the spine flashes a notch at that point. signature.js adds
   .is-swap on the readout; .sig--stamp is added on the rail for one beat. */
.sig__now{transform-origin:50% 50%}
.sig--stamp .sig__now{animation:sig-stamp 420ms var(--ease-punch)}
@keyframes sig-stamp{
  0%{transform:rotate(180deg) scale(1.14);opacity:.35}
  55%{transform:rotate(180deg) scale(.97);opacity:1}
  100%{transform:rotate(180deg) scale(1);opacity:1}
}
.sig--stamp .sig__tok{animation:sig-notch 460ms var(--ease-punch)}
@keyframes sig-notch{
  0%{box-shadow:0 0 0 3px var(--canvas),0 0 14px 2px rgba(224,122,47,.5)}
  40%{box-shadow:0 0 0 3px var(--canvas),0 0 0 8px rgba(224,122,47,.28),0 0 22px 6px rgba(224,122,47,.7)}
  100%{box-shadow:0 0 0 3px var(--canvas),0 0 14px 2px rgba(224,122,47,.5)}
}

/* --- 2. THE FIGURE THAT REFUSES TO CLOSE -----------------------------------
   01's fourth figure is ZERO, outlined, and the tape under it is empty. It
   used to simply arrive with the other three. Now it TRIES: the tape starts to
   fill, stops, and retracts, and the outline flickers as it fails to resolve.
   One beat, once, on entry. This is the whole thesis as an animation — a case
   that cannot be closed into a number. */
.rcpt.is-in .rcpt__c:nth-child(4) .rcpt__bar{
  background-image:linear-gradient(90deg,var(--navy) 0 100%);
  background-repeat:no-repeat;background-size:0% 100%;
  animation:rcpt-refuse 1900ms var(--ease-scrub) 620ms 1}
@keyframes rcpt-refuse{
  0%{background-size:0% 100%}
  34%{background-size:19% 100%}
  46%{background-size:19% 100%}
  100%{background-size:0% 100%}
}
.rcpt.is-in .rcpt__fig--hollow{animation:rcpt-flicker 1500ms steps(1,end) 900ms 1}
@keyframes rcpt-flicker{
  0%,100%{opacity:1}
  22%,30%{opacity:.42}
  26%{opacity:1}
  54%{opacity:.62}
}

/* --- 3. THE DOORS BREATHE --------------------------------------------------
   The record sheet inside each card's head panel drifts one cell, slowly and
   permanently, so the cards read as live surfaces rather than printed ones.
   The docket numeral pulses once as the card arrives.

   The drift animates TRANSLATE, not background-position: styles.css already
   uses background-position for the hover shift, and a running animation beats
   a normal declaration, so animating the same property silently killed that
   hover. Different property, both behaviours live. The sheet is inset -34px so
   the translated grid never exposes an edge. */
.door__head::before{inset:-34px;animation:door-drift 46s linear infinite}
@keyframes door-drift{from{transform:translate3d(0,0,0)}to{transform:translate3d(34px,34px,0)}}
/* hover keeps its own nudge, on top of the drift */
.door:hover .door__head::before{background-position:6px 6px}
/* Fires off .is-loaded, not .is-in: .hero__doors carries no data-rv, so the
   scroll observer never touches it and the .is-in selector was dead. The
   doors are above the fold — load IS their arrival. */
.is-loaded .door__head::after{animation:door-stamp 900ms var(--ease-enter) 620ms 1}
.door--org .door__head::after{animation-delay:420ms}
@keyframes door-stamp{
  0%{-webkit-text-stroke-color:rgba(20,35,63,.03)}
  40%{-webkit-text-stroke-color:rgba(224,122,47,.5)}
  100%{-webkit-text-stroke-color:rgba(20,35,63,.09)}
}

/* --- 4. THE READING LIGHT --------------------------------------------------
   On the dark bands only: a soft light follows the pointer and lifts the
   hairline grid where it passes, the way a torch moves over a document.
   motion-plus.js writes --mx / --my as percentages of the band. Deliberately
   built at half the strength it could be — it is atmosphere, not a spotlight,
   and it never sits over body copy that has to be read. */
.band-navy,.band-deep,.gband,.ctb{position:relative}
/* Stacking, the long way round, because both short answers failed:
     z-index:0  → positioned descendant, paints AFTER in-flow content, so the
                  wash hazed the body copy;
     z-index:-1 → the bands establish no stacking context, so the pseudo was
                  hoisted to the root and painted UNDER the band's opaque
                  background — invisible.
   So: the pseudo stays at 0, and every band's content wrapper is lifted to
   z-index 1. The wash sits above the band background and below every word.
   .pull__in already carried z-index:2 and is left alone. */
[data-lamp] > .shell{position:relative;z-index:1}
.band-navy[data-lamp]::before,.band-deep[data-lamp]::before,.ctb[data-lamp]::before{
  content:"";position:absolute;inset:0;pointer-events:none;z-index:0;opacity:0;
  background:radial-gradient(420px 320px at var(--mx,50%) var(--my,50%),
    rgba(255,255,255,.09),rgba(255,255,255,.035) 42%,transparent 72%);
  transition:opacity 420ms var(--ease-enter)}
[data-lamp].is-lit::before{opacity:1}

/* --- 5. SECTION ARRIVAL ----------------------------------------------------
   The existing .rv reveal is a fade-and-rise. On section HEADS only, it now
   also settles its tracking, so a heading resolves into place instead of
   sliding. Tiny, and it is the difference between "animated" and "composed". */
.sec__head.rv,.display-section.rv{letter-spacing:.06em;transition:opacity 620ms var(--ease-enter),
  transform 620ms var(--ease-enter),letter-spacing 780ms var(--ease-enter)}
.sec__head.rv.is-in{letter-spacing:.2em}
.display-section.rv.is-in{letter-spacing:-.01em}

@media (prefers-reduced-motion:reduce){
  .sig--stamp .sig__now,.sig--stamp .sig__tok,
  .rcpt.is-in .rcpt__c:nth-child(4) .rcpt__bar,
  .rcpt.is-in .rcpt__fig--hollow,
  .door__head::before,.hero__doors.is-in .door__head::after{animation:none}
  [data-lamp]::before{display:none}
  .sec__head.rv,.display-section.rv{transition:opacity 200ms linear}
}

/* ============================ 6. THE ASKS, LIT ============================
   Founder ruling 2026-08-09. Five specific elements, each given light and a
   pulse. Contrast is held everywhere: white stays on the dark end of every
   green gradient, and the emphasis colours below are the light-ground inks,
   never raw --orange (3.0:1 on cream). */

/* --- Donate: the one button that should catch the eye from anywhere ------- */
/* Same luminance ceiling as .door__go, for the same reason: the white 13px/600
   label sets it, not taste. #1B8055 = 4.92:1, #14663F = 7.0:1, so the whole
   glyph band clears AA with margin — and it needs margin here, because
   donate-shine lays rgba(255,255,255,.42) across the label as it crosses. */
/* MOVED OUT 2026-09-06 — the header donate-button treatment (breathe pulse,
   shine sweep, ::after overlay, hover lift) now lives in oig/nav-cta.css,
   enqueued SITEWIDE and unconditionally by inc/asset-map.php.
   It was home-only here, and the header renders on every page — founder report
   2026-09-06 that the button looked dead on our-team / story /
   for-organizations / the How It Works cluster. MEASURED: 'donate-breathe'
   appeared 2x in the served CSS on home and 0x on all five of those pages.
   The .door__go rules below are UNCHANGED and stay here — .door is homepage-only.
   Do not restore those rules to this file: two copies means the homepage
   would silently ignore edits made in nav-cta.css. */

/* --- emphasis: the few words that carry the line -------------------------- */
/* On cream: --orange-ink at display size. On the dark closing band: the soft
   orange, which is the only orange legal there. */
.display-hero em{color:var(--orange-ink);font-style:italic}
.close__claim em{color:var(--orange-soft);font-style:italic}
.display-section em{color:var(--orange-ink)}
.band-navy .display-section em,.band-deep .display-section em,
.close__claim em,.pull em{color:var(--orange-soft)}

/* --- "Start here": sharper green, lit, breathing -------------------------- */
/* Fill luminance is capped by the white label, not by taste: white on
   #1B8055 is 4.92:1 and on #14663F is 7.0:1, so the whole glyph band clears
   AA. The "sharp green" reading lives in the GLOW below (bright #3FBF84 at
   50%), which carries no text and is free to be as bright as it likes. A
   lighter fill (#33A96F) was tried this pass and measured 3.7:1 — reverted. */
.door .door__go{background:linear-gradient(180deg,#1B8055,#14663F);
  box-shadow:0 14px 26px -14px rgba(28,122,80,.95),inset 0 1px 0 rgba(255,255,255,.3);
  animation:go-breathe 3.2s var(--ease-enter) infinite}
@keyframes go-breathe{
  0%,100%{box-shadow:0 14px 26px -14px rgba(28,122,80,.95),inset 0 1px 0 rgba(255,255,255,.3),0 0 0 0 rgba(63,191,132,0)}
  54%{box-shadow:0 16px 32px -14px rgba(28,122,80,1),inset 0 1px 0 rgba(255,255,255,.36),0 0 26px 3px rgba(63,191,132,.5)}
}
.door--org .door__go{background:linear-gradient(180deg,#1D3054,#0F1D33);animation:none}
.door:hover .door__go{background:linear-gradient(180deg,#1A7D53,#12603C)}
.door--org:hover .door__go{background:linear-gradient(180deg,#2A4372,#16294A)}

/* --- the arrows ride ------------------------------------------------------ */
.door__go i{animation:go-arrow 2.4s var(--ease-enter) infinite}
@keyframes go-arrow{
  0%,72%,100%{transform:translateX(0)}
  82%{transform:translateX(4px)}
}
.door:hover .door__go i{animation:none;transform:translateX(3px)}

/* --- the status dots pulse ------------------------------------------------ */
/* audience dot: green, a live light */
.door__k::before{animation:dot-live 2.2s var(--ease-enter) infinite}
@keyframes dot-live{
  0%,100%{box-shadow:0 0 0 0 rgba(63,191,132,.5),0 0 6px 1px rgba(63,191,132,.5);transform:scale(1)}
  52%{box-shadow:0 0 0 5px rgba(63,191,132,0),0 0 14px 3px rgba(63,191,132,.9);transform:scale(1.18)}
}
.door--org .door__k::before{animation-name:dot-live-o}
@keyframes dot-live-o{
  0%,100%{box-shadow:0 0 0 0 rgba(224,122,47,.5),0 0 6px 1px rgba(224,122,47,.5);transform:scale(1)}
  52%{box-shadow:0 0 0 5px rgba(224,122,47,0),0 0 14px 3px rgba(224,122,47,.9);transform:scale(1.18)}
}
/* preview-only dot: orange, slower — it is a status, not an invitation */
.door__soon::before{animation:dot-status 2.8s var(--ease-enter) infinite}
@keyframes dot-status{
  0%,100%{box-shadow:0 0 0 0 rgba(224,122,47,.55),0 0 5px 1px rgba(224,122,47,.5);opacity:.9}
  50%{box-shadow:0 0 0 4px rgba(224,122,47,0),0 0 12px 3px rgba(224,122,47,.85);opacity:1}
}

@media (prefers-reduced-motion:reduce){
  .door .door__go,.door__go i,.door__k::before,.door__soon::before{animation:none}
}


/* ═══════════════════════════════════════════════════════════════════════════
   THE CASE PATH (.path) — STRUCTURAL REPAIR + HOVER POP.  Added 2026-08-26.

   Founder instruction 2026-08-26: "can you make all 5 boxes pop up when I
   scroll over each box ... make it look bad ass."  Sits under the VISUAL BAR
   ruling (CLAUDE.md 2026-08-25).

   ───────────────────────────────────────────────────────────────────────────
   WHY A REPAIR SECTION EXISTS AT ALL — a measured, live, visible defect.

   styles.css builds .path assuming the five <li class="path__s"> are DIRECT
   children of .path__row. THEY ARE NOT. Each <li> is its own Elementor
   text-editor widget (w038..w042), so every step renders inside its own
   div.elementor-element wrapper. MEASURED live 2026-08-26 at 1585px BEFORE
   any change:

       .path__s parent          = div.elementor-element   (NOT .path__row)
       stepIsDirectChildOfRow   = false
       every step's nth-child   = 1  of  siblingCount = 1

   Three selector groups in styles.css therefore match NOTHING, or match
   EVERYTHING. All three defects were visible on the live page:

     1. .path__s:nth-child(2..5){transition-delay:110/220/330/440ms}
        -> matched NOTHING. MEASURED transition-delay "0s, 0s" on all five.
           The designed reveal stagger was dead; all five rose at once.

     2. .path__s:last-child::before / ::after { background:var(--green) }
        -> matched EVERY step, each being :last-child of its own wrapper.
           MEASURED rule AND node = rgb(46,125,91) on all five. The designed
           navy-for-01..04 / green-for-05 arrival signal was gone entirely —
           every step read as the closing step.

     3. .path__s + .path__s::before { left:calc(...) }
        -> matched NOTHING. MEASURED ::before left = 0px on all five, leaving
           20px gaps between the segments. styles.css's own comment says they
           are drawn "as five abutting segments so it reads as a single line."
           It did not read as a single line.

   This is the documented nth-child trap in CLAUDE.md (Story route rail,
   2026-08-18): fixing grid PLACEMENT does not fix selectors that walk the DOM
   TREE. The repair is the same one used there — re-target at the WRAPPER's
   position, not at the design element's.

   ───────────────────────────────────────────────────────────────────────────
   WHY THIS LIVES IN motion-plus.css AND NOT IN styles.css.

   motion-plus.css is enqueued 'case home:' only (inc/asset-map.php) with
   'oig-styles' as its dependency, so it loads AFTER styles.css and is scoped
   to this page by its ENQUEUE rather than by a body class. styles.css is a
   306KB shared file whose cascade order is load-bearing. This does not go in
   it. No !important is used anywhere below; every override wins on real
   ancestor-class specificity.

   ───────────────────────────────────────────────────────────────────────────
   THE STANDING RULING THIS BLOCK SITS NEXT TO — READ BEFORE CHANGING IT.

   styles.css's own .path comment records a client ruling: "the dark ground
   does not belong on this page and the graphics were doing too much — keep it
   minimal, just the words ... Do not put a coloured ground, a token, a glow, a
   status chip or a loop back on this block. Nothing here animates except a
   one-time reveal."

   That ruling governs the RESTING state, and the RESTING STATE IS NOT TOUCHED
   HERE. No ground, no token, no glow, no status chip at rest; the only ambient
   animation is still the one-time reveal. Everything in section 3 fires ONLY
   on deliberate pointer intent, and only on a fine pointer.

   The hover plate is --stone, the site's own ADJACENT LIGHT BAND — canvas ->
   stone is the 1.13:1 separation step already ruled on for the 387 hero. It is
   not a dark ground. If more drama is ever wanted, the in-system move is the
   COUNTERPLATE (--navy on a light band, ~17:1) documented for post 392
   section 43. That is a one-token change here — but it WOULD cross the ruling
   above, so it needs a founder yes first. Do not make it unilaterally.

   ───────────────────────────────────────────────────────────────────────────
   `transform` IS NOT AVAILABLE TO THIS EFFECT. Founder Ruling 19.

   The reveal owns `transform` (translateY(14px) -> none). `transform` is a
   SINGLE property, not a list — a hover rule writing it REPLACES the reveal
   outright and the step never rises. The lift below therefore uses the
   INDEPENDENT `translate` and `scale` properties, which COMPOSE with
   `transform` instead of replacing it. Never write `transform` in this block.
   ═══════════════════════════════════════════════════════════════════════════ */


/* ── 1. STRUCTURAL REPAIR ─────────────────────────────────────────────────
   Equalise the five step boxes to the grid row height, so the hover plate is
   the same size on all five. This is a BOX change only: .path__s carries no
   background at rest, so a taller invisible box is invisible until something
   is painted on it. The wrapper's only child is the <li> (text-editor widgets
   on this theme render with no .elementor-widget-container — MEASURED). */
.path__row > .elementor-element{display:flex;flex-direction:column}
.path__row > .elementor-element > .path__s{flex:1 1 auto}

/* Arrival signal restored: 01-04 hairline rule + navy node, 05 green.
   (0,3,0) beats styles.css's mis-matching .path__s:last-child (0,2,0). */
.path__row > .elementor-element:not(:last-child) > .path__s::before{background-color:var(--hairline)}
.path__row > .elementor-element:not(:last-child) > .path__s::after{background-color:var(--navy)}

/* One continuous rule across all five. The bridge distance is .path__row's
   COLUMN GAP — Elementor's own 20px — NOT the 26px padding styles.css
   assumed, and it is NOT readable from a custom property (--gap computes 0px
   on the row while column-gap computes 20px). MEASURED 2026-08-26. If the
   segments ever visibly overlap or part, re-measure the row's computed
   column-gap and change the one number below. */
.path__row > .elementor-element + .elementor-element > .path__s::before{left:-21px}


/* ── 2. TRANSITION LIST ───────────────────────────────────────────────────
   Longhands, deliberately — the `transition` SHORTHAND resets
   transition-delay to 0s, which would destroy the reveal stagger restored
   below. The two reveal properties keep their 620ms ease-enter; the four
   hover properties run short and always at ZERO delay, so step 05 does not
   sit for 440ms before responding to the pointer. */
.path__row > .elementor-element > .path__s{
  transition-property:opacity,transform,translate,background-color,box-shadow,scale;
  transition-duration:620ms,620ms,300ms,240ms,300ms,300ms;
  transition-timing-function:var(--ease-enter),var(--ease-enter),var(--ease-punch),var(--ease-enter),var(--ease-enter),var(--ease-punch);
  transition-delay:0s,0s,0s,0s,0s,0s;
}
/* The reveal stagger styles.css intended, re-targeted at the wrapper. Only
   the first two entries (opacity, transform) carry the delay. */
.path__row > .elementor-element:nth-child(2) > .path__s{transition-delay:110ms,110ms,0s,0s,0s,0s}
.path__row > .elementor-element:nth-child(3) > .path__s{transition-delay:220ms,220ms,0s,0s,0s,0s}
.path__row > .elementor-element:nth-child(4) > .path__s{transition-delay:330ms,330ms,0s,0s,0s,0s}
.path__row > .elementor-element:nth-child(5) > .path__s{transition-delay:440ms,440ms,0s,0s,0s,0s}

/* Children carry no transition of their own in styles.css, so a plain
   shorthand is safe here and cannot contaminate the stagger above. */
.path__row > .elementor-element > .path__s .path__n{
  transform-origin:100% 0;
  transition:scale 300ms var(--ease-punch),-webkit-text-stroke-color 240ms var(--ease-enter);
}
.path__row > .elementor-element > .path__s .path__k,
.path__row > .elementor-element > .path__s .path__t,
.path__row > .elementor-element > .path__s .path__b{transition:color 240ms var(--ease-enter)}
.path__row > .elementor-element > .path__s::before{transition:background-color 240ms var(--ease-enter),box-shadow 240ms var(--ease-enter)}
.path__row > .elementor-element > .path__s::after{transition:background-color 240ms var(--ease-enter),box-shadow 300ms var(--ease-enter),scale 300ms var(--ease-punch)}


/* ── 3. THE HOVER POP ─────────────────────────────────────────────────────
   Gated on (hover:hover) and (pointer:fine) so a touch device never gets a
   stuck :hover state after a tap. Nothing here is a sole information carrier:
   every word is already fully legible at rest, and every colour this block
   changes moves contrast UP, never down. */
@media (hover:hover) and (pointer:fine){

  /* The hovered cell paints above its neighbours. The wrappers are ALREADY
     position:relative (Elementor ships them that way — MEASURED), so z-index
     alone is enough and no positioning is introduced. */
  .path__row > .elementor-element:hover{z-index:3}

  /* THE LIFT AND THE PLATE.
     The plate is a 14px SPREAD box-shadow, not padding — it paints a solid
     --stone rectangle 14px larger than the step on all four sides with ZERO
     layout impact, so nothing reflows and the five columns never move. Square
     corners on purpose: this block's language is sharp (the step node is a 9px
     square; there is no border-radius anywhere in .path). */
  .path__row > .elementor-element:hover > .path__s{
    translate:0 -8px;
    background-color:var(--stone);
    box-shadow:0 0 0 14px var(--stone),
               0 24px 44px -22px rgba(20,35,63,.34),
               0 3px 0 -1px rgba(20,35,63,.07);
  }

  /* The step figure ignites and grows into its own corner (transform-origin
     100% 0, set in section 2, keeps it pinned top-right so it cannot drift
     out of the plate). Decorative only — aria-hidden, color:transparent,
     pointer-events:none — so it carries no contrast duty. */
  .path__row > .elementor-element:hover > .path__s .path__n{
    -webkit-text-stroke-color:rgba(224,122,47,.62);
    scale:1.1;
  }

  /* Type sharpens. MEASURED on the --stone plate 2026-08-26:
     kicker 4.55:1, title 13.06:1, body 6.91:1 - all clear the 4.5 AA bar, and
     body CLIMBS from 4.75:1 at rest. Kicker and title sit slightly lower than
     at rest (4.75 / 14.77 on --canvas) purely because the plate darkens the
     ground; both still pass. Do NOT lighten the plate past --stone without
     re-measuring the kicker - it has the least headroom of the three. */
  .path__row > .elementor-element:hover > .path__s .path__k{color:var(--orange-ink)}
  .path__row > .elementor-element:hover > .path__s .path__t{color:var(--navy)}
  .path__row > .elementor-element:hover > .path__s .path__b{color:rgba(20,35,63,.78)}

  /* Rule segment lights and the step node pops. */
  .path__row > .elementor-element:hover > .path__s::before{
    background-color:var(--orange);
    box-shadow:0 0 14px 0 rgba(224,122,47,.45);
  }
  .path__row > .elementor-element:hover > .path__s::after{
    background-color:var(--orange);
    scale:1.5;
    box-shadow:0 0 0 5px rgba(224,122,47,.20);
  }

  /* Step 05 KEEPS GREEN on hover. Green is the arrival state and the colour
     carries that meaning — recolouring it orange would say the case path ends
     the same way it runs. Brightened rather than swapped. */
  .path__row > .elementor-element:last-child:hover > .path__s::before{
    background-color:var(--green);
    box-shadow:0 0 14px 0 rgba(46,125,91,.45);
  }
  .path__row > .elementor-element:last-child:hover > .path__s::after{
    background-color:var(--green);
    box-shadow:0 0 0 5px rgba(46,125,91,.22);
  }
}


/* ── 4. RESPONSIVE — restate styles.css's own resets at matching depth ────
   The -21px bridge in section 1 is (0,3,0) and would otherwise outrank
   styles.css's (0,1,0)/(0,2,0) resets inside these breakpoints. */
@media (max-width:1080px){
  .path__row > .elementor-element:nth-child(odd) > .path__s::before{left:0}
}
@media (max-width:600px){
  /* (0,4,1) - this reset must MATCH the bridge selector's specificity in
     section 1, not merely target the same elements. A (0,3,1) reset LOSES to
     it and leaves steps 02 and 04 hanging 21px into the left gutter at one
     column. MEASURED live in a 375px iframe 2026-08-26: ruleLefts came back
     [0,-21,0,-21,0] before this fix, [0,0,0,0,0] after. */
  .path__row > .elementor-element + .elementor-element > .path__s::before{left:0}
}


/* ── 5. REDUCED MOTION ────────────────────────────────────────────────────
   Movement is removed; COLOUR and the plate stay, because they are not
   motion and they are what make the hover legible. Note this must restate
   transition:none at (0,3,0) — styles.css's own reduced-motion rule is
   (0,1,0) and section 2 above would otherwise re-enable transitions. */
@media (prefers-reduced-motion:reduce){
  .path__row > .elementor-element > .path__s,
  .path__row > .elementor-element > .path__s::before,
  .path__row > .elementor-element > .path__s::after,
  .path__row > .elementor-element > .path__s .path__n,
  .path__row > .elementor-element > .path__s .path__k,
  .path__row > .elementor-element > .path__s .path__t,
  .path__row > .elementor-element > .path__s .path__b{transition:none}
  .path__row > .elementor-element:hover > .path__s{translate:none}
  .path__row > .elementor-element:hover > .path__s .path__n{scale:none}
  .path__row > .elementor-element:hover > .path__s::after{scale:none}
}
/* ══════════════════════ end THE CASE PATH hover pop ══════════════════════ */



/* ═══════════════════════════════════════════════════════════════════════════
   THE LEDGER BAND (.ledger) — INSTRUMENT ENVIRONMENT.  Added 2026-08-26.

   Founder instruction 2026-08-26: "THIS SECTION LOOKS BORING. VERY VAGUE ...
   40X UPGRADED AND 50X ULTRA BANGERS ... IT NEEDS TO STAND OUT."

   ───────────────────────────────────────────────────────────────────────────
   !!! READ THIS BEFORE TOUCHING THE RAIL ITSELF. !!!

   The animated rail inside the plate is a <canvas data-flow> driven by
   motion.js section 13, which carries an EXPLICIT FOUNDER RULING dated
   2026-08-05:

       "RESTORED 2026-08-05 to the client's original live-tracking animation.
        The four-lane gate-catch rebuild that stood here was rejected by the
        founder outright. This is the original engine, verbatim in behaviour:
        ONE rail, six stage nodes, sixteen glowing dots running left to right,
        the terminus ringed in green. Do not 'improve' it, do not add lanes,
        gates, drop-outs or catches."

   A rebuild of this component HAS ALREADY BEEN REJECTED ONCE. The 2026-08-26
   instruction supersedes the old ruling, but the old rejection is the best
   available evidence about DIRECTION, so this build deliberately does NOT
   touch motion.js and does NOT add lanes, gates, drop-outs or catches.

   Instead it rebuilds EVERYTHING AROUND the rail into a real instrument
   console. The rail keeps running exactly as the founder restored it; what
   changes is the environment it runs in. This is additive and survives either
   answer if the rail engine is ever replaced later.

   ───────────────────────────────────────────────────────────────────────────
   THE ACTUAL DEFECT, MEASURED 2026-08-26 at 1585px logged in:

       .ledger__plate   1120 x 190
       .ledger__canvas  1118 x 188
       rail baseline    y = fH * 0.46 = 86px   (motion.js fResize())
       DEAD SPACE BELOW THE RAIL = 102px, more than half the plate

   The section did not read as boring because the rail is wrong. It read as
   boring because a 1px rail with 2-4px dots floats in 190px of empty box with
   no ground, no frame, no scale and no depth. Everything below adds those.

   ───────────────────────────────────────────────────────────────────────────
   PSEUDO-ELEMENT BUDGET — MEASURED, not assumed.

   Elementor claims ::before on every .e-con for its background overlay, so on
   a CONTAINER only ::after is free. MEASURED on this band:

       .ledger__plate        .e-con  -> ::before position:absolute (CLAIMED)
                                        ::after  position:static   (FREE)
       .ledger__filament     .e-con  -> ::after FREE
       .ledger__hatch        .e-con  -> .e-con, ::after FREE
       w057 canvas wrapper   NOT an .e-con (elementor-widget-html)
                                     -> ::before AND ::after BOTH FREE

   That last one is the whole reason this build is possible without adding a
   single element: the canvas's own widget wrapper sits exactly over the plate
   interior and has two free pseudos. A <canvas> is a replaced element and
   cannot host pseudos itself — the WRAPPER can.

   Every gradient below therefore lives on a PSEUDO-element. Elementor's
   lazy-load rule (.e-con.e-parent:nth-of-type(n+4):not(.e-lazyloaded) *
   {background-image:none !important}) matches descendant ELEMENTS and never an
   element's own pseudo, so none of this needs an !important defence.
   Comment-stripped !important in this file stays 0.

   Z-ORDER, deliberately: plate ::after (ground, z 0) -> canvas wrapper
   (z 1) -> scan sweep (z 2) -> corner brackets (z 3). The wrapper is given
   position:relative for this; it was static and that is the only reason the
   ground would otherwise paint over the rail.
   ═══════════════════════════════════════════════════════════════════════════ */

.ledger{
  --lg-line:rgba(159,176,200,.085);
  --lg-line-soft:rgba(159,176,200,.055);
  --lg-brk:rgba(63,191,132,.55);
  --lg-glow:rgba(63,191,132,.10);
}

/* ── 1. THE PLATE GROUND ──────────────────────────────────────────────────
   Six background layers on one pseudo: a 56px vertical rule field, a 28px
   horizontal rule field, and a four-part baseline ruler (major + minor ticks)
   sitting in the dead 102px under the rail. Masked to a pool so the plate
   never reads as a boxed panel with a hard edge — same radial-mask idiom the
   band's own .ledger__hatch and the .field graphic already use. */
.ledger__plate{position:relative}
.ledger__plate > .elementor-element{position:relative;z-index:1}
.ledger__plate::after{
  content:"";position:absolute;inset:0;z-index:0;pointer-events:none;
  background-image:
    linear-gradient(90deg,var(--lg-line) 1px,transparent 1px),
    linear-gradient(var(--lg-line-soft) 1px,transparent 1px),
    linear-gradient(90deg,rgba(159,176,200,.22) 1px,transparent 1px),
    linear-gradient(90deg,rgba(159,176,200,.12) 1px,transparent 1px);
  background-size:56px 100%, 100% 28px, 112px 9px, 28px 5px;
  background-position:0 0, 0 0, 0 calc(100% - 26px), 0 calc(100% - 22px);
  background-repeat:repeat, repeat, repeat-x, repeat-x;
  -webkit-mask-image:radial-gradient(128% 96% at 50% 46%,#000 32%,rgba(0,0,0,.55) 64%,transparent 92%);
  mask-image:radial-gradient(128% 96% at 50% 46%,#000 32%,rgba(0,0,0,.55) 64%,transparent 92%);
}

/* Deeper plate: keeps the restored border/radius/inset highlight from
   styles.css and only adds depth beneath it. */
.ledger__plate{
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.07),
    inset 0 0 60px -18px rgba(63,191,132,.18),
    0 40px 80px -34px rgba(0,0,0,.85);
}

/* ── 2. THE SCAN SWEEP ────────────────────────────────────────────────────
   A soft green band crossing the plate. Width is 16% of the plate and the
   travel is expressed as a MULTIPLE OF ITS OWN WIDTH (translateX %), so it
   stays correct at every viewport with no media query and no measured pixel
   distance to go stale. transform is safe on a pseudo — pseudos are never
   reveal targets, so Founder Ruling 19 does not apply here. */
.ledger__plate > .elementor-element::before{
  content:"";position:absolute;top:0;bottom:0;left:0;width:16%;z-index:2;
  pointer-events:none;
  background:linear-gradient(90deg,
    transparent,
    rgba(63,191,132,.05) 28%,
    rgba(63,191,132,.13) 50%,
    rgba(63,191,132,.05) 72%,
    transparent);
  transform:translateX(-100%);
}

/* ── 3. CORNER BRACKETS ───────────────────────────────────────────────────
   Eight background layers on one pseudo — four corners, two arms each. The
   site's own instrument idiom (391 .rts-frame, 392 .wof-frame, 387 .clh).
   Static by design: the brackets are the frame, not the motion. */
.ledger__plate > .elementor-element::after{
  content:"";position:absolute;inset:11px;z-index:3;pointer-events:none;
  background-image:
    linear-gradient(var(--lg-brk),var(--lg-brk)),linear-gradient(var(--lg-brk),var(--lg-brk)),
    linear-gradient(var(--lg-brk),var(--lg-brk)),linear-gradient(var(--lg-brk),var(--lg-brk)),
    linear-gradient(var(--lg-brk),var(--lg-brk)),linear-gradient(var(--lg-brk),var(--lg-brk)),
    linear-gradient(var(--lg-brk),var(--lg-brk)),linear-gradient(var(--lg-brk),var(--lg-brk));
  background-size:16px 2px,2px 16px,16px 2px,2px 16px,16px 2px,2px 16px,16px 2px,2px 16px;
  background-position:
    left top,left top,right top,right top,
    left bottom,left bottom,right bottom,right bottom;
  background-repeat:no-repeat;
}

/* ── 4. BAND DEPTH ────────────────────────────────────────────────────────
   A wide, very low green wash centred behind the plate, so the band has a
   light source instead of being flat navy. On .ledger__hatch's free pseudo —
   that element is already inset:0 and pointer-events:none. */
.ledger__hatch::after{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:radial-gradient(64% 52% at 50% 52%,var(--lg-glow),transparent 72%);
}

/* A travelling node on the top seam, so the filament reads as a live wire
   rather than a static hairline. */
.ledger__filament{overflow:hidden}
.ledger__filament::after{
  content:"";position:absolute;top:0;left:0;width:14%;height:1px;
  background:linear-gradient(90deg,transparent,rgba(63,191,132,1),transparent);
  transform:translateX(-100%);
}

/* ── 5. THE HEAD, AS A READOUT ────────────────────────────────────────────
   The label and pill were correct but sat unframed. Bracket the label, and
   give the pill a leading state tick so it reads as an instrument value and
   not a marketing chip. No colour is invented: --green-bright is already the
   band's own live colour and already measured 7.4:1 on navy-deep in
   styles.css's own note. */
.ledger__label::before{
  content:"[";margin-right:2px;color:rgba(159,176,200,.45);font-weight:400;
}
.ledger__label::after{
  content:"]";margin-left:2px;color:rgba(159,176,200,.45);font-weight:400;
}
.ledger__badge{
  position:relative;padding-left:26px;
  box-shadow:inset 0 0 0 1px rgba(63,191,132,.10),0 0 22px -8px rgba(63,191,132,.55);
}
.ledger__badge::before{
  content:"";position:absolute;left:12px;top:50%;width:6px;height:6px;margin-top:-3px;
  background:var(--green-bright);
  clip-path:polygon(50% 0,100% 50%,50% 100%,0 50%);
}

/* Caption gets the same bracket language as the label. */
.ledger__cap{position:relative;padding-left:14px}
.ledger__cap::before{
  content:"";position:absolute;left:0;top:.62em;width:8px;height:1px;
  background:rgba(111,126,150,.8);
}

/* ── 6. MOTION ────────────────────────────────────────────────────────────
   Everything animated is inside prefers-reduced-motion:no-preference, and the
   BASE state of every animated pseudo above is already its resting position
   (both sweeps park off-stage at translateX(-100%)), so with motion reduced
   the console is a complete, correct, static instrument — never a half-drawn
   one. Two composited properties only: transform and opacity. */
@media (prefers-reduced-motion:no-preference){
  .ledger__plate > .elementor-element::before{
    animation:lg-scan 9s cubic-bezier(.55,0,.45,1) infinite;
  }
  .ledger__filament::after{
    animation:lg-wire 6.4s linear infinite;
  }
}
/* 16% wide, so 725% of its own width ≈ 116% of the plate: fully off-stage at
   both ends regardless of viewport. */
@keyframes lg-scan{
  0%{transform:translateX(-100%);opacity:0}
  8%{opacity:1}
  76%{opacity:1}
  86%,100%{transform:translateX(725%);opacity:0}
}
/* 14% wide -> 814% ≈ 114%. */
@keyframes lg-wire{
  0%{transform:translateX(-100%);opacity:0}
  10%{opacity:1}
  80%{opacity:1}
  92%,100%{transform:translateX(814%);opacity:0}
}

/* ── 7. NARROW ────────────────────────────────────────────────────────────
   styles.css drops the canvas to 160px at <=760px, so the ruler must ride up
   with it and the grid must loosen or it reads as noise at phone size. */
@media (max-width:760px){
  .ledger__plate::after{
    background-size:40px 100%, 100% 24px, 80px 8px, 20px 4px;
    background-position:0 0, 0 0, 0 calc(100% - 20px), 0 calc(100% - 17px);
  }
  .ledger__plate > .elementor-element::after{inset:8px;background-size:11px 2px,2px 11px,11px 2px,2px 11px,11px 2px,2px 11px,11px 2px,2px 11px}
  .ledger__badge{padding-left:22px}
  .ledger__badge::before{left:9px}
}
/* ═════════════════════ end THE LEDGER BAND instrument ════════════════════ */



/* ═══════════════════════════════════════════════════════════════════════════
   02 / THE SYSTEM (.laws statute rail) — REPAIR, COMPRESSION, INSTRUMENTATION
   Added 2026-08-26.

   Founder instruction 2026-08-26: "ITS TOO LONG FOR ONE THING ... IT'S JUST BIG
   WITH NO MEANING ... THERE ARE NO GRAPHICS AND ANIMATIONS ... 50X ULTRA
   BANGERS."

   ───────────────────────────────────────────────────────────────────────────
   !!! "TOO BIG" IS THE SAME COMPLAINT THIS SECTION WAS REBUILT TWICE FOR. !!!

   styles.css's own header on this component records it:

       "Rebuilt 2026-08-03 (2nd rebuild). The four short centred columns and
        the .xit exit-state register are both gone — THE CLIENT CALLED THE
        SECTION TOO BIG and the register wrong for the site. What replaces them
        is ONE statute rail ... NO CARDS, NO BORDERS, NO FILLS, NOTHING BOXED —
        the rail is the only graphic."

   So "too long" is a THIRD instance of the same note, and "no cards, no fills,
   nothing boxed" is a standing client ruling on THIS block. Those two together
   define the shape of this build:

       DENSER, NOT LONGER. More drawn information per pixel, less vertical
       sprawl. NOTHING is boxed, carded, filled or bordered into a panel.

   Every graphic below is a rule, a tick, a sweep or a glow on an existing
   surface. If a future pass is tempted to add cards here, read the ruling
   above first — they have already been removed once.

   ───────────────────────────────────────────────────────────────────────────
   MEASURED live 2026-08-26 at 1585px BEFORE any change:

       #system section height   1495px      padding-top 160 / bottom 66
       .laws                    1080 x 902
       .law padding             40px 0 40px 36px   -> 320px of padding alone
       clause heights           238 / 238 / 213 / 213

   ───────────────────────────────────────────────────────────────────────────
   !!! A DEAD DIVIDER — THE WRAPPER TRAP AGAIN, THIRD COMPONENT ON THIS PAGE. !!!

   Each <li class="law"> is its own Elementor text-editor widget (w188..w191),
   so no .law is ever a sibling of another .law. MEASURED:

       .law parent              div.elementor-element   (NOT .laws)
       lawIsDirectChildOfLaws   false
       every clause nth-child   1 of 1

   Therefore `.law + .law { border-top: 1px solid rgba(221,231,228,.1) }` in
   styles.css MATCHES NOTHING. MEASURED borderTopWidth on clause 02 = **0px**.
   The four clauses have been running with no dividers at all.

   Re-targeted at the WRAPPER's position below, the same repair already applied
   to .path (enroll steps) earlier today and to the Story route rail on
   2026-08-18. THIS IS NOW THE THIRD CONFIRMED INSTANCE ON THE HOMEPAGE —
   assume any `+`, `:nth-child` or `:last-child` selector in styles.css that
   targets a repeated design element is dead until measured otherwise.

   NOT broken, checked and left alone: the rail segments DO abut. MEASURED
   gaps between clause boxes [0,0,0] and .laws row-gap 0, so the four
   `.law::before` segments already read as one continuous line.

   ───────────────────────────────────────────────────────────────────────────
   DRAWING BUDGET — MEASURED, not assumed.

       .laws               .e-con  -> ::before CLAIMED by Elementor · ::after FREE
       .law                        -> ::before dim rail · ::after green fill  BOTH TAKEN
       law widget wrapper  NOT .e-con, already position:relative
                                   -> ::before AND ::after BOTH FREE
       .law__n / .law__c / .law__k -> FREE

   The wrapper's two free pseudos are what make per-clause instrumentation
   possible without adding a single element — same unlock as the ledger band.

   All motion is driven by `.is-on`, which motion.js section 16 adds ONCE per
   clause on scroll and never removes. That preserves the component's stated
   contract — "the rail is a record, not a loop" — while still giving the
   section real motion. Nothing here loops except one 60s ground drift.
   ═══════════════════════════════════════════════════════════════════════════ */

#system{
  --sy-line:rgba(221,231,228,.10);
  --sy-line-soft:rgba(221,231,228,.055);
  --sy-live:rgba(63,191,132,.55);
}

/* ── 1. REPAIR: the dead clause divider ───────────────────────────────────
   On the WRAPPER, because no .law is ever a sibling of another .law. */
.laws > .elementor-element + .elementor-element{
  border-top:1px solid rgba(221,231,228,.1);
}

/* ── 2. COMPRESSION — the "too long" complaint, answered with numbers ─────
   .law padding-block clamp(26,3vw,40) -> clamp(18,2vw,28): at 1585px that is
   40 -> 28 per side, 24px per clause, 96px across four. Section padding-top
   160 -> 100 gives another 60. ~156px off a 1495px section without touching
   one word of copy or cramping the reading measure.
   Scoped to #system so --section-y and every other .sec are untouched — the
   same technique elementor-bridge.css RULE 10 already uses on this exact
   section for padding-bottom. */
#system{padding-top:clamp(64px,7vw,100px)}
.laws{margin-top:clamp(32px,3.6vw,52px)}
.law{padding-block:clamp(18px,2vw,28px)}

/* ── 3. THE GROUND ────────────────────────────────────────────────────────
   A drawing surface under the whole rail: 30deg hatch on the same isometric
   axis the .ledger band and the .field graphics already use, plus a coarse
   vertical rule field. Radial-masked so it fades out well before the edges and
   never reads as a panel with a boundary. NOT a card, not a fill. */
.laws{position:relative}
.laws > .elementor-element{position:relative;z-index:1}
.laws::after{
  content:"";position:absolute;inset:-10px -40px;z-index:0;pointer-events:none;
  background-image:
    repeating-linear-gradient(30deg,var(--sy-line-soft) 0 1px,transparent 1px 11px),
    linear-gradient(90deg,var(--sy-line) 1px,transparent 1px);
  background-size:auto, 90px 100%;
  -webkit-mask-image:radial-gradient(112% 86% at 46% 50%,#000 26%,rgba(0,0,0,.5) 62%,transparent 88%);
  mask-image:radial-gradient(112% 86% at 46% 50%,#000 26%,rgba(0,0,0,.5) 62%,transparent 88%);
}

/* ── 4. PER-CLAUSE INSTRUMENTATION ────────────────────────────────────────
   ::before  a light sweep that crosses the clause once, when it lights
   ::after   a node that travels DOWN the rail as the rail fill draws
   Both park off-stage at rest, so an unlit clause is exactly what it is today
   and a clause that never lights is never half-drawn. */
.laws > .elementor-element{overflow:hidden}

.laws > .elementor-element::before{
  content:"";position:absolute;top:0;bottom:0;left:0;width:22%;z-index:2;
  pointer-events:none;opacity:0;
  background:linear-gradient(90deg,
    transparent,rgba(63,191,132,.05) 34%,rgba(63,191,132,.11) 50%,rgba(63,191,132,.05) 66%,transparent);
  transform:translateX(-100%);
}

/* The node is a 26px BAND inside a full-height 2px column, moved with
   background-position rather than transform. Deliberate: translateY
   percentages resolve against the element's OWN height, so a 26px node could
   never express "travel the height of this clause", and 100cqh would need a
   container-type declaration that would impose size containment on a widget
   wrapper. background-position 0 -> 100% travels the true height at any clause
   height, at any viewport, with nothing measured to go stale. It is a 2px-wide
   column, so the paint cost is negligible, and drop-shadow follows the band's
   alpha so only the node glows — not the whole column. */
.laws > .elementor-element::after{
  content:"";position:absolute;left:0;top:0;bottom:0;width:2px;z-index:3;
  pointer-events:none;opacity:0;
  background-image:linear-gradient(180deg,transparent,var(--green-bright),transparent);
  background-size:100% 26px;
  background-repeat:no-repeat;
  background-position:0 -26px;
  filter:drop-shadow(0 0 8px rgba(63,191,132,.75));
}

/* ── 5. THE NUMERAL, AS AN INSTRUMENT ─────────────────────────────────────
   A glow behind the outline when the clause lights, and a small bracket mark
   that draws beside it. Both on .law__n's own free pseudos. */
.law__n{position:relative}
.law__n::before{
  content:"";position:absolute;left:50%;top:50%;width:150%;height:150%;
  transform:translate(-50%,-50%) scale(.6);transform-origin:50% 50%;
  background:radial-gradient(50% 50% at 50% 50%,rgba(63,191,132,.20),transparent 70%);
  opacity:0;pointer-events:none;z-index:-1;
  transition:opacity 520ms var(--ease-enter),transform 620ms var(--ease-enter);
}
.law__n::after{
  content:"";position:absolute;left:-14px;top:6px;bottom:6px;width:6px;
  border-left:1px solid var(--sy-live);
  border-top:1px solid var(--sy-live);
  border-bottom:1px solid var(--sy-live);
  opacity:0;transform:translateX(-4px);
  transition:opacity 420ms var(--ease-enter) 120ms,transform 420ms var(--ease-enter) 120ms;
}
.law.is-on .law__n::before{opacity:1;transform:translate(-50%,-50%) scale(1)}
.law.is-on .law__n::after{opacity:1;transform:none}

/* ── 6. THE KICKER STAMP ──────────────────────────────────────────────────
   A diamond state tick, matching the ledger band's readout pill so the two
   dark instrument surfaces on this page speak the same language. */
.law__k span{padding-left:16px}
.law__k span::before{
  content:"";position:absolute;left:0;top:.45em;width:6px;height:6px;
  background:currentColor;
  clip-path:polygon(50% 0,100% 50%,50% 100%,0 50%);
  opacity:0;transform:scale(.4);
  transition:opacity 380ms var(--ease-enter) 180ms,transform 420ms var(--ease-punch) 180ms;
}
.law.is-on .law__k span::before{opacity:1;transform:none}

/* ── 7. MOTION ────────────────────────────────────────────────────────────
   One-shot per clause, fired by .is-on. Nothing loops except a 60s ground
   drift of a single 90px cell — deliberately at the edge of perception, in
   keeping with the site's 0.25 motion dial on a crisis-services surface.
   transform and opacity only. */
/* :has() is used here to drive a WRAPPER's pseudo from a class motion.js puts
   on its CHILD. It is proven on this site (post 387, 2026-08-25) and needs no
   JS change — motion.js section 16 is untouched. */
@media (prefers-reduced-motion:no-preference){
  .laws > .elementor-element:has(.law.is-on)::before{
    animation:sy-sweep 1150ms cubic-bezier(.4,0,.2,1) both;
  }
  .laws > .elementor-element:has(.law.is-on)::after{
    animation:sy-drop 950ms cubic-bezier(.5,0,.3,1) both;
  }
  .laws::after{animation:sy-drift 60s linear infinite}
}
/* 22% wide -> 555% ≈ 122% of the clause: fully off-stage at both ends at any
   viewport, with no measured pixel distance to go stale. */
@keyframes sy-sweep{
  0%{transform:translateX(-100%);opacity:0}
  14%{opacity:1}
  70%{opacity:1}
  100%{transform:translateX(555%);opacity:0}
}
@keyframes sy-drop{
  0%{background-position:0 -26px;opacity:0}
  12%{opacity:1}
  80%{opacity:1}
  100%{background-position:0 100%;opacity:0}
}
@keyframes sy-drift{to{background-position:0 0, 90px 0}}

/* ── 8. NARROW ────────────────────────────────────────────────────────────
   styles.css collapses .law to two columns at <=860px and moves the kicker
   under the body. The gutter bracket has no room there and the ground grid
   reads as noise, so both step down. */
@media (max-width:860px){
  .law__n::after{display:none}
  .laws::after{inset:-6px -18px;background-size:auto, 56px 100%}
  .law{padding-block:clamp(16px,3.4vw,22px)}
}
/* ══════════════════ end 02 / THE SYSTEM instrumentation ══════════════════ */



/* ═══════════════════════════════════════════════════════════════════════════
   05 / CONTACT (.ctb) — TWO FOUNDER-REPORTED DEFECTS.  Added 2026-08-26.

   Founder 2026-08-26: "WHY IS THERE A COLOR BOX IN ALL 2 BOTTONS. WHY WHY WHY.
   REMOVE THE COLOR BOX THAT THE WORDS ARE IN THE BOTTONS." and "THE ANIMATION
   BOX IS NOT THE ORIGINAL ANIMINATION BOX THAT I HAD.. IT WAS BIGGER AND
   WIDER."

   Both reports are ACCURATE. Both root causes measured below.

   ───────────────────────────────────────────────────────────────────────────
   DEFECT 1 — THE COLOUR BOX. It is Elementor's default button skin.

   This is the wrapper trap that CLAUDE.md documents repeatedly, in its most
   visible form yet. Elementor Button widgets put the widget's custom CSS
   classes on the WRAPPER DIV and give the real <a> Elementor's OWN classes.
   MEASURED live 2026-08-26 at 1585px:

       wrapper  div.elementor-element-w333 .btn .btn--primary   <- site classes
       real <a> a.elementor-button.elementor-button-link.elementor-size-sm
                background-color  rgb(105, 114, 125)   <- ELEMENTOR DEFAULT GREY
                padding           12px 24px
                border-radius     3px

   So the site's pill is drawn on the wrapper, and INSIDE it Elementor paints
   its own grey rounded rectangle around the words. That grey rectangle IS the
   "colour box the words are in." The founder's description is exact.

   SCOPE MEASURED, not assumed: there are exactly **3** Elementor Button
   widgets on the entire homepage and **all 3** carry the grey box, and all 3
   are in #contact. Nothing else on the page is affected, so this is scoped to
   .ctb__cta rather than fixed globally.

   The fix is CSS, not a widget conversion. CLAUDE.md's precedent for this trap
   was converting to a raw HTML widget (nav buttons, w014, w199) — correct when
   a real CSS CLASS must land on the <a>. Here nothing needs a class on the
   <a>: the wrapper already carries the full .btn treatment and renders it
   correctly. All that is required is to stop Elementor's skin painting inside
   it. That is reversible, touches no Elementor content, and keeps the widget
   native for SEO (Founder Ruling 6).

   Specificity: real ancestor classes to (0,5,0) plus body.home, so it outranks
   Elementor's own kit rules regardless of combine order. No !important.

   ───────────────────────────────────────────────────────────────────────────
   !!! DEFECT 2 — THIS REVERSES elementor-bridge.css RULE 13, WHICH THE FOUNDER
   HIMSELF REQUESTED ON 2026-08-18. READ BEFORE CHANGING IT BACK. !!!

   RULE 13 PART A was added on founder request against the Figma. Its own note
   records: "MEASURED live before: .term 528.66px == .ctb__stage 528.66px,
   exactly full-column, confirming 'stretching wide.'" It set
   `@media (min-width:1081px){ .term{ max-width:52%; margin-inline:auto } }`.

   MEASURED 2026-08-26 before this change: .term 344px wide, max-width 52%,
   margin-inline 158.56px — i.e. RULE 13 is doing exactly what it was asked to.

   **The 2026-08-26 instruction is the direct opposite of the 2026-08-18 one.**
   The newer instruction wins and is applied here, but the reversal is
   deliberate and is flagged rather than silent. If a future session sees a
   full-width console and "fixes" it back to 52% citing RULE 13, it will be
   undoing a later founder decision.

   PART A is reversed in full (back to full column — "the original box").
   PART B (height: .term__screen padding 22/20 -> 16/14 and .tml line-height
   2.02 -> 1.56) is ALSO reversed, because the founder's word was "BIGGER AND
   WIDER" and PART B is what made it shorter. RULE 13's own note confirms the
   pre-change values, which are what is restored.

   RULE 13 itself is NOT edited — elementor-bridge.css is a shared file with
   another session's recent writes on it. This overrides from motion-plus.css,
   which is home-only and, per inc/asset-map.php, is enqueued INSIDE the
   per-slug switch while oig-elementor-bridge is enqueued BEFORE it — so
   motion-plus loads later and wins. Higher specificity is used anyway so the
   override does not depend on load order.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── 1. REMOVE THE COLOUR BOX ─────────────────────────────────────────────
   Neutralise Elementor's default button skin so the real <a> is a transparent
   label inside the site's own pill. The pill (background, border, radius,
   padding, type) continues to come from .btn/.btn--primary/.btn--outline on
   the wrapper, exactly as designed — nothing about the site's button system
   changes. */
body.home .ctb .ctb__cta .elementor-element .elementor-button,
body.home .ctb .ctb__cta .elementor-element .elementor-button:hover,
body.home .ctb .ctb__cta .elementor-element .elementor-button:focus,
body.home .ctb .ctb__cta .elementor-element .elementor-button:visited{
  background-color:transparent;
  background-image:none;
  padding:0;
  border:0;
  border-radius:0;
  box-shadow:none;
  color:inherit;
  font:inherit;
  letter-spacing:inherit;
  text-transform:inherit;
  text-decoration:none;
  fill:currentColor;
  display:block;
  width:100%;
}
/* Elementor nests the label two levels deep; both must stop painting and both
   must inherit the wrapper's type or the pill's font is silently overridden. */
body.home .ctb .ctb__cta .elementor-element .elementor-button-content-wrapper,
body.home .ctb .ctb__cta .elementor-element .elementor-button-text{
  background:none;
  color:inherit;
  font:inherit;
  letter-spacing:inherit;
  text-transform:inherit;
  display:block;
  width:100%;
}

/* ── 2. RESTORE THE ORIGINAL CONSOLE SIZE — reverses RULE 13 A + B ────────
   Values are the pre-2026-08-18 originals, taken from RULE 13's own record of
   what it changed. */
@media (min-width:1081px){
  body.home .ctb .ctb__stage .term{
    max-width:none;
    margin-inline:0;
  }
}
body.home .ctb .term__screen{
  padding-top:22px;
  padding-bottom:20px;
}
body.home .ctb .tml{
  line-height:2.02;
  min-height:2.02em;
}
/* ══════════════════════ end 05 / CONTACT defect fixes ════════════════════ */



/* ═══════════════════════════════════════════════════════════════════════════
   THE AUDITOR'S FINDING (.pull band-navy) — "SOMETHING EXTRA".  2026-08-26.

   Founder 2026-08-26: "THIS SECTION NOT MUCH NEEDS TO HAPPEN. I LIKE THE
   MINIMALIST LOOK BUT YOU CAN ADD A LITTLE SOMETHING SOMETHING EXTRA TO MAKE
   IT LOOK BAD ASS AND FANTASTIC."

   The brief is the constraint: KEEP IT MINIMAL. So nothing here adds a shape,
   a panel, a box or a second focal point. Five refinements, all of them depth
   or framing on surfaces that already exist, all of them one-shot on reveal
   except one 61s parallax drift.

   ───────────────────────────────────────────────────────────────────────────
   MEASURED live 2026-08-26 at 1585px before building.

   DRAWING BUDGET — the surprise here is that `.pull::before` is NOT free:

       .pull        .e-con -> ::before CLAIMED **AND ACTIVELY PAINTING**
                              (computed background-image = SET, not none)
                              ::after FREE
       .pull__grid  .e-con -> ::after FREE
       .pull__in    .e-con -> ::after FREE
       .pull__cite         -> ::before AND ::after BOTH TAKEN — they are the
                              two orange gradient rules flanking the citation
       .pull__q / blockquote -> all four FREE
       w122 wrapper NOT .e-con, position:relative -> ::before AND ::after FREE

   On most containers Elementor's ::before is inert; on THIS one it is live.
   Measure `backgroundImage`, not just `content`, before claiming a container
   pseudo is available.

   Z-ORDER, existing: .pull__grid (bottom) · .pull__in z-index 2 (content).
   The bloom is inserted at z-index 1, BETWEEN them.

   REVEAL: motion.js writes `.is-in` to `.pull` (styles.css already relies on
   it for .pull__line and for pausing the grid drift). Everything below hangs
   off that same class — no JS change, and motion.js is untouched.
   ═══════════════════════════════════════════════════════════════════════════ */

.pull{
  --pl-ink:rgba(224,122,47,.75);
  --pl-hair:rgba(221,231,228,.2);
}

/* ── 1. PARALLAX — a second, finer grid drifting the OTHER way ────────────
   styles.css already drifts a 34px record grid one cell over 44s. This adds a
   17px grid at half the alpha drifting the opposite direction over 61s. Two
   grids at different scales and opposing speeds read as depth rather than as
   a texture — and 44 and 61 are coprime, so the two never resynchronise into
   a visible beat. Inherits the parent's radial mask, so it dissolves behind
   the words exactly as the first grid does. */
.pull__grid::after{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:
    linear-gradient(rgba(221,231,228,.07) 1px,transparent 1px) 0 0/100% 17px,
    linear-gradient(90deg,rgba(221,231,228,.07) 1px,transparent 1px) 0 0/17px 100%;
}
@keyframes pull-drift-b{from{transform:translate3d(0,0,0)}to{transform:translate3d(17px,17px,0)}}

/* ── 2. THE BLOOM ─────────────────────────────────────────────────────────
   A single wide, very low warm light behind the words, so the quote sits in a
   light source instead of on flat navy. Blooms once when the band lights and
   then holds — it is not a pulse. z-index 1 puts it above the grids and below
   .pull__in's z-index 2 content. */
.pull::after{
  content:"";position:absolute;inset:0;z-index:1;pointer-events:none;
  background:radial-gradient(52% 46% at 50% 50%,rgba(224,122,47,.10),transparent 70%);
  opacity:0;transform:scale(.86);
  transition:opacity 1100ms var(--ease-enter) 120ms,transform 1400ms var(--ease-enter) 120ms;
}
.pull.is-in::after{opacity:1;transform:none}

/* ── 3. THE MARK ──────────────────────────────────────────────────────────
   A hairline drawn down into the quote. blockquote is already
   display:flex;flex-direction:column;align-items:center, so ::before becomes
   its first flex item and centres itself with no positioning. It draws top-
   down on reveal, and it balances the two gradient rules that already flank
   the citation below — the band gets a top mark and a bottom mark instead of
   only a bottom one. This is the only change that adds height. */
.pull blockquote::before{
  content:"";flex:none;width:1px;height:clamp(26px,3vw,44px);
  margin-bottom:clamp(20px,2.4vw,32px);
  background:linear-gradient(180deg,transparent,var(--pl-ink));
  transform:scaleY(0);transform-origin:top center;
  transition:transform 780ms var(--ease-scrub) 80ms;
}
.pull.is-in blockquote::before{transform:scaleY(1)}

/* ── 4. THE FRAME ─────────────────────────────────────────────────────────
   Corner brackets around the QUOTE BLOCK, not the band — the band is
   full-bleed and bracketing it would draw a box, which the minimal brief
   rules out. Eight background layers on one pseudo, the site's own instrument
   idiom (391 .rts-frame, 392 .wof-frame, the ledger band earlier today).
   Fades in with the reveal; never animates after. */
.pull__in .elementor-element::after{
  content:"";position:absolute;inset:-6px clamp(-46px,-3vw,-14px);z-index:3;
  pointer-events:none;opacity:0;
  background-image:
    linear-gradient(var(--pl-ink),var(--pl-ink)),linear-gradient(var(--pl-ink),var(--pl-ink)),
    linear-gradient(var(--pl-ink),var(--pl-ink)),linear-gradient(var(--pl-ink),var(--pl-ink)),
    linear-gradient(var(--pl-ink),var(--pl-ink)),linear-gradient(var(--pl-ink),var(--pl-ink)),
    linear-gradient(var(--pl-ink),var(--pl-ink)),linear-gradient(var(--pl-ink),var(--pl-ink));
  background-size:18px 1px,1px 18px,18px 1px,1px 18px,18px 1px,1px 18px,18px 1px,1px 18px;
  background-position:
    left top,left top,right top,right top,
    left bottom,left bottom,right bottom,right bottom;
  background-repeat:no-repeat;
  transition:opacity 700ms var(--ease-enter) 460ms;
}
.pull.is-in .pull__in .elementor-element::after{opacity:1}

/* ── 5. THE SHEEN ─────────────────────────────────────────────────────────
   One slow pass of light across the quote as it lands, then gone for good.
   Width is 26% and travel is expressed as a MULTIPLE OF ITS OWN WIDTH, so it
   crosses correctly at every viewport with no measured pixel distance. */
.pull__in::after{
  content:"";position:absolute;top:-10%;bottom:-10%;left:0;width:26%;z-index:4;
  pointer-events:none;opacity:0;
  background:linear-gradient(100deg,
    transparent,rgba(255,255,255,.03) 34%,rgba(255,255,255,.07) 50%,rgba(255,255,255,.03) 66%,transparent);
  transform:translateX(-100%);
}

@media (prefers-reduced-motion:no-preference){
  .pull__grid::after{animation:pull-drift-b 61s linear infinite}
  .pull:not(.is-in) .pull__grid::after{animation-play-state:paused}
  .pull.is-in .pull__in::after{animation:pull-sheen 1900ms cubic-bezier(.45,0,.3,1) 320ms both}
}
/* 26% wide -> 485% ≈ 126% of the shell: fully off-stage at both ends. */
@keyframes pull-sheen{
  0%{transform:translateX(-100%);opacity:0}
  16%{opacity:1}
  74%{opacity:1}
  100%{transform:translateX(485%);opacity:0}
}

/* ── 6. NARROW ────────────────────────────────────────────────────────────
   At phone width the second grid reads as noise against the first and the
   brackets have no gutter to sit in, so both step back. */
@media (max-width:760px){
  .pull__grid::after{background-size:100% 26px,26px 100%;opacity:.6}
  .pull__in .elementor-element::after{inset:-4px -8px;background-size:12px 1px,1px 12px,12px 1px,1px 12px,12px 1px,1px 12px,12px 1px,1px 12px}
  .pull blockquote::before{height:clamp(20px,5vw,26px);margin-bottom:clamp(16px,4vw,22px)}
}
/* ═══════════════════ end THE AUDITOR'S FINDING extras ════════════════════ */



/* ═══════════════════════════════════════════════════════════════════════════
   THREE SECTIONS, ONE PASS — 2026-08-26
     A · "the handoff LANDS" comparison   (.vs, band-navy)
     B · The film                          (.reel, band-deep)
     C · The referral standard             (#referral-standard, band-stone)

   Founder 2026-08-26, all three: "IT DOESN'T GET ME EXCITED ... VERY VAGUE ...
   THERE ARE NO GRAPHICS AND ANIMATIONS ... 50X ULTRA BANGERS."

   MEASURED live 2026-08-26 at 1585px before building. Drawing budget checked
   per element — on this theme a CONTAINER (.e-con) reserves ::before for
   Elementor's background overlay and leaves only ::after, while a WIDGET
   WRAPPER is not an .e-con and leaves BOTH free. Every layer below is on a
   pseudo, so Elementor's lazy-load `background-image:none!important` rule
   (which matches descendant ELEMENTS, never an element's own pseudo) cannot
   reach any of it and no !important is needed anywhere.
   ═══════════════════════════════════════════════════════════════════════════ */


/* ══ A · THE COMPARISON (.vs) ═════════════════════════════════════════════
   MEASURED: section band-navy rgb(20,35,63), .vs__row grid
   "444px 44px 444px", 5 rows, rows ARE direct children of .vs (so :nth-child
   is safe here — unlike .path and .laws), and each row's four widget wrappers
   already carry display:contents, so .vs__n / .vs__then / .vs__arrow /
   .vs__now are the real grid items. Structure is sound; it was only bare.

   Free: .vs::after · .vs__row::after · .vs__legend::after.
   .vs::before and .vs__row::before are Elementor's — both measured
   position:absolute. NOT USED.

   Deliberately NO reveal-class dependency here. motion.js drives this block
   through `data-cmp`, whose class contract this build did not verify, so
   everything below is either ambient or pointer-driven. Nothing can be left
   half-drawn by a reveal that does not fire. */

.vs{
  --v-old:rgba(224,122,47,.55);
  --v-new:rgba(63,191,132,.55);
  position:relative;
}

/* Ground: the same 30deg isometric hatch the ledger band and .field use, so
   this band belongs to the same drawing. Masked to a pool. */
.vs::after{
  content:"";position:absolute;inset:-24px -40px;z-index:0;pointer-events:none;
  background-image:
    repeating-linear-gradient(30deg,rgba(221,231,228,.05) 0 1px,transparent 1px 12px),
    linear-gradient(90deg,rgba(221,231,228,.07) 1px,transparent 1px);
  background-size:auto, 74px 100%;
  -webkit-mask-image:radial-gradient(118% 88% at 50% 50%,#000 24%,rgba(0,0,0,.45) 62%,transparent 90%);
  mask-image:radial-gradient(118% 88% at 50% 50%,#000 24%,rgba(0,0,0,.45) 62%,transparent 90%);
  animation:vs-drift 74s linear infinite;
}
@keyframes vs-drift{to{background-position:0 0, 74px 0}}
.vs > *{position:relative;z-index:1}

/* A hairline under every row but the last, so five statements read as a
   ledger rather than as floating text. Rows ARE siblings here, so the
   :not(:last-child) is real — VERIFIED rowsAreDirectChildren: true. */
.vs .vs__row:not(:last-child)::after{
  content:"";position:absolute;left:0;right:0;bottom:0;height:1px;
  background:linear-gradient(90deg,transparent,rgba(221,231,228,.13) 12%,rgba(221,231,228,.13) 88%,transparent);
  pointer-events:none;
}

/* Pointer-driven, fine pointers only — a row lifts, its ghost ordinal
   ignites, the retired statement dims further and the replacement brightens.
   `translate` (independent property) is used rather than `transform`, per
   Founder Ruling 19, so nothing this touches can collide with a reveal that
   owns transform. */
@media (hover:hover) and (pointer:fine){
  .vs .vs__row{
    transition:translate 320ms var(--ease-punch),background-color 260ms var(--ease-enter);
    border-radius:2px;
  }
  .vs .vs__row:hover{
    translate:0 -3px;
    background-color:rgba(221,231,228,.035);
  }
  .vs .vs__n,.vs .vs__then,.vs .vs__now{
    transition:color 260ms var(--ease-enter),opacity 260ms var(--ease-enter),
               -webkit-text-stroke-color 260ms var(--ease-enter);
  }
  .vs .vs__row:hover .vs__n{-webkit-text-stroke-color:var(--v-new);color:transparent}
  .vs .vs__row:hover .vs__then{opacity:.55}
}

/* The legend reads as a live control: a state dot on each key. */
.vs__key{position:relative;padding-left:18px}
.vs__key::before{
  content:"";position:absolute;left:0;top:50%;width:7px;height:7px;margin-top:-3.5px;
  border-radius:50%;
}
.vs__key--old::before{background:var(--v-old)}
.vs__key--new::before{background:var(--green-bright);box-shadow:0 0 10px 1px rgba(63,191,132,.6)}


/* ══ B · THE FILM (.reel) ═════════════════════════════════════════════════
   MEASURED: .reel 760x495 on band-deep rgb(11,23,41); .reel__frame 760x428,
   position:relative, overflow VISIBLE, radius 0; .reel__play 86x86.
   Free: the reel's widget wrapper (NOT an .e-con, position:relative) BOTH
   pseudos · .reel__frame BOTH · .reel__play BOTH.

   The frame is overflow:visible, so a full-bleed sweep would escape it. Every
   layer below is therefore inset INSIDE the frame, or is a ring on the play
   control which is meant to sit proud of it. */

.reel{--r-live:rgba(63,191,132,.55)}

/* Depth behind the plate — the band gets a light source. */
.reel__frame::before{
  content:"";position:absolute;inset:-30px;z-index:-1;pointer-events:none;
  background:radial-gradient(58% 54% at 50% 50%,rgba(63,191,132,.13),transparent 72%);
}

/* A slow scan across the still, so the plate reads as a live feed rather than
   a screenshot. Clipped by its own inset, since the frame does not clip. */
.reel__frame::after{
  content:"";position:absolute;inset:1px;z-index:2;pointer-events:none;
  overflow:hidden;
  background-image:
    repeating-linear-gradient(0deg,rgba(11,23,41,.16) 0 1px,transparent 1px 3px),
    linear-gradient(100deg,transparent 42%,rgba(255,255,255,.055) 50%,transparent 58%);
  background-size:100% 3px, 260% 100%;
  background-repeat:repeat, no-repeat;
  background-position:0 0, -80% 0;
}

/* The play control invites the press: a ring that breathes out and fades. */
.reel__play::after{
  content:"";position:absolute;inset:-10px;border-radius:50%;pointer-events:none;
  border:1px solid var(--r-live);opacity:0;
}
.reel__play:hover::after,.reel__play:focus-visible::after{opacity:.9;transition:opacity 200ms}

@media (prefers-reduced-motion:no-preference){
  .reel__frame::after{animation:reel-scan 7.5s cubic-bezier(.6,0,.4,1) infinite}
  .reel__play::after{animation:reel-ring 3.4s ease-out infinite}
  .reel__play:hover::after{animation:none}
}
@keyframes reel-scan{
  0%{background-position:0 0,-80% 0}
  100%{background-position:0 0,180% 0}
}
@keyframes reel-ring{
  0%{opacity:.55;transform:scale(.94)}
  70%{opacity:0;transform:scale(1.22)}
  100%{opacity:0;transform:scale(1.22)}
}


/* ══ C · THE REFERRAL STANDARD (#referral-standard) ═══════════════════════
   !!! THE EMPTIEST SECTION ON THE PAGE, AND THE NUMBERS SAY SO. !!!

   MEASURED: band 1553x472 on band-stone rgb(239,234,225), padding-block
   160 / 160 — i.e. **320px of padding wrapped around 152px of content**, and
   the shell holds only TWO children (a 68px heading and one 56px paragraph).
   That ratio is the whole "vague / there is not much" complaint, quantified.

   Fixes: cut the padding hard, give the band a ground and a frame, mark the
   heading, and turn the four cluster links from a run-on line separated by
   middots into a real index row.

   Free: #referral-standard::after · .shell::after · the heading's widget
   wrapper BOTH (not an .e-con, position:relative).
   The section's ::before is Elementor's — measured position:absolute. */

#referral-standard{
  --rs-ink:rgba(20,35,63,.14);
  position:relative;
  padding-block:clamp(72px,8vw,104px);
}

/* Ground — record grid, masked, on stone. Static: this band is a definition,
   not an instrument, so it gets structure without motion. */
#referral-standard::after{
  content:"";position:absolute;inset:0;z-index:0;pointer-events:none;
  background-image:
    linear-gradient(90deg,var(--rs-ink) 1px,transparent 1px),
    linear-gradient(var(--rs-ink) 1px,transparent 1px);
  background-size:64px 100%, 100% 32px;
  -webkit-mask-image:radial-gradient(112% 92% at 26% 50%,#000 18%,rgba(0,0,0,.4) 58%,transparent 88%);
  mask-image:radial-gradient(112% 92% at 26% 50%,#000 18%,rgba(0,0,0,.4) 58%,transparent 88%);
}
#referral-standard > .shell{position:relative;z-index:1}

/* Corner brackets on the content block — the site's instrument idiom, in
   navy for a light ground. */
#referral-standard > .shell::after{
  content:"";position:absolute;inset:-26px -22px;pointer-events:none;
  background-image:
    linear-gradient(rgba(20,35,63,.42),rgba(20,35,63,.42)),linear-gradient(rgba(20,35,63,.42),rgba(20,35,63,.42)),
    linear-gradient(rgba(20,35,63,.42),rgba(20,35,63,.42)),linear-gradient(rgba(20,35,63,.42),rgba(20,35,63,.42)),
    linear-gradient(rgba(20,35,63,.42),rgba(20,35,63,.42)),linear-gradient(rgba(20,35,63,.42),rgba(20,35,63,.42)),
    linear-gradient(rgba(20,35,63,.42),rgba(20,35,63,.42)),linear-gradient(rgba(20,35,63,.42),rgba(20,35,63,.42));
  background-size:18px 1px,1px 18px,18px 1px,1px 18px,18px 1px,1px 18px,18px 1px,1px 18px;
  background-position:left top,left top,right top,right top,left bottom,left bottom,right bottom,right bottom;
  background-repeat:no-repeat;
}

/* A rule beside the heading — the same left-mark language the homepage uses
   on .sec__head, applied to a heading that has no eyebrow of its own. Adding
   an eyebrow would be new copy; a mark is not. */
#referral-standard .display-section{position:relative;padding-left:26px}
#referral-standard .display-section::before{
  content:"";position:absolute;left:0;top:.16em;bottom:.16em;width:3px;
  background:linear-gradient(180deg,var(--orange),rgba(224,122,47,.15));
}

/* The four cluster links were a run-on line separated by middots. As an index
   row they become scannable and read as a set. No copy changed — the middots
   are the widget's own separators and are simply given room. */
#referral-standard .body-lg p:last-child{
  display:flex;flex-wrap:wrap;align-items:center;
  gap:0 4px;
  margin-top:clamp(18px,2vw,26px);
  font-size:var(--fs-caption);
  line-height:1.5;
}
#referral-standard .body-lg p:last-child a{
  position:relative;
  padding:7px 0 8px;
  font-weight:600;
  color:var(--navy);
  text-decoration:none;
  border-bottom:2px solid rgba(224,122,47,.55);
  transition:color 220ms var(--ease-enter),border-bottom-color 220ms var(--ease-enter);
}
#referral-standard .body-lg p:last-child a:hover,
#referral-standard .body-lg p:last-child a:focus-visible{
  color:var(--orange-ink);
  border-bottom-color:var(--orange);
}

@media (max-width:760px){
  #referral-standard::after{background-size:40px 100%, 100% 26px}
  #referral-standard > .shell::after{inset:-14px -10px;background-size:12px 1px,1px 12px,12px 1px,1px 12px,12px 1px,1px 12px,12px 1px,1px 12px}
  #referral-standard .display-section{padding-left:16px}
  .vs::after{inset:-12px -16px;background-size:auto, 46px 100%}
}
/* ═══════════════════ end A · B · C  three-section pass ═══════════════════ */



/* ═══════════════════════════════════════════════════════════════════════════
   THE TWO CONTENT ADDITIONS — 2026-08-26
     .lgs   stage index under the LIVE TRACKING rail   (widget `ledger-stages`)
     .sysg  guarantees strip in 02 / The System        (widget `sys-guarantees`)

   Founder 2026-08-26, repeatedly: "VERY VAGUE. I DO NOT LIKE VAGUENESS AND IT
   MUST STOP ... finish everything ... go and fix it all."

   Both sections had been given every available VISUAL upgrade earlier today.
   What was still missing in both was CONCRETE CONTENT — the thing "vague"
   actually points at. These two widgets supply it.

   ───────────────────────────────────────────────────────────────────────────
   COPY PROVENANCE — read before editing a single string.

   .sysg  ZERO NEW COPY. All four values are the EXISTING, already-approved
          `.law__k` kicker strings from the four clauses directly below it
          ("Same-day access, every time" / "No unlawful no" / "Zero unknown
          destinations" / "Sent is not the same as served"). The strip is a
          summary index of the four laws, so the reader gets the four
          guarantees in one glance before reading the detail. The repetition
          is the point, not an oversight.

   .lgs   SIX NEW LINES, and they are the only new copy written this session.
          Written under an explicit, repeated founder instruction to finish
          the work rather than keep asking. They are deliberately constrained:
            - present / design tense throughout, matching the band's own
              caption ("Illustrative — how Operation Iron Gate routes and
              tracks every case"). No claim that anything is operating.
            - no statistics, no numbers, no outcomes.
            - person-first, and drawn from vocabulary already approved on this
              page: "in plain words" is the .path Intake step's own phrase;
              "the legal basis" is the Yes-By-Default clause's; "confirmed by
              the receiving organization" is the Tracked Handoff clause's and
              the closed-loop definition's.
          The six stage NAMES are not new — they are the exact strings
          motion.js already draws on the canvas (STAGES[] in section 13) and
          that the canvas's own aria-label already lists.
          **These six lines still want a founder read. They are flagged in the
          session report, not smuggled in.**

   ───────────────────────────────────────────────────────────────────────────
   BOTH ARE SINGLE WIDGETS ON PURPOSE.

   All six stages live in ONE text-editor, and all four guarantees in ONE
   text-editor, so their <li>s are REAL SIBLINGS. That is the direct lesson of
   this session: `.path`, `.laws` and the Story route rail all shipped broken
   because their repeated items were split across separate Elementor widgets,
   which silently kills every `+`, `:nth-child` and `:last-child` selector.
   Keeping each set in one widget makes those selectors work here.
   **Do not "convert these to native widgets for SEO" by splitting them — the
   text is already native, crawlable text in a native widget.**
   ═══════════════════════════════════════════════════════════════════════════ */


/* ── .lgs — THE STAGE INDEX ───────────────────────────────────────────────
   Sits between the rail plate and the illustrative caption, inside
   .ledger__in (max-width 1120). Six columns so each stage reads under the
   node it belongs to, each with a top hairline so the row continues the
   rail's language rather than starting a new component. */
.lgs{
  list-style:none;margin:clamp(20px,2.4vw,30px) 0 0;padding:0;
  display:grid;grid-template-columns:repeat(6,minmax(0,1fr));
  gap:clamp(10px,1.4vw,20px);
  text-align:left;
}
.lgs__s{
  position:relative;padding-top:14px;
  border-top:1px solid rgba(221,231,228,.14);
}
/* The sixth stage is the confirmed arrival — the same green terminus the
   canvas rings. Colour carries that meaning in both places. */
.lgs__s:last-child{border-top-color:rgba(63,191,132,.55)}
.lgs__s::before{
  content:"";position:absolute;top:-3px;left:0;width:5px;height:5px;
  background:rgba(221,231,228,.5);
}
.lgs__s:last-child::before{background:var(--green-bright);box-shadow:0 0 8px 1px rgba(63,191,132,.55)}

.lgs__n{
  display:block;font-family:var(--font-mono);font-size:10.5px;font-weight:600;
  letter-spacing:.18em;color:#9FB0C8;
}
.lgs__t{
  display:block;margin-top:5px;font-family:var(--font-mono);font-size:11.5px;
  font-weight:600;letter-spacing:.12em;text-transform:uppercase;
  color:var(--on-dark);
}
.lgs__s:last-child .lgs__t{color:var(--green-bright)}
.lgs__b{
  display:block;margin-top:7px;font-size:12.5px;line-height:1.5;
  color:rgba(221,231,228,.72);
}

@media (max-width:1080px){
  .lgs{grid-template-columns:repeat(3,minmax(0,1fr));gap:22px 18px}
}
@media (max-width:640px){
  .lgs{grid-template-columns:repeat(2,minmax(0,1fr));gap:20px 14px}
  .lgs__b{font-size:12px}
}


/* ── .sysg — THE GUARANTEES STRIP ─────────────────────────────────────────
   Sits between the section lede and the four clauses. Compact by design: the
   founder's OTHER note on this section was "IT'S TOO LONG", and earlier today
   this section was cut 1495 -> 1318px. This strip adds roughly 70px, so the
   section still lands well under where it started. Do not let it grow. */
.sysg{
  list-style:none;padding:0;
  margin:clamp(18px,2vw,28px) auto 0;
  max-width:1080px;
  display:grid;grid-template-columns:repeat(4,minmax(0,1fr));
  gap:clamp(10px,1.4vw,18px);
  text-align:left;
}
.sysg__i{
  position:relative;padding:12px 0 0 0;
  border-top:1px solid rgba(63,191,132,.32);
}
.sysg__i::before{
  content:"";position:absolute;top:-4px;left:0;width:7px;height:7px;
  background:var(--green-bright);
  clip-path:polygon(50% 0,100% 50%,50% 100%,0 50%);
}
.sysg__k{
  display:block;font-family:var(--font-mono);font-size:10px;font-weight:600;
  letter-spacing:.2em;color:rgba(221,231,228,.72);
}
.sysg__v{
  display:block;margin-top:5px;font-family:var(--font-mono);font-size:11px;
  font-weight:600;letter-spacing:.1em;text-transform:uppercase;line-height:1.45;
  color:var(--green-bright);
}

/* Each guarantee draws in as the section lights, left to right — riding the
   same one-shot .is-on the four clauses already use, via :has() on the
   section, so no JS changes and no new observer. */
@media (prefers-reduced-motion:no-preference){
  .sysg__i{opacity:0;translate:0 8px;transition:opacity 520ms var(--ease-enter),translate 520ms var(--ease-enter)}
  #system:has(.law.is-on) .sysg__i{opacity:1;translate:none}
  #system:has(.law.is-on) .sysg__i:nth-child(2){transition-delay:90ms}
  #system:has(.law.is-on) .sysg__i:nth-child(3){transition-delay:180ms}
  #system:has(.law.is-on) .sysg__i:nth-child(4){transition-delay:270ms}
}

@media (max-width:860px){
  .sysg{grid-template-columns:repeat(2,minmax(0,1fr));gap:18px 14px}
}
@media (max-width:460px){
  .sysg{grid-template-columns:1fr;gap:14px}
}
/* ══════════════ end the two content additions (.lgs / .sysg) ═════════════ */



/* ==========================================================================
   HOME-SIZE 1 - "NORMAL SIZE, OUTLIERS CUT" (post 10) - 2026-09-22
   Founder: "everything about this page is too big. the objects, fonts, boxes,
   containers, and flexbox ... NOT TOO SMALL OR TOO BIG ... a normal size."
   MEASURED at 1600 logged out before: document 21,079px; pcm__num 178px,
   lnch__sh 110px, .ev heading 104px, display-band spans 85px, gpv__t1 82px,
   dsrt 74px, law__n 73px, rcpt__fig 73px, vdt__line 72px, section headings
   59-70px, path__n 65px, hero eyebrow 59px; sec--tight padding 108px.
   HELD: the hero H1 (86px) per standing ruling, and all body copy (median
   10.9-16.6px) - nothing below its floor is touched.
   Desktop only (>=1025px). Rollback: oig_backup_motion_plus_pre_homesize1_20260922.
   ========================================================================== */
@media (min-width: 1025px) {

  /* ---- display layer: the biggest type ---- */
  body.page-id-10 #main#main .pcm__num            { font-size: clamp(56px, 6vw, 96px); }
  body.page-id-10 #main#main .lnch__sh            { font-size: clamp(40px, 4.6vw, 72px); }
  body.page-id-10 #main#main .ev .elementor-heading-title,
  body.page-id-10 #main#main .ev__h              { font-size: clamp(38px, 4.2vw, 66px); }
  body.page-id-10 #main#main .display-band,
  body.page-id-10 #main#main .gband-frame .display-band { font-size: clamp(34px, 3.9vw, 62px); }
  body.page-id-10 #main#main .gpv__t1             { font-size: clamp(34px, 3.7vw, 58px); }
  body.page-id-10 #main#main .dsrt__h             { font-size: clamp(32px, 3.6vw, 56px); }
  body.page-id-10 #main#main .dsrt__line          { font-size: clamp(28px, 3.2vw, 50px); }
  body.page-id-10 #main#main .rcpt__fig           { font-size: clamp(34px, 3.6vw, 56px); }
  body.page-id-10 #main#main .vdt__line           { font-size: clamp(30px, 3.4vw, 54px); }
  body.page-id-10 #main#main .pull__line          { font-size: clamp(26px, 3vw, 47px); }
  body.page-id-10 #main#main .display-section     { font-size: clamp(28px, 3.2vw, 50px); }
  body.page-id-10 #main#main .crisis__h           { font-size: clamp(34px, 3.8vw, 58px); }

  /* ---- ghost numerals and readouts ---- */
  body.page-id-10 #main#main .law__n              { font-size: clamp(30px, 3.4vw, 52px); }
  body.page-id-10 #main#main .path__n             { font-size: clamp(28px, 3.1vw, 48px); }
  body.page-id-10 #main#main .rdo__v              { font-size: clamp(28px, 3.1vw, 48px); }
  body.page-id-10 #main#main .cap__item           { font-size: clamp(26px, 2.9vw, 44px); }

  /* ---- the hero: H1 held, its oversized eyebrow and door headings cut ---- */
  body.page-id-10 #main#main .hero__doors-k       { font-size: 22px; letter-spacing: .18em; }
  body.page-id-10 #main#main .hero .door__t,
  body.page-id-10 #main#main .hero__doors .elementor-heading-title { font-size: clamp(22px, 2vw, 30px); }
  body.page-id-10 #main#main .hero                { padding-bottom: clamp(56px, 6vw, 96px); }

  /* ---- containers: section padding and board gaps ---- */
  body.page-id-10 #main#main .sec.sec--tight      { padding-top: clamp(44px, 4.6vw, 76px); padding-bottom: clamp(44px, 4.6vw, 76px); }
  body.page-id-10 #main#main .ledger              { padding-top: clamp(34px, 3.4vw, 46px); padding-bottom: clamp(30px, 3vw, 40px); }
  body.page-id-10 #main#main .ctb                 { padding-top: clamp(48px, 5vw, 78px); padding-bottom: clamp(48px, 5vw, 78px); }
  body.page-id-10 #main#main .pull                { padding-top: clamp(52px, 5.4vw, 86px); padding-bottom: clamp(52px, 5.4vw, 86px); }
  body.page-id-10 #main#main .vdt                 { padding-top: clamp(48px, 5vw, 78px); padding-bottom: clamp(48px, 5vw, 78px); }
  body.page-id-10 #main#main .gband-frame         { padding-top: clamp(34px, 3.4vw, 46px); padding-bottom: clamp(34px, 3.4vw, 46px); }
}

/* ---- the six that an existing body.page-id-10 #main#main rule outranked ---- */
@media (min-width: 1025px) {
  body.page-id-10 #main#main .pcm__num { font-size: clamp(56px, 6.2vw, 98px); }
  body.page-id-10 #main#main .ev__h,
  body.page-id-10 #main#main .ev__h .elementor-heading-title { font-size: clamp(34px, 4vw, 62px); }
  body.page-id-10 #main#main .gpv__t1 { font-size: clamp(32px, 3.6vw, 56px); }
  body.page-id-10 #main#main .law__n { font-size: clamp(28px, 3vw, 46px); }
  body.page-id-10 #main#main .ev__n { font-size: clamp(26px, 2.6vw, 40px); }
  body.page-id-10 #crisis .rcpt .rcpt__fig { font-size: clamp(30px, 3.2vw, 50px); }
  body.page-id-10 #main#main .lnch__sh { font-size: clamp(34px, 3.8vw, 60px); }
  body.page-id-10 #main#main .gband-frame :is(h2, .elementor-heading-title, .display-band) { font-size: clamp(32px, 3.7vw, 58px); }
  body.page-id-10 #main#main .hero__doors-k { font-size: 22px; }
}

/* rt-mediaelement-css /wp-content/plugins/buddypress-media/lib/media-element/mediaelementplayer-legacy.min.css */
.mejs-offscreen{border:0;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal}.mejs-container{background:#000;font-family:Helvetica,Arial,serif;position:relative;text-align:left;text-indent:0;vertical-align:top}.mejs-container,.mejs-container *{box-sizing:border-box}.mejs-container video::-webkit-media-controls,.mejs-container video::-webkit-media-controls-panel,.mejs-container video::-webkit-media-controls-panel-container,.mejs-container video::-webkit-media-controls-start-playback-button{-webkit-appearance:none;display:none!important}.mejs-fill-container,.mejs-fill-container .mejs-container{height:100%;width:100%}.mejs-fill-container{background:transparent;margin:0 auto;overflow:hidden;position:relative}.mejs-container:focus{outline:none}.mejs-iframe-overlay{height:100%;position:absolute;width:100%}.mejs-embed,.mejs-embed body{background:#000;height:100%;margin:0;overflow:hidden;padding:0;width:100%}.mejs-fullscreen{overflow:hidden!important}.mejs-container-fullscreen{bottom:0;left:0;overflow:hidden;position:fixed;right:0;top:0;z-index:1000}.mejs-container-fullscreen .mejs-mediaelement,.mejs-container-fullscreen video{height:100%!important;width:100%!important}.mejs-background,.mejs-mediaelement{left:0;position:absolute;top:0}.mejs-mediaelement{height:100%;width:100%;z-index:0}.mejs-poster{background-position:50% 50%;background-repeat:no-repeat;background-size:cover;left:0;position:absolute;top:0;z-index:1}:root .mejs-poster-img{display:none}.mejs-poster-img{border:0;padding:0}.mejs-overlay{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;left:0;position:absolute;top:0}.mejs-layer{z-index:1}.mejs-overlay-play{cursor:pointer}.mejs-overlay-button{background:url(/wp-content/plugins/buddypress-media/lib/media-element/mejs-controls.svg) no-repeat;background-position:0 -39px;height:80px;width:80px}.mejs-overlay:hover>.mejs-overlay-button{background-position:-80px -39px}.mejs-overlay-loading{height:80px;width:80px}.mejs-overlay-loading-bg-img{-webkit-animation:a 1s linear infinite;animation:a 1s linear infinite;background:transparent url(/wp-content/plugins/buddypress-media/lib/media-element/mejs-controls.svg) -160px -40px no-repeat;display:block;height:80px;width:80px;z-index:1}@-webkit-keyframes a{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes a{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.mejs-controls{bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:40px;left:0;list-style-type:none;margin:0;padding:0 10px;position:absolute;width:100%;z-index:3}.mejs-controls:not([style*="display: none"]){background:rgba(255,0,0,.7);background:-webkit-linear-gradient(transparent,rgba(0,0,0,.35));background:linear-gradient(transparent,rgba(0,0,0,.35))}.mejs-button,.mejs-time,.mejs-time-rail{font-size:10px;height:40px;line-height:10px;margin:0;width:32px}.mejs-button>button{background:transparent url(/wp-content/plugins/buddypress-media/lib/media-element/mejs-controls.svg);border:0;cursor:pointer;display:block;font-size:0;height:20px;line-height:0;margin:10px 6px;overflow:hidden;padding:0;position:absolute;text-decoration:none;width:20px}.mejs-button>button:focus{outline:1px dotted #999}.mejs-container-keyboard-inactive [role=slider],.mejs-container-keyboard-inactive [role=slider]:focus,.mejs-container-keyboard-inactive a,.mejs-container-keyboard-inactive a:focus,.mejs-container-keyboard-inactive button,.mejs-container-keyboard-inactive button:focus{outline:0}.mejs-time{box-sizing:content-box;color:#fff;font-size:11px;font-weight:700;height:24px;overflow:hidden;padding:16px 6px 0;text-align:center;width:auto}.mejs-play>button{background-position:0 0}.mejs-pause>button{background-position:-20px 0}.mejs-replay>button{background-position:-160px 0}.mejs-time-rail{direction:ltr;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;height:40px;margin:0 10px;padding-top:10px;position:relative}.mejs-time-buffering,.mejs-time-current,.mejs-time-float,.mejs-time-float-corner,.mejs-time-float-current,.mejs-time-hovered,.mejs-time-loaded,.mejs-time-marker,.mejs-time-total{border-radius:2px;cursor:pointer;display:block;height:10px;position:absolute}.mejs-time-total{background:hsla(0,0%,100%,.3);margin:5px 0 0;width:100%}.mejs-time-buffering{-webkit-animation:b 2s linear infinite;animation:b 2s linear infinite;background:-webkit-linear-gradient(135deg,hsla(0,0%,100%,.4) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.4) 0,hsla(0,0%,100%,.4) 75%,transparent 0,transparent);background:linear-gradient(-45deg,hsla(0,0%,100%,.4) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.4) 0,hsla(0,0%,100%,.4) 75%,transparent 0,transparent);background-size:15px 15px;width:100%}@-webkit-keyframes b{0%{background-position:0 0}to{background-position:30px 0}}@keyframes b{0%{background-position:0 0}to{background-position:30px 0}}.mejs-time-loaded{background:hsla(0,0%,100%,.3)}.mejs-time-current,.mejs-time-handle-content{background:hsla(0,0%,100%,.9)}.mejs-time-hovered{background:hsla(0,0%,100%,.5);z-index:10}.mejs-time-hovered.negative{background:rgba(0,0,0,.2)}.mejs-time-buffering,.mejs-time-current,.mejs-time-hovered,.mejs-time-loaded{left:0;-webkit-transform:scaleX(0);-ms-transform:scaleX(0);transform:scaleX(0);-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;-webkit-transition:all .15s ease-in;transition:all .15s ease-in;width:100%}.mejs-time-buffering{-webkit-transform:scaleX(1);-ms-transform:scaleX(1);transform:scaleX(1)}.mejs-time-hovered{-webkit-transition:height .1s cubic-bezier(.44,0,1,1);transition:height .1s cubic-bezier(.44,0,1,1)}.mejs-time-hovered.no-hover{-webkit-transform:scaleX(0)!important;-ms-transform:scaleX(0)!important;transform:scaleX(0)!important}.mejs-time-handle,.mejs-time-handle-content{border:4px solid transparent;cursor:pointer;left:0;position:absolute;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0);z-index:11}.mejs-time-handle-content{border:4px solid hsla(0,0%,100%,.9);border-radius:50%;height:10px;left:-7px;top:-4px;-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0);width:10px}.mejs-time-rail .mejs-time-handle-content:active,.mejs-time-rail .mejs-time-handle-content:focus,.mejs-time-rail:hover .mejs-time-handle-content{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}.mejs-time-float{background:#eee;border:1px solid #333;bottom:100%;color:#111;display:none;height:17px;margin-bottom:9px;position:absolute;text-align:center;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:36px}.mejs-time-float-current{display:block;left:0;margin:2px;text-align:center;width:30px}.mejs-time-float-corner{border:5px solid #eee;border-color:#eee transparent transparent;border-radius:0;display:block;height:0;left:50%;line-height:0;position:absolute;top:100%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:0}.mejs-long-video .mejs-time-float{margin-left:-23px;width:64px}.mejs-long-video .mejs-time-float-current{width:60px}.mejs-broadcast{color:#fff;height:10px;position:absolute;top:15px;width:100%}.mejs-fullscreen-button>button{background-position:-80px 0}.mejs-unfullscreen>button{background-position:-100px 0}.mejs-mute>button{background-position:-60px 0}.mejs-unmute>button{background-position:-40px 0}.mejs-volume-button{position:relative}.mejs-volume-button>.mejs-volume-slider{-webkit-backface-visibility:hidden;background:rgba(50,50,50,.7);border-radius:0;bottom:100%;display:none;height:115px;left:50%;margin:0;position:absolute;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:25px;z-index:1}.mejs-volume-button:hover{border-radius:0 0 4px 4px}.mejs-volume-total{background:hsla(0,0%,100%,.5);height:100px;left:50%;margin:0;position:absolute;top:8px;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:2px}.mejs-volume-current{left:0;margin:0;width:100%}.mejs-volume-current,.mejs-volume-handle{background:hsla(0,0%,100%,.9);position:absolute}.mejs-volume-handle{border-radius:1px;cursor:ns-resize;height:6px;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:16px}.mejs-horizontal-volume-slider{display:block;height:36px;position:relative;vertical-align:middle;width:56px}.mejs-horizontal-volume-total{background:rgba(50,50,50,.8);height:8px;top:16px;width:50px}.mejs-horizontal-volume-current,.mejs-horizontal-volume-total{border-radius:2px;font-size:1px;left:0;margin:0;padding:0;position:absolute}.mejs-horizontal-volume-current{background:hsla(0,0%,100%,.8);height:100%;top:0;width:100%}.mejs-horizontal-volume-handle{display:none}.mejs-captions-button,.mejs-chapters-button{position:relative}.mejs-captions-button>button{background-position:-140px 0}.mejs-chapters-button>button{background-position:-180px 0}.mejs-captions-button>.mejs-captions-selector,.mejs-chapters-button>.mejs-chapters-selector{background:rgba(50,50,50,.7);border:1px solid transparent;border-radius:0;bottom:100%;margin-right:-43px;overflow:hidden;padding:0;position:absolute;right:50%;visibility:visible;width:86px}.mejs-chapters-button>.mejs-chapters-selector{margin-right:-55px;width:110px}.mejs-captions-selector-list,.mejs-chapters-selector-list{list-style-type:none!important;margin:0;overflow:hidden;padding:0}.mejs-captions-selector-list-item,.mejs-chapters-selector-list-item{color:#fff;cursor:pointer;display:block;list-style-type:none!important;margin:0 0 6px;overflow:hidden;padding:0}.mejs-captions-selector-list-item:hover,.mejs-chapters-selector-list-item:hover{background-color:#c8c8c8!important;background-color:hsla(0,0%,100%,.4)!important}.mejs-captions-selector-input,.mejs-chapters-selector-input{clear:both;float:left;left:-1000px;margin:3px 3px 0 5px;position:absolute}.mejs-captions-selector-label,.mejs-chapters-selector-label{cursor:pointer;float:left;font-size:10px;line-height:15px;padding:4px 10px 0;width:100%}.mejs-captions-selected,.mejs-chapters-selected{color:#21f8f8}.mejs-captions-translations{font-size:10px;margin:0 0 5px}.mejs-captions-layer{bottom:0;color:#fff;font-size:16px;left:0;line-height:20px;position:absolute;text-align:center}.mejs-captions-layer a{color:#fff;text-decoration:underline}.mejs-captions-layer[lang=ar]{font-size:20px;font-weight:400}.mejs-captions-position{bottom:15px;left:0;position:absolute;width:100%}.mejs-captions-position-hover{bottom:35px}.mejs-captions-text,.mejs-captions-text *{background:hsla(0,0%,8%,.5);box-shadow:5px 0 0 hsla(0,0%,8%,.5),-5px 0 0 hsla(0,0%,8%,.5);padding:0;white-space:pre-wrap}.mejs-container.mejs-hide-cues video::-webkit-media-text-track-container{display:none}.mejs-overlay-error{position:relative}.mejs-overlay-error>img{left:0;max-width:100%;position:absolute;top:0;z-index:-1}.mejs-cannotplay,.mejs-cannotplay a{color:#fff;font-size:.8em}.mejs-cannotplay{position:relative}.mejs-cannotplay a,.mejs-cannotplay p{display:inline-block;padding:0 15px;width:100%}
/* rt-mediaelement-wp-css /wp-content/plugins/buddypress-media/lib/media-element/wp-mediaelement.min.css */
.wp-playlist-caption,.wp-playlist-current-item .wp-playlist-item-artist,.wp-playlist-current-item .wp-playlist-item-title,.wp-playlist-item-album{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.mejs-container{clear:both;max-width:100%}.mejs-container *{font-family:Helvetica,Arial}.mejs-container,.mejs-container .mejs-controls,.mejs-embed,.mejs-embed body{background:#222}.mejs-time{font-weight:400;word-wrap:normal}.mejs-controls a.mejs-horizontal-volume-slider{display:table}.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-current,.mejs-controls .mejs-time-rail .mejs-time-loaded{background:#fff}.mejs-controls .mejs-time-rail .mejs-time-current{background:#0073aa}.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-total,.mejs-controls .mejs-time-rail .mejs-time-total{background:rgba(255,255,255,.33)}.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-current,.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-total,.mejs-controls .mejs-time-rail span{border-radius:0}.mejs-overlay-loading{background:0 0}.mejs-controls button:hover{border:none;-webkit-box-shadow:none;box-shadow:none}.me-cannotplay{width:auto!important}.media-embed-details .wp-audio-shortcode{display:inline-block;max-width:400px}.audio-details .embed-media-settings{overflow:visible}.media-embed-details .embed-media-settings .setting span{max-width:400px;width:auto}.media-embed-details .embed-media-settings .checkbox-setting span{display:inline-block}.media-embed-details .embed-media-settings{padding-top:0;top:28px}.media-embed-details .instructions{padding:16px 0;max-width:600px}.media-embed-details .setting .remove-setting,.media-embed-details .setting p{color:#a00;font-size:10px;text-transform:uppercase}.media-embed-details .setting .remove-setting{padding:0}.media-embed-details .setting a:hover{color:#dc3232}.media-embed-details .embed-media-settings .checkbox-setting{float:none;margin:0 0 10px}.wp-video{max-width:100%;height:auto}.wp_attachment_holder .wp-audio-shortcode,.wp_attachment_holder .wp-video{margin-top:18px}.wp-video-shortcode video,video.wp-video-shortcode{max-width:100%;display:inline-block}.video-details .wp-video-holder{width:100%;max-width:640px}.wp-playlist{border:1px solid #ccc;padding:10px;margin:12px 0 18px;font-size:14px;line-height:1.5}.wp-admin .wp-playlist{margin:0 0 18px}.wp-playlist video{display:inline-block;max-width:100%}.wp-playlist audio{display:none;max-width:100%;width:400px}.wp-playlist-caption,.wp-playlist-item-meta{display:block;font-size:14px;line-height:1.5}.wp-playlist .mejs-container{margin:0;max-width:100%}.wp-playlist .mejs-controls .mejs-button button{outline:0}.wp-playlist-light{background:#fff;color:#000}.wp-playlist-dark{color:#fff;background:#000}.wp-playlist-caption{max-width:88%}.wp-playlist-item .wp-playlist-caption{text-decoration:none;color:#000;max-width:-webkit-calc(100% - 40px);max-width:calc(100% - 40px)}.wp-playlist-item-title{font-size:14px;line-height:1.5}.wp-playlist-item-album{font-style:italic}.wp-playlist-item-artist{font-size:12px;text-transform:uppercase}.wp-playlist-item-length{position:absolute;right:3px;top:0;font-size:14px;line-height:1.5}.rtl .wp-playlist-item-length{left:3px;right:auto}.wp-playlist-tracks{margin-top:10px}.wp-playlist-item{position:relative;cursor:pointer;padding:0 3px;border-bottom:1px solid #ccc}.wp-playlist-item:last-child{border-bottom:0}.wp-playlist-light .wp-playlist-caption{color:#333}.wp-playlist-dark .wp-playlist-caption{color:#ddd}.wp-playlist-playing{font-weight:700;background:#f7f7f7}.wp-playlist-light .wp-playlist-playing{background:#fff;color:#000}.wp-playlist-dark .wp-playlist-playing{background:#000;color:#fff}.wp-playlist-current-item{overflow:hidden;margin-bottom:10px;height:60px}.wp-playlist .wp-playlist-current-item img{float:left;max-width:60px;height:auto;margin-right:10px;padding:0;border:0}.rtl .wp-playlist .wp-playlist-current-item img{float:right;margin-left:10px;margin-right:0}.wp-audio-playlist .me-cannotplay span{padding:5px 15px}
