feat(desktop): draw a gear on the sidebar's way to Settings
Merged
DA
11d ago+8+8+0123456789-21-21-01234567890123456789
Summary
- The sidebar foot's account button (#1826) drew
OptionsIcon, two slider lines, as its way to Settings. It now draws a newGearIconfrom@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. OptionsIconhad 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.shexits 0 locally. - macOS Electron verification (
./scripts/verify.sh):not run. This was built on a Linux cloud VM, whereverify.shcannot 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 renderedDesktopSidebar(signed in, with and without the update dot) over the builtstyles.cssin 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.shgreen; renderer/UI PRs also./scripts/verify.shwith evidence inspected. (CI) āverify.shnot run, see above. - JSON Schema goldens unchanged (
LUKE_UPDATE_FIXTURESnot 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
astype assertion outside the allowlisted files. (CI via anti-slop) - No
Effect.runPromise/runSync/runForkoutside the runtime edges and the shimstools/oxlint/anti-slop/effect-edges.jsonrecords. (CI viaanti-slop/no-run-promise-outside-edges) - No new
setTimeout/setInterval/new Promise/AbortController/fs.watchoutside the filestools/oxlint/anti-slop/effect-edges.jsonrecords. (CI viaanti-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.mdsentence naming a changed part is edited; root pair stays byte-identical. (CI for pair existence; manual for wording) -
PRIVACY.mdunchanged, or the change is a product decision called out in the PR body. - Package
package.jsondeps match what the sources import by bare specifier;effectviacatalog:. (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 renderernode: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.shpass.
š¤ Generated with Claude Code