/* Fonts are loaded via <link> in the HTML head, not @import here.
   @import serialises: CSS must download before the font request even starts.
   The <link> version fetches both in parallel and pairs with preconnect. */

/* ===========================================================================
   MOM'S PHOTO ALBUM — /marina

   ARCHITECTURE (one grid, three blocks)
       col 1                        col 2
     ┌───────────────────────┬──────────────────────┐
 r1  │ hero copy             │                      │
     ├───────────────────────┤  the album, STICKY   │
 r2  │ story sections        │  across both rows    │
     └───────────────────────┴──────────────────────┘

   The album is the persistent object. It sits beside the hero in the first
   viewport, opens in place into the Page One spread, and stays there while
   the story scrolls past it. On phones the same three blocks stack and the
   album pins to the top of the screen instead.

   ONE canvas, everywhere. A warm off-white paper tone and nothing else - no
   scroll-driven colour, no gradients. All the personality comes from the
   physical objects placed on it: the album, the artwork, photos, handwriting.
   ========================================================================== */

:root {

  --ink:   #40342f;
  --ink-2: rgba(64,52,47,.76);
  --ink-3: rgba(64,52,47,.52);
  --rule:  rgba(64,52,47,.16);

  /* the album object — constant across the whole scroll */
  --paper:      #f6f0e2;
  --paper-edge: #d9cdb4;
  --pen:        #2b3448;
  --cloth:      #7e939f;      /* faded blue-grey album cloth */
  --cloth-hi:   #94a7b1;
  --cloth-lo:   #5d717d;
  --label:      #f3ece0;

  --page-w: clamp(214px, 22.5vw, 330px);
  --page-h: calc(var(--page-w) * 1.3478);

  /* one canvas, everywhere. Warm off-white paper - not white, not beige. */
  --canvas: #f5f1e9;

  --lift:    0 1px 2px rgba(42,32,28,.10), 0 14px 34px rgba(42,32,28,.16);
  --lift-lg: 0 2px 8px rgba(42,32,28,.16), 0 34px 74px rgba(42,32,28,.28);

  --display: 'Fraunces', Georgia, serif;
  --text: 'Schibsted Grotesk', -apple-system, BlinkMacSystemFont, sans-serif;

  --grain: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='220' height='220'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='4' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='.05'/%3E%3C/svg%3E");
}

* { box-sizing: border-box; }
html { scroll-behavior: smooth; }

body {
  margin: 0;
  background: var(--canvas);
  color: var(--ink);
  font-family: var(--text);
  font-size: 17px;
  line-height: 1.62;
  -webkit-font-smoothing: antialiased;
}

/* No page-level grain. The canvas is plain; texture lives on the physical
   objects - album boards, paper leaves, the label, photo corners. */

/* ---------------------------------------------------------------- shell -- */

.wrap { width: calc(100% - 72px); max-width: 1420px; margin: 0 auto; }

.site-head { padding: 26px 0 0; }
.site-head a { font-size: 13px; font-weight: 600; color: var(--ink-2); text-decoration: none; transition: color .2s; }
.site-head a:hover { color: var(--ink); }

/* ========================================================== THE PAGE GRID == */

.page-grid {
  display: grid;
  grid-template-columns: minmax(0, .93fr) minmax(0, 1.07fr);
  column-gap: clamp(32px, 4.4vw, 76px);
  align-items: start;
  width: calc(100% - 72px);
  max-width: 1420px;
  margin: 0 auto;
}

.g-hero  { grid-column: 1; grid-row: 1; padding: clamp(26px, 4.4vh, 54px) 0 clamp(30px, 5vh, 58px); }
.g-story { grid-column: 1; grid-row: 2; }

.g-album {
  grid-column: 2;
  grid-row: 1 / span 2;
  align-self: start;
  position: sticky;
  top: clamp(24px, calc(50vh - (var(--page-h) / 2)), 190px);
  padding-top: clamp(26px, 4.4vh, 54px);
}

/* ------------------------------------------------------------------ hero -- */
/* compact and composed — not a monumental 100vh masthead */

.g-hero h1 {
  font-family: var(--display);
  font-optical-sizing: auto;
  font-weight: 500;
  font-size: clamp(2.3rem, 4vw, 3.5rem);
  line-height: 1.0;
  letter-spacing: -0.026em;
  margin: 0 0 20px;
  max-width: 12ch;
}
.hero-intro {
  font-size: clamp(17px, 1.2vw, 19px);
  line-height: 1.55;
  color: var(--ink-2);
  margin: 0 0 14px;
  max-width: 40ch;
}
.hero-pageone {
  font-family: var(--display);
  font-weight: 500;
  font-size: clamp(19px, 1.4vw, 22px);
  margin: 0 0 26px;
}
.hero-meta { margin: 0 0 22px; }
.hero-meta dt {
  font-size: 11px; font-weight: 600; letter-spacing: .11em;
  text-transform: uppercase; color: var(--ink-3); margin: 0 0 4px;
}
.hero-meta dd { font-family: var(--display); font-weight: 500; font-size: 22px; margin: 0; letter-spacing: -0.01em; }

.hero-open {
  display: inline-flex; align-items: center; gap: 10px;
  border: 0; background: none; padding: 0 0 5px; cursor: pointer;
  font-family: var(--text); font-size: 12.5px; font-weight: 600;
  letter-spacing: .09em; text-transform: uppercase; color: var(--ink);
  border-bottom: 1px solid var(--ink);
  transition: gap .25s, opacity .2s;
}
.hero-open:hover { gap: 16px; opacity: .7; }
.hero-open span { transition: transform .25s; }
.hero-open:hover span { transform: translateY(2px); }

/* ============================================================== THE ALBUM ==
   A family photo album: cloth-covered boards, a paper label taped to the
   front, thick album leaves inside. Deliberately NOT leather + gold serif —
   that read as a Bible.

   Geometry is load-bearing: the cover's BACK FACE becomes the left page when
   it swings open, which is why the birthday note lives on .face--back.
   Everything scales from --page-w.
   ========================================================================== */

.stage { perspective: 2200px; perspective-origin: 62% 44%; display: flex; justify-content: flex-end; }

.book {
  position: relative;
  width: calc(var(--page-w) * 2);
  height: var(--page-h);
  /* The spine is fixed. Closed, the album occupies the right half of this box
     and the cover hides the right page; opening swings the cover left off the
     spine and the album grows leftward, exactly like a real book on a table.
     Nothing here slides or scales — that read as a UI panel, not a book. */
  transform-style: preserve-3d;
}

.page {
  position: absolute; top: 0;
  width: var(--page-w); height: var(--page-h);
  background: var(--paper);
  background-image: var(--grain);
  padding: calc(var(--page-w) * .105) calc(var(--page-w) * .1);
  overflow: hidden;
}
.page--left  { display: none; left: 0; border-radius: 2px 1px 1px 2px;
  box-shadow: inset -24px 0 34px -26px rgba(42,32,28,.42), var(--lift); }
.page--right { left: var(--page-w); border-radius: 1px 2px 2px 1px;
  box-shadow: inset 24px 0 34px -26px rgba(42,32,28,.42), var(--lift); }

.cover {
  position: absolute; top: 0; left: var(--page-w);
  width: var(--page-w); height: var(--page-h);
  transform-origin: left center; transform-style: preserve-3d;
  transition: transform 1.15s cubic-bezier(.22,.75,.2,1);
  cursor: pointer; border: 0; padding: 0; background: none; z-index: 3;
  transform: translateZ(1px);
}
.book.is-open .cover { transform: translateZ(1px) rotateY(-180deg); z-index: 2; }

/* the spine. Without this the open album reads as two separate boards
   sitting next to each other instead of one bound object. */
.binding {
  position: absolute; top: 0; bottom: 0;
  left: calc(var(--page-w) - (var(--page-w) * .028));
  width: calc(var(--page-w) * .056);
  z-index: 1;
  opacity: 0;
  transition: opacity .3s ease .5s;
  background:
    linear-gradient(90deg,
      rgba(42,32,28,.30) 0%,
      rgba(42,32,28,.16) 22%,
      rgba(42,32,28,.05) 44%,
      rgba(255,255,255,.16) 50%,
      rgba(42,32,28,.05) 56%,
      rgba(42,32,28,.16) 78%,
      rgba(42,32,28,.30) 100%);
}
.binding::after {                 /* stitching down the gutter */
  content: ''; position: absolute; left: 50%; top: 7%; bottom: 7%;
  width: 1px; transform: translateX(-50%);
  background: repeating-linear-gradient(180deg,
    rgba(42,32,28,.34) 0 6px, transparent 6px 15px);
}
.book.is-open .binding { opacity: 1; }

.face { position: absolute; inset: 0; backface-visibility: hidden; -webkit-backface-visibility: hidden; overflow: hidden; }

/* cloth-covered board */
.face--front {
  border-radius: 3px 5px 5px 3px;
  background:
    repeating-linear-gradient(90deg, rgba(255,255,255,.016) 0 2px, rgba(0,0,0,.011) 2px 4px),
    repeating-linear-gradient(0deg,  rgba(255,255,255,.014) 0 2px, rgba(0,0,0,.012) 2px 4px),
    linear-gradient(158deg, var(--cloth-hi) 0%, var(--cloth) 52%, var(--cloth-lo) 100%);
  box-shadow:
    inset 0 0 0 1px rgba(255,255,255,.10),
    inset 0 -18px 30px -22px rgba(0,0,0,.5),
    var(--lift-lg);
  display: flex; align-items: center; justify-content: center;
}
.face--front::after {                    /* cloth grain */
  content: ''; position: absolute; inset: 0;
  background-image: var(--grain); mix-blend-mode: overlay; opacity: 1;
}
.face--front::before {                   /* bound spine along the hinge */
  content: ''; position: absolute; top: 0; bottom: 0; left: 0;
  width: calc(var(--page-w) * .085);
  background: linear-gradient(90deg, rgba(0,0,0,.26) 0%, rgba(0,0,0,.10) 55%, rgba(0,0,0,0) 100%);
  border-right: 1px solid rgba(0,0,0,.10);
}

/* the paper label stuck on the front */
.cover-label {
  position: relative;
  width: 66%;
  background: var(--label);
  background-image: var(--grain);
  padding: calc(var(--page-w) * .07) calc(var(--page-w) * .05) calc(var(--page-w) * .078);
  text-align: center;
  transform: rotate(-1.1deg);
  box-shadow: 0 1px 2px rgba(0,0,0,.22), 0 8px 18px rgba(0,0,0,.16);
}
.cover-title {
  display: block;
  font-family: 'Caveat', cursive;
  font-weight: 600;
  font-size: calc(var(--page-w) * .105);
  line-height: 1.12;
  color: var(--pen);
  margin: 0;
}
.cover-open {
  position: absolute; left: 0; right: 0; bottom: calc(var(--page-w) * .075);
  font-family: var(--text);
  font-size: calc(var(--page-w) * .026);
  font-weight: 600; letter-spacing: .2em; text-transform: uppercase;
  color: rgba(255,255,255,.5); transition: color .3s;
}
.cover:hover .cover-open { color: rgba(255,255,255,.85); }

.face--back {
  transform: rotateY(180deg);
  background: var(--paper); background-image: var(--grain);
  border-radius: 2px 1px 1px 2px;
  box-shadow: inset -24px 0 34px -26px rgba(42,32,28,.42);
  padding: calc(var(--page-w) * .11) calc(var(--page-w) * .105);
  overflow: hidden; text-align: left;
}

/* --------------------------------------------------- inside the album -- */

.entry-date {
  font-family: 'Caveat', cursive; font-size: calc(var(--page-w) * .046);
  color: var(--pen); opacity: .72; margin: 0 0 calc(var(--page-w) * .038);
  transform: rotate(-.8deg);
}
.salutation {
  font-family: 'Caveat', cursive; font-size: calc(var(--page-w) * .093);
  line-height: 1.05; color: var(--pen); margin: 0 0 calc(var(--page-w) * .042);
  transform: rotate(-1.3deg);
}
.note { font-family: 'Caveat', cursive; font-size: calc(var(--page-w) * .051); line-height: 1.48; color: var(--pen); margin: 0; }
.note p { margin: 0 0 calc(var(--page-w) * .028); }
.note p:last-child { margin-bottom: 0; }
.note-sign { font-family: 'Caveat', cursive; font-size: calc(var(--page-w) * .066); color: var(--pen); margin: calc(var(--page-w) * .052) 0 0; transform: rotate(-1.8deg); }

.artwork-mount { height: 100%; display: flex; align-items: center; justify-content: center; }
.artwork-frame { position: relative; width: 100%; transform: rotate(-1.1deg); }
.artwork-frame img { display: block; width: 100%; height: auto; box-shadow: 0 1px 2px rgba(42,32,28,.2), 0 12px 26px rgba(42,32,28,.18); }
.artwork-frame::before, .artwork-frame::after, .corner-b::before, .corner-b::after {
  content: ''; position: absolute;
  width: calc(var(--page-w) * .062); height: calc(var(--page-w) * .062);
  background: linear-gradient(135deg, rgba(60,52,44,.86), rgba(38,32,27,.92));
  box-shadow: 0 1px 2px rgba(42,32,28,.3);
}
.artwork-frame::before { top: -5px; left: -5px;  clip-path: polygon(0 0, 100% 0, 0 100%); }
.artwork-frame::after  { top: -5px; right: -5px; clip-path: polygon(0 0, 100% 0, 100% 100%); }
.corner-b::before { bottom: -5px; left: -5px;  clip-path: polygon(0 0, 0 100%, 100% 100%); }
.corner-b::after  { bottom: -5px; right: -5px; clip-path: polygon(100% 0, 100% 100%, 0 100%); }
.corner-b { position: absolute; inset: 0; pointer-events: none; }

/* ======================================================= STORY SECTIONS ====
   COPY UNCHANGED. Type and spacing only — no cards, no boxes.
   ========================================================================== */

.chapter { padding: 0 0 clamp(52px, 8vh, 92px); }
.chapter-label { font-size: 11px; font-weight: 600; letter-spacing: .13em; text-transform: uppercase; color: var(--ink-3); margin: 0 0 14px; }
.chapter h2 {
  font-family: var(--display); font-optical-sizing: auto; font-weight: 500;
  font-size: clamp(1.55rem, 2.1vw, 2.05rem); line-height: 1.16;
  letter-spacing: -0.02em; margin: 0 0 18px;
}
.chapter h2 em { font-style: italic; }
.chapter p { font-size: 17px; line-height: 1.66; color: var(--ink-2); margin: 0 0 15px; max-width: 52ch; }
.chapter p:last-child { margin-bottom: 0; }
.chapter strong { color: var(--ink); font-weight: 600; }

.goal-math { margin: 24px 0 0; padding: 0 0 0 20px; border-left: 2px solid rgba(64,52,47,.3); max-width: 52ch; }
.goal-math p { font-size: 17.5px; margin: 0; color: var(--ink); }

/* ---------------------------------------------------------------- signup -- */

.signup { padding: 0 0 20px; }
.card { background: rgba(255,255,255,.36); border: 1px solid var(--rule); border-radius: 5px; padding: 30px 30px 26px; backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px); }
.card h2 { font-family: var(--display); font-weight: 500; font-size: 23px; line-height: 1.2; letter-spacing: -0.018em; margin: 0 0 10px; }
.card .lede { margin: 0 0 20px; color: var(--ink-2); font-size: 16px; }
.card .count { margin: 0 0 14px; font-size: 12.5px; font-weight: 600; color: var(--ink-3); }
.card .count:empty { display: none; }

.choice { display: flex; gap: 8px; margin: 0 0 16px; }
.choice button { flex: 1; font-family: inherit; font-size: 13px; font-weight: 600; color: var(--ink-2); background: rgba(255,255,255,.5); border: 1px solid var(--rule); border-radius: 3px; padding: 11px 10px; cursor: pointer; transition: background .18s, border-color .18s, color .18s; }
.choice button:hover { border-color: var(--ink-3); }
.choice button[aria-pressed="true"] { background: var(--ink); border-color: var(--ink); color: var(--label); }

.field { margin: 0 0 14px; }
.field label { display: block; font-size: 12px; font-weight: 600; color: var(--ink-2); margin: 0 0 6px; }
.field input[type=text], .field input[type=email], .field input[type=tel] { width: 100%; font-family: inherit; font-size: 16px; color: var(--ink); background: rgba(255,255,255,.7); border: 1px solid var(--rule); border-radius: 3px; padding: 11px 13px; transition: border-color .18s, box-shadow .18s; }
.field input:focus { outline: none; border-color: var(--ink); box-shadow: 0 0 0 3px rgba(64,52,47,.1); }

.consent { display: flex; gap: 11px; align-items: flex-start; margin: 15px 0 4px; padding: 13px 14px; background: rgba(255,255,255,.36); border-radius: 3px; }
.consent input[type=checkbox] { margin: 2px 0 0; width: 16px; height: 16px; accent-color: var(--ink); flex: 0 0 auto; }
.consent label { font-size: 12px; line-height: 1.55; color: var(--ink-2); margin: 0; }
.consent a, .fineprint a { color: var(--ink-2); }

.btn { display: inline-block; width: 100%; font-family: inherit; font-size: 14px; font-weight: 600; color: var(--label); background: var(--ink); border: 0; border-radius: 3px; padding: 14px 24px; margin-top: 14px; cursor: pointer; text-align: center; text-decoration: none; transition: background .2s, transform .1s; }
.btn:hover { background: #55453e; }
.btn:active { transform: translateY(1px); }
.fineprint { font-size: 11.5px; line-height: 1.55; color: var(--ink-3); margin: 12px 0 0; }
.hidden-field { display: none !important; }

.release-actions { display: none; }
body.is-released .release-actions { display: block; }
body.is-released .presave-form { display: none; }
.btn--itunes { background: #b56b66; color: #fff; font-size: 15px; padding: 16px 24px; }
.btn--secondary { background: transparent; color: var(--ink); border: 1px solid var(--rule); margin-top: 8px; }

.site-foot { padding: 34px 0 64px; color: var(--ink-3); font-size: 12.5px; }
.site-foot a { color: var(--ink-2); text-decoration: none; }

/* the story column carries its own measure */
.g-story .wrap { width: 100%; max-width: none; margin: 0; padding: 0; }
.g-story .col, .g-story .inner { max-width: none; }


/* ================================================================ MOBILE === */

@media (max-width: 900px) {
  /* Phones keep the SAME book as desktop - a horizontal two-page spread in
     3-D. It is never stacked into a vertical centerfold. Sizing and the
     frozen header live at the end of this file, after the last global
     --page-w, because that global was quietly overriding this block. */
  .wrap, .page-grid { width: calc(100% - 28px); }
  .page-grid { grid-template-columns: minmax(0, 1fr); column-gap: 0; }

  .chapter { padding-bottom: clamp(40px, 6vh, 64px); }
  .chapter h2 { font-size: 1.5rem; }
  .card { padding: 22px 18px 20px; }
  .site-foot { padding: 26px 0 54px; }
}

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  .book, .cover, .page--right, body { transition: none !important; }
}

/* the submit button must visibly change state - an unstyled disabled button
   looks identical and people tap it again thinking nothing happened */
.btn:disabled { opacity: .55; cursor: default; }

/* ===========================================================================
   LAYOUT PASS — right column is a single stack: title, album, signup.
   Left column carries the whole story. The album sits at the TOP of its
   column rather than floating in the vertical middle.
   =========================================================================== */

.g-album {
  align-self: start;
  padding-top: clamp(18px, 2.6vh, 34px);
  top: clamp(16px, 2.6vh, 34px);       /* stick near the top, not centred */
}

.album-title {
  font-family: var(--display);
  font-optical-sizing: auto;
  font-weight: 500;
  font-size: clamp(1.5rem, 2.1vw, 2rem);
  line-height: 1.05;
  letter-spacing: -0.02em;
  color: var(--ink);
  margin: 0 0 clamp(14px, 2vh, 22px);
  text-align: center;
}

/* the album shrinks so title + album + form fit one screen together */
:root { --page-w: clamp(190px, 17.5vw, 258px); }

.g-album .stage { padding: 0; }

  background: rgba(255,255,255,.32);
  border: 1px solid var(--rule);
  border-radius: 4px;
  padding: 20px 20px 18px;
  backdrop-filter: none; -webkit-backdrop-filter: none;
}
.g-album .card h2 { font-size: 18px; margin: 0 0 6px; letter-spacing: -0.012em; }
.g-album .card .lede { font-size: 14px; line-height: 1.5; margin: 0 0 14px; }
.g-album .card .count { font-size: 11.5px; margin: 0 0 12px; }
.g-album .choice { gap: 6px; margin: 0 0 12px; }
.g-album .choice button { font-size: 12px; padding: 9px 8px; }
.g-album .field { margin: 0 0 11px; }
.g-album .field label { font-size: 11px; margin: 0 0 4px; }
.g-album .field input { font-size: 15px; padding: 9px 11px; }
.g-album .consent { margin: 12px 0 2px; padding: 11px 12px; }
.g-album .consent label { font-size: 10.5px; line-height: 1.5; }
.g-album .btn { font-size: 13px; padding: 12px 20px; margin-top: 11px; }
.g-album .fineprint { font-size: 10.5px; margin: 10px 0 0; }

/* left column keeps the hero copy and the whole story */
.g-hero { padding-top: clamp(18px, 2.6vh, 34px); }
.g-hero .hero-intro { font-size: clamp(18px, 1.4vw, 21px); max-width: 34ch; }

@media (max-width: 900px) {
  :root { --page-w: min(320px, 78vw); }
  .g-album { padding-top: 8px; top: 0; }
  .album-title { font-size: 1.5rem; margin-bottom: 12px; }
  .g-album .card { padding: 18px 16px 16px; }
}

/* The album must share a centre axis with the title above it and the signup
   card below it. The book box is two pages wide, so the closed cover (the
   right half) is offset half a page; shift it back so BOTH the closed cover
   and the open spread sit centred in the column. */
.stage { justify-content: center; }
.book { transform: translateX(calc(var(--page-w) / -2)); }
.book.is-open { transform: translateX(0); }

/* The right column is sticky, so the whole stack - title, album, signup - has
   to fit one viewport or its bottom becomes unreachable. Sized to land under
   880px at a 900px viewport. */
:root { --page-w: clamp(180px, 15.5vw, 222px); }


/* --------------------------------------------------------------- share ---- */
.choice-label { font-size: 12px; font-weight: 600; color: var(--ink-2); margin: 0 0 8px; }
.share-block { margin-top: 16px; padding-top: 14px; border-top: 1px solid var(--rule); }
.share-lede { font-size: 12.5px; line-height: 1.5; color: var(--ink-2); margin: 0 0 10px; }
.share-actions { display: flex; gap: 8px; }
.btn--share { width: auto; flex: 1; margin: 0; font-size: 12px; padding: 10px 12px; }

/* Sticky is OFF for now. With the real copy the right column is ~1,490px —
   far taller than a viewport — and a sticky element taller than the screen
   makes its own bottom unreachable, which would have hidden the submit button
   and the share block. It scrolls normally until the visual pass decides what
   that column actually holds. */
.g-album { position: static; }

/* .sr-only lives in styles.css, which this page deliberately does not load.
   Without it the "hidden" labels rendered above the inputs AND as placeholders. */
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0;}

/* ===========================================================================
   SIGNUP — no container. This is a section of the page, not a widget dropped
   onto it. No border, no fill, no rounded rectangle, no card padding. It sits
   directly on the page background and reads with the same editorial rhythm as
   the sections in the left column.
   =========================================================================== */

.signup { padding: clamp(26px, 4vh, 44px) 0 0; }

.card,
.g-album .card {
  background: none;
  border: 0;
  border-radius: 0;
  padding: 0;
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
}

/* heading and copy match the story sections */
.card h2,
.g-album .card h2 {
  font-family: var(--display);
  font-optical-sizing: auto;
  font-weight: 500;
  font-size: clamp(1.55rem, 2.1vw, 2.05rem);
  line-height: 1.16;
  letter-spacing: -0.02em;
  color: var(--ink);
  margin: 0 0 18px;
}
.card .lede,
.g-album .card .lede {
  font-size: 17px;
  line-height: 1.66;
  color: var(--ink-2);
  margin: 0 0 15px;
  max-width: 52ch;
}
.card .count,
.g-album .card .count {
  font-size: 12px; font-weight: 600; letter-spacing: .04em;
  color: var(--ink-3); margin: 20px 0 18px;
}

.choice-label { font-size: 13px; font-weight: 600; color: var(--ink); margin: 0 0 9px; }

/* the controls stay controls */
.choice { gap: 8px; margin: 0 0 14px; max-width: 420px; }
.choice button { font-size: 13px; padding: 11px 10px; }
.field { margin: 0 0 12px; max-width: 420px; }
.field input[type=text], .field input[type=email], .field input[type=tel] {
  font-size: 16px; padding: 11px 13px;
}

/* consent: no panel either - a checkbox and its small print, inline */
.consent,
.g-album .consent {
  background: none;
  border: 0;
  border-radius: 0;
  padding: 0;
  margin: 16px 0 0;
  max-width: 52ch;
}
.consent label { font-size: 12px; line-height: 1.6; color: var(--ink-3); }

.btn, .g-album .btn { width: auto; min-width: 260px; margin-top: 18px; padding: 14px 26px; }

/* "Already in?" - separated by a thin rule and space, not another box */
.share-block {
  margin-top: clamp(26px, 4vh, 40px);
  padding-top: clamp(16px, 2.4vh, 22px);
  border-top: 1px solid var(--rule);
  max-width: 52ch;
}
.share-lede { font-size: 15px; line-height: 1.6; color: var(--ink-2); margin: 0 0 14px; }
.share-actions { display: flex; gap: 10px; max-width: 420px; }
.btn--share { flex: 1; min-width: 0; margin: 0; font-size: 13px; padding: 11px 14px; }

@media (max-width: 900px) {
  .choice, .field, .share-actions { max-width: none; }
  .btn, .g-album .btn { width: 100%; min-width: 0; }
}

/* ===========================================================================
   SIGNUP, LIGHTER — one choice, one field, one action.
   Radio-style options rather than tab buttons; a tally rather than a sentence;
   share as text actions rather than a second row of CTAs.
   =========================================================================== */

/* the tally */
.card .count,
.g-album .card .count {
  font-family: var(--display);
  font-optical-sizing: auto;
  font-weight: 500;
  font-size: clamp(1.5rem, 2.2vw, 1.95rem);
  letter-spacing: -0.02em;
  color: var(--ink-3);
  margin: 22px 0 20px;
}
.card .count strong { font-weight: 500; color: var(--ink); }

.choice-label { font-size: 15px; font-weight: 400; color: var(--ink-2); margin: 0 0 11px; }

/* selectable options, not buttons */
.choice, .g-album .choice {
  display: flex; gap: 26px; margin: 0 0 18px; max-width: none;
}
.choice button, .g-album .choice button {
  flex: 0 0 auto;
  display: inline-flex; align-items: center; gap: 9px;
  background: none; border: 0; border-radius: 0; padding: 0;
  font-family: inherit; font-size: 16px; font-weight: 400;
  color: var(--ink-3); cursor: pointer;
  transition: color .18s;
}
.choice button::before {
  content: ''; flex: 0 0 auto;
  width: 15px; height: 15px; border-radius: 50%;
  border: 1.5px solid var(--ink-3); box-sizing: border-box;
  transition: border-color .18s, box-shadow .18s;
}
.choice button:hover { color: var(--ink-2); }
.choice button[aria-pressed="true"],
.g-album .choice button[aria-pressed="true"] {
  background: none; color: var(--ink); font-weight: 500;
}
.choice button[aria-pressed="true"]::before {
  border-color: var(--ink);
  box-shadow: inset 0 0 0 3.5px var(--ink);
}

/* one field */
.field, .g-album .field { margin: 0 0 14px; max-width: 380px; }

/* consent, visually quiet */
.consent, .g-album .consent { margin: 14px 0 0; max-width: 50ch; gap: 10px; }
.consent label { font-size: 11.5px; line-height: 1.6; color: var(--ink-3); }

.btn, .g-album .btn {
  width: auto; min-width: 0; margin-top: 20px; padding: 13px 26px; font-size: 13px;
}

/* share: text actions */
.share-block { margin-top: clamp(24px, 3.6vh, 36px); padding-top: clamp(15px, 2.2vh, 20px); }
.share-lede { font-size: 14.5px; line-height: 1.6; color: var(--ink-2); margin: 0 0 10px; }
.share-actions { display: flex; gap: 22px; margin: 0; max-width: none; }
.share-link {
  background: none; border: 0; padding: 0 0 2px;
  font-family: inherit; font-size: 14px; font-weight: 600;
  color: var(--ink); cursor: pointer;
  border-bottom: 1px solid var(--rule);
  transition: border-color .2s;
}
.share-link:hover { border-color: var(--ink); }

@media (max-width: 900px) {
  .field, .g-album .field { max-width: none; }
  .btn, .g-album .btn { width: 100%; }
  .choice { gap: 20px; }
}

/* This is what actually hides the inactive channel's field. It was lost in a
   rewrite and nothing caught it, because the tests were asserting on the
   class name rather than on computed display. Assert on the effect. */
.field.is-hidden,
.consent.is-hidden,
.g-album .field.is-hidden,
.g-album .consent.is-hidden { display: none !important; }

/* ===========================================================================
   LAYOUT: fixed right column, scrolling story.
   Right column = title, album, hero copy - one block that stays put.
   Left column = the whole story, ending with the signup.
   =========================================================================== */

.page-grid { align-items: start; }

.g-album {
  grid-column: 2;
  grid-row: 1;
  position: sticky;
  top: clamp(14px, 2vh, 26px);
  align-self: start;
  padding-top: clamp(14px, 2vh, 26px);
  text-align: center;
}

.g-story { grid-column: 1; grid-row: 1; }

/* title sits near the very top */
.album-title {
  font-size: clamp(1.5rem, 2.2vw, 2.05rem);
  margin: 0 0 clamp(12px, 1.8vh, 20px);
}

/* the album, ~35% larger - the note and the photograph have to be readable */
:root { --page-w: clamp(240px, 21vw, 300px); }

/* hero copy now sits beneath the album, on the same centre axis */
.g-hero { padding: clamp(16px, 2.4vh, 28px) 0 0; text-align: center; }
.g-hero .hero-intro {
  font-size: clamp(16px, 1.15vw, 18px);
  max-width: 40ch; margin: 0 auto 12px;
}
.g-hero .hero-pageone { font-size: clamp(17px, 1.25vw, 19px); margin: 0 0 18px; }
.g-hero .hero-meta { margin: 0 0 16px; }
.g-hero .hero-meta dt { font-size: 10.5px; }
.g-hero .hero-meta dd { font-size: 19px; }

/* the story column, including the signup at its end */
.g-story .signup { padding-top: clamp(34px, 5vh, 56px); }

@media (max-width: 900px) {
  :root { --page-w: min(330px, 82vw); }
  .page-grid { grid-template-columns: minmax(0, 1fr); }
  .g-album { grid-column: 1; grid-row: 1; position: static; padding-top: 10px; }
  .g-story { grid-column: 1; grid-row: 2; }
}

/* ===========================================================================
   TITLE TO THE TOP, BIGGER BOOK
   With the intro copy gone from under the album, the only things in the fixed
   column are the title, the book, and the open prompt - so the book takes the
   room that frees up. Width is the real constraint: the open spread is two
   pages wide and has to fit the column.
   =========================================================================== */

.site-head { padding: 14px 0 0; }
.page-grid { grid-template-columns: minmax(0, .88fr) minmax(0, 1.12fr); }

.g-album { top: 10px; padding-top: 10px; }
.album-title { margin: 0 0 clamp(10px, 1.4vh, 16px); }

/* ~15% larger again */
:root { --page-w: clamp(255px, 24.5vw, 348px); }

/* below the book: only the prompt, arrow pointing up at it */
.g-hero { padding: clamp(14px, 2vh, 22px) 0 0; }
.hero-open { border-bottom-color: var(--rule); }
.hero-open:hover { border-bottom-color: var(--ink); }

/* right page: caption at the top, photograph sitting low */
.artwork-mount {
  height: 100%;
  display: flex;
  flex-direction: column;
  align-items: center;
  padding-bottom: calc(var(--page-w) * .02);
}
.page-caption {
  font-family: 'Caveat', cursive;
  color: var(--pen);
  text-align: center;
  margin: 0 0 auto;
  line-height: 1.25;
}
.page-caption span { display: block; }
.page-caption__no {
  font-size: calc(var(--page-w) * .052);
  opacity: .68;
}
.page-caption__song {
  font-size: calc(var(--page-w) * .082);
  margin-top: calc(var(--page-w) * .012);
}
.page-caption__date {
  font-size: calc(var(--page-w) * .046);
  opacity: .68;
  margin-top: calc(var(--page-w) * .006);
}
.artwork-frame { margin-top: auto; }

@media (max-width: 900px) {
  .page-grid { grid-template-columns: minmax(0, 1fr); }
}

/* caption above the photograph, the pair centred together - no need to shove
   the picture down, there is room as it stands */
.artwork-mount {
  justify-content: center;
  gap: calc(var(--page-w) * .045);
  padding-bottom: 0;
}
.page-caption { margin: 0; }
.artwork-frame { margin-top: 0; }

/* The wordmark was a full-width 42px band pushing the whole grid - and the
   title with it - down, despite only occupying the left side. Take it out of
   the flow so the right column can start at the very top; the story column
   pads down to clear it instead. */
.site-head {
  position: absolute;
  top: 0; left: 0; right: 0;
  padding: 16px 0 0;
  z-index: 5;
}
.g-album { top: 4px; padding-top: 4px; }
.g-story { padding-top: 46px; }

/* title eased down off the very top */
.g-album { top: 24px; padding-top: 24px; }

/* right page: song top-left, page number top-right on one line, and the
   photograph centred in the space beneath them */
.page-caption {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  width: 100%;
  flex: 0 0 auto;
  margin: 0;
  text-align: left;
}
.page-caption span { display: inline; }
.page-caption__song {
  font-size: calc(var(--page-w) * .075);
  opacity: 1;
  margin: 0;
}
.page-caption__no {
  font-size: calc(var(--page-w) * .05);
  opacity: .62;
  margin: 0;
  white-space: nowrap;
}
.artwork-mount { justify-content: flex-start; gap: 0; align-items: stretch; }
.artwork-frame { margin: auto 0; align-self: center; }

/* title lands at 25px flat - the sticky offset alone, no padding stacked on
   top of it (that was what turned 24 into 48) */
.g-album { top: 25px; padding-top: 0; }

/* the book and the open prompt were crowding each other; there is room */
.g-hero { padding: clamp(30px, 4.4vh, 52px) 0 0; }

/* The right COLUMN is what has the room - 583px of content in a 900px
   viewport. Title stays pinned at 25px; the book and the prompt get the
   headroom instead of huddling together. */
.album-title { margin: 0 0 clamp(26px, 4.4vh, 46px); }
.g-hero { padding: clamp(42px, 6.8vh, 70px) 0 0; }

/* ================================================== PREVIEW ON THE LEAF ====
   A play button under the photograph. Deliberately not a media player: no
   scrubber, no volume, no duration. It sits square while the photograph is
   tilted, so it reads as a page element rather than something taped on.
=========================================================================== */
.preview {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: calc(var(--page-w) * .036);
  margin: calc(var(--page-w) * .05) 0 0;
  flex: 0 0 auto;
}
.preview-btn {
  flex: 0 0 auto;
  width: calc(var(--page-w) * .088);
  height: calc(var(--page-w) * .088);
  display: grid; place-items: center;
  padding: 0; cursor: pointer;
  border: 1px solid rgba(43, 52, 72, .38);
  border-radius: 50%;
  background: transparent;
  color: var(--pen);
  transition: background-color .18s ease, border-color .18s ease, transform .18s ease;
}
.preview-btn:hover { border-color: var(--pen); background: rgba(43, 52, 72, .07); }
.preview-btn:active { transform: scale(.94); }
.preview-btn:focus-visible { outline: 2px solid var(--pen); outline-offset: 3px; }

.preview-ico { width: 58%; height: 58%; fill: currentColor; display: block; }
/* the icon IS the state - play by default, two bars while it is playing */
.preview-ico .ico-pause { display: none; }
.preview-btn.is-playing .ico-play { display: none; }
.preview-btn.is-playing .ico-pause { display: inline; }
.preview-btn.is-loading { opacity: .55; }

.preview-label {
  display: flex; align-items: baseline;
  gap: calc(var(--page-w) * .026);
  color: var(--pen); line-height: 1.1;
}
.preview-song {
  font-family: 'Caveat', cursive;
  font-size: calc(var(--page-w) * .058);
}
.preview-tag {
  font-family: var(--text), system-ui, sans-serif;
  font-size: calc(var(--page-w) * .029);
  letter-spacing: .1em;
  text-transform: uppercase;
  opacity: .55;
}

@media (prefers-reduced-motion: reduce) {
  .preview-btn { transition: none; }
}

/* --page-w bottoms out at 255px on a phone, which made the button 22px - half
   a usable tap target. Touch pointers get a real one; mice keep the small,
   quieter circle. */
@media (pointer: coarse) {
  .preview-btn { width: 42px; height: 42px; }
  .preview-ico { width: 52%; height: 52%; }
  .preview-song { font-size: max(1rem, calc(var(--page-w) * .058)); }
  .preview-tag { font-size: max(.6rem, calc(var(--page-w) * .029)); }
}

/* ============================================ MOBILE: FROZEN ALBUM HEADER ==
   Frozen panes. The wordmark, the title, the book and "open the album" are
   one fixed band at the top of the screen. Only the story scrolls, and it
   scrolls underneath them.

   This block is last on purpose: a later global :root rule was overriding
   the earlier mobile --page-w, which is what forced the book to 255px and
   made it stack.
   ========================================================================== */
@media (max-width: 900px) {

  /* Two leaves side by side inside the viewport. The height cap matters more
     than the width one - the band is fixed, so a tall book would leave no
     screen to read the story on. */
  :root { --page-w: min(calc(50vw - 18px), 21vh); }

  /* No wordmark on phones. The note is signed and the Polaroid carries the
     signature - a third printing of the name was just taking up the band. */
  .site-head { display: none; }

  .g-album {
    position: fixed;
    top: 0; left: 0; right: 0;
    z-index: 30;
    margin: 0;
    padding: 36px 14px 12px;
    background: var(--canvas);
    /* a soft edge so the story visibly passes beneath the band rather than
       colliding with it - that overlap was the bug in the first screenshot */
    box-shadow: 0 12px 16px -12px rgba(42, 32, 28, .28);
  }

  .album-title { font-size: 1.32rem; margin: 0 0 10px; }
  .g-album .stage { padding: 0; }
  .g-hero { padding: 12px 0 0; }
  .hero-open { font-size: 11.5px; }

  /* Clears the band. marina.js measures the real height and writes
     --album-head, because the band resizes with the viewport. */
  .g-story { padding-top: var(--album-head, 330px); }
}

/* A landscape phone is 375px tall. Freezing the album there costs 60% of the
   screen and squeezes the book to 79px - worse than not freezing at all. So
   below 560px of height the band goes back into the flow and scrolls, and
   the book is sized off the width instead. Portrait is unaffected. */
@media (max-width: 900px) and (max-height: 559px) {
  :root { --page-w: min(calc(50vw - 18px), 300px); }
  .g-album {
    position: static;
    box-shadow: none;
    padding: 30px 14px 14px;
  }
  .g-story { padding-top: 0; }
}

/* ---------------------------------------------------------------------------
   The caption belongs in the page's actual corners. The leaf's padding was
   holding it a full 17px in on each side, which read as floating rather than
   printed at the top of the page - and pushed "Page One" out against the
   edge. Pull it back out, and lift it above the cover's stacking context so
   nothing can sit over it mid-flip.
   --------------------------------------------------------------------------- */
.page-caption {
  position: relative;
  z-index: 4;
  margin: calc(var(--page-w) * -.042) calc(var(--page-w) * -.038)
          calc(var(--page-w) * .012);
}

/* =================================== MOBILE: RECLAIM THE TOP OF THE BAND ===
   "Colton Lane" was holding 36px at the very top of a fixed band that is
   already expensive. Move it to the bottom-left of the band, on the same
   line as the open prompt, and give the reclaimed height to the book.
   ========================================================================== */
@media (max-width: 900px) and (min-height: 560px) {

  /* the book is width-bound on a phone, so the real gain is horizontal:
     trim the outer margin to 9px a side and let the height cap follow */
  :root { --page-w: min(calc(50vw - 9px), 26vh); }

  .g-album { padding: 9px 6px 12px; }
  .album-title { font-size: 1.32rem; margin: 0 0 9px; }
  .g-hero { padding: 11px 0 0; }
}

/* ================================================== READ THE PAGE (ZOOM) ===
   The page of writing fills the screen: the same paper, the same hand, at a
   size you can actually read. Not the picture lifted out into a viewer -
   the leaf itself, enlarged.
   ========================================================================== */

/* only the arrow nudges on hover, not the label beside it */
.hero-open span { transition: none; }
.hero-open:hover .hero-open__arrow { transform: translateY(2px); }
.hero-open__arrow { transition: transform .25s; display: inline-block; }

/* the invitation, printed at the foot of the leaf. Absolute, so it costs the
   page no height and never pushes the note around. */
.read-hint {
  position: absolute;
  left: calc(var(--page-w) * .1); right: calc(var(--page-w) * .1);
  bottom: calc(var(--page-w) * .055);
  margin: 0;
  text-align: center;
  font-family: var(--text), system-ui, sans-serif;
  font-size: calc(var(--page-w) * .042);
  letter-spacing: .08em; text-transform: uppercase;
  color: var(--pen); opacity: .72;
  pointer-events: none;
}
.read-hint::after { content: 'Click to zoom'; }
@media (pointer: coarse) { .read-hint::after { content: 'Tap to zoom'; } }

.face--back { cursor: zoom-in; }

body.has-zoom { overflow: hidden; }

.page-zoom {
  position: fixed; inset: 0; z-index: 200;
  display: flex; align-items: stretch; justify-content: center;
  background: rgba(38, 32, 27, .72);
  opacity: 0; transition: opacity .2s ease;
}
.page-zoom.is-open { opacity: 1; }

.page-zoom-sheet {
  width: min(760px, 100%);
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  background: var(--paper);
  background-image: var(--grain);
  box-shadow: 0 0 60px rgba(0, 0, 0, .35);
  padding: clamp(30px, 7vw, 64px) clamp(24px, 6.5vw, 60px)
           calc(clamp(30px, 7vw, 64px) + env(safe-area-inset-bottom));
  transform: translateY(10px);
  transition: transform .22s cubic-bezier(.22,.75,.2,1);
}
.page-zoom.is-open .page-zoom-sheet { transform: translateY(0); }

/* type sized to be read, not to fit a 178px leaf */
.page-zoom-sheet .entry-date  { font-size: clamp(17px, 4.4vw, 21px); margin-bottom: 14px; }
.page-zoom-sheet .salutation  { font-size: clamp(30px, 8.6vw, 44px); margin-bottom: 20px; }
.page-zoom-sheet .note        { font-size: clamp(20px, 5.2vw, 26px); line-height: 1.62; }
.page-zoom-sheet .note p      { margin-bottom: 16px; }
.page-zoom-sheet .note-sign   { font-size: clamp(24px, 6.4vw, 32px); margin-top: 26px; }
.page-zoom-scan { display: block; width: 100%; height: auto; }

.page-zoom-close {
  position: absolute;
  top: max(12px, env(safe-area-inset-top)); right: 12px;
  width: 44px; height: 44px; line-height: 1;
  font-size: 28px; color: var(--ink);
  background: rgba(247, 241, 228, .92);
  border: 0; border-radius: 50%; cursor: pointer;
  box-shadow: 0 2px 10px rgba(0, 0, 0, .25);
  z-index: 2;
}
.page-zoom-close:focus-visible { outline: 2px solid var(--ink); outline-offset: 3px; }

@media (prefers-reduced-motion: reduce) {
  .page-zoom, .page-zoom-sheet { transition: none; }
}

/* Both leaves open, so both leaves say so. The artwork page sits lower than
   the note page because the preview control is beneath the photograph. */
.read-hint--right { bottom: calc(var(--page-w) * .028); }
.page--right { cursor: zoom-in; }
.page--right .preview-btn { cursor: pointer; }

/* the artwork leaf, enlarged: the photograph at full sheet width with the
   caption and the preview control that belong to that page */
.page-zoom-sheet.is-artwork { display: flex; flex-direction: column; justify-content: center; }
.page-zoom-sheet .artwork-mount { height: auto; display: block; }
.page-zoom-sheet .page-caption {
  margin: 0 0 clamp(14px, 3.6vw, 22px);
  z-index: auto;
}
.page-zoom-sheet .page-caption__song { font-size: clamp(24px, 6.4vw, 32px); }
.page-zoom-sheet .page-caption__no   { font-size: clamp(15px, 3.9vw, 19px); }
.page-zoom-sheet .artwork-frame { margin: 0; width: 100%; }
.page-zoom-sheet .artwork-frame::before,
.page-zoom-sheet .artwork-frame::after,
.page-zoom-sheet .corner-b::before,
.page-zoom-sheet .corner-b::after { width: clamp(22px, 6vw, 34px); height: clamp(22px, 6vw, 34px); }
.page-zoom-sheet .preview {
  margin: clamp(22px, 5.5vw, 34px) 0 0;
  gap: clamp(10px, 2.6vw, 16px);
}
.page-zoom-sheet .preview-btn { width: clamp(46px, 12vw, 58px); height: clamp(46px, 12vw, 58px); }
.page-zoom-sheet .preview-song { font-size: clamp(22px, 5.6vw, 28px); }
.page-zoom-sheet .preview-tag  { font-size: clamp(11px, 2.9vw, 13px); }
/* the invitation is for the small leaf; inside the sheet you are already there */
.page-zoom-sheet .read-hint { display: none; }

/* The hint is absolute, so the leaf has to hold a line open for it - otherwise
   it lands beside "- Colton" instead of beneath it. Same distance up from the
   foot on both leaves. */
.read-hint, .read-hint--right { bottom: calc(var(--page-w) * .042); }
.note-sign { margin-bottom: calc(var(--page-w) * .075); }
.artwork-mount { padding-bottom: calc(var(--page-w) * .055); }

/* The song is already printed in the top corner of this page; saying it again
   beside the button was the third time on one leaf. Two stacked words next to
   the circle instead. */
.preview-label { flex-direction: column; align-items: flex-start; gap: 0; }
.preview-tag {
  font-size: calc(var(--page-w) * .046);
  letter-spacing: .11em;
  line-height: 1.24;
  opacity: .72;
}
.page-zoom-sheet .preview-tag { font-size: clamp(13px, 3.4vw, 16px); }

/* A running head belongs at the very top of the leaf with air under it, not
   resting on the photograph. Pull it further into the corners and open a real
   gap before the picture - the negative top margin means this costs the
   photograph almost nothing. */
.page-caption {
  margin: calc(var(--page-w) * -.062) calc(var(--page-w) * -.042)
          calc(var(--page-w) * .052);
}

/* width:100% plus a negative left margin pushed the caption's RIGHT edge 7.5px
   back inside the page, so "Page One" sat 25px off the corner while "Marina
   Del Rey" sat 10px off. Auto width lets the negative margins pull both edges
   out evenly. */
.page-caption { width: auto; }

/* the photograph grew into the space the hint was using, and the preview row
   landed on top of it. Hold the foot of the leaf open. */
.artwork-mount { padding-bottom: calc(var(--page-w) * .105); }

/* .page-zoom sets display:flex, which outranks the browser's [hidden]
   { display:none }. So `el.hidden = true` faded the overlay to opacity 0 but
   left it lying over the whole page at z-index 200, eating every click on the
   book underneath. It has to be told to go away explicitly. */
.page-zoom[hidden] { display: none; }

/* The arithmetic on the artwork leaf is tight: the photograph is square and
   fills the content width, so it eats 0.8 of the page width in HEIGHT too,
   leaving only ~0.34 for the caption, the play row and the hint - about 6px
   short. Trim the leaf's top/bottom margin to find it, rather than shrinking
   the photograph he asked to make bigger. */
.page { padding: calc(var(--page-w) * .078) calc(var(--page-w) * .1); }
.artwork-mount { padding-bottom: calc(var(--page-w) * .088); }
.read-hint, .read-hint--right { bottom: calc(var(--page-w) * .028); }

/* Trimming the leaf's padding moved the caption with it - down to 3px off the
   page edge. Give the negative margin back and take the difference out of the
   gap below, so the caption sits ~8px in from the top corner and the play row
   still clears the hint. */
.page-caption {
  margin: calc(var(--page-w) * -.034) calc(var(--page-w) * -.042)
          calc(var(--page-w) * .034);
}
.artwork-mount { padding-bottom: calc(var(--page-w) * .078); }

/* The hint goes to the bottom-right corner of each leaf, out of the way of the
   signature on one page and the play row on the other. */
.read-hint, .read-hint--right {
  left: auto;
  right: calc(var(--page-w) * .058);
  bottom: calc(var(--page-w) * .03);
  text-align: right;
}
/* it no longer sits under the note, so the signoff needs no reserved line */
.note-sign { margin-bottom: 0; }

/* the tap-target bump had it at 42px, which on a 178px leaf is enormous */
@media (pointer: coarse) {
  .preview-btn { width: 30px; height: 30px; }
  .preview-ico { width: 56%; height: 56%; }
}
.artwork-mount { padding-bottom: calc(var(--page-w) * .05); }

/* ============================== MOBILE: THE TITLE SCROLLS, THE BOOK PINS ===
   The band was fixed, so the title held ~50px at the top of the screen
   forever. Now the whole thing scrolls normally until the book reaches the
   address bar, and pins from there. The title is only paid for once.

   position:sticky with a NEGATIVE top does exactly this: the element rides up
   until its own top sits at -(title height), which puts the book at the top of
   the screen, then stops. --album-lift is that height, measured in marina.js.

   It also needs .page-grid to stop being a grid here - a grid item's sticky
   range is its own row, which on a stacked phone layout is the element itself,
   so it would never travel.
   ========================================================================== */
@media (max-width: 900px) and (min-height: 560px) {
  .page-grid { display: block; }

  .g-album {
    position: sticky;
    top: calc(9px - var(--album-lift, 52px));
    left: auto; right: auto;
    z-index: 30;
    background: var(--canvas);
    /* full-bleed: the grid is inset 14px a side, and the story must not show
       past the band's background at the screen edges as it scrolls under */
    margin-inline: calc(50% - 50vw);
    padding: 9px calc(50vw - 50% + 6px) 12px;
    box-shadow: none;
    transition: box-shadow .2s ease;
  }
  .g-album.is-stuck {
    box-shadow: 0 12px 16px -12px rgba(42, 32, 28, .28);
  }

  /* the band is in the flow now, so the story needs no manual offset */
  .g-story { padding-top: 0; }
}

/* Once the album is open it stays open - there is nothing to go back to. The
   prompt disappears rather than turning into a close button, and the pinned
   band ends where its arrow used to start. */
body.album-open .g-hero { display: none; }



/* ========================================================== THE DEPTH FIELD
   Her actual belongings, lying on the surface the page sits on.

   Depth here is SPATIAL, not atmospheric. It comes from scale, placement,
   how much of a thing runs off the edge, and what overlaps what. Nothing in
   this block changes an object's colour, saturation or opacity. A photograph
   still looks like a photograph; the bear still looks like the bear.

   The one exception is a half-pixel of softness on the two furthest things -
   a real lens does that, and it is well under the threshold of looking
   "faded".
   ========================================================================== */

.chapter { position: relative; }

/* THE OVERFLOW LOCK.
   Every object lives inside this box and it is CLIPPED. An object may run off
   the side of the screen and it still cannot add a single pixel to the
   document's width - the clip happens before layout ever sees it. The
   negative side insets cancel the page gutter (72px total on desktop, 28px on
   phones) so the clip edge lands exactly on the edge of the SCREEN rather
   than the edge of the text column.

   overflow-x: clip, not hidden: `hidden` would make this a scroll container
   AND force the vertical axis to auto, which would slice objects horizontally
   at every section boundary. `clip` leaves the vertical axis alone. */
.depth {
  position: absolute;
  top: 0;
  bottom: 0;
  left: -36px;
  right: -18px;
  overflow-x: clip;
  overflow-y: visible;
  pointer-events: none;
  z-index: 0;
}
.obj {
  position: absolute;
  display: block;
  height: auto;
}

/* Shadows only - the contact between an object and the surface it rests on.
   Farther things sit in more diffuse light and their shadow spreads; near
   things have a tight dark edge underneath. That is the whole treatment. */
.obj--far  { filter: drop-shadow(0 12px 15px rgba(58, 44, 34, .22)); }
.obj--mid  { filter: drop-shadow(0 9px 12px rgba(58, 44, 34, .24)); }
.obj--near { filter: drop-shadow(0 2px 3px rgba(58, 44, 34, .22))
                     drop-shadow(0 11px 15px rgba(58, 44, 34, .20)); }

/* The readable layer. There is NO scrim any more - a panel of paper colour
   over the column is exactly what put a film across her photographs. The
   content simply sits above the objects, and legibility is handled at the
   glyph instead: see the halo below. */
.chapter .wrap { position: relative; z-index: 2; }
.chapter .col { position: relative; }

/* ---- scale is the depth cue -------------------------------------------
   Read as pixels-per-real-centimetre, which is what actually encodes
   distance. The bear is 35cm and renders at 190px; the glasses are 16cm and
   render at 150px. The bear is physically twice the size and appears smaller,
   so it reads as roughly twice as far away. Everything is far smaller than
   the last pass: these are details under the page, not a backdrop.

     bear     35cm -> 190px   =  5.4 px/cm   furthest
     grad     20cm -> 132px   =  6.6
     print    15cm -> 130px   =  8.7
     glasses  16cm -> 150px   =  9.4
     note     21cm -> 240px   = 11.4         closest
   -------------------------------------------------------------------- */
.obj--bear    { width: 190px; left: -64px;  top: 26px;    transform: rotate(-7deg); }
.obj--walk    { width: 130px; right: 18px;  top: 286px;   transform: rotate(4deg); }
.obj--grad    { width: 132px; left: -30px;  top: 214px;   transform: rotate(-6deg); }
.obj--glasses { width: 150px; right: 30px;  bottom: 22px; transform: rotate(9deg); }
.obj--hand    { width: 240px; left: 148px;  bottom: 4px;  transform: rotate(-2.5deg); }

@media (max-width: 900px) {
  /* the phone gutter is 14px a side, so the clip lands on the screen edge */
  .depth { left: -14px; right: -14px; }

  /* both edges are usable here. Sizes hold their ratios, scaled down. */
  .obj--bear    { width: 158px; left: auto; right: -52px; top: 8px;     transform: rotate(-8deg); }
  .obj--walk    { width: 112px; left: -34px; right: auto; top: 300px;   transform: rotate(5deg); }
  .obj--grad    { width: 112px; left: auto; right: -28px; top: 236px;   transform: rotate(-7deg); }
  .obj--glasses { width: 128px; left: -22px; right: auto; bottom: 26px; transform: rotate(10deg); }
  .obj--hand    { width: 208px; left: auto; right: -16px; bottom: 8px;  transform: rotate(-3deg); }

}

/* body copy down ~6% (17px -> 16px), measure held at 52ch */
.chapter p { font-size: 16px; }

/* If a browser is too old for overflow-x: clip, fall back to hidden. That
   slices objects at each section boundary, which is uglier - but a page that
   scrolls sideways on a phone is not negotiable. */
@supports not (overflow-x: clip) {
  .depth { overflow: hidden; }
}

@media (max-width: 900px) {
  /* the note was running off the right edge and cutting her sentence in half.
     Everything else can crop; this one stays whole. */
  .obj--hand { width: 226px; left: 104px; right: auto; bottom: 34px; }
  /* let a little more of the print clear the edge */
  .obj--walk { width: 122px; left: -20px; }
}

/* Text over her things stays readable by carrying a soft halo of the paper's
   own colour around each GLYPH - not a rectangle over the picture. On plain
   paper it is the same colour as the background and therefore invisible; over
   a photograph it clears just enough room for the letterform and leaves the
   image untouched between the lines. This is what replaces the scrim. */
.chapter .chapter-label,
.chapter h2,
.chapter p,
.chapter .goal-math {
  text-shadow:
    0 0 4px var(--canvas),
    0 0 9px var(--canvas),
    0 0 16px var(--canvas);
}

/* Her note moves down into the open run under the last paragraph and over to
   the right, where nothing is competing with it. */
.obj--hand { width: 262px; left: auto; right: 12px; bottom: 6px; transform: rotate(-2.5deg); }

@media (max-width: 900px) {
  .obj--hand { width: 214px; left: auto; right: 6px; bottom: 4px; transform: rotate(-3deg); }
}

/* The clear run under the last paragraph is only ~120px and the note was
   173px tall, so it is scaled down and dropped so it occupies that gap on the
   open right-hand side, grazing only the short closing lines. */
.obj--hand { width: 236px; right: 14px; bottom: -46px; }
@media (max-width: 900px) {
  .obj--hand { width: 196px; right: 6px; bottom: -52px; }
}

/* Sized to the actual clear band between the last line of copy and "Help me
   find the 1,000" - measured at 120px, so the note is 150px wide (114 tall)
   and sits inside it with a few pixels top and bottom. NOTE: this offset is
   tied to the current length of that closing paragraph; if the copy there
   changes, this needs re-measuring. */
@media (max-width: 900px) {
  .obj--hand { width: 150px; right: 12px; bottom: -53px; }
}

/* desktop band is 148px, so 176px wide (134 tall) drops the note fully inside
   it there too */
@media (min-width: 901px) {
  .obj--hand { width: 176px; right: 20px; bottom: -49px; }
}

/* ======================================================= PLACEMENT PASS ====
   Refinements only. The depth system, the real colours, the shadows and the
   overflow lock are all unchanged.
   ========================================================================== */

/* air between the pinned album and the first line of the story */
@media (max-width: 900px) and (min-height: 560px) {
  .g-story { padding-top: 26px; }
}

/* Room for her handwriting. The clear band before the CTA was 120px and her
   note needs more than that to actually be readable, so the band is opened
   up. This is deliberate whitespace, not an object pushing text. */


@media (min-width: 901px) {
  /* bear: farther right, lower, only a shoulder and an arm in frame */
  .obj--bear    { width: 210px; left: auto; right: -128px; top: 96px; transform: rotate(-8deg); }
  /* the print runs off the LEFT edge - which keeps the date stamp, since the
     stamp is printed down its right-hand side */
  .obj--walk    { width: 236px; left: -158px; right: auto; top: 210px; transform: rotate(5deg); }
  /* tucked under the right edge of the page, her face in the open */
  .obj--grad    { width: 168px; left: auto; right: -62px; top: 96px; transform: rotate(-7deg); }
  /* down into the clear run before Page One's Goal, out from under the copy */
  .obj--glasses { width: 152px; left: -34px; right: auto; bottom: -28px; transform: rotate(11deg); }
  /* off to the right, in clear space, big enough to read */
  .obj--hand    { width: 300px; left: auto; right: -34px; bottom: 26px; transform: rotate(-3deg); }
}

@media (max-width: 900px) {
  .obj--bear    { width: 176px; left: auto; right: -104px; top: 104px;  transform: rotate(-9deg); }
  .obj--walk    { width: 200px; left: -136px; right: auto; top: 232px;  transform: rotate(6deg); }
  .obj--grad    { width: 150px; left: auto; right: -54px;  top: 118px;  transform: rotate(-8deg); }
  .obj--glasses { width: 132px; left: -26px; right: auto;  bottom: -34px; transform: rotate(12deg); }
  .obj--hand    { width: 250px; left: auto; right: -22px;  bottom: 18px;  transform: rotate(-3deg); }
}

/* Two objects must have no body copy across them: her glasses and her
   handwriting. Give those two sections a real clear band at the foot instead
   of trying to thread the objects between lines of text. Counting is by
   <section>, and .signup is the 5th - so the scholarship is 3 and Page One's
   Goal is 4. */
/* (the clear bands that used to be here are gone - they gave the glasses and
   the note a stage of their own, which made them read as inserted pictures
   instead of things lying under the page) */

@media (min-width: 901px) {
  /* her face clears the paragraph and sits beside the short heading lines */
  .obj--grad    { top: 34px; right: -66px; width: 176px; }
  .obj--bear    { right: -136px; top: 150px; }
  .obj--walk    { left: -168px; }
  .obj--glasses { width: 160px; left: -40px; bottom: 22px; }
  .obj--hand    { width: 320px; right: -40px; bottom: 16px; }
}

@media (max-width: 900px) {
  .obj--grad    { top: 34px; right: -58px; width: 156px; }
  .obj--bear    { right: -118px; top: 150px; }
  .obj--walk    { left: -150px; }
  .obj--glasses { width: 138px; left: -30px; bottom: 18px; }
  .obj--hand    { width: 254px; right: -26px; bottom: 12px; }
}

/* her handwriting was losing the word "your" off the right edge - it stays
   right-aligned, but whole */
@media (min-width: 901px) { .obj--hand { right: 8px; } }
@media (max-width: 900px) { .obj--hand { right: 6px; width: 246px; } }

/* The print is bigger but pushed further left, so the same ~30% shows and the
   1000px source puts more resolution into the strip that IS visible - which
   is the strip carrying the date stamp. Their faces sit at 35-70% across the
   print, so they stay off-screen and no copy runs over them. */
@media (min-width: 901px) { .obj--walk { width: 292px; left: -204px; } }
@media (max-width: 900px) { .obj--walk { width: 250px; left: -172px; } }

/* ================================================ PLACEMENT PASS 2 =========
   No manufactured space. Everything tucks into gaps the layout already has:
   the run between two sections, and the ragged right-hand end of a short
   closing line. Objects crop on the screen edge instead of floating in a
   clearing.
   ========================================================================== */

@media (min-width: 901px) {
  /* Bear: down into the run between "What it is" and "Why I made it", turned
     so his head, chest and raised arm come in on the diagonal - waving in
     from the edge rather than standing behind the copy. */
  .obj--bear {
    width: 300px; left: auto; right: -118px;
    top: auto; bottom: -78px;
    transform: rotate(-34deg);
  }
  /* Print: much smaller, and dropped to the foot of the section so the copy
     above it is clear of it. Still running off the left with the date stamp
     on the visible side. */
  .obj--walk {
    width: 168px; left: -96px; right: auto;
    top: auto; bottom: -34px;
    transform: rotate(7deg);
  }
  /* Glasses: half off the left edge, sitting across the section boundary. */
  .obj--glasses {
    width: 138px; left: -62px; right: auto;
    bottom: -46px; transform: rotate(13deg);
  }
  /* The note fills the ragged corner past the short last line, and crops on
     the right edge instead of being centred in a clearing. */
  .obj--hand {
    width: 268px; left: auto; right: -46px;
    bottom: -20px; transform: rotate(-4deg);
  }
}

@media (max-width: 900px) {
  .obj--bear {
    width: 252px; left: auto; right: -96px;
    top: auto; bottom: -66px;
    transform: rotate(-34deg);
  }
  .obj--walk {
    width: 142px; left: -80px; right: auto;
    top: auto; bottom: -28px;
    transform: rotate(8deg);
  }
  .obj--glasses {
    width: 124px; left: -54px; right: auto;
    bottom: -40px; transform: rotate(14deg);
  }
  .obj--hand {
    width: 232px; left: auto; right: -38px;
    bottom: -16px; transform: rotate(-4deg);
  }
}

/* The section labels centre up. They are short, so this opens clear space on
   BOTH sides of them - which is where objects can now sit without any copy
   over them. The h2 headlines under them stay left-aligned; they run nearly
   full measure, so centring those would not free any space. */
.chapter .chapter-label { text-align: center; }

/* centred labels get a rule under them, sized to the words rather than the
   column - display:table shrink-wraps the <p> so the underline is the width
   of the text itself */
.chapter .chapter-label {
  display: table;
  margin: 0 auto 14px;
  text-align: center;
  border-bottom: 1px solid var(--rule);
  padding-bottom: 7px;
}

/* Rotating the bear inflated his bounding box from 252px to 414px and dropped
   him straight across the copy. Much smaller, and pulled back to the edge so
   the head and the raised arm are what come in, over the run between the two
   sections rather than over the paragraphs. */
@media (min-width: 901px) {
  .obj--bear { width: 172px; right: -62px; bottom: -18px; transform: rotate(-38deg); }
}
@media (max-width: 900px) {
  .obj--bear { width: 148px; right: -48px; bottom: -14px; transform: rotate(-38deg); }
}

/* Final tuck. The note goes back into the gap the layout already has (120px
   on a phone, 148px on desktop) rather than a gap I built for it, sized to
   fit and cropped on the right so it reads as tucked under the page. The
   print shrinks again and drops to straddle the section boundary. */
@media (min-width: 901px) {
  .obj--walk { width: 140px; left: -78px; bottom: -66px; }
  .obj--grad { top: 6px; }
  .obj--hand { width: 208px; right: -30px; bottom: -74px; }
}
@media (max-width: 900px) {
  .obj--walk { width: 118px; left: -66px; bottom: -60px; }
  .obj--grad { top: 8px; }
  .obj--hand { width: 176px; right: -24px; bottom: -68px; }
}

/* the bear's rotated box was reaching 20px into the album's column; the story
   column paints above the album, so nothing may cross that line */
@media (min-width: 901px) { .obj--bear { width: 156px; right: -44px; } }

/* ============================================ PLACEMENT PASS 3 (measured) ==
   Sized against the actual anchors on a 375px screen:
     bear   - centred on the 64px run between "…add another." and "WHY I MADE IT"
     walk   - inside the 141px band from the bottom of "college." to the top of
              "She", and left of where "The" begins (x=41)
     grad   - inside the 72px band from the bottom of "MEMORIAL" to the top of
              "instead of"
   The vertical band is the binding constraint on both photographs, which is
   what forces them this small.
   ========================================================================== */
@media (max-width: 900px) {
  .obj--bear {
    width: 124px; left: auto; right: 8px;
    top: auto; bottom: -59px;
    transform: rotate(-22deg);
  }
  .obj--walk {
    width: 70px; left: -41px; right: auto;
    top: auto; bottom: -61px;
    transform: rotate(6deg);
  }
  .obj--grad {
    width: 56px; left: auto; right: 6px;
    top: 34px; bottom: auto;
    transform: rotate(6deg);
  }
}

@media (min-width: 901px) {
  .obj--bear { width: 138px; right: 22px; bottom: -56px; transform: rotate(-22deg); }
  .obj--walk { width: 82px;  left: -44px; bottom: -66px; transform: rotate(6deg); }
  .obj--grad { width: 68px;  right: 14px; top: 30px;     transform: rotate(6deg); }
}

/* measured: the print was overlapping "The" by 5px and the portrait was only
   1px clear of "instead of" */
@media (max-width: 900px) {
  .obj--walk { left: -50px; }
  .obj--grad { top: 28px; }
}

/* ============================================ PLACEMENT PASS 4 (measured) ==
   Measured every rendered line of text on a 375px screen. Key numbers:
     "Marina" bottom 706 -> "for" top 821          = 115px band
     "college." bottom 1719 -> "She" top 1860      = 141px band
     label line 1 ends x345, line 2 x118-257, and its rule runs the FULL
     column width; h2 line 1 ends x302, line 2 x211.
   So the corridor right of x~305 is clear all the way down past the h2 -
   that is where the portrait goes, cropping off the right edge.
   ========================================================================== */
@media (max-width: 900px) {

  /* Bear: sits in the 115px band between "Marina" and "for", to the right of
     the centred "WHY I MADE IT" (which ends at x261). Whole bear, no crop,
     touching nothing. 115px of height is what caps it at 74px wide. */
  .obj--bear {
    width: 74px; left: auto; right: 27px;
    top: auto; bottom: -45px;
    transform: rotate(-4deg);
  }

  /* Portrait: down the clear right-hand corridor rather than squeezed between
     two wrapped lines - nearly twice the size it was, cropping off the right
     edge, and clear of every word. */
  .obj--grad {
    width: 100px; left: auto; right: -35px;
    top: 30px; bottom: auto;
    transform: rotate(5deg);
  }

  /* Print: rotated to the right as asked and scooted in, so ~99px of it shows
     instead of 35px. Only its top and bottom edges pass under a line of text
     - the people in it are clear. */
  .obj--walk {
    width: 90px; left: -20px; right: auto;
    top: auto; bottom: -85px;
    transform: rotate(12deg);
  }

  /* the quote was losing "your" off the right edge again */
  .obj--hand { right: 6px; }
}

/* ============================================ PLACEMENT PASS 5 (measured) ==
   The only slot near "her name" that clears every word is the 71px full-width
   run between "college." (ends y1719) and "THE LESLIE MORMAN" (starts y1790).
   A portrait-format print cannot be both tall enough to see and under 71px -
   so it lies at a steep angle, the way a print actually sits in a box. That
   turns 71px of height into 83px of width across, all of it clear.
   ========================================================================== */
@media (max-width: 900px) {
  .obj--walk {
    width: 43px; left: 40px; right: auto;
    top: auto; bottom: -4px;
    transform: rotate(62deg);
  }

  /* Bear comes out of the right edge: head, left arm and left leg in frame,
     the rest of him off-screen. */
  .obj--bear {
    width: 112px; left: auto; right: -31px;
    top: auto; bottom: -36px;
    transform: rotate(-6deg);
  }
}

/* print was 1px into "The"; lift it clear */
@media (max-width: 900px) { .obj--walk { bottom: -1px; } }

/* Bear dropped so it clears the paragraph above entirely. It cannot also
   clear the headline below: the run between "Marina" and "for" is 115px and a
   bear big enough to crop at the edge is ~156px. This is the smallest contact
   available - the tail of the headline, at its right end. */
@media (max-width: 900px) {
  .obj--bear { width: 100px; right: -23px; bottom: -85px; transform: rotate(-6deg); }
}

/* the band is 71px and the tilted print was exactly 71px, so either end
   grazed. A hair smaller buys clearance at both. */
@media (max-width: 900px) { .obj--walk { width: 40px; bottom: -3px; } }

/* ================================================ GIVE THE PAGE MARGINS ====
   The root cause of every fight over placement: the story column ran the full
   width of the page, so a background object had nowhere to be except under a
   paragraph or in the thin run between two sections.

   Pulling the measure in gives the objects a gutter to live in on both sides.
   It also shortens the line - 347px at 16px was a wide measure for a phone;
   262px is about 36 characters, which reads better anyway.
   ========================================================================== */
.chapter .col { max-width: 430px; margin-inline: auto; }

@media (max-width: 900px) {
  .chapter .col { max-width: 262px; }
}

/* ====================================== PLACEMENT, WITH MARGINS TO USE =====
   Now that the copy runs 57..319 on a phone (and 91..521 on desktop), the
   objects live in the gutters and crop off the screen edge. They are no
   longer squeezed into the runs between sections, so they can be a real size
   again and the vertical position is free.
   ========================================================================== */
@media (min-width: 901px) {
  .obj--bear    { width: 168px; left: auto; right: -18px; top: auto; bottom: -60px; transform: rotate(-9deg); }
  .obj--walk    { width: 156px; left: -62px; right: auto; top: auto; bottom: -40px; transform: rotate(8deg); }
  .obj--grad    { width: 150px; left: auto; right: -26px; top: 54px;  bottom: auto; transform: rotate(-7deg); }
  .obj--glasses { width: 146px; left: -44px; right: auto; top: auto;  bottom: 30px; transform: rotate(12deg); }
  .obj--hand    { width: 268px; left: auto; right: 14px;  top: auto;  bottom: -58px; transform: rotate(-3deg); }
}

@media (max-width: 900px) {
  /* bear: right gutter, half of him off the edge */
  .obj--bear    { width: 132px; left: auto; right: -34px; top: auto; bottom: -74px; transform: rotate(-9deg); }
  /* the print: left gutter, big enough to see the three of you, running off
     the left edge with the date stamp on the visible side */
  .obj--walk    { width: 138px; left: -58px; right: auto; top: auto; bottom: -30px; transform: rotate(9deg); }
  /* her portrait: right gutter of the scholarship section */
  .obj--grad    { width: 128px; left: auto; right: -30px; top: 48px; bottom: auto; transform: rotate(-8deg); }
  /* glasses: left gutter, low in the section */
  .obj--glasses { width: 126px; left: -38px; right: auto; top: auto; bottom: 18px; transform: rotate(13deg); }
  /* her note: across the run before the CTA, kept whole */
  .obj--hand    { width: 228px; left: auto; right: 6px;   top: auto; bottom: -54px; transform: rotate(-3deg); }
}

/* pulled further into the gutters so what little overlap remains falls on the
   ragged ends of lines rather than across words */
@media (min-width: 901px) {
  .obj--bear    { right: -52px; }
  .obj--walk    { left: -92px; }
  .obj--grad    { right: -58px; }
  .obj--glasses { left: -76px; }
  .obj--hand    { bottom: -104px; }
}
@media (max-width: 900px) {
  .obj--bear    { right: -64px; }
  .obj--walk    { left: -84px; }
  .obj--grad    { right: -58px; }
  .obj--glasses { left: -68px; }
  .obj--hand    { bottom: -108px; }
}

/* the note overshot into the CTA copy */
@media (min-width: 901px) { .obj--hand { bottom: -30px; } }
@media (max-width: 900px) { .obj--hand { bottom: -34px; } }

/* The note is the one object meant to be READ, so it stays big. It sits in
   the 120px run before the CTA and rides up over the short closing line
   ("September 14.") where the right-hand side of that row is empty. */
@media (min-width: 901px) { .obj--hand { width: 250px; right: 16px; bottom: -44px; } }
@media (max-width: 900px) { .obj--hand { width: 200px; right: 10px; bottom: -48px; } }

/* One exception to "no manufactured space": her handwriting. It is the only
   object on the page that is meant to be READ, and it needs 160px where the
   run before the CTA gives 120px. Unlike the earlier version of this, the
   note sits over to the right rather than centred in a clearing, so it reads
   as tucked into the corner rather than staged. */
.g-story > section.chapter:nth-of-type(4) { padding-bottom: 118px; }
@media (min-width: 901px) {
  .g-story > section.chapter:nth-of-type(4) { padding-bottom: 132px; }
}

/* desktop: the note is 207px tall against a 188px run, so it comes down a
   little; and the bear pulls further into the gutter */
@media (min-width: 901px) {
  .obj--hand { width: 226px; bottom: -60px; }
  .obj--bear { right: -96px; }
}

/* ============================================== MOBILE PLACEMENT, PASS 6 ===
   Measured on 375px. Gap between "send kids to college." (ends y2095) and the
   scholarship title (starts y2159) is 64px; "PAGE ONE'S GOAL" is centred at
   x102-273, leaving the left of that row open.
   ========================================================================== */
@media (max-width: 900px) {

  /* print at two thirds - smaller, so a much larger share of it clears the
     edge - and dropped so it centres on the run above the scholarship title
     instead of sitting halfway up the paragraph */
  .obj--walk { width: 92px; left: -22px; bottom: -82px; transform: rotate(9deg); }

  /* her portrait eased left */
  .obj--grad { right: -38px; }

  /* glasses moved down beside "PAGE ONE'S GOAL", coming in from the left and
     clear of the label, which starts at x102 */
  .obj--glasses { width: 126px; left: -50px; bottom: -73px; transform: rotate(13deg); }

  /* The note at two thirds. It no longer needs a widened run to fit, so that
     extra padding comes back off - which is what was making it read as its
     own section. */
  .g-story > section.chapter:nth-of-type(4) { padding-bottom: clamp(40px, 6vh, 64px); }
  .obj--hand { width: 139px; right: 10px; bottom: -30px; transform: rotate(-3deg); }
}

/* trims: the portrait went a touch too far left, and the glasses were
   reaching into the goal headline */
@media (max-width: 900px) {
  .obj--grad    { right: -46px; }
  .obj--glasses { left: -58px; }
}

/* The measure went a little too tight. Widened back out - 292px is ~36
   characters on a phone rather than 32 - and the objects step out with it so
   they keep the same relationship to the edge of the text. */
.chapter .col { max-width: 462px; }
@media (max-width: 900px) { .chapter .col { max-width: 292px; } }

@media (min-width: 901px) {
  .obj--bear    { right: -112px; }
  .obj--walk    { left: -108px; }
  .obj--grad    { right: -74px; }
  .obj--glasses { left: -92px; }
  .obj--hand    { right: 12px; }
}
@media (max-width: 900px) {
  .obj--bear    { right: -78px; }
  .obj--walk    { left: -36px; }
  .obj--grad    { right: -60px; }
  .obj--glasses { left: -72px; }
  .obj--hand    { right: 6px; }
}

/* evening them out: the bear had stepped further out than it needed, the
   portrait not quite far enough */
@media (max-width: 900px) {
  .obj--bear { right: -60px; }
  .obj--grad { right: -68px; }
}

/* ---- mobile pass 7 ------------------------------------------------------ */
@media (max-width: 900px) {
  /* print at half - nearly all of it now clears the edge */
  .obj--walk    { width: 46px; left: -4px; bottom: -40px; }
  /* portrait a third smaller and further left, so her face is in frame */
  .obj--grad    { width: 85px; right: -14px; }
  /* glasses further right */
  .obj--glasses { left: -46px; }
  /* the note drops into the clear run under it */
  .obj--hand    { bottom: -62px; }
}

/* trims: glasses had come too far in, and the note overshot into the CTA */
@media (max-width: 900px) {
  .obj--glasses { left: -60px; }
  .obj--hand    { bottom: -53px; }
}

/* the note was flush against the CTA heading; 3px of air at both ends */
@media (max-width: 900px) { .obj--hand { bottom: -50px; } }

/* wider again - 310px is ~38 characters on a phone - and the print up 35% */
.chapter .col { max-width: 486px; }
@media (max-width: 900px) {
  .chapter .col { max-width: 310px; }
  .obj--walk    { width: 62px; left: -8px; }
  .obj--bear    { right: -69px; }
  .obj--grad    { right: -23px; }
  .obj--glasses { left: -69px; }
}

/* the narrower gutter pushed the bear too far over the headline; the portrait
   had room to come back in */
@media (max-width: 900px) {
  .obj--bear { right: -84px; }
  .obj--grad { right: -14px; }
}

/* ---- mobile pass 8 ------------------------------------------------------
   The "Last year, we were able to give three graduating seniors..." paragraph
   runs y2242-2322 with lines ending at x302, x275 and x214 - so its right
   side is open. That is where the portrait goes.
   ------------------------------------------------------------------------ */
@media (max-width: 900px) {
  .obj--bear    { right: -46px; }
  .obj--walk    { width: 68px; bottom: -62px; }
  .obj--grad    { top: 296px; right: -12px; }
  .obj--glasses { left: -48px; }
  .obj--hand    { bottom: -80px; }
}

/* middle ground: at a 33px gutter, visible width = 33 + however far the
   object reaches over the text, so 62% visible cost 64px of overlap. These
   sit at roughly 45px over, which keeps them off the body of the lines. */
@media (max-width: 900px) {
  .obj--bear    { right: -64px; }
  .obj--glasses { left: -64px; }
}

/* The depth layer clips its own objects, and Chrome reports no overflow at
   all - but Safari still let the page be dragged sideways. Belt and braces:
   clip the root as well, so the viewport itself has nothing to pan to.
   `clip` rather than `hidden` because hidden on the root can turn body into
   the scroll container and kill the sticky album. */
html { overflow-x: clip; }
body { overflow-x: clip; max-width: 100%; }

@media (max-width: 900px) {
  .obj--glasses { left: -52px; }   /* a bit more of them showing */
  .obj--hand    { bottom: -66px; } /* back up a little */
}

/* ================================================== DESKTOP: LET THEM RUN ==
   Desktop only. Nothing in here touches the phone layout.

   The depth layer used to clip 18px past the story column, which is what was
   slicing the objects off on their right. Now it runs to the far edge of the
   screen, so each object shows whole - and the album is lifted above the
   field so anything that reaches that far simply passes behind the book,
   which is the correct depth relationship anyway.
   ========================================================================== */
@media (min-width: 901px) {
  .depth { right: -100vw; }

  /* the book sits ON TOP of the field rather than under it */
  .g-album { z-index: 1; }

  /* the measure eases right a hair, opening the left margin */
  .chapter .col { margin-left: 48px; margin-right: auto; }
}

/* Those three were positioned from the depth layer's RIGHT edge, which just
   moved a whole viewport over - so they have to be anchored from the left
   instead. Text now ends at x570 and the album column starts at 636, so they
   begin just past the copy and run on behind the book. */
@media (min-width: 901px) {
  .obj--bear { left: 566px; right: auto; }
  .obj--grad { left: 566px; right: auto; }
  .obj--hand { left: 392px; right: auto; }
}

/* An object stays out of the page until its pixels have arrived, so the
   rectangular fallback shadow never gets a frame to paint in. No fade - it
   simply is not there, then it is. */
.obj:not(.is-ready) { visibility: hidden; filter: none; }

/* Desktop nudges. The run between "…I'll add another." (ends y327) and the
   "WHY I MADE IT" label (starts y419) is 92px, centred on y373 - the bear
   drops so his arm and shoulder land in it rather than his legs. */
@media (min-width: 901px) {
  .obj--bear { left: 536px; bottom: -110px; }
  .obj--grad { left: 522px; }
  .obj--hand { left: 444px; }
}


/* The book comes down about 6% on desktop only - enough that more of her face
   clears the page edge when the album is open, without changing the object's
   presence. Phones keep their own --page-w, which is set from the viewport
   and is untouched by this. */
@media (min-width: 901px) {
  :root { --page-w: clamp(240px, 23vw, 327px); }
  .obj--bear { bottom: -168px; }
}

/* -168 dropped him far enough that the gap landed on his head; -145 puts it
   on the upper arm and shoulder */
@media (min-width: 901px) { .obj--bear { bottom: -145px; } }

/* Glasses down beside "PAGE ONE'S GOAL". That label sits centred at x241-413,
   so the whole left of its row is open - the glasses drop into it and still
   run off the left edge. */
@media (min-width: 901px) {
  .obj--glasses { left: -38px; bottom: -43px; }
}

/* "amount it can contribute…" ends at y1633 and the glasses topped out at
   1624 - down far enough to clear that last line */
@media (min-width: 901px) { .obj--glasses { bottom: -62px; } }

/* The copy ends 570px from the depth layer's left edge at every width (the
   measure is fixed at 486 with a 48px indent), so anything left of 570 sits
   ON the text no matter how wide the window is. The portrait starts past it. */
@media (min-width: 901px) { .obj--grad { left: 580px; } }

/* ===================================================== SHADOWS: REMOVED ====
   Safari was drawing these objects' drop-shadow as a rectangle - the layer's
   bounding box rather than the object's silhouette. Two attempts at timing it
   (waiting for load, then for decode) did not help, which means it is not a
   timing problem: the objects are provably hidden until decoded, so whatever
   paints the box paints after that. It is Safari rasterising drop-shadow on a
   rotated, composited element, and it is not fixable from here.

   A filter that cannot run cannot fall back to a rectangle, so the filter is
   gone. The objects now sit flat on the paper. Baking real shadows into the
   image files would bring the depth back and could not produce this bug - but
   it means re-exporting all five with padding for the blur and re-tuning
   every position, because a padded canvas moves each object's edges.
   ========================================================================== */
.obj--far, .obj--mid, .obj--near { filter: none; }

/* ==================================================== REQUEST THE LINK =====
   Desktop only. The button sits under the album; the dialog it opens holds the
   real signup card, moved there and moved back.
   ========================================================================== */
.request-link { display: none; }

@media (min-width: 901px) {
  .request-link {
    display: block;
    margin: clamp(26px, 3.4vh, 40px) auto 0;
    padding: 11px 26px 12px;
    border: 1px solid var(--ink);
    border-radius: 2px;
    background: none;
    cursor: pointer;
    font-family: var(--text), system-ui, sans-serif;
    font-size: 12.5px;
    font-weight: 600;
    letter-spacing: .09em;
    text-transform: uppercase;
    color: var(--ink);
    transition: background-color .18s ease, color .18s ease;
  }
  .request-link:hover { background: var(--ink); color: var(--canvas); }
  .request-link:focus-visible { outline: 2px solid var(--ink); outline-offset: 3px; }
}

body.has-dialog { overflow: hidden; }

.req-dialog {
  position: fixed; inset: 0; z-index: 220;
  display: flex; align-items: center; justify-content: center;
  padding: 4vmin;
  background: rgba(38, 32, 27, .62);
  opacity: 0; transition: opacity .2s ease;
}
/* .req-dialog sets display:flex, which outranks the browser's [hidden] rule -
   the same trap the zoom overlay fell into, so say it explicitly */
.req-dialog[hidden] { display: none; }
.req-dialog.is-open { opacity: 1; }

.req-dialog__sheet {
  position: relative;
  width: min(440px, 100%);
  max-height: 92vh;
  overflow-y: auto;
  background: var(--canvas);
  background-image: var(--grain);
  border-radius: 4px;
  box-shadow: 0 30px 70px rgba(0, 0, 0, .3);
  padding: 34px 34px 30px;
  transform: translateY(10px);
  transition: transform .22s cubic-bezier(.22,.75,.2,1);
}
.req-dialog.is-open .req-dialog__sheet { transform: translateY(0); }

/* the dialog carries only a short title and the fields */
.req-dialog__title {
  font-family: var(--display), Georgia, serif;
  font-size: 1.35rem;
  line-height: 1.2;
  color: var(--ink);
  margin: 0 0 20px;
}
.req-dialog__sheet .presave-form { margin: 0; }
.req-dialog__sheet .lede { font-size: 15px; line-height: 1.6; color: var(--ink-2); margin: 0; }

.req-dialog__close {
  position: absolute; top: 8px; right: 10px;
  width: 40px; height: 40px; line-height: 1;
  font-size: 26px; color: var(--ink-2);
  background: none; border: 0; cursor: pointer;
}
.req-dialog__close:hover { color: var(--ink); }
.req-dialog__close:focus-visible { outline: 2px solid var(--ink); outline-offset: 2px; }

@media (prefers-reduced-motion: reduce) {
  .req-dialog, .req-dialog__sheet { transition: none; }
}

/* ============================ AFTER THE MERGE: WHERE HER NOTE GOES =========
   Joining Page One's Goal to the signup closed the 120px run her handwriting
   used to sit in - it is 15px now. Desktop has somewhere better: the clear
   corridor right of the copy, alongside the goal paragraphs, touching nothing.
   Phones have no such gutter, so there it sits in the run at the foot of the
   section, after the form - a closing note rather than a transition.
   ========================================================================== */
@media (min-width: 901px) {
  .obj--hand { left: 582px; right: auto; top: 132px; bottom: auto; }
  /* the padding that used to hold a clear band for the note now just adds a
     gap after the form */
  .g-story > section.chapter:nth-of-type(4) { padding-bottom: clamp(52px, 8vh, 92px); }
}
@media (max-width: 900px) {
  .obj--hand { right: 6px; left: auto; top: auto; bottom: 8px; }
}

/* A quiet label over the tally, in the same small tracked caps as the section
   labels. No bar, no widget - the number stays the loud part. */
.card .count .count-label {
  display: block;
  font-family: var(--text), system-ui, sans-serif;
  font-optical-sizing: none;
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .13em;
  text-transform: uppercase;
  color: var(--ink-3);
  margin: 0 0 7px;
}

/* Her note beside the tally. The count block runs y3217-3282 and its text
   stops around x150, so the right of that row is open. NOTE: this is anchored
   in px from the top of the section, so it needs re-measuring if the copy
   above it changes length. */
@media (max-width: 900px) {
  .obj--hand { top: 604px; bottom: auto; right: 8px; left: auto; }
}

/* Desktop: her note beside the tally too. The count block runs y2232-2307 and
   its text stops around x204, so everything right of that is open all the way
   to the album column at 636. Sized down so it fits the 117px band between the
   lede and "How should I send it?". */
@media (min-width: 901px) {
  .obj--hand { width: 200px; left: 318px; right: auto; top: 464px; bottom: auto; }
}

/* it was crossing "I'll send you the purchase link…", which runs the full
   measure - drop it below that line */
@media (min-width: 901px) { .obj--hand { top: 496px; } }

/* into the gap between the copy and the book - the text ends at 570 and the
   book's left edge is 667, so the note can sit across that boundary */
@media (min-width: 901px) { .obj--hand { left: 392px; } }

/* --- handwritten note: anchor to the story/album column boundary --- */
@media (min-width: 901px) {
  .obj--hand {
    /* .depth runs 100vw past its chapter, so (100% - 100vw) lands on the chapter's
       right edge -- the grid line the book sits beside. Offsetting from there keeps
       the note tucked just left of the open spread at any window width. */
    left: calc(100% - 100vw - 140px);
    right: auto;
  }
}

/* narrow desktop (901-1150px): only ~50px of gutter separates the story column
   from the book, so there is no room beside the count. The note drops to the
   section's tail instead, still riding the column edge. */
@media (min-width: 901px) and (max-width: 1150px) {
  .obj--hand {
    width: 104px;
    top: auto;
    bottom: 6px;
    left: calc(100% - 100vw - 30px);
  }
}

/* ===========================================================================
   PAPER VARIATION — different pieces of paper inside the same album

   The four story sections were running the same editorial rhythm on the same
   cream, so the page read as one long document instead of a book you turn
   through. Each section now behaves like a different physical thing that got
   put on the page. No cards: nothing here gets a radius, an all-round border,
   a blur or a "container" look, and no artifact loses its colour.

     What it is        untouched. The plain page the others are measured against.
     Why I made it     his own voice up top; the closing thought tucked in on a
                       warmer slip of paper, laid down a half-degree crooked.
     The scholarship   archival. Double-ruled file label, and the one hard fact
                       set as a record strip between hairlines.
     Page one's goal   the break from story into action - the goal and the CTA
                       move onto a pale blue-grey sheet of stationery.
   ========================================================================== */

:root {
  --paper-warm:      #f1e9d9;              /* a slip tucked into the album */
  /* The sheet is the album's own page stock - the same warm cream the book's
     leaves are printed on - so it reads as paper from this album rather than
     a panel from a website. Barely off the canvas; the shadow does the
     separating, not the colour. */
  --paper-sheet:      #f7f2e6;
  --paper-sheet-edge: rgba(64,52,47,.13);
}

/* ------------------------------------------------- why I made it: intimate */

/* His voice, not the page's. Serif at reading size sits between the display
   heading and the body grotesk, so it reads as spoken rather than published. */
.chapter--why h2 + p {
  font-family: var(--display);
  font-optical-sizing: auto;
  font-weight: 400;
  font-size: 18.5px;
  line-height: 1.6;
  letter-spacing: -0.004em;
  color: var(--ink);
  max-width: 47ch;
}

/* The closing thought is the one that hands off to the scholarship, so it
   comes in on its own slip of paper rather than as a fourth paragraph. */
.chapter--why .tuck {
  position: relative;
  max-width: 46ch;
  margin: 32px 0 0;
  padding: 22px 26px 24px;
  background-color: var(--paper-warm);
  background-image: var(--grain);
  color: rgba(64,52,47,.82);
  box-shadow: 0 1px 1px rgba(42,32,28,.10), 0 10px 22px rgba(42,32,28,.11);
  transform: rotate(-0.5deg);
}

/* -------------------------------------------- the scholarship: documentary */

/* A file label, not a headline. */
.chapter--archive .chapter-label {
  border-bottom: 3px double var(--rule);
  padding-bottom: 8px;
}

/* The section's one piece of hard record, ruled off like a ledger entry.
   Hairlines top and bottom only - a strip, never a box. */
.chapter--archive .record {
  margin: 26px 0 22px;
  padding: 15px 0 16px;
  border-top: 1px solid var(--rule);
  border-bottom: 1px solid var(--rule);
  font-size: 15.5px;
  line-height: 1.56;
  letter-spacing: .004em;
  color: var(--ink);
  max-width: 46ch;
}

/* ------------------------------------------ page one's goal: the stationery */

/* The one real break in the page: the story stops and the ask begins, so the
   ask moves onto a different sheet of paper. It bleeds past the text measure
   so it reads as a sheet laid down, not as a panel drawn around the text. */
.stationery {
  position: relative;
  margin: 32px -26px 0;
  padding: 30px 26px 30px;
  background-color: var(--paper-sheet);
  background-image: var(--grain);
  border-top: 1px solid var(--paper-sheet-edge);
  border-bottom: 1px solid var(--paper-sheet-edge);
  box-shadow: 0 1px 2px rgba(42,32,28,.07), 0 14px 30px rgba(42,32,28,.09);
}

.stationery .goal-math { margin-top: 0; border-left-color: rgba(93,113,125,.5); }
.stationery .stationery-out { margin: 20px 0 0; }
.chapter--goal .stationery p { color: var(--ink-2); }
.chapter--goal .stationery .goal-math p { color: var(--ink); }

/* The CTA stops being a card and becomes the lower half of the same sheet. */
.stationery .card {
  background: none;
  border: 0;
  border-radius: 0;
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
  margin: 26px 0 0;
  padding: 24px 0 0;
  border-top: 1px solid var(--paper-sheet-edge);
}

/* Both inserts carry their own paper, so the glyph halo that keeps copy
   legible over the artifacts is not needed and would tint the wrong colour. */
.chapter--why .tuck,
.stationery .chapter-label,
.stationery h2,
.stationery p,
.stationery .goal-math { text-shadow: none; }

@media (max-width: 900px) {
  .chapter--why h2 + p { font-size: 17.5px; }
  .chapter--why .tuck  { margin-top: 26px; padding: 19px 20px 20px; }
  .chapter--archive .record { margin: 22px 0 20px; font-size: 15px; }
  .stationery { margin: 28px -14px 0; padding: 24px 14px 26px; }
  .stationery .card { margin-top: 22px; padding: 20px 0 0; }
}

/* Her note lies ON the stationery, not under it. The artifact layer normally
   sits behind the copy, but this sheet is opaque and was swallowing half the
   handwriting. .depth is pointer-events:none, so the form stays clickable. */
.chapter--goal .depth { z-index: 3; }

/* ===========================================================================
   PAGE ONE'S GOAL — the ask, compressed

   The signup had grown into a conversion funnel: a second headline, a lede
   repeating the button, a maths callout repeating the headline, a labelled
   choice, a boxed consent panel and a two-line share section, each divided
   off from the last. It out-weighed the album.

   It is now the bottom of one section: tally, one line of ask, the controls,
   the legal line small, and a single line of sharing. No inner dividers, no
   second visual break, and a narrow column on desktop so it reads as a
   mechanism on the page rather than a panel bolted to the end of it.
   ========================================================================== */

.chapter--goal .stationery { max-width: 430px; padding: 26px 26px 26px; }

/* the streaming clarification, demoted to an aside */
.chapter--goal .aside {
  margin: 14px 0 0;
  font-size: 13.5px;
  line-height: 1.55;
  color: var(--ink-3);
  max-width: 44ch;
}

/* no rule, no gap, no second subsection - the ask just follows the copy */
.chapter--goal .stationery .card {
  border-top: 0;
  margin: 22px 0 0;
  padding: 0;
}

/* the tally leads, and stays the loud part */
.chapter--goal .card .count { margin: 0 0 8px; font-size: 1.75rem; line-height: 1.1; }
.chapter--goal .card .count .count-label {
  display: inline;
  margin: 0 0 0 9px;
  font-size: 10.5px;
  vertical-align: 2px;
}

/* the ask is a line, not a headline */
.chapter--goal .card h2 {
  font-family: var(--text);
  font-size: 15px;
  font-weight: 600;
  letter-spacing: 0;
  line-height: 1.35;
  color: var(--ink);
  margin: 0 0 14px;
}

/* controls sized to the mechanism, not to the measure */
.chapter--goal .choice,
.chapter--goal .field,
.chapter--goal .field input,
.chapter--goal .btn { max-width: 330px; }
.chapter--goal .choice  { margin: 0 0 10px; }
.chapter--goal .field   { margin: 0 0 10px; }
.chapter--goal .btn     { width: 100%; min-width: 0; margin-top: 12px; }

/* required consent copy, kept in full and set as legal type */
.chapter--goal .consent {
  background: none;
  border-radius: 0;
  padding: 0;
  margin: 12px 0 0;
  gap: 9px;
  max-width: 360px;
}
.chapter--goal .consent input[type=checkbox] { width: 14px; height: 14px; }
.chapter--goal .consent label {
  font-size: 10.5px;
  line-height: 1.5;
  /* Subordinate by size, not by fading it out - this is the TCPA consent
     the toll-free registration was filed on, so it has to stay legible. */
  color: var(--ink-2);
}

/* one line of sharing, no divider */
.chapter--goal .share-block {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 8px 16px;
  margin: 20px 0 0;
  padding: 0;
  border-top: 0;
}
.chapter--goal .share-lede {
  flex: 0 0 100%;
  margin: 0;
  font-size: 13px;
  color: var(--ink-3);
}
.chapter--goal .share-block .share-link { font-size: 13px; }

/* the confirmation is a moment, so it keeps its voice */
.chapter--goal .card.is-confirmed h2 {
  font-family: var(--display);
  font-size: 22px;
  font-weight: 500;
  letter-spacing: -0.018em;
  margin: 0 0 10px;
}
.chapter--goal .card.is-confirmed .lede {
  font-size: 14.5px;
  line-height: 1.55;
  color: var(--ink-2);
  margin: 0 0 12px;
  max-width: 42ch;
}
body.is-released .chapter--goal .card h2 {
  font-family: var(--display);
  font-size: 22px;
  font-weight: 500;
  letter-spacing: -0.018em;
}

@media (max-width: 900px) {
  .chapter--goal .stationery { max-width: none; padding: 22px 14px 22px; }
  .chapter--goal .choice,
  .chapter--goal .field,
  .chapter--goal .field input,
  .chapter--goal .btn,
  .chapter--goal .consent { max-width: none; }
  .chapter--goal .card .count { font-size: 1.6rem; }
}

/* Fallback only. The note's real position is measured in marina.js; this is
   where it parks if that never runs, and it must not land on the form. */
@media (max-width: 900px) {
  .chapter--goal .obj--hand { width: 128px; top: auto; bottom: -34px; right: 8px; left: auto; }
}

/* Only shown when both the Supabase write and the Netlify fallback fail. */
.form-error {
  margin: 10px 0 0;
  font-size: 12.5px;
  line-height: 1.5;
  color: #8a3d33;
}

/* The share actions inside a dialog sheet. The page's own spacing rules are
   scoped to .chapter--goal, and the block either is built fresh in the sheet
   or gets moved into it on confirm - either way it lands outside that scope
   and the two buttons end up touching. */
.req-dialog .share-block {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 10px 22px;
}
.req-dialog .share-lede { flex: 0 0 100%; margin: 0; }

/* ===========================================================================
   MOM'S NOTE — a fixed object, like every other artifact on the page

   This was the only artifact positioned by JavaScript. It measured the layout
   on every resize and recomputed its own size and position, which is why it
   grew, shrank and jumped around while the bear, the glasses and the photos
   sat still. That behaviour was the bug, not the placement.

   It does not need measuring. Relative to the artifact layer, the sheet and
   the tally sit at the SAME coordinates at every desktop width - only the
   album moves. On phones the sheet is centred, so a centre-relative offset is
   just as fixed. So: one size, one position, per breakpoint. Like the others.
   ========================================================================== */

@media (min-width: 901px) {
  /* Sheet content never reaches past 434px from the layer's left edge at any
     desktop width, so 446 can never touch the copy. */
  .chapter--goal .obj--hand {
    width: 200px;
    left: 446px;
    right: auto;
    top: 321px;
    bottom: auto;
    transform: rotate(-3deg);
  }
  /* and it passes behind the album, the way the other objects do */
  .g-album { z-index: 5; }
}

@media (max-width: 900px) {
  /* The column is centred in the layer, so measure from the middle. Measured
     glyph edges on the rows the note sits beside: "already in" ends at +40,
     "Want to be one of the 1,000?" at +47 - the note's left edge was landing
     on +47 exactly, which is what made it look welded to the copy.

     Vertically it is set so the BODY of the word "pursuit" lands on "already
     in". Aligning the whole line's ink box read low, because that box
     includes the tall loops of "of" and "what"; the word's x-height core sits
     at 0.372 down the scan, not 0.328. The 3 degree tilt drops the left end a
     further 2px, so it starts that much higher again. */
  .chapter--goal .obj--hand {
    width: 130px;
    left: calc(50% + 62px);
    right: auto;
    /* Centred in the open band: from the bottom of the aside (354) to the
       bottom of the Text Me / Email Me row (506). Centre 430, note 108 tall. */
    top: 376px;
    bottom: auto;
    transform: rotate(-3deg);
  }
}

/* No small-phone shrink. It is better readable and running off the right edge
   than shrunk to fit inside it - the bleed reads as a note laid down past the
   edge of the page, which is the point of it. */

/* The one line of plumbing under the ask: what arrives, and when. Set as the
   same small type as the consent copy, not as a second lede. */
.chapter--goal .ask-note {
  margin: -8px 0 14px;
  font-size: 10.5px;
  line-height: 1.5;
  color: var(--ink-2);
}
@media (max-width: 900px) {
  /* Kept narrow so the line stops short of mom's note rather than running
     under it - the handwriting sits over this row on phones. */
  .chapter--goal .ask-note { max-width: 200px; }
}

/* The registered entity, named on the opt-in page itself. */
.site-foot__entity { display: block; margin-top: 5px; color: var(--ink-3); }

/* ---------------------------------------------- the handwritten letter -- */

/* His letter, scanned and keyed to transparent ink, sits directly on the
   album's page rather than as a white rectangle on top of it. */
.page-scan { display: block; width: 100%; height: auto; }

/* Same on the zoomed sheet. */
.page-zoom-sheet .page-scan { width: 100%; }

/* The letter's words as real text. Same recipe as .sr-only but without
   white-space: nowrap, which would run a whole letter onto one line. */
.note-transcript {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  border: 0;
}

/* The letter reads a touch small on the closed leaf, so it runs 12% wider
   there and spills evenly into the page's margin. The zoomed view keeps the
   plain 100% - it has all the room it needs. */
.face--back .page-scan,
.page--left .page-scan { width: 112%; margin-left: -6%; }

/* ------------------------------------------- terms + privacy in the footer
   The toll-free reviewer opens /marina. Both legal documents have to be one
   click away from that page, sitting under the entity line already there. */
.site-foot__legal { display: block; margin-top: 6px; }
.site-foot__legal a { color: var(--ink-2); text-decoration: underline; }

/* ===========================================================================
   RELEASE DAY — the page stops asking for a phone number and starts asking
   for a purchase. Written Sept 13, 2026, the night before.

   The counter is deliberately GONE here, not restyled. Before release it
   counted signups, which was true. After release the 1,000 means purchases,
   and nothing on this page can see a purchase. The goal stays as the section
   headline; the number does not come back without a defensible source.
   ========================================================================== */

body.is-released .presave-form { display: block; }   /* overrides the old hide */

.release-lede {
  margin: 0 0 16px;
  font-size: 14.5px;
  line-height: 1.55;
  color: var(--ink-2);
}

/* The one thing this page wants you to do. */
.btn--buy {
  display: inline-block;
  width: auto;
  min-width: 0;          /* .btn sets min-width:260px further up — undo it */
  padding: 14px 26px;
  border: 0;
  border-radius: 3px;
  background: var(--ink);
  color: var(--paper);
  font-family: inherit;
  font-size: 16px;
  font-weight: 700;
  letter-spacing: .01em;
  text-align: center;
  text-decoration: none;
  box-shadow: 0 2px 0 rgba(64,52,47,.28);
  transition: transform .12s ease, box-shadow .12s ease;
}
.btn--buy:hover { transform: translateY(-1px); box-shadow: 0 4px 0 rgba(64,52,47,.24); }
.btn--buy:active { transform: translateY(1px); box-shadow: 0 1px 0 rgba(64,52,47,.3); }
.btn__sub {
  display: block;
  margin-top: 3px;
  font-size: 12px;
  font-weight: 500;
  letter-spacing: .06em;
  text-transform: uppercase;
  opacity: .72;
}

/* Streaming sits below the purchase and stays visibly lighter than it. */
.release-secondary {
  display: flex;
  flex-wrap: wrap;
  gap: 6px 18px;
  margin-top: 14px;
}
.release-link {
  font-size: 13px;
  font-weight: 600;
  color: var(--ink-2);
  text-decoration: none;
  border-bottom: 1px solid var(--ink-3);
  padding-bottom: 1px;
}
.release-link:hover { color: var(--ink); border-bottom-color: var(--ink); }

/* The reminder form survives release day, demoted to one collapsed line. */
.presave-later { margin: 0; }
.presave-later > .presave-later__summary { display: none; }   /* pre-release */
.presave-later[open] > .presave-later__summary { display: none; }

body.is-released .presave-later > .presave-later__summary {
  display: block;
  margin-top: 20px;
  padding-top: 16px;
  border-top: 1px solid var(--paper-sheet-edge);
  font-size: 12.5px;
  color: var(--ink-3);
  cursor: pointer;
  list-style: none;
}
body.is-released .presave-later > .presave-later__summary::-webkit-details-marker { display: none; }
body.is-released .presave-later > .presave-later__summary:hover { color: var(--ink-2); }
body.is-released .presave-later[open] > .presave-later__summary { display: block; }
body.is-released .presave-later > .presave-later__summary::after {
  content: ' +'; font-weight: 700;
}
body.is-released .presave-later[open] > .presave-later__summary::after { content: ' \2212'; }

body.is-released .count { display: none !important; }

/* The ask sits full width, above the form, clear of mom's note. */
body.is-released .ask-note {
  display: block;
  max-width: none;
  margin: 4px 0 18px;
  font-size: 14.5px;
  line-height: 1.55;
  color: var(--ink-2);
}

/* The release copy and the button both stop short of the right edge so mom's
   note sits where it always sat. She is the reason the page exists; the button
   moves for her, not the other way round. */
.release-lede,
.release-secondary { max-width: 62%; }

@media (max-width: 900px) {
  .btn--buy { padding: 16px 24px; font-size: 16px; }   /* still thumb-sized */
  .release-lede, .release-secondary { max-width: 60%; }
}


/* Specificity: `.chapter--goal .btn { width:100% }` (line ~2343) and the card's
   own paragraph measure both outrank a single class, which is why the button
   stayed full-bleed and the copy ran the whole width. Scope these to the card
   so they actually win — and so mom's note keeps the right-hand column it has
   always had. Nothing about her position changes. */
.chapter--goal .card .btn--buy {
  width: auto;
  max-width: none;
  min-width: 0;
}
.chapter--goal .card .release-lede,
.chapter--goal .card .release-secondary,
body.is-released .presave-later > .presave-later__summary {
  max-width: 55%;
}
@media (max-width: 900px) {
  .chapter--goal .card .release-lede,
  .chapter--goal .card .release-secondary,
  body.is-released .presave-later > .presave-later__summary { max-width: 58%; }
}

/* Release day opens up a block of empty sheet to the right of the purchase
   button and the streaming links. Her note moves down into it and gets bigger,
   because that space exists now and she should have it. Pre-release placement
   is untouched — this only applies once the song is out. */
@media (min-width: 901px) {
  body.is-released .chapter--goal .obj--hand {
    top: 451px; left: 315px; width: 240px;
  }
}
@media (max-width: 900px) {
  /* Top of her writing lands level with "Legacy" in the release copy, not
     level with the button - lining it up with the button made it look placed.
     Bigger, and hanging off the right edge of the sheet on purpose. */
  body.is-released .chapter--goal .obj--hand {
    top: 448px; left: calc(50% + 28px); width: 160px;
  }
}

/* Shown only inside in-app browsers, where a purchase cannot complete without
   getting out to Safari first. Quiet until a jump is actually blocked. */
.buy-hint {
  max-width: 55%;
  margin: 10px 0 0;
  font-size: 12px;
  line-height: 1.45;
  color: var(--ink-3);
}
.buy-hint strong { color: var(--ink-2); font-weight: 700; }
.buy-hint.is-urgent {
  color: var(--ink);
  font-size: 13px;
  font-weight: 600;
}
.buy-hint.is-urgent strong { color: var(--ink); }
@media (max-width: 900px) { .buy-hint { max-width: 58%; } }


/* The Buy button and its in-app hint are gone - the form is the CTA now, and
   the page never links to a purchase. Streaming sits under the form. */
.release-streaming { display: none; }
body.is-released .release-streaming {
  display: flex;
  flex-wrap: wrap;
  gap: 6px 18px;
  margin-top: 18px;
  padding-top: 16px;
  border-top: 1px solid var(--paper-sheet-edge);
  max-width: 60%;
}
@media (max-width: 900px) { body.is-released .release-streaming { max-width: 58%; } }


/* The form is the call to action on release day, so its disclosure summary
   ("Can't buy it right now?") has no job any more - it only existed while a
   Buy button was competing with the form. */
body.is-released .presave-later > .presave-later__summary,
body.is-released .presave-later[open] > .presave-later__summary { display: none; }


/* Release day: news full width, the ask narrow beside mom's note, and room to
   breathe before the channel toggle. */
body.is-released .release-lede { margin-bottom: 20px; }
body.is-released .choice { margin-top: 6px; }
