feat(desktop): make the sidebar foot one account button that opens Settings
What
The sidebar foot used to be a separate "Settings" item with a static account block under it. It is now one full-width button, laid out like the ones in Codex, Cursor, and Conductor:
- Left: the provider's photo (
AccountSnapshot.pictureUrl) as a round avatar. If there is no photo, or it fails to load, it falls back to the initial avatar. A failed address is remembered, so the broken image does not flash back on the next render, and a new address still gets tried. - Middle: the account's name, or its email when there is no name, cut off with an ellipsis.
- Right: the options gear that Settings already used. The update-available dot (
settingsNote) now sits on the gear's corner, with the same hover text and visually hidden text as before. - Whole row: one button that calls the same
onTabChange(PANEL_TAB.SETTINGS). It uses the.sidebar-itemhover and current styles, and its tooltip says "Settings". - Signed out: a neutral person avatar and the label "Settings". I chose "Settings" over "Sign in" because Settings is where the button goes.
Only the footer changed in desktop-sidebar.tsx (plus two private components above DesktopSidebar), so it should rebase cleanly against the collapsible-sidebar PR.
Privacy and policy
- Image policy: unchanged.
pictureUrlreaches the renderer only when its host is already allowed byimg-srcinindex.html, and the<img>keepsreferrerPolicy="no-referrer", the same as the Settings account row. - Session replay: no new unmasked path. The name is an ordinary text node, which
maskTextSelector: "*"masks. The<img>'ssrc,alt, andtitleare already inWORDSinsession-replay.ts, so the photo's address is replaced with asterisks and the photo is never recorded.
Tests
desktop-sidebar.test.ts mounts DesktopSidebar in jsdom. It checks that:
- the foot has exactly one button, and pressing it opens Settings
- the photo and the name show when given
- the initial shows when there is no photo, and the email shows when there is no name
- a photo whose
errorevent fires falls back to the initial - signed out, the button says "Settings" and still opens it
- the update note rides on the button
Four of these fail against the old footer. The press and update-note tests pass on both versions; they guard behavior the footer already had. ./scripts/check.sh exits 0.
Mac verification
CI could not verify the Mac UI, and ./scripts/verify.sh was not run. This was built on a Linux VM. LUKE-159 is the manual Mac pass. As a stand-in, I mounted the real DesktopSidebar with the shipped stylesheet in headless Chrome and checked four states: photo, photo with an update waiting while hovered, no photo with a long name that gets cut off, and signed out. All four render as described above.
š¤ Generated with Claude Code