/* Revneura theme skin.
 *
 * Authored against the "Datum" design specification in _design/DESIGN-SPEC.md.
 * Inlined by functions.php, so it must stay small: see the performance budget.
 *
 * Structure:
 *   1. Tokens and surface scopes  (from spec 3.9, verbatim)
 *   2. Fonts
 *   3. Base elements
 *   4. Layout primitives
 *   5. Components
 *   6. Motion  (gated on html.js so a script failure never blanks a page)
 */

/* =============================================================================
   Revneura — "Datum"
   Tokens. Brand primitives are locked; semantic tokens are rebound per
   surface scope, so every component is authored once and works on light and
   dark grounds with no override rules.
   Logical properties throughout — this stylesheet is RTL-safe by construction.
   ========================================================================== */
:root{
  /* ---- Brand primitives. LOCKED. Nothing below may redefine these. ------ */
  --rv-navy:#242C5C;   --rv-card:#2D3566;  --rv-card-lt:#3A4374;
  --rv-light:#F3F4F8;  --rv-white:#FFFFFF; --rv-ink:#1A1F36;
  --rv-muted:#6B7188;  --rv-muted-dk:#A6ABC4;
  --rv-green:#5CB69B;  --rv-blue:#86CBE6;  --rv-orange:#D45F37;
  --rv-slate:#8B90A5;  --rv-faint:#5A6187;

  /* ---- Derived, accessibility-driven. See spec 3.1.2 for ratios. -------- */
  --rv-green-txt:#2B7A61;    /* 5.17:1 on white, 4.71:1 on --rv-light */
  --rv-blue-txt:#2A6E8F;     /* 5.64:1 on white */
  --rv-orange-txt:#A8431F;   /* 6.02:1 on white, 5.48:1 on --rv-light */
  --rv-orange-fill:#B44A26;  /* white text = 5.32:1 */
  --rv-body:#5C6279;         /* 6.04:1 on white, 5.49:1 on --rv-light */
  --rv-line:#E2E4EE;         /* decorative hairline only */
  --rv-line-strong:#828AA6;  /* 3.42:1 — control boundaries (WCAG 1.4.11) */
  --rv-danger:#B3341F;       /* 6.13:1 on white */
  --rv-success:#2F8468;      /* 4.54:1 on white — white surfaces only */

  /* ---- Type --------------------------------------------------------- */
  --ff-display:"Archivo","Archivo Fallback Display","Arial Black","Archivo Black",
               "Noto Sans Arabic",system-ui,-apple-system,"Segoe UI",sans-serif;
  --ff-body:"Archivo","Archivo Fallback","Noto Sans Arabic",system-ui,-apple-system,
            "Segoe UI",Calibri,Arial,sans-serif;
  --ff-arabic:"Noto Sans Arabic",system-ui,-apple-system,"Segoe UI",sans-serif;

  --fs-display:clamp(2.25rem,1.4rem + 4.1vw,4.25rem);
  --fs-h1:clamp(2rem,1.35rem + 3.1vw,3.625rem);
  --fs-h2:clamp(1.625rem,1.25rem + 1.8vw,2.5rem);
  --fs-h3:clamp(1.1875rem,1.1rem + 0.4vw,1.4375rem);
  --fs-h4:1.125rem;
  --fs-lead:clamp(1.125rem,1.05rem + 0.35vw,1.3125rem);
  --fs-base:1.0625rem; --fs-sm:.9375rem; --fs-xs:.84375rem; --fs-2xs:.75rem;
  --fs-stat:clamp(1.75rem,1.35rem + 1.9vw,2.625rem);
  --fs-price:clamp(2rem,1.7rem + 1.4vw,2.75rem);

  /* ---- Space, radius, motion ---------------------------------------- */
  --sp-1:4px;  --sp-2:8px;  --sp-3:12px; --sp-4:16px; --sp-5:24px; --sp-6:32px;
  --sp-7:40px; --sp-8:48px; --sp-9:64px; --sp-10:80px; --sp-11:96px; --sp-12:128px;
  --sp-sec:clamp(3.5rem,6vw,6.5rem);
  --gutter:clamp(1.25rem,4vw,2.5rem);
  --container-wide:75rem; --container-prose:44rem;

  --r-0:0; --r-sm:4px; --r-md:8px; --r-lg:12px; --r-pill:999px;

  --el-1:0 1px 2px rgba(26,31,54,.05),0 2px 6px -2px rgba(26,31,54,.06);
  --el-2:0 2px 4px rgba(26,31,54,.04),0 10px 24px -12px rgba(26,31,54,.16);
  --el-3:0 4px 8px rgba(26,31,54,.05),0 24px 56px -24px rgba(26,31,54,.26);
  --el-nav:0 1px 0 rgba(0,0,0,.18),0 8px 24px -12px rgba(0,0,0,.35);
  --el-d-1:inset 0 1px 0 rgba(255,255,255,.055);
  --el-d-2:inset 0 1px 0 rgba(255,255,255,.08),0 18px 40px -24px rgba(0,0,0,.65);

  --ease:cubic-bezier(.16,1,.3,1);      /* decelerate — entrances */
  --ease-in:cubic-bezier(.4,0,1,1);     /* accelerate — exits */
  --dur-fast:140ms; --dur:200ms; --dur-slow:420ms;

  --nav-h:72px;
  --tribar-h:3px;

  color-scheme:light;   /* no dark mode; stop the UA inverting form controls */
}

/* -----------------------------------------------------------------------------
   Surface scopes. A component is authored once against --su-*; moving it from a
   light section to a dark one is a parent class change and nothing else.
   -------------------------------------------------------------------------- */
.rv-s-light,:root{
  --su-bg:var(--rv-light);        --su-raised:var(--rv-white);
  --su-text:var(--rv-ink);        --su-body:var(--rv-body);
  --su-muted:var(--rv-body);      --su-line:var(--rv-line);
  --su-line-strong:var(--rv-line-strong);
  --su-a1:var(--rv-green-txt);    --su-a2:var(--rv-blue-txt);
  --su-a3:var(--rv-orange-txt);
  --su-fill1:var(--rv-green);     --su-fill2:var(--rv-blue);
  --su-fill3:var(--rv-orange);
  --su-el:var(--el-1);            --su-el-hover:var(--el-2);
  --su-focus:var(--rv-navy);      --su-focus-gap:var(--rv-light);
}
.rv-s-paper{
  --su-bg:var(--rv-white); --su-raised:var(--rv-light);
  --su-focus-gap:var(--rv-white);
}
.rv-s-dark{
  --su-bg:var(--rv-navy);         --su-raised:var(--rv-card);
  --su-text:var(--rv-white);      --su-body:var(--rv-muted-dk);
  --su-muted:var(--rv-muted-dk);  --su-line:var(--rv-card-lt);
  --su-line-strong:#7B84B2;       /* 3.19:1 on --rv-card */
  --su-a1:var(--rv-green);        --su-a2:var(--rv-blue);
  --su-a3:var(--rv-orange);       /* large text only — 3.45:1 */
  --su-fill1:var(--rv-green);     --su-fill2:var(--rv-blue);
  --su-fill3:var(--rv-orange);
  --su-el:var(--el-d-1);          --su-el-hover:var(--el-d-2);
  --su-focus:var(--rv-blue);      --su-focus-gap:var(--rv-navy);
  background:var(--rv-navy); color:var(--rv-muted-dk);
}
.rv-s-deep{
  --su-bg:var(--rv-card); --su-raised:var(--rv-card-lt);
  --su-focus-gap:var(--rv-card);
  /* secondary text is 4.14:1 on --rv-card-lt and fails — force white */
  --su-body:var(--rv-white); --su-muted:var(--rv-white);
}

/* -----------------------------------------------------------------------------
   The tribar. The one device that must never mirror, never round, never
   reorder: green, blue, orange, in that order, in every locale. See spec 8.2.
   -------------------------------------------------------------------------- */
.rv-tribar{display:flex;block-size:var(--tribar-h);inline-size:100%;
  border-radius:0;direction:ltr;flex:0 0 auto}
.rv-tribar>span{flex:1 1 0}
.rv-tribar>span:nth-child(1){background:var(--rv-green)}
.rv-tribar>span:nth-child(2){background:var(--rv-blue)}
.rv-tribar>span:nth-child(3){background:var(--rv-orange)}

/* Section kicker / index: stub rule + optional number + label */
.rv-kicker{display:flex;align-items:center;gap:var(--sp-3);
  font-family:var(--ff-display);font-size:var(--fs-2xs);font-weight:800;
  letter-spacing:.16em;text-transform:uppercase;color:var(--su-a1);margin:0}
.rv-kicker::before{content:"";inline-size:40px;block-size:3px;flex:0 0 auto;
  background:currentColor}
.rv-kicker.is-a2{color:var(--su-a2)}
.rv-kicker.is-a3{color:var(--su-a3)}
.rv-kicker .rv-kicker__n{font-variant-numeric:tabular-nums;opacity:.72}

/* =============================================================================
   2. Fonts. Self-hosted, unicode-range gated: an English page never downloads
   the Arabic face, and an Arabic page never downloads Latin-ext.
   Archivo is variable 400-900, so display and body cost one request.
   Noto Sans Arabic is variable-only from Google (verified: the 400 and 800
   URLs return a byte-identical file), so it is declared once across 400-800.
   ========================================================================== */
@font-face{
  font-family:"Archivo";
  src:url("../fonts/archivo-var-latin.woff2") format("woff2");
  font-weight:400 900; font-style:normal; font-display:swap;
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,
    U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,
    U+2212,U+2215,U+FEFF,U+FFFD;
}
@font-face{
  font-family:"Archivo";
  src:url("../fonts/archivo-var-latin-ext.woff2") format("woff2");
  font-weight:400 900; font-style:normal; font-display:swap;
  unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,
    U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,
    U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;
}
/* Metric-matched stand-ins for Archivo, used only during the swap.
   Before this, the H1's swap fallback was Arial Black: much wider, so the
   heading wrapped to four lines instead of three and everything below it —
   including the hero panel — moved one line-height down when Archivo arrived.
   Measured on the live page: H1 197px in Archivo, 262.7px in Arial Black.
   Archivo is upm 1000, ascent 878, descent 210, line gap 0. The width ratios
   against Arial were measured in-browser: 109.78% at weight 900, 99.94% at
   weight 400, which is why display and body need separate faces. The ascent
   and descent are divided by the size-adjust factor because the spec resolves
   them against the adjusted em. */
@font-face{
  font-family:"Archivo Fallback Display";
  src:local("Arial"),local("Helvetica Neue"),local("Helvetica"),local("Liberation Sans");
  size-adjust:109.78%; ascent-override:79.98%; descent-override:19.13%;
  line-gap-override:0%;
}
@font-face{
  font-family:"Archivo Fallback";
  src:local("Arial"),local("Helvetica Neue"),local("Helvetica"),local("Liberation Sans");
  size-adjust:99.94%; ascent-override:87.85%; descent-override:21.01%;
  line-gap-override:0%;
}

@font-face{
  font-family:"Noto Sans Arabic";
  src:url("../fonts/noto-sans-arabic-var-arabic.woff2") format("woff2");
  font-weight:400 800; font-style:normal; font-display:swap;
  unicode-range:U+0600-06FF,U+0750-077F,U+0870-088E,U+0890-0891,U+0897-08E1,
    U+08E3-08FF,U+200C-200E,U+2010-2011,U+204F,U+2E41,U+FB50-FDFF,U+FE70-FE74,
    U+FE76-FEFC;
}

/* =============================================================================
   3. Base
   ========================================================================== */
*,*::before,*::after{box-sizing:border-box}
html{scroll-behavior:smooth;-webkit-text-size-adjust:100%}
@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}}

body{
  margin:0;
  background:var(--rv-light);
  color:var(--rv-body);
  font-family:var(--ff-body);
  font-size:var(--fs-base);
  line-height:1.6;
  font-synthesis-weight:none;
  -webkit-font-smoothing:antialiased;
  text-rendering:optimizeLegibility;
}

h1,h2,h3,h4,h5,h6,.rv-display{
  font-family:var(--ff-display);
  color:var(--su-text);
  margin:0 0 var(--sp-4);
  text-wrap:balance;
}
h1{font-size:var(--fs-h1);font-weight:900;line-height:1.04;letter-spacing:-.022em}
h2{font-size:var(--fs-h2);font-weight:800;line-height:1.10;letter-spacing:-.018em}
h3{font-size:var(--fs-h3);font-weight:800;line-height:1.25;letter-spacing:-.012em}
h4{font-size:var(--fs-h4);font-weight:700;line-height:1.35;letter-spacing:-.006em}
p{margin:0 0 var(--sp-4);text-wrap:pretty}
p:last-child,ul:last-child,ol:last-child{margin-bottom:0}

a{color:var(--su-a2);text-underline-offset:.18em;text-decoration-thickness:.07em}
a:hover{color:var(--su-text)}

/* One focus treatment sitewide: a ring plus a gap in the surface colour, so it
   stays visible on light grounds, on navy, and on top of an accent fill. */
:where(a,button,input,select,textarea,summary,[tabindex]):focus-visible{
  outline:3px solid var(--su-focus);
  outline-offset:2px;
  box-shadow:0 0 0 2px var(--su-focus-gap);
  border-radius:var(--r-sm);
}

img,svg,video{max-inline-size:100%;block-size:auto}
hr{border:0;border-block-start:1px solid var(--su-line);margin:var(--sp-8) 0}

.rv-visually-hidden,.skip-link:not(:focus){
  position:absolute!important;inline-size:1px;block-size:1px;overflow:hidden;
  clip-path:inset(50%);white-space:nowrap;
}
.skip-link:focus{
  position:fixed;inset-block-start:var(--sp-3);inset-inline-start:var(--sp-3);
  z-index:999;background:var(--rv-navy);color:var(--rv-white);
  padding:var(--sp-3) var(--sp-5);border-radius:var(--r-sm);
  font-weight:700;text-decoration:none;
}

/* =============================================================================
   4. Layout primitives
   ========================================================================== */
.rv-wrap{
  inline-size:100%;max-inline-size:var(--container-wide);
  margin-inline:auto;padding-inline:var(--gutter);
}
.rv-prose{max-inline-size:var(--container-prose)}
.rv-section{
  padding-block:var(--sp-sec);
  background:var(--su-bg);
  color:var(--su-body);
}
.rv-section > .rv-wrap > .rv-kicker{margin-block-end:var(--sp-4)}
.rv-section__title{color:var(--su-text);margin-block-end:var(--sp-4)}
.rv-section__intro{
  font-size:var(--fs-lead);color:var(--su-body);
  max-inline-size:52ch;margin-block-end:var(--sp-8);
}

.rv-grid{display:grid;gap:var(--sp-5)}
@media (min-width:640px){
  .rv-grid--2,.rv-grid--4{grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media (min-width:960px){
  .rv-grid--3{grid-template-columns:repeat(3,minmax(0,1fr))}
  .rv-grid--4{grid-template-columns:repeat(4,minmax(0,1fr))}
}

/* =============================================================================
   5. Components. CSS marked "spec" is taken verbatim from the design
   specification; the rest is authored against the same tokens.
   ========================================================================== */

/* ===== Buttons and form controls (spec 3.7-3.8) ===== */
:where(a, button, summary, input, select, textarea, [tabindex]):focus-visible{
  outline: 3px solid var(--su-focus);
  outline-offset: 2px;
  border-radius: var(--r-sm);
  /* the white/navy gap ring keeps the outline legible when the element
     itself is a coloured fill — navy-on-orange is only 2.48:1, so the
     2px offset must sit on the section ground, not on the button */
  box-shadow: 0 0 0 2px var(--su-focus-gap);
}

/* ===== Components (spec 4) ===== */
/* --- Nav ------------------------------------------------------------------ */
.rv-nav{position:fixed;inset-block-start:0;inset-inline:0;z-index:50;
  background:var(--rv-navy);
  transition:background var(--dur) var(--ease),box-shadow var(--dur) var(--ease)}
html.rv-scrolled .rv-nav{
  background:rgba(36,44,92,.9);
  -webkit-backdrop-filter:blur(14px) saturate(140%);
          backdrop-filter:blur(14px) saturate(140%);
  box-shadow:var(--el-nav)}
/* No backdrop-filter support: stay fully opaque rather than washed out. */
@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){
  html.rv-scrolled .rv-nav{background:var(--rv-navy)}
}

.rv-nav__row{display:flex;align-items:center;gap:clamp(16px,2.5vw,36px);
  block-size:var(--nav-h);max-inline-size:var(--container-wide);
  margin-inline:auto;padding-inline:var(--gutter)}
.rv-nav .rv-tribar{position:absolute;inset-block-end:0;inset-inline:0}

.rv-wordmark{font-family:var(--ff-display);font-weight:900;font-size:19px;
  letter-spacing:.34em;color:var(--rv-white);text-decoration:none;
  /* the wordmark is a Latin lockup in both locales — never mirror, never
     letter-space in an Arabic context by inheritance */
  direction:ltr;unicode-bidi:isolate;white-space:nowrap;
  /* .34em of tracking adds a trailing space the eye reads as misalignment */
  margin-inline-end:-.34em}

.rv-nav__links{display:flex;gap:clamp(14px,1.8vw,28px);margin-inline-start:auto;
  list-style:none;margin-block:0;padding:0}
.rv-nav__links a{position:relative;display:block;padding-block:8px;
  font-size:15px;font-weight:500;color:var(--rv-muted-dk);text-decoration:none;
  transition:color var(--dur) var(--ease)}
.rv-nav__links a::after{content:"";position:absolute;inset-block-end:0;
  inset-inline-start:0;inline-size:100%;block-size:2px;background:var(--rv-green);
  transform:scaleX(0);transform-origin:left;   /* keyword, not logical: see 5.6 */
  transition:transform var(--dur) var(--ease)}
[dir="rtl"] .rv-nav__links a::after{transform-origin:right}
.rv-nav__links a:hover,.rv-nav__links a:focus-visible{color:var(--rv-white)}
.rv-nav__links a:hover::after,.rv-nav__links a:focus-visible::after{transform:scaleX(1)}

.rv-lang{display:inline-flex;border:1px solid var(--rv-card-lt);
  border-radius:var(--r-pill);overflow:hidden;flex:0 0 auto}
.rv-lang a{min-block-size:38px;display:inline-flex;align-items:center;
  padding-inline:14px;font-size:13.5px;font-weight:500;
  color:var(--rv-muted-dk);text-decoration:none}
.rv-lang a[aria-current]{background:var(--rv-card-lt);color:var(--rv-white)}
.rv-lang a[lang="ar"]{letter-spacing:normal;
  text-transform:none;font-size:14px}

@media (max-width:1023px){
  :root{--nav-h:64px}
  .rv-nav__links{display:none}
}
/* Anchor links must clear the fixed bar — and so must keyboard focus. */
html{scroll-padding-block-start:calc(var(--nav-h) + var(--sp-4));
     scroll-behavior:smooth}
@media (max-width:767px){
  html{scroll-padding-block-end:calc(var(--sticky-cta-h,0px) + var(--sp-4))}
}

/* --- Hero ----------------------------------------------------------------- */
.rv-hero{position:relative;padding-block:clamp(3rem,7vw,5.5rem) var(--sp-sec);
  padding-block-start:calc(var(--nav-h) + clamp(3rem,7vw,5.5rem));
  min-block-size:min(88svh,760px);display:flex;align-items:center}
.rv-hero__grid{display:grid;gap:clamp(2rem,4vw,4rem);inline-size:100%;
  max-inline-size:var(--container-wide);margin-inline:auto;
  padding-inline:var(--gutter)}
@media (min-width:1024px){
  .rv-hero__grid{grid-template-columns:7fr 5fr;align-items:center}
}
.rv-hero h1{font-family:var(--ff-display);font-weight:900;
  font-size:var(--fs-display);line-height:1.02;letter-spacing:-.028em;
  color:var(--rv-white);max-inline-size:18ch;
  margin-block:var(--sp-5) var(--sp-4);text-wrap:balance}
.rv-hero__lead{font-size:var(--fs-lead);line-height:1.5;
  color:var(--rv-muted-dk);max-inline-size:54ch;margin-block-end:var(--sp-7)}
.rv-hero__actions{display:flex;gap:var(--sp-4);flex-wrap:wrap;
  margin-block-end:var(--sp-4)}
.rv-hero__micro{font-size:var(--fs-xs);color:var(--rv-muted-dk)}

/* The system panel — the hero's visual mass, at zero image cost. */
.rv-panel{background:var(--rv-card);border-radius:var(--r-md);
  border-block-start:3px solid var(--rv-green);box-shadow:var(--el-d-2);
  padding:var(--sp-6) var(--sp-5);overflow:clip}
.rv-panel__head{font-family:var(--ff-display);font-size:var(--fs-2xs);
  font-weight:800;letter-spacing:.16em;text-transform:uppercase;
  color:var(--rv-muted-dk);margin-block-end:var(--sp-5)}
.rv-panel__row{display:flex;align-items:center;gap:var(--sp-3);
  background:var(--rv-card-lt);border-radius:var(--r-sm);
  padding:var(--sp-3) var(--sp-4);font-size:var(--fs-sm);
  color:var(--rv-white);min-block-size:48px}          /* min, never fixed */
.rv-panel__row + .rv-panel__row{margin-block-start:var(--sp-2)}
.rv-panel__row svg{inline-size:18px;block-size:18px;flex:0 0 auto;
  color:var(--rv-green)}
@media (max-width:560px){
  .rv-hero__actions{flex-direction:column;align-items:stretch}
  .rv-hero__actions .rv-btn{inline-size:100%}
}

/* --- Offer card ----------------------------------------------------------- */
.rv-cards{display:grid;gap:var(--sp-5);
  grid-template-columns:repeat(auto-fit,minmax(300px,1fr))}
.rv-cards>*{margin-block:0}   /* core's is-layout-flow margin breaks grid rows */

.rv-card{position:relative;display:flex;flex-direction:column;
  background:var(--su-raised);border:1px solid var(--su-line);
  border-radius:var(--r-md);padding:var(--sp-6) var(--sp-5) var(--sp-5);
  box-shadow:var(--su-el);
  transition:transform var(--dur) var(--ease),box-shadow var(--dur) var(--ease),
             border-color var(--dur) var(--ease)}
.rv-card::before{content:"";position:absolute;inset-block-start:-1px;
  inset-inline:-1px;block-size:3px;background:var(--rv-green);
  border-start-start-radius:var(--r-md);border-start-end-radius:var(--r-md)}
.rv-card.is-a2::before{background:var(--rv-blue)}
.rv-card.is-a3::before{background:var(--rv-orange)}
.rv-card.is-a4::before{background:var(--rv-slate)}

.rv-card__icon{inline-size:40px;block-size:40px;border-radius:var(--r-sm);
  display:grid;place-items:center;flex:0 0 auto;
  background:color-mix(in srgb,var(--rv-green) 12%,transparent);
  color:var(--su-a1);margin-block-end:var(--sp-4)}
.rv-card.is-a2 .rv-card__icon{background:color-mix(in srgb,var(--rv-blue) 14%,transparent);
  color:var(--su-a2)}
.rv-card.is-a3 .rv-card__icon{background:color-mix(in srgb,var(--rv-orange) 12%,transparent);
  color:var(--su-a3)}
.rv-card__icon svg{inline-size:20px;block-size:20px}

.rv-card h3{font-size:var(--fs-h3);font-weight:800;line-height:1.25;
  letter-spacing:-.012em;color:var(--su-text);margin-block:0 var(--sp-2)}
.rv-card p{font-size:var(--fs-sm);line-height:1.55;color:var(--su-body);
  max-inline-size:42ch;margin-block:0}
.rv-card__link{margin-block-start:auto;padding-block-start:var(--sp-4);
  font-size:var(--fs-sm);font-weight:700;color:var(--su-a1);
  text-decoration:none;display:inline-flex;align-items:center;gap:var(--sp-2)}
.rv-card__link svg{transition:transform var(--dur) var(--ease)}
[dir="rtl"] .rv-card__link svg{transform:scaleX(-1)}   /* arrows DO mirror */

@media (hover:hover) and (pointer:fine){
  .rv-card:hover{transform:translateY(-2px);box-shadow:var(--su-el-hover);
    border-color:color-mix(in srgb,var(--rv-green) 45%,var(--su-line))}
  .rv-card:hover .rv-card__link svg{transform:translateX(3px)}
  [dir="rtl"] .rv-card:hover .rv-card__link svg{transform:scaleX(-1) translateX(3px)}
}
/* A whole-card link needs a focus ring on the card, not on the invisible <a>. */
.rv-card:focus-within{box-shadow:var(--su-el-hover),0 0 0 3px var(--su-focus)}

/* --- Pricing tiers -------------------------------------------------------- */
.rv-tiers{display:grid;gap:var(--sp-5);align-items:stretch;
  list-style:none;margin:0;padding:0;
  grid-template-columns:repeat(auto-fit,minmax(290px,1fr))}
@media (min-width:1024px){.rv-tiers{grid-template-columns:repeat(3,1fr)}}
.rv-tiers>li{display:flex;margin-block:0}

.rv-tier{position:relative;display:flex;flex-direction:column;inline-size:100%;
  background:var(--su-raised);border:1px solid var(--su-line);
  border-radius:var(--r-md);box-shadow:var(--su-el);
  padding:var(--sp-7) var(--sp-5) var(--sp-6)}
.rv-tier.is-popular{
  border:2px solid var(--rv-green);border-radius:var(--r-lg);
  box-shadow:var(--el-3);
  padding-block:calc(var(--sp-7) + 8px) calc(var(--sp-6) + 8px)}
/* Emphasis by ribbon, border, elevation and padding — never by transform:
   scale(), which resamples type and de-aligns the row of CTAs. */
.rv-tier__ribbon{position:absolute;inset-block-start:0;inset-inline:-1px;
  background:var(--rv-green);color:var(--rv-navy);       /* 5.42:1 */
  font-family:var(--ff-display);font-size:var(--fs-2xs);font-weight:800;
  letter-spacing:.16em;text-transform:uppercase;text-align:center;
  padding-block:6px;
  border-start-start-radius:calc(var(--r-lg) - 2px);
  border-start-end-radius:calc(var(--r-lg) - 2px)}

.rv-tier__name{font-family:var(--ff-display);font-size:var(--fs-2xs);
  font-weight:800;letter-spacing:.16em;text-transform:uppercase;
  color:var(--su-muted);margin-block:0 var(--sp-3)}
.rv-tier__price{display:flex;align-items:baseline;gap:var(--sp-2);
  direction:ltr;unicode-bidi:isolate;      /* price never reorders in Arabic */
  font-variant-numeric:tabular-nums;margin-block-end:var(--sp-3)}
.rv-tier__cur{font-size:15px;font-weight:500;color:var(--su-muted)}
.rv-tier__amt{font-family:var(--ff-display);font-size:var(--fs-price);
  font-weight:900;line-height:1;letter-spacing:-.02em;color:var(--su-text)}
.rv-tier__per{font-size:15px;color:var(--su-muted)}
.rv-tier__for{font-size:var(--fs-sm);color:var(--su-body);
  min-block-size:3.1em;margin-block:0 var(--sp-5)}  /* min, so Arabic can grow */
.rv-tier .rv-btn{inline-size:100%}
.rv-tier__rule{border:0;border-block-start:1px solid var(--su-line);
  margin-block:var(--sp-5)}

.rv-tier__feats{list-style:none;margin:0;padding:0;flex:1}
.rv-tier__feats li{display:flex;gap:var(--sp-3);align-items:flex-start;
  font-size:var(--fs-sm);line-height:1.5;color:var(--su-body)}
.rv-tier__feats li + li{margin-block-start:var(--sp-3)}
.rv-tier__feats svg{inline-size:16px;block-size:16px;flex:0 0 auto;
  margin-block-start:.2em;color:var(--su-a1)}
.rv-tier__feats li.is-limit svg{color:var(--su-muted)}
.rv-tier__fine{font-size:var(--fs-xs);color:var(--su-muted);
  margin-block-start:var(--sp-5)}

/* Baseline: instant. Enhancement only where height is genuinely interpolable
   and the browser can animate ::details-content off the main thread. */
@supports (interpolate-size: allow-keywords) and selector(::details-content){
  html{interpolate-size:allow-keywords}
  .rv-faq details::details-content{
    block-size:0;overflow:clip;
    transition:block-size var(--dur-fast) var(--ease),content-visibility var(--dur-fast) allow-discrete}
  .rv-faq details[open]::details-content{block-size:auto}
}
.rv-faq summary::-webkit-details-marker{display:none}
.rv-faq summary .rv-chev{transition:transform var(--dur) var(--ease)}
.rv-faq details[open] summary .rv-chev{transform:rotate(180deg)}
[dir="rtl"] .rv-faq summary .rv-chev{transform:scaleX(-1)}
[dir="rtl"] .rv-faq details[open] summary .rv-chev{transform:scaleX(-1) rotate(180deg)}
/* --- Buttons. One primary per view; terracotta is the only call to action. -- */
.rv-btn{
  display:inline-flex;align-items:center;justify-content:center;gap:var(--sp-2);
  min-block-size:48px;padding:14px var(--sp-5);
  font-family:var(--ff-display);font-size:var(--fs-sm);font-weight:700;
  line-height:1;text-decoration:none;text-align:center;
  border:1px solid transparent;border-radius:var(--r-sm);cursor:pointer;
  transition:background var(--dur) var(--ease),color var(--dur) var(--ease),
             border-color var(--dur) var(--ease),transform var(--dur-fast) var(--ease);
}
.rv-btn:active{transform:translateY(1px)}
.rv-btn--sm{min-block-size:40px;padding:10px var(--sp-4);font-size:var(--fs-xs)}
.rv-btn--lg{min-block-size:56px;padding:16px var(--sp-6);font-size:var(--fs-base)}
.rv-btn--block{inline-size:100%}

.rv-btn--primary{background:var(--rv-orange-fill);color:var(--rv-white);border-color:var(--rv-orange-fill)}
.rv-btn--primary:hover{background:var(--rv-orange-txt);border-color:var(--rv-orange-txt);color:var(--rv-white)}

/* The nav CTA is the only green object in the bar. */
.rv-nav__cta{background:var(--rv-green);color:var(--rv-navy);border-color:var(--rv-green)}
.rv-nav__cta:hover{background:#6FC6AC;color:var(--rv-navy)}

.rv-btn--ghost{background:transparent;color:var(--su-text);border-color:var(--su-line-strong)}
.rv-btn--ghost:hover{border-color:var(--su-text);color:var(--su-text)}
.rv-s-dark .rv-btn--ghost{color:var(--rv-white);border-color:#7B84B2}
.rv-s-dark .rv-btn--ghost:hover{border-color:var(--rv-white);background:rgba(255,255,255,.06)}

.rv-btn--link{min-block-size:0;padding:0;border:0;background:none;
  color:var(--su-a2);font-weight:700;text-decoration:underline;
  text-underline-offset:.2em}

/* --- Mobile menu overlay --------------------------------------------------- */
/* flex:0 0 auto matters: as a flex item in the nav row the button was being
   shrunk from its 48px target to 24px, which is below the minimum touch
   target and made the icon look like a rendering fault. */
.rv-burger{display:none;inline-size:48px;block-size:48px;padding:12px;
  flex:0 0 auto;
  background:none;border:0;cursor:pointer;flex-direction:column;
  justify-content:space-between}
.rv-burger span{display:block;block-size:2px;inline-size:100%;
  background:var(--rv-white);transition:transform var(--dur) var(--ease)}
@media (max-width:1023px){
  .rv-burger{display:flex}
  .rv-nav__cta{display:none}
}
.rv-menu{position:fixed;inset:0;z-index:60;background:rgba(10,13,28,.6)}
.rv-menu[hidden]{display:none}
.rv-menu__panel{position:absolute;inset-block:0;inset-inline-end:0;
  inline-size:min(88vw,380px);background:var(--rv-navy);
  border-start-start-radius:var(--r-lg);border-end-start-radius:var(--r-lg);
  padding:var(--sp-8) var(--sp-5) var(--sp-6);display:flex;flex-direction:column;
  gap:var(--sp-5);overflow-y:auto}
.rv-menu__close{position:absolute;inset-block-start:var(--sp-3);
  inset-inline-end:var(--sp-3);inline-size:48px;block-size:48px;
  background:none;border:0;color:var(--rv-white);font-size:28px;cursor:pointer;
  line-height:1}
.rv-menu__links{list-style:none;margin:var(--sp-6) 0 auto;padding:0}
.rv-menu__links a{display:flex;align-items:center;min-block-size:56px;
  font-family:var(--ff-display);font-size:19px;font-weight:700;
  color:var(--rv-white);text-decoration:none;
  border-block-end:1px solid var(--rv-card-lt)}
.rv-menu__cta{inline-size:100%}
body.rv-menu-open{overflow:hidden}

/* --- Stat band ------------------------------------------------------------- */
.rv-stats{display:grid;gap:1px;background:var(--rv-card-lt);
  border-block-start:1px solid var(--rv-card-lt);
  grid-template-columns:repeat(2,minmax(0,1fr))}
@media (min-width:900px){.rv-stats{grid-template-columns:repeat(4,minmax(0,1fr))}}
@media (max-width:400px){.rv-stats{grid-template-columns:1fr}}
.rv-stat{background:var(--rv-navy);padding:var(--sp-6) var(--sp-5)}
.rv-stat__v{display:block;font-family:var(--ff-display);font-size:var(--fs-stat);
  font-weight:900;line-height:1;color:var(--rv-white);
  font-variant-numeric:tabular-nums;letter-spacing:-.02em}
.rv-stat__l{display:block;margin-block-start:var(--sp-2);font-size:13.5px;
  color:var(--rv-muted-dk)}
.rv-stat__src{display:block;margin-block-start:var(--sp-1);font-size:12px;
  color:var(--rv-faint)}
.rv-s-dark .rv-stat__src{color:#8F97BE}

/* --- Process timeline (Audit · Architect · Execute · Optimize · Scale) ------ */
.rv-steps{display:grid;gap:var(--sp-5);counter-reset:step;
  grid-template-columns:repeat(auto-fit,minmax(190px,1fr))}
.rv-step{position:relative;padding-block-start:var(--sp-5);
  border-block-start:3px solid var(--su-line)}
.rv-step:nth-child(5n+1){border-block-start-color:var(--rv-green)}
.rv-step:nth-child(5n+2){border-block-start-color:var(--rv-blue)}
.rv-step:nth-child(5n+3){border-block-start-color:var(--rv-orange)}
.rv-step:nth-child(5n+4){border-block-start-color:var(--rv-slate)}
.rv-step__n{font-family:var(--ff-display);font-size:var(--fs-2xs);font-weight:800;
  letter-spacing:.16em;color:var(--su-a1);font-variant-numeric:tabular-nums}
.rv-step h3{margin-block:var(--sp-2) var(--sp-2)}
.rv-step p{font-size:var(--fs-sm);color:var(--su-body);margin:0}

/* --- Lead form ------------------------------------------------------------- */
.rv-form{display:grid;gap:var(--sp-4)}
.rv-field{display:grid;gap:var(--sp-2)}
.rv-field label{font-size:var(--fs-sm);font-weight:700;color:var(--su-text)}
.rv-field .rv-help{font-size:var(--fs-xs);color:var(--su-body)}
.rv-field input,.rv-field select,.rv-field textarea{
  min-block-size:48px;padding:12px var(--sp-4);font:inherit;
  font-size:var(--fs-base);color:var(--rv-ink);background:var(--rv-white);
  border:1px solid var(--rv-line-strong);border-radius:var(--r-sm);
  inline-size:100%}
.rv-field textarea{min-block-size:120px;resize:vertical}
.rv-field input[aria-invalid="true"],.rv-field textarea[aria-invalid="true"]{
  border-color:var(--rv-danger);border-inline-start-width:3px}
.rv-field .rv-error{font-size:var(--fs-xs);font-weight:700;color:var(--rv-danger)}

/* --- WhatsApp float + mobile sticky CTA ------------------------------------ */
.rv-wa{position:fixed;inset-block-end:var(--sp-5);inset-inline-end:var(--sp-5);
  z-index:40;inline-size:56px;block-size:56px;border-radius:var(--r-pill);
  display:grid;place-items:center;background:#1FA855;color:#fff;
  box-shadow:var(--el-3);text-decoration:none}
.rv-wa svg{inline-size:28px;block-size:28px}
@media (max-width:767px){
  .rv-wa{inset-block-end:calc(var(--sticky-cta-h,64px) + var(--sp-3));
         inline-size:48px;block-size:48px}
  .rv-sticky-cta{position:fixed;inset-block-end:0;inset-inline:0;z-index:45;
    display:flex;gap:var(--sp-2);padding:var(--sp-2) var(--sp-3);
    background:var(--rv-white);border-block-start:1px solid var(--rv-line);
    box-shadow:0 -8px 24px -16px rgba(26,31,54,.4)}
  .rv-sticky-cta .rv-btn{flex:1}
  body{padding-block-end:var(--sticky-cta-h,64px)}
}
@media (min-width:768px){.rv-sticky-cta{display:none}}

/* --- Footer ---------------------------------------------------------------- */
.rv-footer{padding-block-end:var(--sp-6)}
.rv-footer .rv-tribar{margin-block-end:var(--sp-9)}
.rv-footer__grid{display:grid;gap:var(--sp-7);
  grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}
.rv-footer__line{font-size:var(--fs-sm);color:var(--rv-muted-dk);
  max-inline-size:38ch;margin-block-start:var(--sp-4)}
.rv-footer__nav ul{list-style:none;margin:0;padding:0;display:grid;gap:var(--sp-3)}
.rv-footer__nav a,.rv-footer__contact a{color:var(--rv-muted-dk);
  text-decoration:none;font-size:var(--fs-sm)}
.rv-footer__nav a:hover,.rv-footer__contact a:hover{color:var(--rv-white)}
.rv-footer__contact{display:grid;gap:var(--sp-3);justify-items:start}
.rv-footer__legal{display:flex;flex-wrap:wrap;gap:var(--sp-4);
  justify-content:space-between;margin-block-start:var(--sp-8);
  padding-block-start:var(--sp-5);border-block-start:1px solid var(--rv-card-lt);
  font-size:var(--fs-xs);
  /* was --rv-faint at 2.20:1 on navy — the design spec demoted that token to
     decorative use only, and this is body text. */
  color:var(--rv-muted-dk)}
.rv-footer__legal a{color:var(--rv-muted-dk)}
.rv-lang .is-unavailable{min-block-size:38px;display:inline-flex;
  align-items:center;padding-inline:14px;font-size:14px;color:var(--rv-faint);
  cursor:not-allowed}

/* --- Breadcrumbs ----------------------------------------------------------- */
.rv-crumbs{font-size:var(--fs-xs);color:var(--su-body);
  padding-block:var(--sp-4) 0}
.rv-crumbs ol{display:flex;flex-wrap:wrap;gap:var(--sp-2);list-style:none;
  margin:0;padding:0}
.rv-crumbs li+li::before{content:"/";margin-inline-end:var(--sp-2);
  color:var(--su-line-strong)}
.rv-crumbs a{color:var(--su-body)}
.rv-crumbs [aria-current]{color:var(--su-text);font-weight:700}

/* --- Prose defaults inside page content ------------------------------------ */
.rv-section ul,.rv-section ol{margin:0 0 var(--sp-4);padding-inline-start:1.15em}
.rv-section li{margin-block-end:var(--sp-2);font-size:var(--fs-sm)}
.rv-section li::marker{color:var(--su-a1)}

/* =============================================================================
   6. Motion. Every rule is gated on html.js, so if the script fails to run the
   page renders fully visible rather than stuck at opacity 0.
   ========================================================================== */
html.js .rv-reveal{opacity:0;transform:translateY(14px);
  transition:opacity var(--dur-slow) var(--ease),transform var(--dur-slow) var(--ease)}
html.js .rv-reveal.is-in{opacity:1;transform:none}
html.js .rv-reveal-stagger>*{opacity:0;transform:translateY(14px);
  transition:opacity var(--dur-slow) var(--ease),transform var(--dur-slow) var(--ease);
  transition-delay:calc(var(--i,0) * 60ms)}
html.js .rv-reveal-stagger.is-in>*{opacity:1;transform:none}

@media (prefers-reduced-motion:reduce){
  html.js .rv-reveal,html.js .rv-reveal-stagger>*{
    opacity:1;transform:none;transition:none}
  .rv-btn,.rv-card,.rv-nav{transition:none}
  *,*::before,*::after{animation-duration:.01ms!important;
    animation-iteration-count:1!important;scroll-behavior:auto!important}
}

/* =============================================================================
   7. RTL. Logical properties carry almost everything; these are the exceptions
   that must NOT mirror.
   ========================================================================== */
[dir="rtl"] .rv-tribar{direction:ltr}
[dir="rtl"] .rv-wordmark{direction:ltr;unicode-bidi:isolate}
[dir="rtl"] .rv-price,[dir="rtl"] .rv-stat__v{unicode-bidi:isolate}
.rv-lang-ar body,body.rv-lang-ar{font-family:var(--ff-arabic)}
body.rv-lang-ar h1,body.rv-lang-ar h2,body.rv-lang-ar h3,body.rv-lang-ar h4{
  font-family:var(--ff-arabic);letter-spacing:normal;line-height:1.35}
body.rv-lang-ar .rv-kicker,body.rv-lang-ar .rv-panel__head{
  letter-spacing:normal;text-transform:none}

/* =============================================================================
   8. Consent Mode v2 banner. Server-rendered in inc/consent.php, so it is in
   the DOM before any script runs and cannot flash.
   ========================================================================== */
.rv-cc{position:fixed;inset:0;z-index:80;display:grid;align-items:end;
  justify-items:center;pointer-events:none}
html.rv-consent-set .rv-cc{display:none}
.rv-cc__scrim{position:absolute;inset:0;background:rgba(10,13,28,.34);
  pointer-events:auto}
.rv-cc__panel{position:relative;pointer-events:auto;
  inline-size:min(100%,680px);margin:var(--sp-4);
  background:var(--rv-white);color:var(--rv-body);
  border:1px solid var(--rv-line);border-radius:var(--r-md);
  box-shadow:var(--el-3);padding:var(--sp-6) var(--sp-5);
  max-block-size:min(84svh,760px);overflow-y:auto}
.rv-cc__panel::before{content:"";position:absolute;inset-block-start:-1px;
  inset-inline:-1px;block-size:3px;background:var(--rv-green);
  border-start-start-radius:var(--r-md);border-start-end-radius:var(--r-md)}
.rv-cc__eyebrow{font-family:var(--ff-display);font-size:var(--fs-2xs);
  font-weight:800;letter-spacing:.16em;text-transform:uppercase;
  color:var(--rv-green-txt);margin:0 0 var(--sp-2)}
.rv-cc__title{font-size:var(--fs-h3);margin:0 0 var(--sp-3);color:var(--rv-ink)}
.rv-cc__body,.rv-cc__copy{font-size:var(--fs-sm);margin:0 0 var(--sp-4)}
.rv-cc__actions{display:flex;flex-wrap:wrap;gap:var(--sp-3);
  margin-block-start:var(--sp-5)}
.rv-cc__btn{display:inline-flex;align-items:center;justify-content:center;
  min-block-size:48px;padding:12px var(--sp-5);font-family:var(--ff-display);
  font-size:var(--fs-sm);font-weight:700;border-radius:var(--r-sm);
  border:1px solid var(--rv-line-strong);background:var(--rv-white);
  color:var(--rv-ink);cursor:pointer}
.rv-cc__btn[data-rv-consent="accept"]{background:var(--rv-orange-fill);
  color:var(--rv-white);border-color:var(--rv-orange-fill)}
.rv-cc__btn[data-rv-consent="accept"]:hover{background:var(--rv-orange-txt)}
.rv-cc__more{background:none;border:0;padding:0;min-block-size:44px;
  font-size:var(--fs-sm);font-weight:700;color:var(--rv-blue-txt);
  text-decoration:underline;text-underline-offset:.2em;cursor:pointer}
.rv-cc__prefs{margin-block-start:var(--sp-5);border-block-start:1px solid var(--rv-line);
  padding-block-start:var(--sp-4)}
.rv-cc__prefs[hidden]{display:none}
.rv-cc__list{list-style:none;margin:0;padding:0;display:grid;gap:var(--sp-3)}
.rv-cc__cat{border:1px solid var(--rv-line);border-radius:var(--r-sm);
  padding:var(--sp-4)}
.rv-cc__row{display:flex;align-items:flex-start;gap:var(--sp-3);
  justify-content:space-between}
.rv-cc__cat-label{font-weight:700;color:var(--rv-ink);font-size:var(--fs-sm)}
.rv-cc__cat-body{font-size:var(--fs-xs);margin-block-start:var(--sp-2)}
.rv-cc__tag{font-size:var(--fs-2xs);font-weight:800;letter-spacing:.1em;
  text-transform:uppercase;color:var(--rv-body)}
.rv-cc__check{inline-size:44px;block-size:26px;flex:0 0 auto}
.rv-cc__check--locked{opacity:.55;cursor:not-allowed}
.rv-cc__policy{font-size:var(--fs-xs);margin-block-start:var(--sp-4)}
@media (max-width:560px){
  .rv-cc__actions .rv-cc__btn{inline-size:100%}
}

/* =============================================================================
   8. Additions required by the interior page patterns.
   Appended for patterns/page-pricing.php, page-partners.php, page-about.php,
   page-contact.php, page-thank-you.php and page-privacy-policy.php.
   Tokens only — no hardcoded colour, no value off the 4px scale.
   ========================================================================== */

/* --- Interior page hero ----------------------------------------------------
   Needed by all six patterns. `.rv-hero` as authored is the tall navy home
   hero: its h1 and lead are pinned to --rv-white and it reserves 88svh. The
   interior pages sit on the light ground (spec 5.4, 5.6, 5.7), so this
   modifier rebinds those colours to the surface scope, drops the viewport
   minimum, and collapses the 7fr/5fr split to a single column because there
   is no system panel on these pages. */
.rv-hero--page{min-block-size:0;padding-block-end:var(--sp-9);
  align-items:flex-start}
@media (min-width:1024px){
  .rv-hero--page .rv-hero__grid{grid-template-columns:minmax(0,1fr)}
}
.rv-hero--page h1{color:var(--su-text);max-inline-size:20ch}
.rv-hero--page .rv-hero__lead{color:var(--su-body)}
.rv-hero--page .rv-hero__micro{color:var(--su-muted)}

/* --- Inline price / range string -------------------------------------------
   `.rv-price` was referenced in the RTL block (section 7) but never declared,
   so it did nothing on an LTR page. Needed wherever a price or a timeline
   range appears inside a sentence or a table cell: page-pricing.php and
   page-about.php. Isolated and tabular so "SAR 15,000" and "1–3 weeks" never
   reorder inside an Arabic sentence. */
.rv-price{direction:ltr;unicode-bidi:isolate;font-variant-numeric:tabular-nums;
  font-weight:700;color:var(--su-text);white-space:nowrap}

/* --- Small print / footnote line -------------------------------------------
   Needed by every pattern: VAT line, source footnotes, consent line, closing
   band microcopy. `.rv-tier__fine` already does this inside a tier; this is
   the same treatment anywhere else. */
.rv-fine{font-size:var(--fs-xs);line-height:1.55;color:var(--su-muted);
  max-inline-size:68ch}
.rv-fine a{color:var(--su-a2)}

/* --- Check list ------------------------------------------------------------
   Needed by page-partners.php ("What partners get"). The tier feature list is
   scoped to `.rv-tier__feats`; this is the same row treatment outside a tier.
   Grid by default, single column with the --stack modifier. */
.rv-checks{list-style:none;margin:0 0 var(--sp-4);padding:0;display:grid;
  gap:var(--sp-3);grid-template-columns:repeat(auto-fit,minmax(240px,1fr))}
.rv-checks--stack{grid-template-columns:minmax(0,1fr)}
.rv-checks li{display:flex;gap:var(--sp-3);align-items:flex-start;margin:0;
  font-size:var(--fs-sm);line-height:1.5;color:var(--su-body)}
.rv-checks svg{inline-size:18px;block-size:18px;flex:0 0 auto;
  margin-block-start:.15em;color:var(--su-a1)}

/* --- FAQ accordion, resting state ------------------------------------------
   `.rv-faq` had only its open/close motion and chevron rules; the rows
   themselves were unstyled. Spec 4.8: ruled rows, no card chrome, 64px
   minimum tap target. core/details renders the summary as plain text, so the
   chevron is a CSS marker rather than an inline SVG — the theme's FAQPage
   collector strips tags from the summary either way.
   Needed by page-pricing.php, page-partners.php and page-contact.php. */
.rv-faq{border-block-start:1px solid var(--su-line)}
.rv-faq details{border-block-end:1px solid var(--su-line)}
.rv-faq summary{display:flex;align-items:center;justify-content:space-between;
  gap:var(--sp-4);min-block-size:64px;padding-block:var(--sp-4);
  font-family:var(--ff-display);font-size:var(--fs-h4);font-weight:700;
  line-height:1.35;color:var(--su-text);cursor:pointer;list-style:none}
.rv-faq summary::marker{content:""}
.rv-faq summary::after{content:"";inline-size:9px;block-size:9px;flex:0 0 auto;
  margin-block-end:var(--sp-1);margin-inline-end:var(--sp-1);
  /* Physical, not logical, and deliberately so: a chevron drawn from two
     logical borders flips to the left edge under dir="rtl", and the 45deg
     rotation then points it sideways instead of down. The glyph means
     "expand" in both directions, so it must not mirror. */
  border-right:2px solid currentColor;border-bottom:2px solid currentColor;
  transform:rotate(45deg);color:var(--su-a1);
  transition:transform var(--dur) var(--ease)}
.rv-faq details[open] summary::after{transform:rotate(-135deg);
  margin-block:var(--sp-1) 0}
.rv-faq details > :not(summary){font-size:var(--fs-base);color:var(--su-body);
  max-inline-size:68ch;margin-block:0 var(--sp-5)}
@media (prefers-reduced-motion:reduce){
  .rv-faq summary::after{transition:none}
}

/* --- Data table ------------------------------------------------------------
   The plan comparison, the development price list, and the cookie, processor
   and retention tables in the privacy policy. A real <table> with <th scope>;
   the wrapper carries role="region" and an accessible name in the markup and
   tabindex="0" so the overflow is reachable from the keyboard.
   Needed by page-pricing.php and page-privacy-policy.php. */
.rv-tablewrap{overflow-x:auto;-webkit-overflow-scrolling:touch;
  border:1px solid var(--su-line);border-radius:var(--r-md);
  background:var(--su-raised);margin-block-end:var(--sp-5)}
.rv-tablewrap:focus-visible{outline:3px solid var(--su-focus);
  outline-offset:2px}
.rv-table{inline-size:100%;border-collapse:collapse;
  font-variant-numeric:tabular-nums}
.rv-table caption{text-align:start}
.rv-table th,.rv-table td{padding:var(--sp-3) var(--sp-4);text-align:start;
  vertical-align:top;font-size:var(--fs-sm);line-height:1.5;
  border-block-end:1px solid var(--su-line)}
.rv-table thead th{font-family:var(--ff-display);font-weight:800;
  color:var(--su-text);white-space:nowrap;
  border-block-end:2px solid var(--su-line-strong)}
.rv-table tbody th{font-weight:700;color:var(--su-text);
  min-inline-size:14ch}
.rv-table tbody td{color:var(--su-body)}
.rv-table tbody tr:last-child th,.rv-table tbody tr:last-child td{
  border-block-end:0}
.rv-table__mark{display:inline-flex;align-items:center;color:var(--su-a1)}
.rv-table__mark svg{inline-size:18px;block-size:18px}
.rv-table__mark.is-no{color:var(--su-muted)}

/* --- Honeypot --------------------------------------------------------------
   Removed from the layout and from the accessibility tree; the field still
   posts, which is the point. Paired with aria-hidden and tabindex="-1" in the
   markup. Needed by page-contact.php and page-partners.php. */
.rv-hp{display:none}

/* --- Form result messages --------------------------------------------------
   Rendered hidden; a handler unhides the one that applies. Needed by
   page-contact.php and page-partners.php. */
.rv-form__loading,.rv-form__success,.rv-form__error{
  margin:0;padding:var(--sp-3) var(--sp-4);border-radius:var(--r-sm);
  font-size:var(--fs-sm);font-weight:700;border:1px solid transparent}
.rv-form__loading{color:var(--su-body);border-color:var(--su-line)}
.rv-form__success{color:var(--rv-success);border-color:var(--rv-success)}
.rv-form__error{color:var(--rv-danger);border-color:var(--rv-danger)}
.rv-form__loading[hidden],.rv-form__success[hidden],.rv-form__error[hidden]{
  display:none}

/* --- Process step index ----------------------------------------------------
   `.rv-step p` (0,1,1) outranks `.rv-step__n` (0,1,0) and was overriding the
   index size wherever the number is authored as a paragraph. This restores
   the spec 4.7 treatment for both span and p markup, including the home
   pattern. */
.rv-step .rv-step__n{display:block;font-size:var(--fs-2xs);font-weight:800;
  letter-spacing:.16em;line-height:1.4;color:var(--su-a1);
  margin-block:0 var(--sp-2)}

/* --- Trust strip band -------------------------------------------------------
   The five reusable trust lines (copy deck 1.3) sit directly beneath the hero
   on the hero's own ground, so they read as part of the hero's claim rather
   than as a new section — the same treatment spec 4.3 gives the stat row.
   `.rv-section` would impose the full --sp-sec band padding, which is far too
   much for a single strip; this is the strip-height version of the same idea.
   The items themselves reuse `.rv-checks`.
   Needed by patterns/page-home.php and patterns/page-growth-systems.php. */
.rv-trustbar{border-block-start:1px solid var(--su-line);
  padding-block:var(--sp-5)}
.rv-trustbar .rv-checks{margin-block-end:0}


/* =============================================================================
   9. Defensive overrides.
   ========================================================================== */

/*
 * theme.json prints elements.heading.color as `:root :where(h1,...)`, which has
 * the same specificity (0,1,0) as `.rv-section__title`. Today the right colour
 * wins only because theme.css is enqueued after global-styles — an ordering
 * this theme does not control and should not depend on. These rules are (0,1,1)
 * and settle it outright: on a navy band, headings are white, whatever order
 * the stylesheets arrive in.
 */
.rv-s-dark h1,.rv-s-dark h2,.rv-s-dark h3,.rv-s-dark h4,
.rv-s-deep h1,.rv-s-deep h2,.rv-s-deep h3,.rv-s-deep h4,
.rv-hero h1,.rv-hero h2,.rv-hero h3{color:var(--su-text)}
.rv-s-dark .rv-section__title,.rv-s-deep .rv-section__title{color:var(--su-text)}

/* Breadcrumbs are prepended before the page's first section, which on an
   interior page is the hero. The hero carries its own nav offset; the trail
   does not, so it was rendering underneath the fixed bar. Give the trail the
   offset and take it back off the hero that follows it. */
.rv-crumbs{padding-block-start:calc(var(--nav-h) + var(--sp-4));
  background:var(--su-bg)}
/* The adjacent-sibling selector this replaces never matched: the crumb trail's
   next sibling is div.entry-content, not the hero inside it. So every interior
   page reserved the fixed nav's height twice — measured 118px of crumb block
   plus 112px of hero offset before the first kicker, about a third of a 667px
   screen, and on the dark-hero hubs it showed as a grey band wedged between the
   navy nav and the navy hero. Targeting the hero through the wrapper fixes it
   without touching either component. */
.rv-crumbs + * .rv-hero,
.rv-crumbs + * .rv-hero--page,
.rv-crumbs + .rv-hero,
.rv-crumbs + .rv-hero--page{
  padding-block-start:clamp(1.5rem,3vw,2.5rem);
  min-block-size:0;
}


/* =============================================================================
   10. RTL corrections found during the Arabic build.
   ========================================================================== */

/*
 * Price strings. Isolation is always right — it stops the bidi algorithm
 * reordering the number against the punctuation around it. Forcing LTR is only
 * right for the English string, which is a Latin run ("SAR 30,000"). The Arabic
 * string is "1,099 ريال", and inside an LTR island that lays out with ريال to
 * the RIGHT of the number, so an Arabic reader scanning right-to-left meets the
 * currency before the amount. Let direction follow the page in Arabic; the
 * digits still render left-to-right on their own, because the bidi algorithm
 * always treats them that way.
 */
[dir="rtl"] .rv-price{direction:rtl}

/*
 * Kickers are letter-spaced and uppercased, which are Latin typographic
 * devices: applied to Arabic they break the joins between letters and render
 * the word as disconnected glyphs. This is already neutralised via
 * body.rv-lang-ar; repeating it on [dir="rtl"] means a single missing body
 * class cannot ship letter-spaced Arabic across every page on the tree.
 */
[dir="rtl"] .rv-kicker,
[dir="rtl"] .rv-panel__head,
[dir="rtl"] .rv-stat__l,
[dir="rtl"] .rv-wordmark ~ *,
[dir="rtl"] .rv-step__n{letter-spacing:normal;text-transform:none}

/* Arabic needs more leading than the Latin display face; its ascenders and
   descenders are deeper and the marks sit above and below the baseline. */
[dir="rtl"] h1,[dir="rtl"] h2,[dir="rtl"] h3,[dir="rtl"] h4{line-height:1.35}
[dir="rtl"] body,[dir="rtl"] p,[dir="rtl"] li{line-height:1.8}

/* Phone and email inputs stay LTR whatever the page direction: a country code
   typed into an RTL field lands on the wrong end of the number. */
[dir="rtl"] input[type="tel"],
[dir="rtl"] input[type="email"],
[dir="rtl"] input[type="url"]{direction:ltr;text-align:start}

/*
 * Pricing tier figures. Same reasoning as .rv-price, with one extra dependency
 * worth stating because it is invisible from the CSS alone: this is a flex row,
 * so direction decides which child sits first.
 *
 *   English DOM order: cur, amt, per   + direction:ltr  -> "SAR 1,099 /month"
 *   Arabic  DOM order: amt, cur, per   + direction:rtl  -> reading right to
 *                                                          left: 1,099, ريال,
 *                                                          شهرياً
 *
 * The Arabic patterns are authored in that order deliberately. If someone
 * "fixes" the Arabic markup to match the English order, restore direction:ltr
 * for it at the same time, or the amount and the currency swap places.
 */
[dir="rtl"] .rv-tier__price{direction:rtl}

/* Directional arrows. The card-link chevron means "onward", and onward is
   leftward in Arabic. Mirrored rather than redrawn so one SVG serves both
   trees. The tribar and the wordmark above are the opposite case: they carry
   no direction and must never flip. */
[dir="rtl"] .rv-card__link svg,
[dir="rtl"] .rv-btn--link svg{transform:scaleX(-1)}

/* Inline code. It carries the cookie and parameter names on the privacy page —
   the page the consent banner links to — and had no rule at all, so it fell
   back to the UA default and read as an unstyled artefact. Always LTR: a cookie
   name is an identifier, not prose. */
code,kbd,samp{
  font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  font-size:.92em;direction:ltr;unicode-bidi:isolate;
  background:color-mix(in srgb,var(--su-line) 55%,transparent);
  border:1px solid var(--su-line);border-radius:var(--r-sm);
  padding:.1em .38em;white-space:nowrap;
}

/*
 * Table styling for BOTH markup routes.
 *
 * The money pages hand-author `div.rv-tablewrap > table.rv-table` inside a raw
 * HTML block, because only that can carry the role="region"/tabindex the
 * scrollable wrapper needs. The articles use core/table, which puts className
 * on the wrapping <figure>, not the <table> — so `.rv-table`'s own box rules
 * (width, border-collapse) landed on the figure and did nothing, and the tables
 * fell back to block-library defaults. Matching the descendant table as well
 * makes one visual contract serve both, with no markup change in twelve files.
 */
.rv-tablewrap table,
figure.rv-table > table,
.wp-block-table.rv-table > table{
  inline-size:100%;border-collapse:collapse;font-size:var(--fs-sm);
}
.rv-tablewrap th,.rv-tablewrap td,
figure.rv-table th,figure.rv-table td{
  padding:var(--sp-3) var(--sp-4);text-align:start;
  border-block-end:1px solid var(--su-line);vertical-align:top;
}
.rv-tablewrap thead th,figure.rv-table thead th{
  font-family:var(--ff-display);font-weight:800;color:var(--su-text);
  border-block-end:2px solid var(--su-line-strong);white-space:nowrap;
}
.rv-tablewrap td,figure.rv-table td{font-variant-numeric:tabular-nums}
figure.rv-table{margin-inline:0;overflow-x:auto;-webkit-overflow-scrolling:touch}

/* =============================================================================
   11. Fixes from the usability audit.
   ========================================================================== */

/*
 * Header overflow on phones. Measured: the nav row needed 385px inside a 375px
 * viewport and 384px inside 320px, so the burger was clipped off the right edge
 * on the most common device in this market. That is WCAG 2.2 AA 1.4.10 Reflow,
 * not a cosmetic nit. The wordmark's .34em tracking is a brand device and is
 * kept — it is only tightened below 480px, where the alternative is the
 * navigation not fitting on screen at all.
 */
@media (max-width:480px){
  .rv-nav__row{gap:var(--sp-2);padding-inline:var(--sp-4)}
  .rv-wordmark{font-size:16px;letter-spacing:.16em;margin-inline-end:-.16em}
  .rv-lang a,.rv-lang .is-unavailable{padding-inline:10px;font-size:13px}
  .rv-lang a[lang="ar"],.rv-lang .is-unavailable{font-size:13px}
}
@media (max-width:360px){
  .rv-wordmark{font-size:15px;letter-spacing:.1em;margin-inline-end:-.1em}
  .rv-lang a,.rv-lang .is-unavailable{padding-inline:8px}
}

/*
 * The Arabic font was downloading on every English page. The unicode-range
 * gating is correct and works; what defeated it is the language switcher
 * label — "العربية" is 14 Arabic characters, and the switcher's font stack
 * named Noto, so the browser fetched all 162 KB to render one word. Arabic is
 * removed from the Latin stacks and the switcher label falls back to the
 * system Arabic face, which every device already has. The label is unchanged:
 * it still reads العربية, because "AR" is not what a reader looks for.
 */
:root{
  --ff-display:"Archivo","Archivo Fallback Display","Arial Black","Archivo Black",system-ui,-apple-system,"Segoe UI",sans-serif;
  --ff-body:"Archivo","Archivo Fallback",system-ui,-apple-system,"Segoe UI",Calibri,Arial,sans-serif;
}
.rv-lang a[lang="ar"],.rv-lang .is-unavailable{
  font-family:system-ui,-apple-system,"Segoe UI",sans-serif;
  letter-spacing:normal;
}

/* Breadcrumb links were 15px tall. WCAG 2.2 AA 2.5.8 wants 24px minimum for a
   navigation target; padding gets them there without moving anything visually. */
.rv-crumbs a,.rv-crumbs [aria-current]{
  display:inline-block;padding-block:var(--sp-2);min-block-size:24px;
}
.rv-crumbs ol{gap:var(--sp-1) var(--sp-2)}

/* The error notice now actually renders, so it needs to look like one. */
.rv-form__error{
  margin-block-end:var(--sp-5);padding:var(--sp-4);
  border-inline-start:3px solid var(--rv-danger);
  background:color-mix(in srgb,var(--rv-danger) 7%,transparent);
  color:var(--rv-ink);font-weight:500;border-radius:var(--r-sm);
}


/* The WhatsApp float's own green is 2.81:1 against the light ground, which
   fails 1.4.11 for a component boundary. A ring in an existing ink token gives
   it a compliant edge without touching the brand colour itself. */
.rv-wa{box-shadow:var(--el-3),0 0 0 2px var(--rv-ink)}

/* scroll-padding defaulted to 0 while body padding defaulted to 64px, so a
   keyboard focus could land underneath the sticky bar before motion.js ran. */
@media (max-width:767px){
  html{scroll-padding-block-end:calc(var(--sticky-cta-h,64px) + var(--sp-4))}
}

/* The pricing ribbon letter-spaced Arabic, which breaks the script's joins. */
[dir="rtl"] .rv-tier__ribbon{letter-spacing:normal;text-transform:none}


/* The six nav links wrapped to two lines between 1024px and about 1100px, so
   the 72px bar rendered items 64px tall and the CTA 49px. Tighten the gap and
   stop the labels wrapping until the burger takes over. */
@media (min-width:1024px) and (max-width:1160px){
  .rv-nav__links{gap:14px}
  .rv-nav__links a{white-space:nowrap;font-size:14px}
  .rv-nav__row{gap:14px}
}

/* Articles wrap their body in .rv-section and the template adds another, so
   the padding applied twice — 123px of dead space, and the inner grey ground
   sat on the white page. Collapse a section nested directly inside a section. */
.rv-section .rv-section{padding-block:0;background:transparent}

/* =============================================================================
   12. Second audit pass.
   ========================================================================== */

/* Card and pricing grids had a 300px minimum inside a content box that is
   ~280px at 320px wide, so they overflowed the viewport. */
@media (max-width:400px){
  .rv-cards{grid-template-columns:1fr}
  .rv-tiers{grid-template-columns:1fr}
}

/* The hero reserved so much top padding that the primary CTA sat below the
   fold on a 667px screen on every template. Trim it where height is scarce;
   desktop is untouched. */
@media (max-height:740px) and (max-width:767px){
  .rv-hero{min-block-size:0;padding-block:var(--sp-7) var(--sp-8)}
  .rv-hero h1{margin-block:var(--sp-4) var(--sp-3)}
  .rv-hero__lead{margin-block-end:var(--sp-5)}
}

/* A hero needs its own ground, or it inherits whatever is behind it and the
   surface-scope abstraction silently stops working on it. */
.rv-hero{background:var(--su-bg)}
.rv-hero.rv-s-dark{background:var(--rv-navy)}

/* `li{line-height:1.8}` under [dir=rtl] was global, so it inflated every
   list-based control: the nav, the mobile menu, the footer and the check
   lists. Scope it to prose. */
[dir="rtl"] li{line-height:inherit}
[dir="rtl"] .rv-prose li,[dir="rtl"] .rv-section__intro li{line-height:1.9}

/* The same over-reach in the other direction: .rv-section li shrank list items
   inside navigation and card components that happen to sit in a section. */
.rv-section li{font-size:inherit}
.rv-prose li,.rv-section > .rv-wrap > ul li,.rv-section > .rv-wrap > ol li{
  font-size:var(--fs-sm);
}

/* Breadcrumbs wrapped to two lines on three-level pages at 375px. Truncate the
   middle rather than wrap — the first and last crumbs carry the orientation. */
@media (max-width:480px){
  .rv-crumbs ol{flex-wrap:nowrap;overflow:hidden}
  .rv-crumbs li{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
    max-inline-size:38vw;flex:0 1 auto}
  .rv-crumbs li:last-child{flex:1 1 auto;max-inline-size:none}
}

/* A scrolled comparison table lost its row labels, so a column of ticks became
   unreadable. Pin the row header. */
@media (max-width:767px){
  .rv-tablewrap th[scope="row"],figure.rv-table th[scope="row"]{
    position:sticky;inset-inline-start:0;z-index:1;
    background:var(--su-raised);
  }
  /* And signal that there is more to the right. */
  .rv-tablewrap{background-image:linear-gradient(to left,
    color-mix(in srgb,var(--su-line) 70%,transparent),transparent 24px);
    background-repeat:no-repeat;background-position:right center;
    background-size:24px 100%;}
  [dir="rtl"] .rv-tablewrap{background-image:linear-gradient(to right,
    color-mix(in srgb,var(--su-line) 70%,transparent),transparent 24px);
    background-position:left center;}
}

/* Footer links sat exactly on the 24px target boundary. */
.rv-footer__nav a,.rv-footer__contact a{
  display:inline-block;padding-block:var(--sp-1);min-block-size:24px;
}

/* --- 13. Hero WhatsApp + tertiary action ----------------------------------- */
/* WhatsApp now sits in the homepage hero CTA row. Above 768px there is no
   sticky bar, so this is the only inline WhatsApp path on the first screen,
   and the growth-systems link drops to a text link to keep the row at one
   primary and one secondary button as the design spec requires. It carries
   the ghost classes so that below 768px, where this rule does not apply, it
   simply stays the ghost button it was before WhatsApp moved in. */
@media (min-width:768px){
  .rv-hero__tertiary{
    align-self:center;min-block-size:24px;padding:var(--sp-2) 0;
    border:0;background:none;text-decoration:underline;text-underline-offset:.2em;
  }
  .rv-hero__tertiary:hover{background:none;border:0;text-decoration-thickness:2px}
}
@media (max-width:767px){
  /* The float and the sticky bar already carry WhatsApp on this screen. A
     third copy in the hero only pushes the fold down. */
  .rv-hero__actions .rv-btn--wa{display:none}
}
