@bobfrankston/rmfmail 1.2.274 → 1.2.277
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/.commitmsg +31 -0
- package/bin/build-tinymce.js +27 -0
- package/client/android-bootstrap.bundle.js +169 -0
- package/client/android-bootstrap.bundle.js.map +2 -2
- package/client/app.bundle.js +231 -23
- package/client/app.bundle.js.map +4 -4
- package/client/app.js +81 -1
- package/client/app.js.map +1 -1
- package/client/app.ts +75 -1
- package/client/components/invite-card.js +107 -0
- package/client/components/invite-card.js.map +1 -0
- package/client/components/invite-card.ts +119 -0
- package/client/components/message-viewer.js +42 -17
- package/client/components/message-viewer.js.map +1 -1
- package/client/components/message-viewer.ts +42 -16
- package/client/compose/compose.bundle.js +90 -2
- package/client/compose/compose.bundle.js.map +4 -4
- package/client/compose/compose.js +26 -1
- package/client/compose/compose.js.map +1 -1
- package/client/compose/compose.ts +22 -1
- package/client/compose/editor.js +12 -1
- package/client/compose/editor.js.map +1 -1
- package/client/compose/editor.ts +17 -2
- package/client/index.html +1 -0
- package/client/lib/rmf-tiny.js +3 -0
- package/client/lib/tinymce/langs/ar-SA.js +440 -0
- package/client/lib/tinymce/langs/ar.js +441 -0
- package/client/lib/tinymce/langs/az.js +440 -0
- package/client/lib/tinymce/langs/be.js +440 -0
- package/client/lib/tinymce/langs/bg-BG.js +440 -0
- package/client/lib/tinymce/langs/bn-BD.js +440 -0
- package/client/lib/tinymce/langs/bs.js +440 -0
- package/client/lib/tinymce/langs/ca.js +440 -0
- package/client/lib/tinymce/langs/cs.js +440 -0
- package/client/lib/tinymce/langs/cy.js +440 -0
- package/client/lib/tinymce/langs/da.js +440 -0
- package/client/lib/tinymce/langs/de.js +440 -0
- package/client/lib/tinymce/langs/el.js +440 -0
- package/client/lib/tinymce/langs/eo.js +440 -0
- package/client/lib/tinymce/langs/es-MX.js +440 -0
- package/client/lib/tinymce/langs/es.js +440 -0
- package/client/lib/tinymce/langs/et.js +440 -0
- package/client/lib/tinymce/langs/eu.js +440 -0
- package/client/lib/tinymce/langs/fa.js +441 -0
- package/client/lib/tinymce/langs/fi.js +440 -0
- package/client/lib/tinymce/langs/fr-FR.js +440 -0
- package/client/lib/tinymce/langs/gl.js +440 -0
- package/client/lib/tinymce/langs/he-IL.js +440 -0
- package/client/lib/tinymce/langs/hr.js +440 -0
- package/client/lib/tinymce/langs/hu-HU.js +440 -0
- package/client/lib/tinymce/langs/hy.js +440 -0
- package/client/lib/tinymce/langs/id.js +440 -0
- package/client/lib/tinymce/langs/index.json +63 -0
- package/client/lib/tinymce/langs/is-IS.js +440 -0
- package/client/lib/tinymce/langs/it.js +440 -0
- package/client/lib/tinymce/langs/ja.js +440 -0
- package/client/lib/tinymce/langs/ka-GE.js +440 -0
- package/client/lib/tinymce/langs/kab.js +440 -0
- package/client/lib/tinymce/langs/kk.js +440 -0
- package/client/lib/tinymce/langs/ko-KR.js +440 -0
- package/client/lib/tinymce/langs/lt.js +440 -0
- package/client/lib/tinymce/langs/lv.js +440 -0
- package/client/lib/tinymce/langs/nb-NO.js +440 -0
- package/client/lib/tinymce/langs/ne.js +440 -0
- package/client/lib/tinymce/langs/nl-BE.js +440 -0
- package/client/lib/tinymce/langs/nl.js +440 -0
- package/client/lib/tinymce/langs/oc.js +440 -0
- package/client/lib/tinymce/langs/pl.js +440 -0
- package/client/lib/tinymce/langs/pt-BR.js +440 -0
- package/client/lib/tinymce/langs/pt-PT.js +440 -0
- package/client/lib/tinymce/langs/ro.js +440 -0
- package/client/lib/tinymce/langs/ru.js +440 -0
- package/client/lib/tinymce/langs/sk.js +440 -0
- package/client/lib/tinymce/langs/sl-SI.js +440 -0
- package/client/lib/tinymce/langs/sr.js +440 -0
- package/client/lib/tinymce/langs/sv-SE.js +440 -0
- package/client/lib/tinymce/langs/ta.js +440 -0
- package/client/lib/tinymce/langs/tg.js +440 -0
- package/client/lib/tinymce/langs/th-TH.js +440 -0
- package/client/lib/tinymce/langs/tr.js +440 -0
- package/client/lib/tinymce/langs/ug.js +440 -0
- package/client/lib/tinymce/langs/uk.js +440 -0
- package/client/lib/tinymce/langs/vi.js +440 -0
- package/client/lib/tinymce/langs/zh-CN.js +440 -0
- package/client/lib/tinymce/langs/zh-HK.js +440 -0
- package/client/lib/tinymce/langs/zh-MO.js +440 -0
- package/client/lib/tinymce/langs/zh-TW.js +440 -0
- package/client/lib/tinymce-langs.js +96 -0
- package/client/lib/tinymce-langs.js.map +1 -0
- package/client/lib/tinymce-langs.ts +99 -0
- package/client/package.json +1 -1
- package/client/styles/components.css +48 -0
- package/docs/editor.md +29 -3
- package/docs/preferences.md +2 -1
- package/npmchanges.md +29 -0
- package/package.json +18 -15
- package/packages/mailx-imap/package-lock.json +2 -2
- package/packages/mailx-imap/package.json +2 -2
- package/packages/mailx-settings/package.json +1 -1
- package/packages/mailx-store/package.json +1 -1
- package/packages/mailx-store/store.d.ts +5 -0
- package/packages/mailx-store/store.d.ts.map +1 -1
- package/packages/mailx-store/store.js +21 -0
- package/packages/mailx-store/store.js.map +1 -1
- package/packages/mailx-store/store.ts +27 -0
- package/packages/mailx-types/index.d.ts +56 -0
- package/packages/mailx-types/index.d.ts.map +1 -1
- package/packages/mailx-types/index.js +187 -0
- package/packages/mailx-types/index.js.map +1 -1
- package/packages/mailx-types/index.ts +192 -0
- package/packages/mailx-types/package.json +1 -1
- /package/packages/mailx-imap/{node_modules.npmglobalize-stash-31304 → node_modules.npmglobalize-stash-48352}/.package-lock.json +0 -0
package/client/app.js
CHANGED
|
@@ -159,6 +159,9 @@ window.__btick && window.__btick("app.ts module body executing");
|
|
|
159
159
|
let baseTitle = APP_NAME;
|
|
160
160
|
let lastSeenCount = 0;
|
|
161
161
|
let badgeCount = 0;
|
|
162
|
+
/** Last count pushed to the Windows taskbar overlay, so an unchanged count
|
|
163
|
+
* is not re-pushed. -1 = nothing pushed yet. See updateBadge. */
|
|
164
|
+
let lastOverlayCount = -1;
|
|
162
165
|
function updateBadge(count) {
|
|
163
166
|
badgeCount = count;
|
|
164
167
|
// Update title
|
|
@@ -212,7 +215,19 @@ function updateBadge(count) {
|
|
|
212
215
|
// taskbar for the whole life of this feature (Bob 2026-05-28 "are you
|
|
213
216
|
// able to show the number of new messages").
|
|
214
217
|
const hostApi = window.mailxapi;
|
|
215
|
-
|
|
218
|
+
// Push ONLY when the number actually changes. Windows keeps the
|
|
219
|
+
// overlay icon alive until the next SetOverlayIcon, so the host
|
|
220
|
+
// cannot free the icon it just handed over — each push costs the
|
|
221
|
+
// host process one HICON plus the two bitmaps inside it, and the
|
|
222
|
+
// unread-count refresh fires every few seconds. That reached the
|
|
223
|
+
// 10,000-object per-process GDI cap in about a day, after which the
|
|
224
|
+
// host logged "CreateIconIndirect failed: Not enough memory
|
|
225
|
+
// resources" on every tick and could create no further GDI objects
|
|
226
|
+
// (Bob 2026-08-23, measured: rmfmail.exe at GDI=9995). msger now
|
|
227
|
+
// frees the PREVIOUS icon so the leak is bounded either way; this
|
|
228
|
+
// just stops the pointless churn (Claude Code 2026-08-23).
|
|
229
|
+
if (hostApi?.setTaskbarOverlay && count !== lastOverlayCount) {
|
|
230
|
+
lastOverlayCount = count;
|
|
216
231
|
if (count > 0) {
|
|
217
232
|
// BADGE-ONLY overlay. SetOverlayIcon composites the supplied
|
|
218
233
|
// icon onto the bottom-right corner of the taskbar button —
|
|
@@ -6033,6 +6048,71 @@ document.getElementById("opt-compose-font-size")?.addEventListener("change", (e)
|
|
|
6033
6048
|
saveSettings(settings);
|
|
6034
6049
|
}).catch(() => { });
|
|
6035
6050
|
});
|
|
6051
|
+
// TinyMCE UI-language picker. The options are whatever language packs
|
|
6052
|
+
// build-tinymce.js actually copied next to the script (langs/index.json), so
|
|
6053
|
+
// the menu can never offer a pack that would 404 at editor init — TinyMCE
|
|
6054
|
+
// raises a visible error notification for a missing langs/<code>.js.
|
|
6055
|
+
//
|
|
6056
|
+
// These translate the editor CHROME only. Content, the spellcheck dictionary
|
|
6057
|
+
// and Harper are untouched and stay English, which is why the control sits
|
|
6058
|
+
// under Editor rather than anywhere that reads as a global language setting.
|
|
6059
|
+
//
|
|
6060
|
+
// TinyMCE itself has no detection — "Auto" is ours, resolving the browser's
|
|
6061
|
+
// ordered language list against the shipped packs. The Auto row names what it
|
|
6062
|
+
// currently resolves to so the choice is not a guess. (Claude Code 2026-08-23)
|
|
6063
|
+
const optEditorLanguage = document.getElementById("opt-editor-language");
|
|
6064
|
+
if (optEditorLanguage) {
|
|
6065
|
+
(async () => {
|
|
6066
|
+
const scriptUrl = localStorage.getItem("mailx-tinymce-cdn") || "lib/tinymce/tinymce.min.js";
|
|
6067
|
+
const { availableLanguages, resolveLanguage, languageLabel, LANGUAGE_AUTO, LANGUAGE_ENGLISH } = await import("./lib/tinymce-langs.js");
|
|
6068
|
+
const available = await availableLanguages(scriptUrl);
|
|
6069
|
+
const autoPick = resolveLanguage(LANGUAGE_AUTO, available);
|
|
6070
|
+
const add = (value, text) => {
|
|
6071
|
+
const o = document.createElement("option");
|
|
6072
|
+
o.value = value;
|
|
6073
|
+
o.textContent = text;
|
|
6074
|
+
optEditorLanguage.appendChild(o);
|
|
6075
|
+
};
|
|
6076
|
+
add(LANGUAGE_AUTO, `Auto — ${languageLabel(autoPick)}`);
|
|
6077
|
+
add(LANGUAGE_ENGLISH, languageLabel(LANGUAGE_ENGLISH));
|
|
6078
|
+
for (const code of [...available].sort((a, b) => languageLabel(a).localeCompare(languageLabel(b)))) {
|
|
6079
|
+
add(code, `${languageLabel(code)} (${code})`);
|
|
6080
|
+
}
|
|
6081
|
+
if (!available.length) {
|
|
6082
|
+
optEditorLanguage.disabled = true;
|
|
6083
|
+
optEditorLanguage.title = "No language packs found next to tinymce.min.js — English only";
|
|
6084
|
+
}
|
|
6085
|
+
let current = LANGUAGE_AUTO;
|
|
6086
|
+
try {
|
|
6087
|
+
current = localStorage.getItem("mailx-editor-language") || LANGUAGE_AUTO;
|
|
6088
|
+
}
|
|
6089
|
+
catch { /* */ }
|
|
6090
|
+
try {
|
|
6091
|
+
const settings = await getSettings();
|
|
6092
|
+
if (typeof settings?.ui?.editorLanguage === "string" && settings.ui.editorLanguage)
|
|
6093
|
+
current = settings.ui.editorLanguage;
|
|
6094
|
+
}
|
|
6095
|
+
catch { /* cache value stands */ }
|
|
6096
|
+
optEditorLanguage.value = current;
|
|
6097
|
+
// A pinned pack that is no longer shipped would leave the select on
|
|
6098
|
+
// nothing at all; say so rather than showing a blank control.
|
|
6099
|
+
if (!optEditorLanguage.value)
|
|
6100
|
+
optEditorLanguage.value = LANGUAGE_AUTO;
|
|
6101
|
+
})().catch((e) => console.error("[settings] editor-language menu failed:", e?.message || e));
|
|
6102
|
+
optEditorLanguage.addEventListener("change", () => {
|
|
6103
|
+
const value = optEditorLanguage.value;
|
|
6104
|
+
// Synchronous cache write for the same reason as saveEditorSetting:
|
|
6105
|
+
// compose reads it at module load, so the next compose-open is right.
|
|
6106
|
+
try {
|
|
6107
|
+
localStorage.setItem("mailx-editor-language", value);
|
|
6108
|
+
}
|
|
6109
|
+
catch { /* private mode */ }
|
|
6110
|
+
getSettings().then((settings) => {
|
|
6111
|
+
settings.ui = { ...settings.ui, editorLanguage: value };
|
|
6112
|
+
saveSettings(settings);
|
|
6113
|
+
}).catch((e) => console.error("[settings] editor language save failed:", e?.message || e));
|
|
6114
|
+
});
|
|
6115
|
+
}
|
|
6036
6116
|
// Save editor choice to server settings
|
|
6037
6117
|
function saveEditorSetting(editor) {
|
|
6038
6118
|
// Update the localStorage cache SYNCHRONOUSLY. compose.ts reads
|