.elementor-kit-6{--e-global-color-primary:#EDE9E1;--e-global-color-secondary:#8A7A56;--e-global-color-text:#A8A398;--e-global-color-accent:#B8A47A;--e-global-color-72fdca5d:#0A0A09;--e-global-color-93d162a6:#0E0E0C;--e-global-color-1458ee48:#070706;--e-global-color-173dc720:#121211;--e-global-color-02e4a6e5:#7A756B;--e-global-color-7faf67c4:rgba(184,164,122,0.16);--e-global-color-68a19a6d:rgba(237,233,225,0.08);--e-global-typography-primary-font-family:"Instrument Serif";--e-global-typography-primary-font-weight:400;--e-global-typography-primary-font-style:normal;--e-global-typography-primary-line-height:0.98em;--e-global-typography-primary-letter-spacing:-0.015em;--e-global-typography-secondary-font-family:"Instrument Serif";--e-global-typography-secondary-font-weight:400;--e-global-typography-secondary-font-style:italic;--e-global-typography-secondary-line-height:0.98em;--e-global-typography-secondary-letter-spacing:-0.015em;--e-global-typography-text-font-family:"JetBrains Mono";--e-global-typography-text-font-size:14px;--e-global-typography-text-font-weight:300;--e-global-typography-text-text-transform:none;--e-global-typography-text-line-height:1.85em;--e-global-typography-accent-font-family:"JetBrains Mono";--e-global-typography-accent-font-size:11px;--e-global-typography-accent-font-weight:400;--e-global-typography-accent-text-transform:uppercase;--e-global-typography-accent-line-height:1.75em;--e-global-typography-accent-letter-spacing:0.28em;--e-global-typography-8b955a47-font-family:"Instrument Serif";--e-global-typography-8b955a47-font-size:clamp(54px, 9.2vw, 150px);--e-global-typography-8b955a47-font-weight:400;--e-global-typography-8b955a47-line-height:0.92em;--e-global-typography-8b955a47-letter-spacing:-0.02em;--e-global-typography-e553e8b5-font-family:"Instrument Serif";--e-global-typography-e553e8b5-font-size:clamp(38px, 5.6vw, 80px);--e-global-typography-e553e8b5-font-weight:400;--e-global-typography-e553e8b5-line-height:0.98em;--e-global-typography-e553e8b5-letter-spacing:-0.015em;--e-global-typography-a8ca73c1-font-family:"Instrument Serif";--e-global-typography-a8ca73c1-font-size:clamp(21px, 2.4vw, 29px);--e-global-typography-a8ca73c1-font-weight:400;--e-global-typography-a8ca73c1-line-height:1.12em;--e-global-typography-66e34795-font-family:"Instrument Serif";--e-global-typography-66e34795-font-size:clamp(20px, 2.2vw, 30px);--e-global-typography-66e34795-font-weight:400;--e-global-typography-66e34795-line-height:1.05em;--e-global-typography-3ddba357-font-family:"Instrument Serif";--e-global-typography-3ddba357-font-size:clamp(38px, 5vw, 66px);--e-global-typography-3ddba357-font-weight:400;--e-global-typography-3ddba357-line-height:1em;--e-global-typography-ad3c63f8-font-family:"Instrument Serif";--e-global-typography-ad3c63f8-font-size:clamp(30px, 3.6vw, 46px);--e-global-typography-ad3c63f8-font-weight:400;--e-global-typography-ad3c63f8-line-height:1em;--e-global-typography-09151db6-font-family:"JetBrains Mono";--e-global-typography-09151db6-font-size:11px;--e-global-typography-09151db6-font-weight:300;--e-global-typography-09151db6-text-transform:uppercase;--e-global-typography-09151db6-letter-spacing:0.22em;--e-global-typography-512ee608-font-family:"JetBrains Mono";--e-global-typography-512ee608-font-size:13px;--e-global-typography-512ee608-font-weight:300;--e-global-typography-512ee608-text-transform:uppercase;--e-global-typography-512ee608-letter-spacing:0.24em;--e-global-typography-ecdf4db8-font-family:"JetBrains Mono";--e-global-typography-ecdf4db8-font-size:11.5px;--e-global-typography-ecdf4db8-font-weight:500;--e-global-typography-ecdf4db8-text-transform:uppercase;--e-global-typography-ecdf4db8-letter-spacing:0.26em;background-color:var( --e-global-color-72fdca5d );color:var( --e-global-color-text );font-family:var( --e-global-typography-text-font-family ), Sans-serif;font-size:var( --e-global-typography-text-font-size );font-weight:var( --e-global-typography-text-font-weight );text-transform:var( --e-global-typography-text-text-transform );line-height:var( --e-global-typography-text-line-height );letter-spacing:var( --e-global-typography-text-letter-spacing );word-spacing:var( --e-global-typography-text-word-spacing );}.elementor-kit-6 e-page-transition{background-color:#FFBC7D;}.elementor-kit-6 a{color:var( --e-global-color-accent );}.elementor-kit-6 a:hover{color:var( --e-global-color-primary );}body{overflow-x:inherit !important;}.elementor a, .elementor a:link, .elementor a:focus, .elementor a:active, .elementor a:hover{text-decoration:inherit !important;}.elementor a:link, .elementor .smooth-hover a:link, {transition:inherit;}.elementor-kit-6 h1{color:var( --e-global-color-primary );font-family:var( --e-global-typography-primary-font-family ), Sans-serif;font-size:var( --e-global-typography-primary-font-size );font-weight:var( --e-global-typography-primary-font-weight );font-style:var( --e-global-typography-primary-font-style );line-height:var( --e-global-typography-primary-line-height );letter-spacing:var( --e-global-typography-primary-letter-spacing );word-spacing:var( --e-global-typography-primary-word-spacing );}.elementor-kit-6 h2{color:var( --e-global-color-primary );font-family:var( --e-global-typography-primary-font-family ), Sans-serif;font-size:var( --e-global-typography-primary-font-size );font-weight:var( --e-global-typography-primary-font-weight );font-style:var( --e-global-typography-primary-font-style );line-height:var( --e-global-typography-primary-line-height );letter-spacing:var( --e-global-typography-primary-letter-spacing );word-spacing:var( --e-global-typography-primary-word-spacing );}.elementor-kit-6 h3{color:var( --e-global-color-primary );font-family:var( --e-global-typography-primary-font-family ), Sans-serif;font-size:var( --e-global-typography-primary-font-size );font-weight:var( --e-global-typography-primary-font-weight );font-style:var( --e-global-typography-primary-font-style );line-height:var( --e-global-typography-primary-line-height );letter-spacing:var( --e-global-typography-primary-letter-spacing );word-spacing:var( --e-global-typography-primary-word-spacing );}.elementor-kit-6 h4{color:var( --e-global-color-primary );font-family:var( --e-global-typography-primary-font-family ), Sans-serif;font-size:var( --e-global-typography-primary-font-size );font-weight:var( --e-global-typography-primary-font-weight );font-style:var( --e-global-typography-primary-font-style );line-height:var( --e-global-typography-primary-line-height );letter-spacing:var( --e-global-typography-primary-letter-spacing );word-spacing:var( --e-global-typography-primary-word-spacing );}.elementor-kit-6 h5{color:var( --e-global-color-primary );font-family:var( --e-global-typography-primary-font-family ), Sans-serif;font-size:var( --e-global-typography-primary-font-size );font-weight:var( --e-global-typography-primary-font-weight );font-style:var( --e-global-typography-primary-font-style );line-height:var( --e-global-typography-primary-line-height );letter-spacing:var( --e-global-typography-primary-letter-spacing );word-spacing:var( --e-global-typography-primary-word-spacing );}.elementor-kit-6 h6{color:var( --e-global-color-primary );font-family:var( --e-global-typography-primary-font-family ), Sans-serif;font-size:var( --e-global-typography-primary-font-size );font-weight:var( --e-global-typography-primary-font-weight );font-style:var( --e-global-typography-primary-font-style );line-height:var( --e-global-typography-primary-line-height );letter-spacing:var( --e-global-typography-primary-letter-spacing );word-spacing:var( --e-global-typography-primary-word-spacing );}.elementor-section.elementor-section-boxed > .elementor-container{max-width:1140px;}.e-con{--container-max-width:1140px;}.elementor-widget:not(:last-child){--kit-widget-spacing:20px;}.elementor-element{--widgets-spacing:20px 20px;--widgets-spacing-row:20px;--widgets-spacing-column:20px;}{}h1.entry-title{display:var(--page-title-display);}.site-header .site-branding{flex-direction:column;align-items:stretch;}.site-header{padding-inline-end:0px;padding-inline-start:0px;}.site-footer .site-branding{flex-direction:column;align-items:stretch;}@media(max-width:1024px){.elementor-kit-6{font-size:var( --e-global-typography-text-font-size );line-height:var( --e-global-typography-text-line-height );letter-spacing:var( --e-global-typography-text-letter-spacing );word-spacing:var( --e-global-typography-text-word-spacing );}.elementor-kit-6 h1{font-size:var( --e-global-typography-primary-font-size );line-height:var( --e-global-typography-primary-line-height );letter-spacing:var( --e-global-typography-primary-letter-spacing );word-spacing:var( --e-global-typography-primary-word-spacing );}.elementor-kit-6 h2{font-size:var( --e-global-typography-primary-font-size );line-height:var( --e-global-typography-primary-line-height );letter-spacing:var( --e-global-typography-primary-letter-spacing );word-spacing:var( --e-global-typography-primary-word-spacing );}.elementor-kit-6 h3{font-size:var( --e-global-typography-primary-font-size );line-height:var( --e-global-typography-primary-line-height );letter-spacing:var( --e-global-typography-primary-letter-spacing );word-spacing:var( --e-global-typography-primary-word-spacing );}.elementor-kit-6 h4{font-size:var( --e-global-typography-primary-font-size );line-height:var( --e-global-typography-primary-line-height );letter-spacing:var( --e-global-typography-primary-letter-spacing );word-spacing:var( --e-global-typography-primary-word-spacing );}.elementor-kit-6 h5{font-size:var( --e-global-typography-primary-font-size );line-height:var( --e-global-typography-primary-line-height );letter-spacing:var( --e-global-typography-primary-letter-spacing );word-spacing:var( --e-global-typography-primary-word-spacing );}.elementor-kit-6 h6{font-size:var( --e-global-typography-primary-font-size );line-height:var( --e-global-typography-primary-line-height );letter-spacing:var( --e-global-typography-primary-letter-spacing );word-spacing:var( --e-global-typography-primary-word-spacing );}.elementor-section.elementor-section-boxed > .elementor-container{max-width:1024px;}.e-con{--container-max-width:1024px;}}@media(max-width:767px){.elementor-kit-6{font-size:var( --e-global-typography-text-font-size );line-height:var( --e-global-typography-text-line-height );letter-spacing:var( --e-global-typography-text-letter-spacing );word-spacing:var( --e-global-typography-text-word-spacing );}.elementor-kit-6 h1{font-size:var( --e-global-typography-primary-font-size );line-height:var( --e-global-typography-primary-line-height );letter-spacing:var( --e-global-typography-primary-letter-spacing );word-spacing:var( --e-global-typography-primary-word-spacing );}.elementor-kit-6 h2{font-size:var( --e-global-typography-primary-font-size );line-height:var( --e-global-typography-primary-line-height );letter-spacing:var( --e-global-typography-primary-letter-spacing );word-spacing:var( --e-global-typography-primary-word-spacing );}.elementor-kit-6 h3{font-size:var( --e-global-typography-primary-font-size );line-height:var( --e-global-typography-primary-line-height );letter-spacing:var( --e-global-typography-primary-letter-spacing );word-spacing:var( --e-global-typography-primary-word-spacing );}.elementor-kit-6 h4{font-size:var( --e-global-typography-primary-font-size );line-height:var( --e-global-typography-primary-line-height );letter-spacing:var( --e-global-typography-primary-letter-spacing );word-spacing:var( --e-global-typography-primary-word-spacing );}.elementor-kit-6 h5{font-size:var( --e-global-typography-primary-font-size );line-height:var( --e-global-typography-primary-line-height );letter-spacing:var( --e-global-typography-primary-letter-spacing );word-spacing:var( --e-global-typography-primary-word-spacing );}.elementor-kit-6 h6{font-size:var( --e-global-typography-primary-font-size );line-height:var( --e-global-typography-primary-line-height );letter-spacing:var( --e-global-typography-primary-letter-spacing );word-spacing:var( --e-global-typography-primary-word-spacing );}.elementor-section.elementor-section-boxed > .elementor-container{max-width:767px;}.e-con{--container-max-width:767px;}}
/* Start custom CSS */:root{
  --nod-gut: clamp(30px, 7.8vw, 156px);   /* page gutter - the page's spine */
  --nod-vpad: clamp(84px, 12vh, 150px);   /* section vertical padding */
  --nod-bar: 34px;                        /* ticker bar height */
  --nod-hdr: calc(var(--nod-bar) + 102px); /* transparent header at rest: bar + 18 + 66px logo + 18 */
  /* Hero photo band. The second term caps it by viewport HEIGHT so the copy area below it
     never falls below ~500px, which is what keeps the two CTAs above the fold when zoomed.
     The two terms cross at 100svh = 1067px (0.48H + 55 = H - 500), so every viewport taller
     than that - including the 1080px desktop, where it stays 573px - is completely unchanged;
     only shorter/zoomed viewports get the shorter photo. Raising 500 would start eating the
     approved desktop band, so re-derive the crossover before touching it. */
  --nod-band: clamp(345px, min(calc(48svh + 55px), calc(100svh - 500px)), 595px);
}

/* ---- Ticker bar ---- */

/* Slow breathing brass dot. Non-scroll, so it does not belong to Motion.page. */
.nod-dot i,
.nod-dot svg{
  animation: nod-pulse 2.4s ease-in-out infinite;
}
@keyframes nod-pulse{
  0%, 100% { opacity: 1; }
  50%      { opacity: .35; }
}

/* Live numbers read brass against the ash label text. No native per-span control. */
#nod-ticker strong{
  color: var(--e-global-color-accent);
  font-weight: 500;
}

/* Ticker must never wrap - it is a fixed 34px bar. */
#nod-ticker p{ white-space: nowrap; margin: 0; }
#nod-ticker .elementor-widget-text-editor{ min-width: 0; }

/* Tighten tracking once the centre column is gone, per spec section 4. */
@media (max-width: 767px){
  #nod-ticker p{ letter-spacing: .1em; }
}

/* ---- Nav ---- */

/* The nav sits over the hero photo, so it must not take up layout space. */
#nod-header{ position: relative; z-index: 200; }

.nod-logo img{ display: block; }
/* ---- Sticky state (Sticky Header Effects toggles .she-header-transparent-yes) ---- */
/* The plugin's free shrink control is on/off with no amount, so the exact
   66->46 logo and 18->12 padding from spec section 4 are done here. */
#nod-nav,
.nod-logo img{
  transition: padding .5s ease, width .5s ease, background-color .5s ease;
}

.she-header-transparent-yes #nod-nav{
  padding-top: 12px;
  padding-bottom: 12px;
  /* Drop the photo scrim once stuck - the plugin paints the bar instead. */
  background-image: none;
}

.she-header-transparent-yes .nod-logo img{ width: 112px; }   /* 46px tall */

@media (max-width: 767px){
  .she-header-transparent-yes .nod-logo img{ width: 92px; }   /* 38px tall */
}

/* ---- Nav countdown (was the hero countdown, moved at client request) ---- */
/* It sits immediately after the rule baked into the right edge of nod-logo.png.
   Digits 30px / labels 10px: the logo is 66px tall, so a 46px countdown block
   reads as clearly secondary to it while staying legible. Sizes live on the
   widget - only what Elementor has no control for is here. */

/* Pin each cell WIDER than its widest content. Pro gives the items
   flex-basis:0/flex-grow:1, so every cell equals the widest one - which means a
   3-digit DAYS value fills its cell edge to edge while a 2-digit neighbour floats
   with slack, and the two read as colliding however much margin sits between them.
   Azeret Mono advances 0.6em, so 3 digits at 30px = 54px: a 56px floor keeps a
   sliver of air inside every cell. It also pins the width for the whole campaign -
   115 days and 9 days now occupy identical cells, so the nav never reflows. */
.elementor-widget.nod-countdown--nav .elementor-countdown-item{ min-width: 56px; }

/* Pro sets line-height:1 on both spans, so digits and label render touching. */
.elementor-widget.nod-countdown--nav .elementor-countdown-label{ margin-top: 6px; }

/* Pro centres the wrapper and auto-margins it. Inside an auto-width flex child
   that only adds slack against the logo - left-align it to the rule instead.
   Four classes deliberately: Pro ships this at .elementor-widget-countdown
   .elementor-countdown--label-block .elementor-countdown-wrapper (0,3,0) AND
   widget-countdown.min.css loads AFTER this kit file, so a 0,3,0 rule here
   would tie and lose on source order. */
.elementor-widget.elementor-widget-countdown.nod-countdown--nav .elementor-countdown-wrapper{
  justify-content: flex-start;
  margin-inline: 0;
}

/* ---- Where the countdown lives, by width ----
   Measured, not guessed. The nav row needs ~1054px:
     logo 160 + countdown 296 + menu 335 + CTA 185 + 3 gaps x 26 = 1054
   Countdown 296 = 4 cells x 56 + 3 gaps x 24 (see the min-width note above).
   The gutter is clamp(30px, 7.8vw, 156px), so a viewport V offers only 0.844V.
   1054 / 0.844 = 1249px minimum; 1280px is the line, leaving ~26px of margin
   for font-metric error. It also lands on real hardware: 1280, 1366, 1440 and
   1536 all keep the countdown; only 1249-1279 loses it.
   The menu does not collapse to the burger until 1024px, so everything from
   1025px up to the threshold is a band where the full menu and the countdown
   both want the row and it overruns. 1280px is a layout measurement, not an
   Elementor breakpoint - same reason the 860px hero threshold below is
   hand-written. It has moved as the digits grew: 1200 at 22px digits, 1240 at
   30px, 1280 once the cells were pinned to 56px. Change the digit size or the
   cell floor again and recompute this number.
   Above the line the nav carries the count, below it the hero block does, so
   the countdown is never absent from the page.
   !important because this kit file loads at #8, ahead of both
   widget-countdown.min.css (#10) and post-82.css (#25). */
@media (max-width: 1279px){
  .elementor-widget.nod-countdown--nav{ display: none !important; }
}
@media (min-width: 1280px){
  .elementor-element-herocdlb,
  .elementor-element-herocd01{ display: none !important; }
}

/* ---- Hero (spec 5.1) ---- */

/* Italic second line. Size/tracking still come from the Hero H1 global -
   only the slant is added here, so the type scale stays single-sourced. */
.nod-hero-h--italic .elementor-heading-title{ font-style: italic; }

/* Gotcha 3: the italic y descender clips under a 0.92 line-height. */
.nod-hero-h .elementor-heading-title{ overflow: visible; padding-bottom: .06em; }

/* The hero lede is its own token in the mockup - 13.5px/1.9, warmer than Body. */
/* Hero copy is centre-aligned as of 2026-08-07 (client request). The lede keeps
   its 38ch measure - a centred paragraph still needs a bounded line length - so
   it needs auto inline margins, otherwise the constrained box hugs the left edge
   of the full-width column and only its TEXT looks centred. */
#hero-lede{ max-width: 38ch; margin-inline: auto; color: #A29D92; font-size: 13.5px; line-height: 1.9; }
#hero-lede strong{ color: var(--e-global-color-primary); font-weight: 400; }

/* ---- Header reserve: hero copy was colliding with the nav (client, 2026-08-11) ----
   The transparent header is position:absolute !important (the plugin's own
   she-header-style.css, .she-header-transparent-yes), so at scroll 0 it takes ZERO
   layout space and #hero begins at viewport y=0 underneath it.
   #hero is min-height:100vh + justify-content:flex-end, so the copy is bottom-anchored.
   That is fine while the stack is short, but the stack is almost entirely px-driven
   (eyebrow margins, h1 margin, button pad, countdown digits) while the container is
   vh-driven. Shorten the viewport and the stack keeps its height while 100vh shrinks,
   so the top of it rises into the nav band. Browser zoom does exactly that: 125% turns
   a 1080px-tall window into 864 CSS px. Nothing reserved the header, hence the overlap.
   The reserve itself is on the hero's own padding-top control (= --nod-hdr + 24px) so
   the editor shows the real number instead of a 0 the front end contradicts.
   The vh terms added alongside it (h1 size + margin, button pad, countdown digits, the
   row gap below) let the stack SHRINK as the viewport shortens rather than just shoving
   the countdown past the fold. Every vh term sits above its clamp ceiling at >=938px of
   viewport height, so the approved desktop view is byte-identical. */
#hero-content{ row-gap: clamp(12px, 2.5vh, 22px); }   /* widget still reads a flat 30px */

/* ---- Header scrim on the band photo (client: nav hard to read, 2026-08-11) ----
   Two things had eaten it. The crop moved to 50% 65% to rescue the trees, which
   pulled BRIGHT sky and foliage up behind the nav where the dark building wall used
   to be. Worse, the Elementor overlay control can only express two stops at
   PERCENTAGE positions, and it was set to fade out by 42% OF THE BAND HEIGHT - so
   once --nod-band started shrinking on short viewports the scrim shrank with it.
   Measured alpha at the header's bottom edge (136px) before this rule:
     1080svh -> 0.22    927svh -> 0.12    754svh -> 0.03 (i.e. nothing at all)
   That is why it looked fine on a tall desktop and vanished on a phone.
   Keyed to --nod-hdr in PIXELS instead, so the ramp always covers the full header
   whatever the band is doing, and always finishes 90px below it so the rest of the
   photo is untouched. Four stops rather than two to keep the falloff smooth - which
   is also why this cannot live on the Elementor control.
   NOTE: the widget's own overlay control still reads the old 0.5/42% gradient, so
   the editor preview will disagree with the front end. This rule wins: (1,1,1)
   against Elementor's (0,3,1). */
#hero .nod-hero-band::before{
  background-image: linear-gradient(
    180deg,
    rgba(5,5,4,.92) 0,
    rgba(5,5,4,.82) calc(var(--nod-hdr) * .55),
    rgba(5,5,4,.48) var(--nod-hdr),
    /* +100 rather than +90: the higher value at the header edge needs a slightly
       longer run-out or the falloff starts to read as a hard band. */
    rgba(5,5,4,0)   calc(var(--nod-hdr) + 100px)
  );
}


/* ---- Band clearance: copy was landing ON the facility photo (client at 175%, 2026-08-11) ----
   Second half of the same story. The band is position:absolute pinned to the hero top, and an
   absolutely positioned box is laid out against its ancestor PADDING box, so the hero can grow
   its own padding-top without moving the photo. The reserve is therefore now the LARGER of
   the header and the band: max(--nod-hdr + 24, --nod-band + 18).
   Why not resize the copy, which is the obvious first instinct: at 175% zoom the viewport is
   ~1234x677 CSS px and --nod-band alone resolves to 380px, i.e. 56% of the screen HEIGHT.
   The stack is only ~481px and the lede is already 14px global Body Copy. Shrinking the h1,
   lede and buttons recovers ~40px against a ~240px shortfall - it cannot close the gap, it just
   makes the type small AND still overlapping. The band is the space hog, so the fix is to stop
   overlapping it rather than to fight it for room.
   Desktop is still untouched, and this is the arithmetic to preserve: at 1920x1080 the band is
   573px so the reserve is 591px, but the bottom-anchored stack already starts at 611px - the
   reserve is not the binding constraint, the hero stays exactly 100vh and nothing moves.
   Between roughly 850px and 1000px of viewport height the reserve does bind and the hero grows
   past 100vh by ~40px, which is the deliberate trade: a short scroll instead of copy on a
   bright photo. Past ~150% zoom the hero is simply taller than the screen and the page scrolls,
   which is correct behaviour for that zoom level - the invariant that matters is that the
   eyebrow always starts 18px BELOW the photo. */


/* ---- Hero eyebrow: was wrapping to two lines (client, 2026-08-11) ----
   "A PRIVATE IRON & WELLNESS CLUB - ALPHARETTA, GEORGIA" broke after "ALPHARETTA," and
   the extra line, in a bottom-anchored stack, pushed everything up onto the bright NOD
   sign in the band photo. TWO causes stacked, both Elementor defaults:
     1. the separator was pinned to width:46% (widget control), and
     2. widget-divider.min.css caps the text at max-width:95% OF THAT,
   so the text only ever had 0.95 x 0.46 = 43.7% of the content box. Fine at 1920px,
   not at ~1660px (a 1920 laptop at 115% zoom) where the line needs ~44%.
   The separator width control is now fit-content, floored at 46% here: on desktop the
   floor still wins so the rules keep their approved length, and once the text needs more
   room the BOX grows instead of the TEXT wrapping. The 100% ceiling means a genuinely
   narrow phone still wraps gracefully rather than overflowing the gutter.
   Scoped to elementor-element-heroeyeb, not .nod-eyebrow: the class is on 8 eyebrows and
   herocddt deliberately runs a 27% rule, which a 46% floor would visibly widen.
   max-width needs THREE classes - Elementor ships its cap at
   .elementor-widget-divider .elementor-divider__text (0,2,0) and widget-divider.min.css
   loads AFTER this kit file, so a 2-class rule here would tie and lose on source order. */
.elementor-widget-divider.elementor-element-heroeyeb .elementor-divider-separator{
  min-width: 46%;
  max-width: 100%;
}
/* max-width:none lifts Elementor's 95% cap so the line can run full width on a
   desktop. But Elementor ALSO ships .elementor-divider__element{flex-shrink:0}, and
   that cap was the only thing forcing a wrap - so with it gone the text could neither
   shrink nor wrap and simply overflowed the separator, clipping "ALPHARETTA, GEORGIA"
   off the right edge on a phone and reading as left-aligned into the bargain.
   At 11px with .28em tracking those 51 characters want ~494px; a 440px phone offers
   371px of content box. One line is not physically possible there - shrinking the
   type enough to fit would need ~8px, which is not a legible micro-label - so the
   right answer on mobile is two centred lines.
   min-width:0 + flex-shrink:1 restore that. They cost nothing on desktop: the
   separator is fit-content there, so it is already exactly max-content wide and there
   is no deficit to shrink into - the line stays single. */
.elementor-widget-divider.elementor-element-heroeyeb .elementor-divider__text{
  max-width: none;
  min-width: 0;
  flex-shrink: 1;
}

/* ================= Hero teaser video (client request, 2026-08-11) =================
   Markup + behaviour: wp-content/novamira-sandbox/nod-hero-video.php
   (auto-loaded by novamira/includes/sandbox-loader.php). Only look lives here,
   same split as the rest of this file.
   Not a popup plugin: JetPopup is not installed and not on disk (separate
   Crocoblock purchase, not part of JetEngine). Elementor Pro Popup was rejected
   because <video autoplay> is muted by every browser - the attribute fires on
   load, not from a gesture - so a Popup would open the brand film silent. The PHP
   file calls play() inside the click handler, which IS the gesture, so sound is
   allowed. Elementor's own video lightbox also hard-codes 16:9 and would
   letterbox a portrait film. */

/* -- Trigger, sitting third in the hero button row -- */

/* Elementor gives every widget in a container width:var(--container-widget-width,
   100%) AND flex-grow:var(--container-widget-flex-grow) at (0,2,0), and herobtns
   carries grow:1 - so without this the trigger stretches like a third button.
   #hero .nod-play-slot is (1,1,0) and beats it with no !important. */
#hero .nod-play-slot{ flex: 0 0 auto; align-self: center; width: auto; }

/* Moved 2026-08-11: client reported having to hunt for it at the end of the button
   row, so it now leads the copy stack, directly above the eyebrow. The margin is
   vh-aware for the same reason everything else in this hero is - it must give ground
   on a short or zoomed viewport rather than push the CTAs past the fold. */
.nod-play{
  display: inline-flex; align-items: center; gap: 14px;
  padding: 6px 4px;
  margin: 0 0 clamp(12px, 2vh, 18px);
  background: none; border: 0; cursor: pointer;
  color: var(--e-global-color-text);
  transition: color .3s ease;
}
.nod-play:hover{ color: var(--e-global-color-primary); }


.nod-play__ring{
  /* One token drives the circle so the glyph can follow it as a percentage - resize
     the ring here and nothing else needs touching. vh-capped like everything else in
     this hero, so a deeply zoomed viewport gets a smaller mark instead of a pushed
     down fold. 6vh only bites below ~867px of viewport height. */
  --nod-ring: min(52px, 6vh);
  position: relative;
  flex: 0 0 var(--nod-ring); width: var(--nod-ring); height: var(--nod-ring);
  border: 1px solid var(--e-global-color-secondary); border-radius: 50%;
  display: grid; place-items: center;
  transition: border-color .3s ease, background-color .3s ease;
}
.nod-play:hover .nod-play__ring{
  border-color: var(--e-global-color-accent);
  background-color: rgba(184,164,122,.09);
}
/* A percentage of the ring, not a fixed px size, so the two can never drift apart
   again - the glyph stayed small twice already while the circle grew. The small left
   nudge is optical centring: a triangle's visual mass sits left of its box centre. */
.nod-play__ring svg{ width: 37%; height: auto; margin-left: 5%; fill: var(--e-global-color-accent); }

/* One slow breath - reads as "live", not as a banner ad. Separate keyframes from
   the ticker dot: that one pulses opacity in place, this one expands a ring. */
.nod-play__ring::after{
  content: ""; position: absolute; inset: -1px;
  border: 1px solid var(--e-global-color-accent); border-radius: 50%;
  animation: nod-play-pulse 3.4s cubic-bezier(.4,0,.2,1) infinite;
}
@keyframes nod-play-pulse{
  0%       { transform: scale(1);    opacity: .5; }
  70%, 100%{ transform: scale(1.55); opacity: 0;  }
}

/* Micro Label metrics, matched to the eyebrows by hand: the global is 11px/.28em
   but .28em is too airy next to a 34px ring, so this runs .22em. */
.nod-play__text{
  font-family: var(--e-global-typography-accent-font-family), monospace;
  font-size: 12px; letter-spacing: .22em; text-transform: uppercase;
  white-space: nowrap; line-height: 1;
}
.nod-play__text small{ color: var(--e-global-color-02e4a6e5); font-size: inherit; letter-spacing: inherit; }

@media (max-width: 767px){
  .nod-play{ padding: 6px; justify-content: center; }
}

/* -- Lightbox. Built for 9:16; the PHP corrects the ratio from the real file. -- */

/* 100000 clears the stuck header: the SHE plugin ships .she-header at z-index
   9999, and #nod-header adds 200 on top of its own stacking context. */
.nod-lb{
  position: fixed; inset: 0; z-index: 100000;
  display: grid; place-items: center;
  padding: clamp(16px, 4vh, 48px) 16px;
  background: rgba(4,4,4,.93);
  -webkit-backdrop-filter: blur(14px); backdrop-filter: blur(14px);
  opacity: 0; transition: opacity .42s ease;
}
.nod-lb[hidden]{ display: none; }
.nod-lb.is-open{ opacity: 1; }

.nod-lb__frame{
  position: relative;
  aspect-ratio: var(--nod-lb-ar, 9 / 16);
  /* Height drives the box and the WIDTH follows from aspect-ratio, so the frame is
     always exactly the film's shape and object-fit has nothing left to letterbox.
     The third term caps the height so the derived width can never exceed the
     overlay's content box (100vw minus its two 16px gutters) on a narrow screen.
     The 16/9 constant is the portrait premise; a landscape file would still be
     shaped correctly by --nod-lb-ar, just capped more loosely. */
  /* vh first as a fallback: svh is Chrome 108+ / Safari 15.4+, and on anything older
     the whole declaration is invalid and DROPS - which would leave an aspect-ratio box
     with no definite dimension, i.e. a dialog that opens with no visible player. */
  height: min(84vh, 900px, calc((100vw - 32px) * 16 / 9));
  height: min(84svh, 900px, calc((100vw - 32px) * 16 / 9));
  max-width: calc(100vw - 32px);
  background: var(--e-global-color-1458ee48);
  border: 1px solid var(--e-global-color-68a19a6d);
  box-shadow: 0 40px 120px rgba(0,0,0,.9);
  /* NO overflow:hidden here. It clipped the Close button and the caption, both of
     which are positioned outside the frame - they rendered and were then cut away,
     so the dialog shipped with no visible way out but Escape or a backdrop click.
     Nothing can overflow regardless: the video is exactly frame-sized and uses
     object-fit:contain. */
  opacity: 0; transform: translateY(18px) scale(.985);
  transition: transform .5s cubic-bezier(.16,1,.3,1), opacity .5s ease;
}
.nod-lb.is-open .nod-lb__frame{ opacity: 1; transform: none; }
/* contain, not cover: with the ratio taken from the file these are identical,
   but contain degrades to thin bars instead of cropping the client's framing. */
.nod-lb__frame video{ display: block; width: 100%; height: 100%; object-fit: contain; background: #000; }

.nod-lb__close,
.nod-lb__cap{
  position: absolute;
  font-family: var(--e-global-typography-accent-font-family), monospace;
  font-size: 10px; letter-spacing: .26em; text-transform: uppercase;
}
/* Inside the frame, top right. It used to sit above the frame, which looked more
   editorial but depended on the overlay padding always exceeding the offset at every
   viewport height - it did not, and overflow:hidden hid the evidence. Inside is
   unconditional. The pill keeps it legible over moving footage. */
.nod-lb__close{
  top: 10px; right: 10px;
  display: inline-flex; align-items: center; gap: 8px;
  padding: 9px 12px; cursor: pointer;
  background: rgba(6,6,6,.62);
  -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px);
  border: 1px solid var(--e-global-color-7faf67c4);
  color: var(--e-global-color-primary);
  transition: color .25s ease, border-color .25s ease, background-color .25s ease;
}
.nod-lb__close:hover{ color: var(--e-global-color-accent); }
.nod-lb__cap{ left: 0; bottom: 0; transform: translateY(2.4rem); margin: 0; color: var(--e-global-color-02e4a6e5); }
.nod-lb__cap b{ color: var(--e-global-color-secondary); font-weight: 400; }

.nod-lb__unmute{
  position: absolute; left: 50%; bottom: 18px; transform: translateX(-50%);
  display: none; align-items: center; gap: 8px;
  padding: 10px 18px; cursor: pointer;
  background: rgba(6,6,6,.72); -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px);
  border: 1px solid var(--e-global-color-7faf67c4);
  font-family: var(--e-global-typography-accent-font-family), monospace;
  font-size: 10px; letter-spacing: .24em; text-transform: uppercase;
  color: var(--e-global-color-primary);
}
.nod-lb__unmute.is-shown{ display: inline-flex; }
.nod-lb__unmute svg{ fill: var(--e-global-color-accent); }

/* Placeholder while the film is unlinked. */
.nod-lb__ph{
  position: absolute; inset: 0;
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 14px;
  text-align: center; padding: 32px;
  background: linear-gradient(180deg, var(--e-global-color-173dc720) 0%, var(--e-global-color-1458ee48) 100%);
}
.nod-lb__ph strong{
  font-family: var(--e-global-typography-primary-font-family), serif;
  font-size: 40px; color: rgba(237,233,225,.2);
}
.nod-lb__ph span{
  font-family: var(--e-global-typography-accent-font-family), monospace;
  font-size: 10px; letter-spacing: .22em; text-transform: uppercase;
  color: var(--e-global-color-02e4a6e5); line-height: 2;
}

/* Portrait frame + a short viewport is the one case where height-driven sizing
   overflows, so hand the width the job below the mobile breakpoint. */
@media (max-width: 767px){
  /* NOT width:100%. That forced the box wider than the 9:16 film while max-height
     capped its height, so object-fit:contain letterboxed it - which is exactly the
     black margin that showed between the video and the gold border on the left and
     right. Height-driven here too, same as desktop. */
  .nod-lb__frame{
    height: min(78vh, calc((100vw - 32px) * 16 / 9));
    height: min(78svh, calc((100vw - 32px) * 16 / 9));
  }
  .nod-lb__close{ top: 8px; right: 8px; }
  /* The caption wraps to two lines at this width, so centre it under the frame
     instead of leaving it ragged against the left edge. */
  /* top:100% pins the caption's TOP EDGE to the frame's bottom edge, so the gap no
     longer depends on how many lines it wraps to. With bottom:0 plus a fixed
     translateY the box grew UPWARDS as it wrapped, and at two lines that ate back
     past the frame edge and sat on the film - the slight overlap. This is a flat
     10px of clearance whatever the copy does. Desktop keeps the original
     bottom-anchored offset, where the caption is a single line. */
  .nod-lb__cap{
    left: 0; right: 0; text-align: center;
    top: 100%; bottom: auto; transform: none;
    margin-top: 10px;
  }
}

/* -- Hello Elementor bare-button reset, neutralised --
   hello-elementor/assets/css/reset.css paints EVERY bare <button> on the site:
     [type=button],[type=submit],button{ border:1px solid #c36; color:#c36 }
     button:focus, button:hover{ background-color:#c36; color:#fff }
   #c36 is crimson. The resting rule is (0,0,1) so a single class already outranks
   it - which is why these looked right until touched - but the STATE rule is
   (0,1,1), and a bare `.nod-play:hover` is (0,1,1) as well. It therefore tied and
   won on file order for `color` while `background-color` went completely
   unopposed: a crimson pill on hover, and because a click leaves focus behind, a
   crimson pill that stayed put afterwards.
   Qualified by an ancestor these become (1,1,1) / (0,2,1) and win outright rather
   than depending on post-6.css still loading after the theme.
   This is the first bare <button> in the build - every other CTA is an Elementor
   <a class="elementor-button">, which Hello's .elementor-kit-6 never matches - which is
   why it stayed hidden until the video trigger went in. The lightbox Close and
   unmute controls are bare buttons too and had exactly the same latent bug. */

#hero .nod-play:hover,
#hero .nod-play:focus,
#hero .nod-play:active{
  background: none;
  border: 0;
  border-radius: 0;
}
/* Same specificity, so order decides: :hover sits last and therefore wins when
   the pointer is over a trigger that also still holds focus after the dialog closes. */
#hero .nod-play:focus{ color: var(--e-global-color-text); }
#hero .nod-play:hover{ color: var(--e-global-color-primary); }

/* Keyboard users keep a ring; a mouse click must not leave one sitting there. */
#hero .nod-play:focus{ outline: none; }
#hero .nod-play:focus-visible{ outline: 2px solid var(--e-global-color-accent); outline-offset: 4px; }

/* Restates the pill rather than clearing it - `background: none` here would have
   deleted the new background on hover while still beating Hello's crimson. */
.nod-lb .nod-lb__close:hover,
.nod-lb .nod-lb__close:focus,
.nod-lb .nod-lb__close:active{
  background: rgba(6,6,6,.82);
  border: 1px solid var(--e-global-color-accent);
  color: var(--e-global-color-accent);
}
.nod-lb .nod-lb__close:focus{ outline: none; }
.nod-lb .nod-lb__close:focus-visible{ outline: 2px solid var(--e-global-color-accent); outline-offset: 3px; }

/* The unmute chip DOES keep a background - it sits over moving footage - so this
   restates its own instead of clearing it. */
.nod-lb .nod-lb__unmute:hover,
.nod-lb .nod-lb__unmute:focus,
.nod-lb .nod-lb__unmute:active{
  background: rgba(6,6,6,.72);
  border: 1px solid var(--e-global-color-accent);
  color: var(--e-global-color-primary);
}
.nod-lb .nod-lb__unmute:focus{ outline: none; }
.nod-lb .nod-lb__unmute:focus-visible{ outline: 2px solid var(--e-global-color-accent); outline-offset: 3px; }





/* Countdown: the Days figure reads brass, the rest bone. No native per-unit control. */
.elementor-widget.nod-countdown .elementor-countdown-item:first-child .elementor-countdown-digits{
  color: var(--e-global-color-accent);
}
.nod-countdown .elementor-countdown-label{ text-transform: uppercase; }

/* Mobile: the band moves into normal flow above the copy, otherwise the eyebrow
   lands on the bright lawn and is unreadable (spec 5.1 + gotcha 4).
   860px is the spec's threshold, not an Elementor breakpoint. */
@media (max-width: 860px){
  /* The band moves into flow at the top here and the header is MEANT to sit over the
     photo, so the desktop header reserve is dropped. */
  #hero{ min-height: auto; padding-top: 0; }

  .nod-hero-band{
    position: relative !important;
    inset: auto !important;
    width: auto !important;
    min-height: clamp(300px, 46svh, 460px);
    /* background-position lives on the widget now (Custom, 34%/65% at the mobile
       breakpoint). It was here as "34% bottom" at (0,1,0) and lost to Elementor's own
       (0,4,0) heroband rule in post-10.css, so the 34% never actually applied. */
    margin-left: calc(var(--nod-gut) * -1);
    margin-right: calc(var(--nod-gut) * -1);
  }

  .nod-hero-inner{ margin-top: -34px; }
}
/* ================= Sections 5.2 - 5.6 ================= */

/* Italic display words read brass throughout (spec 5.1-5.5). */
.nod-h2 em,
.nod-hero-h em{ font-style: italic; color: var(--e-global-color-accent); }

/* Gotcha 3 again - descenders on every display heading, not just the hero. */
.nod-h2 .elementor-heading-title{ overflow: visible; padding-bottom: .06em; }

.nod-body-44{ max-width: 44ch; }

/* --- Section separation, device 3: light spill (spec 2).
   Explicit rgba(10,10,9,0) not `transparent` - gotcha 7. --- */
.nod-sec--raised,
.nod-sec--deep{ position: relative; }

.nod-sec--raised::before,
.nod-sec--deep::before{
  content: '';
  position: absolute;
  left: 0; right: 0; top: 0;
  height: 300px;
  z-index: 0;
  pointer-events: none;
  background: radial-gradient(58% 100% at 50% 0, rgba(184,164,122,.05), rgba(10,10,9,0) 72%);
}
.nod-sec--deep::before{
  background: radial-gradient(58% 100% at 50% 0, rgba(184,164,122,.035), rgba(7,7,6,0) 72%);
}

/* --- 5.2 Creed --- */
.nod-creed-img img{
  display: block;
  width: 100%;
  aspect-ratio: 1 / 1;
  object-fit: cover;
  /* Native CSS Filters offer saturate, not grayscale - this is the exact spec value. */
  filter: grayscale(.35) brightness(.8);
}
.nod-creed-img figcaption{
  margin-top: 12px;
  font-family: 'JetBrains Mono', monospace;
  font-size: 9px;
  font-weight: 400;
  letter-spacing: .24em;
  text-transform: uppercase;
  color: var(--e-global-color-02e4a6e5);
}
.nod-numeral p{ margin: 0; }

/* --- 5.3 Facility zone mosaic.
   DOM order carries the layout: Combat Zone is second so its 2-row span
   fills rows 1-2 of columns 9-12 and the row-2 tiles flow around it (gotcha 6). --- */
.nod-zone--a{ grid-column: span 8; }
.nod-zone--b{ grid-column: span 4; grid-row: span 2; }
.nod-zone--c{ grid-column: span 4; }
.nod-zone--d{ grid-column: span 4; }
.nod-zone--e{ grid-column: span 4; }
.nod-zone--f{ grid-column: span 4; }
/* Zone 07 (Hyrox & Turf) added 2026-08-07. Row 3 was two 6-wide tiles; it is now
   three 4-wide ones so the 12-column mosaic still closes exactly. */
.nod-zone--g{ grid-column: span 4; }

/* Legibility gradient under the label, bottom-to-top. */
.nod-zone::after{
  content: '';
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  background: linear-gradient(to top, rgba(6,6,5,.86) 0%, rgba(6,6,5,0) 62%);
  transition: opacity .5s cubic-bezier(.16,1,.3,1);
}
.nod-zone__meta p{ margin: 0; }

#zone-note strong{ color: var(--e-global-color-accent); font-weight: 400; }

@media (max-width: 860px){
  .nod-zone-grid{ grid-template-columns: repeat(6, 1fr) !important; }
  .nod-zone--a, .nod-zone--b, .nod-zone--c,
  .nod-zone--d, .nod-zone--e, .nod-zone--f,
  .nod-zone--g{ grid-column: span 6; grid-row: span 1; }
}

/* --- 5.4 Ledger rail --- */
.nod-rail .elementor-progress-wrapper{
  position: relative;
  border: 1px solid var(--e-global-color-7faf67c4);
  border-radius: 0;
}
.nod-rail .elementor-progress-bar{
  background-image: linear-gradient(90deg, #8A7A56 0%, #B8A47A 100%);
  transition: width 1.4s cubic-bezier(.16,1,.3,1);
}

/* Tier dividers at 16.667% and 50%. These are what turn a generic progress bar
   into a seat map - the segment widths ARE the tier sizes. */
.nod-rail .elementor-progress-wrapper::before,
.nod-rail .elementor-progress-wrapper::after{
  content: '';
  position: absolute;
  top: 0; bottom: 0;
  width: 1px;
  z-index: 2;
  background: var(--e-global-color-7faf67c4);
}
.nod-rail .elementor-progress-wrapper::before{ left: 16.667%; }
.nod-rail .elementor-progress-wrapper::after { left: 50%; }

.nod-ledger-count .elementor-counter-number-wrapper{ line-height: 1; }
.nod-legend__name p,
.nod-legend__range p{ margin: 0; }
.nod-legend__count .elementor-counter-number-wrapper{ line-height: 1; margin-top: 2px; }

@media (max-width: 767px){
  .nod-legend__col{
    border-left: 0 !important;
    border-top: 1px solid var(--e-global-color-7faf67c4);
    padding: 12px 0 !important;
  }
}

/* --- 5.5 Apply --- */
.nod-apply-lede{ max-width: 46ch; margin-inline: auto; }
.nod-form-panel{ backdrop-filter: blur(14px); -webkit-backdrop-filter: blur(14px); max-width: 620px; margin-inline: auto; }
.nod-form-step p{ margin: 0; }

/* --- 5.6 Footer --- */
.nod-footer-tag{ max-width: 34ch; }
.nod-footer-h p{ margin: 0; }
.nod-footer-links a{ color: var(--e-global-color-text); text-decoration: none; }
.nod-footer-links a:hover{ color: var(--e-global-color-accent); }
.nod-footer-links p{ margin: 0; line-height: 2.1; }

/* ================= Appendix A.1 - zone spotlight ================= */
.nod-zone{ position: relative; overflow: hidden; }

/* the filter layer - an empty Elementor container */
.nod-zone .nod-tone{
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;              /* REQUIRED - see gotcha 9 */
  -webkit-backdrop-filter: grayscale(1) brightness(.56) contrast(1.12);
          backdrop-filter: grayscale(1) brightness(.56) contrast(1.12);
  transition: opacity .5s cubic-bezier(.16,1,.3,1);
}

/* punch a soft hole in the filter, centred on the cursor */
.nod-zone:hover .nod-tone{
  -webkit-mask-image: radial-gradient(circle 330px at var(--mx,50%) var(--my,50%),
                     transparent 0, transparent 40%, #000 100%);
          mask-image: radial-gradient(circle 330px at var(--mx,50%) var(--my,50%),
                     transparent 0, transparent 40%, #000 100%);
}

/* label sits above the filter */
.nod-zone .nod-zone__label{ position: relative; z-index: 2; }

@media (max-width: 860px){
  .nod-zone:hover .nod-tone{
    -webkit-mask-image: radial-gradient(circle 210px at var(--mx,50%) var(--my,50%),
                       transparent 0, transparent 40%, #000 100%);
            mask-image: radial-gradient(circle 210px at var(--mx,50%) var(--my,50%),
                       transparent 0, transparent 40%, #000 100%);
  }
}

/* touch devices: no cursor to follow, and six live backdrop-filters is
   wasted compositing. Swap for a cheap static filter. */
@media (hover: none){
  .nod-zone .nod-tone{
    -webkit-backdrop-filter: none; backdrop-filter: none;
    background: rgba(6,6,5,.35);
  }
  .nod-zone{ filter: grayscale(.85) brightness(.7) contrast(1.1); }
}
/* Creed image tracks the copy and releases at the end of the row.
   Native CSS sticky, not Elementor's JS sticky: a sticky element is bounded by
   its own parent, so it cannot escape into the Facility section below.
   align-self is required - a stretched flex child has no room to travel. */
@media (min-width: 861px){
  .nod-creed-img{
    position: sticky;
    top: 120px;              /* clears the stuck header (34px ticker + 70px nav) */
    align-self: flex-start;
  }
}
/* Zone mosaic row height.
   Elementor's grid control writes grid-template-rows, which sizes only the ONE
   explicit row - rows 2 and 3 are implicit and collapse to content height.
   The spec wants grid-auto-rows, which sizes every implicit row. No native
   control exists for it, so it is set here. */
.nod-zone-grid{
  grid-auto-rows: clamp(200px, 23vw, 310px);
}

@media (max-width: 860px){
  .nod-zone-grid{ grid-auto-rows: clamp(180px, 30vw, 240px); }
}
/* Gymdesk form embed.
   The loader injects a cross-origin iframe from app.gymdesk.com and auto-sizes
   it via postMessage, so nothing INSIDE it can be styled from here - the form's
   own colours and type are configured in the Gymdesk dashboard.
   These rules only make the frame sit correctly inside the NOD panel. */
.nod-gymdesk iframe{
  display: block;
  width: 100% !important;
  max-width: 100%;
  border: 0;
}
.nod-gymdesk .maonrails-form{ width: 100%; }

/* Don't let the panel clip the frame while it is measuring its own height. */
.nod-form-panel{ overflow: visible; }


/* ---- Counter alignment ----
   Elementor's counter centres its number by giving the prefix AND suffix spans
   flex-grow:1 - even when both are empty - and centres the title with
   justify-content:center. Everything on this page is left-aligned, and the
   centring only becomes obvious when the stats wrap on mobile.
   Elementor exposes the grow factors as custom properties, so this is a
   supported override rather than a fight with their stylesheet. */
.nod-stat,
.nod-ledger-count,
.nod-legend__count{
  --counter-prefix-grow: 0;
  --counter-suffix-grow: 0;
}
.elementor-element.nod-stat .elementor-counter-title,
.elementor-element.nod-ledger-count .elementor-counter-title,
.elementor-element.nod-legend__count .elementor-counter-title{
  justify-content: flex-start;
}
.nod-stat .elementor-counter-number-wrapper,
.nod-ledger-count .elementor-counter-number-wrapper,
.nod-legend__count .elementor-counter-number-wrapper{
  text-align: left;
}

/* ---- Mobile nav CTA ----
   The button typography is bound to the Button global, and a group global sets
   every property at once - so a per-breakpoint size override is not possible
   through the widget controls. Tightening type here is the only route, and it
   matches the mockup's own mobile treatment (smaller size, tighter tracking). */
@media (max-width: 767px){
  .elementor-widget.nod-cta a.elementor-button{ white-space: nowrap; }
}
/* ================= Formidable form (spec 5.5) =================
   Scoped under #apply-form: an ID .elementor-kit-6 (1,0,0) outranks Formidable's
   class-based stylesheet, so none of this needs !important. */

#apply-form .frm_forms,
#apply-form fieldset{ border: 0; padding: 0; margin: 0; background: none; }
#apply-form .frm_fields_container{ display: flex; flex-direction: column; gap: 26px; }
#apply-form .frm_form_field{ margin: 0; }

/* Labels - micro label, matching every other label on the page */
#apply-form .frm_primary_label{
  display: block;
  margin: 0 0 10px;
  padding: 0;
  font-family: 'JetBrains Mono', monospace;
  font-size: 11px;
  font-weight: 400;
  letter-spacing: .28em;
  text-transform: uppercase;
  color: var(--e-global-color-secondary);
}
#apply-form .frm_required{ color: var(--e-global-color-accent); }

/* Inputs - transparent, hairline underline, display serif. Brass on focus. */
#apply-form input[type="text"]:not(.frm_verify),
#apply-form input[type="email"],
#apply-form input[type="tel"]{
  width: 100%;
  background: rgba(10,10,9,0);
  border: 0;
  border-bottom: 1px solid var(--e-global-color-7faf67c4);
  border-radius: 0;
  box-shadow: none;
  padding: 4px 0 12px;
  font-family: 'Instrument Serif', Georgia, serif;
  font-weight: 400;
  font-size: clamp(19px, 2.4vw, 26px);
  line-height: 1.35;
  color: var(--e-global-color-primary);
  transition: border-color .4s ease;
}
#apply-form input::placeholder{
  color: var(--e-global-color-02e4a6e5);
  opacity: .5;
  font-size: clamp(21px, 2.7vw, 29px);
}
#apply-form input[type="text"]:focus,
#apply-form input[type="email"]:focus,
#apply-form input[type="tel"]:focus{
  outline: none;
  background: rgba(10,10,9,0);
  border-bottom-color: var(--e-global-color-accent);
}
/* Kill Chrome's autofill wash, which would paint the input pale blue.
   Chrome refuses background-color on an autofilled input, so the mask has to be
   an inset box-shadow big enough to cover the box, plus -webkit-text-fill-color,
   which is what actually colours autofilled text (color is ignored too).

   !important is load-bearing here, not lazy. The base input rule above carries
   :not(.frm_verify) for the honeypot, which makes it (1,2,1) - it OUT-RANKED the
   old (1,1,1) autofill rule and its box-shadow:none re-exposed the wash. That hit
   only type="text", so First/Last Name went white while Email and Mobile - whose
   base rules are (1,1,1) and merely tie - looked correct. A confusing half-broken
   state; !important removes the whole class of specificity race.

   Two separate blocks on purpose: one invalid .elementor-kit-6 invalidates an entire
   comma-separated list, so :autofill and :-webkit-autofill must not share one. */
#apply-form input:-webkit-autofill,
#apply-form input:-webkit-autofill:hover,
#apply-form input:-webkit-autofill:focus,
#apply-form input:-webkit-autofill:active{
  -webkit-text-fill-color: var(--e-global-color-primary) !important;
  -webkit-box-shadow: 0 0 0 1000px #0A0A09 inset !important;
  box-shadow: 0 0 0 1000px #0A0A09 inset !important;
  caret-color: var(--e-global-color-primary);
  /* Chrome re-paints the wash on some interactions; parking the transition
     stops it animating back in. Border transition is restated so it survives. */
  transition: border-color .4s ease, background-color 100000s ease-in-out 0s;
}
#apply-form input:autofill,
#apply-form input:autofill:hover,
#apply-form input:autofill:focus,
#apply-form input:autofill:active{
  -webkit-text-fill-color: var(--e-global-color-primary) !important;
  box-shadow: 0 0 0 1000px #0A0A09 inset !important;
  caret-color: var(--e-global-color-primary);
}

/* Option chips (spec 5.5).
   training_toward became a CHECKBOX on 2026-08-07 (client wants multi-select), so
   every .elementor-kit-6 here has to cover .frm_checkbox / input[type="checkbox"] as well
   as the radio forms - Formidable swaps both the wrapper class and the input type
   with the field type, and a radio-only .elementor-kit-6 would silently drop the chip
   design back to default browser checkboxes. Kept both so the styling survives if
   the field is ever switched back, or another single-choice field is added. */
#apply-form .vertical_radio .frm_primary_label,
#apply-form .vertical_checkbox .frm_primary_label{ margin-bottom: 14px; }
#apply-form .frm_opt_container{ display: flex; flex-wrap: wrap; gap: 9px; }
#apply-form .frm_radio,
#apply-form .frm_checkbox{ margin: 0; }
#apply-form .frm_radio label,
#apply-form .frm_checkbox label{
  display: inline-block;
  margin: 0;
  cursor: pointer;
  padding: 10px 16px;
  border: 1px solid var(--e-global-color-7faf67c4);
  font-family: 'JetBrains Mono', monospace;
  font-size: 10.5px;
  font-weight: 300;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--e-global-color-text);
  transition: border-color .3s ease, color .3s ease, background-color .3s ease;
}
#apply-form .frm_radio label:hover,
#apply-form .frm_checkbox label:hover{
  color: var(--e-global-color-primary);
  border-color: var(--e-global-color-secondary);
}
/* The input sits inside its label and the text is a bare text node, so :has() is
   the only pure-CSS route to the chip. .is-checked is the same state set by
   nod-form-chips.php in the sandbox - kept as a second, support-independent path
   because this highlight is the ONLY feedback for a multi-select field. */
#apply-form .frm_radio input[type="radio"],
#apply-form .frm_checkbox input[type="checkbox"]{ position: absolute; opacity: 0; width: 0; height: 0; }
#apply-form .frm_radio label:has(input:checked),
#apply-form .frm_checkbox label:has(input:checked),
#apply-form .frm_radio.is-checked label,
#apply-form .frm_checkbox.is-checked label{
  border-color: var(--e-global-color-accent);
  color: var(--e-global-color-accent);
  background: rgba(184,164,122,.08);
}
/* Keyboard users still need to see focus once the native control is hidden. */
#apply-form .frm_radio label:has(input:focus-visible),
#apply-form .frm_checkbox label:has(input:focus-visible){
  outline: 1px solid var(--e-global-color-accent);
  outline-offset: 2px;
}

/* Submit - brass fill, void text */
#apply-form .frm_submit{ margin: 8px 0 0; }
#apply-form .frm_button_submit{
  background: var(--e-global-color-accent);
  color: var(--e-global-color-72fdca5d);
  border: 1px solid var(--e-global-color-accent);
  border-radius: 0;
  padding: 16px 30px;
  font-family: 'JetBrains Mono', monospace;
  font-size: 11.5px;
  font-weight: 500;
  letter-spacing: .26em;
  text-transform: uppercase;
  cursor: pointer;
  transition: background-color .4s ease, border-color .4s ease;
}
#apply-form .frm_button_submit:hover{
  background: var(--e-global-color-secondary);
  border-color: var(--e-global-color-secondary);
}

/* Validation - the palette has no error colour, so this is a muted rust that
   reads as a warning without breaking the brass/bone scheme. */
#apply-form .frm_error,
#apply-form .frm_error_style{
  margin-top: 8px;
  background: none;
  border: 0;
  padding: 0;
  font-family: 'JetBrains Mono', monospace;
  font-size: 10px;
  font-weight: 300;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: #C1766A;
}
#apply-form .frm_blank_field input{ border-bottom-color: #C1766A; }

/* Success state */
#apply-form .frm_message{
  border: 1px solid var(--e-global-color-accent);
  background: rgba(184,164,122,.05);
  padding: clamp(20px, 3vw, 30px);
}
#apply-form .frm_message p{ margin: 0; color: var(--e-global-color-text); }
#apply-form .frm_message strong{
  display: block;
  margin-bottom: 10px;
  font-family: 'Instrument Serif', Georgia, serif;
  font-weight: 400;
  font-size: clamp(20px, 2.6vw, 28px);
  color: var(--e-global-color-primary);
  letter-spacing: -.01em;
}

@media (max-width: 767px){
  #apply-form .frm_fields_container{ gap: 22px; }
  #apply-form .frm_button_submit{ width: 100%; padding: 15px 20px; letter-spacing: .18em; }
}

/* ================= Privacy Policy page =================
   A plain WordPress page rendered by Hello Elementor's single template, sitting
   inside the NOD Theme Builder header/footer. Scoped to page-id-3; duplicate the
   block for a Terms page later. */

.page-id-3 .site-main{
  padding: 172px var(--nod-gut) var(--nod-vpad);   /* 172px clears the sticky header */
}
.page-id-3 .page-header,
.page-id-3 .page-content{
  max-width: min(1040px, 100%);
  margin-inline: auto;
}

.page-id-3 .entry-title{
  margin: 0 0 38px;
  font-family: 'Instrument Serif', Georgia, serif;
  font-weight: 400;
  font-size: clamp(38px, 5.6vw, 64px);
  line-height: .98;
  letter-spacing: -.015em;
  color: var(--e-global-color-primary);
}

.page-id-3 .page-content h2{
  margin: 46px 0 14px;
  font-family: 'Instrument Serif', Georgia, serif;
  font-weight: 400;
  font-size: clamp(21px, 2.4vw, 29px);
  line-height: 1.12;
  letter-spacing: normal;
  color: var(--e-global-color-primary);
}

.page-id-3 .page-content p,
.page-id-3 .page-content li{
  font-family: 'JetBrains Mono', monospace;
  font-weight: 300;
  font-size: 14.5px;
  line-height: 1.95;
  color: var(--e-global-color-text);
}
.page-id-3 .page-content p{ margin: 0 0 16px; }
.page-id-3 .page-content ul{ margin: 0 0 20px; padding-left: 1.15em; }
.page-id-3 .page-content li{ margin-bottom: 7px; }
.page-id-3 .page-content li::marker{ color: var(--e-global-color-secondary); }

/* JetBrains Mono has a 500 weight - use it rather than faux bold */
.page-id-3 .page-content strong{
  font-weight: 500;
  color: var(--e-global-color-primary);
}

.page-id-3 .page-content a{
  color: var(--e-global-color-accent);
  text-decoration: underline;
  text-underline-offset: 3px;
}
.page-id-3 .page-content a:hover{ color: var(--e-global-color-primary); }

.page-id-3 .wp-block-separator{
  border: 0;
  border-top: 1px solid var(--e-global-color-7faf67c4);
  margin: 38px 0;
}

/* Provider table */
.page-id-3 .wp-block-table{ margin: 26px 0; overflow-x: auto; }
.page-id-3 .wp-block-table table{ width: 100%; border-collapse: collapse; }
.page-id-3 .wp-block-table th,
.page-id-3 .wp-block-table td{
  border: 1px solid var(--e-global-color-7faf67c4);
  padding: 12px 14px;
  text-align: left;
  font-family: 'JetBrains Mono', monospace;
  font-weight: 300;
  font-size: 12.5px;
  line-height: 1.7;
  color: var(--e-global-color-text);
}
.page-id-3 .wp-block-table th{
  font-weight: 400;
  font-size: 10px;
  letter-spacing: .22em;
  text-transform: uppercase;
  color: var(--e-global-color-secondary);
}

/* Date line under the title */
.page-id-3 .nod-pp-meta{
  margin-bottom: 30px;
  font-size: 11px;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--e-global-color-02e4a6e5);
}
.page-id-3 .nod-pp-contact{ line-height: 2; }

/* Unresolved editorial instructions - deliberately loud so they cannot be
   published by accident. Delete these paragraphs (and this rule) at launch. */
.page-id-3 .nod-pp-todo{
  margin: 18px 0;
  padding: 12px 16px;
  border-left: 2px solid var(--e-global-color-accent);
  background: rgba(184,164,122,.06);
  font-family: 'JetBrains Mono', monospace;
  font-size: 10.5px;
  font-weight: 400;
  letter-spacing: .12em;
  line-height: 1.7;
  color: var(--e-global-color-secondary);
}

@media (max-width: 767px){
  .page-id-3 .site-main{ padding-top: 130px; }
  .page-id-3 .page-content p,
  .page-id-3 .page-content li{ font-size: 13px; }
}/* End custom CSS */