feat(desktop): draw a gear on the sidebar's way to Settings

Merged
DA
11d ago
+8-21

Summary

  • The sidebar foot's account button (#1826) drew OptionsIcon, two slider lines, as its way to Settings. It now draws a new GearIcon from @sidecar/panel's own glyph set: a cog on the same 24Ɨ24 box, 1.9 stroke, round caps and joins, aria-hidden/focusable="false" as every other glyph there. The update-available dot still rides on its corner.
  • OptionsIcon had no other user, so it is deleted.
  • Nothing else represents Settings with an icon: the Settings page list's rows are its pages (General, Voice, Display, Shortcuts), each with its own glyph, and the page title carries none. Those stay as they are.
  • Visual-only change. No behaviour changed, so no test is added (a test of which glyph is drawn would be a change-detector test).

Evidence

  • Platform-independent checks: ./scripts/check.sh exits 0 locally.
  • macOS Electron verification (./scripts/verify.sh): not run. This was built on a Linux cloud VM, where verify.sh cannot run, and CI builds nothing for the Mac, so CI could not verify the Mac UI. LUKE-159 is the manual Mac pass that covers it.

Visual evidence

  • Fixture screenshots inspected: not attached. I rendered DesktopSidebar (signed in, with and without the update dot) over the built styles.css in headless Chrome on Linux and checked that the gear sits where the slider glyph was, at the same size and colour, with the dot at its top-right corner.

Physical-device evidence

  • Screenshot or screen recording: not attached
  • Device/display configuration: not recorded

Invariants

  • ./scripts/check.sh green; renderer/UI PRs also ./scripts/verify.sh with evidence inspected. (CI) — verify.sh not run, see above.
  • JSON Schema goldens unchanged (LUKE_UPDATE_FIXTURES not run, or diff explained line by line). (CI)
  • Every behavior change has, in this PR, the test that fails without it; no change-detector test added. (manual; root AGENTS.md "Testing") — no behaviour change.
  • Gateway envelope goldens unchanged. (CI)
  • No new as type assertion outside the allowlisted files. (CI via anti-slop)
  • No Effect.runPromise/runSync/runFork outside the runtime edges and the shims tools/oxlint/anti-slop/effect-edges.json records. (CI via anti-slop/no-run-promise-outside-edges)
  • No new setTimeout/setInterval/new Promise/AbortController/fs.watch outside the files tools/oxlint/anti-slop/effect-edges.json records. (CI via anti-slop/no-raw-async-primitives)
  • No Effect, Stream, or Layer written as a statement and dropped; a description a caller walks past runs nothing. (CI via pnpm discarded-effect)
  • Test count equals the pre-PR count or the delta is listed. (manual: vitest run --reporter=json)
  • Each hand-rolled file the PR replaces is deleted, or the part that remains is a permanent adaptor named in root AGENTS.md's "The permanent adaptors" with the reason it stays.
  • Every CLAUDE.md/AGENTS.md sentence naming a changed part is edited; root pair stays byte-identical. (CI for pair existence; manual for wording)
  • PRIVACY.md unchanged, or the change is a product decision called out in the PR body.
  • Package package.json deps match what the sources import by bare specifier; effect via catalog:. (CI)
  • Barrel/door rule: no Node-reaching Effect module (@effect/platform-node, effect/unstable/sql) behind a barrel the renderer or a web function opens. (CI: existing renderer node: grep plus a new grep for those specifiers in renderer bundles)

Notes

  • Blockers or follow-up verification: the gear's look on a Retina Mac is unverified until LUKE-159's verify.sh pass.

šŸ¤– Generated with Claude Code


Open workspace in Conductor


Devin Review