@bobfrankston/mailx 1.0.324 → 1.0.327

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -378,6 +378,15 @@ button.tb-menu-item { background: none; border: none; color: inherit; width: 100
378
378
  grid-template-columns: subgrid;
379
379
  align-content: start;
380
380
  scrollbar-gutter: stable;
381
+ /* Android WebView / Chromium: without an explicit touch-action, the
382
+ * browser waits on JS touch listeners (passive or not) before deciding
383
+ * to scroll. That delay makes the first row feel like it got tapped
384
+ * before the scroll actually starts. pan-y tells the compositor: treat
385
+ * any vertical drag as a scroll, don't wait on JS. overscroll-behavior
386
+ * contains the scroll so we don't chain into the outer page / pull-to-
387
+ * refresh when the user flicks at top/bottom. */
388
+ touch-action: pan-y;
389
+ overscroll-behavior-y: contain;
381
390
  }
382
391
 
383
392
  .ml-row {
@@ -387,6 +396,11 @@ button.tb-menu-item { background: none; border: none; color: inherit; width: 100
387
396
  padding: var(--gap-sm) var(--gap-sm);
388
397
  border-bottom: 1px solid color-mix(in oklch, var(--color-border) 50%, transparent);
389
398
  cursor: pointer;
399
+ /* Disable the 300ms double-tap-to-zoom delay on rows. Double-tap zoom
400
+ * makes no sense on a message row anyway; without this, Android often
401
+ * classifies a scroll-starting tap as a delayed-click because it's
402
+ * still in the double-tap wait window. */
403
+ touch-action: manipulation;
390
404
  font-size: var(--font-size-base);
391
405
  font-weight: 400;
392
406
  color: var(--color-text);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bobfrankston/mailx",
3
- "version": "1.0.324",
3
+ "version": "1.0.327",
4
4
  "description": "Local-first email client with IMAP sync and standalone native app",
5
5
  "type": "module",
6
6
  "main": "bin/mailx.js",
@@ -24,7 +24,7 @@
24
24
  "@bobfrankston/iflow-node": "^0.1.7",
25
25
  "@bobfrankston/miscinfo": "^1.0.9",
26
26
  "@bobfrankston/oauthsupport": "^1.0.24",
27
- "@bobfrankston/msger": "^0.1.343",
27
+ "@bobfrankston/msger": "^0.1.344",
28
28
  "@bobfrankston/mailx-host": "^0.1.3",
29
29
  "@capacitor/android": "^8.3.0",
30
30
  "@capacitor/cli": "^8.3.0",
@@ -88,7 +88,7 @@
88
88
  "@bobfrankston/iflow-node": "^0.1.7",
89
89
  "@bobfrankston/miscinfo": "^1.0.9",
90
90
  "@bobfrankston/oauthsupport": "^1.0.24",
91
- "@bobfrankston/msger": "^0.1.343",
91
+ "@bobfrankston/msger": "^0.1.344",
92
92
  "@bobfrankston/mailx-host": "^0.1.3",
93
93
  "@capacitor/android": "^8.3.0",
94
94
  "@capacitor/cli": "^8.3.0",
@@ -307,36 +307,43 @@ const PROVIDERS = {
307
307
  label: "Gmail",
308
308
  imap: { host: "imap.gmail.com", port: 993, tls: true, auth: "oauth2" },
309
309
  smtp: { host: "smtp.gmail.com", port: 587, tls: true, auth: "oauth2" },
310
+ spam: "SPAM", // Gmail labels, mailx tree shows as "SPAM"
310
311
  },
311
312
  "googlemail.com": {
312
313
  label: "Gmail",
313
314
  imap: { host: "imap.gmail.com", port: 993, tls: true, auth: "oauth2" },
314
315
  smtp: { host: "smtp.gmail.com", port: 587, tls: true, auth: "oauth2" },
316
+ spam: "SPAM",
315
317
  },
316
318
  "outlook.com": {
317
319
  label: "Outlook",
318
320
  imap: { host: "outlook.office365.com", port: 993, tls: true, auth: "oauth2" },
319
321
  smtp: { host: "smtp.office365.com", port: 587, tls: true, auth: "oauth2" },
322
+ spam: "Junk Email",
320
323
  },
321
324
  "hotmail.com": {
322
325
  label: "Hotmail",
323
326
  imap: { host: "outlook.office365.com", port: 993, tls: true, auth: "oauth2" },
324
327
  smtp: { host: "smtp.office365.com", port: 587, tls: true, auth: "oauth2" },
328
+ spam: "Junk Email",
325
329
  },
326
330
  "yahoo.com": {
327
331
  label: "Yahoo",
328
332
  imap: { host: "imap.mail.yahoo.com", port: 993, tls: true, auth: "password" },
329
333
  smtp: { host: "smtp.mail.yahoo.com", port: 587, tls: true, auth: "password" },
334
+ spam: "Bulk Mail",
330
335
  },
331
336
  "aol.com": {
332
337
  label: "AOL",
333
338
  imap: { host: "imap.aol.com", port: 993, tls: true, auth: "password" },
334
339
  smtp: { host: "smtp.aol.com", port: 587, tls: true, auth: "password" },
340
+ spam: "Bulk Mail",
335
341
  },
336
342
  "icloud.com": {
337
343
  label: "iCloud",
338
344
  imap: { host: "imap.mail.me.com", port: 993, tls: true, auth: "password" },
339
345
  smtp: { host: "smtp.mail.me.com", port: 587, tls: true, auth: "password" },
346
+ spam: "Junk",
340
347
  },
341
348
  };
342
349
  /** Fill in provider defaults for an account based on email domain */
@@ -372,6 +379,13 @@ function normalizeAccount(acct, globalName) {
372
379
  relayDomains: acct.relayDomains,
373
380
  deliveredToPrefix: acct.deliveredToPrefix,
374
381
  identityDomains: acct.identityDomains,
382
+ // Spam folder: explicit account config wins; otherwise fall back to
383
+ // the provider default (e.g. Gmail ships with built-in SPAM; Outlook
384
+ // with "Junk Email"). Before 2026-04-21 this field was dropped by
385
+ // normalizeAccount entirely — silent regression even for accounts
386
+ // that had it configured. `acct.spam` first so a user-set value on
387
+ // a recognized provider still overrides the default.
388
+ spam: acct.spam !== undefined ? acct.spam : provider?.spam,
375
389
  };
376
390
  }
377
391
  // ── Defaults ──