Skip to content

fix(webapp): put Refresh in the picker's control row, not below it - #95

Open
pythonlearner1025 wants to merge 1 commit into
mainfrom
fix/repo-refresh-inline
Open

fix(webapp): put Refresh in the picker's control row, not below it#95
pythonlearner1025 wants to merge 1 commit into
mainfrom
fix/repo-refresh-inline

Conversation

@pythonlearner1025

Copy link
Copy Markdown
Member

CSS only. Follows up #94, where I got the layout wrong.

The bug

.tplf-repos-controls is a grid with two columns and, since #94, three children. Refresh wrapped to a row of its own, and justify-self: end then parked it against the inner edge of a full-width column — floating in empty space, attached to nothing.

Reported from the live canary: "why is this here, stuck out like a sore thumb".

The fix

Three columns, so search / account filter / Refresh sit on one row. The button takes the same padding and font as the input and select beside it, so the row reads as three controls rather than two and a button.

Gates

Check Result
npm run typecheck exit 0
npm run lint:gate exit 0 — 102 anti-slop findings, equal to baseline
npm test running at PR time; will confirm before merge

No behaviour change and no test change — 51 tests across the two picker suites pass unmodified.

🤖 Generated with Claude Code

The controls grid had two columns and three children, so Refresh wrapped to a
row of its own, and `justify-self: end` then parked it against the inner edge
of a full-width column. It read as an orphan rather than a control.

Three columns instead, and the button takes the padding and font of the input
and select beside it, so the row reads as three controls rather than two and a
button.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
pythonlearner1025 added a commit that referenced this pull request Aug 29, 2026
* fix(webapp): A2 — one Drive icon in the strip, not three panel toggles

The strip's Files / teenyapps / Connections buttons duplicated the right
icon strip (WorkspaceRailStrip), which owns those panels. The slot now
holds a single Drive icon that navigates to the Drive page — the route the
account menu's Drive entry used.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(webapp): A3 — the rail's "New tab" reuses the tab strip's menu

The rail's pinned action drew its own popover that looked like the tab
strip's "+" menu but listed less: no live ports, no preview links. The
menu now lives in one component, src/NewTabMenu.tsx, and both call sites
render it with their own anchor. SessionTypeIcon moves to
src/SessionTypeIcon.tsx so the shared menu needs no import back into
WebAppHeader; WebAppHeader re-exports both, so its importers are unchanged.
The pinned action reads "New tab". The "+" button behaves as before.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(webapp): A4 — Refresh moves under the repositories list, right-aligned

PR #95 put Refresh in the filter row. It now sits in a footer row under the
list, on the right edge, beside the selection count. Behaviour is
unchanged: the same click still bumps the refresh version.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(webapp): A6 — a deterministic gradient per workspace tile

The strip's tiles were flat, so a two-letter code was the only thing
telling them apart. src/shell/workspace-tile.ts hashes the workspace id to
a hue, paints a 135° gradient to hue + 40°, and picks a near-white or
near-black ink from the gradient's average luminance. Ids whose average
lands in the band where neither ink clears 4.5:1 are darkened out of it;
measured worst case over all 360 hues is 4.83:1. The active ring and the
dashed create tile are unchanged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(webapp): A7 — the avatar opens settings, and the menu is gone

The strip's avatar drew a four-item popover. Drive is a strip icon since
A2, Settings was one click away, and the name was a label. Clicking the
avatar now navigates to settings. "Ask us on Discord" moves to the bottom
of the settings side navigation, under the section tabs.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(webapp): B1 — the details dialog wears the pre-#106 chrome again

The dialog #106 built kept the three tabs the plan asks for and lost the
look the pre-#106 one had. This puts the look back without touching what
any control does:

- the header says `Workspace details “name”` again;
- every panel opens with the micro-caps section heading the old
  `workspace-details-grid` sections wore;
- the member rows take the old access-list geometry (a 28px avatar, a
  48px row) instead of the taller #106 one;
- Clone and Delete leave the bottom of the Settings tab for the restored
  `workspace-details-footer`, which is where the old dialog kept Delete.

Members, Credentials and Settings are the same three tabs, and every
write behind them is untouched.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat: a member row can refuse the persistent volume

Every member machine has taken its own volume since #106, and there was
no way to say a machine does not need one. The member row now carries the
answer.

Wire: `members[].persistentVolume` on the create request and the same
optional boolean on `AddWorkspaceMemberRequest` and
`ProvisionMemberMachineRequest`, in `wire.ts` and `packages/schema`
together. Absent means true, so only a refusal travels.

Control plane: the flag reaches `ProvisionMachineInput` and, at the ONE
existing call site in `provisionMachine`, skips
`provisionWorkspaceVolume` exactly as an explicit `volumeId` already
does. No new volume path was written.

Webapp: the toggle sits next to the machine-type select in every member
row, in the create dialog's draft rows and in the live members editor.
A row whose machine exists reports the disk it has, disabled — the disk
is created with the machine and this is not the route that moves one.
The workspace-level Volume section leaves the create dialog; `volumeId`
stays on the wire, where a recreate still reads it.

The test fake grew an optional `volumeLocation`, so a suite can turn on
the volume placement the fake otherwise declines to do.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(webapp): B3 — the select popover takes the top stacking position

Inside the workspace-details dialog the role listbox, the machine-type
listbox and the lifecycle menu all came out under their neighbours. The
popover was `position: absolute`, so `.workspace-details-body` — which
scrolls — was both the thing that clipped it and the thing it could not
paint over.

One rule in the shared stylesheet fixes all three: the popover is
`position: fixed` with the top stacking position, so no scroll container
between it and the page can clip it. `WebAppSelectMenu` writes `left`
and one of `top`/`bottom` from the trigger's viewport rect, clamped to
the viewport, flipping to whichever side has more room; it follows a
scroll in any container above it. The one per-instance override of the
popover's geometry (the mobile settings picker) is gone with it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(webapp): B4 — a right-click menu on a workspace tile

The strip's tiles answered a left click and nothing else. A right click
now opens the same context menu the tab strip serves: the chrome is
`.webapp-session-menu`, positioned at the pointer and clamped to the
viewport, closed by Escape or by a click outside.

Three items, graded by §3:

- Rename, which edits the name in a field the popover holds — the tile
  is two letters wide — and writes it with the PATCH the settings tab
  already uses;
- Settings, which opens the details dialog on its Settings tab;
- Invite, which opens it on Members with the add-member picker focused.
  There is no email invite here: adding somebody means adding an
  existing member of the organization.

A member sees Settings alone. The left click is untouched, and a right
click never selects the tile it opened on.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(webapp): B5 — "My machine" behind the rail's box icon

The rail header said what the workspace is and never what the member's
own machine is. A third button opens that panel, wearing the box glyph
`files/DriveIcons.tsx` has drawn since before #106.

The dialog is the workspace-details chrome with no tab row: one view,
because there is one machine to read. It names the state, the type and
what the type is (vCPU, RAM, disk, price, all off the existing catalog
helpers), whether a persistent volume is attached, and the machine's own
error where it has one.

The lifecycle controls carry the §3 matrix in the first person. Stop and
start are a member's own business; recreate, destroy and the machine-type
change are workspace-admin work, and provisioning where there is no
machine row at all is the member-add route in disguise. A verb this
member may not run is shown DISABLED and names who to ask — "Ask a
workspace admin: Ada Owner" — because there is no request to file and
pretending one was filed would be worse than saying who can act.

A viewer holds no machine (§2.2) and is told so.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(webapp): B6 — the rail's Members button wears the Drive share icon

The rail drew its own three-node share glyph while the Drive page drew a
person-with-a-plus for the same verb. The rail now imports the Drive
page's `ShareGlyph`, so one shape means "share" across the app, and the
strip's copy is deleted rather than left to drift — the rail was its only
caller. The button still opens Members and nothing else changed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
pythonlearner1025 added a commit that referenced this pull request Sep 4, 2026
f4b1ba25 fix(ci): harden Electron signing credentials [risk:high] (#358)
83c8e364 docs: publish 0.90.0 changelog (#356)
96b73fbb chore: remove useless artifacts file [skip ci]
55b3e028 fix(sessions): stabilize child tab ordering (#326)
c2cd3da6 feat(components): add Zen layout mode (#341)
65c2b0c4 Merge pull request #225 from ImSingee/feat/lody-mcp-worktree
b6d9a6f2 Merge pull request #309 from jeffwcx/fix/mention-caret-ime
ed13fa59 Merge pull request #340 from LodyAI/fix/electron-builder-keychain-password
1ff92abe fix(electron): authenticate temporary signing keychain [risk:high]
289bb7b4 feat(cli): add MCP session rename tools (#337)
8de7851e fix(components): collapse inline plan approval (#334)
bf979598 chore: acp
deb82d11 chore: update Feishu community group QR code (#331)
22af000a Merge pull request #173 from Innei/feat/electron-macos-sparkle-updater
ef3becb1 chore: merge latest main into Sparkle updater
d51546da fix(components): hide onboarding product preview on compact stages (#329)
f3f090ae Merge pull request #144 from slashdevcorpse/fix/codex-goal-continuation-and-stop-steer
e0657934 Merge pull request #257 from natsustan/feat/mobile-agent-settings
54d07d36 test(turn-diff-store): stabilize incremental GC batching
82d4dc72 chore: merge main into feat/mobile-agent-settings
df9f950b Merge pull request #274 from sinxy-sai/codex/fix-markdown-bold-autolink-189
ff27503d fix(components): let expanded proposed plans flow without internal scroll (#315)
f5649adb fix(components): right-align submenu chevrons (#313)
6aeeb8f8 fix: hide unknown Claude context usage (#308)
58b93eda fix(components): preserve mention caret during IME composition
f8f9be10 refactor(components): deduplicate Markdown AST transforms
e3e21294 refactor(components): share mdast child-replacement walker
94bede91 feat(components): show more outline hover-card lines (#303)
947affd0 Merge pull request #285 from MichaelYuhe/fix/mobile-settings-return-context
f9347134 Merge pull request #299 from EYHN/feat/browser-blocks-19818375
cd42c044 Merge pull request #291 from EYHN/feat/svg
932c83df fix(cli): harden daemon startup and status (#287)
4e6b6495 docs: add Codex P0/P1 security-focused review rules (#295)
db75b03a fix(electron): allow fake-IP proxy answers in the public browser
b04d0dcd fix(components): wrap long mention chips in sent messages (#294)
410b1816 Merge pull request #292 from LodyAI/feat/217
a4d0f547 feat: support custom DeepSeek Harness endpoints (#293)
1361a1b6 refactor(components): share malformed GFM autolink repair
99723c25 fix(electron): close the current tab or hide the window on Cmd+W (#235)
54445965 fix(components): attach SVG images as files
870fad32 Merge branch 'LodyAI:main' into codex/fix-markdown-bold-autolink-189
ad787c9b feat(electron): wire Sparkle progress into the renderer banner
b351290c feat(electron): switch macOS auto-update to Sparkle
91ffa378 fix(components): restore mobile settings source
896fd1e0 feat(site): add GitHub mark and early-bird deadline (#283)
ba6f9009 fix(components): avoid quadratic autolink marker scans
72ec3c01 fix(components): preserve explicit markdown link destinations
ad5104a8 docs: publish 0.89.4 changelog [risk:high] (#281)
3beeb8a0 chore: upgrade built-in Claude Code to 2.1.258 (#279)
dabbf960 fix(cli): scope All Changes to local worktrees (#280)
376bf98a fix(electron): report update install failures instead of success (#278)
f38ed4d3 fix(sessions): keep composer roles stable across turns (#269)
620fcfac fix(components): repair later valid bold URL closer
857e3095 fix(components): normalize mixed-case www links
88f54c35 fix(components): preserve triple-star emphasis
dcbe49d6 fix(components): narrow Markdown punctuation checks
a2fc9de7 fix(components): align escaped URL markers
e3abc684 fix(components): validate URL strong closers
1d0a0281 fix(components): tighten malformed URL repair
079c7716 fix(components): respect escaped closing markers
9629ffaf fix(components): respect escaped bold markers
4e6968ce fix(components): preserve absolute www autolink destinations
bbf83f49 fix(components): repair malformed bold URL autolinks
c7d905bf fix(components): make desktop onboarding failures honest and recoverable (#214)
08a3e474 ci: consolidate PR contribution policy (#265)
9f93538c fix(components): localize PR repair prompts (#245)
84bb1c06 fix(components): align sidebar loading skeletons (#266)
e0d958e1 fix: complete interactive Custom ACP authentication (#234)
27b56232 fix(acp): map pi, grok, and kimi to the skill dirs their engines scan (#218)
d22f12bf fix: address responsive settings review feedback
2a2fcf12 feat(site-docs): point the landing secondary CTA at GitHub (#254)
284deb68 docs: correct changelog version to 0.89.3 [risk:high] (#256)
8ed4dab3 docs: add 0.90.0 changelog [risk:high] (#255)
7cabe456 fix(components): close the remaining render-feedback loops (#253)
9ac6a780 fix: remove unused React import
e8d3421f fix(components): derive ACP run-config selection instead of reconciling it (#252)
8859029a feat(components): expose lightweight join surface (#238)
713bf290 feat(components): retry Codex capacity failures (#237)
6b022c1b fix: make provider usage layout container-aware
975e9e4f feat: streamline mobile agent settings
8064b1a0 docs: add 0.89.2 changelog [risk:high] (#250)
460cec05 fix(components): session tab pending-child follow-ups (#249)
c22dc434 perf(components): cut session-switch input latency (#247)
cac1e2a3 fix(components): take the session ?tab URL at its word (#248)
c4b336ac fix(components): allow browsing registered project folders
1857d6e9 docs: add 0.89.1 changelog (#246)
d6a23ed2 fix(components): stabilize session location tooltip refs (#241)
1b802d17 chore: bump acp-extension-codex after merge of #28
d0005ef9 feat: acp
970a5b66 docs(changelog): publish 0.89.0 release notes (#236)
a36816ab Merge pull request #233 from wong2/fix/codex-resets-attribution-link
a8f69fa9 fix(components): avoid void Trans placeholder
dd10c9fe Merge pull request #231 from MichaelYuhe/codex/fix-mobile-workspace-settings-spacing
0749b4be Merge pull request #143 from clanzhang/fix/131-restore-input-focus-after-send
55c38e9e chore: kimi acp
2c78927f fix(electron): close the current tab or hide the window on Cmd+W
2cc10249 fix(components): link Codex reset attribution
d706e3c6 fix(components): align mobile workspace settings
b7b56327 Merge pull request #226 from ImSingee/fix/codex-reset-forecast-overlay
8c957eb0 Merge pull request #205 from Innei/feat/sidebar-project-actions-menu-restyle
5ce0c481 feat(docs): add local documentation search (#228)
cef73e5b fix(components): restore blocked goal resume action (#230)
8a674e5b fix(components): inset the desktop workspace chrome out of the safe area (#210)
a9067707 Merge pull request #227 from Innei/fix/macos-dev-dock-icon
a025a354 fix(electron): set macOS development dock icon
43dda538 feat(components): render every agent's plan through one panel (#221)
60007048 fix(mcp): clarify child session workspace reuse
a320b4c6 fix(components): show the waiting-for-approval hand on mobile tab rows (#222)
10051e26 feat(components): add folders per machine from Projects settings (#220)
9f7b81c1 fix(components): correct nested reset forecast overlay
1e40d143 fix(onboarding): give the tour a read-only repo stand-in (#216)
0e3a961a feat(components): put a plan-mode turn on one rail and one panel (#215)
50147494 fix(acp): support standard ACP authentication for registry agents (#208)
cf5bf050 fix(components): restore desktop composer focus after successful send
2ddaac47 refactor(components): derive the active session tab from the router URL (#199)
e8ab5812 fix(components): align the private status pill with the header launcher (#204)
2363d34b Merge pull request #186 from kovsu/fix/settings-section-corner-clip
fe4e5aad feat(components): add local-project row actions and restyle menus
62fa9e2f Merge pull request #129 from 1-WEEK/fix/subsession-model-search-focus
a56eaa83 fix(components): grow the Rename Chat field to fit a wrapped title (#202)
2d3b5d0c Merge pull request #169 from Innei/fix/electron-per-panel-window-drag
e3cb9825 chore: upgrade built-in AI agent runtimes (#201)
4acff9a6 fix(cli): deliver MCP child-session completion notifications over the HTTP transport (#200)
73e4fc3e Merge pull request #192 from Pleasurecruise/feat/hmr
e05486b5 Merge pull request #94 from xuxu777xu/fix/builtin-agent-opt-out
2b803307 fix: bind the workspace GitHub repository to CLI-created local sessions (#197)
872453e4 fix(components): preserve active tab on session reselect (#194)
a0c2c77a fix: survive unsendable WebSocket close codes in the local preview proxy (#198)
460cb7d8 fix: publish the dispatch pointer for promoted queue turns (#166)
2b134aa1 fix: align child tab agent role selection (#181)
3f6af469 Merge pull request #190 from LodyAI/fix/mobile-auth-session-401
4185f738 feat(electron): add local hot reload workflow
95e4d02f fix(auth): recover rejected mobile sessions [risk:high]
4c91b8c2 refactor(shared): drop redundant fields from the builtin agent opt-out value
d64a99b1 fix(electron): move window drag onto per-panel title bars
41c51a5e fix(settings): clip settings sections to their rounded corners
0c5bedbe feat: let onboarding choose or skip the first Agent (#182)
22f0708c feat: guide empty conversation sync states (#180)
aac14534 fix: fill project settings modal height (#177)
7d626837 feat(electron): add hidden auto-launch option (#176)
6db6a72d Merge pull request #95 from ShobhanKarthish/fix/web-focus-input-shortcut
452aded9 Merge pull request #168 from Innei/codex/focus-scope-keyboard-navigation
853ca366 fix(components): keep the cancellation marker as the first write
9b8ea083 chore: split Electron window drag out of the keyboard navigation PR
f5b16cfd fix(components): keep multi-tab clickable while solo titles drag the window
0ffacc5e feat: add scoped keyboard navigation
795b34cb chore: bump acp-extension-codex for slash goal continuation tests
e4ac99c2 fix: force-direct Codex goal commands and bump acp-extension-codex
a02e0b46 fix(components): prevent composer focus stealing when clicking model search in subsession tabs
b90d719e fix(shared): own builtin agent opt-out from one place
75d54b37 fix(cli): keep removed builtin agent providers removed across restarts
4822079e fix: stop advertising ⌘L on web composer

git-subtree-dir: vendor/lody
git-subtree-split: f4b1ba259eb754cd954da776d8e7384a8c30f1c9
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