@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 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) && !["--no-browser"].includes(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
- else {
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":476,"y":58}
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
- 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;";
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);
@@ -3,6 +3,9 @@
3
3
  "version": "1.0.13",
4
4
  "private": true,
5
5
  "type": "module",
6
+ "scripts": {
7
+ "build": "tsc"
8
+ },
6
9
  "dependencies": {
7
10
  "quill": "^2.0.0"
8
11
  },
@@ -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.208",
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.269",
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
  }