/* ==========================================================================
   Phase — shared stylesheet
   One typeface (Hanken Grotesk), white/black, one accent used only on the
   primary button. Layered surfaces (soft two-tier shadows) on buttons, FAQ
   rows and work cards, modeled on the sharpness investigation's Clarasight
   reference values. Motion is quick (300–700ms), eased, driven by GSAP, and
   fully disabled under prefers-reduced-motion.
   ========================================================================== */

:root{
  --bg:#ffffff;
  --text:#0a0a0a;
  --dim:#5a5a5a;
  --faint:#8a8a8a;
  --line:#e6e6e4;
  --line-strong:#0a0a0a;
  --neutral:#f3f2f0;
  --accent:#5b3df0;
  --accent-text:#ffffff;
  --sans:'Hanken Grotesk',system-ui,-apple-system,'Segoe UI',sans-serif;
  --container:1120px;
  --radius:6px;
  --radius-lg:16px;
  --radius-pill:999px;

  /* two-layer "elevated surface" shadow: a tight, close layer plus a
     softer, wider one — adapted from Clarasight's button/FAQ-card shadow
     (investigation/data.json: primaryBtn & faqItem both use
     "rgba(0,0,0,.04) 0 0 0 1px, rgba(0,0,0,.04) 0 2px 2px") to Phase's
     black-on-white palette and slightly larger surfaces. */
  --shadow-1:0 1px 2px rgba(10,10,10,.08);
  --shadow-2:0 8px 24px rgba(10,10,10,.08);
  --shadow-elevated:var(--shadow-1),var(--shadow-2);
  --shadow-1-hover:0 2px 4px rgba(10,10,10,.10);
  --shadow-2-hover:0 14px 32px rgba(10,10,10,.13);
  --shadow-elevated-hover:var(--shadow-1-hover),var(--shadow-2-hover);

  /* top-of-page nav color — the site's one accent, reused rather than a
     second brand color. See the nav rules below for the full rectangle
     → pill transition this drives. */
  --nav-top:var(--accent);
}

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

html{-webkit-text-size-adjust:100%}

body{
  background:var(--bg);
  color:var(--text);
  font-family:var(--sans);
  font-size:17px;
  line-height:1.6;
  -webkit-font-smoothing:antialiased;
  text-rendering:optimizeLegibility;
}

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

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

ul,ol{list-style:none}

button{font:inherit;color:inherit;background:none;border:0;cursor:pointer}

input{font:inherit;color:inherit}

.container{
  max-width:var(--container);
  margin:0 auto;
  padding:0 24px;
}

.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;
}

/* focus ring — always visible, keyboard only */
:focus{outline:none}
:focus-visible{
  outline:2px solid var(--accent);
  outline-offset:3px;
  border-radius:3px;
}

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

/* ---------- type ----------
   Per-role letter-spacing/line-height instead of one shared scale — tuned
   for Hanken Grotesk using Clarasight's per-element values (investigation/
   data.json) as a reference point: roughly flat/normal tracking and roomy
   line-height on body copy, a bit tighter on display-size headings, tight
   and near-single-line on short UI text (buttons, nav). Font sizes and
   weights are unchanged from before this pass. */
h1,h2,h3,h4{font-weight:600}
h1{
  font-size:clamp(2.4rem,5.4vw,4rem);
  letter-spacing:-0.02em;
  line-height:1.08;
}
h2{
  font-size:clamp(1.8rem,3.4vw,2.5rem);
  letter-spacing:-0.015em;
  line-height:1.2;
}
h3{
  font-size:1.25rem;
  letter-spacing:-0.005em;
  line-height:1.3;
}
h4{
  font-size:1.05rem;
  letter-spacing:0;
  line-height:1.3;
}

p{color:var(--dim)}
p.lead{font-size:1.15rem;color:var(--text)}

.eyebrow-free{ /* marker only: no eyebrow labels used site-wide */ }

/* ---------- buttons ---------- */
.btn{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  gap:8px;
  padding:14px 26px;
  border-radius:var(--radius);
  font-weight:600;
  font-size:0.98rem;
  line-height:1.2;
  letter-spacing:0;
  transition:background-color .15s,border-color .15s,color .15s,box-shadow .2s ease,transform .25s cubic-bezier(.2,.7,.3,1);
  border:1px solid transparent;
}
.btn:hover{transform:translateY(-1px)}
.btn:active{transform:translateY(0)}
/* .btn.btn-primary (not .btn-primary alone) so this beats .nav-links a's
   color rule — both are one-class selectors of equal specificity otherwise,
   and source order alone isn't reliable to depend on. Text stays white in
   every state, including inside the nav and after being visited.
   Fully-rounded pill + two-layer shadow, modeled on Clarasight's primary
   button (investigation/data.json → primaryBtn: border-radius 9999px,
   box-shadow "rgba(0,0,0,.04) 0 0 0 1px, rgba(0,0,0,.04) 0 2px 2px").
   No backdrop-filter: Clarasight's blur(16px) sits over a busy hero
   gradient/dot pattern for it to blur — Phase's buttons sit on flat
   section backgrounds, so a blur there would have nothing to affect. */
.btn.btn-primary,
.btn.btn-primary:hover,
.btn.btn-primary:focus,
.btn.btn-primary:focus-visible,
.btn.btn-primary:active,
.btn.btn-primary:visited{
  background:var(--accent);
  color:var(--accent-text);
}
.btn.btn-primary{
  border-radius:var(--radius-pill);
  box-shadow:var(--shadow-elevated);
}
.btn.btn-primary:hover{background:#4a30d6;box-shadow:var(--shadow-elevated-hover)}
.btn.btn-primary:active{box-shadow:var(--shadow-1)}
.btn.btn-secondary{
  background:transparent;
  color:var(--text);
  border-color:var(--line-strong);
}
.btn.btn-secondary:hover{background:var(--neutral)}

/* ---------- header ----------
   Two states, toggled by a plain scroll-position class (see js/site.js —
   .is-scrolled on .site-header, no GSAP needed since a CSS transition
   already respects the sitewide prefers-reduced-motion rule at the top of
   this file). At the top of the page the nav is a solid full-width
   rectangle in --nav-top (no gradient/fade — removed, it wasn't working);
   past the scroll threshold it becomes an inset floating pill with a white
   surface and a thin border, matching the shape/shadow language already
   used for buttons/FAQ/cards. Reference: Clarasight's own nav
   (investigation/data.json + a live check of clarasight.com) — pill
   radius, hairline border, ~200ms surface transition, a small gap above
   the pill, smooth reverse on scroll-up. */
.site-header{
  position:sticky;
  top:0;
  z-index:80;
  padding-top:0;
  transition:padding-top .35s cubic-bezier(.22,1,.36,1);
}
/* the pill's gap from the top of the viewport — padding on the sticky
   header itself, not margin on .nav-bar: a margin here would collapse
   with the header's own top (no border/padding of its own separating
   them) and the pill would end up flush against the viewport edge
   anyway, which is exactly the bug this replaces. */
.site-header.is-scrolled{padding-top:16px}

.nav-bar{
  background:var(--nav-top);
  border:1px solid transparent;
  border-radius:0;
  box-shadow:none;
  max-width:none;
  margin:0 auto;
  transition:background-color .25s ease,border-color .25s ease,
    border-radius .35s cubic-bezier(.22,1,.36,1),box-shadow .25s ease,
    max-width .35s cubic-bezier(.22,1,.36,1);
}
.site-header.is-scrolled .nav-bar{
  background:#ffffff;
  border-color:var(--line);
  border-radius:var(--radius-pill);
  box-shadow:var(--shadow-elevated);
  max-width:1100px;
}
.nav-bar .container{transition:padding .35s cubic-bezier(.22,1,.36,1)}
.site-header.is-scrolled .nav-bar .container{padding-left:32px;padding-right:32px}

.nav{
  display:flex;
  align-items:center;
  justify-content:space-between;
  height:72px;
}
.wordmark{
  font-weight:700;
  font-size:1.15rem;
  letter-spacing:-0.02em;
  color:#ffffff;
  transition:color .25s ease;
}
.site-header.is-scrolled .wordmark{color:var(--text)}

.nav-right{
  display:flex;
  align-items:center;
  gap:22px;
}
.nav-links{
  display:flex;
  align-items:center;
  gap:36px;
}
.nav-links a{
  font-size:0.98rem;
  line-height:1.4;
  letter-spacing:0;
  color:#ffffff;
  padding:6px 2px;
  border-bottom:1px solid transparent;
  transition:color .25s ease,border-color .15s;
}
.site-header.is-scrolled .nav-links a{color:var(--text)}
/* :not(.btn) so the "Book a call" button (also inside .nav-links) doesn't
   pick up this underline — a border-bottom on a button with its own
   already-transparent 1px border reads as a full outline appearing on
   hover, not a text underline. */
.nav-links a:not(.btn):hover{border-color:#ffffff}
.site-header.is-scrolled .nav-links a:not(.btn):hover{border-color:var(--text)}
.nav-links .btn{padding:10px 20px;font-size:0.94rem}

/* The nav "Book a call" button inverts against the nav's own background —
   white/violet-text on the solid violet rectangle, violet/white-text on
   the white pill — transitioning on the same .25s ease schedule as the
   nav surface itself. Scoped tightly to .nav-links .btn.btn-primary: the
   hero's "Book a free 15-minute call" button and every other primary
   button on the site keep their normal violet-bg/white-text styling.
   High specificity (5 classes) is deliberate — .site-header.is-scrolled
   .nav-links a{color:var(--text)} above would otherwise win and leave the
   button's text black in the pill state. */
.nav-links .btn.btn-primary,
.nav-links .btn.btn-primary:hover,
.nav-links .btn.btn-primary:focus,
.nav-links .btn.btn-primary:focus-visible,
.nav-links .btn.btn-primary:active,
.nav-links .btn.btn-primary:visited{
  background:#ffffff;
  color:var(--accent);
  transition:background-color .25s ease,color .25s ease,box-shadow .2s ease,transform .25s cubic-bezier(.2,.7,.3,1);
}
.nav-links .btn.btn-primary:hover{background:#f2effe}

.site-header.is-scrolled .nav-links .btn.btn-primary,
.site-header.is-scrolled .nav-links .btn.btn-primary:hover,
.site-header.is-scrolled .nav-links .btn.btn-primary:focus,
.site-header.is-scrolled .nav-links .btn.btn-primary:focus-visible,
.site-header.is-scrolled .nav-links .btn.btn-primary:active,
.site-header.is-scrolled .nav-links .btn.btn-primary:visited{
  background:var(--accent);
  color:#ffffff;
}
.site-header.is-scrolled .nav-links .btn.btn-primary:hover{background:#4a30d6}

/* ---------- services mega menu (desktop only — .nav-links itself is
   hidden below 820px, taking this down with it; mobile gets a plain
   "Services" link in .mobile-nav instead) ---------- */
.nav-services{position:relative}
/* invisible bridge under the trigger so the pointer doesn't leave the
   hoverable area while moving down into the panel */
.nav-services::after{
  content:"";
  position:absolute;
  left:50%;
  top:100%;
  transform:translateX(-50%);
  width:220px;
  height:22px;
}
.mega-menu{
  position:absolute;
  top:100%;
  left:50%;
  margin-top:14px;
  width:560px;
  max-width:88vw;
  background:#ffffff;
  border:1px solid var(--line);
  border-radius:var(--radius-lg);
  box-shadow:var(--shadow-elevated-hover);
  padding:22px;
  display:grid;
  grid-template-columns:1.3fr 1fr;
  gap:8px 24px;
  opacity:0;
  visibility:hidden;
  pointer-events:none;
  transform:translate(-50%,6px);
  transition:opacity .18s ease,transform .18s ease,visibility .18s;
  z-index:90;
}
.nav-services:hover .mega-menu,
.nav-services:focus-within .mega-menu{
  opacity:1;
  visibility:visible;
  pointer-events:auto;
  transform:translate(-50%,0);
}
/* reset the white-on-violet nav link styling for everything inside the
   panel — specificity has to beat .nav-links a (0,2,1) outright rather
   than rely on source order, same fix pattern as the nav button above */
.nav-links .mega-menu a{color:var(--text);border-bottom:none;padding:0}
.mega-menu__links{display:flex;flex-direction:column;gap:2px}
.mega-menu__links a{
  display:flex;
  flex-direction:column;
  gap:2px;
  padding:10px 12px;
  border-radius:10px;
  transition:background-color .15s;
}
.mega-menu__links a:hover{background:var(--neutral)}
.mega-menu__title{font-weight:600;font-size:0.95rem}
.mega-menu__desc{font-size:0.82rem;color:var(--faint)}
.mega-menu__examples{
  border-left:1px solid var(--line);
  padding-left:22px;
  display:flex;
  flex-direction:column;
  gap:8px;
}
.mega-menu__label{
  font-size:0.75rem;
  text-transform:uppercase;
  letter-spacing:0.04em;
  color:var(--faint);
  margin-bottom:2px;
  padding:0 6px;
}
.mega-menu__example{
  display:flex;
  align-items:center;
  gap:10px;
  padding:6px;
  border-radius:10px;
  transition:background-color .15s;
}
.mega-menu__example:hover{background:var(--neutral)}
.mega-menu__example-media{
  width:34px;height:34px;
  border-radius:8px;
  display:flex;align-items:center;justify-content:center;
  overflow:hidden;flex-shrink:0;
}
.mega-menu__example-media img{max-width:68%;max-height:68%;object-fit:contain}
.mega-menu__example-name{font-size:0.88rem;font-weight:500}
.nav-links .mega-menu a.mega-menu__all{
  color:var(--accent);
  font-size:0.85rem;
  padding:6px;
  margin-top:2px;
}
.mega-menu__all:hover{background:transparent;text-decoration:underline}

.nav-search{
  display:flex;
  align-items:center;
  gap:8px;
  font-size:0.85rem;
  color:rgba(255,255,255,.8);
  border:1px solid rgba(255,255,255,.35);
  padding:7px 12px;
  border-radius:var(--radius);
  transition:border-color .25s ease,color .25s ease;
}
.nav-search:hover{border-color:#ffffff;color:#ffffff}
.nav-search kbd{font:inherit;font-size:0.8rem}
.site-header.is-scrolled .nav-search{color:var(--faint);border-color:var(--line)}
.site-header.is-scrolled .nav-search:hover{border-color:var(--text);color:var(--text)}

.burger{
  display:none;
  width:36px;height:36px;
  border:1px solid rgba(255,255,255,.35);
  border-radius:var(--radius);
  flex-direction:column;
  align-items:center;
  justify-content:center;
  gap:5px;
  transition:border-color .25s ease;
}
.burger span{display:block;width:16px;height:1.5px;background:#ffffff;transition:background-color .25s ease}
.burger[aria-expanded="true"] span:nth-child(1){transform:translateY(6.5px) rotate(45deg)}
.burger[aria-expanded="true"] span:nth-child(2){opacity:0}
.burger[aria-expanded="true"] span:nth-child(3){transform:translateY(-6.5px) rotate(-45deg)}
.site-header.is-scrolled .burger{border-color:var(--line)}
.site-header.is-scrolled .burger span{background:var(--text)}

.mobile-nav{
  display:none;
  flex-direction:column;
  border-bottom:1px solid var(--line);
  background:var(--bg);
}
.mobile-nav a{
  display:block;
  padding:16px 24px;
  border-top:1px solid var(--line);
  font-size:1rem;
  line-height:1.4;
  letter-spacing:0;
}
.mobile-nav.open{display:flex}

@media (max-width:820px){
  .nav-links{display:none}
  .burger{display:flex}
}

@media (max-width:600px){
  .site-header.is-scrolled{padding-top:10px}
  .site-header.is-scrolled .nav-bar{max-width:calc(100% - 24px)}
}

/* ---------- hero ---------- */
.hero{
  padding:88px 0 80px;
  text-align:left;
  border-bottom:1px solid var(--line);
}
.hero h1{max-width:18em;margin-bottom:22px}
.hero .sub{
  max-width:38em;
  font-size:1.15rem;
  line-height:1.65;
  letter-spacing:0;
  margin-bottom:34px;
}
.page-hero{
  padding:72px 0 56px;
  border-bottom:1px solid var(--line);
}
.page-hero h1{margin-bottom:16px}
.page-hero .sub{max-width:40em;font-size:1.1rem;line-height:1.65;letter-spacing:0}

/* page-load hero entrance and scroll reveal are both driven by GSAP
   (js/animations.js). This is only the FOUC-safe hidden starting state,
   gated behind .js (added by an inline script in <head>) so content is
   never hidden if JavaScript — or the GSAP CDN load — doesn't run; see
   the fallback at the top of js/animations.js.

   .hero h1 itself is deliberately NOT pre-hidden here — SplitText owns
   that element (it's the node being split) and reverts style changes made
   to it outside of its own control, so hiding it via CSS/GSAP is a losing
   fight. Its words are what actually get hidden and staggered in (set
   directly in js/animations.js, after the split exists), so the headline
   reads as plain unsplit text for an instant on load and then resolves
   into the word-by-word reveal. */
.js .hero .sub,.js .hero .btn,
.js .page-hero h1,.js .page-hero .sub,
.js .reveal{
  opacity:0;
}

@media (prefers-reduced-motion: reduce){
  .js .hero .sub,.js .hero .btn,
  .js .page-hero h1,.js .page-hero .sub,
  .js .reveal{opacity:1}
}

/* ---------- section scaffolding ---------- */
section{
  padding:80px 0;
  border-bottom:1px solid var(--line);
}
section:last-of-type{border-bottom:0}
.section-head{margin-bottom:44px}
.section-head h2{margin-bottom:14px}
.section-head p{max-width:36em;font-size:1.05rem}

/* ---------- work grid ---------- */
.work-grid{
  display:grid;
  grid-template-columns:repeat(3,1fr);
  gap:28px;
}
.work-card{
  display:block;
  border-radius:var(--radius-lg);
}
/* the colored logo panel is the "surface" that gets elevated — modeled on
   Clarasight's card treatment (investigation/data.json notes this pairing
   is approximate: the captured bento-grid-item node was an unstyled nested
   link, not the visual card itself — so this reuses the same shadow/radius
   tokens as the button and FAQ card rather than a literal scraped value). */
.work-card__media{
  position:relative;
  aspect-ratio:4/3;
  border-radius:var(--radius-lg);
  box-shadow:var(--shadow-elevated);
  display:flex;
  align-items:center;
  justify-content:center;
  overflow:hidden;
  transition:box-shadow .2s ease;
}
.work-card:hover .work-card__media,
.work-card:focus-visible .work-card__media{
  box-shadow:var(--shadow-elevated-hover);
}
/* optional per-brand ambient glow — not a shadow around the card, but the
   same soft radial-gradient "light source" pseudo-element these client
   sites use behind their own hero/feature content (e.g. sobercoach.to's
   .hero::before / prettydarkplaces.com's .hero::before: a large blurred
   circle in the brand accent color, fading to transparent). Sits inside
   the card, clipped by its own overflow:hidden, behind the decor art and
   logo (same paint layer as .work-card__decor — a ::before is always
   painted first among same-z-index siblings, so it lands underneath them
   without needing a lower z-index). */
.work-card__media::before{
  content:"";
  position:absolute;
  top:-20%;
  right:-15%;
  width:75%;
  height:75%;
  background:radial-gradient(circle, var(--card-glow, transparent) 0%, transparent 70%);
  filter:blur(6px);
  pointer-events:none;
  z-index:0;
}
/* optional per-brand decorative art (e.g. a client's own floral/leaf
   artwork) sitting behind the logo — absolutely positioned so it can bleed
   past the card edge, clipped by the media panel's own overflow:hidden */
.work-card__decor{
  position:absolute;
  z-index:0;
  pointer-events:none;
  max-width:none;
}
.work-card__media-inner{
  position:relative;
  z-index:1;
  display:flex;
  align-items:center;
  justify-content:center;
  width:100%;height:100%;
  transition:transform .35s cubic-bezier(.2,.7,.3,1);
}
.work-card:hover .work-card__media-inner,
.work-card:focus-visible .work-card__media-inner{
  transform:scale(1.045);
}
.work-logo-img{
  max-width:78%;
  max-height:56%;
  object-fit:contain;
}
.work-logo-text{
  font-weight:800;
  font-size:clamp(1.05rem,0.7rem + 1.6vw,1.5rem);
  letter-spacing:-0.01em;
  line-height:1.15;
  text-align:center;
  padding:0 22px;
}
.work-card__body{padding:18px 2px 0}
.work-card__name{font-weight:600;font-size:1.05rem;line-height:1.25;letter-spacing:-0.005em;margin-bottom:4px}
.work-card__desc{font-size:0.92rem;line-height:1.5;letter-spacing:0;color:var(--dim)}

@media (max-width:900px){
  .work-grid{grid-template-columns:repeat(2,1fr)}
}
@media (max-width:600px){
  .work-grid{grid-template-columns:1fr}
}

/* ---------- featured-by strip ---------- */
.featured-strip{
  padding:32px 0;
  border-bottom:1px solid var(--line);
}
/* the label sits above the logo row rather than inside it, so it adds its
   own space up top without disturbing the row's own vertical centering */
.featured-strip .label{
  font-size:0.85rem;
  color:var(--faint);
  text-align:center;
  margin-bottom:0;
}
.featured-logos{
  display:flex;
  align-items:center;
  justify-content:center;
  gap:56px;
  flex-wrap:wrap;
  /* equal padding above and below the row itself, independent of the
     label's own spacing above it */
  padding:28px 0;
}
/* Each logo sets its own explicit width/height (in the markup, sized for
   optical balance against the others) rather than a shared CSS height —
   the source SVGs have very different viewBox proportions, so one shared
   height makes some of them look far bigger or heavier than the rest.
   align-items:center above still keeps them on one shared center line. */
.featured-logos svg{
  display:block;
  color:var(--faint);
}
.featured-logos svg path,.featured-logos svg polygon{fill:currentColor}
@media (max-width:600px){
  .featured-logos{gap:36px 40px}
}

/* ---------- proof ---------- */
.proof-grid{
  display:grid;
  grid-template-columns:1fr 1fr;
  gap:56px;
  align-items:start;
}
.stats{
  display:grid;
  grid-template-columns:repeat(3,1fr);
  gap:20px;
  margin:28px 0;
}
.stat{border-top:1px solid var(--line-strong);padding-top:12px}
.stat .num{font-weight:700;font-size:1.6rem;display:block;margin-bottom:4px}
.stat .label{font-size:0.85rem;color:var(--faint)}
/* client testimonial: a chat-bubble-style quote (solid brand-color fill,
   squared-off corner pointing at the avatar) with the client's own circular
   photo overlapping its edge, styled after a reference screenshot for the
   bubble/avatar layout only — not that reference's own colors */
.testimonial{margin:24px 0 16px;max-width:32em}
.testimonial-bubble{
  position:relative;
  background:#2f6b3f;
  color:#fff;
  border-radius:20px 20px 6px 20px;
  padding:22px 26px;
  box-shadow:var(--shadow-elevated);
}
.testimonial-bubble p{font-size:1.1rem;line-height:1.5;margin:0}
.testimonial-avatar{
  position:absolute;
  right:-14px;
  bottom:-14px;
  width:56px;
  height:56px;
  border-radius:50%;
  object-fit:cover;
  border:3px solid var(--bg);
  box-shadow:var(--shadow-1);
}
.testimonial-name{
  margin-top:16px;
  padding-right:14px;
  text-align:right;
  font-size:0.88rem;
  color:var(--faint);
}
.proof-img{
  border-radius:var(--radius);
  overflow:hidden;
  border:1px solid var(--line);
  /* matches the screenshot's own dimensions exactly, so it displays in full
     with no cropping — set this to the real width/height of whatever
     screenshot is in use if that image is ever swapped for a new one */
  aspect-ratio:1400/782;
  background:var(--neutral);
}
.proof-img img{
  width:100%;height:100%;
  object-fit:cover;
}
@media (max-width:820px){
  .proof-grid{grid-template-columns:1fr}
}

/* ---------- how it works ---------- */
.steps{
  display:grid;
  grid-template-columns:repeat(3,1fr);
  gap:32px;
}
.step .step-num{
  font-weight:700;
  font-size:1rem;
  color:var(--faint);
  margin-bottom:12px;
}
.step h3{margin-bottom:8px}
@media (max-width:820px){
  .steps{grid-template-columns:1fr;gap:28px}
}

/* ---------- pricing cards ----------
   Shared by the homepage preview and the full pricing page: four tiers,
   the third marked "Most popular" (accent ring + badge, matching the
   site's one accent color) and the fourth a distinct inverted/dark card
   for the open-ended custom-quote option, so it reads as a different kind
   of tier rather than just a fourth price. */
.pricing-grid{
  display:grid;
  grid-template-columns:repeat(4,1fr);
  gap:20px;
  align-items:stretch;
}
.price-card{
  position:relative;
  border:1px solid var(--line);
  border-radius:var(--radius-lg);
  padding:30px 26px;
  display:flex;
  flex-direction:column;
  gap:14px;
  background:var(--bg);
  box-shadow:var(--shadow-elevated);
  transition:box-shadow .2s ease,transform .2s ease;
}
.price-card:hover{box-shadow:var(--shadow-elevated-hover);transform:translateY(-2px)}
.price-card__badge{
  position:absolute;
  top:-13px;
  left:26px;
  background:var(--accent);
  color:var(--accent-text);
  font-size:0.78rem;
  font-weight:600;
  letter-spacing:0.01em;
  padding:5px 14px;
  border-radius:var(--radius-pill);
}
.price-card--featured{border-color:var(--accent);box-shadow:var(--shadow-elevated),0 0 0 1px var(--accent)}
.price-card h3{margin-bottom:0;font-size:1.15rem}
.price-card .best-for{font-size:0.9rem;color:var(--faint);min-height:2.7em}
.price-card__price{margin:2px 0 4px;display:flex;align-items:baseline;gap:6px;flex-wrap:wrap}
.price-card__amount{font-weight:700;font-size:1.7rem;letter-spacing:-0.01em}
.price-card__period{font-size:0.85rem;color:var(--faint)}
.price-card__plans{font-size:0.85rem;color:var(--faint)}
.price-card ul{display:flex;flex-direction:column;gap:9px;margin:6px 0}
.price-card li{font-size:0.94rem;color:var(--dim);padding-left:22px;position:relative}
.price-card li::before{
  content:"";
  position:absolute;left:0;top:0.35em;
  width:12px;height:8px;
  border-left:2px solid var(--accent);
  border-bottom:2px solid var(--accent);
  transform:rotate(-45deg);
}
.price-card .btn{margin-top:auto}

/* fourth tier: bespoke/custom development, priced by quote — visually set
   apart (solid accent, inverted text) so it reads as "talk to us" rather
   than a fixed price bracket */
.price-card--custom{
  background:var(--accent);
  color:#fff;
  border-color:var(--accent);
}
.price-card--custom .best-for{color:rgba(255,255,255,.62)}
.price-card--custom .price-card__period,
.price-card--custom .price-card__plans{color:rgba(255,255,255,.62)}
.price-card--custom li{color:rgba(255,255,255,.82)}
.price-card--custom li::before{border-color:#fff}
.price-card--custom .btn.btn-secondary{border-color:rgba(255,255,255,.5);color:#fff}
.price-card--custom .btn.btn-secondary:hover{background:rgba(255,255,255,.12)}

@media (max-width:980px){
  .pricing-grid{grid-template-columns:repeat(2,1fr)}
}
@media (max-width:600px){
  .pricing-grid{grid-template-columns:1fr}
}

.packages-note{
  text-align:center;
  margin-top:32px;
  font-size:1rem;
}

/* ---------- FAQ ----------
   Each row is its own rounded, softly-shadowed card instead of a flush
   list row — modeled on Clarasight's FAQ item (investigation/data.json →
   faqItem: border-radius 18px, the same two-layer shadow as the primary
   button, a faint white-to-transparent gradient fill). Phase has no
   equivalent gradient surface to fade against, so the fill is just
   var(--bg) — the shadow alone does the "lifted card" work. No
   backdrop-filter: Clarasight's faqItem doesn't use one either. */
.faq-list{
  max-width:44em;
  margin:0 auto;
  display:flex;
  flex-direction:column;
  gap:12px;
}
.faq-item{
  background:var(--bg);
  border-radius:var(--radius-lg);
  box-shadow:var(--shadow-elevated);
  transition:box-shadow .2s ease;
}
.faq-item:hover,.faq-item[open]{box-shadow:var(--shadow-elevated-hover)}
.faq-item summary{
  cursor:pointer;
  padding:20px 24px;
  font-weight:600;
  font-size:1.02rem;
  line-height:1.35;
  letter-spacing:-0.005em;
  list-style:none;
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:16px;
}
.faq-item summary::-webkit-details-marker{display:none}
.faq-item summary::after{
  content:"+";
  font-weight:400;
  font-size:1.3rem;
  color:var(--faint);
  flex-shrink:0;
}
.faq-item[open] summary::after{content:"–"}
.faq-item p{
  padding:0 24px 22px;
  max-width:40em;
  line-height:1.65;
  letter-spacing:0;
}

/* ---------- closing CTA ---------- */
.closing-cta{
  text-align:center;
  padding:88px 0;
}
.closing-cta h2{margin-bottom:26px}

/* ---------- footer ---------- */
.site-footer{padding:40px 0}
.foot-row{
  display:flex;
  align-items:center;
  justify-content:space-between;
  flex-wrap:wrap;
  gap:12px;
  font-size:0.88rem;
  color:var(--faint);
}
.foot-links{display:flex;gap:20px}
.foot-links a{transition:color .15s}
.foot-links a:hover{color:var(--text)}

/* ---------- command palette ---------- */
.cmdk-backdrop{
  position:fixed;inset:0;
  background:rgba(10,10,10,.4);
  z-index:200;
  display:none;
  align-items:flex-start;
  justify-content:center;
  padding-top:14vh;
}
.cmdk-backdrop.open{display:flex}
.cmdk-panel{
  background:var(--bg);
  border:1px solid var(--line);
  border-radius:var(--radius);
  width:100%;
  max-width:560px;
  margin:0 20px;
  max-height:60vh;
  display:flex;
  flex-direction:column;
  overflow:hidden;
}
.cmdk-input{
  border:0;
  border-bottom:1px solid var(--line);
  padding:18px 20px;
  font-size:1.05rem;
  width:100%;
}
.cmdk-input:focus-visible{outline:none}
.cmdk-list{overflow-y:auto;padding:8px}
.cmdk-list a{
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:12px;
  padding:12px 12px;
  border-radius:var(--radius);
  font-size:0.98rem;
  transition:background-color .15s;
}
.cmdk-list a:hover,.cmdk-list a.active{background:var(--neutral)}
.cmdk-list .tag{font-size:0.8rem;color:var(--faint)}
.cmdk-empty{padding:20px 12px;color:var(--faint);font-size:0.95rem}

/* ---------- about page ---------- */
.about-grid{
  display:grid;
  grid-template-columns:.9fr 1.1fr;
  gap:56px;
  align-items:start;
}
.about-photo{
  aspect-ratio:4/5;
  background:var(--neutral);
  border-radius:var(--radius);
  display:flex;
  align-items:center;
  justify-content:center;
  color:var(--faint);
  font-size:0.9rem;
}
.about-body p{margin-bottom:16px;max-width:36em}
.about-body p.lead{font-size:1.2rem}
@media (max-width:820px){
  .about-grid{grid-template-columns:1fr}
}

/* ---------- contact page ---------- */
.contact-grid{
  display:grid;
  grid-template-columns:1fr 1fr;
  gap:56px;
}
.contact-info p{margin-bottom:16px;max-width:32em}
.contact-info .email{
  font-weight:600;
  color:var(--text);
  font-size:1.1rem;
}
form.contact-form{
  display:flex;
  flex-direction:column;
  gap:18px;
}
.field{display:flex;flex-direction:column;gap:6px}
.field label{font-size:0.9rem;font-weight:600}
.field input,.field select,.field textarea{
  border:1px solid var(--line);
  border-radius:var(--radius);
  padding:12px 14px;
  font-size:1rem;
  background:var(--bg);
  color:var(--text);
  transition:border-color .15s;
}
.field input:focus-visible,.field select:focus-visible,.field textarea:focus-visible{
  border-color:var(--accent);
}
.field .optional{color:var(--faint);font-weight:400}
@media (max-width:820px){
  .contact-grid{grid-template-columns:1fr}
}

/* ---------- case study page ---------- */
.case-block{max-width:44em}
.case-block p{margin-bottom:16px}
.check-list{display:flex;flex-direction:column;gap:9px;margin:18px 0 0;list-style:none}
.check-list li{font-size:0.94rem;color:var(--dim);padding-left:22px;position:relative}
.check-list li::before{
  content:"";
  position:absolute;left:0;top:0.35em;
  width:12px;height:8px;
  border-left:2px solid var(--accent);
  border-bottom:2px solid var(--accent);
  transform:rotate(-45deg);
}
.case-stats{
  display:grid;
  grid-template-columns:repeat(3,1fr);
  gap:20px;
  margin:28px 0;
}
.case-shot{
  border:1px solid var(--line);
  border-radius:var(--radius);
  overflow:hidden;
  margin:24px 0;
  aspect-ratio:1400/782;
  background:var(--neutral);
}
.case-shot img{
  width:100%;height:100%;
  object-fit:cover;
}
.case-quote{
  font-size:1.3rem;
  color:var(--text);
  max-width:34em;
  line-height:1.45;
  margin:20px 0;
}
@media (max-width:600px){
  .case-stats{grid-template-columns:1fr}
}
