Skip to content

feat(messages): mark a message unread with Option-click - #2756

Draft
cheng-block wants to merge 3 commits into
block:mainfrom
cheng-block:cheng/feat-option-click-unread
Draft

cheng-block wants to merge 3 commits into
block:mainfrom
cheng-block:cheng/feat-option-click-unread

Conversation

@cheng-block

@cheng-block cheng-block commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor

Why

In Slack, Option-clicking a message marks it unread. In Buzz it did nothing, because nothing listened for a modified click on a message. You had to select it and press U, or use its menu.

What

Option-click (Alt-click on Windows and Linux) on a channel or thread message now marks it unread, like U.

How

  • markUnreadOnAltClick in message-selection.ts finds the message the way U does and runs the same canMarkUnread and markUnread pair.
  • It runs on the window after React's handlers. It skips controls, links, reactions, media other than custom emoji, code, the day divider, text selections, and prevented clicks.
  • An open agent row folds on any click, so the fold now ignores Option-clicks.

Risk

Low. Only an Option-click with no other modifier on a message box does anything new.

Testing

  • jsdom does not run WebKit's real Option-drag or mousedown focus. In-app step 4 covers the drag.

In-app check

Verified in the macOS app by Cheng. Alt-click on Windows and Linux was not tried; some Linux window managers take it.

Build: this PR at 814feaef8, merged locally with my other open PRs onto main at c037057a1. It ran as a debug app bundle (BUZZ_DEV_VIEWER= just desktop-bundle).

In a channel with read messages from other people:

  1. Option-click a read message's text. Its … menu now offers Mark read.
  2. Switch channels. The one you left stays bold until you open it.
  3. Option-click a link, image, reaction, code block, author name, and Reply. Each acts as usual.
  4. Option-drag across words. They stay selected, and the message stays read.
  5. Plain, Shift-Option, and Command-Option clicks mark nothing.
  6. Option-click a thread reply, and a custom emoji. Both now offer Mark read.

buzz-review-completed

cheng-block and others added 3 commits November 5, 2026 21:40
Slack marks a message unread when you Option-click it (Alt-click on
Windows and Linux). In Buzz that action was only on U for a selected
message and in the message menu. An Option-click on a message's box now
runs U's action on that message, through the same canMarkUnread and
markUnread the U shortcut calls, without selecting it.

Clicks that belong to something else are left alone: links, buttons,
inputs, menu items, control groups such as reactions, images, video,
audio, code blocks, the day divider, a click that ends a text selection,
any other modifier, and clicks a handler already stopped or prevented.
The listener is on the window so React's handlers run first. The help
guide lists the gesture next to U.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Cheng Peng <cheng@block.xyz>
Co-authored-by: Cursor <cursoragent@cursor.com>
An open agent row folds on any click in its box and does not stop the
click. An agent's "Couldn't finish" reply can be marked unread, so one
Option-click both folded it and marked it. The fold now leaves
Option-clicks to Mark unread.

Custom emoji are images in the message text, so the image guard skipped
them and an Option-click on an emoji-only message did nothing. The guard
now skips images other than custom emoji.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Cheng Peng <cheng@block.xyz>
Co-authored-by: Cursor <cursoragent@cursor.com>
The help guide said Option-click marks a message unread without
selecting it. The handler never moves focus, but the browser's own
click focus still applies: a message selected earlier with the keyboard
keeps a focusable box, so any click on it selects it again, with or
without Option, as before this change. Say what the gesture does
instead: it works on a message whether or not it is selected.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Cheng Peng <cheng@block.xyz>
Co-authored-by: Cursor <cursoragent@cursor.com>
@cheng-block
cheng-block marked this pull request as ready for review November 6, 2026 19:51
@cheng-block
cheng-block requested a review from a team as a code owner November 6, 2026 19:51
@cheng-block
cheng-block marked this pull request as draft November 6, 2026 22:05

This branch has not been deployed

No deployments
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.

1 participant