@bobfrankston/rmfmail 1.1.158 → 1.1.160

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.
@@ -2017,6 +2017,17 @@ ${csp}
2017
2017
  document.addEventListener("mouseleave", function () {
2018
2018
  if (lastHoveredHref) postLinkHover("", null);
2019
2019
  }, true);
2020
+ // Touch dismissers \u2014 a tap on Android fires synthetic mouseover but
2021
+ // often skips the matching mouseout (no mouse-move to track), so the
2022
+ // URL preview can stick on top of the message body even after the
2023
+ // user has scrolled away (Bob 2026-05-26 "sticky overlay URL"). Any
2024
+ // touchstart / touchend / scroll anywhere in the iframe immediately
2025
+ // clears the tooltip.
2026
+ var clearHover = function () { if (lastHoveredHref) postLinkHover("", null); };
2027
+ document.addEventListener("touchstart", clearHover, { passive: true, capture: true });
2028
+ document.addEventListener("touchend", clearHover, { passive: true, capture: true });
2029
+ document.addEventListener("scroll", clearHover, { passive: true, capture: true });
2030
+ window.addEventListener("scroll", clearHover, { passive: true, capture: true });
2020
2031
  // Note: iframe-level dblclick fullscreen toggle REMOVED \u2014 it hijacked
2021
2032
  // word-selection (Bob 2026-05-11). Double-clicking text inside the
2022
2033
  // preview now selects the word like any other browser surface; the
@@ -2116,8 +2127,10 @@ ${csp}
2116
2127
  function popOutCurrentMessage() {
2117
2128
  if (!currentMessage)
2118
2129
  return;
2130
+ const isAndroid = window.mailxapi?.platform === "android";
2131
+ const isCoarse = !!window.matchMedia?.("(pointer: coarse)")?.matches;
2119
2132
  const isNarrow = window.innerWidth <= 768;
2120
- if (isNarrow) {
2133
+ if (isAndroid || isCoarse || isNarrow) {
2121
2134
  document.body.classList.toggle("viewer-fullscreen");
2122
2135
  return;
2123
2136
  }
@@ -9318,19 +9331,18 @@ function applyThreadFilter() {
9318
9331
  return;
9319
9332
  }
9320
9333
  refreshing = true;
9321
- indicator.classList.remove("armed", "dragging");
9322
- indicator.classList.add("refreshing");
9323
- indicator.style.transform = `translateY(calc(-100% + 60px))`;
9324
- labelEl.textContent = "Refreshing...";
9334
+ reset();
9335
+ const statusSync = document.getElementById("status-sync");
9336
+ const prevColor = statusSync?.style.color || "";
9337
+ if (statusSync) statusSync.style.color = "var(--color-brand-dark, #2563eb)";
9325
9338
  try {
9326
9339
  const { triggerSync: triggerSync2 } = await Promise.resolve().then(() => (init_api_client(), api_client_exports));
9327
9340
  await triggerSync2();
9328
9341
  } catch (e) {
9329
9342
  console.error("pull-to-refresh failed:", e?.message || e);
9330
9343
  }
9344
+ if (statusSync) statusSync.style.color = prevColor;
9331
9345
  refreshing = false;
9332
- indicator.classList.remove("refreshing");
9333
- reset();
9334
9346
  };
9335
9347
  mlBody.addEventListener("touchend", () => {
9336
9348
  finish();