/* Cross-browser + small-device compatibility layer.
   Loaded LAST on every page so it wins on equal specificity.
   Everything here is a fallback or a mobile correction — no new design. */

/* iOS inflates text in landscape unless this is pinned. */
html{ -webkit-text-size-adjust:100%; text-size-adjust:100%; }

/* iOS Safari cannot honour background-attachment:fixed — it either ignores it or
   repaints the whole gradient every frame. Scroll it on touch devices. */
@media (hover:none), (max-width:900px){
  body{ background-attachment:scroll !important; }
}

/* 100vh on iOS includes the address bar, so full-height sections overflow and cut
   their own content off. svh is the stable visible height; unlike dvh it does not
   resize mid-scroll, which matters for the GSAP-pinned sections. */
@supports (height:100svh){
  #hero{ min-height:100svh; }
  .horizons-pin, .horizons-track, .horizon, .story-pin{ height:100svh; }
}

/* The scrim under .svc .photo existed for photographic art. Every service row is
   now a flat illustration, so it is switched off unconditionally instead of via
   :has(), which needs Safari 15.4+. */
.svc .photo::after, .svc.flip .photo::after{ display:none !important; }

/* Form controls: strip the iOS/Safari native chrome that overrides our styling,
   and keep the 16px floor that stops iOS zooming the page on focus. */
input, select, textarea, button{ -webkit-appearance:none; appearance:none; border-radius:0; }
input, select, textarea{ font-size:16px; }
input, select, textarea, button{ -webkit-tap-highlight-color:transparent; }
select{ background-image:none; }

/* Safari applies its own inner shadow to inputs on iOS. */
input, textarea{ -webkit-background-clip:padding-box; background-clip:padding-box; }

/* Safari needed the prefix for sticky in older versions — but this MUST stay inside
   the desktop range. Unmediated (and loading last) it overrode the
   `@media (max-width:980px){ .fs-card{ position:static } }` fallback in
   neo-styles.css and broke the stacked-card layout on phones. */
/* Both breakpoints now declare the -webkit- prefix themselves, so this
   only needs to cover the desktop rule. */
@media (min-width:981px){
  .fs-card{ position:-webkit-sticky; position:sticky; }
}

/* Nothing may push a horizontal scrollbar on small screens.
   NOT on <html>: overflow-x:hidden there turns the root into a scroll container,
   which makes every `position:sticky` resolve against it instead of the viewport —
   that silently killed the services card stack. body already carries overflow-x
   in neo-styles.css; `clip` is used here because, unlike `hidden`, it does not
   create a scroll container. */
body{ max-width:100%; }@supports (overflow-x:clip){ body{ overflow-x:clip; }}
img, svg, video, canvas, iframe{ max-width:100%; }

/* ── Small-device layout guards ─────────────────────────────────── */
@media (max-width:600px){
  .wrap{ padding-left:20px; padding-right:20px; }
  h1.hero-h, h1.page-h{ font-size:clamp(30px,9vw,44px); }
  .fs-h, .section-head h2, .split h2, .final-cta h2, h2.section-h2{ font-size:clamp(26px,7.5vw,36px); }
  section{ padding-top:64px; padding-bottom:64px; }
  .stat-grid{ grid-template-columns:1fr 1fr; }
  .hero-ctas{ flex-direction:column; align-items:stretch; }
  .hero-ctas .btn{ justify-content:center; }
  /* Tap targets: 44px minimum. */
  .btn, nav.top a, .seg button, .why-pill{ min-height:44px; display:inline-flex; align-items:center; }
}

/* ── Footer link alignment ──────────────────────────────────────
   `.ft-col a` is display:block in neo-footer.css so each link owns a
   line. The tap-target rule above used to include it and set
   display:inline-flex, which is an INLINE box — every link in a column
   collapsed onto one running line ("About Us Leadership Careers Blog").
   display:flex keeps the 44px box while staying block-level, so the
   column reads as a column again.

   Applied to 900px, not 600px: the footer already collapses to two
   columns at 900 and tablets are touch devices, so the links between
   601-900px need the same 44px floor. .ft-legal and .ft-kv were never
   covered at all — they sat at 17-19px, the smallest targets on the
   page. */
@media (max-width:900px){
  .ft-col a{
    display:flex; align-items:center; width:auto;
    min-height:44px; padding:4px 0;
  }
  .ft-legal{ gap:8px 26px; }
  .ft-legal a, .ft-kv a{
    display:inline-flex; align-items:center; min-height:44px;
  }
  /* Long addresses must be allowed to break rather than force a scrollbar. */
  .ft-kv a{ word-break:break-word; }
}

/* At the narrowest sizes nowrap on the copyright and the legal links is
   what pushes the bottom bar past the viewport. Let both wrap. */
@media (max-width:420px){
  .ft-bottom > span, .ft-legal a{ white-space:normal; }
  .ft-legal{ flex-direction:column; gap:0; }
}@media (max-width:380px){
  .stat-grid, .ft-grid{ grid-template-columns:1fr; }
  .wrap{ padding-left:16px; padding-right:16px; }}

/* Respect the OS "reduce motion" setting — required for accessibility and it
   also spares low-end devices the pinned-scroll and globe work. */
@media (prefers-reduced-motion:reduce){
  *, *::before, *::after{ animation-duration:.001ms !important; animation-iteration-count:1 !important; transition-duration:.001ms !important; scroll-behavior:auto !important; }
  .reveal{ opacity:1 !important; transform:none !important; }
}

/* Print: the site is a dark theme; make a printed page legible. */
@media print{
  nav.top, .nav-mark, #scroll-progress, #globe-canvas, .h-progress{ display:none !important; }
  body{ background:#fff !important; color:#111 !important; }
}

/* ── Mobile navigation ──────────────────────────────────────────── */
.nav-burger{ display:none; }
/* 980px, not 900: neo-styles.css collapses .nav-links at 980, and the burger must
   appear at the SAME point or 901–980px (iPad portrait, small laptops) has no nav
   control at all. 980 is the widest of the three collapse points in the project
   (neo-page.css 900, Services/Contact inline 820), so it is the safe single one. */
@media (max-width:980px){
  .nav-links{ display:none !important; }
  /* With .nav-links hidden, an auto margin on the burger absorbed ALL free space,
     so justify-content:space-between had nothing to distribute and the logo and
     .nav-right collapsed together at the left. The auto margin belongs here. */
  nav.top .nav-right{ margin-left:auto; }
  .nav-burger{
    display:flex; flex-direction:column; justify-content:center; gap:5px;
    width:44px; height:44px; padding:0 10px; margin-left:12px;
    background:transparent; border:0; cursor:pointer; z-index:120; position:relative;
    /* The bars are background:currentColor, and <button> does NOT inherit
       colour — the UA sheet sets `color:buttontext`, which iOS Safari paints
       as system blue. That is why the icon was blue on a phone and black in
       desktop Chrome. Setting colour explicitly pins it to the brand pink.
       -webkit-appearance:none also stops iOS applying its own button chrome. */
    -webkit-appearance:none; appearance:none;
    color:var(--nc-magenta,#F64477);
  }
  /* #F64477 on the near-white light surface is only ~3:1, so the light theme
     uses the darker brand ink the primary buttons already use. */
  body.theme-light .nav-burger{ color:var(--nc-magenta-ink,#8D2341); }
  .nav-burger span{
    display:block; height:2px; width:100%; border-radius:2px;
    background:currentColor; transition:transform .28s ease, opacity .2s ease;
  }
  .nav-burger.open span:nth-child(1){ transform:translateY(7px) rotate(45deg); }
  .nav-burger.open span:nth-child(2){ opacity:0; }
  .nav-burger.open span:nth-child(3){ transform:translateY(-7px) rotate(-45deg); }
}
.nav-drawer[hidden]{ display:none; }
.nav-drawer{
  position:fixed; inset:0; z-index:110;
  background:rgba(24,10,34,0.97);
  -webkit-backdrop-filter:blur(18px); backdrop-filter:blur(18px);
  display:flex; align-items:center; justify-content:center;
  opacity:0; transition:opacity .26s ease;
}
.nav-drawer.open{ opacity:1; }

/* Close control. Sits inside the drawer so it is never trapped underneath it
   (see the note in neo-nav.js), and clears the iOS status bar via safe-area. */
.nav-drawer-close{
  position:absolute; top:calc(env(safe-area-inset-top, 0px) + 14px); right:16px;
  width:44px; height:44px; display:flex; align-items:center; justify-content:center;
  background:transparent; border:0; cursor:pointer; padding:0;
  -webkit-appearance:none; appearance:none;
  color:var(--nc-magenta,#F64477);
}
.nav-drawer-close span{
  position:absolute; width:22px; height:2px; border-radius:2px;
  background:currentColor;
}
.nav-drawer-close span:nth-child(1){ transform:rotate(45deg); }
.nav-drawer-close span:nth-child(2){ transform:rotate(-45deg); }
body.theme-light .nav-drawer-close{ color:var(--nc-magenta-ink,#8D2341); }

/* The burger must NOT be lifted over the drawer. Raising nav.top's z-index
   while open put the burger's bars on top of the close button and they
   swallowed the tap. The in-drawer button is the sole close control, and the
   hidden nav is taken out of hit-testing entirely so nothing behind the
   drawer can intercept a press. */
html.nav-drawer-open nav.top{ pointer-events:none; }
.nav-drawer-links{
  display:flex; flex-direction:column; gap:4px;
  width:100%; max-width:420px; padding:32px 28px; text-align:left;
}
.nav-drawer-links a{
  display:flex; align-items:center; min-height:56px;
  font-family:'Poppins',sans-serif; font-size:24px; font-weight:500;
  letter-spacing:-0.02em; color:#fff; border-bottom:1px solid rgba(255,255,255,0.09);
  text-decoration:none;
}
.nav-drawer-links a:last-child{ border-bottom:0; }
.nav-drawer-links a.active{ color:var(--nc-magenta,#F64477); }
.nav-drawer-links a.nav-drawer-cta{
  margin-top:22px; justify-content:center; min-height:52px;
  font-size:15px; font-weight:600; border:0; border-radius:999px;
  background:#8D2341; color:#fff; letter-spacing:0;
}
html.nav-drawer-open, html.nav-drawer-open body{ overflow:hidden; }
body.theme-light .nav-drawer{ background:rgba(251,249,253,0.98); }
body.theme-light .nav-drawer-links a{ color:#28123A; border-bottom-color:rgba(40,18,58,0.10); }

/* ── Leadership: team grid ──────────────────────────────────────
   leadership.html carried style="grid-template-columns:repeat(4,1fr)"
   inline. An inline declaration outranks every stylesheet rule, so the
   `@media(max-width:900px){.team-grid{grid-template-columns:1fr}}` in
   neo-page.css could never take effect and the four members stayed on
   one row down to 320px. The inline style is now the .team-grid--4
   class below, which media queries can override normally. */
.team-grid--4{ grid-template-columns:repeat(4,1fr); }@media (max-width:1100px){ .team-grid--4{ grid-template-columns:repeat(2,1fr); }}@media (max-width:760px){
  .team-grid, .team-grid--4{ grid-template-columns:1fr; gap:20px; }
  .member{ padding:26px 22px; }}

/* become-partner.html: .ct carries 30px of side padding and the email inside
   it is a single unbreakable token. At 320px that left ~228px for a ~230px
   string, so the card pushed a horizontal scrollbar. Trimming the padding and
   allowing the address to break keeps it inside the viewport. */
@media (max-width:420px){
  .ct{ padding:22px 18px; }
  .ct a{ font-size:15px; word-break:break-word; }
}

/* ── Missing background imagery ──────────────────────────────────
   neo-main.js tags any .section-bg or story .bg whose photograph failed to
   load with .bg-unavailable. Without this the panel falls back to the dark
   band behind it and the whole section reads as broken — which is exactly
   what a blocked Unsplash request looked like. A brand wash plus a soft
   vignette keeps the headline legible and the section looking deliberate.
   The photography is still the intended treatment; this is the safety net. */
.bg-unavailable{
  background-image:
    radial-gradient(120% 90% at 18% 0%, rgba(246,68,119,0.30) 0%, rgba(246,68,119,0) 58%),
    radial-gradient(120% 90% at 88% 100%, rgba(155,95,196,0.34) 0%, rgba(155,95,196,0) 60%),
    linear-gradient(155deg, #2A1240 0%, #180A22 62%, #120717 100%) !important;
  background-size:cover !important;
  background-position:center !important;
}
/* The story chapters sit under a text mask that assumes a photograph; without
   one the wash alone is a little flat, so a faint grain lifts it. */
.story-chapter .bg.bg-unavailable::after{
  content:''; position:absolute; top:0; right:0; bottom:0; left:0; inset:0; pointer-events:none;
  background-image:radial-gradient(rgba(255,255,255,0.05) 1px, transparent 1px);
  background-size:3px 3px; opacity:.5;
}

/* ── Laptop / short-viewport density ─────────────────────────────
   Client: "each section feels zoomed in a bit — I need to scroll to see
   the rest of it, and it looks perfect when I zoom out."

   That is exactly what it is. The bands were spaced for a 1080p screen
   (180px of padding top and bottom, 112-140px on the rest). On the
   1896x846 laptop the feedback screenshots were taken on, every
   self-contained band overflows: hero 1.17x the screen, discipline
   1.36x, impact 1.48x, news 1.36x, why-neo 1.92x. Zooming out shrinks
   the CSS pixel, which is why it "looks perfect" — so the fix is to do
   the same thing deliberately at short viewport heights rather than
   make the user do it.

   Keyed on height, not width, so a 1080p desktop is untouched. Only
   vertical rhythm and heading scale change; nothing reflows, so the
   layout the client approved stays intact. */
@media (min-width:981px) and (max-height:900px){
  section{ padding:88px 0; }
  #why-neo, #leadership, #news, #impact, #testimonials, #discipline{ padding:76px 0; }
  #story{ padding:0; }

  h1.hero-h{ font-size:clamp(44px, 4.6vw, 66px); line-height:1.04; }
  h2.section-h2{ font-size:clamp(32px, 2.9vw, 44px); line-height:1.08; margin-bottom:18px; }
  .section-head{ margin-bottom:38px; }
  .lead, .fs-lead{ font-size:16.5px; line-height:1.55; }

  /* Grid gutters are the other half of the height: trimming them buys
     back ~40px per band without touching column counts. */
  .why-cards, .stat-grid, .news-grid, .phase-grid, .step-grid, .impact-grid{ gap:18px; }
  .why-card, .phase, .step-card-v2{ padding:22px 20px; }

  /* The hero sets min-height:100vh and then adds 240px of padding on
     top, so it can never fit. Padding comes down and the copy scales
     with it. */
  .hero{ padding:104px 0 56px; }
  .hero-h{ margin-bottom:18px; }
  .hero-sub, .hero-lead{ font-size:16.5px; line-height:1.5; }

  /* Measured at 286px on why-neo and impact — the single biggest
     contributor after the card grids. */
  .section-head{ margin-bottom:34px; }
  .section-head .lead, .section-head p{ font-size:16px; line-height:1.5; margin-top:12px; }
  .why-card h3{ font-size:17px; margin-bottom:8px; }
  .why-card p{ font-size:13.5px; line-height:1.5; }
  .why-card .lbl{ margin-bottom:8px; }
}

/* Even shorter — 13" laptops at 768px and anything in landscape. */
@media (min-width:981px) and (max-height:780px){
  section{ padding:64px 0; }
  #why-neo, #leadership, #news, #impact, #testimonials, #discipline{ padding:56px 0; }
  h2.section-h2{ font-size:clamp(28px, 2.5vw, 36px); }
  .section-head{ margin-bottom:28px; }
  .why-cards, .stat-grid, .news-grid, .phase-grid, .step-grid{ gap:16px; }
}

/* ── Nav logo ────────────────────────────────────────────────────
   Client: "logo top left is too small — needs to look bolder."
   Three stylesheets set this to 26px or 30px; rather than chase all
   three, the size is settled here in the layer that loads last.
   38px is about as large as the 68px nav bar allows while keeping the
   optical padding above and below the mark even. */
.neo-logo img{ height:38px; }@media (max-width:600px){ .neo-logo img{ height:32px; }}

/* ── Services → story transition ─────────────────────────────────
   Client: "there is large spacing between the services card and the
   cinematography section." Measured at 670px on a 1896x846 laptop —
   0.79x the screen of nothing. It came from three stacked sources:
   a 30vh release spacer, 160px of section padding and the last card's
   own margin.

   The spacer itself is not decorative: the sticky stack needs a run-out
   so the final card can hold its pin before releasing. It just needed
   far less of one. 12vh is enough to finish the pin cleanly, and the
   scroll cue now occupies what remains so the space reads as a
   deliberate beat between sections rather than a gap. */
#services-alt{ padding-bottom:80px; }
.fs-stack{ margin-bottom:0; }
/* The last card keeps the SAME trailing margin as the others. Zeroing it
   (an earlier attempt at closing the gap) desynchronised the release: with
   a shorter margin box the last card stayed stuck ~142px longer than cards
   1-6, so it hung behind while the rest of the deck scrolled away. The gap
   is closed with the run-out and section padding instead. */

/* Mouse variant of the hero's .scroll-cue — same type treatment, centred
   and stacked instead of pinned bottom-left. */
.scroll-cue--mouse{
  position:static; margin:0 auto;
  flex-direction:column; gap:14px;
  width:fit-content; text-decoration:none;
  padding:8px 16px 4px;
  /* Explicit, not inherited. The hero cue is white because it sits on the
     dark globe artwork; this one sits on a light surface, and inheriting
     that white is what made the label invisible. */
  /* Full opacity: at 10px uppercase this label needs 4.5:1, and knocking
     it back to .85 was costing about a third of the ratio. The mouse
     outline carries the softening instead. */
  color:var(--nc-ink, #1A0E24);
  opacity:1;
  transition:opacity .25s ease, transform .25s ease;
}
body.theme-light .scroll-cue--mouse{ color:#3A1E4D; }
body:not(.theme-light) .scroll-cue--mouse{ color:rgba(255,255,255,0.72); }
.scroll-cue--mouse:hover{ opacity:1; transform:translateY(2px); }
.scroll-cue--mouse .mouse{
  width:24px; height:38px; border-radius:13px;
  border:1.5px solid currentColor; opacity:.55;
  display:flex; justify-content:center; padding-top:7px;
}
.scroll-cue--mouse .wheel{
  width:3px; height:7px; border-radius:2px;
  background:currentColor;
  animation:scrollwheel 1.9s cubic-bezier(.45,0,.25,1) infinite;
}@keyframes scrollwheel{
  0%      { transform:translateY(0);   opacity:0; }
  18%     { opacity:1; }
  62%     { transform:translateY(10px); opacity:0; }
  100%    { transform:translateY(10px); opacity:0; }}@media (prefers-reduced-motion: reduce){
  .scroll-cue--mouse .wheel{ animation:none; opacity:.9; }}@media (max-width:980px){
  #services-alt{ padding-bottom:64px; }
  }

/* No WebGL (old browser, no GPU, blocked context): the globe script bails and
   tags its container, so the hero collapses cleanly instead of holding a gap. */
#globe-canvas.globe-unsupported{ display:none; }@media (max-width:980px){ #globe-canvas{ height:340px; }}@media (max-width:600px){ #globe-canvas{ height:260px; }}
/* ── WordPress core classes ──────────────────────────────────────
   The static build had no need for these; WordPress emits them and
   expects the theme to style them. screen-reader-text in particular
   must hide visually WITHOUT display:none, or screen readers skip it. */
.screen-reader-text{
  border:0; clip:rect(1px,1px,1px,1px); clip-path:inset(50%);
  height:1px; width:1px; margin:-1px; overflow:hidden; padding:0;
  position:absolute !important; word-wrap:normal !important;
}
.screen-reader-text:focus{
  background:#fff; border-radius:4px;
  box-shadow:0 0 2px 2px rgba(0,0,0,.6);
  clip:auto !important; clip-path:none;
  color:#8D2341; display:block; font-size:14px; font-weight:700;
  height:auto; left:8px; line-height:normal; padding:14px 22px;
  text-decoration:none; top:8px; width:auto; z-index:100000;
}
.skip-link:focus{ outline:2px solid #F64477; outline-offset:2px; }
.alignwide{ max-width:1240px; margin-inline:auto; }
.alignfull{ width:100vw; max-width:100vw; margin-left:calc(50% - 50vw); }
.aligncenter{ display:block; margin-inline:auto; }
.wp-caption-text, .wp-block-image figcaption{ font-size:13.5px; opacity:.75; margin-top:8px; }
.sticky, .bypostauthor{ }

/* ── Story section intro ─────────────────────────────────────────
   The section used to open straight into chapter one, so a reader
   arriving mid-scroll had no idea what they were in. This header sits
   OUTSIDE .story-pin on purpose — anything inside the pinned wrapper
   gets captured by the ScrollTrigger pin and would be dragged through
   the chapter cross-fade instead of reading as a section header. */
.story-intro{
  position:relative; z-index:2;
  background:#120716;
  padding:120px 0 84px;
  text-align:center;
}
body.theme-light .story-intro{ background:#120716; }
.story-intro .story-kicker{
  display:inline-block; margin-bottom:20px;
  color:var(--nc-magenta,#F64477);
}
.story-intro .story-title{
  color:#fff; margin:0 auto;
  max-width:16ch;
  font-size:clamp(34px,5vw,68px); line-height:1.04; letter-spacing:-0.03em;
}
.story-intro .story-intro-lead{
  color:rgba(255,255,255,0.68);
  max-width:56ch; margin:22px auto 0;
  font-size:17px; line-height:1.6;
}
@media (max-width:980px){
  .story-intro{ padding:76px 0 56px; }
  .story-intro .story-title{ max-width:20ch; }
  .story-intro .story-intro-lead{ font-size:15.5px; }
}
@media (min-width:981px) and (max-height:900px){
  .story-intro{ padding:72px 0 52px; }
}

/* ── WordPress layout corrections ────────────────────────────────
   The static build had the nav sitting directly on the hero. In
   WordPress everything is wrapped in <main>, and the admin bar adds
   32px at the top on logged-in views, so the hero copy collided with
   the nav. These give it back its clearance. */
.site-main{ display:block; }
.hero{ padding-top:clamp(140px, 16vh, 200px); }
body.admin-bar nav.top{ top:32px; }
@media screen and (max-width:782px){
  body.admin-bar nav.top{ top:46px; }
}
@media (max-width:980px){
  .hero{ padding-top:clamp(112px, 14vh, 150px); }
}

/* The story title reads as two lines; 16ch was tight enough to break it
   in an awkward place. */
.story-intro .story-title{ max-width:22ch; }
@media (max-width:980px){ .story-intro .story-title{ max-width:18ch; } }

/* A testimonial band with no active slide is invisible; belt-and-braces
   in case the rotator script has not run yet. */
.review-track .review-slide:first-child{ opacity:1; }

/* ── Service stack: recede scrim ─────────────────────────────────
   The buried card used to be faded to opacity:.5. Cards overlap, so a
   translucent card let the one behind show through its own text - that
   is the "can't read the card when they overlap" problem. The card stays
   opaque; this overlay darkens on top of it instead. --recede is driven
   by GSAP in neo-main.js. */
.fs-inner{ position:relative; --recede:0; }
.fs-inner::after{
  content:''; position:absolute; top:0; right:0; bottom:0; left:0; inset:0;
  background:#0B0410; border-radius:inherit;
  opacity:var(--recede); pointer-events:none; z-index:3;
}
body.theme-light .fs-inner::after{ background:#2A1240; }

/* ── Mobile: slow the stack down and lighten the compositing ─────
   Two separate complaints, one section.

   "Scrolls too fast": each card's scrub window is its own trailing
   margin, and 13vh on a phone is a very short throw - the whole stack
   passed in a flick. 26vh roughly doubles the scroll distance per card.

   "Laggy": seven simultaneously promoted layers plus large soft shadows
   plus backdrop blur is more than a mid-range phone can composite at
   60fps. will-change is dropped (the transform still promotes while
   animating, just not permanently), the shadow is cheaper, and blur is
   removed on small screens. */
@media (max-width:980px){
  .fs-card{ margin-bottom:26vh; }
  .fs-inner{
    will-change:auto;
    box-shadow:0 12px 30px -18px rgba(0,0,0,.55);
  }
  .fs-media img{ transition:none; }
  *{ backdrop-filter:none !important; -webkit-backdrop-filter:none !important; }
}
@media (max-width:980px) and (max-height:740px){
  .fs-card{ margin-bottom:20vh; }
}

/* ── Reveal safety net ───────────────────────────────────────────
   .reveal is opacity:0 until its scroll animation runs. If the GSAP
   CDN is slow or blocked, that leaves an entire page invisible - which
   is exactly what a missing reveal script looked like. This shows the
   content after a short delay unless JS has taken control by adding
   .reveal-ready to <html>. Content visible without JS beats content
   perfectly animated but blank. */
@media (prefers-reduced-motion: no-preference){
  html:not(.reveal-ready) .reveal{ animation:neo-reveal-fallback 0s linear 2.5s forwards; }
}
@keyframes neo-reveal-fallback{ to{ opacity:1; transform:none; } }
html.no-js .reveal{ opacity:1 !important; transform:none !important; }

/* ── Form result banner ──────────────────────────────────────────
   Shown after a submission redirect. Not decorative: the contact
   form previously faked success by rewriting its own button label,
   so a real, distinguishable success/failure state matters. */
.neo-form-notice{
  margin:0 0 20px; padding:14px 16px; border-radius:10px;
  font-size:15px; line-height:1.5; border:1px solid transparent;
}
.neo-form-notice--ok{
  background:rgba(78,216,160,.10); border-color:rgba(78,216,160,.45); color:#8FF0C4;
}
.neo-form-notice--err{
  background:rgba(246,68,119,.10); border-color:rgba(246,68,119,.45); color:#FFA8C0;
}
body.theme-light .neo-form-notice--ok{ background:#EAF7F0; border-color:#4ED8A0; color:#0F5132; }
body.theme-light .neo-form-notice--err{ background:#FDEEF3; border-color:#F64477; color:#8D2341; }
.neo-form-notice:focus{ outline:2px solid var(--nc-magenta,#F64477); outline-offset:2px; }

/* ── Theme switch ────────────────────────────────────────────────
   The static build styled this as an <a>; it is a <button> now so it
   can actually toggle. Buttons carry UA styles an anchor does not, so
   these are reset explicitly — otherwise it renders with a border and
   the system button colour (blue on iOS, the same bug the burger had). */
button.theme-switch{
  -webkit-appearance:none; appearance:none;
  background:transparent; border:0; padding:0; margin:0;
  font:inherit; color:inherit; cursor:pointer;
  display:inline-flex; align-items:center; justify-content:center;
}
button.theme-switch:focus-visible{
  outline:2px solid var(--nc-magenta,#F64477); outline-offset:3px; border-radius:8px;
}

/* ── Services → story handoff ────────────────────────────────────
   The run-out was zeroed earlier while closing an over-large gap, and
   that went too far: a sticky card needs somewhere to release before
   the next section arrives. With none, the last card stayed pinned
   over the story — which reads as the services section repeating, and
   is why the scroll fought back on mobile.

   14vh is enough to finish the pin cleanly and small enough that the
   gap never reappears. */
@media (max-width:980px){ }
@media (max-width:980px) and (max-height:740px){ }

/* The story must not begin pinning until the deck has gone. Its own
   top padding provides that clearance. */
#story{ padding-top:0; }
.story-intro{ padding-top:clamp(72px, 9vh, 110px); }

/* ── One spacing scale ───────────────────────────────────────────
   Section padding ran from 60px to 180px with no system, which is what
   makes the page feel loose in places and cramped in others. One scale,
   applied to the band wrappers only — inner components keep their own
   rhythm. */
:root{
  --neo-band: clamp(64px, 7vw, 104px);
  --neo-band-tight: clamp(48px, 5vw, 72px);
}
body > section,
body > header:not(.hero){ padding-top:var(--neo-band); padding-bottom:var(--neo-band); }

/* Bands that manage their own vertical rhythm are left alone: the
   services stack and the story are scroll-driven and their spacing is
   load-bearing, not decorative. */
body > #services-alt{ padding-top:var(--neo-band); padding-bottom:var(--neo-band-tight); }
body > #story{ padding-top:0; padding-bottom:0; }
.hero{ padding-bottom:var(--neo-band-tight); }

/* Section heads sat on a different scale again. */
.section-head{ margin-bottom:clamp(28px, 3.5vw, 52px); }

@media (min-width:981px) and (max-height:900px){
  :root{ --neo-band:clamp(56px, 6vw, 80px); --neo-band-tight:clamp(40px, 4vw, 60px); }
}
@media (max-width:780px){
  :root{ --neo-band:56px; --neo-band-tight:40px; }
}

/* ID-level specificity. The band rule above uses `body > section`
   (0,0,2) which loses to the `#why-neo { padding:140px 0 }` style rules
   in neo-styles.css (1,0,0). Same values, stated in a way that wins. */
body > #services-alt,
body > #discipline,
body > #why-neo,
body > #impact,
body > #testimonials,
body > #news,
body > #payout-finder,
body > #leadership{
  padding-top:var(--neo-band);
  padding-bottom:var(--neo-band);
}
body > #services-alt{ padding-bottom:var(--neo-band-tight); }
body > #story{ padding-top:0; padding-bottom:0; }

/* ── Pickup locator ──────────────────────────────────────────────
   Built on the theme's existing tokens so it inherits both themes
   without a second palette to maintain. */
.pl-panel{
  background:var(--surface,#fff); border:1px solid var(--line,#E5DBF0);
  border-radius:18px; padding:clamp(18px,2.4vw,28px); margin-bottom:28px;
}
.pl-controls{ display:grid; gap:14px; grid-template-columns:1fr 1fr 2fr auto; align-items:end; }
.pl-field{ display:grid; gap:6px; min-width:0; }
.pl-field > span{
  font-size:12px; letter-spacing:.14em; text-transform:uppercase;
  color:var(--ink-soft,#5C4A70); font-weight:600;
}
.pl-field select, .pl-field input{
  width:100%; padding:12px 14px; border-radius:10px; font:inherit;
  border:1px solid var(--line,#E5DBF0); background:var(--surface-2,#F7F3FB);
  color:var(--ink,#1B0D26); min-height:46px;
}
.pl-field select:focus, .pl-field input:focus{
  outline:2px solid var(--nc-magenta,#F64477); outline-offset:1px; border-color:transparent;
}
.pl-status{ margin:14px 0 0; font-size:14px; color:var(--ink-soft,#5C4A70); min-height:1.4em; }

.pl-results{ display:grid; gap:14px; grid-template-columns:repeat(auto-fill,minmax(280px,1fr)); }
.pl-card{
  background:var(--surface,#fff); border:1px solid var(--line,#E5DBF0);
  border-radius:14px; padding:18px 18px 16px; position:relative;
}
/* A colour band per type reads faster than a text label in a long list. */
.pl-card::before{
  content:""; position:absolute; left:0; top:14px; bottom:14px; width:3px;
  border-radius:0 3px 3px 0; background:var(--nc-magenta,#F64477); opacity:.65;
}
.pl-card.is-bank::before        { background:#652D86; }
.pl-card.is-agent::before       { background:#F64477; }
.pl-card.is-cooperative::before { background:#FF9E6B; }
.pl-card.is-microfinance::before{ background:#9B5FC4; }
.pl-card h3{ font-size:16.5px; line-height:1.3; margin:0 0 6px; }
.pl-addr{ margin:0 0 6px; font-size:14px; line-height:1.5; color:var(--ink-soft,#5C4A70); }
.pl-meta{ margin:0; font-size:12.5px; letter-spacing:.02em; color:var(--lead,#8A79A0); }
.pl-phone{ margin:8px 0 0; font-size:14px; }
.pl-phone a{ color:var(--nc-magenta-ink,#8D2341); text-decoration:none; font-weight:500; }
.pl-more{ display:flex; justify-content:center; margin-top:26px; }

@media (max-width:860px){
  .pl-controls{ grid-template-columns:1fr 1fr; }
  .pl-field--grow{ grid-column:1 / -1; }
  .pl-controls > .btn{ grid-column:1 / -1; justify-content:center; }
}

/* ── Close the dead screen between services and story ────────────
   Measured on a 390×844 phone: 432px of empty background sat between
   the last card and the story — half a screen of nothing, which reads
   as the page having broken.

   It was three things stacked: the last card's own 26vh margin, the
   stack run-out, and the story's leading space.

   The last card's margin is safe to shorten. Release sync works by
   each card using the NEXT card as its ScrollTrigger; the last card
   has no next, so its margin affects only the gap, not the timing.
   That is why this can be trimmed when the others could not. */
@media (max-width:980px){
  }
@media (max-width:980px) and (max-height:740px){
  }
/* The story supplies its own entry spacing; it does not need the band
   padding on top of the run-out as well. */
body > #story{ padding-top:0; }

/* ── iOS: vh is the LARGE viewport ───────────────────────────────
   On iOS Safari, 1vh is a hundredth of the viewport WITHOUT the URL
   bar. With the bar visible the usable height is ~15% smaller, so a
   gap specified in vh renders noticeably taller than intended — which
   is why a gap measured at 27% of the screen in a headless browser
   shows up nearer 45% on an actual phone.

   svh is the SMALL viewport height: the usable area with the browser
   chrome showing. Using it makes the gap the size it was designed to
   be. The vh rules above stay as the fallback for browsers without
   svh support, so nothing regresses. */
@supports (height: 1svh) {
  .fs-card{ margin-bottom:22svh; }
  @media (max-width:980px){
    .fs-card{ margin-bottom:20svh; }
    }
  @media (max-width:980px) and (max-height:740px){
    }
}

/* ── Story: never blank ──────────────────────────────────────────
   .story-chapter starts at opacity:0 and is revealed by the pinned
   ScrollTrigger in neo-main.js. If that setup throws — a bad image
   URL from the Customizer was enough to do it — every chapter stays
   invisible and the section renders as a flat coloured block.

   The first chapter is shown by default and the script takes over
   from there. A visible story that has not animated beats an
   invisible one that would have. */
.story-pin .story-chapter:first-of-type{ opacity:1; }
html.story-ready .story-pin .story-chapter:first-of-type{ opacity:0; }

/* If a background image fails, keep the chapter readable rather than
   letting light text sit on whatever is behind it. */
.story-chapter .bg.bg-unavailable{
  background:linear-gradient(160deg,#241033,#0B0410) !important;
}

/* ── Transaction tracker result ──────────────────────────────────
   Rebuilt as a status panel rather than a line of text.

   Colours are declared locally rather than borrowed from the page
   theme. The previous version used var(--ink, #1B0D26) and similar —
   correct where those variables exist, but near-black text on a dark
   card anywhere they do not, which is why the status was invisible.
   A result someone is waiting on should not depend on which
   stylesheet happens to be in scope. */
.trk-result{
  --trk-bg:#150A1E; --trk-line:rgba(251,247,254,.14);
  --trk-text:#FBF7FE; --trk-dim:rgba(251,247,254,.62);
  --trk-accent:#9B5FC4;
  margin-top:24px; padding:clamp(20px,3vw,30px);
  border-radius:16px; border:1px solid var(--trk-line);
  background:var(--trk-bg); color:var(--trk-text);
  outline:none;
}
body.theme-light .trk-result{
  --trk-bg:#FFFFFF; --trk-line:#E5DBF0;
  --trk-text:#1B0D26; --trk-dim:#5C4A70;
}
.trk-result:focus-visible{ box-shadow:0 0 0 3px rgba(246,68,119,.35); }

/* State accents ---------------------------------------------------- */
.trk-paid      { --trk-accent:#22B07D; }
.trk-pending   { --trk-accent:#FF9E6B; }
.trk-cancelled { --trk-accent:#F64477; }
.trk-hold      { --trk-accent:#E0B341; }
.trk-error     { --trk-accent:#F64477; }
.trk-loading   { --trk-accent:#9B5FC4; }

/* Header ----------------------------------------------------------- */
.trk-top{ display:flex; align-items:center; gap:14px; flex-wrap:wrap; }
.trk-badge{
  display:inline-flex; align-items:center; gap:9px;
  padding:7px 15px 7px 12px; border-radius:999px;
  background:color-mix(in srgb, var(--trk-accent) 16%, transparent);
  border:1px solid color-mix(in srgb, var(--trk-accent) 55%, transparent);
  color:var(--trk-text);
  font-weight:600; font-size:15px; letter-spacing:.01em;
}
@supports not (background: color-mix(in srgb, red 50%, blue)){
  /* Older Safari: a solid tint rather than no tint at all. */
  .trk-badge{ background:rgba(155,95,196,.16); border-color:rgba(155,95,196,.5); }
}
.trk-badge::before{
  content:""; width:9px; height:9px; border-radius:50%;
  background:var(--trk-accent); box-shadow:0 0 10px 2px var(--trk-accent);
}
.trk-ref{
  font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
  font-size:13px; letter-spacing:.06em; color:var(--trk-dim);
  word-break:break-all;
}
.trk-note{
  margin:14px 0 0; color:var(--trk-dim); line-height:1.6; font-size:15px;
  max-width:60ch;
}

/* Progress --------------------------------------------------------- */
.trk-steps{
  list-style:none; margin:24px 0 0; padding:0;
  display:grid; grid-template-columns:repeat(4,1fr); gap:0;
}
.trk-steps li{
  position:relative; padding-top:26px; text-align:center;
  font-size:12.5px; line-height:1.35; color:var(--trk-dim);
}
/* The connecting rail sits behind the markers. */
.trk-steps li::before{
  content:""; position:absolute; top:8px; left:0; right:0; height:2px;
  background:var(--trk-line);
}
.trk-steps li:first-child::before{ left:50%; }
.trk-steps li:last-child::before{ right:50%; }
.trk-steps li.is-done::before,
.trk-steps li.is-now::before{ background:var(--trk-accent); }
.trk-steps li.is-now:last-child::before{ right:50%; }
.trk-mark{
  position:absolute; top:2px; left:50%; transform:translateX(-50%);
  width:14px; height:14px; border-radius:50%;
  background:var(--trk-bg); border:2px solid var(--trk-line);
}
.trk-steps li.is-done .trk-mark{ background:var(--trk-accent); border-color:var(--trk-accent); }
.trk-steps li.is-now  .trk-mark{
  background:var(--trk-accent); border-color:var(--trk-accent);
  box-shadow:0 0 0 4px color-mix(in srgb, var(--trk-accent) 25%, transparent);
}
.trk-steps li.is-now .trk-step-label{ color:var(--trk-text); font-weight:600; }

/* Details ---------------------------------------------------------- */
.trk-rows{
  margin:26px 0 0; padding-top:20px; border-top:1px solid var(--trk-line);
  display:grid; gap:12px;
}
.trk-row{ display:grid; grid-template-columns:150px minmax(0,1fr); gap:14px; font-size:14.5px; }
.trk-row dt{ margin:0; color:var(--trk-dim); }
.trk-row dd{ margin:0; color:var(--trk-text); font-weight:500; word-break:break-word; }
.trk-row dd.is-mono{
  font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
  font-variant-numeric:tabular-nums; letter-spacing:.04em;
}

@media (max-width:620px){
  .trk-steps{ grid-template-columns:repeat(2,1fr); row-gap:20px; }
  .trk-steps li:nth-child(2)::before{ right:50%; }
  .trk-steps li:nth-child(3)::before{ left:50%; }
  .trk-row{ grid-template-columns:1fr; gap:2px; }
  .trk-row dt{ font-size:12.5px; letter-spacing:.06em; text-transform:uppercase; }
}

/* ── Service cards: density pass ─────────────────────────────────
   Measured: 43–55% of every card body was empty. The cards were held
   at 513px while the copy needed 229–293px, so the shortest card was
   more than half air.

   Three changes, in order of effect:

   1. Lower the floor. The clamp held every card at 384–448px before
      the equaliser even ran. Content should set the height; the floor
      only stops a one-line card collapsing.
   2. Give the copy more of the card. A 50/50 split gave the
      illustration as much room as seven lines of text. 42/58 is
      closer to how the two actually earn their space.
   3. Tighten the internal rhythm. The gaps were sized for a much
      taller card.

   The equaliser still runs, so all cards share one height and the
   sticky deck releases together — that height is now set by the
   tallest CONTENT rather than by an arbitrary clamp. */
.fs-inner{
  min-height:clamp(300px, 34vh, 360px);
  grid-template-columns:42% 58%;
}
.fs-inner.flip{ grid-template-columns:58% 42%; }

.fs-body{
  padding:clamp(24px, 2.4vw, 36px);
  gap:0;
  align-content:center;
}
.fs-body h3{ margin:10px 0 12px; line-height:1.12; }
.fs-body p{ margin:0 0 18px; line-height:1.55; }
.fs-icn{ margin-bottom:14px; }
.fs-num{ margin-bottom:6px; }
.fs-stat{ margin-top:auto; padding-top:4px; }

@media (max-width:980px){
  .fs-inner,
  .fs-inner.flip{
    grid-template-columns:1fr;
    min-height:0;
  }
  .fs-body{ padding:22px 20px 24px; }
  .fs-body p{ margin-bottom:14px; }
}

/* ── Service card media: trimmed artwork ─────────────────────────
   The illustrations carried 14–43% baked-in whitespace, so the panel
   padding was stacking on top of margin already inside the file. The
   PNGs are now cropped to their content, which means the panel needs
   far less padding of its own — and the artwork reads noticeably
   larger without the card growing at all. */
.fs-media{ padding:clamp(10px, 1.2vw, 18px); }
.fs-media img{ width:100%; height:100%; object-fit:contain; }
@media (max-width:980px){
  .fs-media{ padding:8px; }
}

/* ── Globe: remove the letterbox ─────────────────────────────────
   The canvas was a fixed 640px tall in a column roughly 560px wide.
   The globe fits to the tighter axis, so it filled the width and left
   about 114px of empty canvas above and below.

   IMPORTANT: #globe-canvas IS the <canvas>, not a wrapper. A replaced
   element does not resolve `height:auto` + `aspect-ratio` the way a div
   does — three.js then reads a height of zero and draws nothing, which
   is exactly what happened. So this uses an explicit height tied to the
   viewport width instead, which tracks the column without ever being
   auto. */
#globe-canvas{
  height:min(46vw, 600px);
  max-height:74vh;
}
@media (max-width:980px){
  #globe-canvas{ height:min(78vw, 420px); max-height:52vh; }
}

/* ── Icons ───────────────────────────────────────────────────────
   Colour follows the SURFACE, not the page theme.

   Tying it to body.theme-light put the deep magenta (#8D2341) onto the
   sections that stay dark in light mode — measured 1.08:1 on a service
   card chip and 1.98:1 on the why-neo band. Invisible, not merely dim.

   So: a light default for light surfaces, and every dark band restates
   it. Both values are Customizer-controlled. */
:root{
  --icon-dark-surface:  var(--neo-icon-dark,  #FF9E6B);  /* on dark  */
  --icon-light-surface: var(--neo-icon-light, #8D2341);  /* on light */
  --icon-size: var(--neo-icon-size, 20px);
  --icon: var(--icon-dark-surface);
}
body.theme-light{ --icon: var(--icon-light-surface); }

/* Sections that are dark regardless of theme put the colour back. */
.whyp, .orbit, #story, .site-footer, .svc, #services-alt,
.deck-sec, .fs-card, .fs-inner{ --icon: var(--icon-dark-surface); }
/* …and any chip with a dark fill of its own. */
.fs-icn, .wcp-ic, .wc-icon, .sv-ico{ --icon: var(--icon-dark-surface); }
/* Light chips on light pages take the deep shade back. */
body.theme-light .step-icn, body.theme-light .tl-icn{ --icon: var(--icon-light-surface); }

svg use{ color: inherit; }
[class*="-ic"] svg use, [class*="-icn"] svg use,
.wc-icon svg use, .wcp-ic svg use, .fs-icn svg use,
.sv-ico svg use, .step-icn svg use{ width:100%; height:100%; }

[class*="-ic"] svg, [class*="-icn"] svg, [class*="ic-"] > svg,
.wc-icon svg, .wcp-ic svg, .fs-icn svg, .sv-ico svg, .step-icn svg{
  color: var(--icon);
  stroke: currentColor;
  stroke-width: var(--neo-icon-stroke, 1.5);
  fill: none;
  overflow: visible;
  width: var(--icon-size);
  height: var(--icon-size);
}
/* Arrows in buttons follow the button's own text colour — they are
   punctuation, not iconography.
   NEVER 'auto' here: an inline SVG with no intrinsic width falls back to
   the CSS default of 300x150px, which blew every button up to the width of
   the viewport. An explicit size is required. */
.btn svg, .btn-arrow svg{
  color: currentColor;
  width: 1em;
  height: 1em;
  flex: none;
}

/* ── Service cards: light surface ────────────────────────────────
   The cards were a hard-coded purple ladder (#251038 → #3a1a50) that
   deepened per card. Replaced with one Customizer-controlled surface.

   The important part is that TEXT MUST FLIP WITH IT. The card copy was
   set in off-white against those dark purples; left alone on a light
   card it would be invisible. Every text colour inside the card is
   restated here against the new surface. */
.fs-inner,
.fs-card:nth-child(2) .fs-inner,
.fs-card:nth-child(3) .fs-inner,
.fs-card:nth-child(4) .fs-inner,
.fs-card:nth-child(5) .fs-inner,
.fs-card:nth-child(6) .fs-inner,
.fs-card:nth-child(7) .fs-inner{
  background: var(--neo-card-bg, #F7F3FB);
  border-color: var(--neo-card-border, rgba(27,13,38,.12));
  box-shadow: 0 30px 80px -34px rgba(27,13,38,.42);
}

.fs-body h3{ color: var(--neo-card-heading, #1B0D26); }
.fs-body p{ color: var(--neo-card-text, #5C4A70); }
.fs-num,
.fs-body .lbl,
.fs-stat .l{ color: var(--neo-card-muted, #8A79A0); }
.fs-stat .n,
.fs-stat b{ color: var(--neo-card-heading, #1B0D26); }
.fs-stat{ border-top-color: var(--neo-card-border, rgba(27,13,38,.12)); }

/* The icon chip sits on the card, so it follows the card, not the page. */
.fs-icn{ background: var(--neo-card-chip, rgba(101,45,134,.10)); }
.fs-icn svg{ color: var(--neo-card-icon, #652D86); }

/* The media panel keeps a faint tint of the card rather than a white hole. */
.fs-media{ background: var(--neo-card-media, #EFE8F7); }
.fs-media--illus{ background: var(--neo-card-media, #EFE8F7); }

/* The recede scrim darkens cards as they stack. On a light card a black
   scrim reads as dirt, so it takes the card's own shade instead. */
.fs-inner::after{ background: var(--neo-card-scrim, #1B0D26); }

/* Applies on every device — the ladder had no breakpoint of its own, and
   neither does this. */

/* ── Stacked cards: light recede, exact landing ──────────────────

   1. The recede scrim was #0B0410 (and #2A1240 in the light theme), so a
      card being covered went dark rather than simply stepping back. On a
      light deck that reads as the card breaking. It now uses the card's
      own surface, so receding means fading toward the deck colour instead
      of toward black. */
.fs-inner::after,
body.theme-light .fs-inner::after{
  background: var(--neo-card-scrim, #F7F3FB);
}

/*  2. Every card landed 13px lower than the one before —
      top: calc(104px + var(--i) * 13px) — so the last of seven sat 78px
      below the first. With a light deck the offset reads as misalignment
      rather than depth, so all cards now land on exactly the same line. */
.fs-card{ top: var(--neo-stack-top, 104px); }
@media (max-width:980px){ .fs-card{ top: var(--neo-stack-top-md, 78px); } }
@media (max-width:560px){ .fs-card{ top: var(--neo-stack-top-sm, 38px); } }

/* ── Last card: same sticky range as the rest ────────────────────
   It carried a shorter margin-bottom than the others (72px against 198px),
   left over from closing the gap between services and the story. A sticky
   element only stays pinned while its own box is inside the scroll range,
   so the short margin made the last card unpin early — it scrolled up off
   the line and exposed the card behind it.

   Equal margins mean every card unpins at the same moment, and the deck
   leaves together. The run-out that closes the gap to the next section is
   .fs-stack-end's job, not the card's. */
.fs-card:nth-last-of-type(1){ margin-bottom: inherit; }
.fs-stack > .fs-card{ margin-bottom: var(--neo-card-gap, 26vh); }
@supports (height: 1svh){
  .fs-stack > .fs-card{ margin-bottom: var(--neo-card-gap-svh, 22svh); }
}
@media (max-width:980px){
  .fs-stack > .fs-card{ margin-bottom: 20svh; }
}

/* ── Stack run-out ───────────────────────────────────────────────
   The last card needs the SAME distance of travel as every other card
   before the stack container ends, or it is still arriving at the line
   when the deck unpins — which leaves it sitting below the card behind
   it, exposing that card's heading.

   .fs-stack-end was 63px against a 198px card gap, so the last card ran
   out of runway. Matching the gap gives it the full journey. */
.fs-stack-end{ height: var(--neo-card-gap, 26vh); }
@supports (height: 1svh){
  .fs-stack-end{ height: var(--neo-card-gap-svh, 22svh); }
}
@media (max-width:980px){ .fs-stack-end{ height: 20svh; } }

/* CAPTCHA widget — sits in the form flow rather than floating. */
.neo-captcha{ margin:14px 0 4px; min-height:0; }
.neo-captcha:empty{ margin:0; }
#neo-track-captcha{ margin-top:12px; }
