/* ==========================================================================
   Shape (შპს ფორმა 2024) — shape.ge
   Vanilla CSS, no build step, mobile-first.

   Brand system from "Shape - Brandbook.pdf":
     navy #0E3253 · orange #F05A23 · white · sky #379FD3 · coral #F96643
     Type: FiraGO Light + Medium (SIL OFL, self-hosted, subset to ka/en/ru)

   Design motif: the logo symbol has exactly one rounded corner (top-left).
   That single-rounded-corner shape is reused for cards, media frames and the
   primary button, so the layout reads as Shape without needing photography.

   NOTE: the licensed FiraGO files carry no Georgian Mtavruli (U+1C90–1CBF),
   so `text-transform: uppercase` is never used — it would capitalise Latin and
   Russian while leaving Georgian untouched. Emphasis uses weight, colour and
   letter-spacing instead.
   ========================================================================== */

/* ---------- fonts ---------- */
@font-face {
  font-family: "FiraGO";
  src: url("../fonts/firago-light.woff2") format("woff2");
  font-weight: 300;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: "FiraGO";
  src: url("../fonts/firago-medium.woff2") format("woff2");
  font-weight: 500;
  font-style: normal;
  font-display: swap;
}

/* ---------- tokens ---------- */
:root {
  --navy: #0e3253;
  --navy-deep: #09253f;
  --orange: #f05a23;
  --orange-dark: #d94b17;
  --sky: #379fd3;
  --coral: #f96643;
  --white: #fff;

  /* Accessible text variants of the brand colours.
     The brandbook's #F05A23 is a graphics colour: as small text on white it
     only reaches 3.4:1, and white text on it reaches 3.4:1 — both below the
     4.5:1 WCAG AA floor. So --orange stays the brand colour for rules, icons
     and graphic elements, while text and button fills use these two tuned
     shades. To go back to literal brandbook orange everywhere, set both of
     these to #f05a23 and accept the lower contrast. */
  --orange-ink: #b8410f;   /* orange TEXT on white/soft  → 5.6:1 / 5.1:1 */
  --orange-cta: #cc4711;   /* button fill under WHITE text → 4.7:1 */
  --coral-ink: #fa7350;    /* accent text on navy         → 4.8:1 */

  --ink: #0e3253;
  --ink-soft: #46617d;
  --ink-faint: #5e7391;
  --line: rgba(14, 50, 83, 0.14);
  --line-soft: rgba(14, 50, 83, 0.08);
  --surface: #fff;
  --surface-soft: #f2f5f8;   /* navy 5% */
  --surface-tint: #e7edf3;   /* navy 10% */

  --on-navy: rgba(255, 255, 255, 0.78);
  --on-navy-faint: rgba(255, 255, 255, 0.62);  /* 0.5 gave only 4.4:1 on navy */

  --corner: 26px;            /* the logo's single rounded corner */
  --corner-sm: 14px;

  --container: 1180px;
  --gutter: 20px;
  --section-y: 68px;

  --shadow: 0 18px 44px rgba(14, 50, 83, 0.1);
  --shadow-lg: 0 26px 70px rgba(14, 50, 83, 0.16);
}

@media (min-width: 900px) {
  :root {
    --gutter: 32px;
    --section-y: 108px;
  }
}

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

html {
  -webkit-text-size-adjust: 100%;
  scroll-behavior: smooth;
}

body {
  margin: 0;
  font-family: "FiraGO", "Segoe UI", system-ui, -apple-system, sans-serif;
  font-weight: 300;
  font-size: 17px;
  line-height: 1.65;
  color: var(--ink);
  background: var(--white);
  -webkit-font-smoothing: antialiased;
  overflow-x: hidden;
}

img { max-width: 100%; height: auto; display: block; }
a { color: inherit; }

h1, h2, h3, h4 {
  font-weight: 500;
  line-height: 1.18;
  margin: 0 0 0.5em;
  letter-spacing: -0.01em;
}
p { margin: 0 0 1em; }
ul { margin: 0; padding: 0; list-style: none; }

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

/* ==========================================================================
   Language visibility
   Every translatable node exists three times (data-lang="ka|en|ru").
   The active language is stamped on <html data-lang-active> by an inline
   head script before paint, so there is no flash of all three languages.
   ========================================================================== */
html[data-lang-active="ka"] [data-lang]:not([data-lang="ka"]),
html[data-lang-active="en"] [data-lang]:not([data-lang="en"]),
html[data-lang-active="ru"] [data-lang]:not([data-lang="ru"]) {
  display: none !important;
}

/* ---------- layout helpers ---------- */
.container {
  width: 100%;
  max-width: var(--container);
  margin-inline: auto;
  padding-inline: var(--gutter);
}

.section { padding-block: var(--section-y); }
.section--soft { background: var(--surface-soft); }
.section--navy { background: var(--navy); color: var(--white); }

.section-head { max-width: 640px; margin-bottom: 40px; }
.section-head--center { margin-inline: auto; text-align: center; }

.eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-size: 13px;
  font-weight: 500;
  letter-spacing: 0.09em;
  color: var(--orange-ink);
  margin-bottom: 16px;
}
.eyebrow::before {
  content: "";
  width: 26px;
  height: 3px;
  background: var(--orange);   /* graphic rule — full brand orange */
  flex: none;
}
/* The hero is navy too, but is not a .section--navy, so it needs the same
   on-dark treatment or its eyebrow drops to 3.9:1. */
.section--navy .eyebrow,
.hero .eyebrow { color: var(--coral-ink); }
.section--navy .eyebrow::before,
.hero .eyebrow::before { background: var(--coral); }

.section-title {
  font-size: clamp(28px, 4.6vw, 42px);
  margin-bottom: 14px;
}
.section-lead {
  font-size: clamp(16px, 2vw, 18px);
  color: var(--ink-soft);
  margin: 0;
}
.section--navy .section-lead { color: var(--on-navy); }

/* ---------- icons ----------
   SVGs live in assets/svg/ and are referenced by URL, never inlined.

   They are plain <img> elements, deliberately NOT CSS masks. Chrome gives every
   file:// resource its own opaque origin, so a mask-image loaded from a separate
   SVG file is treated as cross-origin and dropped — the masked element then
   renders completely invisible. Since this site has to work when index.html is
   opened straight off disk (and on cPanel), each icon ships pre-coloured in the
   colours it is actually used in: -orange, -coral, -navy, -white. */
.icon {
  display: inline-block;
  width: 22px;
  height: 22px;
  flex: none;
  object-fit: contain;
}
.icon--sm { width: 18px; height: 18px; }
.icon--lg { width: 28px; height: 28px; }
.icon--xl { width: 32px; height: 32px; }

/* ==========================================================================
   Buttons
   HOUSE RULE: <button> is reserved for GA4-tracked actions only. Anything
   interactive but untracked (language switcher, menu toggle, video frame)
   is a <div role="button">. See assets/js/main.js.
   ========================================================================== */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  font-family: inherit;
  font-size: 16px;
  font-weight: 500;
  line-height: 1;
  padding: 17px 28px;
  border: 1.5px solid transparent;
  border-radius: var(--corner-sm) 0 0 0;
  cursor: pointer;
  text-decoration: none;
  transition: background-color .18s ease, color .18s ease,
              border-color .18s ease, transform .18s ease;
}
.btn:hover { transform: translateY(-2px); }
.btn:active { transform: translateY(0); }

.btn--primary { background: var(--orange-cta); color: var(--white); }
.btn--primary:hover { background: var(--orange-ink); }

.btn--ghost {
  background: transparent;
  color: var(--white);
  border-color: rgba(255, 255, 255, 0.42);
}
.btn--ghost:hover { border-color: var(--white); background: rgba(255, 255, 255, 0.08); }

.btn--outline {
  background: transparent;
  color: var(--navy);
  border-color: var(--line);
}
.btn--outline:hover { border-color: var(--navy); background: var(--surface-soft); }

.btn--block { width: 100%; }
.btn--sm { font-size: 14.5px; padding: 12px 18px; }

/* text-style tracked action (e.g. phone number in the header) */
.btn-plain {
  display: inline-flex;
  align-items: center;
  gap: 9px;
  background: none;
  border: 0;
  padding: 0;
  font: inherit;
  font-weight: 500;
  color: inherit;
  cursor: pointer;
}
.btn-plain:hover { color: var(--orange-ink); }

/* ==========================================================================
   Header
   ========================================================================== */
.site-header {
  position: sticky;
  top: 0;
  z-index: 60;
  background: rgba(255, 255, 255, 0.94);
  backdrop-filter: saturate(180%) blur(12px);
  border-bottom: 1px solid var(--line-soft);
}
.site-header.is-scrolled { box-shadow: 0 8px 26px rgba(14, 50, 83, 0.08); }

.header-inner {
  display: flex;
  align-items: center;
  gap: 18px;
  min-height: 72px;
}
@media (min-width: 900px) {
  .header-inner { min-height: 86px; gap: 28px; }
}

.brand { display: flex; align-items: center; flex: none; text-decoration: none; }
.brand img { width: 128px; }
@media (min-width: 900px) { .brand img { width: 148px; } }

.site-nav { margin-inline-start: auto; }
.site-nav ul { display: flex; align-items: center; gap: 28px; }
.site-nav a {
  text-decoration: none;
  font-size: 15.5px;
  color: var(--ink);
  padding-block: 6px;
  border-bottom: 2px solid transparent;
  white-space: nowrap;
}
.site-nav a:hover,
.site-nav a.is-current { color: var(--orange-ink); border-bottom-color: var(--orange); }

.header-actions { display: flex; align-items: center; gap: 14px; margin-inline-start: auto; }
@media (min-width: 900px) { .header-actions { margin-inline-start: 0; } }

.header-phone { font-size: 15.5px; white-space: nowrap; }


/* language switcher — DIV based on purpose: it must never fire a GA4 event */
.lang-switcher {
  display: flex;
  align-items: center;
  border: 1px solid var(--line);
  border-radius: 999px;
  padding: 3px;
  gap: 2px;
}
.lang-option {
  font-size: 12.5px;
  font-weight: 500;
  letter-spacing: 0.04em;
  padding: 6px 11px;
  border-radius: 999px;
  cursor: pointer;
  color: var(--ink-faint);
  user-select: none;
  transition: background-color .15s ease, color .15s ease;
}
.lang-option:hover { color: var(--navy); }
.lang-option.is-active { background: var(--navy); color: var(--white); }

/* mobile nav toggle — also a DIV, untracked */
.nav-toggle {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 42px;
  height: 42px;
  border: 1px solid var(--line);
  border-radius: var(--corner-sm) 0 0 0;
  cursor: pointer;
  color: var(--navy);
}
/* Two pre-coloured icons swapped by class — an <img> cannot be recoloured, and
   this keeps the file paths in the markup instead of hard-coded in main.js. */
.nav-toggle .nav-toggle-close { display: none; }
.nav-toggle.is-open .nav-toggle-open { display: none; }
.nav-toggle.is-open .nav-toggle-close { display: inline-block; }
@media (min-width: 900px) { .nav-toggle { display: none; } }

@media (max-width: 899px) {
  .site-nav {
    position: fixed;
    inset: 72px 0 auto;
    background: var(--white);
    border-bottom: 1px solid var(--line);
    padding: 12px var(--gutter) 26px;
    transform: translateY(-140%);
    transition: transform .28s ease;
    box-shadow: var(--shadow);
    margin: 0;
  }
  .site-nav.is-open { transform: translateY(0); }
  .site-nav ul { flex-direction: column; align-items: stretch; gap: 0; }
  .site-nav a {
    display: block;
    padding: 14px 2px;
    border-bottom: 1px solid var(--line-soft);
  }
  .site-nav a:hover, .site-nav a.is-current { border-bottom-color: var(--line-soft); }
  .header-phone span { display: none; }
}

/* Small phones: the header row has to hold logo + phone + 3 language pills +
   menu toggle inside 360px, so the social icons (repeated in the footer) drop
   out and everything else tightens. */
@media (max-width: 639px) {
  .header-inner { gap: 10px; }
  .header-actions { gap: 9px; }
  .brand img { width: 112px; }
  .lang-switcher { padding: 2px; }
  .lang-option { padding: 5px 7px; font-size: 11.5px; }
  .nav-toggle { width: 40px; height: 40px; }
}

/* ==========================================================================
   Hero — carried by the brandbook's oversized background shape, not stock photos
   ========================================================================== */
.hero {
  position: relative;
  background: var(--navy);
  color: var(--white);
  overflow: hidden;
  padding-block: 72px 0;
}
@media (min-width: 900px) { .hero { padding-block: 104px 0; } }

/* ---- background loop ---- */
.hero-media {
  position: absolute;
  inset: 0;
  overflow: hidden;
  background: var(--navy) url("../img/hero-bg.webp") center / cover no-repeat;
}
.hero-video {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
/* main.js already avoids downloading the loop on phones and under reduced
   motion; these back that up so a resized-down window falls to the still. */
@media (max-width: 767px) {
  .hero-video { display: none; }
}
@media (prefers-reduced-motion: reduce) {
  .hero-video { display: none; }
}
/* Navy wash over the footage. Heaviest on the left, where the headline sits
   (white text stays above 10:1 there), lifting on the right so the work is
   actually visible. Measured against the brightest 5% of the frame. */
.hero-media::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(95deg,
      rgba(9, 37, 63, 0.95) 0%,
      rgba(9, 37, 63, 0.90) 45%,
      rgba(14, 50, 83, 0.72) 100%);
}
/* The eyebrow is coral elsewhere, but over footage that drops to ~3:1, so on the
   hero it goes white and the orange rule carries the accent. */
.hero .eyebrow { color: var(--white); }

/* Keep the full .container width here so the hero copy starts on the same left
   edge as the header logo. Capping .hero-inner itself at 760px turned it into a
   narrow centred box, pushing the headline ~200px inboard of the logo. The
   measure is limited on the individual text blocks instead. */
.hero-inner { position: relative; z-index: 1; }

.hero h1 {
  font-size: clamp(34px, 6.4vw, 62px);
  line-height: 1.08;
  margin-bottom: 20px;
  max-width: 760px;
}
.hero h1 .accent { color: var(--coral); }

.hero-sub {
  font-size: clamp(17px, 2.3vw, 20px);
  color: var(--on-navy);
  max-width: 560px;
  margin-bottom: 34px;
}

.hero-actions { display: flex; flex-wrap: wrap; gap: 14px; margin-bottom: 56px; }

/* Edge-to-edge navy so the band matches the stat cells exactly; the cells
   themselves stay opaque navy and the 1px grid gaps draw the dividers. */
.hero-stats-band {
  position: relative;
  z-index: 1;
  background: var(--navy);
  border-top: 1px solid rgba(255, 255, 255, 0.16);
}

.hero-stats {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  /* No background and no border here — both belong on the band, or they would
     stop at the container edge and reintroduce the seam. */
}
@media (min-width: 760px) { .hero-stats { grid-template-columns: repeat(4, 1fr); } }

.hero-stat { padding: 26px 4px 34px; }
.hero-stat dt {
  font-size: clamp(26px, 4.2vw, 38px);
  font-weight: 500;
  color: var(--white);
  line-height: 1.1;
}
.hero-stat dd {
  margin: 6px 0 0;
  font-size: 14px;
  color: var(--on-navy-faint);
}

/* ==========================================================================
   Services
   ========================================================================== */
.service-grid {
  display: grid;
  gap: 22px;
  grid-template-columns: 1fr;
}
@media (min-width: 640px) { .service-grid { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1000px) { .service-grid { grid-template-columns: repeat(4, 1fr); } }

.service-card {
  display: flex;
  flex-direction: column;
  background: var(--white);
  border: 1px solid var(--line-soft);
  border-radius: var(--corner) 0 0 0;
  overflow: hidden;
  transition: border-color .2s ease, transform .2s ease, box-shadow .2s ease;
}
.service-card:hover {
  border-color: var(--line);
  transform: translateY(-4px);
  box-shadow: var(--shadow);
}

.service-media {
  background: var(--surface-soft);
  aspect-ratio: 16 / 11;
  display: grid;
  place-items: center;
  padding: 14px;
}
.service-media img { max-height: 100%; width: auto; object-fit: contain; }

.service-body { padding: 24px 22px 26px; display: flex; flex-direction: column; flex: 1; }
.service-card h3 { font-size: 19px; margin-bottom: 10px; }
.service-card p { font-size: 15px; color: var(--ink-soft); margin-bottom: 16px; }

.service-meta {
  margin-top: auto;
  padding-top: 14px;
  border-top: 1px solid var(--line-soft);
  font-size: 13.5px;
  color: var(--ink-faint);
  display: flex;
  align-items: center;
  gap: 8px;
}
.service-cta { margin-top: 14px; }
/* The card's CTA is the primary action once hovered, so it picks up the brand
   fill rather than staying a quiet outline. */
.service-card:hover .service-cta {
  background: var(--orange-cta);
  border-color: var(--orange-cta);
  color: var(--white);
}
.service-cta:hover { transform: none; }

/* ==========================================================================
   Why us
   ========================================================================== */
.value-grid {
  display: grid;
  gap: 26px;
  grid-template-columns: 1fr;
}
@media (min-width: 620px) { .value-grid { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1000px) { .value-grid { grid-template-columns: repeat(4, 1fr); } }

.value-item { padding-top: 22px; border-top: 3px solid rgba(255, 255, 255, 0.22); }
.value-item .icon { margin-bottom: 16px; }
.value-item h3 { font-size: 18px; margin-bottom: 8px; color: var(--white); }
.value-item p { font-size: 15px; color: var(--on-navy); margin: 0; }

/* ==========================================================================
   Partners
   ========================================================================== */
.partner-grid {
  display: grid;
  gap: 16px;
  grid-template-columns: repeat(2, 1fr);
}
@media (min-width: 700px) { .partner-grid { grid-template-columns: repeat(3, 1fr); } }
/* 7 logos read best as 4 + 3 rather than 5 + 2 */
@media (min-width: 1000px) { .partner-grid { grid-template-columns: repeat(4, 1fr); } }

/* Real partner logos: white cards, logo contained and centred. Each source is a
   different size and colour, so the card does the normalising. */
.partner-card {
  border-radius: var(--corner-sm) 0 0 0;
  overflow: hidden;
  border: 1px solid var(--line-soft);
  background: var(--white);
  display: grid;
  place-items: center;
  padding: 12px 16px;
  transition: border-color .2s ease, box-shadow .2s ease, transform .2s ease;
}
.partner-card:hover {
  border-color: var(--line);
  box-shadow: var(--shadow);
  transform: translateY(-3px);
}
.partner-card img {
  width: 100%;
  aspect-ratio: 11 / 6;
  object-fit: contain;
}

/* Eighth tile: the partners with no logo supplied, summed up. Navy so it reads
   as a count rather than another logo. */
.partner-card--more {
  background: var(--navy);
  border-color: var(--navy);
  color: var(--white);
  gap: 2px;
  text-align: center;
  /* No aspect-ratio here on purpose: grid items stretch to their row, so this
     tile matches the height of the logo cards beside it at every breakpoint. */
}
.partner-more-count {
  font-size: clamp(38px, 5.6vw, 58px);
  font-weight: 500;
  line-height: 1;
  letter-spacing: -0.02em;
  color: var(--coral);
}
.partner-more-label {
  font-size: 13.5px;
  letter-spacing: 0.04em;
  color: var(--on-navy);
}

.partner-cta {
  margin-top: 34px;
  padding-top: 30px;
  border-top: 1px solid var(--line);
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 16px;
  text-align: center;
}
@media (min-width: 700px) {
  .partner-cta { flex-direction: row; justify-content: center; gap: 24px; }
}
.partner-cta-text {
  margin: 0;
  font-size: clamp(17px, 2.2vw, 20px);
  font-weight: 500;
  color: var(--ink);
}

/* ==========================================================================
   Projects
   ========================================================================== */
.project-grid {
  display: grid;
  gap: 22px;
  grid-template-columns: 1fr;
}
@media (min-width: 700px) { .project-grid { grid-template-columns: repeat(3, 1fr); } }

.project-card {
  position: relative;
  border-radius: var(--corner) 0 0 0;
  overflow: hidden;
  background: var(--navy);
}
.project-card img {
  width: 100%;
  aspect-ratio: 4 / 5;
  object-fit: cover;
  transition: transform .5s ease, opacity .3s ease;
}
.project-card:hover img { transform: scale(1.04); opacity: 0.82; }

.project-caption {
  position: absolute;
  inset: auto 0 0;
  padding: 60px 20px 20px;
  background: linear-gradient(to top, rgba(9, 37, 63, 0.92), rgba(9, 37, 63, 0));
  color: var(--white);
}
.project-caption h3 { font-size: 17px; margin: 0 0 3px; }
.project-caption p { font-size: 13.5px; margin: 0; color: var(--on-navy); }

/* ==========================================================================
   Video — the company film is a portrait 9:16 piece to camera, so it is
   presented in a portrait frame rather than stretched into a wide banner.
   ========================================================================== */
.video-layout {
  display: grid;
  gap: 40px;
  grid-template-columns: 1fr;
  align-items: center;
}
@media (min-width: 900px) { .video-layout { grid-template-columns: 1fr 1fr; gap: 64px; } }

.video-frame {
  position: relative;
  width: 100%;
  max-width: 330px;
  margin-inline: auto;
  border-radius: var(--corner) 0 0 0;
  overflow: hidden;
  background: var(--navy-deep);
  box-shadow: var(--shadow-lg);
}
.video-frame video { width: 100%; aspect-ratio: 9 / 16; object-fit: cover; display: block; }

.video-play {
  position: absolute;
  inset: 0;
  display: grid;
  place-items: center;
  background: rgba(9, 37, 63, 0.35);
  transition: opacity .25s ease;
}
.video-frame.is-playing .video-play { opacity: 0; pointer-events: none; }
.video-play button {
  background: none;
  border: 0;
  padding: 0;
  cursor: pointer;
  display: grid;
  place-items: center;
}
.video-play span {
  width: 72px;
  height: 72px;
  border-radius: 50%;
  background: var(--orange);
  color: var(--white);
  display: grid;
  place-items: center;
  box-shadow: 0 12px 30px rgba(240, 90, 35, 0.42);
}

.video-quote {
  border-left: 3px solid var(--orange);
  padding-left: 20px;
  font-size: clamp(18px, 2.4vw, 22px);
  line-height: 1.5;
  margin-bottom: 22px;
}
.video-author { font-size: 15px; color: var(--ink-soft); }
.video-author strong { display: block; font-weight: 500; color: var(--ink); }

/* ==========================================================================
   Lead capture form
   ========================================================================== */
.contact-layout {
  display: grid;
  gap: 40px;
  grid-template-columns: 1fr;
}
@media (min-width: 940px) { .contact-layout { grid-template-columns: 1fr 1.1fr; gap: 64px; } }

.contact-points { display: grid; gap: 22px; margin-top: 32px; }
.contact-point { display: flex; gap: 14px; align-items: flex-start; }
.contact-point .icon { margin-top: 3px; }

.contact-social { margin-top: 32px; padding-top: 26px; border-top: 1px solid rgba(255,255,255,.16); }
.contact-social-label {
  margin: 0 0 12px;
  font-size: 13px;
  color: var(--on-navy-faint);
}
.contact-social-links { display: flex; gap: 12px; }
.contact-social-links a {
  width: 44px;
  height: 44px;
  border: 1px solid rgba(255, 255, 255, 0.24);
  border-radius: var(--corner-sm) 0 0 0;
  display: grid;
  place-items: center;
  transition: background-color .18s ease, border-color .18s ease;
}
.contact-social-links a:hover {
  background: var(--orange-cta);
  border-color: var(--orange-cta);
}
.contact-point dt { font-size: 13px; color: var(--on-navy-faint); margin-bottom: 2px; }
.contact-point dd { margin: 0; font-size: 17px; font-weight: 500; }
.contact-point a { text-decoration: none; }
.contact-point a:hover { color: var(--coral); }

.lead-form {
  background: var(--white);
  color: var(--ink);
  border-radius: var(--corner) 0 0 0;
  padding: 28px 22px 30px;
  box-shadow: var(--shadow-lg);
}
@media (min-width: 620px) { .lead-form { padding: 36px 34px 38px; } }

.lead-form h3 { font-size: 22px; margin-bottom: 6px; }
.lead-form .form-note { font-size: 14.5px; color: var(--ink-soft); margin-bottom: 24px; }

.field { margin-bottom: 18px; }
.field label {
  display: block;
  font-size: 13.5px;
  font-weight: 500;
  margin-bottom: 7px;
  color: var(--ink-soft);
}
.field .req { color: var(--orange-ink); }

.field input,
.field select,
.field textarea {
  width: 100%;
  font: inherit;
  font-size: 16px;
  color: var(--ink);
  background: var(--surface-soft);
  border: 1.5px solid transparent;
  border-radius: var(--corner-sm) 0 0 0;
  padding: 14px 15px;
  transition: border-color .18s ease, background-color .18s ease;
}
.field textarea { min-height: 110px; resize: vertical; }
.field input:focus,
.field select:focus,
.field textarea:focus {
  background: var(--white);
  border-color: var(--navy);
  outline: none;
}
.field input:user-invalid,
.field textarea:user-invalid { border-color: var(--coral); }

.field select {
  appearance: none;
  background-image: url("../svg/icon-chevron-down-slate.svg");
  background-repeat: no-repeat;
  background-position: right 12px center;
  background-size: 20px;
  padding-right: 42px;
}


.form-status {
  margin-top: 16px;
  font-size: 14.5px;
  padding: 12px 14px;
  border-radius: var(--corner-sm) 0 0 0;
  display: none;
}
.form-status.is-info { display: block; background: var(--surface-tint); color: var(--ink-soft); }
.form-status.is-ok { display: block; background: #e8f4ec; color: #1a5f33; }
.form-status.is-error { display: block; background: #fdece7; color: #9c3316; }

/* ==========================================================================
   Footer
   ========================================================================== */
.site-footer {
  background: var(--navy-deep);
  color: var(--on-navy);
  padding-block: 56px 0;
  font-size: 15px;
}
.footer-grid {
  display: grid;
  gap: 34px;
  grid-template-columns: 1fr;
  padding-bottom: 44px;
}
@media (min-width: 700px) { .footer-grid { grid-template-columns: repeat(2, 1fr); gap: 40px; } }
@media (min-width: 1000px) { .footer-grid { grid-template-columns: 1.5fr 1fr 1fr 1.1fr; gap: 44px; } }

/* Direct child only: the social icons are nested inside .footer-brand, and a
   plain `.footer-brand img` rule beat `.icon` on specificity and stretched them
   to 150px wide — clamped by max-width into squashed 38x22 blobs. */
.footer-brand > img { width: 150px; margin-bottom: 18px; }
.footer-brand p { max-width: 320px; margin: 0; color: var(--on-navy-faint); font-size: 14.5px; }

.footer-col h4 {
  font-size: 13px;
  letter-spacing: 0.09em;
  color: var(--on-navy-faint);
  margin-bottom: 16px;
  font-weight: 500;
}
.footer-col li { margin-bottom: 11px; }
.footer-col a { text-decoration: none; }
.footer-col a:hover { color: var(--white); }

.footer-contact li { display: flex; gap: 11px; align-items: flex-start; }
.footer-contact .icon { margin-top: 3px; }

.footer-social { display: flex; gap: 12px; margin-top: 20px; }
.footer-social a {
  width: 40px;
  height: 40px;
  border: 1px solid rgba(255, 255, 255, 0.2);
  border-radius: var(--corner-sm) 0 0 0;
  display: grid;
  place-items: center;
  color: var(--on-navy);
}
.footer-social a:hover { background: var(--orange); border-color: var(--orange); color: var(--white); }

.footer-bottom {
  border-top: 1px solid rgba(255, 255, 255, 0.12);
  padding-block: 22px 26px;
  display: flex;
  flex-wrap: wrap;
  gap: 8px 20px;
  justify-content: space-between;
  font-size: 13.5px;
  color: var(--on-navy-faint);
}

/* ==========================================================================
   Floating WhatsApp — a tracked conversion, so it IS a <button>
   ========================================================================== */
.whatsapp-fab {
  position: fixed;
  right: 18px;
  bottom: 18px;
  z-index: 70;
  width: 56px;
  height: 56px;
  border: 0;
  border-radius: 50%;
  /* WhatsApp's darker brand green: the familiar #25D366 puts the white glyph
     at 2.0:1, below the 3:1 floor for meaningful graphics. */
  background: #128c7e;
  color: var(--white);
  display: grid;
  place-items: center;
  cursor: pointer;
  box-shadow: 0 12px 30px rgba(18, 140, 126, 0.42);
  transition: transform .2s ease;
}
.whatsapp-fab:hover { transform: scale(1.07); }
.whatsapp-fab .icon { width: 30px; height: 30px; }

@media (min-width: 900px) {
  .whatsapp-fab { right: 26px; bottom: 26px; }
}

/* ---------- utilities ---------- */
.visually-hidden {
  position: absolute !important;
  width: 1px; height: 1px;
  margin: -1px; padding: 0;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
  border: 0;
}

.skip-link {
  position: absolute;
  left: 12px;
  top: -60px;
  z-index: 100;
  background: var(--navy);
  color: var(--white);
  padding: 10px 18px;
  text-decoration: none;
  transition: top .2s ease;
}
.skip-link:focus { top: 12px; }

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after {
    animation-duration: .001ms !important;
    transition-duration: .001ms !important;
  }
}

/* ==========================================================================
   Sub-pages (services, catalog, about, projects, contact, blog, text pages)
   ========================================================================== */

/* ---------- compact page banner ---------- */
.page-hero {
  background: var(--navy);
  color: var(--white);
  padding-block: 54px 60px;
}
@media (min-width: 900px) { .page-hero { padding-block: 76px 84px; } }

.page-hero .eyebrow { color: var(--coral-ink); }
.page-hero .eyebrow::before { background: var(--coral); }

.page-hero h1 {
  font-size: clamp(30px, 5.4vw, 50px);
  line-height: 1.1;
  margin-bottom: 16px;
  max-width: 780px;
}
.page-hero-lead {
  font-size: clamp(16px, 2.1vw, 19px);
  color: var(--on-navy);
  max-width: 640px;
  margin: 0;
}

/* ---------- alternating service detail blocks ---------- */
.service-detail {
  display: grid;
  gap: 32px;
  grid-template-columns: 1fr;
  align-items: center;
}
@media (min-width: 900px) {
  .service-detail { grid-template-columns: 0.9fr 1.1fr; gap: 60px; }
  /* Flip the media to the right on alternate blocks without reordering the DOM,
     so the reading order stays heading-then-image for screen readers. */
  .service-detail--flip .service-detail-media { order: 2; }
}

.service-detail-media {
  background: var(--white);
  border: 1px solid var(--line-soft);
  border-radius: var(--corner) 0 0 0;
  padding: 24px;
  display: grid;
  place-items: center;
}
.section--soft .service-detail-media { background: var(--white); }
.service-detail-media img { max-height: 300px; width: auto; object-fit: contain; }

.service-detail-body h2 {
  font-size: clamp(26px, 3.6vw, 36px);
  margin-bottom: 14px;
}
.service-detail-body > p {
  color: var(--ink-soft);
  margin-bottom: 22px;
}

.service-includes { display: grid; gap: 11px; margin-bottom: 22px; }
.service-includes li {
  display: flex;
  align-items: flex-start;
  gap: 10px;
  font-size: 15.5px;
  color: var(--ink);
}
.service-includes .icon { margin-top: 4px; }

.service-tags { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 24px; }
.service-tags li {
  font-size: 13.5px;
  color: var(--ink-soft);
  border: 1px solid var(--line);
  border-radius: 999px;
  padding: 6px 14px;
}

.service-price {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 6px 12px;
  padding: 16px 18px;
  margin-bottom: 24px;
  background: var(--surface-soft);
  border-left: 3px solid var(--orange);
  border-radius: 0 var(--corner-sm) var(--corner-sm) 0;
}
.section--soft .service-price { background: var(--white); }
.service-price-label {
  font-size: 12.5px;
  letter-spacing: 0.08em;
  color: var(--ink-soft);
}
.service-price-value { font-size: 15.5px; font-weight: 500; color: var(--ink); }

/* ---------- numbered process steps ---------- */
.steps {
  display: grid;
  gap: 26px;
  grid-template-columns: 1fr;
  counter-reset: step;
}
@media (min-width: 620px) { .steps { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1000px) { .steps { grid-template-columns: repeat(4, 1fr); } }

.step { padding-top: 22px; border-top: 3px solid rgba(255, 255, 255, 0.22); }
.step-num {
  display: block;
  font-size: 13px;
  font-weight: 500;
  letter-spacing: 0.12em;
  color: var(--coral-ink);
  margin-bottom: 12px;
}
.step h3 { font-size: 18px; margin-bottom: 8px; color: var(--white); }
.step p { font-size: 15px; color: var(--on-navy); margin: 0; }

/* ---------- closing call-to-action band ---------- */
.cta-band {
  display: flex;
  flex-direction: column;
  gap: 24px;
  padding: 32px 26px;
  /* Navy rather than the near-white surface: this is the closing call to action
     on every sub-page, so it should read as a block, not as more page. */
  background: var(--navy);
  color: var(--white);
  border-radius: var(--corner) 0 0 0;
}
@media (min-width: 860px) {
  .cta-band {
    flex-direction: row;
    align-items: center;
    justify-content: space-between;
    padding: 44px 46px;
    gap: 40px;
  }
}
.cta-band-title { font-size: clamp(22px, 3vw, 30px); margin-bottom: 8px; color: var(--white); }
.cta-band-text { margin: 0; color: var(--on-navy); }
.cta-band-actions { display: flex; flex-wrap: wrap; gap: 12px; flex: none; }
/* The outline button is navy-on-white by default, which disappears here. */
.cta-band .btn--outline {
  color: var(--white);
  border-color: rgba(255, 255, 255, 0.42);
}
.cta-band .btn--outline:hover {
  border-color: var(--white);
  background: rgba(255, 255, 255, 0.08);
}

/* ---------- catalogue ---------- */
.catalog-grid {
  display: grid;
  gap: 22px;
  grid-template-columns: 1fr;
}
@media (min-width: 640px) { .catalog-grid { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1000px) { .catalog-grid { grid-template-columns: repeat(3, 1fr); } }

.catalog-card {
  display: flex;
  flex-direction: column;
  background: var(--white);
  border: 1px solid var(--line-soft);
  border-radius: var(--corner) 0 0 0;
  overflow: hidden;
  transition: border-color .2s ease, transform .2s ease, box-shadow .2s ease;
}
.catalog-card:hover {
  border-color: var(--line);
  transform: translateY(-4px);
  box-shadow: var(--shadow);
}
.catalog-media {
  background: var(--surface-soft);
  aspect-ratio: 16 / 11;
  display: grid;
  place-items: center;
  padding: 16px;
}
.catalog-media img { max-height: 100%; width: auto; object-fit: contain; }
.catalog-body { padding: 22px; }
.catalog-tag {
  display: inline-block;
  font-size: 12px;
  font-weight: 500;
  letter-spacing: 0.07em;
  color: var(--orange-ink);
  margin-bottom: 8px;
}
.catalog-card h3 { font-size: 18px; margin-bottom: 8px; }
.catalog-card p { font-size: 15px; color: var(--ink-soft); margin: 0; }

/* ---------- reference / site list cards ---------- */
.ref-grid {
  display: grid;
  gap: 18px;
  grid-template-columns: 1fr;
}
@media (min-width: 620px) { .ref-grid { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1000px) { .ref-grid { grid-template-columns: repeat(4, 1fr); } }

.ref-card {
  background: var(--white);
  border: 1px solid var(--line-soft);
  border-left: 3px solid var(--orange);
  border-radius: 0 var(--corner-sm) var(--corner-sm) 0;
  padding: 22px 20px;
}
.ref-service {
  display: block;
  font-size: 12px;
  font-weight: 500;
  letter-spacing: 0.07em;
  color: var(--orange-ink);
  margin-bottom: 8px;
}
.ref-card h3 { font-size: 17px; margin-bottom: 6px; }
.ref-card p { font-size: 14.5px; color: var(--ink-soft); margin: 0; }

/* ---------- long-form text ---------- */
.prose-layout {
  display: grid;
  gap: 40px;
  grid-template-columns: 1fr;
}
@media (min-width: 940px) { .prose-layout { grid-template-columns: 1.7fr 1fr; gap: 64px; } }

.prose { max-width: 68ch; }
.prose h2 {
  font-size: clamp(22px, 3vw, 28px);
  margin-top: 1.6em;
  margin-bottom: 0.5em;
}
.prose h2:first-child { margin-top: 0; }
.prose p { color: var(--ink-soft); }

.prose-list { display: grid; gap: 11px; margin: 0 0 1.4em; }
.prose-list li {
  display: flex;
  align-items: flex-start;
  gap: 10px;
  color: var(--ink);
}
.prose-list .icon { margin-top: 5px; }

.pull-quote {
  margin: 1.8em 0;
  padding-left: 22px;
  border-left: 3px solid var(--orange);
  font-size: clamp(18px, 2.4vw, 22px);
  line-height: 1.5;
  color: var(--ink);
}

.fact-list {
  display: grid;
  gap: 1px;
  background: var(--line);
  border: 1px solid var(--line);
  border-radius: var(--corner-sm) 0 0 0;
  overflow: hidden;
  margin: 0;
}
.fact { background: var(--surface-soft); padding: 18px 20px; }
.fact dt { font-size: 12.5px; letter-spacing: 0.07em; color: var(--ink-soft); margin-bottom: 4px; }
.fact dd { margin: 0; font-size: 19px; font-weight: 500; color: var(--ink); }

.text-page .prose { margin-inline: auto; }
.text-page-updated { font-size: 14.5px; color: var(--ink-soft); margin-top: 2.4em; }

/* ---------- contact page ---------- */
.contact-cards {
  display: grid;
  gap: 20px;
  grid-template-columns: 1fr;
}
@media (min-width: 760px) { .contact-cards { grid-template-columns: repeat(3, 1fr); } }

.contact-card {
  background: var(--white);
  border: 1px solid var(--line-soft);
  border-radius: var(--corner) 0 0 0;
  padding: 28px 24px;
}
.contact-card .icon { margin-bottom: 16px; }
.contact-card h2 {
  font-size: 13px;
  letter-spacing: 0.08em;
  color: var(--ink-soft);
  font-weight: 500;
  margin-bottom: 8px;
}
.contact-card-value {
  font-size: 19px;
  font-weight: 500;
  color: var(--ink);
  margin: 0 0 8px;
}
.contact-card-note { font-size: 14.5px; color: var(--ink-soft); margin: 0; }

.map-frame {
  border-radius: var(--corner) 0 0 0;
  overflow: hidden;
  border: 1px solid var(--line-soft);
  line-height: 0;
}
.map-frame iframe { width: 100%; height: 380px; border: 0; display: block; }

/* ---------- blog ---------- */
.post-grid {
  display: grid;
  gap: 24px;
  grid-template-columns: 1fr;
}
@media (min-width: 700px) { .post-grid { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1040px) { .post-grid { grid-template-columns: repeat(3, 1fr); } }

.post-card {
  background: var(--white);
  border: 1px solid var(--line-soft);
  border-radius: var(--corner) 0 0 0;
  overflow: hidden;
  transition: border-color .2s ease, transform .2s ease, box-shadow .2s ease;
}
.post-card:hover { border-color: var(--line); transform: translateY(-4px); box-shadow: var(--shadow); }
.post-card-link { display: block; text-decoration: none; color: inherit; }
.post-card-media { background: var(--surface-soft); }
.post-card-media img { width: 100%; aspect-ratio: 3 / 2; object-fit: cover; }
.post-card-body { padding: 22px; }
.post-card h2 { font-size: 19px; margin-bottom: 10px; }
.post-card p { font-size: 15px; color: var(--ink-soft); margin: 0; }

.post-meta {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 10px;
  font-size: 13px;
  color: var(--ink-soft);
  margin-bottom: 10px;
}
.post-cat {
  font-weight: 500;
  letter-spacing: 0.06em;
  color: var(--orange-ink);
}
.post-meta--hero { color: var(--on-navy); margin-bottom: 18px; }
.post-meta--hero .post-cat { color: var(--coral-ink); }
.post-back { text-decoration: none; }
.post-back:hover { color: var(--coral-ink); }

.post-body { max-width: 820px; margin-inline: auto; }
.post-hero-img {
  width: 100%;
  max-height: 460px;
  object-fit: cover;
  border-radius: var(--corner) 0 0 0;
  margin-bottom: 36px;
}
.post-cta {
  margin-top: 40px;
  padding-top: 30px;
  border-top: 1px solid var(--line);
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 16px;
}
.post-cta p { margin: 0; font-size: 18px; font-weight: 500; }

/* ---------- projects pager ---------- */
.pager {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  margin-top: 40px;
}
.pager-pages { display: flex; gap: 8px; }
.pager-btn {
  min-width: 44px;
  height: 44px;
  padding-inline: 12px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: 1px solid var(--line);
  border-radius: var(--corner-sm) 0 0 0;
  font-size: 15px;
  font-weight: 500;
  color: var(--ink-soft);
  cursor: pointer;
  user-select: none;
  transition: background-color .16s ease, border-color .16s ease, color .16s ease;
}
.pager-btn:hover { border-color: var(--navy); color: var(--ink); }
.pager-btn.is-active {
  background: var(--navy);
  border-color: var(--navy);
  color: var(--white);
}
.pager-btn.is-disabled {
  opacity: .38;
  pointer-events: none;
}
.pager-icon-prev { transform: rotate(180deg); }
