@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&family=Roboto+Condensed:wght@400;700&family=PT+Serif:ital,wght@0,400;0,700;1,400&display=swap');

/* ============================================================
   Tokens read off the Figma "Final wireframe — EN" page.
   Where Winden and the final wireframe disagree, the wireframe wins.
   Every corner radius in the wireframe is 0 — nothing is rounded.
   ============================================================ */
:root {
  --ink: #000000;         /* headings, logo, nav tabs        */
  --body: #4a4a4a;        /* body copy, card body, nav sub   */
  --muted: #949494;       /* labels, footer links, breadcrumb*/
  --dim: #6e6e6e;         /* overview, proof-extra           */
  --accent: #7297c5;      /* nav ground, primary button      */
  --tab-active: #0066cc;  /* active nav tab underline        */
  --bg: #ffffff;
  --bg-sub: #f7f7fa;      /* alternating bands               */
  --line: #e4e4e8;        /* card + table borders            */
  --nav-line: #e0e0e0;
  --logo-rule: #c9c9d0;
  --footer-bg: #000000;
  --footer-rule: rgba(255,255,255,.18);

  --sans: 'Roboto', system-ui, -apple-system, 'Segoe UI', sans-serif;
  --cond: 'Roboto Condensed', 'Roboto', system-ui, sans-serif;
  --serif: 'PT Serif', Georgia, 'Times New Roman', serif;

  --page: 1440px;
  --pad: 64px;
  --measure: 920px;
}

*, *::before, *::after { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; }
body { margin: 0; background: var(--bg); color: var(--body); font: 400 16px/24px var(--sans); }
img, video { display: block; max-width: 100%; }
a { color: var(--accent); }

.skip { position: absolute; left: -9999px; top: 0; z-index: 100; background: var(--ink); color: #fff; padding: 12px 20px; }
.skip:focus { left: 0; }
.wrap { max-width: var(--page); margin: 0 auto; padding: 0 var(--pad); }

/* ---------- nav ---------- */
.site-nav { background: var(--accent); border-bottom: 1px solid var(--nav-line); }
.nav-inner { display: flex; align-items: center; height: 56px; padding: 0 24px; max-width: var(--page); margin: 0 auto; }
.logo { display: flex; align-items: center; gap: 12px; text-decoration: none; }
.logo-name { font: 400 20px/28px var(--serif); color: var(--ink); }
.logo-rule { width: 1px; height: 16px; background: var(--logo-rule); }
.logo-sub { font: 400 17px/22px var(--cond); color: var(--body); }
.nav-links { display: flex; gap: 8px; margin-left: auto; padding-right: 5px; }
.nav-links a { display: flex; align-items: center; height: 56px; padding: 0 2px; font: 400 16px/20px var(--cond); color: var(--ink); text-decoration: none; border-bottom: 2px solid transparent; }
.nav-links a:hover { border-bottom-color: rgba(0,0,0,.25); }
.nav-links a[aria-current="page"] { border-bottom-color: var(--tab-active); }
.lang { position: relative; margin-left: 4px; }
.lang-btn { display: flex; align-items: center; gap: 4px; height: 56px; padding: 0 10px; background: none; border: 0; color: var(--ink); cursor: pointer; }
.caret { font-size: 10px; }
.lang-menu { position: absolute; right: 0; top: 100%; min-width: 178px; z-index: 20; background: #fff; border: 1px solid var(--line); padding: 6px; display: grid; gap: 2px; }
.lang-menu[hidden] { display: none; }
.lang-menu a { display: flex; align-items: center; gap: 8px; padding: 8px 10px; font: 400 14px/18px var(--sans); color: var(--body); text-decoration: none; }
.lang-menu a:hover { background: var(--bg-sub); color: var(--ink); }
.tick { width: 12px; color: var(--accent); }

/* ---------- hero banner ---------- */
.hero-banner { position: relative; height: 400px; background: var(--bg-sub); overflow: hidden; }
.hero-banner > img, .hero-banner > video { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.hero-video { height: 560px; background: #333; }
.scrim { position: absolute; inset: 0; background: rgba(0,0,0,.55); }
.hero-over { position: relative; height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; gap: 24px; }
.hero-over h1 { color: #fff; margin: 0; max-width: 920px; }
.video-toggle { position: absolute; right: 24px; bottom: 20px; z-index: 2; background: rgba(255,255,255,.18); color: #fff; border: 0; padding: 4px 10px; font-size: 13px; cursor: pointer; }
.ph-label { position: absolute; left: 50%; top: 50%; transform: translate(-50%,-50%); font: 400 12px/16px var(--sans); color: var(--muted); z-index: 1; }

/* ---------- sections ---------- */
.band-wrap { background: var(--bg); }
.band-wrap.alt { background: var(--bg-sub); }
.band { padding: 72px var(--pad); max-width: var(--page); margin: 0 auto; }
.page-head { padding: 48px var(--pad); max-width: var(--page); margin: 0 auto; }
.band > * + *, .page-head > * + * { margin-top: 24px; }
.band > h2 + p, .page-head > h1 + p { margin-top: 16px; }

/* ---------- type ---------- */
h1 { font: 400 48px/60px var(--serif); color: var(--ink); margin: 0; }
h2 { font: 400 32px/40px var(--serif); color: var(--ink); margin: 0; }
h3 { font: 400 20px/28px var(--cond); color: var(--ink); margin: 0; }
h4 { font: 700 18px/32px var(--serif); color: var(--ink); margin: 0; }
p { margin: 0 0 16px; max-width: var(--measure); }
p:last-child { margin-bottom: 0; }
.lead { font: 400 18px/28px var(--sans); color: var(--body); }
.overview { font: 400 16px/24px var(--sans); color: var(--dim); }
.breadcrumb { font: 400 12px/16px var(--sans); color: var(--muted); margin: 0; }
.display { font: 400 32px/40px var(--serif); color: var(--ink); margin: 0; }
.cta-h2 { font: 400 32px/40px var(--cond); }
blockquote { margin: 24px 0; padding-left: 20px; border-left: 3px solid var(--accent); font: italic 400 18px/28px var(--serif); color: var(--ink); max-width: var(--measure); }
ul, ol { max-width: var(--measure); padding-left: 22px; margin: 0 0 16px; }
li { margin: 0 0 8px; }
code { font: 400 .92em/1.4 ui-monospace, SFMono-Regular, Menlo, monospace; background: var(--bg-sub); padding: 1px 5px; }
pre { background: var(--bg-sub); border: 1px solid var(--line); padding: 16px; overflow-x: auto; }
pre code { background: none; padding: 0; }
hr { border: 0; border-top: 1px solid var(--line); margin: 32px 0; }
.arrow { color: var(--muted); }
.badge { display: inline-flex; align-items: center; padding: 6px 16px; background: var(--bg-sub); border: 1px solid var(--line); font: 400 12px/16px var(--sans); color: var(--body); }

/* ---------- home hero row + portrait ---------- */
.hero-row { display: flex; gap: 48px; align-items: flex-start; }
.hero-row-text { flex: 1; display: grid; gap: 20px; }
.portrait { flex: 0 0 280px; width: 280px; height: 280px; background: var(--bg-sub); border: 1px solid var(--line); overflow: hidden; }
.portrait img { width: 100%; height: 100%; object-fit: cover; }

/* ---------- split row ---------- */
.split-row { display: flex; gap: 64px; align-items: flex-start; }
.split-text { flex: 1 1 768px; display: grid; gap: 20px; }
.split-img { flex: 0 0 480px; width: 480px; height: 300px; background: var(--bg-sub); overflow: hidden; }
.split-img img { width: 100%; height: 100%; object-fit: cover; }

/* ---------- cards ---------- */
/* Cards stay in one row at every width — never wrapped into fewer columns
   or stacked — and scroll horizontally once they don't fit, the same rule
   applied to .v-tabs: a card grid is a parallel set of choices, not a list
   that reads fine broken across lines. */
.card-grid { display: grid; grid-template-columns: repeat(3, minmax(240px, 1fr)); gap: 24px; padding-top: 16px; overflow-x: auto; }
.card { background: var(--bg); border: 1px solid var(--line); text-decoration: none; color: inherit; display: flex; flex-direction: column; }
.card-thumb { height: 200px; background: var(--bg-sub); overflow: hidden; flex: 0 0 auto; }
.card-thumb img { width: 100%; height: 100%; object-fit: cover; }
.card-body { padding: 24px; display: grid; gap: 12px; align-content: start; }
.card .kicker { font: 400 12px/16px var(--sans); color: var(--muted); text-transform: uppercase; letter-spacing: .06em; margin: 0; }
.card h3 { font: 400 20px/28px var(--cond); }
.card p { font: 400 14px/22px var(--sans); color: var(--body); margin: 0; max-width: none; }
a.card:hover { border-color: var(--accent); }

.proof-cards { display: grid; grid-template-columns: repeat(4, 1fr); gap: 24px; padding-top: 16px; }
.proof-card { background: var(--bg-sub); padding: 24px; display: grid; gap: 16px; align-content: start; }
.metric { font: 400 40px/40px var(--cond); color: var(--ink); }
.proof-card p { font: 400 14px/22px var(--sans); color: var(--body); margin: 0; max-width: none; }
.proof-extra { font: 400 16px/24px var(--sans); color: var(--dim); }

.pillars { display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px; padding-top: 16px; }
.pillar { background: var(--bg); border: 1px solid var(--line); padding: 24px; display: grid; gap: 12px; align-content: start; }
.pillar .icon { width: 32px; height: 32px; }
.pillar h3 { font: 400 20px/28px var(--cond); }
.pillar p { font: 400 14px/22px var(--sans); margin: 0; max-width: none; }

/* ---------- buttons ---------- */
.btn { display: inline-flex; align-items: center; justify-content: center; height: 44px; padding: 0 28px; font: 400 16px/20px var(--cond); text-decoration: none; border: 1px solid transparent; cursor: pointer; }
.btn-primary { background: var(--accent); color: #fff; }
.btn-primary:hover { background: #5f83b1; color: #fff; }
.btn-secondary { border-color: var(--accent); color: var(--ink); background: transparent; }
.btn-secondary:hover { background: rgba(114,151,197,.08); }
.hero-over .btn-secondary { color: #fff; border-color: #fff; }
/* Button rows are always 16 apart. The space ABOVE them is set by the parent
   frame's gap in Figma and differs by context, so it is listed out below
   rather than left to a single default.
   Only margin-bottom is zeroed here — zeroing margin outright silently beat
   the band's 24px top margin and left every band CTA flush against the grid. */
.cta-row { display: flex; gap: 16px; flex-wrap: wrap; margin-bottom: 0; }
.hero-over .cta-row { justify-content: center; margin: 0; }

/* ---------- detail-page furniture ---------- */
.meta-row { display: flex; gap: 48px; align-items: flex-start; }
/* 572px is the case-study metrics_table's own Figma width, valid only as a
   flex-basis inside .meta-row's horizontal flex row (table + project info
   side by side). .table-wrap is also the generic class every markdown table
   renders with, including ones sitting directly in .content-column — a
   *vertical* flex column — where that same flex-basis was read as a HEIGHT,
   stretching plain body tables to 572px tall and leaving a blank gap below
   the real content. */
.table-wrap { overflow-x: auto; background: var(--bg); border: 1px solid var(--line); }
.meta-row .table-wrap { flex: 1 1 572px; }
table { border-collapse: collapse; width: 100%; min-width: 480px; }
th, td { text-align: left; padding: 14px 16px; border-bottom: 1px solid var(--line); vertical-align: top; font: 400 14px/22px var(--sans); }
th { font: 700 12px/16px var(--cond); color: var(--muted); text-transform: uppercase; letter-spacing: .06em; background: var(--bg-sub); }
tr:last-child td { border-bottom: 0; }
.project-info { flex: 0 0 300px; display: grid; gap: 16px; margin: 0; }
.project-info dt { font: 400 12px/16px var(--sans); color: var(--muted); text-transform: uppercase; letter-spacing: .06em; }
.project-info dd { margin: 4px 0 0; font: 400 16px/22px var(--sans); color: var(--ink); }
.results { list-style: none; padding: 0; display: grid; gap: 10px; max-width: var(--measure); }
.results li { padding-left: 26px; position: relative; margin: 0; }
.results li::before { content: '\2713'; position: absolute; left: 0; color: var(--accent); }
.plain { list-style: none; padding: 0; }
.plain li { padding-left: 20px; position: relative; }
.plain li::before { content: '\2014'; position: absolute; left: 0; color: var(--muted); }

.faq { max-width: var(--measure); }
.faq details { border-bottom: 1px solid var(--line); }
.faq summary { cursor: pointer; padding: 16px 0; font: 400 20px/28px var(--cond); color: var(--ink); list-style: none; display: flex; justify-content: space-between; gap: 16px; }
.faq summary::-webkit-details-marker { display: none; }
.faq summary::after { content: '+'; color: var(--accent); font: 400 20px/28px var(--sans); }
.faq details[open] summary::after { content: '\2212'; }
.faq details > div { padding-bottom: 16px; }

.byline { display: flex; flex-wrap: wrap; gap: 8px 16px; padding: 14px 0; border-top: 1px solid var(--line); border-bottom: 1px solid var(--line); font: 400 14px/22px var(--sans); color: var(--muted); max-width: var(--measure); }
.byline strong { color: var(--ink); font: 400 16px/22px var(--cond); }
.about-author, .sources { margin-top: 48px; padding-top: 24px; border-top: 1px solid var(--line); max-width: var(--measure); }
.about-author h2, .sources h2 { font: 700 12px/16px var(--cond); color: var(--muted); text-transform: uppercase; letter-spacing: .1em; margin: 0 0 12px; }
.sources { font: 400 14px/22px var(--sans); }

.inline-figure { margin: 24px 0; max-width: var(--measure); }
.inline-figure img { width: 100%; border: 1px solid var(--line); }
.inline-figure figcaption { font: 400 12px/16px var(--sans); color: var(--muted); margin-top: 8px; }

/* ---------- about sidebar ---------- */
.about-row { display: flex; gap: 48px; align-items: flex-start; }
.about-main { flex: 1 1 auto; min-width: 0; }
.about-side { flex: 0 0 300px; display: grid; gap: 32px; }
.side-block h3 { font: 400 12px/16px var(--sans); color: var(--muted); text-transform: uppercase; letter-spacing: .08em; margin: 0 0 8px; }
.side-block .side-title { font: 400 20px/28px var(--cond); color: var(--ink); margin: 0 0 6px; }
.side-block p { font: 400 14px/22px var(--sans); margin: 0; max-width: none; }
.side-photo { width: 100%; aspect-ratio: 1; object-fit: cover; border: 1px solid var(--line); }
.cred { padding: 12px 0; border-top: 1px solid var(--line); }
.cred strong { display: block; font: 400 16px/22px var(--cond); color: var(--ink); }
.cred span { font: 400 14px/22px var(--sans); color: var(--muted); }

/* ---------- footer ---------- */
.site-footer { background: var(--footer-bg); padding: 56px var(--pad) 32px; }
.site-footer > div { max-width: var(--page); margin: 0 auto; display: grid; gap: 32px; }
.foot-cols { display: grid; grid-template-columns: repeat(3, 1fr); gap: 40px; }
.foot-cols h3 { font: 700 18px/28px var(--cond); color: #fff; margin: 0 0 12px; }
.foot-cols a { display: block; margin-bottom: 12px; font: 400 16px/22px var(--sans); color: var(--muted); text-decoration: none; }
.foot-cols a:hover { color: #fff; }
.foot-rule { height: 1px; background: var(--footer-rule); }
.foot-bottom { display: flex; justify-content: space-between; gap: 16px; flex-wrap: wrap; font: 400 12px/16px var(--sans); color: var(--muted); }

/* ---------- Instagram slots ---------- */
.ig-row { display: grid; grid-template-columns: repeat(2, 1fr); gap: 24px; margin: 28px 0; max-width: var(--measure); }
.ig-slot { margin: 0; }
.ig-slot figcaption { font: 400 12px/16px var(--sans); color: var(--muted); margin-top: 8px; }
.ig-slot-box { border: 1px dashed var(--line); background: var(--bg-sub); min-height: 260px; display: grid; place-content: center; justify-items: center; gap: 8px; padding: 24px; text-align: center; }
.ig-tag { font: 700 11px/16px var(--cond); letter-spacing: .12em; text-transform: uppercase; color: var(--accent); }
.ig-pending { font: 400 13px/18px var(--sans); color: var(--muted); }
.ig-slot-box code { font-size: 12px; background: #fff; color: var(--muted); }

/* ---------- calculator ---------- */
.calc { border: 1px solid var(--line); padding: 28px; background: var(--bg); max-width: var(--measure); }
.calc-title { font: 400 20px/28px var(--cond); color: var(--ink); margin: 0 0 4px; }
.calc-intro { font: 400 14px/22px var(--sans); color: var(--muted); margin: 0 0 20px; }
.calc-horizon { font: 400 12px/16px var(--sans); color: var(--muted); margin: 0 0 12px; }
.calc-cards { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; margin-bottom: 24px; }
.calc-card { border: 0; background: var(--bg-sub); padding: 16px; }
.calc-card-head { display: flex; justify-content: space-between; align-items: baseline; gap: 8px; }
.calc-card h4 { font: 400 16px/22px var(--cond); margin: 0; }
.risk { font: 400 11px/16px var(--cond); color: var(--muted); white-space: nowrap; }
.calc-big { font: 400 26px/32px var(--cond); color: var(--ink); margin: 10px 0 2px; }
.calc-sub { font: 400 12px/16px var(--sans); color: var(--muted); margin: 0 0 12px; }
.calc-split { display: flex; gap: 18px; margin: 0; padding-top: 10px; border-top: 1px solid var(--line); }
.calc-split dt { font: 400 10px/14px var(--sans); text-transform: uppercase; letter-spacing: .08em; color: var(--muted); }
.calc-split dd { margin: 2px 0 0; font: 400 14px/20px var(--sans); color: var(--ink); }
.calc-split .pos { color: #2e7d4f; } .calc-split .neg { color: #b3402e; }
.calc-inputs { display: grid; gap: 18px; }
.calc-field { border: 0; padding: 0; margin: 0; }
.calc-field legend, .calc-field > label { font: 400 14px/22px var(--sans); color: var(--ink); display: block; margin-bottom: 8px; }
.chips { display: flex; flex-wrap: wrap; gap: 8px; }
.chip input { position: absolute; opacity: 0; width: 0; height: 0; }
.chip span { display: inline-block; padding: 8px 14px; border: 1px solid var(--line); font: 400 14px/20px var(--sans); cursor: pointer; background: #fff; color: var(--body); }
.chip input:checked + span { background: var(--accent); border-color: var(--accent); color: #fff; }
.chip input:focus-visible + span { outline: 2px solid var(--tab-active); outline-offset: 2px; }
.slider-row { display: flex; align-items: center; gap: 14px; }
.slider-row input[type=range] { flex: 1; accent-color: var(--accent); }
.slider-row output { font: 400 16px/22px var(--cond); color: var(--ink); min-width: 68px; text-align: right; }
.calc-text { border: 1px solid var(--line); padding: 9px 11px; font: 400 15px/20px var(--sans); width: 160px; color: var(--ink); }
.calc-sm { width: 78px; }
.calc-assumptions { margin-top: 22px; border-top: 1px solid var(--line); padding-top: 14px; }
.calc-assumptions summary { cursor: pointer; font: 400 14px/22px var(--sans); color: var(--accent); }
.calc-assume-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; margin-top: 14px; }
.calc-assume-grid label { display: block; font: 400 13px/18px var(--sans); color: var(--muted); margin-bottom: 5px; }
.calc-assume-grid .suffix { margin-left: 5px; color: var(--muted); font-size: 13px; }
.calc-note { font: 400 12px/18px var(--sans); color: var(--muted); margin: 18px 0 0; max-width: none; }

/* ---------- responsive: the wireframe is 1440-only, this is additive ---------- */
@media (max-width: 1100px) {
  :root { --pad: 32px; }
  .proof-cards { grid-template-columns: repeat(2, 1fr); }
  .pillars, .calc-cards { grid-template-columns: repeat(2, 1fr); }
  .hero-row, .split-row, .meta-row, .about-row { flex-wrap: wrap; }
  .split-img, .about-side, .project-info { flex-basis: 100%; width: 100%; }
  h1 { font-size: 38px; line-height: 46px; }
}
@media (max-width: 720px) {
  :root { --pad: 20px; }
  .nav-inner { height: auto; flex-wrap: wrap; padding: 10px 20px; gap: 8px; }
  .nav-links { width: 100%; order: 3; margin-left: 0; overflow-x: auto; }
  .nav-links a { height: 40px; }
  .logo-sub, .logo-rule { display: none; }
  .proof-cards, .pillars, .calc-cards, .foot-cols, .ig-row, .calc-assume-grid { grid-template-columns: 1fr; }
  h1 { font-size: 30px; line-height: 38px; }
  h2 { font-size: 26px; line-height: 34px; }
  .hero-banner { height: 260px; } .hero-video { height: 380px; }
  .portrait { flex-basis: auto; width: 100%; height: auto; aspect-ratio: 1; }
}

@media (prefers-reduced-motion: reduce) {
  * { animation-duration: .001ms !important; transition-duration: .001ms !important; }
}

/* ---------- CTA spacing, per the parent frame gap in the wireframe ---------- */
/* hero-content is VERTICAL gap=28 */
.hero-over { gap: 28px; }
/* home closing-cta: parent gap 20 + cta-buttons padding-top 12 */
.page-home .band-work > .cta-row { margin-top: 32px; }
/* work-with-me bottom-ctas: parent gap 20, no extra padding */
.page-work-with-me .band-work > .cta-row,
.page-work-with-me .band-cta > .cta-row { margin-top: 20px; }
/* speakership booking-ctas: parent gap 40 */
.page-speakership .band-cta > .cta-row,
.page-speakership .band-booking > .cta-row { margin-top: 40px; }
/* page-head CTAs follow their header frame gap (work-hero 24, about-header 16) */
.page-head > .cta-row { margin-top: 24px; }
.page-about .page-head > .cta-row { margin-top: 16px; }

/* ============================================================
   Home hero — layout after goldmansachs.com.
   Content is bottom-left anchored inside the full-bleed media, not centred:
   eyebrow, then a large light-weight serif headline, then the actions,
   all flush to the page gutter. GS gutter is 40; this page uses 64, so the
   proportions are theirs and the gutter stays ours.
   ============================================================ */
.hero-over {
  height: 100%;
  display: flex;
  flex-direction: column;
  align-items: flex-start;      /* GS: left, not centre */
  justify-content: flex-end;    /* GS: bottom, not middle */
  text-align: left;
  gap: 0;
  max-width: var(--page);
  margin: 0 auto;
  padding: 0 var(--pad) 80px;
}
.hero-over .hero-eyebrow {
  font: 400 16px/20px var(--sans);
  letter-spacing: 1px;
  text-transform: uppercase;
  color: rgba(255,255,255,.7);
  margin: 0 0 8px;
}
.hero-over h1 {
  font: 300 80px/80px var(--serif);
  color: rgba(255,255,255,.95);
  max-width: 16ch;              /* GS wraps the headline tight */
  margin: 0 0 48px;             /* GS: 48 from the last text block to actions */
  text-align: left;
}
/* With a description between them, GS puts 32 after the headline and 48 after
   the description — so the 48 moves down a block. */
.hero-over h1:has(+ .hero-desc) { margin-bottom: 32px; }
.hero-over .hero-desc {
  font: 400 18px/28px var(--sans);
  color: rgba(255,255,255,.95);
  max-width: 656px;
  margin: 0 0 48px;
}
/* GS sets 48 between the last text block and the actions. */
.hero-over .cta-row { justify-content: flex-start; margin: 0; }
.hero-over .btn { height: 48px; font-size: 18px; }

@media (max-width: 1100px) {
  .hero-over h1 { font-size: 56px; line-height: 60px; max-width: 20ch; }
  .hero-over { padding-bottom: 56px; }
}
@media (max-width: 720px) {
  .hero-over h1 { font-size: 36px; line-height: 42px; margin-bottom: 24px; }
  .hero-over .hero-desc { font-size: 16px; line-height: 26px; margin-bottom: 32px; }
  .hero-over { padding-bottom: 40px; }
}

/* ---------- nav: stop it wrapping between 720 and 1100 ---------- */
.logo-name, .logo-sub, .nav-links a, .foot-cols a { white-space: nowrap; }
@media (max-width: 1180px) {
  /* Seven tabs plus the lockup no longer fit on one 56px row — give the
     links their own row rather than letting every label wrap mid-word. */
  .nav-inner { height: auto; flex-wrap: wrap; padding: 10px 24px; gap: 8px 16px; }
  .nav-links { width: 100%; order: 3; margin-left: 0; padding-right: 0; gap: 16px; overflow-x: auto; }
  .nav-links a { height: 36px; }
  .lang { margin-left: auto; }
  .lang-btn { height: 32px; }
}

/* ============================================================
   Detail pages — case study and guide, per the Figma EN wireframe.
   Text sits in a 920 column. Guides put a 200 TOC to its left with a 40 gap.
   ============================================================ */
.detail { padding: 56px var(--pad); max-width: var(--page); margin: 0 auto; }
.detail-row { display: flex; gap: 40px; align-items: flex-start; }
.content-column { width: 920px; max-width: 100%; display: flex; flex-direction: column; gap: 32px; }
.page-guides .content-column { gap: 28px; }
.content-column > * { margin: 0; max-width: none; }
/* The column's own prose only. Left as `.content-column p` it outspecified
   every component's own paragraph rules and flattened them — the calculator,
   the spec cards and the visual blocks all lost their vertical rhythm. */
.content-column > p { margin: 0; max-width: none; }
.byline .lines p, .about-author .author-body p { margin: 0; }

/* Guide table of contents */
/* table_of_contents in the Figma reference (165:1998): a 2px left border
   (not 1px), a real bold-black 20px heading (not a small muted caps label),
   and links in accent blue by default, not grey-until-hover. */
.toc { flex: 0 0 200px; width: 200px; padding-top: 90px; position: sticky; top: 16px; }
.toc-inner { padding: 0 28px 24px; border-left: 2px solid var(--line); }
.toc h2 { font: 700 20px/28px var(--sans); color: var(--ink); text-transform: none; letter-spacing: normal; margin: 0 0 10px; }
.toc a { display: block; margin-bottom: 10px; font: 400 14px/22px var(--sans); color: var(--accent); text-decoration: none; }
.toc a:hover { text-decoration: underline; }

/* Body type inside the column */
.content-column h2 { font: 400 32px/40px var(--serif); color: var(--ink); }
.content-column h3 { font: 700 24px/28px var(--cond); color: var(--ink); }
.content-column h4 { font: 400 20px/28px var(--cond); color: var(--ink); }
/* Direct children only — same reason as the margin reset above. Left as a
   descendant selector, this outspecified .v-stat-value/.v-stat-caption and
   every other nested-<p> visual-block class (single-class selectors lose to
   a class+tag descendant selector regardless of source order), flattening
   them all to plain body copy. */
.content-column > p { font: 400 16px/24px var(--sans); color: var(--body); }
.content-column ul, .content-column ol { max-width: none; margin: 0; }
.content-column li { margin: 0 0 10px; }
.truncation-note { font: 400 12px/16px var(--sans); color: var(--muted); }
.crosslink { font: 500 16px/20px var(--sans); color: var(--accent); text-decoration: none; display: inline-block; }

/* "What this shows" — accent callout. Figma (publication-ditto-agile-
   principles, 163:1339, whatThisShows) uses a 4px LEFT border, not the 1px
   all-round border every callout on the site had been given. */
.what-shows { background: #f5f7fb; border: 0; border-left: 4px solid var(--accent); padding: 28px 32px; display: grid; gap: 16px; }
.what-shows h2 { font: 400 48px/56px var(--cond); color: var(--accent); margin: 0; }
.what-shows ul { list-style: none; padding: 0; margin: 0; display: grid; gap: 6px; }
.what-shows li { font: 400 16px/24px var(--sans); color: var(--body); margin: 0; padding-left: 16px; position: relative; }
.what-shows li::before { content: '\2022'; position: absolute; left: 0; color: var(--accent); }

/* Fuller .tldr/.takeaways rules (border, heading, bullets) live further
   down — this file had picked up duplicate definitions across sessions;
   fixed at their single surviving definition instead of adding a third. */

/* author credentials strip */
.byline { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 16px; background: var(--bg-sub); border: 0; padding: 16px 20px; font: 400 14px/22px var(--sans); color: var(--body); max-width: none; }
.byline strong { color: var(--ink); font: 700 16px/22px var(--cond); }

/* results_icons: three cards with a 40x40 accent tile */
.results-band { background: var(--bg); }
.icon-row { display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px; width: 920px; max-width: 100%; }
.result-icon { background: var(--bg-sub); padding: 24px; display: grid; gap: 12px; align-content: start; }
.result-icon .tile { width: 40px; height: 40px; background: var(--accent); }
.result-icon .label { font: 400 14px/22px var(--sans); color: var(--ink); margin: 0; }
.result-icon .token { font: 400 12px/16px var(--sans); color: var(--muted); margin: 0; }

/* related reading */
.related h2 { font: 700 20px/32px var(--cond); color: var(--ink); margin: 0 0 14px; }
.related .card-grid { grid-template-columns: repeat(2, minmax(240px, 1fr)); padding-top: 0; }

/* inline figures inside the column */
.content-column figure { margin: 0; }
.content-column figure img { width: 100%; border: 1px solid var(--line); background: var(--bg-sub); }
.content-column figure figcaption { font: 400 12px/16px var(--sans); color: var(--muted); margin-top: 8px; }

/* Image carousel — a run of related screenshots stepped through one at a
   time instead of stacked. Viewport height is set per-slide by site.js (from
   that slide's own image ratio), so it transitions instead of jumping.
   Fixed at half the content column's own width (920px), not a percentage of
   it, so it reads as a smaller inset object rather than a full-width image. */
.v-carousel { width: 460px; max-width: 100%; }
.v-carousel-viewport { position: relative; overflow: hidden; background: var(--bg-sub); transition: height .3s ease; }
.v-carousel-track { display: flex; align-items: flex-start; transition: transform .3s ease; }
.v-carousel-slide { flex: 0 0 100%; }
.v-carousel-slide img { display: block; width: 100%; border: 0; }
.v-carousel-slide > img { cursor: zoom-in; }
.v-carousel-link-card { display: flex; flex-direction: column; text-decoration: none; color: inherit; background: var(--bg); }
.v-carousel-link-body { display: block; padding: 20px 24px; }
.v-carousel-link-title { display: block; font: 700 20px/28px var(--cond); color: var(--ink); margin-bottom: 8px; }
.v-carousel-link-cta { display: block; font: 400 14px/22px var(--cond); color: var(--accent); }
.v-carousel-link-card:hover .v-carousel-link-cta { text-decoration: underline; }
.v-carousel-arrow { position: absolute; top: 50%; transform: translateY(-50%); width: 36px; height: 36px; border: 0; background: rgba(255, 255, 255, .85); color: var(--ink); font-size: 20px; line-height: 1; cursor: pointer; }
.v-carousel-arrow.prev { left: 12px; }
.v-carousel-arrow.next { right: 12px; }
.v-carousel-arrow:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.v-carousel-dots { display: flex; justify-content: center; gap: 8px; margin-top: 12px; }
.v-carousel-dot { width: 8px; height: 8px; padding: 0; border: 0; border-radius: 50%; background: var(--line); cursor: pointer; }
.v-carousel-dot[aria-current="true"] { background: var(--accent); }

/* Click-to-expand lightbox: white background, full image, caption visible. */
.v-lightbox { position: fixed; inset: 0; z-index: 1000; background: #fff; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 16px; padding: 48px; }
.v-lightbox[hidden] { display: none; }
.v-lightbox img { max-width: 90vw; max-height: 78vh; width: auto; border: 0; object-fit: contain; cursor: zoom-out; }
.v-lightbox-caption { font: 400 14px/22px var(--sans); color: var(--body); max-width: 640px; text-align: center; margin: 0; }
.v-lightbox-close { position: absolute; top: 20px; right: 20px; width: 40px; height: 40px; border: 0; background: var(--bg-sub); color: var(--ink); font-size: 22px; line-height: 1; cursor: pointer; }
.v-lightbox-close:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

.schema-note { background: var(--bg-sub); padding: 16px 20px; font: 400 12px/16px var(--sans); color: var(--muted); display: grid; gap: 6px; }

@media (max-width: 1300px) {
  .content-column { width: auto; flex: 1 1 auto; min-width: 0; }
  .icon-row { width: auto; }
}
@media (max-width: 1000px) {
  .toc { display: none; }
  /* Stays a row of 3 rather than stacking — same rule as .v-tabs/.card-grid:
     these are parallel results, not a list that reads fine broken apart. */
  .icon-row { grid-template-columns: repeat(3, minmax(160px, 1fr)); overflow-x: auto; }
  .content-column h3 { font-size: 20px; line-height: 26px; }
}

/* ---------- hamburger: nav collapses to a drawer on narrow viewports ---------- */
.nav-toggle {
  display: none; align-items: center; justify-content: center;
  width: 40px; height: 40px; margin-left: auto;
  background: none; border: 0; color: var(--ink); cursor: pointer;
}
.bars { display: grid; gap: 5px; width: 22px; }
.bars i { display: block; height: 2px; background: currentColor; transition: transform .18s, opacity .18s; }
.nav-toggle[aria-expanded="true"] .bars i:nth-child(1) { transform: translateY(7px) rotate(45deg); }
.nav-toggle[aria-expanded="true"] .bars i:nth-child(2) { opacity: 0; }
.nav-toggle[aria-expanded="true"] .bars i:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }

@media (max-width: 1000px) {
  .nav-toggle { display: flex; }
  .nav-inner { height: 56px; flex-wrap: nowrap; padding: 0 20px; gap: 0; }
  .nav-links {
    display: none; position: absolute; left: 0; right: 0; top: 100%;
    flex-direction: column; gap: 0; z-index: 30;
    background: var(--accent); border-bottom: 1px solid var(--nav-line);
    padding: 4px 20px 12px; overflow: visible;
  }
  .nav-links.open { display: flex; }
  .nav-links a {
    height: auto; padding: 12px 0; width: 100%;
    border-bottom: 1px solid rgba(0,0,0,.12);
    font: 400 17px/24px var(--cond);
  }
  .nav-links a[aria-current="page"] { border-bottom-color: var(--tab-active); }
  .site-nav { position: relative; }
  .lang { margin-left: 8px; }
  .lang-btn { height: 40px; }
}
@media (max-width: 720px) {
  .nav-inner { padding: 0 20px; }
  .logo-sub, .logo-rule { display: none; }
}

/* ============================================================
   Detail-page blocks, corrected against the guide/publication frames.
   These override the earlier approximations above.
   ============================================================ */

/* author_credentials: 56 avatar + three stacked lines on #f7f7fa */
.byline {
  display: flex; align-items: flex-start; gap: 16px;
  background: var(--bg-sub); border: 0; padding: 16px 20px; max-width: none;
}
.byline .avatar {
  flex: 0 0 56px; width: 56px; height: 56px; background: #fff;
  border: 1px solid var(--line); overflow: hidden;
  display: grid; place-items: center;
}
.byline .avatar img { width: 100%; height: 100%; object-fit: cover; }
.byline .lines { display: grid; gap: 4px; min-width: 0; }
.byline .name { font: 700 20px/28px var(--sans); color: var(--ink); margin: 0; }
.byline .exp { font: 400 14px/22px var(--sans); color: var(--body); margin: 0; }
.byline .meta { font: 400 12px/16px var(--sans); color: var(--muted); margin: 0; }
.byline .meta a { color: var(--muted); }

/* tldr: labelled callout. Figma (publication-ditto-agile-principles,
   163:1339, tldr) uses a 4px LEFT border, not an all-round one, and the
   label is Roboto Condensed Regular, not bold. */
.tldr { background: #f5f7fb; border: 0; border-left: 4px solid var(--accent); padding: 20px 28px; display: grid; gap: 12px; }
.tldr .tldr-label { font: 400 14px/16px var(--cond); color: var(--accent); margin: 0; }
.tldr p { font: 400 16px/24px var(--sans); color: var(--body); margin: 0; }

/* key takeaways: black condensed-bold heading, accent dot bullets, no
   border at all (key_takeaways in the same Figma frame: border-width 0). */
.takeaways { background: var(--bg-sub); border: 0; padding: 16px 28px 24px; display: grid; gap: 14px; max-width: none; }
.takeaways h2 {
  font: 700 18px/32px var(--cond); color: var(--ink);
  text-transform: none; letter-spacing: normal; margin: 0 0 8px;
}
.takeaways ul { display: grid; gap: 14px; }
.takeaways li { font: 400 16px/24px var(--sans); color: var(--body); padding-left: 20px; }
.takeaways li::before {
  content: ''; position: absolute; left: 0; top: 8px;
  width: 7px; height: 7px; border-radius: 50%; background: var(--accent);
}

/* faq: bold condensed questions, grey toggle, hairline rows */
.faq details { border: 0; border-bottom: 1px solid var(--line); }
.faq summary { padding: 20px 0 0; font: 700 20px/28px var(--cond); color: var(--ink); gap: 16px; }
.faq summary::after { content: '+'; color: var(--muted); font: 700 20px/28px var(--sans); }
.faq details[open] summary::after { content: '\2212'; }
.faq details > div { padding: 10px 0 20px; }
.faq details > div p { font: 400 16px/24px var(--sans); color: var(--body); }

/* sources: condensed-bold heading, small grey note */
.sources { margin: 0; padding-top: 16px; border: 0; display: grid; gap: 8px; max-width: none; }
.sources h2 {
  font: 700 20px/28px var(--cond); color: var(--ink);
  text-transform: none; letter-spacing: normal; margin: 0;
}
.sources p, .sources ul, .sources li { font: 400 12px/16px var(--sans); color: var(--muted); margin: 0; }

/* about_author: photo + bio card. Publications only — the guide and case-study
   frames have no such block; their author sits in author_credentials at top. */
.about-author {
  display: flex; gap: 24px; align-items: flex-start;
  background: var(--bg-sub); border: 0; padding: 28px; margin: 0; max-width: none;
}
.about-author .author-photo {
  flex: 0 0 88px; width: 88px; height: 88px; background: #fff;
  border: 1px solid var(--line); overflow: hidden;
}
.about-author .author-photo img { width: 100%; height: 100%; object-fit: cover; }
.about-author .author-body { display: grid; gap: 8px; min-width: 0; }
.about-author h2 {
  font: 700 20px/28px var(--cond); color: var(--ink);
  text-transform: none; letter-spacing: normal; margin: 0;
}
.about-author p { font: 400 14px/22px var(--sans); color: var(--body); margin: 0; }
.about-author a { font: 500 16px/20px var(--sans); color: var(--accent); text-decoration: none; }

/* ---------- language menu vs the hamburger drawer ---------- */
/* The open drawer is z-index 30; the language menu was 20, so it opened behind
   the drawer and only its top edge showed. It must sit above. */
.lang-menu { z-index: 45; }

@media (max-width: 1000px) {
  /* Anchor the menu to the nav bar rather than to .lang — the language button
     is 40px tall inside a 56px bar, so top:100% of .lang landed 8px short. */
  .lang { position: static; }
  .lang-menu { top: 56px; right: 20px; left: auto; }
}

/* ============================================================
   `## visuals` blocks. Specified in the md from the start; the build had been
   treating the field as head-only metadata and dropping all 47 of them.
   Vocabulary is the wireframe's own: #f5f7fb + accent for anything the reader
   is meant to stop on, --bg-sub + --line for neutral panels, square corners.
   ============================================================ */
.content-column > .v-quote,
.content-column > .v-callout,
.content-column > .v-stat,
.content-column > .v-stat-row,
.content-column > .v-compare,
.content-column > .v-concepts,
.content-column > .v-ladder,
.content-column > .v-grid,
.content-column > .v-checklist,
.content-column > .v-accordion,
.content-column > .v-flow,
.content-column > .v-selector,
.content-column > .v-illustration { margin: 32px 0; }

.v-title { font: 700 18px/28px var(--cond); color: var(--ink); margin: 0 0 12px; }

.v-quote { }
.v-quote blockquote { margin: 0; padding-left: 20px; border-left: 3px solid var(--accent); font: italic 400 20px/30px var(--serif); color: var(--ink); }
.v-quote figcaption { font: 400 12px/16px var(--sans); color: var(--muted); margin-top: 8px; padding-left: 23px; }

.v-callout { background: #f5f7fb; border: 0; border-left: 4px solid var(--accent); padding: 20px 28px; font: 400 16px/24px var(--sans); color: var(--body); }

/* block/stat_callout in the Figma reference (publication-ditto-agile-
   principles, 163:1339): border-left 4px not a full border, the value at
   60px (not 48) filling the width of the card, gap 16 between value and
   caption, caption at 16px (not 14) matching the site's base body copy. */
.v-stat { background: #f5f7fb; border: 0; border-left: 4px solid var(--accent); padding: 28px; display: grid; gap: 16px; }
.v-stat-value { font: 400 60px/60px var(--cond); color: var(--accent); margin: 0; }
.v-stat-caption { font: 400 16px/24px var(--sans); color: var(--body); margin: 0; max-width: none; }
.v-stat-row { display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px; }
.v-stat-cell { background: var(--bg-sub); padding: 24px; }
.v-stat-cell .v-stat-value { font-size: 40px; line-height: 44px; }

.v-compare { display: grid; grid-template-columns: repeat(2, 1fr); gap: 24px; }
.v-compare-col { background: var(--bg-sub); border: 0; padding: 24px; }
.v-compare-col img { width: 100%; display: block; margin-bottom: 16px; }
.v-compare-col h3 { font: 700 18px/28px var(--cond); color: var(--ink); margin: 0 0 8px; }
.v-compare-col p { font: 400 14px/22px var(--sans); color: var(--body); margin: 0; max-width: none; }

.v-concepts { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: 24px; }
.v-concept { border-top: 3px solid var(--accent); padding-top: 16px; }
.v-concept-label { font: 700 18px/28px var(--cond); color: var(--ink); margin: 0; }
.v-concept-sub { font: 400 12px/16px var(--sans); color: var(--muted); margin: 0 0 8px; }
.v-concept p { font: 400 14px/22px var(--sans); color: var(--body); margin: 0; max-width: none; }

.v-ladder { list-style: none; padding: 0; margin: 0; display: grid; gap: 12px; }
.v-ladder li { display: flex; gap: 16px; align-items: flex-start; background: var(--bg-sub); padding: 16px 20px; margin: 0; }
.v-rung { flex: 0 0 28px; width: 28px; height: 28px; background: var(--accent); color: #fff; display: grid; place-items: center; font: 700 14px/1 var(--cond); }
.v-rung-label { font: 700 16px/24px var(--cond); color: var(--ink); margin: 0; }
.v-ladder p { font: 400 14px/22px var(--sans); color: var(--body); margin: 0; max-width: none; }

.v-grid { list-style: none; padding: 0; margin: 0; display: grid; grid-template-columns: repeat(2, 1fr); gap: 12px 24px; }
.v-grid li { display: flex; gap: 12px; align-items: baseline; font: 400 15px/24px var(--sans); color: var(--body); margin: 0; }
.v-num { flex: 0 0 22px; width: 22px; height: 22px; border: 1px solid var(--accent); color: var(--accent); display: inline-grid; place-items: center; font: 400 12px/1 var(--cond); }

.v-checklist { background: var(--bg-sub); border: 1px solid var(--line); padding: 24px 28px; }
.v-checklist ul { list-style: none; padding: 0; margin: 0; display: grid; gap: 10px; }
.v-checklist li { font: 400 16px/24px var(--sans); color: var(--body); padding-left: 26px; position: relative; margin: 0; }
.v-checklist li::before { content: "\2713"; position: absolute; left: 0; color: var(--accent); }

.v-accordion { background: var(--bg-sub); border: 0; padding: 8px 28px; }
.v-accordion .v-title { margin: 16px 0 4px; }
.v-accordion details { border-bottom: 1px solid var(--line); }
.v-accordion details:last-child { border-bottom: 0; }
.v-accordion summary { cursor: pointer; padding: 14px 0; font: 700 16px/24px var(--cond); color: var(--ink); list-style: none; display: flex; justify-content: space-between; gap: 16px; }
.v-accordion summary::-webkit-details-marker { display: none; }
.v-accordion summary::after { content: "+"; color: var(--muted); }
.v-accordion details[open] summary::after { content: "\2212"; }
.v-accordion details > div { padding-bottom: 14px; }
.v-accordion p { font: 400 15px/24px var(--sans); color: var(--body); margin: 0; max-width: none; }

.v-flow { list-style: none; padding: 0; margin: 0; counter-reset: flow; display: grid; gap: 8px; }
.v-flow li { counter-increment: flow; position: relative; padding: 14px 20px 14px 52px; background: var(--bg-sub); font: 400 15px/22px var(--sans); color: var(--body); margin: 0; }
.v-flow li::before { content: counter(flow); position: absolute; left: 20px; top: 15px; width: 20px; height: 20px; background: var(--accent); color: #fff; display: grid; place-items: center; font: 700 11px/1 var(--cond); }

/* block/stepped_selector in the Figma reference (153:2107): no outer border
   on the wrapper (the tabs and panel each carry their own), an ACTIVE tab
   that fills solid accent blue (not a light tint with a bottom-border
   accent), and a white number badge that stays the same in both states —
   only the tab's own background and title colour change. Figma's own active
   tab renders its eyebrow in near-black text on that solid blue fill, which
   reads as a mock contrast oversight rather than intent (the bold title
   right below it is white) — carried across to white here instead of
   copying the low-contrast pairing verbatim. */
.v-selector { display: flex; flex-direction: column; gap: 5px; min-width: 0; }
.v-tabs { display: grid; grid-template-columns: repeat(3, 1fr); align-items: stretch; gap: 12px; }
/* Grid stretch alone kept measuring equal (138px) in devtools yet still
   rendering visibly uneven — a min-height, sized for the worst case (a
   two-line eyebrow over a one-line title, at this padding), settles it
   without depending on stretch behaving the same everywhere it's rendered. */
.v-tabs button { text-align: left; background: var(--bg-sub); border: 0; padding: 16px 20px; cursor: pointer; display: grid; align-self: stretch; align-content: start; gap: 8px; min-height: 140px; font: inherit; }
.v-tabs button[aria-selected="true"] { background: var(--accent); }
.v-tabs button:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.v-step { width: 28px; height: 28px; background: #fff; color: var(--muted); display: grid; place-items: center; font: 400 12px/1 var(--sans); }
.v-tab-label { font: 700 20px/28px var(--cond); color: var(--ink); }
.v-tab-sub { font: 400 12px/16px var(--sans); color: var(--muted); }
/* Selected state is carried by the filled tab too, not colour alone. */
.v-tabs button[aria-selected="true"] .v-tab-label,
.v-tabs button[aria-selected="true"] .v-tab-sub { color: #fff; }
.v-panel { background: var(--bg-sub); padding: 24px 28px; display: grid; gap: 10px; }
.v-panel[hidden] { display: none; }
.v-panel-title { font: 700 24px/32px var(--cond); color: var(--ink); margin: 0; }
.v-panel p { font: 400 16px/24px var(--sans); color: var(--body); margin: 0; max-width: none; }

/* A 2-tab selector switching between whole GROUPS (e.g. the Agile
   Manifesto's 4 values vs. its 12 principles) rather than single items —
   the tablist just names the two groups; .v-tabs.v-tabs-groups only needs
   2 columns, not the shared .v-tabs default of 3. Specificity note: compound
   .v-tabs.v-tabs-groups (not a bare .v-tabs-groups) so this beats the plain
   .v-tabs rule regardless of source order — two same-specificity .v-tabs
   rules would otherwise leave it to whichever sits later in the file, which
   bit once already (see the max-width:1000px .v-tabs rule above). */
.v-tabs.v-tabs-groups { grid-template-columns: repeat(2, 1fr); }
.v-tabs.v-tabs-groups button { min-height: auto; padding: 14px 20px; }
/* Each panel lists every item in the active group, not one active item —
   a heading (the value/principle itself) plus its plain-English gloss. */
.v-panel.v-panel-list { grid-template-columns: 1fr; gap: 20px; }
.content-column .v-manifesto-item h3 { font: 700 18px/24px var(--cond); color: var(--ink); margin: 0 0 6px; }
.v-manifesto-item p { font: 400 15px/22px var(--sans); color: var(--body); margin: 0; max-width: none; }

.v-illustration { background: var(--bg-sub); border: 0; padding: 28px; }
.v-illustration svg { width: 100%; height: auto; max-width: 560px; margin: 0 auto; display: block; }
.v-illustration figcaption { font: 400 12px/18px var(--sans); color: var(--muted); margin-top: 16px; }

/* MPF calculator: two outcome cards, then the number the guide is about */
.calc-cards-2 { grid-template-columns: repeat(2, 1fr); }
.calc-out:not(:empty) { margin-bottom: 28px; }
.calc-diff { font: 400 16px/24px var(--sans); color: var(--body); margin: 16px 0 0; padding-top: 16px; border-top: 1px solid var(--line); }
.calc-diff strong { font: 700 24px/32px var(--cond); color: var(--accent); }

@media (max-width: 1000px) {
  .v-stat-row, .v-compare, .v-concepts, .v-grid, .calc-cards-2 { grid-template-columns: 1fr; }
  /* v-tabs is excluded above on purpose: the three tabs are parallel steps
     (1/2/3), not independent cards, so stacking them loses that order/choice
     relationship. Keep them in a row and let the row scroll horizontally
     once the columns hit their floor, instead of collapsing to one column. */
  .v-tabs { grid-template-columns: repeat(3, minmax(200px, 1fr)); overflow-x: auto; }
}

/* build_spec: the three artifacts the guide specs out. Was a raw JSON <pre>. */
.content-column > .v-spec { margin: 32px 0; }
.spec-context { background: #f5f7fb; border: 0; padding: 24px 28px; margin-bottom: 24px; }
.spec-context dl { margin: 0; display: grid; gap: 10px; }
.spec-context dl > div { display: grid; grid-template-columns: 130px 1fr; gap: 16px; }
.spec-context dt { font: 700 13px/22px var(--cond); color: var(--muted); text-transform: uppercase; letter-spacing: .04em; }
.spec-context dd { margin: 0; font: 400 15px/22px var(--sans); color: var(--body); }
.spec-artifacts { display: grid; gap: 20px; }
.spec-card { background: var(--bg-sub); border: 1px solid var(--line); border-top: 3px solid var(--accent); padding: 24px 28px; }
.spec-card h3 { font: 700 20px/28px var(--cond); color: var(--ink); margin: 0 0 12px; }
.spec-label { font: 700 12px/20px var(--cond); color: var(--muted); text-transform: none; letter-spacing: normal; margin: 16px 0 4px; }
.spec-list { margin: 0; padding-left: 20px; }
.spec-list li { font: 400 15px/24px var(--sans); color: var(--body); margin: 0 0 4px; }
@media (max-width: 1000px) { .spec-context dl > div { grid-template-columns: 1fr; gap: 2px; } }
.v-figure { margin: 0; }
.v-figure img { width: 100%; height: auto; border: 1px solid var(--line); }
.v-figure figcaption { font: 400 12px/18px var(--sans); color: var(--muted); margin-top: 10px; }

/* Home hero h1, zh only: the EN headline wraps fine at 80px in 16ch, but zh
   is denser per character (跟得上你出貨速度的中英內容系統 wrapped mid-word,
   "...速度的中" / "英內容系統") and reads oversized at the same size. Smaller
   font, and the md forces the break after 的 via a literal | (see heroFor). */
body.page-home[data-lang="zh"] .hero-over h1 {
  font-size: 52px;
  line-height: 68px;
  max-width: 12em;
}
@media (max-width: 1100px) {
  body.page-home[data-lang="zh"] .hero-over h1 { font-size: 40px; line-height: 52px; }
}
@media (max-width: 720px) {
  body.page-home[data-lang="zh"] .hero-over h1 { font-size: 30px; line-height: 40px; }
}

/* ============================================================
   Case study detail pages — rebuilt against the per-case-study Figma
   frames (case-study-avo-insurance node 157:671, case-study-avos-world
   157:813), which are the faithful reference — richer and more accurate
   than the single rough case-study-detail-hsbc wireframe an earlier pass
   was built from. Single column, metrics band right under the hero (table
   + project details side by side, not buried after the narrative), a
   result-icon row with the icon stacked above its label, and full-width
   related-reading cards with a thumbnail.
   ============================================================ */
.result-icon { background: var(--bg-sub); border-radius: 12px; padding: 24px; display: flex; flex-direction: column; gap: 12px; align-items: flex-start; }
.result-icon .tile { width: 40px; height: 40px; border-radius: 8px; background: var(--accent); color: #fff; display: grid; place-items: center; }
.result-icon .tile svg { width: 22px; height: 22px; }
.result-icon .label { font: 400 14px/22px var(--sans); color: var(--ink); margin: 0; }

.project-info dt { font-family: var(--cond); }
.project-info dd { font: 700 20px/28px var(--sans); }
