@bobfrankston/rmfmail 1.1.160 → 1.1.162

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.
package/client/app.js CHANGED
@@ -3548,6 +3548,7 @@ viewBtn?.addEventListener("click", (e) => {
3548
3548
  restoreToolbarDropdown("view-dropdown", "view-menu");
3549
3549
  if (viewDropdown)
3550
3550
  viewDropdown.hidden = !viewDropdown.hidden;
3551
+ refreshToolbarOverlayShield();
3551
3552
  });
3552
3553
  // Capture-phase pointerdown so we run BEFORE any handler that calls
3553
3554
  // stopPropagation. The earlier bubble-phase click listener missed clicks
@@ -3570,7 +3571,46 @@ document.addEventListener("pointerdown", (e) => {
3570
3571
  if (settingsDropdown && !settingsDropdown.hidden && !target.closest("#settings-menu") && !target.closest("#settings-dropdown")) {
3571
3572
  settingsDropdown.hidden = true;
3572
3573
  }
3574
+ refreshToolbarOverlayShield();
3573
3575
  }, true);
3576
+ // Click-to-dismiss for the toolbar dropdowns relies on `pointerdown` firing
3577
+ // on the parent document. Clicks inside the compose iframe stay in the
3578
+ // iframe's document and never bubble out, so a Settings/View menu opened
3579
+ // over compose used to stay stuck until the user hit Escape or the toolbar
3580
+ // button again. Shield the overlay with a transparent fullscreen catcher
3581
+ // while any toolbar dropdown is open — its pointerdown lands here in the
3582
+ // parent doc, triggering the same outside-click close. The shield sits
3583
+ // above compose (z 1600) but below the dropdown itself (z 2000).
3584
+ function refreshToolbarOverlayShield() {
3585
+ const dropdownOpen = ["settings-dropdown", "view-dropdown", "restart-dropdown"]
3586
+ .some(id => {
3587
+ const el = document.getElementById(id);
3588
+ return el && !el.hidden;
3589
+ });
3590
+ const hasOverlay = !!document.querySelector(".compose-overlay, .popout-overlay");
3591
+ let shield = document.getElementById("tb-overlay-shield");
3592
+ if (dropdownOpen && hasOverlay) {
3593
+ if (!shield) {
3594
+ shield = document.createElement("div");
3595
+ shield.id = "tb-overlay-shield";
3596
+ shield.style.cssText = "position:fixed;inset:0;z-index:1999;background:transparent;";
3597
+ shield.addEventListener("pointerdown", (ev) => {
3598
+ ev.preventDefault();
3599
+ ev.stopPropagation();
3600
+ for (const id of ["settings-dropdown", "view-dropdown", "restart-dropdown"]) {
3601
+ const dd = document.getElementById(id);
3602
+ if (dd)
3603
+ dd.hidden = true;
3604
+ }
3605
+ shield?.remove();
3606
+ });
3607
+ document.body.appendChild(shield);
3608
+ }
3609
+ }
3610
+ else if (shield) {
3611
+ shield.remove();
3612
+ }
3613
+ }
3574
3614
  // Escape always closes any open dropdown/backdrop, regardless of how it was
3575
3615
  // opened or whether an outside-click handler missed firing. Last-resort
3576
3616
  // escape hatch for the "stuck modal" case.
@@ -3595,8 +3635,10 @@ document.addEventListener("keydown", (e) => {
3595
3635
  themeSub.hidden = true;
3596
3636
  closed = true;
3597
3637
  }
3598
- if (closed)
3638
+ if (closed) {
3599
3639
  e.preventDefault();
3640
+ refreshToolbarOverlayShield();
3641
+ }
3600
3642
  });
3601
3643
  // Restore saved view settings
3602
3644
  const savedTwoLine = localStorage.getItem("mailx-two-line") === "true";
@@ -4694,6 +4736,7 @@ settingsBtn?.addEventListener("click", (e) => {
4694
4736
  restoreToolbarDropdown("settings-dropdown", "settings-menu");
4695
4737
  if (settingsDropdown)
4696
4738
  settingsDropdown.hidden = !settingsDropdown.hidden;
4739
+ refreshToolbarOverlayShield();
4697
4740
  });
4698
4741
  // Close handled by the shared document click handler above
4699
4742
  // Load current editor setting from server
@@ -5113,6 +5156,7 @@ document.addEventListener("mailx-popout-message", (async (e) => {
5113
5156
  accounts: accts.map((a) => ({ id: a.id, name: a.name, email: a.email, signature: a.signature, sig: a.sig })),
5114
5157
  draftUid: msg.uid,
5115
5158
  draftFolderId: msg.folderId,
5159
+ draftId: msg.mailxDraftId || "",
5116
5160
  };
5117
5161
  sessionStorage.setItem("composeInit", JSON.stringify(init));
5118
5162
  showComposeOverlay(msg.subject ? `Edit: ${msg.subject}` : "Edit draft");