/* ============================================================================
   we-chassis.css — the shared page chassis: tokens, reset, containers, the ONE
   nav's styling, the reveal system, the zone palettes and the canonical
   TORN-PAPER TRANSITION SYSTEM v3.1.

   WHY THIS FILE EXISTS
   --------------------
   `components/site_nav` supplies the nav MARKUP for 26 sections, but its
   STYLING has always lived in each page's own sheet (every teardown-*.css and
   landing sheet carries an identical copy at ~line 73). assets/we-teaser-nav.css
   and assets/we-nav-armour.css are corrective overlays on top of that base —
   they are NOT a complete nav. So a new page that links only its own sheet gets
   a half-styled nav: the CTA loses its size/radius/offset-shadow, the bar loses
   its 55.6px pinned height and dark-paper stock, and the dropdown panel never
   appears. That is exactly what happened to the PDP on first push.

   Rather than hand-roll a 27th copy, this file holds ONE canonical extract,
   copied verbatim from assets/teardown-im8.css (the reference implementation):
     · the nav block                     (teardown-im8.css:73-108)
     · the nav height pin + tear height  (teardown-im8.css:1393-1399)
     · the shadow tiers                  (teardown-im8.css :root block)
     · .rv reveals                       (teardown-im8.css:~30)
     · .zone / .zone--light palettes     (teardown-im8.css:~600)
     · the tstrip tear system + the REAL masks (teardown-im8.css:567-700)

   The tear masks are the whole point of reusing rather than re-deriving: they
   are turbulence-derived polygons with ~130 irregular points and a shallow,
   organic amplitude. A hand-authored zigzag at regular intervals reads as
   pinking shears, not torn paper.

   TWO DELIBERATE DEVIATIONS from the copied source, both required:
   1. `background-attachment: fixed` is DROPPED from .nav and .tstrip. It was
      the 2026-07-30 Safari choppy-scroll root cause; layouts/theme.liquid ships
      a global kill-switch (including ::before/::after) plus a composited fixed
      paper layer, so the original declarations are already inert — copying them
      would just reintroduce dead code that looks load-bearing.
   2. `.zone--light::before` keeps `mix-blend-mode:normal`. A full-height blended
      grain layer is a large raster cost and the layout de-blends the teardowns'
      equivalent anyway.

   LOAD ORDER — this must be linked BEFORE the page's own sheet:
     1. assets/we-mobile-nav.css   (layout <head>)
     2. THIS FILE                  (in-body, blocking="render")
     3. the page's own sheet        (in-body, blocking="render")
     4. assets/we-teaser-nav.css   (emitted by site_nav, in-body)
     5. assets/we-nav-armour.css   (immediately after 4 — must stay last)
   Nothing here uses !important, so the armour sheet still wins every tie.

   Assets are FLAT and asset_url is filename-only, so all textures come from the
   :root custom properties layouts/theme.liquid declares (--we-paper-light /
   --we-paper-dark). A bare relative url() would 404 on the Fluid CDN.
   ========================================================================== */

/* ---------- tokens ---------- */
:root{
  --hand:"FluidHand",Inter,-apple-system,sans-serif;
  --sans:Inter,-apple-system,BlinkMacSystemFont,"SF Pro Display","Segoe UI",sans-serif;
  --mono:"WeHaas","Neue Haas Display","Helvetica Neue",sans-serif;
  --serif:"Iowan Old Style","Palatino Linotype",Palatino,Georgia,serif;

  --bg:#05070a;--panel:#0b0f16;--panel-2:#0d1219;
  --ink:#f7f8fa;--soft:#f7f8fa;--dim:rgba(247,248,250,.66);--faint:rgba(247,248,250,.44);
  --line:rgba(255,255,255,.1);--line-soft:rgba(255,255,255,.06);
  /* --blue is the token .btn-cta reads; --brand is the alias page sheets use */
  --blue:#42b1ff;--brand:#42b1ff;--cyan:#7fd3ff;
  --green:#6ce1ad;--orange:#ff9474;--yellow:#ffd36c;

  --max:1180px;--col:740px;

  /* ---- shadow tiers (verbatim intent, flattened to the baked values) ----
     Tier 1 = solid card on the page background. Tier 2 = torn-paper slip
     overlapping other content. Tier 3 = the tear strips themselves.
     --sh-rgb is re-scoped warm inside .zone--light so every tier casts a warm
     shadow on cream and a neutral one on dark. */
  --sh-rgb:0,0,0;
  --shadow-1:0 2px 3px rgba(var(--sh-rgb),.28),0 16px 34px -20px rgba(var(--sh-rgb),.5);
  --shadow-1-hover:0 2px 3px rgba(var(--sh-rgb),.28),0 24px 42px -16px rgba(var(--sh-rgb),.62);
  --shadow-1-d:drop-shadow(0 2px 3px rgba(var(--sh-rgb),.28)) drop-shadow(0 16px 24px rgba(var(--sh-rgb),.5));
  --slip-shadow:drop-shadow(0 3px 3px rgba(var(--sh-rgb),.3)) drop-shadow(2px 9px 12px rgba(var(--sh-rgb),.5));
  --tear-sh:drop-shadow(0 2px 3px rgba(var(--sh-rgb),.24));
  --tear-sh-up:drop-shadow(0 -2px 3px rgba(var(--sh-rgb),.24));
  --tear-slip:drop-shadow(0 2px 3px rgba(var(--sh-rgb),.17)) drop-shadow(0 7px 12px rgba(var(--sh-rgb),.34));
  --tear-box:0 8px 18px -11px rgba(var(--sh-rgb),.53);
}

/* ---------- reset ---------- */
*{box-sizing:border-box}
html{scroll-behavior:smooth;-webkit-text-size-adjust:100%}
/* opaque body colour is deliberate: the layout's html body::before paper layer
   is z-index:-1, so it paints above the body background and below content. */
body{margin:0;background-color:var(--bg);color:var(--soft);font-family:var(--sans);
  font-size:17px;line-height:1.65;overflow-x:clip;-webkit-font-smoothing:antialiased;
  text-rendering:optimizeLegibility}
a{color:inherit;text-decoration:none}
button{font:inherit;color:inherit;border:0;background:none;cursor:pointer}
img,svg{display:block;max-width:100%}
/* the UA gives <figure> `margin:1em 40px`; without this a figure-wrapped image
   sits 40px inboard of the grid column and reads as a misaligned page */
figure,figcaption,dl,dd{margin:0}
:focus-visible{outline:2px solid var(--blue);outline-offset:3px;border-radius:4px}
::selection{background:var(--blue);color:#05070a}

.wrap{width:min(var(--col),calc(100% - 44px));margin-inline:auto}
.wide{width:min(var(--max),calc(100% - 44px));margin-inline:auto}

/* ---------- reveals (hidden state gated on html.js, so JS-off is safe) ---------- */
.js .rv{opacity:0;transform:translateY(26px);
  transition:opacity .7s cubic-bezier(.2,.65,.25,1),transform .7s cubic-bezier(.2,.65,.25,1)}
.js .rv.in{opacity:1;transform:none}
.js .rv.d1{transition-delay:.08s}.js .rv.d2{transition-delay:.16s}.js .rv.d3{transition-delay:.24s}
@media(prefers-reduced-motion:reduce){.js .rv{opacity:1;transform:none;transition:none}}

/* ---------- shadow wrappers ---------- */
.card-sh{filter:var(--shadow-1-d)}
.tear-sh-w{filter:var(--tear-slip)}
.slip-sh{filter:var(--slip-shadow)}

/* ============================================================
   NAV — dark-paper bar with a torn bottom edge (.tstrip--nav).
   Carries the same paper-dark stock as the body/tstrip plus a
   darkening veil for text legibility, so the bar reads as a torn
   strip of the same paper the tear hangs off.
   ============================================================ */
.nav{position:fixed;top:0;left:0;right:0;z-index:100;transition:box-shadow .3s,border-color .3s;
  background-color:var(--bg,#05070a);
  background-image:linear-gradient(rgba(5,7,10,.34),rgba(5,7,10,.52)),var(--we-paper-dark);
  background-size:cover;background-position:center;
  /* background-attachment:fixed intentionally omitted — see banner note 1 */
  border-bottom:1px solid transparent}
.nav.scrolled{border-bottom-color:var(--line);box-shadow:var(--tear-box)}
/* the bar's height is PINNED so the CTA is the same height on every page: the
   visible bar is 69px minus the part the tear eats. */
.nav{--nav-tear-h:24px;height:calc(69px - .558 * var(--nav-tear-h));line-height:1.65}
@media(max-width:640px){.nav{--nav-tear-h:18px}}
.nav .tstrip--nav{height:var(--nav-tear-h)}

/* ---- THE BAR→RAG SEAM (why the CTA looked butted against the nav's edge) ----
   The bar is 55.6px but .nav-inner is 68px and OVERFLOWS it — deliberately, per
   we-teaser-nav.css: "the content box stays 68px and overflows the shorter
   painted bar, so the raised strip supplies the last stretch of paper." So the
   CTA (40.4px, centred in 68px) ends at y≈54.2 — just 1.4px above the bar's
   own bottom. The ~14px of breathing room under it is supposed to come from the
   torn strip, which continues the same sheet of paper down to the rag at ≈68px.

   The bug: the bar and the strip each paint their OWN
   `linear-gradient(rgba(5,7,10,.34), rgba(5,7,10,.52))` darkening veil. In the
   original both also carried background-attachment:fixed, so both gradients
   resolved against the VIEWPORT and formed one continuous wash. The layout's
   Safari choppy-scroll kill-switch forces `scroll` globally (correct — that was
   the 9fps root cause), so each element now resolves its own box and the strip
   RESTARTS the veil: the bar ends at .52 and the strip immediately jumps back
   to .34. That tonal step is a hard full-width line 1.4px under the CTA, and
   the eye reads it as the bottom of the nav — hence "no bottom padding".
   The teardowns hide it because a light hero photo sits under the rag; on a
   page whose content area is flat dark paper it is the most contrasty edge
   in the whole bar.

   ATTEMPTED FIX — REMOVED, see the verdict at the end of this comment. It
   painted bar and strip as ONE sheet by giving both the SAME background
   geometry and offsetting the strip by the bar's height, so the veil gradient
   and the paper photo both run continuously across the seam:
     · veil  → `100% var(--nav-paper-h)` (the full 79.6px bar+tear span), so the
               gradient runs .34 at y=0 to .52 at y=79.6 ACROSS BOTH elements
               instead of restarting inside the strip.
     · paper → `100% auto`, which fills the width and keeps the image's aspect
               ratio, so both elements sample the identically-scaled photo. The
               paper is far taller than 79.6px at any viewport width, so this
               still covers.
   The strip then offsets both layers by -var(--nav-bar-h) to continue exactly
   where the bar stopped. The only edge left in the nav is the rag itself.

   TWO FAILED ATTEMPTS, for the next person (do not repeat either):
   1. `background-size:100% var(--nav-paper-h)` on BOTH layers. Fixed the veil
      but squashed the photo to 79.6px tall, so its scale and average brightness
      no longer matched the page's `center/cover` paper — same seam, new cause.
      The photo layer needs `auto` height, not the veil's.
   2. Holding the strip's veil CONSTANT at .52. That removes the restart but
      makes the strip a FLAT darker slab under a graduated bar, which reads as a
      second band divorced from the nav — worse than the original.

   #siteNav (1,1,0) beats we-teaser-nav.css's `.nav .tstrip--nav` (0,2,0), which
   loads later; we-nav-armour.css sets no background, so its ties are unaffected.
   The strip's background-image is restated verbatim (it is the canonical pair,
   veil + paper) because only its SIZE and POSITION change.

   ⛔ RESOLVED BY DELETION — DO NOT ADD A #siteNav OVERRIDE HERE.
   Three attempts were made to "fix" this seam from a page/chassis sheet:
     1. background-size:100% <bar+tear> on BOTH layers → squashed the paper
        photo, changing its scale/brightness vs the page. Same seam, new cause.
     2. veil held constant at .52 → the strip became a FLAT darker slab under a
        graduated bar: "another band of bg lower, divorced from the nav." Worse.
     3. matched geometry with the paper on `100% auto` → measured correct at
        scroll 0, but still wrong in a real browser at other scroll positions.
   All three were solving a problem the OTHER 26 pages do not have. Proof: a
   revision of this page cached in Chey's browser from BEFORE any of these
   overrides had a correct nav. The canonical nav in assets/we-teaser-nav.css
   (+ we-nav-armour.css, which must stay last) is correct as shipped; a
   #siteNav rule here outranks it (1,1,0 vs 0,2,0) and silently replaces a
   working component with a hand-rolled one. Leave the nav alone. If the nav
   ever genuinely needs a change, change we-teaser-nav.css so all 27 pages get
   it — do not patch it per page. */
.nav-inner{max-width:1120px;margin:0 auto;padding:0 24px;height:68px;display:flex;
  align-items:center;justify-content:space-between;gap:20px;position:relative;z-index:6}
.brand{display:flex;align-items:center;flex:0 0 auto;height:68px}
.brand img{display:block;width:auto;height:36px;max-width:208px;object-fit:contain}
.nav-actions{display:flex;align-items:center;gap:30px}
.nav-link{color:var(--dim);font-size:.92rem;transition:color .18s ease}
.nav-link:hover{color:var(--ink)}
.btn-cta{display:inline-flex;align-items:center;gap:8px;padding:9px 16px;border-radius:4px;
  font-size:.85rem;font-weight:700;letter-spacing:-.01em;background:var(--blue);color:#050a12;
  white-space:nowrap;box-shadow:2px 2px 0 rgba(0,0,0,.5);transform:rotate(-.6deg);
  transition:box-shadow .18s ease,transform .18s ease}
.btn-cta:hover{box-shadow:3px 4px 0 rgba(0,0,0,.55);transform:rotate(-.6deg) translateY(-1px)}
.dd{position:relative}
.dd-trigger{display:inline-flex;align-items:center;gap:7px;color:var(--dim);font-size:.92rem;
  transition:color .18s ease}
.dd-trigger:hover,.dd:hover .dd-trigger,.dd.open .dd-trigger,.dd:focus-within .dd-trigger{color:#fff}
.dd-trigger svg{width:11px;height:11px;fill:none;stroke:currentColor;stroke-width:2.2;
  stroke-linecap:round;stroke-linejoin:round;transition:transform .22s ease}
.dd:hover .dd-trigger svg,.dd.open .dd-trigger svg,.dd:focus-within .dd-trigger svg{transform:rotate(180deg)}
.dd-panel{position:absolute;top:calc(100% + 12px);left:50%;translate:-50% 0;width:302px;padding:8px;
  border:1px solid var(--line);border-radius:12px;background:rgba(11,15,21,.98);
  box-shadow:0 30px 70px -30px #000,0 0 0 1px rgba(66,177,255,.06);
  opacity:0;visibility:hidden;transform:translateY(-6px);
  transition:opacity .2s ease,transform .2s ease,visibility .2s;z-index:70}
.dd:hover .dd-panel,.dd.open .dd-panel,.dd:focus-within .dd-panel{opacity:1;visibility:visible;transform:translateY(0)}
.dd-panel::before{content:"";position:absolute;top:-14px;left:0;right:0;height:14px}
.dd-head{font-family:var(--mono);font-size:.6rem;letter-spacing:.14em;text-transform:uppercase;
  color:var(--dim);padding:8px 12px 6px}
.dd-item{display:flex;gap:11px;align-items:flex-start;padding:10px 12px;border-radius:9px;
  transition:background .18s ease}
.dd-item:hover{background:rgba(66,177,255,.1)}
.dd-item .ic{flex:0 0 26px;height:26px;border-radius:7px;display:grid;place-items:center;
  background:linear-gradient(150deg,#123a63,#0a1a2e);border:1px solid rgba(66,177,255,.28);
  color:var(--cyan);font-family:var(--mono);font-size:.62rem;font-weight:700;margin-top:1px}
.dd-item .tt{display:block;color:var(--ink);font-size:.86rem;font-weight:560;line-height:1.25}
.dd-item .ds{display:block;color:var(--dim);font-size:.72rem;line-height:1.3;margin-top:3px}
.dd-item.soon{opacity:.55;cursor:default}
.dd-item.soon:hover{background:none}
.dd-item.soon .ic{background:rgba(255,255,255,.04);border-color:var(--line);color:var(--dim)}
@media(max-width:880px){.nav-actions .nav-link,.nav-actions .dd{display:none}}
@media(max-width:480px){.brand img{height:28px;max-width:158px}.btn-cta{padding:9px 14px;font-size:.82rem}}

/* ---------- buttons: the analog hard-offset signature ---------- */
.button{min-height:44px;padding:0 22px;border-radius:4px;display:inline-flex;align-items:center;
  justify-content:center;gap:9px;background:#fff;color:#07101a;font-weight:700;font-size:.85rem;
  box-shadow:3px 3px 0 rgba(0,0,0,.5);transform:rotate(-.6deg);
  transition:transform .22s ease,box-shadow .22s ease}
.button:hover{transform:rotate(-.6deg) translateY(-2px);box-shadow:4px 5px 0 rgba(0,0,0,.55)}
.button.ghost{background:rgba(255,255,255,.04);color:#fff;border:1px solid rgba(255,255,255,.2);
  box-shadow:none;transform:none}
.button.ghost:hover{transform:translateY(-2px);box-shadow:none}
.button[disabled],.button[aria-disabled="true"]{background:rgba(255,255,255,.08);color:var(--dim);
  box-shadow:none;transform:none;cursor:not-allowed}

/* ============================================================
   ZONE stacking + palettes
   The DARK side owns every tear, so dark zones paint ABOVE cream
   and their dark-filled tear strips overlap onto the continuous
   cream. Fixed nav (100) stays on top.
   ============================================================ */
.zone{position:relative}
.zone--dark{z-index:3}
.zone--light{z-index:2}

.zone--light{
  --bg:#f5f0e8;
  --ink:#17140e;
  --soft:#241f16;
  --dim:#4b4335;
  --panel:#fcf9f3;
  --panel-2:#f1eadd;
  --line:rgba(30,22,10,.14);
  --line-soft:rgba(30,22,10,.08);
  --sh-rgb:30,22,10;
  /* darkened blue that survives on cream (brand blue is ~2:1 on cream) */
  --brand-ink:color-mix(in srgb,#42b1ff 58%,#0f3350);
  /* cream veil over the paper texture: keeps the tooth but pulls the tone to
     #f5f0e8 so the flat-cream tear bands meet the zone without a seam */
  background:linear-gradient(rgba(245,240,232,.55),rgba(245,240,232,.55)),var(--bg) var(--we-paper-light) center/cover;
  color:var(--soft)}
/* grain film over cream. mix-blend-mode:normal on purpose — see banner note 2. */
.zone--light::before{content:"";position:absolute;inset:0;pointer-events:none;z-index:0;opacity:.05;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='220' height='220'%3E%3Cfilter id='ng'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23ng)'/%3E%3C/svg%3E")}
.zone--light>*{position:relative;z-index:1}
.zone--light strong,.zone--light b{color:var(--ink)}
.zone--light ::selection{background:#42b1ff;color:#fff}

/* ============================================================
   TORN-PAPER TRANSITION SYSTEM v3.1 (canonical)
   ------------------------------------------------------------
   THE DARK SIDE OWNS EVERY TEAR. Cream zones are CONTINUOUS — their paper
   texture runs unbroken under every boundary; nothing cream is ever cut or
   duplicated (that was v2's fatal seam: a flat cream fill meeting the textured
   cream zone always showed a straight tonal joint). Every boundary is instead
   carved by a DARK-filled, mask-shaped strip (.tstrip) sitting ON TOP of the
   cream. Because the dark page background is flat, a dark strip's opaque edge
   abuts the adjacent dark section invisibly — dark-on-dark by construction —
   while its ragged edge bites into the cream. No straight line is possible.

   SPACING SCHEMA — two tokens own every boundary's clearance:
     --tear-gap-light : cream content → rag edge (cream side of a boundary)
     --tear-gap-dark  : rag edge → first dark content (dark side)
   Measured to the rag's AVERAGE midline. A cream edge that RECEIVES deep teeth
   must additionally clear the rag's overhang so no tooth lands within ~40px of
   text; the .tear-clear-* helpers below do that arithmetic.

   VARIANTS (all masks are baked static polygons — never runtime feTurbulence
   or feDisplacementMap, which caused choppy scroll and edge artefacts):
     .tstrip--perf : boundary at a cream zone's TOP. Rag DOWN, opaque TOP,
                     22px micro-perforation — the torn top of a paper sheet.
     .tstrip--up2  : boundary at a cream zone's BOTTOM. Rag UP into the cream
                     above, opaque BOTTOM merging dark-on-dark into the dark
                     zone that follows. Full --tear-h deep.
   SYSTEM RULE: a tear strip MUST be a child of an UNMASKED zone. A masked
   element clips to its own border box, so a strip overflowing a masked parent
   is clipped — its rag vanishes and the boundary reads as a straight line.
   ============================================================ */
:root{--tear-h:112px;--tear-gap-light:64px;--tear-gap-dark:140px}
@media(max-width:640px){:root{--tear-h:78px;--tear-gap-light:44px;--tear-gap-dark:92px}}

.tstrip{position:absolute;left:0;right:0;height:var(--tear-h);pointer-events:none;z-index:5;
  /* MUST match the body's paper-dark texture (dark zones are transparent to
     body). background-attachment:fixed intentionally omitted — banner note 1. */
  background:var(--bg,#05070a) var(--we-paper-dark) center/cover;
  -webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;
  -webkit-mask-size:100% 100%;mask-size:100% 100%;
  -webkit-mask-position:0 0;mask-position:0 0}

/* rag DOWN, opaque TOP. Overlaps 1px up to kill a hairline. */
.tstrip--perf{top:-1px;height:22px;
  filter:var(--tear-sh);
  -webkit-mask-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%201200%20120%27%20preserveAspectRatio%3D%27none%27%3E%3Cpolygon%20points%3D%27-40%2C64.5%200.1%2C64.5%2019.4%2C68.3%2026.1%2C67.5%2033.4%2C63%2038.1%2C62%2041.4%2C62.3%2045.6%2C64.8%2053.6%2C63.8%2072.9%2C65.3%2076.6%2C64.3%2084.4%2C65%2090.6%2C62.8%20108.9%2C62.8%20118.9%2C66.5%20134.1%2C64.3%20149.6%2C68.3%20158.4%2C64.8%20162.4%2C66.5%20177.6%2C65.5%20200.9%2C66.8%20215.1%2C64%20225.6%2C66%20245.6%2C65%20256.9%2C67.8%20261.4%2C65.5%20265.6%2C66%20270.9%2C63.8%20279.1%2C65.8%20283.9%2C64.8%20296.4%2C65.5%20312.1%2C62.5%20325.1%2C67.3%20342.4%2C64.3%20355.4%2C66.8%20365.9%2C67%20377.9%2C63%20383.6%2C66%20392.1%2C68%20406.1%2C66.3%20414.9%2C68.3%20425.1%2C66.3%20445.6%2C67.5%20460.6%2C63.8%20470.9%2C65%20480.1%2C68.8%20514.9%2C65.8%20524.9%2C69.3%20542.6%2C70.8%20550.9%2C69%20558.1%2C65%20563.4%2C65.8%20571.4%2C63.8%20580.6%2C66.5%20599.4%2C66.8%20609.6%2C70.3%20615.4%2C70.8%20625.4%2C70.3%20630.6%2C67.5%20637.4%2C66.5%20651.1%2C65.8%20655.9%2C66.8%20663.9%2C64.3%20671.9%2C67.3%20676.9%2C66.8%20683.1%2C68.8%20702.4%2C69.8%20709.1%2C68.3%20729.9%2C68.3%20750.6%2C64.3%20761.9%2C67.5%20774.9%2C67.3%20783.4%2C64%20788.9%2C63.8%20805.9%2C67.3%20811.4%2C70.3%20817.6%2C71.3%20830.6%2C68.8%20842.6%2C71.8%20848.4%2C69%20865.4%2C65.3%20873.6%2C70%20881.1%2C70.3%20896.1%2C68%20904.6%2C70.3%20915.4%2C70.5%20934.9%2C66.3%20950.9%2C67.3%20955.6%2C68.8%20959.6%2C68.3%20965.9%2C70.3%20978.6%2C68.8%20984.4%2C66.8%20993.9%2C66.3%201000.9%2C69.5%201015.9%2C72.3%201026.9%2C69.5%201038.4%2C70.8%201043.1%2C69%201046.9%2C71%201051.9%2C71%201063.1%2C67.3%201070.9%2C67.5%201079.1%2C71%201086.9%2C71.8%201094.1%2C69.8%201099.4%2C66%201107.1%2C64.8%201114.4%2C66%201117.9%2C68.8%201129.9%2C72.5%201138.6%2C70.8%201144.6%2C68%201161.1%2C68%201167.4%2C70.5%201172.9%2C71%201175.4%2C70%201180.1%2C71.5%201192.6%2C68.8%201199.9%2C70.5%201240%2C70.5%201240%2C-40%20-40%2C-40%27%20fill%3D%27%23fff%27%2F%3E%3C%2Fsvg%3E");
  mask-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%201200%20120%27%20preserveAspectRatio%3D%27none%27%3E%3Cpolygon%20points%3D%27-40%2C64.5%200.1%2C64.5%2019.4%2C68.3%2026.1%2C67.5%2033.4%2C63%2038.1%2C62%2041.4%2C62.3%2045.6%2C64.8%2053.6%2C63.8%2072.9%2C65.3%2076.6%2C64.3%2084.4%2C65%2090.6%2C62.8%20108.9%2C62.8%20118.9%2C66.5%20134.1%2C64.3%20149.6%2C68.3%20158.4%2C64.8%20162.4%2C66.5%20177.6%2C65.5%20200.9%2C66.8%20215.1%2C64%20225.6%2C66%20245.6%2C65%20256.9%2C67.8%20261.4%2C65.5%20265.6%2C66%20270.9%2C63.8%20279.1%2C65.8%20283.9%2C64.8%20296.4%2C65.5%20312.1%2C62.5%20325.1%2C67.3%20342.4%2C64.3%20355.4%2C66.8%20365.9%2C67%20377.9%2C63%20383.6%2C66%20392.1%2C68%20406.1%2C66.3%20414.9%2C68.3%20425.1%2C66.3%20445.6%2C67.5%20460.6%2C63.8%20470.9%2C65%20480.1%2C68.8%20514.9%2C65.8%20524.9%2C69.3%20542.6%2C70.8%20550.9%2C69%20558.1%2C65%20563.4%2C65.8%20571.4%2C63.8%20580.6%2C66.5%20599.4%2C66.8%20609.6%2C70.3%20615.4%2C70.8%20625.4%2C70.3%20630.6%2C67.5%20637.4%2C66.5%20651.1%2C65.8%20655.9%2C66.8%20663.9%2C64.3%20671.9%2C67.3%20676.9%2C66.8%20683.1%2C68.8%20702.4%2C69.8%20709.1%2C68.3%20729.9%2C68.3%20750.6%2C64.3%20761.9%2C67.5%20774.9%2C67.3%20783.4%2C64%20788.9%2C63.8%20805.9%2C67.3%20811.4%2C70.3%20817.6%2C71.3%20830.6%2C68.8%20842.6%2C71.8%20848.4%2C69%20865.4%2C65.3%20873.6%2C70%20881.1%2C70.3%20896.1%2C68%20904.6%2C70.3%20915.4%2C70.5%20934.9%2C66.3%20950.9%2C67.3%20955.6%2C68.8%20959.6%2C68.3%20965.9%2C70.3%20978.6%2C68.8%20984.4%2C66.8%20993.9%2C66.3%201000.9%2C69.5%201015.9%2C72.3%201026.9%2C69.5%201038.4%2C70.8%201043.1%2C69%201046.9%2C71%201051.9%2C71%201063.1%2C67.3%201070.9%2C67.5%201079.1%2C71%201086.9%2C71.8%201094.1%2C69.8%201099.4%2C66%201107.1%2C64.8%201114.4%2C66%201117.9%2C68.8%201129.9%2C72.5%201138.6%2C70.8%201144.6%2C68%201161.1%2C68%201167.4%2C70.5%201172.9%2C71%201175.4%2C70%201180.1%2C71.5%201192.6%2C68.8%201199.9%2C70.5%201240%2C70.5%201240%2C-40%20-40%2C-40%27%20fill%3D%27%23fff%27%2F%3E%3C%2Fsvg%3E")}

/* rag UP, opaque BOTTOM. Child of the (unmasked) cream zone, bottom:-1px. */
.tstrip--up2{position:absolute;bottom:-1px;top:auto;transform:none;
  filter:var(--tear-sh-up);
  -webkit-mask-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%201200%20120%27%20preserveAspectRatio%3D%27none%27%3E%3Cpolygon%20points%3D%27-40%2C57.5%200.1%2C57.5%204.6%2C57.8%2014.9%2C54.3%2021.9%2C54.5%2028.4%2C51.8%2044.9%2C54%2049.1%2C51.5%2056.6%2C51.8%2068.1%2C49.3%2076.1%2C49.5%2084.9%2C54%20119.6%2C54%20127.1%2C50%20149.4%2C46.3%20156.1%2C48.5%20164.1%2C47.3%20172.9%2C48.5%20178.6%2C51.5%20188.6%2C49%20197.4%2C52.3%20206.4%2C51%20213.4%2C47.5%20225.6%2C46.8%20230.9%2C45.3%20243.4%2C48.8%20250.4%2C47%20257.6%2C48%20279.6%2C47.3%20286.9%2C43%20291.1%2C42.5%20296.6%2C42.5%20304.6%2C46.5%20312.4%2C44.5%20319.4%2C46.3%20326.4%2C42.5%20330.4%2C41.8%20336.4%2C43.3%20344.6%2C42%20351.4%2C45.3%20363.9%2C46.5%20372.4%2C49%20392.9%2C45.3%20399.4%2C47%20411.1%2C41.3%20422.6%2C39%20441.4%2C41.3%20446.1%2C38.8%20463.6%2C35%20469.4%2C35.8%20482.9%2C41.5%20488.6%2C41.5%20496.1%2C44.3%20503.4%2C41%20512.9%2C40.3%20526.1%2C44.5%20539.9%2C43%20547.1%2C45.3%20556.1%2C45.3%20570.1%2C36.3%20577.9%2C37.8%20591.6%2C37%20598.9%2C39.3%20608.4%2C39%20619.9%2C36.3%20632.1%2C41.3%20635.9%2C41.5%20644.6%2C39%20651.1%2C39%20662.9%2C33.3%20669.6%2C35.5%20682.4%2C34.5%20692.9%2C39.5%20707.9%2C42.8%20716.4%2C41%20724.1%2C36.3%20731.6%2C37.3%20743.9%2C42.3%20757.1%2C40%20761.9%2C41.3%20776.6%2C40%20799.4%2C35.3%20807.6%2C36%20811.1%2C35%20828.4%2C23.5%20837.6%2C23%20841.4%2C23.5%20845.9%2C26%20852.9%2C26.8%20857.6%2C30%20867.6%2C32.3%20871.6%2C35.8%20875.4%2C36.5%20889.1%2C31.5%20895.9%2C32%20901.1%2C30.8%20908.1%2C31.8%20930.1%2C27.3%20939.4%2C26.8%20953.4%2C28.8%20970.1%2C26.3%20978.6%2C30%20989.1%2C30%20998.1%2C27.8%201012.9%2C21.5%201025.6%2C21.5%201034.6%2C25%201048.4%2C25%201054.9%2C27%201063.1%2C26%201069.4%2C28.5%201086.9%2C29.5%201095.4%2C26.5%201100.6%2C27.3%201113.4%2C25.3%201121.6%2C25.5%201124.4%2C24%201144.1%2C22%201165.6%2C23.8%201180.4%2C28%201199.9%2C21.3%201240%2C21.3%201240%2C160%20-40%2C160%27%20fill%3D%27%23fff%27%2F%3E%3C%2Fsvg%3E");
  mask-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%201200%20120%27%20preserveAspectRatio%3D%27none%27%3E%3Cpolygon%20points%3D%27-40%2C57.5%200.1%2C57.5%204.6%2C57.8%2014.9%2C54.3%2021.9%2C54.5%2028.4%2C51.8%2044.9%2C54%2049.1%2C51.5%2056.6%2C51.8%2068.1%2C49.3%2076.1%2C49.5%2084.9%2C54%20119.6%2C54%20127.1%2C50%20149.4%2C46.3%20156.1%2C48.5%20164.1%2C47.3%20172.9%2C48.5%20178.6%2C51.5%20188.6%2C49%20197.4%2C52.3%20206.4%2C51%20213.4%2C47.5%20225.6%2C46.8%20230.9%2C45.3%20243.4%2C48.8%20250.4%2C47%20257.6%2C48%20279.6%2C47.3%20286.9%2C43%20291.1%2C42.5%20296.6%2C42.5%20304.6%2C46.5%20312.4%2C44.5%20319.4%2C46.3%20326.4%2C42.5%20330.4%2C41.8%20336.4%2C43.3%20344.6%2C42%20351.4%2C45.3%20363.9%2C46.5%20372.4%2C49%20392.9%2C45.3%20399.4%2C47%20411.1%2C41.3%20422.6%2C39%20441.4%2C41.3%20446.1%2C38.8%20463.6%2C35%20469.4%2C35.8%20482.9%2C41.5%20488.6%2C41.5%20496.1%2C44.3%20503.4%2C41%20512.9%2C40.3%20526.1%2C44.5%20539.9%2C43%20547.1%2C45.3%20556.1%2C45.3%20570.1%2C36.3%20577.9%2C37.8%20591.6%2C37%20598.9%2C39.3%20608.4%2C39%20619.9%2C36.3%20632.1%2C41.3%20635.9%2C41.5%20644.6%2C39%20651.1%2C39%20662.9%2C33.3%20669.6%2C35.5%20682.4%2C34.5%20692.9%2C39.5%20707.9%2C42.8%20716.4%2C41%20724.1%2C36.3%20731.6%2C37.3%20743.9%2C42.3%20757.1%2C40%20761.9%2C41.3%20776.6%2C40%20799.4%2C35.3%20807.6%2C36%20811.1%2C35%20828.4%2C23.5%20837.6%2C23%20841.4%2C23.5%20845.9%2C26%20852.9%2C26.8%20857.6%2C30%20867.6%2C32.3%20871.6%2C35.8%20875.4%2C36.5%20889.1%2C31.5%20895.9%2C32%20901.1%2C30.8%20908.1%2C31.8%20930.1%2C27.3%20939.4%2C26.8%20953.4%2C28.8%20970.1%2C26.3%20978.6%2C30%20989.1%2C30%20998.1%2C27.8%201012.9%2C21.5%201025.6%2C21.5%201034.6%2C25%201048.4%2C25%201054.9%2C27%201063.1%2C26%201069.4%2C28.5%201086.9%2C29.5%201095.4%2C26.5%201100.6%2C27.3%201113.4%2C25.3%201121.6%2C25.5%201124.4%2C24%201144.1%2C22%201165.6%2C23.8%201180.4%2C28%201199.9%2C21.3%201240%2C21.3%201240%2C160%20-40%2C160%27%20fill%3D%27%23fff%27%2F%3E%3C%2Fsvg%3E")}
@media(max-width:640px){.tstrip--perf{height:16px}}

/* ============================================================
   PRINTED-PAPER LAYER — procedural paper + tiled torn edges
   ------------------------------------------------------------
   Copied from assets/teardown-im8.css (the "PRINTED-PAPER LAYER v2" block).
   This is what makes a small element read as a torn-off PAPER SLIP rather than
   a card with a jagged border, and it is a different mechanism from the
   full-width .tstrip zone tears above:

   PROCEDURAL PAPER — two generated SVG noise layers over flat white: fine
     clamped grain (--pp-grain-w) plus hard-thresholded sparse specks
     (--pp-speck-w), composited `multiply` so the dots read as ink flecks in
     the stock. Per-element --pp-gp / --pp-sp offsets de-duplicate the pattern
     between neighbouring pieces.
   TILED TEARS — a torn edge is a SEAMLESS REPEATING TILE, not one SVG
     stretched along the edge: a fixed physical tile (300px along the edge,
     48px band) whose turbulence used stitchTiles='stitch', so the rag returns
     to the same coordinate at both tile ends and repeats without a seam.
     mask-repeat repeat-y (vertical edges, --tv-*) or repeat-x (horizontal,
     --tx-*) with a FIXED px mask-size on the edge axis, so rag DENSITY is
     identical on a 90px slip and a 1200px strip. Compare the zone .tstrip
     masks, which stretch one polygon across the full width on purpose.
   TEAR-AMP — a torn side reserves --tear-amp of extra padding so no rag point
     can eat content (rag amplitude ≈ band/2).
   MASK CLIPS ITS OWN SHADOW — a mask on the slip clips the slip's
     drop-shadow to the slip box, so the shadow must come from an unmasked
     wrapper (.card-sh / .tear-sh-w / .slip-sh).
   ============================================================ */
:root{
  --pp-grain-w:url("data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27220%27%20height%3D%27220%27%3E%3Cfilter%20id%3D%27g%27%20x%3D%270%27%20y%3D%270%27%20width%3D%27100%25%27%20height%3D%27100%25%27%3E%3CfeTurbulence%20type%3D%27fractalNoise%27%20baseFrequency%3D%270.95%27%20numOctaves%3D%272%27%20seed%3D%277%27%20stitchTiles%3D%27stitch%27%2F%3E%3CfeColorMatrix%20type%3D%27saturate%27%20values%3D%270%27%2F%3E%3CfeComponentTransfer%3E%3CfeFuncR%20type%3D%27linear%27%20slope%3D%271.0%27%20intercept%3D%270.5%27%2F%3E%3CfeFuncG%20type%3D%27linear%27%20slope%3D%271.0%27%20intercept%3D%270.5%27%2F%3E%3CfeFuncB%20type%3D%27linear%27%20slope%3D%271.0%27%20intercept%3D%270.5%27%2F%3E%3CfeFuncA%20type%3D%27linear%27%20slope%3D%270%27%20intercept%3D%270.52%27%2F%3E%3C%2FfeComponentTransfer%3E%3C%2Ffilter%3E%3Crect%20width%3D%27100%25%27%20height%3D%27100%25%27%20filter%3D%27url%28%23g%29%27%2F%3E%3C%2Fsvg%3E");
  --pp-speck-w:url("data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%27300%27%20height%3D%27300%27%3E%3Cfilter%20id%3D%27s%27%20x%3D%270%27%20y%3D%270%27%20width%3D%27100%25%27%20height%3D%27100%25%27%3E%3CfeTurbulence%20type%3D%27fractalNoise%27%20baseFrequency%3D%270.46%27%20numOctaves%3D%273%27%20seed%3D%2710%27%20stitchTiles%3D%27stitch%27%2F%3E%3CfeColorMatrix%20type%3D%27saturate%27%20values%3D%270%27%2F%3E%3CfeComponentTransfer%3E%3CfeFuncR%20type%3D%27discrete%27%20tableValues%3D%270%200%200%200%200%200%200%200%200%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%27%2F%3E%3CfeFuncG%20type%3D%27discrete%27%20tableValues%3D%270%200%200%200%200%200%200%200%200%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%27%2F%3E%3CfeFuncB%20type%3D%27discrete%27%20tableValues%3D%270%200%200%200%200%200%200%200%200%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%201%27%2F%3E%3CfeFuncA%20type%3D%27linear%27%20slope%3D%270%27%20intercept%3D%270.64%27%2F%3E%3C%2FfeComponentTransfer%3E%3C%2Ffilter%3E%3Crect%20width%3D%27100%25%27%20height%3D%27100%25%27%20filter%3D%27url%28%23s%29%27%2F%3E%3C%2Fsvg%3E");
  --pp-g-size:304px 304px;--pp-s-size:280px 280px;
  --tear-amp:26px;
  /* vertical torn tiles (48x300, repeat-y) — left and right short ends */
  --tv-l2:url("data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2048%20300%27%20preserveAspectRatio%3D%27none%27%3E%3Cpolygon%20points%3D%2724%2C-40%2024%2C0.1%2024.5%2C11.4%2023.8%2C26.1%2025.3%2C37.4%2025%2C49.1%2025.8%2C56.6%2025.3%2C57.1%2025.3%2C59.1%2022.8%2C62.6%2022.5%2C68.9%2023.5%2C74.6%2023.5%2C80.1%2026.3%2C89.4%2026.8%2C99.4%2026.3%2C105.9%2024.8%2C111.1%2023.8%2C117.4%2023.5%2C134.1%2024.5%2C146.1%2023.8%2C150.4%2023.3%2C150.9%2021.5%2C157.4%2021%2C161.4%2021%2C164.9%2022.3%2C167.9%2022.8%2C168.1%2024%2C173.9%2024%2C179.4%2023.3%2C183.6%2023.8%2C194.6%2023.5%2C207.1%2025.3%2C216.4%2023.3%2C232.1%2023.8%2C239.4%2024.8%2C243.6%2024.8%2C248.4%2021%2C262.9%2020.8%2C269.1%2021.3%2C269.4%2021.3%2C270.4%2020.8%2C271.6%2021.3%2C271.9%2020.8%2C272.1%2021%2C276.4%2020.5%2C276.6%2021.5%2C280.6%2021%2C281.1%2022%2C283.4%2023.4%2C290.4%2024%2C299.9%2024%2C340%2088%2C340%2088%2C-40%27%20fill%3D%27%23fff%27%2F%3E%3C%2Fsvg%3E");
  --tv-r1:url("data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2048%20300%27%20preserveAspectRatio%3D%27none%27%3E%3Cpolygon%20points%3D%2727.8%2C-40%2027.8%2C0.1%2027.8%2C8.6%2028.5%2C17.1%2028%2C22.1%2026%2C31.9%2025.8%2C36.4%2026.8%2C40.9%2026.8%2C43.9%2026%2C49.4%2023.5%2C54.1%2023%2C56.6%2023.3%2C69.1%2022.8%2C72.4%2022.8%2C76.9%2023.3%2C79.4%2023%2C90.6%2023.8%2C94.9%2023.3%2C104.9%2024.5%2C116.4%2025.5%2C120.4%2025%2C132.6%2025.8%2C136.1%2025.3%2C140.4%2026%2C143.6%2026.5%2C143.9%2026.3%2C144.9%2027%2C146.1%2027.3%2C148.9%2025.3%2C159.1%2025.5%2C160.4%2025.3%2C162.6%2024.8%2C162.9%2025%2C163.9%2024.3%2C169.4%2023.5%2C171.1%2023.8%2C171.6%2023.3%2C171.9%2024%2C177.4%2023%2C186.1%2024%2C194.1%2024.8%2C196.1%2025.3%2C204.6%2024.5%2C211.9%2023.8%2C214.9%2022.8%2C216.4%2022%2C220.6%2022%2C226.4%2022.8%2C227.4%2023.5%2C230.1%2023.5%2C234.1%2022.8%2C241.1%2021%2C249.1%2021.5%2C272.4%2022.3%2C275.4%2024%2C277.9%2024.5%2C283.4%2025.5%2C286.9%2027.3%2C290.1%2027.9%2C294.6%2027.8%2C299.9%2027.8%2C340%20-40%2C340%20-40%2C-40%27%20fill%3D%27%23fff%27%2F%3E%3C%2Fsvg%3E");
}

/* ============================================================
   .we-paper — THE CANONICAL TORN-PAPER CARD. USE THIS.
   ------------------------------------------------------------
   ⛔ READ THIS BEFORE ADDING A CARD TO ANY PAGE IN THIS THEME.

   Chey, 2026-08-28 (screen-capture review): "this is very much like AI
   styled… I would rather these be like the same as this [the torn paper
   cards] — paper cards with black text and the yellow underlines is
   awesome… we can match our brand style a lot more closely." And: "I want
   you to identify where that is coming from and nip that in the bud so
   that it's not happening anymore… so that when future agents spin up
   pages, it's just correct from the get go."

   WHERE THE "AI STYLING" COMES FROM. Nothing in this theme ever defined a
   reusable CARD. The chassis shipped tokens, zones, tears and .statbar, so
   every new page invented its own container from the generic tokens — and
   the generic-token shape is exactly the industry-default SaaS panel:
       border:1px solid var(--line); border-radius:14px;
       background:linear-gradient(168deg,#0c1119,#080b11);
       + a blue uppercase micro-label
   That is the tell. It is not wrong CSS, it is the WRONG BRAND: this theme's
   cards are physical torn sheets of paper with black ink and a highlighter.
   The fix is a primitive that is easier to reach for than the panel, which
   is what this block is.

   HOW TO USE IT
     <div class="card-sh" style="--pp-gp:10px 24px;--pp-sp:50px 12px">
       <div class="we-paper my-card">…</div>
     </div>
   RULES (each one is a bug someone already shipped):
     · ALWAYS wrap it in .card-sh — a mask CLIPS the element's own
       drop-shadow, so the shadow must come from an unmasked wrapper.
     · Horizontal padding must be >= var(--tear-amp) or text lands in the rag.
     · Give every instance its own --pp-gp / --pp-sp so no two sheets share a
       grain origin (identical noise reads as a repeated texture, not paper).
     · Ink on paper is BLACK (var(--pi)), never --blue or --brand-ink: brand
       blue is 2.07:1 on cream and the darkened --brand-ink is 3.96:1, which
       fails the 4.5:1 body-text bar. Emphasis is the <mark> highlighter.
     · A tiny uppercase mono label is fine; a BLUE one is the AI tell.

   Mechanism: procedural stock (two generated noise layers composited
   multiply over white) with the two SHORT ends torn by the tiled
   --tv-l2 / --tv-r1 masks and everything between filled by a gradient mask,
   so the long top/bottom edges stay cut straight — what a strip torn off a
   wider sheet actually looks like. Same recipe as .statbar below.

   `.pl-paper` is the historical alias from sections/peptide_letter, the page
   this was extracted from (verified in production pixels). It is kept on the
   selector so that page needs no rewrite; NEW pages use .we-paper.
   ============================================================ */
.we-paper,.pl-paper{
  position:relative;
  /* ink tokens for anything sitting ON the paper */
  --pi:#141109;--pi-soft:#3a3327;--pi-faint:#6a6153;--pi-rule:rgba(30,22,10,.2);
  background:var(--pp-speck-w) var(--pp-sp,0 0)/var(--pp-s-size) repeat,
             var(--pp-grain-w) var(--pp-gp,0 0)/var(--pp-g-size) repeat #fff;
  background-blend-mode:multiply,multiply;
  -webkit-mask-image:var(--tv-l2),var(--tv-r1),linear-gradient(#000,#000);
  mask-image:var(--tv-l2),var(--tv-r1),linear-gradient(#000,#000);
  -webkit-mask-repeat:repeat-y,repeat-y,no-repeat;mask-repeat:repeat-y,repeat-y,no-repeat;
  -webkit-mask-size:48px 300px,48px 300px,calc(100% - 92px) 100%;
  mask-size:48px 300px,48px 300px,calc(100% - 92px) 100%;
  -webkit-mask-position:left top,right top,center;mask-position:left top,right top,center}

/* THE HIGHLIGHTER — the theme's emphasis device on paper. Sits under the
   baseline like a real marker pass rather than colouring the text, so the
   words stay black and legible. box-decoration-break:clone so a phrase that
   wraps is highlighted on EVERY line, not just the first. */
.we-paper mark,.pl-paper mark,mark.we-hl{
  background:linear-gradient(transparent 62%,rgba(255,196,84,.62) 62%);
  color:#141109;font-style:normal;font-weight:600;padding:0 1px;
  -webkit-box-decoration-break:clone;box-decoration-break:clone}

/* ============================================================
   WHICH EDGES TEAR — the rule, decided in review 2026-08-28
   ------------------------------------------------------------
   Chey: "We're overusing the type of card with the tear on the left and
   right — this is for cards that are horizontally wide and vertically thin,
   like a tape. The others should be a card with a tear on the bottom."

   So the two tear treatments are NOT interchangeable:

     LEFT + RIGHT  (.we-paper, bare)  → TAPE ONLY.
       A strip torn off a roll: wide, thin, a line or two of text. Its long
       top/bottom edges are the roll's own width, so they stay cut straight
       and only the short ends rag. Use for: an emphasised phrase behind a
       headline, a one-line memo strip, a label.

     BOTTOM ONLY   (.we-paper.we-paper--btm) → EVERY REAL CARD.
       A sheet torn off a pad: the bottom is where it separated, the other
       three edges are the pad's own trimmed edges. Use for: quote cards,
       feature cards, callouts, summaries — anything with a paragraph in it.

   Putting the tape treatment on a tall card is what made this page's six
   ledger cards and six feature cards read as one repeated stamp.
   ============================================================ */

/* ---- BOTTOM-TORN SHEET ----------------------------------------------------
   `--tx-card` is the canonical 300x48 horizontal rag tile (the same
   turbulence-derived artwork the teardown index uses for --tx1). The polygon
   fills everything ABOVE the rag line, so as a mask it keeps the sheet opaque
   and lets the rag eat UPWARD into the bottom edge.

   ⚠️ padding-bottom on the consumer must be >= var(--tx-h) or the last line
   of text sits in the rag. Use calc(<pad> + var(--tx-h)).
   ⚠️ Still needs the unmasked .card-sh wrapper for its shadow. */
.we-paper--btm,.pl-paper--btm{
  --tx-card:url("data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%20300%2048%27%20preserveAspectRatio%3D%27none%27%3E%3Cpolygon%20points%3D%27-40%2C23.8%200.1%2C23.8%2023.4%2C23.8%2028.9%2C23%2039.6%2C23%2050.4%2C21.5%2070.6%2C21.5%2081.9%2C23.3%2096.4%2C24.3%2097.1%2C23.8%20103.9%2C22.8%20115.6%2C22.8%20122.1%2C21%20135.6%2C19.5%20146.9%2C19.8%20151.4%2C19.3%20156.1%2C19.5%20165.1%2C21.5%20175.9%2C21.3%20181.1%2C19.8%20191.1%2C21.5%20208.1%2C22%20216.4%2C22%20222.4%2C21%20234.9%2C20.5%20243.1%2C21%20246.4%2C20.5%20246.9%2C21%20249.1%2C20.3%20251.6%2C20.5%20255.6%2C19.8%20265.6%2C19.3%20268.9%2C19.5%20271.9%2C20.5%20273.1%2C21.5%20275.9%2C22%20283.9%2C22.5%20287.4%2C23.5%20291.9%2C23.3%20299.9%2C23.8%20340%2C23.8%20340%2C-40%20-40%2C-40%27%20fill%3D%27%23fff%27%2F%3E%3C%2Fsvg%3E");
  --tx-w:300px;--tx-h:48px;--tx-x:0px;
  -webkit-mask-image:var(--tx-card),linear-gradient(#000,#000);
  mask-image:var(--tx-card),linear-gradient(#000,#000);
  -webkit-mask-repeat:repeat-x,no-repeat;mask-repeat:repeat-x,no-repeat;
  -webkit-mask-size:var(--tx-w) var(--tx-h),100% calc(100% - var(--tx-h) + 2px);
  mask-size:var(--tx-w) var(--tx-h),100% calc(100% - var(--tx-h) + 2px);
  -webkit-mask-position:var(--tx-x) bottom,left top;
  mask-position:var(--tx-x) bottom,left top;
  /* ⚠️ HAIRLINE UNDER THE RAG. Without this clip a razor-thin warm line —
     the paper's own background at low alpha — renders a few px above the
     element's bottom edge, well below the rag. It is invisible on cream and
     obvious on the dark zones (seen on every bottom-torn card in production).
     The rag's DEEPEST excursion is at 60% of the tile, i.e. 0.4 * --tx-h above
     the bottom, so clipping 0.3 * --tx-h can never reach the artwork while
     still removing the band. clip-path resolves in the element's own border
     box, so it stays parallel to the card even with the nth-child tilts. */
  clip-path:inset(0 0 calc(var(--tx-h) * .3) 0)}

/* ---- TEAR VARIETY -------------------------------------------------------
   Chey: "We need variety in the tears on the cards, as it stands, they're all
   identical." One tile, four treatments: the rag is re-SCALED (tile width
   250-460px is a 1.8x range, so the peaks are visibly coarser or finer),
   re-PHASED (a different slice of the artwork starts at the left edge), and
   re-DEEPED (--tx-h). No two adjacent cards should carry the same letter.
   Cheaper and more convincing than four near-identical hand-drawn rags. */
.we-tear-a{--tx-w:300px;--tx-h:48px;--tx-x:0px}
.we-tear-b{--tx-w:395px;--tx-h:36px;--tx-x:-125px}
.we-tear-c{--tx-w:250px;--tx-h:54px;--tx-x:-62px}
.we-tear-d{--tx-w:460px;--tx-h:42px;--tx-x:-215px}

/* ---- STATBAR → ONE LONG WHITE TORN-PAPER STRIP, torn short ends ----
   Verbatim from teardown-im8.css (base .statbar + the printed-paper override).
   The left/right short ends are torn (--tv-l2 / --tv-r1 tiled repeat-y); the
   long top and bottom edges are cut straight, which is what a strip ripped off
   a wider sheet actually looks like. The centre gradient mask fills everything
   between the two 46px rag bands. `rotate:-.4deg` is the hand-placed tilt.
   Its wrapper (.card-sh) carries the shadow — see MASK CLIPS ITS OWN SHADOW. */
.statbar{display:grid;grid-template-columns:repeat(6,1fr);margin-top:44px;
  gap:0;border:0;border-radius:0;overflow:visible;box-shadow:none;position:relative;
  background:var(--pp-speck-w) var(--pp-sp,0 0)/var(--pp-s-size) repeat,
             var(--pp-grain-w) var(--pp-gp,0 0)/var(--pp-g-size) repeat #fff;
  background-blend-mode:multiply,multiply;
  rotate:-.4deg;padding-inline:var(--tear-amp);
  -webkit-mask-image:var(--tv-l2),var(--tv-r1),linear-gradient(#000,#000);
  mask-image:var(--tv-l2),var(--tv-r1),linear-gradient(#000,#000);
  -webkit-mask-repeat:repeat-y,repeat-y,no-repeat;mask-repeat:repeat-y,repeat-y,no-repeat;
  -webkit-mask-size:48px 300px,48px 300px,calc(100% - 92px) 100%;
  mask-size:48px 300px,48px 300px,calc(100% - 92px) 100%;
  -webkit-mask-position:left top,right top,center;mask-position:left top,right top,center}
.statbar .stat{background:none;padding:18px 20px;position:relative}
/* hairline rule between cells instead of the grid-gap trick a bordered card
   uses — a gap would show the dark page through the paper. */
.statbar .stat + .stat::before{content:"";position:absolute;left:0;top:24%;bottom:24%;
  width:1px;background:rgba(30,22,10,.16)}
.statbar .stat .n{color:#141109;font-size:clamp(1.45rem,2.7vw,1.85rem)}
.statbar .stat .l{color:#4a4234;font-size:.6rem}
/* the accent glyph is ink at 47% on paper — brand blue on white is ~2:1 */
.statbar .stat .n .u,.stat .n .u{color:#141109;opacity:.47}

/* CLEARANCE helpers — a cream edge that receives the deep up2 rag must clear
   the rag's overhang (the up2 polygon's deepest tooth reaches ~82% of --tear-h
   above the boundary) so no tooth lands within ~40px of text. */
.tear-clear-top{padding-top:var(--tear-gap-light)}
/* overhang (~82% of --tear-h) PLUS the canonical cream→rag gap, so the deepest
   tooth still clears content by --tear-gap-light instead of grazing it */
.tear-clear-bottom{padding-bottom:calc(var(--tear-h) * .82 + var(--tear-gap-light))}
.tear-recv-dark{padding-top:var(--tear-gap-dark)}
