@bobfrankston/rmfmail 1.0.467

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 (330) hide show
  1. package/README.md +429 -0
  2. package/bin/build-icon-ico.js +283 -0
  3. package/bin/lean-accounts.js +172 -0
  4. package/bin/mailx.js +1580 -0
  5. package/bin/mailx.js.map +1 -0
  6. package/bin/mailx.ts +1549 -0
  7. package/bin/postinstall.js +39 -0
  8. package/bin/postinstall.js.map +1 -0
  9. package/bin/postinstall.ts +41 -0
  10. package/bin/tsconfig.json +10 -0
  11. package/client/.gitattributes +10 -0
  12. package/client/.msger-window.json +1 -0
  13. package/client/android.html +226 -0
  14. package/client/app.js +3400 -0
  15. package/client/app.js.map +1 -0
  16. package/client/app.ts +3190 -0
  17. package/client/components/address-book.js +199 -0
  18. package/client/components/address-book.js.map +1 -0
  19. package/client/components/address-book.ts +204 -0
  20. package/client/components/alarms.js +299 -0
  21. package/client/components/alarms.js.map +1 -0
  22. package/client/components/alarms.ts +276 -0
  23. package/client/components/calendar-sidebar.js +508 -0
  24. package/client/components/calendar-sidebar.js.map +1 -0
  25. package/client/components/calendar-sidebar.ts +474 -0
  26. package/client/components/calendar.js +217 -0
  27. package/client/components/calendar.js.map +1 -0
  28. package/client/components/calendar.ts +211 -0
  29. package/client/components/context-menu.js +80 -0
  30. package/client/components/context-menu.js.map +1 -0
  31. package/client/components/context-menu.ts +95 -0
  32. package/client/components/folder-picker.js +119 -0
  33. package/client/components/folder-picker.js.map +1 -0
  34. package/client/components/folder-picker.ts +127 -0
  35. package/client/components/folder-tree.js +1093 -0
  36. package/client/components/folder-tree.js.map +1 -0
  37. package/client/components/folder-tree.ts +1069 -0
  38. package/client/components/message-list.js +1140 -0
  39. package/client/components/message-list.js.map +1 -0
  40. package/client/components/message-list.ts +1129 -0
  41. package/client/components/message-viewer.js +1291 -0
  42. package/client/components/message-viewer.js.map +1 -0
  43. package/client/components/message-viewer.ts +1257 -0
  44. package/client/components/outbox-view.js +104 -0
  45. package/client/components/outbox-view.js.map +1 -0
  46. package/client/components/outbox-view.ts +102 -0
  47. package/client/components/tasks.js +261 -0
  48. package/client/components/tasks.js.map +1 -0
  49. package/client/components/tasks.ts +234 -0
  50. package/client/compose/compose.css +560 -0
  51. package/client/compose/compose.html +52 -0
  52. package/client/compose/compose.js +1289 -0
  53. package/client/compose/compose.js.map +1 -0
  54. package/client/compose/compose.ts +1231 -0
  55. package/client/compose/editor.js +616 -0
  56. package/client/compose/editor.js.map +1 -0
  57. package/client/compose/editor.ts +599 -0
  58. package/client/compose/ghost-text.js +122 -0
  59. package/client/compose/ghost-text.js.map +1 -0
  60. package/client/compose/ghost-text.ts +140 -0
  61. package/client/favicon.svg +11 -0
  62. package/client/icon.ico +0 -0
  63. package/client/icon.png +0 -0
  64. package/client/index.html +230 -0
  65. package/client/lib/android-bootstrap.js +9 -0
  66. package/client/lib/android-bootstrap.js.map +1 -0
  67. package/client/lib/android-bootstrap.ts +9 -0
  68. package/client/lib/api-client.js +378 -0
  69. package/client/lib/api-client.js.map +1 -0
  70. package/client/lib/api-client.ts +439 -0
  71. package/client/lib/local-service.js +603 -0
  72. package/client/lib/local-service.js.map +1 -0
  73. package/client/lib/local-service.ts +646 -0
  74. package/client/lib/local-store.js +214 -0
  75. package/client/lib/local-store.js.map +1 -0
  76. package/client/lib/local-store.ts +283 -0
  77. package/client/lib/mailxapi.js +304 -0
  78. package/client/lib/message-state.js +132 -0
  79. package/client/lib/message-state.js.map +1 -0
  80. package/client/lib/message-state.ts +160 -0
  81. package/client/package.json +16 -0
  82. package/client/styles/components.css +2049 -0
  83. package/client/styles/layout.css +332 -0
  84. package/client/styles/variables.css +85 -0
  85. package/client/tsconfig.json +19 -0
  86. package/package.json +124 -0
  87. package/packages/mailx-api/.gitattributes +10 -0
  88. package/packages/mailx-api/index.d.ts +10 -0
  89. package/packages/mailx-api/index.d.ts.map +1 -0
  90. package/packages/mailx-api/index.js +322 -0
  91. package/packages/mailx-api/index.js.map +1 -0
  92. package/packages/mailx-api/index.ts +283 -0
  93. package/packages/mailx-api/package.json +27 -0
  94. package/packages/mailx-api/tsconfig.json +9 -0
  95. package/packages/mailx-api/tsconfig.tsbuildinfo +1 -0
  96. package/packages/mailx-compose/.gitattributes +10 -0
  97. package/packages/mailx-compose/index.d.ts +21 -0
  98. package/packages/mailx-compose/index.d.ts.map +1 -0
  99. package/packages/mailx-compose/index.js +61 -0
  100. package/packages/mailx-compose/index.js.map +1 -0
  101. package/packages/mailx-compose/index.ts +85 -0
  102. package/packages/mailx-compose/package.json +18 -0
  103. package/packages/mailx-compose/tsconfig.json +9 -0
  104. package/packages/mailx-core/index.d.ts +139 -0
  105. package/packages/mailx-core/index.d.ts.map +1 -0
  106. package/packages/mailx-core/index.js +403 -0
  107. package/packages/mailx-core/index.js.map +1 -0
  108. package/packages/mailx-core/index.ts +424 -0
  109. package/packages/mailx-core/ipc.d.ts +13 -0
  110. package/packages/mailx-core/ipc.d.ts.map +1 -0
  111. package/packages/mailx-core/ipc.js +56 -0
  112. package/packages/mailx-core/ipc.js.map +1 -0
  113. package/packages/mailx-core/ipc.ts +62 -0
  114. package/packages/mailx-core/package.json +18 -0
  115. package/packages/mailx-core/tsconfig.json +9 -0
  116. package/packages/mailx-host/.gitattributes +10 -0
  117. package/packages/mailx-host/index.d.ts +21 -0
  118. package/packages/mailx-host/index.d.ts.map +1 -0
  119. package/packages/mailx-host/index.js +29 -0
  120. package/packages/mailx-host/index.js.map +1 -0
  121. package/packages/mailx-host/index.ts +38 -0
  122. package/packages/mailx-host/package.json +23 -0
  123. package/packages/mailx-host/tsconfig.json +9 -0
  124. package/packages/mailx-host/types-shim.d.ts +14 -0
  125. package/packages/mailx-imap/.gitattributes +10 -0
  126. package/packages/mailx-imap/index.d.ts +442 -0
  127. package/packages/mailx-imap/index.d.ts.map +1 -0
  128. package/packages/mailx-imap/index.js +3684 -0
  129. package/packages/mailx-imap/index.js.map +1 -0
  130. package/packages/mailx-imap/index.ts +3652 -0
  131. package/packages/mailx-imap/package-lock.json +131 -0
  132. package/packages/mailx-imap/package.json +28 -0
  133. package/packages/mailx-imap/providers/gmail-api.d.ts +8 -0
  134. package/packages/mailx-imap/providers/gmail-api.d.ts.map +1 -0
  135. package/packages/mailx-imap/providers/gmail-api.js +8 -0
  136. package/packages/mailx-imap/providers/gmail-api.js.map +1 -0
  137. package/packages/mailx-imap/providers/gmail-api.ts +8 -0
  138. package/packages/mailx-imap/providers/outlook-api.ts +7 -0
  139. package/packages/mailx-imap/providers/types.d.ts +9 -0
  140. package/packages/mailx-imap/providers/types.d.ts.map +1 -0
  141. package/packages/mailx-imap/providers/types.js +9 -0
  142. package/packages/mailx-imap/providers/types.js.map +1 -0
  143. package/packages/mailx-imap/providers/types.ts +9 -0
  144. package/packages/mailx-imap/tsconfig.json +9 -0
  145. package/packages/mailx-imap/tsconfig.tsbuildinfo +1 -0
  146. package/packages/mailx-send/.gitattributes +10 -0
  147. package/packages/mailx-send/README.md +217 -0
  148. package/packages/mailx-send/cli-queue.d.ts +11 -0
  149. package/packages/mailx-send/cli-queue.d.ts.map +1 -0
  150. package/packages/mailx-send/cli-queue.js +59 -0
  151. package/packages/mailx-send/cli-queue.js.map +1 -0
  152. package/packages/mailx-send/cli-queue.ts +62 -0
  153. package/packages/mailx-send/cli-send.d.ts +17 -0
  154. package/packages/mailx-send/cli-send.d.ts.map +1 -0
  155. package/packages/mailx-send/cli-send.js +75 -0
  156. package/packages/mailx-send/cli-send.js.map +1 -0
  157. package/packages/mailx-send/cli-send.ts +83 -0
  158. package/packages/mailx-send/cli.d.ts +22 -0
  159. package/packages/mailx-send/cli.d.ts.map +1 -0
  160. package/packages/mailx-send/cli.js +115 -0
  161. package/packages/mailx-send/cli.js.map +1 -0
  162. package/packages/mailx-send/cli.ts +126 -0
  163. package/packages/mailx-send/index.d.ts +77 -0
  164. package/packages/mailx-send/index.d.ts.map +1 -0
  165. package/packages/mailx-send/index.js +264 -0
  166. package/packages/mailx-send/index.js.map +1 -0
  167. package/packages/mailx-send/index.ts +333 -0
  168. package/packages/mailx-send/mailsend/README.md +133 -0
  169. package/packages/mailx-send/mailsend/cli.d.ts +12 -0
  170. package/packages/mailx-send/mailsend/cli.d.ts.map +1 -0
  171. package/packages/mailx-send/mailsend/cli.js +70 -0
  172. package/packages/mailx-send/mailsend/cli.js.map +1 -0
  173. package/packages/mailx-send/mailsend/cli.ts +81 -0
  174. package/packages/mailx-send/mailsend/index.d.ts +77 -0
  175. package/packages/mailx-send/mailsend/index.d.ts.map +1 -0
  176. package/packages/mailx-send/mailsend/index.js +264 -0
  177. package/packages/mailx-send/mailsend/index.js.map +1 -0
  178. package/packages/mailx-send/mailsend/index.ts +333 -0
  179. package/packages/mailx-send/mailsend/package-lock.json +65 -0
  180. package/packages/mailx-send/mailsend/package.json +26 -0
  181. package/packages/mailx-send/mailsend/tsconfig.json +21 -0
  182. package/packages/mailx-send/package-lock.json +65 -0
  183. package/packages/mailx-send/package.json +37 -0
  184. package/packages/mailx-send/tsconfig.json +21 -0
  185. package/packages/mailx-server/.gitattributes +10 -0
  186. package/packages/mailx-server/index.d.ts +8 -0
  187. package/packages/mailx-server/index.d.ts.map +1 -0
  188. package/packages/mailx-server/index.js +397 -0
  189. package/packages/mailx-server/index.js.map +1 -0
  190. package/packages/mailx-server/index.ts +429 -0
  191. package/packages/mailx-server/package.json +28 -0
  192. package/packages/mailx-server/tsconfig.json +9 -0
  193. package/packages/mailx-server/tsconfig.tsbuildinfo +1 -0
  194. package/packages/mailx-service/google-sync.d.ts +96 -0
  195. package/packages/mailx-service/google-sync.d.ts.map +1 -0
  196. package/packages/mailx-service/google-sync.js +153 -0
  197. package/packages/mailx-service/google-sync.js.map +1 -0
  198. package/packages/mailx-service/google-sync.ts +238 -0
  199. package/packages/mailx-service/index.d.ts +366 -0
  200. package/packages/mailx-service/index.d.ts.map +1 -0
  201. package/packages/mailx-service/index.js +2589 -0
  202. package/packages/mailx-service/index.js.map +1 -0
  203. package/packages/mailx-service/index.ts +2512 -0
  204. package/packages/mailx-service/jsonrpc.d.ts +25 -0
  205. package/packages/mailx-service/jsonrpc.d.ts.map +1 -0
  206. package/packages/mailx-service/jsonrpc.js +238 -0
  207. package/packages/mailx-service/jsonrpc.js.map +1 -0
  208. package/packages/mailx-service/jsonrpc.ts +268 -0
  209. package/packages/mailx-service/package.json +22 -0
  210. package/packages/mailx-service/tsconfig.json +9 -0
  211. package/packages/mailx-settings/.gitattributes +10 -0
  212. package/packages/mailx-settings/cloud.d.ts +47 -0
  213. package/packages/mailx-settings/cloud.d.ts.map +1 -0
  214. package/packages/mailx-settings/cloud.js +408 -0
  215. package/packages/mailx-settings/cloud.js.map +1 -0
  216. package/packages/mailx-settings/cloud.ts +393 -0
  217. package/packages/mailx-settings/index.d.ts +140 -0
  218. package/packages/mailx-settings/index.d.ts.map +1 -0
  219. package/packages/mailx-settings/index.js +872 -0
  220. package/packages/mailx-settings/index.js.map +1 -0
  221. package/packages/mailx-settings/index.ts +908 -0
  222. package/packages/mailx-settings/package.json +20 -0
  223. package/packages/mailx-settings/tsconfig.json +9 -0
  224. package/packages/mailx-settings/tsconfig.tsbuildinfo +1 -0
  225. package/packages/mailx-store/.gitattributes +10 -0
  226. package/packages/mailx-store/db.d.ts +346 -0
  227. package/packages/mailx-store/db.d.ts.map +1 -0
  228. package/packages/mailx-store/db.js +1796 -0
  229. package/packages/mailx-store/db.js.map +1 -0
  230. package/packages/mailx-store/db.ts +2007 -0
  231. package/packages/mailx-store/file-store.d.ts +36 -0
  232. package/packages/mailx-store/file-store.d.ts.map +1 -0
  233. package/packages/mailx-store/file-store.js +80 -0
  234. package/packages/mailx-store/file-store.js.map +1 -0
  235. package/packages/mailx-store/file-store.ts +82 -0
  236. package/packages/mailx-store/index.d.ts +7 -0
  237. package/packages/mailx-store/index.d.ts.map +1 -0
  238. package/packages/mailx-store/index.js +7 -0
  239. package/packages/mailx-store/index.js.map +1 -0
  240. package/packages/mailx-store/index.ts +7 -0
  241. package/packages/mailx-store/package.json +19 -0
  242. package/packages/mailx-store/tsconfig.json +9 -0
  243. package/packages/mailx-store/tsconfig.tsbuildinfo +1 -0
  244. package/packages/mailx-store-web/android-bootstrap.d.ts +16 -0
  245. package/packages/mailx-store-web/android-bootstrap.d.ts.map +1 -0
  246. package/packages/mailx-store-web/android-bootstrap.js +1247 -0
  247. package/packages/mailx-store-web/android-bootstrap.js.map +1 -0
  248. package/packages/mailx-store-web/android-bootstrap.ts +1262 -0
  249. package/packages/mailx-store-web/db.d.ts +132 -0
  250. package/packages/mailx-store-web/db.d.ts.map +1 -0
  251. package/packages/mailx-store-web/db.js +642 -0
  252. package/packages/mailx-store-web/db.js.map +1 -0
  253. package/packages/mailx-store-web/db.ts +756 -0
  254. package/packages/mailx-store-web/gmail-api-web.d.ts +11 -0
  255. package/packages/mailx-store-web/gmail-api-web.d.ts.map +1 -0
  256. package/packages/mailx-store-web/gmail-api-web.js +11 -0
  257. package/packages/mailx-store-web/gmail-api-web.js.map +1 -0
  258. package/packages/mailx-store-web/gmail-api-web.ts +11 -0
  259. package/packages/mailx-store-web/imap-web-provider.d.ts +33 -0
  260. package/packages/mailx-store-web/imap-web-provider.d.ts.map +1 -0
  261. package/packages/mailx-store-web/imap-web-provider.js +140 -0
  262. package/packages/mailx-store-web/imap-web-provider.js.map +1 -0
  263. package/packages/mailx-store-web/imap-web-provider.ts +156 -0
  264. package/packages/mailx-store-web/index.d.ts +10 -0
  265. package/packages/mailx-store-web/index.d.ts.map +1 -0
  266. package/packages/mailx-store-web/index.js +10 -0
  267. package/packages/mailx-store-web/index.js.map +1 -0
  268. package/packages/mailx-store-web/index.ts +10 -0
  269. package/packages/mailx-store-web/main-thread-host.d.ts +15 -0
  270. package/packages/mailx-store-web/main-thread-host.d.ts.map +1 -0
  271. package/packages/mailx-store-web/main-thread-host.js +292 -0
  272. package/packages/mailx-store-web/main-thread-host.js.map +1 -0
  273. package/packages/mailx-store-web/main-thread-host.ts +322 -0
  274. package/packages/mailx-store-web/package.json +23 -0
  275. package/packages/mailx-store-web/provider-types.d.ts +7 -0
  276. package/packages/mailx-store-web/provider-types.d.ts.map +1 -0
  277. package/packages/mailx-store-web/provider-types.js +7 -0
  278. package/packages/mailx-store-web/provider-types.js.map +1 -0
  279. package/packages/mailx-store-web/provider-types.ts +7 -0
  280. package/packages/mailx-store-web/sql-wasm-esm.js +10 -0
  281. package/packages/mailx-store-web/sql.js.d.ts +29 -0
  282. package/packages/mailx-store-web/sync-manager.d.ts +68 -0
  283. package/packages/mailx-store-web/sync-manager.d.ts.map +1 -0
  284. package/packages/mailx-store-web/sync-manager.js +506 -0
  285. package/packages/mailx-store-web/sync-manager.js.map +1 -0
  286. package/packages/mailx-store-web/sync-manager.ts +508 -0
  287. package/packages/mailx-store-web/tsconfig.json +10 -0
  288. package/packages/mailx-store-web/web-jsonrpc.d.ts +20 -0
  289. package/packages/mailx-store-web/web-jsonrpc.d.ts.map +1 -0
  290. package/packages/mailx-store-web/web-jsonrpc.js +102 -0
  291. package/packages/mailx-store-web/web-jsonrpc.js.map +1 -0
  292. package/packages/mailx-store-web/web-jsonrpc.ts +116 -0
  293. package/packages/mailx-store-web/web-message-store.d.ts +16 -0
  294. package/packages/mailx-store-web/web-message-store.d.ts.map +1 -0
  295. package/packages/mailx-store-web/web-message-store.js +89 -0
  296. package/packages/mailx-store-web/web-message-store.js.map +1 -0
  297. package/packages/mailx-store-web/web-message-store.ts +97 -0
  298. package/packages/mailx-store-web/web-service.d.ts +111 -0
  299. package/packages/mailx-store-web/web-service.d.ts.map +1 -0
  300. package/packages/mailx-store-web/web-service.js +542 -0
  301. package/packages/mailx-store-web/web-service.js.map +1 -0
  302. package/packages/mailx-store-web/web-service.ts +616 -0
  303. package/packages/mailx-store-web/web-settings.d.ts +83 -0
  304. package/packages/mailx-store-web/web-settings.d.ts.map +1 -0
  305. package/packages/mailx-store-web/web-settings.js +491 -0
  306. package/packages/mailx-store-web/web-settings.js.map +1 -0
  307. package/packages/mailx-store-web/web-settings.ts +522 -0
  308. package/packages/mailx-store-web/worker-bundle.js +6838 -0
  309. package/packages/mailx-store-web/worker-entry.d.ts +8 -0
  310. package/packages/mailx-store-web/worker-entry.d.ts.map +1 -0
  311. package/packages/mailx-store-web/worker-entry.js +187 -0
  312. package/packages/mailx-store-web/worker-entry.js.map +1 -0
  313. package/packages/mailx-store-web/worker-entry.ts +215 -0
  314. package/packages/mailx-store-web/worker-tcp-transport.d.ts +28 -0
  315. package/packages/mailx-store-web/worker-tcp-transport.d.ts.map +1 -0
  316. package/packages/mailx-store-web/worker-tcp-transport.js +98 -0
  317. package/packages/mailx-store-web/worker-tcp-transport.js.map +1 -0
  318. package/packages/mailx-store-web/worker-tcp-transport.ts +101 -0
  319. package/packages/mailx-types/.gitattributes +10 -0
  320. package/packages/mailx-types/index.d.ts +319 -0
  321. package/packages/mailx-types/index.d.ts.map +1 -0
  322. package/packages/mailx-types/index.js +243 -0
  323. package/packages/mailx-types/index.js.map +1 -0
  324. package/packages/mailx-types/index.ts +498 -0
  325. package/packages/mailx-types/package.json +16 -0
  326. package/packages/mailx-types/tsconfig.json +9 -0
  327. package/packages/mailx-types/tsconfig.tsbuildinfo +1 -0
  328. package/todo.json +13 -0
  329. package/tsconfig.base.json +31 -0
  330. package/tsconfig.json +9 -0
@@ -0,0 +1,332 @@
1
+ /* mailx layout -- CSS Grid adaptive structure */
2
+
3
+ *, *::before, *::after {
4
+ box-sizing: border-box;
5
+ margin: 0;
6
+ padding: 0;
7
+ }
8
+
9
+ body {
10
+ display: grid;
11
+ /* rail | folders | main */
12
+ grid-template-columns: var(--rail-width, 48px) var(--folder-width) 1fr;
13
+ grid-template-rows: var(--toolbar-height) auto 1fr var(--statusbar-height);
14
+ grid-template-areas:
15
+ "toolbar toolbar toolbar"
16
+ "alert alert alert"
17
+ "rail folders main"
18
+ "status status status";
19
+ height: 100vh;
20
+ overflow: hidden;
21
+ font-family: var(--font-ui);
22
+ font-size: var(--font-size-base);
23
+ line-height: var(--line-height);
24
+ color: var(--color-text);
25
+ background: var(--color-bg);
26
+ }
27
+
28
+ /* When the calendar sidebar is on, re-flow the grid to reserve a fourth
29
+ column on the right. When off, no column is reserved — the aside is
30
+ display:none and the grid stays three-column. */
31
+ body.calendar-sidebar-on {
32
+ grid-template-columns: var(--rail-width, 48px) var(--folder-width) 1fr var(--cal-side-width, 280px);
33
+ grid-template-areas:
34
+ "toolbar toolbar toolbar toolbar"
35
+ "alert alert alert alert"
36
+ "rail folders main cal-side"
37
+ "status status status status";
38
+ }
39
+
40
+ .toolbar { grid-area: toolbar; }
41
+ .icon-rail { grid-area: rail; }
42
+ .folder-panel { grid-area: folders; display: flex; flex-direction: column; overflow: hidden; }
43
+ .folder-tree { flex: 1; overflow-y: auto; }
44
+ .main-area { grid-area: main; }
45
+ .status-bar { grid-area: status; }
46
+
47
+ /* Vertical icon rail — Thunderbird Supernova style: dark background with
48
+ light icons so the rail reads as "chrome" and contrasts visibly against
49
+ the content area (whether the app's in light or dark theme). Always
50
+ visible on wide+medium tiers; hidden on narrow (icons fold into
51
+ hamburger — TBD). */
52
+ .icon-rail {
53
+ display: flex;
54
+ flex-direction: column;
55
+ justify-content: space-between;
56
+ background: oklch(0.25 0.01 250);
57
+ border-right: 1px solid oklch(0.18 0.01 250);
58
+ padding: 6px 0;
59
+ overflow: hidden;
60
+ }
61
+ .rail-top, .rail-bottom {
62
+ display: flex;
63
+ flex-direction: column;
64
+ gap: 2px;
65
+ }
66
+ .rail-btn {
67
+ display: flex;
68
+ align-items: center;
69
+ justify-content: center;
70
+ width: var(--rail-width, 48px);
71
+ height: 38px;
72
+ border: 0;
73
+ background: transparent;
74
+ cursor: pointer;
75
+ font-size: 16px;
76
+ color: oklch(0.88 0.01 250);
77
+ border-left: 3px solid transparent;
78
+ transition: background 0.12s, border-color 0.12s, color 0.12s;
79
+ }
80
+ .rail-btn:hover:not([disabled]) {
81
+ background: oklch(0.32 0.02 250);
82
+ color: oklch(0.96 0.01 250);
83
+ }
84
+ .rail-btn[data-active="true"] {
85
+ background: oklch(0.35 0.03 250);
86
+ color: oklch(0.98 0.01 250);
87
+ border-left-color: var(--color-accent, #4a9cff);
88
+ }
89
+ .rail-btn[disabled] {
90
+ color: oklch(0.55 0.01 250);
91
+ }
92
+ .rail-btn { position: relative; }
93
+ .rail-badge {
94
+ position: absolute;
95
+ top: 3px;
96
+ right: 6px;
97
+ min-width: 18px;
98
+ padding: 1px 4px;
99
+ border-radius: 9px;
100
+ background: oklch(0.65 0.22 25);
101
+ color: #fff;
102
+ font-size: 10px;
103
+ font-weight: 600;
104
+ line-height: 1.4;
105
+ text-align: center;
106
+ font-variant-numeric: tabular-nums;
107
+ pointer-events: none;
108
+ }
109
+ .rail-btn[disabled] {
110
+ opacity: 0.35;
111
+ cursor: not-allowed;
112
+ }
113
+
114
+ /* Main area: message list left, viewer right, vertical splitter */
115
+ .main-area {
116
+ display: grid;
117
+ grid-template-columns: var(--list-viewer-split) var(--splitter-size) 1fr;
118
+ grid-template-rows: 1fr;
119
+ overflow: hidden;
120
+ }
121
+
122
+ /* Preview pane hidden */
123
+ .main-area.no-preview {
124
+ grid-template-columns: 1fr;
125
+ }
126
+ .main-area.no-preview .splitter,
127
+ .main-area.no-preview .message-viewer { display: none; }
128
+ .main-area.no-preview .message-list { border-right: none; }
129
+
130
+ /* Full-screen viewer mode (mobile/Android) — viewer takes the whole app
131
+ surface; folder rail, folder tree, message list and statusbar are hidden.
132
+ Toggle via `body.viewer-fullscreen` from the pop-out / full-screen button.
133
+ On desktop the same button instead spawns a floating overlay (handled in
134
+ message-viewer.ts) and never sets this class. */
135
+ body.viewer-fullscreen .folder-rail,
136
+ body.viewer-fullscreen .folder-tree,
137
+ body.viewer-fullscreen .message-list,
138
+ body.viewer-fullscreen .splitter,
139
+ body.viewer-fullscreen .toolbar,
140
+ body.viewer-fullscreen .statusbar { display: none !important; }
141
+ body.viewer-fullscreen .main-area {
142
+ grid-template-columns: 1fr !important;
143
+ grid-template-rows: 1fr !important;
144
+ }
145
+ body.viewer-fullscreen .message-viewer {
146
+ display: flex !important;
147
+ grid-column: 1 / -1 !important;
148
+ }
149
+
150
+ /* Splitter */
151
+ .splitter {
152
+ background: var(--color-border);
153
+ cursor: col-resize;
154
+ transition: background 0.15s;
155
+ }
156
+ .splitter:hover, .splitter:active {
157
+ background: var(--color-accent);
158
+ }
159
+
160
+ /* Responsive: mid-width (tablets, foldables) — keep rail + list + viewer; folders overlay.
161
+ Calendar sidebar is hidden in this tier by its own media query, and the
162
+ body grid does NOT include a cal-side column here — the .calendar-sidebar-on
163
+ body class override above is shadowed by this mid-width rule. */
164
+ @media (max-width: 1100px) and (min-width: 769px) {
165
+ body,
166
+ body.calendar-sidebar-on {
167
+ grid-template-columns: var(--rail-width, 48px) 1fr;
168
+ grid-template-rows: var(--toolbar-height) auto 1fr var(--statusbar-height);
169
+ grid-template-areas:
170
+ "toolbar toolbar"
171
+ "alert alert"
172
+ "rail main"
173
+ "status status";
174
+ }
175
+
176
+ /* Folder panel: FULLY off-screen when closed — previously `calc(48px -
177
+ 280px) = -232px` left a 48 px tail showing behind the rail, which on
178
+ Android (where the rail isn't always rendered) leaked a strip of
179
+ folder-row badges at the left edge of the viewport. Now the closed
180
+ panel is flush off-screen at `-280px` and the `.open` slide-in starts
181
+ at the rail's right edge. */
182
+ .folder-panel {
183
+ position: fixed;
184
+ left: -280px;
185
+ top: var(--toolbar-height);
186
+ bottom: var(--statusbar-height);
187
+ width: 280px;
188
+ z-index: 50;
189
+ transition: left 0.2s ease;
190
+ background: var(--color-bg);
191
+ border-right: 1px solid var(--color-border);
192
+ box-shadow: 2px 0 8px rgba(0,0,0,0.3);
193
+ }
194
+ .folder-panel.open { left: var(--rail-width, 48px); }
195
+
196
+ /* Medium tier has the rail visible permanently — no hamburger needed.
197
+ Show the folder-toggle (📁) so the user can still reveal the folder
198
+ tree on demand. */
199
+ #btn-menu { display: none !important; }
200
+ #btn-folder-toggle { display: inline-flex !important; }
201
+ }
202
+
203
+ /* Responsive: narrow OR short viewport — single panel navigation */
204
+ @media (max-width: 768px), (max-height: 600px) {
205
+ /* Preview snippets remain visible on narrow — user-controlled via the
206
+ View menu's "Preview snippets" checkbox. Previously this rule forced
207
+ them hidden on any narrow viewport, so Android users never saw the
208
+ checkbox take effect. */
209
+ /* Column headers (From/Date/Subject) take space without being useful on narrow */
210
+ .ml-header { display: none; }
211
+ /* Current folder name shown above the list, Dovecot-style */
212
+ .ml-folder-title { display: block; }
213
+ /* Version string overflows the toolbar on narrow — move to the status bar */
214
+ #app-version { display: none; }
215
+ #status-version {
216
+ color: var(--color-text-muted);
217
+ font-size: var(--font-size-sm);
218
+ margin-left: auto;
219
+ }
220
+ /* Drop button captions on narrow — icons are self-explanatory and captions overflow */
221
+ .toolbar .tb-label { display: none; }
222
+ /* View and Settings menus don't need to shout on narrow */
223
+ #view-menu, #settings-menu { display: none; }
224
+ }
225
+ @media (min-width: 769px) {
226
+ /* Status-bar version is a narrow-only mirror — keep it hidden on wide */
227
+ #status-version { display: none; }
228
+ }
229
+ @media (max-width: 768px), (max-height: 600px) {
230
+ body,
231
+ body.calendar-sidebar-on {
232
+ grid-template-columns: 1fr;
233
+ grid-template-rows: var(--toolbar-height) auto 1fr var(--statusbar-height);
234
+ grid-template-areas:
235
+ "toolbar"
236
+ "alert"
237
+ "main"
238
+ "status";
239
+ }
240
+
241
+ /* Rail on narrow: slide-in drawer triggered by the hamburger (☰). The
242
+ rail is the entry point to Inbox / All-Inboxes / Contacts / Calendar /
243
+ Tasks / Settings — without this drawer, narrow-tier users couldn't
244
+ reach any of those. */
245
+ .icon-rail {
246
+ display: flex;
247
+ position: fixed;
248
+ left: -64px;
249
+ top: var(--toolbar-height);
250
+ bottom: var(--statusbar-height);
251
+ z-index: 60;
252
+ transition: left 0.2s ease;
253
+ box-shadow: 2px 0 8px rgba(0,0,0,0.3);
254
+ }
255
+ .icon-rail.open { left: 0; }
256
+
257
+ /* Folder panel: slide-in drawer triggered by the folder icon (📁).
258
+ Kept separate from the rail drawer so the user can have folders open
259
+ while the rail is closed, or vice versa — matching the desktop flow. */
260
+ .folder-panel {
261
+ position: fixed;
262
+ left: -280px;
263
+ top: var(--toolbar-height);
264
+ bottom: var(--statusbar-height);
265
+ width: 280px;
266
+ z-index: 50;
267
+ transition: left 0.2s ease;
268
+ background: var(--color-bg);
269
+ border-right: 1px solid var(--color-border);
270
+ box-shadow: 2px 0 8px rgba(0,0,0,0.3);
271
+ }
272
+ .folder-panel.open { left: 0; }
273
+
274
+ /* Main area: single column */
275
+ .main-area {
276
+ grid-template-columns: 1fr;
277
+ grid-template-rows: 1fr;
278
+ }
279
+ .splitter { display: none; }
280
+
281
+ /* Show one panel at a time */
282
+ .message-viewer { display: none; }
283
+ .message-viewer.narrow-active {
284
+ display: flex;
285
+ position: absolute;
286
+ inset: 0;
287
+ z-index: 10;
288
+ background: var(--color-bg);
289
+ }
290
+ .message-list.narrow-hidden { display: none; }
291
+
292
+ /* Hamburger opens the rail drawer; folder-toggle opens the folder drawer.
293
+ Both always visible on narrow so the user can reach either. */
294
+ #btn-menu { display: inline-flex !important; }
295
+ #btn-folder-toggle { display: inline-flex !important; }
296
+ /* Back button: only show when viewer is active (message list hidden) */
297
+ #btn-back { display: none !important; }
298
+ .message-viewer.narrow-active ~ * #btn-back,
299
+ body:has(.message-viewer.narrow-active) #btn-back {
300
+ display: inline-flex !important;
301
+ font-size: 1.1em;
302
+ font-weight: 600;
303
+ padding: 0.5em 1em;
304
+ background: var(--color-accent, #1a6dd4);
305
+ color: white;
306
+ border-radius: 6px;
307
+ }
308
+
309
+ /* Message list: full width, two-line rows */
310
+ .message-list {
311
+ grid-template-columns: 1.2em 1fr auto;
312
+ }
313
+ .message-list .ml-row {
314
+ grid-template-columns: subgrid;
315
+ grid-template-rows: auto auto;
316
+ }
317
+ .message-list .ml-flag { grid-row: 1 / 3; align-self: center; }
318
+ .message-list .ml-from { grid-column: 2; }
319
+ .message-list .ml-date { grid-column: 3; grid-row: 1; }
320
+ .message-list .ml-subject {
321
+ grid-column: 2 / 4;
322
+ grid-row: 2;
323
+ font-size: var(--font-size-sm);
324
+ color: var(--color-text-muted);
325
+ }
326
+ }
327
+
328
+ /* Hide hamburger, folder-toggle, and back on wide screens (folder panel
329
+ permanent column, rail permanent column, no drawer toggles needed). */
330
+ @media (min-width: 1101px) {
331
+ #btn-menu, #btn-folder-toggle, #btn-back { display: none !important; }
332
+ }
@@ -0,0 +1,85 @@
1
+ /* mailx design tokens -- all theming via custom properties */
2
+ /* Theme controlled by class on <html>: theme-dark, theme-light, or absent (system) */
3
+
4
+ :root {
5
+ /* Layout */
6
+ --rail-width: 44px; /* vertical icon rail (Thunderbird/Dovecot style) */
7
+ --folder-width: 220px;
8
+ --toolbar-height: 44px;
9
+ --statusbar-height: 24px;
10
+ --splitter-size: 5px;
11
+ --list-viewer-split: 40%;
12
+
13
+ /* Colors — dark by default */
14
+ --color-brand: oklch(0.88 0.04 240);
15
+ --color-brand-dark: oklch(0.45 0.10 240);
16
+ --color-bg: oklch(0.20 0.02 270);
17
+ --color-bg-surface: oklch(0.25 0.03 270);
18
+ --color-bg-hover: color-mix(in oklch, var(--color-bg-surface) 80%, white);
19
+ --color-bg-selected: var(--color-brand);
20
+ --color-bg-toolbar: oklch(0.22 0.02 270);
21
+ --color-text: oklch(0.92 0.01 270);
22
+ --color-text-muted: oklch(0.68 0.02 270);
23
+ --color-accent: var(--color-brand-dark);
24
+ --color-unread: oklch(0.95 0.02 270);
25
+ --color-border: oklch(0.40 0.02 270);
26
+ --color-danger: oklch(0.65 0.15 15);
27
+ --color-success: oklch(0.65 0.15 145);
28
+ --color-badge: oklch(0.60 0.18 250);
29
+
30
+ /* Typography */
31
+ --font-ui: "Segoe UI", system-ui, -apple-system, sans-serif;
32
+ --font-mono: "Cascadia Code", Consolas, monospace;
33
+ --font-size-sm: 0.9rem;
34
+ --font-size-base: 0.95rem;
35
+ --font-size-lg: 1.1rem;
36
+ --line-height: 1.45;
37
+
38
+ /* Spacing */
39
+ --gap-xs: 0.25rem;
40
+ --gap-sm: 0.5rem;
41
+ --gap-md: 0.75rem;
42
+ --gap-lg: 1rem;
43
+
44
+ /* Radii */
45
+ --radius-sm: 3px;
46
+ --radius-md: 6px;
47
+
48
+ color-scheme: dark light;
49
+ }
50
+
51
+ /* Light overrides */
52
+ .theme-light {
53
+ --color-bg: oklch(0.97 0.005 270);
54
+ --color-bg-surface: oklch(1.0 0 0);
55
+ --color-bg-hover: oklch(0.95 0.005 270);
56
+ --color-brand: oklch(0.88 0.04 240);
57
+ --color-brand-dark: oklch(0.35 0.12 240);
58
+ --color-bg-selected: var(--color-brand);
59
+ --color-bg-toolbar: oklch(0.95 0.005 270);
60
+ --color-text: oklch(0.20 0.02 270);
61
+ --color-text-muted: oklch(0.45 0.02 270);
62
+ --color-accent: var(--color-brand-dark);
63
+ --color-unread: oklch(0.10 0.02 270);
64
+ --color-border: oklch(0.85 0.01 270);
65
+ color-scheme: light;
66
+ }
67
+
68
+ /* System preference: light — apply when no explicit theme class */
69
+ @media (prefers-color-scheme: light) {
70
+ :root:not(.theme-dark):not(.theme-light) {
71
+ --color-bg: oklch(0.97 0.005 270);
72
+ --color-bg-surface: oklch(1.0 0 0);
73
+ --color-bg-hover: oklch(0.95 0.005 270);
74
+ --color-brand: oklch(0.88 0.04 240);
75
+ --color-brand-dark: oklch(0.35 0.12 240);
76
+ --color-bg-selected: var(--color-brand);
77
+ --color-bg-toolbar: oklch(0.95 0.005 270);
78
+ --color-text: oklch(0.20 0.02 270);
79
+ --color-text-muted: oklch(0.45 0.02 270);
80
+ --color-accent: var(--color-brand-dark);
81
+ --color-unread: oklch(0.10 0.02 270);
82
+ --color-border: oklch(0.85 0.01 270);
83
+ color-scheme: light;
84
+ }
85
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "esnext",
4
+ "module": "NodeNext",
5
+ "moduleResolution": "NodeNext",
6
+ "lib": ["ES2024", "DOM", "DOM.Iterable"],
7
+ "strict": true,
8
+ "strictNullChecks": false,
9
+ "noImplicitAny": true,
10
+ "skipLibCheck": true,
11
+ "sourceMap": true,
12
+ "declaration": false,
13
+ "outDir": ".",
14
+ "rootDir": ".",
15
+ "newLine": "lf"
16
+ },
17
+ "include": ["**/*.ts"],
18
+ "exclude": ["node_modules", "prev", "cruft"]
19
+ }
package/package.json ADDED
@@ -0,0 +1,124 @@
1
+ {
2
+ "name": "@bobfrankston/rmfmail",
3
+ "version": "1.0.467",
4
+ "description": "Local-first email client with IMAP sync and standalone native app",
5
+ "type": "module",
6
+ "main": "bin/mailx.js",
7
+ "bin": {
8
+ "rmfmail": "bin/mailx.js",
9
+ "mailx": "bin/mailx.js"
10
+ },
11
+ "workspaces": [
12
+ "packages/mailx-types",
13
+ "packages/mailx-host",
14
+ "packages/mailx-send",
15
+ "packages/mailx-compose",
16
+ "packages/mailx-settings",
17
+ "packages/mailx-store",
18
+ "packages/mailx-store-web",
19
+ "packages/mailx-imap",
20
+ "packages/mailx-service",
21
+ "packages/mailx-api",
22
+ "packages/mailx-core",
23
+ "packages/mailx-server",
24
+ "client"
25
+ ],
26
+ "scripts": {
27
+ "build": "tsc -p bin && node bin/build-icon-ico.js",
28
+ "watch": "tsc -w",
29
+ "start": "node --watch packages/mailx-server/index.js",
30
+ "start:prod": "node packages/mailx-server/index.js",
31
+ "release": "npmglobalize",
32
+ "postinstall": "node bin/postinstall.js"
33
+ },
34
+ "dependencies": {
35
+ "@bobfrankston/iflow-direct": "^0.1.27",
36
+ "@bobfrankston/iflow-node": "^0.1.8",
37
+ "@bobfrankston/miscinfo": "^1.0.10",
38
+ "@bobfrankston/oauthsupport": "^1.0.25",
39
+ "@bobfrankston/msger": "^0.1.369",
40
+ "@bobfrankston/mailx-host": "^0.1.10",
41
+ "@capacitor/android": "^8.3.0",
42
+ "@capacitor/cli": "^8.3.0",
43
+ "@capacitor/core": "^8.3.0",
44
+ "express": "^4.21.0",
45
+ "jsonc-parser": "^3.3.1",
46
+ "mailparser": "^3.7.2",
47
+ "nodemailer": "^7.0.0",
48
+ "quill": "^2.0.3",
49
+ "ws": "^8.18.0",
50
+ "sql.js": "^1.14.1",
51
+ "@bobfrankston/tcp-transport": "^0.1.5",
52
+ "@bobfrankston/node-tcp-transport": "^0.1.6",
53
+ "@bobfrankston/smtp-direct": "^0.1.5",
54
+ "@bobfrankston/mailx-sync": "^0.1.10",
55
+ "@bobfrankston/mailx-imap": "^0.1.15"
56
+ },
57
+ "devDependencies": {
58
+ "@types/mailparser": "^3.4.6"
59
+ },
60
+ "keywords": [
61
+ "email",
62
+ "imap",
63
+ "smtp",
64
+ "mail-client",
65
+ "webview"
66
+ ],
67
+ "author": "Bob Frankston",
68
+ "license": "MIT",
69
+ "publishConfig": {
70
+ "access": "public"
71
+ },
72
+ "repository": {
73
+ "type": "git",
74
+ "url": "https://github.com/BobFrankston/mailx.git"
75
+ },
76
+ ".dependencies": {
77
+ "@bobfrankston/iflow-direct": "file:../../MailApps/iflow-direct",
78
+ "@bobfrankston/iflow-node": "file:../../MailApps/iflow-node",
79
+ "@bobfrankston/miscinfo": "file:../../../projects/npm/miscinfo",
80
+ "@bobfrankston/oauthsupport": "file:../../../projects/oauth/oauthsupport",
81
+ "@bobfrankston/msger": "file:../../../utils/msgx/msger",
82
+ "@bobfrankston/mailx-host": "file:packages/mailx-host",
83
+ "@capacitor/android": "^8.3.0",
84
+ "@capacitor/cli": "^8.3.0",
85
+ "@capacitor/core": "^8.3.0",
86
+ "express": "^4.21.0",
87
+ "jsonc-parser": "^3.3.1",
88
+ "mailparser": "^3.7.2",
89
+ "nodemailer": "^7.0.0",
90
+ "quill": "^2.0.3",
91
+ "ws": "^8.18.0",
92
+ "sql.js": "^1.14.1",
93
+ "@bobfrankston/tcp-transport": "file:../../MailApps/tcp-transport",
94
+ "@bobfrankston/node-tcp-transport": "file:../../MailApps/node-tcp-transport",
95
+ "@bobfrankston/smtp-direct": "file:../../MailApps/smtp-direct",
96
+ "@bobfrankston/mailx-sync": "file:../../MailApps/mailx-sync",
97
+ "@bobfrankston/mailx-imap": "file:packages/mailx-imap"
98
+ },
99
+ ".transformedSnapshot": {
100
+ "dependencies": {
101
+ "@bobfrankston/iflow-direct": "^0.1.27",
102
+ "@bobfrankston/iflow-node": "^0.1.8",
103
+ "@bobfrankston/miscinfo": "^1.0.10",
104
+ "@bobfrankston/oauthsupport": "^1.0.25",
105
+ "@bobfrankston/msger": "^0.1.369",
106
+ "@bobfrankston/mailx-host": "^0.1.10",
107
+ "@capacitor/android": "^8.3.0",
108
+ "@capacitor/cli": "^8.3.0",
109
+ "@capacitor/core": "^8.3.0",
110
+ "express": "^4.21.0",
111
+ "jsonc-parser": "^3.3.1",
112
+ "mailparser": "^3.7.2",
113
+ "nodemailer": "^7.0.0",
114
+ "quill": "^2.0.3",
115
+ "ws": "^8.18.0",
116
+ "sql.js": "^1.14.1",
117
+ "@bobfrankston/tcp-transport": "^0.1.5",
118
+ "@bobfrankston/node-tcp-transport": "^0.1.6",
119
+ "@bobfrankston/smtp-direct": "^0.1.5",
120
+ "@bobfrankston/mailx-sync": "^0.1.10",
121
+ "@bobfrankston/mailx-imap": "^0.1.15"
122
+ }
123
+ }
124
+ }
@@ -0,0 +1,10 @@
1
+ # Force LF line endings for all text files
2
+ * text=auto eol=lf
3
+
4
+ # Ensure these are always LF
5
+ *.ts text eol=lf
6
+ *.js text eol=lf
7
+ *.json text eol=lf
8
+ *.md text eol=lf
9
+ *.yml text eol=lf
10
+ *.yaml text eol=lf
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @bobfrankston/mailx-api
3
+ * Thin Express Router — delegates all logic to mailx-service.
4
+ */
5
+ import { Router } from "express";
6
+ import { MailxDB } from "@bobfrankston/mailx-store";
7
+ import { ImapManager } from "@bobfrankston/mailx-imap";
8
+ export declare function createApiRouter(db: MailxDB, imapManager: ImapManager): Router;
9
+ export { MailxService } from "@bobfrankston/mailx-service";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAIvD,wBAAgB,eAAe,CAAC,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,GAAG,MAAM,CA4Q7E;AAGD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC"}