3453e4d02417
vault list: long-press now enters multi-select with the held row selected, and the synthesised mobile contextmenu event is suppressed so it doesn't reopen the menu and undo the gesture (v4.3.6)
- time
- 2026-07-27 23:22 UTC · 3 months ago
- machine
- koh2
- agent
- claude-MiniMax-M3
- session
- sync false-failure and bug trio
- parent
- 88f4c97bcaab
↓ peach-browser-3453e4d0.tar.gzatlas at this save
files changed4 files
manifest.firefox.json+1 −1manifest.json+1 −1package.json+1 −1src/popup/views/Vault.tsx+17 −2manifest.firefox.json+1 −1
@@ -1,7 +1,7 @@11 {22 "manifest_version": 3,33 "name": "Peach Password Manager",4- "version": "4.3.5",4+ "version": "4.3.6",55 "description": "Zero-knowledge password manager",66 "browser_specific_settings": {77 "gecko": {manifest.json+1 −1
@@ -1,7 +1,7 @@11 {22 "manifest_version": 3,33 "name": "Peach Password Manager",4- "version": "4.3.5",4+ "version": "4.3.6",55 "description": "Zero-knowledge password manager",66 "action": {77 "default_popup": "src/popup/index.html",package.json+1 −1
@@ -1,6 +1,6 @@11 {22 "name": "peach",3- "version": "4.3.5",3+ "version": "4.3.6",44 "description": "Zero-knowledge password manager",55 "license": "GPL-3.0-only",66 "type": "module",src/popup/views/Vault.tsx+17 −2
@@ -141,8 +141,14 @@141141 clearLongPressTimer();142142 longPressTimer = window.setTimeout(() => {143143 suppressNextClick = true;144+ // Touch-and-hold = multi-select. Pre-select the row so the action bar145+ // lights up immediately. The context menu still opens on desktop146+ // right-click (and on mobile if the browser synthesises its own long-147+ // press contextmenu event — that path is filtered by `touchStart` so148+ // both don't fire on a single gesture).149+ enterSelectMode();150+ setSelectedIds(new Set([entry.id]));144151 vibrate(20);145- setContextEntry(entry);146152 longPressTimer = null;147153 }, 500);148154 }@@ -532,7 +538,16 @@532538 onTouchMove={handleRowTouchMove}533539 onTouchEnd={(e) => void handleRowTouchEnd(entry, e)}534540 onTouchCancel={() => { clearLongPressTimer(); touchStart = null; }}535- onContextMenu={(e) => { e.preventDefault(); if (!selecting()) setContextEntry(entry); }}541+ onContextMenu={(e) => {542+ e.preventDefault();543+ // A real touch long-press already entered multi-select544+ // via the 500ms timer; the browser's synthesised545+ // contextmenu event would otherwise reopen the menu and546+ // undo the gesture. Desktop right-click has no `touchStart`547+ // to consume, so it still opens the menu.548+ if (touchStart !== null) { touchStart = null; return; }549+ if (!selecting()) setContextEntry(entry);550+ }}536551 onClick={() => {537552 if (suppressNextClick) { suppressNextClick = false; return; }538553 if (selecting()) {