@bobfrankston/mailx 1.0.33 → 1.0.35

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/mailx.js CHANGED
@@ -42,21 +42,43 @@ function log(...msg) { if (verbose) console.log("[mailx]", ...msg); }
42
42
  if (hasFlag("kill")) {
43
43
  log("Killing mailx processes...");
44
44
  const { execSync } = await import("node:child_process");
45
- // Kill by port
46
- try {
47
- if (process.platform === "win32") {
45
+ let killed = 0;
46
+
47
+ if (process.platform === "win32") {
48
+ // Kill by port
49
+ try {
48
50
  const out = execSync(`netstat -ano | findstr :${PORT} | findstr LISTENING`, { encoding: "utf-8" }).trim();
49
51
  const pids = [...new Set(out.split("\n").map(l => l.trim().split(/\s+/).pop()).filter(Boolean))];
50
52
  for (const pid of pids) {
51
- try { execSync(`taskkill /F /PID ${pid}`, { stdio: "pipe" }); console.log(`Killed PID ${pid}`); } catch { /* */ }
53
+ try { execSync(`taskkill /F /PID ${pid}`, { stdio: "pipe" }); console.log(`Killed PID ${pid} (port ${PORT})`); killed++; } catch { /* */ }
52
54
  }
53
- } else {
54
- try { execSync(`fuser -k ${PORT}/tcp`, { stdio: "pipe" }); console.log(`Killed process on port ${PORT}`); } catch { /* */ }
55
- }
56
- } catch { console.log(`No process found on port ${PORT}`); }
55
+ } catch { /* no process on port */ }
56
+
57
+ // Kill any node.exe holding handles on the mailx install directory
58
+ const installDir = path.join(import.meta.dirname, "..");
59
+ try {
60
+ const wmic = execSync(`wmic process where "name='node.exe'" get processid,commandline /format:csv`, { encoding: "utf-8" });
61
+ for (const line of wmic.split("\n")) {
62
+ if (line.includes("mailx-server") || line.includes("mailx\\packages")) {
63
+ const pid = line.trim().split(",").pop();
64
+ if (pid && /^\d+$/.test(pid)) {
65
+ try { execSync(`taskkill /F /PID ${pid}`, { stdio: "pipe" }); console.log(`Killed PID ${pid} (mailx node process)`); killed++; } catch { /* */ }
66
+ }
67
+ }
68
+ }
69
+ } catch { /* */ }
70
+
71
+ // Kill mailx-app.exe
72
+ try { execSync("taskkill /F /IM mailx-app.exe", { stdio: "pipe" }); console.log("Killed mailx-app.exe"); killed++; } catch { /* */ }
73
+ } else {
74
+ try { execSync(`fuser -k ${PORT}/tcp`, { stdio: "pipe" }); console.log(`Killed process on port ${PORT}`); killed++; } catch { /* */ }
75
+ }
76
+
57
77
  // Remove lock file
58
78
  const lockPath = path.join(process.env.USERPROFILE || process.env.HOME || ".", ".mailx", "mailx-app.lock");
59
79
  try { fs.unlinkSync(lockPath); log("Removed lock file"); } catch { /* */ }
80
+
81
+ if (killed === 0) console.log("No mailx processes found");
60
82
  process.exit(0);
61
83
  }
62
84
 
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Compose - mailx</title>
7
7
  <link rel="icon" type="image/svg+xml" href="../favicon.svg">
8
- <link rel="stylesheet" href="../styles/tokens.css">
8
+ <link rel="stylesheet" href="../styles/variables.css">
9
9
  <link href="https://cdn.jsdelivr.net/npm/quill@2/dist/quill.snow.css" rel="stylesheet">
10
10
  <link rel="stylesheet" href="compose.css">
11
11
  <script src="https://cdn.jsdelivr.net/npm/quill@2/dist/quill.js"></script>
package/client/index.html CHANGED
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>mailx</title>
7
7
  <link rel="icon" type="image/svg+xml" href="favicon.svg">
8
- <link rel="stylesheet" href="styles/tokens.css">
8
+ <link rel="stylesheet" href="styles/variables.css">
9
9
  <link rel="stylesheet" href="styles/layout.css">
10
10
  <link rel="stylesheet" href="styles/components.css">
11
11
  <script type="module" src="app.js"></script>
@@ -0,0 +1,65 @@
1
+ /* mailx design tokens -- all theming via custom properties */
2
+
3
+ :root {
4
+ /* Layout */
5
+ --folder-width: 220px;
6
+ --toolbar-height: 44px;
7
+ --statusbar-height: 24px;
8
+ --splitter-size: 5px;
9
+ --list-viewer-split: 40%;
10
+
11
+ /* Colors in oklch */
12
+ --color-brand: oklch(0.88 0.04 240); /* mailx light blue — toolbar, highlights */
13
+ --color-brand-dark: oklch(0.45 0.10 240); /* darker brand for text on light bg */
14
+ --color-bg: oklch(0.20 0.02 270);
15
+ --color-bg-surface: oklch(0.25 0.03 270);
16
+ --color-bg-hover: color-mix(in oklch, var(--color-bg-surface) 80%, white);
17
+ --color-bg-selected: var(--color-brand);
18
+ --color-bg-toolbar: oklch(0.22 0.02 270);
19
+ --color-text: oklch(0.90 0.01 270);
20
+ --color-text-muted: oklch(0.55 0.02 270);
21
+ --color-accent: var(--color-brand-dark);
22
+ --color-unread: oklch(0.95 0.02 270);
23
+ --color-border: oklch(0.35 0.02 270);
24
+ --color-danger: oklch(0.65 0.15 15);
25
+ --color-success: oklch(0.65 0.15 145);
26
+ --color-badge: oklch(0.60 0.18 250);
27
+
28
+ /* Typography */
29
+ --font-ui: "Segoe UI", system-ui, -apple-system, sans-serif;
30
+ --font-mono: "Cascadia Code", Consolas, monospace;
31
+ --font-size-sm: 0.9rem;
32
+ --font-size-base: 0.95rem;
33
+ --font-size-lg: 1.1rem;
34
+ --line-height: 1.45;
35
+
36
+ /* Spacing */
37
+ --gap-xs: 0.25rem;
38
+ --gap-sm: 0.5rem;
39
+ --gap-md: 0.75rem;
40
+ --gap-lg: 1rem;
41
+
42
+ /* Radii */
43
+ --radius-sm: 3px;
44
+ --radius-md: 6px;
45
+
46
+ color-scheme: dark light;
47
+ }
48
+
49
+ /* Light theme -- follows system preference */
50
+ @media (prefers-color-scheme: light) {
51
+ :root {
52
+ --color-bg: oklch(0.97 0.005 270);
53
+ --color-bg-surface: oklch(1.0 0 0);
54
+ --color-bg-hover: oklch(0.95 0.005 270);
55
+ --color-brand: oklch(0.88 0.04 240);
56
+ --color-brand-dark: oklch(0.35 0.12 240);
57
+ --color-bg-selected: var(--color-brand);
58
+ --color-bg-toolbar: oklch(0.95 0.005 270);
59
+ --color-text: oklch(0.20 0.02 270);
60
+ --color-text-muted: oklch(0.45 0.02 270);
61
+ --color-accent: var(--color-brand-dark);
62
+ --color-unread: oklch(0.10 0.02 270);
63
+ --color-border: oklch(0.85 0.01 270);
64
+ }
65
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bobfrankston/mailx",
3
- "version": "1.0.33",
3
+ "version": "1.0.35",
4
4
  "description": "Local-first email client with IMAP sync and standalone native app",
5
5
  "type": "module",
6
6
  "main": "bin/mailx.js",
@@ -20,7 +20,7 @@
20
20
  "postinstall": "node launcher/builder/postinstall.js"
21
21
  },
22
22
  "dependencies": {
23
- "@bobfrankston/iflow": "^1.0.4",
23
+ "@bobfrankston/iflow": "^1.0.6",
24
24
  "@bobfrankston/miscinfo": "^1.0.6",
25
25
  "@bobfrankston/oauthsupport": "^1.0.11",
26
26
  "@bobfrankston/rust-builder": "^0.1.2",