c43cfea9877d

fix note date grid placement, notesOnly toggle DOM node theft, toolbar onPointerDown (v2.39.7)

time
2026-05-13 16:16 UTC · 5 months ago
machine
koh2
parent
deb44debe166
6 files manifest.firefox.json+1 −1manifest.json+1 −1package.json+1 −1src/popup/components/NoteToolbar.tsx+8 −8src/popup/styles/popup.css+1 −0src/popup/views/Vault.tsx+6 −6
manifest.firefox.json+1 −1
@@ -1,7 +1,7 @@11 {22   "manifest_version": 3,33   "name": "Peach",4-  "version": "2.39.6",4+  "version": "2.39.7",55   "description": "Zero-knowledge password manager",66   "browser_specific_settings": {77     "gecko": {

view file

manifest.json+1 −1
@@ -1,7 +1,7 @@11 {22   "manifest_version": 3,33   "name": "Peach",4-  "version": "2.39.6",4+  "version": "2.39.7",55   "description": "Zero-knowledge password manager",66   "action": {77     "default_popup": "src/popup/index.html",

view file

package.json+1 −1
@@ -1,6 +1,6 @@11 {22   "name": "peach",3-  "version": "2.39.6",3+  "version": "2.39.7",44   "description": "Zero-knowledge password manager",55   "type": "module",66   "scripts": {

view file

src/popup/components/NoteToolbar.tsx+8 −8
@@ -45,16 +45,16 @@4545       {/* Mobile: sits above keyboard when keyboard is visible */}4646       <Show when={props.keyboardVisible}>4747         <div class={props.class ?? "peach-note-toolbar-mobile"}>48-          <button class="peach-note-toolbar-btn" onTouchEnd={(e) => { e.preventDefault(); applyBold(props.exec); }}>B</button>49-          <button class="peach-note-toolbar-btn peach-note-toolbar-btn--italic" onTouchEnd={(e) => { e.preventDefault(); applyItalic(props.exec); }}>I</button>50-          <button class="peach-note-toolbar-btn" onTouchEnd={(e) => { e.preventDefault(); applyUnderline(props.exec); }}>U</button>48+          <button class="peach-note-toolbar-btn" onPointerDown={(e) => { e.preventDefault(); applyBold(props.exec); }}>B</button>49+          <button class="peach-note-toolbar-btn peach-note-toolbar-btn--italic" onPointerDown={(e) => { e.preventDefault(); applyItalic(props.exec); }}>I</button>50+          <button class="peach-note-toolbar-btn" onPointerDown={(e) => { e.preventDefault(); applyUnderline(props.exec); }}>U</button>5151           <div class="peach-note-toolbar-divider" />52-          <button class="peach-note-toolbar-btn" onTouchEnd={(e) => { e.preventDefault(); applyHeading(props.exec); }}>H</button>53-          <button class="peach-note-toolbar-btn" onTouchEnd={(e) => { e.preventDefault(); applyQuote(props.exec); }}>"</button>54-          <button class="peach-note-toolbar-btn" onTouchEnd={(e) => { e.preventDefault(); applyBullet(props.exec); }}>•</button>55-          <button class="peach-note-toolbar-btn" onTouchEnd={(e) => { e.preventDefault(); applyNumbered(props.exec); }}>1.</button>52+          <button class="peach-note-toolbar-btn" onPointerDown={(e) => { e.preventDefault(); applyHeading(props.exec); }}>H</button>53+          <button class="peach-note-toolbar-btn" onPointerDown={(e) => { e.preventDefault(); applyQuote(props.exec); }}>"</button>54+          <button class="peach-note-toolbar-btn" onPointerDown={(e) => { e.preventDefault(); applyBullet(props.exec); }}>•</button>55+          <button class="peach-note-toolbar-btn" onPointerDown={(e) => { e.preventDefault(); applyNumbered(props.exec); }}>1.</button>5656           <div class="peach-note-toolbar-spacer" />57-          <button class="peach-note-toolbar-btn" onTouchEnd={(e) => { e.preventDefault(); props.onDismissKeyboard?.(); }}>⌨</button>57+          <button class="peach-note-toolbar-btn" onPointerDown={(e) => { e.preventDefault(); props.onDismissKeyboard?.(); }}>⌨</button>5858         </div>5959       </Show>6060     </Show>

view file

src/popup/styles/popup.css+1 −0
@@ -8387,6 +8387,7 @@83878387   white-space: nowrap;83888388   text-align: right;83898389   flex-shrink: 0;8390+  grid-column: 5;83908391 }83918392 83928393 /* Swipe underlays */

view file

src/popup/views/Vault.tsx+6 −6
@@ -17,9 +17,9 @@1717   // a black square on freshly-imported entries the browser hasn't visited1818   // yet (Chrome's `_favicon/` cache is empty for unvisited domains).1919   const fallback = props.isPasskey20-    ? PASSKEY_ICON20+    ? <PasskeyIcon />2121     : props.isNote22-      ? NOTE_ICON22+      ? <NoteIcon />2323       : <InitialsChip title={props.title ?? props.domain ?? ""} />;2424   const [failed, setFailed] = createSignal(false);2525   return (@@ -79,21 +79,21 @@7979   );8080 }8181 82-const LOGIN_ICON = (82+const LoginIcon = () => (8383   <svg width="11" height="12" viewBox="0 0 11 12" fill="none" stroke="currentColor" stroke-width="0.9" stroke-linecap="round" aria-hidden="true">8484     <rect x="2" y="5" width="7" height="5" rx="1.2" />8585     <path d="M3.5 5V3.75A2 2 0 0 1 5.5 1.75A2 2 0 0 1 7.5 3.75V5" />8686   </svg>8787 );8888 89-const PASSKEY_ICON = (89+const PasskeyIcon = () => (9090   <svg width="11" height="12" viewBox="0 0 11 12" fill="none" stroke="currentColor" stroke-width="0.9" stroke-linecap="round" aria-hidden="true">9191     <circle cx="4" cy="4.5" r="3" />9292     <path d="M6.5 7l3.5 3.5M8.5 8.5L10 10" />9393   </svg>9494 );9595 96-const NOTE_ICON = (96+const NoteIcon = () => (9797   <svg width="11" height="12" viewBox="0 0 11 12" fill="none" stroke="currentColor" stroke-width="0.9" stroke-linecap="round" aria-hidden="true">9898     <rect x="1.5" y="1.5" width="8" height="9" rx="1.5" />9999     <path d="M3.5 4.5h4M3.5 6.5h4M3.5 8.5h2" />@@ -491,7 +491,7 @@491491                 aria-label="Notes only"492492                 title="Show notes only"493493               >494-                {NOTE_ICON}494+                <NoteIcon />495495               </button>496496               <Show when={props.onOpenTrash}>497497                 <button

view file