Skip to content

v2.29.0

Latest

Choose a tag to compare

@chittolinag chittolinag released this 03 Nov 23:54
Immutable release. Only release title and notes can be modified.

What's New

  • ui.document.getVersion() and markClean() — Track when a document is saved. Call getVersion() to capture the current editor state, then markClean(version) after persisting to show "Saved" status without reopening.
  • ui.history observer — Listen to undo and redo state changes without polling. Syncs across all UI instances on the same editor.
  • CDN script-tag setup — Use SuperDoc on CodePen, JSBin, or single HTML files. The Quickstart now includes a <script> tag snippet that reads its version from the runtime.
  • Collaboration server template — Deploy Hocuspocus with document storage, access control, and DOCX autosave. Includes a server-side Node SDK agent that suggests tracked replacements and waits for acceptance.
  • User switching without reopen — Call setUser(newUser) to change the current user mid-session. Queues overlapping switches and stays across document reopens.
  • Query bookmarks through search — find() and query.match() now discover bookmarks with { type: 'node', nodeType: 'bookmark' }.
  • Footnotes beside tracked insertions — footnotes.insert() now accepts anchors inside pending insertions and deletions.

Fixes

  • Temporary previews (beginTemporary, replaceTemporary, rollbackTemporary) no longer count as edits. ui.document.dirty stays false, onChange reports only real changes, and undo depth is preserved.
  • Large footnoted documents — Per-frame note geometry now carries only mounted pages, reducing initial packet size and helping large documents open within transport limits.
  • Paragraph merge corruption — Repeated paragraph merges with tracked changes no longer corrupt the document.
  • REF field tracking — REF fields are now properly removed when their tracked clauses are deleted.
  • Cross-cell keyboard deletions — Delete across merged table cells now creates correct tracked changes and cell boundaries.
  • Comment anchors in localized edits — Comments stay on their target text when the document is edited around them.
  • Inline box citation preservation — Inline boxes retain gaps when text is inserted, preventing displacement by earlier deletions.
  • Final view paragraph joins — Deleted paragraph boundaries are correctly joined in Final view while preserving section markers and numbering.
  • Hyperlink field protection — Partial tracked decisions on split hyperlink fields are now refused to prevent corruption.
  • SDK comments on selected text — Comments created through the Document API stay on the words the browser selected, even with hidden content-control text.
  • Empty inline controls on copy/paste — Empty inline controls are preserved through clipboard operations.
  • Custom tabs in headers — Right-justified custom tab runs now align with Word's behavior. Letterhead and headers transfer correctly between peers.
  • Table actions disabled state — Unavailable table actions (like Fix tables in v2) now appear disabled in the toolbar menu.
  • High contrast mode per instance — Each SuperDoc instance keeps its own high-contrast state instead of sharing it globally.
  • Typing performance — Bounded tracked-change catalog scans and memoized note scope resolution restore fast keystroke handling. Large notes parts cache scope windows so in-order reads resolve with one walk instead of one per paragraph.
  • Tracked list numbering in review — Review now shows both the original and current list numbers when a tracked deletion changes numbering (e.g., "3.→2.").
  • Paragraph mark formatting — Selected paragraph marks now format correctly, preserving source intent, namespace scope, and history across document modes and collaboration.
  • DrawingML prefixes in older rooms — Rooms created before the source envelope was stored now bind standard OOXML prefixes to prevent unbound prefix errors on export and projectMarkdown/projectHtml calls.
  • Legacy imported comment replies — Replies imported from legacy sources now sync correctly and survive draft finalization.
  • Bulk edit and comment performance — Tracking and comment work is bounded per operation, preventing slowdowns on large bulk edits.
  • Comment shifts for content controls — Comments on paragraphs with hidden content-control text shift correctly through session sync, and comments.create() accepts expectedText to refuse stale targets.

Improvements

  • Table sorting with repeating headers — Repeating header rows are now preserved when sorting data, with an optional skipHeaderRows override.
  • Proofing caches — Unchanged text segments are now reused after edits, with per-owner LRU caches for multipage paragraphs.