@bobfrankston/mailx 1.0.208 → 1.0.210
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/bin/mailx.js +2 -2
- package/bin/packages/mailx-settings/index.js +2 -3
- package/client/.msger-window.json +1 -1
- package/client/app.js +8 -1
- package/client/components/message-list.js +2 -0
- package/client/package.json +3 -0
- package/client/styles/components.css +11 -0
- package/package.json +2 -2
- package/packages/mailx-store/db.js +4 -2
package/bin/bin/mailx.js
CHANGED
|
@@ -31,7 +31,7 @@ const isDaemon = hasFlag("daemon"); // internal: re-spawned detached process
|
|
|
31
31
|
// Auto-detach: re-spawn as background process so terminal returns immediately
|
|
32
32
|
// Skip for: --verbose (want console), --daemon (already detached),
|
|
33
33
|
// and any command flags (setup, kill, test, etc.)
|
|
34
|
-
if (!verbose && !isDaemon && !process.argv.slice(2).some(a => /^-/.test(a)
|
|
34
|
+
if (!verbose && !isDaemon && !process.argv.slice(2).some(a => /^-/.test(a))) {
|
|
35
35
|
const { spawn } = await import("node:child_process");
|
|
36
36
|
const child = spawn(process.execPath, [...process.argv.slice(1), "--daemon"], {
|
|
37
37
|
detached: true,
|
|
@@ -607,7 +607,7 @@ async function registerClient(settings) {
|
|
|
607
607
|
}
|
|
608
608
|
}
|
|
609
609
|
catch { /* ignore */ }
|
|
610
|
-
// Read existing clients.jsonc from cloud
|
|
610
|
+
// Read existing clients.jsonc from cloud (may not exist yet — that's fine)
|
|
611
611
|
let clients = {};
|
|
612
612
|
try {
|
|
613
613
|
const content = await cloudRead("clients.jsonc");
|
|
@@ -114,9 +114,7 @@ export async function cloudRead(filename) {
|
|
|
114
114
|
}
|
|
115
115
|
catch { /* ignore cache write failure */ }
|
|
116
116
|
}
|
|
117
|
-
|
|
118
|
-
lastCloudError = `Could not read ${filename} from ${pendingCloudConfig.provider} (check credentials)`;
|
|
119
|
-
}
|
|
117
|
+
// Don't set error for missing files — they may not exist yet (e.g., clients.jsonc on first run)
|
|
120
118
|
return content;
|
|
121
119
|
}
|
|
122
120
|
/** Write a file via cloud API */
|
|
@@ -323,6 +321,7 @@ function normalizeAccount(acct, globalName) {
|
|
|
323
321
|
syncContacts: acct.syncContacts ?? (provider?.imap.auth === "oauth2"),
|
|
324
322
|
relayDomains: acct.relayDomains,
|
|
325
323
|
deliveredToPrefix: acct.deliveredToPrefix,
|
|
324
|
+
identityDomains: acct.identityDomains,
|
|
326
325
|
};
|
|
327
326
|
}
|
|
328
327
|
// ── Defaults ──
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"height":1344,"width":2151,"x":
|
|
1
|
+
{"height":1344,"width":2151,"x":380,"y":46}
|
package/client/app.js
CHANGED
|
@@ -352,7 +352,14 @@ async function openCompose(mode) {
|
|
|
352
352
|
function showComposeOverlay() {
|
|
353
353
|
const wrapper = document.createElement("div");
|
|
354
354
|
wrapper.className = "compose-overlay";
|
|
355
|
-
|
|
355
|
+
// Full-screen on small/short screens, floating on larger
|
|
356
|
+
const isSmall = window.innerWidth <= 768 || window.innerHeight <= 600;
|
|
357
|
+
if (isSmall) {
|
|
358
|
+
wrapper.style.cssText = "position:fixed;inset:0;z-index:1000;display:flex;flex-direction:column;background:#fff;";
|
|
359
|
+
}
|
|
360
|
+
else {
|
|
361
|
+
wrapper.style.cssText = "position:fixed;bottom:0;right:16px;width:min(900px,55vw);height:min(700px,70vh);z-index:1000;border-radius:8px 8px 0 0;box-shadow:0 -4px 24px rgba(0,0,0,0.3);display:flex;flex-direction:column;resize:both;overflow:hidden;";
|
|
362
|
+
}
|
|
356
363
|
// Title bar — drag to move, close button
|
|
357
364
|
const titleBar = document.createElement("div");
|
|
358
365
|
titleBar.style.cssText = "display:flex;align-items:center;justify-content:space-between;padding:4px 8px;background:#e8ecf0;border-radius:8px 8px 0 0;cursor:move;user-select:none;flex-shrink:0;";
|
|
@@ -311,6 +311,8 @@ function appendMessages(body, accountId, items) {
|
|
|
311
311
|
row.classList.add("unread");
|
|
312
312
|
if (msg.flags.includes("\\Flagged"))
|
|
313
313
|
row.classList.add("flagged");
|
|
314
|
+
if (!msg.bodyPath)
|
|
315
|
+
row.classList.add("not-downloaded");
|
|
314
316
|
row.dataset.uid = String(msg.uid);
|
|
315
317
|
row.dataset.accountId = msgAccountId;
|
|
316
318
|
row.dataset.folderId = String(msg.folderId);
|
package/client/package.json
CHANGED
|
@@ -398,6 +398,17 @@ button.tb-menu-item { background: none; border: none; color: inherit; width: 100
|
|
|
398
398
|
}
|
|
399
399
|
.no-snippets .ml-preview { display: none; }
|
|
400
400
|
.ml-date { white-space: nowrap; text-align: right; color: var(--color-text-muted); font-family: var(--font-mono); font-size: var(--font-size-sm); }
|
|
401
|
+
/* Not-downloaded indicator: small dot before the date */
|
|
402
|
+
.ml-row.not-downloaded .ml-date::before {
|
|
403
|
+
content: "○ ";
|
|
404
|
+
color: var(--color-text-muted);
|
|
405
|
+
opacity: 0.7;
|
|
406
|
+
}
|
|
407
|
+
.ml-row:not(.not-downloaded) .ml-date::before {
|
|
408
|
+
content: "● ";
|
|
409
|
+
color: #4a9;
|
|
410
|
+
opacity: 0.5;
|
|
411
|
+
}
|
|
401
412
|
|
|
402
413
|
.ml-empty {
|
|
403
414
|
grid-column: 1 / -1;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bobfrankston/mailx",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.210",
|
|
4
4
|
"description": "Local-first email client with IMAP sync and standalone native app",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "bin/mailx.js",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"@bobfrankston/iflow-node": "^0.1.2",
|
|
25
25
|
"@bobfrankston/miscinfo": "^1.0.8",
|
|
26
26
|
"@bobfrankston/oauthsupport": "^1.0.22",
|
|
27
|
-
"@bobfrankston/msger": "^0.1.
|
|
27
|
+
"@bobfrankston/msger": "^0.1.272",
|
|
28
28
|
"@capacitor/android": "^8.3.0",
|
|
29
29
|
"@capacitor/cli": "^8.3.0",
|
|
30
30
|
"@capacitor/core": "^8.3.0",
|
|
@@ -248,7 +248,8 @@ export class MailxDB {
|
|
|
248
248
|
flags: JSON.parse(r.flags_json),
|
|
249
249
|
size: r.size,
|
|
250
250
|
hasAttachments: !!r.has_attachments,
|
|
251
|
-
preview: r.preview
|
|
251
|
+
preview: r.preview,
|
|
252
|
+
bodyPath: r.body_path || ""
|
|
252
253
|
}));
|
|
253
254
|
return { items, total, page, pageSize };
|
|
254
255
|
}
|
|
@@ -279,7 +280,8 @@ export class MailxDB {
|
|
|
279
280
|
flags: JSON.parse(r.flags_json),
|
|
280
281
|
size: r.size,
|
|
281
282
|
hasAttachments: !!r.has_attachments,
|
|
282
|
-
preview: r.preview
|
|
283
|
+
preview: r.preview,
|
|
284
|
+
bodyPath: r.body_path || ""
|
|
283
285
|
}));
|
|
284
286
|
return { items, total, page, pageSize };
|
|
285
287
|
}
|