/* =============================================================================
   THE PULSE — interactive UI (email capture today; reactions / polls later).

   Additive, Pulse-only. Linked AFTER brand.css, so it reuses the kit's :root
   tokens (--obsidian, --linen, --bronze, --spectrum, …) but is NOT the governed
   kit — interactive chrome stays out of the brand drift guard (vault §31), the
   same way beat-burst.css does. Fonts are hardcoded (the kit defines no font
   vars — §35).
   ============================================================================= */

/* ---- "Get the Pulse" capture band (between hero and feed) ----------------- */
.pjoin { max-width: 680px; margin: 6px auto 30px; padding: 0 22px; }

.pjoin-inner {
  position: relative; overflow: hidden;
  border: 1px solid var(--line); border-radius: 16px;
  background: var(--panel); padding: 26px 24px 22px;
}
.pjoin-inner::before {            /* a shimmering hairline of the brand spectrum along the top edge */
  content: ""; position: absolute; left: 0; right: 0; top: 0; height: 2px;
  background-image: var(--spectrum); background-size: 300% auto; opacity: .9;
  animation: drift-af 20s linear infinite;
}

.pjoin-eyebrow {
  margin: 0 0 10px; color: var(--bronze);
  font: 600 11px/1 "Inter", sans-serif; letter-spacing: .18em; text-transform: uppercase;
}
.pjoin-h { margin: 0 0 6px; color: var(--linen); font: 400 26px/1.15 "DM Serif Display", Georgia, serif; }
.pjoin-sub { margin: 0 0 16px; color: var(--muted); font: 400 15px/1.5 "Inter", sans-serif; }

.pjoin-row { display: flex; gap: 10px; }
.pjoin-email {
  flex: 1; min-width: 0;
  background: var(--obsidian); border: 1px solid var(--line); border-radius: 10px;
  padding: 12px 14px; color: var(--linen);
  font: 400 15px/1.2 "Inter", sans-serif; outline: none; transition: border-color .15s;
}
.pjoin-email::placeholder { color: var(--stone); }
.pjoin-email:focus { border-color: var(--bronze); }

.pjoin-btn {
  flex: 0 0 auto; border: 0; border-radius: 10px; padding: 12px 20px; cursor: pointer;
  color: var(--obsidian); background: var(--linen);
  font: 600 14px/1.2 "Inter", sans-serif; letter-spacing: .02em;
  transition: transform .12s, opacity .15s;
}
.pjoin-btn:hover { transform: translateY(-1px); }
.pjoin-btn:disabled { opacity: .55; cursor: default; transform: none; }

.pjoin-fine {
  margin: 12px 0 0; text-align: center;
  color: var(--stone); font: 400 13px/1.45 "Inter", sans-serif;
}

.pjoin-hp { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }

.pjoin-msg { margin: 12px 0 0; min-height: 1.2em; font: 400 14px/1.4 "Inter", sans-serif; }
.pjoin-msg.ok  { color: #8FC53A; }
.pjoin-msg.err { color: #E2631F; }

/* shimmering heart — opt-in success ♥ (vault CLAUDE.md §37). Markup forces text
   presentation (VS-15) so the spectrum clip tints it, not the OS RED emoji.
   Identical rule across every surface's additive layer; uses kit globals only. */
.hrt{background-image:var(--spectrum);background-size:300% auto;-webkit-background-clip:text;background-clip:text;
  color:transparent;-webkit-text-fill-color:transparent;animation:drift-af 20s linear infinite}
@media (prefers-reduced-motion:reduce){.hrt{animation:none}}

/* the BodySatva cross-link uses the house arrow → (was the generic up-right ↗);
   nudge it horizontally on hover to match the → behaviour everywhere else (overrides
   the kit's old diagonal nudge; loaded after brand.css). */
.pulse-stream .bodysatva:hover .arr{transform:translateX(3px)}

/* on success the inputs retire, leaving just the confirmation line */
.pjoin-form.done .pjoin-row,
.pjoin-form.done .pjoin-fine { display: none; }

@media (max-width: 480px) {
  .pjoin-row { flex-direction: column; }
  .pjoin-btn { width: 100%; }
}

/* ---- OBSESSION beat — a milestone "scoreboard" go-wild card (added 2026-06-06)
   The build-in-public stats story: bounce -> 6 days -> three numbers -> kicker.
   Centered, spectrum-lit, a soft radial bloom like the big-bang. Numbers are shown
   directly (no count-up) so a scroll-past reader gets them instantly; the spectrum
   drift carries the life. Reuses kit tokens; fonts hardcoded (§35). ----------- */
.pulse-stream .beat.obsession{
  text-align:center;overflow:hidden;border-color:var(--line2);padding:42px 26px 36px;
  background:radial-gradient(120% 80% at 50% 30%, rgba(176,128,48,.10), rgba(20,19,16,0) 62%), var(--panel);
}
.pulse-stream .beat.obsession .beat-meta{justify-content:center}
.pulse-stream .beat.obsession .beat-body{font-family:inherit;font-size:inherit;line-height:inherit;color:inherit}

.pulse-stream .beat.obsession .obs-eyebrow{
  margin:0;font-family:"Inter",sans-serif;font-size:10.5px;letter-spacing:.3em;
  text-transform:uppercase;color:var(--bronze)}
.pulse-stream .beat.obsession .obs-bounce{
  margin:22px auto 0;max-width:30ch;font-family:"Cormorant Garamond",serif;font-style:italic;
  font-size:clamp(18px,3.6vw,22px);line-height:1.55;color:var(--stone);text-wrap:balance}
.pulse-stream .beat.obsession .obs-bounce .obs-return{color:var(--shell)}

.pulse-stream .beat.obsession .obs-daylead{
  margin:34px 0 6px;font-family:"Inter",sans-serif;font-size:10px;letter-spacing:.28em;
  text-transform:uppercase;color:var(--muted)}
.pulse-stream .beat.obsession .obs-day{
  margin:0;line-height:.9;font-family:"DM Serif Display",serif;font-style:italic;
  font-size:clamp(64px,17vw,116px);letter-spacing:.01em;
  background-image:var(--spectrum);background-size:300% auto;-webkit-background-clip:text;
  background-clip:text;color:transparent;-webkit-text-fill-color:transparent;animation:drift-af 20s linear infinite}
.pulse-stream .beat.obsession .obs-day .obs-days{font-size:.34em;letter-spacing:.02em}

.pulse-stream .beat.obsession .obs-stats{
  display:flex;justify-content:center;flex-wrap:nowrap;margin:34px auto 0;max-width:560px;
  border-top:1px solid var(--line);border-bottom:1px solid var(--line)}
.pulse-stream .beat.obsession .obs-stat{
  flex:1 1 0;min-width:0;padding:22px 8px;position:relative}
.pulse-stream .beat.obsession .obs-stat + .obs-stat::before{
  content:"";position:absolute;left:0;top:22%;height:56%;width:1px;background:var(--line)}
.pulse-stream .beat.obsession .obs-n{
  display:block;font-family:"DM Serif Display",serif;font-style:italic;
  font-size:clamp(28px,7vw,48px);line-height:1;color:var(--linen);font-variant-numeric:tabular-nums}
.pulse-stream .beat.obsession .obs-l{
  display:block;margin-top:12px;font-family:"Inter",sans-serif;font-size:9.5px;
  letter-spacing:.2em;text-transform:uppercase;color:var(--bronze)}

.pulse-stream .beat.obsession .obs-texture{
  margin:28px auto 0;max-width:34ch;font-family:"Cormorant Garamond",serif;font-style:italic;
  font-size:clamp(15px,2.8vw,18px);line-height:1.5;color:var(--muted);text-wrap:balance}
.pulse-stream .beat.obsession .obs-texture b{
  color:var(--shell);font-style:normal;font-family:"Inter",sans-serif;font-weight:600;font-size:.9em}

.pulse-stream .beat.obsession .obs-kicker{
  margin:44px auto 0;font-family:"DM Serif Display",serif;font-style:italic;
  font-size:clamp(30px,6.4vw,52px);line-height:1.06;letter-spacing:.005em;
  background-image:var(--spectrum);background-size:300% auto;-webkit-background-clip:text;
  background-clip:text;color:transparent;-webkit-text-fill-color:transparent;animation:drift-af 20s linear infinite}
.pulse-stream .beat.obsession .obs-kicker .obs-love{display:block;margin-top:4px;
  -webkit-text-fill-color:var(--shell);color:var(--shell);background:none}

@media (prefers-reduced-motion:reduce){
  .pulse-stream .beat.obsession .obs-day,
  .pulse-stream .beat.obsession .obs-kicker{animation:none}
}
@media(max-width:440px){
  .pulse-stream .beat.obsession .obs-stat{padding:18px 5px}
  .pulse-stream .beat.obsession .obs-l{letter-spacing:.12em}
}

/* ---- PRIVATE CHATS — a two-way thread per beat, seen only by you and Lee -----
   The invite bar sits under the beat chrome; tapping expands the thread inline
   (mobile + v1 desktop). Desktop side-drawer (per Lee's sketch) is a follow-up.
   Bubbles: the visitor's own ('them') ride right in bronze; Lee's ride left in
   the panel tone. Reuses kit tokens; fonts hardcoded (§35). --------------------- */
/* chat button + share share ONE bottom line: chat left, share right */
.pulse-stream .beat-chrome{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:16px}
.pulse-stream .beat-chrome .beat-talk-row,
.pulse-stream .beat-chrome .beat-share-row{margin-top:0}
.pulse-stream .beat-talk{display:inline-flex;align-items:center;gap:8px;background:transparent;
  border:1px solid var(--line);color:var(--muted);font:500 11.5px/1 "Inter",sans-serif;letter-spacing:.04em;
  padding:9px 15px;border-radius:999px;cursor:pointer;-webkit-tap-highlight-color:transparent;
  transition:border-color .2s,color .2s}
.pulse-stream .beat-talk:hover{border-color:var(--bronze);color:var(--shell)}
.pulse-stream .beat-talk:focus-visible{outline:1px solid var(--bronze);outline-offset:2px}
.pulse-stream .beat-talk .bt-ic{width:15px;height:15px;display:block;opacity:.85}
.pulse-stream .beat-talk[aria-expanded="true"]{border-color:var(--bronze);color:var(--shell)}

/* desk-mode confirmation badge (Lee only — proves the desk link took effect) */
.pulse-stream.desk-mode .desk-badge,.desk-mode .desk-badge{position:fixed;left:16px;bottom:16px;z-index:9999;
  display:flex;align-items:center;gap:8px;background:var(--panel);border:1px solid var(--bronze);
  color:var(--shell);font:600 11px/1 "Inter",sans-serif;letter-spacing:.02em;padding:10px 14px;border-radius:999px;
  box-shadow:0 10px 30px -12px rgba(0,0,0,.6)}
.desk-mode .desk-badge .db-dot{width:7px;height:7px;border-radius:50%;background:var(--bronze);
  box-shadow:0 0 0 3px rgba(176,128,48,.18)}

.pulse-stream .beat-chat{margin-top:12px;border:1px solid var(--line);border-radius:14px;
  background:var(--panel);padding:14px 14px 12px;animation:chat-open .22s ease}
@keyframes chat-open{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}
@media (prefers-reduced-motion:reduce){.pulse-stream .beat-chat{animation:none}}

.pulse-stream .chat-priv{display:flex;align-items:center;gap:7px;margin:0 0 12px;
  font:600 9.5px/1 "Inter",sans-serif;letter-spacing:.16em;text-transform:uppercase;color:var(--bronze)}
.pulse-stream .chat-lock{width:6px;height:6px;border-radius:50%;background:var(--bronze);
  box-shadow:0 0 0 3px rgba(176,128,48,.16)}
.pulse-stream .chat-deskhead{color:var(--shell)}

.pulse-stream .chat-empty{margin:2px 0 12px;font:italic 400 16px/1.5 "Cormorant Garamond",serif;color:var(--muted)}

.pulse-stream .chat-thread{display:flex;flex-direction:column;gap:8px;max-height:340px;overflow-y:auto;
  margin:0 0 12px;padding:2px}
.pulse-stream .cm{display:flex}
.pulse-stream .cm-them{justify-content:flex-end}
.pulse-stream .cm-lee{justify-content:flex-start}
.pulse-stream .cm-b{max-width:82%;padding:9px 13px;border-radius:14px;
  font:400 14.5px/1.5 "Inter",sans-serif;white-space:normal;word-wrap:break-word}
.pulse-stream .cm-them .cm-b{background:rgba(176,128,48,.16);color:var(--linen);border:1px solid rgba(176,128,48,.30);border-bottom-right-radius:5px}
.pulse-stream .cm-lee .cm-b{background:var(--obsidian);color:var(--shell);border:1px solid var(--line);border-bottom-left-radius:5px}

.pulse-stream .chat-form{display:flex;flex-direction:column;gap:9px}
.pulse-stream .chat-name{width:100%;box-sizing:border-box;background:var(--obsidian);border:1px solid var(--line);
  border-radius:10px;padding:9px 12px;color:var(--linen);font:400 14px/1.2 "Inter",sans-serif;outline:none;transition:border-color .15s}
.pulse-stream .chat-name::placeholder{color:var(--stone)}
.pulse-stream .chat-name:focus{border-color:var(--bronze)}
.pulse-stream .chat-input{width:100%;box-sizing:border-box;resize:vertical;min-height:42px;
  background:var(--obsidian);border:1px solid var(--line);border-radius:10px;padding:10px 12px;color:var(--linen);
  font:400 14.5px/1.45 "Inter",sans-serif;outline:none;transition:border-color .15s}
.pulse-stream .chat-input::placeholder{color:var(--stone)}
.pulse-stream .chat-input:focus{border-color:var(--bronze)}
.pulse-stream .chat-actions{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap}
.pulse-stream .chat-send{flex:0 0 auto;border:0;border-radius:999px;padding:9px 20px;cursor:pointer;
  color:var(--obsidian);background:var(--linen);font:600 13px/1 "Inter",sans-serif;letter-spacing:.02em;
  transition:transform .12s,opacity .15s;margin-left:auto}
.pulse-stream .chat-send:hover{transform:translateY(-1px)}
.pulse-stream .chat-save{background:none;border:0;padding:0;cursor:pointer;color:var(--stone);
  font:500 12px/1.3 "Inter",sans-serif;text-decoration:underline;text-underline-offset:3px}
.pulse-stream .chat-save:hover{color:var(--bronze)}
.pulse-stream .chat-hp{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}

.pulse-stream .chat-email{display:flex;align-items:center;gap:8px;flex-wrap:wrap;width:100%}
.pulse-stream .chat-email-i{flex:1;min-width:140px;background:var(--obsidian);border:1px solid var(--line);
  border-radius:9px;padding:8px 11px;color:var(--linen);font:400 13.5px/1.2 "Inter",sans-serif;outline:none}
.pulse-stream .chat-email-i:focus{border-color:var(--bronze)}
.pulse-stream .chat-email-c{display:flex;align-items:center;gap:5px;color:var(--muted);font:400 12px/1.2 "Inter",sans-serif}
.pulse-stream .chat-email-b{border:0;border-radius:999px;padding:8px 16px;cursor:pointer;color:var(--obsidian);
  background:var(--bronze);font:600 12.5px/1 "Inter",sans-serif}
.pulse-stream .chat-saved{margin:4px 0 0;font:400 13.5px/1.5 "Inter",sans-serif;color:#8FC53A}
.pulse-stream .chat-nudge{margin:2px 0 8px;font:400 13px/1.5 "Inter",sans-serif;color:var(--linen)}
.pulse-stream .chat-nudge b{color:var(--bronze);font-weight:600}

/* desk (Lee) — stacked threads, each with its own reply box */
.pulse-stream .chat-dthread{border-top:1px solid var(--line);padding-top:12px;margin-top:12px}
.pulse-stream .chat-dthread:first-of-type{border-top:0;padding-top:0;margin-top:0}
.pulse-stream .chat-dwho{font:600 11px/1 "Inter",sans-serif;letter-spacing:.04em;color:var(--shell);margin:0 0 9px}
.pulse-stream .chat-new{font-size:8.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--obsidian);
  background:var(--bronze);border-radius:999px;padding:2px 7px;margin-left:6px}

/* ---- longhand beat: handwritten journal photo as hero, line transcribed beneath --- */
.pulse-stream .beat.longhand .beat-body { padding: 0; }
.pulse-stream .beat.longhand .longhand-fig { margin: 4px 0 0; }
.pulse-stream .beat.longhand .longhand-img {
  display: block; width: 100%; height: auto;
  border: 1px solid var(--line); border-radius: 14px;
  box-shadow: 0 20px 44px -24px rgba(0,0,0,.6);
}
.pulse-stream .beat.longhand .longhand-cap {
  margin: 17px 4px 2px; text-align: center;
  font: italic 400 19px/1.42 "Cormorant Garamond", serif;
  color: var(--muted); letter-spacing: .01em;
}
.pulse-stream .beat.longhand .longhand-cap .lh-emph {
  font-style: normal; color: var(--shell); letter-spacing: .03em;
}

/* ---- image beat: a hero image (render OR photo), the line beneath (no JS hook).
   render = CGI/architecture (render-*), photo = real photography/selfies (photo-*).
   Shared rules, two semantic class names — grouped so nothing drifts. --- */
.pulse-stream .beat.render .beat-body,
.pulse-stream .beat.photo .beat-body { padding: 0; }
.pulse-stream .beat.render .render-fig,
.pulse-stream .beat.photo .photo-fig { margin: 4px 0 0; }
.pulse-stream .beat.render .render-img,
.pulse-stream .beat.photo .photo-img {
  display: block; width: 100%; height: auto;
  border: 1px solid var(--line); border-radius: 14px;
  box-shadow: 0 20px 44px -24px rgba(0,0,0,.6);
}
.pulse-stream .beat.render .render-cap,
.pulse-stream .beat.photo .photo-cap {
  margin: 17px 4px 2px; text-align: center;
  font: italic 400 19px/1.42 "Cormorant Garamond", serif;
  color: var(--muted); letter-spacing: .01em;
}
.pulse-stream .beat.render .render-cap .rc-emph,
.pulse-stream .beat.photo .photo-cap .rc-emph {
  font-style: normal; color: var(--shell); letter-spacing: .03em;
}
/* photo beat, LONGER note (a journal confession under the selfie) — readable
   left-aligned body, not the centered single-line caption. Use .photo-cap for a
   one-line charge; .photo-note for a multi-line note. */
.pulse-stream .beat.photo .photo-note {
  margin: 16px 2px 2px; text-align: left;
  font: 400 16px/1.62 "Inter", sans-serif; color: var(--muted);
}
.pulse-stream .beat.photo .photo-note .pn-turn {
  margin: .85em 0 0; color: var(--shell);
}
/* repurposed-from-LazyFit cross-link — a quiet door from a beat back into the
   training log. Understated; the house arrow nudges on hover. Renders from the
   beat's "lazyfit" field (build.py), so every repurposed-selfie beat carries it. */
.pulse-stream .beat-xlink-row { text-align: right; margin: 9px 2px 0; }
.pulse-stream .beat-xlink {
  display: inline-flex; align-items: center; gap: .5em;
  text-decoration: none;
  font: 500 13px/1.4 "Inter", sans-serif; letter-spacing: .015em;
  color: var(--muted); transition: color .2s ease;
}
.pulse-stream .beat-xlink:hover { color: var(--shell); }
.pulse-stream .beat-xlink .bx-ar { transition: transform .2s ease; }
.pulse-stream .beat-xlink:hover .bx-ar { transform: translateX(3px); }

/* =============================================================================
   BEAT-PIMPING PASS (2026-06-10) — Pulse-native upgrades to existing beats.
   Additive over brand.css + beat-burst.css; kit tokens only, fonts hardcoded
   (§35). Each block names the beat/component it serves; nothing decorative.
   ============================================================================= */

/* ---- #001 BIG BANG — interactive subtraction. Each negation is tappable;
   it dissolves (blur + collapse) and the remaining lines close ranks, until
   only "more." remains. Halos clip only WHILE dissolving (.gone sets the
   overflow), so the resting look is untouched. ------------------------------ */
.pulse-stream .beat.bigbang .litany p{cursor:pointer;
  transition:height .55s cubic-bezier(.4,0,.2,1),opacity .5s ease,filter .5s ease,transform .5s ease}
.pulse-stream .beat.bigbang .litany p:focus-visible{outline:1px solid var(--bronze);outline-offset:2px;border-radius:8px}
.pulse-stream .beat.bigbang .litany p.gone{overflow:hidden;opacity:0;filter:blur(6px);
  transform:translateY(-4px);pointer-events:none}
.pulse-stream .beat.bigbang .bb-hint{position:relative;z-index:3;margin:16px auto 0;text-align:center;
  width:fit-content;padding:0 10px;font:500 9.5px/1.6 "Inter",sans-serif;letter-spacing:.22em;
  text-transform:uppercase;color:var(--stone);text-shadow:0 1px 7px rgba(0,0,0,.65);
  transition:color .6s ease}
.pulse-stream .beat.bigbang.all-gone .bb-hint{color:var(--bronze)}
.pulse-stream .beat.bigbang .closer{transition:transform .7s cubic-bezier(.22,.8,.3,1)}
.pulse-stream .beat.bigbang.all-gone .closer{transform:scale(1.14)}
@media (prefers-reduced-motion:reduce){
  .pulse-stream .beat.bigbang .litany p{transition:none}
  .pulse-stream .beat.bigbang .closer{transition:none}
}

/* ---- #002 NOTES — Lee's own surface. The iOS chrome is gone; the raw note
   sits on warm linen paper signed by the house sigil. Typewriter (nt-typed /
   nt-caret / nt-rest) unchanged; caret turns bronze on this surface. Paper is
   hardcoded warm-linen on BOTH themes (paper is paper), like the old white
   note-shot was. ------------------------------------------------------------ */
.pulse-stream .note-page{width:380px;max-width:100%;margin:0 auto;background:#F5F0E8;border-radius:14px;
  padding:24px 26px 30px;text-align:center;
  box-shadow:0 1px 0 rgba(245,240,232,.05),0 24px 60px -28px rgba(0,0,0,.85),0 8px 22px -16px rgba(0,0,0,.7)}
.pulse-stream .note-page .note-sigil{display:block;font-size:15px;line-height:1;color:#B08030;margin:0 0 12px}
.pulse-stream .note-page .note-date{margin:0 0 16px;font-family:"Inter",sans-serif;font-size:9.5px;
  letter-spacing:.22em;text-transform:uppercase;color:#8A857C}
.pulse-stream .note-page .note-title{margin:0;text-align:left;font-family:"Cormorant Garamond",serif;
  font-weight:500;font-size:24px;line-height:1.34;letter-spacing:.002em;color:#221F1A;
  word-break:normal;overflow-wrap:break-word}
.pulse-stream .note-page .nt-caret{display:inline-block;width:2px;height:1.02em;background:#B08030;
  vertical-align:-.16em;margin-left:1px;border-radius:1px;animation:nt-caret-blink 1.06s steps(1,end) infinite}
@media(max-width:440px){.pulse-stream .note-page .note-title{font-size:22px}}
@media (prefers-reduced-motion:reduce){.pulse-stream .note-page .nt-caret{animation:none}}

/* ---- #003 TEXT WEIGHT — a thesis and a throwaway shouldn't render the same.
   .w-declaration: stark line, near-empty card, serif display. .w-whisper: the
   aside, quieter than the default voice. Default beats untouched. ------------ */
.pulse-stream .beat.w-declaration{text-align:center;padding:56px 30px 50px;border-color:var(--line2)}
.pulse-stream .beat.w-declaration .beat-meta{justify-content:center}
.pulse-stream .beat.w-declaration .beat-body{font-family:"DM Serif Display",serif;font-style:italic;
  font-size:clamp(27px,5.4vw,40px);line-height:1.16;color:var(--linen);text-wrap:balance}
.pulse-stream .beat.w-whisper .beat-body{font-style:italic;font-size:17px;color:var(--muted)}

/* ---- THREAD — the quiet "this answers that" line (cross-linked beats turn a
   stream into a body of work). House return-arrow, bronze beat number. ------- */
.pulse-stream .beat-thread{margin:14px 0 0;font-family:"Inter",sans-serif;font-size:11px;
  letter-spacing:.05em;line-height:1.6;color:var(--stone)}
.pulse-stream .beat.bigbang .beat-thread{position:relative;z-index:3;text-align:center;
  text-shadow:0 1px 7px rgba(0,0,0,.65)}
.pulse-stream .beat-thread a{color:var(--stone);text-decoration:none;transition:color .2s ease}
.pulse-stream .beat-thread a:hover{color:var(--shell)}
.pulse-stream .beat-thread a b{color:var(--bronze);font-weight:600}
.pulse-stream .beat-thread a:focus-visible{outline:1px solid var(--bronze);outline-offset:3px;border-radius:2px}

/* ---- #005 STATE REPORT — an honest low-energy day. The beat carries a quiet
   chip; its day's stretch on the ECG dims (.ptrace.dim, no glow filter). ----- */
.pulse-stream .beat-state{font-family:"Inter",sans-serif;font-size:9px;letter-spacing:.14em;
  text-transform:uppercase;color:var(--stone);border:1px solid var(--line);border-radius:999px;padding:3px 9px}
.pulse-stream .ptrace.dim{opacity:.38}

/* ---- ECG scar + live dot — tap a flat day, the line answers "silent." (own
   the scar); the live dot burns brighter when a beat already landed today. --- */
.pulse-stream .psilent{font-family:"Cormorant Garamond",serif;font-style:italic;font-size:13px;
  fill:var(--stone);animation:psilent-breathe 1.9s ease forwards;pointer-events:none}
@keyframes psilent-breathe{0%{opacity:0;transform:translateY(3px)}18%{opacity:.9;transform:none}
  72%{opacity:.9}100%{opacity:0}}
.pulse-stream .plive.today{animation:pbeat 1.6s ease-in-out infinite;
  filter:drop-shadow(0 0 6px rgba(232,168,30,.6))}

/* the TRAVELER bead — on load it rides the whole trace from the first beat to
   today (pulse.js initPlinePos), then fades into the live dot. Hidden by default
   so there's no stray dot without JS / for reduced motion. White-hot core, bronze
   bloom = the live pulse travelling the heartbeat. ------------------------------ */
.pulse-stream .ptravel{opacity:0;fill:#FFF6E9;stroke:var(--bronze);stroke-width:1.2;
  transform-box:fill-box;transform-origin:center;  /* scale-pop happens in place, not from 0,0 */
  filter:drop-shadow(0 0 4px rgba(255,246,233,.95)) drop-shadow(0 0 10px rgba(232,168,30,.8));
  pointer-events:none}
.pulse-stream .ptravel.run{opacity:1;transition:opacity .15s ease}      /* quick pop-in at the start */
.pulse-stream .ptravel.arrived{opacity:0;transition:opacity .55s ease}  /* slow fade into the live dot */
/* the live (today) dot stays hidden until the bead actually arrives there —
   no orphan beacon pulsing at the end before the pulse has travelled to it */
.pulse-stream .pline.travelling .plive{animation:none;opacity:0}

/* FUSION — the line is born as the bead draws it. .pghost = the faint unlit trace
   sitting behind; the lit (spectrum) traces live in a clip group the bead reveals
   left-to-right. .pflash = the burst ring dropped on each spike + the today landing. */
.pulse-stream .ptrace.pghost{stroke:var(--stone);opacity:.22;filter:none}
.pulse-stream .pflash{fill:none;stroke:var(--bronze);pointer-events:none;
  animation:pflashring .6s ease-out forwards}
@keyframes pflashring{0%{r:3;opacity:.85;stroke-width:2.4}100%{r:24;opacity:0;stroke-width:.4}}

@media (prefers-reduced-motion:reduce){
  .pulse-stream .psilent{animation:none;opacity:.9}
  .pulse-stream .plive.today{animation:none;opacity:1}
  .pulse-stream .ptravel{display:none}
}

/* ---- #009 LONGHAND — the beat about writing, re-writing itself. The quiet
   invite sits under the caption; on tap the transcription writes itself out in
   a handwriting face on a paper-grain strip (ink on the same warm paper as the
   photo's page). Bronze pen-stroke caret while it writes. -------------------- */
.pulse-stream .beat.longhand .lh-write{display:block;margin:13px auto 2px;appearance:none;
  -webkit-appearance:none;background:none;border:0;padding:6px 10px;cursor:pointer;
  font:500 10px/1 "Inter",sans-serif;letter-spacing:.2em;text-transform:uppercase;color:var(--stone);
  transition:color .2s ease}
.pulse-stream .beat.longhand .lh-write:hover{color:var(--shell)}
.pulse-stream .beat.longhand .lh-write:disabled{cursor:default;opacity:.55}
.pulse-stream .beat.longhand .lh-write:focus-visible{outline:1px solid var(--bronze);outline-offset:3px;border-radius:2px}
.pulse-stream .beat.longhand .longhand-cap.lh-writing{
  font-family:"Caveat",cursive;font-style:normal;font-weight:600;font-size:25px;line-height:1.38;
  color:#2A2620;text-align:left;margin:16px 2px 2px;padding:16px 20px 18px;border-radius:10px;
  background-color:#F5F0E8;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3CfeComponentTransfer%3E%3CfeFuncA type='table' tableValues='0 0.06'/%3E%3C/feComponentTransfer%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23g)'/%3E%3C/svg%3E");
  box-shadow:0 14px 34px -20px rgba(0,0,0,.55)}
.pulse-stream .beat.longhand .longhand-cap.lh-writing .lh-pen{display:inline-block;width:2px;height:.86em;
  background:#B08030;vertical-align:-.1em;margin-left:2px;border-radius:1px;
  animation:nt-caret-blink 1.06s steps(1,end) infinite}
@media (prefers-reduced-motion:reduce){.pulse-stream .beat.longhand .longhand-cap.lh-writing .lh-pen{animation:none}}

/* ---- Assistant's note — a SECOND VOICE threaded into a beat ----------------
   Lee's words stay in their warm serif register (Cormorant, --linen, still).
   When his AI assistant adds context a beat genuinely benefits from, it renders
   HERE — and is built to be unmistakably NOT Lee's hand, via four redundant
   signals: (1) a living spectrum hairline on top — the brand's machine-voice
   mark, kept to motion only (vault §38); (2) the ☿ Mercury glyph (the messenger)
   in the symbols font, never an OS emoji; (3) a shimmering "Tris" wordmark
   (the AI's chosen name) + an "Opus 4.8" subtitle; (4) a quieter Inter SANS body
   on a faint raised panel (sans vs Lee's serif).
   Data-driven: a beat's "note" field (build.py). Reusable on any beat class.

   Counterpart: .beat-sign (below) — Lee's gold-standard signature, a STATIC warm
   mark on his own words. Spectrum-shimmer = the machine (Tris); a still single
   gold = Lee's hand. The two marks are the two-voice system made visible (§27). */
/* "(Opus 4.8)" — its own line, smaller, and deliberately NOT shimmering (the
   shimmer is the Tris wordmark's; the version tag is a still, quiet subtitle). */
.pulse-stream .bn-sub{
  display:block;margin:3px 0 0;
  font:500 8.5px/1 "Inter",sans-serif;letter-spacing:.12em;
  background:none;-webkit-text-fill-color:var(--muted);color:var(--muted)}
.pulse-stream .beat-sign{
  width:150px;height:48px;margin:18px auto 4px;
  background:var(--bronze);
  -webkit-mask:url(assets/signature-gold.svg) center/contain no-repeat;
          mask:url(assets/signature-gold.svg) center/contain no-repeat;
  opacity:.92}
.pulse-stream .beat-note{
  position:relative;margin:20px 0 2px;padding:14px 16px;
  border-radius:12px;overflow:hidden;
  background:color-mix(in srgb, var(--shell) 4%, transparent);
  border:1px solid color-mix(in srgb, var(--shell) 9%, transparent);
}
/* the machine-voice hairline. No border-radius on the bar itself — the parent's
   overflow:hidden clips it to the rounded corner, so it sits flush edge-to-edge
   (the radius-on-a-2px-bar trick pulled the colour in at the corners = the
   "misaligned line" Lee flagged; same fix as .ftl-receipt / .pjoin-inner). */
.pulse-stream .beat-note::before{
  content:"";position:absolute;left:0;right:0;top:0;height:2px;
  background-image:var(--spectrum);background-size:300% auto;
  animation:drift-af 20s linear infinite}
@media (prefers-reduced-motion:reduce){.pulse-stream .beat-note::before{animation:none}}
/* collapsible head: ☿ Tris (+ version) always visible; minimize button at right */
.pulse-stream .beat-note .bn-head{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}
.pulse-stream .bn-min{flex:0 0 auto;border:0;background:transparent;cursor:pointer;
  padding:5px;margin:-3px -4px 0 0;line-height:0;border-radius:7px;color:var(--muted);
  transition:background .15s,color .15s}
.pulse-stream .bn-min:hover{background:color-mix(in srgb,var(--shell) 9%,transparent);color:var(--shell)}
.pulse-stream .bn-chev{display:inline-block;width:8px;height:8px;
  border-right:2px solid currentColor;border-bottom:2px solid currentColor;
  transform:translateY(-2px) rotate(45deg);transition:transform .22s}
.pulse-stream .beat-note.min .bn-chev{transform:translateY(1px) rotate(-135deg)}
.pulse-stream .beat-note.min .bn-body{display:none}
.pulse-stream .beat-note.min .bn-label{margin-bottom:0}
.pulse-stream .bn-label{
  display:inline-block;margin:2px 0 7px;
  font:600 11px/1 "Inter",sans-serif;letter-spacing:.17em;text-transform:uppercase;
  background-image:var(--spectrum);background-size:300% auto;
  -webkit-background-clip:text;background-clip:text;color:transparent;
  -webkit-text-fill-color:transparent;animation:drift-af 20s linear infinite}
.pulse-stream .bn-mark{
  font-family:"Noto Sans Symbols 2","Apple Symbols",system-ui,sans-serif;
  font-size:13px;margin-right:.4em;
  background-image:var(--spectrum);background-size:300% auto;
  -webkit-background-clip:text;background-clip:text;color:transparent;
  -webkit-text-fill-color:transparent;animation:drift-af 20s linear infinite}
@media (prefers-reduced-motion:reduce){
  .pulse-stream .bn-label{animation:none;-webkit-text-fill-color:var(--muted);color:var(--muted)}
  .pulse-stream .bn-mark{animation:none;-webkit-text-fill-color:var(--bronze);color:var(--bronze)}}
.pulse-stream .bn-body{
  font:400 15px/1.62 "Inter",sans-serif;color:var(--muted);letter-spacing:.004em}
.pulse-stream .bn-body em{font-style:italic;color:var(--shell)}
.pulse-stream .bn-body .bn-em{
  font-style:normal;
  background-image:var(--spectrum);background-size:300% auto;
  -webkit-background-clip:text;background-clip:text;color:transparent;
  -webkit-text-fill-color:transparent;animation:drift-af 20s linear infinite}
@media (prefers-reduced-motion:reduce){
  .pulse-stream .bn-body .bn-em{animation:none;-webkit-text-fill-color:var(--shell);color:var(--shell)}}

/* ---- CO-SIGN — the two-voice byline (Direction C, Sharas-locked 2026-06-26) --
   Lee's gold signature LEADS (still, full size); a seal-shaped button counter-
   seals beneath with ☿ Tris (Opus 4.8). Tap reveals the honest role-split +
   a beat-specific provenance line. Differentiated from .beat-note: that wears a
   spectrum bar on TOP (commentary on the subject); the co-sign reveal wears a
   spectrum SPINE on its LEFT edge (provenance — the seam where the machine's
   hand enters the making). Motion law: gold STILL, spectrum in MOTION. */
.pulse-stream .beat-cosign{display:flex;flex-direction:column;align-items:center;margin:18px 0 4px}
.pulse-stream .beat-cosign .beat-sign{margin:0}   /* the stack owns the spacing */
.pulse-stream .cosign-seal{display:inline-flex;align-items:center;gap:.5em;margin-top:13px;
  padding:7px 14px;cursor:pointer;font:600 11px/1 "Inter",sans-serif;
  background:color-mix(in srgb,var(--shell) 5%,transparent);
  border:1px solid color-mix(in srgb,var(--shell) 12%,transparent);
  border-radius:999px;transition:border-color .18s,background .18s}
.pulse-stream .cosign-seal:hover{border-color:color-mix(in srgb,var(--bronze) 60%,transparent);
  background:color-mix(in srgb,var(--shell) 8%,transparent)}
.pulse-stream .cosign-seal:focus-visible{outline:1px solid var(--bronze);outline-offset:3px}
.pulse-stream .cs-lead{font-size:9px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted)}
.pulse-stream .cs-tris{letter-spacing:.01em;
  background-image:var(--spectrum);background-size:300% auto;
  -webkit-background-clip:text;background-clip:text;color:transparent;
  -webkit-text-fill-color:transparent;animation:drift-af 20s linear infinite}
.pulse-stream .cs-merc{font-family:"Noto Sans Symbols 2","Apple Symbols",system-ui,sans-serif;margin-right:.34em}
.pulse-stream .cs-model{font-weight:500;font-size:9px;letter-spacing:.06em;color:var(--muted)}
.pulse-stream .cs-chev{width:6px;height:6px;border-right:2px solid var(--muted);border-bottom:2px solid var(--muted);
  transform:translateY(-1px) rotate(45deg);transition:transform .22s;margin-left:.1em}
.pulse-stream .cosign-seal[aria-expanded="true"] .cs-chev{transform:translateY(1px) rotate(-135deg)}
@media (prefers-reduced-motion:reduce){
  .pulse-stream .cs-tris{animation:none;-webkit-text-fill-color:var(--bronze);color:var(--bronze)}}
/* the reveal — minimal Inter, a MOVING spectrum spine on the left edge */
.pulse-stream .cosign-reveal{position:relative;width:100%;max-width:340px;margin:13px auto 0;
  padding:13px 16px 14px 18px;text-align:left;border-radius:11px;overflow:hidden;
  background:color-mix(in srgb,var(--shell) 3.5%,transparent);
  border:1px solid color-mix(in srgb,var(--shell) 8%,transparent)}
.pulse-stream .cosign-reveal[hidden]{display:none}
.pulse-stream .cosign-reveal::before{content:"";position:absolute;left:0;top:0;bottom:0;width:2px;
  background:linear-gradient(180deg,#C8342B,#E2631F,#E8A81E,#8FC53A,#1F9E9A,#2E78C4,#6A2EA8,#C8342B);
  background-size:100% 300%;animation:drift-af-v 20s linear infinite}
@keyframes drift-af-v{from{background-position:50% 0%}to{background-position:50% 150%}}
@media (prefers-reduced-motion:reduce){.pulse-stream .cosign-reveal::before{animation:none}}
.pulse-stream .csr-roles{display:flex;flex-wrap:wrap;gap:8px 22px;margin-bottom:10px}
.pulse-stream .csr-role{display:flex;flex-direction:column;gap:3px}
.pulse-stream .csr-k{font:600 8.5px/1 "Inter",sans-serif;letter-spacing:.13em;text-transform:uppercase;color:var(--bronze)}
.pulse-stream .csr-v{font:600 13px/1 "Inter",sans-serif;color:var(--shell)}
.pulse-stream .csr-tris{background-image:var(--spectrum);background-size:300% auto;
  -webkit-background-clip:text;background-clip:text;color:transparent;
  -webkit-text-fill-color:transparent;animation:drift-af 20s linear infinite}
@media (prefers-reduced-motion:reduce){
  .pulse-stream .csr-tris{animation:none;-webkit-text-fill-color:var(--bronze);color:var(--bronze)}}
.pulse-stream .csr-note{margin:0;font:400 13.5px/1.55 "Inter",sans-serif;color:var(--muted)}
.pulse-stream .csr-note em{font-style:italic;color:var(--shell)}

/* ---- version cuts: Safe / approved-upgrade switcher (additive) ----------- */
.pulse-stream .beat-cuts .cut-switch{display:inline-flex;gap:5px;margin-bottom:16px;
  background:color-mix(in srgb,var(--shell) 7%,transparent);padding:5px;border-radius:999px}
.pulse-stream .cutbtn{font-family:Inter,system-ui,sans-serif;font-weight:600;font-size:11px;
  letter-spacing:.05em;color:color-mix(in srgb,var(--shell) 52%,transparent);background:transparent;
  border:0;padding:7px 14px;border-radius:999px;cursor:pointer;display:inline-flex;align-items:center;
  gap:5px;transition:background .22s,color .22s}
.pulse-stream .cutbtn .cx{font-family:"Noto Sans Symbols 2","Cormorant Garamond",serif;font-size:13px;opacity:.5}
/* active pill: ink-coloured fill + paper-coloured label so it contrasts in BOTH
   themes — light theme inverts the palette (--linen/--shell both go dark), so the
   old color:var(--linen) was dark-on-dark. --bg is the page paper in either theme. */
.pulse-stream .cutbtn.on{background:var(--shell);color:var(--bg);-webkit-text-fill-color:var(--bg)}
.pulse-stream .cutbtn.on .cx{opacity:1;background-image:var(--spectrum);background-size:300% auto;
  -webkit-background-clip:text;background-clip:text;color:transparent;animation:drift-af 20s linear infinite}
.pulse-stream .beat-cuts .cut[hidden]{display:none}
.pulse-stream .cut-in{animation:cutin .42s cubic-bezier(.2,.8,.2,1)}
@keyframes cutin{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
@media (prefers-reduced-motion:reduce){.pulse-stream .cut-in,.pulse-stream .cutbtn.on .cx{animation:none}}

/* cut votes removed completely (Lee, 2026-06-21) — switcher kept, public voting gone. */

/* owner-only default picker (desk token) — set which version-cut LEADS a beat on
   load. Tiny, dashed = admin affordance; solid bronze when the shown cut already
   leads. Injected by pulse.js initCutOwner only when a desk token is present. */
/* block-level (NOT inline-flex) so it sits on its OWN line BELOW the version tabs,
   never beside them (the switcher is inline-flex; an inline sibling flows next to it). */
.pulse-stream .cut-owner{margin:10px 0 16px;display:flex;align-items:center;gap:9px}
.pulse-stream .co-lab{font:600 8px/1 "Inter",sans-serif;letter-spacing:.22em;
  text-transform:uppercase;color:var(--muted);opacity:.7}
.pulse-stream .co-btn{font:600 9px/1 "Inter",sans-serif;letter-spacing:.16em;text-transform:uppercase;
  color:var(--muted);background:transparent;border:1px dashed color-mix(in srgb,var(--shell) 28%,transparent);
  border-radius:999px;padding:6px 12px;cursor:pointer;transition:color .18s,border-color .18s}
.pulse-stream .co-btn:hover{color:var(--bronze);border-color:var(--bronze)}
.pulse-stream .co-btn.is-def{color:var(--bronze);border-style:solid;
  border-color:color-mix(in srgb,var(--bronze) 45%,transparent);cursor:default}
.pulse-stream .co-btn:disabled{opacity:.6;cursor:default}

/* opt-in beat "lead": the opening line as a bold serif hook (build.py `lead`). */
.pulse-stream .beat-body .beat-lead{
  font-family:"Cormorant Garamond",Georgia,serif;font-weight:600;
  font-size:1.34rem;line-height:1.32;color:var(--linen);margin:0 0 14px;text-wrap:balance}

/* ---- feed-the-link cuts: Upgraded receipt + Wildcard terminal (additive) -- */
/* UPGRADED — a typeset "session receipt" card. Lee's line stays serif (his
   voice); the receipt is the machine artifact (☿ + Inter). */
.pulse-stream .ftl-up .ftl-lead{font-family:"Cormorant Garamond",Georgia,serif;
  font-size:1.36rem;line-height:1.42;color:var(--shell);margin:0 0 18px}
.pulse-stream .ftl-receipt{position:relative;margin:0;padding:18px 18px 16px;
  border-radius:14px;background:color-mix(in srgb,var(--shell) 5%,transparent);
  border:1px solid color-mix(in srgb,var(--shell) 11%,transparent);overflow:hidden}
.pulse-stream .ftl-receipt::before{content:"";position:absolute;left:0;right:0;top:0;
  height:2px;background-image:var(--spectrum);background-size:300% auto;
  animation:drift-af 20s linear infinite}
.pulse-stream .ftl-stamp{display:inline-flex;align-items:center;gap:.45em;margin:2px 0 4px;
  font:600 11px/1 "Inter",sans-serif;letter-spacing:.18em;text-transform:uppercase;
  background-image:var(--spectrum);background-size:300% auto;-webkit-background-clip:text;
  background-clip:text;color:transparent;-webkit-text-fill-color:transparent;
  animation:drift-af 20s linear infinite}
.pulse-stream .ftl-stamp .ftl-hg{font-family:"Noto Sans Symbols 2","Apple Symbols",system-ui,sans-serif}
.pulse-stream .ftl-in{font:500 12px/1.4 "Inter",sans-serif;letter-spacing:.02em;
  color:var(--muted);margin:0 0 12px}
.pulse-stream .ftl-ledger{list-style:none;margin:0 0 4px;padding:0}
.pulse-stream .ftl-ledger li{position:relative;padding:8px 0 8px 30px;
  font:500 14.5px/1.46 "Inter",sans-serif;color:var(--shell);
  border-top:1px solid color-mix(in srgb,var(--shell) 8%,transparent)}
.pulse-stream .ftl-ledger li:first-child{border-top:0}
.pulse-stream .ftl-ledger li::before{content:"\2192";position:absolute;left:2px;top:8px;
  font-weight:700;color:var(--bronze)}
.pulse-stream .ftl-ledger b{color:var(--linen);font-weight:700}
.pulse-stream .ftl-punch{font-family:"Cormorant Garamond",Georgia,serif;
  font-size:1.5rem;line-height:1.3;color:var(--linen);margin:18px 0 0;font-weight:600}
.pulse-stream .ftl-punch .ftl-d{background-image:var(--spectrum);background-size:300% auto;
  -webkit-background-clip:text;background-clip:text;color:transparent;
  -webkit-text-fill-color:transparent;animation:drift-af 20s linear infinite}

/* WILDCARD — a self-contained machine terminal (deliberately dark in both themes,
   like the carousel exhibits define their own treatment). Lines print in on reveal
   via staggered CSS; no JS. ☿ + mono = machine voice, correctly marked. */
.pulse-stream .ftl-term{font-family:"SF Mono",ui-monospace,"DM Mono",Menlo,Consolas,monospace;
  background:#100F0B;border:1px solid rgba(245,240,232,.12);border-radius:12px;
  padding:16px 16px 18px;color:#E7E0D3;font-size:13px;line-height:1.65;overflow:hidden}
.pulse-stream .ftl-term .tt-bar{display:flex;align-items:center;gap:6px;margin:-2px 0 12px}
.pulse-stream .ftl-term .tt-dot{width:9px;height:9px;border-radius:50%;background:rgba(245,240,232,.22)}
.pulse-stream .ftl-term .tt-title{margin-left:6px;font-size:10.5px;letter-spacing:.12em;
  text-transform:uppercase;color:rgba(245,240,232,.42)}
.pulse-stream .ftl-term .tt-hg{background-image:var(--spectrum);background-size:300% auto;
  -webkit-background-clip:text;background-clip:text;color:transparent;
  -webkit-text-fill-color:transparent;animation:drift-af 20s linear infinite}
.pulse-stream .ftl-term .tt-line{opacity:0;transform:translateY(4px);
  animation:ttline .34s cubic-bezier(.2,.8,.2,1) forwards}
.pulse-stream .ftl-term .tt-prompt{color:#8FC53A}
.pulse-stream .ftl-term .tt-cmd{color:#E7E0D3}
.pulse-stream .ftl-term .tt-ok{color:#46B14E}
.pulse-stream .ftl-term .tt-dim{color:rgba(245,240,232,.5)}
.pulse-stream .ftl-term .tt-out{font-weight:700}
.pulse-stream .ftl-term .tt-out .ftl-d{background-image:var(--spectrum);background-size:300% auto;
  -webkit-background-clip:text;background-clip:text;color:transparent;-webkit-text-fill-color:transparent;
  animation:drift-af 20s linear infinite}
.pulse-stream .ftl-term .tt-caret{display:inline-block;width:8px;height:15px;
  margin-left:3px;vertical-align:-2px;background:#8FC53A;animation:ttblink 1.05s step-end infinite}
.pulse-stream .ftl-term .tt-line:nth-child(2){animation-delay:.05s}
.pulse-stream .ftl-term .tt-line:nth-child(3){animation-delay:.55s}
.pulse-stream .ftl-term .tt-line:nth-child(4){animation-delay:1.05s}
.pulse-stream .ftl-term .tt-line:nth-child(5){animation-delay:1.45s}
.pulse-stream .ftl-term .tt-line:nth-child(6){animation-delay:1.85s}
.pulse-stream .ftl-term .tt-line:nth-child(7){animation-delay:2.25s}
.pulse-stream .ftl-term .tt-line:nth-child(8){animation-delay:2.6s}
.pulse-stream .ftl-term .tt-line:nth-child(9){animation-delay:2.95s}
.pulse-stream .ftl-term .tt-line:nth-child(10){animation-delay:3.15s}
.pulse-stream .ftl-term .tt-line:nth-child(11){animation-delay:3.75s}
@keyframes ttline{to{opacity:1;transform:none}}
@keyframes ttblink{50%{opacity:0}}
@media (prefers-reduced-motion:reduce){
  .pulse-stream .ftl-receipt::before,.pulse-stream .ftl-stamp,.pulse-stream .ftl-punch .ftl-d,
  .pulse-stream .ftl-term .tt-hg,.pulse-stream .ftl-term .tt-out .ftl-d{animation:none}
  .pulse-stream .ftl-stamp{-webkit-text-fill-color:var(--bronze);color:var(--bronze)}
  .pulse-stream .ftl-term .tt-line{opacity:1;transform:none;animation:none}
  .pulse-stream .ftl-term .tt-caret{animation:none}}

/* wildcard portrait clip — fullscreen shows full vertical height (contain), inline box fills (cover) */
.wv-clip video:fullscreen,.wv-clip video:-webkit-full-screen{object-fit:contain;background:#000}

/* ---- gem readout: hidden from visitors (internal metric) ---- */
.pulse-stream .gems{display:none}
/* ---- gem readout: real cut stones on each ladder (gem canon: INCUBATION §86–89) ---- */
.pulse-stream .gems .pgem-row{display:flex;gap:8px;align-items:flex-start;justify-content:center;margin:11px 0 2px;flex-wrap:wrap}
.pulse-stream .gems .pgem-cell{position:relative;display:flex;flex-direction:column;align-items:center;gap:5px;outline:none;cursor:default}
.pulse-stream .gems .pgem-cap{font-family:"Inter",sans-serif;font-size:8.5px;letter-spacing:.04em;color:var(--stone);line-height:1}
.pulse-stream .gems .pgem-cell.cut .pgem-cap{color:var(--linen)}
.pulse-stream .gems .pgem-cell.next .pgem-cap{color:var(--bronze)}
.pulse-stream .gems .pgem-cell.rough{opacity:.55}
/* branded hover/focus tooltip — the stone's full meaning */
.pulse-stream .gems .pgem-cell[data-tip]::after{content:attr(data-tip);position:absolute;bottom:calc(100% + 8px);left:50%;transform:translateX(-50%) translateY(4px);white-space:nowrap;font-family:"Inter",sans-serif;font-size:10px;letter-spacing:.02em;color:var(--linen);background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:6px 10px;box-shadow:0 8px 22px rgba(0,0,0,.5);opacity:0;pointer-events:none;transition:opacity .16s ease,transform .16s ease;z-index:20}
.pulse-stream .gems .pgem-cell[data-tip]:hover::after,.pulse-stream .gems .pgem-cell[data-tip]:focus-visible::after{opacity:1;transform:translateX(-50%) translateY(0)}
.pulse-stream .gems .pgem{position:relative;width:21px;height:21px;border-radius:30%;flex:none;overflow:hidden;border:1px solid rgba(255,255,255,.16)}
/* cut = faceted, lit, glowing — the earned crystal */
.pulse-stream .gems .pgem.cut{
  background:
    radial-gradient(130% 110% at 30% 24%, rgba(255,255,255,.6), rgba(255,255,255,0) 42%),
    conic-gradient(from 200deg at 50% 48%, var(--a), var(--b), var(--a), var(--b), var(--a));
  box-shadow:0 4px 11px rgba(0,0,0,.5), 0 0 13px -3px var(--glow),
    inset 0 1px 1px rgba(255,255,255,.45), inset 0 -5px 9px rgba(0,0,0,.4)}
.pulse-stream .gems .pgem.cut::before{content:"";position:absolute;inset:0;border-radius:inherit;
  background:linear-gradient(125deg,rgba(255,255,255,.30) 0 30%,transparent 30% 64%,rgba(0,0,0,.22) 64% 100%);mix-blend-mode:screen}
.pulse-stream .gems .pgem.cut::after{content:"";position:absolute;left:11%;right:20%;top:8%;height:30%;border-radius:50%;
  background:linear-gradient(180deg,rgba(255,255,255,.6),rgba(255,255,255,0));filter:blur(1.4px);animation:pgsheen 7s ease-in-out infinite}
/* rough = uncut locked rock — dim, no light */
.pulse-stream .gems .pgem.rough{background:radial-gradient(120% 110% at 32% 26%,rgba(255,255,255,.10),rgba(255,255,255,0) 45%),#3a352e;
  box-shadow:inset 0 1px 1px rgba(255,255,255,.06),inset 0 -4px 8px rgba(0,0,0,.5);opacity:.55}
/* next = the rough stone about to be cut — breathing halo */
.pulse-stream .gems .pgem.next{background:radial-gradient(120% 110% at 32% 26%,rgba(255,255,255,.18),rgba(255,255,255,0) 45%),#4a4338;
  animation:pgnext 2.4s ease-in-out infinite}
@keyframes pgsheen{0%,100%{opacity:.45;transform:translateX(0)}50%{opacity:.85;transform:translateX(9%)}}
@keyframes pgnext{0%,100%{box-shadow:0 0 0 1px color-mix(in oklab,var(--glow) 55%,transparent),0 0 6px -2px var(--glow)}
  50%{box-shadow:0 0 0 1px var(--glow),0 0 14px -1px var(--glow)}}
@media (prefers-reduced-motion:reduce){.pulse-stream .gems .pgem.cut::after,.pulse-stream .gems .pgem.next{animation:none}}

/* =============================================================================
   WILDCARD DEVICES (2026-06-21) — Lee's "push the envelope EVERY time" law (§29).
   No default Wildcard device; each reaches for a mechanic the last didn't. Kit
   tokens only (light/dark safe), reduced-motion handled. JS: initFog / initStare.
   ============================================================================= */

/* ---- #021 FOG THE MIRROR — wipe the fogged glass to find the crew; it
   re-condenses, so you must keep moving to keep seeing them (the backward glance,
   literal). Canvas fog is tinted from --linen, so it inverts with the theme. --- */
.pulse-stream .fogmir{position:relative;aspect-ratio:1;width:min(86%,400px);margin:2px auto 0;
  clip-path:circle(50%);background:var(--panel);touch-action:none;cursor:grab;user-select:none;
  -webkit-user-select:none}
.pulse-stream .fogmir:active{cursor:grabbing}
.pulse-stream .fm-base,.pulse-stream .fm-fog{position:absolute;inset:0;width:100%;height:100%}
.pulse-stream .fm-base{object-fit:cover;display:block}
.pulse-stream .fm-fog{display:block}
/* chrome rim — clip-path circle, never border-radius (§21 shape guard) */
.pulse-stream .fm-rim{position:absolute;inset:0;clip-path:circle(50%);pointer-events:none;
  box-shadow:inset 0 0 0 3px var(--line),inset 0 0 26px rgba(0,0,0,.4)}
.pulse-stream .fm-hint{position:absolute;left:50%;bottom:13px;transform:translateX(-50%);
  font:600 9.5px/1 "Inter",sans-serif;letter-spacing:.2em;text-transform:uppercase;
  color:var(--shell);opacity:.74;pointer-events:none;transition:opacity .5s;
  text-shadow:0 1px 8px rgba(0,0,0,.6)}
.pulse-stream .fogmir.wiped .fm-hint{opacity:0}
.pulse-stream .fm-note{margin:16px auto 2px;max-width:32em;text-align:center;
  font:400 16px/1.5 "Cormorant Garamond",Georgia,serif;color:var(--muted)}
@media (prefers-reduced-motion:reduce){.pulse-stream .fm-fog{display:none}}

/* ---- #022 THE STARE — the portrait breathes, the bruise throbs (the one tell);
   hold still and look and a synth heartbeat rises + a vignette closes to his eyes.
   A staring contest you lose. dwell/attention-as-input (initStare). ------------- */
.pulse-stream .stare{position:relative;width:min(86%,440px);margin:2px auto 0;overflow:hidden;
  border-radius:14px}
.pulse-stream .st-base{display:block;width:100%;height:auto;transform-origin:50% 40%;
  animation:st-breathe 5.6s ease-in-out infinite;backface-visibility:hidden}
@keyframes st-breathe{0%,100%{transform:scale(1);filter:brightness(1)}
  50%{transform:scale(1.014);filter:brightness(1.018)}}
/* the bruise tell — a soft blurred multiply patch over the EXISTING shiner
   (camera-left eye), so it deepens what's already there, never a sticker. */
.pulse-stream .st-bruise{position:absolute;left:29%;top:30%;width:19%;height:13%;
  background:radial-gradient(closest-side,rgba(38,10,46,.92),transparent 76%);
  mix-blend-mode:multiply;filter:blur(7px);opacity:0;pointer-events:none;
  animation:st-throb 2.05s ease-in-out infinite}
@keyframes st-throb{0%,100%{opacity:0}46%{opacity:.32}54%{opacity:.2}}
.pulse-stream .st-vig{position:absolute;inset:0;pointer-events:none;opacity:0;transition:opacity 1s ease;
  background:radial-gradient(circle at 50% 40%,transparent 26%,var(--bg) 96%)}
.pulse-stream .stare.locked .st-vig{opacity:.85}
.pulse-stream .st-cap{position:absolute;left:0;right:0;bottom:15px;text-align:center;
  font:600 9.5px/1 "Inter",sans-serif;letter-spacing:.22em;text-transform:uppercase;
  color:var(--shell);opacity:0;transition:opacity .7s;pointer-events:none;
  text-shadow:0 1px 9px rgba(0,0,0,.7)}
.pulse-stream .stare.locked .st-cap{opacity:.9}
.pulse-stream .st-note{margin:16px auto 2px;max-width:34em;text-align:center;
  font:400 16px/1.5 "Cormorant Garamond",Georgia,serif;color:var(--muted)}
@media (prefers-reduced-motion:reduce){
  .pulse-stream .st-base{animation:none}
  .pulse-stream .st-bruise{animation:none;opacity:.2}
  .pulse-stream .stare .st-vig{opacity:.38}
  .pulse-stream .stare .st-cap{opacity:.9}}

/* =============================================================================
   #023 — "OLD EXCAVATOR" (the body as heavy machine). Hub: bodysatva.
   UPGRADED (.exc-up) = editorial field-log masthead: type is the hero over a
   faint bronze industrial grid (the Lee-loved card texture) — NOT a receipt grid.
   WILDCARD (.exrig) = HOLD-TO-LIFT rig: a new mechanic (press-and-hold-to-
   actuate, not drag/dwell/terminal). Crank a reluctant old machine — it stalls,
   groans, then hauls the 7-m beam up onto the +4 m roof (JS: initExcavator).
   Kit tokens only (light/dark safe); reduced-motion shows the job already done.
   ============================================================================= */

/* ---- UPGRADED: field-log masthead ---- */
.pulse-stream .exc-up{position:relative;margin:2px auto 0;max-width:34em;
  padding:24px 22px 20px;border:1px solid var(--line);border-radius:14px;
  background:var(--panel);overflow:hidden}
.pulse-stream .exc-up::before{content:"";position:absolute;inset:0;pointer-events:none;opacity:.55;
  background:
    repeating-linear-gradient(0deg,transparent 0 25px,color-mix(in oklab,var(--bronze) 13%,transparent) 25px 26px),
    repeating-linear-gradient(90deg,transparent 0 25px,color-mix(in oklab,var(--bronze) 13%,transparent) 25px 26px);
  -webkit-mask:radial-gradient(125% 92% at 50% 0%,#000,transparent 80%);
          mask:radial-gradient(125% 92% at 50% 0%,#000,transparent 80%)}
.pulse-stream .exc-up>*{position:relative}
.pulse-stream .excu-kick{margin:0 0 13px;font:600 9.5px/1 "Inter",sans-serif;
  letter-spacing:.26em;text-transform:uppercase;color:var(--bronze)}
.pulse-stream .excu-line{margin:0;font:400 31px/1.07 "Cormorant Garamond",Georgia,serif;
  color:var(--linen);letter-spacing:.004em}
.pulse-stream .excu-rule{height:1px;margin:16px 0;
  background:linear-gradient(90deg,var(--bronze),transparent)}
.pulse-stream .excu-ctx{margin:0;font:400 16.5px/1.5 "Cormorant Garamond",Georgia,serif;color:var(--muted)}
.pulse-stream .excu-punch{margin:15px 0 0;font:italic 600 18px/1.3 "Cormorant Garamond",Georgia,serif;color:var(--bronze)}
.pulse-stream .excu-dim{position:absolute;top:18px;right:18px;font:600 10px/1 "Inter",sans-serif;
  letter-spacing:.1em;color:var(--bronze);opacity:.82}

/* ---- WILDCARD: hold-to-lift excavator rig ---- */
.pulse-stream .exrig{position:relative;width:min(94%,440px);margin:2px auto 0;
  -webkit-user-select:none;user-select:none}
.pulse-stream .ex-svg{display:block;width:100%;height:auto;overflow:visible}
.pulse-stream .ex-grid{stroke:color-mix(in oklab,var(--bronze) 15%,transparent);stroke-width:1;fill:none}
.pulse-stream .ex-ground{stroke:var(--muted);stroke-width:1.5}
.pulse-stream .ex-groundband{fill:color-mix(in oklab,var(--muted) 16%,transparent);stroke:none}
.pulse-stream .ex-wall,.pulse-stream .ex-roof{stroke:var(--shell);stroke-width:1.6;fill:none;
  stroke-linejoin:round}
.pulse-stream .ex-roof{fill:color-mix(in oklab,var(--shell) 10%,transparent)}
.pulse-stream .ex-machine line,.pulse-stream .ex-machine rect,.pulse-stream .ex-machine circle{
  stroke:var(--linen);stroke-width:1.7;fill:none;stroke-linecap:round;stroke-linejoin:round}
.pulse-stream .ex-machine .ex-cab{fill:color-mix(in oklab,var(--linen) 8%,transparent)}
.pulse-stream .ex-machine .ex-tracks{fill:color-mix(in oklab,var(--linen) 6%,transparent)}
.pulse-stream .ex-machine .ex-boom{stroke-width:3}
.pulse-stream .ex-machine .ex-stay{stroke:var(--muted);stroke-width:1.1;stroke-dasharray:3 3}
.pulse-stream .ex-machine .ex-pulley-pin{fill:var(--linen);stroke:none}
.pulse-stream .ex-cable{stroke:var(--muted);stroke-width:1.3}
.pulse-stream .ex-spreader{fill:var(--linen);stroke:none}
.pulse-stream .ex-sling{stroke:var(--muted);stroke-width:1.2}
.pulse-stream .ex-beam{fill:var(--bronze);stroke:color-mix(in oklab,#000 28%,var(--bronze));stroke-width:1}
.pulse-stream .ex-grain{stroke:color-mix(in oklab,#000 22%,var(--bronze));stroke-width:.8;opacity:.6}
.pulse-stream .ex-dim{stroke:var(--bronze);stroke-width:1;fill:none}
.pulse-stream .ex-dimtxt{fill:var(--bronze);font:600 10px/1 "Inter",sans-serif;letter-spacing:.08em}
.pulse-stream .ex-badge{opacity:0;transition:opacity .5s ease .15s}
.pulse-stream .exrig.set .ex-badge{opacity:1}
.pulse-stream .ex-badge-txt{fill:var(--bronze);font:600 12px/1 "Inter",sans-serif;letter-spacing:.14em}
.pulse-stream .exrig.set .ex-cable,.pulse-stream .exrig.set .ex-sling{opacity:.25}
.pulse-stream .ex-machine.revving{animation:ex-shud .12s linear infinite}
@keyframes ex-shud{0%,100%{transform:translate(0,0)}25%{transform:translate(.5px,-.3px)}
  50%{transform:translate(-.4px,.4px)}75%{transform:translate(.3px,.2px)}}
.pulse-stream .ex-puffs circle{fill:var(--muted);opacity:0}
.pulse-stream .ex-machine.revving ~ .ex-puffs circle{animation:ex-puff 1.1s ease-out infinite}
.pulse-stream .ex-puffs circle:nth-child(2){animation-delay:.45s}
@keyframes ex-puff{0%{opacity:0;transform:translateY(0) scale(.6)}30%{opacity:.5}
  100%{opacity:0;transform:translateY(-22px) scale(1.3)}}
.pulse-stream .ex-load{height:6px;width:min(70%,240px);margin:11px auto 0;border-radius:5px;
  background:color-mix(in oklab,var(--muted) 22%,transparent);overflow:hidden}
.pulse-stream .ex-load-fill{display:block;height:100%;width:0;border-radius:5px;
  background:linear-gradient(90deg,var(--bronze),color-mix(in oklab,var(--bronze) 55%,var(--linen)))}
.pulse-stream .ex-loadlab{display:block;text-align:center;margin-top:5px;
  font:600 8.5px/1 "Inter",sans-serif;letter-spacing:.24em;text-transform:uppercase;color:var(--muted)}
.pulse-stream .ex-crank{display:block;margin:12px auto 0;padding:11px 28px;cursor:pointer;
  font:600 11px/1 "Inter",sans-serif;letter-spacing:.2em;text-transform:uppercase;color:#1a160f;
  background:var(--bronze);border:none;border-radius:999px;touch-action:none;
  -webkit-user-select:none;user-select:none;box-shadow:0 4px 14px -4px var(--bronze)}
.pulse-stream .ex-crank:active{transform:translateY(1px)}
.pulse-stream .exrig.set .ex-crank{background:transparent;color:var(--bronze);box-shadow:none;
  border:1px solid color-mix(in oklab,var(--bronze) 55%,transparent)}
.pulse-stream .ex-cap{margin:15px auto 2px;max-width:30em;text-align:center;opacity:0;
  transition:opacity .6s ease .2s;font:400 16px/1.5 "Cormorant Garamond",Georgia,serif;color:var(--muted)}
.pulse-stream .exrig.set .ex-cap{opacity:1}
@media (prefers-reduced-motion:reduce){
  .pulse-stream .ex-machine.revving{animation:none}
  .pulse-stream .ex-puffs circle{animation:none!important;opacity:0}}

/* ===== WILDCARD #024 — WALK IT (scrub-to-travel) ==========================
   Drag the knob the full width to walk the 20 km: the trail pans forward, the
   summer light warms toward gold, the odometer climbs 0.0→20.0, and only at the
   far end does "Back at it." seat. You can't skip to the end — the reset IS the
   distance. New mechanic: horizontal scrub-a-distance. */
.pulse-stream .trek{--warm:0;width:min(86%,440px);margin:2px auto 0}
.pulse-stream .tk-stage{position:relative;aspect-ratio:4/5;overflow:hidden;border-radius:14px;
  background:#10100e;touch-action:none;cursor:ew-resize;user-select:none}
.pulse-stream .tk-img{position:absolute;left:0;top:0;height:100%;width:auto;max-width:none;display:block;
  will-change:transform;-webkit-user-drag:none;user-select:none;filter:saturate(1.03)}
.pulse-stream .tk-warm{position:absolute;inset:0;pointer-events:none;mix-blend-mode:soft-light;
  background:linear-gradient(105deg,rgba(255,180,80,0) 0%,rgba(255,150,40,.55) 58%,rgba(214,108,26,.62) 100%);
  opacity:var(--warm);transition:opacity .05s linear}
.pulse-stream .tk-vig{position:absolute;inset:0;pointer-events:none;box-shadow:0 0 80px 16px rgba(0,0,0,.45) inset}
.pulse-stream .tk-od{position:absolute;left:13px;top:11px;pointer-events:none;
  font:600 12px/1 ui-monospace,Menlo,monospace;letter-spacing:.06em;color:#f7f2e9;
  text-shadow:0 1px 7px rgba(0,0,0,.7)}
.pulse-stream .tk-od .tk-km{font-size:22px;font-weight:700;font-variant-numeric:tabular-nums}
.pulse-stream .tk-od .tk-u{opacity:.72;margin-left:3px;font-size:12px}
.pulse-stream .tk-stamp{position:absolute;left:0;right:0;bottom:18px;text-align:center;pointer-events:none;
  font:600 21px/1.1 "Cormorant Garamond",Georgia,serif;color:#fff;letter-spacing:.01em;
  opacity:0;transform:translateY(9px);transition:opacity .55s ease,transform .55s ease;
  text-shadow:0 2px 16px rgba(0,0,0,.75)}
.pulse-stream .trek.done .tk-stamp{opacity:1;transform:none}
.pulse-stream .tk-track{position:relative;height:30px;margin:15px 8px 0}
.pulse-stream .tk-rail{position:absolute;left:0;right:0;top:50%;height:4px;transform:translateY(-50%);
  border-radius:3px;background:var(--line)}
.pulse-stream .tk-fill{position:absolute;left:0;top:50%;height:4px;width:0;transform:translateY(-50%);
  border-radius:3px;background:linear-gradient(90deg,var(--bronze),#e8a23c)}
.pulse-stream .tk-knob{position:absolute;top:50%;left:0;width:30px;height:30px;margin-left:-15px;aspect-ratio:1;
  transform:translateY(-50%);clip-path:circle(50%);touch-action:none;cursor:grab;
  background:radial-gradient(circle at 38% 33%,#fff7e9 0%,#f0c074 45%,var(--bronze) 100%);
  filter:drop-shadow(0 2px 6px rgba(0,0,0,.45));display:grid;place-items:center}
.pulse-stream .tk-knob::after{content:"";width:9px;height:2px;background:rgba(42,28,12,.5);
  box-shadow:0 -4px 0 -1px rgba(42,28,12,.5),0 4px 0 -1px rgba(42,28,12,.5)}
.pulse-stream .trek.walking .tk-knob{cursor:grabbing}
.pulse-stream .tk-knob:focus-visible{outline:2px solid var(--bronze);outline-offset:3px}
.pulse-stream .tk-hint{margin:9px auto 2px;text-align:center;letter-spacing:.02em;
  font:500 12.5px/1.3 "Inter",sans-serif;color:var(--muted);transition:opacity .4s}
.pulse-stream .trek.done .tk-hint{opacity:0}
.pulse-stream .tk-note{margin:16px auto 2px;max-width:34em;text-align:center;
  font:italic 400 15.5px/1.5 "Cormorant Garamond",Georgia,serif;color:var(--muted)}

/* ----- UPGRADED #024 — RESET, field log (typeset receipt) ----- */
.pulse-stream .tk-up{width:min(90%,460px);margin:2px auto 0}
.pulse-stream .tku-lead{font:400 23px/1.35 "Cormorant Garamond",Georgia,serif;color:var(--linen);
  text-align:center;margin:0 0 18px}
.pulse-stream .tku-lead .tku-em{color:var(--bronze);font-style:italic}
.pulse-stream .tku-card{border:1px solid var(--line);border-radius:12px;padding:18px 20px 20px;
  background:linear-gradient(180deg,rgba(255,255,255,.02),transparent)}
.pulse-stream .tku-stamp{font:600 10.5px/1 "Inter",sans-serif;letter-spacing:.26em;text-transform:uppercase;
  color:var(--bronze);margin:0 0 14px;border-bottom:1px solid var(--line);padding-bottom:11px}
.pulse-stream .tku-grid{display:grid;grid-template-columns:auto 1fr;gap:10px 18px;align-items:baseline}
.pulse-stream .tku-k{font:600 11px/1.3 "Inter",sans-serif;letter-spacing:.14em;text-transform:uppercase;
  color:var(--muted)}
.pulse-stream .tku-v{font:400 15.5px/1.4 "Cormorant Garamond",Georgia,serif;color:var(--linen)}
.pulse-stream .tku-v.tku-hot{color:var(--bronze);font-style:italic;font-size:17px}
