@bobfrankston/rmfmail 1.1.152 → 1.1.154

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.
@@ -1718,6 +1718,15 @@ body.calendar-sidebar-on .calendar-sidebar { display: flex; }
1718
1718
  line-height: 1.5;
1719
1719
  white-space: pre-wrap;
1720
1720
  word-break: break-word;
1721
+ /* The parent `.mv-body` is `overflow:hidden` because the full-body case
1722
+ * is an iframe that scrolls internally. The snippet placeholder lives
1723
+ * directly in `.mv-body` (no iframe), so without its own scroll it's
1724
+ * stuck — wheel events go nowhere until the user clicks away and back
1725
+ * (Bob 2026-05-25 "trying to scroll the summary but I seem stuck").
1726
+ * Take the full flex height and scroll our own content. */
1727
+ height: 100%;
1728
+ overflow: auto;
1729
+ box-sizing: border-box;
1721
1730
  }
1722
1731
  .mv-tear-line {
1723
1732
  position: relative;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bobfrankston/rmfmail",
3
- "version": "1.1.152",
3
+ "version": "1.1.154",
4
4
  "description": "Local-first email client with IMAP sync and standalone native app",
5
5
  "type": "module",
6
6
  "main": "bin/mailx.js",
@@ -45,7 +45,7 @@
45
45
  "@bobfrankston/msger": "^0.1.383",
46
46
  "@bobfrankston/node-tcp-transport": "^0.1.8",
47
47
  "@bobfrankston/oauthsupport": "^1.0.27",
48
- "@bobfrankston/rmf-tiny": "^0.1.24",
48
+ "@bobfrankston/rmf-tiny": "^0.1.25",
49
49
  "@bobfrankston/smtp-direct": "^0.1.8",
50
50
  "@bobfrankston/tcp-transport": "^0.1.6",
51
51
  "@capacitor/android": "^8.3.0",
@@ -125,7 +125,7 @@
125
125
  "@bobfrankston/msger": "^0.1.383",
126
126
  "@bobfrankston/node-tcp-transport": "^0.1.8",
127
127
  "@bobfrankston/oauthsupport": "^1.0.27",
128
- "@bobfrankston/rmf-tiny": "^0.1.24",
128
+ "@bobfrankston/rmf-tiny": "^0.1.25",
129
129
  "@bobfrankston/smtp-direct": "^0.1.8",
130
130
  "@bobfrankston/tcp-transport": "^0.1.6",
131
131
  "@capacitor/android": "^8.3.0",
@@ -6,7 +6,7 @@
6
6
  import { createAutoImapConfig, CompatImapClient } from "@bobfrankston/iflow-direct";
7
7
  import { authenticateOAuth } from "@bobfrankston/oauthsupport";
8
8
  import { parseSerial, fixCharsetDeclString, storeBus } from "@bobfrankston/mailx-store";
9
- import { loadSettings, getConfigDir, getHistoryDays, getPrefetch } from "@bobfrankston/mailx-settings";
9
+ import { loadSettings, getConfigDir, getHistoryDays, getPrefetch, tokenDirName } from "@bobfrankston/mailx-settings";
10
10
  import { EventEmitter } from "node:events";
11
11
  import * as fs from "node:fs";
12
12
  import * as path from "node:path";
@@ -284,7 +284,7 @@ export class ImapManager extends EventEmitter {
284
284
  this.watchers.delete(accountId);
285
285
  }
286
286
  // Delete only the IMAP token (not contacts — separate scope, separate consent)
287
- const accountDir = account.imap.user.replace(/[@.]/g, "_");
287
+ const accountDir = tokenDirName(account.imap.user);
288
288
  const tokenDir = path.join(getConfigDir(), "tokens", accountDir);
289
289
  const tokenPath = path.join(tokenDir, "token.json");
290
290
  if (fs.existsSync(tokenPath)) {
@@ -728,7 +728,7 @@ export class ImapManager extends EventEmitter {
728
728
  }
729
729
  catch { /* iflow-direct not resolvable */ }
730
730
  }
731
- const tokenDir = path.join(getConfigDir(), "tokens", account.imap.user.replace(/[@.]/g, "_"));
731
+ const tokenDir = path.join(getConfigDir(), "tokens", tokenDirName(account.imap.user));
732
732
  tokenProvider = async () => {
733
733
  // Wall-clock timeout on OAuth. Use a longer timeout when no
734
734
  // cached token exists (first auth needs user to click through