/* ── 74 Labs · light blend v2 ─────────────────────────────────────── */

:root{
  --ink:#131211;
  --ink-2:#3B3833;
  --muted:#5E5A53;
  --soft:#8B877E;
  --faint:#A5A096;
  --bone:#F1EEE7;
  --bone-2:#F4F1EB;
  --line:#E2DED4;
  --line-2:#EDE9E0;
  --border:#DCD8CE;
  --tint:19%;            /* strength of the address-pill glow */
  --tintn:.19;           /* the same value, unitless, for the alpha maths */
  /* ── load sequence ──────────────────────────────────────────────
     Reveal blocks run on --d (see .reveal): badge .05, headline .14/.22,
     subhead .32, addresses .40, buttons .52, strip .62, each over .75s.
     The two hand-drawn marks come after, in reading order: the underline
     under the subhead first, then the arrow between the addresses.     */
  --t-underline:1.05s;
  --t-arrow:1.62s;
  --t-arrowhead:2.02s;
  --shell:1440px;
  --navh:72px;          /* the sticky bar, so surfaces can reach behind it */
  --pad:44px;
  --sans:"Archivo",system-ui,-apple-system,"Segoe UI",sans-serif;
  --mono:"Geist Mono",ui-monospace,SFMono-Regular,Menlo,monospace;
}

*,*::before,*::after{box-sizing:border-box}
/* Rubber-band overscroll reveals the canvas, which is painted from <html>.
   A two-stop gradient does NOT work here: backgrounds tile by default, so
   past the top edge the browser repeats the gradient and you see the white
   half again — which is the gap. Kill the bounce instead, and keep the ink
   canvas underneath as the fallback for anything that ignores it.        */
html,body{overscroll-behavior-y:none}
html{scroll-behavior:smooth;background:var(--ink)}
body{
  margin:0;background:#fff;color:var(--ink);
  font-family:var(--sans);font-size:15px;line-height:1.6;
  -webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;
  overflow-x:hidden;
}
img{max-width:100%;display:block}
a{color:inherit;text-decoration:none}
button{font:inherit;cursor:pointer}

.shell{max-width:var(--shell);margin:0 auto;padding-inline:var(--pad);width:100%}

/* ── fine grain over the whole page ──────────────────────────────
   Paper-like texture. Without it a bone-and-white palette renders as
   flat default-white, which is what makes a light page feel cheap.   */
body::after{content:"";position:fixed;inset:0;pointer-events:none;z-index:70;opacity:.038;
  background-size:170px 170px;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='170' height='170'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.82' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E")}

/* counters are wrapped in <i>/<b> only to be addressable — no styling */
[data-count]{font-style:normal;font-weight:inherit;font-variant-numeric:tabular-nums}

/* ── staged entrance ───────────────────────────────────────────── */
.reveal{opacity:0;transform:translateY(16px)}
html.ready .reveal{opacity:1;transform:none;
  transition:opacity .75s cubic-bezier(.2,.7,.25,1) var(--d,0s),
             transform .75s cubic-bezier(.2,.7,.25,1) var(--d,0s)}

/* ── type ── */
.display{font-weight:900;text-transform:uppercase;letter-spacing:-.035em;margin:0}
.h2{font-size:52px;line-height:.98}
.h2-sm{font-size:44px;line-height:1}
/* Headline is locked to exactly two lines. The divisor is the measured width
   of the longest line at font-size 1 (13.6em) plus ~5% slack — so it is a
   property of the words, and a translation that runs longer needs its own.
   Italian measures 15.7 against English's 13.3; 17 keeps the same slack.
   Getting this wrong does not wrap, it overflows the viewport, because the
   spans below are nowrap and .hero is a flex column that lets them grow. */
.hero-h1{--h1-fit:14.3;
  font-size:min(94px, calc((100vw - 100px) / var(--h1-fit)));
  line-height:.95;letter-spacing:-.045em;text-align:center}
[lang="it"] .hero-h1{--h1-fit:17}
.hero-h1>span{display:block;white-space:nowrap}

.center{text-align:center}
.narrow{max-width:640px;margin-inline:auto}
.light{color:#fff}
.lead{color:var(--muted);font-size:17px;line-height:1.65;margin:0}
.ink{color:var(--ink)}
.mono-label{font-family:var(--mono);font-size:11px;letter-spacing:.2em;text-transform:uppercase;
  color:var(--soft);line-height:1.3}
.mono-label.tight{letter-spacing:.14em;font-size:10px}
.mono-label.soft{color:var(--soft)}
.mono-num{font-family:var(--mono);font-size:11px;font-weight:600;letter-spacing:.16em}

/* ── mark on the income phrase ────────────────────────────────────
   A brush swash in the logo's idiom: one smooth curve, constant width,
   round caps, aspect ratio locked so it scales with the type.        */
.hero-sub .inc{font-style:normal;white-space:nowrap;position:relative;display:inline-block;
  color:var(--ink);font-weight:600}
.inc .mark{position:absolute;pointer-events:none;color:var(--ink);left:-.16em;right:-.16em;width:auto}
.mk-u{bottom:-.18em;height:auto}

/* the mark draws itself on, left to right, after the hero has settled */
.inc .mark{clip-path:inset(0 100% 0 0)}
html.ready .inc .mark{animation:drawmark .62s cubic-bezier(.3,.7,.3,1) forwards var(--t-underline)}
@keyframes drawmark{to{clip-path:inset(0 -2% 0 0)}}

/* ── buttons ── */
/* .btn was written for <a>; on a real <button> the UA's default 2px outset
   border comes through as a grey ring around the pill. */
.btn{display:inline-flex;align-items:center;gap:9px;border:0;-webkit-appearance:none;appearance:none;
  border-radius:26px;padding:15px 30px;
  font-size:15px;font-weight:700;white-space:nowrap;transition:transform .15s ease,opacity .15s ease}
.btn:hover{transform:translateY(-1px)}
.btn:active{transform:scale(.97)}
/* sheen sweeping across the dark pills on hover */
.btn-dark,.btn-light{position:relative;overflow:hidden}
.btn-dark::after,.btn-light::after{content:"";position:absolute;top:0;bottom:0;width:55%;
  transform:translateX(-160%) skewX(-18deg);pointer-events:none;
  background:linear-gradient(90deg,transparent,rgba(255,255,255,.26),transparent)}
.btn-light::after{background:linear-gradient(90deg,transparent,rgba(0,0,0,.07),transparent)}
.btn-dark:hover::after,.btn-light:hover::after{animation:sheen .8s cubic-bezier(.3,.7,.3,1)}
@keyframes sheen{to{transform:translateX(320%) skewX(-18deg)}}
.btn-sm{padding:9px 20px;font-size:13px;border-radius:20px}
.btn-dark{background:var(--ink);color:#fff}
.btn-ghost{border:1px solid var(--border);color:var(--ink);font-weight:600}
.btn-ghost .dot{width:6px;height:6px;border-radius:3px;background:var(--ink)}
.btn-light{background:#fff;color:var(--ink)}
.btn-outline{border:1px solid #3A3630;color:#fff}

/* ── marquee ── */
.marquee{background:var(--ink);overflow:hidden;padding:9px 0}
.marquee-track{display:flex;align-items:center;gap:34px;white-space:nowrap;width:max-content;
  animation:slide linear infinite}   /* duration is set from track width in app.js */
.marquee:hover .marquee-track{animation-play-state:paused}   /* so the link is clickable */
.marquee-track span,.marquee-track a{font-family:var(--mono);font-size:12px;letter-spacing:.02em;color:#fff}
/* underlined rather than arrowed, so the clickable words are unmistakable */
.marquee-track a.dim{color:#B0ABA1;transition:color .18s,text-decoration-color .18s;
  text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:4px;
  text-decoration-color:rgba(255,255,255,.28)}
.marquee-track a.dim:hover{color:#fff;text-decoration-color:#fff}
/* MSN butterfly as the divider, in full colour */
.marquee-track img.sep{height:15px;width:auto;flex-shrink:0}
@keyframes slide{from{transform:translateX(0)}to{transform:translateX(-50%)}}

/* ── nav ── */
.nav{position:sticky;top:0;z-index:40;background:transparent;
  transition:background .28s ease,backdrop-filter .28s ease,box-shadow .28s ease}
/* At the very top the nav has nothing to sit on top of, so any translucent
   white just reads as a second, cooler shade of the page — which is the seam
   the divider line used to cover. Stay invisible until content is actually
   passing underneath, then fade in the frost with a soft shadow instead of a
   hard rule. */
html[data-scrolled="1"] .nav{background:rgba(255,255,255,.82);backdrop-filter:blur(12px);
  box-shadow:0 12px 26px -24px rgba(19,18,17,.55)}
.nav-inner{display:flex;align-items:center;justify-content:space-between;padding-block:16px}
.brand img{height:40px;width:auto}
.nav-links{display:flex;align-items:center;gap:24px}
.nav-links a{font-size:13px;color:#4E4B45}
.nav-links a:hover{color:var(--ink)}
.nav-links a.btn{color:#fff}
/* ── language switch ──────────────────────────────────────────────────
   .lang outlived the site's Italian half and sat unused until it came
   back; it is picked up again rather than replaced. Deliberately carries
   no breakpoint: the collapsed nav is being reworked on the mobile branch,
   so where this lands on a small screen belongs to that work, not here. */
.lang{display:inline-flex;align-items:center;font-family:var(--mono);
  font-size:11px;letter-spacing:.04em;color:var(--soft)}
.nav-links .lang a{font-size:inherit;color:var(--soft)}
.nav-links .lang a:hover{color:var(--ink)}
.nav-links .lang a[aria-current]{color:var(--ink);font-weight:600}
.lang a + a::before{content:"/";margin-inline:7px;color:var(--faint);font-weight:400}
.nav-toggle{display:none;background:none;border:0;padding:4px}

/* ── hero ── */
/* Warm vignette so the hero has a centre of gravity instead of flat white,
   plus a fade into the bone band underneath. An angled divider here fought
   the full-bleed creator strip and its flat white did not match the warm
   edge of the vignette, so the seam read as a rendering fault.          */
/* The hero's radial is white at the centre and warm at the edges. It used to
   begin below the sticky nav, so the strip behind the nav stayed body-white
   and the two met in a visible line down each side. Pull the surface up by
   the nav's height and pad it back, so it paints behind the bar and there is
   nothing to see at the top of the page. */
.hero-wrap{margin-top:calc(var(--navh) * -1);padding-top:var(--navh);background:
  linear-gradient(180deg,rgba(241,238,231,0) 58%,rgba(241,238,231,.55) 82%,var(--bone) 100%),
  radial-gradient(78% 68% at 50% 26%,#FFFFFF 0%,#FFFFFF 46%,#F8F5EF 100%)}
.hero{display:flex;flex-direction:column;align-items:center;padding:66px var(--pad) 44px;max-width:var(--shell);margin-inline:auto}
.badge{display:flex;align-items:center;gap:10px;border:1px solid var(--line-2);border-radius:20px;
  padding:7px 18px 7px 12px;font-size:12px;color:#4E4B45;background:#fff;
  box-shadow:0 8px 24px -10px rgba(19,18,17,.28),0 1px 2px rgba(19,18,17,.05)}
/* The "msn" wordmark's baseline sits at 91.7% of the asset's height, so a
   centred 18px logo put it 3.5px below our text baseline. Offset needed is
   4.013 - 0.4174h; at h=16 that is 2.67px, plus 0.5px to balance the optical
   centres (our text has capitals, "msn" is all x-height). 3.17px = .264em. */
.badge-logo{height:16px;width:auto;transform:translateY(-.264em)}
.badge-div{width:1px;height:14px;background:var(--border)}
/* the creator count carries the weight */
.b-num{font-weight:700;color:var(--ink)}

.hero-h1{margin-top:28px}
.hero-sub{margin:26px 0 0;max-width:790px;text-align:center;font-size:21px;line-height:1.58;
  color:var(--muted);text-wrap:balance}
.hero-cta{display:flex;gap:12px;margin-top:34px;flex-wrap:wrap;justify-content:center}

/* ── dividers ── */
.divider{display:block;width:100%;height:60px}

/* ── generic band ── */
.band{background:var(--bone)}
.what{display:flex;flex-direction:column;align-items:center;padding:16px var(--pad) 60px}
.what .h2{margin-top:14px}

/* ── why msn / slides ── */
/* Why MSN carries the bone surface now: the hero fades into it, and white
   slide cards read as objects sitting on paper.                          */
.why{background:var(--bone)}
.why-inner{display:flex;flex-direction:column;align-items:center;
  padding:64px var(--pad) 68px;max-width:var(--shell);margin-inline:auto}
.why .h2{margin-top:14px}
.why .lead{margin-top:16px}
.slides-viewport{width:min(1240px,100%);margin-top:46px;overflow:hidden}
.slides-track{display:flex;transition:transform .55s cubic-bezier(.4,0,.2,1)}
/* No card: the visitor should feel they are still on the page, not looking
   at a slide pasted onto it. The deck framing lives in the controls only. */
.slide{flex:0 0 100%;background:none;border:0;border-radius:0}
.stat{font-size:96px;font-weight:900;letter-spacing:-.05em;line-height:.9}

.ms-head{display:flex;align-items:center;gap:10px}
.ms-head .hr{flex:1;height:1px;background:var(--line-2)}
.ms-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.ms-tile{display:flex;align-items:center;gap:14px;background:#F7F9FC;border:1px solid #E4EAF3;border-radius:14px;padding:20px}
.ms-tile img{flex-shrink:0;width:auto}
.ms-tile b{display:block;font-size:14px;font-weight:700;line-height:18px}
.ms-tile span{font-family:var(--mono);font-size:9px;color:var(--soft)}
.ms-foot{display:flex;align-items:center;gap:12px;background:var(--ink);border-radius:14px;padding:16px 20px;flex-wrap:wrap}
.ms-foot b{color:#fff;font-size:24px;font-weight:900;letter-spacing:-.03em;white-space:nowrap}
.ms-foot span{color:#A9A49A;font-size:14px}

.slides-controls{display:flex;align-items:center;justify-content:space-between;width:min(1352px,100%);margin-top:26px;gap:20px}
.progress{display:flex;gap:6px}
.progress i{width:56px;height:3px;border-radius:2px;background:var(--line);transition:background .3s}
.progress i.on{background:var(--ink)}
.arrows{display:flex;align-items:center;gap:14px}
.arrow{width:34px;height:34px;border-radius:17px;border:1px solid var(--border);background:none;color:var(--soft);
  display:flex;align-items:center;justify-content:center;transition:.15s}
.arrow:hover{border-color:var(--ink);color:var(--ink)}
.arrow-dark{background:var(--ink);border-color:var(--ink);color:#fff}
.arrow-dark:hover{color:#fff;opacity:.85}

/* ── partner band ── */
.partner{background:var(--ink);color:#fff;padding:44px 0}
.partner-inner{display:flex;align-items:center;justify-content:space-between;gap:40px;flex-wrap:wrap}
.partner p{margin:14px 0 0;max-width:600px;color:#A9A49A;font-size:15px}
.partner-right{display:flex;align-items:center;gap:24px}
.ms-chip{background:#fff;border-radius:10px;padding:10px 14px;display:inline-flex;align-items:center}
.ms-chip img{height:20px;width:auto}

/* ── faq ── */
.faq{display:flex;flex-direction:column;align-items:center;padding:56px var(--pad);max-width:var(--shell);margin-inline:auto}
.faq .h2-sm{font-size:48px}
.faq .lead{margin-top:12px}
.acc{width:min(1000px,100%);margin-top:30px}
.acc details{border-top:1px solid var(--line-2)}
.acc details:first-child{border-top:0}
.acc summary{display:flex;align-items:center;justify-content:space-between;gap:20px;padding:20px 24px;
  font-size:16px;font-weight:700;cursor:pointer;list-style:none;border-radius:8px}
.acc summary::-webkit-details-marker{display:none}
.acc details[open] summary{background:var(--bone)}
.acc summary i{width:14px;flex-shrink:0;position:relative;height:14px}
.acc summary i::before,.acc summary i::after{content:"";position:absolute;background:var(--soft);border-radius:1px}
.acc summary i::before{left:0;top:6px;width:14px;height:1.5px}
.acc summary i::after{left:6px;top:0;width:1.5px;height:14px;transition:opacity .2s}
.acc details[open] summary i::after{opacity:0}
.acc details[open] summary i::before{background:var(--muted)}
.acc details>div{padding:14px 24px 22px;color:var(--muted);font-size:15px;line-height:25px;max-width:920px}
.faq-cta{width:min(1000px,100%);margin-top:22px;background:var(--bone);border-radius:10px;padding:26px;
  display:flex;flex-direction:column;align-items:center;gap:8px;text-align:center}
.faq-cta b{font-size:18px;font-weight:800}
.faq-cta p{margin:0;color:var(--muted)}
.faq-cta .btn{margin-top:8px}

/* ── creator results demo ── */
.creator-results{padding:118px var(--pad) 128px;
  background:linear-gradient(180deg,var(--bone) 0%,#F7F5F1 16%,#F7F8F7 58%,#fff 100%)}
.creator-results-inner{width:min(1240px,100%);margin:0 auto}
/* The heading is deliberately the same lockup as "Why MSN?" and "Why work
   with 74 Labs?" — same .display face, same clamp, same tracking, centred —
   so all three section titles read as one system.                          */
.creator-results-head{display:flex;flex-direction:column;align-items:center;text-align:center}
.creator-results-head h2{max-width:16ch;margin:0;font-size:clamp(54px,6.2vw,84px);line-height:.95;
  text-transform:none;text-wrap:balance}
.creator-results-head>p{max-width:52ch;margin:28px 0 0;color:var(--muted);font-size:21px;
  line-height:1.55;text-wrap:pretty}

/* ── testimonial quote cards ──
   Anatomy borrowed from Superpower's member wall: the quote leads at plain
   reading size, a small mono line carries the provenance, and the person
   sits last. No quote glyph, no accent pill — the words do the work.
   Built as a grid so more quotes drop in later; alone, the lead card is
   held to a readable measure rather than stretched across the section.     */
.testimonials{display:grid;grid-template-columns:repeat(auto-fit,minmax(340px,1fr));
  gap:18px;margin-top:60px}
.quote-card{display:flex;flex-direction:column;min-width:0;margin:0;
  padding:24px;border-radius:20px;background:#fff;
  box-shadow:0 0 0 0 rgba(19,18,17,.03),0 2px 10px 0 rgba(19,18,17,.08)}
/* Reusable quote card, kept for the testimonial wall we will add later.    */
.quote-card blockquote{max-width:64ch;margin:0;font-family:Archivo,sans-serif;font-size:17px;
  font-weight:400;line-height:1.55;letter-spacing:-.004em;color:var(--ink)}
.quote-meta{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:20px;
  color:var(--faint);font:400 12.5px/1.4 var(--sans)}
.quote-meta i{font-style:normal;opacity:.7}
.quote-original{display:contents}
.quote-original summary{cursor:pointer;color:var(--faint);text-decoration:underline;
  text-underline-offset:3px;text-decoration-color:rgba(165,160,150,.5)}
.quote-original summary::marker,.quote-original summary::-webkit-details-marker{content:"";display:none}
.quote-original summary:hover{color:var(--muted)}
/* The original sits at the same left edge and full measure as the English
   quote so the two read as the same block, just quieter.                   */
.quote-original>p{flex:1 0 100%;max-width:none;margin:16px 0 0;color:var(--faint);
  font:400 13px/1.7 var(--sans);letter-spacing:normal;text-transform:none}
.quote-by{display:flex;align-items:center;gap:14px;margin-top:26px}
.quote-avatar{width:46px;height:46px;flex:0 0 auto;border-radius:50%;object-fit:cover;
  background:var(--line-2)}
.quote-who{min-width:0;flex:1 1 auto}
.quote-who b{display:block;font-size:15px;font-weight:700;letter-spacing:-.012em}
.quote-who b a{color:inherit;text-decoration:none}
.quote-who b a:hover{text-decoration:underline;text-underline-offset:3px}
.quote-role{display:flex;align-items:center;gap:7px;flex-wrap:wrap;margin-top:5px;
  color:var(--muted);font-size:14px;line-height:1.35}
.quote-role i{font-style:normal;color:var(--faint)}
.quote-yt{flex:0 0 auto;margin-right:-1px;border-radius:5px}
.quote-origin{display:inline-flex;align-items:center;gap:6px;white-space:nowrap}
.quote-flag{font-size:15px;line-height:1}

/* Niche pills. Each niche owns a tint trio (bg / ink / dot) set as custom
   properties, so adding a niche is one line rather than a new rule block.  */
.niche-pill{display:inline-flex;width:fit-content;flex-shrink:0;align-items:center;gap:5px;
  padding:2px 8px;border-radius:16px;background:var(--niche-bg,#EEEAE2);
  color:var(--niche-ink,#4E4A44);font-size:12px;font-weight:500;line-height:20px;
  white-space:nowrap}
.niche-pill::before{content:"";width:5px;height:5px;flex:0 0 auto;border-radius:50%;
  background:var(--niche-dot,currentColor)}
.niche-geography{--niche-bg:#E3EFE5;--niche-ink:#32513A;--niche-dot:#4F8A5E}
.niche-history  {--niche-bg:#F2E9D8;--niche-ink:#6A5331;--niche-dot:#B08D4B}
.niche-cars     {--niche-bg:#E5EAF4;--niche-ink:#394A63;--niche-dot:#5C7CB0}
.niche-gaming   {--niche-bg:#EFE5F2;--niche-ink:#553B60;--niche-dot:#8A63A5}
.niche-tech     {--niche-bg:#E1EEF0;--niche-ink:#2E5257;--niche-dot:#4E8F98}
.niche-food     {--niche-bg:#F5E7E1;--niche-ink:#6A3F33;--niche-dot:#B36C52}
.niche-news     {--niche-bg:#E9E7F2;--niche-ink:#413C61;--niche-dot:#6F68A8}

/* ── platform comparison ──
   Two peer cards, one per platform, each carrying its own source and its own
   reporting window (they genuinely differ — YouTube reports daily, MSN reports
   monthly), so nothing implies the two windows are the same.                */
/* ── case-study switcher ──
   One case study on screen at a time. Adding a creator is a tab plus a
   panel; the panel's internals are the same pcard anatomy every time.    */
.case-tabs{display:flex;justify-content:center;gap:10px;flex-wrap:wrap;margin-top:52px}
.case-tabs button{display:flex;align-items:center;gap:11px;padding:9px 16px 9px 9px;
  border:1px solid var(--line);border-radius:999px;background:rgba(255,255,255,.7);
  color:var(--muted);text-align:left;
  transition:border-color .18s ease,background .18s ease,color .18s ease}
.case-tabs button:hover{border-color:var(--border);background:#fff}
.case-tabs button img{width:34px;height:34px;flex:0 0 auto;border-radius:50%;object-fit:cover}
.case-tabs button span{display:block;font:400 12px/1.3 var(--sans)}
.case-tabs button b{display:block;margin-bottom:2px;color:var(--ink);
  font:700 14px/1.2 var(--sans);letter-spacing:-.015em;text-transform:none}
.case-tabs button[aria-selected="true"]{border-color:var(--ink);background:var(--ink);color:#B4AFA5}
.case-tabs button[aria-selected="true"] b{color:#fff}
.case[hidden]{display:none}

/* A case with no testimonial yet still needs a right-hand column: our own
   plain-language read of the numbers, labelled as ours, never as a quote. */
.cl-summary{display:flex;flex-direction:column;justify-content:center;min-width:0}
.cl-summary p{max-width:60ch;margin:0;color:var(--ink);font-size:16px;line-height:1.62}
.cl-summary p+p{margin-top:14px}
.cl-summary b{font-weight:700}
.cl-summary-note{margin-top:18px!important;max-width:52ch;color:var(--faint)!important;
  font:400 12px/1.55 var(--sans)!important}
.pchart-blue .plot-line{stroke:#1E88C7!important}
.pchart-blue .plot-area{fill:rgba(30,136,199,.10)!important}
.pchart-blue .plot-cursor circle{fill:#1E88C7}
.pcard-tiles strong i{margin-left:2px;font-style:normal;font-size:13px;font-weight:600;
  letter-spacing:0;color:var(--soft)}


/* ── reveal ──
   [data-reveal] already gets .in from the scroll observer in app.js, but the
   motion was only ever defined under .why-us, so these two sections sat dead
   still while the rest of the page animated in. Same curve, same stagger. */
.creator-results [data-reveal],.questions-cta [data-reveal]{opacity:0;transform:translateY(22px);
  transition:opacity .72s cubic-bezier(.2,.7,.25,1) var(--d,0s),
             transform .82s cubic-bezier(.16,1,.3,1) var(--d,0s)}
.creator-results [data-reveal].in,.questions-cta [data-reveal].in{opacity:1;transform:none}

/* ── auto-rotating case studies ──
   The tick bar under the active pill is the whole affordance: it shows the
   rotation is running and how long is left, and it disappears the moment the
   visitor takes over by clicking a tab. */
.case-tabs button{position:relative;overflow:hidden}
.case-tabs button[aria-selected="true"]::after{content:"";position:absolute;left:0;right:0;bottom:0;
  height:2px;background:rgba(255,255,255,.45);transform:scaleX(0);transform-origin:left}
.case-tabs.is-rotating button[aria-selected="true"]::after{
  animation:caseTick var(--tick,9s) linear forwards}
@keyframes caseTick{from{transform:scaleX(0)}to{transform:scaleX(1)}}
@keyframes caseIn{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:none}}
.case.is-entering{animation:caseIn .5s cubic-bezier(.2,.7,.25,1) both}

@media (prefers-reduced-motion:reduce){
  .creator-results [data-reveal],.questions-cta [data-reveal]{opacity:1;transform:none;transition:none}
  .case-tabs.is-rotating button[aria-selected="true"]::after{animation:none}
  .case.is-entering{animation:none}
}

/* ── creator lede ──
   One place where the creator is named: who they are, when they started on
   MSN, the headline result, and what they said. The charts below inherit
   that context instead of repeating it.                                   */
.creator-lede{display:grid;grid-template-columns:minmax(0,340px) minmax(0,1fr);
  gap:44px;margin-top:20px;padding:28px 32px;border-radius:20px;background:#fff;
  box-shadow:0 0 0 0 rgba(19,18,17,.03),0 2px 10px 0 rgba(19,18,17,.08)}
.cl-id{display:flex;flex-direction:column;min-width:0}
.cl-head{display:flex;align-items:center;gap:14px;min-width:0}
.cl-head .quote-avatar{width:52px;height:52px}
.cl-head .quote-who b{font-size:19px;letter-spacing:-.022em}
.cl-head .quote-role{gap:6px;font-size:13px}
.cl-since{display:flex;align-items:center;gap:11px;margin-top:24px;padding-top:22px;
  border-top:1px solid var(--line-2)}
.cl-since svg{flex:0 0 auto;color:var(--soft)}
.cl-since b{display:block;font-size:14px;letter-spacing:-.012em}
.cl-since>div>span{display:block;margin-top:3px;color:var(--soft);font:400 13px/1.35 var(--sans)}
.cl-lift{margin-top:auto;padding-top:24px}
.cl-lift-label{display:block;color:var(--soft);font:600 12px/1.3 var(--sans);letter-spacing:-.005em}
.cl-lift strong{display:block;margin:5px 0 4px;font-size:44px;line-height:1;letter-spacing:-.055em;
  font-variant-numeric:tabular-nums}
.cl-lift-note{display:block;max-width:28ch;color:var(--muted);font-size:13px;line-height:1.4}
/* A multiple says the shape of the curve but not its size, so the cases that
   lead on one carry the cash beside it — same rule the other panels follow. */
.cl-lift-sub{display:block;max-width:32ch;margin-top:13px;padding-top:12px;
  border-top:1px solid var(--line-2);color:var(--muted);font-size:13px;line-height:1.45}
.cl-lift-sub b{color:var(--ink);font-size:17px;letter-spacing:-.024em;
  font-variant-numeric:tabular-nums}
.cl-quote{display:flex;flex-direction:column;justify-content:center;min-width:0;margin:0}
.cl-quote blockquote{max-width:64ch;margin:0;font-family:var(--sans);font-size:19px;
  font-weight:400;line-height:1.55;letter-spacing:-.008em;color:var(--ink)}

.compare-grid{position:relative;display:grid;grid-template-columns:1fr 1fr;gap:20px;margin-top:20px}
.compare-vs{position:absolute;top:50%;left:50%;z-index:2;display:grid;place-items:center;
  width:44px;height:44px;transform:translate(-50%,-50%);border-radius:50%;background:var(--bone-2);
  border:1px solid var(--line);color:var(--soft);
  font:700 11px/1 var(--mono);letter-spacing:.1em;text-transform:uppercase}
.pcard{display:flex;flex-direction:column;min-width:0;margin:0;padding:24px;
  border-radius:20px;background:#fff;
  box-shadow:0 0 0 0 rgba(19,18,17,.03),0 2px 10px 0 rgba(19,18,17,.08)}
.pcard-head{display:flex;align-items:center;justify-content:space-between;gap:14px}
.pcard-brand{display:flex;align-items:center;gap:10px;min-width:0}
.pcard-brand img{width:34px;height:24px;flex:0 0 auto;object-fit:contain;object-position:left}
.pcard-mark{flex:0 0 auto;border-radius:5px}
.pcard-bfly{width:24px!important;height:24px!important}
.pcard-brand b{font-size:17px;letter-spacing:-.022em;white-space:nowrap}
.pcard-brand>span{color:var(--muted);font-size:14px;white-space:nowrap}
.pcard-brand b+span::before{content:"\00b7";margin-right:7px;color:var(--faint)}
.pcard-source{flex:0 0 auto;padding:2px 8px;border-radius:16px;background:var(--bone-2);
  color:var(--soft);font:500 12px/20px var(--sans)}
.pcard-tiles{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;margin-top:22px}
.pcard-tiles>div{min-width:0;padding:12px;border-radius:12px;background:var(--bone-2)}
.pcard-tiles span{display:block;color:var(--soft);font-size:11px;line-height:1.3;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pcard-tiles strong{display:block;margin-top:7px;font-size:20px;line-height:1.05;letter-spacing:-.035em;
  font-variant-numeric:tabular-nums}
.pcard-tiles strong i{margin-left:2px;font-style:normal;font-size:13px;font-weight:600;
  letter-spacing:0;color:var(--soft)}
.pcard-tiles small{display:block;margin-top:6px;color:var(--faint);
  font:500 11px/1.3 var(--sans);letter-spacing:0}

/* charts: one series each, so identity comes from the card header, not a legend */
.pchart{margin:22px 0 0}
.pchart-plot{position:relative;padding-right:44px}
.pchart svg{display:block;width:100%;height:170px;overflow:visible}
.pchart .grid line{stroke:var(--line-2);stroke-width:1;shape-rendering:crispEdges}
.pchart-line .plot-line{fill:none;stroke:#E7352D;stroke-width:2;stroke-linejoin:round;
  stroke-linecap:round;vector-effect:non-scaling-stroke}
.pchart-line .plot-area{fill:rgba(231,53,45,.09);stroke:none}
.plot-cursor[hidden]{display:none}
.plot-cursor line{stroke:var(--faint);stroke-width:1;stroke-dasharray:3 3;vector-effect:non-scaling-stroke}
.plot-cursor circle{fill:#E7352D;stroke:#fff;stroke-width:2;vector-effect:non-scaling-stroke}
.pchart-bars .bar rect{fill:#1E88C7;transition:fill .15s ease}
.pchart-bars .bar:hover rect{fill:#166FA6}
.pchart-bars .bar-zero rect{fill:var(--border)}
.pchart-bars .bar text{fill:var(--muted);font:700 12px/1 var(--sans);text-anchor:middle;
  font-variant-numeric:tabular-nums}
.pchart-y{position:absolute;top:0;right:0;bottom:0;display:flex;flex-direction:column;
  justify-content:space-between;align-items:flex-start;width:44px;padding-left:10px;
  color:var(--faint);font:500 10px/1 var(--mono);letter-spacing:.02em;font-variant-numeric:tabular-nums}
.pchart-y span{transform:translateY(-.4em)}
.pchart-x{display:flex;justify-content:space-between;margin-top:11px;padding-right:44px;
  color:var(--faint);font:500 10px/1 var(--mono);letter-spacing:.02em;font-variant-numeric:tabular-nums}
.pchart-x-months{justify-content:space-around}
.pchart-tip{position:absolute;z-index:3;transform:translate(-50%,-118%);padding:7px 10px;
  border-radius:9px;background:var(--ink);color:#fff;font-size:11px;line-height:1.35;
  white-space:nowrap;pointer-events:none;box-shadow:0 10px 24px -14px rgba(19,18,17,.7)}
.pchart-tip b{display:block;font-size:13px}
.pchart-tip span{color:#B4AFA5;font:400 11px/1.4 var(--sans)}
.pcard-foot{display:flex;align-items:baseline;justify-content:flex-start;gap:14px;flex-wrap:wrap;
  margin-top:18px;padding-top:15px;border-top:1px solid var(--line-2)}
.pcard-foot b{font-size:14px;letter-spacing:-.012em;font-variant-numeric:tabular-nums}
.pcard-foot span{color:var(--faint);font-size:12px}

/* ── proof row ──
   The chart is ours; this is the receipt. Collapsed it is one quiet line;
   opened it embeds the real dashboard in the card, with the full-size
   capture still one click further for anyone who wants to scrutinise it. */
.pproof{margin-top:18px}
.pproof summary{display:flex;align-items:center;gap:12px;padding:12px;cursor:pointer;
  list-style:none;border-radius:12px;background:var(--bone-2);
  transition:background .18s ease,border-radius .2s ease}
.pproof summary::-webkit-details-marker{display:none}
.pproof summary::marker{content:""}
.pproof summary:hover{background:#EEE9DF}
.pproof summary:focus-visible{outline:2px solid var(--ink);outline-offset:2px}
.pproof[open] summary{border-radius:12px 12px 0 0;background:#F1EDE5}
.pproof-check{display:grid;place-items:center;width:21px;height:21px;flex:0 0 auto;
  border-radius:50%;background:#DDEDE1;color:#3D7A50}
.pproof-label{min-width:0;flex:1 1 auto}
.pproof-label b{display:block;font-size:13px;letter-spacing:-.01em}
.pproof-label>span{display:block;margin-top:2px;color:var(--faint);font:400 12px/1.35 var(--sans)}
.pproof-toggle{display:inline-flex;align-items:center;gap:7px;flex:0 0 auto;color:var(--soft);
  font:600 12px/1 var(--sans);letter-spacing:-.005em}
.pproof-toggle i{font-style:normal}
.pproof-toggle svg{transition:transform .22s ease}
.pproof[open] .pproof-toggle svg{transform:rotate(180deg)}
.pproof:not([open]) .t-hide,.pproof[open] .t-show{display:none}
.pproof-shot{padding:0 12px 12px;border-radius:0 0 12px 12px;background:#F1EDE5}
.pproof-shot button{display:block;width:100%;padding:0;overflow:hidden;cursor:zoom-in;
  border:1px solid var(--line);border-radius:10px;background:#fff;
  transition:border-color .18s ease}
.pproof-shot button:hover{border-color:var(--border)}
.pproof-shot button:focus-visible{outline:2px solid var(--ink);outline-offset:2px}
.pproof-shot img{display:block;width:100%;height:auto}
.pproof-shot p{margin:10px 2px 0;color:var(--faint);font:400 11.5px/1.4 var(--sans)}

.zoom{position:fixed;inset:0;z-index:99;display:grid;place-items:center;padding:34px;
  background:rgba(19,18,17,.84);cursor:zoom-out}
.zoom[hidden]{display:none}
.zoom img{max-width:100%;max-height:100%;border-radius:12px;background:#fff;
  box-shadow:0 2px 8px 0 rgba(0,0,0,.06),0 14px 28px 0 rgba(0,0,0,.28)}


@media (max-width:1080px){
  .creator-lede{grid-template-columns:1fr;gap:28px;padding:26px 26px 24px}
  .cl-lift{margin-top:0}
  .compare-grid{grid-template-columns:1fr;gap:44px}
  .compare-vs{top:auto;left:50%;margin-top:-22px}
  .pcard-tiles{grid-template-columns:1fr 1fr}
  .pproof summary{gap:10px;padding:10px 12px}
  .pproof-toggle i{display:none}
}
@media (max-width:720px){
  .creator-results{padding:82px 20px 92px}
  .creator-results-head h2{font-size:50px}
  .quote-card{padding:24px 22px 22px;border-radius:16px}
  .quote-card blockquote{font-size:17px;line-height:1.55}
  .quote-meta{margin-top:18px;font-size:9px;letter-spacing:.07em}
  .quote-role{font-size:13px;gap:6px}
  .case-tabs{margin-top:36px;gap:8px}
  .case-tabs button{padding:7px 13px 7px 7px}
  .creator-lede{margin-top:14px;padding:22px 20px 20px;border-radius:18px}
  .cl-quote blockquote{font-size:17px;line-height:1.55}
  .cl-lift strong{font-size:36px}
  .pcard{padding:20px 18px 18px;border-radius:18px}
  .pcard-head{flex-wrap:wrap;gap:10px}
  .pcard-tiles{gap:7px;margin-top:18px}
  .pcard-tiles strong{font-size:18px}
  .pchart svg{height:140px}
  .pchart-plot{padding-right:38px}
  .pchart-y,.pchart-x{width:38px}
  .pchart-x{padding-right:38px}
  .pchart-bars .bar text{font-size:14px}
  }

/* ── compact questions handoff ── */
.questions-cta{padding:104px var(--pad);background:#fff}
.questions-cta-inner{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:end;
  gap:60px;width:min(1240px,100%);margin:0 auto}
.questions-cta h2{max-width:14ch;margin:15px 0 0;font-size:clamp(48px,5.6vw,76px);
  line-height:.96;text-transform:none;text-wrap:balance}
.questions-cta p{max-width:48ch;margin:24px 0 0;color:var(--muted);font-size:18px;
  line-height:1.6;text-wrap:pretty}
.questions-cta-actions{display:flex;align-items:center;justify-content:flex-end;gap:12px;flex-wrap:wrap}
@media (max-width:800px){
  .questions-cta{padding:72px 20px}
  .questions-cta-inner{grid-template-columns:1fr;align-items:start;gap:34px}
  .questions-cta h2{font-size:48px}
  .questions-cta-actions{justify-content:flex-start}
}

/* ── stat cards ── */
.statcards{display:flex;flex-direction:column;align-items:center;padding:10px var(--pad) 60px}
.statcards .lead{margin-top:12px}
.cards3{display:flex;gap:14px;padding-top:32px;padding-inline:0}
.card{flex:1;background:#fff;border:1px solid var(--line);border-radius:12px;padding:30px;display:flex;flex-direction:column;gap:10px;min-width:0}
.card b{font-size:46px;font-weight:900;letter-spacing:-.04em;line-height:1.2}
.card h3{margin:0;font-size:18px;font-weight:800}
.card p{margin:0;color:var(--muted);font-size:15px;line-height:24px}

/* ── footer ── */
.footer{padding:34px 0 26px}
.footer-top{display:flex;align-items:center;justify-content:space-between;gap:24px;
  padding-bottom:20px;flex-wrap:wrap}
.footer-brand{display:inline-flex;flex:0 0 auto}
.footer-mark{height:40px;width:auto;transition:opacity .18s ease}
.footer-brand:hover .footer-mark{opacity:.72}
.footer-links{display:flex;gap:24px;flex-wrap:wrap}
.footer-links a{font-size:13px;color:#4E4B45}
.footer-links a:hover{color:var(--ink)}
.socials{display:flex;gap:12px}
.socials span{width:16px;height:16px;border-radius:3px;background:#DDD9CF}
.footer-bottom{padding-top:18px;font-size:12px;color:var(--soft)}

/* ── responsive ─────────────────────────────────────────────────── */
@media (max-width:1180px){
  .h2{font-size:42px}
  .h2-sm,.ins-left .h2-sm,.faq .h2-sm{font-size:36px}
  .stat{font-size:72px}
  .insights{flex-direction:column;align-items:stretch;gap:36px}
  .ins-left{flex:1 1 auto;max-width:none}
  .steps-inner{flex-direction:column}
  .steps-left{flex:1 1 auto;max-width:none}
      }
@media (max-width:900px){
  :root{--pad:22px;--navh:64px}
  .nav-links{display:none}
  .nav-toggle{display:block}
  .nav-links.open{display:flex;position:absolute;top:100%;left:0;right:0;background:#fff;
    flex-direction:column;align-items:flex-start;gap:14px;padding:20px 22px;border-bottom:1px solid var(--line-2)}
  .nav-inner{position:relative}
  /* The switcher rides in the stacked menu as its own row. At 11px it read as
     a caption next to 13px links, and the two targets were 18px tall — too
     small to hit. Match the menu's type and pad to a ~42px target; the links
     go inline-block so the padding actually grows the hit area. */
  .nav-links .lang{font-size:13px}
  .nav-links .lang a{display:inline-block;padding-block:11px}
  /* --pad drops to 22 here. Divisor stays --h1-fit (14.3 default) so this
     is unchanged for English and follows the language, as above. */
  .hero-h1{font-size:calc((100vw - 56px) / var(--h1-fit))}
  .hero-sub{font-size:17px}
  .h2{font-size:32px}
  .h2-sm,.ins-left .h2-sm,.faq .h2-sm{font-size:30px}
  .timeline{padding:26px 20px}
  .tl-row{flex-wrap:wrap}
  .tag{order:3;margin-left:68px;margin-top:0}
  .stat{font-size:56px}
  .two-up{flex-direction:column}
  .ms-grid{grid-template-columns:1fr}
  .cards3{flex-direction:column}
  .split{flex-direction:column}
  .panel-kpis{flex-direction:column}
  .panel-kpis>div{border-right:0;border-bottom:1px solid var(--line-2)}
  .tbl th:nth-child(3),.tbl td:nth-child(3){display:none}
  .progress i{width:32px}
  .partner-inner{flex-direction:column;align-items:flex-start}
}
@media (prefers-reduced-motion:reduce){
  *{animation-duration:.001ms !important;animation-iteration-count:1 !important;transition-duration:.001ms !important}
  .reveal{opacity:1 !important;transform:none !important}
  .inc .mark{clip-path:none !important}
  .brush-arrow .ba{stroke-dashoffset:0 !important}
}

/* ═══ Hero buttons ══════════════════════════════════════════════════
   The MSN lockup replaces the word. Its wordmark is knocked out to
   white while the butterfly keeps its colours, which is how Microsoft
   sets it on dark.                                                   */
.btn-primary{gap:8px}
/* Measured: the msn wordmark sat 5.0px below the button's text baseline
   (its baseline is at 91.7% of the asset height). Lift it onto the line.
   Two assets: the knocked-out wordmark for dark fills, the stock one for
   light fills. Showing the wrong one loses the wordmark entirely.      */
.btn-msn{height:19px;width:auto;flex-shrink:0;transform:translateY(-4px)}

/* The secondary is a text link, not a second pill: two matched pills give the
   visitor no signal about which one to press.                              */
.btn-second{border-color:transparent;padding-inline:6px;
  text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:5px;
  text-decoration-color:#C9C3B7}
.btn-second:hover{text-decoration-color:var(--ink)}
.btn-second .dot{display:none}

/* ═══ Creator strip ═════════════════════════════════════════════════
   A fixed grid of tiles that change in place, no marquee. The rail
   clips and the row is built wider than the rail (see app.js), so the
   outer tiles run off both edges at any window size. Multi-stop mask
   so the fade reads as a soft falloff rather than a linear ramp.     */
.herostrip{padding-bottom:52px}
.hs-label{display:flex;align-items:center;justify-content:center;gap:10px;
  font-size:11.5px;letter-spacing:.15em;color:#57534B;margin-bottom:18px}
/* Three steps of weight: the mark at #2A2722 so it reads as the subject,
   the words at #57534B a stop lighter. Tinted assets, not CSS filters,
   so the values are exact.                                            */
.hs-mark{height:24px;width:auto;flex-shrink:0;transform:translateY(-1px)}

.hs-rail{overflow:hidden;
  -webkit-mask-image:linear-gradient(90deg,transparent 0,rgba(0,0,0,.12) 1.5%,
    rgba(0,0,0,.45) 3.5%,rgba(0,0,0,.8) 6%,#000 9%,#000 91%,rgba(0,0,0,.8) 94%,
    rgba(0,0,0,.45) 96.5%,rgba(0,0,0,.12) 98.5%,transparent 100%);
  mask-image:linear-gradient(90deg,transparent 0,rgba(0,0,0,.12) 1.5%,
    rgba(0,0,0,.45) 3.5%,rgba(0,0,0,.8) 6%,#000 9%,#000 91%,rgba(0,0,0,.8) 94%,
    rgba(0,0,0,.45) 96.5%,rgba(0,0,0,.12) 98.5%,transparent 100%)}
.hs-track{display:flex;width:100%;justify-content:center;align-items:stretch;gap:0}

.hs-tile{display:flex;flex-direction:column;align-items:center;gap:8px;flex-shrink:0}
.hs-tile img{border-radius:15px;object-fit:cover;background:#E7E3DA;
  border:1px solid rgba(19,18,17,.07)}
.hs-tile em{font-family:var(--mono);font-size:8.5px;letter-spacing:.06em;
  text-transform:uppercase;color:var(--faint);font-style:normal;text-align:center;line-height:1.25}

/* slot width comes from app.js so the row always overflows the rail;
   the tile grows a little as the slots widen on big screens */
.hs-slot{width:var(--slot,112px);flex-shrink:0;
  transition:opacity .42s ease,transform .42s cubic-bezier(.2,.7,.25,1)}
.hs-slot img{width:clamp(54px, calc(var(--slot,112px) * .48), 76px);
  height:clamp(54px, calc(var(--slot,112px) * .48), 76px)}
.hs-slot[data-on="0"]{opacity:0;transform:translateY(9px) scale(.94)}
.hs-slot[data-on="1"]{opacity:1;transform:none}

/* ═══ The handoff ═══════════════════════════════════════════════════
   Two addresses with a brush arrow between them. The pills carry a
   coloured glow rather than a coloured fill: on a near-white page a
   white pill has nothing to push against, and a halo is the light-mode
   equivalent of what a dark page does with a glow. --tint drives the
   strength; --tintn is the same value unitless, because CSS cannot use
   a percentage inside an alpha calculation.                           */
.plat-url{display:flex;align-items:center;justify-content:center;gap:26px;
  margin-top:28px;flex-wrap:wrap}
.pu-side{display:flex;align-items:center;gap:12px;border-radius:12px;
  padding:14px 18px;background:#fff;
  border:1px solid color-mix(in srgb, #E5484D calc(var(--tint) * 1.7), #fff);
  box-shadow:0 10px calc(20px + var(--tintn) * 70px)
             calc(-12px + var(--tintn) * 10px)
             rgba(229,72,77, calc(.12 + var(--tintn) * 2.2)),
             0 2px 7px rgba(229,72,77, calc(.04 + var(--tintn) * .9))}
.pu-on{border-color:color-mix(in srgb, #2B7CD3 calc(var(--tint) * 1.7), #fff);
  box-shadow:0 10px calc(20px + var(--tintn) * 70px)
             calc(-12px + var(--tintn) * 10px)
             rgba(43,124,211, calc(.12 + var(--tintn) * 2.4)),
             0 2px 7px rgba(43,124,211, calc(.04 + var(--tintn) * 1))}
/* both addresses read the same weight and tone; the colour comes from the pill */
.pu-side code{font-family:var(--mono);font-size:14px;color:var(--muted)}

/* The two lockups need different treatment. YouTube's play button brackets its
   wordmark evenly, so its geometric centre IS its optical centre and box-centring
   is correct. MSN's butterfly rises well above its wordmark, so centring the box
   leaves the wordmark hanging low; that one gets lifted onto the URL baseline. */
.pu-on>img{transform:translateY(-5px)}

/* the arrow is built from the same geometry as the income swash: one smooth
   curve, constant width, round caps, so both hand-drawn marks are one hand */
.brush-arrow{width:110px;height:auto;color:var(--ink);flex-shrink:0}
.brush-arrow .ba{stroke-dasharray:1 1;stroke-dashoffset:1}
html.ready .brush-arrow .ba{animation:drawwire .5s cubic-bezier(.3,.7,.3,1) forwards var(--t-arrow)}
html.ready .brush-arrow .bah{animation-delay:var(--t-arrowhead)}
@keyframes drawwire{to{stroke-dashoffset:0}}

@media (max-width:900px){
  .plat-url{gap:16px}
  .brush-arrow{transform:rotate(90deg);width:74px}
}

/* ── Why MSN heading ───────────────────────────────────────────────
   The official lockup sets "msn" in a light rounded sans, which next to
   Archivo 900 reads as two different sentences. So the butterfly carries
   the brand and the name is typeset in our own face at our own weight.
   The lockup's geometry is kept though, measured off the real asset:
   the butterfly is 2.24x the wordmark's x-height, rises well above it
   and drops 0.15 x-heights below the baseline, with a 0.29 x-height gap.
   Applied literally the butterfly overpowers our much heavier word, so
   it is dialled back to 1.05em while keeping the rise, drop and tuck. */
.why{display:flex;flex-direction:column;align-items:center;
  padding:64px var(--pad) 68px}
.why-h2{display:flex;align-items:baseline;justify-content:center;gap:0;
  text-transform:none;font-size:min(72px, calc((100vw - 120px) / 7.2));line-height:1}
.why-h2 .up{text-transform:uppercase}
.why-h2 .lc{text-transform:none}
/* tucked: the mark overlaps the 'm' slightly, the way the real lockup does */
.bfly{display:inline-flex;position:relative;isolation:isolate;flex-shrink:0;
  align-self:baseline;margin-left:.20em;margin-right:-.03em;transform:translateY(.07em)}
.why-bfly{height:1.05em;width:auto;display:block;position:relative;z-index:1}

/* A blurred copy of the artwork sitting behind itself. Because the glow IS
   the butterfly, every region radiates its own colour: blue under the blue
   wing, green under the green, orange under the orange. A drop-shadow can
   only ever be one flat colour, so it could not do this.                */
.bfly::before{content:"";position:absolute;inset:-8%;z-index:0;
  background:url(assets/logos/msn-butterfly.svg) center/contain no-repeat;
  filter:blur(7px) saturate(1.2);opacity:.42}


/* ── butterfly treatments (prototype only) ─────────────────────────
   drop-shadow follows the alpha silhouette, so the shadow hugs the
   wings rather than boxing them. A halo is four stacked shadows at
   1px offsets, which is the only way to outline an <img> silhouette. */

/* the flat-grey alternatives, kept for comparison */

/* ═══ Slide 01: where the videos actually appear ════════════════════
   Pattern borrowed from Pitch and Intercom on Mobbin: a list where the
   active row is marked, and the panel beside it swaps to match. The
   surfaces are CSS mocks, not images, so they stand in until the real
   screenshots arrive and cost nothing to load.                       */
.surf{margin:0;display:flex;flex-direction:column;background:#fff;
  border:1px solid var(--line);border-radius:14px;overflow:hidden;
  box-shadow:0 18px 44px -26px rgba(19,18,17,.32)}
.surf-bar{display:flex;align-items:center;gap:6px;padding:11px 14px;background:#FAF8F4;
  border-bottom:1px solid var(--line-2);flex-shrink:0}
.surf-bar i{width:7px;height:7px;border-radius:4px;background:#DDD8CC}
.surf-url{margin-left:10px;font-family:var(--mono);font-size:9.5px;color:var(--soft);
  background:#fff;border:1px solid var(--line-2);border-radius:5px;padding:3px 10px}
.surf-body{flex:1;padding:14px;display:grid;gap:10px;min-height:0;align-content:start}

/* a card in any of the mocks; "yours" is the one being sold */
.fc{background:#EFECE6;border-radius:8px;min-height:52px;position:relative}
.fc.yours{background:linear-gradient(160deg,#DCE9FA,#CFE0F7);
  box-shadow:0 0 0 1.5px #2B7CD3, 0 8px 20px -10px rgba(43,124,211,.6)}
.fc.yours span,.wg.yours span,.sr-tag{position:absolute;left:8px;bottom:7px;
  font-family:var(--mono);font-size:8px;letter-spacing:.08em;text-transform:uppercase;
  color:#1F4E85;background:#fff;border-radius:4px;padding:2px 6px}

.sb-feed{grid-template-columns:repeat(3,1fr);grid-auto-rows:132px}
.sb-newtab{grid-template-rows:auto auto}
.nt-search{height:34px;border-radius:17px;background:#F3F1EC;border:1px solid var(--line-2)}
.nt-row{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;grid-auto-rows:104px}
.sb-search{grid-template-rows:auto;gap:8px}
.sr-field{height:32px;border-radius:16px;background:#F3F1EC;border:1px solid var(--line-2);
  display:flex;align-items:center;padding:0 14px;font-family:var(--mono);font-size:10px;color:var(--soft)}
.sr-row{display:flex;align-items:center;gap:11px;position:relative;border-radius:8px;padding:6px}
.sr-row.yours{background:#F4F8FE;box-shadow:0 0 0 1.5px #2B7CD3}
.sr-thumb{width:74px;height:44px;border-radius:6px;background:#EFECE6;flex-shrink:0}
.sr-row.yours .sr-thumb{background:linear-gradient(160deg,#DCE9FA,#CFE0F7)}
.sr-lines{display:flex;flex-direction:column;gap:7px;flex:1}
.sr-lines i{height:7px;border-radius:4px;background:#EFECE6}
.sr-lines i:last-child{width:58%}
.sr-tag{position:static;margin-left:auto}
.sb-widgets{grid-template-columns:1fr 1fr;grid-template-rows:118px 118px auto}
.wg{background:#EFECE6;border-radius:8px;position:relative}
.wg.wide{grid-column:1/-1}
.wg.yours{background:linear-gradient(160deg,#DCE9FA,#CFE0F7);
  box-shadow:0 0 0 1.5px #2B7CD3, 0 8px 20px -10px rgba(43,124,211,.6)}
.wg-bar{grid-column:1/-1;display:flex;gap:8px;justify-content:center;padding-top:2px}
.wg-bar b{width:20px;height:20px;border-radius:6px;background:#E7E3DA}

/* ── layout B: oversized numerals, mocks stacked opposite (Squarespace) ── */
/* ── layout C: every surface visible at once (the Shkeffy deck slide) ── */
@media (max-width:900px){
  }

/* ── the intro block, then one row per surface ─────────────────────
   Each mock sits with its own number and label rather than across from
   a separate list, so the claim and the evidence are one object.     */
.slide-intro{display:flex;flex-direction:column;align-items:center;text-align:center;
  max-width:760px;margin:0 auto 8px}
/* Spelled out, the number is 7.63em wide, so the size is derived from the
   space rather than picked: it fills the column and stops.              */

/* ── the stat, demoted to a side note ──────────────────────────────
   A real odometer, not a number being reassigned every frame. Each digit
   is a strip of 0-9 repeated three times inside a 1em window; the strip
   translates to its final digit on the last cycle. Nothing reflows, the
   commas never move, and the digits settle left to right because each
   reel gets a slightly longer duration than the one before it.       */
.stat-strip{margin:0;padding-top:0;border-top:0}

/* One sentence, with the number carrying the weight. Each phrase sits in a
   clipped line and rises into it, staggered, so the figure arrives rather
   than being counted out digit by digit.                               */
.stat-line{margin:0;font-size:clamp(26px,3.2vw,42px);line-height:1.22;letter-spacing:-.02em}
.rv{display:inline-block;overflow:hidden;vertical-align:bottom}
.rv i{display:inline-block;font-style:normal;font-weight:900;color:var(--ink);
  transform:translateY(108%);transition:transform .95s cubic-bezier(.16,1,.3,1)}
.rv.soft i{font-weight:500;color:var(--muted)}
.stat-line.in .rv i{transform:none}
.stat-line.in .rv:nth-child(2) i{transition-delay:.10s}
.stat-line.in .rv:nth-child(3) i{transition-delay:.19s}

/* Two more claims in the exact 2 Billion+ typographic formula: a heavy fact
   followed inline by its softer explanation. They remain separate rows so a
   chart or proof point can be inserted between them later. */
.msn-perks{width:min(1240px,calc(100% - (var(--pad) * 2)));margin:56px auto 0}
.msn-perk-list{display:flex;flex-direction:column;gap:112px;margin:0}
.msn-perk{width:min(1120px,100%);margin-right:auto;text-align:left;
  font-size:clamp(26px,3.2vw,42px);line-height:1.22;letter-spacing:-.02em;
  text-wrap:balance;opacity:0;transform:translateY(34px);
  transition:opacity .72s ease-out,transform .88s cubic-bezier(.16,1,.3,1)}
.msn-perk:nth-child(even){margin-left:auto;margin-right:0;text-align:right}
.msn-perk dt,.msn-perk dd{display:inline;margin:0;opacity:0;
  transition:opacity .56s ease-out}
.msn-perk dt{font-weight:900;color:var(--ink)}
.msn-perk dt::after{content:": "}
.msn-perk dd{font-weight:500;color:var(--muted);transition-delay:.10s}
.perk-emphasis{position:relative;display:inline-block;white-space:nowrap;
  padding-bottom:.12em;font-weight:700;color:var(--ink)}
.perk-mark{position:absolute;left:-3%;bottom:-.08em;width:106%;
  height:.34em;overflow:visible;pointer-events:none;color:var(--ink);
  clip-path:inset(0 104% 0 0)}
.msn-perk.in{opacity:1;transform:none}
.msn-perk.in dt,.msn-perk.in dd{opacity:1}
.msn-perk.in .perk-mark{animation:perkDoodle .42s cubic-bezier(.3,.7,.3,1) .16s forwards}
@keyframes perkDoodle{to{clip-path:inset(0 -4% 0 0)}}
@media (max-width:800px){
  .msn-perks{width:calc(100% - 40px);margin-top:72px}
  .msn-perk-list{gap:72px}
  .msn-perk{font-size:28px;line-height:1.3;text-wrap:pretty}
  .perk-emphasis-long{display:inline;white-space:normal;padding-bottom:.12em;
    -webkit-box-decoration-break:clone;box-decoration-break:clone;
    background-position:left 100%;background-repeat:no-repeat;background-size:0% .28em;
    background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 300 14'%3E%3Cpath d='M7 9.4C92 5.5 198 5.1 293 6.9' fill='none' stroke='%23131211' stroke-width='9' stroke-linecap='round'/%3E%3C/svg%3E")}
  .perk-emphasis-long .perk-mark{display:none}
  .msn-perk.in .perk-emphasis-long{animation:perkDoodleWrap .42s cubic-bezier(.3,.7,.3,1) .16s forwards}
  @keyframes perkDoodleWrap{to{background-size:100% .28em}}
}
@media (prefers-reduced-motion:reduce){
  .msn-perk,.msn-perk dt,.msn-perk dd{transition:none}
  .perk-mark,.msn-perk.in .perk-mark{animation:none;clip-path:inset(0 -4% 0 0)}
  .perk-emphasis-long,.msn-perk.in .perk-emphasis-long{
    animation:none;background-size:100% .28em}
}

.surf-rows{list-style:none;margin:52px 0 0;padding:0;display:flex;flex-direction:column;gap:40px}
.surf-row{display:grid;grid-template-columns:290px 1fr;gap:44px;align-items:start}
.sr-head{display:flex;align-items:flex-start;gap:18px;padding-top:6px}
.sr-num{font-size:58px;font-weight:900;letter-spacing:-.04em;line-height:.82;
  color:#D9D4C8;flex-shrink:0}
.sr-copy{display:flex;flex-direction:column;gap:4px;padding-top:6px}
.sr-copy b{font-size:22px;font-weight:900;letter-spacing:-.02em;line-height:1.15}
.sr-copy em{font-family:var(--mono);font-size:10px;letter-spacing:.13em;text-transform:uppercase;
  color:var(--soft);font-style:normal}

@media (max-width:900px){
  .surf-row{grid-template-columns:1fr;gap:18px}
  .sr-num{font-size:42px}
  .slide-intro .stat{font-size:62px}
}

/* ═══ The MSN feed, rebuilt ═════════════════════════════════════════
   Not a screenshot: a component built to the real feed's geometry and
   colours, sampled from a capture of msn.com/it-it in dark mode. Only
   our own creator's card carries real content; the neighbours are left
   as neutral placeholders rather than inventing other publishers'
   headlines. Colours: page #242424, card #333, muted card #525252.  */
.surf-msn{background:#242424;border-color:#2E2E2E;padding:0;overflow:hidden}
.msn-top{display:flex;align-items:center;gap:14px;padding:12px 16px}
.msn-mark{height:17px;width:auto;filter:none}
.msn-search{flex:1;background:#fff;border-radius:20px;padding:7px 14px;
  font-size:11px;color:#6B6B6B;font-family:var(--sans)}
.msn-wx{font-size:11px;color:#C8C8C8;font-family:var(--mono)}
.msn-tabs{display:flex;gap:6px;padding:2px 16px 12px;overflow:hidden}
.msn-tabs span{font-size:10.5px;color:#B9B9B9;padding:4px 9px;border-radius:12px;white-space:nowrap}
.msn-tabs .on{background:#3A3A3A;color:#fff}
.msn-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;padding:0 16px 16px}

.mc{background:#333;border-radius:8px;overflow:hidden;display:flex;flex-direction:column}
.mc-thumb{position:relative;aspect-ratio:16/9;background:#525252;overflow:hidden}
.mc-thumb img{width:100%;height:100%;object-fit:cover;display:block}
.mc-thumb.ph{background:#525252}
.mc-src{display:flex;align-items:center;gap:6px;padding:8px 9px 0}
.mc-src img{width:13px;height:13px;border-radius:3px;object-fit:cover}
.mc-src b{font-size:9px;color:#C8C8C8;font-weight:600}
.mc .mc-t,.mc h4{margin:5px 9px 0;font-size:11.5px;line-height:1.3;color:#fff;font-weight:700}
.mc-foot{display:flex;align-items:center;gap:9px;padding:8px 9px 9px;margin-top:auto;
  font-size:9px;color:#9A9A9A}
.mc-follow{margin-left:auto;background:#3E3E3E;color:#D8D8D8;border-radius:9px;padding:2px 7px}
.mc-lines{display:flex;flex-direction:column;gap:6px;padding:9px}
.mc-lines i{height:6px;border-radius:3px;background:#4A4A4A}
.mc-lines i.short{width:55%}

/* the card that matters gets the ring, same language as the other mocks */
.mc-you{box-shadow:0 0 0 1.5px #2B7CD3, 0 10px 26px -12px rgba(43,124,211,.55)}

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

/* ── MSN feed, light mode ──────────────────────────────────────────
   MSN ships both themes. Light sits far more comfortably on a bone page;
   dark reads more like a real screen grab. Toggle to compare.        */
html[data-msn="light"] .surf-msn{background:#F3F3F3;border-color:var(--line)}
html[data-msn="light"] .msn-search{background:#fff;border:1px solid #E3E3E3;color:#616161}
html[data-msn="light"] .msn-wx{color:#3B3B3B}
html[data-msn="light"] .msn-tabs span{color:#4A4A4A}
html[data-msn="light"] .msn-tabs .on{background:#fff;color:#0F6CBD;
  box-shadow:0 0 0 1px #D6D6D6}
html[data-msn="light"] .mc{background:#fff;box-shadow:0 1px 2px rgba(0,0,0,.06)}
html[data-msn="light"] .mc-thumb,html[data-msn="light"] .mc-thumb.ph{background:#E4E4E4}
html[data-msn="light"] .mc .mc-t,.mc h4{color:#171717}
html[data-msn="light"] .mc-src b{color:#616161}
html[data-msn="light"] .mc-foot{color:#767676}
html[data-msn="light"] .mc-follow{background:#EFEFEF;color:#3B3B3B}
html[data-msn="light"] .mc-lines i{background:#E4E4E4}
html[data-msn="light"] .msn-mark{content:url(assets/logos/msn.png)}
html[data-msn="light"] .mc-you{box-shadow:0 0 0 1.5px #2B7CD3,0 10px 26px -12px rgba(43,124,211,.4)}

/* ═══ Edge on a Mac ═════════════════════════════════════════════════
   The point of this row is "your video is on the new tab page", which
   only lands if the frame is recognisably a browser on a desktop. So:
   traffic lights, a tab, an address bar, and the MSN card floating on
   the wallpaper the way Edge actually renders its new tab.          */
.surf-edge{padding:0;background:#F0F0F0;border-color:#DFDFDF;overflow:hidden}
.mac-bar{display:flex;align-items:center;gap:7px;padding:9px 12px 0;background:#DFDFDF}
.tl{width:9px;height:9px;border-radius:5px;flex-shrink:0}
.tl.r{background:#FF5F57}.tl.y{background:#FEBC2E}.tl.g{background:#28C840}
.mac-tab{display:flex;align-items:center;gap:6px;margin-left:8px;background:#F7F7F7;
  border-radius:7px 7px 0 0;padding:6px 14px;font-size:10px;color:#3B3B3B}
.mac-tab img{height:11px;width:auto}
.mac-url{display:flex;align-items:center;gap:8px;padding:8px 12px;background:#F7F7F7;
  border-bottom:1px solid #E3E3E3}
.mac-field{flex:1;background:#fff;border:1px solid #DCDCDC;border-radius:14px;
  padding:5px 12px;font-size:10px;color:#8A8A8A}
.mac-chat{font-size:10px;color:#0F6CBD;flex-shrink:0}
/* the wallpaper Edge shows behind the new tab content */
.mac-stage{padding:16px 16px 0;
  background:linear-gradient(150deg,#8E8AA8 0%,#A9A0AE 38%,#D9A98C 72%,#E8C9A8 100%)}
.edge-card{background:#fff;border-radius:10px 10px 0 0;padding:12px 12px 0;
  box-shadow:0 -1px 0 rgba(0,0,0,.04)}
.edge-top{display:flex;align-items:center;gap:12px;padding-bottom:11px}
.edge-msn{height:15px;width:auto;flex-shrink:0}
.edge-tabs{display:flex;align-items:center;gap:11px;font-size:9.5px;color:#4A4A4A;flex:1}
.edge-tabs b{color:#0F6CBD;font-weight:600;border:1px solid #C9DDF3;border-radius:11px;
  padding:2px 9px;background:#F2F8FE}
.edge-pers{font-size:9px;color:#4A4A4A;border:1px solid #DCDCDC;border-radius:11px;padding:3px 9px}
.edge-grid{display:grid;grid-template-columns:1.6fr 1fr 1fr;gap:9px}
.ec{background:#fff;border:1px solid #EAEAEA;border-radius:8px;overflow:hidden;
  display:flex;flex-direction:column}
.ec-thumb{position:relative;aspect-ratio:16/9;background:#E4E4E4;overflow:hidden}
.ec-thumb img{width:100%;height:100%;object-fit:cover;display:block}
.ec-meta{display:flex;align-items:center;gap:5px;padding:7px 8px 0;font-size:8.5px;color:#616161}
.ec-meta img{width:11px;height:11px;border-radius:2px;object-fit:cover}
.ec-meta b{color:#3B3B3B}
.ec .mc-t,.ec h5{margin:4px 8px 9px;font-size:11px;line-height:1.28;color:#171717;font-weight:700}
.ec .mc-lines i{background:#E4E4E4}
.ec-you{box-shadow:0 0 0 1.5px #2B7CD3}

@media (max-width:900px){ .edge-grid{grid-template-columns:1fr} }

/* ═══ Windows: the whole desktop, not a floating panel ══════════════
   Rebuilt 6 Aug 2026 against a real Windows 11 capture. This used to be
   a grey card over a strip of squares, which read as "another Microsoft
   surface" rather than as Windows. Now the widgets board sits on the
   wallpaper with the Feed / Widgets rail beside it, and the taskbar runs
   the full width underneath: weather bottom left, apps centred, tray and
   clock bottom right. That frame is the whole reason this mock exists,
   which is also why it is exempt from the bottom fade above.         */
.surf-win{padding:0;border-color:var(--line);overflow:hidden;background:#0A3468;
  display:flex;flex-direction:column}

/* flex-basis auto, not 0: with a zero basis the desk contributes nothing to
   the figure's intrinsic height, so in the stacked layout the whole mock
   collapsed to the row height and clipped the creator's card.          */
.win-desk{flex:1 1 auto;display:flex;align-items:stretch;padding:13px 0 0 8px;
  background:
    radial-gradient(120% 95% at 84% 10%, rgba(255,255,255,.50), transparent 56%),
    radial-gradient(80% 68% at 97% 56%, rgba(247,206,86,.70), transparent 62%),
    radial-gradient(105% 82% at 70% 94%, rgba(34,196,196,.72), transparent 64%),
    radial-gradient(130% 120% at 106% 32%, rgba(59,130,246,.78), transparent 72%),
    linear-gradient(158deg,#0A3468,#0F5FA8 42%,#1FA6BE 78%,#8FD6DF)}

/* Feed / Widgets rail, on the wallpaper rather than inside the board */
.win-tabs{width:32px;flex-shrink:0;display:flex;flex-direction:column;align-items:center;
  gap:9px;padding-bottom:12px}
.win-tabs .wt{display:flex;flex-direction:column;align-items:center;gap:2px;
  font-size:6px;color:rgba(255,255,255,.75)}
.win-tabs .wt.on{color:#fff}
.win-tabs .wt i{width:15px;height:15px;border-radius:4px;display:block;
  background:rgba(255,255,255,.32)}
.win-tabs .wt.on i{background:rgba(255,255,255,.92)}
.wt-gear{margin-top:auto;width:11px;height:11px;border-radius:6px;
  border:1.4px solid rgba(255,255,255,.62)}

.win-board{position:relative;flex:0 0 60%;min-width:0;align-self:stretch;background:#F3F3F3;
  border-radius:9px 9px 0 0;padding:10px 10px 0;display:flex;flex-direction:column;gap:9px;
  box-shadow:0 12px 34px -14px rgba(3,20,42,.55)}
/* The board is taller than the desktop shows, exactly like the real one.
   Without this the last row of cards is sliced off square against the
   taskbar; now it dissolves into the board instead.                    */
.win-board::after{content:"";position:absolute;left:0;right:0;bottom:0;height:52px;
  z-index:3;pointer-events:none;background:linear-gradient(transparent,#F3F3F3 78%)}
.win-head{display:flex;align-items:center;gap:8px}
.wh-greet{font-size:9.5px;color:#1A1A1A}
.wh-acts{margin-left:auto;display:flex;align-items:center;gap:7px}
.wa{width:13px;height:13px;border-radius:7px;background:#E2E2E2;display:block;position:relative}
.wa.avatar{background:linear-gradient(140deg,#6E8FB5,#3A5A7D)}
.wa.bell b{position:absolute;right:-2px;top:-2px;width:6px;height:6px;border-radius:3px;
  background:#D93025;font-size:0}

.win-grid{display:grid;grid-template-columns:repeat(3,1fr);grid-auto-rows:max-content;gap:8px;
  flex:1;min-height:0;align-content:start}

/* ── the weather widget, the one card everybody recognises ── */
.wg-wx{background:linear-gradient(155deg,#20507F,#123B63);color:#fff;border-radius:8px;
  padding:9px;display:flex;flex-direction:column;gap:5px}
.wx-head{display:flex;align-items:baseline;gap:6px;font-size:7.5px;opacity:.9}
.wx-head b{font-weight:600}
.wx-head em{font-style:normal;margin-left:auto}
.wx-now{display:flex;align-items:flex-start;gap:6px}
.wx-temp{font-size:30px;font-weight:300;line-height:.9;letter-spacing:-.02em}
.wx-hl{font-size:7px;line-height:1.35;opacity:.9;padding-top:3px}
.wx-icon{margin-left:auto;width:22px;height:22px;border-radius:12px;
  background:radial-gradient(circle at 38% 34%,#FFDA4E,#F3A81C)}
.wx-cond{font-size:8px;opacity:.92}
.wx-note{display:flex;align-items:center;gap:4px;font-size:7px;opacity:.85;
  border-top:1px solid rgba(255,255,255,.18);padding-top:5px}
.wx-note i{width:7px;height:7px;border-radius:4px;background:#FFD34E;display:block}
.wx-hours{display:grid;grid-template-columns:repeat(5,1fr);gap:3px;margin-top:auto}
.wx-hours>span{display:flex;flex-direction:column;align-items:center;gap:3px}
.wx-hours em{font-style:normal;font-size:6px;opacity:.8}
.wx-hours i{width:9px;height:9px;border-radius:5px;display:block;
  background:radial-gradient(circle at 38% 34%,#FFDA4E,#F0A21A)}
.wx-hours b{font-size:7px;font-weight:600}

/* ── photo cards: image, scrim, source, headline ── */
.wp{position:relative;border-radius:8px;overflow:hidden;background:#1A1A1A;min-height:120px}
.wp>img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block}
.wp-scrim{position:absolute;left:0;right:0;bottom:0;padding:8px;display:flex;
  flex-direction:column;gap:4px;background:linear-gradient(transparent,rgba(0,0,0,.82) 62%)}
.wp-src{display:flex;align-items:center;gap:4px;font-size:7px;color:rgba(255,255,255,.92)}
.wp-src i{width:8px;height:8px;border-radius:2px;background:rgba(255,255,255,.7);display:block}
.wp-pill{position:absolute;left:7px;top:7px;background:rgba(0,0,0,.55);color:#fff;
  border-radius:4px;padding:2px 6px;font-size:6.5px}
.wp-src img{width:10px;height:10px;border-radius:3px;object-fit:cover}
.wp-src b{font-weight:600}
.wp-t{margin:0;font-size:10.5px;line-height:1.28;color:#fff;font-weight:700}
.wp-you{box-shadow:0 0 0 1.5px #2B7CD3}
.mc-lines.light i{background:rgba(255,255,255,.85)}

/* ── article cards ── */
.wc{background:#fff;border-radius:8px;padding:8px;display:flex;flex-direction:column;gap:6px;
  box-shadow:0 1px 2px rgba(0,0,0,.06)}
.wc-img{position:relative;display:block;aspect-ratio:16/9;border-radius:6px;overflow:hidden;
  background:#E4E4E4}
.wc-img img{width:100%;height:100%;object-fit:cover;display:block}
.wc-src{display:flex;align-items:center;gap:5px;font-size:7.5px;color:#616161}
.wc-src img{width:10px;height:10px;border-radius:3px;object-fit:cover}
.wc-src b{font-weight:600;color:#1A1A1A}
.wc-src.ph i{display:block;width:56px;height:6px;border-radius:3px;background:#E4E4E4}
.wc-t{margin:0;font-size:10.5px;line-height:1.28;color:#171717;font-weight:700}
.wc-you{box-shadow:0 0 0 1.5px #2B7CD3, 0 1px 2px rgba(0,0,0,.06)}
.wc-wide{grid-column:1 / span 2}
.wc-eyebrow{display:flex;align-items:center;gap:4px;font-size:7px;color:#616161}
.wc-eyebrow i{width:8px;height:8px;border-radius:4px;display:block;
  background:linear-gradient(140deg,#6FD3E8,#8A6BE2)}
.wc-inside{font-size:7.5px;color:#616161}
.mc-lines.big i{height:11px;border-radius:5px}
.wc-tall{padding:0;overflow:hidden}
.wc-tall .wc-img{height:100%;min-height:96px;border-radius:8px}

/* ── the taskbar ── */
.win-taskbar{display:flex;align-items:center;gap:10px;padding:0 10px;height:36px;
  flex-shrink:0;border-top:1px solid rgba(20,50,90,.08);
  background:#D7E2F7}
/* The sun is a flat disc, so CSS reproduces it exactly — a bitmap would
   add weight without adding fidelity. The tray icons opposite are a crop,
   because the wifi arcs and the battery do not survive being redrawn.  */
.tb-wx{display:flex;align-items:center;gap:6px;width:152px;flex-shrink:0}
.tb-sun{width:15px;height:15px;border-radius:8px;display:block;flex-shrink:0;
  background:radial-gradient(circle at 38% 34%,#FFDA4E,#F3A81C)}
.tb-wx>span{display:flex;flex-direction:column;line-height:1.2}
.tb-wx b{font-size:7.5px;font-weight:600;color:#1A1A1A}
.tb-wx em{font-style:normal;font-size:7px;color:#4A4A4A}
/* The app strip is a crop of a real Windows 11 taskbar rather than icons
   redrawn by hand: marabel asked for one-to-one, and traced vectors were
   never going to be exact on Firefox or the Store mark. The image carries
   its own background, so the bar below uses the gradient sampled from the
   same screenshot and the strip blends into it with no visible seam.   */
.tb-apps{flex:1;align-self:stretch;display:flex;align-items:center;justify-content:center}
.tb-strip{height:100%;width:auto;display:block}

/* Tray icons and the bell are unmatted crops of a real taskbar, so they
   composite onto the bar colour with correct antialiasing. The clock stays
   as text: baking it in would have hard-coded 11:11 AM 1/11/2025 against
   the board's own 14:45, and Windows sets it in the UI font, not mono. */
.tb-tray{display:flex;align-items:center;gap:7px;width:152px;flex-shrink:0;
  justify-content:flex-end}
/* Both crops share one vertical band with padding around the glyphs, so the
   height here is the band, not the icon: 22px of band renders ~12px of icon,
   which is the ratio a real 48px taskbar uses.                          */
.tb-sys{height:22px;width:auto;display:block}
.tb-bell{height:22px;width:auto;display:block}
.tb-clock{display:flex;flex-direction:column;align-items:flex-end;line-height:1.2;
  font-family:"Segoe UI",-apple-system,system-ui,sans-serif}
.tb-clock b{font-size:8px;font-weight:400;color:#1A1A1A}
.tb-clock em{font-style:normal;font-size:8px;color:#1A1A1A}

/* Narrow: the wallpaper is decoration, the board is the content, so the
   board takes the width and the third column goes rather than shrinking
   every card below reading size.                                      */
@media (max-width:900px){
  .win-board{flex:1}
  .win-grid{grid-template-columns:repeat(2,1fr)}
  .wc-wide{grid-column:1 / span 2}
  .wc-tall{display:none}
}

/* ═══ Bing, videos tab ══════════════════════════════════════════════
   Search results, so the query and the active Videos tab have to be in
   shot. Sourced "MSN · iMOTORI" rather than YouTube: this row is about
   MSN distribution, and the real page shows whichever platform hosts
   the video.                                                         */
.surf-bing{padding:0;background:#1B1B1B;border-color:#2E2E2E;overflow:hidden}
.bg-top{display:flex;align-items:center;gap:12px;padding:11px 14px}
.bg-ms{width:14px;height:14px;object-fit:contain;flex-shrink:0}
.bg-field{flex:1;background:#2B2B2B;border:1px solid #3A3A3A;border-radius:16px;
  padding:6px 14px;font-size:10.5px;color:#D8D8D8}
.bg-signin{font-size:9.5px;color:#B9B9B9;border:1px solid #3A3A3A;border-radius:4px;padding:3px 9px}
.bg-tabs{display:flex;align-items:center;gap:14px;padding:0 14px 10px;
  border-bottom:1px solid #2A2A2A;font-size:9.5px;letter-spacing:.06em;text-transform:uppercase}
.bg-tabs span{color:#9A9A9A}
.bg-tabs b{color:#fff;font-weight:700;padding-bottom:7px;margin-bottom:-11px;
  border-bottom:2px solid #4CA6FF}
.bg-safe{margin-left:auto;text-transform:none;letter-spacing:0;font-size:9px}
.bg-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;padding:12px 14px 14px}

.bv{display:flex;flex-direction:column;gap:6px}
.bv-thumb{position:relative;aspect-ratio:16/9;border-radius:6px;overflow:hidden;background:#333}
.bv-thumb img{width:100%;height:100%;object-fit:cover;display:block}
.bv-dur{position:absolute;right:5px;bottom:5px;background:rgba(0,0,0,.78);color:#fff;
  border-radius:3px;padding:1px 5px;font-size:8px;font-family:var(--mono)}
.bv .mc-t,.bv h5{margin:0;font-size:10.5px;line-height:1.3;color:#fff;font-weight:700}
.bv-src{display:flex;align-items:center;gap:5px;font-size:8.5px;color:#B9B9B9}
.bv-msn{height:9px;width:auto}
.bv-meta{font-size:8.5px;color:#8A8A8A}
.bv .mc-lines{padding:0;gap:5px}
.bv .mc-lines i{background:#333}
.bv-you .bv-thumb{box-shadow:0 0 0 1.5px #2B7CD3}

html[data-msn="light"] .surf-bing{background:#fff;border-color:var(--line)}
html[data-msn="light"] .bg-field{background:#fff;border-color:#DCDCDC;color:#1A1A1A;
  box-shadow:0 1px 4px rgba(0,0,0,.08)}
html[data-msn="light"] .bg-signin{color:#3B3B3B;border-color:#DCDCDC}
html[data-msn="light"] .bg-tabs{border-bottom-color:#E3E3E3}
html[data-msn="light"] .bg-tabs span{color:#616161}
html[data-msn="light"] .bg-tabs b{color:#0F6CBD;border-bottom-color:#0F6CBD}
html[data-msn="light"] .bv-thumb,html[data-msn="light"] .bv .mc-lines i{background:#E4E4E4}
html[data-msn="light"] .bv .mc-t,.bv h5{color:#171717}
html[data-msn="light"] .bv-src{color:#616161}
html[data-msn="light"] .bv-meta{color:#767676}

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

/* The Windows mock is the exception: its bottom edge is the taskbar, which
   is the whole reason that mock exists. Fading it defeats the point.     */
.surf-win{-webkit-mask-image:none !important;mask-image:none !important}

/* ═══ Surfaces: one white, soft edges ═══════════════════════════════
   Every mock now sits on the same #FFFFFF and fades out at the bottom
   instead of ending in a hard rectangle, so it reads as a window into
   the software rather than a screenshot pasted onto the page.       */
.surf{border:0 !important;border-radius:16px;
  box-shadow:0 34px 70px -34px rgba(19,18,17,.42), 0 2px 10px rgba(19,18,17,.06);
  -webkit-mask-image:linear-gradient(#000 76%, rgba(0,0,0,.35) 93%, transparent 100%);
  mask-image:linear-gradient(#000 76%, rgba(0,0,0,.35) 93%, transparent 100%)}
.surf-msn,.surf-bing,.surf-win,.surf-edge{background:#fff}

/* ── Bing, in detail ── */
.bg-top{gap:10px;padding:12px 16px 10px}
.bg-field{position:relative;background:#fff;border:1px solid #DCDCDC;border-radius:18px;
  padding:7px 16px;font-size:11px;color:#1A1A1A;box-shadow:0 1px 5px rgba(0,0,0,.07)}
.bg-pts{font-size:10px;color:#3B3B3B}
.bg-signin{background:#F1F1F1;border:0;color:#3B3B3B}
.bg-tabs{gap:16px;padding:0 16px 9px;border-bottom:1px solid #E8E8E8}
.bg-chips{display:flex;gap:8px;padding:11px 16px 0;overflow:hidden}
.chip{display:flex;align-items:center;gap:6px;background:#fff;border:1px solid #E3E3E3;
  border-radius:20px;padding:4px 12px 4px 4px;font-size:9.5px;color:#1A1A1A;white-space:nowrap;
  box-shadow:0 1px 3px rgba(0,0,0,.05)}
.chip i{width:17px;height:17px;border-radius:9px;background:#E0E0E0;display:block}
.bg-main{display:grid;grid-template-columns:1.35fr 1.15fr .8fr;gap:10px;padding:11px 16px 0}
.bv-hero{display:flex;flex-direction:column;gap:5px}
.bv-hero .bv-thumb{aspect-ratio:16/9;border-radius:8px}
.bv-hero h5{margin:0;font-size:11.5px;line-height:1.28;color:#171717;font-weight:700}
.bv-hero p{margin:0;font-size:9.5px;line-height:1.4;color:#616161}
.bv-panel{background:#F5F3F0;border-radius:9px;padding:9px;display:flex;flex-direction:column;gap:7px}
.bv-ph{font-size:9.5px;font-weight:700;color:#171717}
.bv-item{display:flex;gap:8px;align-items:flex-start}
.bv-mini{position:relative;width:56px;height:34px;border-radius:5px;background:#E0E0E0;flex-shrink:0}
.bv-mini i{position:absolute;left:3px;top:3px;background:rgba(0,0,0,.75);color:#fff;
  border-radius:2px;padding:0 3px;font-size:7px;font-style:normal;font-family:var(--mono)}
.bv-item .mc-lines{flex:1;padding:0;gap:5px}
.bv-vert{display:grid;grid-template-columns:1fr 1fr;gap:7px}
.bv-vert span{aspect-ratio:9/16;border-radius:6px;background:#E0E0E0;display:block}
.bg-grid{grid-template-columns:repeat(5,1fr);padding:12px 16px 18px}

html[data-msn="dark"] .surf-bing{background:#1B1B1B}
html[data-msn="dark"] .bg-field{background:#2B2B2B;border-color:#3A3A3A;color:#D8D8D8}
html[data-msn="dark"] .bv-panel{background:#242424}
html[data-msn="dark"] .bv-ph,html[data-msn="dark"] .bv-hero h5{color:#fff}
html[data-msn="dark"] .chip{background:#2B2B2B;border-color:#3A3A3A;color:#D8D8D8}
html[data-msn="dark"] .chip i,html[data-msn="dark"] .bv-mini,
html[data-msn="dark"] .bv-vert span{background:#3A3A3A}


/* ═══ MSN feed at its real geometry ═════════════════════════════════
   Every value here is measured, not estimated. Grid from the Edge new-tab
   HTML export; type and image metrics read off the live page via computed
   styles in the Orca browser:
     card      300x304 (1u) / 612x304 (2u), radius 8px, no shadow
     image     300x157 on a 1u; a 2u card is 612x304, image-filled
     headline  20px / 26px / w600   (24px / 32px on a 2u)
     provider  12px / 16px / w400
     family    Segoe UI                                              */
.feed-scale{position:relative;overflow:hidden}
.feed-true{width:1548px;transform-origin:top left;background:#fff;
  font-family:'Segoe UI',system-ui,sans-serif;
  border-radius:10px 10px 0 0;padding:14px 14px 0}
.ft-nav{display:flex;align-items:center;gap:20px;padding:2px 4px 16px;font-size:15px;color:#171717}
.ft-msn{height:24px;width:auto;flex-shrink:0;margin-right:6px}
.ft-nav b{color:#0F6CBD;font-weight:600;border:1px solid #C9DDF3;border-radius:16px;
  padding:5px 15px;background:#F2F8FE}
.ft-nav span{color:#333}
.ft-pers{margin-left:auto;border:1px solid #DCDCDC;border-radius:16px;padding:5px 14px;font-size:14px}
.ft-grid{display:grid;grid-template-columns:repeat(5,300px);gap:12px}
.fc2{width:293px;height:304px;background:#fff;border-radius:8px;overflow:hidden;
  display:flex;flex-direction:column}
.fc2.w2{width:598px;grid-column:span 2}
.fc2-img{height:157px;background:#E4E4E4;position:relative;flex-shrink:0}
.fc2-img img{width:100%;height:100%;object-fit:cover;display:block}
.fc2-src{height:16px;margin:14px 14px 0;border-radius:8px;background:#E9E9E9;width:120px}
.fc2-src.real{display:flex;align-items:center;gap:8px;background:none;width:auto;height:auto}
.fc2-src.real img{width:20px;height:20px;border-radius:4px;object-fit:cover}
.fc2-src.real span{font-size:12px;line-height:16px;font-weight:400;color:#616161}
.fc2-hl{margin:12px 14px;display:flex;flex-direction:column;gap:9px}
/* placeholder bars sized to the real 26px line-height */
.fc2-hl i{height:14px;border-radius:7px;background:#E9E9E9;display:block}
.fc2-hl i.s{width:62%}
.fc2-real{margin:10px 0;font-size:20px;line-height:26px;font-weight:600;color:#171717}
.fc2-you{box-shadow:0 0 0 2px #2B7CD3}
html[data-msn="dark"] .feed-true{background:#242424}
html[data-msn="dark"] .ft-nav{color:#fff}
html[data-msn="dark"] .ft-nav span{color:#D8D8D8}
html[data-msn="dark"] .fc2{background:#333;box-shadow:none}
html[data-msn="dark"] .fc2-img,html[data-msn="dark"] .fc2-src,
html[data-msn="dark"] .fc2-hl i{background:#4A4A4A}
html[data-msn="dark"] .fc2-real{color:#fff}

/* the real feed is four content columns plus a right rail */
/* 1548 minus the feed's 14px side padding, or the rail clips */
.ft-body{display:grid;grid-template-columns:1208px 300px;gap:12px;align-items:start}
.ft-grid{display:grid;grid-template-columns:repeat(4,293px);gap:12px}
.fc2{height:304px}
.fc2-body{padding:0 14px;display:flex;flex-direction:column;flex:1}
.fc2-you{box-shadow:0 0 0 2px #2B7CD3;border-radius:8px}
.fc2-src{margin:14px 0 0}
.fc2-hl{margin:12px 0}
.fc2-act{display:flex;gap:14px;margin-top:auto;padding-bottom:13px}
.fc2-act i{width:30px;height:9px;border-radius:5px;background:#E9E9E9;display:block}
/* a wide card is one image with the headline over it */
.fc2-fill .fc2-img{height:100%}
.fc2-over{position:absolute;left:0;right:0;bottom:0;padding:16px;display:flex;
  flex-direction:column;gap:9px;background:linear-gradient(transparent,rgba(0,0,0,.55))}
/* a 2u headline is 24px / 32px */
.fc2-over>i{height:17px;border-radius:9px;background:rgba(255,255,255,.85);display:block}
.fc2-over>i.s{width:55%}
.fc2-act.light i{background:rgba(255,255,255,.6)}
/* the list cards, "Suggested for you" and "Top stories" */
.fc2-list{padding:14px;gap:12px;justify-content:flex-start}
.fc2-list b{font-size:16px;font-weight:600;color:#171717}
.lc-row{display:flex;align-items:center;gap:10px}
.lc-av{width:26px;height:26px;border-radius:13px;background:#E9E9E9;flex-shrink:0}
.lc-row .mc-lines{flex:1;padding:0;gap:7px}
.lc-row .mc-lines i{height:11px;background:#E9E9E9}
/* right rail */
.ft-rail{display:flex;flex-direction:column;gap:12px;width:300px}
.rw{border-radius:8px;padding:14px;display:flex;flex-direction:column;gap:6px}
.rw-wx{background:linear-gradient(160deg,#22364F,#16283C);color:#fff;height:304px}
.rw-city{font-size:14px;opacity:.9}
.rw-temp{font-size:48px;font-weight:700;line-height:1}
.rw-sub{font-size:12px;opacity:.8}
.rw-hours{display:flex;gap:8px;margin-top:auto}
.rw-hours i{flex:1;height:74px;border-radius:6px;background:rgba(255,255,255,.14);display:block}
.rw-games{background:#fff;box-shadow:0 0 0 1px #EDEDED;height:304px}
.rw-games b,.rw-mkt b{font-size:15px;color:#171717}
.rw-tiles{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-top:4px}
.rw-tiles i{aspect-ratio:1;border-radius:7px;background:#E4E4E4;display:block}
.rw-mkt{background:#fff;box-shadow:0 0 0 1px #EDEDED}
.mk{display:flex;justify-content:space-between;font-size:13px;color:#3B3B3B;padding:5px 0;
  border-bottom:1px solid #F0F0F0}
.mk em{font-style:normal;font-weight:600}
.mk .up{color:#0B7A3B}.mk .dn{color:#C4314B}
.ft-btn{border:1px solid #DCDCDC;border-radius:16px;padding:5px 14px;font-size:14px}
.ft-btn:first-of-type{margin-left:auto}
.ft-pers{display:none}
html[data-msn="dark"] .fc2-list b,html[data-msn="dark"] .rw-games b,
html[data-msn="dark"] .rw-mkt b{color:#fff}
html[data-msn="dark"] .rw-games,html[data-msn="dark"] .rw-mkt{background:#333;box-shadow:none}
html[data-msn="dark"] .fc2-act i,html[data-msn="dark"] .lc-av,
html[data-msn="dark"] .lc-row .mc-lines i,html[data-msn="dark"] .rw-tiles i{background:#4A4A4A}
/* every card carries a real 74 Labs channel, so the feed has the density
   of the real thing without borrowing anyone else's photography */
.fc2-img img{width:100%;height:100%;object-fit:cover;display:block}
.ov-src{font-size:13px;color:rgba(255,255,255,.9);margin-bottom:2px}

/* ── overnight comparison: real creator imagery vs blank placeholders ──
   Both come from the same markup; blank mode just hides the photography,
   so the two are identical in every other respect.                    */
html[data-feed="blank"] .fc2:not(.fc2-you) .fc2-img img{display:none}
html[data-feed="blank"] .fc2:not(.fc2-you) .fc2-src.real img{display:none}
html[data-feed="blank"] .fc2:not(.fc2-you) .fc2-src.real span{
  display:block;width:110px;height:12px;border-radius:6px;background:#E9E9E9;
  color:transparent;overflow:hidden}
html[data-feed="blank"] .ov-src{display:none}

/* Windows photo cards follow the same toggle as the Edge feed, so the two
   mocks never disagree about whether creator artwork is showing.       */
html[data-feed="blank"] .wp:not(.wp-you){background:#E4E4E4}
html[data-feed="blank"] .wp:not(.wp-you)>img,
html[data-feed="blank"] .wp:not(.wp-you) .wp-pill,
html[data-feed="blank"] .wp:not(.wp-you) .wp-src{display:none}
html[data-feed="blank"] .wp:not(.wp-you) .wp-scrim{background:none;top:0;justify-content:flex-end}
html[data-feed="blank"] .mc-lines.light i{background:#D2D2D2}
html[data-msn="dark"][data-feed="blank"] .fc2:not(.fc2-you) .fc2-src.real span{background:#4A4A4A}

/* ── accessibility ──────────────────────────────────────────────────
   There were no focus styles at all, so the page was unusable by
   keyboard. Ring is drawn in ink so it reads on both bands.        */
:focus-visible{outline:2px solid var(--ink);outline-offset:3px;border-radius:4px}
.btn:focus-visible{outline-offset:4px}
.skip{position:absolute;left:-9999px;top:0;z-index:200;background:var(--ink);color:#fff;
  padding:12px 20px;border-radius:0 0 10px 0;font-size:14px;font-weight:700}
.skip:focus{left:0}

.mc-t{margin:0}

/* ═══ Why work with us ═══════════════════════════════════════════════
   A compact translation of the agency pitch into the 74 Labs system:
   compare ownership and workload, summarize the value, show the process,
   then substantiate visibility with the direct-access creator panel. */
.why-us{width:min(1240px,100%);margin-top:112px;padding-top:88px;text-align:left}
.why-us [data-reveal]{opacity:0;transform:translateY(24px);
  transition:opacity .7s ease-out,transform .82s cubic-bezier(.16,1,.3,1)}
.why-us [data-reveal].in{opacity:1;transform:none}
.why-us-head .mono-label{color:var(--soft)}
.why-us-title{max-width:16ch;margin-top:17px;font-size:clamp(54px,6.2vw,84px);
  line-height:.95;text-transform:none;text-wrap:balance}
.why-us-head>p{max-width:52ch;margin:28px 0 0;color:var(--muted);
  font-size:21px;line-height:1.55;text-wrap:pretty}

.why-us-compare{display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);
  align-items:center;gap:32px;margin-top:58px;padding:30px 34px;border:1px solid var(--line);
  border-radius:20px;background:rgba(255,255,255,.74);box-shadow:0 20px 55px -46px rgba(19,18,17,.45)}
.why-us-compare>div{display:flex;flex-direction:column;gap:8px;min-width:0}
.why-us-compare>div>span{font-family:var(--mono);font-size:10px;letter-spacing:.18em;
  text-transform:uppercase;color:var(--soft)}
.why-us-compare b{max-width:32ch;font-size:21px;line-height:1.35;letter-spacing:-.018em}
.why-us-plus{display:grid;place-items:center;width:42px;height:42px;border-radius:50%;
  background:var(--ink);color:#fff;font-size:25px;font-weight:600;line-height:1}

.why-us-benefits{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));margin:70px 0 0;
  border-top:1px solid var(--line);border-bottom:1px solid var(--line)}
.why-us-benefits>div{min-width:0;padding:38px 34px 42px}
.why-us-benefits>div:first-child{padding-left:0}
.why-us-benefits>div:last-child{padding-right:0}
.why-us-benefits>div+div{border-left:1px solid var(--line)}
.why-us-benefits dt>span{display:block;margin-bottom:23px;font-family:var(--mono);
  font-size:10px;font-weight:500;letter-spacing:.16em;color:var(--faint)}
.why-us-benefits dt{font-size:28px;font-weight:900;line-height:1.08;letter-spacing:-.035em}
.why-us-benefits dd{margin:14px 0 0;color:var(--muted);font-size:16px;line-height:1.65;text-wrap:pretty}

.why-us-detail{display:grid;grid-template-columns:minmax(0,.78fr) minmax(0,1.22fr);
  align-items:start;gap:72px;margin-top:96px}
.why-us-process,.creator-panel{min-width:0}
.why-us-process-head h3{max-width:12ch;margin:14px 0 0;font-size:44px;line-height:1.02;
  letter-spacing:-.04em;text-wrap:balance}
.why-us-process ol{list-style:none;margin:39px 0 0;padding:0}
.why-us-process li{display:grid;grid-template-columns:38px minmax(0,1fr);gap:18px;
  padding:24px 0;border-top:1px solid var(--line)}
.why-us-process li:last-child{border-bottom:1px solid var(--line)}
.why-us-process li>span{padding-top:3px;font-family:var(--mono);font-size:10px;
  letter-spacing:.14em;color:var(--faint)}
.why-us-process li b{display:block;font-size:18px;line-height:1.3;letter-spacing:-.015em}
.why-us-process li p{margin:7px 0 0;color:var(--muted);font-size:15px;line-height:1.58;text-wrap:pretty}

.creator-panel{overflow:hidden;border:1px solid rgba(43,124,211,.45);border-radius:24px;
  background:#151515;color:#fff;box-shadow:0 34px 70px -42px rgba(8,18,34,.72)}
.creator-panel-top{display:flex;align-items:center;justify-content:space-between;gap:18px;
  min-height:58px;padding:0 19px;border-bottom:1px solid rgba(255,255,255,.09)}
.creator-panel-top>span{display:flex;align-items:center;gap:9px;font-size:13px;font-weight:700}
.creator-panel-top img{width:20px;height:20px;flex-shrink:0}
.creator-panel-top em{border:1px solid rgba(121,178,245,.38);border-radius:20px;padding:5px 10px;
  background:rgba(43,124,211,.12);color:#9CC9FF;font-family:var(--mono);font-size:8px;
  font-style:normal;letter-spacing:.12em;text-transform:uppercase}
.creator-panel-shell{display:grid;grid-template-columns:112px minmax(0,1fr);min-height:516px}
.creator-panel-nav{display:flex;flex-direction:column;gap:6px;padding:17px 11px;
  border-right:1px solid rgba(255,255,255,.08);background:#101010}
.creator-panel-nav span,.creator-panel-nav b{border-radius:7px;padding:9px 10px;color:#888;
  font-size:10px;line-height:1.2;font-weight:500}
.creator-panel-nav b{background:rgba(43,124,211,.16);color:#B8D8FF}
.creator-panel-main{min-width:0;padding:17px}
.creator-panel-kpis{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:9px}
.creator-panel-kpis>div{min-width:0;min-height:78px;padding:12px;border:1px solid rgba(255,255,255,.08);
  border-radius:10px;background:#1D1D1D}
.creator-panel-kpis span{display:block;color:#858585;font-size:8px;letter-spacing:.08em;text-transform:uppercase}
.creator-panel-kpis b{display:block;margin-top:13px;font-size:16px;line-height:1.1;color:#F5F5F5}
.creator-panel-chart{position:relative;overflow:hidden;height:246px;margin-top:12px;padding:15px;
  border:1px solid rgba(255,255,255,.08);border-radius:12px;background:#1B1B1B}
.creator-panel-chart>div:first-child{position:relative;z-index:3;display:flex;align-items:center;
  justify-content:space-between;gap:14px}
.creator-panel-chart>div:first-child>b{font-size:12px}
.creator-panel-chart>div:first-child>span{display:flex;align-items:center;gap:6px;color:#8C8C8C;font-size:8px}
.creator-panel-chart>div:first-child i{width:7px;height:7px;border-radius:50%;background:#3479E9}
.creator-panel-chart>div:first-child i+*{margin-left:4px}
.creator-panel-chart>div:first-child i:nth-of-type(2){background:#E85C58}
.creator-bars{position:absolute;z-index:1;left:16px;right:16px;bottom:26px;height:145px;
  display:flex;align-items:flex-end;gap:7px;border-bottom:1px solid rgba(255,255,255,.08);
  background:repeating-linear-gradient(to top,transparent 0 35px,rgba(255,255,255,.045) 36px)}
.creator-bars i{flex:1;height:var(--bar);border-radius:3px 3px 0 0;background:#3479E9;opacity:.56}
.creator-panel-chart>svg{position:absolute;z-index:2;left:16px;right:16px;bottom:24px;
  width:calc(100% - 32px);height:120px;overflow:visible}
.creator-panel-chart>svg path{fill:none;stroke:#EF625D;stroke-width:3;stroke-linecap:round;stroke-linejoin:round}
.creator-panel-foot{display:flex;flex-wrap:wrap;gap:7px;margin-top:12px}
.creator-panel-foot span{border-radius:20px;padding:6px 10px;background:#202020;color:#A8A8A8;
  font-family:var(--mono);font-size:7.5px;letter-spacing:.06em;text-transform:uppercase}

@media (max-width:1100px){
  .why-us-detail{grid-template-columns:1fr;gap:62px}
  .why-us-process{max-width:720px}
  .creator-panel{width:min(820px,100%)}
}
@media (max-width:800px){
  .why-us{margin-top:84px;padding-top:64px}
  .why-us-title{font-size:48px}
  .why-us-head>p{font-size:18px}
  .why-us-compare{grid-template-columns:1fr;padding:24px;gap:20px}
  .why-us-plus{width:34px;height:34px;font-size:20px}
  .why-us-benefits{grid-template-columns:1fr;margin-top:52px}
  .why-us-benefits>div,.why-us-benefits>div:first-child,.why-us-benefits>div:last-child{
    padding:30px 0}
  .why-us-benefits>div+div{border-left:0;border-top:1px solid var(--line)}
  .why-us-benefits dt>span{margin-bottom:15px}
  .why-us-detail{margin-top:68px}
  .why-us-process-head h3{font-size:38px}
}
@media (max-width:560px){
  .creator-panel-shell{display:block;min-height:0}
  .creator-panel-nav{display:none}
  .creator-panel-main{padding:12px}
  .creator-panel-chart{height:220px}
  .creator-panel-kpis b{font-size:14px}
}
@media (prefers-reduced-motion:reduce){
  .why-us [data-reveal]{opacity:1;transform:none;transition:none}
}

/* Listicle demo: the section title borrows the logo-replacement move from
   Why MSN, while the reasons use numbered hand-drawn seals rather than the
   reference site's green icon list. */
.why-us-head{display:flex;justify-content:center}
.why-us-title{display:flex;align-items:center;justify-content:center;gap:.14em;
  max-width:none;margin-top:0;white-space:nowrap;text-align:center}
.why-us-logo{display:inline-flex;align-items:center;justify-content:center;width:1.1143em;height:1em;
  flex-shrink:0;background:currentColor;
  -webkit-mask:url("assets/logos/74labs-heading.png") center/contain no-repeat;
  mask:url("assets/logos/74labs-heading.png") center/contain no-repeat}
.why-us-logo img{display:none}
.why-us-list{display:grid;grid-auto-rows:1fr;margin:74px 0 0}
.why-us-list>div{display:grid;grid-template-columns:minmax(0,.86fr) minmax(0,1.14fr);
  align-items:center;gap:58px;padding:31px 0}
.why-us-list dt{display:grid;grid-template-columns:52px minmax(0,1fr);align-items:center;
  gap:18px;min-width:0}
.why-us-list dt>span{position:relative;isolation:isolate;display:grid;place-items:center;
  width:42px;height:42px;color:var(--bone);font-size:17px;font-weight:900;line-height:1}
.why-us-list dt>span::before{content:"";position:absolute;inset:-3px;z-index:-1;
  background:center/100% 100% no-repeat
  url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 48 44'%3E%3Cpath d='M5.5 23C5 11 13 4.5 26 4C39 3.7 45 11.5 43.5 24.5C42 36 34 40.5 21.5 39.5C10 38.8 5.8 33 5.5 23Z' fill='%23131211' stroke='%23131211' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  filter:drop-shadow(0 7px 10px rgba(19,18,17,.15))}
.why-us-list dt>b{min-width:0;font-size:27px;line-height:1.1;letter-spacing:-.032em}
.why-us-list dd{max-width:48ch;margin:0;color:var(--muted);font-size:18px;line-height:1.55;
  text-wrap:pretty}
@media (max-width:800px){
  .why-us-title{font-size:36px;gap:.1em}
  .why-us-list{display:block;margin-top:52px}
  .why-us-list>div{grid-template-columns:1fr;gap:15px;padding:27px 0}
  .why-us-list dt{grid-template-columns:44px minmax(0,1fr);gap:13px}
  .why-us-list dt>span{width:36px;height:36px;font-size:15px}
  .why-us-list dt>b{font-size:23px}
  .why-us-list dd{padding-left:57px;font-size:16px;line-height:1.6}
}
@media (max-width:390px){
  .why-us-title{font-size:32px}
}

/* ═══ Surfaces: compact layouts ═════════════════════════════════════
   Four full-height rows made this section a scroll. These pack the same
   four surfaces into roughly half the height by pairing a numbered
   column with a tight, slightly overlapping stack.                   */

/* ── STACK: numbered column left, mocks stacked tight on the right ── */
html[data-lay="stack"] .surf-rows{display:grid;grid-template-columns:250px 1fr;
  column-gap:52px;gap:0}
html[data-lay="stack"] .surf-row{display:contents}
html[data-lay="stack"] .sr-head{grid-column:1;align-self:center;padding:26px 0}
html[data-lay="stack"] .surf{grid-column:2;margin-top:-34px;position:relative}
html[data-lay="stack"] .surf-row:first-child .surf{margin-top:0}
/* Each card in front of the one above it, so the stack reads top-to-bottom
   like a hand of cards being dealt. The old order was reversed, which put a
   card's transparent masked tail OVER the next card's opaque top edge, and
   the grey placeholders behind it ghosted through.                       */
html[data-lay="stack"] .surf-row:nth-child(1) .surf{z-index:1}
html[data-lay="stack"] .surf-row:nth-child(2) .surf{z-index:2}
html[data-lay="stack"] .surf-row:nth-child(3) .surf{z-index:3}
html[data-lay="stack"] .surf-row:nth-child(4) .surf{z-index:4}

/* Softening the seam. A real backdrop blur is not available here: every
   .surf carries a fade mask, and a masked ancestor is a backdrop root, so
   backdrop-filter inside one can only sample that card's own pixels — not
   the panel behind it. Instead the lower card starts dissolving before the
   overlap begins, so nothing is sharp at the join, and the card in front
   casts a wider, softer shadow onto it.                                */
html[data-lay="stack"] .surf{
  -webkit-mask-image:linear-gradient(#000 78%, rgba(0,0,0,.42) 92%, transparent 100%);
  mask-image:linear-gradient(#000 78%, rgba(0,0,0,.42) 92%, transparent 100%)}
html[data-lay="stack"] .surf{box-shadow:
  0 -22px 46px -18px rgba(19,18,17,.38),
  0 -1px 0 rgba(19,18,17,.06),
  0 24px 50px -26px rgba(19,18,17,.4)}
html[data-lay="stack"] .surf-row:first-child .surf{box-shadow:
  0 -1px 0 rgba(19,18,17,.06), 0 24px 50px -26px rgba(19,18,17,.4)}

html[data-lay="stack"] .sr-num{font-size:44px}

/* ── ZIG-ZAG ──────────────────────────────────────────────────────
   Sides alternate and the rows pull into each other. The mocks are made
   narrower rather than cropped: every one of them is responsive, so a
   narrower box reflows the interface instead of slicing through a card,
   which is what made the cropped version look broken. Each surface gets
   a hairline ring so an overlap reads as one screen in front of another
   rather than two images bleeding together.                          */
html[data-lay="zigzag"] .surf-rows{gap:0;width:min(1240px,100%)}
html[data-lay="zigzag"] .surf-row{grid-template-columns:1fr 300px;
  align-items:center;column-gap:0}
html[data-lay="zigzag"] .surf-row .surf{grid-column:1;grid-row:1;width:76%}
html[data-lay="zigzag"] .surf-row .sr-head{grid-column:2;grid-row:1;justify-self:start}
/* even rows mirror, so the stack walks down the page */
html[data-lay="zigzag"] .surf-row:nth-child(even){grid-template-columns:300px 1fr}
html[data-lay="zigzag"] .surf-row:nth-child(even) .surf{grid-column:2;justify-self:end}
html[data-lay="zigzag"] .surf-row:nth-child(even) .sr-head{grid-column:1;justify-self:end;
  text-align:right}
html[data-lay="zigzag"] .surf-row:nth-child(even) .sr-head{flex-direction:row-reverse}
html[data-lay="zigzag"] .surf-row+.surf-row{margin-top:-64px}
html[data-lay="zigzag"] .surf{position:relative;
  box-shadow:0 0 0 1px rgba(19,18,17,.07), 0 30px 64px -28px rgba(19,18,17,.45)}
/* later rows sit in front, so the stack reads top to bottom */
html[data-lay="zigzag"] .surf-row:nth-child(1){z-index:1}
html[data-lay="zigzag"] .surf-row:nth-child(2){z-index:2}
html[data-lay="zigzag"] .surf-row:nth-child(3){z-index:3}
html[data-lay="zigzag"] .surf-row:nth-child(4){z-index:4}
html[data-lay="zigzag"] .sr-head{padding-top:0}
html[data-lay="zigzag"] .sr-num{font-size:50px}

/* ── DECK: cascading, each card stepped down and in ── */
html[data-lay="deck"] .surf-rows{display:grid;grid-template-columns:230px 1fr;
  column-gap:48px;gap:0}
html[data-lay="deck"] .surf-row{display:contents}
html[data-lay="deck"] .sr-head{grid-column:1;align-self:start;padding-top:20px}
html[data-lay="deck"] .surf{grid-column:2;margin-top:-120px;position:relative;
  box-shadow:0 -14px 30px -14px rgba(19,18,17,.28), 0 28px 56px -30px rgba(19,18,17,.45)}
html[data-lay="deck"] .surf-row:first-child .surf{margin-top:0}
html[data-lay="deck"] .surf-row:nth-child(1) .surf{z-index:1;margin-right:72px}
html[data-lay="deck"] .surf-row:nth-child(2) .surf{z-index:2;margin-right:48px}
html[data-lay="deck"] .surf-row:nth-child(3) .surf{z-index:3;margin-right:24px}
html[data-lay="deck"] .surf-row:nth-child(4) .surf{z-index:4}
html[data-lay="deck"] .sr-num{font-size:40px}

@media (max-width:900px){
  html[data-lay="stack"] .surf-rows,html[data-lay="deck"] .surf-rows{grid-template-columns:1fr}
  html[data-lay="stack"] .surf,html[data-lay="deck"] .surf{margin:0 0 18px}
  html[data-lay="zigzag"] .surf-row+.surf-row{margin-top:0}
}

/* The mocks are 312 to 613px tall, so overlap alone barely helps. In the
   compact layouts they are cropped to a common height and the existing
   bottom fade sells it as a window into something that continues.
   Windows is exempt: it is already short and its taskbar is the point. */
html[data-lay="stack"] .surf:not(.surf-win),
html[data-lay="deck"] .surf:not(.surf-win){max-height:286px;overflow:hidden}
/* Windows crops inside the desktop rather than at the figure's edge. A
   plain max-height cuts from the bottom, which throws away the taskbar —
   the one thing this mock is here to show. Fixing the desk height instead
   lands it on the same 286px as the others with the taskbar still on.  */
html[data-lay="stack"] .surf-win,
html[data-lay="deck"] .surf-win{max-height:none}
html[data-lay="stack"] .win-desk,
html[data-lay="deck"] .win-desk{height:250px;overflow:hidden}

/* ═══ DESKTOP: one machine, four windows ════════════════════════════
   Instead of four cards stacked down the page, the whole section is a
   single Windows 11 desktop with the surfaces open on it as windows.
   The Windows mock is not one of the four here — it IS the desktop, so
   its wallpaper, widgets flyout and taskbar become the stage the other
   three sit on. That removes the desktop-inside-a-desktop the stacked
   version had, and says "your video is everywhere on this machine" as
   one picture rather than four repetitions of the same idea.        */
/* Full bleed. At 1240px the windows had to pile on top of each other to fit,
   which is what made them read as one collage rather than three separate
   things open at once. The width has to be taken on .slides-viewport, not
   here: the surfaces live inside the Why-MSN carousel, and that viewport is
   overflow:hidden, so a 100vw child was being clipped straight back to
   1240px. The carousel goes full width and the prose stays centred.   */
/* .why is a centring flex column, so 100vw centres itself and reaches both
   viewport edges. A negative margin on top of that double-shifts it.   */
html[data-lay="desktop"] .slides-viewport{width:100vw;margin-left:0}
html[data-lay="desktop"] .slide-intro,
html[data-lay="desktop"] .stat-strip{width:min(1240px,100%);margin-left:auto;margin-right:auto}
html[data-lay="desktop"] .surf-rows{--sh-col:#06142a;--sh-op:50;--sh-blur:58px;--sh-y:26px;--sh-spread:-20px;
  --halo-op:100;--halo-blur:50;--halo-spread:10;
  position:relative;display:block;
  width:100%;height:900px;margin:150px 0 0;padding:0 0 96px}
html[data-lay="desktop"] .surf-row{display:contents}
html[data-lay="desktop"] .surf-rows{zoom:var(--stage-zoom,.96);
  width:var(--stage-width,96%);margin:var(--stage-top,25px) auto 0}
html[data-lay="desktop"] .surf{position:absolute;margin:0;max-height:none;
  -webkit-mask-image:none;mask-image:none}

/* the stage */
/* ── Layered, not a block ───────────────────────────────────────────
   The backdrop is no longer "the desktop" as one opaque rectangle with a
   hard edge against the page. It is a wallpaper layer that fades up out of
   the bone and back down into it, with the windows, the sidebar and the
   taskbar sitting on top as separate objects. Empty wallpaper then reads
   as atmosphere rather than as dead space inside a box.               */
html[data-lay="desktop"] .surf-win{left:0;right:0;top:0;bottom:96px;z-index:1;
  border-radius:0;box-shadow:none;background:none;overflow:visible}
html[data-lay="desktop"] .win-desk{height:auto;overflow:visible;position:relative;
  background:none;padding:0;--wall-a:#3182C4;--wall-b:#6ECCD6;--wall-op:100;
  --sky-x:0%;--sky-y:0%;--sky-scale:1;--sky-blur:0;--sky-spread:45;--sky-soft:64}
/* The blend is done in COLOUR, not in opacity. Fading a saturated wallpaper
   out over warm bone was always going to look muddy — you get the wallpaper
   greying off against a colour it was never mixed with. Deta Surf's sky does
   it the right way: the gradient's own end stops ARE the page background, so
   there is no seam to hide and no mask involved at the transition at all. */
/* The blend is done in COLOUR, not in opacity. Fading a saturated wallpaper
   out over warm bone greys it off against a colour it was never mixed with,
   which is what made the first attempt look muddy. Deta Surf's sky does it
   properly: the gradient's own end stops ARE the page background, so there
   is no seam to hide and no mask at the transition at all.

   Two things make it actually smooth rather than merely seamless:
   · interpolation in oklab. Warm bone to cool blue through sRGB passes
     through a dead grey midpoint — the "dirty band". oklab keeps lightness
     perceptually even across the whole ramp. Declared twice so a browser
     that cannot parse it keeps the sRGB version above.
   · a desaturated noise layer at 5%. A 900px ramp in 8-bit colour bands
     into visible steps; dithering breaks them up. Same trick as the page
     grain, kept local so it does not double up over the rest of the page.
   Few, widely spaced stops on purpose: every extra stop is an inflection
   point the eye can find.                                              */
html[data-lay="desktop"] .win-desk::before{content:"";position:absolute;inset:0;z-index:0;
  background-size:200px 200px,100% 100%;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='200'%3E%3Cfilter id='dn'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23dn)' opacity='.05'/%3E%3C/svg%3E"),linear-gradient(180deg,var(--bone) 0%, #DCE6F0 18%, #8FB6E0 34%, #3182C4 54%, #1F9BB8 72%, #6ECCD6 88%, var(--bone) 100%);
}

html[data-lay="desktop"] .win-desk::before{content:"";position:absolute;inset:0;z-index:0;
  background-size:200px 200px,100% 100%;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='200'%3E%3Cfilter id='dn'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23dn)' opacity='.05'/%3E%3C/svg%3E"),
    linear-gradient(180deg in oklab,
      var(--bone) 0%,
      color-mix(in oklab, var(--wall-a) calc(var(--wall-op) * 0.22%), var(--bone)) 18%,
      color-mix(in oklab, var(--wall-a) calc(var(--wall-op) * 0.62%), var(--bone)) 34%,
      color-mix(in oklab, var(--wall-a) calc(var(--wall-op) * 1%),    var(--bone)) 54%,
      color-mix(in oklab, var(--wall-b) calc(var(--wall-op) * 0.90%), var(--bone)) 72%,
      color-mix(in oklab, var(--wall-b) calc(var(--wall-op) * 0.55%), var(--bone)) 88%,
      var(--bone) 100%)}

/* The Windows-Bloom washes ride above, held back until the blend has fully
   resolved and eased in over a long ramp so they never lay an edge on it. */
html[data-lay="desktop"] .win-desk::after{content:"";position:absolute;inset:0;z-index:0;
  background:
    radial-gradient(120% 95% at 84% 14%, rgba(255,255,255,.34), transparent 60%),
    radial-gradient(80% 66% at 97% 58%, rgba(247,206,86,.55), transparent 66%),
    radial-gradient(105% 80% at 70% 92%, rgba(34,196,196,.52), transparent 68%),
    radial-gradient(130% 118% at 106% 34%, rgba(59,130,246,.50), transparent 76%);
  /* saturation drives the washes too, so "no colour at all" really means
     none — desaturating only the base left the yellow and teal blooms.  */
  opacity:calc(var(--wall-op,100) / 100);
  -webkit-mask-image:linear-gradient(transparent 0,#000 44%,#000 74%,transparent 94%);
  mask-image:linear-gradient(transparent 0,#000 44%,#000 74%,transparent 94%)}

html[data-lay="desktop"] .win-tabs{display:none}
html[data-lay="desktop"] .win-board{position:absolute;left:32px;top:46px;bottom:150px;
  width:430px;z-index:1}

/* the taskbar floats on the backdrop as its own layer */
/* Taskbar removed from this layout 2026-08-06 — the composition reads
   better without it, and it was the last hard horizontal line on the
   stage. Its styles remain for the other layouts.                    */
html[data-lay="desktop"] .win-taskbar{display:none}
/* the widgets sidebar docks hard to the left edge of the screen */
/* The sidebar is a window like the others, so it takes the same shadow
   variables. It had its own hard-coded box-shadow, which is why the Shadow
   controls appeared to do nothing to the panel on the left.            */
html[data-lay="desktop"] .win-board{flex:0 0 430px;border-radius:12px;overflow:hidden;
  margin:0;box-shadow:0 var(--sh-y,26px) var(--sh-blur,58px) var(--sh-spread,-20px)
    color-mix(in srgb, var(--sh-col,#06142a) calc(var(--sh-op,50) * 1%), transparent),
    0 0 0 1px rgba(20,40,70,.14)}
/* two columns, not three: at sidebar width three columns are ~100px each and
   nothing in them can be read.                                          */
html[data-lay="desktop"] .win-grid{grid-template-columns:repeat(2,1fr)}
html[data-lay="desktop"] .wc-tall{display:none}
html[data-lay="desktop"] .win-tabs{padding:14px 0 12px}

/* Cascaded with a wide enough step that each window keeps its own
   identifying chrome in shot — Bing's query, Edge's tab — rather than
   three title bars and nothing to tell them apart.                   */
/* Spread, not stacked. Real windows on a real desktop sit beside each other
   and clip a corner at most — see the Windows 11 captures. Percentages so
   the arrangement holds as the viewport widens.                        */
/* Horizontal in %, vertical in px. A percentage height resolves against the
   padding box — 860px including the legend strip — not the 764px of actual
   screen, which put the front window straight through the taskbar. Nothing
   on a real desktop covers the taskbar.                                */
/* Edge pulled clear of the front window. At left:62%/33% it sat 70% behind
   MSN, so a window captioned "every new tab" showed almost nothing — and
   what it did show was placeholder. It is now narrower, higher and further
   right, and its lead card carries the creator's video, which is the only
   thing that makes the caption a claim rather than a label.           */
html[data-lay="desktop"] .surf-bing{left:27.9%;top:76px;z-index:2;height:498px;width:42.2%}
html[data-lay="desktop"] .surf-edge{left:50.8%;top:169px;z-index:3;height:478px;width:42.3%}
html[data-lay="desktop"] .surf-msn {left:45.3%;top:292px;z-index:4;height:497px;width:23.2%;--cols:1}
html[data-lay="desktop"] .win-board{left:10.8%;top:262px;width:26.1%;height:548px}
/* marabel's settled arrangement, 2026-08-06 */
html[data-lay="desktop"] .win-desk{--sky-spread:100;--sky-soft:100;--sky-blur:160;
  --sky-y:-22%;--sky-scale:.6;--wall-op:54}
html[data-lay="desktop"] .surf-rows{--sh-op:13;--sh-blur:150px;--sh-y:0px;--sh-spread:-22px}
html[data-lay="desktop"] .win-taskbar{left:0;right:auto;top:664px;bottom:auto;width:100%;height:36px}
html[data-lay="desktop"] .surf-bing,
html[data-lay="desktop"] .surf-edge,
html[data-lay="desktop"] .surf-msn{border-radius:9px;overflow:hidden;
  box-shadow:0 var(--sh-y,26px) var(--sh-blur,58px) var(--sh-spread,-20px)
             color-mix(in srgb, var(--sh-col,#06142a) calc(var(--sh-op,50) * 1%), transparent),
             0 0 0 1px rgba(20,40,70,.14)}

/* Windows title bar. The Edge mock ships macOS traffic lights, which were
   always wrong on a Microsoft page and are indefensible on a Windows
   desktop, so they go and these controls take over.                  */
/* The old text controls and their title-bar strip are gone: the tab strip is
   the title bar, and the controls are real markup (.wctl). Left in place,
   this rule's `top:0` also silently defeated the bottom fade added later —
   the fade set `bottom:0` but never reset `top`, so it painted across the
   TOP 58px of each window instead.                                     */
html[data-lay="desktop"] .mac-bar .tl{display:none}

/* Each caption now belongs spatially to its own window. The connectors use
   the same round, hand-drawn SVG stroke as the YouTube → MSN handoff in the
   hero, rather than image assets laid over the composition.             */
.surface-wire{display:none}
html[data-lay="desktop"] .sr-head{position:absolute;z-index:7;width:auto;
  display:flex;align-items:baseline;gap:9px;padding:0}
html[data-lay="desktop"] .surf-row:nth-child(1) .sr-head{left:61.6%;top:796px}
html[data-lay="desktop"] .surf-row:nth-child(2) .sr-head{left:83.1%;top:654px}
html[data-lay="desktop"] .surf-row:nth-child(3) .sr-head{left:48.5%;top:22px}
html[data-lay="desktop"] .surf-row:nth-child(4) .sr-head{left:24.6%;top:808px}
html[data-lay="desktop"] .surf-rows{--callout-scale:1}
html[data-callout-size="large"][data-lay="desktop"] .surf-rows{--callout-scale:1.18}
html[data-callout-size="xl"][data-lay="desktop"] .surf-rows{--callout-scale:1.36}
html[data-lay="desktop"] .sr-head{gap:calc(9px * var(--callout-scale))}
html[data-lay="desktop"] .sr-num{font-size:calc(26px * var(--callout-scale));
  transition:color .16s ease,text-shadow .16s ease,background .16s ease}
html[data-lay="desktop"] .sr-copy{gap:calc(4px * var(--callout-scale));
  padding-top:calc(6px * var(--callout-scale))}
html[data-lay="desktop"] .sr-copy b{font-size:calc(22px * var(--callout-scale))}
html[data-lay="desktop"] .sr-copy em{font-size:calc(10px * var(--callout-scale))}
html[data-callout-number="ink"][data-lay="desktop"] .sr-num{color:var(--ink)}
html[data-callout-number="shadow"][data-lay="desktop"] .sr-num{color:var(--ink);
  text-shadow:0 2px 0 rgba(255,255,255,.92),0 6px 15px rgba(19,18,17,.30)}
html[data-callout-number="ring"][data-lay="desktop"] .sr-head,
html[data-callout-number="ring-fill"][data-lay="desktop"] .sr-head,
html[data-callout-number="brush"][data-lay="desktop"] .sr-head{align-items:center}
html[data-callout-number="ring"][data-lay="desktop"] .sr-num,
html[data-callout-number="ring-fill"][data-lay="desktop"] .sr-num,
html[data-callout-number="brush"][data-lay="desktop"] .sr-num{position:relative;isolation:isolate;
  display:grid;place-items:center;width:calc(38px * var(--callout-scale));
  height:calc(38px * var(--callout-scale));letter-spacing:0;line-height:1}
html[data-callout-number="ring"][data-lay="desktop"] .sr-num{color:var(--ink);
  font-size:calc(21px * var(--callout-scale))}
html[data-callout-number="ring"][data-lay="desktop"] .sr-num::before{content:"";position:absolute;
  inset:calc(-3px * var(--callout-scale));z-index:-1;background:center/100% 100% no-repeat
  url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 48 44'%3E%3Cpath d='M5.5 23C5 11 13 4.5 26 4C39 3.7 45 11.5 43.5 24.5C42 36 34 40.5 21.5 39.5C10 38.8 5.8 33 5.5 23Z' fill='none' stroke='%23131211' stroke-width='3.4' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E")}
html[data-callout-number="ring-fill"][data-lay="desktop"] .sr-num{color:var(--bone);
  font-size:calc(21px * var(--callout-scale));text-shadow:0 1px 0 rgba(0,0,0,.18)}
html[data-callout-number="ring-fill"][data-lay="desktop"] .sr-num::before{content:"";position:absolute;
  inset:calc(-3px * var(--callout-scale));z-index:-1;background:center/100% 100% no-repeat
  url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 48 44'%3E%3Cpath d='M5.5 23C5 11 13 4.5 26 4C39 3.7 45 11.5 43.5 24.5C42 36 34 40.5 21.5 39.5C10 38.8 5.8 33 5.5 23Z' fill='%23131211' stroke='%23131211' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  filter:drop-shadow(0 7px 10px rgba(19,18,17,.18))}
html[data-callout-number="brush"][data-lay="desktop"] .sr-num{color:var(--bone);
  font-size:calc(20px * var(--callout-scale));text-shadow:0 1px 0 rgba(0,0,0,.18)}
html[data-callout-number="brush"][data-lay="desktop"] .sr-num::before{content:"";position:absolute;
  inset:calc(-4px * var(--callout-scale)) calc(-6px * var(--callout-scale));z-index:-1;
  background:center/100% 100% no-repeat
  url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 52 44'%3E%3Cpath d='M4 25C4.7 14 14 7.5 28 8C41 8.5 48 14 47 24C46 33 37 37 22 36C9 35 3.5 31 4 25Z' fill='%23131211'/%3E%3Cpath d='M8 14C18 8.5 36 9 45 16' fill='none' stroke='%23272421' stroke-width='2.2' stroke-linecap='round' opacity='.55'/%3E%3C/svg%3E");
  filter:drop-shadow(0 7px 10px rgba(19,18,17,.18))}
html[data-callout-number="ring"][data-lay="desktop"] .sr-copy,
html[data-callout-number="ring-fill"][data-lay="desktop"] .sr-copy,
html[data-callout-number="brush"][data-lay="desktop"] .sr-copy{padding-top:0}
html[data-callout-number="badge"][data-lay="desktop"] .sr-head{align-items:center}
html[data-callout-number="badge"][data-lay="desktop"] .sr-num{display:grid;place-items:center;
  width:calc(34px * var(--callout-scale));height:calc(34px * var(--callout-scale));
  border-radius:50%;background:var(--ink);color:var(--bone);font-size:calc(17px * var(--callout-scale));
  letter-spacing:0;line-height:1;box-shadow:0 8px 22px -10px rgba(19,18,17,.7)}
html[data-callout-number="badge"][data-lay="desktop"] .sr-copy{padding-top:0}

html[data-lay="desktop"] .surface-wire{position:absolute;z-index:6;display:block;
  overflow:visible;pointer-events:none;color:var(--ink);height:auto;
  transform:translateY(-50%) rotate(var(--angle,0deg));transform-origin:0 50%}
html[data-lay="desktop"] .surface-brush-arrow{display:block;width:100%!important;height:auto;
  transform:none!important;color:inherit}
html[data-lay="desktop"] .wire-msn{left:61.5%;top:802px;width:8.1%;--angle:-140.9deg}
html[data-lay="desktop"] .wire-edge{left:83.7%;top:659px;width:7.8%;--angle:-129.7deg}
html[data-lay="desktop"] .wire-bing{left:48.9%;top:80px;width:8.1%;--angle:131.2deg}
html[data-lay="desktop"] .wire-windows{left:24.7%;top:812px;width:9.4%;--angle:-126.7deg}

.callout-transform-handle{display:none}
html[data-callout-drag="on"][data-lay="desktop"] .surface-wire,
html[data-callout-drag="on"][data-lay="desktop"] .sr-head{pointer-events:auto;cursor:move}
html[data-callout-drag="on"][data-lay="desktop"] .surface-wire:hover,
html[data-callout-drag="on"][data-lay="desktop"] .surface-wire.callout-selected,
html[data-callout-drag="on"][data-lay="desktop"] .sr-head:hover,
html[data-callout-drag="on"][data-lay="desktop"] .sr-head.callout-selected{
  outline:2px dashed #2B7CD3;outline-offset:6px}
html[data-callout-drag="on"][data-lay="desktop"] .callout-transform-handle{display:block;
  position:absolute;right:-10px;top:50%;width:18px;height:18px;border:2px solid #fff;
  border-radius:50%;background:#2B7CD3;box-shadow:0 2px 8px rgba(0,0,0,.35);
  transform:translate(50%,-50%);cursor:crosshair}
.dg-callout-style{margin-top:5px}
.dg-callout-style .dg-sec{margin-top:7px}
.dg-callout-actions{display:flex;gap:6px;margin-top:7px}
.dg-callout-actions button{background:rgba(255,255,255,.14);color:#F1EEE7;border:0;
  border-radius:4px;padding:3px 7px;font:inherit;font-size:9px;cursor:pointer}
#dgCalloutOut{margin:6px 0 0;max-height:88px;overflow:auto;white-space:pre-wrap;
  word-break:break-all;font-size:8.5px;opacity:.82}

/* ── Desktop, continued: real browser chrome and populated windows ──
   MSN.com and Bing are websites, so on a desktop they open in Edge with a
   tab and an address bar rather than as generic app windows. The chrome
   reuses the Edge mock's own classes, so all three windows agree.      */
.wframe{display:none}
html[data-lay="desktop"] .mac-bar.wframe{display:flex}
html[data-lay="desktop"] .mac-url.wframe{display:flex}

/* the tab strip is the title bar on Windows, so the controls live in it */
html[data-lay="desktop"] .surf-bing::before,
html[data-lay="desktop"] .surf-edge::before,
html[data-lay="desktop"] .surf-msn::before{display:none}
html[data-lay="desktop"] .surf-bing,
html[data-lay="desktop"] .surf-edge,
html[data-lay="desktop"] .surf-msn{padding-top:0}
html[data-lay="desktop"] .mac-bar{height:34px;min-height:34px;padding:0 12px;
  align-items:stretch}
/* Real Windows glyphs, vertically centred in the full title-bar height.
   The middle control remains a thin square because that is Windows' maximise
   symbol; the reference confirms the shape, while the old top padding was
   what made it look like the wrong icon.                                */
.wctl{display:none}
html[data-lay="desktop"] .wctl{display:flex;height:34px;align-items:center;gap:18px;
  margin-left:auto;padding:0 2px 0 14px}
html[data-lay="desktop"] .wctl svg{width:10px;height:10px;display:block;overflow:visible;
  fill:none;stroke:#3A3A3A;stroke-width:1.05;stroke-linecap:square}
html[data-lay="desktop"] .wctl svg rect{fill:none;stroke:#3A3A3A;stroke-width:1.1}
html[data-msn="dark"] .wctl svg,html[data-msn="dark"] .wctl svg rect{stroke:#D8D8D8}
html[data-lay="desktop"] .mac-tab{height:28px;align-self:flex-end;margin-left:0;
  padding-top:0;padding-bottom:0}

/* MSN is the narrowest front window, so its two navigation rows use the
   compact density of Bing's video header. This recovers vertical room for
   the complete selected card without shrinking its thumbnail or metadata. */
html[data-lay="desktop"] .surf-msn .mac-url{padding:5px 10px}
html[data-lay="desktop"] .surf-msn .mac-field{padding:3px 10px;font-size:9px}
html[data-lay="desktop"] .surf-msn .mac-chat{font-size:9px}
html[data-lay="desktop"] .surf-msn .msn-top{gap:10px;padding:8px 12px}
html[data-lay="desktop"] .surf-msn .msn-mark{height:14px}
html[data-lay="desktop"] .surf-msn .msn-search{padding:5px 12px;font-size:10px}
html[data-lay="desktop"] .surf-msn .msn-wx{font-size:10px}
html[data-lay="desktop"] .surf-msn .msn-tabs{gap:4px;padding:2px 12px 6px}
html[data-lay="desktop"] .surf-msn .msn-tabs span{padding:3px 7px;font-size:9.5px}
html[data-lay="desktop"] .surf-msn .msn-grid{padding:0 12px 12px}

/* Anonymised slots everywhere, including here. Only the creator's own card
   carries artwork — reverted 2026-08-06 at marabel's request after trying
   the populated version on this layout.                                */
.mc-thumb.ph img{display:none}
.mc .mc-src.real{display:none}
.wc-img.ph img{display:none}
.wc .wc-src.real{display:none}

/* ── Desktop: windows sized to their content ────────────────────────
   Every window was cropping its own UI — Bing by 161px, which sliced the
   headline in half. A window that cuts its content mid-sentence reads as a
   broken screenshot, so each is now tall enough for what it shows, and Bing
   drops its trailing thumbnail grid so it ends on a complete section.  */
html[data-lay="desktop"] .surf-bing .bg-grid{display:none}
html[data-lay="desktop"] .surf-bing>*,
html[data-lay="desktop"] .surf-msn>*,
html[data-lay="desktop"] .surf-edge>*{flex-shrink:0}

/* ── Edge, rebuilt for the desktop ──────────────────────────────────
   All three outside reviews landed on the same verdict independently:
   Edge is a content-scale problem, not a placement one. `.feed-true` is
   authored at 1548px for a full-width card; inside a ~550px window it
   scales to about 0.35 and puts Segoe at 3-6px. Fully visible and
   illegible is worse than half-occluded and legible, because people try
   to read it. So on this layout the scaled world is dropped and the new
   tab is rebuilt at native size: chrome you can read, content that is
   only suggested. The creator's video deliberately does NOT appear here —
   it already carries MSN, Bing and the widgets board, and a fourth copy
   of the same crop reads as a paste error rather than as ubiquity.   */
html[data-lay="desktop"] .surf-edge .mac-stage{display:none}
html[data-lay="desktop"] .ent{display:block;flex:1;min-height:0;padding:14px 16px 16px;
  background:linear-gradient(180deg,#F7F8FB,#F3F5F9)}
.ent{display:none}
.ent-nav{display:flex;align-items:center;gap:14px;font-size:10.5px;color:#3A3A3A;
  padding-bottom:12px}
.ent-nav img{height:13px;width:auto;margin-right:2px}
.ent-nav b{color:#0F6CBD;font-weight:600;position:relative}
.ent-nav b::after{content:"";position:absolute;left:0;right:0;bottom:-5px;height:2px;
  border-radius:1px;background:#0F6CBD}
.ent-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.ent-card{background:#fff;border-radius:9px;overflow:hidden;display:flex;
  flex-direction:column;box-shadow:0 1px 3px rgba(16,32,60,.10)}
.ent-wide{grid-column:1 / span 2}
.ent-img{display:block;height:96px}
.ent-wide .ent-img{height:132px}
/* Tinted washes rather than photographs: they read as imagery at a glance
   without inventing a publisher or borrowing anyone's artwork.        */
.ent-img.i1{background:linear-gradient(135deg,#3C6FD0,#8E63C8 55%,#D06FA8)}
.ent-img.i2{background:linear-gradient(135deg,#1F9BB8,#4FC4A8)}
.ent-img.i3{background:linear-gradient(135deg,#E0913C,#D2604F)}
.ent-src{display:block;width:64px;height:7px;border-radius:4px;background:#E2E6EC;
  margin:10px 11px 0}
.ent-card .mc-lines{padding:7px 11px 12px;gap:6px}
.ent-card .mc-lines i{background:#E2E6EC;height:7px}

/* the creator's card inside the new tab */
/* aspect-ratio, not a fixed height: at full window width a 16:9 thumbnail
   cropped to 126px loses the title card, which is the part that sells it. */
.ent-you .ent-img{position:relative;height:auto;aspect-ratio:16/9;background:#111}
.ent-you .ent-img img{width:100%;height:100%;object-fit:cover;display:block}
.ent-meta{display:flex;align-items:center;gap:6px;font-size:9px;color:#5A5A5A;
  padding:9px 11px 0}
.ent-meta img{width:13px;height:13px;border-radius:4px;object-fit:cover}
.ent-meta b{color:#1A1A1A;font-weight:600}
.ent-t{margin:5px 11px 12px;font-size:11.5px;line-height:1.3;color:#171717;font-weight:700}
.ent-you{box-shadow:0 0 0 1.5px #2B7CD3,0 1px 3px rgba(16,32,60,.10)}

/* ── Drag tooling (prototype only, hidden unless armed) ───────────── */
.dragpanel,.dg-handle{display:none}
html[data-drag="on"][data-lay="desktop"] .dragpanel,
html[data-callout-drag="on"][data-lay="desktop"] .dragpanel,
html[data-tune="on"][data-lay="desktop"] .dragpanel{display:block;position:fixed;
  left:18px;bottom:18px;z-index:90;width:470px;background:rgba(14,13,12,.985);
  color:#F1EEE7;border-radius:11px;padding:11px 13px 12px;
  font-family:var(--mono);font-size:10px;line-height:1.5;
  box-shadow:0 20px 44px -14px rgba(0,0,0,.55)}
.dg-head{display:flex;align-items:center;justify-content:space-between;gap:10px;
  margin-bottom:8px;font-size:9.5px;letter-spacing:.08em;text-transform:uppercase;opacity:.7}
#dgCopy{background:#F1EEE7;color:#131211;border:0;border-radius:5px;
  padding:3px 9px;font:inherit;font-size:9px;cursor:pointer}
.dg-row{display:flex;align-items:center;gap:6px;padding:3px 5px;border-radius:5px;
  cursor:pointer}
.dg-row.on{background:rgba(255,255,255,.11)}
.dg-row b{width:34px;font-weight:600}
.dg-row em{font-style:normal;opacity:.55;width:20px}
.dg-row span{flex:1;opacity:.8;font-size:9px}
.dg-row button{background:rgba(255,255,255,.14);color:#F1EEE7;border:0;border-radius:4px;
  padding:2px 6px;font:inherit;font-size:9px;cursor:pointer;line-height:1.3}
.dg-row button:disabled{opacity:.3;cursor:default}
#dgOut{margin:8px 0 0;white-space:pre-wrap;word-break:break-all;font-size:9px;opacity:.85}
.dg-note{margin-top:8px;opacity:.5;font-size:8.5px;line-height:1.45}

/* resize grip, bottom-right inside each window */
html[data-drag="on"][data-lay="desktop"] .dg-handle{display:block;position:absolute;
  right:0;bottom:0;width:18px;height:18px;z-index:40;cursor:nwse-resize;
  background:linear-gradient(135deg,transparent 48%,#2B7CD3 48%)}
html[data-drag="on"][data-lay="desktop"] .surf-msn,
html[data-drag="on"][data-lay="desktop"] .surf-bing,
html[data-drag="on"][data-lay="desktop"] .surf-edge{cursor:move}
html[data-drag="on"][data-lay="desktop"] .surf-msn:hover,
html[data-drag="on"][data-lay="desktop"] .surf-bing:hover,
html[data-drag="on"][data-lay="desktop"] .surf-edge:hover{outline:2px solid #2B7CD3;
  outline-offset:2px}

/* ── Window frame vs. window content ────────────────────────────────
   Resizing a window used to reflow its interior: narrow the MSN window
   and its four-column grid squeezed the creator's card into a sliver.
   That conflates two different things. The frame is a *viewport* onto the
   interface; how big the interface itself is drawn is a separate control.
   `zoom` on the direct children does exactly that — it scales layout as
   well as paint, so type stays sharp — and the compensating width keeps
   the content filling the frame at any scale instead of leaving a gutter
   when scaled below 1. The frame clips whatever falls outside.       */
html[data-lay="desktop"] .surf-msn>*:not(.dg-handle),
html[data-lay="desktop"] .surf-bing>*:not(.dg-handle),
html[data-lay="desktop"] .surf-edge>*:not(.dg-handle){zoom:var(--ui,1)}
.dg-row i{font-style:normal;width:34px;text-align:center;opacity:.75;font-size:9px}
.dg-row i.dg-na{width:34px}
.dg-sp{width:44px;display:inline-block}
html[data-drag="on"][data-lay="desktop"] .win-board,
html[data-drag="on"][data-lay="desktop"] .win-taskbar{cursor:move}
html[data-drag="on"][data-lay="desktop"] .win-board:hover,
html[data-drag="on"][data-lay="desktop"] .win-taskbar:hover{outline:2px solid #2B7CD3;
  outline-offset:2px}

/* Column count is the control that actually governs card size. Zoom changes
   density; it cannot rescue a four-column grid inside a narrow window,
   because the columns divide whatever width there is. Make it a variable
   so a tall narrow MSN window can drop to one or two columns and show the
   creator's card large.                                                */
html[data-lay="desktop"] .surf-msn .msn-grid{grid-template-columns:repeat(var(--cols,4),1fr)}
html[data-lay="desktop"] .surf-edge .ent-grid{grid-template-columns:repeat(var(--cols,2),1fr)}
html[data-lay="desktop"] .surf-edge .ent-wide{grid-column:1 / span var(--cols,2)}
.dg-sp2{width:56px;display:inline-block}

/* ═══ Dark, properly ════════════════════════════════════════════════
   Dark used to reach Bing and nothing else: the Windows board, the MSN
   feed, the rebuilt Edge tab, the browser chrome and the taskbar were all
   authored light, and a blanket `.surf-*{background:#fff}` forced every
   surface white regardless of theme. This covers the lot.

   The taskbar is the awkward one. Its app strip is a bitmap of a *light*
   Windows taskbar and the tray glyphs are dark ink unmatted to alpha, so
   on a dark bar the strip glows and the glyphs vanish. Inverting the tray
   is exact — greyscale ink inverts to clean white. The app strip gets
   invert + 180° hue rotation, which flips lightness while returning each
   hue to roughly where it started, so the icons keep their colours on a
   dark ground. It is an approximation; a dark-taskbar capture would be
   exact, and is the right fix if this mode ships.                    */
html[data-msn="dark"] .surf-msn,
html[data-msn="dark"] .surf-bing,
html[data-msn="dark"] .surf-edge,
html[data-msn="dark"] .surf-win{background:#1F1F1F}

/* browser chrome */
html[data-msn="dark"] .mac-bar{background:#2B2B2B}
html[data-msn="dark"] .mac-tab{background:#3B3B3B;color:#EDEDED}
html[data-msn="dark"] .mac-url{background:#3B3B3B}
html[data-msn="dark"] .mac-field{background:#272727;border-color:#4A4A4A;color:#C9C9C9}
html[data-msn="dark"] .mac-chat{color:#6BB6F5}
html[data-lay="desktop"][data-msn="dark"] .mac-bar::after{color:#D0D0D0}

/* MSN feed */
html[data-msn="dark"] .msn-top{background:#1F1F1F}
html[data-msn="dark"] .msn-search{background:#2E2E2E;color:#C9C9C9}
html[data-msn="dark"] .msn-wx{color:#D8D8D8}
html[data-msn="dark"] .msn-tabs{color:#B9B9B9}
html[data-msn="dark"] .msn-tabs .on{color:#6BB6F5}
html[data-msn="dark"] .mc{background:#2B2B2B}
html[data-msn="dark"] .mc .mc-t,html[data-msn="dark"] .mc h3{color:#F2F2F2}
html[data-msn="dark"] .mc-src{color:#C9C9C9}
html[data-msn="dark"] .mc-src b{color:#F2F2F2}
html[data-msn="dark"] .mc-foot{color:#9A9A9A}
html[data-msn="dark"] .mc-follow{background:#3E3E3E;color:#E4E4E4}
html[data-msn="dark"] .mc-thumb.ph,html[data-msn="dark"] .mc-lines i{background:#3A3A3A}

/* Edge, the rebuilt new tab */
html[data-msn="dark"] .ent{background:linear-gradient(180deg,#242424,#1C1C1C)}
html[data-msn="dark"] .ent-nav{color:#C4C4C4}
html[data-msn="dark"] .ent-nav b{color:#6BB6F5}
html[data-msn="dark"] .ent-nav b::after{background:#6BB6F5}
html[data-msn="dark"] .ent-card{background:#2B2B2B;box-shadow:0 1px 3px rgba(0,0,0,.4)}
html[data-msn="dark"] .ent-src,html[data-msn="dark"] .ent-card .mc-lines i{background:#3E3E3E}
html[data-msn="dark"] .ent-meta{color:#B4B4B4}
html[data-msn="dark"] .ent-meta b{color:#F2F2F2}
html[data-msn="dark"] .ent-t{color:#F2F2F2}

/* widgets board */
html[data-msn="dark"] .win-board{background:#202020}
html[data-msn="dark"] .wh-greet{color:#EDEDED}
html[data-msn="dark"] .wa{background:#3A3A3A}
html[data-msn="dark"] .wc{background:#2B2B2B;box-shadow:0 1px 2px rgba(0,0,0,.4)}
html[data-msn="dark"] .wc-t{color:#F2F2F2}
html[data-msn="dark"] .wc-src{color:#B4B4B4}
html[data-msn="dark"] .wc-src b{color:#F2F2F2}
html[data-msn="dark"] .wc-img,html[data-msn="dark"] .wc-src.ph i,
html[data-msn="dark"] .wc .mc-lines i{background:#3A3A3A}
html[data-msn="dark"] .wc-eyebrow,html[data-msn="dark"] .wc-inside{color:#B4B4B4}
html[data-msn="dark"][data-feed="blank"] .wp:not(.wp-you){background:#3A3A3A}

/* taskbar */
html[data-msn="dark"] .win-taskbar{background:#1C1C1C;border-top-color:rgba(255,255,255,.07)}
html[data-msn="dark"] .tb-strip{filter:invert(1) hue-rotate(180deg)}
html[data-msn="dark"] .tb-sys,html[data-msn="dark"] .tb-bell{filter:invert(1)}
html[data-msn="dark"] .tb-wx b,html[data-msn="dark"] .tb-clock b{color:#F2F2F2}
html[data-msn="dark"] .tb-wx em,html[data-msn="dark"] .tb-clock em{color:#B4B4B4}

/* Dark deliberately leaves the wallpaper alone. Desaturating it to a night
   sky turned the whole stage to dishwater — Windows itself keeps your
   wallpaper in dark mode, and so do we. Hue is a separate control.    */
/* Bing text. The original dark rule targets `.bv-hero h5`, but the headline
   became an h3 when the heading levels were fixed, so it silently stopped
   matching and the result title stayed ink-on-charcoal.                */
html[data-msn="dark"] .bg-tabs{color:#C4C4C4}
html[data-msn="dark"] .bg-tabs b{color:#6BB6F5}
html[data-msn="dark"] .bv-hero h3,html[data-msn="dark"] .bv-hero .mc-t{color:#F2F2F2}
html[data-msn="dark"] .bv-hero p{color:#B4B4B4}
html[data-msn="dark"] .bv-meta,html[data-msn="dark"] .bv-src{color:#B4B4B4}
html[data-msn="dark"] .bg-safe,html[data-msn="dark"] .bg-pts{color:#B4B4B4}
html[data-msn="dark"] .bg-signin{background:#3A3A3A;color:#E4E4E4}
.dg-wall{margin-top:6px;border-top:1px solid rgba(255,255,255,.12);padding-top:7px}
.dg-wall span{opacity:.5;font-size:8.5px}

/* ── Taskbar: dissolve, do not draw a line ──────────────────────────
   A hard-edged bar reads as a strip pasted onto the picture. Masking all
   four edges lets it melt into the wallpaper instead. Both softness values
   are variables so they can be dialled from the panel; the horizontal one
   matters most, because the left and right ends are where the straight
   line was most obvious.                                              */
html[data-lay="desktop"] .win-taskbar{
  --tb-softx:9%;--tb-softy:26%;
  /* contents sit inside the fade, or the right-hand weather dissolves */
  padding:0 calc(var(--tb-softx) + 2%);border-top:0;
  -webkit-mask-image:
    linear-gradient(90deg,transparent 0,#000 var(--tb-softx),#000 calc(100% - var(--tb-softx)),transparent 100%),
    linear-gradient(180deg,transparent 0,#000 var(--tb-softy),#000 calc(100% - var(--tb-softy)),transparent 100%);
  mask-image:
    linear-gradient(90deg,transparent 0,#000 var(--tb-softx),#000 calc(100% - var(--tb-softx)),transparent 100%),
    linear-gradient(180deg,transparent 0,#000 var(--tb-softy),#000 calc(100% - var(--tb-softy)),transparent 100%);
  -webkit-mask-composite:source-in;mask-composite:intersect}
/* weather moves to the right-hand end, beside the tray */
html[data-lay="desktop"] .tb-wx{order:3;width:auto;margin-left:10px}
html[data-lay="desktop"] .tb-tray{order:2;width:auto}
html[data-lay="desktop"] .tb-apps{order:1}
.dg-knob{margin-top:2px}
.dg-knob .dg-g{width:26px;opacity:.55;font-size:8.5px;letter-spacing:.06em}
.dg-knob i{width:44px}
.dg-knob span{opacity:.5;font-size:8.5px}
#dgKnobs{margin-top:7px;border-top:1px solid rgba(255,255,255,.12);padding-top:6px}
/* control panel: colour wells and sliders */
.dg-sec{margin:9px 0 4px;font-size:8.5px;letter-spacing:.1em;text-transform:uppercase;opacity:.5}
.dg-ctl{display:flex;align-items:center;gap:8px;padding:2px 0}
.dg-ctl label{width:74px;opacity:.8;font-size:9px}
.dg-ctl code{width:52px;text-align:right;font-size:9px;opacity:.75}
.dg-ctl input[type=range]{flex:1;height:14px;accent-color:#6BB6F5;background:none;cursor:pointer}
.dg-ctl input[type=color]{flex:1;height:18px;padding:0;border:1px solid rgba(255,255,255,.2);
  border-radius:4px;background:none;cursor:pointer}
.dg-rst{background:none;border:0;color:#F1EEE7;opacity:.4;cursor:pointer;font-size:11px;
  line-height:1;padding:0 2px}
.dg-rst:hover{opacity:.9}
#dgAll.on{background:#6BB6F5;color:#0B1A2A}

/* ═══ Sky shapes ════════════════════════════════════════════════════
   The backdrop does not have to be a horizontal band. Five options, so
   the composition can be tried against each rather than argued about:

   band       the vertical ramp (default)
   bloom      one soft ellipse behind the group
   frame      the whole rectangle, soft on all four edges
   windows    no backdrop at all — the colour becomes a halo on each
              window, so it follows their exact paths like a coloured
              shadow rather than sitting behind them
   butterfly  the real MSN mark, blown up and blurred into a wash

   Every one resolves to transparent at its edges, so the page bone still
   shows through and the seamlessness we spent so long on is preserved. */
/* the base rule sets background-size for its noise tile; without resetting
   it here the first gradient of each shape inherits 200x200 and tiles.  */
html[data-sky] .win-desk::before{background-image:none;background-size:auto;
  background-repeat:no-repeat}
html[data-sky] .win-desk::after{display:none}

/* bloom */
html[data-sky="bloom"] .win-desk::before{background-image:
  radial-gradient(calc(24% + var(--sky-spread) * 0.72%) calc(20% + var(--sky-spread) * 0.62%) at 50% 46%,
    color-mix(in oklab, var(--wall-a) calc(var(--wall-op) * 1%), transparent) 0%,
    color-mix(in oklab, var(--wall-a) calc(var(--wall-op) * 1%), transparent) calc(var(--sky-spread) * 1%),
    transparent calc((var(--sky-spread) + var(--sky-soft)) * 1%)),
  radial-gradient(calc(18% + var(--sky-spread) * 0.62%) calc(15% + var(--sky-spread) * 0.52%) at 62% 74%,
    color-mix(in oklab, var(--wall-b) calc(var(--wall-op) * 0.85%), transparent) 0%,
    color-mix(in oklab, var(--wall-b) calc(var(--wall-op) * 0.85%), transparent) calc(var(--sky-spread) * 1%),
    transparent calc((var(--sky-spread) + var(--sky-soft)) * 1%))}

/* frame */
html[data-sky="frame"] .win-desk::before{
  background-image:linear-gradient(180deg in oklab,
    color-mix(in oklab, var(--wall-a) calc(var(--wall-op) * 0.5%), transparent),
    color-mix(in oklab, var(--wall-b) calc(var(--wall-op) * 0.5%), transparent));
  --fx:calc(50% - var(--sky-spread) * 0.90%);
  --fy:calc(50% - var(--sky-spread) * 0.88%);
  -webkit-mask-image:
    linear-gradient(90deg,transparent calc(var(--fx) - var(--sky-soft) * 0.35%),#000 var(--fx),
      #000 calc(100% - var(--fx)),transparent calc(100% - var(--fx) + var(--sky-soft) * 0.35%)),
    linear-gradient(180deg,transparent calc(var(--fy) - var(--sky-soft) * 0.35%),#000 var(--fy),
      #000 calc(100% - var(--fy)),transparent calc(100% - var(--fy) + var(--sky-soft) * 0.35%));
  mask-image:
    linear-gradient(90deg,transparent calc(var(--fx) - var(--sky-soft) * 0.35%),#000 var(--fx),
      #000 calc(100% - var(--fx)),transparent calc(100% - var(--fx) + var(--sky-soft) * 0.35%)),
    linear-gradient(180deg,transparent calc(var(--fy) - var(--sky-soft) * 0.35%),#000 var(--fy),
      #000 calc(100% - var(--fy)),transparent calc(100% - var(--fy) + var(--sky-soft) * 0.35%));
  -webkit-mask-composite:source-in;mask-composite:intersect}

/* windows — the colour becomes a halo on each object */
html[data-sky="windows"] .surf-msn,
html[data-sky="windows"] .surf-bing,
html[data-sky="windows"] .surf-edge,
html[data-sky="windows"] .win-board{
  box-shadow:0 var(--sh-y,26px) var(--sh-blur,58px) var(--sh-spread,-20px)
             color-mix(in srgb, var(--sh-col,#06142a) calc(var(--sh-op,50) * 1%), transparent),
             calc(var(--sky-x-px,0) * 1px) calc(var(--sky-y-px,0) * 1px)
             calc(var(--sky-soft) * 2.4px) calc(var(--sky-spread) * 1px)
             color-mix(in oklab, var(--wall-a) calc(var(--wall-op) * 0.75%), transparent),
             0 0 0 1px rgba(20,40,70,.14)}

/* mark — the butterfly silhouette itself, blown up and blurred */
html[data-sky="mark"] .win-desk::before{
  background-image:url("assets/logos/msn-butterfly.svg");
  background-repeat:no-repeat;
  background-position:52% 44%;
  /* mark ignored both controls entirely until now */
  background-size:auto calc(60% + var(--sky-spread,45) * 1.6%);
  filter:blur(calc(var(--sky-soft,64) * 0.9px + var(--sky-blur,0) * 1px)) saturate(1.15);
  opacity:calc(var(--wall-op,100) / 100 * .85)}
.dg-shape{display:flex;gap:5px;flex-wrap:wrap;margin-bottom:4px}
.dg-shape button{background:rgba(255,255,255,.12);color:#F1EEE7;border:0;border-radius:5px;
  padding:3px 8px;font:inherit;font-size:9px;cursor:pointer}
.dg-shape button.on{background:#6BB6F5;color:#0B1A2A}

/* ═══ MSN palette ═══════════════════════════════════════════════════
   The butterfly's own colours, lifted from assets/logos/msn-butterfly.svg
   rather than eyeballed: cyan and blue in one wing, purple and magenta in
   the next, orange and yellow, then green. Selecting the MSN palette runs
   the sky through that wheel instead of the two picked colours.

   Intensity still governs how far each stop is mixed toward the page bone,
   and both ends stay bone, so the seamless blend holds exactly as before. */
html[data-pal="msn"]{
  --p1:#3DCBFF; --p2:#2764E7; --p3:#BD00FF;
  --p4:#E23694; --p5:#FF9E3D; --p6:#FFC800; --p7:#3DEE7B}

html[data-pal="msn"][data-lay="desktop"]:not([data-sky]) .win-desk::before{
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='200'%3E%3Cfilter id='dn'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23dn)' opacity='.05'/%3E%3C/svg%3E"),
    linear-gradient(180deg in oklab,
      var(--bone) 0%,
      color-mix(in oklab, var(--p1) calc(var(--wall-op) * 0.42%), var(--bone)) 15%,
      color-mix(in oklab, var(--p2) calc(var(--wall-op) * 0.80%), var(--bone)) 29%,
      color-mix(in oklab, var(--p3) calc(var(--wall-op) * 0.66%), var(--bone)) 43%,
      color-mix(in oklab, var(--p4) calc(var(--wall-op) * 0.72%), var(--bone)) 56%,
      color-mix(in oklab, var(--p5) calc(var(--wall-op) * 0.70%), var(--bone)) 70%,
      color-mix(in oklab, var(--p6) calc(var(--wall-op) * 0.58%), var(--bone)) 82%,
      color-mix(in oklab, var(--p7) calc(var(--wall-op) * 0.42%), var(--bone)) 92%,
      var(--bone) 100%)}

/* bloom: one wing per lobe, so the wheel reads as a spread rather than a ramp */
html[data-pal="msn"][data-sky="bloom"] .win-desk::before{background-image:
  radial-gradient(46% 44% at 28% 34%,
    color-mix(in oklab, var(--p2) calc(var(--wall-op) * 0.9%), transparent) 0%, transparent 70%),
  radial-gradient(42% 40% at 70% 28%,
    color-mix(in oklab, var(--p4) calc(var(--wall-op) * 0.85%), transparent) 0%, transparent 70%),
  radial-gradient(44% 42% at 74% 72%,
    color-mix(in oklab, var(--p5) calc(var(--wall-op) * 0.85%), transparent) 0%, transparent 70%),
  radial-gradient(42% 40% at 30% 76%,
    color-mix(in oklab, var(--p7) calc(var(--wall-op) * 0.8%), transparent) 0%, transparent 70%)}

/* the remaining shapes take the two dominant wings */
html[data-pal="msn"]{--wall-a:#2764E7;--wall-b:#E23694}

/* Sky placement. A transform on the layer moves and scales every shape the
   same way, so one set of controls covers band, bloom, frame and mark
   rather than each needing its own geometry.                          */
html[data-lay="desktop"] .win-desk::before{
  transform:translate(var(--sky-x,0%),var(--sky-y,0%)) scale(var(--sky-scale,1));
  transform-origin:50% 50%;
  filter:blur(calc(var(--sky-blur,0) * 1px))}

/* Spread and softness on the default band. They were only ever wired into
   bloom / frame / windows, so on the shape everybody actually looks at they
   did nothing — the sliders moved and the picture did not. A mask gives the
   band the same two controls: `spread` is the height held at full colour,
   `softness` the distance it takes to reach nothing. Masking to transparent
   reveals the page bone, which is what the gradient resolved to anyway, so
   the seamless ends survive.                                            */
html[data-lay="desktop"]:not([data-sky]) .win-desk::before{
  --m-core:calc(var(--sky-spread,45) * 0.45%);
  --m-fade:calc(var(--sky-soft,64) * 0.30%);
  -webkit-mask-image:linear-gradient(180deg,
    transparent calc(50% - var(--m-core) - var(--m-fade)),
    #000 calc(50% - var(--m-core)),
    #000 calc(50% + var(--m-core)),
    transparent calc(50% + var(--m-core) + var(--m-fade)));
  mask-image:linear-gradient(180deg,
    transparent calc(50% - var(--m-core) - var(--m-fade)),
    #000 calc(50% - var(--m-core)),
    #000 calc(50% + var(--m-core)),
    transparent calc(50% + var(--m-core) + var(--m-fade)))}

/* ── Panel chrome: collapse, move, peek, hide ─────────────────────────
   The panel sits over the thing it edits, which is exactly the wrong place
   when you are judging a colour or a spread. `.peek` drops it almost out of
   sight while a slider is moving and it returns when you let go, so the
   picture is what you watch. H hides it outright; the header is a handle. */
html[data-drag="on"][data-lay="desktop"] .dragpanel,
html[data-callout-drag="on"][data-lay="desktop"] .dragpanel,
html[data-tune="on"][data-lay="desktop"] .dragpanel{max-height:76vh;overflow-y:auto;
  transition:opacity .18s ease}
.dragpanel .dg-head{cursor:move;position:sticky;top:-11px;z-index:2;
  background:rgba(14,13,12,.985);margin:-11px -13px 8px;padding:11px 13px 8px}
html[data-drag="on"][data-lay="desktop"] .dragpanel.min,
html[data-callout-drag="on"][data-lay="desktop"] .dragpanel.min,
html[data-tune="on"][data-lay="desktop"] .dragpanel.min{max-height:none;overflow:visible}
.dragpanel.callout-only > :not(.dg-head):not(.dg-callout-panel){display:none}
.dragpanel.callout-only #dgAll,.dragpanel.callout-only #dgCopy{display:none}
.dragpanel.min > *:not(.dg-head){display:none}
.dragpanel.min .dg-head{margin-bottom:-8px}
.dragpanel.peek{opacity:.14}
.dragpanel.hide{opacity:0;pointer-events:none}
#dgMin{background:rgba(255,255,255,.14);color:#F1EEE7;border:0;border-radius:5px;
  padding:3px 9px;font:inherit;font-size:9px;cursor:pointer;line-height:1.3}
.dragpanel::-webkit-scrollbar{width:8px}
.dragpanel::-webkit-scrollbar-thumb{background:rgba(255,255,255,.18);border-radius:4px}

/* ═══ Anonymised cards: one treatment across all three surfaces ══════
   MSN's feed, the widgets board and the Edge new tab each had their own
   placeholder look, so the same "empty" card read three different ways.
   They now share a tint system, switchable from the dev panel:

   plain  flat grey, as before
   tint   a translucent wash of colour, one hue per card
   glass  the same wash with an inner highlight — the liquid-glass read

   Hues come from the MSN butterfly, so the anonymous cards still belong to
   the brand rather than looking like arbitrary swatches.               */
html[data-ph="tint"] .mc-thumb.ph,
html[data-ph="tint"] .wc-img.ph,
html[data-ph="tint"] .ent-img{
  background:linear-gradient(155deg,
    color-mix(in oklab, var(--t,#2764E7) 20%, #ECECEC),
    color-mix(in oklab, var(--t,#2764E7) 6%,  #F6F6F6))}

html[data-ph="glass"] .mc-thumb.ph,
html[data-ph="glass"] .wc-img.ph,
html[data-ph="glass"] .ent-img{
  background:linear-gradient(155deg,
    color-mix(in oklab, var(--t,#2764E7) 34%, #F1F1F1),
    color-mix(in oklab, var(--t,#2764E7) 10%, #FBFBFB));
  box-shadow:inset 0 1px 0 rgba(255,255,255,.75),
             inset 0 0 0 1px rgba(255,255,255,.4)}

/* one hue per card, cycling the butterfly's wings */
html[data-ph] .msn-grid .mc:nth-child(2) .mc-thumb.ph,
html[data-ph] .win-grid .wc:nth-child(2) .wc-img.ph,
html[data-ph] .ent-grid .ent-card:nth-child(1) .ent-img{--t:#2764E7}
html[data-ph] .msn-grid .mc:nth-child(3) .mc-thumb.ph,
html[data-ph] .win-grid .wc:nth-child(4) .wc-img.ph,
html[data-ph] .ent-grid .ent-card:nth-child(3) .ent-img{--t:#E23694}
html[data-ph] .msn-grid .mc:nth-child(4) .mc-thumb.ph,
html[data-ph] .win-grid .wc:nth-child(5) .wc-img.ph{--t:#FF9E3D}
html[data-ph] .win-grid .wc:nth-child(6) .wc-img.ph{--t:#3DEE7B}
html[data-ph] .win-grid .wc:nth-child(7) .wc-img.ph{--t:#3DCBFF}
html[data-ph] .win-grid .wc:nth-child(3) .wc-img.ph{--t:#BD00FF}

/* Plain means plain everywhere: Edge's washes were hard-coded before this
   system existed, so they survived "flat grey" and left two coloured cards
   among the grey ones. Scoped to plain only — a blanket override outranked
   the tint rules and flattened Edge in every mode.                     */
html[data-ph="plain"] .ent-img.i1,
html[data-ph="plain"] .ent-img.i2,
html[data-ph="plain"] .ent-img.i3{background:#E9E9E9}

/* ── Windows dissolve at the bottom, like the widgets board ──────────
   The board already ends by fading its last row into its own surface
   rather than slicing it. The MSN and Edge windows were still cutting
   square, so they read as cropped screenshots next to it.            */
html[data-lay="desktop"] .surf-msn::after,
html[data-lay="desktop"] .surf-edge::after{content:"";position:absolute;
  left:0;right:0;top:auto;bottom:0;height:58px;z-index:6;pointer-events:none;
  background:linear-gradient(transparent,#FFFFFF 76%)}
html[data-lay="desktop"] .surf-edge::after{
  background:linear-gradient(transparent,#F3F5F9 76%)}
html[data-msn="dark"][data-lay="desktop"] .surf-msn::after{
  background:linear-gradient(transparent,#1F1F1F 76%)}
html[data-msn="dark"][data-lay="desktop"] .surf-edge::after{
  background:linear-gradient(transparent,#1C1C1C 76%)}

/* ── Frosting where windows overlap ──────────────────────────────────
   A soft white halo sits under each window's edge, so whatever it covers
   is lightened just before the edge rather than staying fully sharp
   underneath it. It reads as the window frosting what is behind it.
   Done as a box-shadow because every .surf is overflow:hidden — a glow
   drawn as a child would simply be clipped at the frame.             */
html[data-lay="desktop"] .surf-msn,
html[data-lay="desktop"] .surf-bing,
html[data-lay="desktop"] .surf-edge,
html[data-lay="desktop"] .win-board{
  box-shadow:0 var(--sh-y,26px) var(--sh-blur,58px) var(--sh-spread,-20px)
             color-mix(in srgb, var(--sh-col,#06142a) calc(var(--sh-op,50) * 1%), transparent),
             0 0 0 1px rgba(20,40,70,.14)}

/* Sliders-only mode: the appearance controls without arming the window
   tooling. The window rows and the Move/Copy buttons are about moving
   things, so they stay behind ?drag=on.                               */
html[data-tune="on"]:not([data-drag="on"]) #dgRows,
html[data-tune="on"]:not([data-drag="on"]) #dgAll{display:none}

/* ── Frost, clipped to the windows it falls on ───────────────────────
   Frost and the drop shadow do opposite jobs and were fighting: as a
   box-shadow the white radiated in every direction, washing the bare page
   exactly where the dark shadow was meant to sit. A shadow cannot know
   what lies beneath it.

   So the frost is now painted *inside* the lower window — one layer per
   overlapping pair, positioned in that window's own coordinates by
   app.js. Because every .surf is overflow:hidden, each layer is clipped
   to its window for free: white appears only where two windows actually
   intersect, and the page keeps the drop shadow to itself.           */
.frost-layer{position:absolute;z-index:5;pointer-events:none;background:#fff;
  border-radius:22px;opacity:var(--fo,1)}

/* Each pool arrives with the window that casts it, rather than all of them
   appearing at the end. Painting is now geometry-only, so the layers exist
   from the first frame and simply fade in on the caster's beat.        */
html[data-lay="desktop"] .surf-rows.anim .frost-layer{opacity:0}
html[data-lay="desktop"] .surf-rows.anim.in .frost-layer{
  animation:frostIn .42s ease-out both}
/* scoped to match the rule above: the `animation` shorthand resets
   animation-delay, so an unscoped delay here is simply discarded.     */
html[data-lay="desktop"] .surf-rows.anim.in .frost-layer[data-front="surf-bing"]{animation-delay:.24s}
html[data-lay="desktop"] .surf-rows.anim.in .frost-layer[data-front="surf-edge"]{animation-delay:.36s}
html[data-lay="desktop"] .surf-rows.anim.in .frost-layer[data-front="surf-msn"]{animation-delay:.50s}
@keyframes frostIn{from{opacity:0}to{opacity:var(--fo,1)}}

/* ═══ Entrance: the machine composing itself ════════════════════════
   Once, on scroll into view. Never loops — a looping open/close on a
   desktop metaphor reads as a screensaver. Back to front, matching the
   z-order the eye reads, so the creator's window lands last and holds
   the downbeat. Only `transform` and `opacity` animate: box-shadow,
   filter and the sky gradient are all expensive to re-raster and would
   drop frames on a stage this size.

   A synchronous head script adds `stage-boot` and resolves the persisted
   theme before CSS paints. That closes both one-frame leaks visible in the
   reload recording: dark base surfaces and the fully rendered bloom.   */
html.stage-boot .surf-rows .win-board,
html.stage-boot .surf-rows .surf-bing,
html.stage-boot .surf-rows .surf-edge,
html.stage-boot .surf-rows .surf-msn,
html.stage-boot .surf-rows .sr-head,
html.stage-boot .surf-rows .surface-wire,
html.stage-boot .surf-rows .win-desk::before{opacity:0!important}

html[data-lay="desktop"] .surf-rows.anim .win-board,
html[data-lay="desktop"] .surf-rows.anim .surf-bing,
html[data-lay="desktop"] .surf-rows.anim .surf-edge,
html[data-lay="desktop"] .surf-rows.anim .surf-msn,
html[data-lay="desktop"] .surf-rows.anim .sr-head,
html[data-lay="desktop"] .surf-rows.anim .surface-wire{opacity:0}

html[data-lay="desktop"] .surf-rows.anim .win-board{transform:translateX(-28px)}
html[data-lay="desktop"] .surf-rows.anim .surf-bing,
html[data-lay="desktop"] .surf-rows.anim .surf-edge,
html[data-lay="desktop"] .surf-rows.anim .surf-msn{
  transform:translateY(22px) scale(.965);transform-origin:50% 100%}
html[data-lay="desktop"] .surf-rows.anim .sr-head{transform:translateY(9px)}
html[data-lay="desktop"] .surf-rows.anim .win-desk::before{opacity:0}

html[data-lay="desktop"] .surf-rows.anim.in .win-board,
html[data-lay="desktop"] .surf-rows.anim.in .surf-bing,
html[data-lay="desktop"] .surf-rows.anim.in .surf-edge,
html[data-lay="desktop"] .surf-rows.anim.in .surf-msn,
html[data-lay="desktop"] .surf-rows.anim.in .sr-head{opacity:1;transform:none}
html[data-lay="desktop"] .surf-rows.anim.in .surface-wire{opacity:1}

html[data-lay="desktop"] .surf-rows.anim.in .win-board{
  transition:opacity .5s ease-out .06s, transform .58s cubic-bezier(.16,1,.3,1) .06s}
html[data-lay="desktop"] .surf-rows.anim.in .surf-bing{
  transition:opacity .34s ease-out .20s, transform .62s cubic-bezier(.16,1,.3,1) .20s}
html[data-lay="desktop"] .surf-rows.anim.in .surf-edge{
  transition:opacity .34s ease-out .32s, transform .62s cubic-bezier(.16,1,.3,1) .32s}
html[data-lay="desktop"] .surf-rows.anim.in .surf-msn{
  transition:opacity .36s ease-out .46s, transform .68s cubic-bezier(.16,1,.3,1) .46s}
/* Each caption and connector arrives on the same beat as the window it names,
   rather than leaking onto the page before the composition has assembled. */
html[data-lay="desktop"] .surf-rows.anim.in .surf-row:nth-child(4) .sr-head,
html[data-lay="desktop"] .surf-rows.anim.in .wire-windows{
  transition:opacity .42s ease-out .06s, transform .42s cubic-bezier(.2,.8,.2,1) .06s}
html[data-lay="desktop"] .surf-rows.anim.in .surf-row:nth-child(3) .sr-head,
html[data-lay="desktop"] .surf-rows.anim.in .wire-bing{
  transition:opacity .42s ease-out .20s, transform .42s cubic-bezier(.2,.8,.2,1) .20s}
html[data-lay="desktop"] .surf-rows.anim.in .surf-row:nth-child(2) .sr-head,
html[data-lay="desktop"] .surf-rows.anim.in .wire-edge{
  transition:opacity .42s ease-out .32s, transform .42s cubic-bezier(.2,.8,.2,1) .32s}
html[data-lay="desktop"] .surf-rows.anim.in .surf-row:nth-child(1) .sr-head,
html[data-lay="desktop"] .surf-rows.anim.in .wire-msn{
  transition:opacity .42s ease-out .46s, transform .42s cubic-bezier(.2,.8,.2,1) .46s}

/* The reused brush stroke draws on those same four beats. The hero arrow keeps
   its original page-load timing; only arrows inside this stage are retimed. */
html.ready .surf-rows.anim .surface-brush-arrow .ba{animation:none;stroke-dashoffset:1}
html[data-lay="desktop"] .surf-rows.anim.in .surface-wire{--callout-in:.46s}
html[data-lay="desktop"] .surf-rows.anim.in .wire-windows{--callout-in:.06s}
html[data-lay="desktop"] .surf-rows.anim.in .wire-bing{--callout-in:.20s}
html[data-lay="desktop"] .surf-rows.anim.in .wire-edge{--callout-in:.32s}
html[data-lay="desktop"] .surf-rows.anim.in .surface-brush-arrow .ba{
  animation:drawwire .46s cubic-bezier(.3,.7,.3,1) forwards var(--callout-in)}
html[data-lay="desktop"] .surf-rows.anim.in .surface-brush-arrow .bah{
  animation-delay:calc(var(--callout-in) + .16s)}
html[data-lay="desktop"] .surf-rows.anim.in .win-desk::before{
  opacity:calc(var(--wall-op,100) / 100);transition:opacity .72s ease-out .04s}
html[data-lay="desktop"][data-sky="mark"] .surf-rows.anim.in .win-desk::before{
  opacity:calc(var(--wall-op,100) / 100 * .85)}

@media (prefers-reduced-motion:reduce){
  html[data-lay="desktop"] .surf-rows.anim .win-board,
  html[data-lay="desktop"] .surf-rows.anim .surf-bing,
  html[data-lay="desktop"] .surf-rows.anim .surf-edge,
  html[data-lay="desktop"] .surf-rows.anim .surf-msn,
  html[data-lay="desktop"] .surf-rows.anim .sr-head{opacity:1;transform:none;transition:none}
  html[data-lay="desktop"] .surf-rows.anim .surface-wire{opacity:1;transition:none}
  html[data-lay="desktop"] .surf-rows.anim .surface-brush-arrow .ba{
    animation:none;stroke-dashoffset:0}
  html[data-lay="desktop"] .surf-rows.anim .win-desk::before{
    opacity:calc(var(--wall-op,100) / 100);transition:none}
}

/* Comparison mode: the pre-frost look, where only the drop shadow falls
   across an overlap. Given a little more weight so the contact reads at
   all — at the frost-era opacity it is nearly nothing.                */
html[data-ov="shadow"][data-lay="desktop"] .surf-rows{--sh-op:26;--sh-blur:120px;--sh-spread:-18px}

/* ═══ Live catalogue polish ═════════════════════════════════════════
   The highlighted result is one card component in four Microsoft contexts:
   full-card contour, edge-to-edge 16:9 image, publisher + age, two-line title,
   and one engagement row. Surface CSS no longer chooses a different spacing
   model or puts the selection ring around only the image. */
.video-card{align-self:start;display:flex!important;flex-direction:column!important;
  gap:0!important;padding:0!important;border-radius:8px!important;overflow:hidden!important;
  background:#fff!important;box-shadow:0 0 0 1.5px #2B7CD3,
  0 10px 26px -12px rgba(43,124,211,.38)!important}
html[data-msn="dark"] .video-card{background:#2B2B2B!important}
.video-card .mc-thumb,.video-card .ent-img,.video-card .fc2-img,
.video-card .bv-thumb,.video-card .wc-img{border-radius:0!important;background:#161616}
.video-card .mc-thumb img,.video-card .ent-img img,.video-card .fc2-img img,
.video-card .bv-thumb img,.video-card .wc-img img{width:100%;height:100%;object-fit:contain}
.bv-you .bv-thumb{box-shadow:none!important}
.fc2-you .fc2-body{padding:0}

.surf-msn .video-card{--card-title-size:var(--title-msn,11.5px);
  --card-title-height:var(--title-height-msn,29.9px)}
.surf-edge .video-card{--card-title-size:var(--title-edge,11.5px);
  --card-title-height:var(--title-height-edge,29.9px)}
.surf-bing .video-card{--card-title-size:var(--title-bing,11.5px);
  --card-title-height:var(--title-height-bing,29.9px)}
.win-board .video-card{--card-title-size:var(--title-windows,11.5px);
  --card-title-height:var(--title-height-windows,29.9px)}
.video-meta{display:flex!important;align-items:center!important;gap:5px!important;
  height:auto!important;margin:0!important;padding:8px 9px 0!important;
  background:none!important;font-size:9px!important;line-height:13px!important;
  color:#616161!important;min-width:0}
.video-meta img{width:13px!important;height:13px!important;border-radius:3px!important;
  object-fit:cover!important;flex-shrink:0}
.video-meta b{min-width:0;font-size:9px!important;line-height:13px!important;font-weight:600!important;
  color:#3B3B3B!important;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.video-age{color:#767676;white-space:nowrap;flex-shrink:0}
.video-title{display:-webkit-box!important;-webkit-box-orient:vertical;
  -webkit-line-clamp:2;overflow:hidden;text-wrap:pretty;text-transform:none!important;
  height:var(--card-title-height)!important;min-height:var(--card-title-height)!important;
  margin:5px 9px 0!important;font-size:var(--card-title-size)!important;
  line-height:1.3!important;font-weight:700!important;letter-spacing:0!important;
  color:#171717!important}
.video-stats{display:flex!important;align-items:center!important;gap:12px!important;
  width:auto!important;height:29px!important;margin:0!important;padding:7px 9px 9px!important;
  font-size:9px!important;line-height:13px!important;color:#767676!important}
.stat-item{display:inline-flex!important;align-items:center;gap:3px;white-space:nowrap}
.stat-count{display:inline!important}
.stat-icon{display:block;width:12px;height:12px;flex-shrink:0;background:currentColor;
  -webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;
  -webkit-mask-size:contain;mask-size:contain}
.stat-like{-webkit-mask-image:url("assets/icons/hand-thumb-up.svg");mask-image:url("assets/icons/hand-thumb-up.svg")}
.stat-dislike{-webkit-mask-image:url("assets/icons/hand-thumb-down.svg");mask-image:url("assets/icons/hand-thumb-down.svg")}
.stat-comment{-webkit-mask-image:url("assets/icons/chat-bubble-left.svg");mask-image:url("assets/icons/chat-bubble-left.svg")}
html[data-msn="dark"] .video-meta{color:#B4B4B4!important}
html[data-msn="dark"] .video-meta b,html[data-msn="dark"] .video-title{color:#F2F2F2!important}
html[data-msn="dark"] .video-age,html[data-msn="dark"] .video-stats{color:#9A9A9A!important}
.mc-follow{display:none}
.msn-browser-tab{max-width:190px;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.msn-browser-tab img{width:13px;height:13px;object-fit:contain;flex-shrink:0}

/* Full-bleed is a per-surface experiment now. Each card keeps the same 16:9
   box and the same metadata/title/stats stack; only their placement changes. */
html[data-card-msn="overlay"] .mc-you,
html[data-card-edge="overlay"] .ent-you,
html[data-card-edge="overlay"] .fc2-you,
html[data-card-bing="overlay"] .bv-you,
html[data-card-windows="overlay"] .wc-you{position:relative;min-height:0!important;
  aspect-ratio:16/9;background:#111!important;isolation:isolate;overflow:hidden;padding:0!important}
html[data-card-edge="overlay"] .fc2-you .fc2-body{display:contents}
html[data-card-msn="overlay"] .mc-you .mc-thumb,
html[data-card-edge="overlay"] .ent-you .ent-img,
html[data-card-edge="overlay"] .fc2-you .fc2-img,
html[data-card-bing="overlay"] .bv-you .bv-thumb,
html[data-card-windows="overlay"] .wc-you .wc-img{position:absolute;inset:0;height:auto!important;
  aspect-ratio:auto!important;border-radius:0!important;z-index:0}
html[data-card-msn="overlay"] .mc-you .mc-thumb img,
html[data-card-edge="overlay"] .ent-you .ent-img img,
html[data-card-edge="overlay"] .fc2-you .fc2-img img,
html[data-card-bing="overlay"] .bv-you .bv-thumb img,
html[data-card-windows="overlay"] .wc-you .wc-img img{object-fit:cover!important}
html[data-card-msn="overlay"] .mc-you .mc-thumb::after,
html[data-card-edge="overlay"] .ent-you .ent-img::after,
html[data-card-edge="overlay"] .fc2-you .fc2-img::after,
html[data-card-bing="overlay"] .bv-you .bv-thumb::after,
html[data-card-windows="overlay"] .wc-you .wc-img::after{content:"";position:absolute;
  inset:25% 0 0;background:linear-gradient(transparent,rgba(0,0,0,.9));pointer-events:none}
html[data-card-msn="overlay"] .mc-you .video-meta,
html[data-card-edge="overlay"] .ent-you .video-meta,
html[data-card-edge="overlay"] .fc2-you .video-meta,
html[data-card-bing="overlay"] .bv-you .video-meta,
html[data-card-windows="overlay"] .wc-you .video-meta{position:absolute;z-index:1;
  left:9px;right:9px;bottom:calc(35px + var(--card-title-height));padding:0!important;
  color:rgba(255,255,255,.78)!important}
html[data-card-msn="overlay"] .mc-you .video-meta b,
html[data-card-edge="overlay"] .ent-you .video-meta b,
html[data-card-edge="overlay"] .fc2-you .video-meta b,
html[data-card-bing="overlay"] .bv-you .video-meta b,
html[data-card-windows="overlay"] .wc-you .video-meta b{color:#fff!important}
html[data-card-msn="overlay"] .mc-you .video-age,
html[data-card-edge="overlay"] .ent-you .video-age,
html[data-card-edge="overlay"] .fc2-you .video-age,
html[data-card-bing="overlay"] .bv-you .video-age,
html[data-card-windows="overlay"] .wc-you .video-age{color:rgba(255,255,255,.72)!important}
html[data-card-msn="overlay"] .mc-you .video-title,
html[data-card-edge="overlay"] .ent-you .video-title,
html[data-card-edge="overlay"] .fc2-you .video-title,
html[data-card-bing="overlay"] .bv-you .video-title,
html[data-card-windows="overlay"] .wc-you .video-title{position:absolute;z-index:1;
  left:9px;right:9px;bottom:29px;margin:0!important;color:#fff!important}
html[data-card-msn="overlay"] .mc-you .video-stats,
html[data-card-edge="overlay"] .ent-you .video-stats,
html[data-card-edge="overlay"] .fc2-you .video-stats,
html[data-card-bing="overlay"] .bv-you .video-stats,
html[data-card-windows="overlay"] .wc-you .video-stats{position:absolute;z-index:1;
  left:9px;right:9px;bottom:0;margin:0!important;padding:7px 0!important;
  color:rgba(255,255,255,.75)!important}


/* ── about page ── */
.about-hero{display:flex;flex-direction:column;align-items:center;text-align:center;
  padding:78px var(--pad) 0;max-width:var(--shell);margin-inline:auto}
.about-h1{max-width:14ch;margin:18px 0 0;font-size:clamp(50px,6vw,84px);line-height:.95;
  text-transform:none;text-wrap:balance}
.about-lead{max-width:74ch;margin:28px 0 0;color:var(--muted);font-size:20px;line-height:1.6;
  text-wrap:pretty}
.about-body{width:min(1080px,100%);margin:0 auto;padding:56px var(--pad) 20px}
.about-block{display:grid;grid-template-columns:minmax(0,200px) minmax(0,1fr);gap:44px;
  padding:44px 0;border-top:1px solid var(--line-2)}
.about-block:first-child{border-top:0}
.about-block h2{max-width:22ch;margin:0;font-size:clamp(26px,2.7vw,34px);line-height:1.15;
  letter-spacing:-.03em}
.about-block p{max-width:62ch;margin:18px 0 0;color:var(--muted);font-size:17px;line-height:1.65}
@media (max-width:820px){
  .about-hero{padding:56px 20px 12px}
  .about-body{padding:36px 20px 8px}
  .about-block{grid-template-columns:1fr;gap:16px;padding:34px 0}
}

/* ══════════════════════════════════════════════════════════════════════════
   Case-study cards — editorial figures on a washed surface.
   Editorial's problem is that nothing holds the numbers: with the cards gone
   the figures float on the page background and read as escaping. Story's
   problem is the opposite — the stats get boxed twice (inset box inside a
   card) and stop feeling confident. The middle ground keeps Story's soft
   washed card as the container, then removes every box inside it so the
   figures sit directly on the wash the way Jasper sets type on white.
   ══════════════════════════════════════════════════════════════════════════ */
.pcard{padding:26px 28px 22px;border-radius:20px;box-shadow:none;
  border:1px solid rgba(255,255,255,.92)}
.pcard-yt{
  background:linear-gradient(154deg,#FBEAE4 0%,#FBF4EC 44%,#FCFBF8 100%)}
.pcard-msn{
  background:linear-gradient(154deg,#E3EFF7 0%,#EDF3F4 44%,#FCFBF8 100%)}
.compare-grid .pcard-msn:last-of-type{
  background:linear-gradient(154deg,#E7F1E6 0%,#EFF4EB 44%,#FCFBF8 100%)}
.pcard-source{background:rgba(255,255,255,.72)}

/* the figures: unboxed, two-up, sized so the longest value still clears */
.pcard-tiles{grid-template-columns:1fr 1fr;gap:24px 28px;margin-top:24px;
  padding-bottom:22px;border-bottom:1px solid rgba(19,18,17,.08)}
.pcard-tiles>div{display:flex;flex-direction:column;min-width:0;
  padding:0;border-radius:0;background:transparent}
.pcard-tiles strong{order:1;margin-top:0;
  font-size:clamp(26px,2.5vw,36px);font-weight:600;line-height:1;letter-spacing:-.045em}
.pcard-tiles span{order:2;margin-top:9px;color:var(--ink-2);
  font-size:12.5px;white-space:normal}
.pcard-tiles small{order:3;margin-top:4px;color:var(--faint);font-size:11px}
.pcard-tiles strong i{color:inherit;opacity:.45}
/* deeper than the editorial set — these sit on a tint, not on white */
.pcard-tiles>div:nth-child(1) strong{color:#AB3A6B}
.pcard-tiles>div:nth-child(2) strong{color:#26788E}
.pcard-tiles>div:nth-child(3) strong{color:#347449}
.pcard-tiles>div:nth-child(4) strong{color:#564AA6}

/* the chart keeps a white panel so the plot never fights the wash */
.pchart{margin-top:22px;padding:18px 16px 14px;border-radius:16px;
  background:rgba(255,255,255,.88)}
.pchart .grid line{stroke:rgba(19,18,17,.07)}
.pcard-foot{border-top-color:rgba(19,18,17,.08)}
.pproof summary{background:rgba(255,255,255,.7)}
.pproof summary:hover{background:rgba(255,255,255,.92)}
.pproof[open] summary,.pproof-shot{
  background:rgba(255,255,255,.92)}
.creator-lede{box-shadow:none;border:1px solid rgba(255,255,255,.92);
  background:linear-gradient(140deg,#F5F0E6 0%,#FBFAF6 52%,#fff 100%)}
.cl-lift strong{font-size:clamp(42px,4.6vw,58px)}
.compare-vs{background:#fff;border-color:transparent;
  box-shadow:0 2px 10px 0 rgba(19,18,17,.08)}

/* ── anonymised variants ── */
.lab-anon{bottom:76px}
@media (max-width:720px){.lab-anon{bottom:60px}}

[data-anon="blurred"] .quote-avatar,
[data-anon="blurred"] .case-tabs button img{filter:blur(5px) saturate(.4)}
[data-anon="blurred"] .quote-who b,
[data-anon="blurred"] .case-tabs button b{filter:blur(4.5px);user-select:none}
[data-anon="blurred"] .quote-who b a{pointer-events:none}

/* The nav CTA borrows the hero button's lockup — "Publish on" + the msn mark
   — so the two calls to action read as the same offer at two sizes. */
.nav-cta{display:inline-flex;align-items:center;gap:7px}
.nav-cta .btn-msn{height:15px;transform:translateY(-3px)}

/* ── about: company proof ── */
/* the lead-in is a label for this band, so it sits close to it */
.about-stats{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:14px;
  width:min(1080px,100%);margin:16px auto 0;padding-inline:var(--pad)}
.about-stat{padding:22px 20px;border-radius:16px;background:var(--bone-2)}
.about-stat strong{display:block;font-size:clamp(30px,3.4vw,42px);line-height:1;
  letter-spacing:-.05em;font-variant-numeric:tabular-nums}
.about-stat strong i{font-style:normal;font-size:.5em;font-weight:600;color:var(--soft);
  vertical-align:.32em;margin-left:1px}
.about-stat span{display:block;margin-top:12px;font-size:14px;font-weight:600;letter-spacing:-.008em}
.about-stat small{display:block;margin-top:4px;color:var(--faint);font-size:12px}

.about-growth{display:grid;grid-template-columns:minmax(0,.86fr) minmax(0,1.14fr);gap:48px;
  align-items:center;width:min(1080px,100%);margin:56px auto 0;padding:30px 32px;
  border-radius:20px;background:#fff;
  box-shadow:0 0 0 0 rgba(19,18,17,.03),0 2px 10px 0 rgba(19,18,17,.08)}
.about-growth h2{margin:14px 0 0;font-size:clamp(24px,2.5vw,32px);line-height:1.15;letter-spacing:-.03em}
.about-growth p{max-width:44ch;margin:14px 0 0;color:var(--muted);font-size:15px;line-height:1.6}
.about-chart{margin:0}
.about-chart svg{height:200px}
.about-chart .bar path{fill:url(#g74)}
.about-chart .bar text{fill:var(--ink);font-weight:700}
/* dashed rules, solid baseline — the grid recedes, the zero line holds */
.about-chart .grid line{stroke:var(--line);stroke-dasharray:3 7}
.about-chart .grid line.axis{stroke-dasharray:none;stroke:var(--line-2)}
/* the trend threads through a dot on each bar top rather than floating above */
.about-chart .trend-line{fill:none;stroke:#C9C3B8;stroke-width:1.6;stroke-linecap:round;
  vector-effect:non-scaling-stroke}
.about-chart .trend circle{fill:#fff;stroke:#B9B2A6;stroke-width:1.6;vector-effect:non-scaling-stroke}
.growth-chip{display:inline-flex;align-items:center;gap:5px;margin-top:12px;padding:3px 10px 3px 8px;
  border-radius:16px;background:#E3EFE5;color:#2F6B44;font:600 12px/20px var(--sans);
  font-variant-numeric:tabular-nums}

/* every tile reads off one vertical centre, whether or not it has a caption */
.about-stat{display:flex;flex-direction:column;justify-content:center}
.about-chart .bar text.in-bar{fill:#fff}
@media (max-width:900px){
  .about-stats{grid-template-columns:1fr 1fr}
  .about-growth{grid-template-columns:1fr;gap:26px;margin-top:40px;padding:24px 22px}
}
@media (max-width:520px){.about-stats{grid-template-columns:1fr}}

/* "About [74 Labs]" — the same logo-for-a-word move as the "Why work with"
   heading, so the two page titles are built the same way. */
.about-h1{display:flex;align-items:center;justify-content:center;gap:.16em;
  max-width:none;white-space:nowrap}
.about-logo{display:inline-flex;width:1.1143em;height:1em;flex-shrink:0;background:currentColor;
  -webkit-mask:url("assets/logos/74labs-heading.png") center/contain no-repeat;
  mask:url("assets/logos/74labs-heading.png") center/contain no-repeat}
.about-hero .about-lead+.about-lead{margin-top:20px}
.about-leadin{max-width:74ch;margin:36px 0 0;color:var(--ink);font-size:17px;font-weight:600;
  letter-spacing:-.01em}
@media (max-width:640px){.about-h1{font-size:44px;gap:.12em}}

/* About hero, left-aligned — the text column now shares its left edge with
   the stat cards and the body blocks below, so the whole page hangs off one
   line instead of three different centres. */
.about-hero{align-items:flex-start;text-align:left;
  width:min(1080px,100%);max-width:none;margin-inline:auto}
/* the title keeps its own centre; only the reading column moves left */
.about-h1{align-self:center;justify-content:center;text-align:center;gap:.3em}
.about-hero .about-lead,.about-hero .about-leadin{margin-inline:0}
@media (max-width:900px){.about-hero{width:100%}}

/* The hero's underline mark, reused inline in body copy. The .inc positioning
   was scoped to .hero-sub, so a mark used anywhere else had nothing to anchor
   to; .inc-static carries its own box and skips the hero's timed draw-on. */
.inc-static{position:relative;display:inline-block;white-space:nowrap;font-style:normal;
  color:inherit;font-weight:inherit}
.inc-static .mk-u{bottom:-.04em}
.inc-static .mark{clip-path:none!important;animation:none!important;opacity:1}

/* Fonts land after first paint and re-wrap every line; hold the fade until
   they are in, so a refresh settles rather than jumps. nav.js releases it,
   capped at 1.2s so a slow network can never leave the page blank. */
/* Hide the CONTENTS, not <body> itself: body carries the white, and hiding it
   exposes the ink canvas underneath — which is the black flash between pages. */
html:not(.fonts-ready) body>*{opacity:0}
html.fonts-ready body>*{opacity:1;transition:opacity .32s ease}
@media (prefers-reduced-motion:reduce){
  html:not(.fonts-ready) body>*{opacity:1}
  html.fonts-ready body>*{transition:none}
}

/* Cross-document view transitions where supported, so page to page is a soft
   cross-fade rather than a white blink. Ignored everywhere else. */
@view-transition{navigation:auto}
::view-transition-old(root),::view-transition-new(root){animation-duration:.22s}

/* ── contact page ── */
.contact-hero{width:min(1080px,100%);margin-inline:auto;padding:78px var(--pad) 0}
.contact-h1{max-width:16ch;margin:0;font-size:clamp(46px,5.4vw,74px);line-height:.98;
  text-transform:none;text-wrap:balance}
.contact-hero .about-lead{margin-inline:0}
.contact-body{display:grid;grid-template-columns:minmax(0,1.25fr) minmax(0,.75fr);gap:56px;
  align-items:start;width:min(1080px,100%);margin:44px auto 0;padding:0 var(--pad) 20px}
.contact-form{display:flex;flex-direction:column;gap:18px;padding:30px 32px;border-radius:20px;
  background:#fff;box-shadow:0 0 0 0 rgba(19,18,17,.03),0 2px 10px 0 rgba(19,18,17,.08)}
.cf-row{display:grid;grid-template-columns:1fr 1fr;gap:18px}
.cf-field{display:flex;flex-direction:column;gap:7px;min-width:0}
.cf-field>span{font-size:13px;font-weight:600;letter-spacing:-.005em}
.cf-field>span i{margin-left:6px;color:var(--faint);font-style:normal;font-weight:400}
.cf-field input,.cf-field textarea{width:100%;padding:11px 13px;border:0;border-radius:12px;
  background:var(--bone-2);color:var(--ink);font:400 15px/1.5 var(--sans);
  box-shadow:inset 0 0 0 1px transparent;transition:box-shadow .16s ease,background .16s ease}
.cf-field textarea{resize:vertical;min-height:110px}
.cf-field input::placeholder,.cf-field textarea::placeholder{color:var(--faint)}
.cf-field input:focus,.cf-field textarea:focus{outline:0;background:#fff;
  box-shadow:inset 0 0 0 1.5px var(--ink)}
.cf-field.is-bad input,.cf-field.is-bad textarea{box-shadow:inset 0 0 0 1.5px #C0453F}
.cf-actions{display:flex;align-items:center;gap:16px;flex-wrap:wrap;margin-top:4px}
.cf-note{margin:0;color:var(--faint);font-size:12.5px;line-height:1.5}
.cf-status{margin:0;color:#C0453F;font-size:13px}
.cf-status.is-ok{color:#2F6B44}
.contact-aside{display:flex;flex-direction:column;gap:26px;padding-top:6px}
.ca-block h2{margin:0;font-size:15px;letter-spacing:-.012em}
.ca-block ol{margin:12px 0 0;padding-left:18px;color:var(--muted);font-size:14.5px;line-height:1.65}
.ca-block ol li{text-wrap:pretty}   /* no single-word last lines */
.ca-block ol li+li{margin-top:8px}
.ca-block p{margin:10px 0 0;color:var(--muted);font-size:14.5px}
.ca-block a{text-decoration:underline;text-underline-offset:3px}
@media (max-width:900px){
  .contact-body{grid-template-columns:1fr;gap:30px;margin-top:32px}
  .contact-hero{padding:56px 20px 0}
  .cf-row{grid-template-columns:1fr}
  .contact-form{padding:24px 22px}
}
/* the whole line is the link — one target, same mailto as the hero buttons */
.ca-mail a{display:inline-block;color:var(--ink);font-size:15px;font-weight:700;
  letter-spacing:-.012em;line-height:1.45;text-decoration:none;
  text-underline-offset:4px;text-decoration-thickness:1.5px}
.ca-mail a:hover{text-decoration:underline}
/* The unsigned-until-approved point is the reassurance, not a step — it gets
   its own block so it is not buried as list item three. */
.ca-callout{margin:18px 0 0;padding:14px 16px;border-radius:14px;background:#E9F1EA;
  color:#33513A;font-size:13.5px;line-height:1.6}
.ca-callout b{color:#22402A}

/* Contact is a single-task page — it should sit in one screen rather than ask
   anyone to scroll to find the button. Everything here is tightened only on
   this page; the shared type scale is untouched. */
.contact-hero{padding-top:44px}
.contact-h1{font-size:clamp(40px,4.4vw,58px);line-height:1}
.contact-hero .about-lead{margin-top:18px;font-size:18px;line-height:1.55;max-width:66ch}
.contact-body{margin-top:26px;padding-bottom:8px;gap:44px}
.contact-form{gap:14px;padding:24px 26px}
.cf-row{gap:14px}
.cf-field>span{font-size:12.5px}
.cf-field input,.cf-field textarea{padding:9px 12px;font-size:14.5px}
.cf-field textarea{min-height:78px;rows:3}
.cf-actions{margin-top:2px}
.ca-block ol{font-size:13.5px;line-height:1.55}
.ca-block ol li+li{margin-top:6px}
.ca-callout{margin-top:14px;padding:12px 14px;font-size:12.5px;line-height:1.55}
.contact-aside{gap:18px;padding-top:0}
body:has(.contact-form) .footer{padding:22px 0 20px}
/* the mail fallback belongs with the form it is an alternative to, not under
   the "what happens next" list */
.contact-main{display:flex;flex-direction:column;gap:14px;min-width:0}
.contact-main .ca-mail{margin:0;padding-left:2px}

/* Contact should end exactly at the fold: no dead space under the footer, and
   enough trimmed that it clears a 900px viewport without a scrollbar. It stays
   scrollable rather than clipped, so a very short window can still reach the
   button. */
body:has(.contact-form){min-height:100dvh;display:flex;flex-direction:column}
body:has(.contact-form) main{flex:1 0 auto}
body:has(.contact-form) .footer{margin-top:auto;padding:16px 0 14px}
.contact-hero{padding-top:34px}
.contact-h1{font-size:clamp(36px,4vw,52px)}
.contact-hero .about-lead{margin-top:14px;font-size:17px}
.contact-body{margin-top:20px;padding-bottom:0}
.contact-form{gap:12px;padding:20px 22px}
.cf-field textarea{min-height:64px}
.cf-note{font-size:12px}
.ca-block h2{font-size:14.5px}
.ca-block ol{margin-top:10px;font-size:13px;line-height:1.5}
.ca-callout{margin-top:12px;padding:11px 13px;font-size:12px}
.ca-mail a{font-size:14px}
/* honeypot — off-screen rather than display:none, which some bots skip */
.cf-trap{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}
/* a touch more trimmed so the page clears a 900px window too */
.contact-hero{padding-top:28px}
.contact-body{margin-top:16px}
.ca-block ol li+li{margin-top:5px}
/* "msn" set the way the WHY msn? heading sets it — the butterfly as an image,
   the word in our own type so it takes the weight of whatever it sits in. */
/* "msn" is all x-height, no ascenders, so its optical centre sits well above
   the box centre — centring the boxes alone leaves the butterfly drooping.
   Centre them, then lift. */
/* The word sits on the text baseline like any other word; only the butterfly
   is lifted off it, so the line reads straight and the mark reads centred. */
.msn-word{display:inline-flex;align-items:baseline;gap:.05em;white-space:nowrap}
.msn-word img{height:1.22em;width:auto;align-self:baseline;transform:translateY(.27em)}
.msn-word b{font-weight:inherit;letter-spacing:-.03em}
/* contact footer: smaller mark, tighter rows, so the page clears a 900px window */
body:has(.contact-form) .footer-mark{height:30px}
body:has(.contact-form) .footer-top{padding-bottom:12px}
body:has(.contact-form) .footer-bottom{padding-top:12px}
/* The verification widget shares the action row with the button instead of
   taking a row of its own — that row was what pushed the page past the fold. */
.cf-actions{display:flex;align-items:center;gap:14px;flex-wrap:nowrap}
.cf-actions .cf-turnstile{flex:1 1 auto;min-width:0}
.contact-hero{padding-top:24px}
.contact-h1{font-size:clamp(34px,3.6vw,46px)}
.contact-hero .about-lead{margin-top:12px;font-size:16.5px;line-height:1.5}
.contact-body{margin-top:14px}
.cf-field textarea{min-height:56px}
@media (max-width:900px){.cf-actions{flex-wrap:wrap}}
/* outbound link inside body copy — underlined on hover only, so the sentence
   still reads as a sentence */
/* .ext was named for outbound links, but the styling is simply "a link inside
   a sentence" — .lnk shares it so internal cross-links can say what they are. */
.ext,.lnk{color:inherit;text-decoration:underline;text-decoration-thickness:1px;
  text-underline-offset:3px;text-decoration-color:rgba(94,90,83,.35);
  transition:text-decoration-color .16s ease}
.ext:hover,.lnk:hover{text-decoration-color:currentColor}
/* the copyright rides with the mark it belongs to, rather than sitting alone
   on a second row under everything */
.footer-id{display:flex;align-items:center;gap:16px;min-width:0;flex-wrap:wrap}
.footer-copy{color:var(--soft);font-size:12px;line-height:1.4}
@media (max-width:640px){.footer-id{gap:10px}}

/* ═══ Mobile pass ═════════════════════════════════════════════════════════
   Proportion work at phone width. The desktop scale is tuned for a 1440px
   column and simply reads wrong at 390: the hero has a fixed 66px of air
   above it that becomes a dead screenful, the headline is locked small
   because each line is nowrap, and the sub-headline ends up nearly as large
   as the headline it is meant to support.
   ═══════════════════════════════════════════════════════════════════════ */
@media (max-width:720px){
  /* 1 · the gap between the bar and the pill was most of a screen */
  .hero{padding-top:26px}

  /* 2 · the headline was pinned small purely to keep each line on one row.
         Let it wrap on a phone and it can be properly big. */
  .hero-h1{font-size:clamp(30px,8.6vw,38px);line-height:.98;letter-spacing:-.035em}
  .hero-h1>span{white-space:normal;display:block}

  /* 3 · supporting copy, back to supporting size */
  .hero-sub{font-size:15.5px;line-height:1.5;margin-top:16px}

  /* 4 · the partner strip was whispering */
  .hs-label{font-size:11.5px;letter-spacing:.1em}
  .hs-mark{height:17px}

  .badge{font-size:11.5px;padding:6px 14px 6px 10px}
  /* the channel URLs were running past their pills */
  .plat-url code{font-size:12px}
  .pu-side{padding:10px 12px;gap:8px}
}
@media (max-width:720px){
  /* the headline breaks better when the browser balances the lines */
  .hero-h1>span{text-wrap:balance}

  /* 5 · "2 Billion+ Monthly Active Users" was ragged left-aligned across two
         lines; centred, it reads as the statement it is */
  .stat-line{text-align:center;font-size:23px;line-height:1.3}
  .stat-strip{text-align:center}

  /* 6 · the perk copy was set at 28px — headline size for body text */
  .msn-perk{font-size:19px;line-height:1.45}
  .msn-perk b{font-size:1em}

  /* 7 · the numbered seals were crowding their headings */
  .why-us-list>div{gap:14px;padding:22px 0}
  .why-us-list dt{grid-template-columns:36px minmax(0,1fr);gap:12px}

  /* 8 · footer stacks, so left-align it rather than pushing rows apart */
  .footer-top{flex-direction:column;align-items:flex-start;gap:18px}
  .footer-links{gap:16px;row-gap:8px}
  .footer-id{gap:12px}
}
@media (max-width:720px){
  /* Right-aligned body copy has a ragged left edge — fine as a desktop
     rhythm, hard to read on a phone. Every perk reads from the same margin. */
  .msn-perk,.msn-perk-right{text-align:left!important;margin-right:auto;margin-left:0}
  /* the reason copy was indented into a second column that no longer exists */
  .why-us-list dd{margin-left:0;padding-left:0}
  .why-us-list>div{grid-template-columns:1fr}
}

/* ═══ Mobile pass 2 ═══════════════════════════════════════════════════════ */
@media (max-width:720px){
  /* 1 · the drop-down menu reads as a centred list, like the page it opens over */
  .nav-links.open{align-items:center;text-align:center;padding:18px 20px 22px;gap:14px}
  .nav-links.open .nav-cta{margin-top:4px}

  /* 2 · the two addresses were staggered with the arrow stranded down the
         left. Stack them centred so the arrow actually joins them. */
  .plat-url{flex-direction:column;gap:6px;margin-top:24px}
  .pu-side{width:100%;max-width:330px;justify-content:center}
  .brush-arrow{width:38px;margin:0 auto}

  /* 3 · the partner strip: bigger label, smaller marks, tighter slots so more
         brands fit on a phone screen */
  .hs-label{font-size:12.5px}
  .hs-track{--slot:84px!important}
  .hs-item img,.hs-logo{width:52px!important;height:52px!important}
  .hs-item{gap:6px}
  .hs-niche{font-size:7.5px;letter-spacing:.08em}

  /* 4 · the brush mark is one path across a box, so a phrase that wraps gets
         underlined once across the whole block instead of line by line.
         Swap to a per-line background rule at this width. */
  .perk-emphasis .perk-mark{display:none}
  .perk-emphasis span{
    box-decoration-break:clone;-webkit-box-decoration-break:clone;
    background-image:linear-gradient(var(--ink),var(--ink));
    background-repeat:no-repeat;background-position:0 calc(100% - .04em);
    background-size:100% .11em;padding-bottom:.1em}

  /* 5-7 · the section rhythm was tuned for a 1440px column and reads as dead
           space at 390 */
  .msn-perks{margin-top:34px}
  .msn-perks>*+*{margin-top:44px}
  .why-us{padding-top:8px}
  .why-us-list{margin-top:26px}
  .creator-results{padding-top:46px}

  /* 8 · "Creator Results" on one line, "& Testimonials." on the next */
  .creator-results-head h2{font-size:clamp(28px,8.4vw,36px);line-height:1.02;max-width:none}
  /* 9 · the intro was competing with the heading */
  .creator-results-head>p{font-size:16px;line-height:1.55;margin-top:16px}

  /* 10 · the case-study pills were a stacked block in the way; slim, one row,
          scrollable rather than wrapping */
  .case-tabs{flex-wrap:nowrap;overflow-x:auto;justify-content:flex-start;
    gap:7px;margin-top:26px;padding:2px 2px 8px;scrollbar-width:none}
  .case-tabs::-webkit-scrollbar{display:none}
  .case-tabs button{flex:0 0 auto;padding:5px 12px 5px 5px;gap:8px}
  .case-tabs button img{width:26px;height:26px}
  .case-tabs button b{font-size:12.5px;margin-bottom:0}
  .case-tabs button span{font-size:10.5px}

  /* 12 · the stat tiles were mostly padding */
  .pcard-tiles{gap:6px}
  .pcard-tiles>div{padding:10px 10px 9px}
  .pcard-tiles strong{font-size:20px;margin-top:5px}
  .pcard-tiles span{font-size:10.5px}
  .pcard-tiles small{font-size:9.5px;margin-top:4px}
  .cl-lift strong{font-size:40px}

  /* 13-15 · the closing block and footer, centred */
  .questions-cta{padding:56px 20px 40px}
  .questions-cta-inner{justify-items:center;text-align:center}
  .questions-cta-actions{justify-content:center}
  .footer-top{align-items:center;text-align:center}
  .footer-id{justify-content:center}
  .footer-links{justify-content:center}
  .footer{text-align:center}
}

/* ═══ Window stage, phone layout ══════════════════════════════════════════
   data-lay="desktop" positions every window absolutely inside a 1548px
   stage, which on a phone piles them on top of one another. In "flow" each
   window is a block in reading order with its caption above it.

   The windows are built at desktop proportions internally, so they cannot
   simply be narrowed — a 340px-wide MSN feed would reflow into nonsense.
   Instead each is laid out at its natural width and zoomed down, which keeps
   every proportion intact and just makes it a faithful miniature.
   ═══════════════════════════════════════════════════════════════════════ */
html[data-lay="flow"] .surf-rows{display:flex;flex-direction:column;gap:30px;
  margin:26px 0 0;padding:0;width:100%;height:auto;position:static;zoom:1}
html[data-lay="flow"] .surf-row{display:flex;flex-direction:column;gap:10px;
  align-items:stretch}
html[data-lay="flow"] .sr-head{display:flex;align-items:center;gap:12px;padding:0}
html[data-lay="flow"] .surface-wire{display:none}

/* one number, one label, one window — in that order, every time */
html[data-lay="flow"] .surf{position:relative;margin:0;width:var(--flow-w,860px);
  zoom:var(--flow-zoom,.4);max-height:none;overflow:hidden;border-radius:18px;
  box-shadow:0 18px 44px -30px rgba(19,18,17,.45);
  -webkit-mask-image:none;mask-image:none}
html[data-lay="flow"] .surf-win{position:relative;inset:auto}
html[data-lay="flow"] .win-desk{height:auto}

@media (max-width:820px){
  html[data-lay="flow"]{--flow-w:900px;--flow-zoom:.46}
}
@media (max-width:720px){
  html[data-lay="flow"]{--flow-w:900px;--flow-zoom:.385}
  html[data-lay="flow"] .sr-num{width:30px;height:30px;font-size:13px}
  html[data-lay="flow"] .sr-copy b{font-size:17px}
  html[data-lay="flow"] .sr-copy em{font-size:10px;letter-spacing:.1em}
  .slides-viewport{overflow:visible}
}
@media (max-width:420px){
  html[data-lay="flow"]{--flow-zoom:.35}
}

/* ═══ Mobile pass 3 ═══════════════════════════════════════════════════════ */
@media (max-width:720px){
  /* the connector was a hairline next to the desktop's confident stroke, and
     the two pills sat almost touching so it had nowhere to live */
  .plat-url{gap:15px}
  .brush-arrow{width:60px}
  .brush-arrow path{stroke-width:17}

  /* two rows of partner marks: twice the roster in barely more height */
  .hs-track{--slot:auto}
  .hs-track[data-rows="2"]{display:grid;grid-auto-flow:column;
    grid-template-rows:auto auto;grid-auto-columns:var(--slot);row-gap:16px}
  .hs-item img,.hs-logo{width:46px!important;height:46px!important}
  .hs-niche{font-size:7px}
}

/* ═══ Mobile pass 4 ═══════════════════════════════════════════════════════ */
/* Centre the stacked stage, and give each window back its pointer. The wires
   are drawn for the desktop composition, where they reach across the stage;
   in flow each one becomes a short connector between the caption and the
   window it names. Their draw-on animation only runs under data-lay=desktop,
   so the dash has to be reset or they stay invisible. */
html[data-lay="flow"] .surf-row{align-items:center;gap:6px}
html[data-lay="flow"] .sr-head{justify-content:center}
html[data-lay="flow"] .surf{margin-inline:auto}
html[data-lay="flow"] .surface-wire{display:block;position:static;width:auto;height:auto;
  margin:0 auto;pointer-events:none;transform:none}
html[data-lay="flow"] .surface-wire .brush-arrow{width:40px;margin:0 auto;display:block;
  transform:rotate(90deg);color:var(--ink);opacity:.8}
html[data-lay="flow"] .surface-wire .brush-arrow path{stroke-dasharray:none!important;
  stroke-dashoffset:0!important;animation:none!important;stroke-width:16}
html[data-lay="flow"] .callout-transform-handle{display:none}

@media (max-width:720px){
  /* the gap before the case studies was still reading as a dead screen */
  .creator-results{padding-top:18px}
  .msn-perks{margin-bottom:0}
  .why-us{padding-bottom:10px}

  /* keep the two strip rows on a shared baseline */
  .hs-track[data-rows="2"]{align-items:start}
  .hs-track[data-rows="2"] .hs-tile,.hs-track[data-rows="2"] .hs-slot{align-self:start}
}

@media (max-width:720px){
  /* The scrolling pill row was clipped by the section's padding, so pills got
     sliced off mid-shape against a straight edge. Let it run to the true
     screen edge instead, and fade it out there — the fade reads as "there is
     more this way" where a hard cut just reads as broken. */
  .case-tabs{margin-inline:calc(var(--pad) * -1);padding-inline:var(--pad);
    scroll-padding-inline:var(--pad);
    -webkit-mask-image:linear-gradient(to right,transparent 0,#000 14px,
      #000 calc(100% - 46px),transparent 100%);
    mask-image:linear-gradient(to right,transparent 0,#000 14px,
      #000 calc(100% - 46px),transparent 100%)}
}

/* ═══ Mobile pass 5 ═══════════════════════════════════════════════════════ */
/* The flow connectors were wrong in both directions — they cut through the
   caption and slid behind the window. They are drawn as absolute geometry for
   the desktop stage and there is no honest short version of them, so on a
   phone the numbered badge carries the sequence instead. It now uses the
   desktop's own ink disc rather than a bare grey numeral. */
html[data-lay="flow"] .surface-wire{display:none}
html[data-lay="flow"] .sr-head{align-items:center;gap:12px}
html[data-lay="flow"] .sr-num{position:relative;isolation:isolate;display:grid;place-items:center;
  width:34px;height:34px;flex:0 0 auto;color:var(--bone);font-size:16px;line-height:1;
  letter-spacing:0;text-shadow:0 1px 0 rgba(0,0,0,.18)}
html[data-lay="flow"] .sr-num::before{content:"";position:absolute;inset:-3px;z-index:-1;
  background:center/100% 100% no-repeat
  url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 48 44'%3E%3Cpath d='M5.5 23C5 11 13 4.5 26 4C39 3.7 45 11.5 43.5 24.5C42 36 34 40.5 21.5 39.5C10 38.8 5.8 33 5.5 23Z' fill='%23131211' stroke='%23131211' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  filter:drop-shadow(0 7px 10px rgba(19,18,17,.18))}
html[data-lay="flow"] .sr-copy{padding-top:0;text-align:left}

@media (max-width:720px){
  /* the run-up to WHY msn? was a screen of nothing */
  .why{padding-top:18px}
  .hs-rail{margin-bottom:0}

  /* the process reads before the form: it is short, it is reassurance, and
     the form is still the next thing on screen */
  .contact-body[data-order="aside-first"]{display:flex;flex-direction:column}
  .contact-body[data-order="aside-first"] .contact-aside{order:1;margin-bottom:4px}
  .contact-body[data-order="aside-first"] .contact-main{order:2}

  /* About: stat tiles centred */
  .about-stat{align-items:center;text-align:center}

  /* About chart: the y gutter was eating the plot and the year labels
     collided into "YearYearYear" */
  .about-chart .pchart-plot{padding-right:34px}
  .about-chart .pchart-y{width:34px;padding-left:6px;font-size:9px}
  .about-chart .pchart-x{padding-right:34px;font-size:9.5px}
  .about-chart .pchart-x span{white-space:nowrap}
  .about-chart .bar text{font-size:13px}
  .about-growth{padding:22px 18px}
}
.pchart-x i{font-style:normal}
@media (max-width:720px){ .about-chart .pchart-x i{display:none} }

/* ═══ Mobile pass 6 · closing the dead space ══════════════════════════════
   Three separate paddings were stacking into a screen of nothing between
   every section: .why's own 68px bottom, the last reason's 22px, and the
   next section's top. Measured and closed rather than nudged.
   ═══════════════════════════════════════════════════════════════════════ */
@media (max-width:720px){
  .why{padding-bottom:12px}
  .why-us{padding-bottom:0}
  .why-us-list>div:last-child{padding-bottom:6px}
  .creator-results{padding-top:6px;padding-bottom:34px}
  .questions-cta{padding-top:30px}

  /* the mail line belongs with the centred column it sits under */
  .contact-main .ca-mail{text-align:center;padding-left:0}
  .contact-form{align-items:stretch}
}

/* ═══ Tablet (721–900px) ══════════════════════════════════════════════════
   These fixes were scoped to =720, so a 768 tablet was falling through to
   the desktop rules inside a narrow column: the two addresses wrapped onto
   separate lines while the arrow kept its row slot and floated off to the
   right, and the reason list sat hard left with half the width empty.
   ═══════════════════════════════════════════════════════════════════════ */
@media (min-width:721px) and (max-width:900px){
  /* stack and centre the handoff, same as the phone */
  .plat-url{flex-direction:column;gap:16px;margin-top:26px}
  .pu-side{width:100%;max-width:460px;justify-content:center}
  .brush-arrow{width:66px;margin:0 auto}
  .brush-arrow path{stroke-width:16}

  /* the reason list reads as a centred column rather than a left margin
     with half the tablet empty beside it */
  .why-us-list{width:min(560px,100%);margin-inline:auto}
  .why-us-list>div{grid-template-columns:1fr;gap:12px;padding:24px 0}
  .why-us-list dd{margin-left:0;padding-left:0}
  .why-us-list>div:last-child{padding-bottom:8px}
  .why{padding-bottom:14px}
  .why-us{padding-bottom:0}
  .creator-results{padding-top:10px;padding-bottom:46px}

  /* the closing block was left-aligned against a wide empty right side */
  .questions-cta{padding-top:38px;padding-bottom:34px}
  .questions-cta-inner{grid-template-columns:1fr;justify-items:center;text-align:center;gap:26px}
  .questions-cta-actions{justify-content:center}
  .footer-top{justify-content:center;text-align:center}
  .footer-links{justify-content:center}
}

/* ═══ Mobile + tablet pass 7 ══════════════════════════════════════════════
   The rotated arrow only ever reserved its UNROTATED height — a 60x5px box
   that visually spans 60px once turned — so it was overlapping the pills it
   was meant to sit between. Reserve the space it actually occupies.
   ═══════════════════════════════════════════════════════════════════════ */
@media (max-width:900px){
  /* the SVG's own box is width x (26/290) — about 6px tall — so the reserved
     space has to be padded out to the length it spans once rotated */
  .brush-arrow{margin-block:34px}

  /* the open menu was solid white against a translucent bar; give it the
     same frosted treatment so the two read as one surface */
  .nav-links.open{align-items:center;text-align:center;
    background:rgba(255,255,255,.86);backdrop-filter:blur(16px);
    box-shadow:0 18px 34px -28px rgba(19,18,17,.5)}

  /* the headline stat was ragged over two left-aligned lines here too */
  .stat-line{text-align:center}
  .stat-strip{text-align:center}
}
@media (min-width:721px) and (max-width:900px){
  .plat-url{gap:4px}
  .stat-line{font-size:26px;line-height:1.32}
}

/* ═══ Open menu: bar and panel as one surface ═════════════════════════════
   At the top of the page the bar is deliberately transparent (so its white
   never meets the hero's warm bone at a visible edge). Open the menu there
   and you got a frosted panel hanging off a see-through bar — two different
   materials stacked. While the menu is open the bar takes the same frost, so
   they read as one sheet of glass.
   ═══════════════════════════════════════════════════════════════════════ */
.nav:has(.nav-links.open){background:rgba(255,255,255,.9);
  -webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px)}
@media (max-width:900px){
  .nav-links.open{background:rgba(255,255,255,.9);
    -webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px);
    border-bottom:0;box-shadow:0 20px 36px -30px rgba(19,18,17,.55)}
}

/* ── guides ───────────────────────────────────────────────────────────────
   Long-form answers to the questions creators actually type into a search
   box. Deliberately assembled from the About page's own hero and block
   components, so they inherit its type scale and every responsive fix made
   there; the only thing they need of their own is a headline that holds a
   sentence rather than one word plus a logo. */
.guide-h1{max-width:20ch;margin:18px 0 0;font-size:clamp(36px,4.4vw,62px);
  line-height:1.03;letter-spacing:-.03em}
.guide-updated{margin-top:26px;color:var(--faint)}

/* A case study with three cards — YouTube, then both MSN reports. The pair
   that actually compares sits on the first row; the second MSN report runs
   full width beneath, rather than leaving a half-empty column. */
.compare-3 .pcard:last-of-type{grid-column:1/-1}
@media (max-width:1080px){ .compare-3 .pcard:last-of-type{grid-column:auto} }
