@bobfrankston/rmfmail 1.1.95 → 1.1.97
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 +14 -4
- package/client/app.bundle.js +15 -4
- package/client/app.bundle.js.map +2 -2
- package/client/app.js +10 -1
- package/client/app.js.map +1 -1
- package/client/app.ts +9 -1
- package/client/components/alarms.js +19 -4
- package/client/components/alarms.js.map +1 -1
- package/client/components/alarms.ts +17 -4
- package/client/compose/compose.bundle.js +4 -0
- package/client/compose/compose.bundle.js.map +2 -2
- package/client/lib/rmf-tiny.js +9 -0
- package/docs/rmf-tiny.md +31 -2
- package/npmchanges.md +26 -0
- package/package.json +1 -1
- /package/packages/mailx-imap/{node_modules.npmglobalize-stash-90336 → node_modules.npmglobalize-stash-26080}/.package-lock.json +0 -0
package/client/lib/rmf-tiny.js
CHANGED
|
@@ -326,6 +326,15 @@ export async function createTinyMceEditor(container, opts = {}) {
|
|
|
326
326
|
editor.selection.select(editor.getBody(), true);
|
|
327
327
|
editor.selection.collapse(pos === 0 /* true = start */);
|
|
328
328
|
editor.focus();
|
|
329
|
+
// Scroll the viewport to match the caret. For pos 0 that's
|
|
330
|
+
// the TOP of the body — on a reply the user types above the
|
|
331
|
+
// quoted block and must land looking at that empty line, not
|
|
332
|
+
// scrolled down inside the quote (Bob 2026-05-18: "the cursor
|
|
333
|
+
// should be at the top of the window").
|
|
334
|
+
if (pos === 0)
|
|
335
|
+
editor.getWin()?.scrollTo(0, 0);
|
|
336
|
+
else
|
|
337
|
+
editor.selection.scrollIntoView();
|
|
329
338
|
}
|
|
330
339
|
catch { /* */ }
|
|
331
340
|
},
|
package/docs/rmf-tiny.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# `rmf-tiny` —
|
|
1
|
+
# `rmf-tiny` — TinyMCE editor adapter for rmfmail
|
|
2
2
|
|
|
3
|
-
Status:
|
|
3
|
+
Status: **implemented and shipping.** Source: `y:/dev/utils/msgx/libs/rmf-tiny/src/adapter.ts`; built copy served as `client/lib/rmf-tiny.js` (via `bin/build-rmf-tiny.js`). Selectable in Settings → Compose → Editor. The design notes below are kept for history; see **Known TinyMCE quirks** at the bottom for the live gotcha list.
|
|
4
4
|
|
|
5
5
|
## Goal
|
|
6
6
|
|
|
@@ -154,3 +154,32 @@ Don't publish the adapter until the Word-paste case actually works end-to-end th
|
|
|
154
154
|
- The adapter must not re-implement parts of TinyMCE — it's a thin wrapper. Re-implementing parts of GPL code in MIT is the legal trap; staying purely in adapter / interface territory is safe.
|
|
155
155
|
- TinyMCE's bundle is large (~1MB minified). Users opting in pay that cost on the first compose-window load. Fine for opt-in; would be unacceptable as a default.
|
|
156
156
|
- `rmf-tiny` major version should track TinyMCE's major version (rmf-tiny@7.x for tinymce@7.x) so peerDependency mismatches are obvious.
|
|
157
|
+
|
|
158
|
+
## Known TinyMCE quirks
|
|
159
|
+
|
|
160
|
+
TinyMCE frequently gets caret / scroll / block behaviour wrong. Each entry
|
|
161
|
+
below is a quirk found in use and the workaround in `adapter.ts`. Add to
|
|
162
|
+
this list whenever a new one turns up — it's the running gotcha log.
|
|
163
|
+
|
|
164
|
+
- **Viewport doesn't follow `setCursor`.** After `setContent` of a long
|
|
165
|
+
reply, collapsing the selection to the start (caret at top, where the
|
|
166
|
+
user types above the quote) does NOT scroll the iframe — it can be left
|
|
167
|
+
scrolled down inside the quoted block. Fix: `setCursor(0)` explicitly
|
|
168
|
+
calls `editor.getWin().scrollTo(0, 0)`; non-zero positions call
|
|
169
|
+
`editor.selection.scrollIntoView()`. (Bob 2026-05-18.)
|
|
170
|
+
|
|
171
|
+
- **Typing at a link's trailing edge extends the link.** With the caret
|
|
172
|
+
collapsed at the end of an `<a>`, contenteditable keeps appending typed
|
|
173
|
+
characters INTO the link — a whole sentence becomes link text. Fix: a
|
|
174
|
+
`keypress` handler hops the caret to just after the `<a>` first.
|
|
175
|
+
|
|
176
|
+
- **Native spellcheck is force-enabled.** `adapter.ts`'s `init` handler
|
|
177
|
+
sets `spellcheck="true"` on the body. mailx runs its own nspell checker
|
|
178
|
+
and overrides this back to `"false"` in `wireSpellcheck` (with a
|
|
179
|
+
MutationObserver) so the two don't double-underline.
|
|
180
|
+
|
|
181
|
+
- **`<p>` collapses to `<br>`.** Enter / paste sometimes produces a `<br>`
|
|
182
|
+
line break where a `<p>` paragraph was expected, so paragraph spacing is
|
|
183
|
+
lost until the lines are merged and Enter re-pressed. Not yet fixed —
|
|
184
|
+
candidate: `forced_root_block` / paste-normalization config. (Bob
|
|
185
|
+
2026-05-18, exact trigger still unclear.)
|
package/npmchanges.md
CHANGED
|
@@ -274,3 +274,29 @@ strip now stays visible with a single tab, showing that tab plus the
|
|
|
274
274
|
"+" button; its tooltip names the Ctrl+T shortcut. Hidden only before
|
|
275
275
|
the very first tab is seeded.
|
|
276
276
|
|
|
277
|
+
## v1.1.95 — 2026-05-19
|
|
278
|
+
|
|
279
|
+
Compose window opens centred near the top, not lower-right
|
|
280
|
+
|
|
281
|
+
The floating compose/reply overlay was anchored to the bottom-right
|
|
282
|
+
corner. It now opens horizontally centred with a small top margin. The
|
|
283
|
+
title bar still drags it anywhere; this only changes initial placement.
|
|
284
|
+
|
|
285
|
+
## v1.1.96 — 2026-05-19
|
|
286
|
+
|
|
287
|
+
Alarm/snooze: log decisions to the daemon log so snooze is verifiable
|
|
288
|
+
|
|
289
|
+
On review the snooze keying is actually correct — snoozeItem stores under
|
|
290
|
+
item.uuid, which IS the full per-occurrence key (uuid:startMs@offset for
|
|
291
|
+
calendar, uuid:dueMs for tasks) that collectDueAlarms reads back as
|
|
292
|
+
snoozed[key]. They match.
|
|
293
|
+
|
|
294
|
+
What was missing was visibility: the [alarm] decisions used plain
|
|
295
|
+
console.log, which from the WebView never reaches the daemon log file —
|
|
296
|
+
so "is snooze working?" couldn't be answered after the fact. Added an
|
|
297
|
+
alog() helper that mirrors to the daemon log via logClientEvent, a
|
|
298
|
+
"snooze saved" line (key + minutes + untilMs), and routed the existing
|
|
299
|
+
fire-decision / dismiss / unknown-result logs through it. Next snooze is
|
|
300
|
+
now traceable: the "snooze saved" line and the following "fire decision"
|
|
301
|
+
line confirm the snooze took and for how long.
|
|
302
|
+
|
package/package.json
CHANGED