@bobfrankston/rmfmail 1.0.673 → 1.0.675
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.bundle.js +50 -14
- package/client/app.bundle.js.map +2 -2
- package/client/app.js +67 -0
- package/client/app.js.map +1 -1
- package/client/app.ts +61 -0
- package/client/components/calendar-sidebar.js +14 -11
- package/client/components/calendar-sidebar.js.map +1 -1
- package/client/components/calendar-sidebar.ts +14 -11
- package/client/components/message-viewer.js +28 -10
- package/client/components/message-viewer.js.map +1 -1
- package/client/components/message-viewer.ts +25 -10
- package/package.json +1 -1
- package/packages/mailx-service/index.d.ts.map +1 -1
- package/packages/mailx-service/index.js +13 -0
- package/packages/mailx-service/index.js.map +1 -1
- package/packages/mailx-service/index.ts +12 -0
- package/packages/mailx-service/local-store.d.ts.map +1 -1
- package/packages/mailx-service/local-store.js +9 -1
- package/packages/mailx-service/local-store.js.map +1 -1
- package/packages/mailx-service/local-store.ts +9 -1
package/client/app.bundle.js
CHANGED
|
@@ -1442,9 +1442,20 @@ async function showMessage(accountId, uid, folderId, specialUse, isRetry = false
|
|
|
1442
1442
|
iframe.sandbox.add("allow-top-navigation-by-user-activation");
|
|
1443
1443
|
iframe.sandbox.add("allow-scripts");
|
|
1444
1444
|
iframe.srcdoc = wrapHtmlBody(msg.bodyHtml, msg.remoteAllowed);
|
|
1445
|
-
iframe.addEventListener("load", () => _ptick("iframe load (
|
|
1445
|
+
iframe.addEventListener("load", () => _ptick("iframe load (all resources)"), { once: true });
|
|
1446
|
+
const onReady = () => {
|
|
1447
|
+
const doc = iframe.contentDocument;
|
|
1448
|
+
if (!doc)
|
|
1449
|
+
return;
|
|
1450
|
+
const fire = () => _ptick("iframe DOMContentLoaded (text painted)");
|
|
1451
|
+
if (doc.readyState === "interactive" || doc.readyState === "complete")
|
|
1452
|
+
fire();
|
|
1453
|
+
else
|
|
1454
|
+
doc.addEventListener("DOMContentLoaded", fire, { once: true });
|
|
1455
|
+
};
|
|
1446
1456
|
bodyEl.appendChild(iframe);
|
|
1447
|
-
|
|
1457
|
+
queueMicrotask(onReady);
|
|
1458
|
+
_ptick("iframe srcdoc set");
|
|
1448
1459
|
installPreviewControls(iframe);
|
|
1449
1460
|
} else if (msg.bodyText) {
|
|
1450
1461
|
const pre = document.createElement("pre");
|
|
@@ -1783,14 +1794,12 @@ ${csp}
|
|
|
1783
1794
|
document.addEventListener("mouseleave", function () {
|
|
1784
1795
|
if (lastHoveredHref) postLinkHover("", null);
|
|
1785
1796
|
}, true);
|
|
1786
|
-
//
|
|
1787
|
-
|
|
1788
|
-
|
|
1789
|
-
|
|
1790
|
-
|
|
1791
|
-
|
|
1792
|
-
window.parent.postMessage({ type: "previewToggleFullscreen" }, "*");
|
|
1793
|
-
});
|
|
1797
|
+
// Note: iframe-level dblclick fullscreen toggle REMOVED \u2014 it hijacked
|
|
1798
|
+
// word-selection (Bob 2026-05-11). Double-clicking text inside the
|
|
1799
|
+
// preview now selects the word like any other browser surface; the
|
|
1800
|
+
// fullscreen toggle lives on the viewer chrome (mv-header) handler
|
|
1801
|
+
// in app.ts, which explicitly excludes interactive controls but
|
|
1802
|
+
// operates on chrome, not iframe content.
|
|
1794
1803
|
|
|
1795
1804
|
// Receive commands from the parent (Copy / Select all menu actions).
|
|
1796
1805
|
// Browsers restrict execCommand("copy") to the document where focus
|
|
@@ -3530,11 +3539,11 @@ function renderEvents(events) {
|
|
|
3530
3539
|
}
|
|
3531
3540
|
let lastDayKey = "";
|
|
3532
3541
|
const nowMs = Date.now();
|
|
3533
|
-
const
|
|
3542
|
+
const holidayCutoff = nowMs + HOLIDAY_HORIZON_MS;
|
|
3534
3543
|
for (const e of events) {
|
|
3535
3544
|
if (e.recurringEventId && dailyKeys.has(e.recurringEventId))
|
|
3536
3545
|
continue;
|
|
3537
|
-
if (
|
|
3546
|
+
if (e.isHoliday && e.start > holidayCutoff)
|
|
3538
3547
|
continue;
|
|
3539
3548
|
const d = new Date(e.start);
|
|
3540
3549
|
const dayKey = `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`;
|
|
@@ -4035,7 +4044,7 @@ function initCalendarSidebar() {
|
|
|
4035
4044
|
}
|
|
4036
4045
|
}
|
|
4037
4046
|
}
|
|
4038
|
-
var SIDEBAR_PREF, SHOW_RECURRING_PREF, SHOW_DONE_PREF, HORIZON_DAYS_PREF, HORIZON_DEFAULT_DAYS,
|
|
4047
|
+
var SIDEBAR_PREF, SHOW_RECURRING_PREF, SHOW_DONE_PREF, HORIZON_DAYS_PREF, HORIZON_DEFAULT_DAYS, HOLIDAY_HORIZON_MS, viewYear, viewMonth, viewDay, lastEvents, selectedTaskUuids;
|
|
4039
4048
|
var init_calendar_sidebar = __esm({
|
|
4040
4049
|
"client/components/calendar-sidebar.js"() {
|
|
4041
4050
|
"use strict";
|
|
@@ -4046,7 +4055,7 @@ var init_calendar_sidebar = __esm({
|
|
|
4046
4055
|
SHOW_DONE_PREF = "mailx-task-show-done";
|
|
4047
4056
|
HORIZON_DAYS_PREF = "mailx-cal-horizon-days";
|
|
4048
4057
|
HORIZON_DEFAULT_DAYS = 30;
|
|
4049
|
-
|
|
4058
|
+
HOLIDAY_HORIZON_MS = 14 * 864e5;
|
|
4050
4059
|
viewYear = (/* @__PURE__ */ new Date()).getFullYear();
|
|
4051
4060
|
viewMonth = (/* @__PURE__ */ new Date()).getMonth();
|
|
4052
4061
|
viewDay = (/* @__PURE__ */ new Date()).getDate();
|
|
@@ -5664,6 +5673,33 @@ function propagateAppName() {
|
|
|
5664
5673
|
}
|
|
5665
5674
|
propagateAppName();
|
|
5666
5675
|
window.__btick && window.__btick("app.ts module body executing");
|
|
5676
|
+
(function blockBrowserKeysAndMenu() {
|
|
5677
|
+
const isBlockedKey = (e) => {
|
|
5678
|
+
if (e.key === "F12") return false;
|
|
5679
|
+
if (e.key === "F5" || e.key === "F3") return true;
|
|
5680
|
+
if ((e.ctrlKey || e.metaKey) && (e.key === "r" || e.key === "R")) return true;
|
|
5681
|
+
if (e.ctrlKey || e.metaKey) {
|
|
5682
|
+
const k = e.key.toLowerCase();
|
|
5683
|
+
if (["p", "s", "u", "j", "l", "g", "o"].includes(k)) return true;
|
|
5684
|
+
}
|
|
5685
|
+
if (e.altKey && (e.key === "ArrowLeft" || e.key === "ArrowRight")) return true;
|
|
5686
|
+
if (e.key === "Backspace") {
|
|
5687
|
+
const t = e.target;
|
|
5688
|
+
const editable = t && (t.tagName === "INPUT" || t.tagName === "TEXTAREA" || t.isContentEditable);
|
|
5689
|
+
if (!editable) return true;
|
|
5690
|
+
}
|
|
5691
|
+
return false;
|
|
5692
|
+
};
|
|
5693
|
+
document.addEventListener("keydown", (e) => {
|
|
5694
|
+
if (isBlockedKey(e)) {
|
|
5695
|
+
e.preventDefault();
|
|
5696
|
+
e.stopPropagation();
|
|
5697
|
+
}
|
|
5698
|
+
}, true);
|
|
5699
|
+
document.addEventListener("contextmenu", (e) => {
|
|
5700
|
+
if (!e.defaultPrevented) e.preventDefault();
|
|
5701
|
+
});
|
|
5702
|
+
})();
|
|
5667
5703
|
var baseTitle = APP_NAME;
|
|
5668
5704
|
var lastSeenCount = 0;
|
|
5669
5705
|
var badgeCount = 0;
|