/* ==========================================================================
   Archivo, self-hosted.

   This used to be a <link> to fonts.googleapis.com. It cannot be, now that the
   site is served from the same Firebase Hosting origin as the guest app: that
   origin sends `default-src 'self'` with no font-src and no external style-src,
   so the Google Fonts stylesheet AND the gstatic webfont files are both
   blocked outright and every display heading silently falls back to Arial.

   Self-hosting is the fix that needs no CSP hole. Two subsets of the variable
   face (wdth 70-100, wght 600-900) — the same axes --font-display drives via
   font-stretch: 112%. Vietnamese is dropped; the site has no Vietnamese copy.
   ========================================================================== */
@font-face {
  font-family: 'Archivo';
  font-style: normal;
  font-weight: 600 900;
  font-stretch: 70% 100%;
  font-display: swap;
  src: url(/assets/fonts/archivo-latin.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Archivo';
  font-style: normal;
  font-weight: 600 900;
  font-stretch: 70% 100%;
  font-display: swap;
  src: url(/assets/fonts/archivo-latin-ext.woff2) format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* ==========================================================================
   PRESNT — web design tokens
   Ported 1:1 from JustUSApp/Views/Present/PresentTheme.swift so the site and
   the app read as one product. Live red is reserved for live state only.
   ========================================================================== */

:root {
  /* Colors */
  /* PAPER, not night. Ported 2026-08-23 to match the app: someone who reads
     this site and then opens PRESNT should not think they are two products.
     These are the same values as web/styles/tokens.css and PresentTheme.swift
     — --p-paper and --p-surface — and they must move together. */
  --bg:            #EAE2D4;
  --surface:       #000000;   /* full-bleed media stays black, as in the app */
  /* Mono, which is what theme.js actually applies on every page load
     (`var current = load() || clone(PRESETS.mono)` then `apply()` at the
     foot of the file). This static value only ever paints in two windows:
     the moment before theme.js runs, and forever if theme.js fails to
     load. Both used to show the retired JustUS brand purple, which is
     also what tripped scripts/checks/web-surfaces.sh check 1. The opt-in
     `violet` preset in theme.js keeps the original hue available via
     ?theme=violet — that one is deliberate; this one was a leftover. */
  /* There is no third colour in PRESNT. "Accent" on paper is just quieter
     ink, and the JustUS yellow is retired — the design system permits it on
     dark surfaces only, and there are none left on this site. */
  --accent:        rgba(10, 10, 12, 0.62);
  --highlight:     #0A0A0C;
  /* NO RED ON THE SITE (Cari, 2026-08-23). Red means live state and it belongs
     inside the product, not on a page that is describing it — and the red
     record dot has been retired from the app designs too. The tokens stay
     defined and resolve to INK so every rule that used them keeps working;
     removing the names would have meant hunting nine call sites for no gain. */
  --live-red:      #0A0A0C;
  --live-red-deep: #0A0A0C;

  /* INK. Every alpha below inverted with the ground — a white-on-dark scale
     left on paper is invisible, which is the failure mode the app's design
     system names first. The fractions match --p-ink-secondary / -hairline /
     -fill exactly rather than being re-eyeballed. */
  --text:          #0A0A0C;                    /* 15.4:1 on paper */
  --text-2:        rgba(10, 10, 12, 0.62);     /*  5.2:1 — AA body   */
  /* WAS 0.42, which measured 2.77:1 and failed AA even for LARGE text — the
     "hard to read" Cari reported. On this paper, ink needs 58% to clear 4.5:1,
     so a third tier that is genuinely quieter than --text-2 and still legible
     does not exist. 0.58 is the floor, and anything wanting to look lighter
     should get smaller or further away rather than fainter. */
  --text-3:        rgba(10, 10, 12, 0.58);     /*  4.5:1 — AA body   */
  --icon-muted:    rgba(10, 10, 12, 0.62);

  /* 45% is the 3:1 floor for a UI edge you actually need to see. */
  --stroke-soft:   rgba(10, 10, 12, 0.45);
  --hairline:      rgba(10, 10, 12, 0.12);
  --control-fill:  rgba(10, 10, 12, 0.06);

  /* Night ground — Discord's starfield dusk, rebuilt on our own purple.
     Top stays at the app's near-black so the nav matches the product. */
  /* The night ground is gone. These stay defined because the gradient and the
     starfield still reference them, and are set to paper so both resolve to a
     flat, quiet sheet rather than needing every rule that uses them rewritten.
     --star is transparent: the stars are still in the DOM and now paint
     nothing. */
  --night-top:     #EAE2D4;
  --night-mid:     #EAE2D4;
  --night-low:     #E3DACA;
  --star:          rgba(10, 10, 12, 0);

  /* CTA purple. Site buttons are PURPLE, never live red — red is reserved
     for live state and appears only inside the phone. */
  /* INK, not purple and never red. The old purple was the retired JustUS
     accent; red is reserved for live state and appears only inside the phone.
     A primary button on paper is ink with paper lettering, exactly like the
     app's pill. */
  --cta:           #0A0A0C;
  --cta-hover:     #221F1B;

  --pill-bg:       rgba(10, 10, 12, 0.92);
  --scrim:         rgba(0, 0, 0, 0.50);
  --pill-shadow:   rgba(10, 10, 12, 0.12);

  /* Spacing — the app's scale */
  --s-xs: 4px;  --s-s: 8px;  --s-m: 12px;  --s-l: 16px;  --s-xl: 24px;
  --s-2xl: 40px; --s-3xl: 64px; --s-4xl: 96px;

  /* Radii */
  --r-card: 32px;
  --r-halo: 48px;
  --r-screen: 44px;
  --r-pill: 999px;
  --r-thumb: 6px;

  /* Type. Body stays on the system stack so it reads exactly like the app.
     Display is Archivo pushed WIDE on its variable width axis — a heavy,
     slightly rounded grotesk set in caps, the Discord hero register. */
  --font: -apple-system, BlinkMacSystemFont, "SF Pro Text", "Segoe UI", system-ui,
          "Helvetica Neue", Arial, sans-serif;
  --font-display: "Archivo", "Archivo Narrow", "Helvetica Neue Condensed",
                  "Arial Narrow", var(--font);

  --shadow-float: 0 6px 12px var(--pill-shadow);
  /* Paper takes a much lighter shadow than night did — 0.55 black on #EAE2D4
     reads as a smudge rather than a lift. */
  --shadow-lift:  0 18px 48px rgba(10, 10, 12, 0.14);

  --measure: 68ch;
  --wrap: 1120px;
}

/* --------------------------------------------------------------- base --- */

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

html {
  scroll-behavior: smooth;
  -webkit-text-size-adjust: 100%;
}

body {
  margin: 0;
  /* One flat sheet of paper. The gradient was built for a night sky and on
     paper it only ever reads as a smudge. */
  background: var(--bg);
  color: var(--text);
  font-family: var(--font);
  font-size: 17px;
  line-height: 1.55;
  letter-spacing: -0.011em;
  -webkit-font-smoothing: antialiased;
  overflow-x: hidden;
}

img, svg, video { max-width: 100%; height: auto; display: block; }

a { color: inherit; }

h1, h2, h3, h4 {
  margin: 0 0 var(--s-l);
  letter-spacing: -0.03em;
  line-height: 1.08;
  font-weight: 700;
}

/* The display voice: heavy WIDE caps, leading pulled tight so a three-line
   statement reads as one block (Discord's hero grammar). Same Archivo as
   before, opposite end of its width axis. It carries page h1s and section
   h2s; card titles and in-article headings stay in the system face and
   sentence case, so the shout has something quiet to land on. */
h1, .display {
  font-family: var(--font-display);
  font-weight: 900;
  font-stretch: 112%;
  text-transform: uppercase;
  line-height: 0.9;
  letter-spacing: -0.015em;
  font-size: clamp(3rem, 8.5vw, 6rem);
  text-wrap: balance;
}

section > .wrap > .section-head h2,
.finale h2,
h2.display {
  font-family: var(--font-display);
  font-weight: 900;
  font-stretch: 112%;
  text-transform: uppercase;
  line-height: 0.9;
  letter-spacing: -0.015em;
  font-size: clamp(2.4rem, 6vw, 4.4rem);
  max-width: 16ch;
  text-wrap: balance;
}

h2 { font-size: clamp(1.9rem, 4.4vw, 3rem); }
h3 { font-size: clamp(1.15rem, 2.2vw, 1.4rem); }

p { margin: 0 0 var(--s-l); color: var(--text-2); max-width: var(--measure); }

.lede { font-size: clamp(1.05rem, 2.2vw, 1.3rem); color: var(--text-2); }

::selection { background: var(--accent); color: #fff; }

:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 3px;
  border-radius: 6px;
}

.skip-link {
  position: absolute; left: -9999px; top: 0; z-index: 100;
  background: var(--accent); color: #fff; padding: 12px 18px; border-radius: 0 0 12px 0;
}
.skip-link:focus { left: 0; }

.sr-only {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}

/* ------------------------------------------------------------ layout ---- */

.wrap {
  width: min(100% - 40px, var(--wrap));
  margin-inline: auto;
}

section { padding-block: clamp(64px, 11vw, 128px); position: relative; }

.eyebrow {
  font-size: 0.78rem;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-wrap: balance;
  text-transform: uppercase;
  color: var(--text-3);
  margin: 0 0 var(--s-m);
}

.section-head { max-width: 760px; margin-bottom: clamp(40px, 6vw, 72px); }

.hairline-top { border-top: 1px solid var(--hairline); }

/* ------------------------------------------------------------ pills ----- */

.pill {
  display: inline-flex; align-items: center; gap: 10px;
  min-height: 44px;
  padding: 12px 26px;
  border-radius: var(--r-pill);
  border: 1px solid var(--hairline);
  background: var(--pill-bg);
  backdrop-filter: blur(20px) saturate(160%);
  -webkit-backdrop-filter: blur(20px) saturate(160%);
  box-shadow: var(--shadow-float);
  color: var(--text);
  font-size: 1rem;
  font-weight: 600;
  text-decoration: none;
  cursor: pointer;
  transition: transform 0.2s ease, background 0.2s ease, border-color 0.2s ease;
}
.pill:hover { transform: translateY(-1px); border-color: var(--stroke-soft); }
.pill:active { transform: scale(0.97); }

/* Primary site CTA. PURPLE, not red — red is live state only, and on this
   site it appears nowhere outside the phone. */
.pill--cta {
  background: var(--cta);
  border-color: transparent;
  box-shadow: 0 8px 28px color-mix(in srgb, var(--cta) 45%, transparent);
}
.pill--cta:hover { background: var(--cta-hover); }

/* Secondary CTA: the white pill Discord pairs with its brand button. */
.pill--light {
  background: #fff; color: #14121C; border-color: transparent;
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.35);
}
.pill--light:hover { background: #f2f0ff; }

.pill--ghost { background: rgba(255, 255, 255, 0.06); }

/* Live red survives in exactly one place off-screen: the LIVE badge. */
.pill--live { background: var(--live-red); border-color: transparent; }
.pill--live:hover { background: var(--text-2); }
.pill--accent { background: var(--accent); border-color: transparent; }

.chip {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 6px 12px;
  font-size: 0.8rem; font-weight: 500;
  border-radius: var(--r-pill);
  border: 1px solid var(--hairline);
  background: rgba(255, 255, 255, 0.06);
  backdrop-filter: blur(20px);
  -webkit-backdrop-filter: blur(20px);
}
.chip--live { background: var(--live-red-deep); border-color: transparent; font-weight: 600; }


.live-dot {
  width: 8px; height: 8px; border-radius: 50%;
  /* Retired with the record dot. Kept as an ink mark so the wordmark's
     spacing does not shift, and no longer pulsing — nothing here is live. */
  background: var(--text);
  box-shadow: none;
  animation: none;
}
.chip--live .live-dot { background: #fff; }

@keyframes livePulse {
  /* The live pulse, in ink. Red left the site with the record dot. */
  from { opacity: 1;   box-shadow: 0 0 0 0 rgba(10, 10, 12, 0.35); }
  to   { opacity: 0.6; box-shadow: 0 0 0 7px rgba(10, 10, 12, 0); }
}

/* -------------------------------------------------------------- nav ----- */

.nav {
  position: sticky; top: 0; z-index: 50;
  /* Paper, translucent, so the page reads through it as it scrolls. Was a
     near-black slab left from the night palette — the last dark band on an
     otherwise paper page, and the most obvious thing on first paint. */
  background: rgba(234, 226, 212, 0.82);
  backdrop-filter: blur(24px) saturate(120%);
  -webkit-backdrop-filter: blur(24px) saturate(120%);
  border-bottom: 1px solid transparent;
  transition: border-color 0.3s ease;
}
.nav.is-stuck { border-bottom-color: var(--hairline); }

.nav__inner {
  display: flex; align-items: center; gap: 12px;
  height: 68px;
}

/* THE WORDMARK IS THE BRAND MARK. PRESNT has no symbol — Cari chose the
   one-line wordmark over a stacked variant when the app icon was set
   (c3fa0ab), and the shipping icon is that wordmark and nothing else.
   So the nav sets the same mark in the same face rather than inventing a
   second identity beside it.

   The dot that used to sit here was the retired live-record indicator, kept
   after the red left the site only so the spacing would not shift. A mark
   nobody chose, surviving because removing it looked like work. */
.logo {
  font-family: var(--font-display);
  /* Matched against the shipping AppIcon-1024 by overlay, not by eye: the
     icon is the heaviest weight with the letters nearly kissing, which is
     what makes it read as a mark rather than as a word. 800/+0.06em — the
     old system-font setting — read as a caption of the brand name. */
  font-weight: 900;
  font-stretch: 100%;      /* the icon's width, not the display face's 112% */
  font-size: 1.16rem;
  letter-spacing: -0.022em;
  text-decoration: none;
  display: inline-flex; align-items: center;
  gap: 0.42em;
  margin-right: auto;   /* was carried by the pre-launch chip, now removed */
}
.footer .logo { margin-right: 0; }

/* The tagline, set as a statement rather than as body copy. It is the line
   the brand is, so it gets the display face and sits directly under the
   wordmark it belongs to. */
.footer__tagline {
  font-family: var(--font-display);
  font-weight: 800;
  font-stretch: 100%;
  font-size: 1.02rem;
  letter-spacing: -0.015em;
  color: var(--text);
  margin: 10px 0 6px;
  max-width: 20ch;
}

/* PRESNT's symbol: two ink ovals, two people side by side. It is the mark
   already on the browser tab (web/favicon.svg) and the touch icon, so putting
   it beside the wordmark makes the tab and the page agree instead of the site
   carrying a nameless dot while the tab carried the real thing.
   Inline SVG rather than an <img>: it inherits currentColor, so the dark
   footer needs no second copy, and it costs no request. */
.logo__mark {
  height: 0.92em;
  width: auto;
  display: block;
  flex: 0 0 auto;
}

/* The bar carries the wordmark and nothing else. Every route out of a page
   lives in the footer instead. */

/* ---------------------------------------------------------- starfield --- */

/* Discord scatters stars across its dusk. Three tiled radial-gradient layers
   at different scales — no image, no canvas, no request. */
.stars {
  position: fixed; inset: 0; z-index: 0;
  pointer-events: none;
  opacity: 0.6;
  background-image:
    radial-gradient(1.4px 1.4px at 18% 22%, var(--star), transparent),
    radial-gradient(1.2px 1.2px at 72% 14%, var(--star), transparent),
    radial-gradient(1.6px 1.6px at 41% 63%, var(--star), transparent),
    radial-gradient(1.1px 1.1px at 88% 47%, var(--star), transparent),
    radial-gradient(1.3px 1.3px at 8% 76%, var(--star), transparent),
    radial-gradient(1px 1px at 57% 88%, var(--star), transparent);
  background-size: 420px 420px, 300px 300px, 520px 520px,
                   360px 360px, 480px 480px, 260px 260px;
  animation: twinkle 7s ease-in-out infinite alternate;
}
@keyframes twinkle { from { opacity: 0.42; } to { opacity: 0.72; } }

body > * { position: relative; z-index: 1; }

/* ------------------------------------------------------------- hero ----- */

.hero {
  /* Tightened after Cari pointed at the dead band between the sticky nav and
     the eyebrow. This was set when a bordered pre-launch banner sat above the
     nav and the page needed air to recover from it; the banner is long gone
     and the padding outlived its reason. Every pixel taken here is a pixel the
     product cluster gains at the bottom of the fold. */
  padding-top: clamp(20px, 2.6vw, 36px);
  padding-bottom: 0;              /* the surface cluster owns the lower edge */
  position: relative;
  overflow: hidden;               /* crops the outer cards at the viewport */
  text-align: center;
}

.hero__inner { position: relative; z-index: 1; }

/* EVERY PARAGRAPH IN THE HERO CENTRES ITSELF.
   The global `p { max-width: var(--measure) }` applies here too, so any <p>
   without auto side-margins becomes a narrow box pinned to the LEFT of a
   centred column — its text centred inside that box, and the box in the wrong
   place. It looks like a mis-centred line and reads as a mistake.
   It shipped exactly that way: the eyebrow's own rule carried a tracking
   override AND `margin-inline: auto`, and when the tracking override stopped
   being needed I deleted the whole rule, taking the centring with it. The
   eyebrow went to production 277px left of the headline.
   Setting it once here means no future paragraph in the hero can lose it. */
.hero p { margin-inline: auto; }

/* The statement column. Narrower than the page so the line breaks fall where
   the sentence does, not where the container happens to end. */
.hero h1 {
  /* SMALLER THAN THE GLOBAL h1 ON PURPOSE. It was sized when it was the only
     thing above the fold; it now shares the hero with a sub-line, a lede, the
     form and its note, and at the global clamp (up to 6rem) three lines of caps
     ate ~40% of the viewport and pushed the product screenshots off the bottom
     of the screen. The argument was crowding out the proof. */
  font-size: clamp(2.5rem, 6.2vw, 4.4rem);
  max-width: 15ch;
  margin-inline: auto;
  margin-bottom: var(--s-m);
}
.hero .lede {
  max-width: 52ch;
  margin-inline: auto;
  margin-bottom: clamp(28px, 4vw, 40px);
  /* Even the rag. Centred copy has no left margin for the eye to return to,
     so a long-then-short pair reads worse than it would flush left. */
  text-wrap: balance;
}
/* NO TRACKING OVERRIDE HERE ANY MORE. It was halved to 0.07em while this line
   read "For creators and streamers who already have an audience" — 54
   characters of letterspaced caps, which is a label treatment applied to a
   sentence. Cari cut it to "For creators and streamers", so it is a label
   again and inherits the site's eyebrow setting like every other one.
   The disqualifier is not lost: the H1 directly beneath says "You already have
   the audience." in the largest type on the page, and the two together were
   saying it twice. */
.hero .eyebrow { margin-bottom: var(--s-m); }

.hero .waitlist { justify-content: center; margin-inline: auto; }
.hero .cta-note {
  margin-top: var(--s-m);
  margin-inline: auto;
  max-width: 46ch;
  /* Stops a single word being stranded on its own line directly under the
     button. It was orphaning "live." — a one-word line at the exact moment the
     page asks for an email address. */
  text-wrap: balance;
}

/* ---------------------------------------------- the product surfaces ---- */
/* Real crops of the shipping build, arranged as a cluster rather than a
   device frame. A flex row (not absolute positioning) so the composition
   survives every viewport width instead of only the one it was tuned at —
   each card carries its own rotation and vertical offset. */

.surfaces {
  display: flex;
  justify-content: center;
  align-items: flex-start;
  gap: clamp(10px, 2.2vw, 30px);
  margin-top: clamp(46px, 6.5vw, 84px);
  /* The cluster bleeds past the text column and is cropped by .hero. */
  width: max-content;
  margin-inline: auto;
  padding-bottom: clamp(40px, 6vw, 80px);
}

.surface {
  margin: 0;
  flex: 0 0 auto;
  width: clamp(178px, 27vw, 330px);
  border-radius: 20px;
  overflow: hidden;
  background: var(--card, #E3DACA);
  border: 1px solid var(--hairline);
  /* Two shadows: a wide soft drop that lifts the card off the paper, and a
     tight one at the contact edge so it does not look like it is hovering. */
  box-shadow:
    0 28px 64px -28px rgba(10, 10, 12, 0.34),
    0 3px 10px -4px rgba(10, 10, 12, 0.16);
}
.surface img { width: 100%; height: auto; display: block; }

/* ENTRANCE. The cards rise into place one after another when the hero comes
   into view, which on this page is immediately on load.

   WRITTEN OUT LONGHAND, both states, on purpose. The obvious way is a shared
   `.reveal` class, but `.reveal.is-in { transform: none }` outranks
   `.surface--request` and would silently flatten the rotations that make this
   a cluster rather than a row. The tidier way is a --enter custom property
   composed into one transform, and that works — but it depends on a var()
   change triggering a transform transition, which is exactly the kind of
   cleverness this codebase keeps getting punished for. Two explicit states
   cannot surprise anyone.

   The container carries `reveal` only so the observer sees it; it is pinned
   visible here so the group does not fade as a block on top of the stagger. */
.surfaces.reveal { opacity: 1; transform: none; }

.surface {
  opacity: 0;
  transition: opacity 0.6s ease, transform 0.7s cubic-bezier(0.2, 0.7, 0.3, 1);
}
.surface--request { transform: rotate(-4deg)   translateY(34px);  transition-delay: 0ms;   }
.surface--earn    { transform: rotate(2.5deg)  translateY(14px);  transition-delay: 90ms;  }
.surface--calls   { transform: rotate(-1.5deg) translateY(84px);  transition-delay: 180ms; }

.surfaces.is-in .surface { opacity: 1; }
.surfaces.is-in .surface--request { transform: rotate(-4deg)   translateY(4px);   }
.surfaces.is-in .surface--earn    { transform: rotate(2.5deg)  translateY(-16px); }
.surfaces.is-in .surface--calls   { transform: rotate(-1.5deg) translateY(54px);  }

/* Under a phone width the cluster stops being a composition and starts being
   three tiny illegible cards. Keep the one that explains the product. */
@media (max-width: 720px) {
  .surfaces { width: auto; gap: 0; }
  .surface--earn, .surface--calls { display: none; }
  .surface--request,
  .surfaces.is-in .surface--request {
    width: min(300px, 78vw);
    transform: translateY(22px);
  }
  .surfaces.is-in .surface--request { transform: none; }
}

.cta-note { font-size: 0.85rem; color: var(--text-3); margin-top: var(--s-l); }

/* Captions under the product crops.
   Hopkins held that the line under a picture is read more often than the body
   copy, and our own App Store notes say the same thing — "most people read the
   caption and swipe". These figures had no captions at all, so the only text
   describing them lived in `alt`, which a sighted reader never sees.
   WHAT THESE DELIBERATELY DO NOT SAY: the dollar totals. An alt attribute
   describes a picture; a figcaption is body copy in our own voice, and
   "a creator earned $40.50 this week" is an outcome claim with no
   substantiation while payments are in test mode. Durations, states and
   mechanics are claims about how the product BEHAVES, and those are true
   today. */
.surface__cap {
  margin: 0;
  padding: 12px 14px 14px;
  font-size: 0.72rem;
  line-height: 1.45;
  color: var(--text-2);
  text-align: left;
  border-top: 1px solid var(--hairline);
  background: color-mix(in srgb, var(--bg) 72%, transparent);
}
.surfaces__note {
  margin: clamp(20px, 3vw, 30px) auto 0;
  font-size: 0.72rem;
  color: var(--text-3);
  text-align: center;
  max-width: 46ch;
}

/* The hero's second line is the TAGLINE ITSELF, with one word of hinge.
   It briefly read "Put a price on the next ten minutes of your time" — the
   audit wanted a figure here, but ten is not a default anywhere in the
   product, so it was an invented number that also anchored low. Specificity
   is worth having where it is TRUE (the held card in the lede, the captions,
   the itemised step) and worth nothing where it is manufactured.
   "Now" carries the turn: the headline states what the reader already has,
   this states the thing they have not done with it. And it means the nav,
   the footer, the page title, the App Store subtitle and the hero all say the
   same five words instead of five variants. */
.hero__sub {
  /* THE SYSTEM FACE, NOT THE DISPLAY ONE. Set in Archivo it was a second
     headline arguing with the first — three typographic voices stacked (huge
     display, small display, system) and the reader had to work out which two
     belonged together. In the body face it reads as the back half of one
     sentence: the H1 names what you have, this names what you have not done
     with it. Larger and darker than the lede so the ladder still descends. */
  font-family: var(--font);
  font-weight: 600;
  font-size: clamp(1.1rem, 2.2vw, 1.45rem);
  letter-spacing: -0.015em;
  line-height: 1.3;
  color: var(--text);
  max-width: 26ch;
  margin: 0 auto var(--s-m);
  text-wrap: balance;
}

@media (max-width: 720px) {
  .surface__cap { font-size: 0.78rem; }
}

/* --------------------------------------------------------------- reel --- */

.reel { padding-block: clamp(64px, 9vw, 116px); }

.reel__grid {
  display: grid;
  grid-template-columns: 1fr minmax(0, 300px);
  gap: clamp(36px, 6vw, 88px);
  align-items: center;
}
.reel__copy h2 { margin-bottom: var(--s-xl); }

.reel__steps {
  list-style: none;
  margin: 0; padding: 0;
  display: grid; gap: var(--s-l);
  counter-reset: step;
  max-width: 46ch;
}
.reel__steps li {
  counter-increment: step;
  position: relative;
  padding-left: 40px;
  font-size: 0.96rem;
  color: var(--text-2);
}
.reel__steps li::before {
  content: counter(step);
  position: absolute; left: 0; top: -1px;
  width: 26px; height: 26px;
  display: grid; place-items: center;
  border-radius: 50%;
  border: 1px solid var(--stroke-soft);
  font-size: 0.78rem; font-weight: 700;
  color: var(--text);
  font-variant-numeric: tabular-nums;
}
.reel__steps strong { color: var(--text); font-weight: 600; }

/* A frame, not a phone. A skeuomorphic handset would be a second illustration
   competing with the real screens inside it; this is the same shadow and
   radius language the hero cards already use, so the two read as one family. */
.reel__device {
  margin: 0;
  border-radius: 26px;
  overflow: hidden;
  background: var(--surface, #000);
  border: 1px solid var(--hairline);
  box-shadow:
    0 34px 74px -30px rgba(10, 10, 12, 0.38),
    0 3px 12px -5px rgba(10, 10, 12, 0.18);
}
.reel__video { display: block; width: 100%; height: auto; }

@media (max-width: 880px) {
  .reel__grid { grid-template-columns: 1fr; justify-items: center; }
  .reel__copy { justify-self: stretch; }
  .reel__device { width: min(300px, 74vw); }
}

/* prefers-reduced-motion is handled in JS as well as here: `autoplay` is an
   attribute, and CSS cannot stop a video that has already started. This rule
   is the belt to that braces — the poster stays put and nothing loops. */
@media (prefers-reduced-motion: reduce) {
  .reel__video { animation: none; }
}

/* ------------------------------------------------------ privacy strip --- */
.privacy-strip {
  padding-block: clamp(36px, 5vw, 56px);
  border-top: 1px solid var(--hairline);
}
.privacy-strip .privacy {
  /* .privacy still carries the rule it needed when it sat inside the hero
     column; in its own strip that doubles the section's hairline. */
  margin: 0 auto;
  padding-top: 0;
  border-top: 0;
}
/* --------------------------------------------------------- how it works - */

.steps {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: var(--s-xl);
  counter-reset: step;
}
.step {
  padding: var(--s-xl);
  border-radius: var(--r-card);
  border: 1px solid color-mix(in srgb, var(--accent) 20%, transparent);
  background: linear-gradient(180deg, color-mix(in srgb, var(--accent) 14%, transparent), rgba(255, 255, 255, 0.025));
  box-shadow: 0 18px 44px rgba(6, 4, 22, 0.45);
}
.step__n {
  counter-increment: step;
  width: 34px; height: 34px; border-radius: 50%;
  display: grid; place-items: center;
  background: var(--cta); color: #fff;
  font-size: 0.85rem; font-weight: 700;
  margin-bottom: var(--s-l);
}
.step__n::before { content: counter(step); }
.step h3 { margin-bottom: 8px; }
.step p { font-size: 0.94rem; margin: 0; }

/* ------------------------------------------------------------- cards ---- */

.cards {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  gap: var(--s-l);
}
.card {
  padding: var(--s-xl);
  border-radius: var(--r-card);
  border: 1px solid color-mix(in srgb, var(--accent) 20%, transparent);
  background: linear-gradient(180deg, color-mix(in srgb, var(--accent) 16%, transparent), rgba(255, 255, 255, 0.03));
  box-shadow: 0 18px 44px rgba(6, 4, 22, 0.45);
}
.card h3 { margin-bottom: 10px; }
.card p { font-size: 0.94rem; margin: 0; }
.card__icon { font-size: 1.5rem; margin-bottom: var(--s-m); }

.card--feature { position: relative; overflow: hidden; }
.card--feature::after {
  /* Card glow, same reasoning as .hero::after. */
  background: none;
}


/* ------------------------------------------------------------ split ----- */

.split {
  display: grid; grid-template-columns: 1fr 1fr;
  gap: clamp(28px, 5vw, 72px); align-items: center;
}
@media (max-width: 860px) { .split { grid-template-columns: 1fr; } }

.list-check { list-style: none; padding: 0; margin: 0; }
.list-check li {
  position: relative; padding-left: 30px; margin-bottom: var(--s-m);
  color: var(--text-2); font-size: 0.97rem;
}
.list-check li::before {
  content: ""; position: absolute; left: 0; top: 8px;
  width: 8px; height: 8px; border-radius: 50%;
  background: var(--accent);
}

/* ----------------------------------------------------------- pricing ---- */

.pricebox {
  border-radius: var(--r-card);
  border: 1px solid var(--hairline);
  background: linear-gradient(180deg, color-mix(in srgb, var(--accent) 28%, transparent), rgba(255,255,255,0.03));
  border-radius: var(--r-halo);
  box-shadow: 0 30px 80px rgba(6, 4, 22, 0.55);
  padding: clamp(28px, 5vw, 52px);
  text-align: center;
}
.pricebox__n {
  font-size: clamp(3.6rem, 11vw, 6.4rem);
  font-weight: 800; letter-spacing: -0.05em; line-height: 1;
}
.pricebox__l { color: var(--text-2); margin-top: 8px; }
.pricebox__note { font-size: 0.85rem; color: var(--text-3); margin-top: var(--s-l); }

/* --------------------------------------------------------------- faq ---- */

.faq-list { border-top: 1px solid var(--hairline); max-width: 820px; }
.faq-item { border-bottom: 1px solid var(--hairline); }
.faq-item summary {
  cursor: pointer; list-style: none;
  padding: 22px 40px 22px 0;
  font-weight: 600; font-size: 1.02rem;
  position: relative;
}
.faq-item summary::-webkit-details-marker { display: none; }
.faq-item summary::after {
  content: "+"; position: absolute; right: 6px; top: 20px;
  font-size: 1.4rem; font-weight: 400; color: var(--text-3);
  transition: transform 0.25s ease;
}
.faq-item[open] summary::after { transform: rotate(45deg); }
.faq-item p { padding-bottom: 22px; font-size: 0.96rem; }

/* ------------------------------------------------------------- final ---- */

.finale {
  /* Finale glow. The section keeps its spacing and loses the wash. */
  background: none;
}

.finale h2 { margin-bottom: var(--s-m); }
.finale p { margin-inline: auto; }
.finale .cta-row { justify-content: center; }

/* ------------------------------------------------------------ footer ---- */

.footer {
  border-top: 1px solid var(--hairline);
  padding-block: var(--s-2xl);
  font-size: 0.88rem;
}
.footer__grid {
  display: grid; grid-template-columns: 1.4fr repeat(3, 1fr);
  gap: var(--s-xl);
}
@media (max-width: 780px) { .footer__grid { grid-template-columns: 1fr 1fr; } }
.footer h4 { font-size: 0.78rem; letter-spacing: 0.12em; text-transform: uppercase; color: var(--text-3); margin-bottom: var(--s-m); font-weight: 600; }
.footer ul { list-style: none; padding: 0; margin: 0; }
.footer li { margin-bottom: 9px; }
.footer a { color: var(--text-2); text-decoration: none; }
.footer a:hover { color: var(--text); }
.footer__legal { margin-top: var(--s-2xl); color: var(--text-3); font-size: 0.8rem; }

/* -------------------------------------------------------------- blog ---- */

.post-list { display: grid; gap: var(--s-l); max-width: 860px; }
.post-card {
  display: block; text-decoration: none;
  padding: var(--s-xl);
  border-radius: var(--r-card);
  border: 1px solid var(--hairline);
  background: linear-gradient(180deg, color-mix(in srgb, var(--accent) 13%, transparent), rgba(255,255,255,0.025));
  transition: border-color 0.2s ease, transform 0.2s ease, background 0.2s ease;
}
.post-card:hover { border-color: var(--stroke-soft); transform: translateY(-2px); background: rgba(255,255,255,0.045); }
.post-card h3 { margin-bottom: 8px; }
.post-card p { margin: 0; font-size: 0.94rem; }
.post-meta { font-size: 0.78rem; color: var(--text-3); margin-bottom: 10px; letter-spacing: 0.02em; }

.prose { max-width: 720px; }
.prose h2 { font-size: clamp(1.5rem, 3vw, 2rem); margin-top: var(--s-2xl); }
.prose h3 { margin-top: var(--s-xl); }
.prose ul, .prose ol { color: var(--text-2); padding-left: 22px; margin-bottom: var(--s-l); }
.prose li { margin-bottom: 8px; }
.prose blockquote {
  margin: var(--s-xl) 0; padding: var(--s-l) var(--s-xl);
  border-left: 3px solid var(--accent);
  background: rgba(255,255,255,0.03);
  border-radius: 0 var(--r-thumb) var(--r-thumb) 0;
  color: var(--text);
}
.prose blockquote p:last-child { margin-bottom: 0; }
.prose a { color: var(--accent); text-decoration: underline; text-underline-offset: 3px; }
.prose table { width: 100%; border-collapse: collapse; margin-bottom: var(--s-l); font-size: 0.94rem; }
.prose th, .prose td { text-align: left; padding: 10px 12px; border-bottom: 1px solid var(--hairline); color: var(--text-2); }
.prose th { color: var(--text); font-weight: 600; }
.table-scroll { overflow-x: auto; }

.page-head { padding-top: clamp(48px, 7vw, 80px); padding-bottom: clamp(24px, 4vw, 40px); }
.breadcrumb { font-size: 0.82rem; color: var(--text-3); margin-bottom: var(--s-m); }
.breadcrumb a { color: var(--text-3); text-decoration: none; }
.breadcrumb a:hover { color: var(--text); }

/* ------------------------------------------------------------ reveal ---- */

.reveal { opacity: 0; transform: translateY(18px); transition: opacity 0.7s ease, transform 0.7s ease; }
.reveal.is-in { opacity: 1; transform: none; }

/* ----------------------------------------------------- reduced motion --- */

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after {
    animation-duration: 0.001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.001ms !important;
  }
  .reveal { opacity: 1; transform: none; }
  /* The hero cards animate in, so their resting state is invisible. Under
     reduced motion they must simply be there, not depend on a transition. */
  .surface { opacity: 1; }
  .phone__camera { animation: none; }
}

/* ------------------------------------------------- article headline ----- */

/* Post titles keep the poster voice but step down a size, so an article
   opens like a magazine spread without shouting over its own body copy.
   Section and card headings inside the article stay in the system face. */
.post-title {
  font-size: clamp(2rem, 5vw, 3.4rem);
  max-width: 20ch;
  line-height: 0.94;
}

/* Standing pages (FAQ, Support, Privacy, Terms) take the poster voice. */
.page-head h1.display { margin-bottom: var(--s-l); }

/* ========================================================== backdrop ===== */

/* The video wall. Five WebGL scenes cross-fading behind everything. It sits
   below the starfield and below all content; a scrim over it keeps type
   legible no matter which scene is playing. */

.backdrop {
  position: fixed;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  overflow: hidden;
}

.backdrop__canvas {
  width: 100%;
  height: 100%;
  display: block;
}

/* Legibility scrim — darker top and bottom where the nav and copy live,
   more transparent through the middle so the scene still reads. */
.backdrop::after {
  content: "";
  position: absolute; inset: 0;
  background:
    linear-gradient(180deg,
      rgba(8, 8, 14, 0.86) 0%,
      rgba(8, 8, 14, 0.60) 26%,
      rgba(8, 8, 14, 0.58) 68%,
      rgba(8, 8, 14, 0.88) 100%);
}

/* No WebGL: the static night gradient underneath is already the fallback. */
.backdrop.is-fallback { display: none; }

/* When the backdrop is live, the body gradient steps back so the two
   don't fight each other. */
body.has-backdrop {
  background: var(--night-top);
}
body.has-backdrop .stars { opacity: 0.35; }

@media (prefers-reduced-motion: reduce) {
  .backdrop__canvas { animation: none; }
}

/* ------------------------------------------------------- tuning panel --- */
/* Dev-only. Opened with ?bg — removed before launch. */

.bg-panel {
  position: fixed; right: 18px; bottom: 18px; z-index: 90;
  width: 244px; padding: 14px 16px 12px;
  border-radius: 18px;
  background: rgba(12, 10, 24, 0.94);
  border: 1px solid color-mix(in srgb, var(--accent) 34%, transparent);
  box-shadow: 0 20px 50px rgba(0, 0, 0, 0.6);
  backdrop-filter: blur(20px);
  -webkit-backdrop-filter: blur(20px);
  font-size: 0.76rem;
  color: var(--text);
}
.bg-panel__head {
  display: flex; align-items: center; justify-content: space-between;
  font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase;
  font-size: 0.68rem; color: var(--text-3); margin-bottom: 10px;
}
.bg-panel__x {
  background: none; border: 0; color: var(--text-3);
  font-size: 1.1rem; line-height: 1; cursor: pointer; padding: 0 2px;
}
.bg-panel__x:hover { color: #fff; }

.bg-panel__scenes { display: grid; gap: 4px; margin-bottom: 12px; }
.bg-panel__scenes button,
.bg-panel__row button {
  font-family: inherit; font-size: 0.76rem;
  padding: 7px 10px; border-radius: 9px; cursor: pointer;
  background: rgba(255, 255, 255, 0.06);
  border: 1px solid transparent;
  color: var(--text-2); text-align: left;
}
.bg-panel__scenes button:hover,
.bg-panel__row button:hover { background: rgba(255, 255, 255, 0.12); color: #fff; }
.bg-panel__scenes button.is-on,
.bg-panel__row button.is-on {
  background: var(--cta); color: #fff; border-color: transparent;
}

.bg-panel label {
  display: flex; align-items: center; justify-content: space-between;
  gap: 10px; margin-bottom: 7px; color: var(--text-3);
}
.bg-panel input[type=range] { width: 120px; accent-color: var(--accent); }

.bg-panel__row {
  display: flex; gap: 4px; margin-top: 10px;
}
.bg-panel__row button { flex: 1; text-align: center; }

.bg-panel__note {
  margin: 10px 0 0; font-size: 0.7rem; color: var(--text-3);
}

/* ============================================================== theme ==== */

/* Brand colour lives in these tokens and in the shader's ink ramp, both owned
   by theme.js. Open the picker with ?theme on any page. Defaults below are
   only a fallback — theme.js overwrites them on :root at boot.
   --cta-ink is the text colour on a filled button, so a pale button stays
   readable when the theme is light. */
/* PAPER on an ink button. Inverted with the ground: white lettering on the
   new #0A0A0C CTA would still have read, but --cta-ink is the pair to --cta
   and leaving it white would have made the two drift the first time somebody
   picked a pale theme. */
:root { --cta-ink: #EAE2D4; }

.pill--cta { color: var(--cta-ink); }

.theme-panel {
  position: fixed; left: 18px; bottom: 18px; z-index: 95;
  width: 236px; padding: 14px 16px 12px;
  border-radius: 18px;
  background: rgba(12, 12, 16, 0.95);
  border: 1px solid rgba(255, 255, 255, 0.16);
  box-shadow: 0 20px 50px rgba(0, 0, 0, 0.65);
  backdrop-filter: blur(20px);
  -webkit-backdrop-filter: blur(20px);
  font-size: 0.76rem;
  color: var(--text);
}
.theme-panel__head {
  display: flex; align-items: center; justify-content: space-between;
  font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase;
  font-size: 0.68rem; color: var(--text-3); margin-bottom: 10px;
}
.theme-panel__x {
  background: none; border: 0; color: var(--text-3);
  font-size: 1.1rem; line-height: 1; cursor: pointer;
}
.theme-panel__x:hover { color: #fff; }

.theme-panel__presets { display: flex; flex-wrap: wrap; gap: 4px; }
.theme-panel__presets button,
.theme-panel__copy {
  font-family: inherit; font-size: 0.74rem;
  padding: 6px 10px; border-radius: 8px; cursor: pointer;
  background: rgba(255, 255, 255, 0.07);
  border: 1px solid transparent; color: var(--text-2);
}
.theme-panel__presets button:hover,
.theme-panel__copy:hover { background: rgba(255,255,255,0.14); color: #fff; }
.theme-panel__presets button.is-on {
  background: var(--cta); color: var(--cta-ink);
}

.theme-panel__note {
  margin: 9px 0 4px; font-size: 0.7rem; color: var(--text-3); line-height: 1.4;
}
.theme-panel__label {
  margin: 12px 0 6px; font-size: 0.64rem; letter-spacing: 0.1em;
  text-transform: uppercase; color: var(--text-3);
}
.theme-panel__stops { display: flex; gap: 5px; }
.theme-stop { flex: 1; text-align: center; }
.theme-stop span {
  display: block; font-size: 0.56rem; color: var(--text-3); margin-top: 3px;
}

.theme-row {
  display: flex; align-items: center; justify-content: space-between;
  margin-bottom: 5px; color: var(--text-3);
}

.theme-panel input[type=color] {
  width: 100%; height: 26px; padding: 0;
  border: 1px solid rgba(255,255,255,0.16); border-radius: 6px;
  background: none; cursor: pointer;
}
.theme-row input[type=color] { width: 56px; }

.theme-panel__copy { width: 100%; margin-top: 12px; text-align: center; }
.theme-panel__msg {
  margin: 9px 0 0; font-size: 0.66rem; color: var(--text-3); line-height: 1.4;
}

/* ------------------------------------------------------ privacy line --- */

/* The one claim on this page that is about safety rather than money, so it
   gets its own rule and its own mark instead of competing as a fourth stat. */
.privacy {
  display: flex;
  align-items: center;
  gap: var(--s-m);
  margin: var(--s-xl) 0 0;
  padding-top: var(--s-l);
  border-top: 1px solid var(--hairline);
  max-width: 46ch;
  font-size: 0.92rem;
  color: var(--text-2);
}
.privacy strong { color: var(--text); font-weight: 600; }
.privacy__at {
  flex: 0 0 34px;
  height: 34px;
  display: grid;
  place-items: center;
  border-radius: 50%;
  border: 1px solid color-mix(in srgb, var(--accent) 45%, transparent);
  color: var(--text);
  font-weight: 700;
  font-size: 1rem;
}

/* ---------------------------------------------------------- waitlist --- */

.waitlist {
  display: flex;
  gap: var(--s-m);
  flex-wrap: wrap;
  max-width: 34rem;
}
/*
 * NOT REDUNDANT. `hidden`'s display:none comes from the UA stylesheet, and
 * ANY author rule beats the UA sheet — so the flex above overrode it and
 * `form.hidden = true` in waitlist.js has never visually hidden this form:
 * a confirmed signup kept its empty email box on screen. Found by
 * screenshotting the success state, not by reading the code.
 */
.waitlist[hidden] { display: none; }
.waitlist__input {
  flex: 1 1 15rem;
  min-height: 52px;
  padding: 12px 18px;
  border-radius: var(--r-pill);
  border: 1px solid var(--hairline);
  background: rgba(255, 255, 255, 0.06);
  color: var(--text);
  font: inherit;
  font-size: 1rem;
  outline: none;
}
.waitlist__input::placeholder { color: var(--text-3); }
.waitlist__input:focus { border-color: var(--stroke-soft); }
.waitlist__go { flex: 0 0 auto; }
.waitlist__go[disabled] { opacity: 0.7; cursor: default; }

.cta-note.is-good { color: var(--text); }
.cta-note.is-bad { color: color-mix(in srgb, var(--live-red) 70%, white); }

/* ------------------------------------------- waitlist success ceremony ---
   The app's signature moment is the rim that ignites when a call runs short:
   a conic border that sweeps and pulses (web/styles/app.css `.rim`). This is
   that moment translated to paper. The gradient is INK, not red — red means
   live state and stays inside the phone — so the sweep reads as motion in the
   border's weight rather than a colour change. */

@property --wl-angle {
  syntax: "<angle>";
  initial-value: 0deg;
  inherits: false;
}

.wl-success {
  position: relative;
  max-width: 34rem;
  margin-top: var(--s-xl);
  border-radius: var(--r-card);
  background: rgba(255, 255, 255, 0.4);
  outline: none;
}

.wl-success[hidden] { display: none; }

/* Same masked-border construction as the app's `.rim`: the conic gradient
   fills the box, and the mask keeps only the outer ring of it. */
.wl-success__rim {
  position: absolute;
  inset: 0;
  border-radius: inherit;
  padding: 4px;
  background: conic-gradient(
    from var(--wl-angle),
    rgba(10, 10, 12, 0.9),
    rgba(10, 10, 12, 0.08),
    rgba(10, 10, 12, 0.9)
  );
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.6s ease;
  -webkit-mask:
    linear-gradient(#000 0 0) content-box,
    linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
  mask:
    linear-gradient(#000 0 0) content-box,
    linear-gradient(#000 0 0);
  mask-composite: exclude;
}

.wl-success.is-lit .wl-success__rim {
  opacity: 0.9;
  animation: wl-rim-sweep 6s linear infinite, wl-rim-pulse 2s ease-in-out infinite;
}

/* Browsers without @property (the sweep) still get the pulse. */
@keyframes wl-rim-sweep { to { --wl-angle: 360deg; } }
@keyframes wl-rim-pulse {
  0%, 100% { opacity: 0.5; }
  50%      { opacity: 0.9; }
}

.wl-success.is-in { animation: wl-enter 0.5s cubic-bezier(0.2, 0.7, 0.2, 1); }
@keyframes wl-enter {
  from { opacity: 0; transform: translateY(10px) scale(0.97); }
  to   { opacity: 1; transform: none; }
}

.wl-success__body {
  position: relative;
  padding: var(--s-xl);
  display: grid;
  gap: var(--s-l);
  text-align: left;
}

.wl-success__title {
  font: 700 1.35rem/1.25 var(--font);
  letter-spacing: -0.01em;
  margin: 0;
}

.wl-success__who { color: var(--text-2); margin: 0; }

.wl-success__expect {
  margin: 0;
  padding: 0;
  list-style: none;
  display: grid;
  gap: var(--s-m);
  color: var(--text-2);
  font-size: 0.95rem;
}

.wl-success__expect strong { color: var(--text); }

.wl-success__actions {
  display: flex;
  gap: var(--s-m);
  flex-wrap: wrap;
  margin-top: var(--s-s);
}

/* The hero centres its copy; the panel sits with the form it replaced. */
.hero .wl-success { margin-inline: auto; }

@media (prefers-reduced-motion: reduce) {
  .wl-success.is-in { animation: none; }
  /* The rim still marks the moment — it just stops moving. */
  .wl-success.is-lit .wl-success__rim { animation: none; opacity: 0.75; }
}
