feat(desktop): make the sidebar foot one account button that opens Settings

Merged
DA
11d ago
+259-50

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-item hover 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. pictureUrl reaches the renderer only when its host is already allowed by img-src in index.html, and the <img> keeps referrerPolicy="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>'s src, alt, and title are already in WORDS in session-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 error event 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


Open workspace in Conductor


Devin Review