Full document, spreadsheet, slideshow, and diagram tooling
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge pull request 'chore: cut v0.52.0' (#399) from chore/cut-v0.52.0 into main

scott b6447484 e5e88453

+17 -16
+8 -7
CHANGELOG.md
··· 7 7 8 8 ## [Unreleased] 9 9 10 + ## [0.52.0] — 2026-04-16 11 + 10 12 ### Added 11 13 - 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) 14 + - E2EE workspace search on the landing page — searches across all local docs with content decrypted client-side. (#396, #683) 12 15 13 16 ### Changed 14 - - 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). 15 - - 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) 16 - - 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) 17 + - 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) 18 + - 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) 19 + - 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) 17 20 18 21 ### Fixed 19 - - `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) 22 + - 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) 23 + - `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) 20 24 21 25 ### Removed 22 26 - 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) 23 - 24 - ### Fixed 25 - - 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) 26 27 27 28 ## [0.49.0] — 2026-04-16 28 29
+8 -8
package-lock.json
··· 1 1 { 2 2 "name": "tools", 3 - "version": "0.41.0", 3 + "version": "0.52.0", 4 4 "lockfileVersion": 3, 5 5 "requires": true, 6 6 "packages": { 7 7 "": { 8 8 "name": "tools", 9 - "version": "0.41.0", 9 + "version": "0.52.0", 10 10 "dependencies": { 11 11 "@tiptap/core": "^2.11.0", 12 12 "@tiptap/extension-code-block-lowlight": "^2.27.2", ··· 7812 7812 "integrity": "sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==", 7813 7813 "license": "MIT", 7814 7814 "funding": { 7815 - "type": "GitHub Sponsors ❤", 7815 + "type": "GitHub Sponsors \u2764", 7816 7816 "url": "https://github.com/sponsors/dmonad" 7817 7817 } 7818 7818 }, ··· 8176 8176 "node": ">=16" 8177 8177 }, 8178 8178 "funding": { 8179 - "type": "GitHub Sponsors ❤", 8179 + "type": "GitHub Sponsors \u2764", 8180 8180 "url": "https://github.com/sponsors/dmonad" 8181 8181 } 8182 8182 }, ··· 12384 12384 "npm": ">=8.0.0" 12385 12385 }, 12386 12386 "funding": { 12387 - "type": "GitHub Sponsors ❤", 12387 + "type": "GitHub Sponsors \u2764", 12388 12388 "url": "https://github.com/sponsors/dmonad" 12389 12389 }, 12390 12390 "peerDependencies": { ··· 12409 12409 "npm": ">=8.0.0" 12410 12410 }, 12411 12411 "funding": { 12412 - "type": "GitHub Sponsors ❤", 12412 + "type": "GitHub Sponsors \u2764", 12413 12413 "url": "https://github.com/sponsors/dmonad" 12414 12414 }, 12415 12415 "peerDependencies": { ··· 12490 12490 "npm": ">=8.0.0" 12491 12491 }, 12492 12492 "funding": { 12493 - "type": "GitHub Sponsors ❤", 12493 + "type": "GitHub Sponsors \u2764", 12494 12494 "url": "https://github.com/sponsors/dmonad" 12495 12495 } 12496 12496 }, ··· 12543 12543 } 12544 12544 } 12545 12545 } 12546 - } 12546 + }
+1 -1
package.json
··· 1 1 { 2 2 "name": "tools", 3 - "version": "0.49.0", 3 + "version": "0.52.0", 4 4 "private": true, 5 5 "type": "module", 6 6 "main": "electron/main.js",