/* ==========================================================================
   SELF-HOSTED FONTS
   Served from this domain, so there is no third-party DNS lookup or
   render-blocking request to fonts.googleapis.com. font-display:swap means
   text paints immediately in the fallback and reflows once the font lands.
   ========================================================================== */
@font-face{
  font-family:'Poppins'; font-style:normal; font-weight:600; font-display:swap;
  src:url('../fonts/poppins-latin-600-normal.woff2') format('woff2');
}
@font-face{
  font-family:'Poppins'; font-style:normal; font-weight:700; font-display:swap;
  src:url('../fonts/poppins-latin-700-normal.woff2') format('woff2');
}
@font-face{
  font-family:'Inter'; font-style:normal; font-weight:400; font-display:swap;
  src:url('../fonts/inter-latin-400-normal.woff2') format('woff2');
}
@font-face{
  font-family:'Inter'; font-style:normal; font-weight:500; font-display:swap;
  src:url('../fonts/inter-latin-500-normal.woff2') format('woff2');
}
@font-face{
  font-family:'Inter'; font-style:normal; font-weight:600; font-display:swap;
  src:url('../fonts/inter-latin-600-normal.woff2') format('woff2');
}

/* ==========================================================================
   SUMINISTROS SERVICES — stylesheet
   Brand identity preserved from the original build:
   monochrome palette, Poppins display / Inter text, 12px radius, 1120px page.
   WhatsApp green is used ONLY on WhatsApp actions, as a functional signal.
   ========================================================================== */

/* --------------------------------------------------------------------------
   1. TOKENS
   -------------------------------------------------------------------------- */
:root{
  /* brand — unchanged from original */
  --white:#FFFFFF;
  --black:#0A0A0B;
  --ink:#2A2B2E;
  --ink-soft:#6B6C70;
  --accent:#8A8B8E;
  --hairline:rgba(10,10,11,0.08);
  --hairline-strong:rgba(10,10,11,0.16);

  /* surfaces */
  --surface:#FFFFFF;
  --surface-alt:#FAFAFA;
  --on-dark:rgba(255,255,255,0.72);
  --on-dark-soft:rgba(255,255,255,0.55);
  --hairline-dark:rgba(255,255,255,0.14);

  /* Brand accent. Used for conversion actions only, never decoration.
     --cta      the brand blue, exactly as specified
     --cta-deep a darker step for hover and for small marks on white, where
                the lighter blue would not hold enough contrast */
  --cta:#0081CC;
  --cta-deep:#0073B7;
  --cta-shadow:0,129,204;

  --radius:12px;
  --radius-sm:8px;
  --radius-lg:20px;
  --container:1120px;

  /* spacing scale */
  --sp-1:4px;  --sp-2:8px;  --sp-3:12px; --sp-4:16px; --sp-5:24px;
  --sp-6:32px; --sp-7:48px; --sp-8:64px; --sp-9:96px; --sp-10:128px;

  /* motion */
  --ease:cubic-bezier(.22,.61,.36,1);
  --ease-out:cubic-bezier(.16,1,.3,1);
  --dur:.28s;

  /* Three-layer shadows: a tight contact shadow, a mid diffusion and a wide
     ambient one. Closer to how light actually falls than a single blur. */
  --shadow-sm:0 1px 1px rgba(10,10,11,.04), 0 2px 6px rgba(10,10,11,.04),
              0 6px 16px rgba(10,10,11,.03);
  --shadow-md:0 1px 2px rgba(10,10,11,.05), 0 6px 14px rgba(10,10,11,.06),
              0 16px 36px rgba(10,10,11,.07);
  --shadow-lg:0 2px 4px rgba(10,10,11,.06), 0 12px 28px rgba(10,10,11,.09),
              0 32px 72px rgba(10,10,11,.12);

  --nav-h:72px;
}

/* --------------------------------------------------------------------------
   2. RESET & BASE
   -------------------------------------------------------------------------- */
*,*::before,*::after{ box-sizing:border-box; }
*{ margin:0; padding:0; }

html{ -webkit-text-size-adjust:100%; }
html:focus-within{ scroll-behavior:smooth; }
@media (prefers-reduced-motion:reduce){ html:focus-within{ scroll-behavior:auto; } }

body{
  font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
  color:var(--ink);
  background:var(--surface);
  line-height:1.55;
  -webkit-font-smoothing:antialiased;
  -moz-osx-font-smoothing:grayscale;
  overflow-x:hidden;
}

/* the hidden attribute must beat component display rules (.modal is flex) */
[hidden]{ display:none !important; }

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

::selection{ background:var(--cta); color:#fff; }
a,button{ -webkit-tap-highlight-color:rgba(0,129,204,.16); }

/* anchor targets clear the sticky header */
section[id],main[id]{ scroll-margin-top:calc(var(--nav-h) + 12px); }

/* --------------------------------------------------------------------------
   SCROLL LOCK
   position:fixed on <body> is the only approach that reliably stops
   background scrolling on iOS Safari. The header is re-pinned so it stays
   on screen while the flyout menu is open.
   -------------------------------------------------------------------------- */
body.scroll-locked{
  position:fixed; left:0; right:0; width:100%;
  overflow:hidden;
}
body.scroll-locked .nav{ position:fixed; top:0; left:0; right:0; }
a{ color:inherit; text-decoration:none; }
ul,ol{ list-style:none; }
button{ font:inherit; color:inherit; background:none; border:none; cursor:pointer; }
input,textarea,select{ font:inherit; }

h1,h2,h3,h4{
  font-family:'Poppins','Segoe UI',-apple-system,BlinkMacSystemFont,sans-serif; font-weight:700;
  letter-spacing:-0.02em; color:var(--black); line-height:1.2;
}

/* visible focus for keyboard users only */
:focus-visible{
  outline:2px solid var(--black);
  outline-offset:3px;
  border-radius:4px;
}
.on-dark :focus-visible,
.mobile-menu :focus-visible,
.nav :focus-visible{ outline-color:#fff; }

.skip-link{
  position:absolute; top:0; left:0; z-index:200;
  transform:translateY(-120%);
  background:var(--black); color:#fff;
  padding:var(--sp-3) var(--sp-5);
  font-size:14px; font-weight:600;
  border-radius:0 0 var(--radius-sm) 0;
  transition:transform .2s var(--ease);
}
.skip-link:focus{ transform:translateY(0); }

.sr-only{
  position:absolute; width:1px; height:1px; padding:0; margin:-1px;
  overflow:hidden; clip:rect(0,0,0,0); white-space:nowrap; border:0;
}

/* --------------------------------------------------------------------------
   3. LAYOUT PRIMITIVES
   -------------------------------------------------------------------------- */
.container{
  width:100%; max-width:var(--container);
  margin-inline:auto;
  padding-inline:clamp(20px,5vw,var(--sp-7));
}
section{ padding-block:clamp(var(--sp-8),9vw,var(--sp-10)); }

.label{
  display:inline-flex; align-items:center; gap:var(--sp-2);
  font-size:12px; font-weight:600; letter-spacing:0.14em;
  text-transform:uppercase; color:var(--ink-soft);
  margin-bottom:var(--sp-5);
}
.label::before{
  content:""; width:18px; height:1px;
  background:currentColor; opacity:.5; flex:none;
}

.section-head{ max-width:600px; margin-bottom:var(--sp-8); }
.section-head h2{
  font-size:clamp(1.7rem,3.2vw,2.4rem);
  letter-spacing:-.026em; text-wrap:balance;
}
.section-head p{
  margin-top:var(--sp-3); font-size:1rem;
  color:var(--ink-soft); line-height:1.7;
  text-wrap:pretty;      /* stops a single word stranding on its own line */
}

.head-row{
  display:flex; align-items:flex-end; justify-content:space-between;
  gap:var(--sp-5); flex-wrap:wrap; margin-bottom:var(--sp-8);
}
.head-row .section-head{ margin-bottom:0; }

/* card / tile grid */
.grid{ display:grid; gap:var(--sp-5); }
.grid--2{ grid-template-columns:repeat(2,1fr); }
.grid--3{ grid-template-columns:repeat(3,1fr); }
.grid--4{ grid-template-columns:repeat(4,1fr); }
@media (max-width:920px){
  .grid--3,.grid--4{ grid-template-columns:repeat(2,1fr); }
  .grid--2{ grid-template-columns:1fr; }
}
@media (max-width:560px){
  .grid--3,.grid--4{ grid-template-columns:1fr; }
}

/* icon + label inline list */
.inline-list{
  display:grid;
  grid-template-columns:repeat(auto-fill,minmax(168px,1fr));
  column-gap:var(--sp-6); row-gap:var(--sp-4);
}
.inline-list .item{
  display:flex; align-items:center; gap:var(--sp-2);
  font-size:14px; font-weight:500; color:var(--ink);
}
.inline-list .item svg{
  width:15px; height:15px; color:var(--accent); flex:none;
}

/* --------------------------------------------------------------------------
   4. BUTTONS
   -------------------------------------------------------------------------- */
.btn{
  --btn-bg:transparent; --btn-fg:var(--black); --btn-bd:transparent;
  position:relative;
  display:inline-flex; align-items:center; justify-content:center; gap:var(--sp-2);
  font-size:14px; font-weight:600; letter-spacing:0.01em;
  padding:14px var(--sp-5);
  border-radius:var(--radius);
  border:1px solid var(--btn-bd);
  background:var(--btn-bg); color:var(--btn-fg);
  cursor:pointer; text-align:center;
  transition:background var(--dur) var(--ease), border-color var(--dur) var(--ease),
             color var(--dur) var(--ease), transform var(--dur) var(--ease),
             box-shadow var(--dur) var(--ease);
}
.btn:hover{ transform:translateY(-1px); }
.btn:active{ transform:translateY(0); }
.btn svg{ width:16px; height:16px; flex:none; }

.btn-primary{ --btn-bg:var(--black); --btn-fg:#fff; }
.btn-primary:hover{ --btn-bg:#25262A; box-shadow:var(--shadow-md); }
/* a 1px inner highlight along the top edge stops solid fills reading flat */
.btn-primary,.btn-wa{ box-shadow:inset 0 1px 0 rgba(255,255,255,.12); }
.btn-primary:active,.btn-wa:active{ transform:translateY(1px) scale(.995); }

.btn-secondary{ --btn-fg:var(--black); --btn-bd:var(--hairline-strong); }
.btn-secondary:hover{ --btn-bd:var(--black); background:var(--surface-alt); }

.btn-ghost{ --btn-fg:var(--ink-soft); padding-inline:var(--sp-3); }
.btn-ghost:hover{ --btn-fg:var(--black); }

/* WhatsApp — the single functional accent in the palette */
/* .btn-wa is named for what it does (opens WhatsApp), not for its colour */
.btn-wa{ --btn-bg:var(--cta); --btn-fg:#fff; }
.btn-wa:hover{ --btn-bg:var(--cta-deep); box-shadow:0 6px 20px rgba(var(--cta-shadow),.34); }

/* on dark backgrounds */
.on-dark .btn-primary{ --btn-bg:#fff; --btn-fg:var(--black); }
.on-dark .btn-primary:hover{ --btn-bg:rgba(255,255,255,.88); }
.on-dark .btn-secondary{ --btn-fg:#fff; --btn-bd:rgba(255,255,255,.3); }
.on-dark .btn-secondary:hover{ --btn-bd:#fff; background:rgba(255,255,255,.08); }

.btn-block{ width:100%; }

/* arrow that slides on hover */
.btn .arrow{ transition:transform var(--dur) var(--ease); }
.btn:hover .arrow{ transform:translateX(3px); }

/* --------------------------------------------------------------------------
   5. LOGO
   -------------------------------------------------------------------------- */
.nav-logo{
  display:inline-flex; align-items:center;
  padding:6px 0; border-radius:var(--radius-sm);
  opacity:1; transition:opacity var(--dur) var(--ease);
}
.nav-logo:hover{ opacity:.8; }
.logo--nav{ height:26px; width:auto; }
.logo--mark{
  width:88px; height:88px; aspect-ratio:1;
  object-fit:contain; padding:10px;
  background:var(--black); border-radius:var(--radius);
}

/* --------------------------------------------------------------------------
   6. HEADER / NAV
   -------------------------------------------------------------------------- */
.nav{
  position:sticky; top:0; z-index:60;
  display:flex; align-items:center; justify-content:space-between;
  gap:var(--sp-5);
  min-height:var(--nav-h);
  padding:var(--sp-4) clamp(20px,5vw,var(--sp-7));
  background:rgba(10,10,11,.88);
  -webkit-backdrop-filter:blur(12px) saturate(140%);
  backdrop-filter:blur(12px) saturate(140%);
  border-bottom:1px solid rgba(255,255,255,.08);
  transition:background var(--dur) var(--ease), border-color var(--dur) var(--ease);
}
.nav.is-scrolled{
  background:rgba(10,10,11,.97);
  border-bottom-color:rgba(255,255,255,.13);
}
.nav-links{ display:flex; align-items:center; gap:clamp(18px,2.4vw,var(--sp-6)); }
.nav-links a{
  position:relative;
  font-size:14px; font-weight:500;
  color:rgba(255,255,255,.7);
  padding-block:6px;
  transition:color var(--dur) var(--ease);
}
.nav-links a::after{
  content:""; position:absolute; left:0; bottom:0;
  width:100%; height:1px; background:#fff;
  transform:scaleX(0); transform-origin:right;
  transition:transform var(--dur) var(--ease);
}
.nav-links a:hover,
.nav-links a[aria-current="true"]{ color:#fff; }
.nav-links a:hover::after,
.nav-links a[aria-current="true"]::after{ transform:scaleX(1); transform-origin:left; }

.nav-actions{ display:flex; align-items:center; gap:var(--sp-4); }

.nav-toggle{
  display:none;
  width:44px; height:44px;
  align-items:center; justify-content:center;
  border-radius:var(--radius-sm);
  margin-right:-8px;
}
.nav-toggle .bars{
  display:block; position:relative; width:20px; height:14px;
}
.nav-toggle .bars span{
  position:absolute; left:0; width:100%; height:1.5px;
  background:#fff; border-radius:2px;
  transition:transform var(--dur) var(--ease), opacity .18s var(--ease);
}
.nav-toggle .bars span:nth-child(1){ top:0; }
.nav-toggle .bars span:nth-child(2){ top:6.25px; }
.nav-toggle .bars span:nth-child(3){ top:12.5px; }

body.menu-open .nav-toggle .bars span:nth-child(1){ transform:translateY(6.25px) rotate(45deg); }
body.menu-open .nav-toggle .bars span:nth-child(2){ opacity:0; transform:scaleX(.4); }
body.menu-open .nav-toggle .bars span:nth-child(3){ transform:translateY(-6.25px) rotate(-45deg); }

@media (max-width:900px){
  .nav-links{ display:none; }
  .nav-actions .btn{ display:none; }
  .nav-toggle{ display:inline-flex; }
}

/* --------------------------------------------------------------------------
   7. MOBILE FLYOUT MENU
   Right-side drawer + backdrop. Uses dvh so mobile browser chrome
   (the collapsing address bar) never clips the panel footer.
   -------------------------------------------------------------------------- */
.menu-backdrop{
  position:fixed; inset:0; z-index:70;
  background:rgba(10,10,11,.55);
  -webkit-backdrop-filter:blur(2px); backdrop-filter:blur(2px);
  opacity:0; visibility:hidden;
  transition:opacity var(--dur) var(--ease), visibility 0s linear var(--dur);
}
body.menu-open .menu-backdrop{
  opacity:1; visibility:visible;
  transition:opacity var(--dur) var(--ease), visibility 0s;
}

.mobile-menu{
  position:fixed; top:0; right:0; z-index:80;
  width:min(88vw,380px);
  height:100dvh; max-height:100dvh;
  display:flex; flex-direction:column;
  background:var(--black);
  border-left:1px solid rgba(255,255,255,.1);
  box-shadow:-24px 0 60px rgba(0,0,0,.4);
  transform:translateX(100%);
  visibility:hidden;
  transition:transform .34s var(--ease-out), visibility 0s linear .34s;
  overscroll-behavior:contain;
}
body.menu-open .mobile-menu{
  transform:translateX(0);
  visibility:visible;
  transition:transform .34s var(--ease-out), visibility 0s;
}
@media (min-width:901px){
  .mobile-menu,.menu-backdrop{ display:none; }
}

.mobile-menu__head{
  display:flex; align-items:center; justify-content:space-between;
  gap:var(--sp-4);
  padding:var(--sp-5) var(--sp-5);
  min-height:var(--nav-h);
  border-bottom:1px solid rgba(255,255,255,.09);
  flex:none;
}
.mobile-menu__close{
  width:40px; height:40px; margin-right:-6px;
  display:inline-flex; align-items:center; justify-content:center;
  border-radius:50%; color:#fff;
  border:1px solid rgba(255,255,255,.18);
  transition:background var(--dur) var(--ease), border-color var(--dur) var(--ease);
}
.mobile-menu__close:hover{ background:rgba(255,255,255,.1); border-color:rgba(255,255,255,.4); }
.mobile-menu__close svg{ width:17px; height:17px; }

.mobile-menu__body{
  flex:1 1 auto;
  overflow-y:auto; -webkit-overflow-scrolling:touch;
  padding:var(--sp-6) var(--sp-5) var(--sp-5);
  display:flex; flex-direction:column; gap:var(--sp-6);
}

.mobile-menu__links{ display:flex; flex-direction:column; }
.mobile-menu__links li{ border-bottom:1px solid rgba(255,255,255,.07); }
.mobile-menu__links li:last-child{ border-bottom:none; }
.mobile-menu__links a{
  display:flex; align-items:center; justify-content:space-between;
  gap:var(--sp-4);
  font-family:'Poppins','Segoe UI',sans-serif;
  font-size:1.15rem; font-weight:600; letter-spacing:-0.01em;
  color:#fff;
  padding:var(--sp-4) 0;
  transition:color var(--dur) var(--ease), padding-left var(--dur) var(--ease);
}
.mobile-menu__links a .chev{
  width:15px; height:15px; flex:none;
  color:rgba(255,255,255,.35);
  transition:transform var(--dur) var(--ease), color var(--dur) var(--ease);
}
.mobile-menu__links a:hover{ padding-left:var(--sp-2); }
.mobile-menu__links a:hover .chev{ transform:translateX(3px); color:#fff; }

/* staggered entrance — items cascade in once the panel has started opening */
.js .mobile-menu__links li,
.js .mobile-menu__body .btn{
  opacity:0; transform:translateX(14px);
}
body.menu-open .mobile-menu__links li,
body.menu-open .mobile-menu__body .btn{
  opacity:1; transform:translateX(0);
  transition:opacity .34s var(--ease-out), transform .34s var(--ease-out);
  transition-delay:calc(90ms + var(--i,0) * 45ms);
}

.mobile-menu__actions{ display:flex; flex-direction:column; gap:var(--sp-3); }

/* flyout footer — social icons live here */
.mobile-menu__foot{
  flex:none;
  padding:var(--sp-5);
  padding-bottom:max(var(--sp-5),env(safe-area-inset-bottom));
  border-top:1px solid rgba(255,255,255,.09);
  background:rgba(255,255,255,.02);
}
.mobile-menu__foot .foot-label{
  font-size:11px; font-weight:600; letter-spacing:.14em;
  text-transform:uppercase; color:rgba(255,255,255,.42);
  margin-bottom:var(--sp-3);
}
.social-row{ display:flex; align-items:center; gap:var(--sp-2); flex-wrap:wrap; }
.social-link{
  width:40px; height:40px;
  display:inline-flex; align-items:center; justify-content:center;
  border-radius:50%;
  border:1px solid rgba(255,255,255,.16);
  color:rgba(255,255,255,.78);
  transition:background var(--dur) var(--ease), color var(--dur) var(--ease),
             border-color var(--dur) var(--ease), transform var(--dur) var(--ease);
}
.social-link:hover{
  background:#fff; color:var(--black);
  border-color:#fff; transform:translateY(-2px);
}
.social-link svg{ width:17px; height:17px; }
.mobile-menu__foot .contact-line{
  margin-top:var(--sp-4);
  font-size:12.5px; color:rgba(255,255,255,.45); line-height:1.6;
}
.mobile-menu__foot .contact-line a{ color:rgba(255,255,255,.7); }
.mobile-menu__foot .contact-line a:hover{ color:#fff; text-decoration:underline; }

/* footer variant of the social row */
footer .social-link{
  border-color:var(--hairline-strong); color:var(--ink-soft);
}
footer .social-link:hover{
  background:var(--black); color:#fff; border-color:var(--black);
}

/* --------------------------------------------------------------------------
   8. HERO
   -------------------------------------------------------------------------- */
.hero{
  padding-top:clamp(var(--sp-7),7vw,var(--sp-9));
  padding-bottom:clamp(var(--sp-7),5vw,var(--sp-8));
}

/* Two stacked sections used to compound their padding, leaving a large empty
   band with nothing to explain it. A hairline at the top of the next section
   halves that space and makes the break read as deliberate. */
.section-rule{ padding-top:0; }
.section-rule > .container{
  border-top:1px solid var(--hairline);
  padding-top:clamp(var(--sp-7),6vw,var(--sp-8));
}
.hero-grid{
  display:grid; grid-template-columns:1.05fr .95fr;
  align-items:center; gap:clamp(var(--sp-7),6vw,var(--sp-9));
}
@media (max-width:920px){
  .hero-grid{ grid-template-columns:1fr; gap:var(--sp-8); }
}
.hero-copy{ max-width:580px; }
.hero h1{
  font-size:clamp(2.2rem,4.6vw,3.5rem); line-height:1.06;
  /* large type needs tighter tracking than body copy to look set, not typed */
  letter-spacing:-.032em;
  text-wrap:balance;
}
.hero h1 .accent{ color:var(--accent); }
.hero .subhead{
  margin-top:var(--sp-5); font-size:1.05rem;
  color:var(--ink-soft); max-width:490px; line-height:1.7;
}
.hero .cta-row{
  display:flex; gap:var(--sp-3); margin-top:var(--sp-6); flex-wrap:wrap;
}
/* --------------------------------------------------------------------------
   CLIENT CAROUSEL
   4 per view on desktop and tablet, 2 per view on mobile.
   --clients-per-view is the single source of truth: the JS reads it back from
   the computed style, so the breakpoints live here in CSS and never drift out
   of sync with the script.
   -------------------------------------------------------------------------- */
.clients{
  --clients-per-view:4;
  --clients-gap:var(--sp-4);
  grid-column:1/-1;
  /* grid and flex children default to min-width:auto, which lets the wide
     flex track below stretch this box past the viewport before the inner
     overflow:hidden can clip it. min-width:0 is what actually contains it. */
  min-width:0;
  margin-top:var(--sp-8); padding-top:var(--sp-6);
  border-top:1px solid var(--hairline);
}
@media (max-width:640px){
  .clients{ --clients-per-view:2; --clients-gap:var(--sp-3); }
}

.clients__label{
  font-size:11.5px; font-weight:600; letter-spacing:.13em;
  text-transform:uppercase; color:var(--accent);
  margin-bottom:var(--sp-5);
}

.clients__viewport{ overflow:hidden; min-width:0; }
.clients__track{
  display:flex; gap:var(--clients-gap);
  transition:transform .55s var(--ease-out);
  will-change:transform;
}

.client{
  /* each cell is exactly 1/perView of the row, gaps accounted for */
  flex:0 0 calc(
    (100% - var(--clients-gap) * (var(--clients-per-view) - 1))
    / var(--clients-per-view)
  );
  min-width:0;
}

.client__inner{
  display:flex; align-items:center; justify-content:center;
  height:100%; min-height:118px;
  padding:var(--sp-4) var(--sp-4);
  background:var(--surface);
  border:1px solid var(--hairline);
  border-radius:var(--radius);
  transition:border-color var(--dur) var(--ease), box-shadow var(--dur) var(--ease),
             transform var(--dur) var(--ease);
}
.client__inner:hover{
  border-color:var(--hairline-strong);
  box-shadow:var(--shadow-sm);
  transform:translateY(-2px);
}

/* Logos are supplied on a common 3:2 canvas, already balanced against each
   other, so they are sized by width and the canvas does the rest. */
.client__logo{
  width:100%; max-width:170px; height:auto;
  aspect-ratio:3/2;
  object-fit:contain;
  /* the page is monochrome; twelve competing brand palettes in one row would
     fight it, so logos rest in greyscale and bloom into colour on hover */
  filter:grayscale(1); opacity:.62;
  transition:filter var(--dur) var(--ease), opacity var(--dur) var(--ease);
}
.client__inner:hover .client__logo{ filter:grayscale(0); opacity:1; }

/* Touch devices have no hover, so they would never see the colour.
   Show it permanently there instead. */
@media (hover:none){
  .client__logo{ filter:none; opacity:1; }
}

/* Prefer full colour everywhere? Delete the two rules above and keep this:
   .client__logo{ filter:none; opacity:1; }                                   */

/* text wordmark fallback, used until a logo file exists */
.client__name{
  font-family:'Poppins','Segoe UI',sans-serif; font-weight:700;
  font-size:clamp(13px,1.5vw,15.5px); letter-spacing:.01em;
  line-height:1.25; text-align:center;
  color:var(--ink-soft); opacity:.7;
  transition:opacity var(--dur) var(--ease), color var(--dur) var(--ease);
}
.client__inner:hover .client__name{ opacity:1; color:var(--black); }

.clients__nav{
  display:flex; align-items:center; justify-content:center; gap:var(--sp-4);
  margin-top:var(--sp-5);
}
.clients__nav .dots{ display:flex; align-items:center; gap:7px; }
.clients__nav .dot{ background:var(--hairline-strong); }
.clients__nav .dot.is-active{ background:var(--black); }
/* a single page needs no controls */
.clients__nav.is-hidden{ display:none; }

/* counters */
.stats{
  display:grid; grid-template-columns:repeat(3,1fr);
  gap:var(--sp-5); margin-top:var(--sp-7);
  padding-top:var(--sp-6); border-top:1px solid var(--hairline);
}
.stat .num{
  font-family:'Poppins','Segoe UI',sans-serif; font-weight:700;
  font-size:clamp(1.6rem,3vw,2.1rem);
  color:var(--black); letter-spacing:-.03em; line-height:1;
  font-variant-numeric:tabular-nums;
}
.stat .cap{
  margin-top:var(--sp-2); font-size:12.5px;
  color:var(--ink-soft); line-height:1.45;
}

/* --------------------------------------------------------------------------
   9. CAROUSEL (shared: hero + projects band)
   -------------------------------------------------------------------------- */
.carousel{
  --ratio:1/1; --max-h:430px;
  position:relative; isolation:isolate;
  aspect-ratio:var(--ratio); max-height:var(--max-h);
  border-radius:var(--radius); overflow:hidden;
  background:var(--black);
}
.carousel .track{
  display:flex; height:100%;
  transition:transform .55s var(--ease-out);
  will-change:transform;
}
.carousel .slide{ position:relative; flex:0 0 100%; height:100%; }
.carousel .slide img{ width:100%; height:100%; object-fit:cover; }
.carousel .slide::after{
  content:""; position:absolute; inset:0;
  background:linear-gradient(to top,
    rgba(10,10,11,.78) 0%, rgba(10,10,11,.12) 46%, rgba(10,10,11,0) 66%);
}
.carousel .cap{
  position:absolute; left:0; bottom:0; z-index:2; width:100%;
  padding:var(--sp-4) var(--sp-5) calc(var(--sp-4) + 22px);
  display:flex; flex-direction:column; gap:3px;
  color:rgba(255,255,255,.72); font-size:12.5px; letter-spacing:.05em;
  text-transform:uppercase; font-weight:500;
}
.carousel .cap b{
  color:#fff; font-family:'Poppins','Segoe UI',sans-serif; font-weight:600;
  font-size:15px; letter-spacing:-.01em; text-transform:none;
}
.carousel .cnav{
  position:absolute; top:50%; z-index:3;
  transform:translateY(-50%);
  width:38px; height:38px; border-radius:50%;
  background:rgba(10,10,11,.45); border:1px solid rgba(255,255,255,.22);
  color:#fff; display:flex; align-items:center; justify-content:center;
  -webkit-backdrop-filter:blur(6px); backdrop-filter:blur(6px);
  opacity:0; transition:opacity .25s var(--ease), background .2s var(--ease);
}
.carousel:hover .cnav,
.carousel:focus-within .cnav{ opacity:1; }
.carousel .cnav:hover{ background:rgba(10,10,11,.78); }
.carousel .cnav svg{ width:17px; height:17px; }
.carousel .prev{ left:12px; }
.carousel .next{ right:12px; }
@media (hover:none){ .carousel .cnav{ display:none; } }

.carousel .dots{
  position:absolute; left:0; bottom:14px; z-index:3; width:100%;
  display:flex; justify-content:center; gap:7px;
}
.dot{
  width:6px; height:6px; border-radius:50%;
  background:rgba(255,255,255,.4);
  transition:background .2s var(--ease), width .25s var(--ease);
}
.dot.is-active{ background:#fff; width:20px; border-radius:3px; }

@media (max-width:920px){ .carousel{ --ratio:16/10; --max-h:320px; } }
@media (max-width:560px){ .carousel{ --ratio:3/2; --max-h:260px; } }

/* --------------------------------------------------------------------------
   10. ABOUT / BRAND INTRODUCTION
   -------------------------------------------------------------------------- */
.about-grid{
  display:grid; grid-template-columns:1fr 1fr; gap:clamp(var(--sp-7),6vw,var(--sp-9));
}
@media (max-width:860px){ .about-grid{ grid-template-columns:1fr; gap:var(--sp-7); } }
.about-copy h2{ font-size:clamp(1.7rem,3vw,2.3rem); line-height:1.22; }
.about-copy p{
  margin-top:var(--sp-4); font-size:1rem;
  color:var(--ink-soft); line-height:1.75;
}
.mv-row{
  display:grid; grid-template-columns:96px 1fr; gap:var(--sp-4);
  padding-block:var(--sp-5); border-top:1px solid var(--hairline);
}
.mv-row:last-of-type{ border-bottom:1px solid var(--hairline); }
.mv-row .mv-label{
  font-size:12px; font-weight:600; letter-spacing:.09em;
  text-transform:uppercase; color:var(--accent); padding-top:3px;
}
.mv-row p{ font-size:14.5px; color:var(--ink-soft); line-height:1.65; }
/* the Values row carries a list rather than a paragraph */
.mv-row .inline-list{
  grid-template-columns:1fr 1fr;
  column-gap:var(--sp-4); row-gap:var(--sp-3);
}
.mv-row .inline-list .item{ font-size:14px; }
@media (max-width:520px){ .mv-row .inline-list{ grid-template-columns:1fr; } }
@media (max-width:420px){
  .mv-row{ grid-template-columns:1fr; gap:var(--sp-2); }
}

/* --------------------------------------------------------------------------
   11. SERVICES
   -------------------------------------------------------------------------- */
.service-card{
  position:relative;
  display:flex; flex-direction:column; align-items:flex-start;
  gap:var(--sp-3);
  width:100%; text-align:left;
  padding:var(--sp-6) var(--sp-5) var(--sp-7);
  background:var(--surface);
  border:1px solid var(--hairline);
  border-radius:var(--radius);
  cursor:pointer;
  overflow:hidden;
  transition:transform .34s var(--ease-out), box-shadow .34s var(--ease-out),
             border-color var(--dur) var(--ease);
}
/* sweep of tone that rises on hover */
.service-card::before{
  content:""; position:absolute; inset:auto 0 0 0; height:0;
  background:linear-gradient(180deg,rgba(10,10,11,.03),rgba(10,10,11,.055));
  transition:height .38s var(--ease-out);
  z-index:0;
}
.service-card > *{ position:relative; z-index:1; }
.service-card:hover,
.service-card:focus-visible{
  transform:translateY(-4px);
  border-color:var(--hairline-strong);
  box-shadow:var(--shadow-md);
}
.service-card:hover::before,
.service-card:focus-visible::before{ height:100%; }

.service-card .icon{
  width:44px; height:44px; margin-bottom:var(--sp-2);
  display:inline-flex; align-items:center; justify-content:center;
  border-radius:var(--radius-sm);
  background:var(--surface-alt); border:1px solid var(--hairline);
  color:var(--black);
  transition:background var(--dur) var(--ease), color var(--dur) var(--ease),
             transform var(--dur) var(--ease);
}
.service-card:hover .icon{
  background:var(--black); color:#fff;
  border-color:var(--black); transform:scale(1.04);
}
.service-card .icon svg{ width:21px; height:21px; }
.service-card h3{ font-size:1.05rem; font-weight:600; }
.service-card p{ font-size:14px; color:var(--ink-soft); line-height:1.65; }
.service-card .more{
  margin-top:auto; padding-top:var(--sp-4);
  display:inline-flex; align-items:center; gap:6px;
  font-size:13px; font-weight:600; color:var(--black);
  opacity:.55; transition:opacity var(--dur) var(--ease), gap var(--dur) var(--ease);
}
.service-card:hover .more{ opacity:1; gap:10px; }
.service-card .more svg{ width:14px; height:14px; }

/* --------------------------------------------------------------------------
   12. WHY CHOOSE US (dark, image-backed)
   -------------------------------------------------------------------------- */
.why{ position:relative; overflow:hidden; background:var(--black); }
.why .bg-img{
  position:absolute; inset:0; width:100%; height:100%;
  object-fit:cover; z-index:0;
}
.why::after{
  content:""; position:absolute; inset:0; z-index:1;
  background:linear-gradient(180deg,rgba(10,10,11,.9) 0%,rgba(10,10,11,.95) 100%);
}
.why .container{ position:relative; z-index:2; }
.why .label{ color:rgba(255,255,255,.6); }
.why h2{ color:#fff; }
.why .section-head p{ color:rgba(255,255,255,.66); }

.why-card{
  padding:var(--sp-6) var(--sp-5);
  background:rgba(255,255,255,.05);
  border:1px solid var(--hairline-dark);
  border-radius:var(--radius);
  transition:background var(--dur) var(--ease), border-color var(--dur) var(--ease),
             transform var(--dur) var(--ease);
}
.why-card:hover{
  background:rgba(255,255,255,.085);
  border-color:rgba(255,255,255,.26);
  transform:translateY(-3px);
}
.why-card .num{
  font-family:'Poppins','Segoe UI',sans-serif; font-size:12.5px; font-weight:700;
  color:rgba(255,255,255,.5); letter-spacing:.08em; margin-bottom:var(--sp-3);
}
.why-card h3{ font-size:1.02rem; font-weight:600; color:#fff; margin-bottom:var(--sp-2); }
.why-card p{ font-size:14px; color:rgba(255,255,255,.68); line-height:1.65; }

/* expectations strip inside the dark section */
.why-expect{
  margin-top:var(--sp-8); padding-top:var(--sp-7);
  border-top:1px solid var(--hairline-dark);
  display:grid; grid-template-columns:.8fr 1.2fr; gap:var(--sp-7);
}
@media (max-width:860px){ .why-expect{ grid-template-columns:1fr; gap:var(--sp-5); } }
.why-expect h3{ color:#fff; font-size:1.3rem; }
.why-expect .inline-list{ grid-template-columns:1fr 1fr; row-gap:var(--sp-3); }
.why-expect .inline-list .item{ color:rgba(255,255,255,.82); }
.why-expect .inline-list .item svg{ color:var(--cta); }
@media (max-width:480px){ .why-expect .inline-list{ grid-template-columns:1fr; } }

/* --------------------------------------------------------------------------
   13. PROJECTS
   -------------------------------------------------------------------------- */
.work-grid{
  display:grid; grid-template-columns:repeat(4,1fr); gap:var(--sp-4);
}
@media (max-width:960px){ .work-grid{ grid-template-columns:repeat(2,1fr); } }
@media (max-width:480px){ .work-grid{ grid-template-columns:1fr; } }

.work-tile{
  position:relative; display:block; width:100%; padding:0;
  aspect-ratio:4/5;
  border-radius:var(--radius); overflow:hidden;
  background:var(--black); cursor:pointer;
  text-align:left;
  transition:transform var(--dur) var(--ease), box-shadow var(--dur) var(--ease);
}
.work-tile img{
  position:absolute; inset:0; width:100%; height:100%; object-fit:cover;
  transition:transform .6s var(--ease-out);
}
.work-tile::after{
  content:""; position:absolute; inset:0;
  background:linear-gradient(to top,
    rgba(10,10,11,.85) 0%, rgba(10,10,11,.25) 46%, rgba(10,10,11,.02) 70%);
  transition:opacity .35s var(--ease);
}
.work-tile:hover,
.work-tile:focus-visible{ transform:translateY(-4px); box-shadow:var(--shadow-lg); }
.work-tile:hover img,
.work-tile:focus-visible img{ transform:scale(1.06); }

.work-tile .meta{
  position:absolute; inset:auto 0 0 0; z-index:2;
  padding:var(--sp-4); display:flex; flex-direction:column; gap:3px;
}
.work-tile .cat{
  font-size:11px; font-weight:600; letter-spacing:.09em;
  text-transform:uppercase; color:rgba(255,255,255,.62);
}
.work-tile .t{
  font-family:'Poppins','Segoe UI',sans-serif; font-size:14px; font-weight:600;
  color:#fff; letter-spacing:-.01em; line-height:1.3;
}
.work-tile .sum{
  font-size:12.5px; line-height:1.5; color:rgba(255,255,255,.72);
  margin-top:4px;
  max-height:0; opacity:0; overflow:hidden;
  transition:max-height .38s var(--ease-out), opacity .28s var(--ease), margin-top .38s var(--ease-out);
}
.work-tile:hover .sum,
.work-tile:focus-visible .sum{ max-height:80px; opacity:1; }
/* touch devices get the summary permanently — there is no hover to reveal it */
@media (hover:none){
  .work-tile .sum{ max-height:80px; opacity:1; }
}
.work-tile .plus{
  position:absolute; top:var(--sp-4); right:var(--sp-4); z-index:2;
  width:30px; height:30px; border-radius:50%;
  display:flex; align-items:center; justify-content:center;
  background:rgba(255,255,255,.14); border:1px solid rgba(255,255,255,.28);
  color:#fff;
  opacity:0; transform:scale(.85);
  transition:opacity var(--dur) var(--ease), transform var(--dur) var(--ease),
             background var(--dur) var(--ease);
  -webkit-backdrop-filter:blur(4px); backdrop-filter:blur(4px);
}
.work-tile:hover .plus,
.work-tile:focus-visible .plus{ opacity:1; transform:scale(1); }
.work-tile:hover .plus{ background:rgba(255,255,255,.24); }
.work-tile .plus svg{ width:15px; height:15px; }

/* --------------------------------------------------------------------------
   PROJECT GALLERY
   3 across on desktop and tablet, 1 full-width on mobile.
   --gallery-per-view is read back by the JS, so the breakpoints stay here.
   -------------------------------------------------------------------------- */
.gallery{
  --gallery-per-view:3;
  --gallery-gap:var(--sp-4);
  min-width:0;
  margin-top:var(--sp-8);
}
@media (max-width:900px){ .gallery{ --gallery-per-view:2; } }
@media (max-width:620px){ .gallery{ --gallery-per-view:1; --gallery-gap:var(--sp-3); } }

.gallery__viewport{ overflow:hidden; min-width:0; }
.gallery__track{
  display:flex; gap:var(--gallery-gap);
  transition:transform .58s var(--ease-out);
  will-change:transform;
}
.gshot{
  flex:0 0 calc(
    (100% - var(--gallery-gap) * (var(--gallery-per-view) - 1))
    / var(--gallery-per-view)
  );
  min-width:0;
}
.gshot__inner{
  position:relative; isolation:isolate;
  aspect-ratio:4/3; overflow:hidden;
  border-radius:var(--radius);
  background:var(--black);
  transition:transform var(--dur) var(--ease), box-shadow var(--dur) var(--ease);
}
.gshot__inner:hover{ transform:translateY(-3px); box-shadow:var(--shadow-lg); }
.gshot__inner img{
  width:100%; height:100%; object-fit:cover;
  transition:transform .7s var(--ease-out);
}
.gshot__inner:hover img{ transform:scale(1.05); }
.gshot__inner::after{
  content:""; position:absolute; inset:0; z-index:1;
  background:linear-gradient(to top,
    rgba(10,10,11,.82) 0%, rgba(10,10,11,.2) 46%, rgba(10,10,11,0) 70%);
}
.gshot__inner figcaption{
  position:absolute; inset:auto 0 0 0; z-index:2;
  display:flex; flex-direction:column; gap:3px;
  padding:var(--sp-4);
}
.gshot__inner .gcat{
  font-size:11px; font-weight:600; letter-spacing:.1em;
  text-transform:uppercase; color:rgba(255,255,255,.66);
}
.gshot__inner .gt{
  font-family:'Poppins','Segoe UI',sans-serif; font-size:14.5px; font-weight:600;
  color:#fff; letter-spacing:-.01em; line-height:1.3;
}
@media (max-width:620px){
  .gshot__inner{ aspect-ratio:16/10; }
}

.gallery__nav{
  display:flex; align-items:center; justify-content:center; gap:var(--sp-4);
  margin-top:var(--sp-5);
}
.gallery__nav .dots{ display:flex; align-items:center; gap:7px; }
.gallery__nav .dot{ background:var(--hairline-strong); }
.gallery__nav .dot.is-active{ background:var(--black); }
.gallery__nav.is-hidden{ display:none; }

/* --------------------------------------------------------------------------
   14. TESTIMONIALS
   -------------------------------------------------------------------------- */
.testimonials{ background:var(--surface-alt); border-block:1px solid var(--hairline); }

/* aggregate line under the section heading, e.g. "4.8 average from 12 reviews" */
.reviews-summary{
  display:flex; align-items:center; gap:var(--sp-2);
  margin-top:var(--sp-3); font-size:14px; color:var(--ink-soft);
}
.reviews-summary .rstars{ gap:1px; }
.reviews-summary .rstar{ width:15px; height:15px; }

.reviews-empty{
  padding:var(--sp-8) var(--sp-6); text-align:center;
  border:1px dashed var(--hairline-strong); border-radius:var(--radius);
  color:var(--ink-soft); font-size:14.5px;
}

.tst-viewport{ overflow:hidden; }
.tst-track{
  display:flex; gap:var(--sp-5);
  transition:transform .55s var(--ease-out); will-change:transform;
}
.tst-card{
  flex:0 0 calc((100% - var(--sp-5) * 2) / 3);
  display:flex; flex-direction:column; gap:var(--sp-4);
  padding:var(--sp-6) var(--sp-5);
  background:var(--surface);
  border:1px solid var(--hairline);
  border-radius:var(--radius);
}
@media (max-width:900px){
  .tst-card{ flex-basis:calc((100% - var(--sp-5)) / 2); }
}
@media (max-width:620px){
  .tst-card{ flex-basis:100%; }
}

/* star rating — amber reads as a rating, distinct from the blue CTA accent */
.rstars{ display:inline-flex; align-items:center; gap:2px; }
.rstar{ width:15px; height:15px; color:var(--hairline-strong); }
.rstar.is-on{ color:#D08700; }

.tst-card blockquote{
  font-size:14.5px; line-height:1.75; color:var(--ink); flex:1;
}
.tst-card figcaption{
  display:flex; align-items:center; gap:var(--sp-3);
  padding-top:var(--sp-4); border-top:1px solid var(--hairline);
}
.tst-card .avatar{
  width:38px; height:38px; border-radius:50%; flex:none;
  display:flex; align-items:center; justify-content:center;
  background:var(--black); color:#fff;
  font-family:'Poppins','Segoe UI',sans-serif; font-size:13px; font-weight:700;
  letter-spacing:.02em;
}
.tst-card .who{ display:flex; flex-direction:column; gap:1px; min-width:0; }
.tst-card .who .n{ font-size:13.5px; font-weight:600; color:var(--black); }
.tst-card .who .r{ font-size:12px; color:var(--ink-soft); }

.tst-nav{
  display:flex; align-items:center; justify-content:center; gap:var(--sp-4);
  margin-top:var(--sp-7);
}
.tst-nav.is-hidden{ display:none; }
.tst-nav .dot{ background:var(--hairline-strong); }
.tst-nav .dot.is-active{ background:var(--black); }
.tst-nav .dots{ display:flex; gap:7px; align-items:center; }
.rnav{
  width:38px; height:38px; border-radius:50%;
  border:1px solid var(--hairline-strong); color:var(--ink);
  display:inline-flex; align-items:center; justify-content:center;
  transition:border-color var(--dur) var(--ease), color var(--dur) var(--ease),
             background var(--dur) var(--ease);
}
.rnav:hover{ border-color:var(--black); color:var(--black); background:var(--surface); }
.rnav svg{ width:15px; height:15px; }

/* --------------------------------------------------------------------------
   15. ARTICLES / INSIGHTS
   -------------------------------------------------------------------------- */
.article-card{
  display:flex; flex-direction:column;
  width:100%; text-align:left; padding:0;
  background:var(--surface);
  border:1px solid var(--hairline);
  border-radius:var(--radius); overflow:hidden;
  cursor:pointer;
  transition:transform var(--dur) var(--ease), box-shadow var(--dur) var(--ease),
             border-color var(--dur) var(--ease);
}
.article-card:hover,
.article-card:focus-visible{
  transform:translateY(-4px);
  border-color:var(--hairline-strong);
  box-shadow:var(--shadow-md);
}
.article-card .thumb{
  position:relative; aspect-ratio:16/9; overflow:hidden; background:var(--surface-alt);
}
.article-card .thumb img{
  width:100%; height:100%; object-fit:cover;
  transition:transform .6s var(--ease-out);
}
.article-card:hover .thumb img{ transform:scale(1.05); }
.article-card .body{
  display:flex; flex-direction:column; gap:var(--sp-3); flex:1;
  padding:var(--sp-5);
}
.article-card .amet{
  display:flex; align-items:center; gap:var(--sp-2);
  font-size:11.5px; font-weight:600; letter-spacing:.09em;
  text-transform:uppercase; color:var(--accent);
}
.article-card .amet .sep{ opacity:.5; }
.article-card h3{ font-size:1.05rem; font-weight:600; line-height:1.35; }
.article-card p{ font-size:14px; color:var(--ink-soft); line-height:1.65; flex:1; }
.article-card .more{
  display:inline-flex; align-items:center; gap:6px;
  font-size:13px; font-weight:600; color:var(--black);
  transition:gap var(--dur) var(--ease);
}
.article-card:hover .more{ gap:10px; }
.article-card .more svg{ width:14px; height:14px; }

.articles-empty{
  padding:var(--sp-7); text-align:center;
  border:1px dashed var(--hairline-strong); border-radius:var(--radius);
  color:var(--ink-soft); font-size:14px;
}

/* skeleton loading state */
.skeleton{
  border:1px solid var(--hairline); border-radius:var(--radius); overflow:hidden;
}
.skeleton .sk{
  background:linear-gradient(90deg,#F0F0F1 25%,#F7F7F8 37%,#F0F0F1 63%);
  background-size:400% 100%;
  animation:shimmer 1.4s ease infinite;
}
.skeleton .sk-thumb{ aspect-ratio:16/9; }
.skeleton .sk-body{ padding:var(--sp-5); display:flex; flex-direction:column; gap:var(--sp-3); }
.skeleton .sk-line{ height:11px; border-radius:4px; }
.skeleton .sk-line.w40{ width:40%; } .skeleton .sk-line.w90{ width:90%; }
.skeleton .sk-line.w70{ width:70%; } .skeleton .sk-line.w60{ width:60%; }
@keyframes shimmer{ 0%{ background-position:100% 0; } 100%{ background-position:0 0; } }
@media (prefers-reduced-motion:reduce){ .skeleton .sk{ animation:none; } }

/* --------------------------------------------------------------------------
   16. MODALS
   -------------------------------------------------------------------------- */
.modal{
  position:fixed; inset:0; z-index:100;
  display:flex; align-items:center; justify-content:center;
  padding:clamp(var(--sp-5),4vh,var(--sp-8)) clamp(var(--sp-5),4vw,var(--sp-7));
  opacity:0; visibility:hidden;
  transition:opacity var(--dur) var(--ease), visibility 0s linear var(--dur);
}
.modal.is-open{
  opacity:1; visibility:visible;
  transition:opacity var(--dur) var(--ease), visibility 0s;
}
.modal__backdrop{
  position:absolute; inset:0;
  background:rgba(10,10,11,.66);
  -webkit-backdrop-filter:blur(6px) saturate(120%);
  backdrop-filter:blur(6px) saturate(120%);
}
.modal__panel{
  position:relative; z-index:1;
  width:100%; max-width:700px;
  max-height:min(86dvh,880px);
  display:flex; flex-direction:column;
  background:var(--surface);
  border-radius:var(--radius-lg);
  box-shadow:0 32px 80px rgba(10,10,11,.28), 0 2px 8px rgba(10,10,11,.12);
  overflow:hidden;
  transform:translateY(18px) scale(.98);
  transition:transform .42s var(--ease-out), opacity .3s var(--ease);
}

/* #modalBody is where the injected content lands. It has to be a flex column
   itself, or the panel's flex layout stops at this wrapper: the scroll area
   then sizes to its content instead of the panel, nothing scrolls, and the
   footer is pushed past the panel edge and clipped by overflow:hidden. */
#modalBody{
  display:flex; flex-direction:column;
  flex:1 1 auto;
  min-height:0;          /* lets the column actually shrink */
  overflow:hidden;
}
.modal.is-open .modal__panel{ transform:translateY(0) scale(1); }
.modal--wide .modal__panel{ max-width:840px; }

.modal__close{
  position:absolute; top:var(--sp-4); right:var(--sp-4); z-index:3;
  width:38px; height:38px; border-radius:50%;
  display:inline-flex; align-items:center; justify-content:center;
  background:rgba(255,255,255,.92); color:var(--black);
  border:1px solid var(--hairline);
  -webkit-backdrop-filter:blur(6px); backdrop-filter:blur(6px);
  transition:background var(--dur) var(--ease), transform var(--dur) var(--ease);
}
.modal__close:hover{ background:#fff; transform:rotate(90deg); }
.modal__close svg{ width:16px; height:16px; }

.modal__media{
  position:relative; flex:none;
  aspect-ratio:16/8; background:var(--black); overflow:hidden;
}
/* At mobile widths the panel is nearly full-height, so a 2:1 image still
   reads as a modest fraction of it (confirmed ~15-25% of screen). At desktop
   widths the panel is much shorter, so the same ratio was measured eating
   46-53% of the panel — half the modal given to a photo. Shortening the
   ratio as the viewport widens keeps the image editorial rather than
   dominant, and gives text room to breathe without extra scrolling. */
@media (min-width:640px){ .modal__media{ aspect-ratio:20/9; } }
@media (min-width:900px){ .modal__media{ aspect-ratio:2.5/1; } }
.modal__media img{ width:100%; height:100%; object-fit:cover; }
.modal__media::after{
  content:""; position:absolute; inset:0;
  background:linear-gradient(to top,rgba(10,10,11,.55),rgba(10,10,11,0) 60%);
}

.modal__scroll{
  flex:1 1 auto;
  min-height:0;          /* the other half of the fix above */
  overflow-y:auto; -webkit-overflow-scrolling:touch;
  overscroll-behavior:contain;
  padding:var(--sp-7) var(--sp-7) var(--sp-6);
  /* fades the content as it runs under the footer, so it reads as scrollable */
  scrollbar-width:thin;
  scrollbar-color:var(--hairline-strong) transparent;
}
.modal__scroll::-webkit-scrollbar{ width:10px; }
.modal__scroll::-webkit-scrollbar-track{ background:transparent; }
.modal__scroll::-webkit-scrollbar-thumb{
  background:var(--hairline-strong); border-radius:100px;
  border:3px solid var(--surface);
}
.modal__scroll::-webkit-scrollbar-thumb:hover{ background:var(--ink-soft); }
.modal__foot{
  position:relative;
  flex:0 0 auto; padding:var(--sp-5) var(--sp-7);
  padding-bottom:max(var(--sp-5),env(safe-area-inset-bottom));
  border-top:1px solid var(--hairline);
  background:var(--surface);
  display:flex; gap:var(--sp-3); flex-wrap:wrap;
}
/* A soft shadow sits above the footer while content remains below the fold,
   and fades out as the reader nears the end — toggled by initModalScrollHint()
   in main.js. Reads as "there's more" without a hard visual seam. */
.modal__foot::before{
  content:""; position:absolute; left:0; right:0; bottom:100%;
  height:28px; pointer-events:none;
  background:linear-gradient(to top, rgba(10,10,11,.07), rgba(10,10,11,0));
  opacity:0; transition:opacity .25s var(--ease);
}
.modal__foot.has-more::before{ opacity:1; }
.modal__foot .btn{ flex:1 1 auto; min-width:180px; }

@media (max-width:600px){
  .modal{ padding:0; align-items:flex-end; }
  .modal__panel{
    max-width:none; max-height:92dvh;
    border-radius:var(--radius-lg) var(--radius-lg) 0 0;
    transform:translateY(40px);
  }
  .modal__scroll{ padding:var(--sp-6) var(--sp-5) var(--sp-5); }
  .modal__foot{ padding-inline:var(--sp-5); }
  .modal__foot .btn{ min-width:0; width:100%; }
}

/* modal typography */
.modal .eyebrow{
  font-size:11.5px; font-weight:600; letter-spacing:.13em;
  text-transform:uppercase; color:var(--accent); margin-bottom:var(--sp-3);
}
.modal h2{
  font-size:clamp(1.35rem,2.6vw,1.85rem); line-height:1.2;
  letter-spacing:-.02em;
}
.modal .lede{
  margin-top:var(--sp-4); font-size:15px;
  color:var(--ink-soft); line-height:1.75;
}
@media (min-width:900px){
  .modal .lede{ font-size:15.5px; line-height:1.8; }
  .modal__scroll{ padding:var(--sp-8) var(--sp-8) var(--sp-6); }
  .modal .block{ margin-top:var(--sp-7); }
}
.modal .block{ margin-top:var(--sp-6); }
.modal .block h3{
  font-size:12px; font-weight:600; letter-spacing:.12em;
  text-transform:uppercase; color:var(--black); margin-bottom:var(--sp-4);
  padding-bottom:var(--sp-3); border-bottom:1px solid var(--hairline);
}
.modal .ticks{ display:flex; flex-direction:column; gap:var(--sp-3); }
.modal .ticks li{
  display:flex; align-items:flex-start; gap:var(--sp-3);
  font-size:14.5px; color:var(--ink); line-height:1.6;
}
.modal .ticks li svg{
  width:15px; height:15px; flex:none; margin-top:4px; color:var(--cta-deep);
}
.modal .tags{ display:flex; flex-wrap:wrap; gap:var(--sp-2); }
.modal .tag{
  font-size:12.5px; font-weight:500;
  padding:7px var(--sp-3);
  background:var(--surface-alt); border:1px solid var(--hairline);
  border-radius:100px; color:var(--ink-soft);
}
.modal .tag--link{ cursor:pointer; transition:all var(--dur) var(--ease); }
.modal .tag--link:hover{ background:var(--black); color:#fff; border-color:var(--black); }
.modal .audience{ font-size:14.5px; color:var(--ink-soft); line-height:1.75; }

/* long-form article body inside modal */
.prose{ margin-top:var(--sp-5); }
.prose > * + *{ margin-top:var(--sp-4); }
.prose h2{
  font-size:1.2rem; margin-top:var(--sp-7);
  padding-top:var(--sp-5); border-top:1px solid var(--hairline);
}
.prose h3{ font-size:1.02rem; margin-top:var(--sp-6); font-weight:600; }
.prose p{ font-size:15px; line-height:1.8; color:var(--ink); }
.prose ul{ display:flex; flex-direction:column; gap:var(--sp-3); }
.prose ul li{
  position:relative; padding-left:var(--sp-5);
  font-size:15px; line-height:1.75; color:var(--ink);
}
.prose ul li::before{
  content:""; position:absolute; left:2px; top:11px;
  width:5px; height:5px; border-radius:50%; background:var(--accent);
}
.prose blockquote{
  padding:var(--sp-4) var(--sp-5);
  border-left:2px solid var(--black);
  background:var(--surface-alt);
  border-radius:0 var(--radius-sm) var(--radius-sm) 0;
  font-size:15px; line-height:1.75; color:var(--ink);
}
.prose strong{ font-weight:600; color:var(--black); }
.prose a{ color:var(--black); text-decoration:underline; text-underline-offset:3px; }
.prose img{
  width:100%; height:auto; display:block;
  border-radius:var(--radius); border:1px solid var(--hairline);
  background:var(--surface-alt);
}
/* an image is its own visual break in the text, so it earns a little more
   breathing room than the standard paragraph gap */
.prose p:has(> img:only-child){ margin-top:var(--sp-6); }
.prose p:has(> img:only-child) + *{ margin-top:var(--sp-6); }

/* --------------------------------------------------------------------------
   17. FINAL CTA
   -------------------------------------------------------------------------- */
.cta{
  position:relative; overflow:hidden; text-align:center;
  background:var(--black);
}
.cta .bg-img{
  position:absolute; inset:0; width:100%; height:100%;
  object-fit:cover; z-index:0;
}
.cta::after{
  content:""; position:absolute; inset:0; z-index:1;
  background:linear-gradient(180deg,rgba(10,10,11,.84) 0%,rgba(10,10,11,.94) 100%);
}
.cta .container{ position:relative; z-index:2; }
.cta h2{
  font-size:clamp(1.9rem,3.8vw,2.8rem); line-height:1.14;
  letter-spacing:-.03em; text-wrap:balance;
  max-width:660px; margin-inline:auto; color:#fff;
}
.cta p{
  margin:var(--sp-4) auto var(--sp-7); max-width:500px;
  font-size:1rem; color:rgba(255,255,255,.76); line-height:1.7;
}
.cta .cta-row{
  display:flex; gap:var(--sp-3); justify-content:center; flex-wrap:wrap;
}
.cta .cta-note{
  margin-top:var(--sp-6); font-size:13px; color:rgba(255,255,255,.5);
}
.cta .cta-note a{ color:rgba(255,255,255,.78); text-decoration:underline; text-underline-offset:3px; }
.cta .cta-note a:hover{ color:#fff; }

/* --------------------------------------------------------------------------
   18. FOOTER
   -------------------------------------------------------------------------- */
footer{ border-top:1px solid var(--hairline); padding:var(--sp-8) 0 var(--sp-6); }
.footer-top{
  display:grid; grid-template-columns:1.5fr 1fr 1.2fr;
  gap:var(--sp-7); padding-bottom:var(--sp-7);
}
@media (max-width:760px){ .footer-top{ grid-template-columns:1fr 1fr; gap:var(--sp-6); } }
@media (max-width:520px){ .footer-top{ grid-template-columns:1fr; } }
.footer-brand p{
  margin-top:var(--sp-4); font-size:14px; line-height:1.65;
  max-width:280px; color:var(--ink-soft);
}
.footer-brand .social-row{ margin-top:var(--sp-5); }
.footer-col h4{
  font-family:'Poppins','Segoe UI',sans-serif; font-size:11.5px; font-weight:600;
  text-transform:uppercase; letter-spacing:.12em;
  color:var(--ink-soft); margin-bottom:var(--sp-4);
}
.footer-col li{ margin-bottom:var(--sp-3); }
.footer-col a,.footer-col span{ font-size:14px; color:var(--ink); line-height:1.5; }
.footer-col a{ transition:color var(--dur) var(--ease); }
.footer-col a:hover{ color:var(--black); text-decoration:underline; text-underline-offset:3px; }
.footer-col .muted{ color:var(--ink-soft); }
.footer-bottom{
  display:flex; justify-content:space-between; flex-wrap:wrap; gap:var(--sp-3);
  padding-top:var(--sp-5); border-top:1px solid var(--hairline);
  font-size:13px; color:var(--ink-soft);
}

/* --------------------------------------------------------------------------
   19. FLOATING WHATSAPP BUTTON
   -------------------------------------------------------------------------- */
.wa-fab{
  position:fixed; z-index:55;
  right:clamp(16px,4vw,24px);
  bottom:max(clamp(16px,4vw,24px),env(safe-area-inset-bottom));
  width:54px; height:54px; border-radius:50%;
  display:inline-flex; align-items:center; justify-content:center;
  background:var(--cta); color:#fff;
  box-shadow:0 6px 20px rgba(var(--cta-shadow),.36), var(--shadow-md);
  opacity:0; transform:translateY(12px) scale(.9); pointer-events:none;
  transition:opacity var(--dur) var(--ease), transform var(--dur) var(--ease),
             box-shadow var(--dur) var(--ease);
}
.wa-fab.is-visible{ opacity:1; transform:none; pointer-events:auto; }
.wa-fab:hover{ transform:scale(1.06); background:var(--cta-deep);
  box-shadow:0 10px 28px rgba(var(--cta-shadow),.5); }
.wa-fab svg{ width:26px; height:26px; }
body.menu-open .wa-fab,
body.modal-open .wa-fab{ opacity:0; pointer-events:none; }

/* --------------------------------------------------------------------------
   19b. IMAGE SETTLE
   Lazy images pop in abruptly once decoded. A short fade makes loading feel
   deliberate rather than glitchy, which matters most on slower connections.
   -------------------------------------------------------------------------- */
.js .work-tile img,
.js .gshot__inner img,
.js .article-card .thumb img,
.js .carousel .slide img{
  opacity:0;
  transition:opacity .5s var(--ease), transform .7s var(--ease-out);
}
.js .work-tile img.is-loaded,
.js .gshot__inner img.is-loaded,
.js .article-card .thumb img.is-loaded,
.js .carousel .slide img.is-loaded{ opacity:1; }

@media (prefers-reduced-motion:reduce){
  .js .work-tile img,.js .gshot__inner img,
  .js .article-card .thumb img,.js .carousel .slide img{ opacity:1; }
}

/* --------------------------------------------------------------------------
   20. SCROLL REVEAL
   Only applied when JS is running, so the page is fully visible without it.
   -------------------------------------------------------------------------- */
.js .reveal{
  opacity:0; transform:translateY(22px);
  transition:opacity .7s var(--ease-out), transform .7s var(--ease-out);
  transition-delay:var(--d,0ms);
}
.js .reveal.is-in{ opacity:1; transform:none; }

@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{
    animation-duration:.01ms !important;
    animation-iteration-count:1 !important;
    transition-duration:.01ms !important;
    scroll-behavior:auto !important;
  }
  .js .reveal{ opacity:1; transform:none; }
  .carousel .track,.tst-track{ transition:none; }
}

/* --------------------------------------------------------------------------
   21. PRINT
   -------------------------------------------------------------------------- */
@media print{
  .nav,.mobile-menu,.menu-backdrop,.wa-fab,.modal,.carousel .cnav,.carousel .dots{ display:none !important; }
  body{ color:#000; }
  .js .reveal{ opacity:1; transform:none; }
}
