@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.
Files changed (172) hide show
  1. package/bin/mailx.js +52 -28
  2. package/client/app.js +113 -30
  3. package/client/components/folder-tree.js +84 -3
  4. package/client/components/message-list.js +164 -10
  5. package/client/components/message-viewer.js +130 -13
  6. package/client/compose/compose.html +4 -4
  7. package/client/compose/compose.js +53 -34
  8. package/client/index.html +50 -21
  9. package/client/lib/api-client.js +112 -31
  10. package/client/lib/mailxapi.js +123 -0
  11. package/client/package.json +1 -1
  12. package/client/styles/components.css +206 -16
  13. package/client/styles/layout.css +2 -1
  14. package/killmail.cmd +6 -0
  15. package/launch.ps1 +47 -5
  16. package/launcher/bin/mailx-app-linux +0 -0
  17. package/launcher/bin/mailx-app.exe +0 -0
  18. package/launcher/builder/build-config.json +11 -0
  19. package/launcher/builder/postinstall.js +81 -0
  20. package/package.json +2 -4
  21. package/packages/mailx-api/index.js +125 -29
  22. package/packages/mailx-core/index.d.ts +129 -0
  23. package/packages/mailx-core/index.js +323 -0
  24. package/packages/mailx-core/ipc.d.ts +13 -0
  25. package/packages/mailx-core/ipc.js +56 -0
  26. package/packages/mailx-core/package.json +18 -0
  27. package/packages/mailx-imap/index.d.ts +7 -1
  28. package/packages/mailx-imap/index.js +89 -14
  29. package/packages/mailx-server/index.js +42 -31
  30. package/packages/mailx-server/package.json +1 -2
  31. package/packages/mailx-settings/index.d.ts +1 -1
  32. package/packages/mailx-settings/index.js +21 -12
  33. package/packages/mailx-store/db.d.ts +6 -2
  34. package/packages/mailx-store/db.js +78 -16
  35. package/packages/mailx-store/file-store.d.ts +2 -8
  36. package/packages/mailx-store/file-store.js +7 -31
  37. package/packages/mailx-types/index.d.ts +3 -1
  38. package/.tswalk.json +0 -7396
  39. package/launcher/release.cmd +0 -4
  40. package/mailx.json +0 -9
  41. package/packages/mailx-api/node_modules/nodemailer/.ncurc.js +0 -9
  42. package/packages/mailx-api/node_modules/nodemailer/.prettierignore +0 -8
  43. package/packages/mailx-api/node_modules/nodemailer/.prettierrc +0 -12
  44. package/packages/mailx-api/node_modules/nodemailer/.prettierrc.js +0 -10
  45. package/packages/mailx-api/node_modules/nodemailer/.release-please-config.json +0 -9
  46. package/packages/mailx-api/node_modules/nodemailer/LICENSE +0 -16
  47. package/packages/mailx-api/node_modules/nodemailer/README.md +0 -86
  48. package/packages/mailx-api/node_modules/nodemailer/SECURITY.txt +0 -22
  49. package/packages/mailx-api/node_modules/nodemailer/eslint.config.js +0 -88
  50. package/packages/mailx-api/node_modules/nodemailer/lib/addressparser/index.js +0 -383
  51. package/packages/mailx-api/node_modules/nodemailer/lib/base64/index.js +0 -139
  52. package/packages/mailx-api/node_modules/nodemailer/lib/dkim/index.js +0 -253
  53. package/packages/mailx-api/node_modules/nodemailer/lib/dkim/message-parser.js +0 -155
  54. package/packages/mailx-api/node_modules/nodemailer/lib/dkim/relaxed-body.js +0 -154
  55. package/packages/mailx-api/node_modules/nodemailer/lib/dkim/sign.js +0 -117
  56. package/packages/mailx-api/node_modules/nodemailer/lib/fetch/cookies.js +0 -281
  57. package/packages/mailx-api/node_modules/nodemailer/lib/fetch/index.js +0 -280
  58. package/packages/mailx-api/node_modules/nodemailer/lib/json-transport/index.js +0 -82
  59. package/packages/mailx-api/node_modules/nodemailer/lib/mail-composer/index.js +0 -629
  60. package/packages/mailx-api/node_modules/nodemailer/lib/mailer/index.js +0 -441
  61. package/packages/mailx-api/node_modules/nodemailer/lib/mailer/mail-message.js +0 -316
  62. package/packages/mailx-api/node_modules/nodemailer/lib/mime-funcs/index.js +0 -625
  63. package/packages/mailx-api/node_modules/nodemailer/lib/mime-funcs/mime-types.js +0 -2113
  64. package/packages/mailx-api/node_modules/nodemailer/lib/mime-node/index.js +0 -1316
  65. package/packages/mailx-api/node_modules/nodemailer/lib/mime-node/last-newline.js +0 -33
  66. package/packages/mailx-api/node_modules/nodemailer/lib/mime-node/le-unix.js +0 -43
  67. package/packages/mailx-api/node_modules/nodemailer/lib/mime-node/le-windows.js +0 -52
  68. package/packages/mailx-api/node_modules/nodemailer/lib/nodemailer.js +0 -157
  69. package/packages/mailx-api/node_modules/nodemailer/lib/punycode/index.js +0 -460
  70. package/packages/mailx-api/node_modules/nodemailer/lib/qp/index.js +0 -227
  71. package/packages/mailx-api/node_modules/nodemailer/lib/sendmail-transport/index.js +0 -210
  72. package/packages/mailx-api/node_modules/nodemailer/lib/ses-transport/index.js +0 -234
  73. package/packages/mailx-api/node_modules/nodemailer/lib/shared/index.js +0 -754
  74. package/packages/mailx-api/node_modules/nodemailer/lib/smtp-connection/data-stream.js +0 -108
  75. package/packages/mailx-api/node_modules/nodemailer/lib/smtp-connection/http-proxy-client.js +0 -143
  76. package/packages/mailx-api/node_modules/nodemailer/lib/smtp-connection/index.js +0 -1870
  77. package/packages/mailx-api/node_modules/nodemailer/lib/smtp-pool/index.js +0 -652
  78. package/packages/mailx-api/node_modules/nodemailer/lib/smtp-pool/pool-resource.js +0 -259
  79. package/packages/mailx-api/node_modules/nodemailer/lib/smtp-transport/index.js +0 -421
  80. package/packages/mailx-api/node_modules/nodemailer/lib/stream-transport/index.js +0 -135
  81. package/packages/mailx-api/node_modules/nodemailer/lib/well-known/index.js +0 -47
  82. package/packages/mailx-api/node_modules/nodemailer/lib/well-known/services.json +0 -611
  83. package/packages/mailx-api/node_modules/nodemailer/lib/xoauth2/index.js +0 -427
  84. package/packages/mailx-api/node_modules/nodemailer/package.json +0 -47
  85. package/packages/mailx-imap/node_modules/nodemailer/.ncurc.js +0 -9
  86. package/packages/mailx-imap/node_modules/nodemailer/.prettierignore +0 -8
  87. package/packages/mailx-imap/node_modules/nodemailer/.prettierrc +0 -12
  88. package/packages/mailx-imap/node_modules/nodemailer/.prettierrc.js +0 -10
  89. package/packages/mailx-imap/node_modules/nodemailer/.release-please-config.json +0 -9
  90. package/packages/mailx-imap/node_modules/nodemailer/LICENSE +0 -16
  91. package/packages/mailx-imap/node_modules/nodemailer/README.md +0 -86
  92. package/packages/mailx-imap/node_modules/nodemailer/SECURITY.txt +0 -22
  93. package/packages/mailx-imap/node_modules/nodemailer/eslint.config.js +0 -88
  94. package/packages/mailx-imap/node_modules/nodemailer/lib/addressparser/index.js +0 -383
  95. package/packages/mailx-imap/node_modules/nodemailer/lib/base64/index.js +0 -139
  96. package/packages/mailx-imap/node_modules/nodemailer/lib/dkim/index.js +0 -253
  97. package/packages/mailx-imap/node_modules/nodemailer/lib/dkim/message-parser.js +0 -155
  98. package/packages/mailx-imap/node_modules/nodemailer/lib/dkim/relaxed-body.js +0 -154
  99. package/packages/mailx-imap/node_modules/nodemailer/lib/dkim/sign.js +0 -117
  100. package/packages/mailx-imap/node_modules/nodemailer/lib/fetch/cookies.js +0 -281
  101. package/packages/mailx-imap/node_modules/nodemailer/lib/fetch/index.js +0 -280
  102. package/packages/mailx-imap/node_modules/nodemailer/lib/json-transport/index.js +0 -82
  103. package/packages/mailx-imap/node_modules/nodemailer/lib/mail-composer/index.js +0 -629
  104. package/packages/mailx-imap/node_modules/nodemailer/lib/mailer/index.js +0 -441
  105. package/packages/mailx-imap/node_modules/nodemailer/lib/mailer/mail-message.js +0 -316
  106. package/packages/mailx-imap/node_modules/nodemailer/lib/mime-funcs/index.js +0 -625
  107. package/packages/mailx-imap/node_modules/nodemailer/lib/mime-funcs/mime-types.js +0 -2113
  108. package/packages/mailx-imap/node_modules/nodemailer/lib/mime-node/index.js +0 -1316
  109. package/packages/mailx-imap/node_modules/nodemailer/lib/mime-node/last-newline.js +0 -33
  110. package/packages/mailx-imap/node_modules/nodemailer/lib/mime-node/le-unix.js +0 -43
  111. package/packages/mailx-imap/node_modules/nodemailer/lib/mime-node/le-windows.js +0 -52
  112. package/packages/mailx-imap/node_modules/nodemailer/lib/nodemailer.js +0 -157
  113. package/packages/mailx-imap/node_modules/nodemailer/lib/punycode/index.js +0 -460
  114. package/packages/mailx-imap/node_modules/nodemailer/lib/qp/index.js +0 -227
  115. package/packages/mailx-imap/node_modules/nodemailer/lib/sendmail-transport/index.js +0 -210
  116. package/packages/mailx-imap/node_modules/nodemailer/lib/ses-transport/index.js +0 -234
  117. package/packages/mailx-imap/node_modules/nodemailer/lib/shared/index.js +0 -754
  118. package/packages/mailx-imap/node_modules/nodemailer/lib/smtp-connection/data-stream.js +0 -108
  119. package/packages/mailx-imap/node_modules/nodemailer/lib/smtp-connection/http-proxy-client.js +0 -143
  120. package/packages/mailx-imap/node_modules/nodemailer/lib/smtp-connection/index.js +0 -1870
  121. package/packages/mailx-imap/node_modules/nodemailer/lib/smtp-pool/index.js +0 -652
  122. package/packages/mailx-imap/node_modules/nodemailer/lib/smtp-pool/pool-resource.js +0 -259
  123. package/packages/mailx-imap/node_modules/nodemailer/lib/smtp-transport/index.js +0 -421
  124. package/packages/mailx-imap/node_modules/nodemailer/lib/stream-transport/index.js +0 -135
  125. package/packages/mailx-imap/node_modules/nodemailer/lib/well-known/index.js +0 -47
  126. package/packages/mailx-imap/node_modules/nodemailer/lib/well-known/services.json +0 -611
  127. package/packages/mailx-imap/node_modules/nodemailer/lib/xoauth2/index.js +0 -427
  128. package/packages/mailx-imap/node_modules/nodemailer/package.json +0 -47
  129. package/packages/mailx-send/node_modules/nodemailer/.ncurc.js +0 -9
  130. package/packages/mailx-send/node_modules/nodemailer/.prettierignore +0 -8
  131. package/packages/mailx-send/node_modules/nodemailer/.prettierrc +0 -12
  132. package/packages/mailx-send/node_modules/nodemailer/.prettierrc.js +0 -10
  133. package/packages/mailx-send/node_modules/nodemailer/.release-please-config.json +0 -9
  134. package/packages/mailx-send/node_modules/nodemailer/LICENSE +0 -16
  135. package/packages/mailx-send/node_modules/nodemailer/README.md +0 -86
  136. package/packages/mailx-send/node_modules/nodemailer/SECURITY.txt +0 -22
  137. package/packages/mailx-send/node_modules/nodemailer/eslint.config.js +0 -88
  138. package/packages/mailx-send/node_modules/nodemailer/lib/addressparser/index.js +0 -383
  139. package/packages/mailx-send/node_modules/nodemailer/lib/base64/index.js +0 -139
  140. package/packages/mailx-send/node_modules/nodemailer/lib/dkim/index.js +0 -253
  141. package/packages/mailx-send/node_modules/nodemailer/lib/dkim/message-parser.js +0 -155
  142. package/packages/mailx-send/node_modules/nodemailer/lib/dkim/relaxed-body.js +0 -154
  143. package/packages/mailx-send/node_modules/nodemailer/lib/dkim/sign.js +0 -117
  144. package/packages/mailx-send/node_modules/nodemailer/lib/fetch/cookies.js +0 -281
  145. package/packages/mailx-send/node_modules/nodemailer/lib/fetch/index.js +0 -280
  146. package/packages/mailx-send/node_modules/nodemailer/lib/json-transport/index.js +0 -82
  147. package/packages/mailx-send/node_modules/nodemailer/lib/mail-composer/index.js +0 -629
  148. package/packages/mailx-send/node_modules/nodemailer/lib/mailer/index.js +0 -441
  149. package/packages/mailx-send/node_modules/nodemailer/lib/mailer/mail-message.js +0 -316
  150. package/packages/mailx-send/node_modules/nodemailer/lib/mime-funcs/index.js +0 -625
  151. package/packages/mailx-send/node_modules/nodemailer/lib/mime-funcs/mime-types.js +0 -2113
  152. package/packages/mailx-send/node_modules/nodemailer/lib/mime-node/index.js +0 -1316
  153. package/packages/mailx-send/node_modules/nodemailer/lib/mime-node/last-newline.js +0 -33
  154. package/packages/mailx-send/node_modules/nodemailer/lib/mime-node/le-unix.js +0 -43
  155. package/packages/mailx-send/node_modules/nodemailer/lib/mime-node/le-windows.js +0 -52
  156. package/packages/mailx-send/node_modules/nodemailer/lib/nodemailer.js +0 -157
  157. package/packages/mailx-send/node_modules/nodemailer/lib/punycode/index.js +0 -460
  158. package/packages/mailx-send/node_modules/nodemailer/lib/qp/index.js +0 -227
  159. package/packages/mailx-send/node_modules/nodemailer/lib/sendmail-transport/index.js +0 -210
  160. package/packages/mailx-send/node_modules/nodemailer/lib/ses-transport/index.js +0 -234
  161. package/packages/mailx-send/node_modules/nodemailer/lib/shared/index.js +0 -754
  162. package/packages/mailx-send/node_modules/nodemailer/lib/smtp-connection/data-stream.js +0 -108
  163. package/packages/mailx-send/node_modules/nodemailer/lib/smtp-connection/http-proxy-client.js +0 -143
  164. package/packages/mailx-send/node_modules/nodemailer/lib/smtp-connection/index.js +0 -1870
  165. package/packages/mailx-send/node_modules/nodemailer/lib/smtp-pool/index.js +0 -652
  166. package/packages/mailx-send/node_modules/nodemailer/lib/smtp-pool/pool-resource.js +0 -259
  167. package/packages/mailx-send/node_modules/nodemailer/lib/smtp-transport/index.js +0 -421
  168. package/packages/mailx-send/node_modules/nodemailer/lib/stream-transport/index.js +0 -135
  169. package/packages/mailx-send/node_modules/nodemailer/lib/well-known/index.js +0 -47
  170. package/packages/mailx-send/node_modules/nodemailer/lib/well-known/services.json +0 -611
  171. package/packages/mailx-send/node_modules/nodemailer/lib/xoauth2/index.js +0 -427
  172. 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: oklch(0.82 0.06 240); /* DEBUG: light blue toolbar */
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-text);
29
+ color: var(--color-brand-dark);
30
30
  font-size: var(--font-size-sm);
31
- font-weight: 600;
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: 600;
103
- font-size: var(--font-size-sm);
104
- color: var(--color-text-muted);
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
- color: var(--color-text);
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: 600;
199
- color: var(--color-text-muted);
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-bg-selected); color: var(--color-unread); }
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
- background: oklch(0.45 0.12 60);
297
- color: white;
298
- font-size: var(--font-size-sm);
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-y: auto;
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
+ }
@@ -24,7 +24,8 @@ body {
24
24
  }
25
25
 
26
26
  .toolbar { grid-area: toolbar; }
27
- .folder-tree { grid-area: folders; }
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
@@ -0,0 +1,6 @@
1
+ @echo off
2
+ REM Kill mailx server (port 9333) and launcher window
3
+ REM Safe: only kills mailx processes, never all node.exe
4
+
5
+ taskkill /F /IM mailx-app.exe >nul 2>&1 && echo Killed mailx-app.exe || echo mailx-app.exe not running
6
+ killport 9333
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
- # Try pre-built binary first, then dev build
14
- $exe = "$PSScriptRoot\launcher\bin\mailx-app.exe"
15
- if (-not (Test-Path $exe)) {
16
- $exe = "$PSScriptRoot\launcher\target\debug\mailx-app.exe"
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,11 @@
1
+ {
2
+ "platforms": {
3
+ "windows": true,
4
+ "wsl": true,
5
+ "arm64": false
6
+ },
7
+ "options": {
8
+ "release": true,
9
+ "verbose": true
10
+ }
11
+ }
@@ -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.12",
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 bin/postinstall.js"
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",