/* ============================================================
   CURBCUT — SHARED DESIGN SYSTEM  (the "locked" kit of parts)
   Reused verbatim on every page so the site reads as ONE site.
   The only thing a page changes is --accent (its category colour)
   and its own page-specific section CSS. See Curbcut-Pages-Roadmap.xlsx.
   ============================================================ */

/* ------------------------------ FONTS ------------------------------ */
@font-face{
  font-family:"Apparat";
  src:url("../fonts/KMR-Apparat-Regular.woff2") format("woff2"),
      url("../fonts/KMR-Apparat-Regular.woff") format("woff");
  font-weight:400; font-style:normal; font-display:swap;
}
@font-face{
  font-family:"Acid Grotesk";
  src:url("../fonts/FFF-AcidGrotesk-Book.woff2") format("woff2"),
      url("../fonts/FFF-AcidGrotesk-Book.woff") format("woff");
  font-weight:400; font-style:normal; font-display:swap;
}
@font-face{
  font-family:"Acid Grotesk";
  src:url("../fonts/FFF-AcidGrotesk-Bold.woff2") format("woff2"),
      url("../fonts/FFF-AcidGrotesk-Bold.woff") format("woff");
  font-weight:700; font-style:normal; font-display:swap;
}

/* ------------------------------ TOKENS ------------------------------ */
:root{
  /* neutrals (brandbook) */
  --black:#000000; --grey:#F0F0F0; --white:#FFFFFF; --ink-2:#484848; --ink-3:#767676;
  /* category spectrum (brandbook exact hexes) */
  --explorer:#A3B0D1; --transport:#C9C3FA; --ecology:#73AD80; --climate:#F5D574;
  --housing:#E08565; --urban:#ADB033; --health:#CD718C; --demo:#9E9090;
  /* PER-PAGE ACCENT — override on <body> to reskin a page. Default = explorer. */
  --accent:var(--explorer);
  --maxw:1320px;
  --gut:clamp(20px,5vw,72px);
  --ramp:clamp(48px,9vw,128px);   /* curb-cut slope radius */
}

*{box-sizing:border-box;margin:0;padding:0}
/* With explicit width/height attrs on every <img> (set for CLS), a CSS width
   alone would otherwise let the height attribute act as a fixed height and
   distort the image. height:auto keeps the natural aspect ratio. Components
   that crop deliberately (.media img, .member .photo img, .vframe img …) set
   their own height and win on specificity. */
img{height:auto}
html{scroll-behavior:smooth;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}
body{
  font-family:"Acid Grotesk",system-ui,sans-serif;
  background:var(--grey); color:var(--black);
  font-size:clamp(16px,1.05vw,18px); line-height:1.5; overflow-x:hidden;
}
::selection{background:var(--black);color:var(--climate)}
h1,h2,h3,.display{
  font-family:"Apparat","Acid Grotesk",sans-serif;
  text-transform:uppercase; font-weight:400; line-height:.92; letter-spacing:-.01em;
}
a{color:inherit;text-decoration:none}
.wrap{max-width:var(--maxw);margin-inline:auto;padding-inline:var(--gut)}
section{padding-block:clamp(72px,10vw,150px)}

/* ------------------------------ NAV ------------------------------ */
/* The nav (header + mobile menu) is a shared component: its markup, CSS,
   and behaviour all live in assets/nav.js — the single source of truth.
   Only the shared atoms it reuses live here: .brand (also the footer),
   .lang, and .btn (also hero CTAs). */
.brand{font-family:"Apparat";font-size:26px;letter-spacing:-.02em;display:flex;align-items:center;gap:10px}
.brand .wordmark{height:26px;width:auto;display:block}
.lang{font-size:14px;letter-spacing:.02em;display:flex;gap:6px;align-items:center}
.lang a{padding:4px 5px;text-decoration:none;border-radius:3px}
.lang a[aria-current="true"]{font-weight:700}
.lang a:not([aria-current="true"]){color:var(--ink-3)}
.lang a:not([aria-current="true"]):hover{color:var(--black)}
.lang span{opacity:.45}

/* buttons (curb-cut form + category-accent wipe on hover) */
.btn{
  font-family:"Apparat";text-transform:uppercase;font-size:14px;letter-spacing:.01em;
  background:var(--black);color:var(--white);
  padding:13px 22px;border-radius:0 16px 0 16px;
  border:none;cursor:pointer;display:inline-flex;align-items:center;gap:10px;
  transition:border-radius .3s ease,transform .2s ease,background .2s ease;
  white-space:nowrap;position:relative;overflow:hidden;z-index:0;
}
.btn:hover{border-radius:16px 0 16px 0;transform:translateY(-2px);color:var(--black)}
.btn .dot{width:8px;height:8px;background:var(--climate)}
.btn:hover .dot{background:var(--black)}
.btn.invert{background:var(--white);color:var(--black)}
.btn.invert .dot{background:var(--accent)}
.btn::before{content:"";position:absolute;inset:0;z-index:-1;background:var(--accent);transform:translateY(101%);transition:transform .32s cubic-bezier(.2,.7,.2,1)}
.btn:hover::before{transform:translateY(0)}

/* ------------------------------ HERO (shared component — single source of truth) ------------------------------
   Every page's <section class="phero"> uses THIS definition. A page changes only
   --accent (on <body>), may override .phero h1 font-size, and opts the pixel map
   in/out via <div class="pixels" data-field="canada">. CRITICAL: bottom padding is
   tied to --ramp so the next section's rising slope can NEVER crop the hero CTAs. */
.phero{position:relative;background:var(--accent);color:var(--black);
  min-height:clamp(560px,82svh,860px);display:flex;flex-direction:column;justify-content:flex-end;overflow:hidden;
  padding:clamp(120px,15vh,180px) var(--gut) calc(var(--ramp) + clamp(40px,4vw,60px))}
.phero .wrap{position:relative;z-index:1}
.phero .kicker{font-family:"Apparat";text-transform:uppercase;font-size:14px;letter-spacing:.18em;display:flex;align-items:center;gap:14px;margin-bottom:clamp(20px,4vw,40px)}
.phero .kicker .ln{height:1px;width:54px;background:var(--black);opacity:.5}
.phero h1{font-size:clamp(46px,8.6vw,142px);max-width:15ch;-webkit-text-stroke:6px var(--accent);paint-order:stroke fill}
.phero .lede{font-size:clamp(17px,1.5vw,23px);max-width:60ch;margin-top:clamp(26px,4vw,42px);line-height:1.45;color:rgba(0,0,0,.74)}
.phero .cta-row{display:flex;gap:16px;align-items:center;margin-top:clamp(28px,4vw,44px);flex-wrap:wrap}
.scrollcue{font-family:"Apparat";text-transform:uppercase;font-size:12px;letter-spacing:.16em;color:var(--black);display:inline-flex;align-items:center;gap:8px}
.scrollcue .ar{transition:transform .25s}
.scrollcue:hover .ar{transform:translateY(4px)}
/* shared Canada/pixel field — same position + scale on every page (opt in per page) */
.phero .pixels{position:absolute;top:calc(clamp(120px,15vh,180px) + 86px);right:calc(var(--gut) * 2);display:grid;gap:2px;z-index:0;
  grid-template-columns:repeat(var(--cols,54),var(--ps));--ps:clamp(2px,0.265vw,4px);pointer-events:none;opacity:.9}
.phero .pixels i{width:var(--ps);height:var(--ps);background:var(--black);opacity:.12;will-change:transform,opacity}
@media(max-width:760px){.phero .pixels{display:none}}

/* ------------------------------ SLOPE / SECTION RAMPS ------------------------------ */
.ramp{position:relative;z-index:2}
.ramp--white{background:var(--white)}
.ramp--grey{background:var(--grey)}
.ramp--black{background:var(--black);color:var(--white)}
.slope-l{border-top-left-radius:var(--ramp);margin-top:calc(var(--ramp) * -1)}
.slope-r{border-top-right-radius:var(--ramp);margin-top:calc(var(--ramp) * -1)}

.seclabel{
  font-family:"Apparat";text-transform:uppercase;letter-spacing:.16em;font-size:13px;
  font-weight:400;margin-top:0;
  display:inline-flex;align-items:center;gap:12px;margin-bottom:clamp(28px,4vw,52px);
}
.seclabel .sq{width:11px;height:11px;background:var(--accent)}
.ramp--black .seclabel .sq{background:var(--climate)}

.linkmore{display:inline-flex;align-items:center;gap:10px;font-family:"Apparat";text-transform:uppercase;font-size:13px;letter-spacing:.08em;margin-top:30px;border-bottom:2px solid transparent;transition:border-color .25s,gap .25s}
.linkmore:hover{border-color:currentColor;gap:16px}

/* ------------------------------ REVEAL ON SCROLL ------------------------------ */
.rev{opacity:0;transform:translateY(28px);transition:opacity .7s ease,transform .7s cubic-bezier(.2,.7,.2,1)}
.rev.in{opacity:1;transform:none}
.rev.d1{transition-delay:.08s}.rev.d2{transition-delay:.16s}.rev.d3{transition-delay:.24s}.rev.d4{transition-delay:.32s}

/* ------------------------------ VIDEO / MEDIA FRAME ------------------------------ */
.vframe{position:relative;border-radius:0 20px 0 20px;overflow:hidden;background:#0c0c0c;display:block;box-shadow:0 0 48px rgba(0,0,0,.17)}
.vframe video,.vframe img{width:100%;height:100%;object-fit:cover;display:block;background:#0c0c0c}
.ramp--black .vframe{box-shadow:0 0 64px 4px rgba(255,255,255,.26)}
.vframe .vtag{position:absolute;right:14px;bottom:13px;font-family:"Apparat";text-transform:uppercase;
  font-size:11px;letter-spacing:.12em;color:#fff;background:rgba(0,0,0,.5);padding:7px 11px;backdrop-filter:blur(5px)}

/* ------------------------------ FOOTER ------------------------------ */
footer{background:var(--black);color:var(--white)}
.foot{display:grid;grid-template-columns:1.4fr 1fr 1fr 1fr;gap:40px;padding-block:clamp(56px,7vw,96px)}
@media(max-width:780px){.foot{grid-template-columns:1fr 1fr}}
@media(max-width:480px){.foot{grid-template-columns:1fr}}
.foot .brand{font-size:34px;color:var(--white)}
.foot .wordmark{height:30px;width:auto;display:block}
.foot h4{font-family:"Apparat";text-transform:uppercase;font-size:12px;letter-spacing:.14em;color:#8a8a8a;margin-bottom:18px}
.foot a{display:block;padding:6px 0;color:#dcdcdc;font-size:15px;transition:color .2s,padding-left .2s}
.foot a:hover{color:var(--white);padding-left:6px}
.foot .spectrum{display:flex;height:8px;margin-top:26px;max-width:240px}
.foot .spectrum i{flex:1}
.footbar{border-top:1px solid #1f1f1f;padding-block:22px;display:flex;justify-content:space-between;gap:16px;flex-wrap:wrap;font-size:13px;color:#8a8a8a}
.note{background:#111;color:#9a9a9a;font-size:12.5px;line-height:1.6;padding:14px var(--gut);text-align:center;border-top:1px solid #1f1f1f}
.note b{color:#cfcfcf;font-weight:400;font-family:"Apparat";text-transform:uppercase;letter-spacing:.04em}

/* ------------------------------ TOP SCROLL-PROGRESS BAR ------------------------------ */
.progress{position:fixed;top:0;left:0;right:0;height:4px;z-index:300;transform:scaleX(var(--p,0));transform-origin:0 50%;will-change:transform;
  background:linear-gradient(90deg,var(--explorer),var(--transport),var(--ecology),var(--climate),var(--urban),var(--health),var(--housing))}

/* ------------------------------ ACCESSIBILITY ------------------------------ */
.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}
.skip{position:absolute;left:-9999px;top:0;z-index:400;background:var(--black);color:#fff;padding:12px 18px;
  font-family:"Apparat";text-transform:uppercase;font-size:14px;letter-spacing:.04em}
.skip:focus{left:12px;top:12px}
:focus-visible{outline:3px solid var(--black);outline-offset:3px;border-radius:2px}
.ramp--black :focus-visible,footer :focus-visible{outline-color:#fff}

@media(prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  header.nav{transition:none}
  .rev{opacity:1;transform:none;transition:none}
  .progress{display:none}
  .btn::before{transition:none}
}

/* ============================================================
   SMOOTH CROSS-DOCUMENT PAGE TRANSITIONS  (progressive enhancement)
   Same-origin navigations cross-fade instead of hard-cutting. The fixed
   nav and the (identically-positioned) hero pixel-map persist as continuous
   elements, so they don't flicker. No-op where the View Transitions API
   is unsupported; fully disabled under prefers-reduced-motion.
   ============================================================ */
@view-transition{ navigation:auto; }
header.nav{ view-transition-name:site-nav; }
.phero .pixels{ view-transition-name:hero-map; }
::view-transition-group(root){ animation-duration:.42s; animation-timing-function:cubic-bezier(.2,.7,.2,1); }
::view-transition-old(root),::view-transition-new(root){ animation-duration:.42s; animation-timing-function:cubic-bezier(.2,.7,.2,1); }
@media (prefers-reduced-motion:reduce){
  ::view-transition-group(*),::view-transition-old(*),::view-transition-new(*){ animation:none !important; }
}

/* ===== shared logo marquee (Our customers / Partners) — used on home + our-work ===== */
.cust{overflow:hidden}
.cust .marquee{display:flex;gap:0;white-space:nowrap;will-change:transform;animation:scroll 34s linear infinite;align-items:center}
.cust:hover .marquee{animation-play-state:paused}
.lchip{flex:none;width:300px;height:104px;display:inline-flex;align-items:center;justify-content:center;background:#fff;
  border-radius:0 18px 0 18px;padding:0 20px;margin:0 14px}
.lchip img{max-height:60px;max-width:230px;width:auto;height:auto;display:block;object-fit:contain}
.lchip .nm{font-family:"Apparat";text-transform:uppercase;font-size:19px;letter-spacing:.02em;color:#3a3a3a;white-space:nowrap}
@keyframes scroll{to{transform:translateX(-50%)}}
@media(max-width:600px){.lchip{width:212px;height:82px;padding:0 16px;margin:0 9px} .lchip img{max-height:44px;max-width:160px}}
@media(prefers-reduced-motion:reduce){.cust .marquee{animation:none}}
