Repository navigation
fix(dialogs): Enter presses the highlighted button in every dialog - #2782
Conversation
Restores the assertions from #1152 that #2021 flipped for archive: the Archive confirmation opens focused on the prominent Archive button, so Enter archives. Co-authored-by: Martha <73923046810b68ae182000e74ef7c444383a907df20f81f2ba1008870a6f45a1@buzz.block.builderlab.xyz> Co-Authored-By: Claude Opus 5.5 <[email protected]> Signed-off-by: John Tennant <[email protected]>
#2021 made the Archive confirmation start on Cancel, so Enter cancelled even though Archive is the highlighted button. Archive is reversible, so restore #1152: Enter confirms reversible actions and irreversible ones focus Cancel. Co-authored-by: Martha <73923046810b68ae182000e74ef7c444383a907df20f81f2ba1008870a6f45a1@buzz.block.builderlab.xyz> Co-Authored-By: Claude Opus 5.5 <[email protected]> Signed-off-by: John Tennant <[email protected]>
johnmatthewtennant
left a comment
There was a problem hiding this comment.
🤖 Nora reviewed 90fcab1. Complete independent review and source inspection found no correctness blockers. Archive reuses the existing reversible-action focus rule; Delete and Leave retain Cancel focus. Source review only; runtime acceptance and CI remain separate. GitHub prevents formal approval because this account also authored the PR.
Picks up the main typecheck repair so CI can run green. Signed-off-by: John Tennant <[email protected]> Co-authored-by: Martha <73923046810b68ae182000e74ef7c444383a907df20f81f2ba1008870a6f45a1@buzz.block.builderlab.xyz> Co-Authored-By: Claude Opus 5.5 <[email protected]> * origin/main: test(channels): complete the context navigation fixture (#2783) fix(channels): open a thread's channel at its root message from the #channel link (#2377)
johnmatthewtennant
left a comment
There was a problem hiding this comment.
🤖 Reviewed exact head fdc5796 against 3bcf1c4. All 20 fresh review outcomes completed; no correctness blockers remain after disposition. The four changed files are unchanged from the prior reviewed head. This was source review; I did not run runtime tests. CI remains a separate merge gate. Recorded as COMMENT because the shared GitHub account authored this PR.
…ve-enter * origin/main: (21 commits) Make drafts and sent part of Messages (#2728) fix(canvas): render every Canvas within the save limit (#2839) test(messages): wait for the row measurement frame before thread catch-up dwell (#2837) Keep agent coordination history readable after work finishes (#2454) test(mentions): serve the mentions fixture as a build so cold loads fit (#2776) test(browser): let a late publication land after its page closed (#2565) test(relay): wait for the verified owner before a guest edits an agent (#2413) test: wait for the companion default width measurement (#2750) test(browser): preserve conversation scroll while revealing actions (#2715) test(browser): wait for link hit-testing after thread close (#2792) perf(messages): skip micromark for plain prose bodies (#2780) perf(inbox): load the emoji name table on first use (#2774) perf(messages): cut main-thread work while a busy channel is open (#2729) Refine agent Attention cards, watch details, and status controls (#2717) fix(bestie): remove a Bestie from its agent card on any device (#2720) feat(agents): preview Builderlab agent card links with Add to Buzz (#2719) Restore macOS Cmd-W window closing when no tab handles it (#2443) Make agent transcripts quieter and link finished replies to activity (#2424) fix(channels): wrap unread conversation stepping around the sidebar (#2682) fix(navigation): let bare buzz:// open Buzz without a broken-link notice (#2718) ...
Reversible or just-requested confirmations now open focused on their highlighted action, so Enter does what the dialog shows. Red destructive actions keep the neutral, focused Cancel. Blue actions that should still start on Cancel, including Archive, move the highlight to Cancel instead. Co-authored-by: Martha <73923046810b68ae182000e74ef7c444383a907df20f81f2ba1008870a6f45a1@buzz.block.builderlab.xyz> Co-Authored-By: Claude Opus 5.5 <[email protected]> Signed-off-by: John Tennant <[email protected]>
Co-authored-by: Martha <73923046810b68ae182000e74ef7c444383a907df20f81f2ba1008870a6f45a1@buzz.block.builderlab.xyz> Co-Authored-By: Claude Opus 5.5 <[email protected]> Signed-off-by: John Tennant <[email protected]>
Leaving a workflow draft discards unsaved changes, so it now matches Discard changes: a red action with Keep editing focused. Browser tests now expect focus on the highlighted action in the team import, plugin rollback, chat share and enabled-save confirmations. Co-authored-by: Martha <73923046810b68ae182000e74ef7c444383a907df20f81f2ba1008870a6f45a1@buzz.block.builderlab.xyz> Co-Authored-By: Claude Opus 5.5 <[email protected]> Signed-off-by: John Tennant <[email protected]>
kalvinnchau
left a comment
There was a problem hiding this comment.
🤖 Two confirmation-default regressions need correction before merge. The webhook-secret loss was reproduced in Chromium and WebKit.
Continuing without the secret loses it for good, so the warning is destructive like leaving a draft. Co-authored-by: Martha <73923046810b68ae182000e74ef7c444383a907df20f81f2ba1008870a6f45a1@buzz.block.builderlab.xyz> Co-Authored-By: Claude Opus 5.5 <[email protected]> Signed-off-by: John Tennant <[email protected]>
Archiving stops every connection, so it starts on a highlighted Cancel like channel archive. Co-authored-by: Martha <73923046810b68ae182000e74ef7c444383a907df20f81f2ba1008870a6f45a1@buzz.block.builderlab.xyz> Co-Authored-By: Claude Opus 5.5 <[email protected]> Signed-off-by: John Tennant <[email protected]>
|
🤖 Design review (Design Reviewer agent, head 7d81cce) The one-rule goal is right: Enter should press the button that looks highlighted. No must-fix bugs found. Two calls need a designer before merge. Design preference (blocks merge): Archive and other "start on Cancel" dialogs. This PR makes Cancel the blue button and drops the action to plain in about ten dialogs (Archive channel/community, general access, external key, pairing (Deny turns blue), plugin enable, PR merge, community switch/leave). That's a new look for confirmations in Buzz. Option A (this PR): Cancel is blue and Enter cancels. It's safe, but people looking for the blue button will find Cancel. Option B: Archive stays blue and focused, so Enter archives. That's the familiar pattern, and archive can be undone, but it reverses #2021. Design preference (blocks merge): bring-agent and remote-bestie prompts now start on the action. #2021 deliberately started mention consent on "Don't bring". After this PR, pressing Enter twice fast after sending a message that mentions an agent adds the agent to the channel and sends. The same goes for "Use as bestie" despite its remote warning. Keep or reverse #2021 here? Optional: Remove Bestie now confirms on Enter (blue). The PR says removals start on Cancel, so it may belong with those. Not checked: I couldn't open the screenshots and judged from the diff and description only. I didn't run the app, so dark mode, narrow windows, enlarged text and touch are unchecked. Design preference outstanding with @tellaho Update (head 4e0c90d): The new commit puts the bring-agent prompt back on "Don't bring", and "Use as bestie" and Remove Bestie back on Cancel, so the second preference and the optional note are resolved. The first preference (Archive and the other "start on Cancel" dialogs) is still open. |
Bringing an agent into a channel, using a remote agent as bestie and removing a bestie change something the person may not have meant, so these prompts start on the highlighted Don't bring or Cancel again, as they did before. Enter presses that highlighted button. Once an agent is brought in, Send is highlighted where Bring was. Co-authored-by: Martha <73923046810b68ae182000e74ef7c444383a907df20f81f2ba1008870a6f45a1@buzz.block.builderlab.xyz> Co-Authored-By: Claude Opus 5.5 <[email protected]> Signed-off-by: John Tennant <[email protected]>
|
🤖 Thanks. John's calls, now in 4e0c90d:
|
kalvinnchau
left a comment
There was a problem hiding this comment.
🤖 One remaining remote-Bestie confirmation path still starts on the affirmative action.
| loading={pending} | ||
| onClick={onChoose} | ||
| > | ||
| Switch to {bestieName(replacing)} |
There was a problem hiding this comment.
🤖 [P3] Keep remote Bestie replacement on the safe initial choice
With an existing Bestie, choosing a hosted or elsewhere agent through Change routes to BestieReplacement instead of RemoteBestieConfirm. This dialog displays the remote-agent warning but focuses the prominent Switch action, so Enter immediately replaces the saved Bestie. The reviewed-head test probe confirmed that Switch is focused/prominent and Enter calls mainAgent.write(cara.pubkey). Thus the safe initial choice restored for remote selection is skipped when replacing an existing Bestie. When remote is true, focus and emphasize Keep instead, and cover this branch with a keyboard assertion; local replacement can retain its current behavior.
…leanup * origin/main: feat(terminal): add an Option as Meta key setting on macOS (#2850) fix(agents): restrict workflow requests in bb-block only (#2518) fix(dialogs): Enter presses the highlighted button in every dialog (#2782) Polish Compact messages and conversation appearance settings (#2863) fix(composer): let Option+Up/Down switch conversations from an empty composer (#2832) fix(reactions): Scope timed reactions to the selected video (#2796) fix(communities): name what the Join dialog is doing instead of "Working…" (#2822) docs(agents): explain the per-conversation MCP cost of Claude agents (#2683) fix(avatars): keep unsaved avatar drafts and focus, and validate the URL late (#2714) fix(agents): offer stream and forum connection setup only to channel members (#2749) Describe Attention as what the agent does, not its tools (#2865) Let a local Codex agent join its owner's huddle by voice (#2321) ci: give the native job room for a cold Rust cache (#2867) fix(pairing): refuse unknown communities natively and name the requesting process (#2835) Add per-interest Attention pause and management controls (#2847) feat(drafts): show where unsent drafts wait (#2853) # Conflicts: # .github/workflows/release.yml
…-buzz-branding * origin/main: (385 commits) fix(communities): let Cancel, × and Escape leave a Join lookup and name the host that didn't answer (#2821) fix(agents): let watches hear public channels the agent is not in (#1854) Preview and send Drafts & sent in place, with a shared count bubble (#2833) feat(terminal): add an Option as Meta key setting on macOS (#2850) fix(agents): restrict workflow requests in bb-block only (#2518) fix(dialogs): Enter presses the highlighted button in every dialog (#2782) Polish Compact messages and conversation appearance settings (#2863) fix(composer): let Option+Up/Down switch conversations from an empty composer (#2832) fix(reactions): Scope timed reactions to the selected video (#2796) fix(communities): name what the Join dialog is doing instead of "Working…" (#2822) docs(agents): explain the per-conversation MCP cost of Claude agents (#2683) fix(avatars): keep unsaved avatar drafts and focus, and validate the URL late (#2714) fix(agents): offer stream and forum connection setup only to channel members (#2749) Describe Attention as what the agent does, not its tools (#2865) Let a local Codex agent join its owner's huddle by voice (#2321) ci: give the native job room for a cold Rust cache (#2867) fix(pairing): refuse unknown communities natively and name the requesting process (#2835) Add per-interest Attention pause and management controls (#2847) feat(drafts): show where unsent drafts wait (#2853) feat(agents): let app-hosted agents read their owner's channels and members (#2745) ... # Conflicts: # src/bundled/builderlab/README.md # src/bundled/builderlab/oauth/browser.test.ts # src/bundled/builderlab/oauth/browser.ts
…ion-and-status * origin/main: (37 commits) fix(browser-host): use the Buzz login variant for dev Builderlab sign-in (#2222) refactor(plugin-manager): move distributor values into build settings (#2649) fix(communities): let Cancel, × and Escape leave a Join lookup and name the host that didn't answer (#2821) fix(agents): let watches hear public channels the agent is not in (#1854) Preview and send Drafts & sent in place, with a shared count bubble (#2833) feat(terminal): add an Option as Meta key setting on macOS (#2850) fix(agents): restrict workflow requests in bb-block only (#2518) fix(dialogs): Enter presses the highlighted button in every dialog (#2782) Polish Compact messages and conversation appearance settings (#2863) fix(composer): let Option+Up/Down switch conversations from an empty composer (#2832) fix(reactions): Scope timed reactions to the selected video (#2796) fix(communities): name what the Join dialog is doing instead of "Working…" (#2822) docs(agents): explain the per-conversation MCP cost of Claude agents (#2683) fix(avatars): keep unsaved avatar drafts and focus, and validate the URL late (#2714) fix(agents): offer stream and forum connection setup only to channel members (#2749) Describe Attention as what the agent does, not its tools (#2865) Let a local Codex agent join its owner's huddle by voice (#2321) ci: give the native job room for a cold Rust cache (#2867) fix(pairing): refuse unknown communities natively and name the requesting process (#2835) Add per-interest Attention pause and management controls (#2847) ... # Conflicts: # docs/buzz-help.md
**Category:** fix **User Impact:** Dialogs keep Cancel secondary while a visible ring shows which button Enter will activate. **Problem:** #2782 used prominent styling for several focused Cancel actions, making keyboard position compete with the dialog’s action hierarchy. Some confirmations also fell back to header Close while others explicitly focused Cancel. **Solution:** Restore the action/Cancel styling pairs, make safe confirmation defaults explicit, and show a shared 2px focus outline with a 2px gap on focused dialog Buttons, including pointer-opened autofocus. Simple confirmations generally focus Cancel unless they intentionally default to the primary action. Gated confirmations start at their required field; focused header, body and footer buttons all retain the ring, including split-button halves. Tab order and activation handlers are preserved; the ring fits the footer’s existing 4px allowance, so footer height, scrolling and click-through behavior stay intact. Follow-up to #2782. Shared owners: Button/IconButton styling in `components.css`, existing Dialog/AlertDialog focus management, and existing footer geometry in `overlays.css`. <details> <summary>File changes</summary> **docs/buzz-help.md** Explain how the focus ring, Enter/Space and filled action styling relate. **src/app/AgentPluginRequests.tsx** Keep Cancel secondary when enabling a requested plugin. **src/app/CommunityDepartureSettings.tsx** Restore secondary Cancel and prominent Remove while retaining destructive Leave. **src/app/ExternalIdentityAuthorization.tsx** Give Authorize its action emphasis while Cancel keeps initial focus. **src/bundled/agents/AgentsPage.test.tsx** Update the existing Bestie removal assertion to secondary Cancel. **src/bundled/agents/BestieChoice.tsx** Restore the action hierarchy in remote Bestie and removal confirmations. **src/bundled/bestie/BestieChooser.test.tsx** Verify Cancel-first activation independently of the action’s prominence. **src/bundled/builderlab/communities/HostedCommunities.tsx** Explicitly focus Cancel for caution prompts and the required fields for permanent deletion and ownership transfer; preserve the normal action hierarchy. **src/bundled/channels/ChannelGeneralAccess.tsx** Keep Cancel secondary and Change access prominent. **src/bundled/channels/ChannelLifecycleDialog.tsx** Keep Archive prominent and its initially focused Cancel secondary. **src/bundled/channels/ChannelLifecycleMenu.test.tsx** Update Archive’s existing variant expectations without changing focus expectations. **src/bundled/channels/ChannelMembersDialog.tsx** Restore Share’s prominence while Cancel retains initial focus. **src/bundled/github/PullChecklist.tsx** Keep Cancel secondary in merge/queue confirmation; retain the bypass attention treatment. **src/features/communities/CommunityPicker.tsx** Restore prominent Remove in the failed-leave fallback while Cancel stays secondary. **src/features/credential-pairing/PairingPrompt.tsx** Keep Deny secondary and initially focused, with Allow prominent. **src/features/messages/MessageComposer.test.tsx** Update the existing Don’t bring assertion and retain its Enter cancellation coverage. **src/features/messages/useBringAgents.tsx** Keep Don’t bring secondary while Bring and Send retain action emphasis. **src/shared/design-system/DESIGN.md** Document the 2px outline/2px gap, dialog-wide focus visibility, Cancel-first simple confirmations and field-first gated confirmations. **src/shared/design-system/styles/components.css** Show the shared Button focus ring inside dialogs after pointer or keyboard entry and keep focused split-button halves above their neighbour, within the existing 4px allowance. **src/shared/design-system/styles/globals.css** Clarify the modal exception in the existing modality-reset comment. **tests/browser/channel-archive-delete-pane.spec.mjs** Update the existing Archive action hierarchy assertion. **tests/browser/channel-lifecycle.spec.mjs** Extend the pointer-opened Archive journey to assert visible focus, secondary Cancel and prominent Archive. **tests/fixtures/design-system/viewer.spec.ts** Clarify the focus-helper comment for ordinary controls outside dialogs. **src/app/ManagedPlugins.tsx** Start plugin access review on its Cancel/Close action rather than header Close. **src/app/ManagedPlugins.test.tsx** Check initial Cancel focus in the existing cancellation/discard test. **src/bundled/agents/AgentSettingsHost.tsx** Start the harness-migration confirmation on Cancel. **src/bundled/agents/AgentSettingsHost.test.tsx** Check Cancel focus before explicitly continuing the migration. **src/bundled/builderlab/communities/HostedCommunities.test.tsx** Use one dedicated permanent-deletion focus test, check recipient-field focus, and retain archive/unarchive default checks. **src/features/agents/AgentManage.tsx** Start agent deletion and community removal on Cancel. **src/features/agents/AgentManage.test.tsx** Verify Enter cancels delete/remove, restores focus and calls neither operation. **src/features/identity/identity.test.tsx** Verify initial focus stays in the masked key field in the existing sign-out safety-gate test. **src/features/solo/ConvertToChannel.tsx** Start conversion on Cancel, retaining its existing save and recovery behavior. **src/features/solo/ConvertToChannel.test.tsx** Verify Enter cancels conversion without publication or project unfiling. </details> ### Reproduction steps 1. Open a channel’s Archive confirmation with the pointer. Cancel should be secondary, initially focused and visibly ringed; Archive should remain filled. 2. Press Enter on Cancel to dismiss without archiving. Reopen and press Tab: the same ring should move to Archive. Escape should dismiss and restore focus. 3. Open Delete, Leave, Unarchive, Share access and a dirty-form discard guard. The action hierarchy should stay distinct from the existing focus target. 4. Open Delete agent, Remove agent, or Convert to channel. Cancel should receive initial focus; Enter should dismiss without performing the operation. 5. In the desktop app, inspect Bestie replacement/private-channel access and Start huddle. Their established action-first defaults remain unchanged; cancel the confirmations after inspecting them. ### Validation - At head `bd85cfc1f45d0901eb6766039da7dbcc5064f662`, mandatory push checks passed: types/related unit tests, design guards, Rust Clippy and policy checks. - Full `channel-lifecycle.spec.mjs` and `sidebar-geometry.spec.mjs`, Chromium and WebKit, one worker, no retries or measurement dependencies: **28 passed**. The existing pointer-opened Archive journey checks visible focus and action hierarchy. The previously failing sidebar geometry assertion passes after integrating main’s #2946 fix. No browser cases were added or removed; the extra top-edge geometry assertion was removed because ring/footer dimensions are unchanged at the agreed 2px/2px footprint. - Permanent deletion initial focus is checked in one dedicated test, independent of the deletion-recovery helper. Hosted transfer starts in the recipient field; the existing sign-out safety-gate test starts in its masked key field. Submission gates and activation handlers are unchanged. - Earlier exact-style lifecycle checks passed **36 cases** including configured measurement dependencies; footer/action regressions passed **72**, with **2 unsupported WebKit media emulations skipped**. Earlier design-system unit validation passed **29 files / 205 tests**. - The earlier full-root Vitest run had 1,020 passing files and two stale Bestie assertions; after correction that complete BestieChooser file passed **10/10**. A later all-green full-root run is not claimed. - Hosted CI for the updated head is running; local success is not a green hosted-CI claim. Native acceptance and the runtime coverage gaps below remain explicit. ### Capture coverage and remaining gaps **32 real-product captures below; this is not exhaustive runtime coverage.** The 104 source seed sites include wrappers and forms that initially focus inputs. Ordinary search/name/link/model/status fields, selected radios and static headings are outside the Button screenshot count. Wrapper/caller expansion and the broader imperative-focus inventory remain incomplete. Missing prerequisites / blocked states: - Agent plugin enable/delete requests, external identity/app authorization, credential pairing, legacy import, identity backup consent and account-conflict onboarding need genuine pending requests or account states absent from this test run. - External plugin review/install/update/error/unchanged/rollback/delete modes need the native import service and suitable external plugin versions; the browser catalog is bundled-only. - Remote-first-Bestie needs no explicitly saved Bestie, and global Bestie removal needs the absent mainAgent account capability. The saved preference was retained. - Hosted-community archive/delete/transfer needs a signed-in Builderlab account and eligible community. The native test build offers Sign in. - Moderation and relay staff need unavailable relay capabilities; membership administration requires an owner/admin community. Provider/onboarding autofocus states require native provider or identity setup. - Structured diff, huddle-image, Canvas conflict/history, watches, workflow/webhook notices and cross-community message-preflight variants need suitable source data or an enabled plugin. No audio session, merge, credential approval or provider/account reset was performed for coverage. Still unexercised, rather than counted as blocked or complete: additional native agent browse/card/avatar/migration/import/team/history/removal/discard surfaces; sign-out guard; disabled Focus/Todos/Workflows/Pi plugin flows; Public access destination; former-Bestie and recovery variants; workspace/draft callers; conversation overlay contributions; four direct provider/sign-in `autoFocus` Buttons. Settings departure was captured; the separate picker failure fallback was not. Human-approved capture scope: current host appearance at normal desktop width, without a theme/width/text-size matrix. Browser captures use the browser’s current appearance; native captures use the desktop app’s current appearance. The pointer-focused member-role split button is from `bd85cfc1f`. Its real browser check confirms pointer modality, `:focus` without `:focus-visible`, a 2px outline/2px offset and stacking above its neighbour; only the role menu was toggled, with no membership change. The Cancel-focus captures for Delete agent and Convert to channel are from `13f8ec1e3`. Unchanged-surface captures remain from `0e0bdb18a`, except Bestie replacement and Unarchive, captured during the identical 2px/2px styling iteration before its commit. Screen-reader announcements were not tested. ### Screenshots / demos Actual running app on disposable review data, not fixtures or component viewers. Native snapshots are shown at logical display size. Control/footer crops omit profile content, host URLs or private channel names; no pixels were composited into product surfaces. #### Channel lifecycle | Surface | Capture | | --- | --- | | Archive — initial Cancel |  | | Archive — Tab to action |  | | Delete — initial Cancel |  | | Delete — Tab to destructive action |  | | Leave channel |  | | Unarchive |  | | Hide conversation |  | #### Channel creation, access and discard | Surface | Capture | | --- | --- | | Member-role split button — pointer focus |  | | Make private |  | | Make public |  | | Creation discard |  | | Edit-channel discard |  | | Access: Private |  | | Access: View only |  | | Share access — Cancel |  | | Template discard |  | | Remove empty review section |  | #### Settings and community departure | Surface | Capture | | --- | --- | | Settings Close — control crop |  | | Plugin-details Close — control crop |  | | Settings discard |  | | Leave community — footer crop |  | | Remove community — footer crop |  | #### Native agent and huddle surfaces | Surface | Capture | | --- | --- | | Bestie replacement |  | | Remove private-channel access — footer crop |  | | Add private-channel access |  | | Delete agent — Cancel focus |  | | Start huddle — initial action |  | #### Other dialog Close and cancellation paths | Surface | Capture | | --- | --- | | Feedback — Close focus |  | | Mermaid — Close focus |  | | Delete message — Cancel |  | | Chat settings — Close focus |  | | Convert to channel — Cancel focus |  | --------- Signed-off-by: Taylor Ho <[email protected]> Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz>
Kyle's review: removing the only member on the last page clamps the list back a page, but the hand-off used the row's index on the shown page, so focus landed on that page's first member rather than the one just before the removed member. The hand-off now remembers the members beside it in the whole list and focuses the next, then the previous, by identity; the index is only a fallback. Also expect the Viewing only step to open on its action, as #2782 made reversible changes do, in the later-page journey.
Kyle's review: removing the only member on the last page clamps the list back a page, but the hand-off used the row's index on the shown page, so focus landed on that page's first member rather than the one just before the removed member. The hand-off now remembers the members beside it in the whole list and focuses the next, then the previous, by identity; the index is only a fallback. Also expect the Viewing only step to open on its action, as #2782 made reversible changes do, in the later-page journey.
Problem
In many confirmation dialogs, Enter does not press the highlighted button. Base UI focuses the first button by default, usually Cancel, so a dialog that highlights its action in blue (Mark all as read, Start huddle, Restore version, Share, Add member, Import agent and others) closes when you press Enter. Archive is the reverse case: Focus safe controls and task inputs deliberately starts it on Cancel, but Archive is still the highlighted button.
Solution
Every dialog now follows one rule: the focused button is the highlighted one, so Enter presses what the dialog shows.
Reproduction
Before: Enter presses Cancel while Mark all as read (or Archive) is highlighted. After: Mark all as read opens focused and Enter marks everything read; Archive highlights Cancel, and Enter cancels.
Screenshots
Archive, before: Archive channel is highlighted, but Enter cancels.

Archive, after: Cancel is highlighted, and Enter cancels.

Restore a Canvas version looks the same before and after: Restore version is highlighted. Before, Enter pressed Cancel; now it presses Restore version.

Testing
MarkAllReadShortcut.test.tsx,HuddleLauncher.test.tsx,MemberAdministration.test.tsx,chat-link-sharing.test.tsx), andChannelLifecycleMenu.test.tsxshows Archive prominent with focus on Cancel.ChannelLifecycleMenu.test.tsxchecks both the confirm and Cancel variants for every lifecycle action. Enter on the bring-agent dialog declines and nothing joins or sends; the remote-bestie and remove-bestie prompts start on a highlighted Cancel. Fullvitest run: 18,892 pass, 0 fail.channel-lifecycle,channel-archive-delete-pane,channel-members-focus,canvas-history,huddles,plugin-import,solo-sharing) plus the workflows journey: all pass except two that also fail onmain(huddlesaudio settings,plugin-importrejected install retry).🤖 Generated with Claude Code