@bobfrankston/rmfmail 1.0.686 → 1.0.690

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 (46) hide show
  1. package/client/app.bundle.js +57 -19
  2. package/client/app.bundle.js.map +2 -2
  3. package/client/app.js +36 -2
  4. package/client/app.js.map +1 -1
  5. package/client/app.ts +36 -2
  6. package/client/components/alarms.js +24 -12
  7. package/client/components/alarms.js.map +1 -1
  8. package/client/components/alarms.ts +23 -11
  9. package/client/components/message-list.js +9 -4
  10. package/client/components/message-list.js.map +1 -1
  11. package/client/components/message-list.ts +9 -4
  12. package/client/components/message-viewer.js +33 -3
  13. package/client/components/message-viewer.js.map +1 -1
  14. package/client/components/message-viewer.ts +33 -3
  15. package/client/compose/compose.bundle.js +7 -0
  16. package/client/compose/compose.bundle.js.map +2 -2
  17. package/client/compose/spellcheck.js +19 -0
  18. package/client/compose/spellcheck.js.map +1 -1
  19. package/client/compose/spellcheck.ts +17 -0
  20. package/package.json +3 -3
  21. package/packages/mailx-imap/index.d.ts.map +1 -1
  22. package/packages/mailx-imap/index.js +66 -9
  23. package/packages/mailx-imap/index.js.map +1 -1
  24. package/packages/mailx-imap/index.ts +63 -9
  25. package/packages/mailx-imap/package-lock.json +2 -2
  26. package/packages/mailx-imap/package.json +1 -1
  27. package/packages/mailx-service/google-sync.d.ts +46 -1
  28. package/packages/mailx-service/google-sync.d.ts.map +1 -1
  29. package/packages/mailx-service/google-sync.js +50 -1
  30. package/packages/mailx-service/google-sync.js.map +1 -1
  31. package/packages/mailx-service/google-sync.ts +91 -1
  32. package/packages/mailx-service/index.d.ts.map +1 -1
  33. package/packages/mailx-service/index.js +79 -6
  34. package/packages/mailx-service/index.js.map +1 -1
  35. package/packages/mailx-service/index.ts +76 -6
  36. package/packages/mailx-service/local-store.d.ts.map +1 -1
  37. package/packages/mailx-service/local-store.js +11 -0
  38. package/packages/mailx-service/local-store.js.map +1 -1
  39. package/packages/mailx-service/local-store.ts +9 -0
  40. package/packages/mailx-store/db.d.ts +7 -0
  41. package/packages/mailx-store/db.d.ts.map +1 -1
  42. package/packages/mailx-store/db.js +46 -5
  43. package/packages/mailx-store/db.js.map +1 -1
  44. package/packages/mailx-store/db.ts +48 -5
  45. package/packages/mailx-store/package.json +1 -1
  46. /package/packages/mailx-imap/{node_modules.npmglobalize-stash-11884 → node_modules.npmglobalize-stash-51400}/.package-lock.json +0 -0
package/client/app.js CHANGED
@@ -4,7 +4,7 @@
4
4
  */
5
5
  import { initFolderTree, refreshFolderTree, updateFolderCounts, setFolderSynced, getFolderSynced, setOutboxTotal } from "./components/folder-tree.js";
6
6
  import { initMessageList, loadMessages, loadUnifiedInbox, loadSearchResults, reloadCurrentFolder, clearSearchMode, getSelectedMessages, markBodiesCached, getCurrentFocused, releaseFocus, removeMessagesAndReconcile, setRowFlagged, scrollFocusedIntoView, refreshPriorityIndex } from "./components/message-list.js";
7
- import { getCurrentMessage, initViewer, popOutCurrentMessage, toggleFullscreenPreview, showPreviewBodyMenu } from "./components/message-viewer.js";
7
+ import { getCurrentMessage, initViewer, popOutCurrentMessage, toggleFullscreenPreview, showPreviewBodyMenu, wrapHtmlBody } from "./components/message-viewer.js";
8
8
  import { connectWebSocket, onWsEvent, triggerSync, syncAccount, reauthenticate, getAccounts, getFolders, deleteMessages, undeleteMessage, restartServer, getSyncPending, getVersion, getSettings, saveSettings, getAutocompleteSettings, saveAutocompleteSettings, repairAccounts, updateFlags, markAsSpamMessages, logClientEvent, sendMessage as apiSendMessage } from "./lib/api-client.js";
9
9
  import * as messageState from "./lib/message-state.js";
10
10
  // ── New message badge (favicon + title) ──
@@ -4504,6 +4504,32 @@ document.addEventListener("mailx-popout-message", (async (e) => {
4504
4504
  alert(`Couldn't load message: ${err?.message || err}`);
4505
4505
  return;
4506
4506
  }
4507
+ // Drafts pop out into a COMPOSE window, not a read-only viewer popout.
4508
+ // Bob 2026-05-12: "popping out a draft should default to that" (edit
4509
+ // mode). Flag detection: server-side \Draft flag, or the message is
4510
+ // currently sitting in the user's Drafts folder. The read-only popout
4511
+ // surface is missing every action button (Reply, Forward, Edit Draft,
4512
+ // …) so dumping a draft into it is a worst-case dead-end.
4513
+ const isDraft = Array.isArray(msg?.flags) && msg.flags.includes("\\Draft");
4514
+ if (isDraft) {
4515
+ const accts = await getAccounts();
4516
+ const init = {
4517
+ mode: "draft",
4518
+ accountId,
4519
+ to: msg.to || [],
4520
+ cc: msg.cc || [],
4521
+ subject: msg.subject || subject || "",
4522
+ bodyHtml: msg.bodyHtml || "",
4523
+ inReplyTo: msg.inReplyTo || "",
4524
+ references: msg.references || [],
4525
+ accounts: accts.map((a) => ({ id: a.id, name: a.name, email: a.email, signature: a.signature, sig: a.sig })),
4526
+ draftUid: msg.uid,
4527
+ draftFolderId: msg.folderId,
4528
+ };
4529
+ sessionStorage.setItem("composeInit", JSON.stringify(init));
4530
+ showComposeOverlay(msg.subject ? `Edit: ${msg.subject}` : "Edit draft");
4531
+ return;
4532
+ }
4507
4533
  const wrapper = document.createElement("div");
4508
4534
  wrapper.className = "popout-overlay";
4509
4535
  wrapper.style.cssText = "position:fixed;top:5vh;right:5vw;width:min(900px,60vw);height:min(800px,80vh);z-index:1500;background:var(--color-bg);border:1px solid var(--color-border);border-radius:6px;box-shadow:0 8px 32px rgba(0,0,0,0.3);display:flex;flex-direction:column;resize:both;overflow:hidden;";
@@ -4531,7 +4557,15 @@ document.addEventListener("mailx-popout-message", (async (e) => {
4531
4557
  wrapper.appendChild(meta);
4532
4558
  wrapper.appendChild(body);
4533
4559
  document.body.appendChild(wrapper);
4534
- body.srcdoc = msg.bodyHtml || `<pre style="white-space:pre-wrap;font-family:ui-sans-serif">${escapeHtmlBasic(msg.bodyText || "(no body)")}</pre>`;
4560
+ // Use the same wrapHtmlBody styling as the inline preview pane so the
4561
+ // popout's typography matches the preview's typography. Earlier the
4562
+ // popout fed bodyHtml DIRECTLY into srcdoc with no CSS wrapping, so
4563
+ // the browser used its default font (Times serif) while the preview
4564
+ // pane used system-ui sans-serif (Bob 2026-05-12: "double clicking on
4565
+ // the summary shows in a different font than in preview").
4566
+ body.srcdoc = msg.bodyHtml
4567
+ ? wrapHtmlBody(msg.bodyHtml, !!msg.remoteAllowed)
4568
+ : `<!DOCTYPE html><html><head><style>body{font-family:system-ui,sans-serif;font-size:17.5px;line-height:1.5;color:#1a1a2e;padding:1rem;margin:0;}pre{white-space:pre-wrap;word-break:break-word;font-family:inherit;font-size:inherit;margin:0;}</style></head><body><pre>${escapeHtmlBasic(msg.bodyText || "(no body)")}</pre></body></html>`;
4535
4569
  // Drag-to-move.
4536
4570
  let dragX = 0, dragY = 0, dragging = false;
4537
4571
  header.addEventListener("mousedown", (de) => {