/* codebled website — layout and components. Tokens only (see styles.css). */

html{scroll-behavior:smooth}
body{min-height:100vh;display:flex;flex-direction:column}
main{flex:1}
img{max-width:100%;height:auto;display:block}
a.plain,.plain a{border:0}

/* ——— Layout ——— */
.wrap{max-width:1160px;margin:0 auto;padding:0 var(--space-6)}
.section{padding-block:88px}
.section--flush-top{padding-top:0}
.section--lg{padding-block:96px}
.divider{border-top:var(--border-hairline)}
.grid{display:grid;gap:var(--gap-grid);grid-template-columns:repeat(auto-fit,minmax(min(var(--min,260px),100%),1fr))}
.split{display:grid;gap:40px;align-items:start;grid-template-columns:repeat(auto-fit,minmax(min(280px,100%),1fr))}
.stack>*+*{margin-top:var(--gap,22px)}
.measure{max-width:56ch}

/* ——— Skip link ——— */
.skip-link{position:absolute;left:var(--space-4);top:-100px;z-index:10;background:var(--surface-invert);color:var(--text-on-invert);padding:var(--space-2) var(--space-4);border:0;border-radius:var(--radius-control);font:var(--type-ui)}
.skip-link:focus{top:var(--space-4)}

/* ——— Type ——— */
.label{font:var(--type-label);letter-spacing:var(--tracking-label);text-transform:uppercase;color:var(--text-muted);margin:0 0 18px}
/* Accent labels: phosphor text on dark; on paper leaf-700 is below 4.5:1, so the label
   stays muted ink and the accent moves to a leading mark. */
.label--accent{color:var(--text-primary);display:flex;align-items:center;gap:10px}
.label--accent::before{content:"";width:8px;height:8px;background:var(--text-accent);flex:none}
.cb-dark .label--accent{color:var(--text-accent)}
.h-display{font:800 clamp(40px,6vw,72px)/1.04 var(--font-display);letter-spacing:-.045em;color:var(--text-primary);max-width:15ch}
.h-page{font:800 clamp(36px,5vw,60px)/1.05 var(--font-display);letter-spacing:-.045em;color:var(--text-primary);max-width:18ch}
.h-section{font:700 clamp(28px,3.4vw,40px)/1.1 var(--font-display);letter-spacing:-.03em;color:var(--text-primary);max-width:22ch;margin:0 0 40px}
.h-section--tight{margin-bottom:0}
.h-cta{font:800 clamp(32px,4.5vw,56px)/1.04 var(--font-display);letter-spacing:-.045em;color:var(--text-primary);max-width:16ch}
.h-card{font:700 24px/1.2 var(--font-display);letter-spacing:-.02em;color:var(--text-primary);margin:14px 0 10px}
.h-sub{font:700 20px/1.25 var(--font-display);letter-spacing:-.02em;color:var(--text-primary);margin:0 0 10px}
.lede{font:var(--type-body-l);color:var(--text-body);max-width:56ch}
.body-s{font:var(--type-body-s);color:var(--text-body)}
.caption{font:var(--type-caption);color:var(--text-muted)}
.strong{font:var(--type-ui);font-weight:600;color:var(--text-primary)}
.index-num{font:var(--type-label);letter-spacing:var(--tracking-label);color:var(--text-muted)}
.cb-dark .index-num{color:var(--text-accent)}

/* ——— Links ——— */
.link{font:var(--type-ui);font-weight:600;color:var(--text-primary);border-bottom:1px solid var(--line-accent)}
.link:hover{color:var(--text-primary);border-bottom-color:currentColor}
.cb-dark .link{color:var(--text-accent)}
.link-arrow::after{content:" →"}

/* ——— Buttons. Accent (--leaf) is for one action per view. ——— */
.btn{display:inline-flex;align-items:center;gap:var(--space-2);font:var(--type-ui);font-weight:600;padding:14px 22px;border-radius:var(--radius-control);border:1px solid transparent;cursor:pointer;transition:var(--transition-control);white-space:nowrap}
.btn:hover{border-bottom-color:transparent}
.btn--accent{background:var(--leaf-500);color:var(--text-on-accent)}
.btn--accent:hover{background:var(--leaf-300);color:var(--text-on-accent)}
.btn--solid{background:var(--surface-invert);color:var(--text-on-invert)}
.btn--solid:hover{background:var(--moss-700);color:var(--text-on-invert)}
.cb-dark .btn--solid:hover{background:var(--paper-000);color:var(--text-on-invert)}
.btn--ghost{color:var(--text-primary);border-color:var(--line-strong)}
.btn--ghost:hover{background:var(--alpha-fill);color:var(--text-primary);border-color:var(--line-strong)}
.btn--sm{padding:10px 16px}
.btn--lg{padding:16px 26px}
.btn-row{display:flex;gap:var(--space-3);flex-wrap:wrap}

/* ——— Header ——— */
.site-header .wrap{padding-block:22px;display:flex;align-items:center;justify-content:space-between;gap:var(--space-6)}
.site-nav{display:flex;align-items:center;gap:28px}
.site-nav__links{display:flex;align-items:center;gap:28px;list-style:none;margin:0;padding:0}
.site-nav__links a{font:var(--type-ui);color:var(--text-body);border:0;padding-block:6px}
.site-nav__links a:hover{color:var(--text-primary)}
.site-nav__links a[aria-current="page"]{color:var(--text-primary);box-shadow:inset 0 -2px 0 var(--text-accent)}
.menu-toggle{display:none;font:var(--type-label);letter-spacing:var(--tracking-label);text-transform:uppercase;background:none;color:var(--text-primary);border:var(--border-strong);border-radius:var(--radius-control);padding:11px 12px;cursor:pointer}
@media (max-width:760px){
  .menu-toggle{display:inline-flex}
  .site-nav{gap:var(--space-3)}
  .site-nav__links{display:none}
  .site-header.is-open .site-nav__links{display:flex;flex-direction:column;align-items:stretch;gap:0;position:absolute;left:0;right:0;top:100%;background:var(--surface-page);border-block:var(--border-hairline);padding:var(--space-2) var(--space-6);z-index:5}
  .site-header.is-open .site-nav__links a{display:block;padding-block:14px}
  .site-header.is-open .site-nav__links li+li{border-top:var(--border-hairline)}
  .site-header{position:relative}
}
/* No-JS: keep links reachable. */
.no-js .menu-toggle{display:none}
@media (max-width:760px){.no-js .site-nav__links{display:flex;flex-wrap:wrap;gap:var(--space-4)}.no-js .site-header .wrap{flex-wrap:wrap}}

/* ——— Wordmark ——— */
.wordmark{display:inline-flex;align-items:baseline;white-space:nowrap;font-family:var(--font-display);font-weight:800;line-height:1;letter-spacing:-.045em;color:var(--text-primary);padding-bottom:.18em;border:0}
.wordmark:hover{color:var(--text-primary)}
.wordmark__o{width:.58em;height:.58em;margin:0 .01em -.012em .015em;overflow:visible}
.wordmark__e{position:relative;display:inline-block}
.wordmark__drop{position:absolute;left:.2em;bottom:-.16em;width:.17em;height:.26em}

/* ——— Footer ——— */
.site-footer{border-top:var(--border-hairline)}
.site-footer .wrap{padding-block:28px;display:flex;align-items:center;justify-content:space-between;gap:var(--space-6);flex-wrap:wrap}
.site-footer__meta{display:flex;align-items:center;gap:var(--space-6);flex-wrap:wrap;font:var(--type-caption);color:var(--text-muted)}
.site-footer__meta ul{display:flex;gap:var(--space-5);list-style:none;margin:0;padding:0}
.site-footer__meta a{color:var(--text-muted);border:0}
.site-footer__meta a:hover{color:var(--text-primary)}

/* ——— Hero ——— */
.hero{padding-block:72px 56px}
.hero .lede{margin-top:28px}
.hero .btn-row{margin-top:36px}
.page-head{padding-block:72px 64px}
.page-head .lede{margin-top:24px}

/* ——— Stats strip ——— */
.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(220px,100%),1fr));border-block:var(--border-hairline)}
.stat{padding:26px 24px}
.stat+.stat{border-left:var(--border-hairline)}
.stat:first-child{padding-left:0}
.stat__value{font:800 40px/1 var(--font-display);letter-spacing:-.04em;color:var(--text-primary)}
.stat__label{font:var(--type-caption);color:var(--text-muted);margin-top:8px}
@media (max-width:720px){.stat{padding-left:0}.stat+.stat{border-left:0;border-top:var(--border-hairline)}}

/* ——— Cards ——— */
.card{background:var(--surface-card);border:var(--border-hairline);border-radius:var(--radius-panel);padding:28px;min-width:0}
.card p{font:var(--type-body-s);color:var(--text-body)}
a.card{display:block;color:inherit;transition:var(--transition-surface)}
a.card:hover{border-color:var(--line-strong);transform:var(--lift-hover)}
a.card .link{display:inline-block;margin-top:18px}
.card--feature{grid-column:1/-1;padding:40px;display:grid;gap:32px;align-items:center;grid-template-columns:repeat(auto-fit,minmax(min(280px,100%),1fr))}
.card--feature .h-feature{font:800 clamp(32px,4vw,48px)/1.05 var(--font-display);letter-spacing:-.04em;color:var(--text-primary);margin:16px 0 14px}
@media (max-width:520px){.card--feature{padding:24px}}

/* ——— Definition rows ——— */
.rows{border-top:var(--border-hairline)}
.row{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,2fr);gap:16px;padding:18px 0;border-bottom:var(--border-hairline)}
.row__term{font:var(--type-ui);font-weight:600;color:var(--text-primary)}
.row__desc{font:var(--type-body-s);color:var(--text-body)}
@media (max-width:520px){.row{grid-template-columns:1fr;gap:4px}}

/* ——— Tags ——— */
.tags{display:flex;flex-wrap:wrap;gap:10px;list-style:none;margin:0;padding:0}
.tag{font:var(--type-mono);color:var(--text-body);border:var(--border-hairline);padding:6px 12px;border-radius:var(--radius-pill)}

/* ——— Values ——— */
.values{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(160px,100%),1fr));gap:16px;border-top:var(--border-hairline);padding-top:22px}

/* ——— Dark band ——— */
.band{background:var(--surface-page);color:var(--text-body);padding-block:88px}

/* ——— Screenshots ——— */
.shot{margin:0;border-radius:var(--radius-card);overflow:hidden;background:var(--surface-inset);border:var(--border-hairline)}
.shot img{width:100%;height:auto}
.shot figcaption{font:var(--type-caption);color:var(--text-muted);padding:10px 14px;border-top:var(--border-hairline)}
.shots{display:grid;gap:20px;grid-template-columns:repeat(auto-fit,minmax(min(300px,100%),1fr))}
.shots>:first-child{grid-column:1/-1}
/* Phone screens: a row of five on desktop, a swipeable strip on small screens. The frames
   carry their own rounded corners (transparent in the export), so the figure adds none. */
.shots--phones{grid-template-columns:repeat(5,minmax(0,1fr));gap:20px;align-items:start}
.shots--phones>:first-child{grid-column:auto}
.shots--phones .shot{background:none;border:0;border-radius:0;overflow:visible}
.shots--phones .shot figcaption{border:0;padding:12px 0 0;text-align:center}
@media (max-width:860px){
  .shots--phones{display:flex;gap:16px;overflow-x:auto;scroll-snap-type:x mandatory;padding-bottom:8px;margin-inline:calc(var(--space-6)*-1);padding-inline:var(--space-6);scroll-padding-inline:var(--space-6)}
  .shots--phones .shot{flex:0 0 min(62%,240px);scroll-snap-align:start}
}

/* ——— Placeholders: missing content from codebled. Never ship fake content in these. ——— */
.todo{font:var(--type-mono);color:var(--text-muted);border:1px dashed var(--line-strong);border-radius:var(--radius-card);background:var(--alpha-fill);padding:2px 8px}
span.todo{display:inline;-webkit-box-decoration-break:clone;box-decoration-break:clone}
div.todo{display:grid;place-items:center;text-align:center;padding:var(--space-6)}
.todo--media{aspect-ratio:16/10}
.todo--photo{aspect-ratio:4/5}
.todo--embed{min-height:420px}

/* ——— Case study ——— */
.case-head{padding-block:72px 56px}
.case-head .lede{margin-top:22px}
.case-body{display:grid;gap:56px;grid-template-columns:minmax(0,220px) minmax(0,1fr);align-items:start}
.case-body__aside{position:sticky;top:24px;display:grid;gap:22px}
.case-section+.case-section{margin-top:56px;padding-top:56px;border-top:var(--border-hairline)}
.case-section h2{font:700 clamp(24px,2.6vw,32px)/1.15 var(--font-display);letter-spacing:-.03em;margin:0 0 18px}
.case-section p,.case-section li{max-width:var(--max-measure)}
.case-section ul{margin:0;padding-left:1.1em}
.case-section li+li{margin-top:8px}
.outcomes{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(200px,100%),1fr));border-block:var(--border-hairline);margin-top:8px}
.outcomes .stat:first-child{padding-left:0}
.next-case{display:flex;justify-content:space-between;align-items:end;gap:24px;flex-wrap:wrap;border:0;color:inherit;padding:40px 0}
.next-case:hover{color:inherit}
.next-case:hover .h-cta{color:var(--text-primary);text-decoration:underline;text-decoration-thickness:2px;text-underline-offset:8px;text-decoration-color:var(--text-accent)}
@media (max-width:860px){.case-body{grid-template-columns:1fr;gap:32px}.case-body__aside{position:static}}

/* ——— Meta list (aside) ——— */
.meta dt{font:var(--type-label);letter-spacing:var(--tracking-label);text-transform:uppercase;color:var(--text-muted)}
.meta dd{margin:8px 0 0;font:var(--type-body-s);color:var(--text-primary)}
.meta div+div{margin-top:20px}

/* ——— Team ——— */
.person .todo--photo,.person img{border-radius:var(--radius-card);width:100%}
.person__name{font:700 20px/1.25 var(--font-display);letter-spacing:-.02em;color:var(--text-primary);margin-top:14px}
.person__role{font:var(--type-caption);color:var(--text-muted);margin-top:4px}

/* ——— Testimonials ——— */
.quote{margin:0}
.quote blockquote{margin:0;font:600 clamp(20px,2.2vw,26px)/1.35 var(--font-display);letter-spacing:-.02em;color:var(--text-primary)}
.quote figcaption{margin-top:16px;font:var(--type-caption);color:var(--text-muted)}
.logos{display:flex;flex-wrap:wrap;gap:32px 48px;align-items:center;list-style:none;margin:0;padding:24px 0;border-block:var(--border-hairline)}
.logos img{height:28px;width:auto}

/* ——— Prose (legal, notes) ——— */
.prose{max-width:var(--max-measure)}
.prose>*+*{margin-top:18px}
.prose h2{font:700 26px/1.2 var(--font-display);letter-spacing:-.025em;margin-top:48px}
.prose h3{font:700 20px/1.25 var(--font-display);letter-spacing:-.02em;margin-top:32px}
.prose ul,.prose ol{padding-left:1.2em}
.prose li+li{margin-top:6px}
.prose a{color:var(--text-primary);border-bottom:1px solid var(--line-accent)}
.prose a:hover{border-bottom-color:currentColor}
.prose blockquote{margin-left:0;padding-left:20px;border-left:2px solid var(--line-accent);color:var(--text-primary)}
.doc-meta{font:var(--type-mono);color:var(--text-muted)}

/* ——— Notes list ——— */
.note-list{list-style:none;margin:0;padding:0;border-top:var(--border-hairline)}
.note-list a{display:grid;grid-template-columns:140px minmax(0,1fr);gap:24px;padding:24px 0;border-bottom:var(--border-hairline);color:inherit}
.note-list a:hover .h-sub{text-decoration:underline;text-decoration-color:var(--text-accent);text-underline-offset:5px}
@media (max-width:620px){.note-list a{grid-template-columns:1fr;gap:6px}}

/* ——— Empty state ——— */
.empty{border:1px dashed var(--line-strong);border-radius:var(--radius-panel);padding:40px;text-align:left}
.empty p+p{margin-top:10px}

/* ——— Motion: particle field and scroll reveals ——— */
/* Decorative canvases. They carry no information the copy does not. */
canvas.field{display:block;width:100%;height:100%}
/* The field sits straight on the page: no panel, no ground of its own. */
.hero--motion{display:grid;gap:40px;align-items:center;grid-template-columns:minmax(0,1.05fr) minmax(0,.95fr)}
.hero--motion .stage{aspect-ratio:1;max-height:520px;margin-inline:auto;width:100%}
@media (max-width:860px){
  .hero--motion{grid-template-columns:1fr;gap:24px}
  .hero--motion .stage{max-height:300px;order:-1}
}
.scrolly{display:grid;gap:56px;grid-template-columns:minmax(0,1fr) minmax(0,1fr);align-items:start}
/* The stage stays pinned for the whole passage: its pin lasts (steps total − stage height),
.scrolly__stage{position:sticky;top:17vh;height:66vh;display:grid;place-items:center;align-content:center}
.scrolly__step{min-height:52vh;display:flex;flex-direction:column;justify-content:center}
.scrolly__step:last-child{min-height:46vh}
@media (max-width:860px){
  .scrolly{grid-template-columns:1fr;gap:0}
  .scrolly__stage{position:sticky;top:0;z-index:2;height:auto;background:var(--surface-page);border-bottom:var(--border-hairline);padding-block:12px;margin-bottom:0}
  .scrolly__step{min-height:0;padding-block:40px}
  .scrolly__step:first-child{padding-top:24px}
}

.reveal{opacity:0;transform:translateY(8px);transition:opacity var(--dur-base) var(--ease-out),transform var(--dur-base) var(--ease-out)}
.reveal.is-in{opacity:1;transform:none}
.no-js .reveal{opacity:1;transform:none}
@media (prefers-reduced-motion:reduce){.reveal{opacity:1;transform:none;transition:none}}

/* ——— Screen-reader-only text ——— */
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}

.no-js .scrolly__stage{position:static;height:auto}

/* ——— App showcase (case study) ——— */
.app-showcase h2{max-width:28ch;margin-top:12px}
.app-showcase__fig{margin:48px 0 0;text-align:center}
.app-showcase__fig img{width:100%;height:auto}
.app-showcase__fig figcaption{font:var(--type-caption);color:var(--text-muted);margin-top:16px}
