/* =============================================================================
   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 hairline of the brand spectrum along the top edge */
  content: ""; position: absolute; left: 0; right: 0; top: 0; height: 2px;
  background: var(--spectrum); opacity: .9;
}

.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))}
@media (prefers-reduced-motion:reduce){
  .pulse-stream .psilent{animation:none;opacity:.9}
  .pulse-stream .plive.today{animation:none;opacity:1}
}

/* ---- #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 "Claude" wordmark;
   (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. */
.pulse-stream .beat-note{
  position:relative;margin:20px 0 2px;padding:14px 16px;
  border-radius:12px;
  background:color-mix(in srgb, var(--shell) 4%, transparent);
  border:1px solid color-mix(in srgb, var(--shell) 9%, transparent);
}
.pulse-stream .beat-note::before{
  content:"";position:absolute;left:0;right:0;top:0;height:2px;
  border-radius:12px 12px 0 0;
  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}}
.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)}}
