@bobfrankston/rmfmail 1.2.100 → 1.2.102

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/TODO.md CHANGED
@@ -783,7 +783,8 @@ Was part of S1 "local-first reconciliation refactor" until 2026-04-23 when S1's
783
783
  - [ ] **Full menu bar** — File, Edit, View, Message menus with keyboard shortcuts
784
784
  - [x] **Validate email addresses on send** — To/Cc/Bcc/From all vetted against `local@domain.tld` shape before send.
785
785
  - [x] **Undo move (Ctrl+Z)** — works for last move and last delete (whichever is more recent), 60s window.
786
- - [ ] **Message list management** — column resize (drag headers), column reorder, sort by clicking column headers (from/date/subject/size with secondary sort by date), show/hide columns (size, account) via View menu
786
+ - [ ] **Message list management** — column resize (drag headers), drag-to-rearrange column order, sort by clicking column headers (from/date/subject/size with secondary sort by date), show/hide columns (size, account) via View menu. Column layout persists LOCALLY (per-machine, localStorage) — explicit user request 2026-07-04.
787
+ - [ ] **Generalize "Eleanor view" into finer view control [M]** — the View-menu "Eleanor view" checkbox (2026-07-04, reworked same day per feedback) is a named CSS preset: always-two-line card list (From … Date / Subject), outlined entries, extra vertical whitespace, monochrome rows, no avatar/snippet, at every width. Replace the one-off preset with real per-view settings — column set + order, row density (compact/normal/airy), row tinting on/off, snippet on/off — persisted per folder or as named view profiles. The preset becomes just a saved profile once profiles exist.
787
788
  - [ ] **Duplicate Message-ID handling** — detect messages with the same Message-ID (copies from multiple accounts, re-delivered mail). Options: deduplicate in unified inbox, show indicator, or let user choose which to keep.
788
789
 
789
790
  ### msger / mailx factoring
@@ -10473,6 +10473,7 @@ function openShortcutsDialog() {
10473
10473
  var viewBtn = document.getElementById("btn-view");
10474
10474
  var viewDropdown = document.getElementById("view-dropdown");
10475
10475
  var optTwoLine = document.getElementById("opt-two-line");
10476
+ var optEleanor = document.getElementById("opt-eleanor");
10476
10477
  var optPreview = document.getElementById("opt-preview");
10477
10478
  var optSnippet = document.getElementById("opt-snippet");
10478
10479
  var optFlagStars = document.getElementById("opt-flag-stars");
@@ -10600,6 +10601,7 @@ document.addEventListener("keydown", (e) => {
10600
10601
  }
10601
10602
  });
10602
10603
  var savedTwoLine = localStorage.getItem("mailx-two-line") === "true";
10604
+ var savedEleanor = localStorage.getItem("mailx-eleanor-view") === "true";
10603
10605
  var savedPreview = localStorage.getItem("mailx-preview") !== "false";
10604
10606
  var savedSnippet = localStorage.getItem("mailx-snippet") !== "false";
10605
10607
  var savedFlagStars = localStorage.getItem("mailx-flag-stars") !== "false";
@@ -10611,6 +10613,7 @@ try {
10611
10613
  }
10612
10614
  var savedFolderCounts = localStorage.getItem("mailx-folder-counts") === "true";
10613
10615
  if (optTwoLine) optTwoLine.checked = savedTwoLine;
10616
+ if (optEleanor) optEleanor.checked = savedEleanor;
10614
10617
  if (optPreview) optPreview.checked = savedPreview;
10615
10618
  if (optSnippet) optSnippet.checked = savedSnippet;
10616
10619
  if (optFlagStars) optFlagStars.checked = savedFlagStars;
@@ -10618,6 +10621,7 @@ if (optThreaded) optThreaded.checked = savedThreaded;
10618
10621
  if (optFlagged) optFlagged.checked = savedFlagged;
10619
10622
  if (optFolderCounts) optFolderCounts.checked = savedFolderCounts;
10620
10623
  if (savedTwoLine) document.getElementById("message-list")?.classList.add("two-line");
10624
+ if (savedEleanor) document.getElementById("message-list")?.classList.add("eleanor-view");
10621
10625
  if (!savedPreview) document.querySelector(".main-area")?.classList.add("no-preview");
10622
10626
  if (!savedSnippet) document.getElementById("message-list")?.classList.add("no-snippets");
10623
10627
  if (!savedFlagStars) document.getElementById("message-list")?.classList.add("no-empty-stars");
@@ -10765,6 +10769,29 @@ optTwoLine?.addEventListener("change", () => {
10765
10769
  }
10766
10770
  localStorage.setItem("mailx-two-line", String(optTwoLine.checked));
10767
10771
  });
10772
+ function applyEleanorView(on) {
10773
+ document.getElementById("message-list")?.classList.toggle("eleanor-view", on);
10774
+ if (optEleanor) optEleanor.checked = on;
10775
+ try {
10776
+ localStorage.setItem("mailx-eleanor-view", String(on));
10777
+ } catch {
10778
+ }
10779
+ }
10780
+ optEleanor?.addEventListener("change", () => {
10781
+ applyEleanorView(optEleanor.checked);
10782
+ getSettings().then((settings) => {
10783
+ settings.ui = { ...settings.ui, eleanorView: optEleanor.checked };
10784
+ saveSettings(settings);
10785
+ }).catch(() => {
10786
+ });
10787
+ });
10788
+ getSettings().then((s) => {
10789
+ const pref = s.ui?.eleanorView;
10790
+ if (typeof pref === "boolean" && pref !== (localStorage.getItem("mailx-eleanor-view") === "true")) {
10791
+ applyEleanorView(pref);
10792
+ }
10793
+ }).catch(() => {
10794
+ });
10768
10795
  optPreview?.addEventListener("change", () => {
10769
10796
  const main = document.querySelector(".main-area");
10770
10797
  if (optPreview.checked) {