/* ==========================================================================
   Lovemail — recreation
   ========================================================================== */

/* ---------- fonts ---------- */
@font-face{font-family:"SF Pro Display";src:url("assets/fonts/SFProDisplay-Regular.woff2") format("woff2");font-weight:400;font-display:swap}
@font-face{font-family:"SF Pro Display";src:url("assets/fonts/SFProDisplay-Medium.woff2") format("woff2");font-weight:500;font-display:swap}
@font-face{font-family:"SF Pro Display";src:url("assets/fonts/SFProDisplay-Semibold.woff2") format("woff2");font-weight:600;font-display:swap}
@font-face{font-family:"SF Pro Text";src:url("assets/fonts/SFProText-Regular.woff2") format("woff2");font-weight:400;font-display:swap}
@font-face{font-family:"SF Pro Text";src:url("assets/fonts/SFProText-Medium.woff2") format("woff2");font-weight:500;font-display:swap}
@font-face{font-family:"Inter";src:url("assets/fonts/Inter-Regular.woff2") format("woff2");font-weight:400;font-display:swap;unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}

/* ---------- tokens ---------- */
:root{
  --text:#101012;
  --gray:#808080;
  --muted:#B6B5B3;
  --faint:rgba(16,16,18,.4);
  --paper:#F7F7F5;          /* phone / claim card surface */
  --plate:#F2F2F2;          /* feature card surface */
  --white:#fff;
  --blue:#0077FF;
  --blue-track:#1C72F8;
  --orange:#FF5A1F;
  --green:#34C759;
  --ink-ios:rgba(60,60,67,.6);

  --sf:"SF Pro Display","SF Pro Text",-apple-system,BlinkMacSystemFont,"Helvetica Neue",Arial,sans-serif;
  --inter:Inter,-apple-system,BlinkMacSystemFont,"Helvetica Neue",Arial,sans-serif;

  --shell:1200px;
}

/* ---------- reset ---------- */
*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{
  margin:0;background:var(--white);color:var(--text);
  font-family:var(--sf);font-weight:400;
  -webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;
  overflow-x:hidden;
}
p,ul{margin:0}
ul{padding:0;list-style:none}
img{display:block;max-width:100%}
a{color:inherit}

/* sections are full-bleed and stacked with a 24px gap; the 1200px shell is
   applied per-section to the inner content instead */
.page{
  width:100%;
  display:flex;flex-direction:column;justify-content:flex-start;align-items:center;gap:24px;
  background:var(--white);overflow:clip;
}

/* shared type helpers used inside phone UI */
.t-strong{font-size:9px;line-height:10.8px;font-weight:500;color:var(--text)}
.t-muted{font-size:9px;line-height:10.8px;font-weight:500;color:var(--muted)}
.t-faint{color:var(--faint)}
.t-strong .t-muted,.t-strong .t-faint{font-weight:500}

.h2{font-size:40px;line-height:48px;font-weight:500;letter-spacing:0;margin:0}

/* screen-reader-only text; absolute so it adds no flex gap in .page */
.visually-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap}

/* ==========================================================================
   SCROLL SNAP — home page only (html.snap)
   ========================================================================== */
/* the viewport is the scroller, so the type goes on <html>. Full-height
   sections snap to their top; the 80vh manifesto is centred so nothing peeks
   in below it; the footer is shorter than a viewport, so its top can never be
   reached — its bottom edge snaps to the end of the document instead. The
   feature grid is taller than a viewport and scrolls freely inside its area. */
html.snap{scroll-snap-type:y mandatory}
.snap .page > section{scroll-snap-align:start;scroll-snap-stop:always}
.snap .page > .manifesto{scroll-snap-align:center}
.snap .page > .footer{scroll-snap-align:end}
/* narrow screens: every section outgrows the viewport, so no snapping */
@media (max-width:959.98px){
  html.snap{scroll-snap-type:none}
}

/* ==========================================================================
   NAV
   ========================================================================== */
.nav{
  position:fixed;top:0;left:50%;transform:translateX(-50%);
  width:100%;z-index:10;
  display:flex;justify-content:center;align-items:center;
  padding:40px 0 0;pointer-events:none;
}
.nav__pill{
  width:80%;
  display:flex;align-items:center;gap:4px;
  padding:12px 16px;border-radius:100px;
  background:rgba(69,69,32,.05);
  -webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);
  pointer-events:auto;
}
.nav__mark{
  width:16px;height:16px;flex:none;
  background:url("assets/img/stamp.svg") center/100% 100% no-repeat;
}
.nav__label{font-family:var(--inter);font-size:16px;line-height:19.2px;font-weight:400}

/* ==========================================================================
   HERO
   ========================================================================== */
.hero{
  height:100vh;width:100%;
  display:flex;flex-direction:column;justify-content:center;align-items:center;
  overflow:clip;position:relative;
}
.hero__row{
  width:var(--shell);max-width:100%;
  display:flex;justify-content:center;align-items:center;gap:720px;
  position:relative;
}
.hero__word{
  font-size:54px;line-height:64.8px;font-weight:500;white-space:pre;
}
.hero__word--love{color:var(--text)}
.hero__word--mail{color:var(--gray)}

/* centred with negative margins rather than a transform, so the reveal
   animation is free to own `transform` without fighting the layout */
.hero__stage{
  position:absolute;top:50%;left:53%;
  margin-left:-250px;margin-top:-249.5px;
  width:500px;min-height:499px;z-index:0;
  display:flex;flex-direction:column;align-items:center;
}
.hand{position:absolute;inset:-29px -109px -189px;z-index:1}
.hand__img{width:100%;height:100%;object-fit:cover}

/* white veil that fades the hand out at the bottom; also the phone's frame of reference */
.hand__veil{
  position:absolute;left:72px;right:-72px;top:calc(50.0697% - 360px);height:720px;
  background:linear-gradient(rgba(255,255,255,0) 55%,#fff 100%);
}

/* ---------- phone screen ---------- */
.screen{
  position:absolute;top:17px;left:122px;
  width:234px;height:499px;
  background:var(--paper);border-radius:32px;overflow:clip;
  display:flex;flex-direction:column;justify-content:space-between;align-items:center;
  padding:50px 0 0;
}
.screen__notch{
  position:absolute;top:14px;left:81px;width:73px;height:22px;
  background:var(--text);border-radius:11px;z-index:4;
}
.screen__home{
  position:absolute;bottom:8px;left:calc(50% - 42px);width:84px;height:4px;z-index:3;
}
.screen__home::after{
  content:"";position:absolute;top:0;left:1px;width:83px;height:4px;
  background:var(--text);border-radius:2px;
}

/* greeting — the words are inked in one character at a time, and each word
   flips from grey to black once it reads as a proper noun (see script.js) */
.greet{
  flex:none;width:210px;min-height:1em;
  font-size:16px;line-height:1.2em;font-weight:500;letter-spacing:-.03em;
  color:#CCC;text-align:left;white-space:pre-wrap;word-break:break-word;
}
.greet__key{color:#000}

/* each character eases up out of a soft blur; script.js staggers the delays.
   opacity and filter both apply to inline boxes, so the spans leave the text's
   own metrics — kerning, wrapping — exactly as they were */
.greet__c{
  opacity:0;filter:blur(4px);
  transition:opacity .5s cubic-bezier(.22,.61,.36,1),filter .5s cubic-bezier(.22,.61,.36,1);
}
.greet.is-typed .greet__c{opacity:1;filter:blur(0)}

/* feed */
.feed{
  position:absolute;left:0;right:0;bottom:-36px;z-index:0;
  display:flex;flex-direction:column;justify-content:center;align-items:center;gap:6px;
  padding:6px;overflow:clip;
}
.feed__head{width:100%;display:flex;align-items:center;padding:0 6px}
.feed__head p{
  flex:1;font-size:9px;line-height:12px;font-weight:500;letter-spacing:.4px;color:#6D6D6B;
}

/* flight card (phone) */
.fcard{
  width:100%;background:var(--white);border-radius:12px;padding:10px;
  display:flex;flex-direction:column;gap:8px;overflow:hidden;z-index:1;
}
.fcard__top{width:100%;display:flex;align-items:center;gap:2px}
.fcard__route{flex:1;display:flex;align-items:center;gap:4px;min-width:0}
.fcard__badge{width:24px;height:24px;flex:none;display:block}
.fcard__badge img{width:24px;height:24px;display:block}
.fcard__title{font-size:9px;line-height:10.8px;font-weight:600;color:var(--text);white-space:nowrap}
.fcard__flightno{font-size:9px;line-height:10.8px;font-weight:500;color:var(--muted);white-space:nowrap}

.fcard__mid{width:100%;display:flex;justify-content:center;align-items:center;gap:8px}
.fcard__col{display:flex;flex-direction:column;gap:4px}
.fcard__col--start{align-items:flex-start}
.fcard__col--end{align-items:flex-end}
.fcard__seat{display:flex;align-items:center;gap:4px;color:var(--text)}
.ic-seat{flex:none;display:block}
.fcard__group{display:flex;align-items:center;gap:2px}

.fcard__track{flex:1;min-width:0;display:flex;flex-direction:column;justify-content:center;align-items:center}
.track{width:100%;height:14px;position:relative;overflow:hidden}
.track__line{
  position:absolute;top:calc(50% - 1px);left:0;right:0;height:2px;border-radius:100px;
  background:linear-gradient(90deg,#fff 0%,var(--blue-track) 93%);
}
.track__plane{
  position:absolute;top:-1px;bottom:-1px;left:0;width:16px;
  display:flex;align-items:center;justify-content:center;
}
.track__plane svg{transform:rotate(90deg)}

/* mail rows */
.mrow{
  width:100%;background:var(--white);border-radius:12px;padding:10px;
  display:flex;align-items:center;gap:8px;overflow:clip;
}
.avatar{width:24px;height:24px;flex:none;border-radius:20px;overflow:hidden;display:block}
.avatar--img img{width:100%;height:100%;object-fit:cover}
.avatar--initials{
  width:28px;height:28px;border-radius:20px;
  background:linear-gradient(152deg,#ACF1D5 0%,#56E29E 100%);
  display:flex;align-items:center;justify-content:center;
  font-size:10px;line-height:18px;color:#008E53;
}
.mrow__body{flex:1;min-width:0;display:flex;flex-direction:column;justify-content:center;overflow:clip}
.mrow__name{font-size:9px;line-height:11px;letter-spacing:.4px;color:var(--text);white-space:nowrap}
.mrow__sub{font-size:9px;line-height:11px;letter-spacing:.2px;color:var(--muted)}

/* dock */
.dock{
  position:absolute;left:0;right:0;bottom:0;z-index:1;
  display:flex;justify-content:center;align-items:flex-start;gap:16px;
  padding:26px 12px 24px;overflow:clip;
  background:linear-gradient(180deg,rgba(247,247,245,0) 0%,var(--paper) 32.79%);
}
.dock__btn{
  width:28px;height:28px;flex:none;border-radius:100px;background:var(--white);
  box-shadow:0 1px 4px rgba(0,0,0,.1);
  display:flex;align-items:center;justify-content:center;overflow:clip;
}
.dock__btn img{width:16px;height:16px;object-fit:cover}
.dock__field{
  flex:1;min-width:0;height:28px;border-radius:100px;background:var(--white);
  box-shadow:0 1px 4px rgba(0,0,0,.1);
  display:flex;justify-content:space-between;align-items:center;padding:0 12px;overflow:clip;
}
.dock__field p{font-size:10px;line-height:12px;font-weight:500;color:var(--muted);text-align:center}
.ic-wave{flex:none;display:block}
.ic-compose{flex:none;display:block}

/* ==========================================================================
   MANIFESTO
   ========================================================================== */
.manifesto{
  width:100%;height:80vh;padding:40px 0;
  display:flex;flex-direction:column;justify-content:center;align-items:center;gap:32px;
  overflow:clip;
}
.manifesto__inner{width:800px;max-width:calc(100% - 40px)}
.manifesto__inner p{
  font-size:40px;line-height:48px;font-weight:500;color:var(--gray);text-align:center;
  white-space:pre-wrap;
}
.manifesto__inner b{font-weight:500;color:var(--text)}
.manifesto__punch{color:var(--text) !important}

/* ==========================================================================
   FEATURES
   ========================================================================== */
.features{
  width:100%;padding:40px 0;
  display:flex;flex-direction:column;justify-content:center;align-items:center;gap:64px;
  overflow:clip;
}
.features__head,.features__grid{width:800px;max-width:calc(100% - 40px)}
.features__grid{display:flex;flex-direction:column;gap:24px}

.frow{display:flex;justify-content:center;align-items:center;gap:24px;width:100%}
.frow--top{height:196px}

.card{
  background:var(--plate);border-radius:24px;padding:24px;position:relative;overflow:clip;
  display:flex;flex-direction:column;align-items:center;
}
.card__label{font-size:20px;line-height:24px;font-weight:500;color:var(--gray);white-space:pre}
.card__plate{
  flex:1;width:100%;min-height:0;background:var(--white);border-radius:24px;
  display:flex;align-items:center;justify-content:center;overflow:clip;position:relative;
}

/* row 1 */
.card--gmail,.card--voice{flex:1 1 0;min-width:0;height:100%;gap:16px;justify-content:flex-start}
.card--voice{justify-content:center}
.gmail{width:144px;height:59px;object-fit:cover}

/* three blurred radial washes stacked in a 260px box that hangs below the
   plate — only its top edge shows, reading as a glowing blue dome. They pulse
   like a voice level meter; script.js drives the scale (see "voice orbs") */
.card__plate--voice{overflow:clip}
.orbs{position:absolute;left:-20px;right:-19px;bottom:-218px;height:260px;z-index:1}
.orb{position:absolute;inset:0;border-radius:50%;filter:blur(20px);will-change:transform}
.orb--a{background:radial-gradient(circle,#0099FF 0%,rgba(0,153,255,0) 100%)}
.orb--b{background:radial-gradient(circle,#00D9FF 0%,rgba(0,217,255,0) 100%)}
.orb--c{background:radial-gradient(circle,#0044FF 0%,rgba(0,68,255,0) 100%)}

/* row 2 */
.frow--mid{align-items:stretch;height:511px}
.fcol{display:flex;flex-direction:column;gap:24px}
.fcol--left{flex:1 1 0;min-width:0}
.fcol--right{flex:1 1 0;min-width:0}

/* autoreply */
.card--autoreply{flex:1;width:100%;gap:24px;justify-content:center;align-items:center}
.thread{flex:1;width:100%;min-height:0;display:flex;flex-direction:column;align-items:center;gap:10px}
.bubbles{flex:1;width:100%;min-height:0;position:relative}
.bubble{
  position:absolute;inset:0;width:100%;
  background:var(--white);padding:16px;
  border-radius:24px 24px 24px 4px;
  display:flex;flex-direction:column;align-items:flex-start;gap:10px;
  opacity:0;transition:opacity .45s ease;
}
.bubble.is-on{opacity:1}
.bubble__head{display:flex;align-items:center;gap:4px}
.ava32{width:32px;height:32px;flex:none;border-radius:100px;overflow:hidden;display:block}
.ava32 img{width:100%;height:100%;object-fit:cover}
.bubble__name{font-size:12px;line-height:14px;letter-spacing:-.23px;color:var(--text)}
.bubble__text{font-size:16px;line-height:19px;color:var(--text)}

/* pager: one white dot per message in the thread */
.pager{
  display:flex;align-items:center;gap:7px;padding:6px;
  background:rgba(0,0,0,.05);border-radius:100px;
}
.pager span{
  width:10px;height:10px;border-radius:50%;background:#fff;
  opacity:.55;transition:opacity .35s ease;
}
.pager span.is-on{opacity:1}

.reply{width:100%;height:120px;display:flex;flex-direction:column;justify-content:flex-end;gap:2px}
.reply__slot{width:100%;height:80px;padding:12px;display:flex;align-items:flex-end;position:relative}
.reply__bubble{
  position:absolute;left:0;right:0;bottom:0;margin:0 12px;
  background:var(--blue);color:#fff;padding:16px;
  border-radius:12px 12px 2px 12px;
  display:flex;align-items:center;justify-content:center;z-index:1;
}
.reply__text{
  font-size:16px;line-height:19.2px;font-weight:500;color:#fff;white-space:pre-wrap;
  min-height:19px;width:100%;
}
.reply__text::after{
  content:"";display:inline-block;width:2px;height:1em;vertical-align:-2px;
  background:#fff;margin-left:1px;animation:caret 1s steps(1) infinite;
}
@keyframes caret{0%,50%{opacity:1}51%,100%{opacity:0}}
.reply__meta{width:100%;padding:0 6px;display:flex;align-items:center}
.reply__meta p{font-size:12px;line-height:14px;color:var(--gray)}

/* local model */
.card--local{
  flex:1 1 0;min-height:0;width:100%;padding:0;
  flex-direction:row;justify-content:center;align-items:center;gap:10px;
}
.lock{width:14px;height:20px;flex:none;display:block}
.card__label--inline{font-weight:400;font-size:20px;color:var(--text)}

/* flight card feature */
.card--flight{
  height:401px;width:100%;flex:none;padding:24px;
  align-items:center;justify-content:flex-end;gap:24px;
}
/* white panel holding the flight summary + the agent checklist, blown up
   1.4x and hanging off the card's top-right corner just like the original */
.flightcard{
  position:absolute;top:-2px;right:-28px;width:263px;
  transform:scale(1.4);transform-origin:center;
  background:var(--white);border-radius:24px;padding:12px;z-index:1;
  display:flex;flex-direction:column;align-items:center;gap:12px;
}
.flightcard__inner{
  width:100%;height:120px;background:var(--white);border-radius:16px;padding:16px;
  box-shadow:0 1px 4px rgba(0,0,0,.15);
  display:flex;flex-direction:column;justify-content:flex-end;gap:12px;overflow:hidden;
}
.card--flight .fcard__title{font-size:9px}

/* browser-agent checklist — lives inside the white flight panel */
.steps{width:100%;padding-left:6px;display:flex;flex-direction:column;align-items:flex-start;gap:8px}
.step{
  display:flex;align-items:center;gap:4px;padding:2px;
  opacity:.001;transition:opacity .5s ease;
}
.step.is-on{opacity:1}
.step p{font-size:12px;line-height:14px;color:var(--text)}

/* spinner while pending, green tick once the step completes */
.step__icon{
  width:12px;height:12px;flex:none;border-radius:50%;position:relative;
  border:1.5px solid rgba(0,0,0,.14);border-top-color:rgba(0,0,0,.45);
  animation:spin .9s linear infinite;
}
.step.is-done .step__icon{
  border:0;background:var(--green);animation:none;
}
/* the tick is centred by its own box (margins are half its size), then
   rotated about that centre — with a 0.6px lift for optical centring */
.step.is-done .step__icon::after{
  content:"";position:absolute;left:50%;top:50%;
  width:3px;height:6px;margin:-3.6px 0 0 -1.5px;
  border:solid #fff;border-width:0 1.5px 1.5px 0;
  transform:rotate(45deg);
}
@keyframes spin{to{transform:rotate(360deg)}}
.card__spacer{height:20px;width:100%;flex:none}

/* tone of voice */
.card--tone{height:300px;width:100%;gap:24px;justify-content:center}
/* authored as a fixed 752x204 canvas — the knob's route is in px — and scaled
   down as one unit when the card is narrower (script.js sets --tone-scale).
   The negative margin gives back the layout height the transform doesn't. */
.tone{
  flex:none;width:752px;height:204px;align-self:flex-start;
  position:relative;overflow:clip;border-radius:24px;
  transform:scale(var(--tone-scale,1));transform-origin:0 0;
  margin-bottom:calc(204px * (var(--tone-scale,1) - 1));
}
/* One 14s timeline drives the knob, the blue wash, the orange wash and the dot
   hue. The knob's position lives in two inherited custom properties, --kx and
   --ky, animated separately: X uses the "finger" curve (quick start, soft
   settle) and Y a slightly earlier one, so each leg bows into an arc instead
   of tracing a straight line. Rests at every stop keep the shared percentages
   still; only the drags ease. */
@property --kx{syntax:"<length>";inherits:true;initial-value:0px}
@property --ky{syntax:"<length>";inherits:true;initial-value:0px}
.tone{
  --finger:cubic-bezier(.72,0,.16,1);
  --finger-y:cubic-bezier(.3,0,.2,1);
  animation:toneX 14s var(--finger) infinite,toneY 14s var(--finger-y) infinite;
}
/* stops: top-right → bottom-centre → top-left → bottom-left → up by the
   "Friendly" pill → bottom-right → home. ~0.85s rest, ~1.5s move. */
@keyframes toneX{
  0%,6%{--kx:0px}
  17%,23%{--kx:-300px}
  34%,40%{--kx:-540px}
  51%,57%{--kx:-430px}
  68%,74%{--kx:-180px}
  85%,91%{--kx:-80px}
  100%{--kx:0px}
}
@keyframes toneY{
  0%,6%{--ky:0px}
  17%,23%{--ky:100px}
  34%,40%{--ky:20px}
  51%,57%{--ky:110px}
  68%,74%{--ky:30px}
  85%,91%{--ky:100px}
  100%{--ky:0px}
}

/* two oversized radial washes; the visible one tracks the knob, so the grid
   tiles above them read as a coloured heat-map */
.tone__blob{position:absolute;border-radius:50%}
.tone__blob--blue{
  width:1126px;height:1126px;top:-489px;left:37px;
  background:radial-gradient(circle,rgba(0,111,255,.85) 0%,rgba(0,111,255,.4) 34%,rgba(0,111,255,0) 62%);
  transform:translate3d(calc(var(--kx) * var(--kscale-x,1)),calc(var(--ky) * var(--kscale-y,1)),0);
}
.tone__blob--orange{
  width:852px;height:852px;top:-272px;left:-356px;
  background:radial-gradient(circle,rgba(255,150,40,.9) 0%,rgba(255,120,30,.45) 34%,rgba(255,90,31,0) 64%);
  opacity:0;animation:blobTrackWarm 14s var(--finger) infinite;
}
@keyframes blobTrackWarm{
  0%,26%{opacity:0;transform:translate3d(calc(320px * var(--kscale-x,1)),0,0)}
  34%{opacity:1;transform:translate3d(calc(90px * var(--kscale-x,1)),calc(20px * var(--kscale-y,1)),0)}
  51%,57%{opacity:1;transform:translate3d(calc(200px * var(--kscale-x,1)),calc(110px * var(--kscale-y,1)),0)}
  66%,100%{opacity:0;transform:translate3d(calc(420px * var(--kscale-x,1)),0,0)}
}

.tone__grid{
  position:absolute;inset:0;display:grid;gap:2px;
  grid-template-rows:repeat(6,minmax(0,1fr));
  grid-template-columns:repeat(22,minmax(0,1fr));
  justify-content:center;
}
.tone__grid span{
  display:block;width:100%;height:100%;
  background:linear-gradient(180deg,rgba(255,255,255,.2) 0%,rgba(255,255,255,.5) 100%);
  -webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);
  box-shadow:0 1px 1px rgba(0,0,0,.15);
}
.tone__knob{
  position:absolute;top:40px;right:40px;width:80px;height:80px;z-index:5;border-radius:100px;
  background:rgba(255,255,255,.1);
  -webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);
  display:flex;align-items:center;justify-content:center;
  transform:translate(calc(var(--kx) * var(--kscale-x,1)),calc(var(--ky) * var(--kscale-y,1)));
}
.tone__knob::before{
  content:"";position:absolute;width:48px;height:48px;border-radius:100px;
  background:linear-gradient(180deg,#fff 0%,#fff 58%);z-index:1;
}
.tone__dot{
  position:absolute;width:16px;height:16px;border-radius:100px;background:#006FFF;z-index:2;
  animation:dotHue 14s var(--finger) infinite;
}
@keyframes dotHue{
  0%,26%{background:#006FFF}
  34%,57%{background:#FF7A1F}
  66%,100%{background:#006FFF}
}
.tone__pill{
  position:absolute;z-index:4;padding:12px;border-radius:100px;
  background:rgba(255,255,255,.2);
  -webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);
  display:flex;align-items:center;justify-content:center;
}
.tone__pill p{font-size:12px;line-height:14px;color:var(--text);white-space:pre}
.tone__pill--a{top:12px;left:353px}
.tone__pill--b{bottom:97px;left:12px}
.tone__pill--c{bottom:97px;right:12px}

/* ==========================================================================
   ASSISTANT
   ========================================================================== */
.assistant{
  width:100%;height:100vh;
  display:flex;flex-direction:column;justify-content:center;align-items:center;gap:32px;
  overflow:clip;
}
.assistant__head{width:800px;max-width:calc(100% - 40px);display:flex;flex-direction:column;gap:10px}
/* both lines live in one text block, so there is no gap between them —
   the 10px gap above is between blocks, and there is only one */
.assistant__head .h2{white-space:pre}
.assistant__stage{width:80%}
.assistant__row{
  width:100%;
  display:flex;justify-content:center;align-items:center;gap:120px;
  padding:80px 20px;overflow:hidden;position:relative;
}

/* Mini phone: authored at its 196x418 design size, then scaled 1.3x as a
   whole — it reserves 196px of layout width and overflows visually, which is
   exactly what the original does. */
.miniphone-reveal{width:196px;height:418px;flex:none;position:relative}
.miniphone{
  width:196px;height:418px;position:relative;
  transform:scale(1.3);
}
.miniphone__shell{
  position:absolute;inset:0;z-index:1;
  background:var(--paper);border-radius:25px;
  box-shadow:0 0 1px rgba(0,0,0,.1);
  pointer-events:none;
}
.miniphone__home{
  position:absolute;bottom:8px;left:calc(50% - 42px);width:84px;height:4px;z-index:3;
}
.miniphone__home::after{
  content:"";position:absolute;top:1px;left:11px;width:56px;height:2px;
  background:var(--text);border-radius:1px;
}
.miniphone__content{
  position:relative;z-index:2;width:100%;height:100%;
  display:flex;flex-direction:column;justify-content:flex-start;align-items:center;gap:14px;
  padding:50px 12px 12px;
}
.miniphone__notch{
  position:absolute;top:14px;left:67px;width:64px;height:18px;
  background:var(--text);border-radius:9px;z-index:4;
}

.ask{
  width:100%;background:var(--blue);
  border-radius:16px 16px 2px 16px;padding:10px 12px;
  display:flex;justify-content:flex-end;align-items:flex-end;
  box-shadow:inset 1px 1px 1px #fff,inset -1px -1px 1px rgba(255,255,255,.8);
}
.ask p{font-size:12px;line-height:14px;color:#fff}

/* one demo is mounted at a time; each flow has its own rhythm between blocks */
.flow{width:100%;display:flex;flex-direction:column;align-items:center;gap:14px}
.flow--insights{gap:10px}
.flow--actions{gap:16px}

.answer{width:100%;display:flex;flex-direction:column;align-items:center;gap:10px}
.answer--tight{gap:8px}
.answer__typed{width:140px;align-self:flex-start;display:flex;align-items:center;min-height:1em}
.answer__typed span{
  font-size:12px;line-height:1.2em;letter-spacing:-.03em;color:var(--gray);
  white-space:pre-wrap;width:140px;
}
.answer__typed b{font-weight:400;color:var(--text)}
.answer__typed--wide{width:100%;padding:0 6px}
.answer__typed--wide span{width:100%}
.answer__typed--light span{color:#CCC}
.answer__typed--light b{color:#000}

/* the phone's answer card: white shell that rises in once its demo says so */
.pcard{
  width:100%;background:var(--white);border-radius:16px;padding:12px;
  box-shadow:0 1px 1px rgba(0,0,0,.05);
  display:flex;flex-direction:column;align-items:flex-start;gap:10px;overflow:hidden;z-index:1;
  opacity:.001;transform:translateY(20px);
  transition:opacity .6s cubic-bezier(.44,0,.56,1),transform .6s cubic-bezier(.44,0,.56,1);
}
.pcard.is-on{opacity:1;transform:none}

/* the two thumbnails are tilted a few degrees towards each other, and each
   crops a much larger image — sizes are explicit so the insets can't be
   re-resolved against the images' intrinsic dimensions */
.event__media{width:100%;height:60px;position:relative}
.event__photo{
  position:absolute;top:48%;left:6px;transform:translateY(-50%) rotate(-3deg);
  width:54px;height:54px;border-radius:8px;overflow:hidden;
  box-shadow:0 2px 8px rgba(0,0,0,.25);
}
.event__photoImg{position:absolute;bottom:-17px;left:0;width:161px;height:91px}
.event__map{
  position:absolute;top:48%;left:51%;transform:translate(-50%,-50%) rotate(3deg);
  width:54px;height:54px;border-radius:8px;overflow:hidden;
  box-shadow:0 2px 8px rgba(0,0,0,.25);
}
.event__mapImg{position:absolute;top:-8px;left:-61px;width:219px;height:485px}
.event__photoImg img{width:100%;height:100%;object-fit:contain;max-width:none}
.event__mapImg img{width:100%;height:100%;object-fit:fill;max-width:none}
.event__pin{position:absolute;bottom:12px;left:29px;width:14px;height:16px;z-index:2}

.event__body{width:100%;display:flex;align-items:flex-start;gap:12px}
.event__date{
  align-self:stretch;padding:8px;border-radius:8px;background:rgba(0,0,0,.05);
  display:flex;flex-direction:column;justify-content:center;align-items:center;gap:3px;
}
.event__day{font-size:10px;line-height:12px;letter-spacing:-.26px;text-align:center;color:var(--text)}
.event__mon{font-size:10px;line-height:12px;letter-spacing:-.45px;text-align:center;color:var(--ink-ios)}
.event__meta{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
.event__title{font-size:10px;line-height:12px;letter-spacing:-.26px;color:var(--text)}
.event__sub{font-size:10px;line-height:12px;letter-spacing:-.23px;color:var(--ink-ios)}

.event__rule{width:100%;height:1px;background:#F2F2F7}

.event__foot{width:100%;display:flex;justify-content:space-between;align-items:center}
.event__who{display:flex;align-items:center;gap:4px}
.ava18{width:18px;height:18px;flex:none;border-radius:100px;overflow:hidden;display:block}
.ava18 img{width:100%;height:100%;object-fit:cover}
.event__who p{font-size:10px;line-height:10px;letter-spacing:-.23px;color:var(--text)}
.event__going{background:var(--green);border-radius:24px;padding:2px}
.event__going p{
  font-size:8px;line-height:13px;font-weight:500;letter-spacing:.06px;color:#fff;padding:0 4px;
}

/* ---------- spend card (insights demo) ---------- */
.spend__top{width:100%;display:flex;justify-content:space-between;align-items:flex-end}
.spend__logo{width:24px;height:24px;flex:none;border-radius:50%;overflow:hidden;display:block}
.spend__logo img{width:100%;height:100%}
.spend__amount{font-size:18px;line-height:22px;color:var(--text)}
.spend__rule{width:100%;height:1px;background:#F2F2F7}
.spend__label{width:100%;font-size:10px;line-height:12px;color:var(--gray)}

/* 17 columns for the 15th–31st; each bar grows from a hairline once the card
   is in, one after another. The white wash on the left fades the oldest days */
.bars{
  position:relative;width:100%;height:69px;
  display:flex;justify-content:flex-end;align-items:flex-end;gap:1px;
}
.bars::before{
  content:"";position:absolute;top:0;left:-12px;width:33px;height:69px;z-index:1;
  background:linear-gradient(90deg,#fff 21%,rgba(255,255,255,0) 100%);
}
.bars__col{
  flex:1;min-width:0;height:100%;
  display:flex;flex-direction:column;justify-content:flex-end;align-items:center;gap:4px;
}
.bars__bar{
  width:5px;height:1px;border-radius:8px;background:var(--muted);opacity:0;
  transition:height .55s cubic-bezier(.34,1.25,.64,1),opacity .3s ease;
  transition-delay:calc(var(--i) * 28ms);
}
.bars__col:last-child .bars__bar{background:var(--text)}
.bars.is-on .bars__bar{height:var(--h);opacity:1}
.bars__day{font-size:7px;line-height:8px;font-weight:500;color:var(--muted);white-space:pre}

.ride{width:100%;display:flex;justify-content:space-between;align-items:center}
.ride__stop{display:flex;align-items:center;gap:2px;font-size:7px;line-height:8px;color:var(--text)}
.ride__stop svg,.ride__hops svg{width:8px;height:8px;display:block;color:var(--text)}
.ride__hops{display:flex;color:var(--gray)}
.ride__hops svg{color:inherit}
.ride__pill{
  background:var(--text);color:#fff;border-radius:6px;padding:1px 4px;
  font-size:7px;line-height:8px;
}

/* ---------- flight check-in (actions demo) ---------- */
.mflight{gap:12px}
.msteps{width:100%;padding-left:6px;display:flex;flex-direction:column;align-items:flex-start}
.mstep{
  display:flex;align-items:center;gap:4px;padding:2px;
  opacity:.001;transition:opacity .4s cubic-bezier(.44,0,.56,1);
}
.mstep.is-on{opacity:1}
.mstep p{font-size:7px;line-height:8px;color:var(--text)}

/* 10px status glyph: 12 faint ticks while idle, the same ticks spinning with a
   brightness tail while loading, then a green disc that pops in with a drawn tick */
.mspin{width:10px;height:10px;flex:none;position:relative;display:block}
.mspin svg{position:absolute;inset:0;width:100%;height:100%;display:block}
.mspin__ticks line{stroke:#000;stroke-width:4;stroke-linecap:round;opacity:.2}
.mspin.is-loading .mspin__ticks{animation:spin 1s linear infinite;transform-origin:50% 50%}
.mspin.is-loading .mspin__ticks line{opacity:calc(.2 + var(--k) * .8)}
.mspin.is-done .mspin__ticks{display:none}
.mspin__ok{
  position:absolute;inset:0;border-radius:50%;background:var(--green);
  display:flex;align-items:center;justify-content:center;
  opacity:0;transform:scale(0);
  transition:transform .5s cubic-bezier(.34,1.56,.64,1),opacity .15s ease;
}
.mspin__ok svg{position:static;width:50%;height:50%}
.mspin__ok path{
  fill:none;stroke:#fff;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;
  stroke-dasharray:20;stroke-dashoffset:20;
  transition:stroke-dashoffset .3s ease .1s;
}
.mspin.is-done .mspin__ok{opacity:1;transform:scale(1)}
.mspin.is-done .mspin__ok path{stroke-dashoffset:0}

.dock--mini{
  position:absolute;left:0;right:0;bottom:0;
  padding:26px 12px 24px;gap:10px;justify-content:flex-start;
  background:linear-gradient(180deg,rgba(247,247,245,0) 0%,var(--paper) 32.79%);
}
.dock--mini .dock__field{box-shadow:0 1px 2px rgba(0,0,0,.05)}
.dock--mini .dock__field p{color:#8C8C8C;font-weight:400}
.dock--mini .dock__btn{box-shadow:0 1px 2px rgba(0,0,0,.05)}

/* claims */
.claims{
  width:340px;flex:none;
  display:flex;flex-direction:column;justify-content:center;align-items:center;gap:6px;
}
.claim{
  width:100%;background:var(--paper);border-radius:24px;padding:24px;border:0;margin:0;
  font:inherit;color:inherit;text-align:left;-webkit-appearance:none;appearance:none;
  display:flex;flex-direction:column;justify-content:center;align-items:center;
  opacity:.4;cursor:pointer;transition:opacity .4s ease;
}
.claim--on{opacity:1}
.claim:focus-visible{outline:2px solid var(--blue);outline-offset:2px}
.claim__title{
  display:block;width:100%;font-size:20px;line-height:1em;letter-spacing:-.03em;color:var(--text);
  font-feature-settings:'cv01' on,'cv09' on,'cv05' on,'ss03' on;
}
.claim__title--sm{font-size:18px}

/* the subline unfolds (grid-row 0fr → 1fr) so the stack re-settles with the
   same spring feel the original's layout animation has */
.claim__more{
  display:grid;grid-template-rows:0fr;width:100%;
  transition:grid-template-rows .4s cubic-bezier(.34,1.2,.64,1);
}
.claim__more > .claim__sub{overflow:hidden;min-height:0}
.claim__sub{
  display:block;width:100%;font-size:20px;line-height:1.2em;letter-spacing:-.01em;color:#999;
  text-wrap:balance;
  font-feature-settings:'cv09' on,'cv01' on,'cv05' on,'ss03' on;
}
.claim__sub--sm{font-size:18px}
.claim--on .claim__more{grid-template-rows:1fr}
.claim--on .claim__sub{padding-top:2px}
/* quirk kept from the original: the first claim keeps its subline while the third is active */
.claims[data-active="actions"] [data-claim="assistant"] .claim__more{grid-template-rows:1fr}
.claims[data-active="actions"] [data-claim="assistant"] .claim__sub{padding-top:2px}

/* ==========================================================================
   FOOTER
   ========================================================================== */
.footer{
  width:100%;background:var(--text);color:#FBFAF9;
  box-shadow:inset 0 1px 0 #eee;   /* hairline that doesn't add to height */
  padding:100px 20px;
  display:flex;justify-content:center;align-items:flex-start;gap:40px;
}
.footer a{color:#FBFAF9;text-decoration:none}
.footer a:hover{text-decoration:underline}

/* ==========================================================================
   SCROLL / LOAD REVEAL
   ========================================================================== */
[data-appear]{opacity:0;transform:translateY(20px);will-change:transform,opacity}
[data-appear].is-in{
  opacity:1;transform:none;
  transition:opacity .8s cubic-bezier(.44,0,.56,1),transform .8s cubic-bezier(.44,0,.56,1);
}
/* the hero fades only — it must not be translated, since its position is
   already resolved by the stage's own offsets */
[data-appear="hero"]{transform:none}
[data-appear="hero"].is-in{transition:opacity 1.2s cubic-bezier(.44,0,.56,1)}

/* ==========================================================================
   RESPONSIVE
   ========================================================================== */
/* The hero's phone is a stack of pixel-positioned layers, so narrower screens
   scale `.hand` as a single unit rather than re-laying-out its children —
   that keeps the screen overlay locked to the device in the photo. */
@media (max-width:1199.98px){
  .hero__row{gap:480px}
  .assistant__row{gap:64px}
}

@media (max-width:959.98px){
  .page{gap:0}

  /* hero: "Love Mail" on one line, then the phone in flow. The stage keeps
     its 500x499 design box (the screen overlay is pixel-locked to it) and the
     hand inside is scaled from its top edge; the box overflows the row
     symmetrically and .hero clips it. */
  .hero{height:auto;min-height:100svh;justify-content:flex-start;padding:128px 0 120px}
  .hero__row{
    gap:0 14px;flex-direction:row;flex-wrap:wrap;justify-content:center;align-items:flex-start;
    width:100%;min-height:0;
  }
  .hero__word{font-size:52px;line-height:1.1;padding:0;margin:0}
  .hero__word--love{order:0}
  .hero__word--mail{order:1}
  .hero__stage{
    order:2;position:relative;top:auto;left:auto;
    flex:none;width:500px;height:499px;
    /* box + margins = 100%, so it always wraps onto its own centred line */
    margin:40px calc(50% - 250px) 0;
  }
  .hand{transform:scale(1);transform-origin:50% 0}

  .h2,.manifesto__inner p{font-size:32px;line-height:40px}
  .manifesto{height:auto;padding:96px 0}

  .frow--top{height:auto;flex-direction:column}
  /* flex:none — their desktop flex-basis of 0 would otherwise override the height */
  .card--gmail,.card--voice{flex:none;width:100%;height:220px}
  .frow--mid{height:auto;flex-direction:column}
  .fcol{width:100%}
  .card--autoreply{height:420px}

  /* the flight panel is 263px wide; on a full-width card centre it and scale it */
  .card--flight{height:400px}
  .flightcard{
    top:12px;right:auto;left:50%;margin-left:-131.5px;
    transform:scale(1.3);transform-origin:50% 0;
  }

  .assistant{height:auto;padding:96px 0}
  .assistant__stage{width:100%}
  .assistant__row{flex-direction:column;padding:40px 20px;gap:48px}
  /* reserve the box the scaled phone really occupies, so it can't run into the claims */
  .miniphone-reveal{height:481px}
  .miniphone{transform:scale(1.15);transform-origin:50% 0}
}

@media (max-width:599.98px){
  .nav{padding-top:16px}
  .nav__pill{width:calc(100% - 32px)}

  .hero{padding:104px 0 32px}
  .hero__word{font-size:44px;line-height:1.1}
  .hand{transform:scale(.9)}

  .h2,.manifesto__inner p{font-size:24px;line-height:32px}
  .features__head,.features__grid,.manifesto__inner,.assistant__head{max-width:calc(100% - 32px)}
  .manifesto{padding:56px 0 64px}

  .features{padding:0 0 56px;gap:32px}
  .card{padding:20px}
  .card--autoreply{height:380px}
  .card--flight{height:372px}
  .flightcard{transform:scale(1.15)}

  /* tone card: a native phone-width variant rather than a shrunk desktop
     canvas — fewer columns, readable pills, the knob's route remapped to the
     card, and no per-tile backdrop blur (which iPhones pay for dearly) */
  .card--tone{height:auto}
  .tone{
    width:100%;height:170px;transform:none;margin:0;align-self:stretch;
    --tone-scale:1;--kscale-x:.42;--kscale-y:.6;
  }
  .tone__grid{grid-template-columns:repeat(12,minmax(0,1fr));grid-template-rows:repeat(5,minmax(0,1fr))}
  .tone__grid span{-webkit-backdrop-filter:none;backdrop-filter:none}
  .tone__blob--blue{width:560px;height:560px;top:-230px;left:-50px}
  .tone__blob--orange{width:440px;height:440px;top:-100px;left:-190px}
  .tone__knob{top:22px;right:22px;width:56px;height:56px}
  .tone__knob::before{width:34px;height:34px}
  .tone__dot{width:12px;height:12px}
  .tone__pill{padding:8px 10px}
  .tone__pill p{font-size:11px;line-height:13px}
  .tone__pill--a{top:10px;left:12px;right:auto}
  .tone__pill--b{bottom:10px;left:12px}
  .tone__pill--c{bottom:10px;right:12px}

  .assistant{padding:32px 0 64px}
  .assistant__row{padding:16px 16px 0;gap:32px}
  .claims{width:100%}
  .footer{padding:64px 20px}
}

@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.01ms !important;animation-iteration-count:1 !important;transition-duration:.01ms !important}
  [data-appear]{opacity:1;transform:none}
  .bars__bar,.mspin__ok path{transition-delay:0s !important}
}

/* ==========================================================================
   NOTE — /note manifesto page
   ========================================================================== */
a.nav__pill{text-decoration:none}

.note{
  width:100%;min-height:100vh;padding:200px 20px 140px;
  display:flex;flex-direction:column;align-items:center;
}
.note__inner{width:680px;max-width:100%;display:flex;flex-direction:column;gap:28px}
.note__title{font-size:40px;line-height:48px;font-weight:500;color:var(--text)}
.note__date{font-size:16px;line-height:24px;font-weight:400;color:var(--gray);margin-top:-16px}
.note__inner p{font-size:20px;line-height:30px;font-weight:400;color:var(--text)}
.note__inner b{font-weight:500}
.note__link{font-size:20px;line-height:30px}
.note__link a{color:var(--blue);text-decoration:none}
.note__link a:hover{text-decoration:underline}

@media (max-width:599.98px){
  .note{padding:140px 16px 96px}
  .note__title{font-size:28px;line-height:36px}
  .note__inner p,.note__link{font-size:17px;line-height:26px}
}

/* ==========================================================================
   DEMO — /demo page
   ========================================================================== */
/* the real page is a 1200px white column: a 96px looping clip up top, then
   three 800px rows pairing copy with a phone-shaped video, then the CTA */
.demo{
  width:100%;padding:140px 20px 120px;
  display:flex;flex-direction:column;align-items:center;gap:40px;
  font-family:"SF Pro Text",var(--sf);
}

.demo__loop{padding:40px;display:flex;justify-content:center}
.demo__loop video{width:96px;height:96px;object-fit:cover}

.demo__row{
  width:800px;max-width:100%;
  display:flex;justify-content:center;align-items:center;gap:32px;
}
.demo__text{
  flex:1;min-width:0;
  display:flex;flex-direction:column;gap:24px;
}
.demo__h{font-size:36px;line-height:1.2em;font-weight:500;margin:0;color:var(--text)}
.demo__lead,.demo__body{font-size:16px;line-height:1.4em;font-weight:400;color:var(--text)}
.demo__lead strong{font-weight:500}

/* speaker icon + label under the Core Email features copy */
.sound{
  display:flex;align-items:center;gap:10px;
  margin:0;padding:0;border:0;background:none;cursor:pointer;
  font:inherit;text-align:left;
}
.sound__icon{flex:none;display:block;color:var(--blue)}
.sound__label{font-size:36px;line-height:1.2em;font-weight:500;color:var(--text)}

/* phone-shaped video frame: 316x689, hairline border, soft shadow */
.demo__phone{flex:none}
.ytfacade{
  width:316px;height:689px;position:relative;overflow:clip;
  border:1px solid rgba(0,0,0,.05);border-radius:48px;
  background:var(--text);
  box-shadow:0 10px 20px rgba(0,0,0,.1);
  cursor:pointer;
}
.ytfacade img,.ytfacade iframe{
  position:absolute;inset:0;width:100%;height:100%;border:0;
}
.ytfacade img{object-fit:cover;max-width:none}
.ytfacade__play{
  position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);
  width:68px;height:48px;padding:0;border:0;background:none;cursor:pointer;
}
.ytfacade__play svg{display:block;opacity:.9;transition:opacity .2s ease}
.ytfacade:hover .ytfacade__play svg{opacity:1}

/* CTA pill, left-aligned with the 800px column */
.demo__ctaRow{width:800px;max-width:100%;display:flex;justify-content:flex-start}
.demo__cta{
  display:flex;align-items:center;gap:7px;
  padding:14px 20px;border-radius:100px;background:#F5F5F5;
  text-decoration:none;transition:background .2s ease;
}
.demo__cta:hover{background:#ECECEC;text-decoration:none}
.demo__ctaIcon{flex:none;display:block;color:var(--text)}
.demo__cta p{font-size:16px;line-height:1.2em;color:var(--text);white-space:pre}

@media (max-width:959.98px){
  .demo__row{flex-direction:column;gap:40px}
  /* the flipped row is video-first in the DOM; keep copy first when stacked */
  .demo__row--flip{flex-direction:column-reverse}
  .demo__text{width:100%;max-width:min(520px,100%)}
  .demo__ctaRow{max-width:min(520px,100%);justify-content:center}
}

@media (max-width:599.98px){
  .demo{padding:120px 16px 96px}
  .demo__h,.sound__label{font-size:28px}
  /* the leads' hard breaks are wider than a phone — let the text wrap */
  .demo__lead br{display:none}
  .ytfacade{
    width:min(316px,84vw);height:auto;aspect-ratio:316/689;
    border-radius:40px;
  }
}
