@charset "UTF-8";
/* =============================================================
   OAW INFOTECH — Brand Design System
   Palette: 05a8cc / 006699 / ff6600 / d9e8f5 / 003f54
   No framework. No jQuery. One stylesheet.
   ============================================================= */

/* ---------- 0. FONTS (self-hosted) ----------
   These were two <link>s to fonts.googleapis.com. That stylesheet is
   render-blocking and lives on a third origin, so a cold visit paid a full
   DNS + TCP + TLS + request round trip -- measured at 462ms from here -- before
   the page could paint, and only then discovered the woff2 on a *fourth*
   origin. Self-hosted, the font rides the connection already open for the HTML.

   Variable, not four static cuts: one file covers 200-800, and the two
   `font-weight: 500` rules in this sheet finally have a real face to use
   instead of snapping to 400.

   Subsets are Google's own, so the unicode-range splits are unchanged: latin-ext
   only downloads if a page actually contains a glyph in it (some city names in
   data/cities.json do). Arabic is 121KB and loads only on RTL pages, because
   nothing else on the site is in that range.

   Both faces are SIL Open Font License 1.1; the licences ship in fonts/.
   Re-download from Google Fonts rather than editing these files. */
@font-face {
  font-family: "Plus Jakarta Sans";
  font-style: normal;
  font-weight: 200 800;
  font-display: swap;
  src: url("../fonts/plus-jakarta-sans-latin.woff2") format("woff2");
  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: "Plus Jakarta Sans";
  font-style: normal;
  font-weight: 200 800;
  font-display: swap;
  src: url("../fonts/plus-jakarta-sans-latin-ext.woff2") format("woff2");
  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;
}
@font-face {
  font-family: "Noto Kufi Arabic";
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url("../fonts/noto-kufi-arabic-arabic.woff2") format("woff2");
  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, U+102E0-102FB, U+10E60-10E7E, U+10EC2-10EC4, U+10EFC-10EFF, U+1EE00-1EE03, U+1EE05-1EE1F, U+1EE21-1EE22, U+1EE24, U+1EE27, U+1EE29-1EE32, U+1EE34-1EE37, U+1EE39, U+1EE3B, U+1EE42, U+1EE47, U+1EE49, U+1EE4B, U+1EE4D-1EE4F, U+1EE51-1EE52, U+1EE54, U+1EE57, U+1EE59, U+1EE5B, U+1EE5D, U+1EE5F, U+1EE61-1EE62, U+1EE64, U+1EE67-1EE6A, U+1EE6C-1EE72, U+1EE74-1EE77, U+1EE79-1EE7C, U+1EE7E, U+1EE80-1EE89, U+1EE8B-1EE9B, U+1EEA1-1EEA3, U+1EEA5-1EEA9, U+1EEAB-1EEBB, U+1EEF0-1EEF1;
}

/* ---------- 1. TOKENS ---------- */
:root {
  /* Brand */
  --cyan:        #05a8cc;
  --blue:        #006699;
  --orange:      #ff6600;
  --mist:        #d9e8f5;
  --navy:        #003f54;

  /* Derived ink / surfaces */
  --navy-900:    #002936;
  --blue-700:    #005580;
  --orange-600:  #e65c00;
  --orange-ink:  #b34400;   /* AA-safe orange for small text on white and tints */
  --cyan-50:     #eaf7fb;
  --mist-50:     #f2f7fc;

  --bg:          #ffffff;
  --bg-soft:     var(--mist-50);
  --surface:     #ffffff;
  --ink:         #0d2b38;
  --ink-soft:    #47616d;
  /* Strongest text colour. Unlike --navy (a fixed brand hue) this one flips
     with the theme, so components never end up painting navy on near-black. */
  --ink-strong:  var(--navy);
  /* Label colour for bright accent fills (warm gradient, WhatsApp green).
     Fixed in both themes because those fills do not change with the theme. */
  --ink-on-bright: #0d2b38;
  --ink-mute:    #5a7180;
  --line:        #e2ebf3;
  --line-strong: #c9dcea;

  /* Gradients */
  --grad-brand:  linear-gradient(135deg, #09708a 0%, var(--blue) 55%, var(--navy) 100%);
  --grad-warm:   linear-gradient(135deg, var(--orange) 0%, #ff9147 100%);
  /* Warm ramp for fills that carry a label. --grad-warm is too light to put
     white on (2.2-2.4:1), which is why the buttons used to run a near-black
     label instead; this ramp is the same hue family taken down far enough that
     white clears AA at both ends (4.9:1 light end, 7.0:1 dark end). --grad-warm
     stays bright for the hairline rules and bars, which carry no text. */
  --grad-warm-deep: linear-gradient(135deg, #c2490c 0%, #a03500 100%);
  --grad-deep:   linear-gradient(160deg, var(--navy) 0%, var(--navy-900) 100%);
  --grad-text:   linear-gradient(100deg, var(--blue) 0%, #0596b5 100%);

  /* Type */
  --font: "Plus Jakarta Sans", ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Arial, sans-serif;
  --fs-hero:  clamp(2.35rem, 1.25rem + 4.1vw, 4.35rem);
  --fs-h1:    clamp(2rem, 1.3rem + 2.6vw, 3.15rem);
  --fs-h2:    clamp(1.7rem, 1.2rem + 1.9vw, 2.55rem);
  --fs-h3:    clamp(1.25rem, 1.05rem + 0.7vw, 1.5rem);
  --fs-h4:    clamp(1.08rem, 1rem + 0.3vw, 1.2rem);
  --fs-lead:  clamp(1.03rem, 0.97rem + 0.4vw, 1.2rem);
  --fs-body:  1rem;
  --fs-sm:    0.9rem;
  --fs-xs:    0.795rem;

  /* Space (8pt rhythm) */
  --s-1: .25rem; --s-2: .5rem;  --s-3: .75rem; --s-4: 1rem;
  --s-5: 1.5rem; --s-6: 2rem;   --s-7: 3rem;   --s-8: 4rem;
  --section-y: clamp(3.5rem, 2rem + 6vw, 7rem);
  --container: 1200px;
  --gutter: clamp(1.15rem, .6rem + 2vw, 2.5rem);

  /* Shape & depth */
  --r-sm: 10px; --r-md: 16px; --r-lg: 24px; --r-xl: 32px; --r-pill: 999px;
  --sh-xs: 0 1px 2px rgba(0,63,84,.06), 0 1px 3px rgba(0,63,84,.05);
  --sh-sm: 0 2px 6px rgba(0,63,84,.06), 0 6px 16px -6px rgba(0,63,84,.12);
  --sh-md: 0 10px 30px -12px rgba(0,63,84,.22), 0 2px 8px rgba(0,63,84,.06);
  --sh-lg: 0 30px 60px -24px rgba(0,63,84,.30), 0 6px 18px rgba(0,63,84,.07);
  --sh-brand: 0 14px 30px -12px rgba(0,102,153,.55);
  --sh-warm:  0 14px 30px -12px rgba(194,73,12,.45);

  --ease: cubic-bezier(.22,1,.36,1);
  --dur: .45s;
}

/* ---------- 2. RESET ---------- */
*, *::before, *::after { box-sizing: border-box; }
* { margin: 0; }
html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; scroll-padding-top: 6rem; }
body {
  font-family: var(--font);
  font-size: var(--fs-body);
  line-height: 1.65;
  color: var(--ink);
  background: var(--bg);
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  overflow-x: hidden;
}
img, svg, video, iframe { display: block; max-width: 100%; height: auto; }
button, input, textarea, select { font: inherit; color: inherit; }
button { cursor: pointer; background: none; border: 0; }
a { color: var(--blue); text-decoration: none; transition: color .2s; }
a:hover { color: var(--orange-ink); }
ul[class], ol[class] { list-style: none; padding: 0; }
h1, h2, h3, h4, h5 {
  font-weight: 800; line-height: 1.14; letter-spacing: -.022em;
  color: var(--ink-strong); text-wrap: balance;
}
p { text-wrap: pretty; }
:focus-visible { outline: 3px solid var(--cyan); outline-offset: 3px; border-radius: 4px; }
::selection { background: var(--cyan); color: #fff; }
hr { border: 0; border-top: 1px solid var(--line); }
.sr-only {
  position: absolute; width: 1px; height: 1px; padding: 0; overflow: hidden;
  clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}
.skip-link {
  position: absolute; top: -100%; left: var(--s-4); z-index: 200;
  padding: .7rem 1.2rem; border-radius: var(--r-pill);
  background: var(--navy); color: #fff; font-weight: 700;
}
.skip-link:focus { top: var(--s-3); color: #fff; }

/* ---------- 3. LAYOUT ---------- */
.container { width: 100%; max-width: var(--container); margin-inline: auto; padding-inline: var(--gutter); }
.container--wide { max-width: 1400px; }
.container--narrow { max-width: 880px; }
.section { padding-block: var(--section-y); position: relative; }
.section--tight { padding-block: clamp(2.5rem, 1.5rem + 4vw, 4.5rem); }
.section--soft { background: var(--bg-soft); }
.section--tint { background: linear-gradient(180deg, var(--cyan-50), #fff); }
.section--deep { background: var(--grad-deep); color: #cfe3ec; }
.section--deep h1, .section--deep h2, .section--deep h3, .section--deep h4 { color: #fff; }
.below { content-visibility: auto; contain-intrinsic-size: auto 720px; }

.grid { display: grid; gap: var(--s-5); }
.g-2 { grid-template-columns: repeat(auto-fit, minmax(min(100%, 20rem), 1fr)); }
.g-3 { grid-template-columns: repeat(auto-fit, minmax(min(100%, 17rem), 1fr)); }
.g-4 { grid-template-columns: repeat(auto-fit, minmax(min(100%, 13rem), 1fr)); }
.split { display: grid; gap: clamp(2rem, 1rem + 4vw, 4.5rem); align-items: center; }
@media (min-width: 62rem) {
  .split { grid-template-columns: 1fr 1fr; }
  .split--7-5 { grid-template-columns: 1.35fr 1fr; }
  .split--5-7 { grid-template-columns: 1fr 1.35fr; }
}
.stack > * + * { margin-top: var(--s-4); }
.center { text-align: center; }

/* ---------- 4. TYPE HELPERS ---------- */
.eyebrow {
  display: inline-flex; align-items: center; gap: .5rem;
  font-size: var(--fs-xs); font-weight: 700; letter-spacing: .14em; text-transform: uppercase;
  color: var(--orange-ink);
}
.eyebrow::before { content: ""; width: 26px; height: 2px; border-radius: 2px; background: var(--grad-warm); }
.section--deep .eyebrow { color: #5cc6e3; }
.section--deep .eyebrow::before { background: #5cc6e3; }
.h-hero { font-size: var(--fs-hero); letter-spacing: -.035em; line-height: 1.04; }
.h1 { font-size: var(--fs-h1); }
.h2 { font-size: var(--fs-h2); }
.h3 { font-size: var(--fs-h3); }
.h4 { font-size: var(--fs-h4); font-weight: 700; }
.lead { font-size: var(--fs-lead); color: var(--ink-soft); line-height: 1.6; }
.section--deep .lead, .section--deep p { color: #b7d2de; }
.muted { color: var(--ink-mute); }
.small { font-size: var(--fs-sm); }
.grad-text {
  background: var(--grad-text); -webkit-background-clip: text; background-clip: text;
  -webkit-text-fill-color: transparent; color: transparent;
}
.mark { position: relative; display: inline-block; isolation: isolate; }
.mark::after {
  content: ""; position: absolute; inset-inline: -.08em; bottom: .06em; height: .32em; z-index: -1;
  background: linear-gradient(90deg, rgba(255,102,0,.30), rgba(5,168,204,.30));
  border-radius: .2em;
}
.section-head { max-width: 47rem; }
.section-head .h2 { margin-top: var(--s-3); }
.section-head > p { margin-top: var(--s-4); }
.section-head--center { margin-inline: auto; text-align: center; }
.section-head--center .eyebrow { justify-content: center; }

/* ---------- 5. BUTTONS ---------- */
.btn {
  --btn-bg: var(--grad-warm-deep); --btn-fg: #fff; --btn-bd: transparent; --btn-sh: var(--sh-warm);
  display: inline-flex; align-items: center; justify-content: center; gap: .6rem;
  padding: .85rem 1.6rem; border-radius: var(--r-pill);
  font-size: .97rem; font-weight: 700; letter-spacing: -.01em; text-align: center;
  color: var(--btn-fg); background: var(--btn-bg); border: 1.5px solid var(--btn-bd);
  box-shadow: var(--btn-sh);
  transition: transform var(--dur) var(--ease), box-shadow var(--dur) var(--ease),
              background-color .25s, color .25s, border-color .25s;
}
.btn:hover { color: var(--btn-fg); transform: translateY(-3px); box-shadow: 0 20px 38px -14px rgba(194,73,12,.55); }
.btn:active { transform: translateY(-1px); }
.btn svg { width: 1.05em; height: 1.05em; flex: none; transition: transform .3s var(--ease); }
.btn:hover svg { transform: translateX(4px); }
.btn--brand { --btn-bg: var(--grad-brand); --btn-fg: #fff; --btn-sh: var(--sh-brand); }
.btn--brand:hover { box-shadow: 0 20px 38px -14px rgba(0,102,153,.6); }
.btn--ghost { --btn-bg: transparent; --btn-fg: var(--navy); --btn-bd: var(--line-strong); --btn-sh: none; }
.btn--ghost:hover { --btn-fg: var(--blue); border-color: var(--blue); box-shadow: var(--sh-sm); }
.btn--light { --btn-bg: #fff; --btn-fg: var(--navy); --btn-sh: var(--sh-md); }
.btn--light:hover { --btn-fg: var(--blue); box-shadow: var(--sh-lg); }
.btn--onDark { --btn-bg: rgba(255,255,255,.06); --btn-fg: #fff; --btn-bd: rgba(255,255,255,.34); --btn-sh: none; }
.btn--onDark:hover { --btn-bg: #fff; --btn-fg: var(--navy); box-shadow: 0 18px 34px -14px rgba(0,0,0,.5); }
.btn--sm { padding: .6rem 1.15rem; font-size: .88rem; }
.btn--lg { padding: 1.02rem 2rem; font-size: 1.03rem; }
.btn--block { width: 100%; }
.btn[disabled] { opacity: .6; pointer-events: none; }
.btn-row { display: flex; flex-wrap: wrap; gap: var(--s-3); align-items: center; }

.link-arrow { display: inline-flex; align-items: center; gap: .45rem; font-weight: 700; color: var(--blue); }
.link-arrow svg { width: 1.05em; height: 1.05em; transition: transform .3s var(--ease); }
.link-arrow:hover svg { transform: translateX(5px); }
:root[data-theme="dark"] .link-arrow { color: #5cc6e3; }

/* ---------- 6. PILLS ---------- */
.pill {
  display: inline-flex; align-items: center; gap: .5rem;
  padding: .42rem .95rem; border-radius: var(--r-pill);
  font-size: var(--fs-xs); font-weight: 700; letter-spacing: .02em;
  background: #fff; border: 1px solid var(--line); color: var(--navy); box-shadow: var(--sh-xs);
}
.pill--glass { background: rgba(255,255,255,.75); backdrop-filter: blur(10px); border-color: rgba(255,255,255,.65); }
.pill--dark { background: rgba(255,255,255,.06); border-color: rgba(255,255,255,.22); color: #fff; box-shadow: none; }
.dot { width: 7px; height: 7px; border-radius: 50%; background: var(--orange); flex: none; }
.dot--live { animation: pulse 2.6s var(--ease) infinite; }
@keyframes pulse {
  0%, 100% { box-shadow: 0 0 0 3px rgba(255,102,0,.20); }
  50%      { box-shadow: 0 0 0 9px rgba(255,102,0,0); }
}

/* ---------- 7. HEADER ---------- */
.site-header {
  position: sticky; top: 0; z-index: 100;
  background: rgba(255,255,255,.82); backdrop-filter: blur(14px) saturate(160%);
  border-bottom: 1px solid transparent;
  transition: box-shadow .3s, border-color .3s, background-color .3s;
}
.site-header.is-stuck { box-shadow: var(--sh-sm); border-bottom-color: var(--line); background: rgba(255,255,255,.94); }
.nav {
  display: flex; align-items: center; justify-content: space-between; gap: var(--s-5);
  min-height: 76px;
}
.brand { display: inline-flex; align-items: center; gap: .65rem; flex: none; }
.brand img { height: 42px; width: auto; }
.nav-links { display: none; align-items: center; gap: clamp(.4rem, .1rem + 1vw, 1.35rem); }
.nav-links a {
  position: relative; padding: .45rem .2rem;
  font-size: .96rem; font-weight: 600; color: var(--navy);
}
.nav-links a::after {
  content: ""; position: absolute; left: 0; right: 100%; bottom: -2px; height: 2px; border-radius: 2px;
  background: var(--grad-warm); transition: right .35s var(--ease);
}
.nav-links a:hover::after, .nav-links a[aria-current="page"]::after { right: 0; }
.nav-links a[aria-current="page"] { color: var(--blue); }
.nav-actions { display: flex; align-items: center; gap: var(--s-3); }
.nav-actions .btn { display: none; }
.nav-toggle {
  display: inline-flex; flex-direction: column; justify-content: center; gap: 5px;
  width: 46px; height: 42px; padding: 0 11px; border-radius: 12px;
  border: 1px solid var(--line); background: #fff; box-shadow: var(--sh-xs);
}
.nav-toggle span { display: block; height: 2px; border-radius: 2px; background: var(--navy); transition: transform .35s var(--ease), opacity .2s; }
.nav-toggle span:nth-child(2) { width: 70%; }
.nav-toggle[aria-expanded="true"] span:nth-child(1) { transform: translateY(7px) rotate(45deg); }
.nav-toggle[aria-expanded="true"] span:nth-child(2) { opacity: 0; }
.nav-toggle[aria-expanded="true"] span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }

.drawer {
  position: fixed; inset: 76px 0 auto; z-index: 99;
  display: grid; gap: .2rem;
  padding: var(--s-5) var(--gutter) var(--s-6);
  background: #fff; border-bottom: 1px solid var(--line); box-shadow: var(--sh-lg);
  transform: translateY(-120%); visibility: hidden;
  transition: transform .45s var(--ease), visibility .45s;
  max-height: calc(100vh - 76px); overflow-y: auto;
}
.drawer.is-open { transform: translateY(0); visibility: visible; }
.drawer a {
  padding: .85rem .2rem; font-size: 1.06rem; font-weight: 700; color: var(--navy);
  border-bottom: 1px solid var(--line);
}
.drawer a:last-of-type { border-bottom: 0; }
.drawer .btn { margin-top: var(--s-4); }
@media (min-width: 62rem) {
  .nav-links { display: flex; }
  .nav-actions .btn { display: inline-flex; }
  .nav-toggle, .drawer { display: none; }
}

/* ---------- 8. HERO ---------- */
.hero { position: relative; overflow: clip; padding-block: clamp(3rem, 1.5rem + 6vw, 6.5rem) var(--section-y); }
.hero::before, .hero::after {
  content: ""; position: absolute; z-index: -2; border-radius: 50%; filter: blur(70px); opacity: .5;
  pointer-events: none;
}
.hero::before { width: 44rem; height: 44rem; top: -22rem; right: -14rem; background: radial-gradient(circle, rgba(5,168,204,.55), transparent 65%); }
.hero::after  { width: 36rem; height: 36rem; bottom: -20rem; left: -14rem; background: radial-gradient(circle, rgba(255,102,0,.30), transparent 65%); }
.hero-grid {
  position: absolute; inset: 0; z-index: -3; opacity: .5;
  background-image: linear-gradient(var(--mist) 1px, transparent 1px), linear-gradient(90deg, var(--mist) 1px, transparent 1px);
  background-size: 68px 68px;
  mask-image: radial-gradient(ellipse 80% 60% at 50% 0%, #000 40%, transparent 100%);
  -webkit-mask-image: radial-gradient(ellipse 80% 60% at 50% 0%, #000 40%, transparent 100%);
}
.hero-copy > * + * { margin-top: var(--s-5); }
.hero-copy .btn-row { margin-top: var(--s-6); }
.hero-proof { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-5); margin-top: var(--s-7); }
.hero-proof-item { display: flex; flex-direction: column; }
.hero-proof-item b { font-size: 1.5rem; font-weight: 800; color: var(--navy); line-height: 1.1; letter-spacing: -.03em; }
/* Direct child. `<b><span data-count>100</span>+</b>` puts the counter inside
   the number, so an unscoped `span` rule styled the digits as the label: the
   count rendered at 12.7px uppercase grey next to a 24px navy suffix. */
.hero-proof-item > span { font-size: var(--fs-xs); font-weight: 600; letter-spacing: .06em; text-transform: uppercase; color: var(--ink-mute); }
.hero-proof-sep { width: 1px; align-self: stretch; background: var(--line-strong); }

.hero-art { position: relative; }
.hero-art-frame {
  position: relative; border-radius: var(--r-xl); overflow: hidden;
  background: var(--grad-brand); box-shadow: var(--sh-lg);
  padding: clamp(1rem, .4rem + 2vw, 2rem);
}
.hero-art-frame::after {
  content: ""; position: absolute; inset: 0;
  background: radial-gradient(120% 80% at 20% 0%, rgba(255,255,255,.22), transparent 60%);
  pointer-events: none;
}
.hero-art-frame img { border-radius: var(--r-lg); width: 100%; }
.float-card {
  position: absolute; display: flex; align-items: center; gap: .7rem;
  padding: .7rem .95rem; border-radius: var(--r-md);
  background: rgba(255,255,255,.92); backdrop-filter: blur(8px);
  box-shadow: var(--sh-md); font-size: var(--fs-sm); font-weight: 700; color: var(--navy);
  animation: bob 6s ease-in-out infinite;
}
.float-card i { display: grid; place-items: center; width: 34px; height: 34px; border-radius: 10px; background: var(--cyan-50); color: var(--blue); flex: none; }
.float-card i svg { width: 18px; height: 18px; }
.float-card--tl { top: 8%; left: -6%; }
.float-card--br { bottom: 9%; right: -5%; animation-delay: -3s; }
@keyframes bob { 0%,100% { transform: translateY(0); } 50% { transform: translateY(-12px); } }
@media (max-width: 61.9375rem) {
  .float-card--tl { left: 2%; }
  .float-card--br { right: 2%; }
}
@media (max-width: 30rem) { .float-card { display: none; } }

/* ---------- 9. CARDS ---------- */
.card {
  position: relative; height: 100%;
  padding: clamp(1.4rem, 1rem + 1.2vw, 2.1rem);
  border-radius: var(--r-lg); background: var(--surface);
  border: 1px solid var(--line); box-shadow: var(--sh-xs);
  transition: transform var(--dur) var(--ease), box-shadow var(--dur) var(--ease), border-color var(--dur);
  overflow: hidden;
}
.card::before {
  content: ""; position: absolute; inset: 0 0 auto; height: 3px;
  background: var(--grad-brand); transform: scaleX(0); transform-origin: left;
  transition: transform .5s var(--ease);
}
.card:hover { transform: translateY(-6px); box-shadow: var(--sh-md); border-color: var(--line-strong); }
.card:hover::before { transform: scaleX(1); }
.card .h4 { margin-bottom: var(--s-2); }
.card p { color: var(--ink-soft); font-size: var(--fs-sm); }
.card--alt::before { background: var(--grad-warm); }
.card--flat { box-shadow: none; }
.card--dark {
  background: rgba(255,255,255,.045); border-color: rgba(255,255,255,.12); color: #b7d2de;
}
.card--dark:hover { background: rgba(255,255,255,.07); border-color: rgba(255,255,255,.22); }

.icon-tile {
  display: grid; place-items: center; width: 56px; height: 56px; margin-bottom: var(--s-4);
  border-radius: 18px; color: #fff; background: var(--grad-brand); box-shadow: var(--sh-brand);
  transition: transform var(--dur) var(--ease);
}
.icon-tile svg { width: 26px; height: 26px; }
.card:hover .icon-tile { transform: rotate(-6deg) scale(1.06); }
.icon-tile--warm { background: var(--grad-warm-deep); box-shadow: var(--sh-warm); }
.icon-tile--soft { background: var(--cyan-50); color: var(--blue); box-shadow: none; }
.icon-tile--sm { width: 44px; height: 44px; border-radius: 14px; margin-bottom: var(--s-3); }
.icon-tile--sm svg { width: 20px; height: 20px; }

/* Numbered process steps */
.step { position: relative; padding-left: 4.6rem; }
.step + .step { margin-top: var(--s-6); }
.step-num {
  position: absolute; left: 0; top: 0;
  display: grid; place-items: center; width: 56px; height: 56px; border-radius: 18px;
  font-size: 1.15rem; font-weight: 800; color: #fff; background: var(--grad-brand);
  box-shadow: var(--sh-brand);
}
.step:nth-child(2) .step-num { background: var(--grad-warm-deep); color: #fff; box-shadow: var(--sh-warm); }
.step:nth-child(3) .step-num { background: linear-gradient(135deg, #09708a, var(--blue)); }
.step::after {
  content: ""; position: absolute; left: 27px; top: 62px; bottom: -2rem; width: 2px;
  background: linear-gradient(180deg, var(--line-strong), transparent);
}
.step:last-child::after { display: none; }
.step p { color: var(--ink-soft); margin-top: var(--s-2); }

/* ---------- 10. STATS ---------- */
.stats {
  display: grid; gap: 1px; overflow: hidden;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 12rem), 1fr));
  border-radius: var(--r-lg); background: var(--line);
  border: 1px solid var(--line); box-shadow: var(--sh-sm);
}
.stat { background: #fff; padding: clamp(1.4rem, 1rem + 1vw, 2.2rem); text-align: center; }
.stat b {
  display: block; font-size: clamp(2.1rem, 1.5rem + 2vw, 3rem); font-weight: 800;
  line-height: 1; letter-spacing: -.04em;
  background: var(--grad-text); -webkit-background-clip: text; background-clip: text;
  -webkit-text-fill-color: transparent;
}
/* Direct child, for the same reason as .hero-proof-item above — this one was
   worse, rendering a 14.4px grey digit above a 48px '+' in every stats band. */
.stat > span { display: block; margin-top: .55rem; font-size: var(--fs-sm); font-weight: 600; color: var(--ink-mute); }
.section--deep .stats { background: rgba(255,255,255,.10); border-color: rgba(255,255,255,.14); box-shadow: none; }
.section--deep .stat { background: rgba(0,41,54,.55); }
.section--deep .stat b { background: linear-gradient(100deg, #fff, var(--cyan)); -webkit-background-clip: text; background-clip: text; }
.section--deep .stat > span { color: #8fb4c4; }

/* ---------- 11. PORTFOLIO ---------- */
.filters { display: flex; flex-wrap: wrap; justify-content: center; gap: .5rem; margin-top: var(--s-6); }
.filters button {
  padding: .55rem 1.25rem; border-radius: var(--r-pill);
  font-size: .9rem; font-weight: 700; color: var(--ink-soft);
  background: #fff; border: 1px solid var(--line); transition: all .25s;
}
.filters button:hover { color: var(--blue); border-color: var(--line-strong); }
.filters button[aria-pressed="true"] { color: #fff; background: var(--grad-brand); border-color: transparent; box-shadow: var(--sh-brand); }

.work-grid { margin-top: var(--s-6); }
/* The label sits under the shot, not over it.
   It used to be white text on a scrim covering the whole card at .82 opacity,
   which is a lot of navy to put over the one thing this section exists to
   show — every screenshot read as a murky rectangle, and the contrast of the
   title depended on whatever pixels happened to be behind it. On its own
   surface the type is deterministic in both themes and the work is visible. */
.work {
  position: relative; display: flex; flex-direction: column; overflow: hidden;
  border-radius: var(--r-lg); background: var(--surface);
  border: 1px solid var(--line); box-shadow: var(--sh-xs);
  transition: transform var(--dur) var(--ease), box-shadow var(--dur) var(--ease),
              border-color .3s, opacity .3s, scale .3s;
}
/* aspect-ratio lives here now, so the grid still reserves the row height
   before any image has loaded */
.work-shot { position: relative; aspect-ratio: 4 / 3; overflow: hidden; background: var(--bg-soft); }
.work-shot img { width: 100%; height: 100%; object-fit: cover; transition: transform .7s var(--ease); }
.work-shot::after {
  content: ""; position: absolute; inset: 0; opacity: 0;
  background: linear-gradient(to top, rgba(0,41,54,.30), transparent 60%);
  transition: opacity .4s var(--ease);
}
.work:hover { transform: translateY(-6px); box-shadow: var(--sh-md); border-color: var(--line-strong); }
.work:hover .work-shot img { transform: scale(1.05); }
.work:hover .work-shot::after { opacity: 1; }
.work-meta { padding: clamp(.9rem, .6rem + .8vw, 1.15rem) clamp(1rem, .7rem + .8vw, 1.25rem) clamp(1.05rem, .7rem + .9vw, 1.35rem); }
.work-meta span {
  display: inline-block; margin-bottom: .45rem;
  font-size: .7rem; font-weight: 700; letter-spacing: .12em; text-transform: uppercase;
  color: var(--ink-mute);
}
.work-meta h3 { font-size: 1.02rem; color: var(--ink-strong); letter-spacing: -.02em; line-height: 1.25; }
.work.is-hidden { display: none; }

/* ---------- 12. TESTIMONIALS ---------- */
.rail {
  display: grid; grid-auto-flow: column; grid-auto-columns: min(86%, 25rem);
  gap: var(--s-5); overflow-x: auto; scroll-snap-type: x mandatory;
  padding: .5rem .25rem var(--s-5);
  scrollbar-width: thin; scrollbar-color: var(--line-strong) transparent;
}
.rail > * { scroll-snap-align: center; }
.rail::-webkit-scrollbar { height: 6px; }
.rail::-webkit-scrollbar-thumb { background: var(--line-strong); border-radius: 99px; }
@media (min-width: 62rem) {
  .rail { grid-auto-flow: row; grid-auto-columns: auto; grid-template-columns: repeat(3, 1fr); overflow: visible; padding: 0; }
}
.quote { display: flex; flex-direction: column; }
.quote-mark { font-size: 3rem; line-height: .8; font-weight: 800; color: var(--cyan); opacity: .4; }
.quote p { flex: 1; margin-block: var(--s-3); color: var(--ink-soft); }
.quote-by { display: flex; align-items: center; gap: .8rem; padding-top: var(--s-4); border-top: 1px solid var(--line); }
.quote-by img { width: 46px; height: 46px; border-radius: 50%; object-fit: cover; flex: none; }
.quote-by b { display: block; font-size: .95rem; color: var(--ink-strong); }
.quote-by span { display: block; font-size: var(--fs-xs); color: var(--ink-mute); }
.stars { display: flex; gap: 2px; color: var(--orange); }
.stars svg { width: 15px; height: 15px; }

/* ---------- 13. LOGO MARQUEE ---------- */
.marquee { position: relative; overflow: hidden; padding-block: var(--s-2);
  mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent);
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent);
}
.marquee-track { display: flex; width: max-content; gap: clamp(2rem, 1rem + 4vw, 5rem); animation: slide 34s linear infinite; }
.marquee:hover .marquee-track { animation-play-state: paused; }
/* The button lives outside .marquee because that element is overflow:hidden
   and carries an edge mask, both of which would eat it. */
.marquee-wrap { position: relative; }
.marquee-wrap .marquee-toggle {
  position: absolute; inset-block-start: 50%; inset-inline-end: 0;
  transform: translateY(-50%);
  display: grid; place-items: center; width: 34px; height: 34px;
  border-radius: 50%; border: 1px solid var(--hairline-strong);
  background: var(--surface); color: var(--ink-mute);
  transition: color .25s, border-color .25s;
}
/* No resting opacity: fading this to .55 dropped the glyph to 2.47:1, under the
   3:1 that SC 1.4.11 wants for a control the user has to find. */
.marquee-wrap .marquee-toggle:hover,
.marquee-wrap .marquee-toggle:focus-visible { color: var(--blue); border-color: var(--blue); }
.marquee-toggle .i-play, .is-paused .marquee-toggle .i-pause { display: none; }
.is-paused .marquee-toggle .i-play { display: grid; }
.marquee-wrap.is-paused .marquee-track { animation-play-state: paused; }
.marquee img {
  height: clamp(34px, 26px + 1.4vw, 46px); width: auto; object-fit: contain;
  filter: grayscale(1); opacity: .55; transition: filter .3s, opacity .3s, transform .3s;
}
.marquee img:hover { filter: none; opacity: 1; transform: scale(1.06); }
@keyframes slide { to { transform: translateX(-50%); } }

/* ---------- 14. FORM ---------- */
.form-card {
  padding: clamp(1.5rem, 1rem + 2vw, 2.75rem);
  border-radius: var(--r-xl); background: #fff;
  border: 1px solid var(--line); box-shadow: var(--sh-lg);
}
.field { display: block; margin-bottom: var(--s-4); }
.field span { display: block; margin-bottom: .4rem; font-size: var(--fs-sm); font-weight: 700; color: var(--navy); }
.field input, .field textarea {
  width: 100%; padding: .85rem 1.05rem; border-radius: var(--r-sm);
  background: var(--mist-50); border: 1.5px solid var(--line); color: var(--ink);
  transition: border-color .2s, background-color .2s, box-shadow .2s;
}
.field textarea { min-height: 8rem; resize: vertical; }
.field input::placeholder, .field textarea::placeholder { color: var(--ink-mute); }
.field input:focus, .field textarea:focus {
  outline: 0; background: #fff; border-color: var(--cyan); box-shadow: 0 0 0 4px rgba(5,168,204,.15);
}
.field-row { display: grid; gap: var(--s-4); }
@media (min-width: 40rem) { .field-row { grid-template-columns: 1fr 1fr; } }
.form-note { margin-top: var(--s-3); font-size: var(--fs-xs); color: var(--ink-mute); line-height: 1.6; }
.form-note a { color: var(--ink-soft); text-decoration: underline; text-underline-offset: 2px; }
.form-note a:hover { color: var(--blue); }
.form-note svg, .prose svg, p > svg { display: inline-block; vertical-align: -2px; }

/* reCAPTCHA badge is hidden (it collides with the floating buttons on mobile).
   Google permits this as long as the attribution below every form stays visible. */
.grecaptcha-badge { visibility: hidden !important; }
/* Submit outcomes are reported by toasts (section 27), not an inline panel. */

.contact-list { display: grid; gap: var(--s-4); }
.contact-item { display: flex; gap: var(--s-4); align-items: flex-start; }
.contact-item .icon-tile { margin: 0; }
.contact-item b { display: block; margin-bottom: .15rem; font-size: var(--fs-xs); letter-spacing: .1em; text-transform: uppercase; color: var(--orange-ink); }
.contact-item a, .contact-item p { color: var(--ink); font-weight: 600; }
.contact-item a:hover { color: var(--blue); }
.section--deep .contact-item b { color: var(--cyan); }
.section--deep .contact-item a, .section--deep .contact-item p { color: #dcecf3; }
.section--deep .contact-item a:hover { color: #fff; }

/* ---------- 15. ACCORDION ---------- */
.accordion { display: grid; gap: var(--s-3); }
.acc {
  border: 1px solid var(--line); border-radius: var(--r-md); background: #fff;
  box-shadow: var(--sh-xs); overflow: hidden; transition: border-color .25s, box-shadow .25s;
}
.acc[open] { border-color: var(--line-strong); box-shadow: var(--sh-sm); }
.acc summary {
  display: flex; align-items: center; gap: .9rem; cursor: pointer; list-style: none;
  padding: 1.1rem 1.25rem; font-weight: 700; color: var(--navy);
}
.acc summary::-webkit-details-marker { display: none; }
.acc summary::after {
  content: ""; margin-left: auto; flex: none; width: 10px; height: 10px;
  border-right: 2.5px solid var(--blue); border-bottom: 2.5px solid var(--blue);
  transform: rotate(45deg) translateY(-2px); transition: transform .3s var(--ease);
}
.acc[open] summary::after { transform: rotate(-135deg) translateY(-2px); }
.acc summary:hover { color: var(--blue); }
.acc-i { display: grid; place-items: center; width: 34px; height: 34px; border-radius: 10px; background: var(--cyan-50); color: var(--blue); flex: none; }
.acc-i svg { width: 17px; height: 17px; }
.acc-body { padding: 0 1.25rem 1.25rem 4.15rem; color: var(--ink-soft); }
.acc-body ul { padding-left: 1.1rem; list-style: disc; }
.acc-body a { font-weight: 600; }
@media (max-width: 30rem) { .acc-body { padding-left: 1.25rem; } }

/* ---------- 16. TEAM ---------- */
.person { text-align: center; }
.person-photo {
  position: relative; margin-bottom: var(--s-4); border-radius: var(--r-lg); overflow: hidden;
  background: linear-gradient(160deg, var(--mist), var(--cyan-50));
  /* Source photos are 465x598 (ratio 0.78). A square frame cropped ~22% off the
     bottom of every portrait; 4/5 matches the source so `cover` crops almost
     nothing and nobody loses their shoulders. */
  aspect-ratio: 4 / 5;
  box-shadow: var(--sh-sm); transition: transform var(--dur) var(--ease), box-shadow var(--dur) var(--ease);
}
.person-photo img { width: 100%; height: 100%; object-fit: cover; object-position: center top; }
.person:hover .person-photo { transform: translateY(-6px); box-shadow: var(--sh-md); }
.person h3 { font-size: 1.1rem; }
.person span { font-size: var(--fs-sm); font-weight: 600; color: var(--orange-ink); }

/* ---------- 17. PAGE HEAD (inner pages) ---------- */
.pagehead { position: relative; overflow: clip; padding-block: clamp(2.75rem, 1.5rem + 5vw, 5rem); background: var(--grad-deep); }
.pagehead::before {
  content: ""; position: absolute; width: 40rem; height: 40rem; top: -26rem; right: -12rem; border-radius: 50%;
  background: radial-gradient(circle, rgba(5,168,204,.42), transparent 62%); filter: blur(50px);
}
.pagehead::after {
  content: ""; position: absolute; inset: 0; opacity: .18;
  background-image: linear-gradient(rgba(255,255,255,.6) 1px, transparent 1px), linear-gradient(90deg, rgba(255,255,255,.6) 1px, transparent 1px);
  background-size: 70px 70px;
  mask-image: radial-gradient(ellipse 70% 100% at 20% 50%, #000, transparent);
  -webkit-mask-image: radial-gradient(ellipse 70% 100% at 20% 50%, #000, transparent);
}
.pagehead .container { position: relative; z-index: 1; }
.pagehead h1 { color: #fff; font-size: var(--fs-h1); }
.pagehead p { color: #b7d2de; max-width: 44rem; margin-top: var(--s-4); }
.crumbs { display: flex; flex-wrap: wrap; gap: .45rem; margin-bottom: var(--s-4); font-size: var(--fs-sm); color: var(--ink-mute); }
.crumbs a { color: var(--blue); font-weight: 600; }
.crumbs a:hover { color: var(--orange-ink); }
.crumbs li + li::before { content: "/"; margin-right: .45rem; color: var(--ink-mute); }
/* the same crumbs sit on the deep navy pagehead on most pages, but on plain
   white on the location pages — so the light-on-dark set is scoped, not global */
.pagehead .crumbs { color: #b7d2de; }
.pagehead .crumbs a { color: #5cc6e3; }
.pagehead .crumbs a:hover { color: #fff; }
.pagehead .crumbs li + li::before { color: #7ea5b6; }
.crumbs ol, .crumbs ul { display: flex; flex-wrap: wrap; gap: .45rem; list-style: none; padding: 0; margin: 0; }

/* ---------- 18. CTA BAND ---------- */
.cta {
  position: relative; overflow: hidden; border-radius: var(--r-xl);
  padding: clamp(2rem, 1.2rem + 3vw, 3.75rem);
  background: var(--grad-brand); box-shadow: var(--sh-lg); color: #fff;
}
.cta::before {
  content: ""; position: absolute; width: 26rem; height: 26rem; right: -8rem; top: -12rem; border-radius: 50%;
  background: radial-gradient(circle, rgba(255,102,0,.55), transparent 62%); filter: blur(40px);
}
.cta::after {
  content: ""; position: absolute; inset: 0; opacity: .13;
  background-image: linear-gradient(rgba(255,255,255,.8) 1px, transparent 1px), linear-gradient(90deg, rgba(255,255,255,.8) 1px, transparent 1px);
  background-size: 56px 56px;
}
.cta > * { position: relative; z-index: 1; }
.cta h2 { color: #fff; }
.cta p { color: rgba(255,255,255,.93); margin-top: var(--s-4); max-width: 42rem; }
.cta .btn-row { margin-top: var(--s-6); }

/* ---------- 19. FOOTER ---------- */
.site-footer { background: var(--navy-900); color: #9fc0ce; padding-top: var(--section-y); }
.footer-grid { display: grid; gap: var(--s-7); grid-template-columns: repeat(auto-fit, minmax(min(100%, 14rem), 1fr)); }
.footer-brand { max-width: 24rem; }
.footer-brand img { height: 44px; width: auto; margin-bottom: var(--s-4); }
.footer-brand p { font-size: var(--fs-sm); line-height: 1.7; }
.site-footer h3, .site-footer h4 {
  margin-bottom: var(--s-4); font-size: var(--fs-xs); font-weight: 700;
  letter-spacing: .14em; text-transform: uppercase; color: #fff;
}
.footer-links { display: grid; gap: .6rem; }
/* The nudge is a translate declared on the base rule. As `padding-left` set
   inside `:hover` it animated in and snapped back out — the transition only
   existed while hovered — and it reflowed the link box on every pointer pass. */
.footer-links a {
  display: inline-block; font-size: var(--fs-sm); color: #9fc0ce;
  transition: color .25s, translate .25s var(--ease);
}
.footer-links a:hover { color: #fff; translate: 4px 0; }
[dir="rtl"] .footer-links a:hover { translate: -4px 0; }
.socials { display: flex; gap: .55rem; margin-top: var(--s-5); }
.socials a {
  display: grid; place-items: center; width: 40px; height: 40px; border-radius: 12px;
  background: rgba(255,255,255,.07); border: 1px solid rgba(255,255,255,.12); color: #cfe3ec;
  transition: transform .3s var(--ease), background-color .3s, color .3s;
}
.socials a:hover { transform: translateY(-3px); background: var(--orange); color: #fff; border-color: transparent; }
.socials svg { width: 18px; height: 18px; }
.footer-bottom {
  margin-top: var(--s-7); padding-block: var(--s-5);
  border-top: 1px solid rgba(255,255,255,.10);
  display: flex; flex-wrap: wrap; gap: var(--s-3); justify-content: space-between; align-items: center;
  font-size: var(--fs-xs);
}
.footer-bottom a { color: #9fc0ce; }
.footer-bottom a:hover { color: #fff; }
.footer-legal { display: flex; flex-wrap: wrap; gap: var(--s-4); }

/* ---------- 20. FLOATING UI ---------- */
/* Logical inset, not right/bottom. The skip link, the hero glows and the float
   cards all carry an explicit [dir="rtl"] patch and this one was missed, so on
   the Arabic pages the buttons stayed pinned to the right edge instead of
   mirroring with the text. Logical properties need no patch at all. */
.floaties {
  position: fixed;
  inset-inline-end: clamp(.75rem, .3rem + 1vw, 1.5rem);
  inset-block-end: clamp(.75rem, .3rem + 1vw, 1.5rem);
  z-index: 90; display: grid; gap: .6rem; justify-items: end;
}
.fab {
  --fab-size: 3.25rem;                /* one rhythm for both floaties */
  display: inline-flex; align-items: center; justify-content: center; gap: .6rem;
  min-height: var(--fab-size); padding-inline: 1.05rem;
  border-radius: var(--r-pill);
  font-size: .88rem; font-weight: 700; letter-spacing: -.01em;
  color: #fff; background: #0b8043;
  box-shadow: 0 12px 26px -12px rgba(11,128,67,.65);
  transition: translate .45s var(--ease), scale .45s var(--ease), box-shadow .3s var(--ease);
}
.fab:hover { color: #fff; translate: 0 -3px; scale: 1.03; }
.fab:active { translate: 0 -1px; scale: .99; }
.fab svg { width: 22px; height: 22px; flex: none; }
.fab--top {
  width: var(--fab-size); height: var(--fab-size); padding-inline: 0;
  background: #fff; color: var(--ink-strong); border: 1px solid var(--line);
  box-shadow: var(--sh-md); opacity: 0; pointer-events: none; transform: translateY(10px);
  transition: opacity .3s, transform .3s var(--ease),
              translate .45s var(--ease), scale .45s var(--ease);
}
.fab--top.is-on { opacity: 1; pointer-events: auto; transform: none; }
/* Icon-only below 30rem: a circle of the same size rather than a lopsided stub.
   .fab-label is display:none here, which is why the markup carries aria-label
   -- icon() renders its <svg> aria-hidden, so without it the link had no
   accessible name on exactly the devices WhatsApp is used from. */
@media (max-width: 30rem) {
  .fab .fab-label { display: none; }
  .fab { width: var(--fab-size); padding-inline: 0; }
}

/* ---------- 21. REVEAL ---------- */
/* Scoped to .js so the page is fully readable when JavaScript is off or fails */
.js [data-reveal] { opacity: 0; transform: translateY(22px); transition: opacity .7s var(--ease), transform .7s var(--ease); }
.js [data-reveal].is-in { opacity: 1; transform: none; }
[data-reveal][data-d="1"] { transition-delay: .08s; }
[data-reveal][data-d="2"] { transition-delay: .16s; }
[data-reveal][data-d="3"] { transition-delay: .24s; }
[data-reveal][data-d="4"] { transition-delay: .32s; }
[data-reveal][data-d="5"] { transition-delay: .40s; }

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after { animation-duration: .001ms !important; animation-iteration-count: 1 !important; transition-duration: .001ms !important; }
  [data-reveal] { opacity: 1; transform: none; }
}

/* ---------- 22. MAP + MISC ---------- */
.map { border-radius: var(--r-lg); overflow: hidden; box-shadow: var(--sh-sm); border: 1px solid var(--line); }
.map iframe { width: 100%; height: clamp(280px, 34vw, 460px); border: 0; display: block; }
.prose > * + * { margin-top: var(--s-4); }
.prose h2 { margin-top: var(--s-7); }
.prose ul { padding-left: 1.2rem; list-style: disc; color: var(--ink-soft); }
.prose li + li { margin-top: .4rem; }
.check { display: grid; gap: var(--s-3); }
.check li { display: flex; gap: .7rem; align-items: flex-start; font-weight: 600; color: var(--ink); }
.check svg { width: 22px; height: 22px; flex: none; color: var(--orange); margin-top: 1px; }
.section--deep .check li { color: #dcecf3; }

/* =============================================================
   23. THEME CONTROLS (dark toggle + language switcher)
   ============================================================= */
.icon-btn {
  display: grid; place-items: center; width: 42px; height: 42px; border-radius: 12px;
  border: 1px solid var(--line); background: var(--surface); color: var(--navy);
  box-shadow: var(--sh-xs); transition: color .25s, border-color .25s, transform .25s var(--ease), background-color .25s;
}
.icon-btn:hover { color: var(--blue); border-color: var(--line-strong); transform: translateY(-2px); }
.icon-btn svg { width: 19px; height: 19px; }
.theme-toggle .i-sun { display: none; }
[data-theme="dark"] .theme-toggle .i-sun { display: block; }
[data-theme="dark"] .theme-toggle .i-moon { display: none; }

.lang { position: relative; }
.lang-btn { width: auto; padding-inline: .8rem; gap: .45rem; display: inline-flex; align-items: center; font-size: .88rem; font-weight: 700; }
.lang-btn .chev { width: 12px; height: 12px; opacity: .65; transition: transform .3s var(--ease); }
.lang-btn[aria-expanded="true"] .chev { transform: rotate(180deg); }
.lang-menu {
  position: absolute; inset-block-start: calc(100% + .5rem); inset-inline-end: 0; z-index: 120;
  min-width: 12.5rem; padding: .45rem; display: grid; gap: .1rem;
  border-radius: var(--r-md); background: var(--surface);
  border: 1px solid var(--line); box-shadow: var(--sh-lg);
  opacity: 0; visibility: hidden; transform: translateY(-8px);
  transition: opacity .25s, transform .25s var(--ease), visibility .25s;
}
.lang-menu.is-open { opacity: 1; visibility: visible; transform: none; }
.lang-menu a {
  display: flex; align-items: center; gap: .6rem; padding: .55rem .7rem; border-radius: 9px;
  font-size: .9rem; font-weight: 600; color: var(--ink);
}
.lang-menu a:hover { background: var(--bg-soft); color: var(--blue); }
.lang-menu a[aria-current="true"] { background: var(--bg-soft); color: var(--blue); }
.lang-menu a[aria-current="true"]::after { content: "✓"; margin-inline-start: auto; color: var(--orange); font-weight: 800; }
.lang-menu .flag { font-size: 1.05rem; line-height: 1; }
.lang-menu .native { color: var(--ink-mute); font-weight: 500; font-size: .82rem; margin-inline-start: auto; }
.lang-menu a[aria-current="true"] .native { display: none; }

/* =============================================================
   24. DARK MODE
   Tokens flip; components that hardcode light values get patched.
   ============================================================= */
:root[data-theme="dark"] {
  --bg:          #041e29;
  --bg-soft:     #062a38;
  --surface:     #07303f;
  --ink:         #e6f2f8;
  --ink-soft:    #a7c4d2;
  --ink-mute:    #7ba0b1;
  --line:        #10465b;
  --line-strong: #1a5c76;
  --cyan-50:     #0a3a4c;
  --mist-50:     #062a38;
  --orange-ink:  #ff8a3d;
  --ink-strong:  #eaf6fb;
  --grad-deep:   linear-gradient(160deg, #052734 0%, #02161e 100%);
  --grad-text:   linear-gradient(100deg, #58c8e4 0%, var(--cyan) 100%);
  --sh-xs: 0 1px 2px rgba(0,0,0,.34);
  --sh-sm: 0 2px 6px rgba(0,0,0,.30), 0 8px 20px -8px rgba(0,0,0,.45);
  --sh-md: 0 12px 32px -14px rgba(0,0,0,.65), 0 2px 8px rgba(0,0,0,.30);
  --sh-lg: 0 34px 64px -26px rgba(0,0,0,.78), 0 8px 20px rgba(0,0,0,.35);
  color-scheme: dark;
}
:root[data-theme="dark"] h1, :root[data-theme="dark"] h2,
:root[data-theme="dark"] h3, :root[data-theme="dark"] h4, :root[data-theme="dark"] h5 { color: #eaf6fb; }
:root[data-theme="dark"] a { color: #5cc6e3; }
:root[data-theme="dark"] a:hover { color: var(--orange); }

/* The rule above is more specific than the component classes (0-2-1 vs 0-1-0),
   so any component that is itself an <a> has to re-assert its own colour —
   otherwise button labels and their currentColor icons turn link-blue. */
:root[data-theme="dark"] .btn,
:root[data-theme="dark"] .btn:hover      { color: var(--btn-fg); }
:root[data-theme="dark"] .fab            { color: #fff; }
:root[data-theme="dark"] .fab--top       { color: #e6f2f8; }
:root[data-theme="dark"] a.card          { color: var(--ink); }
:root[data-theme="dark"] a.card:hover    { color: var(--ink); }
:root[data-theme="dark"] .brand          { color: inherit; }
:root[data-theme="dark"] .site-header { background: rgba(4,30,41,.80); }
:root[data-theme="dark"] .site-header.is-stuck { background: rgba(4,30,41,.94); }
:root[data-theme="dark"] .nav-links a,
:root[data-theme="dark"] .drawer a,
:root[data-theme="dark"] .icon-btn,
:root[data-theme="dark"] .float-card,
:root[data-theme="dark"] .acc summary,
:root[data-theme="dark"] .field span,
:root[data-theme="dark"] .hero-proof-item b,
:root[data-theme="dark"] .pill { color: #e6f2f8; }
:root[data-theme="dark"] .nav-links a[aria-current="page"] { color: var(--cyan); }
:root[data-theme="dark"] .drawer { background: var(--surface); }
:root[data-theme="dark"] .nav-toggle { background: var(--surface); }
:root[data-theme="dark"] .nav-toggle span { background: #e6f2f8; }
:root[data-theme="dark"] .btn--ghost { --btn-fg: #e6f2f8; }
:root[data-theme="dark"] .btn--light { --btn-bg: var(--surface); --btn-fg: #e6f2f8; }
:root[data-theme="dark"] .btn--light:hover { --btn-fg: var(--cyan); }
:root[data-theme="dark"] .card, :root[data-theme="dark"] .form-card,
:root[data-theme="dark"] .acc, :root[data-theme="dark"] .stat,
:root[data-theme="dark"] .filters button, :root[data-theme="dark"] .pill,
:root[data-theme="dark"] .icon-btn, :root[data-theme="dark"] .lang-menu { background: var(--surface); }
:root[data-theme="dark"] .stats { background: var(--line); }
:root[data-theme="dark"] .field input, :root[data-theme="dark"] .field textarea { background: #052734; }
:root[data-theme="dark"] .field input:focus, :root[data-theme="dark"] .field textarea:focus { background: #062a38; }
:root[data-theme="dark"] .float-card { background: rgba(7,48,63,.92); }
:root[data-theme="dark"] .icon-tile--soft { background: rgba(5,168,204,.14); color: var(--cyan); }
:root[data-theme="dark"] .acc-i { background: rgba(5,168,204,.14); color: var(--cyan); }
:root[data-theme="dark"] .acc summary::after { border-color: var(--cyan); }
:root[data-theme="dark"] .hero-grid { opacity: .22; background-image: linear-gradient(rgba(90,160,190,.5) 1px, transparent 1px), linear-gradient(90deg, rgba(90,160,190,.5) 1px, transparent 1px); }
:root[data-theme="dark"] .hero::before { background: radial-gradient(circle, rgba(5,168,204,.30), transparent 65%); }
:root[data-theme="dark"] .hero::after { background: radial-gradient(circle, rgba(255,102,0,.22), transparent 65%); }
:root[data-theme="dark"] .section--tint { background: linear-gradient(180deg, #062a38, var(--bg)); }
:root[data-theme="dark"] .site-footer { background: #02161e; }
:root[data-theme="dark"] .marquee img { filter: grayscale(1) brightness(2.2); opacity: .5; }
:root[data-theme="dark"] .marquee img:hover { filter: none; opacity: 1; }
:root[data-theme="dark"] .person-photo { background: linear-gradient(160deg, #0a3a4c, #062a38); }
:root[data-theme="dark"] .map { border-color: var(--line); }
:root[data-theme="dark"] .map iframe { filter: invert(.9) hue-rotate(180deg) saturate(.75); }
:root[data-theme="dark"] .fab--top { background: var(--surface); color: #e6f2f8; }
:root[data-theme="dark"] .mark::after { background: linear-gradient(90deg, rgba(255,102,0,.38), rgba(5,168,204,.38)); }
:root[data-theme="dark"] .skip-link { background: var(--cyan); color: #02161e; }

/* Respect OS preference when the visitor has not chosen explicitly */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) { color-scheme: dark; }
}

/* =============================================================
   25. RTL — patches for the few physical properties left
   ============================================================= */
[dir="rtl"] .eyebrow::before { order: -1; }
[dir="rtl"] .btn:hover svg,
[dir="rtl"] .link-arrow:hover svg { transform: translateX(-4px); }
[dir="rtl"] .btn svg.i-arrow, [dir="rtl"] .link-arrow svg.i-arrow { transform: scaleX(-1); }
[dir="rtl"] .btn:hover svg.i-arrow { transform: scaleX(-1) translateX(4px); }
[dir="rtl"] .link-arrow:hover svg.i-arrow { transform: scaleX(-1) translateX(5px); }
[dir="rtl"] .nav-links a::after { transform-origin: right center; }
[dir="rtl"] .card::before { transform-origin: right; }
[dir="rtl"] .skip-link { inset-inline: var(--s-4) auto; }
[dir="rtl"] .hero::before { right: auto; left: -14rem; }
[dir="rtl"] .hero::after  { left: auto; right: -14rem; }
[dir="rtl"] .pagehead::before { right: auto; left: -12rem; }
[dir="rtl"] .pagehead::after {
  mask-image: radial-gradient(ellipse 70% 100% at 80% 50%, #000, transparent);
  -webkit-mask-image: radial-gradient(ellipse 70% 100% at 80% 50%, #000, transparent);
}
[dir="rtl"] .cta::before { right: auto; left: -8rem; }
[dir="rtl"] .float-card--tl { left: auto; right: -6%; }
[dir="rtl"] .float-card--br { right: auto; left: -5%; }
[dir="rtl"] .step { padding-left: 0; padding-right: 4.6rem; }
[dir="rtl"] .step-num { left: auto; right: 0; }
[dir="rtl"] .step::after { left: auto; right: 27px; }
[dir="rtl"] .acc summary::after { margin-left: 0; margin-right: auto; transform: rotate(135deg) translateY(-2px); }
[dir="rtl"] .acc[open] summary::after { transform: rotate(-45deg) translateY(-2px); }
[dir="rtl"] .acc-body { padding-left: 1.25rem; padding-right: 4.15rem; }
[dir="rtl"] .acc-body ul, [dir="rtl"] .prose ul { padding-left: 0; padding-right: 1.2rem; }
[dir="rtl"] .footer-links a:hover { padding-left: 0; padding-right: 4px; }
[dir="rtl"] .crumbs li + li::before { margin-right: 0; margin-left: .45rem; }
[dir="rtl"] .marquee-track { animation-name: slide-rtl; }
@keyframes slide-rtl { to { transform: translateX(50%); } }
@media (max-width: 61.9375rem) {
  [dir="rtl"] .float-card--tl { right: 2%; left: auto; }
  [dir="rtl"] .float-card--br { left: 2%; right: auto; }
}
@media (max-width: 30rem) { [dir="rtl"] .step { padding-right: 0; } [dir="rtl"] .step-num { position: static; margin-bottom: var(--s-3); } }

/* =============================================================
   26. MOTION LAYER
   Custom cursor · scroll progress · magnetic · tilt · parallax
   Every effect is opt-in per element and switches itself off for
   touch devices and prefers-reduced-motion.
   ============================================================= */

/* --- Scroll progress bar --- */
.progress {
  position: fixed; inset-block-start: 0; inset-inline: 0; z-index: 200;
  height: 3px; transform: scaleX(0); transform-origin: 0 50%;
  background: linear-gradient(90deg, var(--cyan), var(--blue) 45%, var(--orange));
  will-change: transform; pointer-events: none;
}
[dir="rtl"] .progress { transform-origin: 100% 50%; }

/* --- Custom cursor (fine pointers only) --- */
.cursor-dot, .cursor-ring {
  position: fixed; inset-block-start: 0; inset-inline-start: 0; z-index: 9999;
  border-radius: 50%; pointer-events: none; opacity: 0;
  transition: opacity .3s, width .3s var(--ease), height .3s var(--ease),
              background-color .3s, border-color .3s;
  will-change: transform;
}
.cursor-dot  { width: 7px; height: 7px; background: var(--orange); }
.cursor-ring { width: 34px; height: 34px; border: 1.5px solid var(--blue); }
html.has-cursor .cursor-dot, html.has-cursor .cursor-ring { opacity: 1; }
html.has-cursor, html.has-cursor a, html.has-cursor button,
html.has-cursor [data-magnetic], html.has-cursor .work, html.has-cursor summary { cursor: none; }
html.has-cursor input, html.has-cursor textarea, html.has-cursor select { cursor: auto; }
html.has-cursor.cursor-hover .cursor-ring {
  width: 58px; height: 58px; border-color: var(--orange);
  background: rgba(255,102,0,.08);
}
html.has-cursor.cursor-hover .cursor-dot { width: 4px; height: 4px; }
html.has-cursor.cursor-down .cursor-ring { width: 26px; height: 26px; }
:root[data-theme="dark"] .cursor-ring { border-color: var(--cyan); }

/* --- Magnetic buttons --- */
[data-magnetic] { will-change: transform; }
.btn::after {
  content: ""; position: absolute; inset: 0; border-radius: inherit;
  background: linear-gradient(100deg, transparent 20%, rgba(255,255,255,.35) 50%, transparent 80%);
  transform: translateX(-120%); transition: transform .75s var(--ease); pointer-events: none;
  z-index: -1;   /* above the button's own background, below its label */
}
.btn { position: relative; overflow: hidden; isolation: isolate; }
.btn:hover::after { transform: translateX(120%); }
.btn > * { position: relative; z-index: 1; }

/* --- Tilt cards --- */
[data-tilt] { transform-style: preserve-3d; will-change: transform; }

/* --- Parallax --- */
[data-parallax] { will-change: transform; }

/* --- Word-by-word heading reveal --- */
.word { display: inline-block; overflow: hidden; vertical-align: bottom; }
.word > i {
  display: inline-block; font-style: inherit;
  transform: translateY(105%); opacity: 0;
  transition: transform .85s var(--ease), opacity .6s var(--ease);
  transition-delay: calc(var(--w, 0) * 55ms);
}
.is-in .word > i, .word.is-in > i { transform: none; opacity: 1; }

/* --- Image clip reveal --- */
.js [data-clip] { clip-path: inset(0 0 100% 0); transition: clip-path 1.1s var(--ease); }
.js [data-clip].is-in { clip-path: inset(0 0 0 0); }

/* --- Hover lift utility --- */
.lift { transition: transform var(--dur) var(--ease), box-shadow var(--dur) var(--ease); }
.lift:hover { transform: translateY(-4px); box-shadow: var(--sh-md); }

@media (hover: none), (pointer: coarse) {
  .cursor-dot, .cursor-ring { display: none; }
  html.has-cursor, html.has-cursor a, html.has-cursor button { cursor: auto; }
}
@media (prefers-reduced-motion: reduce) {
  .cursor-dot, .cursor-ring, .progress { display: none; }
  .word > i { transform: none; opacity: 1; }
  .js [data-clip] { clip-path: none; }
  html.has-cursor, html.has-cursor a, html.has-cursor button { cursor: auto; }
}

/* =============================================================
   27. TOASTS + FORM VALIDATION
   ============================================================= */
.toast-stack {
  position: fixed; z-index: 300;
  inset-block-start: calc(76px + var(--s-4)); inset-inline-end: var(--gutter);
  display: grid; gap: .65rem; width: min(23rem, calc(100vw - 2 * var(--gutter)));
  pointer-events: none;
}
.toast {
  --toast-accent: var(--blue);
  position: relative; display: flex; align-items: flex-start; gap: .75rem;
  padding: .95rem 1rem; padding-inline-end: 2.4rem;
  border-radius: var(--r-md); overflow: hidden;
  background: var(--surface); border: 1px solid var(--line);
  border-inline-start: 3px solid var(--toast-accent);
  box-shadow: var(--sh-lg); pointer-events: auto;
  opacity: 0; transform: translateY(-12px) scale(.97);
  transition: opacity .35s var(--ease), transform .35s var(--ease), margin .35s var(--ease);
}
.toast.is-in   { opacity: 1; transform: none; }
.toast.is-out  { opacity: 0; transform: translateY(-8px) scale(.97); margin-block-start: -3.5rem; }
.toast--success { --toast-accent: #16a34a; }
.toast--error   { --toast-accent: #dc2626; }
.toast--warning { --toast-accent: var(--orange); }
.toast--info    { --toast-accent: var(--cyan); }

.toast-icon {
  display: grid; place-items: center; flex: none;
  width: 26px; height: 26px; border-radius: 50%;
  color: #fff; background: var(--toast-accent);
}
/* A white glyph clears 3:1 on the green and red accents but not on the lighter
   orange/cyan ones, so those two get the dark mark instead. */
.toast--warning .toast-icon,
.toast--info .toast-icon { color: var(--ink-on-bright); }
.toast-icon svg { width: 15px; height: 15px; }
.toast-body { flex: 1; min-width: 0; }
.toast-title { display: block; font-size: .93rem; font-weight: 700; color: var(--navy); }
:root[data-theme="dark"] .toast-title { color: #eaf6fb; }
.toast-text { margin-top: .12rem; font-size: var(--fs-sm); color: var(--ink-soft); overflow-wrap: anywhere; }
.toast-x {
  position: absolute; inset-block-start: .5rem; inset-inline-end: .5rem;
  display: grid; place-items: center; width: 26px; height: 26px; border-radius: 8px;
  color: var(--ink-mute); transition: color .2s, background-color .2s;
}
.toast-x:hover { color: var(--ink); background: var(--bg-soft); }
.toast-x svg { width: 13px; height: 13px; }
.toast-bar {
  position: absolute; inset-block-end: 0; inset-inline-start: 0; height: 2px;
  width: 100%; transform-origin: inline-start; background: var(--toast-accent); opacity: .5;
  animation: toast-bar linear forwards;
}
[dir="rtl"] .toast-bar { transform-origin: right center; }
.toast.is-paused .toast-bar { animation-play-state: paused; }
@keyframes toast-bar { from { transform: scaleX(1); } to { transform: scaleX(0); } }

@media (max-width: 40rem) {
  .toast-stack {
    inset-block-start: auto; inset-block-end: calc(var(--s-4) + 4.5rem);
    inset-inline: var(--gutter); width: auto;
  }
  .toast { transform: translateY(12px) scale(.97); }
  .toast.is-out { transform: translateY(8px) scale(.97); margin-block-start: 0; margin-block-end: -3.5rem; }
}
@media (prefers-reduced-motion: reduce) {
  .toast { transition: opacity .2s; transform: none; }
  .toast.is-out { transform: none; margin: 0; }
  .toast-bar { animation: none; }
}

/* --- Inline field validation --- */
.field-error {
  display: none; margin-top: .4rem; font-size: var(--fs-xs); font-style: normal;
  font-weight: 600; color: #dc2626;
}
.field-error::before { content: "⚠ "; }
:root[data-theme="dark"] .field-error { color: #ff8f88; }
.field.is-invalid .field-error { display: block; }
.field.is-invalid input, .field.is-invalid textarea {
  border-color: #dc2626; background: #fef4f3;
}
:root[data-theme="dark"] .field.is-invalid input,
:root[data-theme="dark"] .field.is-invalid textarea { background: rgba(220,38,38,.10); }
.field.is-invalid input:focus, .field.is-invalid textarea:focus {
  border-color: #dc2626; box-shadow: 0 0 0 4px rgba(220,38,38,.14);
}
.field.is-valid input, .field.is-valid textarea { border-color: #16a34a; }
.field-count { float: inline-end; font-size: var(--fs-xs); font-weight: 500; color: var(--ink-mute); }
.field-count.is-near { color: var(--orange-ink); }

/* =============================================================
   28. 2026 REFRESH
   Editorial structure, OKLCH ramps, spring easing, native
   scroll-driven motion and cross-document view transitions.
   Everything here is progressive — older engines get the
   section 1-27 baseline unchanged.
   ============================================================= */
:root {
  /* Display face is a token so the whole identity is one line to change.
     Swap to '"Instrument Serif", Georgia, serif' for an editorial look. */
  --font-display: var(--font);

  /* Spring easing via linear() — a real spring curve, not an approximation */
  --ease-spring: linear(0, 0.006, 0.025, 0.101, 0.539, 0.826, 0.941, 0.996, 1.019, 1.021, 1.013, 1.004, 0.999, 1);
  --ease-out: cubic-bezier(.16, 1, .3, 1);

  /* Hairlines instead of borders — the single biggest "expensive" tell */
  --hairline: color-mix(in oklab, var(--ink) 12%, transparent);
  --hairline-strong: color-mix(in oklab, var(--ink) 22%, transparent);

  /* Inner highlight: simulates light catching a surface edge */
  --lip: inset 0 1px 0 color-mix(in oklab, white 60%, transparent);

  --display-tracking: -0.045em;
}
:root[data-theme="dark"] {
  --hairline: color-mix(in oklab, white 14%, transparent);
  --hairline-strong: color-mix(in oklab, white 26%, transparent);
  --lip: inset 0 1px 0 color-mix(in oklab, white 12%, transparent);
}

/* OKLCH gradient ramps — interpolating through oklab kills the grey dead zone
   that sRGB gradients get in the middle of a hue sweep. */
@supports (color: oklch(0.5 0.1 200)) {
  :root {
    --grad-brand: linear-gradient(135deg in oklab, oklch(52% .10 218) 0%, oklch(50% .12 233) 55%, oklch(33% .07 232) 100%);
    --grad-warm:  linear-gradient(135deg in oklab, oklch(70% .19 47) 0%, oklch(79% .13 55) 100%);
    /* Same endpoints as the sRGB ramp; only the mid-tones interpolate
       better. oklab interpolation is monotonic in L, so the contrast stays
       bounded by those two ends. */
    --grad-warm-deep: linear-gradient(135deg in oklab, #c2490c 0%, #a03500 100%);
    --grad-text:  linear-gradient(100deg in oklab, oklch(50% .12 233) 0%, oklch(62% .12 216) 100%);
  }
}

/* ---------- Typography: bigger, tighter, more editorial ---------- */
.h-hero, .h1, .h2 { font-family: var(--font-display); font-optical-sizing: auto; }
.h-hero { letter-spacing: var(--display-tracking); line-height: .98; }
.h1 { letter-spacing: -.038em; line-height: 1.03; }
.h2 { letter-spacing: -.032em; line-height: 1.06; }
.lead { max-width: 62ch; }

/* Section index numbers — editorial signposting instead of another card */
.section-head { position: relative; }
.section-index {
  display: block; margin-bottom: .5rem;
  font-family: var(--font-display);
  font-size: var(--fs-xs); font-weight: 700; letter-spacing: .18em;
  color: var(--ink-mute); font-variant-numeric: tabular-nums;
}

/* ---------- Editorial capability list (replaces the 6-card grid) ---------- */
.roster { border-top: 1px solid var(--hairline); }
.roster-item {
  position: relative; display: grid; gap: .35rem 2rem;
  grid-template-columns: auto 1fr; align-items: start;
  padding: clamp(1.5rem, 1rem + 1.6vw, 2.5rem) 0;
  border-bottom: 1px solid var(--hairline);
  transition: background-color .4s var(--ease-out);
}
.roster-item::after {
  content: ""; position: absolute; inset-inline: -1.5rem; inset-block: 0;
  border-radius: var(--r-md); background: var(--bg-soft);
  opacity: 0; transition: opacity .4s var(--ease-out); z-index: -1;
}
.roster-item:hover::after { opacity: 1; }
.roster-num {
  grid-row: span 2; font-family: var(--font-display);
  font-size: var(--fs-sm); font-weight: 700; color: var(--ink-mute);
  font-variant-numeric: tabular-nums; padding-top: .3rem;
  transition: color .35s var(--ease-out);
}
.roster-item:hover .roster-num { color: var(--orange-ink); }
.roster-title {
  display: flex; align-items: center; gap: .75rem;
  font-family: var(--font-display); font-size: clamp(1.3rem, 1.05rem + 1vw, 1.9rem);
  font-weight: 700; letter-spacing: -.028em; color: var(--navy);
}
:root[data-theme="dark"] .roster-title { color: #eaf6fb; }
.roster-title svg { width: 1.15em; height: 1.15em; color: var(--blue); flex: none; }
:root[data-theme="dark"] .roster-title svg { color: var(--cyan); }
.roster-text { grid-column: 2; color: var(--ink-soft); max-width: 54ch; }
.roster-go {
  position: absolute; inset-inline-end: 0; inset-block-start: 50%;
  translate: 0 -50%; opacity: 0;
  color: var(--orange-ink);
  transition: opacity .35s var(--ease-out), translate .45s var(--ease-spring);
}
.roster-item:hover .roster-go { opacity: 1; translate: -.4rem -50%; }
[dir="rtl"] .roster-item:hover .roster-go { translate: .4rem -50%; }
[dir="rtl"] .roster-go svg { scale: -1 1; }
@media (max-width: 40rem) {
  .roster-item { grid-template-columns: 1fr; }
  .roster-num { grid-row: auto; padding-top: 0; }
  .roster-text { grid-column: 1; }
  .roster-go { display: none; }
}

/* ---------- Bento grid ---------- */
.bento { display: grid; gap: var(--s-4); grid-template-columns: repeat(6, 1fr); }
.bento-cell {
  container-type: inline-size;
  position: relative; overflow: hidden;
  grid-column: span 6;
  padding: clamp(1.35rem, 1rem + 1.2vw, 2rem);
  border-radius: var(--r-lg);
  background: var(--surface);
  border: 1px solid var(--hairline);
  box-shadow: var(--lip);
  transition: border-color .4s var(--ease-out), transform .5s var(--ease-out);
}
.bento-cell:hover { border-color: var(--hairline-strong); transform: translateY(-3px); }
@media (min-width: 48rem) {
  .bento-cell            { grid-column: span 3; }
  .bento-cell--wide      { grid-column: span 4; }
  .bento-cell--narrow    { grid-column: span 2; }
  .bento-cell--full      { grid-column: span 6; }
}
/* Base type for cells. Declared BEFORE the colour modifiers on purpose:
   `.bento-cell p` and `.bento-cell--dark p` are both specificity 0-1-1, so
   whichever comes last wins. Keep the neutral rule first or the coloured
   cells lose their light text and go unreadable. */
.bento-cell p { font-size: var(--fs-sm); color: var(--ink-soft); }
.bento-cell--brand {
  background: var(--grad-brand); border-color: transparent; color: #fff;
}
.bento-cell--brand .bento-k, .bento-cell--brand p { color: rgba(255,255,255,.93); }
.bento-cell--brand .bento-v { color: #fff; }
.bento-cell--dark { background: var(--grad-deep); border-color: transparent; }
.bento-cell--dark .bento-v { color: #fff; }
.bento-cell--dark .bento-k, .bento-cell--dark p { color: #a9c8d6; }
.bento-k {
  display: block; font-size: var(--fs-xs); font-weight: 700;
  letter-spacing: .14em; text-transform: uppercase; color: var(--ink-mute);
}
.bento-v {
  display: block; margin-block: .55rem .35rem;
  font-family: var(--font-display);
  font-size: clamp(1.9rem, 1.3rem + 2.4vw, 3.1rem); font-weight: 800;
  line-height: 1; letter-spacing: -.04em; color: var(--navy);
  font-variant-numeric: tabular-nums;
}
:root[data-theme="dark"] .bento-v { color: #eaf6fb; }
/* Same specificity trap as the dark `a` rule: the theme selector (0-2-1) beats
   the modifier (0-2-0), so coloured cells must re-assert on top of it. */
:root[data-theme="dark"] .bento-cell--brand .bento-v,
:root[data-theme="dark"] .bento-cell--dark .bento-v { color: #fff; }
/* container query: tighten type when the cell itself is narrow */
@container (max-width: 18rem) {
  .bento-v { font-size: 1.8rem; }
}
.bento-glow {
  position: absolute; inset-block-start: -40%; inset-inline-end: -20%;
  width: 16rem; height: 16rem; border-radius: 50%; pointer-events: none;
  background: radial-gradient(circle, color-mix(in oklab, var(--cyan) 45%, transparent), transparent 65%);
  filter: blur(28px); opacity: .5;
}

/* ---------- Grain: 2% noise stops large flat areas looking plastic ---------- */
body::after {
  content: ""; position: fixed; inset: 0; z-index: 1; pointer-events: none;
  opacity: .022; mix-blend-mode: multiply;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='3'/%3E%3C/filter%3E%3Crect width='140' height='140' filter='url(%23n)'/%3E%3C/svg%3E");
}
:root[data-theme="dark"] body::after { mix-blend-mode: screen; opacity: .035; }

/* ---------- Surfaces get the lip highlight ---------- */
.card, .form-card, .stat, .acc, .toast { box-shadow: var(--sh-xs), var(--lip); }
.card { border-color: var(--hairline); }
.card:hover { border-color: var(--hairline-strong); }

/* ---------- Focus: thicker, offset, theme-aware ---------- */
:focus-visible {
  outline: 2px solid var(--blue); outline-offset: 3px;
  box-shadow: 0 0 0 6px color-mix(in oklab, var(--blue) 18%, transparent);
}
:root[data-theme="dark"] :focus-visible { outline-color: var(--cyan); }

/* ---------- Native scroll-driven reveals ----------
   Where supported this runs off the main thread; the IntersectionObserver
   in oaw.js is skipped entirely (it checks for the same feature). */
@supports (animation-timeline: view()) {
  @media (prefers-reduced-motion: no-preference) {
    .js [data-reveal] {
      opacity: 1; transform: none;              /* release the JS-held state */
      animation: reveal-in linear both;
      animation-timeline: view();
      animation-range: entry 5% cover 22%;
    }
    /* Do NOT re-declare `animation` for .is-in here: the shorthand resets
       animation-timeline back to auto and the reveal would run on the
       document timeline instead of the scroll one. `.is-in` is still added
       by oaw.js, but only to unlock the word-split animation below. */
  }
  @keyframes reveal-in {
    from { opacity: 0; transform: translateY(26px); }
    to   { opacity: 1; transform: none; }
  }
}

/* ---------- Cross-document view transitions ----------
   Turns the multi-page PHP site into something that navigates like an app.
   Chromium/Safari honour it; everything else just navigates normally. */
@view-transition { navigation: auto; }
::view-transition-group(root) { animation-duration: .38s; }
::view-transition-old(root) { animation: vt-out .28s var(--ease-out) both; }
::view-transition-new(root) { animation: vt-in .38s var(--ease-out) both; }
@keyframes vt-out { to { opacity: 0; transform: translateY(-8px); } }
@keyframes vt-in { from { opacity: 0; transform: translateY(12px); } }
.site-header { view-transition-name: site-header; }
.site-footer { view-transition-name: site-footer; }
::view-transition-group(site-header),
::view-transition-group(site-footer) { animation-duration: 0s; }
@media (prefers-reduced-motion: reduce) {
  ::view-transition-old(root), ::view-transition-new(root) { animation: none; }
}

/* Arabic / Urdu need a touch more line-height and no tight tracking */
/* Plus Jakarta Sans sits second so latin runs on an Arabic page -- the brand
   name, phone numbers, URLs -- keep the site face instead of falling to a
   system font. Noto Kufi has no glyphs in that range now that its latin
   subset is not shipped, so the fallback chain does the work. */
:root[lang="ar"], :root[lang="ur"], :root[lang="fa"] { --font: "Noto Kufi Arabic", "Plus Jakarta Sans", "Segoe UI", Tahoma, sans-serif; }
[lang="ar"] body, [lang="ur"] body { line-height: 1.85; }
[lang="ar"] h1, [lang="ar"] h2, [lang="ar"] h3, [lang="ar"] h4,
[lang="ur"] h1, [lang="ur"] h2, [lang="ur"] h3, [lang="ur"] h4 { letter-spacing: 0; line-height: 1.3; }
[lang="hi"] body { line-height: 1.8; }
[lang="hi"] h1, [lang="hi"] h2, [lang="hi"] h3 { letter-spacing: -.01em; line-height: 1.28; }

/* Section 29 — navigation and conversion polish */
.reading-progress { position: absolute; z-index: 3; right: 0; bottom: -1px; left: 0; height: 2px; overflow: hidden; }
.reading-progress span { display: block; width: 100%; height: 100%; transform: scaleX(0); transform-origin: left center; background: linear-gradient(90deg, var(--cyan), var(--blue), var(--orange)); will-change: transform; }
[dir="rtl"] .reading-progress span { transform-origin: right center; }
.nav-links a { position: relative; }
.nav-links a::after { position: absolute; right: .7rem; bottom: -.45rem; left: .7rem; height: 2px; border-radius: 99px; background: var(--cyan); content: ''; opacity: 0; transform: scaleX(.35); transition: opacity .2s ease, transform .2s ease; }
.nav-links a:hover::after, .nav-links a[aria-current="page"]::after { opacity: 1; transform: scaleX(1); }
.nav-links a[aria-current="page"] { color: var(--ink-strong); font-weight: 800; }
.hero-proof { padding: .85rem 1rem; border: 1px solid var(--hairline); border-radius: 1rem; background: color-mix(in srgb, var(--surface) 76%, transparent); box-shadow: 0 10px 28px rgb(4 48 63 / 6%); }
.hero-proof-item b { font-variant-numeric: tabular-nums; }
.hero-proof-sep { opacity: .65; }
.hero-art::after { position: absolute; z-index: -1; right: -7%; bottom: -8%; width: 76%; height: 76%; border-radius: 50%; background: radial-gradient(circle, rgb(6 182 212 / 18%), transparent 68%); content: ''; filter: blur(8px); }
:root[data-theme="dark"] .hero-proof { border-color: rgb(255 255 255 / 12%); background: rgb(5 33 44 / 68%); box-shadow: none; }
:root[data-theme="dark"] .nav-links a[aria-current="page"] { color: var(--ink-strong); }
@media (max-width: 48rem) { .hero-proof { gap: .85rem; padding: .75rem; } .hero-proof-item { min-width: calc(50% - .5rem); } .hero-proof-sep { display: none; } }

/* =============================================================
   30. MATERIAL
   One glass recipe, a wider and softer elevation ramp, and the
   editorial rhythm applied to every section rather than only the
   two that were hand-built for it. Additive: anything an engine
   cannot parse falls back to the section 1-29 baseline.
   ============================================================= */
:root {
  /* Glass. Before this the header, the hero float cards, the work chips and
     the back-to-top button each mixed their own white-with-alpha and their own
     blur radius, so four surfaces that read as "the same floating material"
     were four different materials. One token set, one recipe. */
  --glass:        rgb(255 255 255 / 72%);
  --glass-strong: rgb(255 255 255 / 90%);
  --glass-blur:   saturate(180%) blur(16px);

  /* Elevation restated: wider, softer, lower opacity. The old ramp was tight
     and dark (--sh-lg was 30px of blur at 30%), which reads as a drop shadow
     drawn onto a flat thing. A large-radius, low-opacity, two-layer shadow
     reads as the thing being off the page. */
  --sh-xs: 0 1px 2px rgb(0 63 84 / 5%),  0 1px 3px rgb(0 63 84 / 4%);
  --sh-sm: 0 1px 2px rgb(0 63 84 / 5%),  0 8px 24px -12px rgb(0 63 84 / 15%);
  --sh-md: 0 2px 6px rgb(0 63 84 / 5%),  0 18px 44px -20px rgb(0 63 84 / 24%);
  --sh-lg: 0 4px 12px rgb(0 63 84 / 6%), 0 40px 80px -32px rgb(0 63 84 / 32%);

  /* Radii up one step across the board. */
  --r-sm: 12px; --r-md: 18px; --r-lg: 26px; --r-xl: 36px;
}
:root[data-theme="dark"] {
  --glass:        rgb(6 38 50 / 74%);
  --glass-strong: rgb(5 33 44 / 92%);
}

/* ---------- Section rhythm ---------- */
/* The index gets the same leading rule as .eyebrow, so a numbered head and an
   un-numbered one start on the same optical line. */
.section-head { max-width: 52rem; }
.section-index {
  display: flex; align-items: center; gap: .7rem;
  margin-bottom: .75rem;
}
.section-index::before {
  content: ""; flex: none; width: 26px; height: 2px; border-radius: 2px;
  background: var(--grad-warm);
}
.section-head--center .section-index { justify-content: center; }
.section--deep .section-index { color: #9fc4d4; }
.section--deep .section-index::before { background: #5cc6e3; }

/* ---------- Header ---------- */
.site-header {
  background: var(--glass);
  -webkit-backdrop-filter: var(--glass-blur);
  backdrop-filter: var(--glass-blur);
}
.site-header.is-stuck {
  background: var(--glass-strong);
  border-bottom-color: var(--hairline);
  box-shadow: var(--sh-sm);
}
/* Section 24's dark patches are 0-2-0 and would otherwise beat the two rules
   above; these match that specificity and come later. */
:root[data-theme="dark"] .site-header { background: var(--glass); }
:root[data-theme="dark"] .site-header.is-stuck { background: var(--glass-strong); }

/* ---------- Hero ---------- */
.hero-proof {
  padding: 1rem 1.35rem;
  border: 1px solid var(--hairline);
  border-radius: var(--r-lg);
  background: var(--glass);
  -webkit-backdrop-filter: var(--glass-blur);
  backdrop-filter: var(--glass-blur);
  box-shadow: var(--sh-sm), var(--lip);
}
.hero-proof-item b {
  font-size: clamp(1.5rem, 1.25rem + .8vw, 1.9rem);
  font-variant-numeric: tabular-nums;
}
.hero-proof-sep { background: var(--hairline); }
.float-card {
  border: 1px solid var(--hairline);
  background: var(--glass-strong);
  -webkit-backdrop-filter: var(--glass-blur);
  backdrop-filter: var(--glass-blur);
  box-shadow: var(--sh-md), var(--lip);
}
:root[data-theme="dark"] .float-card { background: var(--glass-strong); }

/* ---------- Buttons ---------- */
/* The lip is what stops a filled pill reading as a flat swatch: a 1px inner
   highlight along the top edge is how a real surface catches light. */
.btn {
  box-shadow: var(--btn-sh), var(--lip);
  transition: transform .5s var(--ease-spring), box-shadow var(--dur) var(--ease),
              background-color .25s, color .25s, border-color .25s;
}
.btn--ghost { --btn-bd: var(--hairline-strong); }
.btn--ghost, .btn--onDark { box-shadow: none; }
.btn--ghost:hover { box-shadow: var(--sh-sm); }
.btn:hover { box-shadow: 0 18px 36px -16px rgb(194 73 12 / 50%), var(--lip); }
.btn--brand:hover { box-shadow: 0 18px 36px -16px rgb(0 102 153 / 55%), var(--lip); }

/* ---------- Surfaces ---------- */
.card, .form-card, .acc, .stat, .work, .toast, .map {
  border-color: var(--hairline);
}
.card, .form-card, .stat, .acc, .work, .toast { box-shadow: var(--sh-xs), var(--lip); }
.work:hover { box-shadow: var(--sh-md), var(--lip); }
.card:hover, .acc[open] { border-color: var(--hairline-strong); }
.form-card { box-shadow: var(--sh-lg), var(--lip); }

/* ---------- Filter chips ---------- */
/* Left, like the heading above them. Centred controls under a left-aligned
   head is the tell that two people designed the section. */
.filters { justify-content: flex-start; }
.section-head--center + .filters { justify-content: center; }
.filters button {
  border-color: var(--hairline);
  background: var(--glass);
  -webkit-backdrop-filter: var(--glass-blur);
  backdrop-filter: var(--glass-blur);
  transition: color .25s, border-color .25s, background-color .25s,
              transform .4s var(--ease-spring);
}
.filters button:hover { transform: translateY(-2px); border-color: var(--hairline-strong); }
.filters button[aria-pressed="true"] { box-shadow: var(--sh-sm), var(--lip); }

/* ---------- Testimonials ---------- */
/* The quote is the payload of the section, so it gets body-weight ink and a
   little more size. The glyph becomes an actual watermark in the corner rather
   than a small grey mark sitting in the reading column taking up a line. */
.quote { position: relative; }
.quote-mark {
  position: absolute; inset-block-start: .9rem; inset-inline-end: 1.1rem;
  margin: 0; opacity: .1; pointer-events: none;
}
.quote-mark svg { width: 56px; height: 56px; }
.quote p { font-size: 1.02rem; line-height: 1.66; color: var(--ink); }
.quote-by img {
  box-shadow: 0 0 0 1px var(--hairline), 0 0 0 4px color-mix(in oklab, var(--cyan) 14%, transparent);
}
.quote-by { border-top-color: var(--hairline); }

/* ---------- Form ---------- */
.field input, .field textarea {
  padding: .95rem 1.1rem;
  border-width: 1px;
  border-color: var(--hairline-strong);
  border-radius: var(--r-sm);
}
.field input:focus, .field textarea:focus {
  border-color: var(--cyan);
  box-shadow: 0 0 0 4px color-mix(in oklab, var(--cyan) 18%, transparent);
}

/* ---------- Client marquee ---------- */
/* Two fixes here.
   Rhythm: six logos in two aspect ratios landed at six different widths, so the
   gaps between them read as random. A shared minimum slot with object-fit:
   contain gives the strip an even beat without cropping anything.
   Colour: the uniform grayscale only works when every logo is a transparent
   mark. Venkinformatics is white type on a dark green plate, so desaturating it
   produced a grey rectangle that read as a redaction bar rather than a client.
   Shown in colour it is simply its own logo. Slight desaturation keeps six
   unrelated brand palettes from fighting the page. */
.marquee-track { align-items: center; }
.marquee img {
  min-width: clamp(6.5rem, 5rem + 5vw, 9.5rem);
  filter: saturate(.85);
  opacity: .85;
}
.marquee img:hover { filter: none; opacity: 1; }
:root[data-theme="dark"] .marquee img { filter: saturate(.85) brightness(1.05); opacity: .8; }
:root[data-theme="dark"] .marquee img:hover { filter: none; opacity: 1; }
/* Keep the pause control clear of the last logo instead of sitting on it. */
.marquee-wrap { padding-inline-end: 3rem; }
.marquee-wrap .marquee-toggle { background: var(--glass-strong); }

/* ---------- Footer ---------- */
.site-footer { position: relative; }
.site-footer::before {
  content: ""; position: absolute; inset-inline: 0; inset-block-start: 0; height: 1px;
  background: linear-gradient(90deg, transparent, rgb(92 198 227 / 55%), rgb(255 102 0 / 45%), transparent);
}

/* ---------- Floating UI ---------- */
.fab--top {
  border-color: var(--hairline);
  background: var(--glass-strong);
  -webkit-backdrop-filter: var(--glass-blur);
  backdrop-filter: var(--glass-blur);
  box-shadow: var(--sh-md);
}
:root[data-theme="dark"] .fab--top { background: var(--glass-strong); }

/* WhatsApp. The surface is a deep WhatsApp-family green rather than the brand
   #25d366, because the icon and the label are white and white on #25d366 is
   1.98:1. No type size rescues that -- even the large-text threshold is 3:1 and
   #25d366 only reaches 1.98 against white. #0b8043 -> #075f36 clears AA across
   the whole pill (5.0:1 and 6.9:1), and a gradient is only as accessible as its
   lightest stop, so both ends were checked. The brand green survives as the
   glow, where it carries no text and needs no ratio.

   Same trade as --grad-warm-deep on the primary button: keep the identity, get
   the conventional white label back. Do not lighten past #0c8a3e -- white fails
   above it. */
.fab--wa {
  background: linear-gradient(180deg, #0b8043 0%, #075f36 100%);
  box-shadow:
    0 1px 2px rgb(2 40 20 / 22%),
    0 16px 34px -16px rgb(37 211 102 / 60%),
    var(--lip);
}
.fab--wa:hover {
  box-shadow:
    0 2px 4px rgb(2 40 20 / 24%),
    0 22px 44px -18px rgb(37 211 102 / 78%),
    var(--lip);
}
/* Spring is section 28's token, so it is applied here rather than in the
   baseline: an engine without linear() keeps the plain ease above instead of
   dropping the transition entirely. */
.fab {
  transition: translate .5s var(--ease-spring), scale .5s var(--ease-spring),
              box-shadow .3s var(--ease);
}

/* ---------- Fallbacks ----------
   Without backdrop-filter a 72%-alpha panel is a translucent panel over live
   text, not frosted glass, so the glass tokens go near-opaque instead. */
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  :root { --glass: rgb(255 255 255 / 95%); --glass-strong: #fff; }
  :root[data-theme="dark"] { --glass: rgb(6 38 50 / 95%); --glass-strong: #052734; }
}
