@bobfrankston/rmfmail 1.1.174 → 1.1.180
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/bin/mailx.js +30 -2
- package/bin/mailx.js.map +1 -1
- package/bin/mailx.ts +32 -3
- package/client/app.bundle.js +123 -0
- package/client/app.bundle.js.map +2 -2
- package/client/app.js +45 -1
- package/client/app.js.map +1 -1
- package/client/app.ts +40 -1
- package/client/components/message-list.js +20 -1
- package/client/components/message-list.js.map +1 -1
- package/client/components/message-list.ts +21 -1
- package/client/compose/compose.bundle.js +2158 -1779
- package/client/compose/compose.bundle.js.map +4 -4
- package/client/compose/compose.js +5 -1
- package/client/compose/compose.js.map +1 -1
- package/client/compose/compose.ts +6 -1
- package/client/compose/editor.js +85 -0
- package/client/compose/editor.js.map +1 -1
- package/client/compose/editor.ts +79 -0
- package/client/compose/spellcheck-core.js +253 -0
- package/client/compose/spellcheck-core.js.map +1 -0
- package/client/compose/spellcheck-core.ts +242 -0
- package/client/lib/api-client.js +89 -0
- package/client/lib/api-client.js.map +1 -1
- package/client/lib/api-client.ts +81 -0
- package/package.json +5 -5
- package/packages/mailx-service/jsonrpc.js +12 -2
- package/packages/mailx-service/jsonrpc.js.map +1 -1
- package/packages/mailx-service/jsonrpc.ts +12 -2
- /package/packages/mailx-imap/{node_modules.npmglobalize-stash-50120 → node_modules.npmglobalize-stash-19808}/.package-lock.json +0 -0
package/client/app.js
CHANGED
|
@@ -7,8 +7,13 @@ import { initMessageList, loadMessages, loadUnifiedInbox, loadSearchResults, rel
|
|
|
7
7
|
import { seenOf, flaggedOf, draftOf, setSeen, setFlagged } from "@bobfrankston/mailx-types";
|
|
8
8
|
import { initTabs, setActiveView as setActiveTabView, openTab } from "./components/tabs.js";
|
|
9
9
|
import { getCurrentMessage, initViewer, popOutCurrentMessage, printCurrentMessage, toggleFullscreenPreview, showPreviewBodyMenu, wrapHtmlBody } from "./components/message-viewer.js";
|
|
10
|
-
import { connectWebSocket, onWsEvent, triggerSync, syncAccount, reauthenticate, getAccounts, getFolders, deleteMessage, deleteMessages, undeleteMessage, restartServer, getSyncPending, getVersion, getSettings, saveSettings, getAutocompleteSettings, saveAutocompleteSettings, repairAccounts, updateFlags, markAsSpamMessages, logClientEvent, sendMessage as apiSendMessage, subscribeStore, cancelServerSearch } from "./lib/api-client.js";
|
|
10
|
+
import { connectWebSocket, onWsEvent, triggerSync, syncAccount, reauthenticate, getAccounts, getFolders, deleteMessage, deleteMessages, undeleteMessage, restartServer, getSyncPending, getVersion, getSettings, saveSettings, getAutocompleteSettings, saveAutocompleteSettings, repairAccounts, updateFlags, markAsSpamMessages, logClientEvent, sendMessage as apiSendMessage, subscribeStore, cancelServerSearch, installConsoleCapture } from "./lib/api-client.js";
|
|
11
11
|
import * as messageState from "./lib/message-state.js";
|
|
12
|
+
// FIRST THING. Captures every console.log/warn/error + window errors +
|
|
13
|
+
// unhandled promise rejections to the daemon log via logClientEvent, so
|
|
14
|
+
// debugging client-side bugs never requires opening devtools — search
|
|
15
|
+
// rmfmail-YYYY-MM-DD.log for "console.error" or "window.error" instead.
|
|
16
|
+
installConsoleCapture();
|
|
12
17
|
// ── New message badge (favicon + title) ──
|
|
13
18
|
/** The user-visible app name. Single point of change for the rename;
|
|
14
19
|
* every UI surface that shows "rmfmail" reads from here. Static HTML
|
|
@@ -3377,6 +3382,45 @@ document.getElementById("message-viewer")?.addEventListener("dblclick", (e) => {
|
|
|
3377
3382
|
toggleFullscreenPreview();
|
|
3378
3383
|
});
|
|
3379
3384
|
// ── F6 pane cycling ──
|
|
3385
|
+
/** Focus a specific pane by element id. Same visual hint as cyclePaneFocus
|
|
3386
|
+
* so the user can see which pane took focus. Wired to middle-click. */
|
|
3387
|
+
function focusPaneById(id) {
|
|
3388
|
+
const el = document.getElementById(id);
|
|
3389
|
+
if (!el)
|
|
3390
|
+
return;
|
|
3391
|
+
if (!el.hasAttribute("tabindex"))
|
|
3392
|
+
el.setAttribute("tabindex", "-1");
|
|
3393
|
+
el.focus();
|
|
3394
|
+
el.style.outline = "2px solid var(--color-accent, #3b82f6)";
|
|
3395
|
+
el.style.outlineOffset = "-2px";
|
|
3396
|
+
setTimeout(() => { el.style.outline = ""; el.style.outlineOffset = ""; }, 600);
|
|
3397
|
+
}
|
|
3398
|
+
// Middle-click anywhere in a pane focuses that pane. Doesn't conflict with
|
|
3399
|
+
// any existing right-click context menus or left-click selection handlers.
|
|
3400
|
+
// Bob 2026-05-27: F6/Shift+F6 isn't memorable; right-click feels natural.
|
|
3401
|
+
// We do middle-click (button=1) because right-click is already overloaded
|
|
3402
|
+
// for row/message context menus throughout the UI.
|
|
3403
|
+
document.addEventListener("auxclick", (e) => {
|
|
3404
|
+
if (e.button !== 1)
|
|
3405
|
+
return; // middle button only
|
|
3406
|
+
const target = e.target;
|
|
3407
|
+
if (!target)
|
|
3408
|
+
return;
|
|
3409
|
+
const ft = target.closest("#folder-tree");
|
|
3410
|
+
const ml = target.closest("#ml-body");
|
|
3411
|
+
const mv = target.closest("#message-viewer");
|
|
3412
|
+
let id = null;
|
|
3413
|
+
if (ft)
|
|
3414
|
+
id = "folder-tree";
|
|
3415
|
+
else if (ml)
|
|
3416
|
+
id = "ml-body";
|
|
3417
|
+
else if (mv)
|
|
3418
|
+
id = "message-viewer";
|
|
3419
|
+
if (!id)
|
|
3420
|
+
return;
|
|
3421
|
+
e.preventDefault();
|
|
3422
|
+
focusPaneById(id);
|
|
3423
|
+
});
|
|
3380
3424
|
function cyclePaneFocus(reverse) {
|
|
3381
3425
|
// Major panes in tab order. Skip ones not currently visible (folder
|
|
3382
3426
|
// tree is hidden in narrow tier when the rail/drawer is closed; message
|