@bobfrankston/rmfmail 1.0.632 → 1.0.640

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.
@@ -1,226 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>rmfmail</title>
7
- <link rel="icon" type="image/svg+xml" href="favicon.svg">
8
- <link rel="stylesheet" href="styles/variables.css">
9
- <link rel="stylesheet" href="styles/components.css">
10
- <link rel="stylesheet" href="styles/layout.css">
11
- <!-- Import map for Android — resolves @bobfrankston packages to bundled assets -->
12
- <script type="importmap">
13
- {
14
- "imports": {
15
- "@bobfrankston/mailx-store-web": "../packages/mailx-store-web/index.js",
16
- "@bobfrankston/mailx-store-web/": "../packages/mailx-store-web/",
17
- "@bobfrankston/mailx-types": "../packages/mailx-types/index.js",
18
- "@bobfrankston/iflow-direct": "../node_modules/@bobfrankston/iflow-direct/index.js",
19
- "@bobfrankston/iflow-direct/": "../node_modules/@bobfrankston/iflow-direct/",
20
- "@bobfrankston/smtp-direct": "../node_modules/@bobfrankston/smtp-direct/index.js",
21
- "@bobfrankston/smtp-direct/": "../node_modules/@bobfrankston/smtp-direct/",
22
- "@bobfrankston/tcp-transport": "../node_modules/@bobfrankston/tcp-transport/index.js",
23
- "@bobfrankston/tcp-transport/": "../node_modules/@bobfrankston/tcp-transport/",
24
- "@bobfrankston/mailx-sync": "../node_modules/@bobfrankston/mailx-sync/index.js",
25
- "@bobfrankston/mailx-sync/": "../node_modules/@bobfrankston/mailx-sync/",
26
- "sql.js": "../packages/mailx-store-web/sql-wasm-esm.js"
27
- }
28
- }
29
- </script>
30
- <!-- Early error handlers — runs before modules, catches everything -->
31
- <script>
32
- window.addEventListener("unhandledrejection", function(e) {
33
- var msg = "UNHANDLED: " + (e.reason?.message || e.reason || "unknown");
34
- var el = document.getElementById("startup-status");
35
- if (el) el.textContent = msg;
36
- fetch("https://rmf39.aaz.lt/logit/" + encodeURIComponent("JS/REJECT: " + msg) + "?log=mailx-android").catch(function(){});
37
- });
38
- window.onerror = function(msg, src, line) {
39
- var el = document.getElementById("startup-status");
40
- if (el) el.textContent = "ERROR: " + msg;
41
- fetch("https://rmf39.aaz.lt/logit/" + encodeURIComponent("JS/ERR: " + msg + " " + src + ":" + line) + "?log=mailx-android").catch(function(){});
42
- };
43
- </script>
44
- <!-- Android: load bootstrap first (installs window.mailxapi), then app -->
45
- <script type="module">
46
- try {
47
- const { initAndroid } = await import("@bobfrankston/mailx-store-web/android-bootstrap.js");
48
- await initAndroid();
49
- await import("./app.js");
50
- } catch (e) {
51
- const msg = "BOOTSTRAP FAILED: " + (e.message || e) + "\n" + (e.stack || "");
52
- const el = document.getElementById("startup-status");
53
- if (el) el.textContent = msg;
54
- console.error(msg);
55
- fetch("https://rmf39.aaz.lt/logit/" + encodeURIComponent("JS/FATAL: " + msg.substring(0, 500)) + "?log=mailx-android").catch(() => {});
56
- }
57
- </script>
58
- </head>
59
- <body>
60
- <header class="toolbar">
61
- <div class="toolbar-left">
62
- <button class="tb-btn" id="btn-menu" title="Menu / rail" hidden>☰</button>
63
- <button class="tb-btn" id="btn-folder-toggle" title="Show / hide folders" hidden>📁</button>
64
- <button class="tb-btn" id="btn-compose" title="Compose (Ctrl+N)">
65
- <span class="tb-icon">✏</span> Compose
66
- </button>
67
- </div>
68
- <div class="toolbar-center">
69
- <div class="tb-menu" id="view-menu">
70
- <button class="tb-btn" id="btn-view">View</button>
71
- <div class="tb-menu-dropdown" id="view-dropdown" hidden>
72
- <label class="tb-menu-item" title="Stack From + Subject on two lines per row, date to the right — denser on narrow windows"><input type="checkbox" id="opt-two-line"> Two-line view</label>
73
- <label class="tb-menu-item" title="Show the reading pane below/beside the message list"><input type="checkbox" id="opt-preview" checked> Preview pane</label>
74
- <label class="tb-menu-item" title="Show a short body-text preview (first ~80 chars) beneath each row's subject"><input type="checkbox" id="opt-snippet" checked> Preview snippets</label>
75
- <label class="tb-menu-item" title="Collapse reply chains to one row"><input type="checkbox" id="opt-threaded"> Group by thread</label>
76
- <label class="tb-menu-item" title="Filter the list to rows in the selected message's thread"><input type="checkbox" id="opt-thread-filter"> Only this conversation</label>
77
- <label class="tb-menu-item" title="Show only flagged (★) messages in the list"><input type="checkbox" id="opt-flagged"> ★ Flagged only</label>
78
- <label class="tb-menu-item" title="Show unread/total counts next to each folder in the tree"><input type="checkbox" id="opt-folder-counts"> Folder counts</label>
79
- <label class="tb-menu-item" title="Show the right-side calendar/tasks sidebar"><input type="checkbox" id="opt-calendar-sidebar"> Calendar sidebar</label>
80
- </div>
81
- </div>
82
- <div class="tb-menu" id="settings-menu">
83
- <button class="tb-btn" id="btn-settings">Settings</button>
84
- <div class="tb-menu-dropdown" id="settings-dropdown" hidden>
85
- <span class="tb-menu-label">Theme</span>
86
- <label class="tb-menu-item"><input type="radio" name="opt-theme" value="system" id="opt-theme-system"> System</label>
87
- <label class="tb-menu-item"><input type="radio" name="opt-theme" value="light" id="opt-theme-light"> Light</label>
88
- <label class="tb-menu-item"><input type="radio" name="opt-theme" value="dark" id="opt-theme-dark"> Dark</label>
89
- <hr class="tb-menu-sep">
90
- <span class="tb-menu-label">Editor</span>
91
- <label class="tb-menu-item"><input type="radio" name="opt-editor" value="quill" id="opt-editor-quill" checked> Quill</label>
92
- <label class="tb-menu-item"><input type="radio" name="opt-editor" value="tiptap" id="opt-editor-tiptap"> tiptap</label>
93
- <hr class="tb-menu-sep">
94
- <label class="tb-menu-item" title="Ghost-text completions while composing"><input type="checkbox" id="opt-autocomplete"> AI autocomplete</label>
95
- <label class="tb-menu-item" title="Right-click in message body → Translate"><input type="checkbox" id="opt-ai-translate"> AI translate (off by default)</label>
96
- <label class="tb-menu-item" title="Right-click in compose editor → Proofread"><input type="checkbox" id="opt-ai-proofread"> AI proofread (off by default)</label>
97
- <hr class="tb-menu-sep">
98
- <button class="tb-menu-item" id="btn-edit-jsonc" title="Edit accounts.jsonc / allowlist.jsonc / contacts.jsonc">Edit config files...</button>
99
- <button class="tb-menu-item" id="btn-about" title="Show version and build info">About rmfmail...</button>
100
- </div>
101
- </div>
102
- <button class="tb-btn" id="btn-tb-delete" title="Delete selected (Del)">🗑</button>
103
- <button class="tb-btn" id="btn-tb-spam" title="Mark as spam — move to Junk">⚠</button>
104
- <span id="app-version" class="app-version">rmfmail</span>
105
- </div>
106
- <div class="toolbar-right">
107
- <button class="tb-btn" id="btn-sync" title="Sync all folders (F5)">
108
- <span class="tb-icon">↻</span> Sync
109
- </button>
110
- <div class="tb-menu" id="restart-menu">
111
- <button class="tb-btn" id="btn-restart" title="Reset">
112
- <span class="tb-icon">⚡</span> Reset ▾
113
- </button>
114
- <div class="tb-menu-dropdown" id="restart-dropdown" hidden>
115
- <button class="tb-menu-item" id="btn-restart-quick" title="Reload the page">Reload</button>
116
- <button class="tb-menu-item" id="btn-rebuild" title="Wipe local cache and re-sync">Reset local store</button>
117
- <button class="tb-menu-item" id="btn-factory-reset" title="Delete everything — accounts, settings, cache. Back to first-run.">Factory reset</button>
118
- </div>
119
- </div>
120
- </div>
121
- </header>
122
-
123
- <div class="alert-banner" id="alert-banner" hidden>
124
- <span id="alert-text"></span>
125
- <button class="alert-dismiss" id="alert-dismiss" title="Dismiss">&times;</button>
126
- </div>
127
-
128
- <aside class="icon-rail" id="icon-rail" aria-label="App rail">
129
- <div class="rail-top">
130
- <button class="rail-btn" id="rail-compose" title="Compose" aria-label="Compose">✏</button>
131
- <button class="rail-btn" id="rail-inbox" title="Inbox" aria-label="Inbox" data-active="true">✉</button>
132
- <button class="rail-btn" id="rail-unified" title="All Inboxes" aria-label="All Inboxes">⌘</button>
133
- <button class="rail-btn" id="rail-contacts" title="Contacts" aria-label="Contacts">👤</button>
134
- <button class="rail-btn" id="rail-calendar" title="Calendar" aria-label="Calendar">📅</button>
135
- <button class="rail-btn" id="rail-tasks" title="Tasks" aria-label="Tasks">☑</button>
136
- </div>
137
- <div class="rail-bottom">
138
- <button class="rail-btn" id="rail-settings" title="Settings" aria-label="Settings">⚙</button>
139
- <button class="rail-btn" id="rail-theme" title="Theme" aria-label="Theme">◐</button>
140
- <button class="rail-btn" id="rail-help" title="Help" aria-label="Help">?</button>
141
- </div>
142
- </aside>
143
-
144
- <div class="folder-panel">
145
- <div class="ft-filter">
146
- <input type="text" id="ft-filter-input" placeholder="Find folder..." autocomplete="off">
147
- </div>
148
- <nav class="folder-tree" id="folder-tree">
149
- <div class="folder-loading">Loading accounts...</div>
150
- </nav>
151
- </div>
152
-
153
- <main class="main-area">
154
- <section class="message-list" id="message-list">
155
- <search class="search-bar ml-search">
156
- <select id="search-scope" title="Search scope">
157
- <option value="all">All folders</option>
158
- <option value="current">This folder</option>
159
- </select>
160
- <input type="search" id="search-input" placeholder="Search..." autocomplete="off" title="Search messages">
161
- <label class="search-server-check" title="Also search the IMAP server"><input type="checkbox" id="search-server-too"> Server</label>
162
- </search>
163
- <div class="ml-folder-title" id="ml-folder-title"></div>
164
- <div class="ml-header">
165
- <span class="ml-col ml-col-avatar"></span>
166
- <span class="ml-col ml-col-flag"></span>
167
- <span class="ml-col ml-col-from" data-sort="from">From</span>
168
- <span class="ml-col ml-col-date" data-sort="date">Date</span>
169
- <span class="ml-col ml-col-subject">Subject</span>
170
- </div>
171
- <div class="ml-body" id="ml-body">
172
- <div class="ml-empty">Select a folder to view messages</div>
173
- </div>
174
- </section>
175
-
176
- <div class="splitter" id="splitter-h"></div>
177
-
178
- <section class="message-viewer" id="message-viewer">
179
- <div class="mv-header" id="mv-header" hidden>
180
- <div class="mv-toolbar">
181
- <button class="tb-btn btn-back-list" id="btn-back" title="Back to message list" hidden>← Inbox</button>
182
- <button class="tb-btn" id="btn-reply" title="Reply">↩</button>
183
- <button class="tb-btn" id="btn-reply-all" title="Reply All">↩↩</button>
184
- <button class="tb-btn" id="btn-forward" title="Forward">→</button>
185
- <button class="tb-btn" id="btn-delete" title="Delete">🗑</button>
186
- <button class="tb-btn" id="btn-spam" title="Mark as spam" hidden>⚠</button>
187
- <button class="tb-btn" id="btn-flag" title="Flag">⚑</button>
188
- <button class="tb-btn" id="btn-mark-unread" title="Mark unread">◉</button>
189
- <span style="flex:1"></span>
190
- <button class="mv-action mv-action-primary" id="mv-edit-draft" hidden>Edit & Send</button>
191
- <a class="mv-unsubscribe" id="mv-unsubscribe" hidden>Unsubscribe</a>
192
- <button class="mv-action" id="mv-toggle-details" title="Show/hide extra headers">Details</button>
193
- </div>
194
- <div class="mv-header-info">
195
- <div class="mv-from"></div>
196
- <div class="mv-to"></div>
197
- </div>
198
- <div class="mv-subject"></div>
199
- <div class="mv-date"></div>
200
- <div class="mv-details" id="mv-details" hidden></div>
201
- </div>
202
- <div class="mv-body" id="mv-body">
203
- <div class="mv-empty">Select a message to read</div>
204
- </div>
205
- <div class="mv-attachments" id="mv-attachments" hidden></div>
206
- </section>
207
- </main>
208
-
209
- <footer class="status-bar" id="status-bar">
210
- <span id="status-accounts"></span>
211
- <span id="status-sync">Initializing...</span>
212
- <span id="status-offline" class="status-offline" hidden title="No network — local actions queue for later">⚡ offline</span>
213
- <span id="status-diag" class="status-diag" hidden title=""></span>
214
- <span id="status-pending"></span>
215
- <span id="status-queue"></span>
216
- <span class="app-version" id="status-version">rmfmail</span>
217
- </footer>
218
-
219
- <div id="startup-overlay" class="startup-overlay">
220
- <div class="startup-content">
221
- <div class="startup-spinner"></div>
222
- <div id="startup-status">Initializing rmfmail...</div>
223
- </div>
224
- </div>
225
- </body>
226
- </html>