@bobfrankston/rmfmail 1.1.194 → 1.1.196

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.
Files changed (32) hide show
  1. package/client/android-bootstrap.bundle.js +6 -4
  2. package/client/android-bootstrap.bundle.js.map +2 -2
  3. package/client/app.bundle.js +14 -1
  4. package/client/app.bundle.js.map +2 -2
  5. package/client/app.js +24 -4
  6. package/client/app.js.map +1 -1
  7. package/client/app.ts +23 -4
  8. package/package.json +3 -3
  9. package/packages/mailx-imap/index.js +4 -4
  10. package/packages/mailx-imap/index.js.map +1 -1
  11. package/packages/mailx-imap/index.ts +4 -4
  12. package/packages/mailx-imap/package-lock.json +2 -2
  13. package/packages/mailx-imap/package.json +1 -1
  14. package/packages/mailx-store/db.d.ts +11 -3
  15. package/packages/mailx-store/db.d.ts.map +1 -1
  16. package/packages/mailx-store/db.js +48 -6
  17. package/packages/mailx-store/db.js.map +1 -1
  18. package/packages/mailx-store/db.ts +51 -9
  19. package/packages/mailx-store/package.json +1 -1
  20. package/packages/mailx-store-web/android-bootstrap.js +2 -2
  21. package/packages/mailx-store-web/android-bootstrap.js.map +1 -1
  22. package/packages/mailx-store-web/android-bootstrap.ts +2 -2
  23. package/packages/mailx-store-web/db.d.ts +3 -1
  24. package/packages/mailx-store-web/db.d.ts.map +1 -1
  25. package/packages/mailx-store-web/db.js +4 -2
  26. package/packages/mailx-store-web/db.js.map +1 -1
  27. package/packages/mailx-store-web/db.ts +5 -3
  28. package/packages/mailx-store-web/package.json +1 -1
  29. package/packages/mailx-store-web/sync-manager.js +1 -1
  30. package/packages/mailx-store-web/sync-manager.js.map +1 -1
  31. package/packages/mailx-store-web/sync-manager.ts +1 -1
  32. /package/packages/mailx-imap/{node_modules.npmglobalize-stash-73948 → node_modules.npmglobalize-stash-59976}/.package-lock.json +0 -0
package/client/app.ts CHANGED
@@ -160,8 +160,8 @@ function updateBadge(count: number): void {
160
160
  link.href = dataUrl;
161
161
 
162
162
  // Also push to the Windows taskbar overlay via msger's IPC helper —
163
- // no-op on Linux/Mac. For count=0, render a dedicated "no-overlay"
164
- // icon that's all-transparent so the base icon shows cleanly.
163
+ // no-op on Linux/Mac. For count=0, clear the overlay so the base icon
164
+ // shows cleanly.
165
165
  try {
166
166
  // The injected host bridge is `window.mailxapi`, NOT `window.msgapi`.
167
167
  // The old `msgapi` reference was always undefined, so the taskbar
@@ -171,8 +171,27 @@ function updateBadge(count: number): void {
171
171
  const hostApi: any = (window as any).mailxapi;
172
172
  if (hostApi?.setTaskbarOverlay) {
173
173
  if (count > 0) {
174
- // strip "data:image/png;base64," prefix base64 only
175
- const b64 = dataUrl.split(",")[1] || "";
174
+ // BADGE-ONLY overlay. SetOverlayIcon composites the supplied
175
+ // icon onto the bottom-right corner of the taskbar button —
176
+ // the base envelope icon is already there. Sending the full
177
+ // envelope+badge canvas (favicon) drew a SECOND tiny envelope
178
+ // in the corner on top of the big one (Bob 2026-05-29). Render
179
+ // just the red count pill on a transparent field so only the
180
+ // number is overlaid. Filled circle spans most of the 32×32 so
181
+ // it stays legible after the corner downscale.
182
+ const bc = document.createElement("canvas");
183
+ bc.width = 32; bc.height = 32;
184
+ const bx = bc.getContext("2d")!;
185
+ bx.fillStyle = "#e33";
186
+ bx.beginPath();
187
+ bx.arc(16, 16, 15, 0, Math.PI * 2);
188
+ bx.fill();
189
+ bx.fillStyle = "#fff";
190
+ bx.font = "bold 20px sans-serif";
191
+ bx.textAlign = "center";
192
+ bx.textBaseline = "middle";
193
+ bx.fillText(count > 99 ? "99+" : String(count), 16, 17);
194
+ const b64 = bc.toDataURL("image/png").split(",")[1] || "";
176
195
  hostApi.setTaskbarOverlay(b64, `${count} unread`);
177
196
  } else {
178
197
  hostApi.setTaskbarOverlay("", "");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bobfrankston/rmfmail",
3
- "version": "1.1.194",
3
+ "version": "1.1.196",
4
4
  "description": "Local-first email client with IMAP sync and standalone native app",
5
5
  "type": "module",
6
6
  "main": "bin/mailx.js",
@@ -38,7 +38,7 @@
38
38
  "dependencies": {
39
39
  "@bobfrankston/iflow-direct": "^0.1.51",
40
40
  "@bobfrankston/mailx-host": "^0.1.13",
41
- "@bobfrankston/mailx-imap": "^0.1.74",
41
+ "@bobfrankston/mailx-imap": "^0.1.75",
42
42
  "@bobfrankston/mailx-store-web": "^0.1.26",
43
43
  "@bobfrankston/mailx-sync": "^0.1.19",
44
44
  "@bobfrankston/miscinfo": "^1.0.12",
@@ -118,7 +118,7 @@
118
118
  "dependencies": {
119
119
  "@bobfrankston/iflow-direct": "^0.1.51",
120
120
  "@bobfrankston/mailx-host": "^0.1.13",
121
- "@bobfrankston/mailx-imap": "^0.1.74",
121
+ "@bobfrankston/mailx-imap": "^0.1.75",
122
122
  "@bobfrankston/mailx-store-web": "^0.1.26",
123
123
  "@bobfrankston/mailx-sync": "^0.1.19",
124
124
  "@bobfrankston/miscinfo": "^1.0.12",
@@ -2774,7 +2774,7 @@ export class ImapManager extends EventEmitter {
2774
2774
  if (!raw)
2775
2775
  return null;
2776
2776
  const bodyPath = await this.bodyStore.putMessage(accountId, folderId, uid, raw);
2777
- this.db.updateBodyPath(accountId, uid, bodyPath);
2777
+ this.db.updateBodyPath(accountId, folderId, uid, bodyPath);
2778
2778
  this.emit("bodyCached", accountId, uid);
2779
2779
  return raw;
2780
2780
  }
@@ -2816,7 +2816,7 @@ export class ImapManager extends EventEmitter {
2816
2816
  }
2817
2817
  const raw = Buffer.from(msg.source, "utf-8");
2818
2818
  const bodyPath = await this.bodyStore.putMessage(accountId, folderId, uid, raw);
2819
- this.db.updateBodyPath(accountId, uid, bodyPath);
2819
+ this.db.updateBodyPath(accountId, folderId, uid, bodyPath);
2820
2820
  this.emit("bodyCached", accountId, uid);
2821
2821
  return raw;
2822
2822
  }
@@ -2997,7 +2997,7 @@ export class ImapManager extends EventEmitter {
2997
2997
  const raw = Buffer.from(source, "utf-8");
2998
2998
  const bodyPath = await this.bodyStore.putMessage(accountId, folderId, uid, raw);
2999
2999
  const parsed = await extractPreview(source);
3000
- this.db.updateBodyMeta(accountId, uid, bodyPath, parsed.hasAttachments, parsed.preview);
3000
+ this.db.updateBodyMeta(accountId, folderId, uid, bodyPath, parsed.hasAttachments, parsed.preview);
3001
3001
  this.emit("bodyCached", accountId, uid);
3002
3002
  counters.totalFetched++;
3003
3003
  madeProgress = true;
@@ -3129,7 +3129,7 @@ export class ImapManager extends EventEmitter {
3129
3129
  const raw = Buffer.from(source, "utf-8");
3130
3130
  const bodyPath = await this.bodyStore.putMessage(accountId, folderId, uid, raw);
3131
3131
  const parsed = await extractPreview(source);
3132
- this.db.updateBodyMeta(accountId, uid, bodyPath, parsed.hasAttachments, parsed.preview);
3132
+ this.db.updateBodyMeta(accountId, folderId, uid, bodyPath, parsed.hasAttachments, parsed.preview);
3133
3133
  this.emit("bodyCached", accountId, uid);
3134
3134
  this.clearPrefetchEmpty(accountId, folderId, uid); // healed — drop stale backoff
3135
3135
  counters.totalFetched++;