/* ==== 00-site.css ==== */
/* ==========================================================================
   Core of Content - light prototype
   Direction: technical editorial. Blueprint on warm paper, not a dark stage.
   Arabic-first, RTL only. Latin is used for numerals and technical labels.
   ========================================================================== */

/* ---------------------------------------------------------------- 0. fonts */

/* Self-hosted, variable, two subsets. Google's stylesheet cost a second
   round trip before the face was even requested and the swap moved 0.13 of
   layout on the phone; served from here with a metrics-matched fallback,
   the same page settles at effectively zero. */

@font-face {
  font-family: "Cairo";
  src: url("../fonts/cairo-arabic.woff2") format("woff2");
  font-weight: 400 900;
  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;
}

@font-face {
  font-family: "Cairo";
  src: url("../fonts/cairo-latin.woff2") format("woff2");
  font-weight: 400 900;
  font-display: swap;
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
    U+02DA, U+02DC, U+2000-206F, U+20AC, U+2122, U+2212, U+FEFF, U+FFFD;
}

@font-face {
  font-family: "Space Grotesk";
  src: url("../fonts/grotesk-latin.woff2") format("woff2");
  font-weight: 500 700;
  font-display: swap;
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6,
    U+02DA, U+02DC, U+2000-206F, U+20AC, U+2122, U+2212, U+FEFF, U+FFFD;
}

/* Space Grotesk sets wider than Helvetica, so an unmatched fallback let every
   .mono run rewrap on swap. A long kicker went from one line to two and dragged
   the page under it down with it.

   Measured against the runs that actually wrap, which are Latin words: those
   need 102.3%. Space Grotesk's digits are wider still and want 106%, but a
   digit run is four characters and never reaches a line end, so the letters
   win. 100px of Space Grotesk is 98 up and 29 down, and the overrides are
   those divided by the size-adjust. Not Helvetica Neue in the stack: it is
   3.6% narrower than Helvetica and Arial, which measure identically, and one
   size-adjust cannot serve both. */
@font-face {
  font-family: "Grotesk Fallback";
  src: local("Helvetica"), local("Arial");
  size-adjust: 102.3%;
  ascent-override: 95.8%;
  descent-override: 28.3%;
  line-gap-override: 0%;
}

/* The fallback is remapped to Cairo's metrics so the swap changes glyphs
   and not line boxes. Without this the whole page reflows once. */
@font-face {
  font-family: "Cairo Fallback";
  src: local("Geeza Pro"), local("Segoe UI"), local("Arial");
  size-adjust: 104%;
  ascent-override: 96%;
  descent-override: 30%;
  line-gap-override: 0%;
}

/* --------------------------------------------------------------- 1. tokens */

:root {
  /* surfaces */
  --paper: oklch(98.8% 0.004 95);
  --paper-2: oklch(96.6% 0.007 95);
  --paper-3: oklch(94.2% 0.009 95);
  --card: oklch(100% 0 0);

  /* ink */
  --ink: oklch(22% 0.035 268);
  --ink-2: oklch(44% 0.025 268);
  /* 58% measured 4.29:1 on a white card, which is a fail. This is the muted
     tone for captions and meta, so it has to clear 4.5 on the lightest surface. */
  --ink-3: oklch(52% 0.022 268);

  /* brand */
  --indigo: oklch(31% 0.152 271);
  --indigo-2: oklch(42% 0.135 271);
  --indigo-wash: oklch(96% 0.018 271);
  --orange: oklch(59% 0.185 39);
  --orange-ink: oklch(48% 0.16 39);
  --orange-wash: oklch(96.5% 0.022 55);
  --mint: oklch(94% 0.045 195);
  --mint-deep: oklch(52% 0.075 205);
  --white: oklch(100% 0 0);
  --indigo-deep: oklch(24% 0.14 271);

  /* lines */
  --line: oklch(90.5% 0.008 268);
  --line-2: oklch(84% 0.012 268);
  --grid-line: oklch(88% 0.012 271 / 0.55);

  /* the accent a section owns. Scenes rewrite these two on <body>. */
  --accent: var(--indigo);
  --accent-wash: var(--indigo-wash);

  /* type */
  --font-ar: "Cairo", "Cairo Fallback", system-ui, sans-serif;
  --font-la: "Space Grotesk", "Grotesk Fallback", ui-monospace, monospace;

  --fs-display: clamp(2.3rem, 1.2rem + 4vw, 4.4rem);
  --fs-1: clamp(1.85rem, 1.25rem + 2.1vw, 3rem);
  --fs-2: clamp(1.45rem, 1.15rem + 1.1vw, 2.05rem);
  --fs-3: clamp(1.15rem, 1.05rem + 0.5vw, 1.38rem);
  --fs-4: clamp(1.02rem, 0.98rem + 0.2vw, 1.12rem);
  --fs-body: clamp(0.98rem, 0.95rem + 0.15vw, 1.04rem);
  --fs-sm: 0.92rem;
  --fs-xs: 0.8125rem;

  --lh-display: 1.22;
  --lh-head: 1.38;
  --lh-body: 1.8;

  /* space */
  --s1: 4px;
  --s2: 8px;
  --s3: 12px;
  --s4: 16px;
  --s5: 24px;
  --s6: 32px;
  --s7: 48px;
  --s8: 64px;
  --s9: 96px;
  --s10: 128px;
  --section-y: clamp(64px, 7vw, 112px);

  /* radius */
  --r-xs: 4px;
  --r-sm: 8px;
  --r-md: 14px;
  --r-lg: 24px;
  --r-xl: 34px;
  --r-full: 999px;

  /* elevation, tinted indigo so it never greys out the paper */
  --sh-1: 0 1px 2px oklch(31% 0.15 271 / 0.05), 0 2px 8px oklch(31% 0.15 271 / 0.04);
  --sh-2: 0 2px 4px oklch(31% 0.15 271 / 0.05), 0 12px 28px oklch(31% 0.15 271 / 0.07);
  --sh-3: 0 4px 8px oklch(31% 0.15 271 / 0.06), 0 28px 64px oklch(31% 0.15 271 / 0.1);

  /* motion */
  --ease-out: cubic-bezier(0.22, 1, 0.36, 1);
  --ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
  --t-fast: 160ms;
  --t-mid: 320ms;
  --t-slow: 720ms;

  --max: 1280px;
  --gutter: clamp(20px, 4.5vw, 64px);
  --header-h: 74px;
}

/* ---------------------------------------------------------------- 2. reset */

*,
*::before,
*::after {
  box-sizing: border-box;
}

html {
  -webkit-text-size-adjust: 100%;
  scroll-padding-top: calc(var(--header-h) + var(--s5));
}

body {
  margin: 0;
  background: var(--paper);
  color: var(--ink);
  font-family: var(--font-ar);
  font-size: var(--fs-body);
  font-weight: 400;
  line-height: var(--lh-body);
  font-optical-sizing: auto;
  overflow-x: hidden;
  -webkit-font-smoothing: antialiased;
  transition: background-color var(--t-slow) var(--ease-out);
}

img,
svg,
video {
  display: block;
  max-width: 100%;
}

/* The <img> keeps being the grid or flex child; the wrapper is not a box. */
picture {
  display: contents;
}

img {
  height: auto;
}

button,
input,
textarea,
select {
  font: inherit;
  color: inherit;
}

h1,
h2,
h3,
h4 {
  margin: 0;
  font-weight: 800;
  line-height: var(--lh-head);
  text-wrap: balance;
  /* Arabic letterforms connect. Tracking on them is a defect, not a style. */
  letter-spacing: 0;
}

p {
  margin: 0;
  text-wrap: pretty;
}

a {
  color: inherit;
  text-decoration: none;
}

ul,
ol {
  margin: 0;
  padding: 0;
  list-style: none;
}

::selection {
  background: var(--mint);
  color: var(--indigo);
}

:focus-visible {
  outline: 2px solid var(--indigo);
  outline-offset: 3px;
  border-radius: var(--r-xs);
}

/* ---------------------------------------------------- 3. paper & blueprint */

/* Grain plus a 32px blueprint grid. Both fixed, both inert, both cheap. */
.paper-grain,
.paper-grid {
  position: fixed;
  inset: 0;
  pointer-events: none;
  z-index: 0;
}

.paper-grid {
  background-image:
    linear-gradient(to left, var(--grid-line) 1px, transparent 1px),
    linear-gradient(to bottom, var(--grid-line) 1px, transparent 1px);
  background-size: 96px 96px;
  mask-image: radial-gradient(ellipse 120% 80% at 50% 0%, #000 0%, transparent 78%);
  opacity: 0.5;
}

.paper-grain {
  opacity: 0.32;
  mix-blend-mode: multiply;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='180' height='180' filter='url(%23n)' opacity='0.42'/%3E%3C/svg%3E");
}

/* Everything real sits above the two overlays. */
.site-header,
main,
.site-footer {
  position: relative;
  z-index: 1;
}

/* ---------------------------------------------------------- 4. primitives */

.wrap {
  width: 100%;
  max-width: var(--max);
  margin-inline: auto;
  padding-inline: var(--gutter);
}

.section {
  padding-block: var(--section-y);
  position: relative;
}

.section--wash {
  background: var(--paper-2);
}

/* The page carries one accent at a time. JS writes the scene onto <body> as
   you pass each section, and only these two variables change with it. */
body[data-scene="services"],
body[data-scene="why"] {
  --accent: var(--orange-ink);
  --accent-wash: var(--orange-wash);
}

body[data-scene="method"],
body[data-scene="sectors"] {
  --accent: var(--mint-deep);
  --accent-wash: oklch(97.5% 0.02 200);
}

.section--tint {
  background: var(--accent-wash);
  transition: background-color var(--t-slow) var(--ease-out);
}

.rule {
  height: 1px;
  background: var(--line);
  border: 0;
  margin: 0;
}

/* Latin numerals and technical labels. Tracking is safe here, not on Arabic. */
.mono {
  font-family: var(--font-la);
  font-variant-numeric: tabular-nums;
  letter-spacing: 0.04em;
}

.kicker {
  display: inline-flex;
  align-items: center;
  gap: var(--s3);
  font-size: var(--fs-xs);
  font-weight: 700;
  color: var(--accent);
  transition: color var(--t-slow) var(--ease-out);
}

.kicker::before {
  content: "";
  inline-size: 28px;
  block-size: 2px;
  background: currentColor;
  flex: none;
}

.kicker .mono {
  color: var(--ink-3);
  font-weight: 500;
}

.section-head {
  display: grid;
  gap: var(--s4);
  max-width: 62ch;
  margin-block-end: var(--s8);
}

.section-head h2 {
  font-size: var(--fs-1);
  font-weight: 900;
}

.section-head p {
  color: var(--ink-2);
  font-size: var(--fs-4);
}

.lead {
  color: var(--ink-2);
  font-size: var(--fs-4);
  max-width: 56ch;
}

/* ------------------------------------------------------------- 5. buttons */

.btn {
  --btn-bg: var(--indigo);
  --btn-fg: oklch(99% 0 0);
  display: inline-flex;
  align-items: center;
  gap: var(--s3);
  min-block-size: 48px;
  padding-inline: var(--s5);
  padding-block: var(--s3);
  border: 1px solid transparent;
  border-radius: var(--r-full);
  background: var(--btn-bg);
  color: var(--btn-fg);
  font-weight: 700;
  font-size: var(--fs-sm);
  cursor: pointer;
  position: relative;
  overflow: hidden;
  isolation: isolate;
  transition:
    transform var(--t-fast) var(--ease-out),
    box-shadow var(--t-mid) var(--ease-out),
    background-color var(--t-mid) var(--ease-out),
    color var(--t-mid) var(--ease-out);
}

/* The wash sweeps from the inline start, which is the right in RTL. */
.btn::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  background: var(--orange);
  transform: scaleX(0);
  transform-origin: right center;
  transition: transform var(--t-mid) var(--ease-out);
}

.btn:hover {
  transform: translateY(-2px);
  box-shadow: var(--sh-2);
}

.btn:hover::before {
  transform: scaleX(1);
}

.btn:active {
  transform: translateY(0) scale(0.985);
  box-shadow: var(--sh-1);
}

.btn .dot {
  inline-size: 7px;
  block-size: 7px;
  border-radius: 2px;
  background: currentColor;
  flex: none;
  transition: transform var(--t-mid) var(--ease-out);
}

.btn:hover .dot {
  transform: rotate(45deg);
}

.btn--ghost {
  --btn-bg: transparent;
  --btn-fg: var(--ink);
  border-color: var(--line-2);
}

.btn--ghost:hover {
  --btn-fg: oklch(99% 0 0);
  border-color: var(--orange);
}

.btn--sm {
  min-block-size: 42px;
  padding-inline: var(--s4);
  font-size: var(--fs-xs);
}

/* A text link that draws its own underline from the inline start. */
.link {
  display: inline-flex;
  align-items: center;
  gap: var(--s2);
  font-weight: 700;
  font-size: var(--fs-sm);
  color: var(--indigo);
  padding-block: 4px;
  position: relative;
}

.link::after {
  content: "";
  position: absolute;
  inset-inline: 0;
  inset-block-end: 0;
  block-size: 2px;
  background: var(--orange);
  transform: scaleX(0);
  transform-origin: right center;
  transition: transform var(--t-mid) var(--ease-out);
}

.link:hover {
  color: var(--orange-ink);
}

.link:hover::after {
  transform: scaleX(1);
}

.link svg {
  inline-size: 16px;
  block-size: 16px;
  transition: transform var(--t-mid) var(--ease-out);
}

.link:hover svg {
  transform: translateX(-4px);
}

/* --------------------------------------------------------------- 6. header */

.site-header {
  position: sticky;
  inset-block-start: 0;
  z-index: 60;
  background: oklch(98.8% 0.004 95 / 0.82);
  backdrop-filter: blur(14px) saturate(1.4);
  border-block-end: 1px solid transparent;
  transition:
    border-color var(--t-mid) var(--ease-out),
    box-shadow var(--t-mid) var(--ease-out);
}

.site-header[data-stuck="true"] {
  border-block-end-color: var(--line);
  box-shadow: 0 1px 0 oklch(31% 0.15 271 / 0.03), 0 10px 30px oklch(31% 0.15 271 / 0.05);
}

.header-inner {
  min-block-size: var(--header-h);
  display: flex;
  align-items: center;
  gap: var(--s6);
}

.brand {
  display: inline-flex;
  align-items: center;
  gap: var(--s3);
  flex: none;
}

.brand-mark {
  inline-size: 34px;
  block-size: 34px;
  flex: none;
}

.brand-word {
  font-family: var(--font-la);
  font-weight: 700;
  font-size: 1.02rem;
  letter-spacing: 0.14em;
  color: var(--ink);
  line-height: 1;
}

.brand-sub {
  display: block;
  font-family: var(--font-ar);
  font-size: 0.68rem;
  font-weight: 600;
  letter-spacing: 0;
  color: var(--ink-3);
  line-height: 1.6;
}

/* Desktop: the drawer is not a box, its children are the flex items.
   Mobile: it becomes the panel that holds them both. */
.header-drawer {
  display: contents;
}

.nav {
  display: flex;
  align-items: center;
  gap: var(--s2);
  margin-inline: auto;
}

.nav a {
  padding: 10px var(--s4);
  border-radius: var(--r-full);
  font-size: var(--fs-sm);
  font-weight: 600;
  color: var(--ink-2);
  position: relative;
  transition:
    color var(--t-fast) var(--ease-out),
    background-color var(--t-fast) var(--ease-out);
}

.nav a:hover {
  color: var(--ink);
  background: var(--paper-3);
}

.nav a[aria-current="page"] {
  color: var(--indigo);
}

.nav a[aria-current="page"]::after {
  content: "";
  position: absolute;
  inset-inline: var(--s4);
  inset-block-end: 2px;
  block-size: 2px;
  border-radius: 2px;
  background: var(--orange);
}

.header-cta {
  flex: none;
}

.nav-toggle {
  display: none;
  align-items: center;
  justify-content: center;
  inline-size: 46px;
  block-size: 46px;
  margin-inline-start: auto;
  border: 1px solid var(--line-2);
  border-radius: var(--r-full);
  background: var(--card);
  cursor: pointer;
}

.nav-toggle svg {
  inline-size: 20px;
  block-size: 20px;
}

.nav-toggle .icon-close,
.nav-toggle[aria-expanded="true"] .icon-open {
  display: none;
}

.nav-toggle[aria-expanded="true"] .icon-close {
  display: block;
}

@keyframes sheet {
  from {
    opacity: 0;
    transform: translateY(-8px);
  }
}

/* ---------------------------------------------------------------- 7. hero */

.hero {
  padding-block: clamp(56px, 7vw, 104px) 0;
  position: relative;
}

.hero h1 {
  font-size: var(--fs-display);
  font-weight: 900;
  line-height: var(--lh-display);
  margin-block: var(--s5) var(--s5);
}

/* The emphasis rule is a text-decoration, not a positioned bar. An absolutely
   positioned pseudo is anchored to the inline box, whose height follows the
   font metrics and drifts between sizes; text-underline-offset is measured
   from the baseline and lands identically at 320 and at 1440. */
.hero h1 .em {
  color: var(--indigo);
  white-space: nowrap;
  text-decoration: underline;
  text-decoration-color: transparent;
  text-decoration-thickness: 0.15em;
  text-underline-offset: 0.04em;
  text-decoration-skip-ink: none;
  animation: swash 700ms var(--ease-out) 520ms forwards;
}

@keyframes swash {
  to {
    text-decoration-color: var(--mint);
  }
}

.hero-actions {
  display: flex;
  flex-wrap: wrap;
  gap: var(--s3);
  margin-block-start: var(--s6);
}

.chip {
  display: inline-flex;
  align-items: center;
  gap: var(--s2);
  padding: 9px var(--s4);
  border-radius: var(--r-full);
  background: oklch(100% 0 0 / 0.9);
  backdrop-filter: blur(8px);
  border: 1px solid oklch(100% 0 0 / 0.6);
  font-size: var(--fs-xs);
  font-weight: 700;
  color: var(--indigo);
  box-shadow: var(--sh-1);
}

.chip svg {
  inline-size: 15px;
  block-size: 15px;
  color: var(--orange-ink);
}

/* Discipline marquee under the hero. */
.marquee {
  border-block: 1px solid var(--line);
  background: var(--card);
  overflow: hidden;
  padding-block: var(--s4);
  -webkit-mask-image: linear-gradient(to left, transparent, #000 8%, #000 92%, transparent);
  mask-image: linear-gradient(to left, transparent, #000 8%, #000 92%, transparent);
}

.marquee-track {
  display: flex;
  gap: var(--s7);
  inline-size: max-content;
  animation: slide 34s linear infinite;
}

.marquee:hover .marquee-track {
  animation-play-state: paused;
}

@keyframes slide {
  to {
    transform: translateX(50%);
  }
}

.marquee-track span {
  display: inline-flex;
  align-items: center;
  gap: var(--s4);
  font-size: var(--fs-sm);
  font-weight: 700;
  color: var(--ink-2);
  white-space: nowrap;
}

.marquee-track span::after {
  content: "";
  inline-size: 5px;
  block-size: 5px;
  border-radius: 2px;
  background: var(--orange);
  transform: rotate(45deg);
}

/* ------------------------------------------------------------- 8. metrics */

.metrics {
  display: grid;
  /* auto-fit, not repeat(4): the same component carries 2, 3, 4 and 5 cells
     across the site and a fixed track count leaves a hole on the odd counts. */
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 190px), 1fr));
  gap: 1px;
  background: var(--line);
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  overflow: hidden;
}

.metric {
  background: var(--card);
  padding: var(--s6) var(--s5);
  display: grid;
  gap: var(--s2);
  align-content: start;
  transition: background-color var(--t-mid) var(--ease-out);
}

.metric:hover {
  background: var(--paper-2);
}

.metric b {
  font-family: var(--font-la);
  font-size: clamp(2.2rem, 1.4rem + 2.4vw, 3.2rem);
  font-weight: 700;
  line-height: 1;
  color: var(--indigo);
  font-variant-numeric: tabular-nums;
  letter-spacing: -0.02em;
}

.metric h3 {
  font-size: var(--fs-4);
  font-weight: 700;
}

.metric p {
  font-size: var(--fs-sm);
  color: var(--ink-3);
  line-height: 1.7;
}

/* --------------------------------------------------------- 9. project cards */

.project-list {
  display: grid;
  gap: var(--s7);
}

.pcard {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: 0;
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  overflow: hidden;
  background: var(--card);
  transition:
    transform var(--t-mid) var(--ease-out),
    box-shadow var(--t-mid) var(--ease-out),
    border-color var(--t-mid) var(--ease-out);
}

.pcard:hover {
  transform: translateY(-4px);
  border-color: var(--line-2);
  box-shadow: var(--sh-3);
}

.pcard:nth-child(even) .pcard-media {
  order: 2;
}

.pcard-media {
  position: relative;
  overflow: hidden;
  background: var(--paper-3);
  aspect-ratio: 4 / 3;
}

.pcard-media img {
  inline-size: 100%;
  block-size: 100%;
  object-fit: cover;
  transition: transform 900ms var(--ease-out);
}

.pcard:hover .pcard-media img {
  transform: scale(1.05);
}

.pcard-body {
  padding: clamp(24px, 3vw, 44px);
  display: grid;
  align-content: center;
  gap: var(--s4);
}

.pcard-meta {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--s3);
  font-size: var(--fs-xs);
  color: var(--ink-3);
}

.pcard-body h3 {
  font-size: var(--fs-2);
  font-weight: 900;
}

/* The Latin name is a caption under the Arabic title, never inside it. */
.lat-sub {
  font-size: var(--fs-sm);
  font-weight: 500;
  color: var(--ink-3);
  text-align: end;
  margin-block-start: -10px;
}

.lat-sub span {
  color: var(--ink-3);
  opacity: 0.7;
}

.pcard-body p {
  color: var(--ink-2);
  font-size: var(--fs-sm);
  line-height: 1.85;
}

.tag {
  display: inline-flex;
  align-items: center;
  padding: 5px 11px;
  border-radius: var(--r-full);
  font-size: 0.75rem;
  font-weight: 700;
  background: var(--indigo-wash);
  color: var(--indigo);
  line-height: 1.7;
}

.tag--live {
  background: var(--orange-wash);
  color: var(--orange-ink);
}

.pcard-contrib {
  display: flex;
  flex-wrap: wrap;
  gap: var(--s2);
  padding-block-start: var(--s3);
  border-block-start: 1px solid var(--line);
}

.pcard-contrib span {
  font-size: 0.75rem;
  color: var(--ink-3);
  padding: 4px 10px;
  border: 1px solid var(--line);
  border-radius: var(--r-xs);
  line-height: 1.7;
}

/* Compact grid used on the projects index. */
.project-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(min(100%, 330px), 1fr));
  gap: var(--s5);
}

.gcard {
  display: grid;
  grid-template-rows: auto 1fr;
  border: 1px solid var(--line);
  border-radius: var(--r-md);
  overflow: hidden;
  background: var(--card);
  transition:
    transform var(--t-mid) var(--ease-out),
    box-shadow var(--t-mid) var(--ease-out),
    border-color var(--t-mid) var(--ease-out);
}

.gcard:hover {
  transform: translateY(-4px);
  border-color: var(--line-2);
  box-shadow: var(--sh-2);
}

.gcard-media {
  position: relative;
  aspect-ratio: 4 / 3;
  overflow: hidden;
  background: var(--paper-3);
}

.gcard-media img {
  inline-size: 100%;
  block-size: 100%;
  object-fit: cover;
  transition: transform 800ms var(--ease-out);
}

.gcard:hover .gcard-media img {
  transform: scale(1.06);
}

.gcard-no {
  position: absolute;
  inset-block-start: var(--s3);
  inset-inline-start: var(--s3);
  padding: 4px 9px;
  border-radius: var(--r-xs);
  background: oklch(100% 0 0 / 0.92);
  font-family: var(--font-la);
  font-size: 0.7rem;
  font-weight: 700;
  color: var(--indigo);
}

.gcard-body {
  padding: var(--s5);
  display: grid;
  gap: var(--s3);
  align-content: start;
}

.gcard-body h3 {
  font-size: var(--fs-3);
  font-weight: 800;
}

.gcard-body p {
  font-size: var(--fs-sm);
  color: var(--ink-2);
  line-height: 1.8;
}

.gcard-foot {
  margin-block-start: auto;
  padding-block-start: var(--s3);
  border-block-start: 1px solid var(--line);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--s3);
  font-size: var(--fs-xs);
  color: var(--ink-3);
}

/* Filter chips on the projects index. */
.filters {
  display: flex;
  flex-wrap: wrap;
  gap: var(--s2);
  margin-block-end: var(--s6);
}

.filter {
  min-block-size: 44px;
  padding-inline: var(--s4);
  border: 1px solid var(--line-2);
  border-radius: var(--r-full);
  background: var(--card);
  font-size: var(--fs-sm);
  font-weight: 600;
  color: var(--ink-2);
  cursor: pointer;
  transition:
    background-color var(--t-fast) var(--ease-out),
    color var(--t-fast) var(--ease-out),
    border-color var(--t-fast) var(--ease-out);
}

.filter:hover {
  border-color: var(--indigo);
  color: var(--indigo);
}

.filter[aria-pressed="true"] {
  background: var(--indigo);
  border-color: var(--indigo);
  color: oklch(99% 0 0);
}

.empty-state {
  display: none;
  padding: var(--s8) var(--s5);
  text-align: center;
  border: 1px dashed var(--line-2);
  border-radius: var(--r-md);
  color: var(--ink-2);
}

.empty-state[data-visible="true"] {
  display: grid;
  gap: var(--s4);
  justify-items: center;
}

/* ------------------------------------------------------------ 10. services */

.svc-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 300px), 1fr));
  gap: 1px;
  background: var(--line);
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  overflow: hidden;
}

.svc {
  background: var(--card);
  display: grid;
  grid-template-rows: auto 1fr;
  align-content: start;
  position: relative;
  overflow: hidden;
  transition: background-color var(--t-mid) var(--ease-out);
}

.svc-media {
  position: relative;
  aspect-ratio: 16 / 9;
  overflow: hidden;
  background: var(--paper-3);
}

.svc-media img {
  inline-size: 100%;
  block-size: 100%;
  object-fit: cover;
  transition: transform 800ms var(--ease-out);
}

.svc:hover .svc-media img {
  transform: scale(1.05);
}

/* Inside the media, not straddling its edge: the media clips its own overflow
   so the image can scale on hover, and a straddling badge gets cut in half. */
.svc-media .svc-icon {
  position: absolute;
  inset-block-end: var(--s3);
  inset-inline-start: var(--s3);
  box-shadow: var(--sh-1);
}

.svc-copy {
  padding: var(--s6);
  display: grid;
  gap: var(--s3);
  align-content: start;
}

.svc::after {
  content: "";
  position: absolute;
  inset-block-start: 0;
  inset-inline: 0;
  block-size: 3px;
  background: var(--orange);
  transform: scaleX(0);
  transform-origin: right center;
  transition: transform var(--t-mid) var(--ease-out);
}

.svc:hover {
  background: var(--paper-2);
}

.svc:hover::after {
  transform: scaleX(1);
}

.svc-top {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--s4);
}

.svc-icon {
  inline-size: 42px;
  block-size: 42px;
  border-radius: var(--r-sm);
  display: grid;
  place-items: center;
  background: oklch(100% 0 0 / 0.92);
  backdrop-filter: blur(6px);
  color: var(--indigo);
  transition:
    background-color var(--t-mid) var(--ease-out),
    color var(--t-mid) var(--ease-out),
    transform var(--t-mid) var(--ease-out);
}

.svc-icon svg {
  inline-size: 23px;
  block-size: 23px;
}

.svc:hover .svc-icon {
  background: var(--indigo);
  color: var(--mint);
  transform: rotate(-6deg);
}

.svc-no {
  font-family: var(--font-la);
  font-size: var(--fs-xs);
  font-weight: 700;
  color: var(--ink-3);
}

.svc h3 {
  font-size: var(--fs-3);
  font-weight: 800;
}

.svc p {
  font-size: var(--fs-sm);
  color: var(--ink-2);
  line-height: 1.85;
}

.svc ul {
  display: flex;
  flex-wrap: wrap;
  gap: var(--s2);
  margin-block-start: var(--s2);
}

.svc li {
  font-size: 0.75rem;
  color: var(--ink-3);
  padding: 4px 10px;
  border: 1px solid var(--line);
  border-radius: var(--r-xs);
  line-height: 1.7;
}

/* ----------------------------------------------------------- 11. method */

.method {
  display: grid;
  grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.1fr);
  gap: clamp(32px, 5vw, 80px);
  align-items: start;
}

.method-aside {
  position: sticky;
  inset-block-start: calc(var(--header-h) + var(--s6));
  display: grid;
  gap: var(--s5);
}

.method-figure {
  border-radius: var(--r-lg);
  overflow: hidden;
  border: 1px solid var(--line);
  aspect-ratio: 4 / 3;
  background: var(--paper-3);
}

.method-figure img {
  inline-size: 100%;
  block-size: 100%;
  object-fit: cover;
}

.steps {
  position: relative;
  display: grid;
  gap: var(--s2);
  padding-inline-start: 0;
}

/* The rail and its fill. The fill height is written by JS as a percentage. */
/* The rail sits under the dot column, which is the inline start. */
.steps::before,
.steps-fill {
  content: "";
  position: absolute;
  inset-block-start: 22px;
  inset-inline-start: 17px;
  inline-size: 2px;
  border-radius: 2px;
}

.steps::before {
  block-size: calc(100% - 44px);
  background: var(--line);
}

.steps-fill {
  block-size: 0;
  background: var(--orange);
  transition: block-size 260ms linear;
  max-block-size: calc(100% - 44px);
}

.step {
  display: grid;
  grid-template-columns: 36px 1fr;
  gap: var(--s5);
  padding-block: var(--s5);
  align-items: start;
  position: relative;
}

.step-dot {
  inline-size: 36px;
  block-size: 36px;
  border-radius: var(--r-full);
  border: 2px solid var(--line-2);
  background: var(--paper);
  display: grid;
  place-items: center;
  font-family: var(--font-la);
  font-size: 0.8rem;
  font-weight: 700;
  color: var(--ink-3);
  z-index: 1;
  transition:
    border-color var(--t-mid) var(--ease-out),
    background-color var(--t-mid) var(--ease-out),
    color var(--t-mid) var(--ease-out);
}

.step[data-on="true"] .step-dot {
  border-color: var(--orange);
  background: var(--orange);
  color: oklch(99% 0 0);
}

.step h3 {
  font-size: var(--fs-3);
  font-weight: 800;
  transition: color var(--t-mid) var(--ease-out);
}

.step[data-on="true"] h3 {
  color: var(--indigo);
}

.step p {
  color: var(--ink-2);
  font-size: var(--fs-sm);
  margin-block-start: var(--s2);
  line-height: 1.85;
}

/* -------------------------------------------------------------- 12. split */

.split {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: clamp(32px, 5vw, 80px);
  align-items: center;
}

.split-media {
  border-radius: var(--r-lg);
  overflow: hidden;
  border: 1px solid var(--line);
  aspect-ratio: 4 / 3;
  background: var(--paper-3);
  box-shadow: var(--sh-2);
}

.split-media img {
  inline-size: 100%;
  block-size: 100%;
  object-fit: cover;
}

.split-body {
  display: grid;
  gap: var(--s5);
  align-content: start;
}

/* A heading inside a half-width column takes the smaller step. At --fs-1 it
   wraps to four ragged lines and balance cannot save it. */
.split-body h2 {
  font-size: var(--fs-2);
  font-weight: 900;
}

.split-body p {
  color: var(--ink-2);
}

.pill-row {
  display: flex;
  flex-wrap: wrap;
  gap: var(--s2);
}

.pill {
  padding: 7px 14px;
  border: 1px solid var(--line-2);
  border-radius: var(--r-full);
  font-size: var(--fs-xs);
  font-weight: 600;
  color: var(--ink-2);
  background: var(--card);
  line-height: 1.7;
}

/* ------------------------------------------------------- 13. why (bento) */

.why {
  display: grid;
  grid-template-columns: repeat(12, minmax(0, 1fr));
  gap: var(--s5);
}

.why-a {
  grid-column: span 7;
}

.why-b {
  grid-column: span 5;
}

.why-c {
  grid-column: span 5;
}

.why-d {
  grid-column: span 7;
}

.why-card {
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  background: var(--card);
  padding: clamp(24px, 3vw, 44px);
  display: grid;
  gap: var(--s4);
  align-content: start;
  position: relative;
  overflow: hidden;
  transition:
    border-color var(--t-mid) var(--ease-out),
    box-shadow var(--t-mid) var(--ease-out);
}

.why-card:hover {
  border-color: var(--line-2);
  box-shadow: var(--sh-2);
}

.why-card h3 {
  font-size: var(--fs-3);
  font-weight: 800;
}

.why-card p {
  color: var(--ink-2);
  font-size: var(--fs-sm);
  line-height: 1.85;
}

/* The copy is pinned to the bottom over its own scrim. Letting it flow from
   the top puts white text on the bright half of the photograph. */
.why-card--photo {
  display: block;
  padding: 0;
  min-block-size: 320px;
}

.why-card--photo img {
  inline-size: 100%;
  block-size: 100%;
  object-fit: cover;
  position: absolute;
  inset: 0;
}

.why-card--photo .why-overlay {
  position: absolute;
  inset-inline: 0;
  inset-block-end: 0;
  z-index: 1;
  padding: clamp(28px, 3.5vw, 44px);
  background: linear-gradient(
    to top,
    oklch(18% 0.04 271 / 0.94),
    oklch(18% 0.04 271 / 0.72) 52%,
    transparent
  );
  color: oklch(99% 0 0);
  display: grid;
  gap: var(--s3);
}

.why-card--photo .why-overlay p {
  color: oklch(93% 0.01 271);
}

.why-figure {
  font-family: var(--font-la);
  font-size: clamp(3rem, 2rem + 4vw, 5rem);
  font-weight: 700;
  line-height: 0.95;
  color: var(--indigo);
  letter-spacing: -0.03em;
}

.spec-list {
  display: grid;
  gap: 0;
}

.spec-list li {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--s4);
  padding-block: var(--s3);
  border-block-end: 1px solid var(--line);
  font-size: var(--fs-sm);
}

.spec-list li:last-child {
  border-block-end: 0;
}

.spec-list b {
  font-weight: 700;
}

/* An icon inside the label is a marker, not a heading glyph: without a size it
   inherits the sprite's own box and swamps the row. */
.spec-list b svg {
  inline-size: 17px;
  block-size: 17px;
  vertical-align: -3px;
  margin-inline-end: 4px;
  color: var(--ink-3);
}

.spec-list .mono {
  color: var(--ink-3);
  font-size: var(--fs-xs);
  /* Not flex:none. A numeral never needs to shrink, but the same slot carries
     a Latin project name, and an unshrinkable one scrolls the page at 320. */
  flex: 0 1 auto;
  min-inline-size: 0;
  overflow-wrap: anywhere;
  text-align: end;
}

/* -------------------------------------------------------------- 14. sectors */

.sector-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 240px), 1fr));
  gap: var(--s4);
}

.sector {
  border: 1px solid var(--line);
  border-radius: var(--r-md);
  background: var(--card);
  display: grid;
  grid-template-rows: auto 1fr;
  align-content: start;
  overflow: hidden;
  transition:
    transform var(--t-mid) var(--ease-out),
    border-color var(--t-mid) var(--ease-out),
    box-shadow var(--t-mid) var(--ease-out);
}

.sector:hover {
  transform: translateY(-3px);
  border-color: var(--indigo);
  box-shadow: var(--sh-2);
}

.sector-media {
  position: relative;
  aspect-ratio: 5 / 3;
  overflow: hidden;
  background: var(--paper-3);
}

.sector-media img {
  inline-size: 100%;
  block-size: 100%;
  object-fit: cover;
  transition: transform 800ms var(--ease-out);
}

.sector:hover .sector-media img {
  transform: scale(1.06);
}

.sector-icon {
  position: absolute;
  inset-block-start: var(--s3);
  inset-inline-start: var(--s3);
  inline-size: 38px;
  block-size: 38px;
  border-radius: var(--r-sm);
  display: grid;
  place-items: center;
  background: oklch(100% 0 0 / 0.92);
  backdrop-filter: blur(6px);
  color: var(--orange-ink);
  box-shadow: var(--sh-1);
}

.sector-icon svg {
  inline-size: 20px;
  block-size: 20px;
}

.sector-copy {
  padding: var(--s5);
  display: grid;
  gap: var(--s2);
  align-content: start;
}

.sector h3 {
  font-size: var(--fs-4);
  font-weight: 700;
}

.sector p {
  font-size: var(--fs-sm);
  color: var(--ink-3);
  line-height: 1.8;
}

/* ------------------------------------------------------------- 15. closing */

.closing {
  position: relative;
  overflow: hidden;
  border-radius: var(--r-xl);
  isolation: isolate;
  min-block-size: clamp(360px, 42vw, 520px);
  display: grid;
  align-items: center;
}

.closing img {
  position: absolute;
  inset: 0;
  inline-size: 100%;
  block-size: 100%;
  object-fit: cover;
  z-index: -2;
}

.closing::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  background: linear-gradient(to left, oklch(22% 0.06 271 / 0.9), oklch(22% 0.06 271 / 0.45));
}

.closing-inner {
  padding: clamp(32px, 5vw, 72px);
  display: grid;
  gap: var(--s5);
  /* ch is measured at body size, so a ch cap starves a display-size heading. */
  max-width: min(100%, 640px);
  color: oklch(99% 0 0);
}

.closing-inner h2 {
  font-size: var(--fs-2);
  font-weight: 900;
}

.closing-inner p {
  color: oklch(92% 0.012 271);
}

.closing .btn--ghost {
  --btn-fg: oklch(99% 0 0);
  border-color: oklch(100% 0 0 / 0.5);
}

/* --------------------------------------------------------------- 16. forms */

.form {
  display: grid;
  gap: var(--s5);
}

.field {
  display: grid;
  gap: var(--s2);
}

.field label {
  font-size: var(--fs-sm);
  font-weight: 700;
}

.field .hint {
  font-size: var(--fs-xs);
  color: var(--ink-3);
  font-weight: 400;
}

.field input,
.field textarea,
.field select {
  min-block-size: 50px;
  padding: var(--s3) var(--s4);
  border: 1px solid var(--line-2);
  border-radius: var(--r-sm);
  background: var(--card);
  font-size: var(--fs-sm);
  transition:
    border-color var(--t-fast) var(--ease-out),
    box-shadow var(--t-fast) var(--ease-out);
}

.field textarea {
  min-block-size: 140px;
  resize: vertical;
  line-height: 1.8;
}

.field input:hover,
.field textarea:hover,
.field select:hover {
  border-color: var(--ink-3);
}

.field input:focus,
.field textarea:focus,
.field select:focus {
  outline: none;
  border-color: var(--indigo);
  box-shadow: 0 0 0 3px var(--indigo-wash);
}

.field input[dir="ltr"] {
  text-align: end;
}

.field .error {
  font-size: var(--fs-xs);
  color: var(--orange-ink);
  font-weight: 600;
  min-block-size: 1.2em;
}

.field[data-invalid="true"] input,
.field[data-invalid="true"] textarea,
.field[data-invalid="true"] select {
  border-color: var(--orange);
}

.form-row {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--s5);
}

.form-note {
  font-size: var(--fs-xs);
  color: var(--ink-3);
}

.form-status {
  display: none;
  gap: var(--s3);
  align-items: flex-start;
  padding: var(--s4) var(--s5);
  border-radius: var(--r-sm);
  font-size: var(--fs-sm);
  line-height: 1.8;
}

.form-status[data-state="ok"] {
  display: flex;
  background: var(--mint);
  color: oklch(32% 0.06 205);
}

.form-status[data-state="error"] {
  display: flex;
  background: var(--orange-wash);
  color: var(--orange-ink);
}

.form-status svg {
  inline-size: 20px;
  block-size: 20px;
  flex: none;
  margin-block-start: 3px;
}

.btn[aria-busy="true"] {
  pointer-events: none;
  opacity: 0.75;
}

.btn[aria-busy="true"] .dot {
  border-radius: var(--r-full);
  animation: pulse 900ms var(--ease-in-out) infinite;
}

@keyframes pulse {
  50% {
    transform: scale(1.9);
    opacity: 0.5;
  }
}

/* --------------------------------------------------------- 17. page header */

.page-hero {
  padding-block: clamp(48px, 6vw, 88px) var(--s8);
  border-block-end: 1px solid var(--line);
}

.page-hero h1 {
  font-size: var(--fs-1);
  font-weight: 900;
  margin-block: var(--s4) var(--s4);
  max-width: 20ch;
}

.crumbs {
  display: flex;
  align-items: center;
  gap: var(--s2);
  font-size: var(--fs-xs);
  color: var(--ink-3);
  margin-block-end: var(--s5);
}

.crumbs a:hover {
  color: var(--indigo);
}

.crumbs span[aria-hidden] {
  opacity: 0.5;
}

/* ------------------------------------------------------- 18. project detail */

.detail-hero {
  border-radius: var(--r-xl);
  overflow: hidden;
  border: 1px solid var(--line);
  aspect-ratio: 16 / 8;
  background: var(--paper-3);
  box-shadow: var(--sh-2);
}

.detail-hero img {
  inline-size: 100%;
  block-size: 100%;
  object-fit: cover;
}

.detail-grid {
  display: grid;
  grid-template-columns: minmax(0, 1.4fr) minmax(0, 0.6fr);
  gap: clamp(32px, 5vw, 72px);
  align-items: start;
}

.detail-body {
  display: grid;
  gap: var(--s6);
}

.detail-body h2 {
  font-size: var(--fs-2);
  font-weight: 900;
}

.detail-body p {
  color: var(--ink-2);
}

.detail-aside {
  position: sticky;
  inset-block-start: calc(var(--header-h) + var(--s6));
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  background: var(--card);
  padding: var(--s6);
  display: grid;
  gap: var(--s4);
}

.detail-aside h2 {
  font-size: var(--fs-4);
  font-weight: 800;
}

.next-project {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--s5);
  flex-wrap: wrap;
  padding: var(--s6);
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  background: var(--card);
  transition:
    border-color var(--t-mid) var(--ease-out),
    box-shadow var(--t-mid) var(--ease-out);
}

.next-project:hover {
  border-color: var(--indigo);
  box-shadow: var(--sh-2);
}

.next-project strong {
  display: block;
  font-size: var(--fs-2);
  font-weight: 900;
}

/* ------------------------------------------------- 18b. gallery & lightbox */

.page-hero-media {
  margin: var(--s7) 0 0;
  border-radius: var(--r-xl);
  overflow: hidden;
  border: 1px solid var(--line);
  aspect-ratio: 16 / 6;
  background: var(--paper-3);
  box-shadow: var(--sh-2);
}

.page-hero-media img {
  inline-size: 100%;
  block-size: 100%;
  object-fit: cover;
}

.gallery-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: var(--s4);
}

.shot {
  padding: 0;
  border: 1px solid var(--line);
  border-radius: var(--r-md);
  overflow: hidden;
  background: var(--paper-3);
  aspect-ratio: 4 / 3;
  cursor: zoom-in;
  position: relative;
  transition:
    border-color var(--t-mid) var(--ease-out),
    box-shadow var(--t-mid) var(--ease-out);
}

.shot img {
  inline-size: 100%;
  block-size: 100%;
  object-fit: cover;
  transition: transform 700ms var(--ease-out);
}

.shot:hover {
  border-color: var(--indigo);
  box-shadow: var(--sh-2);
}

.shot:hover img {
  transform: scale(1.05);
}

.shot::after {
  content: "";
  position: absolute;
  inset: 0;
  background: oklch(31% 0.15 271 / 0);
  transition: background-color var(--t-mid) var(--ease-out);
}

.shot:hover::after {
  background: oklch(31% 0.15 271 / 0.12);
}

/* <dialog> is used on purpose: it traps focus, closes on Escape and gives a
   real ::backdrop, none of which a div reimplements correctly. */
/* --------------------------------------------------- 18b. project slider */
/* Swipe is the browser's own scroll, not a drag reimplemented in JS: it keeps
   momentum, rubber-banding and the RTL direction for free. */

.slider {
  position: relative;
  border-radius: var(--r-xl);
  border: 1px solid var(--line);
  overflow: hidden;
  background: var(--paper-3);
  box-shadow: var(--sh-2);
}

.slider-track {
  display: flex;
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  scroll-behavior: smooth;
  scrollbar-width: none;
  overscroll-behavior-x: contain;
  /* pan-x has to be here: pan-y alone forbids the horizontal drag and the swipe
     dies silently while every button still works. */
  touch-action: pan-x pan-y pinch-zoom;
}

.slider-track::-webkit-scrollbar {
  display: none;
}

.slider-track:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: -4px;
}

.slide {
  position: relative;
  flex: 0 0 100%;
  margin: 0;
  scroll-snap-align: center;
  scroll-snap-stop: always;
  aspect-ratio: 16 / 8;
  background: var(--paper-3);
}

.slide img {
  inline-size: 100%;
  block-size: 100%;
  object-fit: cover;
  -webkit-user-drag: none;
  user-select: none;
}

.slide-zoom {
  position: absolute;
  inset-block-start: var(--s3);
  inset-inline-end: var(--s3);
  inline-size: 44px;
  block-size: 44px;
  display: grid;
  place-items: center;
  border: 0;
  border-radius: var(--r-sm);
  color: var(--paper);
  background: oklch(31% 0.15 271 / 0.5);
  backdrop-filter: blur(6px);
  cursor: zoom-in;
  opacity: 0;
  transition: opacity var(--t-mid) var(--ease-out), background-color var(--t-mid) var(--ease-out);
}

.slide-zoom svg {
  inline-size: 18px;
  block-size: 18px;
}

.slider:hover .slide-zoom,
.slide-zoom:focus-visible {
  opacity: 1;
}

.slide-zoom:hover {
  background: var(--indigo);
}

.slider-arrow {
  position: absolute;
  inset-block-start: calc(50% - 44px);
  inline-size: 44px;
  block-size: 44px;
  display: grid;
  place-items: center;
  border: 0;
  border-radius: 999px;
  color: var(--ink);
  background: oklch(98.8% 0.004 95 / 0.86);
  backdrop-filter: blur(8px);
  box-shadow: var(--sh-2);
  cursor: pointer;
  transition:
    background-color var(--t-mid) var(--ease-out),
    color var(--t-mid) var(--ease-out),
    opacity var(--t-mid) var(--ease-out);
}

.slider-arrow:hover {
  background: var(--indigo);
  color: var(--paper);
}

.slider-arrow[disabled] {
  opacity: 0.35;
  cursor: default;
}

.slider-prev {
  inset-inline-start: var(--s4);
}

.slider-next {
  inset-inline-end: var(--s4);
}

/* The glyph points left. In RTL "next" sits on the left and keeps it; "prev"
   sits on the right and has to point back the other way. */
.slider-prev svg {
  transform: scaleX(-1);
}

.slider-bar {
  display: flex;
  align-items: center;
  gap: var(--s3);
  padding: var(--s3);
  border-block-start: 1px solid var(--line);
  background: var(--paper-2, var(--paper));
}

.slider-thumbs {
  display: flex;
  gap: var(--s2);
  flex: 1;
  min-inline-size: 0;
  overflow-x: auto;
  scrollbar-width: none;
}

.slider-thumbs::-webkit-scrollbar {
  display: none;
}

.thumb {
  flex: 0 0 auto;
  inline-size: 72px;
  aspect-ratio: 4 / 3;
  padding: 0;
  border: 1px solid var(--line);
  border-radius: var(--r-sm);
  overflow: hidden;
  background: var(--paper-3);
  cursor: pointer;
  opacity: 0.55;
  transition:
    opacity var(--t-mid) var(--ease-out),
    border-color var(--t-mid) var(--ease-out);
}

.thumb img {
  inline-size: 100%;
  block-size: 100%;
  object-fit: cover;
}

.thumb:hover {
  opacity: 0.85;
}

.thumb[aria-current="true"] {
  opacity: 1;
  border-color: var(--accent);
  box-shadow: 0 0 0 1px var(--accent);
}

.slider-count {
  font-size: var(--fs-xs);
  color: var(--ink-3);
  white-space: nowrap;
}

.slider-play {
  inline-size: 44px;
  block-size: 44px;
  display: grid;
  place-items: center;
  border: 1px solid var(--line);
  border-radius: var(--r-sm);
  background: transparent;
  color: var(--ink-2);
  cursor: pointer;
  transition: color var(--t-mid) var(--ease-out), border-color var(--t-mid) var(--ease-out);
}

.slider-play:hover {
  color: var(--indigo);
  border-color: var(--indigo);
}

.slider-play svg {
  inline-size: 16px;
  block-size: 16px;
  fill: currentColor;
  stroke: currentColor;
}

.slider-play .icon-play,
.slider-play[aria-pressed="true"] .icon-pause {
  display: none;
}

.slider-play[aria-pressed="true"] .icon-play {
  display: block;
}

@media (max-width: 640px) {
  .slider-arrow {
    display: none;
  }

  .thumb {
    inline-size: 56px;
  }
}

@media (prefers-reduced-motion: reduce) {
  .slider-track {
    scroll-behavior: auto;
  }
}

/* -------------------------------------------------- 18c. direct lines */

.people {
  list-style: none;
  margin: var(--s4) 0 0;
  padding: 0;
  display: grid;
  gap: var(--s3);
}

.person {
  display: flex;
  gap: var(--s3);
  min-inline-size: 0;
  padding: var(--s4);
  border: 1px solid var(--line);
  border-radius: var(--r-md);
  background: var(--paper);
}

.person-mark {
  flex: 0 0 auto;
  inline-size: 44px;
  block-size: 44px;
  display: grid;
  place-items: center;
  border-radius: 999px;
  background: var(--indigo);
  color: var(--paper);
  font-weight: 700;
  font-size: var(--fs-xs);
}

.person-body {
  display: grid;
  gap: 2px;
  min-inline-size: 0;
}

.person-body b {
  font-weight: 700;
}

.person-langs {
  font-size: var(--fs-xs);
  color: var(--ink-3);
  margin-block-end: var(--s2);
}

.person-lines {
  display: flex;
  flex-wrap: wrap;
  gap: var(--s2) var(--s4);
  font-size: var(--fs-sm);
  min-inline-size: 0;
}

/* An email address is one unbreakable token: without this it sets the card's
   min-content width and pushes the whole column off a 320px screen. */
.person-lines a {
  overflow-wrap: anywhere;
}

.lightbox {
  border: 0;
  padding: 0;
  background: transparent;
  max-inline-size: min(94vw, 1180px);
  max-block-size: 92dvh;
  inline-size: 100%;
  overflow: visible;
}

.lightbox::backdrop {
  background: oklch(16% 0.03 271 / 0.95);
  backdrop-filter: blur(10px);
}

.lightbox[open] {
  animation: lb-in 220ms var(--ease-out);
}

@keyframes lb-in {
  from {
    opacity: 0;
    transform: scale(0.97);
  }
}

.lightbox figure {
  margin: 0;
  display: grid;
  gap: var(--s3);
}

.lightbox img {
  inline-size: auto;
  block-size: auto;
  max-inline-size: 100%;
  max-block-size: 76dvh;
  justify-self: center;
  border-radius: var(--r-lg);
}

.lightbox figcaption {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--s4);
  color: oklch(95% 0.008 271);
  font-size: var(--fs-sm);
}

.lightbox figcaption .mono {
  color: oklch(84% 0.02 271);
  flex: none;
}

.lb-close,
.lb-nav {
  position: absolute;
  z-index: 2;
  inline-size: 48px;
  block-size: 48px;
  border-radius: var(--r-full);
  border: 1px solid oklch(100% 0 0 / 0.28);
  background: oklch(18% 0.03 271 / 0.72);
  backdrop-filter: blur(8px);
  color: oklch(99% 0 0);
  display: grid;
  place-items: center;
  cursor: pointer;
  transition:
    background-color var(--t-fast) var(--ease-out),
    border-color var(--t-fast) var(--ease-out),
    transform var(--t-fast) var(--ease-out);
}

.lb-close:hover,
.lb-nav:hover {
  background: var(--orange);
  border-color: var(--orange);
  transform: scale(1.06);
}

.lb-close:active,
.lb-nav:active {
  transform: scale(0.96);
}

.lb-close svg,
.lb-nav svg {
  inline-size: 22px;
  block-size: 22px;
}

.lb-close {
  inset-block-start: var(--s4);
  inset-inline-end: var(--s4);
}

.lb-nav {
  inset-block-start: 50%;
  margin-block-start: -46px;
}

/* Previous sits toward the inline start, which is the right in Arabic, and
   its arrow has to point that way too. The Lucide glyph points left, so it is
   PREVIOUS that gets mirrored here, not next. */
.lb-prev {
  inset-inline-start: var(--s4);
}

.lb-next {
  inset-inline-end: var(--s4);
}

.lb-prev svg {
  transform: scaleX(-1);
}

/* -------------------------------------------------------------- 19. footer */

.site-footer {
  background: var(--indigo);
  color: oklch(94% 0.015 271);
  margin-block-start: var(--section-y);
  padding-block: var(--s8) var(--s6);
}

.footer-grid {
  display: grid;
  grid-template-columns: minmax(0, 1.4fr) repeat(2, minmax(0, 1fr)) minmax(0, 1.1fr);
  gap: var(--s7);
  padding-block-end: var(--s7);
  border-block-end: 1px solid oklch(100% 0 0 / 0.14);
}

.site-footer .brand-word {
  color: oklch(99% 0 0);
}

.site-footer .brand-sub {
  color: oklch(84% 0.02 271);
}

.footer-grid p {
  font-size: var(--fs-sm);
  color: oklch(85% 0.02 271);
  line-height: 1.9;
}

.footer-grid h3 {
  font-size: var(--fs-xs);
  font-weight: 700;
  color: var(--mint);
  margin-block-end: var(--s3);
}

.footer-links {
  display: grid;
  gap: var(--s2);
}

.footer-links a {
  font-size: var(--fs-sm);
  color: oklch(88% 0.02 271);
  padding-block: 3px;
  transition: color var(--t-fast) var(--ease-out);
}

.footer-links a:hover {
  color: var(--mint);
}

.socials {
  display: flex;
  gap: var(--s2);
  margin-block-start: var(--s4);
}

.socials a {
  inline-size: 44px;
  block-size: 44px;
  border-radius: var(--r-full);
  border: 1px solid oklch(100% 0 0 / 0.2);
  display: grid;
  place-items: center;
  transition:
    background-color var(--t-fast) var(--ease-out),
    border-color var(--t-fast) var(--ease-out),
    transform var(--t-fast) var(--ease-out);
}

.socials a:hover {
  background: var(--orange);
  border-color: var(--orange);
  transform: translateY(-2px);
}

.socials svg {
  inline-size: 19px;
  block-size: 19px;
}

.footer-bottom {
  display: flex;
  flex-wrap: wrap;
  gap: var(--s4);
  align-items: center;
  justify-content: space-between;
  padding-block-start: var(--s5);
  font-size: var(--fs-xs);
  color: oklch(80% 0.02 271);
}

.footer-bottom nav {
  display: flex;
  gap: var(--s5);
}

.footer-bottom a:hover {
  color: var(--mint);
}

/* A prototype must say it is one. */
.proto-note {
  margin-block-start: var(--s4);
  padding: var(--s3) var(--s4);
  border: 1px dashed oklch(100% 0 0 / 0.3);
  border-radius: var(--r-sm);
  font-size: var(--fs-xs);
  color: oklch(82% 0.02 271);
  line-height: 1.8;
}

/* ------------------------------------------------------- 20. reveal & a11y */

.skip {
  position: absolute;
  inset-inline-start: 50%;
  inset-block-start: -100px;
  transform: translateX(50%);
  z-index: 100;
  background: var(--indigo);
  color: oklch(99% 0 0);
  padding: var(--s3) var(--s5);
  border-radius: 0 0 var(--r-sm) var(--r-sm);
  font-weight: 700;
  font-size: var(--fs-sm);
  transition: inset-block-start var(--t-fast) var(--ease-out);
}

.skip:focus {
  inset-block-start: 0;
}

.sr-only {
  position: absolute;
  inline-size: 1px;
  block-size: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

/* Reveals only exist once JS has claimed the page. No JS, nothing hides. */
.js .rv {
  opacity: 0;
  transform: translateY(20px);
  transition:
    opacity 620ms var(--ease-out),
    transform 620ms var(--ease-out);
  transition-delay: var(--rv-delay, 0ms);
}

.js .rv.in {
  opacity: 1;
  transform: none;
}

/* -------------------------------------------------------- 21. breakpoints */

@media (max-width: 1080px) {
  .metrics {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }

  .method,
  .split,
  .detail-grid {
    grid-template-columns: 1fr;
  }

  .method-aside,
  .detail-aside {
    position: static;
  }

  .why-a,
  .why-b,
  .why-c,
  .why-d {
    grid-column: span 12;
  }

  .footer-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

@media (max-width: 900px) {
  :root {
    --header-h: 66px;
  }

  .nav-toggle {
    display: flex;
  }

  /* The panel is absolute, not fixed. The header sets backdrop-filter, which
     makes it a containing block, so a fixed child anchors to the header and
     collapses to nothing instead of covering the viewport. */
  .header-drawer {
    display: none;
    position: absolute;
    inset-block-start: 100%;
    inset-inline: 0;
    block-size: calc(100dvh - var(--header-h));
    grid-template-rows: auto 1fr;
    background: var(--paper);
    border-block-start: 1px solid var(--line);
    padding: var(--s5) var(--gutter) var(--s7);
    overflow-y: auto;
    box-shadow: 0 24px 48px oklch(31% 0.15 271 / 0.1);
  }

  .site-header[data-open="true"] .header-drawer {
    display: grid;
    animation: sheet 240ms var(--ease-out);
  }

  .header-drawer .nav {
    display: grid;
    gap: 0;
    align-content: start;
    margin: 0;
  }

  .header-drawer .nav a {
    font-size: var(--fs-3);
    font-weight: 700;
    color: var(--ink);
    padding: var(--s4) 0;
    border-radius: 0;
    border-block-end: 1px solid var(--line);
  }

  .header-drawer .nav a[aria-current="page"] {
    color: var(--indigo);
  }

  .header-drawer .nav a::after {
    display: none;
  }

  .header-drawer .header-cta {
    align-self: end;
    justify-content: center;
    min-block-size: 52px;
  }

  .pcard,
  .pcard:nth-child(even) .pcard-media {
    grid-template-columns: 1fr;
    order: 0;
  }

  .gallery-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }

    .page-hero-media {
    aspect-ratio: 4 / 3;
    border-radius: var(--r-lg);
  }

  .form-row {
    grid-template-columns: 1fr;
  }

}

@media (max-width: 620px) {
  :root {
    --lh-body: 1.85;
  }

  .metrics {
    grid-template-columns: 1fr;
  }

  .footer-grid {
    grid-template-columns: 1fr;
    gap: var(--s6);
  }


  .chip:nth-child(n + 3) {
    display: none;
  }

  .closing {
    border-radius: var(--r-lg);
  }

  .brand-sub {
    display: none;
  }
}

/* ------------------------------------------- 24. content-page components */

/* Client monograms. A logo wall without logos: the brand marks are not ours to
   redraw, so the row carries the monogram the catalog already publishes. */
.logos {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 200px), 1fr));
  gap: 1px;
  background: var(--line);
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  overflow: hidden;
}

.logo {
  background: var(--card);
  padding: var(--s5);
  display: flex;
  align-items: center;
  gap: var(--s4);
  min-inline-size: 0;
}

.logo-mark {
  flex: none;
  inline-size: 44px;
  block-size: 44px;
  border-radius: var(--r-sm);
  display: grid;
  place-items: center;
  background: var(--paper-2);
  border: 1px solid var(--line);
  color: var(--indigo);
  font-size: 0.72rem;
  font-weight: 700;
}

.logo > span:last-child {
  display: grid;
  gap: 2px;
  min-inline-size: 0;
}

.logo b {
  font-size: var(--fs-sm);
  font-weight: 700;
}

.logo span span,
.logo > span:last-child > span {
  font-size: var(--fs-xs);
  color: var(--ink-3);
}

/* Two columns that argue with each other: the old way against Core's way. */
.versus {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 320px), 1fr));
  gap: var(--s5);
}

.versus-col {
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  background: var(--card);
  padding: var(--s6);
  display: grid;
  gap: var(--s5);
  align-content: start;
}

.versus-col h3 {
  font-size: var(--fs-3);
  font-weight: 800;
}

.versus-col--bad {
  background: var(--paper-2);
}

.versus-col--good {
  border-color: var(--indigo);
  box-shadow: var(--sh-1);
}

.versus-col ul {
  display: grid;
  gap: var(--s4);
}

.versus-col li {
  display: flex;
  gap: var(--s4);
  align-items: baseline;
}

.versus-col li b {
  flex: none;
  min-inline-size: 2.4ch;
  font-size: var(--fs-2);
  font-weight: 700;
  color: var(--indigo);
  line-height: 1.1;
}

.versus-col--bad li b {
  color: var(--ink-3);
}

.versus-col li span {
  display: grid;
  gap: 4px;
  font-size: var(--fs-sm);
  color: var(--ink-2);
  line-height: 1.8;
  min-inline-size: 0;
}

.versus-col li strong {
  font-weight: 700;
  color: var(--ink);
}

/* A plain marker list. The house rule bans decorative bullets in prose, not in
   a list element, but the marker is drawn rather than typed. */
.bullets {
  display: grid;
  gap: var(--s3);
}

.bullets li {
  position: relative;
  padding-inline-start: var(--s5);
  font-size: var(--fs-sm);
  color: var(--ink-2);
  line-height: 1.85;
}

.bullets li::before {
  content: "";
  position: absolute;
  inset-inline-start: 0;
  inset-block-start: 0.7em;
  inline-size: 8px;
  block-size: 2px;
  background: var(--accent);
  transition: background-color var(--t-slow) var(--ease-out);
}

/* ------------------------------------------------------------ disclosure */

.faq-list {
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  overflow: hidden;
  background: var(--card);
}

.faq + .faq {
  border-block-start: 1px solid var(--line);
}

.faq summary,
.tips summary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--s4);
  padding: var(--s5) var(--s6);
  cursor: pointer;
  font-weight: 700;
  list-style: none;
  transition: background-color var(--t-mid) var(--ease-out);
}

.faq summary::-webkit-details-marker,
.tips summary::-webkit-details-marker {
  display: none;
}

.faq summary:hover,
.tips summary:hover {
  background: var(--paper-2);
}

/* The glyph points left, which is forward in an RTL line. Rotating from there
   gives the same quarter turn a chevron makes in an LTR accordion. */
.faq-chevron {
  flex: none;
  inline-size: 18px;
  block-size: 18px;
  color: var(--ink-3);
  transform: rotate(90deg);
  transition: transform var(--t-mid) var(--ease-out);
}

.faq[open] .faq-chevron,
.tips[open] .faq-chevron {
  transform: rotate(-90deg);
}

.faq-body {
  padding: 0 var(--s6) var(--s6);
}

.faq-body p {
  font-size: var(--fs-sm);
  color: var(--ink-2);
  line-height: 1.9;
  max-width: 74ch;
}

.tips {
  border-block-start: 1px solid var(--line);
  margin-block-start: var(--s2);
}

.tips summary {
  padding-inline: 0;
  font-size: var(--fs-sm);
}

.tips .faq-body {
  padding-inline: 0;
  padding-block-end: var(--s4);
}

/* -------------------------------------------------------- step additions */

.step-meta {
  margin-block-start: var(--s3);
  font-size: var(--fs-xs);
  color: var(--ink-3);
}

.step-split {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 220px), 1fr));
  gap: var(--s3) var(--s5);
  margin-block-start: var(--s4);
  padding-block-start: var(--s4);
  border-block-start: 1px solid var(--line);
}

.step-split p {
  margin: 0;
  font-size: var(--fs-xs);
  line-height: 1.8;
}

.step-split b {
  display: block;
  color: var(--indigo);
  font-weight: 700;
  margin-block-end: 2px;
}

/* ------------------------------------------------ capability & format map */

.cat-groups {
  display: grid;
  gap: var(--s9);
}

.cat-group-head {
  display: grid;
  grid-template-columns: auto 1fr auto;
  gap: var(--s5);
  align-items: start;
  padding-block-end: var(--s5);
  border-block-end: 1px solid var(--line);
  margin-block-end: var(--s6);
}

.cat-group-head h2 {
  font-size: var(--fs-2);
  font-weight: 900;
}

.cat-group-head p {
  margin-block-start: var(--s2);
  color: var(--ink-2);
  font-size: var(--fs-sm);
  max-width: 62ch;
}

.cat-group-no {
  color: var(--ink-3);
  font-size: var(--fs-sm);
  font-weight: 700;
}

.sector-points {
  margin-block-end: var(--s6);
  max-width: 78ch;
}

.cat-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 320px), 1fr));
  gap: var(--s5);
}

.cat {
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  background: var(--card);
  padding: var(--s6);
  display: grid;
  gap: var(--s4);
  align-content: start;
  min-inline-size: 0;
  transition:
    border-color var(--t-mid) var(--ease-out),
    background-color var(--t-mid) var(--ease-out);
}

.cat:hover {
  border-color: var(--line-2);
  background: var(--paper-2);
}

.cat-top {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--s4);
}

.cat h3 {
  font-size: var(--fs-3);
  font-weight: 800;
}

.cat p {
  font-size: var(--fs-sm);
  color: var(--ink-2);
  line-height: 1.85;
}

.cat-count {
  flex: none;
  font-size: var(--fs-xs);
  font-weight: 700;
  color: var(--ink-3);
}

.cat-sub {
  font-size: var(--fs-xs);
  font-weight: 700;
  color: var(--ink-3);
}

.cat-services {
  display: flex;
  flex-wrap: wrap;
  gap: var(--s2);
}

.cat-services li {
  font-size: 0.75rem;
  color: var(--ink-3);
  padding: 4px 10px;
  border: 1px solid var(--line);
  border-radius: var(--r-xs);
  line-height: 1.7;
}

.cat--link {
  text-decoration: none;
  color: inherit;
}

/* ------------------------------------------------------------ partner tiers */

.tiers {
  display: grid;
  gap: 1px;
  background: var(--line);
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  overflow: hidden;
}

.tier {
  background: var(--card);
  padding: var(--s6);
  display: grid;
  grid-template-columns: auto 1fr;
  gap: var(--s5);
  align-items: start;
  transition: background-color var(--t-mid) var(--ease-out);
}

.tier:hover {
  background: var(--paper-2);
}

.tier-rank {
  inline-size: 36px;
  block-size: 36px;
  border-radius: var(--r-full);
  border: 2px solid var(--line-2);
  display: grid;
  place-items: center;
  font-size: 0.8rem;
  font-weight: 700;
  color: var(--ink-3);
}

.tier h3 {
  font-size: var(--fs-3);
  font-weight: 800;
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: var(--s3);
}

.tier h3 .mono {
  font-size: var(--fs-xs);
  font-weight: 500;
  color: var(--ink-3);
}

.tier p {
  margin-block-start: var(--s3);
  font-size: var(--fs-sm);
  color: var(--ink-2);
  line-height: 1.85;
}

.tier-unlocks b {
  color: var(--indigo);
  font-weight: 700;
}

/* ------------------------------------------------------- notes and bands */

.note-card {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: var(--s5);
  align-items: start;
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  background: var(--paper-2);
  padding: var(--s6);
}

.note-card h3 {
  font-size: var(--fs-3);
  font-weight: 800;
}

.note-card p {
  margin-block-start: var(--s3);
  font-size: var(--fs-sm);
  color: var(--ink-2);
  line-height: 1.85;
  max-width: 72ch;
}

.note-card .link {
  margin-block-start: var(--s4);
}

.band {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--s5);
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  background: var(--card);
  padding: var(--s7);
}

.band h2 {
  font-size: var(--fs-2);
  font-weight: 900;
}

.band p {
  margin-block-start: var(--s3);
  color: var(--ink-2);
  font-size: var(--fs-sm);
  max-width: 62ch;
}

/* --------------------------------------------------------- before / after */

.ba {
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  overflow: hidden;
  background: var(--card);
}

.ba-head,
.ba li {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--s5);
  padding: var(--s5) var(--s6);
}

.ba-head {
  background: var(--paper-2);
  border-block-end: 1px solid var(--line);
  font-size: var(--fs-xs);
  font-weight: 700;
  color: var(--ink-3);
}

.ba li + li {
  border-block-start: 1px solid var(--line);
}

.ba-before,
.ba-after {
  font-size: var(--fs-sm);
  line-height: 1.8;
}

.ba-before {
  color: var(--ink-3);
}

.ba-after {
  color: var(--ink);
  font-weight: 700;
}

/* ---------------------------------------------------------- people cards */

.person-card {
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  background: var(--card);
  padding: var(--s6);
  display: grid;
  gap: var(--s3);
  align-content: start;
  min-inline-size: 0;
}

.person-card h3 {
  font-size: var(--fs-3);
  font-weight: 800;
}

.person-role {
  font-size: var(--fs-xs);
  font-weight: 700;
  color: var(--indigo);
}

.person-card p {
  font-size: var(--fs-sm);
  color: var(--ink-2);
  line-height: 1.85;
}

.person-card .person-mark {
  margin-block-end: var(--s2);
}

/* ------------------------------------------------------- quote and prose */

.quote {
  border-inline-start: 3px solid var(--orange);
  padding-inline-start: var(--s5);
  display: grid;
  gap: var(--s3);
}

.quote p {
  font-size: var(--fs-3);
  font-weight: 700;
  line-height: 1.75;
}

.quote cite {
  font-style: normal;
  font-size: var(--fs-xs);
  color: var(--ink-3);
}

.prose {
  display: grid;
  gap: var(--s4);
}

.doc-links {
  display: grid;
  gap: var(--s3);
  margin-block-start: var(--s4);
}

/* ------------------------------------------------------------ legal pages */

.legal-grid {
  display: grid;
  grid-template-columns: minmax(0, 260px) minmax(0, 1fr);
  gap: clamp(32px, 5vw, 72px);
  align-items: start;
}

.legal-toc {
  position: sticky;
  inset-block-start: calc(var(--header-h) + var(--s6));
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  background: var(--card);
  padding: var(--s5);
}

.legal-toc h3 {
  font-size: var(--fs-xs);
  font-weight: 700;
  color: var(--ink-3);
  margin-block-end: var(--s4);
}

.legal-toc ul {
  display: grid;
  gap: var(--s2);
}

.legal-toc a {
  font-size: var(--fs-sm);
  color: var(--ink-2);
  text-decoration: none;
}

.legal-toc a:hover {
  color: var(--indigo);
}

.legal-doc {
  display: grid;
  gap: var(--s7);
  max-width: 76ch;
}

.legal-section {
  display: grid;
  gap: var(--s4);
  scroll-margin-block-start: calc(var(--header-h) + var(--s5));
}

.legal-section h2 {
  font-size: var(--fs-3);
  font-weight: 800;
}

.legal-section p {
  color: var(--ink-2);
  font-size: var(--fs-sm);
  line-height: 1.9;
}

@media (max-width: 900px) {
  .legal-grid {
    grid-template-columns: 1fr;
  }

  .legal-toc {
    position: static;
  }

  .cat-group-head {
    grid-template-columns: auto 1fr;
  }

  .cat-group-no {
    display: none;
  }
}

/* --------------------------------------------------------------- 22. print */

@media print {
  .site-header,
  .paper-grid,
  .paper-grain,
  .closing,
  .marquee,
  .socials {
    display: none !important;
  }

  body {
    background: #fff;
    color: #000;
  }

  .js .rv {
    opacity: 1 !important;
    transform: none !important;
  }
}

/* ------------------------------------------------------- 23. reduced motion */

@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }

  /* Reduced motion means arrived, not stuck half way. */
  .js .rv {
    opacity: 1;
    transform: none;
  }

  .hero h1 .em {
    animation: none;
    text-decoration-color: var(--mint);
  }

  .marquee-track {
    animation: none;
    transform: none;
  }

}

/* ==== 10-hero.css ==== */
/* ------------------------------------------------------------ hero banner */
/* Banner first: the photograph carries the page, the copy sits on it, the
   proof strip overlaps its bottom edge. Same tokens as everything else. */

.hero {
  padding-block: clamp(20px, 3vw, 40px) 0;
}

.hero-stage {
  position: relative;
}

.banner {
  position: relative;
  aspect-ratio: 16 / 9;
  border-radius: var(--r-xl);
  overflow: hidden;
  background: var(--indigo);
  box-shadow: var(--sh-3);
  isolation: isolate;
}

.banner > picture img,
.banner > img {
  position: absolute;
  inset: 0;
  inline-size: 100%;
  block-size: 100%;
  object-fit: cover;
  animation: drift 26s var(--ease-in-out) infinite alternate;
}

@keyframes drift {
  from { transform: scale(1.04) translate3d(0, 0, 0); }
  to { transform: scale(1.12) translate3d(1.5%, -1.5%, 0); }
}

/* Indigo rises from the bottom so white copy clears any sky. */
.banner::after {
  content: "";
  position: absolute;
  inset: 0;
  background:
    linear-gradient(to top, color-mix(in oklch, var(--indigo-deep) 92%, transparent) 0%, color-mix(in oklch, var(--indigo-deep) 55%, transparent) 42%, transparent 78%),
    linear-gradient(to left, color-mix(in oklch, var(--indigo-deep) 35%, transparent), transparent 55%);
}

.banner-copy {
  position: absolute;
  z-index: 2;
  inset-block-end: 0;
  inset-inline-start: 0;
  padding: clamp(24px, 4.5vw, 64px);
  max-inline-size: 640px;
  color: var(--white);
}

.banner-copy .kicker {
  color: color-mix(in oklch, var(--white) 78%, transparent);
  text-shadow: 0 1px 12px color-mix(in oklch, var(--indigo-deep) 60%, transparent);
}

.banner-copy .kicker .mono {
  color: var(--orange);
  white-space: nowrap;
}

.banner-copy h1 {
  font-size: clamp(2rem, 1rem + 3.4vw, 3.9rem);
  font-weight: 900;
  line-height: 1.22;
  margin-block: var(--s4) var(--s4);
  text-shadow: 0 2px 24px color-mix(in oklch, var(--indigo-deep) 50%, transparent);
}

.banner-copy h1 .em {
  color: var(--mint);
  white-space: nowrap;
  text-decoration: underline;
  text-decoration-color: var(--orange);
  text-decoration-thickness: 0.14em;
  text-underline-offset: 0.06em;
  text-decoration-skip-ink: none;
}

.banner-copy .lead {
  color: color-mix(in oklch, var(--white) 86%, transparent);
  font-size: var(--fs-body);
  line-height: 1.75;
  max-inline-size: 54ch;
}

.btn--paper {
  background: var(--white);
  color: var(--indigo);
  border-color: var(--white);
}

.btn--paper:hover {
  background: var(--mint);
  border-color: var(--mint);
}

.btn--paper .dot {
  background: var(--orange);
}

.btn--glass {
  background: color-mix(in oklch, var(--white) 10%, transparent);
  color: var(--white);
  border: 1px solid color-mix(in oklch, var(--white) 55%, transparent);
  backdrop-filter: blur(6px);
}

.btn--glass:hover {
  background: color-mix(in oklch, var(--white) 22%, transparent);
  color: var(--white);
}

.btn--glass .dot {
  background: var(--mint);
}

/* Three portrait tiles pinned to the banner's far corner. */
.hero-tiles {
  position: absolute;
  z-index: 3;
  inset-block-start: var(--s5);
  inset-inline-end: var(--s5);
  display: grid;
  gap: var(--s3);
  inline-size: clamp(96px, 10vw, 140px);
}

.tile {
  position: relative;
  aspect-ratio: 4 / 5;
  border-radius: var(--r-md);
  overflow: hidden;
  background: var(--paper-3);
  border: 1px solid color-mix(in oklch, var(--white) 55%, transparent);
  box-shadow: var(--sh-2);
  transition: transform var(--t-mid) var(--ease-out);
}

.tile:hover {
  transform: translateY(-3px);
}

.tile img {
  inline-size: 100%;
  block-size: 100%;
  object-fit: cover;
}

.tile span {
  position: absolute;
  inset-block-end: var(--s2);
  inset-inline: var(--s2);
  padding: 5px var(--s3);
  border-radius: var(--r-full);
  background: color-mix(in oklch, var(--white) 90%, transparent);
  color: var(--indigo);
  font-size: var(--fs-xs);
  font-weight: 700;
  line-height: 1.4;
  text-align: center;
  text-wrap: balance;
}

/* Proof strip overlapping the banner's bottom edge. */
.hero-proof {
  position: relative;
  z-index: 4;
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr)) minmax(0, 1.3fr);
  margin: calc(-1 * var(--s7)) var(--s6) 0;
  background: var(--card);
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  box-shadow: var(--sh-2);
}

.hero-proof li {
  display: grid;
  gap: var(--s1);
  padding: var(--s5) var(--s6);
  border-inline-start: 1px solid var(--line);
  font-size: var(--fs-sm);
  color: var(--ink-3);
  line-height: 1.6;
}

.hero-proof li:first-child {
  border-inline-start: 0;
}

.hero-proof b {
  font-size: clamp(1.7rem, 1.2rem + 1.4vw, 2.4rem);
  font-weight: 800;
  color: var(--indigo);
  line-height: 1.1;
}

.hero-proof b .mono {
  font-size: inherit;
  font-weight: 700;
}

.hero-proof-note {
  grid-template-columns: auto minmax(0, 1fr);
  align-items: center;
  gap: var(--s3);
  background: var(--orange-wash);
  color: var(--orange-ink);
  font-weight: 700;
  border-start-end-radius: var(--r-lg);
  border-end-end-radius: var(--r-lg);
}

.hero-proof-note svg {
  inline-size: 22px;
  block-size: 22px;
  color: var(--orange);
}

@media (max-width: 1080px) {
  .hero-tiles {
    inline-size: clamp(96px, 12vw, 140px);
  }

  .hero-proof {
    grid-template-columns: repeat(3, minmax(0, 1fr));
    margin-inline: var(--s4);
  }

  .hero-proof-note {
    grid-column: 1 / -1;
    border-radius: 0 0 var(--r-lg) var(--r-lg);
    border-block-start: 1px solid var(--line);
    border-inline-start: 0;
  }
}

@media (max-width: 900px) {
  .banner {
    aspect-ratio: auto;
    min-block-size: 62vh;
    display: grid;
    align-items: end;
    border-radius: var(--r-lg);
  }

  .banner > picture img,
  .banner > img {
    object-position: 50% 62%;
  }

  .banner-copy {
    position: relative;
    inset: auto;
    padding: var(--s6) var(--s5) var(--s6);
  }

  .hero-tiles {
    position: static;
    inline-size: auto;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    margin-block-start: var(--s3);
  }

  .tile span {
    font-size: 0.72rem;
    line-height: 1.3;
    padding: 4px var(--s2);
    border-radius: var(--r-sm);
  }

  .banner-copy .kicker .mono {
    color: var(--mint);
  }

  .hero-proof {
    grid-template-columns: 1fr;
    margin: var(--s5) 0 0;
  }

  .hero-proof li {
    border-inline-start: 0;
    border-block-start: 1px solid var(--line);
    padding: var(--s4) var(--s5);
  }

  .hero-proof li:first-child {
    border-block-start: 0;
  }

  .hero-proof-note {
    border-radius: 0 0 var(--r-lg) var(--r-lg);
  }
}

@media (prefers-reduced-motion: reduce) {
  .banner > picture img,
  .banner > img {
    animation: none;
  }
}

/* ==== 20-sections.css ==== */
/* ---------------------------------------------------------- home sections */
/* Re-authored on top of the base stylesheet. Same tokens, tighter rhythm. */

.section-head {
  max-width: 68ch;
  gap: var(--s3);
  margin-block-end: var(--s7);
}

.section-head h2 {
  font-size: var(--fs-1);
  line-height: 1.25;
}

.section-head p {
  font-size: var(--fs-4);
  line-height: 1.75;
  max-width: 60ch;
}

/* Trust row: quieter marks, one line of meta. */
.logo {
  padding: var(--s4) var(--s5);
}

.logo-mark {
  inline-size: 48px;
  block-size: 48px;
  font-size: 0.7rem;
}

/* Versus: one card, two halves, a badge on the seam. */
.versus {
  position: relative;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 340px), 1fr));
  gap: var(--s4);
}

.versus-vs {
  position: absolute;
  inset-block-start: var(--s6);
  inset-inline-start: 50%;
  transform: translateX(-50%);
  z-index: 2;
  inline-size: 40px;
  block-size: 40px;
  display: grid;
  place-items: center;
  border-radius: var(--r-full);
  background: var(--card);
  border: 1px solid var(--line-2);
  color: var(--ink-3);
  font-size: 0.7rem;
  font-weight: 700;
  box-shadow: var(--sh-1);
}

.versus-col {
  padding: var(--s6) var(--s6) var(--s5);
  gap: var(--s4);
}

.versus-col h3 {
  font-size: var(--fs-4);
  padding-block-end: var(--s3);
  border-block-end: 1px solid var(--line);
}

.versus-col--good {
  background: var(--card);
  border-color: var(--indigo);
}

.versus-col--good h3 {
  color: var(--indigo);
  border-color: var(--indigo-wash);
}

.versus-col ul {
  gap: var(--s3);
}

.versus-col li {
  align-items: flex-start;
  padding-block: var(--s2);
}

.versus-col li b {
  min-inline-size: 2.6ch;
  font-size: var(--fs-2);
  line-height: 1.3;
  text-align: center;
  font-family: var(--font-la);
  font-variant-numeric: tabular-nums;
}

.versus-col--good li b {
  color: var(--white);
  background: var(--indigo);
  border-radius: var(--r-sm);
  font-size: var(--fs-4);
  line-height: 1;
  padding: 7px 0;
  min-inline-size: 2.2rem;
}

.versus-col li span {
  font-size: var(--fs-sm);
  line-height: 1.7;
}

.versus-col li strong {
  font-size: var(--fs-body);
}

@media (max-width: 760px) {
  .versus-vs {
    display: none;
  }
}

/* Method: tighter steps, the meta reads as a chip. */
.step {
  grid-template-columns: 40px 1fr;
  padding-block: var(--s5);
}

.step + .step {
  border-block-start: 1px solid var(--line);
}

.step-dot {
  inline-size: 40px;
  block-size: 40px;
}

.step h3 {
  font-size: var(--fs-3);
  margin-block-start: 2px;
}

.step p {
  max-width: 56ch;
}

.step-meta {
  display: inline-flex;
  align-items: center;
  gap: var(--s2);
  margin-block-start: var(--s3);
  padding: 4px 10px;
  border-radius: var(--r-full);
  background: var(--paper-2);
  border: 1px solid var(--line);
  color: var(--ink-2);
  font-size: var(--fs-xs);
  font-weight: 600;
  line-height: 1.6;
}

.step[data-on="true"] .step-meta {
  background: var(--orange-wash);
  border-color: var(--orange-wash);
  color: var(--orange-ink);
}

/* Capabilities: readable body, the list as one quiet line. */
.svc-copy {
  padding: var(--s5);
}

.svc-top h3 {
  font-size: var(--fs-3);
}

.svc-copy > p {
  font-size: var(--fs-sm);
  color: var(--ink-2);
  line-height: 1.75;
}

.svc-copy ul {
  display: flex;
  flex-wrap: wrap;
  gap: 4px 0;
  font-size: var(--fs-xs);
  color: var(--ink-3);
  line-height: 1.6;
}

.svc-copy ul li {
  padding: 0;
  border: 0;
  background: none;
  border-radius: 0;
}

.svc-copy ul li + li::before {
  content: "·";
  margin-inline: 6px;
  color: var(--line-2);
}

/* Proof: numbers a size lower, labels one weight lower. */
.metric b {
  font-size: clamp(2rem, 1.3rem + 2vw, 2.9rem);
}

.metric h3 {
  font-size: var(--fs-sm);
  font-weight: 600;
  color: var(--ink-2);
}

/* Work: the three numbers become three cells. */
.pcard-contrib {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 0;
  margin: 0;
  padding-block-start: var(--s3);
  border-block-start: 1px solid var(--line);
}

.pcard-contrib > div {
  display: grid;
  gap: 2px;
  padding-block: var(--s2);
}

.pcard-contrib > div + div {
  border-inline-start: 1px solid var(--line);
  padding-inline-start: var(--s4);
}

.pcard-contrib dd {
  margin: 0;
  font-family: var(--font-la);
  font-size: var(--fs-3);
  font-weight: 700;
  color: var(--indigo);
  line-height: 1.1;
  font-variant-numeric: tabular-nums;
}

.pcard-contrib dt {
  font-size: var(--fs-xs);
  color: var(--ink-3);
  line-height: 1.5;
}

.pcard-body h3 {
  font-size: var(--fs-2);
}

.pcard-body > p:not(.lat-sub) {
  font-size: var(--fs-sm);
  line-height: 1.75;
}

/* FAQ: the question is the row, the chevron sits in a ring. */
.faq summary {
  font-size: var(--fs-4);
  padding-block: var(--s4);
}

.faq-chevron {
  inline-size: 32px;
  block-size: 32px;
  padding: 7px;
  border-radius: var(--r-full);
  border: 1px solid var(--line);
  background: var(--card);
}

.faq-body p {
  font-size: var(--fs-sm);
  line-height: 1.8;
  max-width: 68ch;
}

/* Supplier band: a tinted invitation, not a grey box. */
.band {
  background: var(--mint);
  border-color: color-mix(in oklch, var(--mint-deep) 35%, transparent);
}

.band h2 {
  font-size: var(--fs-3);
  color: var(--indigo);
}

.band p {
  font-size: var(--fs-sm);
  color: var(--ink-2);
}

/* Closing: one size lower so the photo still reads. */
.closing-inner h2 {
  font-size: var(--fs-1);
}

.closing-inner p {
  font-size: var(--fs-body);
}

.section-head {
  max-width: 74ch;
}

@media (max-width: 620px) {
  .logos {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }

  .logo {
    padding: var(--s3) var(--s4);
    gap: var(--s3);
  }

  .logo-mark {
    inline-size: 40px;
    block-size: 40px;
  }
}

