feat(ui): native-feeling menus, notices and one vocabulary - #180
Merged
Merged
Conversation
Notices and menus - Replace every window.alert with a root Toaster (showToast/showErrorToast): non-blocking, top centre, held while hovered, errors 8s / notices 4s. - Composer popups (model, preset, permission, skills, worktree, workspace target) share useAnchoredPopup: portal, anchored/flipped and clamped, outside-press and Escape close with focus return, arrow-key navigation. Escape still stops a running turn first, as before. - Secondary click on a conversation or workspace row opens its full action set at the pointer (useContextMenu) instead of WebKit's link menu. Permission card - Show the whole command, wrapped, instead of one truncated line. - Standing rules (Always allow/deny) become quiet actions on the left; Deny / Allow stay on the right. Cmd/Ctrl+Enter approves the oldest plain request, and the plan card's Build now answers to the ⌘↩ it always showed. A text field keeps the chord, so a draft never turns into an approval. Sidebar - A conversation listed in Active and in its workspace is highlighted only in the list it was picked from; a workspace row is highlighted only when it is the selection itself. - One vocabulary in all ten locales: workspace and conversation. "New work item" is "New conversation", the left "Work" section is "Active". Missing keys that were only English fallbacks are now translated. Composer and transcript - The worktree choice is a composer popup, not a bordered native select; a running session's location is a tag, not a lookalike button. - The context gauge is a filled wedge in an outline, so it no longer reads as a second spinner beside Stop. - Scroll-to-bottom sits at the column's trailing edge, off the reading line. - Work block and tool rows start on the prose edge. - The agent panel shows a conversation worktree as "<repo> worktree" and its branch as job/<short id>, keeping full values in the tooltip. Cleanup - Retire the dead activeTab/AppTab plumbing and the no-op "Go to Chat" palette action, with their locale keys. - success/favorite tokens replace the remaining emerald/amber classes.
devswha
force-pushed
the
fix/ui-medium-ux
branch
from
September 27, 2026 05:47
d976385 to
da8c3f9
Compare
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.
Stacked on #179 (base
fix/ui-quick-polish); retarget tomainonce #179 merges.Summary
Second batch of the native-app design review.
Notices and menus
window.alert(21 in the sidebar controller) → a root Toaster (showToast/showErrorToast): non-blocking, top centre, at most three, errors 8s / notices 4s, held while hovered or focused.useAnchoredPopup: the six composer popups (model, preset, permission mode, skills, worktree, workspace target) now share one implementation — portal, anchored above/below and clamped, outside press + Escape close with focus return, arrow-key navigation (none of them had it; the skill picker ignored Escape).useContextMenu) instead of WebKit's "Open Link in New Window" menu.Permission card
Sidebar
Composer and transcript
<select>; a running session's location is a tag, not a lookalike button.<repo>worktree" and branchjob/<8-char id>, full values in the tooltip.Cleanup
activeTab/AppTabplumbing and the no-op "Go to Chat" palette action, with their locale keys.--success/--favoritetokens replace the last emerald/amber classes (DESIGN.md updated).Kept on purpose
ModelAndReasoningPicker.dom"global Stop owns Escape"). Worth revisiting as a product decision: Escape on an open menu currently kills the run.Verification
test:e2e:gjc8/8.scripts6 failures are the same pre-existing ones as on an untouched checkout (patch appliers / release archive).Toaster.dom,useAnchoredPopup.dom(Escape/focus, arrows, outside press, Stop-owns-Escape), context menu inSidebarSessionItem.menu.dom,SidebarContent.selection.dom, permission shortcut + full command inPermissionRequestsBanner.dom, worktree picker, environment labels, gauge shape.