Repository navigation
Merged
Conversation
matt2e
marked this pull request as ready for review
November 4, 2026 22:13
matt2e
force-pushed
the
broken-11
branch
2 times, most recently
from
November 5, 2026 00:45
25ec2bf to
bf3e4fe
Compare
Channel details showed the description as plain text, so its URLs and #channel references could not be followed. For owners and admins, the Description row's Edit button covered the whole row with an ::after overlay, so clicking anywhere in the text opened Edit channel details. The description now renders through MessageMarkdown, with the session's reference directory and the page's openLink and canOpenLink handlers. URLs, Buzz links and #channel references open their targets for every viewer. The Description row uses a new label-only SettingsDetail variant: the "Description" label and pencil open the editor, and the value no longer does. This follows DESIGN.md's rule that an independent action stays outside a row's primary click target. "No description" and "Not available" stay plain text. Members and Channel ID keep their whole-row actions. docs/channels.md describes the new contract. A Vitest case covers an editor and a member: link roles, onOpenLink targets, the editor staying closed, and the label still opening it. A browser case covers layout hit-testing, which jsdom can't model. Both fail before the fix. The header-menu journey now asserts the label-only Description row. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: mtoohey <mtoohey@squareup.com>
Follow-ups from review of the linked channel description: - Move the reference directory and synthetic row into a small ChannelDescription component. It mounts only for a non-empty description with a session and link handler, so profile and channel list snapshots no longer re-render the whole panel and its editor surface for DM, solo or empty-description channels. - Drop aria-description from the label-only Edit button. It read the raw Markdown source right before the rendered value. - Give the label a 24px minimum target, as DESIGN.md asks for inline targets, with a negative block margin so the row doesn't move. The pencil reveals on row hover again, including under reduced motion, but only the label takes the click. - Inherit the values' line height in the description cell, so it lines up with Members and Channel ID. - Restore "no animation for reduced motion" in the Channel ID docs, and describe the row-hover reveal and the label target. - Guard the panel's Escape handler like ThreadPanel's: skip it when the event is already handled or comes from a portalled layer, so a description link's menu or preview card can't close the panel. New tests cover the Escape guard, the missing accessible description, the 24px target and the row-hover reveal. The Escape and description assertions fail against the previous commit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: mtoohey <mtoohey@squareup.com>
Two browser assertions from review were weaker than they looked: - The 24px label target check passed even if the negative margin-block stopped applying, because the row would just grow. The description case now checks that the Description value sits at the same offset as Members' (40px inside each row's top border). It doesn't measure the dt, which is 24px because the button's margins collapse through it. Removing the margin fails with 44 vs 39.98. - The "no row highlight" check hovered the padding and snapshotted the background at once. It now hovers the value text, waits for the row-hover pencil reveal as proof the row is hovered, then checks the background. It also hovers the label after a :hover barrier. The label hover catches a highlight rule that loses its label-only exclusion, which hovering the value can't, because the label-only button doesn't cover the value. The value hover catches a plain row-level :hover background. Each assertion fails under its deliberate CSS break in Chromium and WebKit and passes on the current CSS. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: mtoohey <mtoohey@squareup.com>
kazemek21
approved these changes
Nov 5, 2026
kazemek21
left a comment
Contributor
There was a problem hiding this comment.
Kyle reviewed this PR and the Nexus review-tracker notes and approved with no comments.
Posted by Codex (gpt-6.1-sol) on behalf of kylez.
ljknight
added a commit
to ljknight/buzz-app
that referenced
this pull request
Nov 5, 2026
* origin/main: Keep /leave commands out of channel history (block#2476) fix(agents): ask before switching or closing drops unsaved edits (block#2503) fix(agents): keep the Model settings row full width (block#2577) feat(github): show a pull request's changes beside its summary (block#2492) fix(search): open an existing DM from a ⌘K person row without a relay open; cover hidden-DM previews (block#2519) feat(search): show channel type icon in search result subtitles (block#2521) test(browser): bind port-0 fixture servers where the OS assigns (block#2564) test(browser): fix six journey sync flakes from the 2026-11-04 sweep (block#2566) fix(channels): ask before Escape, Close or an outside click drops a template draft (block#2501) fix(channels): render the channel details description as linked Markdown with a label-only Edit target (block#2506) fix(agents): let Back and Forward shortcuts traverse provider dialogs (block#2509) Fix Inbox recovery after a delayed Retry (block#2496) # Conflicts: # docs/buzz-help.md
wpfleger96
added a commit
that referenced
this pull request
Nov 5, 2026
…-service * origin/main: (68 commits) fix(messages): keep decoded images across virtualized remounts (#2474) Keep /leave commands out of channel history (#2476) fix(agents): ask before switching or closing drops unsaved edits (#2503) fix(agents): keep the Model settings row full width (#2577) feat(github): show a pull request's changes beside its summary (#2492) fix(search): open an existing DM from a ⌘K person row without a relay open; cover hidden-DM previews (#2519) feat(search): show channel type icon in search result subtitles (#2521) test(browser): bind port-0 fixture servers where the OS assigns (#2564) test(browser): fix six journey sync flakes from the 2026-11-04 sweep (#2566) fix(channels): ask before Escape, Close or an outside click drops a template draft (#2501) fix(channels): render the channel details description as linked Markdown with a label-only Edit target (#2506) fix(agents): let Back and Forward shortcuts traverse provider dialogs (#2509) Fix Inbox recovery after a delayed Retry (#2496) feat(composer): optional ⌘/Ctrl+Enter to send (#2331) test: use keyboard activation for reply caret setup (#2557) test: settle member search before invitation expansion (#2532) test(agent-command): isolate the copied executable writer (#2537) test(sidebar): wait for the rolled-back row to leave Starred before collapsing Work (#2574) test(browser): click timeline rows only after the timeline settles (#2560) ci: split Vitest across six shards so 3/4 stops hitting the job cap (#2571) ... # Conflicts: # src/app/Settings.tsx # src/bundled/goose/sessions.test.ts
agude-sq
added a commit
to agude-sq/buzz-app
that referenced
this pull request
Nov 5, 2026
* origin/main: (43 commits) feat(settings): follow the system clock and let people hide message times (block#2440) feat(plugins): repository access rules for Git imports (block#2484) feat(desktop): add Settings to the macOS app menu (block#2594) Preserve and renew external app approval (block#2464) fix(direct-messages): show verified identity in new message recipient search (block#2585) Offer plugin updates from the Buzz shell (block#2491) fix(messages): keep decoded images across virtualized remounts (block#2474) Keep /leave commands out of channel history (block#2476) fix(agents): ask before switching or closing drops unsaved edits (block#2503) fix(agents): keep the Model settings row full width (block#2577) feat(github): show a pull request's changes beside its summary (block#2492) fix(search): open an existing DM from a ⌘K person row without a relay open; cover hidden-DM previews (block#2519) feat(search): show channel type icon in search result subtitles (block#2521) test(browser): bind port-0 fixture servers where the OS assigns (block#2564) test(browser): fix six journey sync flakes from the 2026-11-04 sweep (block#2566) fix(channels): ask before Escape, Close or an outside click drops a template draft (block#2501) fix(channels): render the channel details description as linked Markdown with a label-only Edit target (block#2506) fix(agents): let Back and Forward shortcuts traverse provider dialogs (block#2509) Fix Inbox recovery after a delayed Retry (block#2496) feat(composer): optional ⌘/Ctrl+Enter to send (block#2331) ... # Conflicts: # docs/buzz-help.md
wesbillman
pushed a commit
that referenced
this pull request
Nov 5, 2026
…2402) Scope: let ⇧Esc reach Mark all as read while focus is in the Channel settings panel. Non-goals: other Escape handlers and any change to the shortcut itself. Reuses the guard from the sibling panels. One file, 2 production lines. ## What was wrong With focus inside a channel's settings panel, ⇧Esc (Mark all as read, from #2170) closed the panel and marked nothing read. ## Why On `main`, the panel's `onKeyDown` in `src/bundled/channels/ChannelSettingsPanel.tsx:101` closes on any `Escape` from inside the panel and calls `event.stopPropagation()`. Since #2506 it skips events that are already handled or come from a portalled layer, but it still has no `!event.shiftKey` check. The sibling panels got that check in #2170 (`src/features/panels/PanelCard.tsx:32`, `src/bundled/channels/useChannelPanels.tsx:152`). Because the panel stops the event, the window shortcut dispatcher (`src/features/shortcuts/service.ts`, `src/app/shell/MarkAllReadShortcut.tsx`) never sees ⇧Esc. The fix adds the same `!event.shiftKey` guard and comment the siblings use, next to the #2506 checks. Plain Esc still closes the panel. ## How verified - Extended the existing Escape test in `src/bundled/channels/ChannelSettingsPanel.test.tsx`, "closes with Escape or its close button without swallowing other keys": ⇧Esc does not call `close` and reaches a `window` keydown listener; plain Esc still closes and does not reach it. It fails without the fix and passes with it. - `bin/pnpm vitest run src/bundled/channels/ChannelSettingsPanel.test.tsx`: 28 passed after merging `main`, including #2506's handled and portalled Escape test. - `bin/just iterate`: passed. ## In-app check Build: this PR at `4b286248b`, with #2403, #2404 and #2405 at their heads then, merged locally onto `main` at `cb8c971e9`. Run as the macOS desktop app with `BUZZ_DEV_VIEWER= just desktop`. The branch was later merged with `main` twice to resolve conflicts with #1624 (test file only) and #2506 (the same Escape handler). The production behavior of this fix did not change: ⇧Esc still passes through and plain Esc from a focused control in the panel still closes it. #2506 only adds its own skips for handled and portalled events. With the mouse alone, focus never lands inside the panel in the WebKit app, so these steps need macOS Keyboard navigation (System Settings > Keyboard) or Tab focus. 1. Open Channel actions > View channel details. Press Tab until a control in the panel shows a focus ring. Esc closes the panel. 2. Reopen the panel and Tab in again. ⇧Esc keeps the panel open and shows "Mark everything as read?". Where focus goes after opening the panel from the menu is a separate issue. buzz-review-completed --------- Signed-off-by: Cheng Peng <cheng@block.xyz> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Cursor <cursoragent@cursor.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What changed
In Messages → channel → ⋯ Channel actions → View channel details, the Description row now renders through
MessageMarkdown, the same renderer messages use, instead of plain text.#channelreferences are real links for every viewer: owners, admins and plain members.#nameonly links when it exactly matches a channel name, including case.**/_markers.Link safety is the same as in messages: raw HTML is skipped, only Buzz, profile and http(s) URLs pass
safeLinkUrl, images render as alt text, and external links gettarget=_blank rel="noopener noreferrer".Why
Before this change, the description was plain text, so its URLs and
#channelreferences couldn't be followed. For owners and admins it was worse: the Edit button covered the whole row with an::afteroverlay, so clicking a URL in the description opened Edit channel details.docs/channels.mddocumented that whole-row behaviour on purpose, and this PR updates it. Lifting the links above the overlay was rejected, because DESIGN.md says to "keep an independent row action outside the row's primary click target". The label-onlySettingsDetailvariant follows that rule.Scope
This PR covers channel details only. ⌘K and the join notice are left alone on purpose. Unjoined channels still show only "Public channel · not joined" in ⌘K, and the join notice still says only "Join channel to send messages". Showing the description there edits the same lines as #2333 (member counts in channel results) and #2301 (joining read-only spaces), so it will be a separate follow-up PR stacked on those two.
BuzzLinkPreviewis also out of scope (see Open points).Before / after
Both sides ran the same Playwright script against the same fixture, viewport (1280×800), light theme and timeline. Before is
0b2dfbf988(this branch's base). After is8e1ffa8dcc; the last commit only changes tests. The fixture description is**R2 ops** on-call. Runbook: https://example.test/r2-runbook · escalate in #Beta · _quiet hours after 22:00 UTC_.description-before-after.mp4
Each side gets the same clicks at the same moment. Before: clicking the URL (11.4s) and
#Beta(15.9s) both open "Edit channel details". After: the URL opens a new window,#Betagoes to the Beta channel, and only the Description label (21.7s) opens the editor. The pointer, red click dot and action captions come from Playwright'sshowActionsand are not app UI.Pointer resting on "on-call". Before: raw
**and_markers, the URL as plain text wrapping at its hyphen, and the whole row greyed because the row is one button. After: bold text, underlined URL and#Betalinks, italics, and only the pencil next to "Description", with no row fill.0b2dfbf988)8e1ffa8dcc)Full-window stills behind the side-by-side image, captured losslessly with
page.screenshotat the same moment (no pointer overlay).Commits
fix(channels): link the description in channel details(43db4ea):ChannelSettingsPanelrenders a non-empty description withMessageMarkdown, using a synthetic row, the session's reference directory and the page'sopenLink/canOpenLink.ChannelsPagepasses the session and link handlers. A new label-onlySettingsDetailvariant drops the whole-row overlay for Description. CSS anddocs/channels.mdare updated, and Vitest and browser cases are added.fix(channels): tighten the linked description row in channel details(8e1ffa8): follow-ups from the first AI review (below).test(channels): prove the description row neither grows nor highlights(fce07e4): follow-ups from the second AI review (below). Test-only.AI review follow-ups
First review of 43db4ea found no blockers and five polish suggestions. All five, plus the Escape guard, landed in 8e1ffa8:
useReferenceDirectoryand the synthetic row into a smallChannelDescriptioncomponent. It mounts only for a non-empty description with a session and link handler. Profile and channel-list snapshots no longer re-render the whole panel and its editor surface for DM, solo or empty-description channels.aria-descriptionfrom the label-only Edit button. It made screen readers read the raw Markdown source right before the rendered value.line-height: inheriton the description cell, so it lines up with Members and Channel ID instead of using message line height.Second review of 8e1ffa8 found no merge blockers and confirmed all six follow-ups. It raised two test-strength suggestions, both applied in fce07e4:
margin-blockstopped applying, because the row would just grow. It now checks that the Description value sits at the same offset inside its row as Members' value (40px inside the top border).Tests
ChannelDetailsEditor.test.tsx): an editor and a member each get link roles,onOpenLinktargets, an editor that stays closed on link clicks, and a label that still opens it.ChannelSettingsPanel.test.tsxcovers the Escape guard and the missing accessible description.tests/browser/channel-settings.spec.mjs. It's a browser case because it checks layout: which element gets a click at a given point, the 24px label target, row offsets and hover paint. jsdom can't model any of that.tests/browser/channel-header-menu.spec.mjsnow expects the Description row to be label-only (pencil revealed, no row fill). Members still expects a whole-row action. No browser cases were removed.0b2dfbf988. The commit 2 Escape and accessible-description assertions fail on 43db4ea. Each commit 3 assertion fails under a deliberate CSS break in Chromium and WebKit; for example, removing the margin gives 44 vs 39.98.Checks run
On fce07e4 (the PR head), locally on a Blox workstation:
src/bundled/channels: pass (1,000 tests across 60 files)tests/browser/channel-settings.spec.mjsandtests/browser/channel-header-menu.spec.mjs: pass in Chromium and WebKit (18 runs)Not run:
main. This branch is based on0b2dfbf988.git merge-treeshows a clean merge withmain, butmainhas since changeddocs/channels.md,Channels.module.css,ChannelsPage.tsxandchannel-header-menu.spec.mjs.Hosted CI is the first run on a merged tree.
Open points
#channelpreview card can cover the Description label. Hovering#Betain the description shows MessageLink's existing channel preview card. The card can hide the "Description" label and pencil, which is now the only way to start editing. In the recording the card had dismissed before the pointer reached the label, so the click worked, but this interaction is new to the panel.BuzzLinkPreviewstill shows them raw. The same channel can look different in the two places; for example,# Opsbecomes a heading in the panel. This trade-off was accepted for this PR, andBuzzLinkPreviewwas out of scope.How to test
**Ops** runbook: https://example.com · see #<another channel's exact name> · _quiet hours_.#channelare underlined links. Hovering the row shows the pencil next to "Description" but doesn't fill the row.#channellink. Expected: it goes to that channel.🤖 Generated with Claude Code