/* ─────── Paperwrist design tokens ─────── */
:root {
  /* Color */
  --pw-ink:        #1B1B1F;
  --pw-ink-deep:   #0A0A0C;
  --pw-accent-lift: #A88BFA;   /* lifted tone for dark surfaces — 6.27:1 on #1C1C1E */
  --pw-accent:      #7049DF;   /* light-surface accent — 5.66:1 on white */
  /* White. The old bone (#F6F2EA) was WristBuddy's; on a product about
     reading, a plain white page is the right ground — it is what a page
     of paper actually is, and it stops the background competing with
     the screenshots, which are themselves near-white. */
  --pw-paper:       #FFFFFF;
  /* Text and glyphs sitting ON an ink-filled surface (buttons, the skip
     link, the active segmented-control pill). This used to be
     --pw-paper, which meant changing the page ground also changed every
     button label — split so the ground can be swapped freely. */
  --pw-on-ink:      #FFFFFF;
  /* Hairlines and card fills are tuned FOR white: on the old bone they
     could be fainter and still read. */
  --pw-tint:       rgba(27, 27, 31, 0.035);   /* card / panel fill */
  --pw-line:       rgba(27, 27, 31, 0.11);
  /* Secondary copy (hero tagline, card descriptions, FAQ). 0.66 alpha
     over the ground; on the previous bone background that measured
     ~5.2:1, and on white it is ~5.9:1 — so moving to white only
     improved it. The dark-mode variant clears AA at ~7.6:1. */
  --pw-mute:       rgba(27, 27, 31, 0.66);
  --pw-mute-dark:  rgba(242, 242, 247, 0.65);

  /* Type */
  /* Inter first, then the platform UI face — the same construction
     obsidian.md uses. On macOS/iOS the system stack resolves to SF Pro
     and on Windows to Segoe UI Variable, both of which are close enough
     to Inter that the swap is invisible; everyone else downloads Inter.
     ui-sans-serif before system-ui is deliberate: it is the one that
     picks the UI-optimised optical size where the two differ. */
  --pw-font:       'Inter', ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
  --pw-font-mono:  ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace;

  /* Layout */
  --pw-radius:     14px;     /* card / button radius */
  --pw-radius-pill: 999px;
  --pw-maxwidth:   720px;    /* readable column for the privacy doc */
}

/* ═══════════════════════════════════════════════════════════════════
   GROUND PRESETS — for trying background colours without editing code
   ═══════════════════════════════════════════════════════════════════
   Every light surface on this site derives from --pw-paper (the ground)
   and --pw-tint (cards and panels), so changing those two changes the
   whole page coherently. --pw-on-ink is deliberately NOT in here: it is
   the colour of text sitting on dark fills, and it must not move with
   the ground.

   Two ways to try one:

   1. A NAMED PRESET. In DevTools → Elements, select the <html> element
      and add the attribute:            data-pw-ground="bone"
      or, in the Console:               document.documentElement.dataset.pwGround = 'bone'
      Clear it with:                    delete document.documentElement.dataset.pwGround
      Names below: white (default), bone, warm, cool, dim, ink.

   2. ANY COLOUR AT ALL. In DevTools → Elements, select <html>, find the
      `:root` rule in the Styles pane and click the swatch next to
      --pw-paper. The colour picker updates the page live, including an
      eyedropper for sampling a colour from anywhere on screen.
      Console equivalent:
          document.documentElement.style.setProperty('--pw-paper', '#F4F1EC')
      and to undo:
          document.documentElement.style.removeProperty('--pw-paper')

   Whatever you settle on, move it into `:root` below and delete the rest
   — these presets are a workbench, not a feature.

   Contrast note: --pw-mute is an ALPHA (0.66 of the ink over whatever is
   behind it), so it re-composites against any ground automatically. It
   clears WCAG AA down to roughly #E8E8E8; below that, body text starts
   to fail and the ground is too dark for a light theme. `dim` is at that
   edge on purpose, and `ink` is past it — it exists to show you what
   breaks, not to be shipped.
   ═══════════════════════════════════════════════════════════════════ */
:root[data-pw-ground="white"] { --pw-paper: #FFFFFF; --pw-tint: rgba(27, 27, 31, 0.035); }
:root[data-pw-ground="bone"]  { --pw-paper: #F6F2EA; --pw-tint: rgba(27, 27, 31, 0.045); }  /* the WristBuddy ground */
:root[data-pw-ground="warm"]  { --pw-paper: #FCFAF6; --pw-tint: rgba(27, 27, 31, 0.040); }
:root[data-pw-ground="cool"]  { --pw-paper: #F8F9FB; --pw-tint: rgba(27, 27, 31, 0.045); }
:root[data-pw-ground="dim"]   { --pw-paper: #ECECEE; --pw-tint: rgba(27, 27, 31, 0.055); }
:root[data-pw-ground="ink"]   { --pw-paper: #1B1B1F; --pw-tint: rgba(255, 255, 255, 0.05); }

/* ─────── Base ─────── */
html, body { margin: 0; padding: 0; }
body {
  font-family: var(--pw-font);
  font-weight: 400;
  font-size: 17px;
  line-height: 1.6;
  background: var(--pw-paper);
  color: var(--pw-ink);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  /* cv11 gives Inter the single-storey "a"-free lowercase g and a
     disambiguated 1/l/I — the OpenType features the face was drawn with
     UI legibility in mind for. Harmless where the fallback lacks them. */
  font-feature-settings: "cv11", "ss01";
  text-rendering: optimizeLegibility;
}

/* ─────── Typography ─────── */
/* Headings are SEMIBOLD (600), not black (800). Inter at 600 with
   negative tracking is the obsidian.md voice: confident without
   shouting. The tracking tightens as the size grows, because optical
   letter-spacing has to come off at display sizes or the word falls
   apart — Obsidian runs -1.2px at 60px, which is the -0.02em below. */
h1, h2, h3, h4 {
  font-weight: 600;
  letter-spacing: -0.021em;
  line-height: 1.14;
  margin: 1.6em 0 0.5em;
  text-wrap: balance;
}
h1 { font-size: 46px; line-height: 1.04; letter-spacing: -0.028em; }
h2 { font-size: 28px; line-height: 1.16; letter-spacing: -0.020em; }
h3 { font-size: 19px; letter-spacing: -0.012em; }
p  { margin: 0.75em 0; max-width: var(--pw-maxwidth); text-wrap: pretty; }
/* 600, not 700: in Inter, semibold is the weight that reads as emphasis
   inside a 400 paragraph without turning into a second heading. */
strong { font-weight: 600; }
em     { font-style: italic; }

a {
  color: var(--pw-accent);
  text-decoration: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: 3px;
  transition: color 0.12s;
}
a:hover { color: var(--pw-ink); }

code, pre {
  font-family: var(--pw-font-mono);
  font-size: 14px;
  background: rgba(27, 27, 31, 0.05);
  border-radius: 6px;
}
code { padding: 2px 6px; }
pre { padding: 14px 16px; overflow-x: auto; }

ul, ol { padding-left: 1.4em; max-width: var(--pw-maxwidth); }
li     { margin: 0.35em 0; }

hr { border: 0; border-top: 1px solid var(--pw-line); margin: 2.4em 0; }

/* ─────── Tables (extension — policy uses two) ─────── */
table {
  width: 100%;
  max-width: var(--pw-maxwidth);
  border-collapse: collapse;
  margin: 1.2em 0;
  font-size: 15px;
}
th, td {
  text-align: left;
  vertical-align: top;
  padding: 10px 12px;
  border-bottom: 1px solid var(--pw-line);
}
th {
  font-weight: 600;
  font-size: 13px;
  letter-spacing: 0.02em;
  text-transform: uppercase;
  color: var(--pw-mute);
  border-bottom: 1.5px solid var(--pw-line);
}
tbody tr:last-child td { border-bottom: none; }

/* ─────── Layout shell ─────── */
.pw-page { max-width: 880px; margin: 0 auto; padding: 56px 24px 96px; }

/* ─────── Site header ─────── */
.pw-header { display: flex; align-items: center; gap: 14px; margin-bottom: 36px; }
.pw-header img.logo { width: 44px; height: 44px; border-radius: 10px; }
.pw-header .brand {
  display: flex; align-items: center; gap: 14px;
  text-decoration: none;
}
.pw-header .name {
  font-weight: 700; font-size: 22px; letter-spacing: -0.022em; line-height: 1;
  color: var(--pw-ink);
  text-decoration: none;
}
.pw-header .name .accent { color: var(--pw-accent); }
.pw-header .actions { margin-left: auto; display: flex; gap: 8px; align-items: center; }

/* ─────── Language switcher (native <select> styled as a pill) ─────── */
.pw-lang-switcher {
  appearance: none;
  -webkit-appearance: none;
  background: transparent;
  border: 1px solid var(--pw-line);
  color: var(--pw-mute);
  font: inherit;
  font-size: 13px;
  font-weight: 500;
  padding: 8px 30px 8px 14px;
  border-radius: var(--pw-radius-pill);
  cursor: pointer;
  transition: color 0.12s, border-color 0.12s, background 0.12s;
  /* tiny chevron */
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'><path fill='none' stroke='%23999' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round' d='M1 1l4 4 4-4'/></svg>");
  background-repeat: no-repeat;
  background-position: right 12px center;
  background-size: 10px 6px;
}
.pw-lang-switcher:hover {
  color: var(--pw-ink);
  border-color: rgba(27, 27, 31, 0.20);
}

/* ─────── Dark-mode toggle button ─────── */
.pw-theme-toggle {
  appearance: none;
  background: transparent;
  border: 1px solid var(--pw-line);
  color: var(--pw-mute);
  font: inherit;
  font-size: 13px;
  font-weight: 500;
  padding: 8px 14px;
  border-radius: var(--pw-radius-pill);
  cursor: pointer;
  transition: color 0.12s, border-color 0.12s, background 0.12s;
  display: inline-flex;
  align-items: center;
  gap: 6px;
}
.pw-theme-toggle:hover {
  color: var(--pw-ink);
  border-color: rgba(27, 27, 31, 0.20);
}
.pw-theme-toggle .icon { font-size: 14px; line-height: 1; }

/* ─────── Site footer ─────── */
.pw-footer {
  margin-top: 80px; padding-top: 28px; border-top: 1px solid var(--pw-line);
  display: flex; justify-content: space-between; align-items: center;
  font-size: 13px; color: var(--pw-mute);
  flex-wrap: wrap;
  gap: 12px;
}
.pw-footer .left { display: flex; align-items: center; gap: 8px; }
.pw-footer .left img { width: 22px; height: 22px; border-radius: 5px; }

/* ─────── Pre-paint dark background ───────
   boot.js sets .pw-dark-pending on <html> before the first paint, while
   <body> does not yet exist. These two rules paint the dark ground
   immediately so a dark-mode visitor never sees a white flash. The class
   is removed once the real body.pw-dark class is applied.

   This lives in the stylesheet rather than an inline <style> block (the
   WristBuddy site inlines it) so style-src can stay 'self' with no
   'unsafe-inline'. */
html.pw-dark-pending { background: #1B1B1F; }
html.pw-dark-pending body { background: #1B1B1F; color: rgba(242, 242, 247, 0.92); }

/* ─────── Skip link ───────
   Visually hidden until focused, then pinned to the top-left. Lets a
   keyboard or screen-reader user jump the header/nav on every page. */
.pw-skip-link {
  position: absolute;
  left: -9999px;
  top: 0;
  z-index: 100;
  padding: 10px 16px;
  border-radius: 0 0 var(--pw-radius) 0;
  background: var(--pw-ink);
  color: var(--pw-on-ink);
  text-decoration: none;
  font-weight: 600;
}
.pw-skip-link:focus {
  left: 0;
  color: var(--pw-on-ink);
}

/* ─────── Dark variant (toggled by JS via body.pw-dark) ─────── */
body.pw-dark {
  background: var(--pw-ink);
  color: rgba(242, 242, 247, 0.92);
}
body.pw-dark .pw-header .name { color: rgba(242, 242, 247, 1); }
body.pw-dark .pw-header .name .accent { color: var(--pw-accent-lift); }
body.pw-dark a { color: var(--pw-accent-lift); }
body.pw-dark a:hover { color: #fff; }
body.pw-dark code, body.pw-dark pre { background: rgba(168, 139, 250, 0.10); color: var(--pw-accent-lift); }
body.pw-dark hr { border-top-color: rgba(255, 255, 255, 0.08); }
body.pw-dark .pw-footer { border-top-color: rgba(255, 255, 255, 0.08); color: rgba(255, 255, 255, 0.55); }
body.pw-dark th { color: var(--pw-mute-dark); border-bottom-color: rgba(255, 255, 255, 0.10); }
body.pw-dark td { border-bottom-color: rgba(255, 255, 255, 0.06); }
body.pw-dark .pw-theme-toggle {
  border-color: rgba(255, 255, 255, 0.12);
  color: var(--pw-mute-dark);
}
body.pw-dark .pw-theme-toggle:hover,
body.pw-dark .pw-lang-switcher:hover {
  color: #fff;
  border-color: rgba(255, 255, 255, 0.25);
}
body.pw-dark .pw-lang-switcher {
  border-color: rgba(255, 255, 255, 0.12);
  color: var(--pw-mute-dark);
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'><path fill='none' stroke='%23999' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round' d='M1 1l4 4 4-4'/></svg>");
}
body.pw-dark .pw-lang-switcher option {
  background: var(--pw-ink);
  color: rgba(242, 242, 247, 0.92);
}

/* ═══════════════════════════════════════════════════════════════════════
   Marketing-site extensions
   ─────────────────────────────────────────────────────────────────────── */

/* Top nav between brand + actions */
.pw-nav {
  display: flex;
  gap: 18px;
  margin-left: 24px;
}
.pw-nav a {
  font-size: 14px;
  font-weight: 500;
  color: var(--pw-mute);
  text-decoration: none;
  transition: color 0.12s;
}
.pw-nav a:hover { color: var(--pw-ink); }
body.pw-dark .pw-nav a { color: var(--pw-mute-dark); }
body.pw-dark .pw-nav a:hover { color: #fff; }

/* Wider landing-page shell (overrides .pw-page max-width) */
.pw-page--wide { max-width: 1080px; }

/* ─────── Hero ─────── */
.pw-hero {
  padding: 48px 0 64px;
  text-align: left;
  /* Prevent accidental text/callout selection when dragging the device
     demos (or double-tapping near them). Applies to the whole hero. */
  -webkit-touch-callout: none;  /* iOS Safari */    /* Safari */
  -khtml-     /* Konqueror HTML */
  -moz-       /* old Firefox */
  -ms-        /* IE / old Edge */            /* standard */
}
.pw-hero h1 {
  font-size: 64px;
  letter-spacing: -0.028em;
  line-height: 1.02;
  margin-top: 0;
  margin-bottom: 16px;
  max-width: 16ch;
}
.pw-hero .tagline {
  font-size: 18px;
  color: var(--pw-mute);
  max-width: 50ch;
  margin-bottom: 32px;
}
/* Values line ("Pay once. No cloud. ...") sits as a second
   paragraph slightly tucked under the lead tagline — close enough
   to read as a pair, separate enough to land as its own beat. */
.pw-hero .tagline.tagline--values {
  margin-top: -20px;
}
body.pw-dark .pw-hero .tagline { color: var(--pw-mute-dark); }
@media (max-width: 600px) {
  .pw-hero h1 { font-size: 44px; }
  .pw-hero .tagline { font-size: 16px; }
  /* Center the store badges and shrink them on phones. */
  .pw-cta-row { justify-content: center; }
  .pw-badge { padding: 9px 14px; font-size: 13px; gap: 8px; }
  .pw-badge .glyph { font-size: 18px; }
  .pw-badge .label .small { font-size: 9px; }
}

/* Vertical separation between the two stacked hero halves on narrow
   viewports — without this the bottom row (badges + notice) butts
   right up against the demo. The ≥1000px layout sets its own
   margin-top, so this only governs the single-column stack. */
.pw-hero-bottom { margin-top: 44px; }

/* ─────── Wide-viewport hero: two columns, demo above the fold ───────
   Below 1000px we stick with the original single-column hero (text
   stacked, demo below). At 1000px+ we move the demo into a parallel
   right-hand column so it's visible at first glance without the
   visitor having to scroll. Grid areas pin each text element to the
   left column; the .pw-demo block (platform tabs + hero art) gets
   the full-height right column. */
@media (min-width: 1000px) {
  /* Hero structure on wide viewports:
       <section class="pw-hero">
         <div class="pw-hero-split">           ← two top-aligned columns
           <div class="pw-hero-text">          ← left: pill + h1 + tagline
           <div class="pw-demo">               ← right: art then tabs
         <div class="pw-hero-bottom">          ← CTAs + notice in one row
     The split is grid 1fr / 360-520px; the bottom row is a flex
     row that fills the full hero width. */
  .pw-hero-split {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(360px, 520px);
    column-gap: 56px;
    align-items: start;            /* both columns flush at top */
  }
  .pw-hero-bottom {
    display: flex;
    align-items: center;
    gap: 32px;
    margin-top: 40px;
  }
  .pw-hero-bottom > .pw-cta-row { flex-shrink: 0; margin: 0; }
  .pw-hero-bottom > .pw-notice  { flex: 1; margin: 0; }
}

/* Demo column layout (any viewport): hero-art on top, platform
   tabs centred below it. Flex `order` reverses the DOM sequence
   without touching the markdown in 7 locale files.
   No top margin — keeps the demo column's top edge flush with the
   text column's top (the "Coming soon" pill on the left). */
.pw-demo {
  display: flex;
  flex-direction: column;
  align-items: center;
}
.pw-demo .pw-hero-art      { order: 1; }
.pw-demo .pw-platform-tabs { order: 3; margin-top: 14px; margin-bottom: 0; }

/* ─────── Store badges row ─────── */
.pw-cta-row {
  display: flex;
  gap: 12px;
  flex-wrap: wrap;
  margin-bottom: 48px;
}
.pw-badge {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  padding: 12px 20px;
  border-radius: var(--pw-radius);
  text-decoration: none;
  font-weight: 600;
  font-size: 15px;
  transition: transform 0.12s, box-shadow 0.12s;
}
.pw-badge .glyph {
  font-size: 22px;
  line-height: 1;
}
.pw-badge .label {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  line-height: 1.15;
}
.pw-badge .label .small {
  font-size: 10px;
  font-weight: 500;
  opacity: 0.75;
  text-transform: uppercase;
  letter-spacing: 0.05em;
}
.pw-badge--live {
  background: var(--pw-ink);
  color: #fff;
}
.pw-badge--live:hover {
  transform: translateY(-1px);
  box-shadow: 0 4px 16px rgba(27, 27, 31, 0.22);
  color: #fff;
}
.pw-badge--coming {
  background: transparent;
  color: var(--pw-mute);
  border: 1px solid var(--pw-line);
  cursor: default;
}
body.pw-dark .pw-badge--live { background: var(--pw-accent-lift); color: var(--pw-ink); }
body.pw-dark .pw-badge--live:hover { color: var(--pw-ink); }
body.pw-dark .pw-badge--coming {
  color: var(--pw-mute-dark);
  border-color: rgba(255, 255, 255, 0.12);
}

/* ─────── Hero device row (mock or real screenshots) ─────── */
/* Drag-select is suppressed only on the ARTWORK — the carousel is
   pointer-driven and a stray text selection ruins a swipe. It used to
   be on .pw-hero as a whole, which also blocked copying the headline. */
.pw-hero-art {
  user-select: none;
  -webkit-user-select: none;
  /* No container chrome — the device frames float directly on the
     page background. No margin-top: the demo column's top edge aligns
     with the text column's top (the "Coming soon" pill). Spacing to
     the platform tabs below is handled by the tabs' own margin-top. */
  display: flex;
  justify-content: center;
  align-items: center;
  gap: 36px;
  flex-wrap: wrap;
}
/* Per-platform vertical stack: phone on top, watch on bottom.
   Centred so the narrower Wear OS / Apple Watch square sits
   under the wider phone without optical drift. */
.pw-hero-art .pw-stack {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 18px;
}
/* Thin vertical separator between the Apple column and the Android
   column in "both" mode. Hidden when only one platform is showing
   (rules at the bottom of this block). On mobile it collapses to a
   horizontal rule to match the column-stacked layout. */
.pw-divider {
  width: 1px;
  align-self: stretch;
  min-height: 320px;
  background: linear-gradient(
    to bottom,
    transparent,
    var(--pw-line) 12%,
    var(--pw-line) 88%,
    transparent
  );
}
body.pw-dark .pw-divider {
  background: linear-gradient(
    to bottom,
    transparent,
    rgba(255, 255, 255, 0.10) 12%,
    rgba(255, 255, 255, 0.10) 88%,
    transparent
  );
}
/* Mobile: stack the two platform columns vertically and flip the
   divider to a horizontal rule so it still reads as a separator. */
@media (max-width: 700px) {
  .pw-hero-art {
    flex-direction: column;
    gap: 24px;
  }
  .pw-divider {
    width: 80%;
    height: 1px;
    min-height: 0;
    align-self: center;
    background: linear-gradient(
      to right,
      transparent,
      var(--pw-line) 12%,
      var(--pw-line) 88%,
      transparent
    );
  }
  body.pw-dark .pw-divider {
    background: linear-gradient(
      to right,
      transparent,
      rgba(255, 255, 255, 0.10) 12%,
      rgba(255, 255, 255, 0.10) 88%,
      transparent
    );
  }
}

/* ─────── Real device frames (Apple stack) ───────
   When a real screenshot exists, we drop the placeholder and render
   the image inside a thin black "bezel" — border-radius + padding +
   shadow does the job without shipping PNG/SVG bezel chrome we'd
   have to maintain per device generation. The watch sits absolutely
   over the iPhone's bottom-right, the way it lands in Apple's own
   product photography. */
.pw-hero-art .pw-stack--apple {
  position: relative;
  width: 240px;
  /* Override the column gap — the watch is absolutely positioned and
     doesn't participate in the flex flow. */
  gap: 0;
  /* Reserve room for the watch peeking out the bottom-right corner so
     the bounding box matches what's painted (no clipped shadows, no
     surprise overflow next to the divider in "Both" mode). The right
     padding tracks the watch's -36px outward shift (28 + 36 = 64). */
  padding: 0 64px 28px 0;
}
.pw-device {
  position: relative;
  display: block;
  background: #0b0b0e;
  overflow: hidden;
  box-shadow:
    0 1px 0 rgba(255, 255, 255, 0.08) inset,
    0 22px 40px -20px rgba(15, 23, 42, 0.45),
    0 6px 14px -6px rgba(15, 23, 42, 0.30);
}
.pw-device img {
  display: block;
  width: 100%;
  height: auto;
}
/* Reserve the box BEFORE the image decodes and before mockups.js builds
   .pw-screen. Without this the first paint has an unmeasured ~520px-tall
   box per device and the hero (the LCP element) shifts when the first
   screenshot lands. The ratios are the native ratios of the store
   exports, so nothing is letterboxed. */
.pw-device--iphone  img { aspect-ratio: 1320 / 2868; }
.pw-device--android img { aspect-ratio: 1080 / 1920; }
.pw-device--watch   img { aspect-ratio: 422 / 514; }
.pw-device--wearos  img { aspect-ratio: 1 / 1; }
.pw-device--iphone {
  width: 240px;
  padding: 9px;
  border-radius: 44px;
}
.pw-device--iphone img { border-radius: 36px; }

.pw-device--watch {
  position: absolute;
  right: -36px;          /* pulled out from the phone (Medium separation) */
  bottom: 0;
  width: 132px;
  padding: 7px;
  border-radius: 30px;
}
.pw-device--watch img { border-radius: 24px; }
/* Apple Watch digital crown — a stubby pill on the right edge. Pseudo
   element keeps the markup clean and the bezel honest. */
.pw-device--watch::after {
  content: "";
  position: absolute;
  right: -3px;
  top: 36%;
  width: 4px;
  height: 22px;
  background: #2a2a2f;
  border-radius: 2px;
  box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.4);
}
/* Dark mode: the near-black bezel would vanish into the dark page now
   that the hero-art panel is gone. Lift the bezel to a dark grey, trace
   the edge with a hairline rim, and add a soft white glow so the device
   reads against the background. Applies to all four frames (iPhone,
   Apple Watch, Android, Wear OS) via the shared .pw-device class. */
body.pw-dark .pw-device {
  background: #2c2c33;
  box-shadow:
    0 0 0 1px rgba(255, 255, 255, 0.14),
    0 0 40px -4px rgba(255, 255, 255, 0.12),
    0 22px 40px -20px rgba(0, 0, 0, 0.7);
}

/* Mobile: keep the same overlay arrangement, just shrunk so the
   apple stack still fits next to (or above, when wrapped) the
   android placeholder column. */
@media (max-width: 700px) {
  .pw-hero-art .pw-stack--apple {
    width: 208px;
    padding: 0 54px 24px 0;   /* watch shift scaled to -30px on mobile */
  }
  .pw-device--iphone { width: 208px; padding: 8px; border-radius: 38px; }
  .pw-device--iphone img { border-radius: 31px; }
  .pw-device--watch  { width: 116px; padding: 6px; border-radius: 26px; right: -30px; }
  .pw-device--watch img { border-radius: 21px; }
}

/* ─────── Android stack (mirrors the Apple overlay pattern) ───────
   Same shape as pw-stack--apple — Android phone bezel as base, round
   Wear OS watch perched absolutely in the bottom-right. The phone is
   a touch less rounded than the iPhone; the watch is a full circle
   (Pixel Watch / Galaxy Watch round). The Wear OS screenshot is a
   square capture with black corners, so clipping the <img> to a
   circle (border-radius:50%) yields a clean round face. */
.pw-hero-art .pw-stack--android {
  position: relative;
  width: 240px;
  gap: 0;
  padding: 0 64px 28px 0;   /* matches Apple stack: 28 + 36px watch shift */
}
.pw-device--android {
  width: 240px;
  padding: 9px;
  border-radius: 36px;          /* less rounded than iPhone — Android shape */
}
.pw-device--android img { border-radius: 28px; }
.pw-device--wearos {
  position: absolute;
  right: -36px;                 /* pulled out from the phone (Medium separation) */
  bottom: 0;
  width: 132px;
  height: 132px;                /* round — Wear OS faces are circular */
  padding: 7px;
  border-radius: 50%;
}
.pw-device--wearos img { border-radius: 50%; }
/* Wear OS side button (typically ~3 o'clock on Pixel Watch /
   Galaxy Watch round). Shorter than the Apple Watch crown so the
   silhouette reads as a different device family. */
.pw-device--wearos::after {
  content: "";
  position: absolute;
  right: -3px;
  top: 44%;
  width: 4px;
  height: 14px;
  background: #2a2a2f;
  border-radius: 2px;
  box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.4);
}

/* Mobile responsive — same shrinkage as Apple stack. */
@media (max-width: 700px) {
  .pw-hero-art .pw-stack--android {
    width: 208px;
    padding: 0 54px 24px 0;   /* watch shift scaled to -30px on mobile */
  }
  .pw-device--android { width: 208px; padding: 8px; border-radius: 32px; }
  .pw-device--android img { border-radius: 24px; }
  .pw-device--wearos  { width: 116px; height: 116px; padding: 6px; right: -30px; }
}

/* ─────── Screen carousel (hero device demos) ───────
   mockups.js wraps each .pw-device img into .pw-screen > .pw-track > .pw-shot.
   Unlike the WristBuddy hero this carousel is HORIZONTAL ONLY — the source
   images are single-screen App Store / Play captures that already carry
   their own status bar, so there is nothing to scroll vertically and no
   synthetic chrome to draw. One image = one screenful; you flip between
   them left/right by swipe, arrow button, dot, or keyboard. */
.pw-screen {
  position: relative;
  width: 100%;
  overflow: hidden;
  background: #f5f5f7;
  /* Horizontal drag only: let the browser keep vertical panning (page
     scroll) while we claim the horizontal axis for the swipe gesture. */
  touch-action: pan-y;
}
.pw-track {
  position: absolute;
  inset: 0;
  display: flex;
  height: 100%;
  transition: transform var(--pw-swipe-dur, 0.42s) var(--pw-swipe-ease, cubic-bezier(0.22, 1, 0.36, 1));
}
@media (prefers-reduced-motion: reduce) {
  .pw-track { transition: none; }
}
.pw-shot {
  flex: 0 0 100%;
  height: 100%;
  cursor: grab;
}
.pw-screen.grabbing .pw-shot { cursor: grabbing; }
.pw-shot img {
  display: block;
  width: 100%;
  height: 100%;
  /* The frame's aspect-ratio matches the capture, so `contain` is a
     no-op in the common case and only letterboxes if a future export
     has a different ratio — safer than `cover`, which would silently
     crop the top of a taller screenshot. */
  object-fit: contain;
  object-position: center top;
  border-radius: 0 !important;   /* radius lives on .pw-screen */
  pointer-events: none;
  user-select: none;
  -webkit-user-drag: none;
}

/* Page dots — bottom-centre overlay, iOS-style. Only rendered when the
   device has more than one screen. */
.pw-dots {
  position: absolute;
  left: 50%;
  bottom: 12px;
  transform: translateX(-50%);
  z-index: 6;
  display: flex;
  gap: 6px;
  padding: 5px 8px;
  border-radius: 999px;
  background: rgba(0, 0, 0, 0.34);
  backdrop-filter: blur(4px);
  -webkit-backdrop-filter: blur(4px);
}
.pw-dot {
  width: 8px; height: 8px; padding: 0; border: 0; border-radius: 50%;
  cursor: pointer; background: rgba(255, 255, 255, 0.55);
  transition: background 0.15s, transform 0.15s;
}
.pw-dot[aria-current="true"] { background: #fff; transform: scale(1.25); }
.pw-dot:focus-visible { outline: 2px solid #fff; outline-offset: 2px; }

/* Left / right arrows. Keyboard users get these for free (they are real
   buttons); pointer users see them on hover or focus.

   They sit INSIDE the bezel, hugging its edges: .pw-device clips to its
   own rounded rectangle (overflow: hidden, which is what keeps the
   screenshot's square corners from poking out), so anything positioned
   outside it would simply be cut off. */
.pw-arrow {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  z-index: 7;
  width: 28px; height: 28px;
  display: flex; align-items: center; justify-content: center;
  padding: 0;
  border: 1px solid var(--pw-line);
  border-radius: 50%;
  background: var(--pw-paper);
  color: var(--pw-ink);
  font-size: 14px; line-height: 1;
  cursor: pointer;
  opacity: 0;
  transition: opacity 0.15s, background 0.15s;
}
.pw-device:hover .pw-arrow,
.pw-arrow:focus-visible { opacity: 1; }
/* Touch devices have no hover: show the arrows permanently but faint,
   since swiping is the primary gesture there. */
@media (hover: none) {
  .pw-arrow { opacity: 0.75; }
}
.pw-arrow:hover { background: #fff; }
.pw-arrow:focus-visible { outline: 2px solid var(--pw-accent); outline-offset: 2px; }
.pw-arrow[disabled] { opacity: 0 !important; pointer-events: none; }
.pw-arrow--prev { left: 6px; }
.pw-arrow--next { right: 6px; }
/* The watches are barely half the width of the phones — full-size
   arrows would swallow the face. */
.pw-device--watch .pw-arrow,
.pw-device--wearos .pw-arrow { width: 22px; height: 22px; font-size: 12px; }
.pw-device--watch .pw-arrow--prev,
.pw-device--wearos .pw-arrow--prev { left: 3px; }
.pw-device--watch .pw-arrow--next,
.pw-device--wearos .pw-arrow--next { right: 3px; }
.pw-device--wearos .pw-dots { bottom: 6px; }
.pw-device--watch .pw-dots,
.pw-device--wearos .pw-dots { bottom: 7px; gap: 4px; padding: 4px 6px; }
.pw-device--watch .pw-dot,
.pw-device--wearos .pw-dot { width: 6px; height: 6px; }
body.pw-dark .pw-arrow {
  background: #2c2c33;
  color: rgba(242, 242, 247, 0.92);
  border-color: rgba(255, 255, 255, 0.16);
}
body.pw-dark .pw-arrow:hover { background: #3a3a42; }

/* Aspect ratio + inner screen radius, per device. The ratios are the
   NATIVE ratios of the store captures we ship, so nothing is cropped:
     iPhone 6.9"  1320 × 2868      Android phone 1080 × 1920
     Apple Watch Ultra 422 × 514   Wear OS 480 × 480 (round) */
.pw-device--iphone  .pw-screen { --pw-screen-r: 34px; aspect-ratio: 1320 / 2868; background: #f5f5f7; }
.pw-device--android .pw-screen { --pw-screen-r: 26px; aspect-ratio: 1080 / 1920;  background: #f5f2fa; }
.pw-device--watch   .pw-screen { --pw-screen-r: 22px; aspect-ratio: 422 / 514;    background: #000; }
.pw-device--wearos  .pw-screen { --pw-screen-r: 50%;  aspect-ratio: 1 / 1;        background: #000; }
.pw-screen { border-radius: var(--pw-screen-r, 0); }
@media (max-width: 700px) {
  .pw-device--iphone  .pw-screen { --pw-screen-r: 30px; }
  .pw-device--android .pw-screen { --pw-screen-r: 22px; }
}

/* Caption under each device naming the screen you are looking at. Sits
   outside the bezel so it never overlaps the artwork. */
.pw-shot-caption {
  order: 2;              /* between the art (1) and the platform tabs (3) */
  margin-top: 12px;
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.01em;
  text-align: center;
  color: var(--pw-mute);
  min-height: 1.2em;
}
body.pw-dark .pw-shot-caption { color: var(--pw-mute-dark); }

/* ─────── Platform toggle (segmented control below the hero art) ─────── */
/* .pw-demo layout (flex column, art above tabs) is defined earlier
   in the file in the "Demo column layout" block alongside the
   wide-viewport hero rules. */
/* Compact segmented control — small, borderless track, ink-filled
   active segment. (Option A from the May 2026 toggle prototypes.) */
.pw-platform-tabs {
  display: inline-flex;
  align-items: center;
  gap: 2px;
  padding: 2px;
  background: rgba(27, 27, 31, 0.06);
  border-radius: var(--pw-radius-pill);
}
.pw-platform-tabs button {
  appearance: none;
  background: transparent;
  border: 0;
  font: inherit;
  font-size: 12px;
  font-weight: 600;
  color: var(--pw-mute);
  padding: 4px 12px;
  border-radius: var(--pw-radius-pill);
  cursor: pointer;
  transition: color 0.12s, background 0.12s;
}
.pw-platform-tabs button:hover {
  color: var(--pw-ink);
}
.pw-platform-tabs button[aria-checked="true"] {
  background: var(--pw-ink);
  color: var(--pw-on-ink);
}
.pw-platform-tabs button:focus-visible {
  outline: 2px solid var(--pw-accent);
  outline-offset: 2px;
}
body.pw-dark .pw-platform-tabs {
  background: rgba(255, 255, 255, 0.06);
}
body.pw-dark .pw-platform-tabs button {
  color: var(--pw-mute-dark);
}
body.pw-dark .pw-platform-tabs button:hover {
  color: #fff;
}
body.pw-dark .pw-platform-tabs button[aria-checked="true"] {
  background: var(--pw-accent-lift);
  color: var(--pw-ink);
}
body.pw-dark .pw-platform-tabs button:focus-visible {
  outline-color: var(--pw-accent-lift);
}

/* Platform-visibility rules. The pre-paint script sets the
   data-pw-platform attribute on <html> before the hero paints, so
   there's no flash of all-four-frames-then-narrow on iPhone /
   Android visitors. "both" is the implicit default and shows all
   four (no rule needed — nothing hidden).

   Single-platform modes hide the opposite stack AND the divider —
   the divider only earns its keep when both columns are visible.

   Important: scope to `.pw-hero-art` descendants so the rules don't
   accidentally hide platform-tagged content anywhere else on the
   site. */
html[data-pw-platform="iphone"]  .pw-hero-art .pw-stack--android,
html[data-pw-platform="iphone"]  .pw-hero-art .pw-divider {
  display: none;
}
html[data-pw-platform="android"] .pw-hero-art .pw-stack--apple,
html[data-pw-platform="android"] .pw-hero-art .pw-divider {
  display: none;
}

/* ─────── Feature cards (3-column on desktop, stack on mobile) ─────── */
.pw-features {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 20px;
  margin: 48px 0;
}
@media (max-width: 800px) {
  .pw-features { grid-template-columns: 1fr; }
}
.pw-feature-card {
  padding: 24px;
  background: var(--pw-tint);
  border: 1px solid var(--pw-line);
  border-radius: var(--pw-radius);
}
body.pw-dark .pw-feature-card {
  background: rgba(255, 255, 255, 0.035);
  border-color: rgba(255, 255, 255, 0.06);
}
/* Card titles are h2 (they are top-level page sections — h3 skipped a
   level, which axe/WCAG 1.3.1 flags), but they must not carry the h2
   display size. Heading LEVEL is document structure; heading SIZE is
   presentation, and they are allowed to disagree. */
.pw-feature-card h2 {
  margin: 0 0 8px;
  font-size: 17px;
  letter-spacing: -0.022em;
}
.pw-feature-card p {
  margin: 0;
  font-size: 14px;
  color: var(--pw-mute);
  max-width: none;
}
body.pw-dark .pw-feature-card p { color: var(--pw-mute-dark); }
.pw-feature-card .icon {
  width: 32px;
  height: 32px;
  border-radius: 8px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-size: 18px;
  background: rgba(168, 139, 250, 0.15);
  color: var(--pw-accent);
  margin-bottom: 12px;
}
body.pw-dark .pw-feature-card .icon { color: var(--pw-accent-lift); }

/* ─────── Footer nav links (right column) ─────── */
.pw-footer .footer-right {
  display: flex;
  align-items: center;
  gap: 16px;
  flex-wrap: wrap;
}
.pw-footer .footer-links {
  display: flex;
  gap: 18px;
}
.pw-footer .footer-links a {
  color: var(--pw-mute);
  font-size: 13px;
  text-decoration: none;
  transition: color 0.12s;
}
.pw-footer .footer-links a:hover { color: var(--pw-ink); }
body.pw-dark .pw-footer .footer-links a { color: var(--pw-mute-dark); }
body.pw-dark .pw-footer .footer-links a:hover { color: #fff; }

/* Footer-positioned variant of the language switcher. Same pill
   styling as the (now-removed) header switcher; smaller font + tighter
   padding so it reads as secondary UI alongside the footer links
   rather than competing with them. */
.pw-lang-switcher--footer {
  font-size: 12px;
  padding: 6px 26px 6px 12px;
  background-position: right 10px center;
}

/* ─────── Coming-soon notice block ─────── */
.pw-notice {
  margin: 24px 0;
  padding: 14px 18px;
  background: rgba(112, 73, 223, 0.08);
  border-left: 3px solid var(--pw-accent);
  border-radius: 6px;
  font-size: 14px;
  color: var(--pw-ink);
}
body.pw-dark .pw-notice {
  background: rgba(168, 139, 250, 0.08);
  border-left-color: var(--pw-accent-lift);
  color: rgba(242, 242, 247, 0.92);
}

/* ─────── "Coming soon" hero pill ─────── */
.pw-coming-soon {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--pw-accent);
  background: rgba(112, 73, 223, 0.10);
  border: 1px solid rgba(112, 73, 223, 0.28);
  padding: 6px 14px;
  border-radius: var(--pw-radius-pill);
  margin-bottom: 20px;
  text-decoration: none;
}
/* The pill is now a link to the App Store listing — keep the mint
   color (don't inherit the default link color) and add a subtle hover. */
a.pw-coming-soon { transition: background 0.12s, border-color 0.12s, transform 0.12s; }
a.pw-coming-soon:hover {
  color: var(--pw-accent);
  background: rgba(112, 73, 223, 0.18);
  border-color: rgba(112, 73, 223, 0.45);
  transform: translateY(-1px);
}
body.pw-dark a.pw-coming-soon:hover {
  color: var(--pw-accent-lift);
  background: rgba(168, 139, 250, 0.16);
  border-color: rgba(168, 139, 250, 0.45);
}
.pw-coming-soon .dot {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--pw-accent);
  animation: pw-pulse 2.2s ease-in-out infinite;
}
@keyframes pw-pulse {
  0%, 100% { opacity: 1; transform: scale(1); }
  50%      { opacity: 0.55; transform: scale(0.82); }
}
@media (prefers-reduced-motion: reduce) {
  /* Respect users who've opted out of animation. The dot is still
     visible and tinted; just no pulse. */
  .pw-coming-soon .dot { animation: none; }
}
body.pw-dark .pw-coming-soon {
  color: var(--pw-accent-lift);
  background: rgba(168, 139, 250, 0.09);
  border-color: rgba(168, 139, 250, 0.28);
}
body.pw-dark .pw-coming-soon .dot {
  background: var(--pw-accent-lift);
}

/* ─────── 404 page ───────
   Centred, generously spaced. Reuses the .tagline type ramp so it
   reads as part of the same system as the hero. The big "404" is
   decorative (aria-hidden) — the <h1> carries the real message. */
.pw-404 {
  text-align: center;
  padding: 64px 0 96px;
  max-width: 540px;
  margin: 0 auto;
}
.pw-404-code {
  font-family: var(--pw-font-mono);
  font-size: 72px;
  font-weight: 600;
  line-height: 1;
  margin: 0 0 8px;
  color: var(--pw-accent);
  letter-spacing: 0.04em;
}
body.pw-dark .pw-404-code { color: var(--pw-accent-lift); }
.pw-404 h1 { margin-top: 0; }
.pw-404 .tagline {
  font-size: 18px;
  color: var(--pw-mute);
  margin: 0 auto 28px;
}
body.pw-dark .pw-404 .tagline { color: var(--pw-mute-dark); }
.pw-404-links {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 14px;
  font-weight: 600;
  font-size: 15px;
}
.pw-404-links span { color: var(--pw-mute); }
body.pw-dark .pw-404-links span { color: var(--pw-mute-dark); }

/* ─────── Platform-conditional content ───────
   Blocks that exist in the HTML for BOTH platforms but display one at a
   time, driven by the data-pw-platform attribute boot.js sets on <html>
   before paint. Used by the how-to page, where the steps genuinely
   differ (Files vs the Android document picker, Digital Crown vs
   rotating bezel).

   Deliberately display:none rather than removal at build time: the
   other platform's instructions stay in the document for search
   engines, reader modes and print. */
html[data-pw-platform="iphone"]  .pw-plat--android,
html[data-pw-platform="android"] .pw-plat--apple {
  display: none;
}
/* No JS (or an old browser that never got the attribute): show both
   rather than nothing. A visitor reading two sets of instructions is
   mildly annoyed; a visitor reading none is stuck. */
html:not([data-pw-platform]) .pw-plat { display: block; }

/* Inline platform toggle (how-to page) sits under the lead paragraph
   rather than under a device demo, so it needs its own spacing. */
.pw-platform-tabs--inline { margin: 8px 0 28px; }

/* ─────── Numbered steps (how-to) ─────── */
.pw-steps {
  counter-reset: pw-step;
  list-style: none;
  padding-left: 0;
  max-width: var(--pw-maxwidth);
}
.pw-steps > li {
  position: relative;
  padding-left: 46px;
  margin: 0 0 22px;
  min-height: 32px;
}
.pw-steps > li::before {
  counter-increment: pw-step;
  content: counter(pw-step);
  position: absolute;
  left: 0;
  top: 0;
  width: 32px;
  height: 32px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  background: rgba(112, 73, 223, 0.10);
  color: var(--pw-accent);
  font-weight: 600;
  font-size: 15px;
  font-variant-numeric: tabular-nums;
}
body.pw-dark .pw-steps > li::before {
  background: rgba(168, 139, 250, 0.14);
  color: var(--pw-accent-lift);
}
/* Direct child only: the step BODY also contains <strong> (UI labels
   such as "Add file"), and those must stay inline. */
.pw-steps > li > strong {
  display: block;
  font-size: 17px;
  margin-bottom: 2px;
}
.pw-steps > li > span { color: var(--pw-mute); }
body.pw-dark .pw-steps > li > span { color: var(--pw-mute-dark); }

/* ─────── Privacy-policy date line ─────── */
.pw-policy-dates {
  color: var(--pw-mute);
  font-size: 15px;
  margin-top: -0.4em;
}
body.pw-dark .pw-policy-dates { color: var(--pw-mute-dark); }

/* ─────── Card grids that aren't exactly three across ───────
   The use-cases page has six cards and the support page three, so the
   grid auto-fits instead of hard-coding a column count. */
.pw-features--cases,
.pw-features--support {
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
}
.pw-card-cta {
  margin-top: 12px !important;
  font-size: 13px;
  word-break: break-word;
}

/* ─────── Store-badge ordering by platform ───────
   Both badges are always present — an Android visitor may be looking
   for the iPhone build on someone else's behalf, and hiding it would
   be a dead end. The visitor's own platform simply leads. */
html[data-pw-platform="android"] .pw-badge--play  { order: -1; }
html[data-pw-platform="iphone"]  .pw-badge--apple { order: -1; }

/* "Coming soon" badges are not links, so they must not look like one
   or claim link semantics. Muted, dashed, and cursor:default. */
.pw-badge--coming {
  cursor: default;
  border-style: dashed;
}

/* ─────── Mobile header ───────
   Four nav items plus the wordmark do not fit on a 375px screen; left
   alone they push the last link off the edge and the whole page scrolls
   sideways. Below 640px the header wraps into two rows — brand + theme
   toggle, then the nav across the full width — which is cheaper and
   more robust than a hamburger for four links. */
@media (max-width: 640px) {
  .pw-page { padding: 32px 20px 72px; }
  .pw-header { flex-wrap: wrap; row-gap: 14px; margin-bottom: 28px; }
  .pw-header .actions { order: 2; }
  .pw-nav {
    order: 3;
    width: 100%;
    margin-left: 0;
    flex-wrap: wrap;
    gap: 8px 18px;
  }
  .pw-nav a { font-size: 15px; }
  h1 { font-size: 34px; }
  h2 { font-size: 24px; }
}

/* Nothing on this site is allowed to scroll the page sideways. Wide
   content (the device row, long code) clips or scrolls inside its own
   box instead. */
body { overflow-x: clip; }

/* The current page is marked in the nav so a visitor always knows where
   they are — a plain text colour change, no underline, so it does not
   read as "this link is different". */
.pw-nav a[aria-current="page"] { color: var(--pw-ink); font-weight: 600; }
body.pw-dark .pw-nav a[aria-current="page"] { color: #fff; }

/* ─────── Highlighted nav item ───────
   Marks the one link we actively want clicked while the beta is open.
   It is a tinted pill in the accent colour with a bolt in front, so it
   reads as "this one is different" from across the header without
   shouting — and it disappears on its own when the join URLs are blanked
   in _config.yml, because the layout only adds the class while at least
   one of them is set. */
.pw-nav a.is-hot {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 4px 11px 4px 9px;
  margin: -4px 0;
  border-radius: var(--pw-radius-pill);
  color: var(--pw-accent);
  font-weight: 600;
  background: rgba(112, 73, 223, 0.10);
  background: color-mix(in srgb, var(--pw-accent) 10%, transparent);
  transition: background 0.14s, color 0.14s;
}
.pw-nav a.is-hot:hover {
  color: var(--pw-accent);
  background: rgba(112, 73, 223, 0.18);
  background: color-mix(in srgb, var(--pw-accent) 18%, transparent);
}
.pw-nav a.is-hot .bolt {
  font-size: 11px;
  line-height: 1;
  /* The glyph is decoration; the word next to it carries the meaning.
     Nudging it up a hair optically centres it against the cap height. */
  transform: translateY(-0.5px);
}
/* A slow, low-amplitude pulse. It is the only animation on the site, and
   it is on a 1em glyph rather than the text, so it draws the eye without
   making the header restless. */
@media (prefers-reduced-motion: no-preference) {
  .pw-nav a.is-hot .bolt { animation: pw-bolt 2.6s ease-in-out infinite; }
}
@keyframes pw-bolt {
  0%, 62%, 100% { opacity: 1;    transform: translateY(-0.5px) scale(1); }
  72%           { opacity: 0.55; transform: translateY(-0.5px) scale(0.88); }
  82%           { opacity: 1;    transform: translateY(-0.5px) scale(1.12); }
}
body.pw-dark .pw-nav a.is-hot {
  color: var(--pw-accent-lift);
  background: rgba(168, 139, 250, 0.14);
  background: color-mix(in srgb, var(--pw-accent-lift) 14%, transparent);
}
body.pw-dark .pw-nav a.is-hot:hover {
  color: var(--pw-accent-lift);
  background: color-mix(in srgb, var(--pw-accent-lift) 22%, transparent);
}
/* The current-page rule would otherwise win and grey the pill out. */
.pw-nav a.is-hot[aria-current="page"] { color: var(--pw-accent); }
body.pw-dark .pw-nav a.is-hot[aria-current="page"] { color: var(--pw-accent-lift); }

/* ─────── Beta-testing page ─────── */

/* The two join cards. Both are always shown — hiding the other
   platform's signup link would strand anyone helping a partner join, or
   reading on a desktop. The visitor's own platform simply leads, via
   flex `order`, the same way the store badges do. */
.pw-join-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  gap: 20px;
  margin: 28px 0 8px;
}
html[data-pw-platform="iphone"]  .pw-plat-order--apple,
html[data-pw-platform="android"] .pw-plat-order--android { order: -1; }

.pw-join {
  display: flex;
  flex-direction: column;
  padding: 24px;
  background: var(--pw-tint);
  border: 1px solid var(--pw-line);
  border-radius: var(--pw-radius);
}
body.pw-dark .pw-join {
  background: rgba(255, 255, 255, 0.035);
  border-color: rgba(255, 255, 255, 0.06);
}
.pw-join h2 { margin-top: 0; font-size: 21px; }
.pw-join p  { max-width: none; }
/* Push the button to the bottom so two cards of unequal text length
   still line their calls-to-action up. */
.pw-join-cta { margin-top: auto; padding-top: 8px; }
.pw-join-note {
  margin-top: 8px !important;
  font-size: 13px;
  color: var(--pw-mute);
}
body.pw-dark .pw-join-note { color: var(--pw-mute-dark); }

/* Compact step list for the join instructions — numbered like the
   how-to page but without the two-line title/body split. */
.pw-steps--compact > li { padding-left: 34px; margin-bottom: 12px; min-height: 24px; }
.pw-steps--compact > li::before { width: 24px; height: 24px; font-size: 13px; }

/* ─────── Primary button ─────── */
.pw-button {
  display: inline-block;
  padding: 12px 22px;
  border-radius: var(--pw-radius);
  background: var(--pw-ink);
  color: var(--pw-on-ink);
  font-weight: 600;
  font-size: 15px;
  text-decoration: none;
  transition: transform 0.12s, box-shadow 0.12s;
}
.pw-button:hover {
  color: var(--pw-on-ink);
  transform: translateY(-1px);
  box-shadow: 0 4px 16px rgba(27, 27, 31, 0.22);
}
.pw-button:focus-visible { outline: 2px solid var(--pw-accent); outline-offset: 3px; }
body.pw-dark .pw-button { background: var(--pw-accent-lift); color: var(--pw-ink); }
body.pw-dark .pw-button:hover { color: var(--pw-ink); }
/* A round that has filled up: still a chip, but plainly not a link. */
.pw-button--closed {
  background: transparent;
  color: var(--pw-mute);
  border: 1px dashed var(--pw-line);
  cursor: default;
}
body.pw-dark .pw-button--closed {
  background: transparent;
  color: var(--pw-mute-dark);
  border-color: rgba(255, 255, 255, 0.14);
}

/* The scarcity notice. Accent-tinted rather than red — places running
   out is not an error state. */
.pw-notice--limited {
  border-left: 3px solid var(--pw-accent);
  padding: 14px 18px;
  font-size: 15px;
}
body.pw-dark .pw-notice--limited { border-left-color: var(--pw-accent-lift); }

/* ─────── Home-page tester call-out ─────── */
.pw-hero .pw-coming-soon {
  /* When the pill is a link it needs the interactive affordances the
     <p> version does not have. */
  text-decoration: none;
}
a.pw-coming-soon:hover { border-color: var(--pw-accent); }
a.pw-coming-soon:focus-visible { outline: 2px solid var(--pw-accent); outline-offset: 3px; }
body.pw-dark a.pw-coming-soon:hover { border-color: var(--pw-accent-lift); }
body.pw-dark a.pw-coming-soon:focus-visible { outline-color: var(--pw-accent-lift); }

/* The full-width tester band under the feature cards. */
.pw-testers-band {
  margin: 8px 0 48px;
  padding: 28px 32px;
  border: 1px solid var(--pw-line);
  border-radius: var(--pw-radius);
  background: rgba(112, 73, 223, 0.06);
  background: color-mix(in srgb, var(--pw-accent) 6%, transparent);
  display: flex;
  align-items: center;
  gap: 28px;
  flex-wrap: wrap;
}
body.pw-dark .pw-testers-band {
  background: rgba(168, 139, 250, 0.08);
  background: color-mix(in srgb, var(--pw-accent-lift) 8%, transparent);
  border-color: rgba(255, 255, 255, 0.08);
}
.pw-testers-band .text { flex: 1 1 320px; }
.pw-testers-band h2 { margin: 0 0 6px; font-size: 22px; }
.pw-testers-band p  { margin: 0; color: var(--pw-mute); max-width: 62ch; }
body.pw-dark .pw-testers-band p { color: var(--pw-mute-dark); }

/* ─────── /get/ · the standalone store-router page ───────
   Not part of the site shell: no header, no nav, no footer. It shares
   the tokens and the badge styles so it cannot drift visually, but it
   centres a single column in the viewport instead. */
.pw-get-body {
  min-height: 100vh;
  min-height: 100dvh;
  display: grid;
  place-items: center;
}
.pw-get {
  max-width: 460px;
  padding: 40px 24px 56px;
  text-align: center;
}
.pw-get .logo {
  width: 84px;
  height: 84px;
  border-radius: 19px;
  margin-bottom: 22px;
}
.pw-get h1 {
  font-size: 30px;
  line-height: 1.15;
  margin: 0 0 10px;
}
.pw-get .sub {
  margin: 0 auto 28px;
  color: var(--pw-mute);
  font-size: 16px;
  max-width: 34ch;
}
body.pw-dark .pw-get .sub { color: var(--pw-mute-dark); }
/* Centre the badges, which are left-aligned in the page shell. */
.pw-get .pw-cta-row { justify-content: center; margin-bottom: 0; }
.pw-get-beta-row { margin: 24px 0 0; }
.pw-get .foot {
  margin: 32px auto 0;
  font-size: 13px;
  line-height: 1.9;
  color: var(--pw-mute);
}
body.pw-dark .pw-get .foot { color: var(--pw-mute-dark); }
