@bobfrankston/rmfmail 1.2.231 → 1.2.233

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 (158) hide show
  1. package/client/android-bootstrap.bundle.js +164 -152
  2. package/client/android-bootstrap.bundle.js.map +4 -4
  3. package/client/app.bundle.js +13 -107
  4. package/client/app.bundle.js.map +4 -4
  5. package/client/components/calendar-sidebar.js +1 -1
  6. package/client/components/calendar-sidebar.js.map +1 -1
  7. package/client/components/calendar-sidebar.ts +1 -1
  8. package/client/components/message-list.js +0 -60
  9. package/client/components/message-list.js.map +1 -1
  10. package/client/components/message-list.ts +0 -56
  11. package/client/components/message-viewer.js +3 -2
  12. package/client/components/message-viewer.js.map +1 -1
  13. package/client/components/message-viewer.ts +3 -2
  14. package/client/compose/compose.bundle.js +198 -211
  15. package/client/compose/compose.bundle.js.map +4 -4
  16. package/client/compose/compose.html +0 -8
  17. package/client/compose/compose.js +1 -1
  18. package/client/compose/compose.js.map +1 -1
  19. package/client/compose/compose.ts +1 -1
  20. package/client/compose/editor.js +30 -32
  21. package/client/compose/editor.js.map +1 -1
  22. package/client/compose/editor.ts +27 -29
  23. package/client/compose/ghost-text.js +0 -8
  24. package/client/compose/ghost-text.js.map +1 -1
  25. package/client/compose/ghost-text.ts +0 -6
  26. package/client/compose/spellcheck-core.js +0 -1
  27. package/client/compose/spellcheck-core.js.map +1 -1
  28. package/client/compose/spellcheck-core.ts +0 -1
  29. package/client/index.html +0 -8
  30. package/client/lib/local-service.js +0 -73
  31. package/client/lib/local-service.js.map +1 -1
  32. package/client/lib/local-service.ts +0 -71
  33. package/client/lib/local-store.js +0 -3
  34. package/client/lib/local-store.js.map +1 -1
  35. package/client/lib/local-store.ts +0 -4
  36. package/package.json +1 -3
  37. package/packages/mailx-host/index.d.ts +0 -1
  38. package/packages/mailx-host/index.d.ts.map +1 -1
  39. package/packages/mailx-host/index.js +0 -1
  40. package/packages/mailx-host/index.js.map +1 -1
  41. package/packages/mailx-host/index.ts +0 -1
  42. package/packages/mailx-host/package.json +1 -1
  43. package/packages/mailx-service/index.d.ts.map +1 -1
  44. package/packages/mailx-service/index.js +36 -139
  45. package/packages/mailx-service/index.js.map +1 -1
  46. package/packages/mailx-service/index.ts +36 -148
  47. package/packages/mailx-settings/cloud.d.ts +0 -5
  48. package/packages/mailx-settings/cloud.d.ts.map +1 -1
  49. package/packages/mailx-settings/cloud.js +0 -16
  50. package/packages/mailx-settings/cloud.js.map +1 -1
  51. package/packages/mailx-settings/cloud.ts +0 -12
  52. package/packages/mailx-settings/index.d.ts +0 -3
  53. package/packages/mailx-settings/index.d.ts.map +1 -1
  54. package/packages/mailx-settings/index.js +0 -5
  55. package/packages/mailx-settings/index.js.map +1 -1
  56. package/packages/mailx-settings/index.ts +0 -7
  57. package/packages/mailx-store-web/main-thread-host.d.ts +1 -1
  58. package/packages/mailx-store-web/main-thread-host.d.ts.map +1 -1
  59. package/packages/mailx-store-web/main-thread-host.js +1 -38
  60. package/packages/mailx-store-web/main-thread-host.js.map +1 -1
  61. package/packages/mailx-store-web/main-thread-host.ts +0 -42
  62. package/packages/mailx-store-web/package.json +1 -1
  63. package/packages/mailx-store-web/web-service.d.ts.map +1 -1
  64. package/packages/mailx-store-web/web-service.js +28 -114
  65. package/packages/mailx-store-web/web-service.js.map +1 -1
  66. package/packages/mailx-store-web/web-service.ts +28 -124
  67. package/packages/mailx-store-web/web-settings.d.ts +0 -4
  68. package/packages/mailx-store-web/web-settings.d.ts.map +1 -1
  69. package/packages/mailx-store-web/web-settings.js +0 -29
  70. package/packages/mailx-store-web/web-settings.js.map +1 -1
  71. package/packages/mailx-store-web/web-settings.ts +0 -24
  72. package/packages/mailx-types/index.d.ts +2 -0
  73. package/packages/mailx-types/index.d.ts.map +1 -1
  74. package/packages/mailx-types/index.js +1 -0
  75. package/packages/mailx-types/index.js.map +1 -1
  76. package/packages/mailx-types/index.ts +2 -0
  77. package/packages/mailx-types/mime-build.d.ts +74 -0
  78. package/packages/mailx-types/mime-build.d.ts.map +1 -0
  79. package/packages/mailx-types/mime-build.js +160 -0
  80. package/packages/mailx-types/mime-build.js.map +1 -0
  81. package/packages/mailx-types/mime-build.ts +217 -0
  82. package/packages/mailx-types/package.json +1 -1
  83. package/packages/mailx-types/test/mime-build.test.mjs +200 -0
  84. package/client/components/calendar.js +0 -220
  85. package/client/components/calendar.js.map +0 -1
  86. package/client/components/calendar.ts +0 -213
  87. package/client/components/tasks.js +0 -261
  88. package/client/components/tasks.js.map +0 -1
  89. package/client/components/tasks.ts +0 -234
  90. package/packages/mailx-compose/.gitattributes +0 -10
  91. package/packages/mailx-compose/index.d.ts +0 -21
  92. package/packages/mailx-compose/index.d.ts.map +0 -1
  93. package/packages/mailx-compose/index.js +0 -66
  94. package/packages/mailx-compose/index.js.map +0 -1
  95. package/packages/mailx-compose/index.ts +0 -91
  96. package/packages/mailx-compose/package.json +0 -18
  97. package/packages/mailx-compose/tsconfig.json +0 -9
  98. package/packages/mailx-core/index.d.ts +0 -142
  99. package/packages/mailx-core/index.d.ts.map +0 -1
  100. package/packages/mailx-core/index.js +0 -430
  101. package/packages/mailx-core/index.js.map +0 -1
  102. package/packages/mailx-core/index.ts +0 -450
  103. package/packages/mailx-core/ipc.d.ts +0 -13
  104. package/packages/mailx-core/ipc.d.ts.map +0 -1
  105. package/packages/mailx-core/ipc.js +0 -56
  106. package/packages/mailx-core/ipc.js.map +0 -1
  107. package/packages/mailx-core/ipc.ts +0 -62
  108. package/packages/mailx-core/package.json +0 -18
  109. package/packages/mailx-core/tsconfig.json +0 -9
  110. package/packages/mailx-send/.gitattributes +0 -10
  111. package/packages/mailx-send/README.md +0 -217
  112. package/packages/mailx-send/cli-queue.d.ts +0 -11
  113. package/packages/mailx-send/cli-queue.d.ts.map +0 -1
  114. package/packages/mailx-send/cli-queue.js +0 -59
  115. package/packages/mailx-send/cli-queue.js.map +0 -1
  116. package/packages/mailx-send/cli-queue.ts +0 -62
  117. package/packages/mailx-send/cli-send.d.ts +0 -17
  118. package/packages/mailx-send/cli-send.d.ts.map +0 -1
  119. package/packages/mailx-send/cli-send.js +0 -75
  120. package/packages/mailx-send/cli-send.js.map +0 -1
  121. package/packages/mailx-send/cli-send.ts +0 -83
  122. package/packages/mailx-send/cli.d.ts +0 -22
  123. package/packages/mailx-send/cli.d.ts.map +0 -1
  124. package/packages/mailx-send/cli.js +0 -115
  125. package/packages/mailx-send/cli.js.map +0 -1
  126. package/packages/mailx-send/cli.ts +0 -126
  127. package/packages/mailx-send/index.d.ts +0 -77
  128. package/packages/mailx-send/index.d.ts.map +0 -1
  129. package/packages/mailx-send/index.js +0 -269
  130. package/packages/mailx-send/index.js.map +0 -1
  131. package/packages/mailx-send/index.ts +0 -338
  132. package/packages/mailx-send/mailsend/README.md +0 -133
  133. package/packages/mailx-send/mailsend/cli.d.ts +0 -12
  134. package/packages/mailx-send/mailsend/cli.d.ts.map +0 -1
  135. package/packages/mailx-send/mailsend/cli.js +0 -70
  136. package/packages/mailx-send/mailsend/cli.js.map +0 -1
  137. package/packages/mailx-send/mailsend/cli.ts +0 -81
  138. package/packages/mailx-send/mailsend/index.d.ts +0 -77
  139. package/packages/mailx-send/mailsend/index.d.ts.map +0 -1
  140. package/packages/mailx-send/mailsend/index.js +0 -264
  141. package/packages/mailx-send/mailsend/index.js.map +0 -1
  142. package/packages/mailx-send/mailsend/index.ts +0 -336
  143. package/packages/mailx-send/mailsend/package-lock.json +0 -65
  144. package/packages/mailx-send/mailsend/package.json +0 -26
  145. package/packages/mailx-send/mailsend/tsconfig.json +0 -21
  146. package/packages/mailx-send/package-lock.json +0 -65
  147. package/packages/mailx-send/package.json +0 -37
  148. package/packages/mailx-send/tsconfig.json +0 -21
  149. package/packages/mailx-server/.gitattributes +0 -10
  150. package/packages/mailx-server/index.d.ts +0 -8
  151. package/packages/mailx-server/index.d.ts.map +0 -1
  152. package/packages/mailx-server/index.js +0 -412
  153. package/packages/mailx-server/index.js.map +0 -1
  154. package/packages/mailx-server/index.ts +0 -445
  155. package/packages/mailx-server/package.json +0 -28
  156. package/packages/mailx-server/tsconfig.json +0 -9
  157. package/packages/mailx-server/tsconfig.tsbuildinfo +0 -1
  158. /package/packages/mailx-imap/{node_modules.npmglobalize-stash-7472 → node_modules.npmglobalize-stash-40004}/.package-lock.json +0 -0
@@ -1717,7 +1717,6 @@ var init_api_client = __esm({
1717
1717
  // client/compose/spellcheck-core.js
1718
1718
  var spellcheck_core_exports = {};
1719
1719
  __export(spellcheck_core_exports, {
1720
- MARKER_ATTR: () => MARKER_ATTR,
1721
1720
  MIN_WORD_LEN: () => MIN_WORD_LEN,
1722
1721
  SKIP_TAGS: () => SKIP_TAGS,
1723
1722
  USER_DICT_KEY: () => USER_DICT_KEY,
@@ -1960,14 +1959,13 @@ function getWordAtPoint(root, x, y) {
1960
1959
  return null;
1961
1960
  return { word, node, start, end };
1962
1961
  }
1963
- var import_nspell, USER_DICT_KEY, MARKER_ATTR, MIN_WORD_LEN, SKIP_TAGS, spellPromise, URL_BODY, SKIP_SPAN_RE;
1962
+ var import_nspell, USER_DICT_KEY, MIN_WORD_LEN, SKIP_TAGS, spellPromise, URL_BODY, SKIP_SPAN_RE;
1964
1963
  var init_spellcheck_core = __esm({
1965
1964
  "client/compose/spellcheck-core.js"() {
1966
1965
  "use strict";
1967
1966
  import_nspell = __toESM(require_lib(), 1);
1968
1967
  init_api_client();
1969
1968
  USER_DICT_KEY = "mailx-user-dict";
1970
- MARKER_ATTR = "data-mailx-spellerror";
1971
1969
  MIN_WORD_LEN = 3;
1972
1970
  SKIP_TAGS = /* @__PURE__ */ new Set(["BLOCKQUOTE", "CODE", "PRE", "A", "SCRIPT", "STYLE", "KBD", "SAMP", "VAR"]);
1973
1971
  spellPromise = null;
@@ -2363,6 +2361,182 @@ var init_edit_commands = __esm({
2363
2361
  }
2364
2362
  });
2365
2363
 
2364
+ // client/components/context-menu.js
2365
+ var context_menu_exports = {};
2366
+ __export(context_menu_exports, {
2367
+ closeContextMenu: () => closeContextMenu,
2368
+ showContextMenu: () => showContextMenu
2369
+ });
2370
+ function closeSubmenu() {
2371
+ if (activeSubmenu) {
2372
+ activeSubmenu.remove();
2373
+ activeSubmenu = null;
2374
+ }
2375
+ }
2376
+ function closeContextMenu() {
2377
+ closeSubmenu();
2378
+ if (activeMenu) {
2379
+ activeMenu.remove();
2380
+ activeMenu = null;
2381
+ }
2382
+ if (dismissListener) {
2383
+ document.removeEventListener("pointerdown", dismissListener, true);
2384
+ dismissListener = null;
2385
+ }
2386
+ if (escapeListener) {
2387
+ document.removeEventListener("keydown", escapeListener, true);
2388
+ escapeListener = null;
2389
+ }
2390
+ }
2391
+ function openSubmenu(parentRow, items) {
2392
+ closeSubmenu();
2393
+ const sub = document.createElement("div");
2394
+ sub.className = "ctx-menu";
2395
+ for (const item of items) {
2396
+ if (item.separator) {
2397
+ const sep = document.createElement("div");
2398
+ sep.className = "ctx-sep";
2399
+ sub.appendChild(sep);
2400
+ continue;
2401
+ }
2402
+ const el = document.createElement("div");
2403
+ el.className = "ctx-item" + (item.disabled ? " ctx-disabled" : "");
2404
+ el.textContent = item.label;
2405
+ if (item.tooltip)
2406
+ el.title = item.tooltip;
2407
+ if (!item.disabled) {
2408
+ el.addEventListener("click", () => {
2409
+ closeContextMenu();
2410
+ item.action();
2411
+ });
2412
+ }
2413
+ sub.appendChild(el);
2414
+ }
2415
+ document.body.appendChild(sub);
2416
+ const anchor = parentRow.getBoundingClientRect();
2417
+ const vw = window.visualViewport?.width ?? window.innerWidth;
2418
+ const vh = window.visualViewport?.height ?? window.innerHeight;
2419
+ const rect = sub.getBoundingClientRect();
2420
+ let left = anchor.right - 2;
2421
+ if (left + rect.width > vw)
2422
+ left = anchor.left - rect.width + 2;
2423
+ let top = anchor.top;
2424
+ if (top + rect.height > vh)
2425
+ top = vh - rect.height - 4;
2426
+ sub.style.left = `${Math.max(4, left)}px`;
2427
+ sub.style.top = `${Math.max(4, top)}px`;
2428
+ activeSubmenu = sub;
2429
+ }
2430
+ function showContextMenu(x, y, items, opts = {}) {
2431
+ closeContextMenu();
2432
+ if (opts.editTarget !== void 0 || opts.editEngine) {
2433
+ const edit = editMenuItems({ target: opts.editTarget, engine: opts.editEngine }, { onError: opts.onEditError });
2434
+ if (edit.length > 0) {
2435
+ items = items.length > 0 ? [...edit, { label: "", action: () => {
2436
+ }, separator: true }, ...items] : edit;
2437
+ }
2438
+ }
2439
+ const menu = document.createElement("div");
2440
+ menu.className = "ctx-menu";
2441
+ for (const item of items) {
2442
+ if (item.separator) {
2443
+ const sep = document.createElement("div");
2444
+ sep.className = "ctx-sep";
2445
+ menu.appendChild(sep);
2446
+ continue;
2447
+ }
2448
+ const el = document.createElement("div");
2449
+ el.className = "ctx-item" + (item.disabled ? " ctx-disabled" : "") + (item.emphasized ? " ctx-emphasized" : "");
2450
+ if (item.emphasized)
2451
+ el.style.fontWeight = "600";
2452
+ el.textContent = item.label;
2453
+ if (item.tooltip)
2454
+ el.title = item.tooltip;
2455
+ if (item.submenu && item.submenu.length > 0 && !item.disabled) {
2456
+ el.style.display = "flex";
2457
+ el.style.justifyContent = "space-between";
2458
+ el.style.gap = "12px";
2459
+ const caret = document.createElement("span");
2460
+ caret.textContent = "\u25B8";
2461
+ caret.style.opacity = "0.6";
2462
+ el.appendChild(caret);
2463
+ const open = () => openSubmenu(el, item.submenu);
2464
+ el.addEventListener("mouseenter", open);
2465
+ el.addEventListener("click", (e) => {
2466
+ e.stopPropagation();
2467
+ open();
2468
+ });
2469
+ menu.appendChild(el);
2470
+ continue;
2471
+ }
2472
+ el.addEventListener("mouseenter", closeSubmenu);
2473
+ if (!item.disabled) {
2474
+ el.addEventListener("click", () => {
2475
+ closeContextMenu();
2476
+ item.action();
2477
+ });
2478
+ }
2479
+ menu.appendChild(el);
2480
+ }
2481
+ menu.style.left = `${x}px`;
2482
+ menu.style.top = `${y}px`;
2483
+ document.body.appendChild(menu);
2484
+ const vw = window.visualViewport?.width ?? window.innerWidth;
2485
+ const vh = window.visualViewport?.height ?? window.innerHeight;
2486
+ let rect = menu.getBoundingClientRect();
2487
+ if (rect.height > vh - 8) {
2488
+ menu.style.maxHeight = `${vh - 8}px`;
2489
+ menu.style.overflowY = "auto";
2490
+ rect = menu.getBoundingClientRect();
2491
+ }
2492
+ let left = x, top = y;
2493
+ if (left + rect.width > vw)
2494
+ left = x - rect.width;
2495
+ if (top + rect.height > vh)
2496
+ top = y - rect.height;
2497
+ left = Math.max(4, Math.min(left, vw - rect.width - 4));
2498
+ top = Math.max(4, Math.min(top, vh - rect.height - 4));
2499
+ menu.style.left = `${left}px`;
2500
+ menu.style.top = `${top}px`;
2501
+ activeMenu = menu;
2502
+ requestAnimationFrame(() => {
2503
+ dismissListener = (e) => {
2504
+ if (activeSubmenu?.contains(e.target))
2505
+ return;
2506
+ if (activeMenu && !activeMenu.contains(e.target)) {
2507
+ closeContextMenu();
2508
+ }
2509
+ };
2510
+ document.addEventListener("pointerdown", dismissListener, true);
2511
+ escapeListener = (e) => {
2512
+ if (e.key === "Escape") {
2513
+ e.preventDefault();
2514
+ e.stopPropagation();
2515
+ closeContextMenu();
2516
+ }
2517
+ };
2518
+ document.addEventListener("keydown", escapeListener, true);
2519
+ });
2520
+ }
2521
+ var activeMenu, dismissListener, escapeListener, activeSubmenu;
2522
+ var init_context_menu = __esm({
2523
+ "client/components/context-menu.js"() {
2524
+ "use strict";
2525
+ init_edit_menu();
2526
+ activeMenu = null;
2527
+ dismissListener = null;
2528
+ escapeListener = null;
2529
+ activeSubmenu = null;
2530
+ document.addEventListener("scroll", closeContextMenu, true);
2531
+ document.addEventListener("contextmenu", () => {
2532
+ });
2533
+ window.addEventListener("message", (e) => {
2534
+ if (e.data && e.data.type === "iframePointerDown")
2535
+ closeContextMenu();
2536
+ });
2537
+ }
2538
+ });
2539
+
2366
2540
  // client/lib/rmf-tiny.js
2367
2541
  var rmf_tiny_exports = {};
2368
2542
  __export(rmf_tiny_exports, {
@@ -3623,7 +3797,6 @@ var init_harper_lint = __esm({
3623
3797
  // client/compose/ghost-text.js
3624
3798
  var ghost_text_exports = {};
3625
3799
  __export(ghost_text_exports, {
3626
- destroyGhostText: () => destroyGhostText,
3627
3800
  initGhostText: () => initGhostText
3628
3801
  });
3629
3802
  function dismiss() {
@@ -3719,14 +3892,6 @@ function initGhostText(editor2, context, options) {
3719
3892
  editor2.root.addEventListener("blur", dismiss);
3720
3893
  editor2.getScrollContainer().addEventListener("scroll", dismiss);
3721
3894
  }
3722
- function destroyGhostText() {
3723
- dismiss();
3724
- if (debounceTimer)
3725
- clearTimeout(debounceTimer);
3726
- if (abortController)
3727
- abortController.abort();
3728
- activeEditor = null;
3729
- }
3730
3895
  var ghostEl, currentSuggestion, debounceTimer, abortController, activeEditor, debounceMs;
3731
3896
  var init_ghost_text = __esm({
3732
3897
  "client/compose/ghost-text.js"() {
@@ -4356,38 +4521,26 @@ function createQuillEditor(container2) {
4356
4521
  if (!text.trim())
4357
4522
  return;
4358
4523
  e.preventDefault();
4359
- const menu = document.createElement("div");
4360
- 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;`;
4361
- menu.style.left = `${e.clientX}px`;
4362
- menu.style.top = `${e.clientY}px`;
4363
- const item = document.createElement("div");
4364
- item.textContent = "Proofread selection";
4365
- item.style.cssText = `padding:6px 12px;cursor:pointer;`;
4366
- item.addEventListener("mouseenter", () => item.style.background = "var(--color-bg-hover)");
4367
- item.addEventListener("mouseleave", () => item.style.background = "");
4368
- item.addEventListener("click", async () => {
4369
- menu.remove();
4370
- try {
4371
- const { aiTransform: aiTransform2 } = await Promise.resolve().then(() => (init_api_client(), api_client_exports));
4372
- const r = await aiTransform2({ action: "proofread", text });
4373
- if (r?.text && r.text !== text) {
4374
- q.deleteText(sel.index, sel.length);
4375
- q.insertText(sel.index, r.text);
4376
- q.setSelection(sel.index, r.text.length);
4377
- } else if (r?.reason) {
4378
- alert(`Proofread: ${r.reason}`);
4524
+ const { showContextMenu: showContextMenu2 } = await Promise.resolve().then(() => (init_context_menu(), context_menu_exports));
4525
+ const { standardEditItems: standardEditItems2 } = await Promise.resolve().then(() => (init_edit_commands(), edit_commands_exports));
4526
+ showContextMenu2(e.clientX, e.clientY, [
4527
+ { label: "Proofread selection", action: async () => {
4528
+ try {
4529
+ const { aiTransform: aiTransform2 } = await Promise.resolve().then(() => (init_api_client(), api_client_exports));
4530
+ const r = await aiTransform2({ action: "proofread", text });
4531
+ if (r?.text && r.text !== text) {
4532
+ q.deleteText(sel.index, sel.length);
4533
+ q.insertText(sel.index, r.text);
4534
+ q.setSelection(sel.index, r.text.length);
4535
+ } else if (r?.reason) {
4536
+ alert(`Proofread: ${r.reason}`);
4537
+ }
4538
+ } catch (err) {
4539
+ alert(`Proofread failed: ${err?.message || err}`);
4379
4540
  }
4380
- } catch (err) {
4381
- alert(`Proofread failed: ${err?.message || err}`);
4382
- }
4383
- });
4384
- menu.appendChild(item);
4385
- document.body.appendChild(menu);
4386
- const dismiss2 = () => {
4387
- menu.remove();
4388
- document.removeEventListener("mousedown", dismiss2);
4389
- };
4390
- setTimeout(() => document.addEventListener("mousedown", dismiss2), 0);
4541
+ } },
4542
+ ...standardEditItems2(() => q)
4543
+ ]);
4391
4544
  } catch {
4392
4545
  }
4393
4546
  });
@@ -4816,173 +4969,7 @@ async function createTinyMceEditor2(container2, opts = {}) {
4816
4969
  // client/compose/compose.ts
4817
4970
  init_api_client();
4818
4971
  init_edit_commands();
4819
-
4820
- // client/components/context-menu.js
4821
- init_edit_menu();
4822
- var activeMenu = null;
4823
- var dismissListener = null;
4824
- var escapeListener = null;
4825
- var activeSubmenu = null;
4826
- function closeSubmenu() {
4827
- if (activeSubmenu) {
4828
- activeSubmenu.remove();
4829
- activeSubmenu = null;
4830
- }
4831
- }
4832
- function closeContextMenu() {
4833
- closeSubmenu();
4834
- if (activeMenu) {
4835
- activeMenu.remove();
4836
- activeMenu = null;
4837
- }
4838
- if (dismissListener) {
4839
- document.removeEventListener("pointerdown", dismissListener, true);
4840
- dismissListener = null;
4841
- }
4842
- if (escapeListener) {
4843
- document.removeEventListener("keydown", escapeListener, true);
4844
- escapeListener = null;
4845
- }
4846
- }
4847
- function openSubmenu(parentRow, items) {
4848
- closeSubmenu();
4849
- const sub = document.createElement("div");
4850
- sub.className = "ctx-menu";
4851
- for (const item of items) {
4852
- if (item.separator) {
4853
- const sep = document.createElement("div");
4854
- sep.className = "ctx-sep";
4855
- sub.appendChild(sep);
4856
- continue;
4857
- }
4858
- const el = document.createElement("div");
4859
- el.className = "ctx-item" + (item.disabled ? " ctx-disabled" : "");
4860
- el.textContent = item.label;
4861
- if (item.tooltip)
4862
- el.title = item.tooltip;
4863
- if (!item.disabled) {
4864
- el.addEventListener("click", () => {
4865
- closeContextMenu();
4866
- item.action();
4867
- });
4868
- }
4869
- sub.appendChild(el);
4870
- }
4871
- document.body.appendChild(sub);
4872
- const anchor = parentRow.getBoundingClientRect();
4873
- const vw = window.visualViewport?.width ?? window.innerWidth;
4874
- const vh = window.visualViewport?.height ?? window.innerHeight;
4875
- const rect = sub.getBoundingClientRect();
4876
- let left = anchor.right - 2;
4877
- if (left + rect.width > vw)
4878
- left = anchor.left - rect.width + 2;
4879
- let top = anchor.top;
4880
- if (top + rect.height > vh)
4881
- top = vh - rect.height - 4;
4882
- sub.style.left = `${Math.max(4, left)}px`;
4883
- sub.style.top = `${Math.max(4, top)}px`;
4884
- activeSubmenu = sub;
4885
- }
4886
- function showContextMenu(x, y, items, opts = {}) {
4887
- closeContextMenu();
4888
- if (opts.editTarget !== void 0 || opts.editEngine) {
4889
- const edit = editMenuItems({ target: opts.editTarget, engine: opts.editEngine }, { onError: opts.onEditError });
4890
- if (edit.length > 0) {
4891
- items = items.length > 0 ? [...edit, { label: "", action: () => {
4892
- }, separator: true }, ...items] : edit;
4893
- }
4894
- }
4895
- const menu = document.createElement("div");
4896
- menu.className = "ctx-menu";
4897
- for (const item of items) {
4898
- if (item.separator) {
4899
- const sep = document.createElement("div");
4900
- sep.className = "ctx-sep";
4901
- menu.appendChild(sep);
4902
- continue;
4903
- }
4904
- const el = document.createElement("div");
4905
- el.className = "ctx-item" + (item.disabled ? " ctx-disabled" : "") + (item.emphasized ? " ctx-emphasized" : "");
4906
- if (item.emphasized)
4907
- el.style.fontWeight = "600";
4908
- el.textContent = item.label;
4909
- if (item.tooltip)
4910
- el.title = item.tooltip;
4911
- if (item.submenu && item.submenu.length > 0 && !item.disabled) {
4912
- el.style.display = "flex";
4913
- el.style.justifyContent = "space-between";
4914
- el.style.gap = "12px";
4915
- const caret = document.createElement("span");
4916
- caret.textContent = "\u25B8";
4917
- caret.style.opacity = "0.6";
4918
- el.appendChild(caret);
4919
- const open = () => openSubmenu(el, item.submenu);
4920
- el.addEventListener("mouseenter", open);
4921
- el.addEventListener("click", (e) => {
4922
- e.stopPropagation();
4923
- open();
4924
- });
4925
- menu.appendChild(el);
4926
- continue;
4927
- }
4928
- el.addEventListener("mouseenter", closeSubmenu);
4929
- if (!item.disabled) {
4930
- el.addEventListener("click", () => {
4931
- closeContextMenu();
4932
- item.action();
4933
- });
4934
- }
4935
- menu.appendChild(el);
4936
- }
4937
- menu.style.left = `${x}px`;
4938
- menu.style.top = `${y}px`;
4939
- document.body.appendChild(menu);
4940
- const vw = window.visualViewport?.width ?? window.innerWidth;
4941
- const vh = window.visualViewport?.height ?? window.innerHeight;
4942
- let rect = menu.getBoundingClientRect();
4943
- if (rect.height > vh - 8) {
4944
- menu.style.maxHeight = `${vh - 8}px`;
4945
- menu.style.overflowY = "auto";
4946
- rect = menu.getBoundingClientRect();
4947
- }
4948
- let left = x, top = y;
4949
- if (left + rect.width > vw)
4950
- left = x - rect.width;
4951
- if (top + rect.height > vh)
4952
- top = y - rect.height;
4953
- left = Math.max(4, Math.min(left, vw - rect.width - 4));
4954
- top = Math.max(4, Math.min(top, vh - rect.height - 4));
4955
- menu.style.left = `${left}px`;
4956
- menu.style.top = `${top}px`;
4957
- activeMenu = menu;
4958
- requestAnimationFrame(() => {
4959
- dismissListener = (e) => {
4960
- if (activeSubmenu?.contains(e.target))
4961
- return;
4962
- if (activeMenu && !activeMenu.contains(e.target)) {
4963
- closeContextMenu();
4964
- }
4965
- };
4966
- document.addEventListener("pointerdown", dismissListener, true);
4967
- escapeListener = (e) => {
4968
- if (e.key === "Escape") {
4969
- e.preventDefault();
4970
- e.stopPropagation();
4971
- closeContextMenu();
4972
- }
4973
- };
4974
- document.addEventListener("keydown", escapeListener, true);
4975
- });
4976
- }
4977
- document.addEventListener("scroll", closeContextMenu, true);
4978
- document.addEventListener("contextmenu", () => {
4979
- });
4980
- window.addEventListener("message", (e) => {
4981
- if (e.data && e.data.type === "iframePointerDown")
4982
- closeContextMenu();
4983
- });
4984
-
4985
- // client/compose/compose.ts
4972
+ init_context_menu();
4986
4973
  installConsoleCapture();
4987
4974
  logClientEvent("compose-module-loaded", { href: location.href, version: window.mailxVersion || "?" });
4988
4975
  var _composeT0 = performance.now();
@@ -5454,7 +5441,7 @@ function showAutocompleteContextMenu(e, row) {
5454
5441
  window.open(`https://contacts.google.com/search/${encodeURIComponent(row.name || row.email)}`, "_blank");
5455
5442
  }
5456
5443
  }
5457
- ]);
5444
+ ], { editTarget: e.target });
5458
5445
  }
5459
5446
  function openAddToPreferredModal(prefill) {
5460
5447
  const overlay = document.createElement("div");