fix(chat): render typing-indicator elapsed hint as horizontal text
Build and Push Containers / build-and-push-app (push) Successful in 1m43s
Build and Push Containers / build-and-push-db (push) Successful in 15s

The phase-87 ".typing-elapsed" dot-geometry reset (specificity 0,1,0)
lost every shared declaration to the ".typing span" dot rule
(0,1,1): the hint rendered as an 8x8px bouncing dot and the "Ns" text
wrapped one character per line below the bubble (overflow-wrap:
anywhere on .bubble). Phase 87's e2e checked text values only, so the
squish shipped unseen.

- retarget the reset at ".typing span.typing-elapsed" (0,2,1) so it
  actually wins; center the dots while the hint line is taller
- unit: pin the reset's selector context (specificity regression guard)
- e2e: layout pin on the live hint — no dot animation, not an 8px box,
  horizontal single-line bounding box
- before/after verification screenshots in
  .agents/reports/87_big_read_progress/

Verified: unit 41 passed, phase-87 e2e 4 passed (isolated), ruff +
pyright clean.
This commit is contained in:
2026-09-08 10:03:10 -04:00
parent 5abe8871e3
commit 10fd367962
5 changed files with 58 additions and 7 deletions
+12 -3
View File
@@ -1110,7 +1110,10 @@ details.thinking .thinking-text ul { margin: 0 0 0.5rem; }
}
/* typing indicator */
.typing { display: inline-flex; gap: 5px; padding: 0.9rem 1rem; }
/* align-items: center — the dots stay vertically centered when the
phase-87 "Ns" hint (a full text line) makes the row taller; with
only the three 8px dots the centering is a visual no-op. */
.typing { display: inline-flex; align-items: center; gap: 5px; padding: 0.9rem 1rem; }
.typing span {
width: 8px; height: 8px;
border-radius: 50%;
@@ -1129,8 +1132,14 @@ details.thinking .thinking-text ul { margin: 0 0 0.5rem; }
ink-soft on the bubble surface (the AA pairing), small mono like
every status line. Plain text: no animation, no motion opt-out.
The span is a sibling of the dots inside the same .typing bubble, so
it resets the dot geometry (.typing span) it would otherwise inherit. */
.typing-elapsed {
it resets the dot geometry (.typing span) it would otherwise inherit.
The selector MUST stay ".typing span.typing-elapsed": a bare
".typing-elapsed" (0,1,0) LOSES the specificity war to the dot rule
".typing span" (0,1,1) — every reset below (width/height/border-
radius/background/opacity/animation) would be overridden and the
hint would render as an 8×8px bouncing dot with the "Ns" text
wrapping one character per line (phase-87 regression, 2026-09). */
.typing span.typing-elapsed {
width: auto;
height: auto;
border-radius: 0;