react-os-shell 0.2.67 → 0.3.0

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 (69) hide show
  1. package/README.md +35 -15
  2. package/dist/{Browser-OH3E6TIZ.js → Browser-H5KDP5OH.js} +3 -3
  3. package/dist/{Browser-OH3E6TIZ.js.map → Browser-H5KDP5OH.js.map} +1 -1
  4. package/dist/{Calculator-DBSWD2RM.js → Calculator-QQ7NF53Q.js} +4 -4
  5. package/dist/{Calculator-DBSWD2RM.js.map → Calculator-QQ7NF53Q.js.map} +1 -1
  6. package/dist/{Calendar-5S3MOTVB.js → Calendar-J6L7FGHS.js} +175 -108
  7. package/dist/Calendar-J6L7FGHS.js.map +1 -0
  8. package/dist/{CurrencyConverter-TDAW7VME.js → CurrencyConverter-YHOGBUPH.js} +4 -4
  9. package/dist/{CurrencyConverter-TDAW7VME.js.map → CurrencyConverter-YHOGBUPH.js.map} +1 -1
  10. package/dist/{Documents-R4DZLBJU.js → Documents-6DYALASM.js} +3 -3
  11. package/dist/{Documents-R4DZLBJU.js.map → Documents-6DYALASM.js.map} +1 -1
  12. package/dist/Email-U2U5Z4DL.js +475 -0
  13. package/dist/Email-U2U5Z4DL.js.map +1 -0
  14. package/dist/Files-T62M4V5I.js +11 -0
  15. package/dist/{Files-XD7SWQSG.js.map → Files-T62M4V5I.js.map} +1 -1
  16. package/dist/{Minesweeper-YWYMJQN6.js → Minesweeper-S2JHXYLX.js} +3 -3
  17. package/dist/{Minesweeper-YWYMJQN6.js.map → Minesweeper-S2JHXYLX.js.map} +1 -1
  18. package/dist/{Notepad-F3BJYZJL.js → Notepad-2YF7X3XO.js} +3 -3
  19. package/dist/{Notepad-F3BJYZJL.js.map → Notepad-2YF7X3XO.js.map} +1 -1
  20. package/dist/{PomodoroTimer-VLPDNV7W.js → PomodoroTimer-3J7Z3NVQ.js} +4 -4
  21. package/dist/{PomodoroTimer-VLPDNV7W.js.map → PomodoroTimer-3J7Z3NVQ.js.map} +1 -1
  22. package/dist/Preview-WM6ZP5PZ.js +8 -0
  23. package/dist/{Preview-XOCYZM4T.js.map → Preview-WM6ZP5PZ.js.map} +1 -1
  24. package/dist/Spreadsheet-ZIE2SXAF.js +6 -0
  25. package/dist/{Spreadsheet-7NEC5RBR.js.map → Spreadsheet-ZIE2SXAF.js.map} +1 -1
  26. package/dist/{TodoList-7JZ2SLDI.js → TodoList-QGXCDEIE.js} +18 -204
  27. package/dist/TodoList-QGXCDEIE.js.map +1 -0
  28. package/dist/{Weather-HLXHNBM4.js → Weather-2GFPSZ5V.js} +4 -4
  29. package/dist/{Weather-HLXHNBM4.js.map → Weather-2GFPSZ5V.js.map} +1 -1
  30. package/dist/{WorldClock-HIWKHF6U.js → WorldClock-P4JR5I6X.js} +4 -4
  31. package/dist/{WorldClock-HIWKHF6U.js.map → WorldClock-P4JR5I6X.js.map} +1 -1
  32. package/dist/apps/index.d.ts +2 -5
  33. package/dist/apps/index.js +23 -26
  34. package/dist/apps/index.js.map +1 -1
  35. package/dist/chunk-57B3WALN.js +114 -0
  36. package/dist/chunk-57B3WALN.js.map +1 -0
  37. package/dist/{chunk-GAC6D4LN.js → chunk-62FC2FHC.js} +94 -23
  38. package/dist/chunk-62FC2FHC.js.map +1 -0
  39. package/dist/{chunk-HAUVCQNK.js → chunk-ATQVRDDQ.js} +3 -3
  40. package/dist/{chunk-HAUVCQNK.js.map → chunk-ATQVRDDQ.js.map} +1 -1
  41. package/dist/{chunk-GP4Y3VCB.js → chunk-KMGWSDEI.js} +480 -4
  42. package/dist/chunk-KMGWSDEI.js.map +1 -0
  43. package/dist/{chunk-KFRHMW57.js → chunk-O6FJZAFM.js} +3 -3
  44. package/dist/{chunk-KFRHMW57.js.map → chunk-O6FJZAFM.js.map} +1 -1
  45. package/dist/{chunk-VG5ZM3QD.js → chunk-SEV7UXGN.js} +4 -4
  46. package/dist/{chunk-VG5ZM3QD.js.map → chunk-SEV7UXGN.js.map} +1 -1
  47. package/dist/{chunk-EXYMMWOS.js → chunk-ZBRFMK3E.js} +4 -4
  48. package/dist/{chunk-EXYMMWOS.js.map → chunk-ZBRFMK3E.js.map} +1 -1
  49. package/dist/index.d.ts +55 -1
  50. package/dist/index.js +242 -136
  51. package/dist/index.js.map +1 -1
  52. package/package.json +10 -3
  53. package/dist/Calendar-5S3MOTVB.js.map +0 -1
  54. package/dist/Email-OAQ76CET.js +0 -1883
  55. package/dist/Email-OAQ76CET.js.map +0 -1
  56. package/dist/Files-XD7SWQSG.js +0 -12
  57. package/dist/GeminiChat-XTEBZIVK.js +0 -184
  58. package/dist/GeminiChat-XTEBZIVK.js.map +0 -1
  59. package/dist/Preview-XOCYZM4T.js +0 -8
  60. package/dist/Spreadsheet-7NEC5RBR.js +0 -7
  61. package/dist/TodoList-7JZ2SLDI.js.map +0 -1
  62. package/dist/chunk-5VXRBUEH.js +0 -104
  63. package/dist/chunk-5VXRBUEH.js.map +0 -1
  64. package/dist/chunk-62EP7CNW.js +0 -485
  65. package/dist/chunk-62EP7CNW.js.map +0 -1
  66. package/dist/chunk-GAC6D4LN.js.map +0 -1
  67. package/dist/chunk-GP4Y3VCB.js.map +0 -1
  68. package/dist/chunk-MVWEL34Y.js +0 -209
  69. package/dist/chunk-MVWEL34Y.js.map +0 -1
package/dist/index.js CHANGED
@@ -1,20 +1,20 @@
1
1
  import { useEmailUnreadCount } from './chunk-PDFQNHW7.js';
2
2
  import { formatDate } from './chunk-NSU7OHPC.js';
3
3
  export { formatDate } from './chunk-NSU7OHPC.js';
4
+ import { useMailAuth } from './chunk-57B3WALN.js';
5
+ export { setShellMailServer, useMailAuth } from './chunk-57B3WALN.js';
4
6
  import { subscribePomo, getPomoSnapshot } from './chunk-MK3HLUO4.js';
5
- import { useGoogleAuth } from './chunk-MVWEL34Y.js';
6
7
  import { useShellPrefs } from './chunk-36VM54SC.js';
7
8
  export { ShellPrefsProvider, useLocalStoragePrefs, useShellPrefs } from './chunk-36VM54SC.js';
8
- import { PREVIEW_OPENED_EVENT, openPreviewFile } from './chunk-EXYMMWOS.js';
9
+ import { PREVIEW_OPENED_EVENT, openPreviewFile } from './chunk-ZBRFMK3E.js';
9
10
  import { playNotification, playStartup, soundsEnabled, getSoundConfig, SOUND_PACK_KEYS, SOUND_PACKS, SOUND_TYPES, SOUND_TYPE_LABELS, playLogout, setSoundForType, previewSound, setAllSounds } from './chunk-D7PYW2QS.js';
10
- import { setPdfPreview } from './chunk-HAUVCQNK.js';
11
+ import { setPdfPreview } from './chunk-ATQVRDDQ.js';
11
12
  import './chunk-KUIPWCTJ.js';
12
13
  import { toast_default } from './chunk-WIJ45SYD.js';
13
14
  export { toast_default as toast } from './chunk-WIJ45SYD.js';
14
- import './chunk-62EP7CNW.js';
15
- export { EditableGrid } from './chunk-GP4Y3VCB.js';
16
- import { useWindowManager, PopupMenu, PopupMenuLabel, PopupMenuDivider, PopupMenuItem, Modal, useIsMobile, ModalActions, useModalActive, WINDOW_REGISTRY, isPageEntry, LoadingSpinner, ThumbCard, activateModal } from './chunk-GAC6D4LN.js';
17
- export { CancelButton, CopyButton, DocFavStar, Modal, ModalActions, PopupMenu, PopupMenuDivider, PopupMenuItem, PopupMenuLabel, WindowManagerProvider, WindowTitle, commitExposeHighlight, exitExposeMode, getActiveWindowRoute, getExposeHighlight, isEntityEntry, isPageEntry, setExposeHighlight, setShellApiClient, setShellWindowRegistry, setWindowDefaultPosition, subscribeExposeHighlight, toggleExposeMode, useModalActive, useWidgetSettings, useWindowManager, useWindowMenuItem, useWindowTitle } from './chunk-GAC6D4LN.js';
15
+ export { EditableGrid } from './chunk-KMGWSDEI.js';
16
+ import { useWindowManager, PopupMenu, PopupMenuLabel, PopupMenuDivider, PopupMenuItem, Modal, ModalActions, useIsMobile, useModalActive, WINDOW_REGISTRY, isPageEntry, LoadingSpinner, ThumbCard, activateModal } from './chunk-62FC2FHC.js';
17
+ export { CancelButton, CopyButton, DocFavStar, Modal, ModalActions, PopupMenu, PopupMenuDivider, PopupMenuItem, PopupMenuLabel, WindowManagerProvider, WindowTitle, commitExposeHighlight, exitExposeMode, getActiveWindowRoute, getExposeHighlight, isEntityEntry, isPageEntry, setExposeHighlight, setShellApiClient, setShellWindowRegistry, setWindowDefaultPosition, subscribeExposeHighlight, toggleExposeMode, useModalActive, useWidgetSettings, useWindowManager, useWindowMenuItem, useWindowTitle } from './chunk-62FC2FHC.js';
18
18
  import { confirm } from './chunk-PLGHQ7QW.js';
19
19
  export { ConfirmProvider, confirm, confirmDestructive, prompt } from './chunk-PLGHQ7QW.js';
20
20
  import { useAuth } from './chunk-ADJ3CERD.js';
@@ -915,7 +915,7 @@ function StatusBadge({ status }) {
915
915
  }
916
916
 
917
917
  // src/version.ts
918
- var VERSION = "0.2.67" ;
918
+ var VERSION = "0.3.0" ;
919
919
  var APP_VERSION = VERSION;
920
920
 
921
921
  // src/changelog.ts
@@ -2510,126 +2510,219 @@ function useTheme() {
2510
2510
  }, [accentColor, customBgColor, customTitleColor, customWindowColor, customButtonColor]);
2511
2511
  return { theme: saved, resolved };
2512
2512
  }
2513
- function GoogleConnectModal({ open, onClose }) {
2514
- const { isConnected, user, connect, disconnect, loading, error, hasClientId, setClientId } = useGoogleAuth();
2515
- const [clientIdInput, setClientIdInput] = useState("");
2516
- const clientIdRef = useRef(null);
2517
- return /* @__PURE__ */ jsxs(Modal, { open, onClose, title: "Google Services", size: "md", children: [
2518
- /* @__PURE__ */ jsxs("div", { className: "space-y-5", children: [
2519
- /* @__PURE__ */ jsx("div", { className: `rounded-lg border p-4 ${isConnected ? "border-green-200 bg-green-50" : "border-gray-200 bg-gray-50"}`, children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
2520
- /* @__PURE__ */ jsx("div", { className: `h-10 w-10 rounded-full flex items-center justify-center ${isConnected ? "bg-green-100" : "bg-gray-200"}`, children: isConnected && user?.picture ? /* @__PURE__ */ jsx("img", { src: user.picture, alt: "", className: "h-10 w-10 rounded-full" }) : /* @__PURE__ */ jsx("svg", { className: "h-5 w-5 text-gray-400", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 1.5, children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M15.75 6a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0zM4.501 20.118a7.5 7.5 0 0114.998 0A17.933 17.933 0 0112 21.75c-2.676 0-5.216-.584-7.499-1.632z" }) }) }),
2521
- /* @__PURE__ */ jsx("div", { className: "flex-1 min-w-0", children: isConnected ? /* @__PURE__ */ jsxs(Fragment, { children: [
2522
- /* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-green-900", children: user?.name || "Connected" }),
2523
- /* @__PURE__ */ jsx("p", { className: "text-xs text-green-700 truncate", children: user?.email })
2524
- ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
2525
- /* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-gray-900", children: "Not connected" }),
2526
- /* @__PURE__ */ jsx("p", { className: "text-xs text-gray-500", children: "Sign in to access Google services" })
2527
- ] }) }),
2528
- isConnected && /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1 rounded-full bg-green-100 px-2.5 py-0.5 text-xs font-medium text-green-700", children: [
2529
- /* @__PURE__ */ jsx("svg", { className: "h-3 w-3", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M5 13l4 4L19 7" }) }),
2530
- "Connected"
2513
+ var PRESETS = [
2514
+ {
2515
+ id: "fastmail",
2516
+ label: "Fastmail",
2517
+ imap: { host: "imap.fastmail.com", port: 993, secure: true },
2518
+ smtp: { host: "smtp.fastmail.com", port: 465, secure: true },
2519
+ caldav: "https://caldav.fastmail.com/"
2520
+ },
2521
+ {
2522
+ id: "icloud",
2523
+ label: "iCloud",
2524
+ note: "Requires an app-specific password (appleid.apple.com).",
2525
+ imap: { host: "imap.mail.me.com", port: 993, secure: true },
2526
+ smtp: { host: "smtp.mail.me.com", port: 587, secure: false },
2527
+ caldav: "https://caldav.icloud.com/"
2528
+ },
2529
+ {
2530
+ id: "yahoo",
2531
+ label: "Yahoo",
2532
+ note: "Requires an app password (account.yahoo.com).",
2533
+ imap: { host: "imap.mail.yahoo.com", port: 993, secure: true },
2534
+ smtp: { host: "smtp.mail.yahoo.com", port: 465, secure: true },
2535
+ caldav: "https://caldav.calendar.yahoo.com/"
2536
+ },
2537
+ {
2538
+ id: "gmail",
2539
+ label: "Gmail (app password required)",
2540
+ note: "Enable 2FA and create an app password \u2014 Gmail rejects regular passwords for IMAP.",
2541
+ imap: { host: "imap.gmail.com", port: 993, secure: true },
2542
+ smtp: { host: "smtp.gmail.com", port: 465, secure: true }
2543
+ },
2544
+ {
2545
+ id: "outlook",
2546
+ label: "Outlook (app password required)",
2547
+ note: "Modern auth not supported \u2014 generate an app password in Microsoft account settings.",
2548
+ imap: { host: "outlook.office365.com", port: 993, secure: true },
2549
+ smtp: { host: "smtp.office365.com", port: 587, secure: false }
2550
+ },
2551
+ {
2552
+ id: "custom",
2553
+ label: "Custom",
2554
+ imap: { host: "", port: 993, secure: true },
2555
+ smtp: { host: "", port: 465, secure: true }
2556
+ }
2557
+ ];
2558
+ function MailConnectModal({ open, onClose }) {
2559
+ const { isConnected, user, capabilities, login, logout, loading, error } = useMailAuth();
2560
+ const [presetId, setPresetId] = useState("fastmail");
2561
+ const preset = PRESETS.find((p) => p.id === presetId) || PRESETS[0];
2562
+ const prefill = typeof window !== "undefined" ? localStorage.getItem("mail_login_prefill_email") || "" : "";
2563
+ const [email, setEmail] = useState(prefill);
2564
+ const [password, setPassword] = useState("");
2565
+ const [imapHost, setImapHost] = useState(preset.imap.host);
2566
+ const [imapPort, setImapPort] = useState(preset.imap.port);
2567
+ const [imapSecure, setImapSecure] = useState(preset.imap.secure);
2568
+ const [smtpHost, setSmtpHost] = useState(preset.smtp.host);
2569
+ const [smtpPort, setSmtpPort] = useState(preset.smtp.port);
2570
+ const [smtpSecure, setSmtpSecure] = useState(preset.smtp.secure);
2571
+ const [caldavUrl, setCaldavUrl] = useState(preset.caldav || "");
2572
+ const [localError, setLocalError] = useState(null);
2573
+ useEffect(() => {
2574
+ setImapHost(preset.imap.host);
2575
+ setImapPort(preset.imap.port);
2576
+ setImapSecure(preset.imap.secure);
2577
+ setSmtpHost(preset.smtp.host);
2578
+ setSmtpPort(preset.smtp.port);
2579
+ setSmtpSecure(preset.smtp.secure);
2580
+ setCaldavUrl(preset.caldav || "");
2581
+ }, [preset]);
2582
+ async function handleSubmit(e) {
2583
+ e.preventDefault();
2584
+ setLocalError(null);
2585
+ if (!email || !password) {
2586
+ setLocalError("Email and password are required");
2587
+ return;
2588
+ }
2589
+ const payload = {
2590
+ imap: { host: imapHost, port: imapPort, secure: imapSecure, user: email, pass: password },
2591
+ smtp: { host: smtpHost, port: smtpPort, secure: smtpSecure, user: email, pass: password },
2592
+ caldav: caldavUrl ? { serverUrl: caldavUrl, user: email, pass: password } : void 0
2593
+ };
2594
+ try {
2595
+ await login(payload);
2596
+ onClose();
2597
+ } catch {
2598
+ }
2599
+ }
2600
+ return /* @__PURE__ */ jsxs(Modal, { open, onClose, title: "Mail & Calendar", size: "md", children: [
2601
+ isConnected ? /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
2602
+ /* @__PURE__ */ jsxs("div", { className: "rounded-lg border border-green-200 bg-green-50 p-4", children: [
2603
+ /* @__PURE__ */ jsxs("p", { className: "text-sm font-medium text-green-900", children: [
2604
+ "Connected as ",
2605
+ user?.email
2606
+ ] }),
2607
+ /* @__PURE__ */ jsxs("p", { className: "text-xs text-green-700 mt-1", children: [
2608
+ "IMAP: ok \xB7 SMTP: ok \xB7 CalDAV: ",
2609
+ capabilities?.caldav ? "ok" : "not configured"
2531
2610
  ] })
2532
- ] }) }),
2533
- /* @__PURE__ */ jsxs("div", { children: [
2534
- /* @__PURE__ */ jsx("h3", { className: "text-sm font-semibold text-gray-900 mb-2", children: "Available Services" }),
2535
- /* @__PURE__ */ jsx("div", { className: "space-y-2", children: [
2536
- { icon: /* @__PURE__ */ jsxs("svg", { className: "h-5 w-5", viewBox: "0 0 24 24", children: [
2537
- /* @__PURE__ */ jsx("path", { d: "M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 01-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z", fill: "#4285F4" }),
2538
- /* @__PURE__ */ jsx("path", { d: "M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z", fill: "#34A853" }),
2539
- /* @__PURE__ */ jsx("path", { d: "M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z", fill: "#FBBC05" }),
2540
- /* @__PURE__ */ jsx("path", { d: "M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z", fill: "#EA4335" })
2541
- ] }), label: "Gmail", desc: "Read, compose, and send emails" },
2542
- { icon: /* @__PURE__ */ jsxs("svg", { className: "h-5 w-5", viewBox: "0 0 24 24", children: [
2543
- /* @__PURE__ */ jsx("path", { d: "M19.5 3.75H4.5A2.25 2.25 0 002.25 6v12a2.25 2.25 0 002.25 2.25h15A2.25 2.25 0 0021.75 18V6a2.25 2.25 0 00-2.25-2.25z", fill: "none", stroke: "#4285F4", strokeWidth: 1.5 }),
2544
- /* @__PURE__ */ jsx("path", { d: "M2.25 9h19.5M6.75 3.75v3m4.5-3v3m4.5-3v3", fill: "none", stroke: "#4285F4", strokeWidth: 1.5, strokeLinecap: "round" })
2545
- ] }), label: "Calendar", desc: "View and create calendar events" },
2546
- { icon: /* @__PURE__ */ jsx("svg", { className: "h-5 w-5", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx("path", { d: "M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5", fill: "none", stroke: "#8B5CF6", strokeWidth: 1.5, strokeLinecap: "round", strokeLinejoin: "round" }) }), label: "Gemini AI", desc: "Chat with Google AI assistant" }
2547
- ].map((svc) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 rounded-lg border border-gray-200 px-4 py-3", children: [
2548
- /* @__PURE__ */ jsx("div", { className: "shrink-0", children: svc.icon }),
2549
- /* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0", children: [
2550
- /* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-gray-900", children: svc.label }),
2551
- /* @__PURE__ */ jsx("p", { className: "text-xs text-gray-500", children: svc.desc })
2552
- ] }),
2553
- isConnected && /* @__PURE__ */ jsx("svg", { className: "h-4 w-4 text-green-500 shrink-0", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M5 13l4 4L19 7" }) })
2554
- ] }, svc.label)) })
2555
2611
  ] }),
2556
- !hasClientId && /* @__PURE__ */ jsxs("div", { className: "space-y-2 bg-amber-50 border border-amber-200 rounded-lg p-4", children: [
2557
- /* @__PURE__ */ jsx("p", { className: "text-xs font-medium text-amber-800", children: "Setup required: Google OAuth Client ID" }),
2612
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-gray-500", children: "Disconnect to switch accounts. Credentials are not persisted to disk \u2014 restarting the bridge server signs you out." })
2613
+ ] }) : /* @__PURE__ */ jsxs("form", { onSubmit: handleSubmit, className: "space-y-4", children: [
2614
+ /* @__PURE__ */ jsxs("label", { className: "block", children: [
2615
+ /* @__PURE__ */ jsx("span", { className: "block text-xs font-medium text-gray-700 mb-1", children: "Provider" }),
2558
2616
  /* @__PURE__ */ jsx(
2559
- "input",
2617
+ "select",
2560
2618
  {
2561
- ref: clientIdRef,
2562
- value: clientIdInput,
2563
- onChange: (e) => setClientIdInput(e.target.value),
2564
- onInput: (e) => setClientIdInput(e.target.value),
2565
- placeholder: "123456789.apps.googleusercontent.com",
2566
- className: "w-full rounded-md border border-gray-300 px-3 py-2 text-sm focus:border-blue-500 focus:ring-blue-500"
2619
+ value: presetId,
2620
+ onChange: (e) => setPresetId(e.target.value),
2621
+ className: "w-full rounded-md border border-gray-300 px-3 py-2 text-sm",
2622
+ children: PRESETS.map((p) => /* @__PURE__ */ jsx("option", { value: p.id, children: p.label }, p.id))
2567
2623
  }
2568
- ),
2569
- /* @__PURE__ */ jsx(
2570
- "button",
2571
- {
2572
- type: "button",
2573
- onPointerDown: (e) => e.stopPropagation(),
2574
- onClick: () => {
2575
- const val = (clientIdRef.current?.value || clientIdInput).trim();
2576
- if (val) {
2577
- setClientId(val);
2578
- setClientIdInput(val);
2579
- }
2580
- },
2581
- className: "w-full bg-gray-900 text-white px-4 py-2 text-sm font-medium rounded-lg hover:bg-gray-800 cursor-pointer",
2582
- children: "Save Client ID"
2583
- }
2584
- ),
2585
- /* @__PURE__ */ jsxs("div", { className: "text-[10px] text-gray-500 space-y-0.5 mt-1", children: [
2586
- /* @__PURE__ */ jsx("p", { className: "font-medium text-gray-600", children: "Setup instructions:" }),
2587
- /* @__PURE__ */ jsxs("p", { children: [
2588
- "1. Go to ",
2589
- /* @__PURE__ */ jsx("a", { href: "https://console.cloud.google.com/apis/credentials", target: "_blank", rel: "noopener noreferrer", className: "text-blue-600 hover:underline", children: "console.cloud.google.com > APIs & Services > Credentials" })
2624
+ )
2625
+ ] }),
2626
+ preset.note && /* @__PURE__ */ jsx("p", { className: "text-[11px] text-amber-700 bg-amber-50 border border-amber-200 rounded p-2", children: preset.note }),
2627
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-3", children: [
2628
+ /* @__PURE__ */ jsxs("label", { className: "block col-span-2", children: [
2629
+ /* @__PURE__ */ jsx("span", { className: "block text-xs font-medium text-gray-700 mb-1", children: "Email" }),
2630
+ /* @__PURE__ */ jsx(
2631
+ "input",
2632
+ {
2633
+ type: "email",
2634
+ value: email,
2635
+ onChange: (e) => setEmail(e.target.value),
2636
+ autoComplete: "username",
2637
+ className: "w-full rounded-md border border-gray-300 px-3 py-2 text-sm"
2638
+ }
2639
+ )
2640
+ ] }),
2641
+ /* @__PURE__ */ jsxs("label", { className: "block col-span-2", children: [
2642
+ /* @__PURE__ */ jsx("span", { className: "block text-xs font-medium text-gray-700 mb-1", children: "Password" }),
2643
+ /* @__PURE__ */ jsx(
2644
+ "input",
2645
+ {
2646
+ type: "password",
2647
+ value: password,
2648
+ onChange: (e) => setPassword(e.target.value),
2649
+ autoComplete: "current-password",
2650
+ className: "w-full rounded-md border border-gray-300 px-3 py-2 text-sm"
2651
+ }
2652
+ )
2653
+ ] })
2654
+ ] }),
2655
+ /* @__PURE__ */ jsxs("fieldset", { className: "border border-gray-200 rounded-md p-3", children: [
2656
+ /* @__PURE__ */ jsx("legend", { className: "px-1 text-xs font-medium text-gray-600", children: "IMAP (incoming)" }),
2657
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-3 gap-2", children: [
2658
+ /* @__PURE__ */ jsxs("label", { className: "block col-span-2", children: [
2659
+ /* @__PURE__ */ jsx("span", { className: "block text-[11px] text-gray-600 mb-1", children: "Host" }),
2660
+ /* @__PURE__ */ jsx("input", { value: imapHost, onChange: (e) => setImapHost(e.target.value), className: "w-full rounded border border-gray-300 px-2 py-1 text-sm" })
2590
2661
  ] }),
2591
- /* @__PURE__ */ jsxs("p", { children: [
2592
- "2. Click ",
2593
- /* @__PURE__ */ jsx("b", { children: '"+ Create Credentials"' }),
2594
- ", then select ",
2595
- /* @__PURE__ */ jsx("b", { children: "OAuth client ID" })
2662
+ /* @__PURE__ */ jsxs("label", { className: "block", children: [
2663
+ /* @__PURE__ */ jsx("span", { className: "block text-[11px] text-gray-600 mb-1", children: "Port" }),
2664
+ /* @__PURE__ */ jsx("input", { type: "number", value: imapPort, onChange: (e) => setImapPort(Number(e.target.value)), className: "w-full rounded border border-gray-300 px-2 py-1 text-sm" })
2596
2665
  ] }),
2597
- /* @__PURE__ */ jsxs("p", { children: [
2598
- "3. Choose ",
2599
- /* @__PURE__ */ jsx("b", { children: '"Web application"' }),
2600
- ", give it any name, add the URL where this app runs (e.g. ",
2601
- /* @__PURE__ */ jsx("b", { children: "http://localhost:5173" }),
2602
- ") as an Authorized JavaScript origin, then click Create"
2666
+ /* @__PURE__ */ jsxs("label", { className: "col-span-3 flex items-center gap-2 text-xs text-gray-600 mt-1", children: [
2667
+ /* @__PURE__ */ jsx("input", { type: "checkbox", checked: imapSecure, onChange: (e) => setImapSecure(e.target.checked) }),
2668
+ "Use TLS/SSL (recommended for port 993)"
2669
+ ] })
2670
+ ] })
2671
+ ] }),
2672
+ /* @__PURE__ */ jsxs("fieldset", { className: "border border-gray-200 rounded-md p-3", children: [
2673
+ /* @__PURE__ */ jsx("legend", { className: "px-1 text-xs font-medium text-gray-600", children: "SMTP (outgoing)" }),
2674
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-3 gap-2", children: [
2675
+ /* @__PURE__ */ jsxs("label", { className: "block col-span-2", children: [
2676
+ /* @__PURE__ */ jsx("span", { className: "block text-[11px] text-gray-600 mb-1", children: "Host" }),
2677
+ /* @__PURE__ */ jsx("input", { value: smtpHost, onChange: (e) => setSmtpHost(e.target.value), className: "w-full rounded border border-gray-300 px-2 py-1 text-sm" })
2603
2678
  ] }),
2604
- /* @__PURE__ */ jsx("p", { children: "4. Copy your Client ID and paste it above" })
2679
+ /* @__PURE__ */ jsxs("label", { className: "block", children: [
2680
+ /* @__PURE__ */ jsx("span", { className: "block text-[11px] text-gray-600 mb-1", children: "Port" }),
2681
+ /* @__PURE__ */ jsx("input", { type: "number", value: smtpPort, onChange: (e) => setSmtpPort(Number(e.target.value)), className: "w-full rounded border border-gray-300 px-2 py-1 text-sm" })
2682
+ ] }),
2683
+ /* @__PURE__ */ jsxs("label", { className: "col-span-3 flex items-center gap-2 text-xs text-gray-600 mt-1", children: [
2684
+ /* @__PURE__ */ jsx("input", { type: "checkbox", checked: smtpSecure, onChange: (e) => setSmtpSecure(e.target.checked) }),
2685
+ "Use TLS/SSL (recommended for port 465)"
2686
+ ] })
2605
2687
  ] })
2606
2688
  ] }),
2607
- error && /* @__PURE__ */ jsx("p", { className: "text-sm text-red-600", children: error })
2689
+ /* @__PURE__ */ jsxs("fieldset", { className: "border border-gray-200 rounded-md p-3", children: [
2690
+ /* @__PURE__ */ jsx("legend", { className: "px-1 text-xs font-medium text-gray-600", children: "CalDAV (optional)" }),
2691
+ /* @__PURE__ */ jsxs("label", { className: "block", children: [
2692
+ /* @__PURE__ */ jsx("span", { className: "block text-[11px] text-gray-600 mb-1", children: "Server URL" }),
2693
+ /* @__PURE__ */ jsx(
2694
+ "input",
2695
+ {
2696
+ type: "url",
2697
+ value: caldavUrl,
2698
+ onChange: (e) => setCaldavUrl(e.target.value),
2699
+ placeholder: "https://caldav.example.com/",
2700
+ className: "w-full rounded border border-gray-300 px-2 py-1 text-sm"
2701
+ }
2702
+ )
2703
+ ] }),
2704
+ /* @__PURE__ */ jsx("p", { className: "text-[10px] text-gray-500 mt-1", children: "Leave blank to skip calendar setup." })
2705
+ ] }),
2706
+ (localError || error) && /* @__PURE__ */ jsx("p", { className: "text-sm text-red-600 bg-red-50 border border-red-200 rounded p-2", children: localError || error })
2608
2707
  ] }),
2609
2708
  /* @__PURE__ */ jsx(ModalActions, { children: isConnected ? /* @__PURE__ */ jsx(
2610
2709
  "button",
2611
2710
  {
2612
- onClick: disconnect,
2613
- className: "inline-flex items-center gap-1.5 text-red-600 border border-red-200 bg-white px-4 py-2 text-sm font-medium rounded-lg hover:bg-red-50",
2614
- children: "Disconnect"
2711
+ onClick: logout,
2712
+ disabled: loading,
2713
+ className: "inline-flex items-center gap-1.5 text-red-600 border border-red-200 bg-white px-4 py-2 text-sm font-medium rounded-lg hover:bg-red-50 disabled:opacity-50",
2714
+ children: loading ? "Disconnecting\u2026" : "Disconnect"
2615
2715
  }
2616
- ) : hasClientId ? /* @__PURE__ */ jsxs(
2716
+ ) : /* @__PURE__ */ jsx(
2617
2717
  "button",
2618
2718
  {
2619
- onClick: connect,
2719
+ type: "button",
2720
+ onClick: (e) => handleSubmit(e),
2620
2721
  disabled: loading,
2621
- className: "inline-flex items-center gap-2 bg-white border border-gray-300 shadow-sm px-5 py-2 text-sm font-medium rounded-lg hover:bg-gray-50 disabled:opacity-50",
2622
- children: [
2623
- /* @__PURE__ */ jsxs("svg", { className: "h-5 w-5", viewBox: "0 0 24 24", children: [
2624
- /* @__PURE__ */ jsx("path", { d: "M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 01-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z", fill: "#4285F4" }),
2625
- /* @__PURE__ */ jsx("path", { d: "M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z", fill: "#34A853" }),
2626
- /* @__PURE__ */ jsx("path", { d: "M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z", fill: "#FBBC05" }),
2627
- /* @__PURE__ */ jsx("path", { d: "M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z", fill: "#EA4335" })
2628
- ] }),
2629
- loading ? "Connecting..." : "Sign in with Google"
2630
- ]
2722
+ className: "inline-flex items-center gap-2 bg-gray-900 text-white px-5 py-2 text-sm font-medium rounded-lg hover:bg-gray-800 disabled:opacity-50",
2723
+ children: loading ? "Connecting\u2026" : "Connect"
2631
2724
  }
2632
- ) : null })
2725
+ ) })
2633
2726
  ] });
2634
2727
  }
2635
2728
  function useClickOutside(ref, onClose) {
@@ -3550,7 +3643,7 @@ function MobileSwitcher({ windows, onActivate, onClose, onCloseAll }) {
3550
3643
  "Open apps \xB7 ",
3551
3644
  windows.length
3552
3645
  ] }),
3553
- /* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 gap-3", children: windows.map((w) => /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-stretch gap-1", children: [
3646
+ /* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 gap-3", children: windows.map((w) => /* @__PURE__ */ jsxs("div", { className: "group flex flex-col items-stretch gap-1", children: [
3554
3647
  /* @__PURE__ */ jsx(
3555
3648
  ThumbCard,
3556
3649
  {
@@ -4165,13 +4258,36 @@ function Layout({
4165
4258
  const [balloonDismissed, setBalloonDismissed] = useState(false);
4166
4259
  const [isFullscreen, setIsFullscreen] = useState(!!document.fullscreenElement);
4167
4260
  const [taskbarMenu, setTaskbarMenu] = useState(null);
4168
- const [googleConnectOpen, setGoogleConnectOpen] = useState(false);
4169
- const { isConnected: googleConnected } = useGoogleAuth();
4261
+ const [mailConnectOpen, setMailConnectOpen] = useState(false);
4262
+ const { isConnected: mailConnected } = useMailAuth();
4263
+ useEffect(() => {
4264
+ const KEY = "shell_migration_v2_mail";
4265
+ if (typeof window === "undefined" || localStorage.getItem(KEY) === "done") return;
4266
+ localStorage.removeItem("google_access_token");
4267
+ localStorage.removeItem("google_token_expiry");
4268
+ localStorage.removeItem("google_user_info");
4269
+ localStorage.removeItem("google_oauth_client_id");
4270
+ try {
4271
+ const raw = localStorage.getItem("shell_todos");
4272
+ if (raw) {
4273
+ const parsed = JSON.parse(raw);
4274
+ if (Array.isArray(parsed)) {
4275
+ const cleaned = parsed.map((t) => {
4276
+ const { gtaskId: _g, gtaskListId: _l, syncedAt: _s, ...rest } = t;
4277
+ return rest;
4278
+ });
4279
+ localStorage.setItem("shell_todos", JSON.stringify(cleaned));
4280
+ }
4281
+ }
4282
+ } catch {
4283
+ }
4284
+ localStorage.setItem(KEY, "done");
4285
+ }, []);
4170
4286
  const [showLogout, setShowLogout] = useState(false);
4171
4287
  useEffect(() => {
4172
- const handler = () => setGoogleConnectOpen(true);
4173
- window.addEventListener("open-google-connect", handler);
4174
- return () => window.removeEventListener("open-google-connect", handler);
4288
+ const handler = () => setMailConnectOpen(true);
4289
+ window.addEventListener("open-mail-connect", handler);
4290
+ return () => window.removeEventListener("open-mail-connect", handler);
4175
4291
  }, []);
4176
4292
  const savePref = useCallback((key, value) => {
4177
4293
  savePrefs({ [key]: value });
@@ -4430,21 +4546,16 @@ function Layout({
4430
4546
  /* @__PURE__ */ jsx("div", { id: "taskbar-windows", className: `flex-1 flex ${isVerticalTaskbar ? "flex-col items-center gap-1 min-h-0 overflow-y-auto w-full" : "items-center gap-1.5 min-w-0 overflow-x-auto"}` }),
4431
4547
  /* @__PURE__ */ jsx("div", { className: isVerticalTaskbar ? "h-px w-6 bg-gray-300 my-1" : "w-px h-6 bg-gray-300 mx-1" }),
4432
4548
  isVerticalTaskbar ? (
4433
- /* Vertical: clock + bell + google evenly spaced in a row */
4549
+ /* Vertical: clock + mail-connect + bell evenly spaced */
4434
4550
  /* @__PURE__ */ jsx("div", { className: "w-full px-2", children: /* @__PURE__ */ jsxs("div", { className: `flex items-center justify-center gap-2 ${taskbarPosition === "right" ? "flex-row-reverse" : ""}`, children: [
4435
4551
  /* @__PURE__ */ jsx(TaskbarClock, {}),
4436
4552
  /* @__PURE__ */ jsx(
4437
4553
  "button",
4438
4554
  {
4439
- onClick: () => setGoogleConnectOpen(true),
4440
- title: googleConnected ? "Google Connected" : "Connect Google",
4441
- className: `shrink-0 rounded-md p-1.5 transition-colors ${googleConnected ? "hover:bg-green-50" : "text-gray-500 hover:text-gray-900 hover:bg-gray-200"}`,
4442
- children: /* @__PURE__ */ jsxs("svg", { className: "h-3.5 w-3.5", viewBox: "0 0 24 24", children: [
4443
- /* @__PURE__ */ jsx("path", { d: "M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 01-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z", fill: googleConnected ? "#16a34a" : "#9ca3af" }),
4444
- /* @__PURE__ */ jsx("path", { d: "M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z", fill: googleConnected ? "#16a34a" : "#9ca3af" }),
4445
- /* @__PURE__ */ jsx("path", { d: "M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z", fill: googleConnected ? "#16a34a" : "#9ca3af" }),
4446
- /* @__PURE__ */ jsx("path", { d: "M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z", fill: googleConnected ? "#16a34a" : "#9ca3af" })
4447
- ] })
4555
+ onClick: () => setMailConnectOpen(true),
4556
+ title: mailConnected ? "Mail & Calendar Connected" : "Connect Mail & Calendar",
4557
+ className: `shrink-0 rounded-md p-1.5 transition-colors ${mailConnected ? "hover:bg-green-50 text-green-600" : "text-gray-500 hover:text-gray-900 hover:bg-gray-200"}`,
4558
+ children: /* @__PURE__ */ jsx("svg", { className: "h-3.5 w-3.5", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 1.8, children: /* @__PURE__ */ jsx("path", { d: "M3 7l9 6 9-6M5 5h14a2 2 0 012 2v10a2 2 0 01-2 2H5a2 2 0 01-2-2V7a2 2 0 012-2z", strokeLinecap: "round", strokeLinejoin: "round" }) })
4448
4559
  }
4449
4560
  ),
4450
4561
  /* @__PURE__ */ jsx(TaskbarPomodoro, {}),
@@ -4460,15 +4571,10 @@ function Layout({
4460
4571
  /* @__PURE__ */ jsx(
4461
4572
  "button",
4462
4573
  {
4463
- onClick: () => setGoogleConnectOpen(true),
4464
- title: googleConnected ? "Google Connected" : "Connect Google",
4465
- className: `shrink-0 rounded-md p-2 transition-colors ${googleConnected ? "hover:bg-green-50" : "text-gray-500 hover:text-gray-900 hover:bg-gray-200"}`,
4466
- children: /* @__PURE__ */ jsxs("svg", { className: "h-4 w-4", viewBox: "0 0 24 24", children: [
4467
- /* @__PURE__ */ jsx("path", { d: "M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 01-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z", fill: googleConnected ? "#16a34a" : "#9ca3af" }),
4468
- /* @__PURE__ */ jsx("path", { d: "M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z", fill: googleConnected ? "#16a34a" : "#9ca3af" }),
4469
- /* @__PURE__ */ jsx("path", { d: "M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z", fill: googleConnected ? "#16a34a" : "#9ca3af" }),
4470
- /* @__PURE__ */ jsx("path", { d: "M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z", fill: googleConnected ? "#16a34a" : "#9ca3af" })
4471
- ] })
4574
+ onClick: () => setMailConnectOpen(true),
4575
+ title: mailConnected ? "Mail & Calendar Connected" : "Connect Mail & Calendar",
4576
+ className: `shrink-0 rounded-md p-2 transition-colors ${mailConnected ? "hover:bg-green-50 text-green-600" : "text-gray-500 hover:text-gray-900 hover:bg-gray-200"}`,
4577
+ children: /* @__PURE__ */ jsx("svg", { className: "h-4 w-4", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 1.8, children: /* @__PURE__ */ jsx("path", { d: "M3 7l9 6 9-6M5 5h14a2 2 0 012 2v10a2 2 0 01-2 2H5a2 2 0 01-2-2V7a2 2 0 012-2z", strokeLinecap: "round", strokeLinejoin: "round" }) })
4472
4578
  }
4473
4579
  ),
4474
4580
  /* @__PURE__ */ jsx(TaskbarClock, {})
@@ -4500,7 +4606,7 @@ function Layout({
4500
4606
  ),
4501
4607
  /* @__PURE__ */ jsx(GlobalSearch, { ...search }),
4502
4608
  /* @__PURE__ */ jsx(ShortcutHelp, {}),
4503
- /* @__PURE__ */ jsx(GoogleConnectModal, { open: googleConnectOpen, onClose: () => setGoogleConnectOpen(false) })
4609
+ /* @__PURE__ */ jsx(MailConnectModal, { open: mailConnectOpen, onClose: () => setMailConnectOpen(false) })
4504
4610
  ] });
4505
4611
  }
4506
4612
  var THEMES = [
@@ -5046,6 +5152,6 @@ function useEditHotkey(callback) {
5046
5152
  }, [callback, isActive]);
5047
5153
  }
5048
5154
 
5049
- export { ALT, ALT_SHIFT_D, ALT_SHIFT_E, ALT_SHIFT_N, BugReportConfigProvider, BugReportDetail, BugReportProvider, CMD_A, CMD_DOT, CMD_ENTER, CMD_K, CMD_S, Customization, Desktop, DesktopHostProvider, ENTER, GlobalSearch, Layout, MOD, NotificationBell, SHIFT, ShellEntityFetcherProvider, ShortcutHelp, StartMenu, StatusBadge, StatusBadgeProvider, VERSION, createWindowRegistry, isMac, openBugReportDialog, reportBug, useBugReport, useClickOutside, useDesktopHost, useEditHotkey, useNewHotkey, useShellEntityFetcher };
5155
+ export { ALT, ALT_SHIFT_D, ALT_SHIFT_E, ALT_SHIFT_N, BugReportConfigProvider, BugReportDetail, BugReportProvider, CMD_A, CMD_DOT, CMD_ENTER, CMD_K, CMD_S, Customization, Desktop, DesktopHostProvider, ENTER, GlobalSearch, Layout, MOD, MailConnectModal, NotificationBell, SHIFT, ShellEntityFetcherProvider, ShortcutHelp, StartMenu, StatusBadge, StatusBadgeProvider, VERSION, createWindowRegistry, isMac, openBugReportDialog, reportBug, useBugReport, useClickOutside, useDesktopHost, useEditHotkey, useNewHotkey, useShellEntityFetcher };
5050
5156
  //# sourceMappingURL=index.js.map
5051
5157
  //# sourceMappingURL=index.js.map