[object Object]

← back to AbramsEgo

Sessions panel: label firstUser as a 'session opener' transcript snippet (quoted/italic/muted, 140-char truncate, full text on hover) so old pastes can't read as live status

894ff24b30e0bfc8ff730d76dd134612dae85e62 · 2026-07-22 20:51:52 -0700 · Steve

Files touched

Diff

commit 894ff24b30e0bfc8ff730d76dd134612dae85e62
Author: Steve <steve@designerwallcoverings.com>
Date:   Wed Jul 22 20:51:52 2026 -0700

    Sessions panel: label firstUser as a 'session opener' transcript snippet (quoted/italic/muted, 140-char truncate, full text on hover) so old pastes can't read as live status
---
 public/index.html | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/public/index.html b/public/index.html
index 1ff27a9..256f080 100644
--- a/public/index.html
+++ b/public/index.html
@@ -148,6 +148,11 @@
   .lrow-top{display:flex;justify-content:space-between;gap:10px;align-items:baseline}
   .lrow-when{margin-top:2px}
   .when{font-size:9.5px;color:var(--dim);white-space:nowrap}
+  /* historical transcript snippet (session opener) — must NEVER read as live status */
+  .sess-open{margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
+  .sess-open-label{font-size:8.5px;letter-spacing:.08em;text-transform:uppercase;color:var(--dim);
+    border:1px solid var(--line);border-radius:20px;padding:1px 6px;margin-right:6px;vertical-align:1px}
+  .sess-open-quote{font-size:10px;font-style:italic;color:var(--dim)}
   /* sort + density control bar shared by every grid/list */
   .gridctl{display:flex;gap:12px;align-items:center;margin:0 0 10px;flex-wrap:wrap}
   .gridctl select,.gridctl input[type=range]{background:#0c1420;border:1px solid var(--line);color:var(--ink);
@@ -554,8 +559,15 @@ async function load(){
   $('wins').innerHTML=(w.recent||[]).map(x=>lrow(esc(x.title),`<span class="dim">${esc(x.project||'')}</span>`,whenChip(x.createdAt,x.date))).join('')||'<span class="muted">no wins logged</span>';
 
   // ---- sessions ----
+  // firstUser is a HISTORICAL transcript snippet (the session's opening paste) —
+  // label it "session opener" + quote/italic/mute + truncate so it can never be
+  // mistaken for a live status card. Full text stays on hover via title=.
+  const sessOpener=(t)=>{ if(!t) return '';
+    const one=String(t).replace(/\s+/g,' ').trim();
+    const cut=one.length>140?one.slice(0,140).replace(/\s+\S*$/,'')+'…':one;
+    return `<div class="sess-open" title="${esc(one)}"><span class="sess-open-label">session opener</span><span class="sess-open-quote">&ldquo;${esc(cut)}&rdquo;</span></div>`; };
   const ss=(d.sessions&&d.sessions.recent)||[];
-  $('sessions').innerHTML=ss.map(x=>lrow(esc(x.title||x.cwd||'session'),`${x.msgCount!=null?x.msgCount+' msg':''}`,whenChip(x.lastTs,x.mtime,x.firstTs))).join('')||'<span class="muted">no sessions</span>';
+  $('sessions').innerHTML=ss.map(x=>lrow(esc(x.cwd||'session'),`${x.msgCount!=null?x.msgCount+' msg':''}`,whenChip(x.lastTs,x.mtime,x.firstTs)+sessOpener(x.firstUser))).join('')||'<span class="muted">no sessions</span>';
 
   // ---- scoreboard (the game-state hero; reuses everything already in d) ----
   renderScoreboard(d);

← 57b6bb9 auto-save: 2026-07-22T20:46:37 (1 files) — data/local-fleet.  ·  back to AbramsEgo  ·  auto-save: 2026-07-22T21:16:47 (1 files) — data/local-fleet. 930cb22 →