@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 +30 -8
- package/client/compose/compose.html +1 -1
- package/client/index.html +1 -1
- package/client/styles/variables.css +65 -0
- package/package.json +2 -2
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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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
|
-
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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/
|
|
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/
|
|
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.
|
|
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.
|
|
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",
|