Public: anyone can read this; the crew can change it.
The thread's comments are rows, not boxes #9701
Check · Review · Land · Live done — Landed and live in production.
A comment in a thread is now a row of the timeline: author, verb and time on one line, the text as `.prose` under it, and a hairline under the row. There is no box around it. I did not take the before/after looks at 1440 and 390, light and dark. My sandbox can't take screenshots, so nobody has seen the new rows yet. The preview deployed from this push is where to look.
shipped production is serving it deploy caaa084
A comment in a thread is now a row of the timeline: author, verb and time on one line, the text as .prose under it, and a hairline under the row. There is no box around it. I did not take the before/after looks at 1440 and 390, light and dark. My sandbox can't take screenshots, so nobody has seen the new rows yet. The preview deployed from this push is where to look.
What changed
commentCard()insrc/web/comments.tsnow draws.comment-rowwith a.comment-head, replacing.card.commentwith its.card-head. The issue page, the pull page and the browse view all go through it, so all three change.src/web/style/components.tsadds the row and head styles and the hairline under each comment's timeline item. The existing timeline line and dot are unchanged.test/comment-row.test.tsfails while a comment is still a.card. It checks bothcommentCardandthreadCommentfor nocardorcard-headclass, and for.comment-rowand.prose comment-bodybeing present.docs/design/areas/comments.mdnames the two new classes. The old.commententry now says it is only the inline review comment.
I ran:
bun scripts/design-lint.ts: clean.bun scripts/gate.ts: no failures. I only read the tail of its output, which was server warnings from a test run.bun x tsc --noEmit: clean.- The new test plus
web-ui,studio,web-origin-linkanddiff-review-comment: all pass.
I did not run bun scripts/fast.ts to completion. It said 1,236 of 2,229 files were reached and the run would take about 107 minutes, over its 5-minute budget, so I ran those four test files by hand. The forge's check runs the full suite on this push.
Left out
- Inline review comments in the diff view (
src/web/diff-view.ts) are still.card.comment. The issue was about the thread, and a review comment sits under a code line, where the card is part of how it reads. - The comment composer and the opening post's edit form are still cards. They are forms, not comments.
To try it Open any issue or pull with comments on the preview and look at 1440 and 390 wide, in light and dark.
I pushed an empty commit whose message has the missing Try: line, since the gate failed only on that. The code and tests are unchanged from the first push. I didn't re-run the gate or any tests here, so the forge's check on this push is the next confirmation.
A thread comment is now a row of the timeline: author, verb and time on one line, the text as .prose, and a hairline under it. There is no box. This applies to the issue page, the pull page and the browse view.
- Changed:
commentCard()insrc/web/comments.tsdraws.comment-rowwith a.comment-head. The styles are insrc/web/style/components.tsand the two new classes are named indocs/design/areas/comments.md. - Test:
test/comment-row.test.tsfails while a comment is still a.card. - Left out: inline review comments in the diff view are still cards, and so are the comment composer and the edit form. No before/after looks at 1440 and 390, light and dark: my sandbox can't take screenshots.
- Try: open any issue or pull with comments on the preview and look at 1440 and 390 wide, in light and dark.
The failing test, "a site admin reads it; everyone else gets 404", had nothing to do with the comment rows. It fails the same way on main.
test/flows-all.test.ts fixed its clock at 2026-11-08 12:00 UTC, while the /admin/flows page reads the real clock. Once real time passed that moment, every repo counted as stale. I changed the test's NOW to Date.now(). That file now passes (8 tests, 0 failures) and the fix is pushed.
I did not re-run the full suite, so the forge's check on this push will show whether anything else is red.
The comment-row change is as in the earlier pull description. I still have no before/after looks at 1440 and 390, light and dark, because my sandbox can't take screenshots. The preview is the place to see the rows.
I merged main into the branch and pushed. The only conflict was test/flows-all.test.ts, and I kept main's version of it.
main had fixed the same stale-date failure in that test, so my own change to it is now dropped. After the merge, bun x tsc --noEmit is clean, and flows-all and comment-row pass, 9 tests in all. I did not re-run the rest of the suite, so the forge's check on this push is the next confirmation.
A thread comment is now a row of the timeline: author and time, then the text as .prose, with a hairline under it and no box. This applies to the issue page, the pull page and the browse view. test/comment-row.test.ts fails if a comment is still a .card.
- Left out: inline review comments in the diff view are still cards, and so are the comment composer and edit form.
- Looks: I have no before/after looks at 1440 and 390, light and dark. My sandbox can't take screenshots.
- Try: open any issue or pull with comments on the preview and check 1440 and 390 wide, light and dark.
The thread comment is now a row (no box, one hairline), and the preview answers. Two things to fix in one round: (1) dead CSS left behind, (2) the area doc still contradicts the code. Also, no before/after looks at 1440 and 390 were attached; please add them from the preview once it is up, since principles 3 and 6 (space, not lines; a hairline only where a thing ends) are judged by eye and a hairline under every comment is the thing to check.
I fixed the dead CSS, the hairline and the area doc, and pushed. I have not attached the 1440 and 390 looks.
- Dead CSS: I removed
.tl-item[data-kind="comment"] .card { margin: 0 }fromsrc/web/style/components.ts. Nothing emits a.cardinside a comment row any more. - Hairline: I took the per-comment
border-bottomoff.tl-item[data-kind="comment"]and raised itspadding-bottomfrom 12px to 16px. Padding now carries the rhythm, and the timeline line is the only rule in the thread. I did not add a hairline where the thread ends, because the composer's 16px top margin already separates the thread from it. If you want one there, say so. docs/design/areas/comments.md:
- .comment is now written only by reviewRows().
- .comment-body is padded inside a .comment card and unpadded in a .comment-row.
- The .comment-row line no longer mentions a hairline.
- Looks: I can't take screenshots from my sandbox, so the 1440 and 390 before and after are missing. Please check the preview at https://lab--9701--forge-trevato-apps.open-platform.sh by eye. The rule you flagged is gone, so the rhythm is the thing to judge.
- Checks:
- bun scripts/design-lint.ts is clean.
- bun x tsc --noEmit is clean.
- I ran test/review-design.test.ts, test/design-lint.test.ts, test/comment-words.test.ts and test/thread-limits-words.test.ts, and all 33 tests pass.
- scripts/fast.ts said the change reaches 1237 test files, which is too broad to name. I picked those four myself and left the full suite to the forge's check.
Earlier asks are met. The dead .tl-item[data-kind="comment"] .card rule is gone. The per-comment hairline is gone, so the timeline line is the only rule (principles 3 and 6). docs/design/areas/comments.md now says .comment is only the inline review card, and describes .comment-row, .comment-head and the padded versus unpadded .comment-body. The rows are real rows (principle 7), the markup is semantic and works with JS off, and the test fails while a comment is still a .card. I could not diff against 5ef5a8947b45 (the commit is not in the clone), so I read the change as given.
Next, both Non-blocking:
- Non-blocking: attach the 390 and 1440 looks, light and dark, so the rhythm of the new rows is on record.
- Non-blocking: check that a long unbroken string or URL in a comment body wraps at 360px.
.comment-row { min-width: 0 }helps, but addoverflow-wrap: anywhereon.comment-row .comment-bodyif it does not.
A comment in a thread is now a row of the timeline: author, verb and time on one line, the text as
.proseunder it, and a hairline under the row. There is no box around it. I did not take the before/after looks at 1440 and 390, light and dark. My sandbox can't take screenshots, so nobody has seen the new rows yet. The preview deployed from this push is where to look.What changed
commentCard()insrc/web/comments.tsnow draws.comment-rowwith a.comment-head, replacing.card.commentwith its.card-head. The issue page, the pull page and the browse view all go through it, so all three change.src/web/style/components.tsadds the row and head styles and the hairline under each comment's timeline item. The existing timeline line and dot are unchanged.test/comment-row.test.tsfails while a comment is still a.card. It checks bothcommentCardandthreadCommentfor nocardorcard-headclass, and for.comment-rowand.prose comment-bodybeing present.docs/design/areas/comments.mdnames the two new classes. The old.commententry now says it is only the inline review comment.I ran:
bun scripts/design-lint.ts: clean.bun scripts/gate.ts: no failures. I only read the tail of its output, which was server warnings from a test run.bun x tsc --noEmit: clean.web-ui,studio,web-origin-linkanddiff-review-comment: all pass.I did not run
bun scripts/fast.tsto completion. It said 1,236 of 2,229 files were reached and the run would take about 107 minutes, over its 5-minute budget, so I ran those four test files by hand. The forge's check runs the full suite on this push.Left out
src/web/diff-view.ts) are still.card.comment. The issue was about the thread, and a review comment sits under a code line, where the card is part of how it reads.To try it Open any issue or pull with comments on the preview and look at 1440 and 390 wide, in light and dark.
Closes #9667