feat(panel): Inbox thread heads are the writer's chip, its face on the thread's line

Merged
DA
5d ago
+168-109

Builds design A · Chip on the rail, the one the developer picked, and drops "draft" after "You".

What changed

  • Each comment's head is the standard chip. It uses ActorRef without nameOnly, so the face and name are one target that hangs the standard card (actorCard). The agent uses AgentActorRef, so it gets its tile and its tab's card, the same as everywhere else. The time follows the chip.
  • The chip's face is the gutter. Comment no longer draws a separate face column. The head starts 2px in, so the chip's 16px face sits centred on the thread line at the same x as the old 20px gutter faces. The name and time run to its right, and the body keeps its old indent (--inbox-face + 12px).
  • The line runs through the faces. Each comment draws the line from its own face down to the next comment's face. Each head sits above the line (z-index: 1), and the face's ring in --luke-color-ground masks the line, the same way facepile faces are cut from the ground. Bare squares (agents) and "someone" outlines are filled with the ground so the line never shows through their glyph. A member who left keeps their own tile. On hover, the ring takes the wash's colour so it doesn't show as a white halo.
  • The draft reply's head is the reader's "You" chip with nothing after it: no "draft" and no time.
  • Narrow widths: the head stays on one row. The writer's name truncates with an ellipsis first. What follows the time ("· Sent to Alerts") wraps beside the chip only after that, so nothing wraps underneath onto the line.
  • The older single-item layout (items from before thread version 5) uses the same Comment, so it gets the same treatment.
  • AgentActorRef's nameOnly prop had no callers left, so I removed it.

Kept as is

The answered controls in the reply, the markers (#4289 has since dropped the thread's "Waiting on you" marker on main; the rest are unchanged), the stamp-less reply, files after words, and the title in the top bar. I didn't touch the composer's internals.

Session replay

The name is still drawn by InlineRef's label, the same element as before, inside .inbox-board.ph-no-capture, and session replay masks every word. The face is the same ActorMark, whose picture address is masked as before.

Tests

desktop-inbox.test.ts:

  • New test: each comment's head holds its writer's chip with its face (agent, person, and the draft's person). No face is drawn outside the head or body. The draft head reads exactly "You". This test fails on main.
  • The existing face assertions now look for the face in the head chip (.inbox-comment-head [data-actor-ref] .actor-mark). The draft-head expectations change from "Youdraft" to "You", and the draft head has only the name part. On main, 16 tests fail against these expectations. On this branch, all 176 pass.

Screenshots

The thread has the agent's question, your answer, a teammate with a long name, the agent's follow-up, and the draft. I rendered it from the real component and stylesheets in Chromium. The dates read 1970 because the test clock is used.

BeforeAfter
Wide (760px)
Narrow (320px)

At narrow width, the long teammate name truncates and the time stays on the head's row. When the chip is hovered, the face's ring blends into the wash:

Made with Luke