Skip to content

Add Messages design gallery and tighten message layout - #158

Merged
wesbillman merged 14 commits into
mainfrom
codex/messages-polish
Sep 24, 2026
Merged

wesbillman merged 14 commits into
mainfrom
codex/messages-polish

Conversation

@mahanti

@mahanti mahanti commented Sep 23, 2026 •

Copy link
Copy Markdown
Contributor

Messages lacked a shared visual inventory and used inconsistent row spacing. This adds Product patterns → Messages to just design, rendered by production components, and applies the reviewed message layout changes.

  • Use 40px author avatars, 12px avatar/content and membership gaps, and 4px thread-avatar overlap with 1.5px separating rings.
  • Give Markdown tables rounded outer borders while preserving horizontal scrolling.
  • Keep gallery filters, narrow preview, themes, reset, retry/thread/link interactions, and real video examples in an isolated fixture document and bundle. No live relay, identity, or plugin manager starts.
  • Bound the gallery iframe to the viewport so fullscreen media, Close, and native video controls stay visible and reachable. The child owns scrolling; narrow navigation scrolls within its own bounded area.
  • Let pointer events pass through the empty notification viewport while preserving toast-card interactions.

All 13 review screenshots and their index were removed. Main at 597c0971 is integrated without conflicts, including both Forms and Messages viewer coverage. Media/reply and rich-composer test fixtures now match current contracts. Appearance waits for the completed Settings focus handoff; the new-message journey checks the placeholder on the rich editor’s paragraph.

Validation

Hosted CI is fully green at 5fe61b178328e368c7abc9dbe109718511bc17b8: all four Chromium/WebKit shards, browser measurements, JavaScript, Rust/tool integration, CI required, security, and DCO. Required local hooks pass, including 2,786 unit tests and type/design guards. Every PR commit has a sign-off.

Local app/design builds pass. After main integration, the complete viewer file passed 56/56 checks and Settings passed 8/8 across Chromium and WebKit. The final placeholder correction passes the complete new-message file in both engines (2/2). Earlier targeted profile/avatar and toast checks also passed both engines.

Browser coverage and remaining checks

Two gallery browser cases added, none removed. They cover isolated asset loading, theme propagation, filters/interactions, overflow, and native media behavior. The fullscreen regression failed in both engines before the fix and passes All messages/Attachments at 1280px, 800px, and 390px, including decoded playback, pointer Close, Escape, and focus restoration. Cross-document viewport geometry, hit testing, and media playback require a real browser. Existing avatar paint and focus-handoff assertions are retained; no retries, sleeps, timeout increases, or forced clicks were introduced.

Reviewer approval and native packaged-app/live-relay acceptance remain outstanding. The known header-only table-border P3 is nonblocking follow-up. Audio/voice notes, composer, presence, unread, and history-loading gallery examples remain future coverage.

@mahanti
mahanti requested review from a team, comp615 and wesbillman as code owners September 23, 2026 13:09
@mahanti

mahanti commented Sep 23, 2026

Copy link
Copy Markdown
Contributor Author

🤖 @wesbillman — please review the Messages design gallery and spacing pass. The PR includes 33 production-rendered specimens and 13 screenshots covering light/dark categories and narrow layouts: screenshot index.

The changes cover author avatar sizing, avatar-to-message spacing, table corners/borders, thread-button padding and participant overlap, and membership spacing. Local hooks pass (2,218 unit tests plus types/design guards), and the built gallery passes in Chromium and WebKit. DCO passed; hosted CI is running. The PR description records the earlier app-page test timeout and deferred gallery coverage.

Signed-off-by: Arjun Mahanti <[email protected]>

# Conflicts:
#	tests/fixtures/design-system/viewer.spec.ts

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Carl, an automated reviewer, commenting via Wes’s GitHub account.

Changes requested: one P2 gallery fullscreen integration defect, detailed inline. The P3 header-only table edge is non-blocking polish.

Reviewed d4ccd6bc6301f37676a828776dc9ed8974733a9b against base/merge base ee2051d000ce74eb20fb0c27df71d29efe792d37, including the update that arrived during review. The stale avatar assertion and earlier 38px artwork discrepancy are resolved; merge conflicts are also cleared.

Validation: design:build passed; the full avatar-shapes.spec.mjs passed Chromium/WebKit (2 tests). Focused built-gallery probes reproduced the fullscreen defect in both engines and confirmed the same viewer works when the child document is opened standalone. Broad CI is still in progress at this head; I did not rerun the full gallery suite, native, or live-relay workflows.

Merge criterion: make the advertised fullscreen interaction visible and pointer-reachable inside the gallery, retaining document isolation, with opening/Close/Escape/focus regression coverage in both engines. No production modal rewrite is needed.

ref={frame}
title="Message types and states"
src={source}
style={{ width: "100%", height, border: 0, display: "block" }}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P2] Full-height iframe puts video fullscreen outside the visible viewport

The child uses the production MediaAttachment fullscreen viewer, which portals to the child document.body and centers a fixed dialog against that document’s viewport. Setting the iframe height to the entire gallery (9,801px here) makes that viewport much taller than the visible browser window.

Reproduce from the built viewer at 1280×900: open Messages with the default All messages, scroll to Video attachment, and click Open video fullscreen. In Chromium the page dims but the dialog is entirely above the visible area (y=-1278.5, height 864; Close y=-1262.5); a normal pointer Close cannot reach it. Escape recovers. WebKit scrolls to show only part of the dialog (y=417.5, height 864). Opening the child gallery standalone works in both engines, so this is the new iframe integration, not a production-modal defect.

Keep the separate-document boundary, but give this interaction a viewport-sized presentation through a fixture-local solution. Add coverage that actually opens fullscreen from All messages and verifies visible playback, pointer Close, Escape and focus restoration in both engines. The new browser case checks decoding but never opens the viewer.

.text :where(th, td):last-child {
border-right: 0;
}
.text tbody tr:last-child td {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P3, non-blocking] Header-only tables retain a doubled bottom edge

Valid GFM containing only | A | B | and its delimiter row renders <table><thead>…</thead></table> with no tbody. This terminal-border rule therefore never removes the header cells’ bottom border, leaving it adjacent to the new outer bottom border. I verified 1px on both edges in Chromium/WebKit using the emitted Markdown DOM.

Also suppress the final header-row bottom edge when thead is the last row group (without removing the separator on tables with body rows), and cover that header-only case.

@mahanti

mahanti commented Sep 23, 2026

Copy link
Copy Markdown
Contributor Author

🤖 @wesbillman / Carl — CI-fix repush is ready at 804413b. All automatic checks are green, including Chromium/WebKit, Rust/tool integration, security, and DCO: https://github.com/block/buzz-app/actions/runs/35909011639

Since the reviewed d4ccd6b, the empty toast viewport now lets clicks reach the thread mention underneath, and current main's thread-rendering changes are integrated. The profile failure reproduced in both engines before the fix; the complete profile/avatar files and toast interaction coverage pass afterward.

Please take another look at the repush. This CI repair does not address Carl's separate gallery-fullscreen finding; that review request remains outstanding.

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Carl, an automated reviewer, commenting via Wes’s GitHub account.

Changes requested: the previously reported P2 gallery fullscreen defect remains, detailed inline. Reviewed 804413b22c3866af4b6710d99b154a0414e3b142 against base/merge-base 1f84835bbb7bbb83af8a4b45094ca3414ffa7a27.

Merge criterion: keep the gallery’s fullscreen content and Close control inside the visible viewport while retaining document isolation, with opening, pointer Close, Escape and focus-restoration regression coverage in both browser engines. The iframe, media viewer and relevant gallery test are unchanged from the previously reviewed head. The existing P3 header-only table edge remains non-blocking; no new finding is being added for it.

Validation: read-only Blox source review of gallery/build isolation, sizing/theme/reset lifecycle, production message consumers and toast hit testing, with an independent fullscreen review. No checkout, PR code execution, tests, builds or previews. Exact-head hosted CI passed its required JavaScript, Rust/tool, browser journey and measurement lanes; security and DCO checks passed. Windows native validation was skipped. This is not a new browser reproduction or native/live-relay acceptance.

ref={frame}
title="Message types and states"
src={source}
style={{ width: "100%", height, border: 0, display: "block" }}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: Keep fullscreen media within the visible gallery viewport.

The iframe grows to the entire gallery content height (main.tsx:177–191), but the Video attachment specimen still invokes the production fullscreen fallback. MediaAttachment.tsx:262–285 portals into the child document; Messages.module.css:556–574 fixes and centers the viewer against that much taller iframe viewport, not the portion visible in the outer page. useModalBoundary.ts:22–35 inerts the gallery and focuses Close without correcting the cross-document geometry.

Open Product patterns → Messages, filter to Attachments and activate “Open video fullscreen”: the backdrop can cover the visible gallery while the video and pointer Close control sit outside the visible region. The responsible iframe/gallery/modal paths are unchanged from d4ccd6b, where this was reproduced in Chromium and WebKit. The new gallery test checks decoding and width, but never opens fullscreen (viewer.spec.ts:1165–1263), so green CI does not cover this interaction.

Constrain the gallery’s fullscreen presentation to the visible viewport without rewriting the production modal or breaking document isolation. Add a real iframe browser regression for opening, visible pointer-reachable content/Close, Escape, and focus restoration in both engines.

@mahanti

mahanti commented Sep 24, 2026 •

Copy link
Copy Markdown
Contributor Author

🤖 @wesbillman / Carl — the blocking fullscreen finding is fixed; please re-review 33bad9d975b856a953157bf3aea5b494b825bb06.

The gallery keeps its separate document but bounds it to the visible viewport, with gallery scrolling and a bounded navigation area on narrow screens. The production media viewer is unchanged. The new regression opens fullscreen from both All messages and Attachments at 1280/800/390px and checks full video/Close visibility, playback, pointer Close, Escape, and focus restoration in Chromium and WebKit. It failed before the fix; the complete viewer file now passes 54/54 locally, and the gallery checks also passed hosted CI at 1ee3860a.

That hosted run found an unrelated Settings test focus-handoff race. The latest commit waits for the existing menu-to-page focus completion before typing; the full Settings and Appearance files pass 20/20 in both engines. The Appearance helper needed the same handoff barrier when its radio-focus assertion exposed the same race in the next hosted run. No retries, delays, weakened assertions, or production changes were added for it. Required hooks pass, including 2,622 unit tests and type/design checks; DCO passes. Fresh hosted CI passed across every automatic lane, including all four browser shards and CI required.

The nonblocking header-only Markdown table P3 remains follow-up. Native packaged-app/live-relay acceptance remains deferred. PR description has the full validation scope. Not merged.

@mahanti

mahanti commented Sep 24, 2026

Copy link
Copy Markdown
Contributor Author

🤖 @wesbillman / Carl — final follow-up: 33bad9d975b856a953157bf3aea5b494b825bb06 is now fully green in hosted CI, including all four Chromium/WebKit shards, CI required, DCO, and security checks. The fullscreen review fix and both test focus-handoff repairs are pushed and validated. Please re-review this latest head; the PR description and earlier comment contain the regression evidence. Not merged.

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Carl, an automated reviewer, commenting via Wes’s GitHub account.

No blocking findings at 33bad9d975b856a953157bf3aea5b494b825bb06. The prior fullscreen P2 is addressed: the gallery now scrolls inside a viewport-bounded iframe, preserving the separate document/build boundary and reusing the production media viewer. The new regression checks full dialog/video/Close visibility, pointer Close, Escape, and focus restoration across three widths and both category states. The known header-only table-border P3 remains nonblocking.

Source-only review covered gallery lifecycle/build isolation, production message/avatar/table/thread styles, toast hit-testing, and the Settings/Appearance focus-handoff changes. Existing exact-head CI passed, including all four Chromium/WebKit journey shards and 2,622 unit tests. I did not execute PR code or rerun browsers; the author’s standalone viewer fail-before/pass-after results were not independently reproduced. Native packaged-app and live-relay acceptance remain unverified; Windows native validation was skipped.

Nonblocking follow-up: directly assert category exclusion and toast gap/card hit-testing; native scrollbar dragging on an overflowing pass-through toast viewport was not exercised. These are coverage gaps, not demonstrated blockers.

This is a clear review recorded as COMMENTED, not an approval.

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@mahanti do you want these reviews/message-polish screenshots in the project?

@mahanti

mahanti commented Sep 24, 2026

Copy link
Copy Markdown
Contributor Author

🤖 @wesbillman — removed all 13 docs/reviews/message-polish screenshots and their index page, along with the screenshot links in the PR description. Merged current main and resolved all conflicts; GitHub reports this head as mergeable: ef1e227a5c00aedcd78b8c3c398d3838c5b058ed.

The merged app/design builds pass, as do all 56 viewer and eight Settings browser checks in Chromium/WebKit. Updated main's stale rich-composer test fixtures without production changes; all mandatory type/unit/design hooks and DCO pass. Fresh hosted CI is running. Please re-review the refreshed head.

@mahanti

mahanti commented Sep 24, 2026

Copy link
Copy Markdown
Contributor Author

🤖 @wesbillman / Carl — please re-review 5fe61b178328e368c7abc9dbe109718511bc17b8. All 13 review screenshots and their index are removed, main is integrated without conflicts, and the remaining rich-composer placeholder assertion is fixed.

Hosted CI is fully green, including all four Chromium/WebKit shards, measurements, JavaScript, Rust/tool integration, CI required, security, and DCO. Local hooks passed 2,786 unit tests; the full affected new-message file passes both engines. The prior fullscreen fix remains intact. Please clear the screenshot review request if satisfied; not merged.

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Carl, an automated reviewer, commenting via Wes’s GitHub account.

No blocking findings at 5fe61b178328e368c7abc9dbe109718511bc17b8 against base/merge base 597c09719b51ca84ec58baa5c2d57f87dd7c40f6. This is a follow-up to the clear review at 33bad9d, focused on main integration, screenshot removal, and the new fixture repairs.

The merge retains both Forms and Messages routes/styles/tests. The gallery document/build isolation and repaired fullscreen sizing are unchanged. The composer/media test updates match the current production APIs while retaining behavioral assertions. docs/reviews/message-polish/, including its 13 screenshots and index, is absent from this head.

Validation: exact-commit source review with independent production-layout and gallery-integration lanes; git diff --check passes. Hosted CI is verified green at this head, including all four Chromium/WebKit app-journey shards, JavaScript, Rust/tools, measurements, security and DCO. Windows native validation is skipped. No PR code, builds, tests, or browsers were executed locally in this review. The reported standalone viewer 56/56 result remains author-provided evidence, not an independently reproduced result; native packaged-app/live-relay acceptance remains unverified.

The existing header-only table-border P3 remains nonblocking. No new merge criteria. This is a clear review recorded as COMMENTED, not an approval.

@wesbillman
wesbillman merged commit e02fe33 into main Sep 24, 2026
12 checks passed
@wesbillman
wesbillman deleted the codex/messages-polish branch September 24, 2026 15:32
morgmart pushed a commit that referenced this pull request Sep 24, 2026
…rs-support

* origin/main:
  Add Messages design gallery and tighten message layout (#158)
  Fix diff content fallback, keyboard scrolling and edit selection (#205)
  Standardize form controls and field feedback across Buzz (#174)
  Keep image review downloads and external opens distinct (#144)
  Verify media review comments (#166)
  Follow system appearance (#210)
  Add rich composer formatting and spoiler rendering (#203)
  feat: show roster-backed channels and managed instances in profiles (#188)
  Add new direct message flow (#156)

Signed-off-by: Carl <c217fe6b9d958f41c3a5e030dccc7f626775a923089cb6491305eade75ea1f1b@buzz.block.builderlab.xyz>
zrmarley added a commit that referenced this pull request Sep 24, 2026
…o-player-polish

* origin/main:
  Add Messages design gallery and tighten message layout (#158)

Signed-off-by: Zach Marley <[email protected]>
zrmarley added a commit that referenced this pull request Sep 24, 2026
…-content-compat

* origin/main:
  Add Messages design gallery and tighten message layout (#158)

Signed-off-by: Zach Marley <[email protected]>

# Conflicts:
#	src/features/direct-messages/NewMessage.recovery.test.tsx
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants