fix(ui): popup signal reduction + direct toolbar icon (v1.6.1)#37
Conversation
…r icon (v1.6.1) - Remove `.status-dot` pulsing dot and `.action-check` right-edge ✓ on action cards. Active mode now signaled via blue gradient + white-inherited icon only (4 signals → 2). Closes #36 visual half, addresses #28 tail. - Hide header "+" button when profile list is empty so the big CTA is the single "add profile" entry point in empty state. Closes #36. - Add icon-direct-{16,32,48,128}.png (green arrow) so Direct mode is visually distinct from System mode in the toolbar. Addresses #28 tail. - Extract resolveIconPaths() + shared PROFILE_COLORS/ICON_SIZES into lib/icon-paths.js; consolidate copies from background.js, generate-icons.js, options.js into one source of truth. - updateIcon() now gains a short-circuit guard against no-op setIcon IPC calls on recurring tab events, and hoists duplicate isHostProxied() calls. - Drop dead .active/.inactive/.proxy/.direct classList churn in updateStatusIndicator() — those classes had no CSS rules after .status-dot was removed. Regression guards: tests/update-icon.test.js (8 assertions), e2e/popup-visual-simplicity.spec.ts, e2e/icon-differentiation.spec.ts, e2e/popup-visual.spec.ts with 5 baseline screenshots. Bumps manifest.json and package.json to 1.6.1.
Code Review — PR #37: fix(ui): popup signal reduction + direct toolbar icon (v1.6.1)SummaryThorough review completed. This is a well-structured UX polish release that addresses feedback from #28 (tail) and #36. The PR description is comprehensive and accurately reflects every code change. Approved. 1. PR Description ↔ Implementation Consistency ✅Every item listed in the PR summary has a corresponding code change:
2. Multi-Dimensional AnalysisCorrectness ✅
Code Quality / Design ✅
Security ✅
Effectiveness ✅
3. Test Coverage ✅
Edge cases are well covered: unrecognized hex, unknown mode, inconsistent (color, 'direct') pair. 4. Regression Verification ✅All CI-equivalent checks pass locally: 5. Minor Observation (non-blocking)In Verdict: Approved. Clean implementation, thorough test coverage, no regressions. Ready to merge. 🟢 Generated by Claude Code |
* fix(ui): reduce popup signal redundancy + differentiate direct toolbar icon (v1.6.1) - Remove `.status-dot` pulsing dot and `.action-check` right-edge ✓ on action cards. Active mode now signaled via blue gradient + white-inherited icon only (4 signals → 2). Closes #36 visual half, addresses #28 tail. - Hide header "+" button when profile list is empty so the big CTA is the single "add profile" entry point in empty state. Closes #36. - Add icon-direct-{16,32,48,128}.png (green arrow) so Direct mode is visually distinct from System mode in the toolbar. Addresses #28 tail. - Extract resolveIconPaths() + shared PROFILE_COLORS/ICON_SIZES into lib/icon-paths.js; consolidate copies from background.js, generate-icons.js, options.js into one source of truth. - updateIcon() now gains a short-circuit guard against no-op setIcon IPC calls on recurring tab events, and hoists duplicate isHostProxied() calls. - Drop dead .active/.inactive/.proxy/.direct classList churn in updateStatusIndicator() — those classes had no CSS rules after .status-dot was removed. Regression guards: tests/update-icon.test.js (8 assertions), e2e/popup-visual-simplicity.spec.ts, e2e/icon-differentiation.spec.ts, e2e/popup-visual.spec.ts with 5 baseline screenshots. Bumps manifest.json and package.json to 1.6.1. * chore: update package-lock.json after npm install Generated during PR #37 review regression testing. https://claude.ai/code/session_01F7LmZmhQk4Mm2wv4JAxPxk --------- Co-authored-by: Claude <noreply@anthropic.com>
Summary
One release addressing all open UX feedback from @sergeevabc (#36 new, #28 tail):
.status-dot(top chip) and.action-check(card right-edge ✓). Active-mode now uses blue-gradient + white-inherited card icon only. 4 signals → 2.+button is hidden while no profiles exist, so the big "Add your first profile" CTA is the single entry point. Closes Repetitive elements to create a new profile #36.icon-direct-{16,32,48,128}.pngfamily so Direct mode looks different from System (inactive gray) in the Chrome toolbar. Addresses Where is direct mode #28 tail.resolveIconPaths()+PROFILE_COLORS/ICON_SIZESinto a newlib/icon-paths.js, single source of truth shared by background worker, icon generator script, and options page.updateIcon()short-circuits on unchanged state sochrome.action.setIconIPC isn't called repeatedly on tab events; duplicateisHostProxied()evaluation hoisted..active/.inactive/.proxy/.directclassList churn inupdateStatusIndicator()(no CSS rules remained after.status-dotdeletion).Closes #36. Addresses sergeevabc's tail comment on closed #28.
Changes
popup.html— removed.status-dot+ two.action-checkblockspopup.css— removed dot/check rules + pulse@keyframes, reflowed.action-cardgrid, addedbody.state-empty #addProfileBtn { display: none }popup.js—updateProfilesList()togglesbody.state-empty;updateStatusIndicator()simplified to text-onlybackground.js—updateIcon(color, mode)with no-op guard; all call sites updated to pass mode explicitly;lastIconMode/lastIconPathsexposed viaGET_STATEfor testslib/icon-paths.js(new) —resolveIconPaths(),PROFILE_COLORS,COLOR_NAMES,ICON_SIZESscripts/generate-icons.js— imports shared constants; registers newproxy-icon-direct.svgoptions.js— importsPROFILE_COLORSto buildvalidColorspublic/icons/proxy-icon-direct.svg+ 4 generated PNGsmanifest.json/package.json— 1.6.0 → 1.6.1CHANGELOG.md— new[1.6.1] - 2026-04-22sectionRegression guards
tests/update-icon.test.js— 8 Vitest assertions on the path resolver's three-way branche2e/popup-visual-simplicity.spec.ts—.status-dot/.action-checkremoved from DOM,#addProfileBtntoggles withstate-emptye2e/icon-differentiation.spec.ts— asserts Direct and System resolve to strictly differentsetIconpaths viaGET_STATEcontract extensione2e/popup-visual.spec.ts— 5 baseline screenshots (empty / has-profiles / direct-active / system-active / profile-active) locked undermaxDiffPixelRatio: 0.02Test plan
npm run type-check— cleannpm test— 91 unit tests passnpm run test:e2e— 82 passed / 1 skipped / 0 failed (full suite, including new popup-visual + icon-differentiation specs)npm run build— dist/ rebuilt with v1.6.1 manifestnpm run generate-icons— all 48 icons including new icon-direct-* produced+, no empty CTA → Direct card blue/no-checkmark → System card blue/no-checkmark → toolbar icon switches green arrow ↔ gray inactive on Direct ↔ SystemCredits
Thanks @sergeevabc for the detailed UX feedback that drove this release.