@bobfrankston/mailx 1.0.451 → 1.0.452

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 (198) hide show
  1. package/bin/mailx.js.map +1 -0
  2. package/bin/mailx.ts +1498 -0
  3. package/bin/postinstall.js.map +1 -0
  4. package/bin/postinstall.ts +41 -0
  5. package/bin/tsconfig.json +10 -0
  6. package/client/.gitattributes +10 -0
  7. package/client/app.js +51 -2
  8. package/client/app.js.map +1 -0
  9. package/client/app.ts +3112 -0
  10. package/client/components/address-book.js.map +1 -0
  11. package/client/components/address-book.ts +204 -0
  12. package/client/components/alarms.js.map +1 -0
  13. package/client/components/alarms.ts +276 -0
  14. package/client/components/calendar-sidebar.js.map +1 -0
  15. package/client/components/calendar-sidebar.ts +474 -0
  16. package/client/components/calendar.js.map +1 -0
  17. package/client/components/calendar.ts +211 -0
  18. package/client/components/context-menu.js.map +1 -0
  19. package/client/components/context-menu.ts +95 -0
  20. package/client/components/folder-picker.js.map +1 -0
  21. package/client/components/folder-picker.ts +127 -0
  22. package/client/components/folder-tree.js.map +1 -0
  23. package/client/components/folder-tree.ts +1069 -0
  24. package/client/components/message-list.js.map +1 -0
  25. package/client/components/message-list.ts +1129 -0
  26. package/client/components/message-viewer.js.map +1 -0
  27. package/client/components/message-viewer.ts +1257 -0
  28. package/client/components/outbox-view.js.map +1 -0
  29. package/client/components/outbox-view.ts +102 -0
  30. package/client/components/tasks.js.map +1 -0
  31. package/client/components/tasks.ts +234 -0
  32. package/client/compose/compose.js.map +1 -0
  33. package/client/compose/compose.ts +1231 -0
  34. package/client/compose/editor.js.map +1 -0
  35. package/client/compose/editor.ts +599 -0
  36. package/client/compose/ghost-text.js.map +1 -0
  37. package/client/compose/ghost-text.ts +140 -0
  38. package/client/index.html +1 -0
  39. package/client/lib/android-bootstrap.js.map +1 -0
  40. package/client/lib/android-bootstrap.ts +9 -0
  41. package/client/lib/api-client.js.map +1 -0
  42. package/client/lib/api-client.ts +439 -0
  43. package/client/lib/local-service.js.map +1 -0
  44. package/client/lib/local-service.ts +646 -0
  45. package/client/lib/local-store.js.map +1 -0
  46. package/client/lib/local-store.ts +283 -0
  47. package/client/lib/message-state.js.map +1 -0
  48. package/client/lib/message-state.ts +140 -0
  49. package/client/tsconfig.json +19 -0
  50. package/package.json +15 -15
  51. package/packages/mailx-api/.gitattributes +10 -0
  52. package/packages/mailx-api/index.d.ts.map +1 -0
  53. package/packages/mailx-api/index.js.map +1 -0
  54. package/packages/mailx-api/index.ts +283 -0
  55. package/packages/mailx-api/tsconfig.json +9 -0
  56. package/packages/mailx-compose/.gitattributes +10 -0
  57. package/packages/mailx-compose/index.d.ts.map +1 -0
  58. package/packages/mailx-compose/index.js.map +1 -0
  59. package/packages/mailx-compose/index.ts +85 -0
  60. package/packages/mailx-compose/tsconfig.json +9 -0
  61. package/packages/mailx-core/index.d.ts.map +1 -0
  62. package/packages/mailx-core/index.js.map +1 -0
  63. package/packages/mailx-core/index.ts +424 -0
  64. package/packages/mailx-core/ipc.d.ts.map +1 -0
  65. package/packages/mailx-core/ipc.js.map +1 -0
  66. package/packages/mailx-core/ipc.ts +62 -0
  67. package/packages/mailx-core/tsconfig.json +9 -0
  68. package/packages/mailx-host/.gitattributes +10 -0
  69. package/packages/mailx-host/index.d.ts.map +1 -0
  70. package/packages/mailx-host/index.js.map +1 -0
  71. package/packages/mailx-host/index.ts +38 -0
  72. package/packages/mailx-host/package.json +10 -2
  73. package/packages/mailx-host/tsconfig.json +9 -0
  74. package/packages/mailx-send/.gitattributes +10 -0
  75. package/packages/mailx-send/cli-queue.d.ts.map +1 -0
  76. package/packages/mailx-send/cli-queue.js.map +1 -0
  77. package/packages/mailx-send/cli-queue.ts +62 -0
  78. package/packages/mailx-send/cli-send.d.ts.map +1 -0
  79. package/packages/mailx-send/cli-send.js.map +1 -0
  80. package/packages/mailx-send/cli-send.ts +83 -0
  81. package/packages/mailx-send/cli.d.ts.map +1 -0
  82. package/packages/mailx-send/cli.js.map +1 -0
  83. package/packages/mailx-send/cli.ts +126 -0
  84. package/packages/mailx-send/index.d.ts.map +1 -0
  85. package/packages/mailx-send/index.js.map +1 -0
  86. package/packages/mailx-send/index.ts +333 -0
  87. package/packages/mailx-send/mailsend/cli.d.ts.map +1 -0
  88. package/packages/mailx-send/mailsend/cli.js.map +1 -0
  89. package/packages/mailx-send/mailsend/cli.ts +81 -0
  90. package/packages/mailx-send/mailsend/index.d.ts.map +1 -0
  91. package/packages/mailx-send/mailsend/index.js.map +1 -0
  92. package/packages/mailx-send/mailsend/index.ts +333 -0
  93. package/packages/mailx-send/mailsend/package-lock.json +65 -0
  94. package/packages/mailx-send/mailsend/tsconfig.json +21 -0
  95. package/packages/mailx-send/package-lock.json +65 -0
  96. package/packages/mailx-send/package.json +1 -1
  97. package/packages/mailx-send/tsconfig.json +21 -0
  98. package/packages/mailx-server/.gitattributes +10 -0
  99. package/packages/mailx-server/index.d.ts.map +1 -0
  100. package/packages/mailx-server/index.js.map +1 -0
  101. package/packages/mailx-server/index.ts +429 -0
  102. package/packages/mailx-server/tsconfig.json +9 -0
  103. package/packages/mailx-service/google-sync.d.ts.map +1 -0
  104. package/packages/mailx-service/google-sync.js.map +1 -0
  105. package/packages/mailx-service/google-sync.ts +238 -0
  106. package/packages/mailx-service/index.d.ts.map +1 -0
  107. package/packages/mailx-service/index.js.map +1 -0
  108. package/packages/mailx-service/index.ts +2461 -0
  109. package/packages/mailx-service/jsonrpc.d.ts.map +1 -0
  110. package/packages/mailx-service/jsonrpc.js.map +1 -0
  111. package/packages/mailx-service/jsonrpc.ts +268 -0
  112. package/packages/mailx-service/tsconfig.json +9 -0
  113. package/packages/mailx-settings/.gitattributes +10 -0
  114. package/packages/mailx-settings/cloud.d.ts.map +1 -0
  115. package/packages/mailx-settings/cloud.js.map +1 -0
  116. package/packages/mailx-settings/cloud.ts +388 -0
  117. package/packages/mailx-settings/index.d.ts.map +1 -0
  118. package/packages/mailx-settings/index.js.map +1 -0
  119. package/packages/mailx-settings/index.ts +892 -0
  120. package/packages/mailx-settings/tsconfig.json +9 -0
  121. package/packages/mailx-store/.gitattributes +10 -0
  122. package/packages/mailx-store/db.d.ts.map +1 -0
  123. package/packages/mailx-store/db.js.map +1 -0
  124. package/packages/mailx-store/db.ts +2007 -0
  125. package/packages/mailx-store/file-store.d.ts.map +1 -0
  126. package/packages/mailx-store/file-store.js.map +1 -0
  127. package/packages/mailx-store/file-store.ts +82 -0
  128. package/packages/mailx-store/index.d.ts.map +1 -0
  129. package/packages/mailx-store/index.js.map +1 -0
  130. package/packages/mailx-store/index.ts +7 -0
  131. package/packages/mailx-store/tsconfig.json +9 -0
  132. package/packages/mailx-store-web/android-bootstrap.d.ts.map +1 -0
  133. package/packages/mailx-store-web/android-bootstrap.js.map +1 -0
  134. package/packages/mailx-store-web/android-bootstrap.ts +1262 -0
  135. package/packages/mailx-store-web/db.d.ts.map +1 -0
  136. package/packages/mailx-store-web/db.js.map +1 -0
  137. package/packages/mailx-store-web/db.ts +756 -0
  138. package/packages/mailx-store-web/gmail-api-web.d.ts.map +1 -0
  139. package/packages/mailx-store-web/gmail-api-web.js.map +1 -0
  140. package/packages/mailx-store-web/gmail-api-web.ts +11 -0
  141. package/packages/mailx-store-web/imap-web-provider.d.ts.map +1 -0
  142. package/packages/mailx-store-web/imap-web-provider.js.map +1 -0
  143. package/packages/mailx-store-web/imap-web-provider.ts +156 -0
  144. package/packages/mailx-store-web/index.d.ts.map +1 -0
  145. package/packages/mailx-store-web/index.js.map +1 -0
  146. package/packages/mailx-store-web/index.ts +10 -0
  147. package/packages/mailx-store-web/main-thread-host.d.ts.map +1 -0
  148. package/packages/mailx-store-web/main-thread-host.js.map +1 -0
  149. package/packages/mailx-store-web/main-thread-host.ts +322 -0
  150. package/packages/mailx-store-web/package.json +4 -4
  151. package/packages/mailx-store-web/provider-types.d.ts.map +1 -0
  152. package/packages/mailx-store-web/provider-types.js.map +1 -0
  153. package/packages/mailx-store-web/provider-types.ts +7 -0
  154. package/packages/mailx-store-web/sync-manager.d.ts.map +1 -0
  155. package/packages/mailx-store-web/sync-manager.js.map +1 -0
  156. package/packages/mailx-store-web/sync-manager.ts +508 -0
  157. package/packages/mailx-store-web/tsconfig.json +10 -0
  158. package/packages/mailx-store-web/web-jsonrpc.d.ts.map +1 -0
  159. package/packages/mailx-store-web/web-jsonrpc.js.map +1 -0
  160. package/packages/mailx-store-web/web-jsonrpc.ts +116 -0
  161. package/packages/mailx-store-web/web-message-store.d.ts.map +1 -0
  162. package/packages/mailx-store-web/web-message-store.js.map +1 -0
  163. package/packages/mailx-store-web/web-message-store.ts +97 -0
  164. package/packages/mailx-store-web/web-service.d.ts.map +1 -0
  165. package/packages/mailx-store-web/web-service.js.map +1 -0
  166. package/packages/mailx-store-web/web-service.ts +616 -0
  167. package/packages/mailx-store-web/web-settings.d.ts.map +1 -0
  168. package/packages/mailx-store-web/web-settings.js.map +1 -0
  169. package/packages/mailx-store-web/web-settings.ts +522 -0
  170. package/packages/mailx-store-web/worker-entry.d.ts.map +1 -0
  171. package/packages/mailx-store-web/worker-entry.js.map +1 -0
  172. package/packages/mailx-store-web/worker-entry.ts +215 -0
  173. package/packages/mailx-store-web/worker-tcp-transport.d.ts.map +1 -0
  174. package/packages/mailx-store-web/worker-tcp-transport.js.map +1 -0
  175. package/packages/mailx-store-web/worker-tcp-transport.ts +101 -0
  176. package/packages/mailx-types/.gitattributes +10 -0
  177. package/packages/mailx-types/index.d.ts.map +1 -0
  178. package/packages/mailx-types/index.js.map +1 -0
  179. package/packages/mailx-types/index.ts +498 -0
  180. package/packages/mailx-types/tsconfig.json +9 -0
  181. package/tsconfig.base.json +2 -1
  182. package/tsconfig.json +9 -0
  183. package/build-apk.cmd +0 -3
  184. package/npmg.bat +0 -6
  185. package/packages/mailx-imap/index.d.ts +0 -442
  186. package/packages/mailx-imap/index.js +0 -3684
  187. package/packages/mailx-imap/package.json +0 -25
  188. package/packages/mailx-imap/providers/gmail-api.d.ts +0 -8
  189. package/packages/mailx-imap/providers/gmail-api.js +0 -8
  190. package/packages/mailx-imap/providers/types.d.ts +0 -9
  191. package/packages/mailx-imap/providers/types.js +0 -9
  192. package/packages/mailx-imap/tsconfig.tsbuildinfo +0 -1
  193. package/rebuild.cmd +0 -23
  194. package/tdview.cmd +0 -2
  195. package/temp.ps1 +0 -10
  196. package/test-smtp-direct.mjs +0 -4
  197. package/unbash.cmd +0 -55
  198. package/unwedge.cmd +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor.js","sourceRoot":"","sources":["editor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,599 @@
1
+ /**
2
+ * Editor abstraction — wraps Quill or tiptap behind a common interface.
3
+ * The compose window loads this module and calls createEditor() based on the user's setting.
4
+ */
5
+
6
+ export interface MailxEditor {
7
+ setHtml(html: string): void;
8
+ getHtml(): string;
9
+ getText(): string;
10
+ focus(): void;
11
+ setCursor(pos: number): void;
12
+ /** The editor's root editable element (for checking content) */
13
+ root: HTMLElement;
14
+ /** The scrollable container for positioning ghost text */
15
+ getScrollContainer(): HTMLElement;
16
+ /** Register a handler for content changes */
17
+ onContentChange(handler: () => void): void;
18
+ /** Register a keydown handler on the editor */
19
+ onKeyDown(handler: (e: KeyboardEvent) => void): void;
20
+ /** Insert plain text at the current cursor position */
21
+ insertTextAtCursor(text: string): void;
22
+ }
23
+
24
+ // ── Quill ──
25
+
26
+ declare const Quill: any;
27
+
28
+ /** URL-ish test: accepts http(s)://, mailto:, tel:, and bare domains with a dot. */
29
+ function looksLikeUrl(s: string): boolean {
30
+ const t = s.trim();
31
+ if (!t) return false;
32
+ if (/^(https?|mailto|tel):/i.test(t)) return true;
33
+ // bare domain (e.g. "example.com/path") — require a dot and no internal whitespace
34
+ return /^[\w-]+(\.[\w-]+)+(\/\S*)?$/.test(t);
35
+ }
36
+ function normalizeUrl(s: string): string {
37
+ const t = s.trim();
38
+ if (!t) return t;
39
+ if (/^(https?|mailto|tel):/i.test(t)) return t;
40
+ if (/^[\w.+-]+@[\w-]+(\.[\w-]+)+$/.test(t)) return `mailto:${t}`;
41
+ return `https://${t}`;
42
+ }
43
+
44
+ /** Floating modal that edits both link text and URL. Returns null on Cancel,
45
+ * { text, url } on OK, or { text: "", url: "" } on "Remove link". */
46
+ function openLinkDialog(initialText: string, initialUrl: string): Promise<{ text: string; url: string; remove?: boolean } | null> {
47
+ return new Promise(resolve => {
48
+ const backdrop = document.createElement("div");
49
+ backdrop.className = "mailx-modal-backdrop";
50
+ const panel = document.createElement("div");
51
+ panel.className = "mailx-modal";
52
+ panel.innerHTML = `
53
+ <div class="mailx-modal-title">Edit link</div>
54
+ <label class="mailx-modal-label">Text
55
+ <input type="text" class="mailx-modal-input" id="mailx-link-text">
56
+ </label>
57
+ <label class="mailx-modal-label">URL
58
+ <input type="text" class="mailx-modal-input" id="mailx-link-url" spellcheck="false" autocomplete="off">
59
+ </label>
60
+ <div class="mailx-modal-buttons">
61
+ <button type="button" class="mailx-modal-btn" data-action="remove">Remove link</button>
62
+ <span class="mailx-modal-spacer"></span>
63
+ <button type="button" class="mailx-modal-btn" data-action="cancel">Cancel</button>
64
+ <button type="button" class="mailx-modal-btn mailx-modal-btn-primary" data-action="ok">OK</button>
65
+ </div>`;
66
+ backdrop.appendChild(panel);
67
+ document.body.appendChild(backdrop);
68
+
69
+ const textInput = panel.querySelector<HTMLInputElement>("#mailx-link-text")!;
70
+ const urlInput = panel.querySelector<HTMLInputElement>("#mailx-link-url")!;
71
+ textInput.value = initialText;
72
+ urlInput.value = initialUrl;
73
+
74
+ const close = (result: { text: string; url: string; remove?: boolean } | null) => {
75
+ backdrop.remove();
76
+ document.removeEventListener("keydown", onKey, true);
77
+ resolve(result);
78
+ };
79
+ const commit = () => close({ text: textInput.value, url: normalizeUrl(urlInput.value) });
80
+ const onKey = (e: KeyboardEvent) => {
81
+ if (e.key === "Escape") { e.stopPropagation(); e.preventDefault(); close(null); }
82
+ else if (e.key === "Enter") { e.stopPropagation(); e.preventDefault(); commit(); }
83
+ };
84
+ document.addEventListener("keydown", onKey, true);
85
+
86
+ panel.querySelectorAll<HTMLButtonElement>(".mailx-modal-btn").forEach(btn => {
87
+ btn.addEventListener("click", () => {
88
+ const action = btn.dataset.action;
89
+ if (action === "cancel") close(null);
90
+ else if (action === "remove") close({ text: textInput.value, url: "", remove: true });
91
+ else commit();
92
+ });
93
+ });
94
+ backdrop.addEventListener("mousedown", (e) => { if (e.target === backdrop) close(null); });
95
+ // Focus URL if we have text, else text first
96
+ (initialText ? urlInput : textInput).focus();
97
+ (initialText ? urlInput : textInput).select();
98
+ });
99
+ }
100
+
101
+ function createQuillEditor(container: HTMLElement): MailxEditor {
102
+ /** Open the link dialog for the current selection or cursor. If range has
103
+ * a selection, prefill text from the selected text; if cursor is inside
104
+ * a link, prefill both from the link's range. */
105
+ const openLinkForRange = async (quill: any, range: any) => {
106
+ if (!range) return;
107
+ // Expand a bare cursor inside a link to the full link range
108
+ let linkRange = range;
109
+ const format = quill.getFormat(range);
110
+ if (range.length === 0 && format.link) {
111
+ // Walk left and right to find the link extent
112
+ const [leaf, offset] = quill.getLeaf(range.index);
113
+ if (leaf) {
114
+ // Build a range that spans the whole link
115
+ const text = quill.getText();
116
+ let start = range.index, end = range.index;
117
+ while (start > 0 && quill.getFormat(start - 1, 1).link === format.link) start--;
118
+ while (end < text.length - 1 && quill.getFormat(end, 1).link === format.link) end++;
119
+ linkRange = { index: start, length: end - start };
120
+ }
121
+ }
122
+ const currentText = linkRange.length ? quill.getText(linkRange.index, linkRange.length).replace(/\n$/, "") : "";
123
+ const currentUrl = format.link || "";
124
+ const result = await openLinkDialog(currentText, currentUrl);
125
+ if (!result) return;
126
+ if (result.remove) {
127
+ if (linkRange.length) quill.formatText(linkRange.index, linkRange.length, "link", false);
128
+ return;
129
+ }
130
+ if (!result.url) return;
131
+ const newText = result.text || result.url;
132
+ if (linkRange.length) {
133
+ // Replace the existing text+link with new text+link
134
+ quill.deleteText(linkRange.index, linkRange.length);
135
+ quill.insertText(linkRange.index, newText, { link: result.url });
136
+ quill.setSelection(linkRange.index + newText.length, 0);
137
+ } else {
138
+ quill.insertText(linkRange.index, newText, { link: result.url });
139
+ quill.setSelection(linkRange.index + newText.length, 0);
140
+ }
141
+ };
142
+
143
+ // Extra keybindings for formatting that Quill doesn't wire up by default.
144
+ // Ctrl+K (insert/edit link) is the one most users expect; we also add shortcuts
145
+ // for strikethrough, lists, indent, color, and clear-formatting.
146
+ const extraBindings: any = {
147
+ insertLink: {
148
+ key: "K", shortKey: true,
149
+ handler: function (this: any, range: any) {
150
+ openLinkForRange(this.quill, range);
151
+ },
152
+ },
153
+ removeLink: {
154
+ key: "K", shortKey: true, shiftKey: true,
155
+ handler: function (this: any) { this.quill.format("link", false); },
156
+ },
157
+ strike: {
158
+ key: "X", shortKey: true, shiftKey: true,
159
+ handler: function (this: any, range: any) {
160
+ if (!range) return true;
161
+ const cur = this.quill.getFormat(range).strike;
162
+ this.quill.format("strike", !cur);
163
+ },
164
+ },
165
+ orderedList: {
166
+ key: "7", shortKey: true, shiftKey: true,
167
+ handler: function (this: any) { this.quill.format("list", "ordered"); },
168
+ },
169
+ bulletList: {
170
+ key: "8", shortKey: true, shiftKey: true,
171
+ handler: function (this: any) { this.quill.format("list", "bullet"); },
172
+ },
173
+ indent: {
174
+ key: "]", shortKey: true,
175
+ handler: function (this: any, range: any, context: any) {
176
+ this.quill.format("indent", (context.format.indent || 0) + 1);
177
+ },
178
+ },
179
+ outdent: {
180
+ key: "[", shortKey: true,
181
+ handler: function (this: any, range: any, context: any) {
182
+ this.quill.format("indent", Math.max(0, (context.format.indent || 0) - 1));
183
+ },
184
+ },
185
+ color: {
186
+ key: "C", shortKey: true, shiftKey: true,
187
+ handler: function (this: any, range: any) {
188
+ if (!range) return true;
189
+ const current = this.quill.getFormat(range).color || "";
190
+ const color = prompt("Text color (name or #hex, blank to clear):", current);
191
+ if (color === null) return;
192
+ this.quill.format("color", color || false);
193
+ },
194
+ },
195
+ clearFormat: {
196
+ key: "\\", shortKey: true,
197
+ handler: function (this: any, range: any) {
198
+ if (!range) return true;
199
+ this.quill.removeFormat(range.index, range.length || 0);
200
+ },
201
+ },
202
+ };
203
+
204
+ const q = new Quill(container, {
205
+ theme: "snow",
206
+ placeholder: "Write your message...",
207
+ modules: {
208
+ toolbar: [
209
+ [{ font: [] }, { size: ["small", false, "large", "huge"] }],
210
+ [{ header: [1, 2, 3, false] }],
211
+ ["bold", "italic", "underline", "strike"],
212
+ [{ color: [] }, { background: [] }],
213
+ [{ list: "ordered" }, { list: "bullet" }],
214
+ [{ align: [] }],
215
+ ["blockquote", "link", "image"],
216
+ ["clean"]
217
+ ],
218
+ keyboard: { bindings: extraBindings },
219
+ }
220
+ });
221
+
222
+ // Make toolbar buttons non-tabbable so Tab goes straight to editor body
223
+ document.querySelectorAll(".ql-toolbar button, .ql-toolbar select, .ql-toolbar .ql-picker-label").forEach(
224
+ el => (el as HTMLElement).setAttribute("tabindex", "-1")
225
+ );
226
+
227
+ // Native spell-check: WebView2 / Chromium underlines misspellings and the
228
+ // right-click menu offers "Add to dictionary". Quill clears spellcheck on
229
+ // its root by default AND may re-clear it asynchronously as part of its
230
+ // setup (user-reported "spell-check broken again" with the one-shot set).
231
+ // Set once now, again after the frame flushes so post-init clears can't
232
+ // win, and install a MutationObserver to re-assert if anything later
233
+ // strips the attribute. Cheap — fires at most on each clear.
234
+ const applySpellcheck = () => {
235
+ if (q.root.getAttribute("spellcheck") !== "true") q.root.setAttribute("spellcheck", "true");
236
+ if (q.root.getAttribute("autocorrect") !== "on") q.root.setAttribute("autocorrect", "on");
237
+ if (q.root.getAttribute("autocapitalize") !== "on") q.root.setAttribute("autocapitalize", "on");
238
+ };
239
+ applySpellcheck();
240
+ requestAnimationFrame(applySpellcheck);
241
+ setTimeout(applySpellcheck, 100);
242
+ const spellObs = new MutationObserver(() => applySpellcheck());
243
+ spellObs.observe(q.root, { attributes: true, attributeFilter: ["spellcheck", "autocorrect", "autocapitalize"] });
244
+
245
+ // Toolbar link button: open our modal instead of Quill's built-in URL prompt.
246
+ const toolbar = q.getModule("toolbar");
247
+ toolbar?.addHandler("link", function (this: any) {
248
+ openLinkForRange(q, q.getSelection() || { index: q.getLength() - 1, length: 0 });
249
+ });
250
+
251
+ // Paste handling:
252
+ // - text/html clipboard with exactly one anchor (the common "copy a link
253
+ // with anchor text from a webpage" case): take it over from Quill —
254
+ // Quill's clipboard module was producing duplicates ("click here" as
255
+ // text PLUS a separate "https://example.com" as a link tail). Insert
256
+ // the anchor's text content as a single linked run.
257
+ // - text/html with richer content: defer to Quill (preserves formatting).
258
+ // - text/plain that's a URL: insert as a link, optionally wrapping any
259
+ // currently-selected text.
260
+ // - Anything else: default Quill behavior (verbatim plain or HTML).
261
+ // C36: AI proofread on right-click → "Proofread selection" item.
262
+ // Uses the existing aiTransform IPC. Gated by autocomplete.proofreadEnabled.
263
+ q.root.addEventListener("contextmenu", async (e: MouseEvent) => {
264
+ try {
265
+ const sel = q.getSelection();
266
+ if (!sel || sel.length === 0) return; // no selection — let native menu handle
267
+ const settingsRaw = localStorage.getItem("mailx-ai-proofread-enabled");
268
+ if (settingsRaw !== "true") return; // feature off
269
+ const text = q.getText(sel.index, sel.length);
270
+ if (!text.trim()) return;
271
+ e.preventDefault();
272
+ // Inline action menu next to the cursor
273
+ const menu = document.createElement("div");
274
+ menu.style.cssText = `position:fixed;z-index:2500;background:var(--color-bg);color:var(--color-text);border:1px solid var(--color-border);border-radius:6px;box-shadow:0 4px 16px rgba(0,0,0,0.2);padding:4px 0;font-size:13px;min-width:160px;`;
275
+ menu.style.left = `${e.clientX}px`;
276
+ menu.style.top = `${e.clientY}px`;
277
+ const item = document.createElement("div");
278
+ item.textContent = "Proofread selection";
279
+ item.style.cssText = `padding:6px 12px;cursor:pointer;`;
280
+ item.addEventListener("mouseenter", () => item.style.background = "var(--color-bg-hover)");
281
+ item.addEventListener("mouseleave", () => item.style.background = "");
282
+ item.addEventListener("click", async () => {
283
+ menu.remove();
284
+ try {
285
+ const { aiTransform } = await import("../lib/api-client.js");
286
+ const r = await aiTransform({ action: "proofread", text });
287
+ if (r?.text && r.text !== text) {
288
+ q.deleteText(sel.index, sel.length);
289
+ q.insertText(sel.index, r.text);
290
+ q.setSelection(sel.index, r.text.length);
291
+ } else if (r?.reason) {
292
+ alert(`Proofread: ${r.reason}`);
293
+ }
294
+ } catch (err: any) {
295
+ alert(`Proofread failed: ${err?.message || err}`);
296
+ }
297
+ });
298
+ menu.appendChild(item);
299
+ document.body.appendChild(menu);
300
+ const dismiss = () => { menu.remove(); document.removeEventListener("mousedown", dismiss); };
301
+ setTimeout(() => document.addEventListener("mousedown", dismiss), 0);
302
+ } catch { /* fall through to native menu */ }
303
+ });
304
+
305
+ // IMPORTANT: register on the capture phase AND use stopImmediatePropagation
306
+ // when we handle the paste ourselves. Quill 2.x's clipboard module attaches
307
+ // its own listener on the same root element; preventDefault only stops the
308
+ // browser's default contenteditable insertion, NOT Quill's parallel listener.
309
+ // Without stopImmediatePropagation the two handlers fire independently and
310
+ // both insert — user sees the URL twice. Capture phase guarantees we run
311
+ // before Quill so stopImmediatePropagation actually blocks it.
312
+ q.root.addEventListener("paste", (e: ClipboardEvent) => {
313
+ const cb = e.clipboardData;
314
+ if (!cb) return;
315
+
316
+ // Helper: call when we've handled the paste ourselves. Stops Quill's
317
+ // own listener from also processing the same event.
318
+ const consume = () => {
319
+ e.preventDefault();
320
+ e.stopImmediatePropagation();
321
+ };
322
+
323
+ // Q3: image-on-clipboard → inline as data: URL.
324
+ for (const item of Array.from(cb.items)) {
325
+ if (item.kind === "file" && item.type.startsWith("image/")) {
326
+ const file = item.getAsFile();
327
+ if (!file) continue;
328
+ consume();
329
+ const reader = new FileReader();
330
+ reader.onload = () => {
331
+ const dataUrl = String(reader.result || "");
332
+ const range = q.getSelection(true) || { index: q.getLength(), length: 0 };
333
+ q.insertEmbed(range.index, "image", dataUrl);
334
+ q.setSelection(range.index + 1, 0);
335
+ };
336
+ reader.readAsDataURL(file);
337
+ return;
338
+ }
339
+ }
340
+
341
+ const html = cb.getData("text/html");
342
+ const plain = cb.getData("text/plain");
343
+
344
+ if (html) {
345
+ // Detect "single anchor" clipboard — copy from a browser usually
346
+ // produces something like:
347
+ // <meta charset='utf-8'><a href="https://example.com">click here</a>
348
+ // or wrapped in <html><body>. Parse and check.
349
+ try {
350
+ const tmp = document.createElement("div");
351
+ tmp.innerHTML = html;
352
+ // Strip script/style, then unwrap <html>/<body> noise.
353
+ const root = tmp.querySelector("body") || tmp;
354
+ // Walk for the only meaningful element
355
+ const meaningful = Array.from(root.childNodes).filter(n => {
356
+ if (n.nodeType === Node.TEXT_NODE) return (n.textContent || "").trim().length > 0;
357
+ if (n.nodeType === Node.ELEMENT_NODE) {
358
+ const tag = (n as Element).tagName.toLowerCase();
359
+ return tag !== "meta" && tag !== "style" && tag !== "script";
360
+ }
361
+ return false;
362
+ });
363
+ if (meaningful.length === 1 && (meaningful[0] as HTMLElement).tagName?.toLowerCase() === "a") {
364
+ const a = meaningful[0] as HTMLAnchorElement;
365
+ const href = a.getAttribute("href") || "";
366
+ const text = (a.textContent || "").trim();
367
+ if (href && text) {
368
+ consume();
369
+ const range = q.getSelection(true);
370
+ if (!range) return;
371
+ if (range.length > 0) {
372
+ // Selected text exists — replace with the linked anchor text
373
+ q.deleteText(range.index, range.length);
374
+ }
375
+ q.insertText(range.index, text, { link: href });
376
+ q.setSelection(range.index + text.length, 0);
377
+ return;
378
+ }
379
+ }
380
+ // Single text-node wrapping the URL — common when copying from
381
+ // browser address bar (Chrome ships text/html as
382
+ // `<meta><span>URL</span>` alongside text/plain). Fall through
383
+ // to the plain-URL path below instead of letting Quill insert
384
+ // the bare URL text AND our handler insert it linked — which
385
+ // is exactly the double-paste the user reported.
386
+ const textOnly = (root.textContent || "").trim();
387
+ if (textOnly && looksLikeUrl(textOnly) && !root.querySelector("a")) {
388
+ consume();
389
+ const range = q.getSelection(true);
390
+ if (!range) return;
391
+ const url = normalizeUrl(textOnly);
392
+ if (range.length > 0) {
393
+ q.formatText(range.index, range.length, "link", url);
394
+ q.setSelection(range.index + range.length, 0);
395
+ } else {
396
+ q.insertText(range.index, textOnly, { link: url });
397
+ q.setSelection(range.index + textOnly.length, 0);
398
+ }
399
+ return;
400
+ }
401
+ } catch { /* fall through to Quill default */ }
402
+ return; // Quill handles richer HTML clipboard (no consume → Quill runs)
403
+ }
404
+
405
+ if (plain && looksLikeUrl(plain)) {
406
+ consume();
407
+ const range = q.getSelection(true);
408
+ if (!range) return;
409
+ const url = normalizeUrl(plain);
410
+ if (range.length > 0) {
411
+ // Preserve existing selection text, just format it as a link
412
+ q.formatText(range.index, range.length, "link", url);
413
+ q.setSelection(range.index + range.length, 0);
414
+ } else {
415
+ q.insertText(range.index, plain.trim(), { link: url });
416
+ q.setSelection(range.index + plain.trim().length, 0);
417
+ }
418
+ }
419
+ }, true); // capture=true — run before Quill's own paste listener
420
+
421
+ // Hover preview: show the target URL in a floating tooltip when the
422
+ // pointer is over a link. Built on top of native mouseover/mouseout
423
+ // rather than Quill's ql-tooltip (which is keyboard-triggered).
424
+ let hoverTip: HTMLElement | null = null;
425
+ q.root.addEventListener("mouseover", (e: MouseEvent) => {
426
+ const a = (e.target as HTMLElement).closest("a[href]") as HTMLAnchorElement | null;
427
+ if (!a) return;
428
+ if (hoverTip) hoverTip.remove();
429
+ hoverTip = document.createElement("div");
430
+ hoverTip.className = "mailx-link-hover";
431
+ hoverTip.textContent = a.getAttribute("href") || "";
432
+ document.body.appendChild(hoverTip);
433
+ const rect = a.getBoundingClientRect();
434
+ hoverTip.style.left = `${Math.max(8, rect.left)}px`;
435
+ hoverTip.style.top = `${rect.bottom + 4}px`;
436
+ });
437
+ q.root.addEventListener("mouseout", (e: MouseEvent) => {
438
+ const to = e.relatedTarget as HTMLElement | null;
439
+ if (to && to.closest("a[href]")) return;
440
+ if (hoverTip) { hoverTip.remove(); hoverTip = null; }
441
+ });
442
+
443
+ return {
444
+ setHtml(html: string): void {
445
+ q.clipboard.dangerouslyPasteHTML(html);
446
+ },
447
+ getHtml(): string {
448
+ return q.root.innerHTML;
449
+ },
450
+ getText(): string {
451
+ return q.getText();
452
+ },
453
+ focus(): void {
454
+ q.focus();
455
+ },
456
+ setCursor(pos: number): void {
457
+ q.setSelection(pos, 0);
458
+ },
459
+ root: q.root,
460
+ getScrollContainer(): HTMLElement {
461
+ return q.root;
462
+ },
463
+ onContentChange(handler: () => void): void {
464
+ q.on("text-change", handler);
465
+ },
466
+ onKeyDown(handler: (e: KeyboardEvent) => void): void {
467
+ q.root.addEventListener("keydown", handler);
468
+ },
469
+ insertTextAtCursor(text: string): void {
470
+ const sel = q.getSelection();
471
+ if (sel) q.insertText(sel.index, text);
472
+ }
473
+ };
474
+ }
475
+
476
+ // ── tiptap ──
477
+
478
+ async function createTiptapEditor(container: HTMLElement): Promise<MailxEditor> {
479
+ // tiptap loaded via CDN — use global UMD bundles
480
+ const { Editor } = (window as any).tiptapCore;
481
+ const { StarterKit } = (window as any).tiptapStarterKit;
482
+ const { Link } = (window as any).tiptapExtensionLink;
483
+ const { Image } = (window as any).tiptapExtensionImage;
484
+ const { Underline } = (window as any).tiptapExtensionUnderline;
485
+ const { Placeholder } = (window as any).tiptapExtensionPlaceholder;
486
+
487
+ // Build toolbar
488
+ const toolbar = document.createElement("div");
489
+ toolbar.className = "tt-toolbar";
490
+ toolbar.innerHTML = `
491
+ <select class="tt-heading" tabindex="-1">
492
+ <option value="p">Normal</option>
493
+ <option value="1">Heading 1</option>
494
+ <option value="2">Heading 2</option>
495
+ <option value="3">Heading 3</option>
496
+ </select>
497
+ <button class="tt-btn" data-cmd="bold" title="Bold" tabindex="-1"><b>B</b></button>
498
+ <button class="tt-btn" data-cmd="italic" title="Italic" tabindex="-1"><i>I</i></button>
499
+ <button class="tt-btn" data-cmd="underline" title="Underline" tabindex="-1"><u>U</u></button>
500
+ <button class="tt-btn" data-cmd="strike" title="Strikethrough" tabindex="-1"><s>S</s></button>
501
+ <button class="tt-btn" data-cmd="bulletList" title="Bullet list" tabindex="-1">&#8226;</button>
502
+ <button class="tt-btn" data-cmd="orderedList" title="Ordered list" tabindex="-1">1.</button>
503
+ <button class="tt-btn" data-cmd="blockquote" title="Blockquote" tabindex="-1">&ldquo;</button>
504
+ <button class="tt-btn" data-cmd="link" title="Link" tabindex="-1">&#128279;</button>
505
+ <button class="tt-btn" data-cmd="clearFormat" title="Clear formatting" tabindex="-1">&#8999;</button>
506
+ `;
507
+
508
+ // Content area
509
+ const content = document.createElement("div");
510
+ content.className = "tt-content";
511
+
512
+ container.appendChild(toolbar);
513
+ container.appendChild(content);
514
+
515
+ const ed = new Editor({
516
+ element: content,
517
+ extensions: [
518
+ StarterKit,
519
+ Link.configure({ openOnClick: false }),
520
+ Image,
521
+ Underline,
522
+ Placeholder.configure({ placeholder: "Write your message..." }),
523
+ ],
524
+ content: "",
525
+ });
526
+
527
+ // Wire toolbar buttons
528
+ toolbar.querySelectorAll(".tt-btn").forEach((btn: Element) => {
529
+ btn.addEventListener("mousedown", (e) => {
530
+ e.preventDefault();
531
+ const cmd = (btn as HTMLElement).dataset.cmd;
532
+ switch (cmd) {
533
+ case "bold": ed.chain().focus().toggleBold().run(); break;
534
+ case "italic": ed.chain().focus().toggleItalic().run(); break;
535
+ case "underline": ed.chain().focus().toggleUnderline().run(); break;
536
+ case "strike": ed.chain().focus().toggleStrike().run(); break;
537
+ case "bulletList": ed.chain().focus().toggleBulletList().run(); break;
538
+ case "orderedList": ed.chain().focus().toggleOrderedList().run(); break;
539
+ case "blockquote": ed.chain().focus().toggleBlockquote().run(); break;
540
+ case "link": {
541
+ const url = prompt("URL:");
542
+ if (url) ed.chain().focus().setLink({ href: url }).run();
543
+ break;
544
+ }
545
+ case "clearFormat": ed.chain().focus().clearNodes().unsetAllMarks().run(); break;
546
+ }
547
+ });
548
+ });
549
+
550
+ // Wire heading select
551
+ const headingSelect = toolbar.querySelector(".tt-heading") as HTMLSelectElement;
552
+ headingSelect?.addEventListener("change", () => {
553
+ const val = headingSelect.value;
554
+ if (val === "p") ed.chain().focus().setParagraph().run();
555
+ else ed.chain().focus().toggleHeading({ level: parseInt(val) as 1 | 2 | 3 }).run();
556
+ });
557
+
558
+ const editorEl = content.querySelector(".tiptap") as HTMLElement || content;
559
+
560
+ return {
561
+ setHtml(html: string): void {
562
+ ed.commands.setContent(html);
563
+ },
564
+ getHtml(): string {
565
+ return ed.getHTML();
566
+ },
567
+ getText(): string {
568
+ return ed.getText();
569
+ },
570
+ focus(): void {
571
+ ed.commands.focus("start");
572
+ },
573
+ setCursor(pos: number): void {
574
+ ed.commands.focus("start");
575
+ },
576
+ root: editorEl,
577
+ getScrollContainer(): HTMLElement {
578
+ return editorEl;
579
+ },
580
+ onContentChange(handler: () => void): void {
581
+ ed.on("update", handler);
582
+ },
583
+ onKeyDown(handler: (e: KeyboardEvent) => void): void {
584
+ editorEl.addEventListener("keydown", handler);
585
+ },
586
+ insertTextAtCursor(text: string): void {
587
+ ed.commands.insertContent(text);
588
+ }
589
+ };
590
+ }
591
+
592
+ // ── Factory ──
593
+
594
+ export async function createEditor(container: HTMLElement, type: "quill" | "tiptap"): Promise<MailxEditor> {
595
+ if (type === "tiptap") {
596
+ return createTiptapEditor(container);
597
+ }
598
+ return createQuillEditor(container);
599
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ghost-text.js","sourceRoot":"","sources":["ghost-text.ts"],"names":[],"mappings":"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"}