···7788## [Unreleased]
991010+## [0.52.0] — 2026-04-16
1111+1012### Added
1113- Shared modal dialog helper (`src/lib/modal-dialog.ts`): promise-based `modalPrompt()` and `modalConfirm()` replace blocking `window.prompt()`/`window.confirm()`. Native builtins freeze the main thread, stalling Yjs awareness, streaming AI chats, and scheduled timers — the new modals keep the event loop running, respect theme/dark-mode, and support a `destructive` variant for dangerous actions (18 tests). (#109)
1414+- E2EE workspace search on the landing page — searches across all local docs with content decrypted client-side. (#396, #683)
12151316### Changed
1414-- Replaced 12 blocking `prompt()`/`confirm()` call sites with the new modal helpers: trash permanent-delete and empty-trash, version-panel name-and-restore, calendar event delete, sheets sheet-delete, landing folder delete, landing identity (Tailscale signed-in, change display name), docs toolbar (insert link, insert image, add comment), and the Forge Note button (#681).
1515-- Eliminated remaining 11 blocking `prompt()`/`confirm()` call sites: doclist tag editor, docs comment-reply, docs link-preview edit, docs slash-commands (image, link, footnote), docs command-palette footnote, slides add-image, slides thumbnail right-click (now a proper Duplicate/Delete context menu — previously a `confirm("...? Cancel to duplicate")` with inverted semantics), forms link-to-sheet, sheets column and row resize. All now go through `modalPrompt`/`modalConfirm` or `createContextMenu`. (#110)
1616-- Consolidated three drifted `showToast` implementations: the canonical queue-based helper in `src/landing-toast.ts` now serves as the single source of truth. `src/docs/export-import.ts` and `src/sheets/import-export.ts` now re-export from it instead of each maintaining their own basic version. Also replaced 6 blocking `alert()` calls — version restore failure, diagram toolbar errors (text-only mode, palette validation), sheets chart validation, sheets pivot row-field validation — with error-styled toasts. (#110)
1717+- Replaced 12 blocking `prompt()`/`confirm()` call sites with the new modal helpers: trash permanent-delete and empty-trash, version-panel name-and-restore, calendar event delete, sheets sheet-delete, landing folder delete, landing identity (Tailscale signed-in, change display name), docs toolbar (insert link, insert image, add comment), and the Forge Note button. (#681)
1818+- Eliminated remaining 11 blocking `prompt()`/`confirm()` call sites: doclist tag editor, docs comment-reply, docs link-preview edit, docs slash-commands (image, link, footnote), docs command-palette footnote, slides add-image, slides thumbnail right-click (now a proper Duplicate/Delete context menu — previously a `confirm("...? Cancel to duplicate")` with inverted semantics), forms link-to-sheet, sheets column and row resize. All now go through `modalPrompt`/`modalConfirm` or `createContextMenu`. (#685)
1919+- Consolidated three drifted `showToast` implementations: the canonical queue-based helper in `src/landing-toast.ts` now serves as the single source of truth. `src/docs/export-import.ts` and `src/sheets/import-export.ts` now re-export from it instead of each maintaining their own basic version. Also replaced 6 blocking `alert()` calls — version restore failure, diagram toolbar errors (text-only mode, palette validation), sheets chart validation, sheets pivot row-field validation — with error-styled toasts. (#685)
17201821### Fixed
1919-- `insertFootnote` TipTap command previously called `prompt()` internally when no content was supplied, which froze the main thread. The command now requires the `content` argument; the slash-command handler and command palette gather footnote text via the async modal helper before invoking it. (#110)
2222+- E2EE key-loss warning no longer pops a "Your document is safely encrypted" modal on every document for users who are signed in with Tailscale and have their key already synced — the shield icon in the topbar still shows the status and can be clicked to view the explainer. At-risk (unsynced) and anonymous users still see the warning — one-time per doc — since the data-loss risk is real for them. (#684)
2323+- `insertFootnote` TipTap command previously called `prompt()` internally when no content was supplied, which froze the main thread. The command now requires the `content` argument; the slash-command handler and command palette gather footnote text via the async modal helper before invoking it. (#685)
20242125### Removed
2226- 9 orphaned context-menu builder helpers (`buildDocsTextItems`, `buildDocsLinkItems`, `buildDocsImageItems`, `buildDocsTableItems`, `buildSheetsCellItems`, `buildSheetsColumnHeaderItems`, `buildSheetsRowHeaderItems`, `buildSheetsContextItems`, plus the `SheetsContextTarget` type): returned menu arrays with 45 no-op `() => {}` handlers and were only referenced by tests — never wired into a real editor. (#109)
2323-2424-### Fixed
2525-- E2EE key-loss warning no longer pops a "Your document is safely encrypted" modal on every document for users who are signed in with Tailscale and have their key already synced — the shield icon in the topbar still shows the status and can be clicked to view the explainer. At-risk (unsynced) and anonymous users still see the warning — one-time per doc — since the data-loss risk is real for them. (#684)
26272728## [0.49.0] — 2026-04-16
2829