@import url("../fonts/fonts.css");

/* =====================================================================
   BRAND TOKENS - MIRRORED FROM THE APP
   ---------------------------------------------------------------------
   Source of truth: ai-roles-map/client/src/index.css  (the :root block)

   Verified identical on 22 August 2026. Because this homepage lives in
   its own repository, nothing ENFORCES that they stay in sync: if the
   app's theme changes and this block does not, the two properties drift
   apart. That already happened once with the two headers on
   carenglasser.com and had to be reconciled afterwards.

   If you change a colour or a font here, change it there too, and vice
   versa. To diff them:

     grep -A12 '^:root {' ../ai-roles-map/client/src/index.css

   Note the app writes decimals (oklch(0.32 0.08 255)) and this file
   writes percentages (oklch(32% .08 255)). Same colour, same syntax
   family - do not "fix" one to match the other.
   ===================================================================== */
:root{
  --background: oklch(98% .008 85);
  --foreground: oklch(22% .015 65);
  --card: oklch(100% .004 85);
  --muted: oklch(93% .01 85);
  --muted-fg: oklch(52% .015 65);
  --border: oklch(88% .012 85);
  --atlas: oklch(32% .08 255);      /* deep navy - primary */
  --atlas-soft: oklch(32% .08 255 / .08);
  --comet: oklch(55% .12 70);       /* warm copper - accent */
  --comet-soft: oklch(55% .12 70 / .12);
  --manus: oklch(38% .09 155);      /* deep green */
  --no: oklch(52% .17 27);          /* brick red - the crosses in the plan table */
  --radius: .5rem;
  --serif: "Fraunces", Georgia, "Times New Roman", serif;
  --sans: "Plus Jakarta Sans", system-ui, -apple-system, "Segoe UI", sans-serif;
  --maxw: 1180px;
}
/* Fallback for browsers without oklch() support (Safari < 15.4, older Firefox) */
@supports not (color: oklch(50% .1 200)){
  :root{
    --background:#fbf9f5; --foreground:#2a241d; --card:#fffefc; --muted:#eeeae2;
    --muted-fg:#7a7168; --border:#e2ddd3;
    --atlas:#243b63; --atlas-soft:rgba(36,59,99,.08);
    --comet:#a86b32; --comet-soft:rgba(168,107,50,.12);
    --manus:#1f5c42; --no:#b03a2b;
  }
}

/* The [hidden] attribute must win over any display value a class sets.
   Without !important, .btn{display:inline-flex} beats the UA stylesheet's
   [hidden]{display:none}, so site.js hiding the Plus CTA has no visible
   effect. This bit us once: the button stayed on screen while
   BILLING_MODE was "test" with no capture endpoint configured. */
[hidden]{display:none !important}

*{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth}
body{
  background:var(--background); color:var(--foreground);
  font-family:var(--sans); font-size:17px; line-height:1.6;
  -webkit-font-smoothing:antialiased; text-rendering:optimizeLegibility;
}
img{max-width:100%;height:auto;display:block}
.wrap{max-width:var(--maxw);margin:0 auto;padding:0 28px}
h1,h2,h3,.serif{font-family:var(--serif);font-weight:600;line-height:1.12;letter-spacing:-.01em}
h2{font-size:clamp(30px,3.6vw,44px)}
h3{font-size:20px;line-height:1.3}
p{color:var(--muted-fg)}
a{color:inherit;text-decoration:none}

/* ---------- accessibility ---------- */
.skip{
  position:absolute;left:-9999px;top:0;z-index:100;background:var(--atlas);
  color:#fff;padding:12px 20px;border-radius:0 0 var(--radius) 0;font-weight:600;
}
.skip:focus{left:0}
:focus-visible{outline:3px solid var(--comet);outline-offset:3px;border-radius:4px}
.visually-hidden{
  position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
  clip:rect(0 0 0 0);white-space:nowrap;border:0;
}
@media (prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  *,*::before,*::after{animation-duration:.01ms !important;transition-duration:.01ms !important}
}

/* ---------- utility ---------- */
.eyebrow{
  font-size:12px;letter-spacing:.14em;text-transform:uppercase;
  font-weight:600;color:var(--comet);margin-bottom:14px;
}
.eyebrow.navy{color:var(--atlas)}
.btn{
  display:inline-flex;align-items:center;gap:8px;
  font-family:var(--sans);font-weight:600;font-size:15px;
  padding:13px 24px;border-radius:var(--radius);border:1px solid transparent;
  cursor:pointer;transition:filter .18s,background .18s;white-space:nowrap;
  text-align:center;
}
.btn-primary{background:var(--atlas);color:oklch(98% .004 85)}
.btn-primary:hover{filter:brightness(1.25)}
.btn-ghost{background:transparent;border-color:var(--border);color:var(--foreground)}
.btn-ghost:hover{background:var(--muted)}
.btn-comet{background:var(--comet);color:oklch(99% .004 85)}
.btn-comet:hover{filter:brightness(1.08)}
.btn-lg{padding:16px 32px;font-size:16px}
@supports not (color: oklch(50% .1 200)){
  .btn-primary,.btn-comet{color:#fffefc}
}
.pill{
  display:inline-flex;align-items:center;gap:6px;font-size:13px;font-weight:600;
  padding:5px 12px;border-radius:999px;border:1px solid var(--border);background:var(--card);
}
.center{text-align:center}
.lede{font-size:19px;max-width:620px}
section{padding:82px 0}

/* ---------- header ---------- */
.site-header{
  position:sticky;top:0;z-index:50;background:oklch(98% .008 85 / .92);
  -webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);
  border-bottom:1px solid var(--border);
}
@supports not (color: oklch(50% .1 200)){ .site-header{background:rgba(251,249,245,.94)} }
/* ---------------------------------------------------------------------
   The header is matched to the app's SiteHeader (ai-roles-map,
   client/src/components/SiteHeader.tsx) so the bar does not jump when
   somebody crosses from yoursmartstack.com to aitools.yoursmartstack.com.
   Measured off the live app at 1440px:

     bar          64px + 1px border      (Tailwind h-16)
     container    1280px, 32px padding   (Tailwind container)
     wordmark     Fraunces 24px/700, -.025em tracking
     nav links    14px/500
     item gap     20px                   (gap-5)
     primary btn  44px tall, 16px sides, 14px/600, 6px radius (BUTTON.primarySm)

   If the app's header changes, change this with it. Nothing enforces it,
   same standing caveat as the brand tokens at the top of this file.
   --------------------------------------------------------------------- */
.nav{display:flex;align-items:center;gap:16px;height:64px}
.site-header .wrap{max-width:1280px;padding:0 32px}
/* nowrap: at 375px "Your Smart Stack" broke onto three lines and blew the
   64px bar open. The app guards the same way (whitespace-nowrap on every
   header item) and steps the wordmark down on phones with text-lg
   sm:text-2xl - the 18px below is that same step. */
.logo{font-family:var(--serif);font-weight:700;font-size:24px;letter-spacing:-.025em;white-space:nowrap}
.logo-sub{
  font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted-fg);
  border-left:1px solid var(--border);padding-left:16px;margin-left:4px;font-weight:600;
}
.nav-links{margin-left:auto;display:flex;align-items:center;gap:20px;font-size:14px;font-weight:500}
/* Every header item nowraps, same as the app. At 320px "Log In" was
   breaking after "Log" and pushing the bar taller than 64px. */
.nav-links a{white-space:nowrap}
/* BUTTON.primarySm from the app, not this file's default .btn: min-h-11,
   px-4, text-sm, font-semibold, rounded-md (--radius minus 2px). */
.site-header .btn{min-height:44px;padding:0 16px;font-size:14px;border-radius:6px}
.nav-links a.plain:hover{color:var(--atlas)}

/* ---------- hero ---------- */
.hero{
  position:relative;overflow:hidden;padding:76px 0 70px;
  background:
    radial-gradient(circle at 1px 1px, oklch(80% .02 85 / .55) 1px, transparent 0) 0 0/22px 22px,
    linear-gradient(160deg, oklch(97% .014 78) 0%, oklch(98% .008 85) 55%, oklch(96% .02 70) 100%);
  border-bottom:1px solid var(--border);
}
.hero-grid{display:grid;grid-template-columns:1.05fr .95fr;gap:56px;align-items:center}
/* Single-column hero. Replaced the two-column layout on 22 Aug 2026 when
   the mock quiz card came out; see the VIDEO SLOT comment in index.html. */
.hero-single{max-width:760px;text-align:center}
.hero-single .lede{margin-left:auto;margin-right:auto}
.hero-single .hero-cta{justify-content:center}
.hero-single .trust{justify-content:center}
.hero-video{
  margin:38px auto 0;max-width:680px;position:relative;aspect-ratio:16/9;
  background:var(--card);border:1px solid var(--border);border-radius:14px;overflow:hidden;
  box-shadow:0 18px 44px oklch(22% .015 65 / .1);
}
.hero-video iframe{position:absolute;inset:0;width:100%;height:100%;border:0}
.hero h1{font-size:clamp(38px,5vw,60px)}
.hero h1 .alt{color:var(--atlas)}
.hero p.lede{margin-top:20px}
.hero-cta{display:flex;flex-wrap:wrap;gap:12px;margin-top:30px;align-items:center}
.hero-fine{font-size:13.5px;color:var(--muted-fg);margin-top:14px}
.trust{display:flex;flex-wrap:wrap;gap:10px;margin-top:34px}

.hero-card{
  background:var(--card);border:1px solid var(--border);border-radius:14px;
  box-shadow:0 24px 60px -28px oklch(32% .08 255 / .35);overflow:hidden;
}
.hero-card-top{padding:22px 24px 6px;border-bottom:1px solid var(--border)}
.hero-card-top .q{font-size:12px;letter-spacing:.12em;text-transform:uppercase;color:var(--muted-fg);font-weight:600}
.hero-card-top .h4{font-family:var(--serif);font-size:20px;font-weight:600;margin:8px 0 18px}
.role-row{display:flex;align-items:center;gap:14px;padding:14px 24px;border-bottom:1px solid var(--border)}
.role-row:last-child{border-bottom:none}
.role-ic{
  width:36px;height:36px;border-radius:10px;display:grid;place-items:center;font-size:17px;
  background:var(--muted);flex:none;
}
.role-row b{font-family:var(--serif);font-size:16px;display:block}
.role-row span{font-size:13.5px;color:var(--muted-fg)}
.role-row .arw{margin-left:auto;color:var(--muted-fg)}
.role-row.on{background:oklch(32% .08 255 / .05)}

/* ---------- problem ---------- */
.problem{background:var(--card);border-bottom:1px solid var(--border)}
.problem-grid{display:grid;grid-template-columns:1fr 1fr;gap:56px;align-items:start}
.xlist{list-style:none;display:grid;gap:14px;margin-top:6px}
.xlist li{display:flex;gap:12px;font-size:16.5px;color:var(--muted-fg)}
.xlist li::before{content:"\2715";color:var(--comet);font-weight:700;flex:none;margin-top:1px}
.pullquote{
  font-family:var(--serif);font-size:26px;line-height:1.35;color:var(--foreground);
  border-left:3px solid var(--comet);padding-left:24px;
}
.problem-aside{padding-top:60px}

/* ---------- free tier ---------- */
.tier-head{max-width:720px;margin:0 auto 48px}
/* Headlines that carry their own <br> need room for the LONGEST line to sit
   on one line, otherwise the explicit break lands mid-sentence and you get a
   three-line heading with an orphan. 720px is sized for a single wrapping
   sentence, not for two pre-broken ones. */
.tier-head.wide{max-width:1060px}
.tier-head .lede{margin:18px auto 0}
.feat-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:22px}
.feat{
  background:var(--card);border:1px solid var(--border);border-radius:12px;padding:26px 24px;
  border-top:3px solid var(--atlas);
}
.feat.comet{border-top-color:var(--comet)}
.feat.green{border-top-color:var(--manus)}
.feat .ic{font-size:24px;margin-bottom:12px;display:block}
.feat h3{margin-bottom:8px}
.feat p{font-size:15px}

.freeband{
  margin-top:44px;background:var(--card);border:1px solid var(--border);border-radius:14px;
  padding:34px 36px;display:flex;align-items:center;gap:30px;flex-wrap:wrap;
}
.freeband .price{font-family:var(--serif);font-size:44px;line-height:1}
.freeband .price small{font-family:var(--sans);font-size:15px;color:var(--muted-fg);font-weight:500}
.freeband .txt{flex:1;min-width:260px}
.freeband h3{margin-bottom:6px}
.freeband p{font-size:15px}

/* ---------- bridge ---------- */
.bridge{background:var(--atlas);color:oklch(96% .01 85)}
.bridge h2{color:oklch(98% .004 85);max-width:900px;margin:0 auto}
/* :not(.eyebrow) because the eyebrow is also a <p> in this section, and
   `.bridge p` (0,1,1) outranks `.eyebrow` (0,1,0). Without this it was
   inheriting the body size and rendering at 18px while every other
   eyebrow on the page sits at 12px. */
.bridge p:not(.eyebrow){color:oklch(85% .02 85);max-width:620px;margin:20px auto 0;font-size:18px}
/* Colour for the navy band, plus a little more air than the global 14px:
   this headline is two lines and sits directly under it. */
.bridge .eyebrow{color:oklch(78% .1 70);margin-bottom:22px}
@supports not (color: oklch(50% .1 200)){
  .bridge h2{color:#fffefc} .bridge p{color:#cfc9c1} .bridge .eyebrow{color:#e0a86e}
}

/* ---------- plus ---------- */
.plus{
  background:
    radial-gradient(circle at 1px 1px, oklch(82% .03 70 / .5) 1px, transparent 0) 0 0/22px 22px,
    linear-gradient(180deg, oklch(97% .018 72) 0%, oklch(98% .008 85) 100%);
}
.plusmark{
  display:inline-flex;align-items:center;gap:9px;font-family:var(--serif);font-weight:700;
  background:var(--atlas);color:oklch(98% .004 85);padding:8px 20px;border-radius:999px;
  font-size:19px;letter-spacing:-.01em;line-height:1.2;
}
.plusmark .p{
  color:oklch(78% .12 70);font-family:var(--sans);font-weight:800;
  font-size:1.1em;line-height:1;display:inline-block;transform:translateY(-3px);
}
.app-grid{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:18px;margin-top:44px}
.app{
  background:var(--card);border:1px solid var(--border);border-left:3px solid var(--atlas);
  border-radius:10px;padding:20px 20px 18px;
  /* Column + p{flex:1} is what lands every "Included in Your Smart Stack +"
     on the same baseline across the row. The bodies are different lengths,
     so without this the tags step up and down the row. */
  display:flex;flex-direction:column;
}
.app:nth-child(2){border-left-color:var(--comet)}
.app:nth-child(3){border-left-color:var(--manus)}
.app:nth-child(4){border-left-color:oklch(45% .08 300)}
.app:nth-child(5){border-left-color:var(--comet)}
.app:nth-child(6){border-left-color:var(--atlas)}
.app:nth-child(7){border-left-color:var(--manus)}
.app .logo-dot{font-size:22px;display:block;margin-bottom:10px}
.app h3{font-size:17px;margin-bottom:6px}
.app p{font-size:14px;line-height:1.5;flex:1}
/* Not uppercased. At thirty characters an all-caps tag shouts, and the
   brand name reads better in its own casing. */
.app .tag{margin-top:14px;font-size:12px;font-weight:600;color:var(--atlas);letter-spacing:.01em;line-height:1.4}
.app.more{
  display:grid;place-items:center;text-align:center;border-left-color:var(--border);
  background:oklch(96% .012 82);
}
.app.more h3{font-family:var(--serif);color:var(--muted-fg)}

.plus-benefits{display:grid;grid-template-columns:repeat(3,1fr);gap:20px;margin-top:44px}
.ben{display:flex;gap:12px;align-items:flex-start}
.ben .ck{
  width:24px;height:24px;border-radius:50%;background:var(--atlas);color:#fff;flex:none;
  display:grid;place-items:center;font-size:12px;font-weight:700;margin-top:2px;
}
.ben b{display:block;font-family:var(--serif);font-size:16.5px;margin-bottom:3px}
.ben span{font-size:14.5px;color:var(--muted-fg)}

/* ---------- pricing ---------- */
.pricing{background:var(--card);border-top:1px solid var(--border);border-bottom:1px solid var(--border)}
/* stretch, not start: equal-height cards are what let the two CTAs line up
   with each other at the bottom. */
/* Equal columns, not 1fr 1.08fr. The two lists are now the same seven rows
   and are meant to read across; unequal widths make a label wrap on one side
   only and the rows stop lining up. The Plus card is emphasised with its
   border and shadow instead of with width. */
.plan-grid{
  display:grid;grid-template-columns:1fr 1fr;gap:26px;max-width:980px;
  margin:48px auto 0;align-items:stretch;
  /* The five bands both cards are built from: heading, price, blurb, feature
     list, footer. Declared here because the cards line themselves up against
     them - see the subgrid block further down. */
  grid-template-rows:auto auto auto auto auto;
}
/* 2px on both cards, not 1px here and 2px on the Plus one. A one-pixel
   difference in the border sets every row in one card a pixel below its
   opposite number, which is invisible until you look and then impossible to
   unsee. */
.plan{
  background:var(--background);border:2px solid var(--border);border-radius:14px;
  padding:34px 32px;display:flex;flex-direction:column;
}
.plan.hot{
  background:var(--card);border-color:var(--atlas);position:relative;
  box-shadow:0 26px 60px -30px oklch(32% .08 255 / .45);
}
.plan-badge{
  position:absolute;top:-13px;left:32px;background:var(--comet);color:#fff;
  font-size:12px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;
  padding:5px 14px;border-radius:999px;
}
/* Fixed line-height. .plus-sign is 1.2em, which grows the Plus card's h3
   line box by about 8px, and that pushed every row below it out of step with
   the Free card next to it. The two lists are meant to read across. */
/* line-height MUST be a length here, not the unitless 1.25 it was. A unitless
   value is inherited as the factor, so .plus-sign at font-size:1.2em recomputed
   its own line box as 1.25 x 28.8px = 36px and grew the h3 by 6px. Every row in
   the Plus card then sat 7px below its opposite number in the Free card, and
   the two CTAs missed each other by the same amount. A length is inherited as
   the computed 30px and the big plus sign just overflows it harmlessly. */
/* Fixed height, not min-height. Even with a matching 30px line-height, the
   plus sign is set in var(--sans) while the heading is var(--serif); the two
   fonts put their baselines in different places inside the line box, so the
   union of the inline boxes still came out 3px taller. A fixed height makes
   the row exact and the oversized glyph overflows harmlessly, which is the
   whole point of pinning it. */
.plan h3{font-family:var(--serif);font-size:24px;line-height:30px;height:30px}
.plan .plus-sign{color:var(--comet);font-family:var(--sans);font-weight:800;font-size:1.2em}
.plan .price{font-family:var(--serif);font-size:50px;line-height:1.05;margin:14px 0 4px}
.plan .price small{font-family:var(--sans);font-size:16px;color:var(--muted-fg);font-weight:500}
.plan .sub{font-size:14.5px;color:var(--muted-fg);min-height:42px}
/* margin-top:auto eats whatever slack the taller card leaves, so the button
   sits on the floor of both cards. */
.plan .btn{width:100%;justify-content:center;margin:0}
/* `.plan .plan-cta`, not `.plan-cta`. As one class it lost to `.plan .btn`
   above on specificity - the margin:0 there won, margin-top:auto never
   applied, and both buttons sat wherever their own list happened to end
   instead of on the floor of the card. */
.plan .plan-cta{margin-top:auto}
/* The footer is one row of the shared grid, so the button is pinned to the
   bottom of it in both cards whether or not the note above it is showing. */
.plan-foot{display:flex;flex-direction:column;justify-content:flex-end}
/* Explicit bottom margin as well as top: margin-top:auto on the CTA sets the
   floor, but with no bottom margin the taller card's button ends up jammed
   against the last row. */
.plan .checks{margin:22px 0}
.plan .fine{font-size:13.5px;margin:18px 0 18px}
.plan .fine:empty{display:none;margin:0}
/* Line the two cards up band by band.
   The Free card's blurb is two lines and the Plus card's is three, so the
   feature lists started 24px apart and every row below them stayed 24px
   apart, including the buttons. Equalising by hand - a min-height on .sub -
   only holds at one window width: the columns are fluid between the mobile
   breakpoint and 1032px, and the two blurbs cross into different line counts
   at different widths.
   Subgrid makes the cards share the parent's five rows, so each band is as
   tall as the taller card needs and both sides agree at every width, with no
   number in this file to go stale.
   Behind @supports because a browser without subgrid must keep the flex
   column above rather than get `display:grid` with no template: unaligned but
   intact is the right failure. */
@supports (grid-template-rows: subgrid){
  .plan{display:grid;grid-template-rows:subgrid;grid-row:span 5}
}

.checks{list-style:none;display:grid;gap:11px}
.checks li{display:flex;gap:10px;font-size:15px;align-items:flex-start;line-height:1.5}
.checks li::before{
  content:"\2713";color:var(--manus);font-weight:800;flex:none;
  /* Same line-height as the label so the mark sits on the first line of text
     rather than floating above it. */
  line-height:1.5;width:15px;text-align:center;
}
.checks li.dim{color:var(--muted-fg)}
/* Not included. Red, at Caren's direction (2 Sep 2026) - it previously read
   grey on the argument that a feature list is not an error list. The label
   stays muted; only the cross carries the colour, so the row still reads as
   "not yours" rather than as a warning. */
.checks li.dim::before{content:"\2715";color:var(--no);opacity:1;font-weight:700}
.checks .hdr{
  font-size:12px;letter-spacing:.12em;text-transform:uppercase;font-weight:700;
  color:var(--muted-fg);margin-top:8px;
}
.checks .hdr::before{content:"";width:0}
.checks b{font-weight:600}

/* Expandable comparison rows. The tick is drawn by .checks li::before, so
   the <details> has to sit as a normal flow child next to it - do not make
   the li a block or the tick and the summary stop sharing a baseline. */
.checks.expandable li{align-items:flex-start}
.checks.expandable details{flex:1;min-width:0}
.checks.expandable summary{
  cursor:pointer;list-style:none;display:flex;align-items:flex-start;gap:8px;
  border-radius:6px;transition:color .15s;
}
.checks.expandable summary::-webkit-details-marker{display:none}
.checks.expandable summary::after{
  content:"\203A";margin-left:auto;flex:none;color:var(--muted-fg);
  font-size:19px;line-height:1;transform:rotate(90deg);transition:transform .18s;
}
.checks.expandable details[open] summary::after{transform:rotate(-90deg)}
.checks.expandable summary:hover{color:var(--atlas)}
.checks.expandable summary:focus-visible{outline:2px solid var(--atlas);outline-offset:3px}
.checks.expandable details p{
  font-size:14px;line-height:1.55;color:var(--muted-fg);
  margin:8px 0 2px;padding-left:2px;
}

/* ---------- standalone companion app store ---------- */
.store{background:var(--background)}
.store-grid{
  /* minmax(0,1fr), not 1fr. Plain 1fr floors each column at its min-content
     width, and .btn sets white-space:nowrap, so the longest button label
     ("Buying opens in September") was stretching the Claude column wider
     than the other four. */
  display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:18px;
  max-width:1180px;margin:48px auto 0;align-items:stretch;
}
.store-card{
  display:flex;flex-direction:column;
  background:var(--card);border:1px solid var(--border);border-radius:14px;
  padding:24px 22px 22px;
}
.store-card.ready{border-color:var(--comet);box-shadow:0 14px 34px oklch(55% .12 70 / .12)}
.store-card.soon{background:var(--muted);border-style:dashed}
.store-top{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:12px}
.store-card .logo-dot{font-size:22px;line-height:1}
.store-badge{
  font-size:10.5px;font-weight:700;letter-spacing:.09em;text-transform:uppercase;
  padding:4px 9px;border-radius:999px;background:var(--comet-soft);color:var(--comet);
  white-space:nowrap;
}
.store-badge.soon{background:transparent;border:1px solid var(--border);color:var(--muted-fg)}
.store-card h3{font-size:17px;margin-bottom:7px}
.store-card p{font-size:14px;line-height:1.5;color:var(--muted-fg);flex:1}
.store-price{
  font-family:var(--serif);font-size:31px;line-height:1;margin:18px 0 14px;
}
.store-price small{font-family:var(--sans);font-size:13px;color:var(--muted-fg);font-weight:500}

/* ---------- sale pricing ----------
   The old price is context for the new one, not a number to read first:
   smaller, muted, struck through. Sized in em so one rule serves all three
   price sizes (31px in the store grid, 46px and 40px on the checkout pages).

   A line-through is invisible to a screen reader, so the markup also carries
   "Regular price" / "Sale price" in .visually-hidden spans. Change one and
   change the other, or the two audiences stop being told the same thing. */
.price-was{
  /* Its own line, not inline before the new price. Inline, "$247 $147 one
     time" needs 179px and a store card gives it 164px, so the "one time"
     was orphaned onto a second line anyway. Stacked it fits every card and
     every checkout page, and reads the way a sale price is expected to. */
  display:block;font-size:.5em;line-height:1.2;margin-bottom:2px;
  color:var(--muted-fg);font-weight:500;
  text-decoration:line-through;
  /* The default hairline all but disappears in Fraunces at these sizes. */
  text-decoration-thickness:.08em;
}

/* Says the strikethrough is deliberate rather than a mistake, once, at the
   top of the store, instead of repeating "$100 off" on all five cards. */
.sale-flag{
  display:inline-block;margin-top:14px;
  font-size:13px;font-weight:700;letter-spacing:.04em;
  padding:6px 14px;border-radius:999px;
  background:var(--comet-soft);color:var(--comet);
}
/* .btn is nowrap by default and these columns are narrow. Without this the
   label runs straight out through the side of the card. */
.store-card .btn{width:100%;justify-content:center;white-space:normal;line-height:1.35}

/* Not a link yet. Looks like a label, not a dead button. */
.btn.is-pending{
  cursor:default;pointer-events:none;opacity:.72;font-weight:600;
  background:transparent;border-style:dashed;color:var(--muted-fg);
  /* Undo .btn's nowrap: these labels are sentences, not verbs. */
  white-space:normal;line-height:1.35;
}
.store-note{margin:34px auto 0;max-width:none;font-size:14.5px;color:var(--muted-fg);font-style:italic}
.store-note a{color:var(--atlas);font-weight:600;text-decoration:underline}

/* ---------- faq ---------- */
.faq{background:var(--background)}
.faq-list{max-width:760px;margin:40px auto 0}
/* Scoped to .faq-list on purpose. These were bare element selectors and were
   leaking 18px of vertical padding, a bottom border and an 18px serif face
   into the pricing checklists, which is what knocked the ticks out of line
   with their labels. */
.faq-list details{border-bottom:1px solid var(--border);padding:18px 0}
.faq-list summary{
  font-family:var(--serif);font-size:18px;cursor:pointer;list-style:none;
  display:flex;justify-content:space-between;gap:20px;font-weight:600;
}
.faq-list summary::-webkit-details-marker{display:none}
.faq-list summary::after{content:"+";color:var(--comet);font-weight:700;font-family:var(--sans)}
.faq-list details[open] summary::after{content:"\2013"}
.faq-list details p{margin-top:12px;font-size:15.5px}

/* ---------- final cta ---------- */
.finalcta{
  background:linear-gradient(160deg, oklch(97% .018 72), oklch(96% .026 68));
  border-top:1px solid var(--border);text-align:center;
}
.finalcta .btns{display:flex;gap:12px;justify-content:center;flex-wrap:wrap;margin-top:28px}

/* ---------- footer ---------- */
.site-footer{background:var(--atlas);color:oklch(88% .02 85);padding:56px 0 30px;font-size:14.5px}
.foot-grid{display:grid;grid-template-columns:1.4fr 1fr 1fr 1fr;gap:36px}
.site-footer .logo{color:oklch(98% .004 85);font-size:20px}
.site-footer p{color:oklch(78% .02 85);font-size:14px;margin-top:10px;max-width:280px}
.site-footer h2{
  font-size:11.5px;letter-spacing:.14em;text-transform:uppercase;color:oklch(72% .06 70);
  margin-bottom:12px;font-weight:700;font-family:var(--sans);line-height:1.4;
}
.site-footer ul{list-style:none;display:grid;gap:9px}
.site-footer a:hover{color:#fff;text-decoration:underline}
.foot-bot{
  border-top:1px solid oklch(42% .06 255);margin-top:40px;padding-top:20px;
  display:flex;justify-content:space-between;gap:16px;flex-wrap:wrap;font-size:13px;
  color:oklch(72% .02 85);
}
@supports not (color: oklch(50% .1 200)){
  .site-footer{color:#d8d2c9} .site-footer .logo{color:#fffefc}
  .site-footer p,.foot-bot{color:#b9b2a8} .site-footer h2{color:#d6a978}
  .foot-bot{border-top-color:#3d5375}
}

/* ---------- early access (BILLING_MODE=test) ---------- */
.preview-banner{
  background:var(--comet);color:#fff;font-size:13.5px;font-weight:600;
  padding:9px 20px;text-align:center;letter-spacing:.01em;
}
.ea-overlay{
  position:fixed;inset:0;z-index:100;background:oklch(22% .015 65 / .55);
  display:none;place-items:center;padding:24px;
}
.ea-overlay[data-open="true"]{display:grid}
.ea-modal{
  background:var(--card);border:1px solid var(--border);border-radius:14px;
  padding:34px 32px;max-width:460px;width:100%;
  box-shadow:0 30px 70px -30px oklch(22% .015 65 / .5);position:relative;
}
.ea-modal h2{font-size:26px;margin-bottom:10px}
.ea-modal p{font-size:15px}
.ea-close{
  position:absolute;top:12px;right:14px;background:none;border:0;font-size:24px;
  line-height:1;color:var(--muted-fg);cursor:pointer;padding:6px;border-radius:6px;
}
.ea-close:hover{background:var(--muted);color:var(--foreground)}
.ea-form{display:grid;gap:12px;margin-top:20px}
.ea-form label{font-size:13px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--muted-fg)}
.ea-form input{
  font-family:var(--sans);font-size:16px;padding:13px 14px;border-radius:var(--radius);
  border:1px solid var(--border);background:var(--background);color:var(--foreground);width:100%;
}
.ea-form input:focus{border-color:var(--atlas)}
.ea-form .btn{justify-content:center}
.ea-fine{font-size:13px;margin-top:14px}
.ea-msg{font-size:14.5px;margin-top:14px;min-height:1.2em}
.ea-msg.err{color:var(--comet);font-weight:600}
.ea-msg.ok{color:var(--manus);font-weight:600}
body.ea-locked{overflow:hidden}

@media (max-width:1080px){
  .app-grid,.store-grid{grid-template-columns:repeat(3,minmax(0,1fr))}
}
@media (max-width:960px){
  .hero-grid,.problem-grid,.plan-grid{grid-template-columns:1fr}
  .feat-grid,.plus-benefits{grid-template-columns:1fr 1fr}
  .app-grid{grid-template-columns:1fr 1fr}
  .store-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
  .foot-grid{grid-template-columns:1fr 1fr}
  .nav-links .hide-sm{display:none}
  .problem-aside{padding-top:0}
}
@media (max-width:620px){
  section{padding:60px 0}
  .feat-grid,.plus-benefits,.app-grid,.foot-grid{grid-template-columns:1fr}
  .store-grid{grid-template-columns:1fr}
  .freeband{flex-direction:column;align-items:flex-start}
  .hero{padding:52px 0 56px}
  .wrap{padding:0 20px}
}

/* ---------- phones ---------- */
@media (max-width:640px){
  /* Matches the app's text-lg on the wordmark, and buys back the width the
     32px desktop header padding was eating. */
  .logo{font-size:18px}
  .site-header .wrap{padding:0 20px}
  .nav{gap:10px}
  .nav-links{gap:14px}
  .site-header .btn{padding:0 13px}
}

@media (max-width:360px){
  /* The narrow end (iPhone SE and friends). nowrap on the header items
     stops them stacking, but it converts the overflow into a clipped
     "Start Free" instead - at 320px the row wants ~312px and only has
     280px. Everything gives a little rather than dropping "Log In",
     which is the only way back in for an existing member. */
  .site-header .wrap{padding:0 14px}
  .logo{font-size:16px}
  .nav{gap:8px}
  .nav-links{gap:10px}
  .site-header .btn{padding:0 11px;font-size:13px}
}

@media (max-width:620px){
  /* Both hero lines have to hold their own line - the section is written as
     two sentences with a <br>, and a third line reads as a mistake.

     Measured, not guessed: the longest line, "Start using the right ones.",
     renders 11.94x its font-size in Fraunces 600 at this letter-spacing.
     The line box is 100vw minus 2x20px of .wrap padding, so the largest
     size that still fits is (100vw - 40px) / 11.94 = 8.375vw - 3.35px;
     8.2vw - 3.5px leaves a little slack for rounding.

     min() caps it at 38px, which is what clamp() gives on the other side of
     this breakpoint, so the size is continuous at 620px rather than jumping.
     Below ~494px the old 38px floor could not fit either line, which is why
     this runs to 620px and not to 480px. */
  .hero h1{font-size:min(38px, calc(8.2vw - 3.5px))}
}

/* Cards read better centred once they are one per row. */
@media (max-width:620px){
  .feat{text-align:center}
  .app,.store-card{align-items:center;text-align:center}
  .app .logo-mark,.store-card .logo-mark{margin-left:auto;margin-right:auto}
  /* .store-top is space-between for the logo/badge row; at one card per row
     it should be the two of them centred together instead. */
  .store-top{width:auto;justify-content:center}
  .store-card .btn{width:100%}
}


/* ---------- thank-you pages ---------- */
.thanks{padding:64px 0 90px}
.thanks-card{
  max-width:680px;margin:0 auto;background:var(--card);
  border:1px solid var(--border);border-radius:16px;padding:44px 44px 38px;
  box-shadow:0 18px 44px oklch(22% .015 65 / .07);
}
/* Everything above the first rule is centred: tick, eyebrow, headline and
   the payment line. Below it the content is instructions and reads better
   ranged left. */
.thanks-head{text-align:center}
.thanks-tick{
  width:52px;height:52px;border-radius:50%;display:flex;align-items:center;
  justify-content:center;background:var(--manus);color:#fff;
  font-size:26px;font-weight:800;margin:0 auto 22px;
}
.thanks-card h1{font-size:clamp(28px,3.4vw,38px)}
.thanks-card .lede{margin-top:16px;font-size:17.5px}
.thanks-what,.thanks-help{margin-top:34px;padding-top:26px;border-top:1px solid var(--border)}
.thanks-card h2{font-size:15px;letter-spacing:.09em;text-transform:uppercase;
  font-family:var(--sans);font-weight:700;color:var(--muted-fg);margin-bottom:16px}
.thanks-steps{margin:0;padding-left:0;list-style:none;counter-reset:s;display:grid;gap:15px}
.thanks-steps li{
  counter-increment:s;position:relative;padding-left:40px;
  font-size:15.5px;line-height:1.6;
}
.thanks-steps li::before{
  content:counter(s);position:absolute;left:0;top:1px;
  width:26px;height:26px;border-radius:50%;display:flex;align-items:center;
  justify-content:center;background:var(--atlas-soft);color:var(--atlas);
  font-size:13px;font-weight:700;font-family:var(--sans);
}
.thanks-help p{font-size:15.5px;line-height:1.6}
.thanks-help a{color:var(--atlas);font-weight:600;text-decoration:underline}
.thanks-back{display:flex;flex-wrap:wrap;justify-content:center;gap:12px;margin-top:28px}
@media (max-width:620px){
  .thanks{padding:40px 0 60px}
  .thanks-card{padding:30px 22px 26px;border-radius:14px}
  .thanks-back .btn{width:100%;justify-content:center}
}

/* ---------- tool logo marks ----------
   Brand SVGs come from simple-icons (CC0). The marks themselves are the
   trademarks of their owners and are used here only to identify which tool
   each companion app is for.

   ChatGPT, Canva and Manus are NOT in simple-icons - they have been removed
   at those companies' request - so they fall back to .is-mono, a monogram in
   the same tile. If you obtain an official SVG for one of them, drop the path
   into the span in index.html and delete the is-mono class. Do not go hunting
   for an unofficial copy.

   Note img-src in .htaccess is 'self' data:, which is why these are inline
   SVG rather than <img src> pointing anywhere external. */
.logo-mark{
  width:36px;height:36px;border-radius:10px;flex:none;
  display:inline-flex;align-items:center;justify-content:center;
  background:var(--mark-soft,var(--muted));color:var(--mark,var(--foreground));
}
.logo-mark svg{width:19px;height:19px;display:block;fill:currentColor}
.logo-mark.is-mono{
  font-family:var(--sans);font-weight:800;font-size:12.5px;letter-spacing:-.02em;
}
.m-claude    {--mark:#d97757;--mark-soft:rgba(217,119,87,.15)}
.m-chatgpt   {--mark:#0f8a6d;--mark-soft:rgba(15,138,109,.14)}
.m-gemini    {--mark:#8e75b2;--mark-soft:rgba(142,117,178,.16)}
.m-notebooklm{--mark:#33373d;--mark-soft:rgba(51,55,61,.10)}
.m-perplexity{--mark:#1a8fa0;--mark-soft:rgba(31,184,205,.16)}
.m-canva     {--mark:#0097a7;--mark-soft:rgba(0,196,204,.16)}
.m-manus     {--mark:var(--atlas);--mark-soft:var(--atlas-soft)}
.m-video     {--mark:var(--comet);--mark-soft:var(--comet-soft)}

/* Full-colour marks. The Gemini star carries Google's own four-colour
   gradient, so it gets a neutral chip rather than a single-hue tint - a
   coloured background behind a multicoloured mark muddies both. The path
   sets fill="url(#...)" directly, which beats the inherited currentColor
   from .logo-mark svg. */
.logo-mark.is-full{background:var(--muted)}

/* placement inside the two card types */
.app .logo-mark{margin-bottom:12px}
.store-top .logo-mark{width:32px;height:32px;border-radius:9px}
.store-top .logo-mark svg{width:17px;height:17px}
.store-top .logo-mark.is-mono{font-size:11.5px}

@supports not (color: oklch(50% .1 200)){
  .m-manus{--mark:#243b63;--mark-soft:rgba(36,59,99,.08)}
  .m-video{--mark:#a86b32;--mark-soft:rgba(168,107,50,.12)}
}


/* ---------- former inline styles ----------
   These were style="" attributes. They silently did nothing, because the
   Content-Security-Policy in .htaccess sets style-src 'self' with no
   'unsafe-inline', which blocks style attributes as well as <style> blocks.

   The visible symptom was the final CTA paragraph: it carried
   style="margin:18px auto 0", the auto margins never applied, and the
   paragraph sat left of the heading above it while everything around it
   looked centred.

   Do not put styling back into a style attribute on this site. It will look
   right in a local file and do nothing in production. */
.problem-lede{margin-top:18px}
.problem-kicker{margin-top:22px;font-size:15px}
.plus-h2{margin-top:20px}
.app-more-p{margin-top:8px}
.finalcta-lede{margin:18px auto 0}
.logo-link{text-decoration:none;color:inherit}
.foot-bot.is-bare{border-top:0;margin-top:0;padding-top:0}
/* One line, centred. .foot-bot is space-between, which parks a lone child
   hard against the left edge. */
.foot-bot.is-solo{justify-content:center;text-align:center}

/* ---------- back to top ----------
   z-index 40: under the sticky header (50) and well under the early-access
   overlay (100), so it can never sit on top of a dialog.

   visibility, not just opacity, because an opacity-0 button is still in the
   tab order and still clickable - a keyboard user would hit an invisible
   control before reaching the footer. */
.to-top{
  position:fixed;right:24px;bottom:24px;z-index:40;
  width:46px;height:46px;border-radius:50%;
  display:grid;place-items:center;
  background:var(--atlas);color:oklch(98% .004 85);
  border:1px solid transparent;cursor:pointer;
  font-family:var(--sans);font-size:19px;line-height:1;
  box-shadow:0 8px 24px oklch(32% .08 255 / .28);
  opacity:0;visibility:hidden;transform:translateY(8px);
  transition:opacity .2s ease,transform .2s ease,visibility .2s ease,filter .18s;
}
.to-top.is-visible{opacity:1;visibility:visible;transform:none}

/* The two account buttons are the point of the thank-you page, so "back to
   the marketing site" drops to a text link under them rather than sitting
   beside them competing. */
.to-top:hover{filter:brightness(1.25)}
.to-top:focus-visible{outline:2px solid var(--atlas);outline-offset:3px}
@supports not (color: oklch(50% .1 200)){
  .to-top{background:#243b63;color:#fffefc;box-shadow:0 8px 24px rgba(36,59,99,.28)}
}
@media (max-width:620px){
  .to-top{right:16px;bottom:16px;width:42px;height:42px;font-size:17px}
}


/* ---------- checkout pages ---------- */
.checkout-grid{
  display:grid;grid-template-columns:1fr 1fr;gap:40px;
  max-width:960px;align-items:start;
}
.checkout-summary{
  background:var(--card);border:1px solid var(--border);border-radius:16px;
  padding:34px 32px;
}
.checkout-summary h1{font-size:clamp(26px,3vw,34px);line-height:1.15}
.co-price{font-family:var(--serif);font-size:46px;line-height:1;margin:16px 0 6px}
.co-price small{font-family:var(--sans);font-size:15px;color:var(--muted-fg);font-weight:500}
.co-sub{font-size:15px;color:var(--muted-fg);line-height:1.55}
.co-checks{margin-top:24px;padding-top:22px;border-top:1px solid var(--border)}
.co-checks li{font-size:14.5px}
.co-fine{
  margin-top:22px;padding-top:18px;border-top:1px solid var(--border);
  font-size:13.5px;color:var(--muted-fg);
}
/* Both columns start at the same line. The left card carries its own
   "You are buying" eyebrow inside it; the right one used to have "Payment"
   floating above the card, which pushed it down by the height of a heading
   and left the two outlines visibly out of step. The eyebrow now sits over
   the Stripe button, which is the thing it was describing anyway. */
.checkout-pay{padding-top:0}
.co-pay-step .co-payhead{margin-top:4px}
.co-payhead{
  font-size:13px;letter-spacing:.1em;text-transform:uppercase;
  font-family:var(--sans);font-weight:700;color:var(--muted-fg);margin-bottom:18px;
}
.co-embed{min-height:44px}
.co-fallback p{font-size:15px;color:var(--muted-fg);margin-bottom:16px}
.co-fallback-btn{width:100%;justify-content:center}
.co-unavailable{
  font-size:15px;padding:16px;border-radius:10px;background:var(--muted);
  color:var(--muted-fg);
}
.co-unavailable a,.co-back a{color:var(--atlas);font-weight:600;text-decoration:underline}
.co-trust{
  list-style:none;margin-top:28px;padding-top:22px;
  border-top:1px solid var(--border);display:grid;gap:11px;
}


/* ---------- checkout: the account gate ----------
   The app's sign-in screen has a Sign In / Create Account toggle that works
   well, so the shape is borrowed. The colours are not: this page is copper
   and cream, and a navy card lifted wholesale from the app would read as
   something bolted on.

   So the two brand colours do the jobs they already do elsewhere here —
   navy for a selected state, the way links and the primary button use it,
   and copper for the action, which is literally the same .btn-comet as
   "Continue to payment" directly below it. Two colours, two meanings, no
   competition between the form's button and the page's.

   Sized for the audience: 16px inputs minimum (anything smaller makes iOS
   zoom on focus, which feels like the page lurching away from you), 44px+
   targets, labels above fields. Placeholders are hints, never the label —
   a placeholder-only label vanishes the moment you start typing, which is
   exactly when somebody looks up to check what they were filling in. */
.co-account{margin-bottom:26px}
.co-acct-loading{font-size:15px;color:var(--muted-fg)}

.co-acct-card{
  border:1px solid var(--border);border-radius:14px;background:var(--card);
  overflow:hidden;box-shadow:0 1px 2px rgba(0,0,0,.03);
}

/* Two tabs, equal width. Sign In sits first to match the app's screen;
   Create Account is the one that starts selected, because most people
   reaching a checkout page have never made an account. */
.co-acct-tabs{display:grid;grid-template-columns:1fr 1fr}
.co-acct-tab{
  appearance:none;border:0;cursor:pointer;
  font-family:var(--sans);font-size:15.5px;font-weight:600;
  padding:15px 10px;min-height:52px;
  background:var(--muted);color:var(--muted-fg);
  border-bottom:1px solid var(--border);
}
.co-acct-tab + .co-acct-tab{border-left:1px solid var(--border)}
.co-acct-tab.is-on{
  background:var(--card);color:var(--atlas);
  border-bottom-color:transparent;
  box-shadow:inset 0 3px 0 var(--comet);
}
.co-acct-tab:focus-visible{outline:2px solid var(--comet);outline-offset:-3px}

.co-acct-form{padding:24px 22px}
.co-acct-legend{
  font-family:var(--serif);font-size:23px;line-height:1.2;margin:0 0 6px;
}
.co-acct-sub{font-size:15px;color:var(--muted-fg);line-height:1.5;margin:0 0 20px}

.co-acct-row{margin-bottom:16px}
.co-acct-row label{display:block;font-size:15px;font-weight:600;margin-bottom:7px}
.co-acct-labelrow{display:flex;align-items:baseline;justify-content:space-between;gap:12px}
.co-acct-forgot{
  font-size:14.5px;font-weight:600;color:var(--atlas);text-decoration:none;
}
.co-acct-forgot:hover{text-decoration:underline}

.co-acct-row input{
  width:100%;box-sizing:border-box;
  font-family:var(--sans);font-size:16px;   /* never below 16: see above */
  padding:13px 14px;min-height:50px;
  border:1px solid var(--border);border-radius:10px;
  background:var(--card);color:var(--foreground);
}
.co-acct-row input::placeholder{color:var(--muted-fg);opacity:.75}
.co-acct-row input:focus{
  outline:2px solid var(--atlas);outline-offset:1px;border-color:var(--atlas);
}
.co-acct-hint{display:block;font-size:13.5px;color:var(--muted-fg);margin-top:7px}

/* Layout only. The colour comes from .btn-comet, so this button and
   "Continue to payment" can never drift apart. */
.co-acct-submit{width:100%;justify-content:center;margin-top:6px;min-height:54px}
.co-acct-submit[disabled]{opacity:.65;cursor:default;filter:none}

.co-acct-alt{
  margin-top:16px;text-align:center;font-size:15px;color:var(--muted-fg);
}
/* A button, not a link: it changes what this form does rather than going
   anywhere, and a screen reader should say so. */
.co-acct-toggle{
  appearance:none;background:none;border:0;cursor:pointer;padding:4px 2px;
  font-family:var(--sans);font-size:15px;font-weight:700;color:var(--atlas);
}
.co-acct-toggle:hover{text-decoration:underline}

.co-acct-privacy{
  margin-top:14px;text-align:center;
  font-size:13.5px;line-height:1.5;color:var(--muted-fg);
}

.co-acct-error{
  font-size:15px;line-height:1.5;margin:0 0 16px;padding:12px 14px;
  border-radius:10px;background:var(--comet-soft);color:var(--foreground);
  border:1px solid var(--comet);
}
.co-acct-signedin,.co-acct-offline{
  font-size:15px;line-height:1.55;padding:14px 16px;border-radius:10px;
  background:var(--muted);color:var(--muted-fg);
}
.co-acct-signedin strong{color:var(--foreground)}

/* ---------- checkout: the mini sales page below the fold ----------
   The two-column grid above takes the payment. Everything from here down
   is there to justify $247 and to make the $19 membership visible to
   someone who is about to buy their second app. */
.checkout{padding:56px 0 64px}
.co-sell{background:var(--card);border-top:1px solid var(--border)}
/* Wide enough for the longest headline ("Everything inside the Gemini
   Notebook Companion", and the two-line one below it) to hold its line on
   desktop. The .lede inside keeps its own 620px, so the paragraph stays a
   readable measure under a full-width heading. */
.co-sell-head{max-width:1060px;margin:0 auto}
.co-lead{margin:18px auto 0}
.co-inside{
  display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:24px;
  max-width:1060px;margin:44px auto 0;
}
.co-item{
  background:var(--background);border:1px solid var(--border);border-radius:14px;
  padding:24px 22px;border-top:3px solid var(--atlas);
}
.co-item:nth-child(3n+2){border-top-color:var(--comet)}
.co-item:nth-child(3n){border-top-color:var(--manus)}
.co-item h3{font-size:17px;margin-bottom:7px}
.co-item p{font-size:14.5px;line-height:1.55;color:var(--muted-fg)}

.co-ways{background:var(--background);border-top:1px solid var(--border)}
.co-compare{
  display:grid;grid-template-columns:1fr 1fr;gap:24px;
  max-width:940px;margin:44px auto 0;align-items:start;
}
.co-opt{
  background:var(--card);border:1px solid var(--border);border-radius:16px;
  padding:30px 28px;position:relative;
}
/* Emphasis, not a verdict. The page is still selling the $247 app; this
   card is the honest alternative next to it, so it gets the accent border
   and nothing that calls the other option a mistake. */
.co-opt.hot{border-color:var(--comet);box-shadow:0 16px 40px oklch(55% .12 70 / .12)}
.co-opt-price{font-family:var(--serif);font-size:40px;line-height:1;margin:12px 0 20px}
.co-opt-price small{font-family:var(--sans);font-size:15px;color:var(--muted-fg);font-weight:500}
.co-opt .checks li{font-size:14.5px}
.co-opt-note{margin-top:20px;font-size:13.5px;color:var(--muted-fg);font-style:italic}
.co-opt-cta{margin-top:24px;width:100%;justify-content:center}

.co-faq{background:var(--card);border-top:1px solid var(--border)}

@media (max-width:960px){
  .co-inside{grid-template-columns:1fr 1fr}
  .co-compare{grid-template-columns:1fr}
}
@media (max-width:620px){
  .co-inside{grid-template-columns:1fr}
}

.co-trust li{
  font-size:13.5px;line-height:1.5;color:var(--muted-fg);
  padding-left:20px;position:relative;
}
.co-trust li::before{
  content:"\2713";position:absolute;left:0;top:0;color:var(--manus);font-weight:800;
}
/* Sits above the card now, not under the pay column. */
.co-back{margin-bottom:20px;font-size:14px}
@media (max-width:860px){
  .checkout-grid{grid-template-columns:1fr;gap:28px}
}
@media (max-width:620px){
  .checkout{padding:36px 0 60px}
  .checkout-summary{padding:26px 22px}
}

/* ---------- the partner program ----------
   /partners/. One page, so everything it needs is here rather than
   spread through the sections above.

   Built out of the page vocabulary that already exists - .wrap, .eyebrow,
   .plus-h2, .checks, .faq-list, .finalcta - and adds only the four things
   that page genuinely does not have anywhere else: the three earning
   cards, the numbered steps, the co-branded email mock, and the link
   builder's rows.

   No style attributes. See "former inline styles" above for what happens
   when somebody adds one. */
.pn-hero{padding:70px 0 64px}
/* The headline is written to sit on exactly two lines, and the default
   760px hero is 40px too narrow for the second of them at the 60px cap —
   "people to their smart stack." needs 740px and had 704px, so it wrapped
   to a third line. Measured, not guessed. Everything scales with the same
   clamp below that width, so this holds all the way down. */
.pn-hero .hero-single{max-width:840px}
.pn-lede{font-size:18px;max-width:660px}
/* .lede's max-width means a centred one needs the auto margins spelled
   out, and they cannot be written inline on this site. */
.pn-lede.center{margin-left:auto;margin-right:auto}
.pn-note{max-width:660px;margin:36px auto 0;font-size:15.5px;color:var(--muted-fg)}
.pn-fine{margin-top:18px;font-size:13.5px;color:var(--muted-fg)}

/* ---- what you earn ---- */
.pn-earn{background:var(--card);border-top:1px solid var(--border)}
.pn-earn-grid{
  display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:22px;margin-top:44px;
}
.pn-earn-card{
  background:var(--background);border:1px solid var(--border);border-radius:16px;
  padding:30px 26px;text-align:center;
}
.pn-earn-what{
  font-size:12px;letter-spacing:.12em;text-transform:uppercase;
  font-weight:700;color:var(--muted-fg);
}
.pn-earn-price{
  font-family:var(--serif);font-size:42px;line-height:1.05;margin:14px 0 16px;
  color:var(--atlas);
}
.pn-earn-price small{font-family:var(--sans);font-size:15px;color:var(--muted-fg);font-weight:500}
.pn-earn-sub{font-size:14.5px;line-height:1.55;color:var(--muted-fg)}

/* ---- co-branding ---- */
.pn-brand{background:var(--background)}
.pn-brand-grid{display:grid;grid-template-columns:1.05fr .95fr;gap:56px;align-items:center}
.pn-checks{margin-top:26px}
.pn-checks li{font-size:15.5px}
.pn-brand-aside{display:flex;flex-direction:column;gap:12px}
.pn-mock-label{
  font-size:12px;letter-spacing:.12em;text-transform:uppercase;
  font-weight:700;color:var(--muted-fg);
}
/* The mock is decoration that has to survive being read by a screen
   reader as ordinary text, so it is real markup rather than an image.
   Nothing in it is interactive. */
.pn-mock{
  background:var(--card);border:1px solid var(--border);border-radius:16px;
  padding:26px 24px;box-shadow:0 16px 40px oklch(32% .08 255 / .07);
}
.pn-mock-head{
  display:flex;align-items:center;gap:12px;flex-wrap:wrap;
  padding-bottom:16px;border-bottom:1px solid var(--border);
}
.pn-mock-logo{
  font-family:var(--serif);font-size:16px;font-weight:600;color:var(--atlas);
  border:1px dashed var(--border);border-radius:8px;padding:7px 12px;
}
.pn-mock-logo.is-us{border-style:solid;background:var(--muted)}
.pn-mock-plus{color:var(--muted-fg);font-weight:700}
.pn-mock-subject{font-family:var(--serif);font-size:18px;font-weight:600;margin-top:18px}
.pn-mock-body{margin-top:10px;font-size:15px;color:var(--muted-fg);line-height:1.6}
.pn-mock-sig{margin-top:14px;font-size:14.5px;font-weight:600}

/* ---- how it works ---- */
.pn-how{background:var(--card);border-top:1px solid var(--border)}
.pn-steps{
  list-style:none;display:grid;grid-template-columns:repeat(4,minmax(0,1fr));
  gap:24px;margin-top:44px;counter-reset:none;
}
.pn-steps li{position:relative;padding-top:6px}
.pn-step-n{
  display:flex;align-items:center;justify-content:center;
  width:36px;height:36px;border-radius:999px;
  background:var(--atlas);color:oklch(98% .004 85);
  font-weight:700;font-size:16px;margin-bottom:16px;
}
.pn-steps h3{font-family:var(--serif);font-size:18px;font-weight:600;margin-bottom:10px}
.pn-steps p{font-size:14.5px;line-height:1.6;color:var(--muted-fg)}
.pn-steps code{
  font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  font-size:13px;background:var(--muted);border-radius:5px;padding:2px 6px;
  /* Long enough to wrap on a narrow column, and it must be allowed to. */
  word-break:break-all;
}

/* ---- the link builder ---- */
.pn-builder{background:var(--background)}
.pn-builder-box{
  max-width:820px;margin:40px auto 0;background:var(--card);
  border:1px solid var(--border);border-radius:16px;padding:30px 28px;
}
.pn-label{
  display:block;font-size:13px;font-weight:600;letter-spacing:.04em;
  text-transform:uppercase;color:var(--muted-fg);margin-bottom:10px;
}
.pn-input{
  font-family:var(--sans);font-size:16px;padding:13px 14px;border-radius:var(--radius);
  border:1px solid var(--border);background:var(--background);color:var(--foreground);width:100%;
}
.pn-input:focus{border-color:var(--atlas)}
.pn-input-msg{font-size:14px;margin-top:10px;min-height:1.2em;color:var(--muted-fg)}
.pn-input-msg.err{color:var(--comet);font-weight:600}
.pn-builder-empty{margin-top:18px;font-size:14.5px;color:var(--muted-fg);font-style:italic}
.pn-links{list-style:none;display:grid;gap:12px;margin-top:22px}
.pn-link{
  display:grid;grid-template-columns:180px minmax(0,1fr) auto;gap:12px;align-items:center;
}
.pn-link-label{font-size:14.5px;font-weight:600}
.pn-link-url{
  font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  font-size:13px;padding:10px 12px;border-radius:var(--radius);
  border:1px solid var(--border);background:var(--muted);color:var(--foreground);
  width:100%;
  /* min-width:0 on the grid child, or a long URL refuses to shrink and
     pushes the copy button off the right edge. minmax(0,1fr) on the
     column handles the track; this handles the input's own intrinsic
     width, and both are needed. */
  min-width:0;
}
.pn-copy{padding:10px 18px;font-size:14px}

/* ---- the application form ---- */
.pn-apply{background:var(--card);border-top:1px solid var(--border)}
/* minmax(0,1fr), not the implicit `auto` track.
   An `auto` (or plain 1fr) grid track is floored at the MIN-CONTENT width of
   its widest item, and an <input>'s min-content comes from the `size`
   attribute — 20 characters by default — not from any CSS width. So the form's
   single column refused to go below ~364px and pushed itself past a 375px
   viewport, horizontal scrollbar and all. Same trap `.store-grid` above
   documents. width:100% and min-width:0 on the children do NOT fix it,
   because the floor is on the TRACK, not the item. */
.pn-form{
  max-width:640px;margin:40px auto 0;
  display:grid;grid-template-columns:minmax(0,1fr);gap:20px;
}
.pn-form-row{display:grid;gap:8px}
.pn-form label{
  font-size:13px;font-weight:600;letter-spacing:.04em;
  text-transform:uppercase;color:var(--muted-fg);
}
.pn-optional{text-transform:none;letter-spacing:0;font-weight:500;font-style:italic}
.pn-form input,.pn-form textarea{
  font-family:var(--sans);font-size:16px;padding:13px 14px;border-radius:var(--radius);
  border:1px solid var(--border);background:var(--background);color:var(--foreground);width:100%;
}
.pn-form textarea{resize:vertical;line-height:1.55}
.pn-form input:focus,.pn-form textarea:focus{border-color:var(--atlas)}
.pn-form .btn{justify-content:center}
.pn-hint{font-size:13px;color:var(--muted-fg)}
.pn-msg{font-size:15px;min-height:1.2em}
.pn-msg.err{color:var(--comet);font-weight:600}
.pn-msg.ok{color:var(--manus);font-weight:600}
.pn-unavailable{max-width:640px;margin:40px auto 0;text-align:center;font-size:16px;color:var(--muted-fg)}
.pn-faq{background:var(--background);border-top:1px solid var(--border)}

@media (max-width:1080px){
  .pn-steps{grid-template-columns:1fr 1fr}
}
@media (max-width:960px){
  .pn-brand-grid{grid-template-columns:1fr;gap:36px}
  .pn-earn-grid{grid-template-columns:1fr}
}
@media (max-width:620px){
  .pn-steps{grid-template-columns:1fr}
  .pn-builder-box{padding:24px 20px}
  /* The three-column row cannot hold a URL on a phone. Label above,
     field below, button full width under it. */
  .pn-link{grid-template-columns:1fr;gap:8px}
  .pn-copy{width:100%;justify-content:center}
}

/* Two fields on one row: first and last name. Collapses on a phone, where
   two half-width text inputs are worse than two full-width ones. */
/* min-width:0 on the pair AND on its rows.
   A grid item defaults to min-width:auto, which floors it at its content's
   min-content width — and for an <input> that is derived from the `size`
   attribute (20 characters by default), not from any CSS width. So the two
   name fields refused to shrink below their intrinsic width and pushed the
   whole form 32px wider than the 375px viewport. width:100% does not help;
   only lifting the automatic minimum does. */
.pn-form-pair{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px;min-width:0}
.pn-form-pair>.pn-form-row{min-width:0}
.pn-form input,.pn-form textarea{min-width:0}
/* The live preview of the link a requested code would produce. */
.pn-hint-url{
  font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  font-size:12.5px;color:var(--muted-fg);
  /* A long code must wrap rather than widen the form. */
  word-break:break-all;
}
.pn-hint-url b{color:var(--foreground);font-weight:600}
@media (max-width:620px){
  .pn-form-pair{grid-template-columns:minmax(0,1fr)}
}

/* ---------- the Partner dashboard section ----------
   Mirrors .pn-brand's two-column shape, and reuses .pn-mock for the card so
   the two illustrated blocks on the page read as the same kind of object. */
.pn-dash{background:var(--card);border-top:1px solid var(--border)}
.pn-dash-grid{display:grid;grid-template-columns:1.05fr .95fr;gap:56px;align-items:center}
.pn-dash-aside{display:flex;flex-direction:column;gap:12px}
.pn-dash-mock{padding:22px 20px}
.pn-dash-tiles{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.pn-dash-tile{
  background:var(--background);border:1px solid var(--border);border-radius:12px;
  padding:16px 14px;display:flex;flex-direction:column;gap:6px;
}
.pn-dash-tile-label{
  font-size:11px;letter-spacing:.1em;text-transform:uppercase;
  font-weight:700;color:var(--muted-fg);
}
.pn-dash-tile-value{font-family:var(--serif);font-size:26px;line-height:1;color:var(--foreground)}
/* The money one is the point of the card, so it carries the accent. */
.pn-dash-tile.is-money{border-color:var(--comet)}
.pn-dash-tile.is-money .pn-dash-tile-value{color:var(--atlas);font-size:23px}
/* Says plainly that the figures are illustrative. A mock full of numbers on a
   page about money should not be able to be mistaken for a real account. */
.pn-dash-caption{margin-top:14px;font-size:12.5px;color:var(--muted-fg);font-style:italic}

@media (max-width:960px){
  .pn-dash-grid{grid-template-columns:1fr;gap:36px}
}

/* The Partner page's tick lists put a bold lead-in on each row.
   `.checks li` is display:flex, so a bare <b> becomes its own flex ITEM and
   the remainder of the sentence becomes a second anonymous one — the bold
   half ended up in a ragged fixed-width column with the rest beside it. The
   markup wraps each row in a <span> so the row is one flex child; this makes
   sure it behaves like flowing text once it is. */
.pn-checks li>span{display:block;min-width:0}
