@bobfrankston/mailx 1.0.12 → 1.0.14
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 +52 -28
- package/client/app.js +113 -30
- package/client/components/folder-tree.js +84 -3
- package/client/components/message-list.js +164 -10
- package/client/components/message-viewer.js +130 -13
- package/client/compose/compose.html +4 -4
- package/client/compose/compose.js +53 -34
- package/client/index.html +50 -21
- package/client/lib/api-client.js +112 -31
- package/client/lib/mailxapi.js +123 -0
- package/client/package.json +1 -1
- package/client/styles/components.css +206 -16
- package/client/styles/layout.css +2 -1
- package/killmail.cmd +6 -0
- package/launch.ps1 +47 -5
- package/launcher/bin/mailx-app-linux +0 -0
- package/launcher/bin/mailx-app.exe +0 -0
- package/launcher/builder/build-config.json +11 -0
- package/launcher/builder/postinstall.js +81 -0
- package/package.json +2 -4
- package/packages/mailx-api/index.js +125 -29
- package/packages/mailx-core/index.d.ts +129 -0
- package/packages/mailx-core/index.js +323 -0
- package/packages/mailx-core/ipc.d.ts +13 -0
- package/packages/mailx-core/ipc.js +56 -0
- package/packages/mailx-core/package.json +18 -0
- package/packages/mailx-imap/index.d.ts +7 -1
- package/packages/mailx-imap/index.js +89 -14
- package/packages/mailx-server/index.js +42 -31
- package/packages/mailx-server/package.json +1 -2
- package/packages/mailx-settings/index.d.ts +1 -1
- package/packages/mailx-settings/index.js +21 -12
- package/packages/mailx-store/db.d.ts +6 -2
- package/packages/mailx-store/db.js +78 -16
- package/packages/mailx-store/file-store.d.ts +2 -8
- package/packages/mailx-store/file-store.js +7 -31
- package/packages/mailx-types/index.d.ts +3 -1
- package/.tswalk.json +0 -7396
- package/launcher/release.cmd +0 -4
- package/mailx.json +0 -9
- package/packages/mailx-api/node_modules/nodemailer/.ncurc.js +0 -9
- package/packages/mailx-api/node_modules/nodemailer/.prettierignore +0 -8
- package/packages/mailx-api/node_modules/nodemailer/.prettierrc +0 -12
- package/packages/mailx-api/node_modules/nodemailer/.prettierrc.js +0 -10
- package/packages/mailx-api/node_modules/nodemailer/.release-please-config.json +0 -9
- package/packages/mailx-api/node_modules/nodemailer/LICENSE +0 -16
- package/packages/mailx-api/node_modules/nodemailer/README.md +0 -86
- package/packages/mailx-api/node_modules/nodemailer/SECURITY.txt +0 -22
- package/packages/mailx-api/node_modules/nodemailer/eslint.config.js +0 -88
- package/packages/mailx-api/node_modules/nodemailer/lib/addressparser/index.js +0 -383
- package/packages/mailx-api/node_modules/nodemailer/lib/base64/index.js +0 -139
- package/packages/mailx-api/node_modules/nodemailer/lib/dkim/index.js +0 -253
- package/packages/mailx-api/node_modules/nodemailer/lib/dkim/message-parser.js +0 -155
- package/packages/mailx-api/node_modules/nodemailer/lib/dkim/relaxed-body.js +0 -154
- package/packages/mailx-api/node_modules/nodemailer/lib/dkim/sign.js +0 -117
- package/packages/mailx-api/node_modules/nodemailer/lib/fetch/cookies.js +0 -281
- package/packages/mailx-api/node_modules/nodemailer/lib/fetch/index.js +0 -280
- package/packages/mailx-api/node_modules/nodemailer/lib/json-transport/index.js +0 -82
- package/packages/mailx-api/node_modules/nodemailer/lib/mail-composer/index.js +0 -629
- package/packages/mailx-api/node_modules/nodemailer/lib/mailer/index.js +0 -441
- package/packages/mailx-api/node_modules/nodemailer/lib/mailer/mail-message.js +0 -316
- package/packages/mailx-api/node_modules/nodemailer/lib/mime-funcs/index.js +0 -625
- package/packages/mailx-api/node_modules/nodemailer/lib/mime-funcs/mime-types.js +0 -2113
- package/packages/mailx-api/node_modules/nodemailer/lib/mime-node/index.js +0 -1316
- package/packages/mailx-api/node_modules/nodemailer/lib/mime-node/last-newline.js +0 -33
- package/packages/mailx-api/node_modules/nodemailer/lib/mime-node/le-unix.js +0 -43
- package/packages/mailx-api/node_modules/nodemailer/lib/mime-node/le-windows.js +0 -52
- package/packages/mailx-api/node_modules/nodemailer/lib/nodemailer.js +0 -157
- package/packages/mailx-api/node_modules/nodemailer/lib/punycode/index.js +0 -460
- package/packages/mailx-api/node_modules/nodemailer/lib/qp/index.js +0 -227
- package/packages/mailx-api/node_modules/nodemailer/lib/sendmail-transport/index.js +0 -210
- package/packages/mailx-api/node_modules/nodemailer/lib/ses-transport/index.js +0 -234
- package/packages/mailx-api/node_modules/nodemailer/lib/shared/index.js +0 -754
- package/packages/mailx-api/node_modules/nodemailer/lib/smtp-connection/data-stream.js +0 -108
- package/packages/mailx-api/node_modules/nodemailer/lib/smtp-connection/http-proxy-client.js +0 -143
- package/packages/mailx-api/node_modules/nodemailer/lib/smtp-connection/index.js +0 -1870
- package/packages/mailx-api/node_modules/nodemailer/lib/smtp-pool/index.js +0 -652
- package/packages/mailx-api/node_modules/nodemailer/lib/smtp-pool/pool-resource.js +0 -259
- package/packages/mailx-api/node_modules/nodemailer/lib/smtp-transport/index.js +0 -421
- package/packages/mailx-api/node_modules/nodemailer/lib/stream-transport/index.js +0 -135
- package/packages/mailx-api/node_modules/nodemailer/lib/well-known/index.js +0 -47
- package/packages/mailx-api/node_modules/nodemailer/lib/well-known/services.json +0 -611
- package/packages/mailx-api/node_modules/nodemailer/lib/xoauth2/index.js +0 -427
- package/packages/mailx-api/node_modules/nodemailer/package.json +0 -47
- package/packages/mailx-imap/node_modules/nodemailer/.ncurc.js +0 -9
- package/packages/mailx-imap/node_modules/nodemailer/.prettierignore +0 -8
- package/packages/mailx-imap/node_modules/nodemailer/.prettierrc +0 -12
- package/packages/mailx-imap/node_modules/nodemailer/.prettierrc.js +0 -10
- package/packages/mailx-imap/node_modules/nodemailer/.release-please-config.json +0 -9
- package/packages/mailx-imap/node_modules/nodemailer/LICENSE +0 -16
- package/packages/mailx-imap/node_modules/nodemailer/README.md +0 -86
- package/packages/mailx-imap/node_modules/nodemailer/SECURITY.txt +0 -22
- package/packages/mailx-imap/node_modules/nodemailer/eslint.config.js +0 -88
- package/packages/mailx-imap/node_modules/nodemailer/lib/addressparser/index.js +0 -383
- package/packages/mailx-imap/node_modules/nodemailer/lib/base64/index.js +0 -139
- package/packages/mailx-imap/node_modules/nodemailer/lib/dkim/index.js +0 -253
- package/packages/mailx-imap/node_modules/nodemailer/lib/dkim/message-parser.js +0 -155
- package/packages/mailx-imap/node_modules/nodemailer/lib/dkim/relaxed-body.js +0 -154
- package/packages/mailx-imap/node_modules/nodemailer/lib/dkim/sign.js +0 -117
- package/packages/mailx-imap/node_modules/nodemailer/lib/fetch/cookies.js +0 -281
- package/packages/mailx-imap/node_modules/nodemailer/lib/fetch/index.js +0 -280
- package/packages/mailx-imap/node_modules/nodemailer/lib/json-transport/index.js +0 -82
- package/packages/mailx-imap/node_modules/nodemailer/lib/mail-composer/index.js +0 -629
- package/packages/mailx-imap/node_modules/nodemailer/lib/mailer/index.js +0 -441
- package/packages/mailx-imap/node_modules/nodemailer/lib/mailer/mail-message.js +0 -316
- package/packages/mailx-imap/node_modules/nodemailer/lib/mime-funcs/index.js +0 -625
- package/packages/mailx-imap/node_modules/nodemailer/lib/mime-funcs/mime-types.js +0 -2113
- package/packages/mailx-imap/node_modules/nodemailer/lib/mime-node/index.js +0 -1316
- package/packages/mailx-imap/node_modules/nodemailer/lib/mime-node/last-newline.js +0 -33
- package/packages/mailx-imap/node_modules/nodemailer/lib/mime-node/le-unix.js +0 -43
- package/packages/mailx-imap/node_modules/nodemailer/lib/mime-node/le-windows.js +0 -52
- package/packages/mailx-imap/node_modules/nodemailer/lib/nodemailer.js +0 -157
- package/packages/mailx-imap/node_modules/nodemailer/lib/punycode/index.js +0 -460
- package/packages/mailx-imap/node_modules/nodemailer/lib/qp/index.js +0 -227
- package/packages/mailx-imap/node_modules/nodemailer/lib/sendmail-transport/index.js +0 -210
- package/packages/mailx-imap/node_modules/nodemailer/lib/ses-transport/index.js +0 -234
- package/packages/mailx-imap/node_modules/nodemailer/lib/shared/index.js +0 -754
- package/packages/mailx-imap/node_modules/nodemailer/lib/smtp-connection/data-stream.js +0 -108
- package/packages/mailx-imap/node_modules/nodemailer/lib/smtp-connection/http-proxy-client.js +0 -143
- package/packages/mailx-imap/node_modules/nodemailer/lib/smtp-connection/index.js +0 -1870
- package/packages/mailx-imap/node_modules/nodemailer/lib/smtp-pool/index.js +0 -652
- package/packages/mailx-imap/node_modules/nodemailer/lib/smtp-pool/pool-resource.js +0 -259
- package/packages/mailx-imap/node_modules/nodemailer/lib/smtp-transport/index.js +0 -421
- package/packages/mailx-imap/node_modules/nodemailer/lib/stream-transport/index.js +0 -135
- package/packages/mailx-imap/node_modules/nodemailer/lib/well-known/index.js +0 -47
- package/packages/mailx-imap/node_modules/nodemailer/lib/well-known/services.json +0 -611
- package/packages/mailx-imap/node_modules/nodemailer/lib/xoauth2/index.js +0 -427
- package/packages/mailx-imap/node_modules/nodemailer/package.json +0 -47
- package/packages/mailx-send/node_modules/nodemailer/.ncurc.js +0 -9
- package/packages/mailx-send/node_modules/nodemailer/.prettierignore +0 -8
- package/packages/mailx-send/node_modules/nodemailer/.prettierrc +0 -12
- package/packages/mailx-send/node_modules/nodemailer/.prettierrc.js +0 -10
- package/packages/mailx-send/node_modules/nodemailer/.release-please-config.json +0 -9
- package/packages/mailx-send/node_modules/nodemailer/LICENSE +0 -16
- package/packages/mailx-send/node_modules/nodemailer/README.md +0 -86
- package/packages/mailx-send/node_modules/nodemailer/SECURITY.txt +0 -22
- package/packages/mailx-send/node_modules/nodemailer/eslint.config.js +0 -88
- package/packages/mailx-send/node_modules/nodemailer/lib/addressparser/index.js +0 -383
- package/packages/mailx-send/node_modules/nodemailer/lib/base64/index.js +0 -139
- package/packages/mailx-send/node_modules/nodemailer/lib/dkim/index.js +0 -253
- package/packages/mailx-send/node_modules/nodemailer/lib/dkim/message-parser.js +0 -155
- package/packages/mailx-send/node_modules/nodemailer/lib/dkim/relaxed-body.js +0 -154
- package/packages/mailx-send/node_modules/nodemailer/lib/dkim/sign.js +0 -117
- package/packages/mailx-send/node_modules/nodemailer/lib/fetch/cookies.js +0 -281
- package/packages/mailx-send/node_modules/nodemailer/lib/fetch/index.js +0 -280
- package/packages/mailx-send/node_modules/nodemailer/lib/json-transport/index.js +0 -82
- package/packages/mailx-send/node_modules/nodemailer/lib/mail-composer/index.js +0 -629
- package/packages/mailx-send/node_modules/nodemailer/lib/mailer/index.js +0 -441
- package/packages/mailx-send/node_modules/nodemailer/lib/mailer/mail-message.js +0 -316
- package/packages/mailx-send/node_modules/nodemailer/lib/mime-funcs/index.js +0 -625
- package/packages/mailx-send/node_modules/nodemailer/lib/mime-funcs/mime-types.js +0 -2113
- package/packages/mailx-send/node_modules/nodemailer/lib/mime-node/index.js +0 -1316
- package/packages/mailx-send/node_modules/nodemailer/lib/mime-node/last-newline.js +0 -33
- package/packages/mailx-send/node_modules/nodemailer/lib/mime-node/le-unix.js +0 -43
- package/packages/mailx-send/node_modules/nodemailer/lib/mime-node/le-windows.js +0 -52
- package/packages/mailx-send/node_modules/nodemailer/lib/nodemailer.js +0 -157
- package/packages/mailx-send/node_modules/nodemailer/lib/punycode/index.js +0 -460
- package/packages/mailx-send/node_modules/nodemailer/lib/qp/index.js +0 -227
- package/packages/mailx-send/node_modules/nodemailer/lib/sendmail-transport/index.js +0 -210
- package/packages/mailx-send/node_modules/nodemailer/lib/ses-transport/index.js +0 -234
- package/packages/mailx-send/node_modules/nodemailer/lib/shared/index.js +0 -754
- package/packages/mailx-send/node_modules/nodemailer/lib/smtp-connection/data-stream.js +0 -108
- package/packages/mailx-send/node_modules/nodemailer/lib/smtp-connection/http-proxy-client.js +0 -143
- package/packages/mailx-send/node_modules/nodemailer/lib/smtp-connection/index.js +0 -1870
- package/packages/mailx-send/node_modules/nodemailer/lib/smtp-pool/index.js +0 -652
- package/packages/mailx-send/node_modules/nodemailer/lib/smtp-pool/pool-resource.js +0 -259
- package/packages/mailx-send/node_modules/nodemailer/lib/smtp-transport/index.js +0 -421
- package/packages/mailx-send/node_modules/nodemailer/lib/stream-transport/index.js +0 -135
- package/packages/mailx-send/node_modules/nodemailer/lib/well-known/index.js +0 -47
- package/packages/mailx-send/node_modules/nodemailer/lib/well-known/services.json +0 -611
- package/packages/mailx-send/node_modules/nodemailer/lib/xoauth2/index.js +0 -427
- package/packages/mailx-send/node_modules/nodemailer/package.json +0 -47
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
align-items: center;
|
|
8
8
|
justify-content: space-between;
|
|
9
9
|
padding: 0 var(--gap-sm);
|
|
10
|
-
background:
|
|
10
|
+
background: var(--color-brand);
|
|
11
11
|
border-bottom: 1px solid var(--color-border);
|
|
12
12
|
gap: var(--gap-sm);
|
|
13
13
|
|
|
@@ -26,9 +26,9 @@
|
|
|
26
26
|
border: none;
|
|
27
27
|
border-radius: var(--radius-sm);
|
|
28
28
|
background: transparent;
|
|
29
|
-
color: var(--color-
|
|
29
|
+
color: var(--color-brand-dark);
|
|
30
30
|
font-size: var(--font-size-sm);
|
|
31
|
-
font-weight:
|
|
31
|
+
font-weight: 700;
|
|
32
32
|
cursor: pointer;
|
|
33
33
|
white-space: nowrap;
|
|
34
34
|
|
|
@@ -68,10 +68,27 @@
|
|
|
68
68
|
.tb-menu-item input[type="checkbox"] { accent-color: var(--color-accent); }
|
|
69
69
|
.tb-sep { width: 1px; height: 1.2rem; background: var(--color-border); margin: 0 var(--gap-xs); }
|
|
70
70
|
|
|
71
|
+
.search-bar {
|
|
72
|
+
display: flex;
|
|
73
|
+
align-items: center;
|
|
74
|
+
gap: 0;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
#search-scope {
|
|
78
|
+
padding: var(--gap-xs) var(--gap-xs);
|
|
79
|
+
border: 1px solid var(--color-border);
|
|
80
|
+
border-radius: var(--radius-md) 0 0 var(--radius-md);
|
|
81
|
+
background: var(--color-bg-surface);
|
|
82
|
+
color: var(--color-text);
|
|
83
|
+
font-size: var(--font-size-sm);
|
|
84
|
+
border-right: none;
|
|
85
|
+
cursor: pointer;
|
|
86
|
+
}
|
|
87
|
+
|
|
71
88
|
#search-input {
|
|
72
89
|
padding: var(--gap-xs) var(--gap-sm);
|
|
73
90
|
border: 1px solid var(--color-border);
|
|
74
|
-
border-radius: var(--radius-md);
|
|
91
|
+
border-radius: 0 var(--radius-md) var(--radius-md) 0;
|
|
75
92
|
background: var(--color-bg-surface);
|
|
76
93
|
color: var(--color-text);
|
|
77
94
|
font-size: var(--font-size-sm);
|
|
@@ -99,9 +116,9 @@
|
|
|
99
116
|
align-items: center;
|
|
100
117
|
gap: var(--gap-xs);
|
|
101
118
|
padding: var(--gap-xs) var(--gap-sm);
|
|
102
|
-
font-weight:
|
|
103
|
-
font-size: var(--font-size-
|
|
104
|
-
color: var(--color-
|
|
119
|
+
font-weight: 700;
|
|
120
|
+
font-size: var(--font-size-base);
|
|
121
|
+
color: var(--color-brand-dark);
|
|
105
122
|
text-transform: uppercase;
|
|
106
123
|
letter-spacing: 0.05em;
|
|
107
124
|
cursor: pointer;
|
|
@@ -130,7 +147,8 @@
|
|
|
130
147
|
padding: var(--gap-xs) var(--gap-sm) var(--gap-xs) var(--gap-lg);
|
|
131
148
|
cursor: pointer;
|
|
132
149
|
font-size: var(--font-size-base);
|
|
133
|
-
|
|
150
|
+
font-weight: 600;
|
|
151
|
+
color: var(--color-brand-dark);
|
|
134
152
|
border-radius: 0;
|
|
135
153
|
|
|
136
154
|
&:hover { background: var(--color-bg-hover); }
|
|
@@ -150,18 +168,57 @@
|
|
|
150
168
|
text-align: center;
|
|
151
169
|
}
|
|
152
170
|
|
|
171
|
+
.ft-badge-outbox {
|
|
172
|
+
background: oklch(0.55 0.18 25);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
.ft-filter {
|
|
176
|
+
padding: 2px var(--gap-xs);
|
|
177
|
+
border-bottom: 1px solid var(--color-border);
|
|
178
|
+
background: var(--color-bg-surface);
|
|
179
|
+
flex-shrink: 0;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
.ft-filter input {
|
|
183
|
+
width: 100%;
|
|
184
|
+
padding: 2px var(--gap-sm);
|
|
185
|
+
border: 1px solid var(--color-border);
|
|
186
|
+
border-radius: var(--radius-sm);
|
|
187
|
+
background: var(--color-bg);
|
|
188
|
+
color: var(--color-text);
|
|
189
|
+
font-size: var(--font-size-sm);
|
|
190
|
+
outline: none;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
.ft-filter input:focus { border-color: var(--color-accent); }
|
|
194
|
+
|
|
195
|
+
.ft-folder.ft-filter-hidden,
|
|
196
|
+
.ft-account.ft-filter-hidden,
|
|
197
|
+
.ft-account-header.ft-filter-hidden { display: none; }
|
|
198
|
+
|
|
153
199
|
.folder-loading {
|
|
154
200
|
padding: var(--gap-lg);
|
|
155
201
|
color: var(--color-text-muted);
|
|
156
202
|
font-size: var(--font-size-sm);
|
|
157
203
|
}
|
|
158
204
|
|
|
205
|
+
.ft-folder.drop-target {
|
|
206
|
+
background: var(--color-accent);
|
|
207
|
+
color: white;
|
|
208
|
+
outline: 2px solid var(--color-brand-dark);
|
|
209
|
+
outline-offset: -2px;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
.ml-row.dragging {
|
|
213
|
+
opacity: 0.5;
|
|
214
|
+
}
|
|
215
|
+
|
|
159
216
|
/* ── Message List ── */
|
|
160
217
|
|
|
161
218
|
.message-list {
|
|
162
219
|
display: grid;
|
|
163
220
|
grid-template-columns: 1.2em minmax(120px, 200px) auto 1fr;
|
|
164
|
-
grid-template-rows: auto 1fr;
|
|
221
|
+
grid-template-rows: auto auto 1fr;
|
|
165
222
|
column-gap: var(--gap-sm);
|
|
166
223
|
overflow: hidden;
|
|
167
224
|
border-right: 1px solid var(--color-border);
|
|
@@ -187,6 +244,30 @@
|
|
|
187
244
|
font-size: var(--font-size-sm);
|
|
188
245
|
}
|
|
189
246
|
|
|
247
|
+
.ml-filter {
|
|
248
|
+
grid-column: 1 / -1;
|
|
249
|
+
padding: 2px var(--gap-xs);
|
|
250
|
+
border-bottom: 1px solid var(--color-border);
|
|
251
|
+
background: var(--color-bg-surface);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
.ml-filter input {
|
|
255
|
+
width: 100%;
|
|
256
|
+
padding: 2px var(--gap-sm);
|
|
257
|
+
border: 1px solid var(--color-border);
|
|
258
|
+
border-radius: var(--radius-sm);
|
|
259
|
+
background: var(--color-bg);
|
|
260
|
+
color: var(--color-text);
|
|
261
|
+
font-size: var(--font-size-sm);
|
|
262
|
+
outline: none;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
.ml-filter input:focus {
|
|
266
|
+
border-color: var(--color-accent);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
.ml-row.filter-hidden { display: none; }
|
|
270
|
+
|
|
190
271
|
.ml-header {
|
|
191
272
|
display: grid;
|
|
192
273
|
grid-template-columns: subgrid;
|
|
@@ -195,8 +276,8 @@
|
|
|
195
276
|
border-bottom: 1px solid var(--color-border);
|
|
196
277
|
background: var(--color-bg-toolbar);
|
|
197
278
|
font-size: var(--font-size-sm);
|
|
198
|
-
font-weight:
|
|
199
|
-
color: var(--color-
|
|
279
|
+
font-weight: 700;
|
|
280
|
+
color: var(--color-brand-dark);
|
|
200
281
|
user-select: none;
|
|
201
282
|
|
|
202
283
|
.ml-col { cursor: pointer; &:hover { color: var(--color-text); } }
|
|
@@ -219,10 +300,11 @@
|
|
|
219
300
|
border-bottom: 1px solid color-mix(in oklch, var(--color-border) 50%, transparent);
|
|
220
301
|
cursor: pointer;
|
|
221
302
|
font-size: var(--font-size-base);
|
|
303
|
+
color: var(--color-text);
|
|
222
304
|
align-items: baseline;
|
|
223
305
|
|
|
224
306
|
&:hover { background: var(--color-bg-hover); }
|
|
225
|
-
&.selected { background: var(--color-
|
|
307
|
+
&.selected { background: var(--color-brand); color: var(--color-brand-dark); font-weight: 600; }
|
|
226
308
|
&.unread {
|
|
227
309
|
font-weight: 600;
|
|
228
310
|
color: var(--color-unread);
|
|
@@ -282,21 +364,91 @@
|
|
|
282
364
|
font-size: var(--font-size-sm);
|
|
283
365
|
line-height: 1.5;
|
|
284
366
|
|
|
367
|
+
.mv-header-top { display: flex; justify-content: space-between; align-items: flex-start; gap: var(--gap-sm); }
|
|
368
|
+
.mv-header-info { flex: 1; min-width: 0; }
|
|
369
|
+
.mv-header-actions { display: flex; align-items: center; gap: var(--gap-xs); flex-shrink: 0; }
|
|
285
370
|
.mv-from { font-weight: 600; }
|
|
286
371
|
.mv-to { color: var(--color-text-muted); }
|
|
287
372
|
.mv-subject { font-size: var(--font-size-lg); font-weight: 600; margin-top: var(--gap-xs); }
|
|
288
373
|
.mv-date { color: var(--color-text-muted); font-size: var(--font-size-sm); }
|
|
374
|
+
.mv-unsubscribe {
|
|
375
|
+
font-size: var(--font-size-sm);
|
|
376
|
+
color: var(--color-danger);
|
|
377
|
+
cursor: pointer;
|
|
378
|
+
text-decoration: underline;
|
|
379
|
+
white-space: nowrap;
|
|
380
|
+
}
|
|
381
|
+
.mv-action {
|
|
382
|
+
font-size: var(--font-size-sm);
|
|
383
|
+
padding: 2px 6px;
|
|
384
|
+
border: 1px solid var(--color-border);
|
|
385
|
+
border-radius: var(--radius-sm);
|
|
386
|
+
background: transparent;
|
|
387
|
+
color: var(--color-text-muted);
|
|
388
|
+
cursor: pointer;
|
|
389
|
+
white-space: nowrap;
|
|
390
|
+
}
|
|
391
|
+
.mv-action:hover { background: var(--color-bg-hover); color: var(--color-text); }
|
|
392
|
+
.mv-action-primary {
|
|
393
|
+
background: var(--color-brand-dark) !important;
|
|
394
|
+
color: white !important;
|
|
395
|
+
border-color: var(--color-brand-dark) !important;
|
|
396
|
+
}
|
|
397
|
+
.mv-action-primary:hover { opacity: 0.85; }
|
|
289
398
|
}
|
|
290
399
|
|
|
291
400
|
.mv-remote-banner {
|
|
401
|
+
background: oklch(0.45 0.12 60);
|
|
402
|
+
color: white;
|
|
403
|
+
font-size: var(--font-size-sm);
|
|
404
|
+
font-weight: 600;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
.mv-rb-summary {
|
|
292
408
|
display: flex;
|
|
293
409
|
align-items: center;
|
|
294
410
|
gap: var(--gap-sm);
|
|
295
411
|
padding: var(--gap-xs) var(--gap-md);
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
412
|
+
cursor: pointer;
|
|
413
|
+
flex-wrap: wrap;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
.mv-rb-toggle {
|
|
417
|
+
font-size: 0.8em;
|
|
418
|
+
width: 1em;
|
|
419
|
+
display: inline-block;
|
|
420
|
+
flex-shrink: 0;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
.mv-rb-buttons {
|
|
424
|
+
display: flex;
|
|
425
|
+
flex-wrap: wrap;
|
|
426
|
+
gap: var(--gap-xs);
|
|
427
|
+
margin-left: auto;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
.mv-rb-details {
|
|
431
|
+
padding: var(--gap-xs) var(--gap-md) var(--gap-sm);
|
|
432
|
+
border-top: 1px solid rgba(255,255,255,0.2);
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
.mv-rb-info {
|
|
436
|
+
font-weight: 400;
|
|
437
|
+
line-height: 1.6;
|
|
438
|
+
margin-bottom: var(--gap-sm);
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
.mv-rb-actions {
|
|
442
|
+
display: flex;
|
|
443
|
+
flex-wrap: wrap;
|
|
444
|
+
gap: var(--gap-xs);
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
.mv-rb-label {
|
|
448
|
+
color: rgba(255,255,255,0.7);
|
|
299
449
|
font-weight: 600;
|
|
450
|
+
display: inline-block;
|
|
451
|
+
min-width: 6em;
|
|
300
452
|
}
|
|
301
453
|
|
|
302
454
|
.mv-remote-banner button {
|
|
@@ -307,6 +459,7 @@
|
|
|
307
459
|
color: white;
|
|
308
460
|
font-size: var(--font-size-sm);
|
|
309
461
|
cursor: pointer;
|
|
462
|
+
font-weight: 600;
|
|
310
463
|
}
|
|
311
464
|
|
|
312
465
|
.mv-remote-banner button:hover {
|
|
@@ -315,7 +468,7 @@
|
|
|
315
468
|
|
|
316
469
|
.mv-body {
|
|
317
470
|
flex: 1;
|
|
318
|
-
overflow
|
|
471
|
+
overflow: hidden;
|
|
319
472
|
background: var(--color-bg-surface);
|
|
320
473
|
|
|
321
474
|
iframe {
|
|
@@ -359,3 +512,40 @@
|
|
|
359
512
|
font-size: var(--font-size-sm);
|
|
360
513
|
color: var(--color-text-muted);
|
|
361
514
|
}
|
|
515
|
+
|
|
516
|
+
/* ── Startup Overlay ── */
|
|
517
|
+
|
|
518
|
+
.startup-overlay {
|
|
519
|
+
position: fixed;
|
|
520
|
+
inset: var(--toolbar-height) 0 var(--statusbar-height) 0;
|
|
521
|
+
display: flex;
|
|
522
|
+
align-items: center;
|
|
523
|
+
justify-content: center;
|
|
524
|
+
background: var(--color-bg);
|
|
525
|
+
z-index: 100;
|
|
526
|
+
transition: opacity 0.3s ease;
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
.startup-overlay.hidden {
|
|
530
|
+
opacity: 0;
|
|
531
|
+
pointer-events: none;
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
.startup-content {
|
|
535
|
+
text-align: center;
|
|
536
|
+
color: var(--color-text);
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
.startup-spinner {
|
|
540
|
+
width: 32px;
|
|
541
|
+
height: 32px;
|
|
542
|
+
margin: 0 auto var(--gap-md);
|
|
543
|
+
border: 3px solid var(--color-border);
|
|
544
|
+
border-top-color: var(--color-brand-dark);
|
|
545
|
+
border-radius: 50%;
|
|
546
|
+
animation: spin 1s linear infinite;
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
#startup-status {
|
|
550
|
+
font-size: var(--font-size-lg);
|
|
551
|
+
}
|
package/client/styles/layout.css
CHANGED
|
@@ -24,7 +24,8 @@ body {
|
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
.toolbar { grid-area: toolbar; }
|
|
27
|
-
.folder-
|
|
27
|
+
.folder-panel { grid-area: folders; display: flex; flex-direction: column; overflow: hidden; }
|
|
28
|
+
.folder-tree { flex: 1; overflow-y: auto; }
|
|
28
29
|
.main-area { grid-area: main; }
|
|
29
30
|
.status-bar { grid-area: status; }
|
|
30
31
|
|
package/killmail.cmd
ADDED
package/launch.ps1
CHANGED
|
@@ -1,20 +1,62 @@
|
|
|
1
1
|
# Launch mailx email client
|
|
2
2
|
#
|
|
3
|
-
# Usage: launch.ps1 [-dev] [-prod] [-restart]
|
|
3
|
+
# Usage: launch.ps1 [-dev] [-prod] [-restart] [-clear]
|
|
4
4
|
# -dev (default) Start server with --watch for auto-restart on file changes
|
|
5
5
|
# -prod Start server without --watch
|
|
6
6
|
# -restart Kill existing server on port 9333 before starting
|
|
7
|
+
# -clear Clear WebView2 cache before launching (fixes blank window issues)
|
|
7
8
|
#
|
|
8
9
|
# The launcher starts the Node server (if not running) and opens a WebView2 window.
|
|
9
10
|
# Server: http://localhost:9333
|
|
10
11
|
# Log: mailx.log
|
|
11
12
|
# Data: ~/.mailx/ (DB, store, settings pointer)
|
|
12
13
|
|
|
13
|
-
#
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
# Clear WebView2 cache if requested
|
|
15
|
+
if ("-clear" -in $args) {
|
|
16
|
+
$wv2dir = "$PSScriptRoot\launcher\bin\mailx-app.exe.WebView2"
|
|
17
|
+
if (Test-Path $wv2dir) {
|
|
18
|
+
Write-Host "Clearing WebView2 cache..."
|
|
19
|
+
Remove-Item -Recurse -Force $wv2dir
|
|
20
|
+
}
|
|
21
|
+
# Remove -clear from args passed to exe
|
|
22
|
+
$args = $args | Where-Object { $_ -ne "-clear" }
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
# Check if mailx-app is already running
|
|
26
|
+
$existing = Get-Process -Name "mailx-app" -ErrorAction SilentlyContinue
|
|
27
|
+
if ($existing -and ("-restart" -notin $args)) {
|
|
28
|
+
Write-Host "mailx is already running (PID $($existing.Id)). Use -restart to force."
|
|
29
|
+
# Try to bring the existing window to front
|
|
30
|
+
Add-Type @"
|
|
31
|
+
using System;
|
|
32
|
+
using System.Runtime.InteropServices;
|
|
33
|
+
public class Win32 {
|
|
34
|
+
[DllImport("user32.dll")] public static extern bool SetForegroundWindow(IntPtr hWnd);
|
|
35
|
+
[DllImport("user32.dll")] public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
|
|
36
|
+
}
|
|
37
|
+
"@
|
|
38
|
+
$hwnd = $existing.MainWindowHandle
|
|
39
|
+
if ($hwnd -ne [IntPtr]::Zero) {
|
|
40
|
+
[Win32]::ShowWindow($hwnd, 9) | Out-Null # SW_RESTORE
|
|
41
|
+
[Win32]::SetForegroundWindow($hwnd) | Out-Null
|
|
42
|
+
}
|
|
43
|
+
exit 0
|
|
17
44
|
}
|
|
45
|
+
|
|
46
|
+
# Copy latest release build to bin/ if newer
|
|
47
|
+
$release = "$PSScriptRoot\launcher\target\release\mailx-app.exe"
|
|
48
|
+
$bin = "$PSScriptRoot\launcher\bin\mailx-app.exe"
|
|
49
|
+
if ((Test-Path $release) -and (Test-Path $bin)) {
|
|
50
|
+
if ((Get-Item $release).LastWriteTime -gt (Get-Item $bin).LastWriteTime) {
|
|
51
|
+
Write-Host "Updating launcher binary..."
|
|
52
|
+
Copy-Item $release $bin -Force -ErrorAction SilentlyContinue
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
# Try pre-built binary first, then release, then debug
|
|
57
|
+
$exe = $bin
|
|
58
|
+
if (-not (Test-Path $exe)) { $exe = $release }
|
|
59
|
+
if (-not (Test-Path $exe)) { $exe = "$PSScriptRoot\launcher\target\debug\mailx-app.exe" }
|
|
18
60
|
if (-not (Test-Path $exe)) {
|
|
19
61
|
Write-Host "Launcher not found. Run: launcher\build.cmd"
|
|
20
62
|
exit 1
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Post-install script to set executable permissions on Linux/Mac binaries
|
|
4
|
+
* and check for required system dependencies (webkit2gtk on Linux).
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import fs from "fs";
|
|
8
|
+
import path from "path";
|
|
9
|
+
import { execSync } from "child_process";
|
|
10
|
+
|
|
11
|
+
function detectDistro() {
|
|
12
|
+
if (!fs.existsSync("/etc/os-release")) return "unknown";
|
|
13
|
+
try {
|
|
14
|
+
const osRelease = fs.readFileSync("/etc/os-release", "utf8").toLowerCase();
|
|
15
|
+
if (osRelease.includes("ubuntu") || osRelease.includes("debian")) return "debian";
|
|
16
|
+
if (osRelease.includes("fedora") || osRelease.includes("rhel") || osRelease.includes("centos")) return "fedora";
|
|
17
|
+
if (osRelease.includes("arch")) return "arch";
|
|
18
|
+
return "unknown";
|
|
19
|
+
} catch { return "unknown"; }
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function showDependencyHelp(distro) {
|
|
23
|
+
console.warn("\n Missing system dependencies for mailx native launcher.");
|
|
24
|
+
console.warn(" Install required libraries:\n");
|
|
25
|
+
switch (distro) {
|
|
26
|
+
case "debian": console.warn(" sudo apt install libwebkit2gtk-4.1-0 libgtk-3-0\n"); break;
|
|
27
|
+
case "fedora": console.warn(" sudo dnf install webkit2gtk4.1 gtk3\n"); break;
|
|
28
|
+
case "arch": console.warn(" sudo pacman -S webkit2gtk-4.1 gtk3\n"); break;
|
|
29
|
+
default: console.warn(" Install webkit2gtk-4.1 and gtk3 for your distribution\n");
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function main() {
|
|
34
|
+
if (process.platform === "win32") return;
|
|
35
|
+
|
|
36
|
+
const binDir = path.join(import.meta.dirname, "..", "bin");
|
|
37
|
+
const arch = process.arch;
|
|
38
|
+
|
|
39
|
+
// Binary naming convention (matches msger pattern):
|
|
40
|
+
// Windows: mailx-app.exe
|
|
41
|
+
// macOS x64: mailx-app
|
|
42
|
+
// macOS arm64: mailx-app-arm64
|
|
43
|
+
// Linux x64: mailx-app-linux
|
|
44
|
+
// Linux arm64: mailx-app-linux-aarch64
|
|
45
|
+
let binaryName;
|
|
46
|
+
if (process.platform === "darwin") {
|
|
47
|
+
binaryName = arch === "arm64" ? "mailx-app-arm64" : "mailx-app";
|
|
48
|
+
} else {
|
|
49
|
+
binaryName = arch === "arm64" ? "mailx-app-linux-aarch64" : "mailx-app-linux";
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const binaryPath = path.join(binDir, binaryName);
|
|
53
|
+
|
|
54
|
+
if (!fs.existsSync(binaryPath)) {
|
|
55
|
+
console.warn(` mailx native launcher not available for ${process.platform} ${arch}`);
|
|
56
|
+
console.warn(" mailx will run in browser mode (server + open browser)");
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Set executable permissions
|
|
61
|
+
try {
|
|
62
|
+
fs.chmodSync(binaryPath, 0o755);
|
|
63
|
+
console.log(` Set execute permissions on ${binaryName}`);
|
|
64
|
+
} catch (e) {
|
|
65
|
+
console.warn(` Could not chmod ${binaryPath}: ${e.message}`);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Check system dependencies on Linux
|
|
69
|
+
if (process.platform === "linux") {
|
|
70
|
+
try {
|
|
71
|
+
const ldd = execSync(`ldd "${binaryPath}" 2>&1`, { encoding: "utf8" });
|
|
72
|
+
if (ldd.includes("not found")) {
|
|
73
|
+
showDependencyHelp(detectDistro());
|
|
74
|
+
}
|
|
75
|
+
} catch {
|
|
76
|
+
console.warn(" Could not check system dependencies");
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
main();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bobfrankston/mailx",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.14",
|
|
4
4
|
"description": "Local-first email client with IMAP sync and standalone native app",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "bin/mailx.js",
|
|
@@ -17,13 +17,12 @@
|
|
|
17
17
|
"start": "node --watch packages/mailx-server/index.js",
|
|
18
18
|
"start:prod": "node packages/mailx-server/index.js",
|
|
19
19
|
"release": "npmglobalize",
|
|
20
|
-
"postinstall": "node
|
|
20
|
+
"postinstall": "node launcher/builder/postinstall.js"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
23
|
"@bobfrankston/iflow": "^1.0.2",
|
|
24
24
|
"@bobfrankston/miscinfo": "^1.0.5",
|
|
25
25
|
"@bobfrankston/oauthsupport": "^1.0.10",
|
|
26
|
-
"@bobfrankston/certsupport": "^1.0.35",
|
|
27
26
|
"mailparser": "^3.7.2",
|
|
28
27
|
"quill": "^2.0.3",
|
|
29
28
|
"express": "^4.21.0",
|
|
@@ -52,7 +51,6 @@
|
|
|
52
51
|
"@bobfrankston/iflow": "file:../MailApps/iflow",
|
|
53
52
|
"@bobfrankston/miscinfo": "file:../../projects/npm/miscinfo",
|
|
54
53
|
"@bobfrankston/oauthsupport": "file:../../projects/oauth/oauthsupport",
|
|
55
|
-
"@bobfrankston/certsupport": "file:../../projects/nodejs/certsupport",
|
|
56
54
|
"mailparser": "^3.7.2",
|
|
57
55
|
"quill": "^2.0.3",
|
|
58
56
|
"express": "^4.21.0",
|