Skip to content

feat(super-editor): add w:lock support for StructuredContent nodes (SD-1616)#1939

Merged
harbournick merged 19 commits intomainfrom
feat/sdt-lock-support
Feb 11, 2026
Merged

feat(super-editor): add w:lock support for StructuredContent nodes (SD-1616)#1939
harbournick merged 19 commits intomainfrom
feat/sdt-lock-support

Conversation

@tupizz
Copy link
Copy Markdown
Contributor

@tupizz tupizz commented Feb 4, 2026

Summary

Add ECMA-376 w:lock support for StructuredContent (inline) and StructuredContentBlock (block) nodes, enabling template variables to be read-only per the OOXML specification (§17.5.2.23).

Also adds grouped hover for multi-fragment block SDTs, stale fragment rebuild detection, inline SDT wrapping for geometry rendering path, and SDT utility extraction for better code organization.

Lock Modes

Lock Mode SDT Wrapper Content Use Case
unlocked Can delete Can edit Default, no restrictions
sdtLocked Cannot delete Can edit Protect field structure
contentLocked Can delete Cannot edit Read-only value, removable
sdtContentLocked Cannot delete Cannot edit Fully protected field

Visual Comparison (Word vs SuperDoc)

CleanShot 2026-02-04 at 13 57 37@2x

Border behavior: Blue border (#629be7) appears on hover only, matching Word's behavior.


Architecture Decisions

1. Plugin-Only Defense (No contentEditable='false')

Decision: Block edits through the lock plugin instead of setting contentEditable='false' on locked content.

Why: Setting contentEditable='false' completely prevents cursor placement inside the node. This is poor UX because users:

  • Can't select text to copy it
  • Can't navigate through the document smoothly
  • Experience jarring cursor behavior around locked regions

Solution: Keep content editable at the DOM level and rely on the plugin to block actual edits. Users can move cursor and select text freely while being prevented from modifying content.

2. Three-Layer Defense Strategy

The lock plugin uses three mechanisms to enforce locks:

Layer Hook Purpose
1 handleKeyDown Block Delete/Backspace/Cut before transaction is created
2 handleTextInput Block typing in content-locked nodes
3 filterTransaction Safety net for paste, drag-drop, programmatic changes

Why handleKeyDown instead of just filterTransaction?

ProseMirror's transaction flow is:

User action → Browser event → handleKeyDown → Transaction created → filterTransaction → Applied

When filterTransaction blocks a transaction, the browser may have already modified DOM selection, causing the cursor to jump unexpectedly. By intercepting in handleKeyDown and calling event.preventDefault(), we prevent the browser from processing the event at all.

3. Step Relationship Analysis

To detect lock violations, we analyze the geometric relationship between a step's affected range and each SDT node:

Document: [----SDT----]
               pos    end

1. containsSDT: Would fully delete the SDT
   Step:    [================]
   SDT:        [--------]
   → Blocked for sdtLocked/sdtContentLocked

2. insideSDT: Modification entirely within SDT (but not deleting it)
   Step:          [--]
   SDT:        [--------]
   → Blocked for contentLocked/sdtContentLocked

3. crossesStart/crossesEnd: Step crosses SDT boundary
   Step:    [=======]        or        [=======]
   SDT:        [--------]         [--------]
   → Blocked for sdtLocked/sdtContentLocked (damages wrapper)

4. NodeView Provides Visual Feedback Only

The NodeView adds CSS classes for styling but does NOT set contentEditable:

updateContentEditability() {
  if (this.dom) {
    this.dom.classList.toggle('sd-structured-content--content-locked', this.isContentLocked());
    this.dom.classList.toggle('sd-structured-content--sdt-locked', this.isSdtLocked());
  }
}

Changes

Import/Export

  • Parse w:lock element from w:sdtPr on DOCX import
  • Export w:lock element to w:sdtPr on DOCX save
  • Round-trip preservation of lock mode values

Editor Behavior

  • Add lockMode attribute to StructuredContent and StructuredContentBlock extensions
  • Add structuredContentLockPlugin with 3-layer defense:
    • handleKeyDown: Block Delete/Backspace/Cut before transaction
    • handleTextInput: Block typing in content-locked nodes
    • filterTransaction: Safety net for programmatic changes
  • NodeView adds CSS classes for visual feedback (allows cursor movement)

Visual Styling (Presentation Mode)

  • Add StructuredContentLockMode type to contracts
  • Add lockMode to StructuredContentMetadata in style-engine
  • Add data-lock-mode attribute rendering in DomPainter
  • Add CSS styles matching Word's appearance for each lock mode
  • Unified hover styles for block (.sdt-hover) and inline (:hover) SDTs with consistent !important overrides

Inline SDT Wrapping for Geometry Rendering Path

When a line contains tabs, the DomPainter uses a geometry-based rendering path where elements are absolutely positioned. Previously, inline SDT wrapping only worked in the run-based path, causing tabs inside inline SDTs to lose their visual wrapper. Now:

  • appendToLineGeo helper routes all geometry-path elements (tabs, images, field annotations, text segments) through SDT wrapping logic
  • The wrapper uses position: absolute with computed left/width to span all contained children
  • PM position tracking (data-pm-start/data-pm-end) is maintained on the wrapper element
  • TabRun contract type extended with optional sdt metadata; pm-adapter passes SDT metadata through to tab runs

Grouped Hover for Multi-Fragment Block SDTs

When a block SDT spans multiple paragraphs, each renders as a separate DOM fragment. Previously, CSS :hover only highlighted the individual fragment under the cursor. Now all fragments of the same SDT highlight simultaneously via JavaScript event delegation:

  • SdtGroupedHover class (utils/sdt-hover.ts): Event delegation on mount container using mouseover/mouseleave. Finds all fragments sharing the same data-sdt-id and toggles .sdt-hover CSS class on all of them.
  • Post-render re-apply: After DomPainter re-renders pages (e.g. during editing), newly created DOM elements lose the .sdt-hover class. SdtGroupedHover.reapply() is called at the end of updateVirtualWindow() to restore the class on all matching fragments.
  • CSS: Block SDT rules changed from :hover to .sdt-hover selector. Inline SDTs remain :hover-based (single element, no grouping needed).

Stale Fragment Rebuild Detection

  • shouldRebuildForSdtBoundary (moved to utils/sdt-helpers.ts): Detects when a fragment's SDT boundary attributes (data-sdt-container-start/end) are stale and need rebuilding. Now correctly handles the case where a fragment leaves an SDT group (attributes present but should be removed).
  • mappingUnreliable check: After a full-document paste of identical content, ProseMirror's transaction mapping becomes degenerate — it maps all old positions to the insertion end. This corrupted data-pm-start/data-pm-end attributes on reused spans, breaking cursor/click navigation. The new check verifies mapping.map(oldPmStart) === fragment.pmStart and forces a full fragment rebuild when the mapping is unreliable.

Code Organization

  • Extracted SdtGroupedHover class from renderer.ts into utils/sdt-hover.ts
  • Moved shouldRebuildForSdtBoundary from renderer.ts into utils/sdt-helpers.ts
  • Reduced renderer.ts SDT hover footprint from ~65 lines to 4 one-liner calls
  • Removed unnecessary try/catch around removeEventListener in SdtGroupedHover
  • Re-export StructuredContentLockMode from contracts instead of duplicating in node-attributes.ts

Visual Testing Story

  • sdt-lock-modes.ts: New interaction story demonstrating all lock modes:
    • Creates inline SDTs with unlocked, sdtLocked, contentLocked modes via insertStructuredContentInline
    • Creates block SDT with sdtContentLocked via insertStructuredContentBlock
    • Demonstrates typing inside sdtLocked SDT (content editable)
    • Demonstrates typing blocked inside contentLocked SDT
    • Demonstrates updateStructuredContentById to change lock modes programmatically
    • 8 milestones capturing each interaction step

Test Coverage

35 tests covering all lock modes and operations:

  • Wrapper deletion tests (4 modes × 2 node types = 8 tests)
  • Content modification tests (4 modes × 2 node types = 8 tests)
  • Boundary crossing tests (crosses start/end of SDT)
  • Edge cases (empty document, multiple SDTs, collapsed selection)
Test Files  1 passed (1)
     Tests  35 passed (35)

Files Changed

Package Files
contracts src/index.ts — Add StructuredContentLockMode type, sdt on TabRun
style-engine src/index.ts — Add lockMode normalization
pm-adapter inline-converters/tab.ts — Pass SDT metadata to tab runs
painter-dom renderer.ts — Grouped hover, post-render reapply, mapping reliability check, geometry-path SDT wrapping
painter-dom styles.ts — Block SDT hover uses .sdt-hover class, unified hover styles with !important
painter-dom utils/sdt-helpers.ts — Add shouldRebuildForSdtBoundary, fix stale attribute handling
painter-dom utils/sdt-hover.tsSdtGroupedHover class for multi-fragment hover
super-editor Extensions — lockMode attribute for inline and block nodes
super-editor NodeViews — CSS class toggling for lock state visual feedback
super-editor Lock plugin — structured-content-lock-plugin.js (169 lines)
super-editor Lock tests — structured-content-lock-plugin.test.js (416 lines, 35 tests)
super-editor Import/Export — Parse and generate w:lock element
super-editor Import/Export tests — Round-trip tests for lock modes
super-editor Types — node-attributes.ts — Re-export StructuredContentLockMode from contracts
visual-testing stories/structured-content/sdt-lock-modes.ts — Visual testing story for lock modes

Test Plan

  • Unit tests for import parsing (all 4 lock modes)
  • Unit tests for export generation
  • Unit tests for lock plugin (35 tests covering all scenarios)
  • Cursor movement works in locked content
  • Manual test with DOCX containing locked SDTs
  • Verify visual styling matches Word
  • Grouped hover highlights all fragments of multi-line block SDTs
  • Hover clears correctly on mouse leave
  • Editing inside hovered SDT preserves hover on new fragments
  • Full-document paste (Cmd+A, Cmd+C, Cmd+V) preserves cursor navigation
  • Tab inside inline SDT preserves visual wrapper (both rendering paths)
  • Visual testing story captures 8 milestones for all lock mode interactions

Related

  • IT-336

Demo

CleanShot.2026-02-04.at.15.53.52.mp4

Implement ECMA-376 §17.5.2.23 w:lock support for StructuredContent and
StructuredContentBlock nodes. This enables template variables to enforce
read-only behavior based on lock modes.

Lock modes:
- unlocked: no restrictions (default)
- sdtLocked: SDT wrapper cannot be deleted, content editable
- contentLocked: content read-only, SDT can be deleted
- sdtContentLocked: fully locked (wrapper and content)

Changes:
- Add lockMode attribute to StructuredContent/Block extensions
- Parse w:lock element on DOCX import
- Export w:lock element on DOCX save
- Add lock enforcement plugin (prevents deletion of locked SDTs)
- Add NodeView methods for content editability
- Add visual styling matching Word's appearance (presentation mode)
- Add TypeScript types for lock modes
- Add unit tests for import, export, and lock behavior
@tupizz tupizz force-pushed the feat/sdt-lock-support branch from 0234ac9 to 3e5377e Compare February 4, 2026 15:23
Replace state.doc.descendants() with nodesBetween() to avoid
iterating the entire document on every transaction. Now only
checks nodes within the affected ranges.

Also simplify normalizeLockMode in style-engine since lockMode
values are already validated at import time.
…s toggling

Remove isSdtLocked() method that was never called - SDT deletion
prevention is handled by the lock plugin instead.

Remove updateLockStateClasses() and its calls - the CSS classes
it toggled had no corresponding CSS rules. Presentation mode
uses data-lock-mode attributes with CSS in styles.ts instead.
Change lock enforcement strategy to use plugin-only defense instead of
contentEditable='false'. This allows users to:
- Move cursor within locked content nodes
- Select text for copying
- Navigate smoothly through the document

The lock plugin now handles all edit blocking through:
- handleKeyDown: Block Delete/Backspace/Cut before transaction
- handleTextInput: Block typing in content-locked nodes
- filterTransaction: Safety net for paste, drag-drop, programmatic changes

NodeView now only adds CSS classes for visual feedback without
disabling cursor interaction.

Also adds comprehensive test suite with 35 tests covering all lock modes
and adds research documentation in .tupizz/docs/.
@tupizz tupizz force-pushed the feat/sdt-lock-support branch from 270cf66 to fb4a38c Compare February 4, 2026 18:29
@tupizz tupizz marked this pull request as ready for review February 4, 2026 19:03
Copilot AI review requested due to automatic review settings February 4, 2026 19:03
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds comprehensive support for ECMA-376 w:lock functionality to StructuredContent nodes, enabling four lock modes (unlocked, sdtLocked, contentLocked, sdtContentLocked) that control whether the SDT wrapper can be deleted and whether the content can be edited. The implementation uses a three-layer defense strategy in the editor, full round-trip import/export support, and visual styling that differentiates lock modes.

Changes:

  • Added lockMode attribute to StructuredContent and StructuredContentBlock nodes with DOM parsing/rendering
  • Implemented lock enforcement plugin with handleKeyDown, handleTextInput, and filterTransaction hooks
  • Added DOCX import parsing and export generation for w:lock elements
  • Implemented visual styling with distinct background colors for each lock mode

Reviewed changes

Copilot reviewed 17 out of 17 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
packages/super-editor/src/extensions/types/node-attributes.ts Added StructuredContentLockMode type definition
packages/super-editor/src/extensions/structured-content/structured-content.js Added lockMode attribute and registered lock plugin
packages/super-editor/src/extensions/structured-content/structured-content-block.js Added lockMode attribute definition
packages/super-editor/src/extensions/structured-content/structured-content-lock-plugin.js Implemented three-layer lock enforcement with step relationship analysis
packages/super-editor/src/extensions/structured-content/structured-content-lock-plugin.test.js Comprehensive test suite with 35 tests covering all lock modes and scenarios
packages/super-editor/src/extensions/structured-content/StructuredContentViewBase.js Added lock detection and CSS class application methods
packages/super-editor/src/extensions/structured-content/StructuredContentInlineView.js Integrated updateContentEditability in view lifecycle
packages/super-editor/src/extensions/structured-content/StructuredContentBlockView.js Integrated updateContentEditability in view lifecycle
packages/super-editor/src/core/super-converter/v3/handlers/w/sdt/helpers/handle-structured-content-node.js Added w:lock parsing with validation of lock mode values
packages/super-editor/src/core/super-converter/v3/handlers/w/sdt/helpers/handle-structured-content-node.test.js Tests for parsing all lock mode values and defaults
packages/super-editor/src/core/super-converter/v3/handlers/w/sdt/helpers/translate-structured-content.js Added w:lock export generation and deduplication
packages/super-editor/src/core/super-converter/v3/handlers/w/sdt/helpers/translate-structured-content.test.js Tests for exporting lock modes and preventing duplication
packages/layout-engine/style-engine/src/index.ts Added lockMode to normalized StructuredContentMetadata
packages/layout-engine/painters/dom/src/utils/sdt-helpers.ts Added lockMode data attribute rendering in SDT containers
packages/layout-engine/painters/dom/src/renderer.ts Added lockMode to dataset attributes and rendering
packages/layout-engine/painters/dom/src/styles.ts Added CSS styles for each lock mode with hover effects
packages/layout-engine/contracts/src/index.ts Added StructuredContentLockMode type to contracts

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread packages/layout-engine/painters/dom/src/styles.ts Outdated
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: fb4a38c0cd

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

@tupizz tupizz self-assigned this Feb 4, 2026
…lity

- Introduced SdtGroupedHover class to manage hover states for multi-fragment SDT blocks, allowing simultaneous highlighting of all fragments.
- Updated shouldRebuildForSdtBoundary function to improve checks for SDT boundary changes, ensuring stale attributes are removed and boundaries are correctly validated.
- Adjusted DOM rendering logic to incorporate new hover functionality and boundary checks.
- Modified styles for SDT container labels to improve visibility and interaction during hover states.
# Conflicts:
#	packages/layout-engine/painters/dom/src/renderer.ts
Copy link
Copy Markdown
Contributor

@andrii-harbour andrii-harbour left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

overall very good! Nice job!
I have only minor comments/suggestions there

Comment thread packages/layout-engine/painters/dom/src/utils/sdt-hover.ts Outdated
Comment thread packages/super-editor/src/extensions/types/node-attributes.ts Outdated
@andrii-harbour
Copy link
Copy Markdown
Contributor

@tupizz it can also be a separate ticket as it's more about rendering than sdt logic itself - https://cdn.zappy.app/1bf739f84f32971a4be16dcc57ea71d7.mp4

clicking tab inside the sdt container - brakes the UI of the sdt

…th and visual test story

- Route tab, image, field annotation, and text elements through inline SDT
  wrapper in the geometry-based rendering path (previously only the run-based
  path had SDT wrapping)
- Add `sdt` metadata to TabRun contract type and pm-adapter tab converter
- Unify hover styles for block and inline SDTs (consistent colors, !important
  to override lock-mode transparent borders and continuation rules)
- Remove unnecessary try/catch around removeEventListener in SdtGroupedHover
- Add performance optimization TODO to collectSDTNodes in lock plugin
- Re-export StructuredContentLockMode from contracts instead of duplicating
- Add visual testing story (sdt-lock-modes) demonstrating all lock modes,
  SDT creation/update commands, and keyboard interactions
@superdoc-dev superdoc-dev deleted a comment from github-actions Bot Feb 11, 2026
@caio-pizzol caio-pizzol changed the title feat(super-editor): add w:lock support for StructuredContent nodes feat(super-editor): add w:lock support for StructuredContent nodes (SD-1616) Feb 11, 2026
@linear
Copy link
Copy Markdown

linear Bot commented Feb 11, 2026

Copy link
Copy Markdown
Contributor

@andrii-harbour andrii-harbour left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM! Well done!

Copy link
Copy Markdown
Contributor

@caio-pizzol caio-pizzol left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey, @tupizz. This is a great start!

A few things to note:

Make sure you are not pushing formatting changes to the remote repo. This affects the files we actually have to review versus the ones that are just formatting changes. A way to do that is actually have pre-commit installed in your local repo so the code will always be formatted automatically before committing changes.

I added a few comments across your implementation. Please try to address the ones that make sense.

Also, because we are adding visual interfaces, this PR will also require visual testing for rendering and interaction stories. Let me know if you have any questions on how to write those.

Comment thread demos/cdn/demo-config.json Outdated
Comment thread packages/layout-engine/painters/dom/src/utils/sdt-helpers.ts
Comment thread packages/layout-engine/painters/dom/src/renderer.ts
Comment thread packages/layout-engine/painters/dom/src/utils/sdt-hover.ts Outdated
Comment thread packages/layout-engine/painters/dom/src/utils/sdt-hover.ts Outdated
@tupizz
Copy link
Copy Markdown
Contributor Author

tupizz commented Feb 11, 2026

@caio-pizzol

Also, because we are adding visual interfaces, this PR will also require visual testing for rendering and interaction stories. Let me know if you have any questions on how to write those.

This is already defined in the PR, please check:
https://github.com/superdoc-dev/superdoc/pull/1939/changes#diff-93ff67f20943e2b47a11c268cf8642caa55bd4bebb7fd3ec83abb7bfab817ff2

Cache collectSDTNodes() result in ProseMirror plugin state instead of
calling it in every handler. Rebuilds only on docChanged, reducing
document traversals from 2-3 per keystroke to at most 1 per
document-changing transaction.
Add comment explaining why AttrStep/node-mark steps are safely skipped
in filterTransaction, and note the backspace range approximation with
its filterTransaction safety net.
…r intent

Remove base hover rules for block/inline SDTs that were shadowed by the
more specific [data-lock-mode] selectors (dead code since data-lock-mode
is set on all SDTs). Consolidate block/inline lock-mode hover rules into
a single grouped selector. Add comments explaining the intentional
border-hidden-by-default behavior that matches Word.
Early return when sdtId === hoveredSdtId to avoid unnecessary
querySelectorAll + classList.add on every mouseover pixel within
the same SDT.
…d add SDT_HOVER to constants

Extract resolveRunSdtId, createInlineSdtWrapper, and
expandSdtWrapperPmRange as shared private methods on DomPainter,
deduplicating ~30 lines between the geometry and run-based inline
SDT rendering paths.

Add SDT_HOVER to DOM_CLASS_NAMES and use constants in sdt-hover.ts
instead of hardcoded strings.
@tupizz tupizz requested review from andrii-harbour and caio-pizzol and removed request for caio-pizzol February 11, 2026 13:19
…over

Remove the transparent border-color override so SDT containers always
display their blue border, making them visible across the document
without needing to hover. Hover still adds background highlight.
Remove top border and top corner radius on SDT blocks that immediately
follow another SDT block, preventing the 2px double-border effect when
multiple SDT containers are stacked vertically.
When clicking into an inline structuredContent node from outside, the
entire content is selected so the user can immediately type to replace
it. Clicking again while already inside allows normal cursor placement.

Uses appendTransaction to work in both editing and presentation mode.
Copy link
Copy Markdown
Collaborator

@harbournick harbournick left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@harbournick harbournick merged commit 2c16f1c into main Feb 11, 2026
2 checks passed
@harbournick harbournick deleted the feat/sdt-lock-support branch February 11, 2026 17:29
@superdoc-bot
Copy link
Copy Markdown
Contributor

superdoc-bot Bot commented Feb 11, 2026

🎉 This PR is included in superdoc v1.12.0-next.12

The release is available on GitHub release

harbournick pushed a commit that referenced this pull request Feb 12, 2026
# [1.12.0](v1.11.0...v1.12.0) (2026-02-12)

### Bug Fixes

* allow paste from context menu ([#1910](#1910)) ([b6666bf](b6666bf))
* **ci:** include sub-package commits in superdoc release filter ([a2c237b](a2c237b))
* **ci:** move superdoc releaserc to package dir for proper commit filtering ([688f8e0](688f8e0))
* context menu clicks would change selection position ([#1889](#1889)) ([ace0daf](ace0daf))
* **converter:** handle absolute paths in header/footer relationship targets ([#1945](#1945)) ([9d82632](9d82632))
* cursor drift during vertical arrow navigation (SD-1689) ([#1918](#1918)) ([982118d](982118d))
* disable footnotes typing ([#1974](#1974)) ([92b4d62](92b4d62))
* headless yjs ([#1913](#1913)) ([4cdecf7](4cdecf7))
* image z-index and overlaps ([#1950](#1950)) ([39875ac](39875ac))
* issue updating paragraph properties (SD-1778) ([#1944](#1944)) ([a9076ed](a9076ed))
* **layout-bridge:** defer table fragment click mapping to geometry fallback ([#1968](#1968)) ([0eac43c](0eac43c))
* load alternative style definitions when main one is missing ([#1922](#1922)) ([bb4083f](bb4083f))
* mount Vue on wrapper element to prevent host framework conflicts (SD-1832) ([#1971](#1971)) ([0c4bdda](0c4bdda))
* performance ([#1914](#1914)) ([0747b03](0747b03))
* persist comments on reload in collab mode ([#1949](#1949)) ([2b2e56e](2b2e56e))
* preserve text selection highlight on right-click ([#1994](#1994)) ([db5466a](db5466a))
* return null instead of blank num definition when not found ([#1990](#1990)) ([3acac3b](3acac3b))
* **super-converter:** add tableHeader export handler to fix corrupted docx ([#1900](#1900)) ([010799b](010799b))
* **super-converter:** resolve table style conditional shading on cell import (SD-1833) ([#1985](#1985)) ([5e206f4](5e206f4))
* **super-editor:** allow Backspace to delete empty paragraphs in suggesting mode ([#1966](#1966)) ([820c73c](820c73c))
* **super-editor:** prevent invalid paragraph updates for nested runs in headless import ([8c11718](8c11718))
* **super-editor:** prevent invalid paragraph updates for nested runs in headless import ([c5ee6e3](c5ee6e3))
* **super-editor:** restore marks correctly after clear format + undo (SD-1771) ([#1967](#1967)) ([bc9dc76](bc9dc76))
* **superdoc:** enhance comment input focus handling and edit init ([#1935](#1935)) ([0e9112c](0e9112c))
* **superdoc:** update comment text ([b5ff644](b5ff644))
* **superdoc:** update entry point comment ([#1926](#1926)) ([0dde298](0dde298))
* **table:** resolve column resize only working on first page (SD-1772) ([#1959](#1959)) ([df43867](df43867))
* **tracked-changes:** fix suggested insertions from paste failures ([#1969](#1969)) ([e74c14a](e74c14a))
* trigger patch release ([7bc1b74](7bc1b74))
* trigger patch release ([32ced9c](32ced9c))
* trigger patch release ([da7f484](da7f484))
* trigger release ([8367dd6](8367dd6))
* use DEFLATE compression for docx export instead of STORE ([#1933](#1933)) ([ebcd986](ebcd986))
* zIndex updates ([#1973](#1973)) ([3ca7aa3](3ca7aa3))

### Features

* **super-editor:** add w:lock support for StructuredContent nodes (SD-1616) ([#1939](#1939)) ([2c16f1c](2c16f1c))
* telemetry ([#1932](#1932)) ([fab3ce9](fab3ce9))
* **template-builder:** add cspNonce support ([#1911](#1911)) ([bcb9d28](bcb9d28))
* whiteboard ([#1954](#1954)) ([c9d1484](c9d1484))

### Performance Improvements

* **build:** remove redundant steps and add fast dev build (SD-1886) ([#1999](#1999)) ([db46bf8](db46bf8))
@harbournick
Copy link
Copy Markdown
Collaborator

🎉 This PR is included in superdoc v1.12.0

The release is available on GitHub release

tupizz added a commit that referenced this pull request Feb 17, 2026
lockMode is not available in the published version yet (PR #1939).
Remove it from onReady field insertions so the demo works with the
current superdoc@latest on unpkg.
tupizz added a commit that referenced this pull request Feb 17, 2026
Lock mode buttons depend on PR #1939 which isn't published yet.
Remove them until lockMode is available in superdoc@latest.
harbournick pushed a commit that referenced this pull request Feb 17, 2026
* docs(structured-content): add lock mode documentation

Document the w:lock support for structured content nodes:
- Add lockMode attribute and lock modes section to extension docs
- Add StructuredContentLockMode type definition
- Add code examples for inserting and updating lock modes
- Update interactive demo with lock/unlock buttons
- Update template builder docs with lockMode in field definitions

* docs(template-builder): revert lock mode additions

Template builder does not support lockMode in FieldDefinition or
TemplateField types yet. Remove premature documentation.

* fix(docs): remove lockMode from interactive demo buttons

lockMode is not yet available in the published editor version.
Restore original block field and update buttons that work today.

* docs(structured-content): add lock/unlock buttons to interactive demo

Add buttons to lock and unlock both inline and block fields using
updateStructuredContentById with lockMode attribute.

* docs(structured-content): improve interactive demo example text

Replace placeholder quote with a realistic service agreement template
that demonstrates practical use of inline and block fields.

* docs(structured-content): use sdtLocked on insert buttons

Insert inline and block fields with sdtLocked by default. Add
sdtContentLocked lock buttons for both field types and a single
unlock-all button.

* docs(structured-content): add live SDT fields to interactive demo

Use onReady callback to auto-insert inline and block sdtLocked fields
into the example document on load, replacing placeholder text with
real structured content fields. Reorganize buttons into logical groups:
update actions, lock mode actions, and delete.

* fix(docs): remove lockMode from onReady SDT insertions

lockMode is not available in the published version yet (PR #1939).
Remove it from onReady field insertions so the demo works with the
current superdoc@latest on unpkg.

* fix(docs): remove lock/unlock buttons from interactive demo

Lock mode buttons depend on PR #1939 which isn't published yet.
Remove them until lockMode is available in superdoc@latest.

* fix(docs): restore lockMode in demo — feature is published

lockMode is available in superdoc@latest (v1.13.1). Restore
sdtLocked on onReady field insertions and lock/unlock buttons.

* Revert "fix(docs): restore lockMode in demo — feature is published"

This reverts commit 53638cd.

* docs(structured-content): add toggle lock buttons for inline and block

* fix(docs): access node.attrs for lock toggle state detection

getStructuredContentTags returns {node, pos} objects — attrs are on
node.attrs, not directly on the object.

* fix(docs): use setNodeAttribute for lock toggle to bypass filterTransaction

updateStructuredContentById uses replaceWith which creates a ReplaceStep
that the lock plugin blocks. Use tr.setNodeAttribute instead, which
creates an AttrStep that the lock plugin explicitly skips.

* docs(structured-content): address review feedback

- Differentiate lock mode insert example from command section example
  (use sdtContentLocked/Account ID instead of duplicate sdtLocked/Customer Name)
- Wrap enforcement details in Expandable for scannability
- Add missing `group` to block insert attrs type
- Replace raw tr.setNodeAttribute with updateStructuredContentById in demo

* docs(structured-content): remove toggle lock buttons from demo
superdoc-bot Bot pushed a commit that referenced this pull request Mar 11, 2026
# [0.2.0](cli-v0.1.0...cli-v0.2.0) (2026-03-11)

### Bug Fixes

* active track change ([#2163](#2163)) ([108c14d](108c14d))
* add currentTotalPages getter and pagination-update event ([#2202](#2202)) ([95b4579](95b4579)), closes [#958](#958)
* add type definitions for PresentationEditor ([#2271](#2271)) ([5402196](5402196))
* **ai-actions:** preserve html/markdown insertion and prevent repeated formatted replacement ([#2117](#2117)) ([9f685e9](9f685e9))
* **ai:** support headless mode in EditorAdapter.applyPatch ([#1859](#1859)) ([cf9275d](cf9275d))
* allow paste from context menu ([#1910](#1910)) ([b6666bf](b6666bf))
* always call resolveComment after custom TC bubble handlers (SD-2049) ([#2204](#2204)) ([34fb4e0](34fb4e0))
* anchor table overlaps text ([#1995](#1995)) ([fc05e29](fc05e29))
* **anchor-nav:** use correct scroll container for sub-page bookmark navigation ([a300536](a300536)), closes [#scrollContainer](https://github.com/superdoc-dev/superdoc/issues/scrollContainer)
* backward replace insert text ([#2172](#2172)) ([66f0849](66f0849))
* before paragraph spacing inside table cells ([#1842](#1842)) ([c7efa85](c7efa85))
* **build:** add node polyfills to UMD bundle and angular to CI matrix ([13fa579](13fa579))
* **build:** remove dead vite-plugin-node-polyfills from UMD externals ([91de1fc](91de1fc))
* **ci:** include sub-package commits in superdoc release filter ([a2c237b](a2c237b))
* **ci:** move superdoc releaserc to package dir for proper commit filtering ([688f8e0](688f8e0))
* **cli:** add jsdoc params to formatReplaceResult ([#1923](#1923)) ([e52ddf9](e52ddf9))
* **cli:** add param jsdoc to expandGlobs ([df8c3c6](df8c3c6))
* **cli:** add returns jsdoc to formatSearchResult ([d0a0438](d0a0438))
* **cli:** lowercase docx in help text ([#1928](#1928)) ([13f9db6](13f9db6))
* **cli:** normalize dash in help text ([b2e7d36](b2e7d36))
* **cli:** prevent collab reopen from overwriting existing ydoc with blank document (SD-2138) ([#2296](#2296)) ([41b0345](41b0345))
* collaboration cursor styles fix ([fd6db10](fd6db10))
* **collaboration:** deduplicate updateYdocDocxData during replaceFile (SD-1920) ([#2162](#2162)) ([52962fc](52962fc))
* **collaboration:** memory leaks, Vue stack overflow, and Liveblocks stability (SD-1924) ([#2030](#2030)) ([a6827fd](a6827fd)), closes [#prepareDocumentForExport](https://github.com/superdoc-dev/superdoc/issues/prepareDocumentForExport)
* **collab:** prevent stale view when remote Y.js changes bypass sdBlockRev increment ([#2099](#2099)) ([0895a93](0895a93))
* **comments:** cross-page collision avoidance for floating comment bubbles (SD-1998) ([#2180](#2180)) ([6cfbeca](6cfbeca))
* **comments:** emit empty comment positions so undo clears orphan bubbles ([#2235](#2235)) ([12ba727](12ba727))
* **comments:** improve multiline comment input styling ([#2242](#2242)) ([e6a0dab](e6a0dab))
* **comments:** prevent comment mark from extending to adjacent typed text ([#2241](#2241)) ([07fecd8](07fecd8))
* **comments:** reduce sidebar jitter when clicking comments (SD-2034) ([#2250](#2250)) ([c3568d2](c3568d2))
* **comments:** remove synchronous dispatch from plugin apply() (SD-1940) ([#2157](#2157)) ([887175b](887175b))
* consolidate deletions under new replacement ([#2094](#2094)) ([0a84b86](0a84b86))
* context menu clicks would change selection position ([#1889](#1889)) ([ace0daf](ace0daf))
* **context-menu:** paste via context menu inserts at wrong position (SD-1302) ([#2110](#2110)) ([30f03f9](30f03f9))
* **converter:** handle absolute paths in header/footer relationship targets ([#1945](#1945)) ([9d82632](9d82632))
* **converter:** handle empty rPrChange run properties without dropping tracked-style runs ([c25d24d](c25d24d))
* **converter:** handle null list lvlText and always clear numbering cache ([#2113](#2113)) ([336958c](336958c))
* correctly pass table info when deriving inline run properties (SD-1865) ([#2007](#2007)) ([d752aff](d752aff))
* correctly set color and highlight of pasted text ([#2033](#2033)) ([41058b5](41058b5))
* **css:** scope ProseMirror CSS to prevent bleeding into host apps (SD-1850) ([#2134](#2134)) ([b9d98fa](b9d98fa))
* cursor drift during vertical arrow navigation (SD-1689) ([#1918](#1918)) ([982118d](982118d))
* disable footnotes typing ([#1974](#1974)) ([92b4d62](92b4d62))
* **doc-api:** stabilize create composability and expand SDK surface ([fc17167](fc17167))
* document-api improvements, plan mode, query.match, mutations ([6221580](6221580))
* **document-api:** add friendlier insert at node id with offset, or pos ([#2128](#2128)) ([c1d3682](c1d3682))
* **document-api:** add nodeId shorthand resolution across all operations ([#2131](#2131)) ([8abdaad](8abdaad))
* **document-api:** delete table cell fix ([#2209](#2209)) ([5e5c43f](5e5c43f))
* **document-api:** distribute columns command fixes ([#2207](#2207)) ([8f4eaf7](8f4eaf7))
* **document-api:** fix cell shading in document api ([#2215](#2215)) ([456f60e](456f60e))
* **document-api:** fix markdown to image ([bf0e664](bf0e664))
* **document-api:** insert table cell ([#2210](#2210)) ([357ee90](357ee90))
* **document-api:** make lists.setType preserve sequence continuity ([#2304](#2304)) ([da09826](da09826))
* **document-api:** plan-engine reliability fixes and error diagnostics ([#2185](#2185)) ([abfd81b](abfd81b))
* **document-api:** remove search match cap and validate moveComment bounds ([6d3de67](6d3de67))
* **document-api:** split table cell command ([#2217](#2217)) ([0b3e2b4](0b3e2b4))
* **document-api:** split table command ([#2214](#2214)) ([ec31699](ec31699))
* editor bundling in python CLI regression ([db0d130](db0d130))
* **editor:** prevent focus loss when typing in header/footer editors (SD-1993) ([#2238](#2238)) ([e1b8007](e1b8007)), closes [PresentationEditor.#flushRerenderQueue](https://github.com/PresentationEditor./issues/flushRerenderQueue)
* **editor:** render styles applied inside SDT fields (SD-2011) ([#2188](#2188)) ([9c34be3](9c34be3))
* **editor:** selection highlight flickers when dragging across mark boundaries (SD-2024) ([#2205](#2205)) ([ba03e76](ba03e76))
* ensure we do not duplicate bubble text ([#1934](#1934)) ([c41cf9e](c41cf9e))
* export docx blobs with docx mime type ([#1849](#1849)) ([1bc466d](1bc466d))
* **export:** prevent DOCX corruption from entity encoding and orphaned delInstrText (SD-1943) ([#2102](#2102)) ([56e917f](56e917f)), closes [#replaceSpecialCharacters](https://github.com/superdoc-dev/superdoc/issues/replaceSpecialCharacters) [#1988](#1988)
* **export:** prevent DOCX corruption from UTF-16 XML parts and schema violations (SD-2170) ([#2349](#2349)) ([f6dbb40](f6dbb40))
* **export:** sync document XML before numbering pruning to preserve list definitions ([36058c3](36058c3))
* extract duplicate block identity normalization from docxImporter ([7f7ff93](7f7ff93))
* find tracked change for firefox ([#1899](#1899)) ([a39cb68](a39cb68))
* **format:** route format.caps through textTransform so w:caps persists on export ([#2297](#2297)) ([8e771e2](8e771e2))
* handle Uint8Array media values from persistence layers ([#2298](#2298)) ([0d4505c](0d4505c))
* harden markdown image conversion ([4ba1c25](4ba1c25))
* headless yjs ([#1913](#1913)) ([4cdecf7](4cdecf7))
* ignore sdBlockId when pasting content ([#2010](#2010)) ([1b08572](1b08572))
* image z-index and overlaps ([#1950](#1950)) ([39875ac](39875ac))
* improve backspace behavior near run boundaries for tracked changes ([#2175](#2175)) ([6c9c7a3](6c9c7a3))
* issue updating paragraph properties (SD-1778) ([#1944](#1944)) ([a9076ed](a9076ed))
* **layout-bridge:** correct cell selection for tables with rowspan ([#1839](#1839)) ([0b782be](0b782be))
* **layout-bridge:** defer table fragment click mapping to geometry fallback ([#1968](#1968)) ([0eac43c](0eac43c))
* **layout-engine:** text clipping inside table in document with multi-orientation, recursive pagination for deeply nested tables (SD-1962) ([#2140](#2140)) ([072c009](072c009))
* **layout,converter:** text box rendering and page-relative anchor positioning (SD-1331, SD-1838) ([#2034](#2034)) ([3947f39](3947f39))
* **layout:** per-section footer constraints for multi-section docs (SD-1837) ([#2022](#2022)) ([e11acc5](e11acc5))
* **layout:** route list text-start calculations through resolveListTextStartPx ([02b14b8](02b14b8))
* **link-popover:** mount external popovers outside overflow:hidden container (SD-2148) ([#2308](#2308)) ([ea4be68](ea4be68))
* load alternative style definitions when main one is missing ([#1922](#1922)) ([bb4083f](bb4083f))
* make expected revision optional, update docs ([#2265](#2265)) ([250bb5b](250bb5b))
* markdown block-separator blank lines and heading split style-mark normalization ([e988adc](e988adc))
* mount Vue on wrapper element to prevent host framework conflicts (SD-1832) ([#1971](#1971)) ([0c4bdda](0c4bdda))
* normalize bookmarks in tables ([#1892](#1892)) ([369b7e1](369b7e1))
* normalize review namespace into trackChanges, harden input validation ([33e907b](33e907b))
* outside click for toolbar dropdown ([#2174](#2174)) ([5f859c7](5f859c7))
* **painter-dom:** prevent scroll acceleration feedback loop in virtualization ([#2291](#2291)) ([fb3d25e](fb3d25e))
* **painter-dom:** use absolute page Y for page-relative anchors in header/footer decorations ([0b9bc72](0b9bc72))
* performance ([#1914](#1914)) ([0747b03](0747b03))
* persist comments on reload in collab mode ([#1949](#1949)) ([2b2e56e](2b2e56e))
* pict import/export  ([#2135](#2135)) ([7e97b7b](7e97b7b))
* **placeholder:** guard against depth-0 selection in placeholder decoration ([#2025](#2025)) ([e5ee7cf](e5ee7cf))
* portrait orientation in document-api ([dafab76](dafab76))
* prefer full decoration range ([#2239](#2239)) ([ac15e31](ac15e31)), closes [#collectDesiredState](https://github.com/superdoc-dev/superdoc/issues/collectDesiredState) [#resolveEffectiveRanges](https://github.com/superdoc-dev/superdoc/issues/resolveEffectiveRanges) [#setPreviousRanges](https://github.com/superdoc-dev/superdoc/issues/setPreviousRanges)
* preserve line spacing and indentation on Google Docs paste ([#2183](#2183)) ([b9a7357](b9a7357)), closes [#2151](#2151)
* preserve selection highlight when opening toolbar dropdowns ([#2097](#2097)) ([a33568e](a33568e))
* preserve text selection highlight on right-click ([#1994](#1994)) ([db5466a](db5466a))
* preserve text-align on paste from Google Docs ([#2208](#2208)) ([762231b](762231b))
* **rendering:** show comment highlight on text with Word highlight formatting ([f6d956e](f6d956e))
* replace Node.js Buffer APIs with browser-native alternatives ([#2028](#2028)) ([b17774a](b17774a)), closes [#exportProcessMediaFiles](https://github.com/superdoc-dev/superdoc/issues/exportProcessMediaFiles)
* replace Node.js Buffer APIs with browser-native alternatives ([#2028](#2028)) ([d6141ec](d6141ec)), closes [#exportProcessMediaFiles](https://github.com/superdoc-dev/superdoc/issues/exportProcessMediaFiles)
* resolve published type declarations for Angular/TS consumers and update example ([#2026](#2026)) ([35344bd](35344bd))
* resolve sdk/adapter composability issues ([b60b17e](b60b17e))
* return null instead of blank num definition when not found ([#1990](#1990)) ([3acac3b](3acac3b))
* rollback comments colors / ui ([#2216](#2216)) ([a99b5ab](a99b5ab))
* **scroll:** wait for virtualized page mount and center text element ([#2221](#2221)) ([95f634e](95f634e))
* **sdk:** checkpoint collab sessions even when not dirty ([689f6b5](689f6b5))
* **sdk:** keep sdk sessions alive in non collab ([#2289](#2289)) ([c634ee8](c634ee8))
* **shapes:** render grouped DrawingML shapes with custom geometry (SD-1877) ❇️ ([#2105](#2105)) ([14985a5](14985a5))
* slash menu invisible in presentation mode ([#2018](#2018)) ([513bc33](513bc33)), closes [#computeCaretLayoutRect](https://github.com/superdoc-dev/superdoc/issues/computeCaretLayoutRect)
* splitting run with header adds empty row ([#2229](#2229)) ([e1965fc](e1965fc))
* structured content renders correct on hover and select ([#1843](#1843)) ([dab3f04](dab3f04))
* **super-converter:** add tableHeader export handler to fix corrupted docx ([#1900](#1900)) ([010799b](010799b))
* **super-converter:** handle empty pic:spPr in image import ([#2254](#2254)) ([2b8dbce](2b8dbce))
* **super-converter:** resolve table style conditional shading on cell import (SD-1833) ([#1985](#1985)) ([5e206f4](5e206f4))
* **super-editor:** add unsupported-content reporting across HTML/Markdown import paths ([#2115](#2115)) ([84880b7](84880b7))
* **super-editor:** align image resize handles with actual image position ([#2293](#2293)) ([217bdce](217bdce))
* **super-editor:** allow Backspace to delete empty paragraphs in suggesting mode ([#1966](#1966)) ([820c73c](820c73c))
* **super-editor:** backspace across run boundaries without splitting list items ([#2258](#2258)) ([27ccb64](27ccb64))
* **super-editor:** handle partial comment file-sets and clean up stale parts on export ([#2123](#2123)) ([f63ae0a](f63ae0a))
* **super-editor:** prevent invalid paragraph updates for nested runs in headless import ([8c11718](8c11718))
* **super-editor:** prevent invalid paragraph updates for nested runs in headless import ([c5ee6e3](c5ee6e3))
* **super-editor:** restore <hr> contentBlock parsing and harden VML HR export fallback ([#2118](#2118)) ([da51b1f](da51b1f))
* **super-editor:** restore marks correctly after clear format + undo (SD-1771) ([#1967](#1967)) ([bc9dc76](bc9dc76))
* **superdoc:** enhance comment input focus handling and edit init ([#1935](#1935)) ([0e9112c](0e9112c))
* **superdoc:** update comment text ([b5ff644](b5ff644))
* **superdoc:** update entry point comment ([#1926](#1926)) ([0dde298](0dde298))
* support cell spacing ([#1879](#1879)) ([1639967](1639967))
* table headers are incorrectly imported from html ([#2112](#2112)) ([e8d1480](e8d1480))
* table resizing regression ([#2091](#2091)) ([20ed24e](20ed24e))
* table resizing regression ([#2091](#2091)) ([9a07f1c](9a07f1c))
* **table:** resolve column resize only working on first page (SD-1772) ([#1959](#1959)) ([df43867](df43867))
* **tables:** align tableHeader attrs with tableCell to fix oversized DOCX export widths ([#2114](#2114)) ([38f0430](38f0430))
* **tables:** defaultTableStyle support, cell fixes ([#2246](#2246)) ([74fca9c](74fca9c))
* **tables:** expand auto-width tables to fill available page width ([#2109](#2109)) ([15f36bc](15f36bc))
* **tables:** fix autofit column scaling, cell width overflow, and page break splitting ([#1987](#1987)) ([61a3f6f](61a3f6f))
* **tables:** preserve TableGrid defaults and style-driven spacing/bor… ([#2230](#2230)) ([b0a482f](b0a482f))
* **tables:** prevent tblInd double-shrink when using tblGrid widths (SD-1494) ([8750ece](8750ece))
* **test:** stabilize flaky cleanUpParagraphWithAnnotations tests ([#2262](#2262)) ([7bafb7f](7bafb7f))
* text highlight on export ([#2189](#2189)) ([9cbd022](9cbd022))
* **toc:** correct zoom scaling and rect.top bug in anchor scroll ([16c768f](16c768f))
* track changes comment text for formatting changes ([#2013](#2013)) ([b2a43ff](b2a43ff))
* track changes in cli ([3742f68](3742f68))
* track highlight changes ([#2192](#2192)) ([e164625](e164625))
* **track-changes:** correct format change description for already-formatted text (SD-2077) ([#2253](#2253)) ([b2ffc0d](b2ffc0d))
* **track-changes:** handle ReplaceAroundStep in tracked changes mode (SD-2061) ([#2225](#2225)) ([8f3cbe4](8f3cbe4))
* **track-changes:** remove ghost TrackFormat on multi-node format cancel ([#2233](#2233)) ([e925ef9](e925ef9))
* **tracked-changes:** colors should be restored when format rejected ([#1970](#1970)) ([01ea504](01ea504))
* **tracked-changes:** fix suggested insertions from paste failures ([#1969](#1969)) ([e74c14a](e74c14a))
* trigger patch release ([7bc1b74](7bc1b74))
* trigger patch release ([32ced9c](32ced9c))
* trigger patch release ([da7f484](da7f484))
* trigger release ([8367dd6](8367dd6))
* undo/redo actions ([#2161](#2161)) ([495e92f](495e92f))
* use correct template syntax for GitHub release URL in PR comments ([9d1bca2](9d1bca2))
* use DEFLATE compression for docx export instead of STORE ([#1933](#1933)) ([ebcd986](ebcd986))
* **virtualization:** compute scrollY relative to scroll container, not viewport ([#2263](#2263)) ([370ca5e](370ca5e))
* **virtualization:** correct scroll mapping and viewport sizing at non-100% zoom ([#2171](#2171)) ([84af4c0](84af4c0)), closes [#registryKey](https://github.com/superdoc-dev/superdoc/issues/registryKey)
* wire DocumentApi to Editor.doc with lifecycle-safe caching ([57326ea](57326ea))
* zIndex updates ([#1973](#1973)) ([3ca7aa3](3ca7aa3))

### Features

* adaptive insert table column width ([#1533](#1533)) ([d4cae2d](d4cae2d))
* add pdf infra, migrate layers ([#2078](#2078)) ([7d416e9](7d416e9))
* add public scroll to page method ([#1791](#1791)) ([1b7687b](1b7687b))
* allow custom accept/reject handlers for TC bubbles ([#1921](#1921)) ([e30abf6](e30abf6))
* **comments:** improve floating comments ui ([#2195](#2195)) ([e870cfb](e870cfb))
* cropped images ([#1940](#1940)) ([3767a49](3767a49))
* **document-api:** add format operations font size alignment color font family ([#2179](#2179)) ([f19c688](f19c688))
* **document-api:** add get markdown to sdks ([e42b56d](e42b56d))
* **document-api:** add getHtml operation, fix HTML insert and SDK tool selection ([#2264](#2264)) ([c554678](c554678))
* **document-api:** add plan-based mutation engine with query.match and style capture ([#2160](#2160)) ([365293a](365293a))
* **document-api:** clear content command ([#2300](#2300)) ([46b5261](46b5261))
* **document-api:** default table style setting ([#2248](#2248)) ([3ad4e9f](3ad4e9f))
* **document-api:** default target-less insert to document end ([#2244](#2244)) ([c717e2b](c717e2b))
* **document-api:** doc default initial styles ([#2184](#2184)) ([f25e41f](f25e41f))
* **document-api:** format.paragraph for w:pPr formatting ([#2218](#2218)) ([32c9991](32c9991))
* **document-api:** history name space ([#2219](#2219)) ([41dea37](41dea37))
* **document-api:** hyperlinks commands ([#2294](#2294)) ([4d3bebd](4d3bebd))
* **document-api:** include anchored text in comments list response ([#2177](#2177)) ([b3a2912](b3a2912))
* **document-api:** initial image commands ([#2290](#2290)) ([d624231](d624231))
* **document-api:** inline formatting parity core end-to-end ([#2197](#2197)) ([b405b03](b405b03))
* **document-api:** inline formatting rpr parity ([#2198](#2198)) ([41ab771](41ab771))
* **document-api:** insert table adds extra separator to match ms word ([#2301](#2301)) ([5e49613](5e49613))
* **document-api:** lists namespace  ([#2223](#2223)) ([09ebfcb](09ebfcb))
* **document-api:** make styles.apply registry-driven with schema/validation ([#2267](#2267)) ([cab54ba](cab54ba))
* **document-api:** more image commands ([#2295](#2295)) ([4fbbbc9](4fbbbc9))
* **document-api:** more lists commands ([#2288](#2288)) ([eb48bf1](eb48bf1))
* **document-api:** section commands ([#2199](#2199)) ([ec4abe3](ec4abe3))
* **document-api:** support deleting entire block nodes not only text ([#2181](#2181)) ([2897246](2897246))
* **document-api:** table of contents commands ([#2200](#2200)) ([baa72c4](baa72c4))
* **document-api:** tables namespace and commands ([#2182](#2182)) ([b80ee31](b80ee31))
* **document-api:** toc commands ([#2220](#2220)) ([767e010](767e010))
* enabled telemetry by default and added documentation ([#2001](#2001)) ([8598ef7](8598ef7))
* enhance telemetry handling for sub-editors ([#2017](#2017)) ([37bc030](37bc030))
* expose setZoom and getZoom API on SuperDoc ([#2137](#2137)) ([ab09dd5](ab09dd5)), closes [#928](#928)
* extend document-api with format, examples, create.heading ([#2092](#2092)) ([fdf8c7c](fdf8c7c))
* **images:** allow drag-and-drop for images in editor ([#2227](#2227)) ([4b36780](4b36780))
* layout snapshot testing ([#2035](#2035)) ([b070cd7](b070cd7))
* **layout-engine:** render table headers, tblLook support ([#2256](#2256)) ([db6a2ff](db6a2ff))
* **link-popover:** custom link popovers ([#2222](#2222)) ([070190f](070190f))
* **links:** convert pasted hyperlinks into real docx links ([#2270](#2270)) ([7d75522](7d75522))
* **lists:** support hidden list indicators via w:vanish ([#2069](#2069)) ([#2080](#2080)) ([0bed0fd](0bed0fd))
* llm tools (alpha version) ([#2292](#2292)) ([f954e3d](f954e3d))
* **markdown:** add markdown override to sdk, improve conversion ([#2196](#2196)) ([04a1c71](04a1c71))
* **markdown:** import images from markdown ([#2303](#2303)) ([b2f6a1a](b2f6a1a))
* preserve w:view setting through DOCX round-trip ([#2190](#2190)) ([48b4210](48b4210)), closes [#2070](#2070)
* real time collab in python sdk ([#2243](#2243)) ([dc3b4fd](dc3b4fd))
* **super-editor:** add w:lock support for StructuredContent nodes (SD-1616) ([#1939](#1939)) ([2c16f1c](2c16f1c))
* superdoc cli ([d808464](d808464))
* superdoc sdk ([#2129](#2129)) ([3f55d23](3f55d23))
* support TIFF images in DOCX rendering ([#2284](#2284)) ([6436d86](6436d86)), closes [#2064](#2064)
* **tables:** allow resizing table rows ([#2226](#2226)) ([2c6da10](2c6da10))
* **tables:** improve cell color application (context), column dragging, table pasting ([#2228](#2228)) ([066b9eb](066b9eb))
* **table:** toggle header row sets both cell types and repeatHeader atomically ([#2245](#2245)) ([2f5899d](2f5899d))
* telemetry ([#1932](#1932)) ([fab3ce9](fab3ce9))
* **template-builder:** add cspNonce support ([#1911](#1911)) ([5b7b34e](5b7b34e))
* **template-builder:** add cspNonce support ([#1911](#1911)) ([bcb9d28](bcb9d28))
* the document API limited alpha ([#2087](#2087)) ([091c24c](091c24c))
* **track-changes:** clear comment bubbles when bulk accept or reject TCs ([#2159](#2159)) ([27fbe8e](27fbe8e))
* **tracked-changes:** allow partial tracked change resolution ([#2252](#2252)) ([988598d](988598d))
* update telemetry configuration to prioritize root licenseKey ([#2016](#2016)) ([3b4ff6b](3b4ff6b))
* **web-view:** new layout engine based web view ([#2100](#2100)) ([a353b82](a353b82))
* whiteboard ([#1954](#1954)) ([c9d1484](c9d1484))

### Performance Improvements

* **build:** migrate to rolldown-vite for ~2x faster builds ([#2006](#2006)) ([74004c3](74004c3))
* **build:** remove redundant steps and add fast dev build (SD-1886) ([#1999](#1999)) ([db46bf8](db46bf8))
* **comments:** batch tracked change comment creation on load ([#2166](#2166)) ([0c2eca5](0c2eca5))
* **comments:** batch tracked change creation and virtualize floating bubbles (SD-1997) ([#2168](#2168)) ([70fd7d9](70fd7d9))
@superdoc-bot
Copy link
Copy Markdown
Contributor

superdoc-bot Bot commented Mar 11, 2026

🎉 This PR is included in superdoc-cli v0.2.0

The release is available on GitHub release

harbournick added a commit that referenced this pull request Mar 17, 2026
* chore(release): 1.18.0 [skip ci]

# [1.18.0](https://github.com/superdoc-dev/superdoc/compare/v1.17.0...v1.18.0) (2026-03-05)

### Bug Fixes

* add type definitions for PresentationEditor ([#2271](https://github.com/superdoc-dev/superdoc/issues/2271)) ([5402196](https://github.com/superdoc-dev/superdoc/commit/5402196e73997b83ddd1d4f270c82e3a85c3365f))
* **document-api:** fix markdown to image ([bf0e664](https://github.com/superdoc-dev/superdoc/commit/bf0e6647820c3987b4100f8f9804e413cfb33511))
* **document-api:** make lists.setType preserve sequence continuity ([#2304](https://github.com/superdoc-dev/superdoc/issues/2304)) ([da09826](https://github.com/superdoc-dev/superdoc/commit/da0982647cd57b4e775794af52e1a23b3d6f2afe))
* **editor:** prevent focus loss when typing in header/footer editors (SD-1993) ([#2238](https://github.com/superdoc-dev/superdoc/issues/2238)) ([e1b8007](https://github.com/superdoc-dev/superdoc/commit/e1b80074377b221873158ce5befc8fa2a908d1a8)), closes [PresentationEditor.#flushRerenderQueue](https://github.com/PresentationEditor./issues/flushRerenderQueue)
* **export:** sync document XML before numbering pruning to preserve list definitions ([36058c3](https://github.com/superdoc-dev/superdoc/commit/36058c3640d12eeba8a3cf671d4cb2b46786d1d1))
* **format:** route format.caps through textTransform so w:caps persists on export ([#2297](https://github.com/superdoc-dev/superdoc/issues/2297)) ([8e771e2](https://github.com/superdoc-dev/superdoc/commit/8e771e2d2ea75d4bc72bc7f589fd9279f8027478))
* handle Uint8Array media values from persistence layers ([#2298](https://github.com/superdoc-dev/superdoc/issues/2298)) ([0d4505c](https://github.com/superdoc-dev/superdoc/commit/0d4505c77ac1c44939e8f7874a08f827a7a8e08c))
* harden markdown image conversion ([4ba1c25](https://github.com/superdoc-dev/superdoc/commit/4ba1c254c77aaa37f552f2ad9fd06ec55e802b23))
* **link-popover:** mount external popovers outside overflow:hidden container (SD-2148) ([#2308](https://github.com/superdoc-dev/superdoc/issues/2308)) ([ea4be68](https://github.com/superdoc-dev/superdoc/commit/ea4be68fb6deea669140d4af5934ba17a6a6571b))
* make expected revision optional, update docs ([#2265](https://github.com/superdoc-dev/superdoc/issues/2265)) ([250bb5b](https://github.com/superdoc-dev/superdoc/commit/250bb5b6131fd68a83a3d0959dc0a5808fb5f152))
* **painter-dom:** prevent scroll acceleration feedback loop in virtualization ([#2291](https://github.com/superdoc-dev/superdoc/issues/2291)) ([fb3d25e](https://github.com/superdoc-dev/superdoc/commit/fb3d25e809019407b1298c28f8c10ac184e1dc73))
* portrait orientation in document-api ([dafab76](https://github.com/superdoc-dev/superdoc/commit/dafab76af5f249c49936a0250e4e54ae4719b305))
* **sdk:** keep sdk sessions alive in non collab ([#2289](https://github.com/superdoc-dev/superdoc/issues/2289)) ([c634ee8](https://github.com/superdoc-dev/superdoc/commit/c634ee87bb6ac29b14b0f02d6080b2420cfe3dc6))
* **super-editor:** align image resize handles with actual image position ([#2293](https://github.com/superdoc-dev/superdoc/issues/2293)) ([217bdce](https://github.com/superdoc-dev/superdoc/commit/217bdcef86d736825b0bfe55880ac57620d1b4d3))
* **test:** stabilize flaky cleanUpParagraphWithAnnotations tests ([#2262](https://github.com/superdoc-dev/superdoc/issues/2262)) ([7bafb7f](https://github.com/superdoc-dev/superdoc/commit/7bafb7f9e0fcc0109a0a976d1a01e9ee408f7291))
* **virtualization:** compute scrollY relative to scroll container, not viewport ([#2263](https://github.com/superdoc-dev/superdoc/issues/2263)) ([370ca5e](https://github.com/superdoc-dev/superdoc/commit/370ca5ea025bd5fb57f1dfe9b79871afbcdfd9b5))

### Features

* **document-api:** add getHtml operation, fix HTML insert and SDK tool selection ([#2264](https://github.com/superdoc-dev/superdoc/issues/2264)) ([c554678](https://github.com/superdoc-dev/superdoc/commit/c554678b425c7b97670aff5d7389bbbdfe8a5c04))
* **document-api:** clear content command ([#2300](https://github.com/superdoc-dev/superdoc/issues/2300)) ([46b5261](https://github.com/superdoc-dev/superdoc/commit/46b5261f34b6793d41ab6452fb117e0f81b7437a))
* **document-api:** hyperlinks commands ([#2294](https://github.com/superdoc-dev/superdoc/issues/2294)) ([4d3bebd](https://github.com/superdoc-dev/superdoc/commit/4d3bebd6c89dd1cbd5c143e61c71beca45daba1b))
* **document-api:** initial image commands ([#2290](https://github.com/superdoc-dev/superdoc/issues/2290)) ([d624231](https://github.com/superdoc-dev/superdoc/commit/d624231a97872af746d93de70129ac734cd363b8))
* **document-api:** insert table adds extra separator to match ms word ([#2301](https://github.com/superdoc-dev/superdoc/issues/2301)) ([5e49613](https://github.com/superdoc-dev/superdoc/commit/5e496130249a8fc5403f201c667106c5da4961fb))
* **document-api:** make styles.apply registry-driven with schema/validation ([#2267](https://github.com/superdoc-dev/superdoc/issues/2267)) ([cab54ba](https://github.com/superdoc-dev/superdoc/commit/cab54badc20e7002ce82be6f4e02f84e71802717))
* **document-api:** more image commands ([#2295](https://github.com/superdoc-dev/superdoc/issues/2295)) ([4fbbbc9](https://github.com/superdoc-dev/superdoc/commit/4fbbbc987e2469b8fd70c1a07a79dacc801f6733))
* **document-api:** more lists commands ([#2288](https://github.com/superdoc-dev/superdoc/issues/2288)) ([eb48bf1](https://github.com/superdoc-dev/superdoc/commit/eb48bf1cf72da0c780998cf033e851aadc144206))
* **links:** convert pasted hyperlinks into real docx links ([#2270](https://github.com/superdoc-dev/superdoc/issues/2270)) ([7d75522](https://github.com/superdoc-dev/superdoc/commit/7d7552203f0bbc6779149656e447432d50eb2697))
* **markdown:** import images from markdown ([#2303](https://github.com/superdoc-dev/superdoc/issues/2303)) ([b2f6a1a](https://github.com/superdoc-dev/superdoc/commit/b2f6a1ad5692153b60edb5b88347b5c8e37191f7))
* support TIFF images in DOCX rendering ([#2284](https://github.com/superdoc-dev/superdoc/issues/2284)) ([6436d86](https://github.com/superdoc-dev/superdoc/commit/6436d861efbdb52d592a0069fc84a1f5d830f358)), closes [#2064](https://github.com/superdoc-dev/superdoc/issues/2064)
* **tracked-changes:** allow partial tracked change resolution ([#2252](https://github.com/superdoc-dev/superdoc/issues/2252)) ([988598d](https://github.com/superdoc-dev/superdoc/commit/988598d7f20e263e81715a2f0195abc2ecffe75b))
* **web-view:** new layout engine based web view ([#2100](https://github.com/superdoc-dev/superdoc/issues/2100)) ([a353b82](https://github.com/superdoc-dev/superdoc/commit/a353b82a3c0404db13cda8ab72f7500b2aae8e09))

* chore(release): 1.18.0 [skip ci]

# [1.18.0](https://github.com/superdoc-dev/superdoc/compare/v1.17.0...v1.18.0) (2026-03-05)

### Bug Fixes

* add type definitions for PresentationEditor ([#2271](https://github.com/superdoc-dev/superdoc/issues/2271)) ([5402196](https://github.com/superdoc-dev/superdoc/commit/5402196e73997b83ddd1d4f270c82e3a85c3365f))
* **document-api:** fix markdown to image ([bf0e664](https://github.com/superdoc-dev/superdoc/commit/bf0e6647820c3987b4100f8f9804e413cfb33511))
* **document-api:** make lists.setType preserve sequence continuity ([#2304](https://github.com/superdoc-dev/superdoc/issues/2304)) ([da09826](https://github.com/superdoc-dev/superdoc/commit/da0982647cd57b4e775794af52e1a23b3d6f2afe))
* **editor:** prevent focus loss when typing in header/footer editors (SD-1993) ([#2238](https://github.com/superdoc-dev/superdoc/issues/2238)) ([e1b8007](https://github.com/superdoc-dev/superdoc/commit/e1b80074377b221873158ce5befc8fa2a908d1a8)), closes [PresentationEditor.#flushRerenderQueue](https://github.com/PresentationEditor./issues/flushRerenderQueue)
* **export:** sync document XML before numbering pruning to preserve list definitions ([36058c3](https://github.com/superdoc-dev/superdoc/commit/36058c3640d12eeba8a3cf671d4cb2b46786d1d1))
* **format:** route format.caps through textTransform so w:caps persists on export ([#2297](https://github.com/superdoc-dev/superdoc/issues/2297)) ([8e771e2](https://github.com/superdoc-dev/superdoc/commit/8e771e2d2ea75d4bc72bc7f589fd9279f8027478))
* handle Uint8Array media values from persistence layers ([#2298](https://github.com/superdoc-dev/superdoc/issues/2298)) ([0d4505c](https://github.com/superdoc-dev/superdoc/commit/0d4505c77ac1c44939e8f7874a08f827a7a8e08c))
* harden markdown image conversion ([4ba1c25](https://github.com/superdoc-dev/superdoc/commit/4ba1c254c77aaa37f552f2ad9fd06ec55e802b23))
* **link-popover:** mount external popovers outside overflow:hidden container (SD-2148) ([#2308](https://github.com/superdoc-dev/superdoc/issues/2308)) ([ea4be68](https://github.com/superdoc-dev/superdoc/commit/ea4be68fb6deea669140d4af5934ba17a6a6571b))
* make expected revision optional, update docs ([#2265](https://github.com/superdoc-dev/superdoc/issues/2265)) ([250bb5b](https://github.com/superdoc-dev/superdoc/commit/250bb5b6131fd68a83a3d0959dc0a5808fb5f152))
* **painter-dom:** prevent scroll acceleration feedback loop in virtualization ([#2291](https://github.com/superdoc-dev/superdoc/issues/2291)) ([fb3d25e](https://github.com/superdoc-dev/superdoc/commit/fb3d25e809019407b1298c28f8c10ac184e1dc73))
* portrait orientation in document-api ([dafab76](https://github.com/superdoc-dev/superdoc/commit/dafab76af5f249c49936a0250e4e54ae4719b305))
* **sdk:** keep sdk sessions alive in non collab ([#2289](https://github.com/superdoc-dev/superdoc/issues/2289)) ([c634ee8](https://github.com/superdoc-dev/superdoc/commit/c634ee87bb6ac29b14b0f02d6080b2420cfe3dc6))
* **super-editor:** align image resize handles with actual image position ([#2293](https://github.com/superdoc-dev/superdoc/issues/2293)) ([217bdce](https://github.com/superdoc-dev/superdoc/commit/217bdcef86d736825b0bfe55880ac57620d1b4d3))
* **test:** stabilize flaky cleanUpParagraphWithAnnotations tests ([#2262](https://github.com/superdoc-dev/superdoc/issues/2262)) ([7bafb7f](https://github.com/superdoc-dev/superdoc/commit/7bafb7f9e0fcc0109a0a976d1a01e9ee408f7291))
* **virtualization:** compute scrollY relative to scroll container, not viewport ([#2263](https://github.com/superdoc-dev/superdoc/issues/2263)) ([370ca5e](https://github.com/superdoc-dev/superdoc/commit/370ca5ea025bd5fb57f1dfe9b79871afbcdfd9b5))

### Features

* **document-api:** add getHtml operation, fix HTML insert and SDK tool selection ([#2264](https://github.com/superdoc-dev/superdoc/issues/2264)) ([c554678](https://github.com/superdoc-dev/superdoc/commit/c554678b425c7b97670aff5d7389bbbdfe8a5c04))
* **document-api:** clear content command ([#2300](https://github.com/superdoc-dev/superdoc/issues/2300)) ([46b5261](https://github.com/superdoc-dev/superdoc/commit/46b5261f34b6793d41ab6452fb117e0f81b7437a))
* **document-api:** hyperlinks commands ([#2294](https://github.com/superdoc-dev/superdoc/issues/2294)) ([4d3bebd](https://github.com/superdoc-dev/superdoc/commit/4d3bebd6c89dd1cbd5c143e61c71beca45daba1b))
* **document-api:** initial image commands ([#2290](https://github.com/superdoc-dev/superdoc/issues/2290)) ([d624231](https://github.com/superdoc-dev/superdoc/commit/d624231a97872af746d93de70129ac734cd363b8))
* **document-api:** insert table adds extra separator to match ms word ([#2301](https://github.com/superdoc-dev/superdoc/issues/2301)) ([5e49613](https://github.com/superdoc-dev/superdoc/commit/5e496130249a8fc5403f201c667106c5da4961fb))
* **document-api:** make styles.apply registry-driven with schema/validation ([#2267](https://github.com/superdoc-dev/superdoc/issues/2267)) ([cab54ba](https://github.com/superdoc-dev/superdoc/commit/cab54badc20e7002ce82be6f4e02f84e71802717))
* **document-api:** more image commands ([#2295](https://github.com/superdoc-dev/superdoc/issues/2295)) ([4fbbbc9](https://github.com/superdoc-dev/superdoc/commit/4fbbbc987e2469b8fd70c1a07a79dacc801f6733))
* **document-api:** more lists commands ([#2288](https://github.com/superdoc-dev/superdoc/issues/2288)) ([eb48bf1](https://github.com/superdoc-dev/superdoc/commit/eb48bf1cf72da0c780998cf033e851aadc144206))
* **links:** convert pasted hyperlinks into real docx links ([#2270](https://github.com/superdoc-dev/superdoc/issues/2270)) ([7d75522](https://github.com/superdoc-dev/superdoc/commit/7d7552203f0bbc6779149656e447432d50eb2697))
* **markdown:** import images from markdown ([#2303](https://github.com/superdoc-dev/superdoc/issues/2303)) ([b2f6a1a](https://github.com/superdoc-dev/superdoc/commit/b2f6a1ad5692153b60edb5b88347b5c8e37191f7))
* support TIFF images in DOCX rendering ([#2284](https://github.com/superdoc-dev/superdoc/issues/2284)) ([6436d86](https://github.com/superdoc-dev/superdoc/commit/6436d861efbdb52d592a0069fc84a1f5d830f358)), closes [#2064](https://github.com/superdoc-dev/superdoc/issues/2064)
* **tracked-changes:** allow partial tracked change resolution ([#2252](https://github.com/superdoc-dev/superdoc/issues/2252)) ([988598d](https://github.com/superdoc-dev/superdoc/commit/988598d7f20e263e81715a2f0195abc2ecffe75b))
* **web-view:** new layout engine based web view ([#2100](https://github.com/superdoc-dev/superdoc/issues/2100)) ([a353b82](https://github.com/superdoc-dev/superdoc/commit/a353b82a3c0404db13cda8ab72f7500b2aae8e09))

* fix(export): prevent DOCX corruption from UTF-16 XML parts and schema violations (SD-2170) (#2349)

Cherry-pick from main (fed1d6b23)

* chore(release): 1.18.1 [skip ci]

## [1.18.1](https://github.com/superdoc-dev/superdoc/compare/v1.18.0...v1.18.1) (2026-03-10)

### Bug Fixes

* **export:** prevent DOCX corruption from UTF-16 XML parts and schema violations (SD-2170) ([#2349](https://github.com/superdoc-dev/superdoc/issues/2349)) ([f6dbb40](https://github.com/superdoc-dev/superdoc/commit/f6dbb404ad998e502a49df7e0ffded9f2a236321))

* fix(rendering): show comment highlight on text with Word highlight formatting

SD-2188: The `!textRun.highlight` guard in the renderer prevented comment
highlights from being applied when text also had Word highlight formatting
(`<w:highlight>`). This caused comments on highlighted text to be invisible.
Removed the guard so comment highlights always take precedence, matching
Word's behavior.

* test(rendering): strengthen SD-2188 assertion to verify comment color overrides Word highlight

The previous assertion (not.toBe('')) passed on both old and new code
since applyRunStyles already sets backgroundColor from the Word highlight.
Now asserts the color is NOT the Word yellow (#ffff00).

* test(rendering): add active and faded comment highlight tests with Word highlight (SD-2188)

Cover the full matrix: comment highlight overrides Word highlight
in idle, active, and faded states.

* fix(anchor-nav): use correct scroll container for sub-page bookmark navigation

goToAnchor was scrolling the visibleHost element which has overflow:visible
and cannot scroll. Now uses #scrollContainer (the first scrollable ancestor)
and computes precise Y offsets from layout fragment positions for sub-page
scroll precision.

SD-2186

* docs: add PresentationEditor CLAUDE.md with DOM/scroll hierarchy

* fix(toc): correct zoom scaling and rect.top bug in anchor scroll

- Remove rect?.top (Rect type has no top property, was always undefined)
- Scale fragmentY by zoom factor before mixing with screen-space coords
- Thread zoom from PresentationEditor into goToAnchor deps
- Add unit tests for precision scroll, zoom scaling, and gap fallback

* test(toc): add behavior tests for TOC anchor click navigation

Tests clicking TOC entry links and verifying:
- Caret moves to the bookmark position (SD-2186)
- Scroll position changes for cross-page navigation

* chore(release): 1.18.2 [skip ci]

## [1.18.2](https://github.com/superdoc-dev/superdoc/compare/v1.18.1...v1.18.2) (2026-03-11)

### Bug Fixes

* **anchor-nav:** use correct scroll container for sub-page bookmark navigation ([a300536](https://github.com/superdoc-dev/superdoc/commit/a300536111890565c6b53b0842551a5c2f4c191a)), closes [#scrollContainer](https://github.com/superdoc-dev/superdoc/issues/scrollContainer)
* **rendering:** show comment highlight on text with Word highlight formatting ([f6d956e](https://github.com/superdoc-dev/superdoc/commit/f6d956ec38f12ff0ee3440f153edf1fa69406f2d))
* **toc:** correct zoom scaling and rect.top bug in anchor scroll ([16c768f](https://github.com/superdoc-dev/superdoc/commit/16c768f1b81672c5126833cc1ffbe948a2c11ebd))

* ci: remove changelog generation from stable releases

* chore(cli): 0.2.0 [skip ci]

# [0.2.0](https://github.com/superdoc-dev/superdoc/compare/cli-v0.1.0...cli-v0.2.0) (2026-03-11)

### Bug Fixes

* active track change ([#2163](https://github.com/superdoc-dev/superdoc/issues/2163)) ([108c14d](https://github.com/superdoc-dev/superdoc/commit/108c14d30fad847e3604d285806823ff9485c2f6))
* add currentTotalPages getter and pagination-update event ([#2202](https://github.com/superdoc-dev/superdoc/issues/2202)) ([95b4579](https://github.com/superdoc-dev/superdoc/commit/95b45793cc7ad4acf714eac2f6f9ac010a62e8ea)), closes [#958](https://github.com/superdoc-dev/superdoc/issues/958)
* add type definitions for PresentationEditor ([#2271](https://github.com/superdoc-dev/superdoc/issues/2271)) ([5402196](https://github.com/superdoc-dev/superdoc/commit/5402196e73997b83ddd1d4f270c82e3a85c3365f))
* **ai-actions:** preserve html/markdown insertion and prevent repeated formatted replacement ([#2117](https://github.com/superdoc-dev/superdoc/issues/2117)) ([9f685e9](https://github.com/superdoc-dev/superdoc/commit/9f685e964b5156d0d177e2fa0a72a4129d2a0443))
* **ai:** support headless mode in EditorAdapter.applyPatch ([#1859](https://github.com/superdoc-dev/superdoc/issues/1859)) ([cf9275d](https://github.com/superdoc-dev/superdoc/commit/cf9275d3bffd144491701508103af4c7b8f1708e))
* allow paste from context menu ([#1910](https://github.com/superdoc-dev/superdoc/issues/1910)) ([b6666bf](https://github.com/superdoc-dev/superdoc/commit/b6666bf94a3bc6a4f8a71a49e95136e2e5e9e2ae))
* always call resolveComment after custom TC bubble handlers (SD-2049) ([#2204](https://github.com/superdoc-dev/superdoc/issues/2204)) ([34fb4e0](https://github.com/superdoc-dev/superdoc/commit/34fb4e07e32c76d6c53580c9046db19e5024bb08))
* anchor table overlaps text ([#1995](https://github.com/superdoc-dev/superdoc/issues/1995)) ([fc05e29](https://github.com/superdoc-dev/superdoc/commit/fc05e295efef9e02db9d7cccafc771d3d00da3e6))
* **anchor-nav:** use correct scroll container for sub-page bookmark navigation ([a300536](https://github.com/superdoc-dev/superdoc/commit/a300536111890565c6b53b0842551a5c2f4c191a)), closes [#scrollContainer](https://github.com/superdoc-dev/superdoc/issues/scrollContainer)
* backward replace insert text ([#2172](https://github.com/superdoc-dev/superdoc/issues/2172)) ([66f0849](https://github.com/superdoc-dev/superdoc/commit/66f08497dd5642db2be6b8729c9bbc84a862ae20))
* before paragraph spacing inside table cells ([#1842](https://github.com/superdoc-dev/superdoc/issues/1842)) ([c7efa85](https://github.com/superdoc-dev/superdoc/commit/c7efa857abdfa6a0f129f73e3c5654b573c1028c))
* **build:** add node polyfills to UMD bundle and angular to CI matrix ([13fa579](https://github.com/superdoc-dev/superdoc/commit/13fa579c5e10a5da26c7308887e82123d914659c))
* **build:** remove dead vite-plugin-node-polyfills from UMD externals ([91de1fc](https://github.com/superdoc-dev/superdoc/commit/91de1fc2e47b0061d088db5d46b0da4cc07dc837))
* **ci:** include sub-package commits in superdoc release filter ([a2c237b](https://github.com/superdoc-dev/superdoc/commit/a2c237bb631130de5ae345209ca109f1ff645519))
* **ci:** move superdoc releaserc to package dir for proper commit filtering ([688f8e0](https://github.com/superdoc-dev/superdoc/commit/688f8e09df258d7279e7364c03d08e217c742c3d))
* **cli:** add jsdoc params to formatReplaceResult ([#1923](https://github.com/superdoc-dev/superdoc/issues/1923)) ([e52ddf9](https://github.com/superdoc-dev/superdoc/commit/e52ddf9bf010947d9435b788ab7753d136a801f1))
* **cli:** add param jsdoc to expandGlobs ([df8c3c6](https://github.com/superdoc-dev/superdoc/commit/df8c3c625be5901f4551d99318a43f47e3dfb7fb))
* **cli:** add returns jsdoc to formatSearchResult ([d0a0438](https://github.com/superdoc-dev/superdoc/commit/d0a04389b05d1f79d1c5111ed82e4feaf5b1af20))
* **cli:** lowercase docx in help text ([#1928](https://github.com/superdoc-dev/superdoc/issues/1928)) ([13f9db6](https://github.com/superdoc-dev/superdoc/commit/13f9db6897a070525fe2ea4ccaf98c3be245faeb))
* **cli:** normalize dash in help text ([b2e7d36](https://github.com/superdoc-dev/superdoc/commit/b2e7d36631db90863ce6ba263daff55d32220b99))
* **cli:** prevent collab reopen from overwriting existing ydoc with blank document (SD-2138) ([#2296](https://github.com/superdoc-dev/superdoc/issues/2296)) ([41b0345](https://github.com/superdoc-dev/superdoc/commit/41b0345367e32d0f053825c9f8733f1351f52760))
* collaboration cursor styles fix ([fd6db10](https://github.com/superdoc-dev/superdoc/commit/fd6db10558caa4136da262ad10b751dbb4bdac2c))
* **collaboration:** deduplicate updateYdocDocxData during replaceFile (SD-1920) ([#2162](https://github.com/superdoc-dev/superdoc/issues/2162)) ([52962fc](https://github.com/superdoc-dev/superdoc/commit/52962fc139734130a6882c9fcbd1856ff72d1c3d))
* **collaboration:** memory leaks, Vue stack overflow, and Liveblocks stability (SD-1924) ([#2030](https://github.com/superdoc-dev/superdoc/issues/2030)) ([a6827fd](https://github.com/superdoc-dev/superdoc/commit/a6827fdda860171124aae4838d354dd68d52d017)), closes [#prepareDocumentForExport](https://github.com/superdoc-dev/superdoc/issues/prepareDocumentForExport)
* **collab:** prevent stale view when remote Y.js changes bypass sdBlockRev increment ([#2099](https://github.com/superdoc-dev/superdoc/issues/2099)) ([0895a93](https://github.com/superdoc-dev/superdoc/commit/0895a93bb9e718f4f533a55e8f4022ed0ebc97bc))
* **comments:** cross-page collision avoidance for floating comment bubbles (SD-1998) ([#2180](https://github.com/superdoc-dev/superdoc/issues/2180)) ([6cfbeca](https://github.com/superdoc-dev/superdoc/commit/6cfbecae5e8579556a377b7a35168cbb7cfce31f))
* **comments:** emit empty comment positions so undo clears orphan bubbles ([#2235](https://github.com/superdoc-dev/superdoc/issues/2235)) ([12ba727](https://github.com/superdoc-dev/superdoc/commit/12ba72709fc37f207c97305852f40ef4e393893b))
* **comments:** improve multiline comment input styling ([#2242](https://github.com/superdoc-dev/superdoc/issues/2242)) ([e6a0dab](https://github.com/superdoc-dev/superdoc/commit/e6a0dab8abca8a24c5e0c8a9096c357df28eaf8a))
* **comments:** prevent comment mark from extending to adjacent typed text ([#2241](https://github.com/superdoc-dev/superdoc/issues/2241)) ([07fecd8](https://github.com/superdoc-dev/superdoc/commit/07fecd8f0f6c88f338b59fca6105467cf66cc7ab))
* **comments:** reduce sidebar jitter when clicking comments (SD-2034) ([#2250](https://github.com/superdoc-dev/superdoc/issues/2250)) ([c3568d2](https://github.com/superdoc-dev/superdoc/commit/c3568d2d6fc4d91125cede042084ed124a9b2072))
* **comments:** remove synchronous dispatch from plugin apply() (SD-1940) ([#2157](https://github.com/superdoc-dev/superdoc/issues/2157)) ([887175b](https://github.com/superdoc-dev/superdoc/commit/887175bf29b3dc86cf56865311d488b377b36aaf))
* consolidate deletions under new replacement ([#2094](https://github.com/superdoc-dev/superdoc/issues/2094)) ([0a84b86](https://github.com/superdoc-dev/superdoc/commit/0a84b8604c9a30ed2755cfd0ecc7694e1999c6eb))
* context menu clicks would change selection position ([#1889](https://github.com/superdoc-dev/superdoc/issues/1889)) ([ace0daf](https://github.com/superdoc-dev/superdoc/commit/ace0dafcf58535ec0ba6ff48efcd7ee113b021ce))
* **context-menu:** paste via context menu inserts at wrong position (SD-1302) ([#2110](https://github.com/superdoc-dev/superdoc/issues/2110)) ([30f03f9](https://github.com/superdoc-dev/superdoc/commit/30f03f93b59261a7fce55e7d62cc83897b457afd))
* **converter:** handle absolute paths in header/footer relationship targets ([#1945](https://github.com/superdoc-dev/superdoc/issues/1945)) ([9d82632](https://github.com/superdoc-dev/superdoc/commit/9d82632c62a70cc6cb19015f9fca89b3f28a4323))
* **converter:** handle empty rPrChange run properties without dropping tracked-style runs ([c25d24d](https://github.com/superdoc-dev/superdoc/commit/c25d24d35534c39836c3251ee9baf1b908a6c78c))
* **converter:** handle null list lvlText and always clear numbering cache ([#2113](https://github.com/superdoc-dev/superdoc/issues/2113)) ([336958c](https://github.com/superdoc-dev/superdoc/commit/336958ca9b39ebcc436fc77fb1daae82ddbd8b0c))
* correctly pass table info when deriving inline run properties (SD-1865) ([#2007](https://github.com/superdoc-dev/superdoc/issues/2007)) ([d752aff](https://github.com/superdoc-dev/superdoc/commit/d752afff9dc11041798ea2a28d487cc190e13383))
* correctly set color and highlight of pasted text ([#2033](https://github.com/superdoc-dev/superdoc/issues/2033)) ([41058b5](https://github.com/superdoc-dev/superdoc/commit/41058b5bfadbc34d83891afe88c6b8c24505f83c))
* **css:** scope ProseMirror CSS to prevent bleeding into host apps (SD-1850) ([#2134](https://github.com/superdoc-dev/superdoc/issues/2134)) ([b9d98fa](https://github.com/superdoc-dev/superdoc/commit/b9d98fa926532f63c71c55ed8bb5b89019ee4246))
* cursor drift during vertical arrow navigation (SD-1689) ([#1918](https://github.com/superdoc-dev/superdoc/issues/1918)) ([982118d](https://github.com/superdoc-dev/superdoc/commit/982118df475b3178351713f0c00f6fe447853c61))
* disable footnotes typing ([#1974](https://github.com/superdoc-dev/superdoc/issues/1974)) ([92b4d62](https://github.com/superdoc-dev/superdoc/commit/92b4d6288a48275435660ae2a848b064506390f6))
* **doc-api:** stabilize create composability and expand SDK surface ([fc17167](https://github.com/superdoc-dev/superdoc/commit/fc1716721b7c15b3fd1ac5724e48cc709a9fd986))
* document-api improvements, plan mode, query.match, mutations ([6221580](https://github.com/superdoc-dev/superdoc/commit/62215805c969a80445f9e410fd5fb2478b8c38a5))
* **document-api:** add friendlier insert at node id with offset, or pos ([#2128](https://github.com/superdoc-dev/superdoc/issues/2128)) ([c1d3682](https://github.com/superdoc-dev/superdoc/commit/c1d3682e15dc7c99b1450c2f008f6f937729fc39))
* **document-api:** add nodeId shorthand resolution across all operations ([#2131](https://github.com/superdoc-dev/superdoc/issues/2131)) ([8abdaad](https://github.com/superdoc-dev/superdoc/commit/8abdaadd7dda2ef4751d040527adab61c06f3c48))
* **document-api:** delete table cell fix ([#2209](https://github.com/superdoc-dev/superdoc/issues/2209)) ([5e5c43f](https://github.com/superdoc-dev/superdoc/commit/5e5c43fe1b63703308cdbd3a1dd01d121ea5465c))
* **document-api:** distribute columns command fixes ([#2207](https://github.com/superdoc-dev/superdoc/issues/2207)) ([8f4eaf7](https://github.com/superdoc-dev/superdoc/commit/8f4eaf7efde73e26c919f77a71d180c763d636ce))
* **document-api:** fix cell shading in document api ([#2215](https://github.com/superdoc-dev/superdoc/issues/2215)) ([456f60e](https://github.com/superdoc-dev/superdoc/commit/456f60e41605a2d94c5194052cf1982bed02d1c3))
* **document-api:** fix markdown to image ([bf0e664](https://github.com/superdoc-dev/superdoc/commit/bf0e6647820c3987b4100f8f9804e413cfb33511))
* **document-api:** insert table cell ([#2210](https://github.com/superdoc-dev/superdoc/issues/2210)) ([357ee90](https://github.com/superdoc-dev/superdoc/commit/357ee9018451f7a22bc1383aed7af6149da1d8e8))
* **document-api:** make lists.setType preserve sequence continuity ([#2304](https://github.com/superdoc-dev/superdoc/issues/2304)) ([da09826](https://github.com/superdoc-dev/superdoc/commit/da0982647cd57b4e775794af52e1a23b3d6f2afe))
* **document-api:** plan-engine reliability fixes and error diagnostics ([#2185](https://github.com/superdoc-dev/superdoc/issues/2185)) ([abfd81b](https://github.com/superdoc-dev/superdoc/commit/abfd81b753035bfaa4429748318af1eb51ac14e3))
* **document-api:** remove search match cap and validate moveComment bounds ([6d3de67](https://github.com/superdoc-dev/superdoc/commit/6d3de67ee398f5bbdd55a589e86a5c2bf321268a))
* **document-api:** split table cell command ([#2217](https://github.com/superdoc-dev/superdoc/issues/2217)) ([0b3e2b4](https://github.com/superdoc-dev/superdoc/commit/0b3e2b4fcc50c1a30dec593c0aa41e69c9b809ff))
* **document-api:** split table command ([#2214](https://github.com/superdoc-dev/superdoc/issues/2214)) ([ec31699](https://github.com/superdoc-dev/superdoc/commit/ec31699d665cd4b4f4da7e2646d77ec828604568))
* editor bundling in python CLI regression ([db0d130](https://github.com/superdoc-dev/superdoc/commit/db0d130d0296bb40deed19a8d70a5ab0fbafadbb))
* **editor:** prevent focus loss when typing in header/footer editors (SD-1993) ([#2238](https://github.com/superdoc-dev/superdoc/issues/2238)) ([e1b8007](https://github.com/superdoc-dev/superdoc/commit/e1b80074377b221873158ce5befc8fa2a908d1a8)), closes [PresentationEditor.#flushRerenderQueue](https://github.com/PresentationEditor./issues/flushRerenderQueue)
* **editor:** render styles applied inside SDT fields (SD-2011) ([#2188](https://github.com/superdoc-dev/superdoc/issues/2188)) ([9c34be3](https://github.com/superdoc-dev/superdoc/commit/9c34be39cfeb1ab77ebcd91343aaf9681a3f9b9a))
* **editor:** selection highlight flickers when dragging across mark boundaries (SD-2024) ([#2205](https://github.com/superdoc-dev/superdoc/issues/2205)) ([ba03e76](https://github.com/superdoc-dev/superdoc/commit/ba03e768fae837e4f5b8dd856ca765f76957e83c))
* ensure we do not duplicate bubble text ([#1934](https://github.com/superdoc-dev/superdoc/issues/1934)) ([c41cf9e](https://github.com/superdoc-dev/superdoc/commit/c41cf9e21d763aa08546eb3445c54a078bf66d33))
* export docx blobs with docx mime type ([#1849](https://github.com/superdoc-dev/superdoc/issues/1849)) ([1bc466d](https://github.com/superdoc-dev/superdoc/commit/1bc466d25fc01618fa4a54f6e3c4120e43a7e89e))
* **export:** prevent DOCX corruption from entity encoding and orphaned delInstrText (SD-1943) ([#2102](https://github.com/superdoc-dev/superdoc/issues/2102)) ([56e917f](https://github.com/superdoc-dev/superdoc/commit/56e917fff93175b27529afc2c8e744b21ea3bc29)), closes [#replaceSpecialCharacters](https://github.com/superdoc-dev/superdoc/issues/replaceSpecialCharacters) [#1988](https://github.com/superdoc-dev/superdoc/issues/1988)
* **export:** prevent DOCX corruption from UTF-16 XML parts and schema violations (SD-2170) ([#2349](https://github.com/superdoc-dev/superdoc/issues/2349)) ([f6dbb40](https://github.com/superdoc-dev/superdoc/commit/f6dbb404ad998e502a49df7e0ffded9f2a236321))
* **export:** sync document XML before numbering pruning to preserve list definitions ([36058c3](https://github.com/superdoc-dev/superdoc/commit/36058c3640d12eeba8a3cf671d4cb2b46786d1d1))
* extract duplicate block identity normalization from docxImporter ([7f7ff93](https://github.com/superdoc-dev/superdoc/commit/7f7ff9338786ed251323fc7986e6e30cf699b3b6))
* find tracked change for firefox ([#1899](https://github.com/superdoc-dev/superdoc/issues/1899)) ([a39cb68](https://github.com/superdoc-dev/superdoc/commit/a39cb683df898ca9a41b4c7f54d3d2f8e48ea8f1))
* **format:** route format.caps through textTransform so w:caps persists on export ([#2297](https://github.com/superdoc-dev/superdoc/issues/2297)) ([8e771e2](https://github.com/superdoc-dev/superdoc/commit/8e771e2d2ea75d4bc72bc7f589fd9279f8027478))
* handle Uint8Array media values from persistence layers ([#2298](https://github.com/superdoc-dev/superdoc/issues/2298)) ([0d4505c](https://github.com/superdoc-dev/superdoc/commit/0d4505c77ac1c44939e8f7874a08f827a7a8e08c))
* harden markdown image conversion ([4ba1c25](https://github.com/superdoc-dev/superdoc/commit/4ba1c254c77aaa37f552f2ad9fd06ec55e802b23))
* headless yjs ([#1913](https://github.com/superdoc-dev/superdoc/issues/1913)) ([4cdecf7](https://github.com/superdoc-dev/superdoc/commit/4cdecf7c592f8fbf23655b05200c36b9edfb6d7e))
* ignore sdBlockId when pasting content ([#2010](https://github.com/superdoc-dev/superdoc/issues/2010)) ([1b08572](https://github.com/superdoc-dev/superdoc/commit/1b08572ef696dfe9fb45cd079c4381bd86c3b2d3))
* image z-index and overlaps ([#1950](https://github.com/superdoc-dev/superdoc/issues/1950)) ([39875ac](https://github.com/superdoc-dev/superdoc/commit/39875acda1a1799f52d433d463739926e73eea61))
* improve backspace behavior near run boundaries for tracked changes ([#2175](https://github.com/superdoc-dev/superdoc/issues/2175)) ([6c9c7a3](https://github.com/superdoc-dev/superdoc/commit/6c9c7a3d72ed78717297cd48530f4629c9c680c4))
* issue updating paragraph properties (SD-1778) ([#1944](https://github.com/superdoc-dev/superdoc/issues/1944)) ([a9076ed](https://github.com/superdoc-dev/superdoc/commit/a9076eda595e0e64b57add6d3809fed587e62f7d))
* **layout-bridge:** correct cell selection for tables with rowspan ([#1839](https://github.com/superdoc-dev/superdoc/issues/1839)) ([0b782be](https://github.com/superdoc-dev/superdoc/commit/0b782be3d17df0f72f4c0ce8f7e44e663422e841))
* **layout-bridge:** defer table fragment click mapping to geometry fallback ([#1968](https://github.com/superdoc-dev/superdoc/issues/1968)) ([0eac43c](https://github.com/superdoc-dev/superdoc/commit/0eac43c2880c39767407279db585bd2568a758d9))
* **layout-engine:** text clipping inside table in document with multi-orientation, recursive pagination for deeply nested tables (SD-1962) ([#2140](https://github.com/superdoc-dev/superdoc/issues/2140)) ([072c009](https://github.com/superdoc-dev/superdoc/commit/072c0093f6fa8977e44801f6aa03ff5cb0b6ac5f))
* **layout,converter:** text box rendering and page-relative anchor positioning (SD-1331, SD-1838) ([#2034](https://github.com/superdoc-dev/superdoc/issues/2034)) ([3947f39](https://github.com/superdoc-dev/superdoc/commit/3947f39718d0f03a62e0fc900ec0f25676df84ac))
* **layout:** per-section footer constraints for multi-section docs (SD-1837) ([#2022](https://github.com/superdoc-dev/superdoc/issues/2022)) ([e11acc5](https://github.com/superdoc-dev/superdoc/commit/e11acc5c423c4bbf6f2a608527802ddf23519528))
* **layout:** route list text-start calculations through resolveListTextStartPx ([02b14b8](https://github.com/superdoc-dev/superdoc/commit/02b14b856c3e58aa6b0c9ad7b46943b748a3d2b5))
* **link-popover:** mount external popovers outside overflow:hidden container (SD-2148) ([#2308](https://github.com/superdoc-dev/superdoc/issues/2308)) ([ea4be68](https://github.com/superdoc-dev/superdoc/commit/ea4be68fb6deea669140d4af5934ba17a6a6571b))
* load alternative style definitions when main one is missing ([#1922](https://github.com/superdoc-dev/superdoc/issues/1922)) ([bb4083f](https://github.com/superdoc-dev/superdoc/commit/bb4083fbbabe61078e71af5c06a251a4e60670fd))
* make expected revision optional, update docs ([#2265](https://github.com/superdoc-dev/superdoc/issues/2265)) ([250bb5b](https://github.com/superdoc-dev/superdoc/commit/250bb5b6131fd68a83a3d0959dc0a5808fb5f152))
* markdown block-separator blank lines and heading split style-mark normalization ([e988adc](https://github.com/superdoc-dev/superdoc/commit/e988adc3b437b9ec3333afb521f76c3810e35040))
* mount Vue on wrapper element to prevent host framework conflicts (SD-1832) ([#1971](https://github.com/superdoc-dev/superdoc/issues/1971)) ([0c4bdda](https://github.com/superdoc-dev/superdoc/commit/0c4bddab0fd1c47e9530860492480748497ad51d))
* normalize bookmarks in tables ([#1892](https://github.com/superdoc-dev/superdoc/issues/1892)) ([369b7e1](https://github.com/superdoc-dev/superdoc/commit/369b7e1bfc1e2777916aba77f076de718735a612))
* normalize review namespace into trackChanges, harden input validation ([33e907b](https://github.com/superdoc-dev/superdoc/commit/33e907bb186c87cd9a015af8d7322be63793e234))
* outside click for toolbar dropdown ([#2174](https://github.com/superdoc-dev/superdoc/issues/2174)) ([5f859c7](https://github.com/superdoc-dev/superdoc/commit/5f859c75b7f5263251a900153a19a0f587a0a71e))
* **painter-dom:** prevent scroll acceleration feedback loop in virtualization ([#2291](https://github.com/superdoc-dev/superdoc/issues/2291)) ([fb3d25e](https://github.com/superdoc-dev/superdoc/commit/fb3d25e809019407b1298c28f8c10ac184e1dc73))
* **painter-dom:** use absolute page Y for page-relative anchors in header/footer decorations ([0b9bc72](https://github.com/superdoc-dev/superdoc/commit/0b9bc72899d30e5464c1e68a6c0a9a3d3071ae7c))
* performance ([#1914](https://github.com/superdoc-dev/superdoc/issues/1914)) ([0747b03](https://github.com/superdoc-dev/superdoc/commit/0747b03e81231917c7c2cb5d69f90dbaf0646932))
* persist comments on reload in collab mode ([#1949](https://github.com/superdoc-dev/superdoc/issues/1949)) ([2b2e56e](https://github.com/superdoc-dev/superdoc/commit/2b2e56ea85acd8f70e300ad89e0a536a4f974bf7))
* pict import/export  ([#2135](https://github.com/superdoc-dev/superdoc/issues/2135)) ([7e97b7b](https://github.com/superdoc-dev/superdoc/commit/7e97b7b986d73a78bc4e646db6854188ee114cac))
* **placeholder:** guard against depth-0 selection in placeholder decoration ([#2025](https://github.com/superdoc-dev/superdoc/issues/2025)) ([e5ee7cf](https://github.com/superdoc-dev/superdoc/commit/e5ee7cfaff2670d1088e0392ebd95078acdd63d0))
* portrait orientation in document-api ([dafab76](https://github.com/superdoc-dev/superdoc/commit/dafab76af5f249c49936a0250e4e54ae4719b305))
* prefer full decoration range ([#2239](https://github.com/superdoc-dev/superdoc/issues/2239)) ([ac15e31](https://github.com/superdoc-dev/superdoc/commit/ac15e31a26e04511b6d62b7f5736437ed7e2da5d)), closes [#collectDesiredState](https://github.com/superdoc-dev/superdoc/issues/collectDesiredState) [#resolveEffectiveRanges](https://github.com/superdoc-dev/superdoc/issues/resolveEffectiveRanges) [#setPreviousRanges](https://github.com/superdoc-dev/superdoc/issues/setPreviousRanges)
* preserve line spacing and indentation on Google Docs paste ([#2183](https://github.com/superdoc-dev/superdoc/issues/2183)) ([b9a7357](https://github.com/superdoc-dev/superdoc/commit/b9a7357afa561a68132a6b446d10d331025e6124)), closes [#2151](https://github.com/superdoc-dev/superdoc/issues/2151)
* preserve selection highlight when opening toolbar dropdowns ([#2097](https://github.com/superdoc-dev/superdoc/issues/2097)) ([a33568e](https://github.com/superdoc-dev/superdoc/commit/a33568ec43739178ddda4239aeae34d117fe5cca))
* preserve text selection highlight on right-click ([#1994](https://github.com/superdoc-dev/superdoc/issues/1994)) ([db5466a](https://github.com/superdoc-dev/superdoc/commit/db5466a6bf4efce8f1057552182702dd6a4a57d1))
* preserve text-align on paste from Google Docs ([#2208](https://github.com/superdoc-dev/superdoc/issues/2208)) ([762231b](https://github.com/superdoc-dev/superdoc/commit/762231b75ad1537f7b10137597cbe3f6ad1aa381))
* **rendering:** show comment highlight on text with Word highlight formatting ([f6d956e](https://github.com/superdoc-dev/superdoc/commit/f6d956ec38f12ff0ee3440f153edf1fa69406f2d))
* replace Node.js Buffer APIs with browser-native alternatives ([#2028](https://github.com/superdoc-dev/superdoc/issues/2028)) ([b17774a](https://github.com/superdoc-dev/superdoc/commit/b17774a566750c4cca084415f9b2c2b4c4386668)), closes [#exportProcessMediaFiles](https://github.com/superdoc-dev/superdoc/issues/exportProcessMediaFiles)
* replace Node.js Buffer APIs with browser-native alternatives ([#2028](https://github.com/superdoc-dev/superdoc/issues/2028)) ([d6141ec](https://github.com/superdoc-dev/superdoc/commit/d6141ec2a20192aa6294a8174e740f226d8f0269)), closes [#exportProcessMediaFiles](https://github.com/superdoc-dev/superdoc/issues/exportProcessMediaFiles)
* resolve published type declarations for Angular/TS consumers and update example ([#2026](https://github.com/superdoc-dev/superdoc/issues/2026)) ([35344bd](https://github.com/superdoc-dev/superdoc/commit/35344bdb0b0017676843e7ce1b269563728ab555))
* resolve sdk/adapter composability issues ([b60b17e](https://github.com/superdoc-dev/superdoc/commit/b60b17e50b0ea46474a92afd06438222a3537d42))
* return null instead of blank num definition when not found ([#1990](https://github.com/superdoc-dev/superdoc/issues/1990)) ([3acac3b](https://github.com/superdoc-dev/superdoc/commit/3acac3b0e071ca940b27434c1e54c9d89d35d028))
* rollback comments colors / ui ([#2216](https://github.com/superdoc-dev/superdoc/issues/2216)) ([a99b5ab](https://github.com/superdoc-dev/superdoc/commit/a99b5ab89dc083a53ca2f223ec0fc280d749ada2))
* **scroll:** wait for virtualized page mount and center text element ([#2221](https://github.com/superdoc-dev/superdoc/issues/2221)) ([95f634e](https://github.com/superdoc-dev/superdoc/commit/95f634e6185806fc8da29a40945576b3de89a23b))
* **sdk:** checkpoint collab sessions even when not dirty ([689f6b5](https://github.com/superdoc-dev/superdoc/commit/689f6b5449e6be87984584f63411de3c6743578b))
* **sdk:** keep sdk sessions alive in non collab ([#2289](https://github.com/superdoc-dev/superdoc/issues/2289)) ([c634ee8](https://github.com/superdoc-dev/superdoc/commit/c634ee87bb6ac29b14b0f02d6080b2420cfe3dc6))
* **shapes:** render grouped DrawingML shapes with custom geometry (SD-1877) ❇️ ([#2105](https://github.com/superdoc-dev/superdoc/issues/2105)) ([14985a5](https://github.com/superdoc-dev/superdoc/commit/14985a5b17ab13a04760362346caa5d41f54202d))
* slash menu invisible in presentation mode ([#2018](https://github.com/superdoc-dev/superdoc/issues/2018)) ([513bc33](https://github.com/superdoc-dev/superdoc/commit/513bc33f56368effc09e9d314ec49e187858015d)), closes [#computeCaretLayoutRect](https://github.com/superdoc-dev/superdoc/issues/computeCaretLayoutRect)
* splitting run with header adds empty row ([#2229](https://github.com/superdoc-dev/superdoc/issues/2229)) ([e1965fc](https://github.com/superdoc-dev/superdoc/commit/e1965fc0ccddd1b3f1886fd1911bd8665de5c8c5))
* structured content renders correct on hover and select ([#1843](https://github.com/superdoc-dev/superdoc/issues/1843)) ([dab3f04](https://github.com/superdoc-dev/superdoc/commit/dab3f048a83934eef993e1cc868cc81bb4b625ea))
* **super-converter:** add tableHeader export handler to fix corrupted docx ([#1900](https://github.com/superdoc-dev/superdoc/issues/1900)) ([010799b](https://github.com/superdoc-dev/superdoc/commit/010799b87ee133134a61272e47cc1d77fe08d937))
* **super-converter:** handle empty pic:spPr in image import ([#2254](https://github.com/superdoc-dev/superdoc/issues/2254)) ([2b8dbce](https://github.com/superdoc-dev/superdoc/commit/2b8dbcec56d40e7ffeb97572afe5ca888cb1da2e))
* **super-converter:** resolve table style conditional shading on cell import (SD-1833) ([#1985](https://github.com/superdoc-dev/superdoc/issues/1985)) ([5e206f4](https://github.com/superdoc-dev/superdoc/commit/5e206f45ea7139bf9193912726b21af03d70c86e))
* **super-editor:** add unsupported-content reporting across HTML/Markdown import paths ([#2115](https://github.com/superdoc-dev/superdoc/issues/2115)) ([84880b7](https://github.com/superdoc-dev/superdoc/commit/84880b781cb389c6cef27f4299645f6e6c07958a))
* **super-editor:** align image resize handles with actual image position ([#2293](https://github.com/superdoc-dev/superdoc/issues/2293)) ([217bdce](https://github.com/superdoc-dev/superdoc/commit/217bdcef86d736825b0bfe55880ac57620d1b4d3))
* **super-editor:** allow Backspace to delete empty paragraphs in suggesting mode ([#1966](https://github.com/superdoc-dev/superdoc/issues/1966)) ([820c73c](https://github.com/superdoc-dev/superdoc/commit/820c73c297ff97156316470cc53a4e28f5daaf3c))
* **super-editor:** backspace across run boundaries without splitting list items ([#2258](https://github.com/superdoc-dev/superdoc/issues/2258)) ([27ccb64](https://github.com/superdoc-dev/superdoc/commit/27ccb64d06b70e98070462bdd51072dfd7aeae3f))
* **super-editor:** handle partial comment file-sets and clean up stale parts on export ([#2123](https://github.com/superdoc-dev/superdoc/issues/2123)) ([f63ae0a](https://github.com/superdoc-dev/superdoc/commit/f63ae0aae0daaedfd3faba77e43023c4f7245e7f))
* **super-editor:** prevent invalid paragraph updates for nested runs in headless import ([8c11718](https://github.com/superdoc-dev/superdoc/commit/8c117188219b554fe5c55fd376172804b623015e))
* **super-editor:** prevent invalid paragraph updates for nested runs in headless import ([c5ee6e3](https://github.com/superdoc-dev/superdoc/commit/c5ee6e3a606e8f8e8284ffc5c38833af9ecaf29d))
* **super-editor:** restore <hr> contentBlock parsing and harden VML HR export fallback ([#2118](https://github.com/superdoc-dev/superdoc/issues/2118)) ([da51b1f](https://github.com/superdoc-dev/superdoc/commit/da51b1f6bd0aa6dca44f6431e16f03b1e8d7cc54))
* **super-editor:** restore marks correctly after clear format + undo (SD-1771) ([#1967](https://github.com/superdoc-dev/superdoc/issues/1967)) ([bc9dc76](https://github.com/superdoc-dev/superdoc/commit/bc9dc76c5cf93143ed26353ffc2b84a018f71a2e))
* **superdoc:** enhance comment input focus handling and edit init ([#1935](https://github.com/superdoc-dev/superdoc/issues/1935)) ([0e9112c](https://github.com/superdoc-dev/superdoc/commit/0e9112c44ce6a89672c2a52d09fbd96d4a1f6bd2))
* **superdoc:** update comment text ([b5ff644](https://github.com/superdoc-dev/superdoc/commit/b5ff64496cb962ffde32c15a3d249a6540a804d0))
* **superdoc:** update entry point comment ([#1926](https://github.com/superdoc-dev/superdoc/issues/1926)) ([0dde298](https://github.com/superdoc-dev/superdoc/commit/0dde29868dde357bebf0c7c0363355ea855fa39a))
* support cell spacing ([#1879](https://github.com/superdoc-dev/superdoc/issues/1879)) ([1639967](https://github.com/superdoc-dev/superdoc/commit/16399678e9e09dee4293976a86e39664d9ef79d9))
* table headers are incorrectly imported from html ([#2112](https://github.com/superdoc-dev/superdoc/issues/2112)) ([e8d1480](https://github.com/superdoc-dev/superdoc/commit/e8d1480bac4ba9dd0908ef7298b8ac15d584d2d1))
* table resizing regression ([#2091](https://github.com/superdoc-dev/superdoc/issues/2091)) ([20ed24e](https://github.com/superdoc-dev/superdoc/commit/20ed24ed2a6d080b5c90511f63f6fde66b358e83))
* table resizing regression ([#2091](https://github.com/superdoc-dev/superdoc/issues/2091)) ([9a07f1c](https://github.com/superdoc-dev/superdoc/commit/9a07f1ceadec4d7669a8b43c5bafd010edc2ec17))
* **table:** resolve column resize only working on first page (SD-1772) ([#1959](https://github.com/superdoc-dev/superdoc/issues/1959)) ([df43867](https://github.com/superdoc-dev/superdoc/commit/df43867b3119ee605225794becf66dc2bd327342))
* **tables:** align tableHeader attrs with tableCell to fix oversized DOCX export widths ([#2114](https://github.com/superdoc-dev/superdoc/issues/2114)) ([38f0430](https://github.com/superdoc-dev/superdoc/commit/38f04306591e86dad09fb4cdb979f38e7fec4eda))
* **tables:** defaultTableStyle support, cell fixes ([#2246](https://github.com/superdoc-dev/superdoc/issues/2246)) ([74fca9c](https://github.com/superdoc-dev/superdoc/commit/74fca9cd6e6e81c3a270b8f95e8bb66fed88c904))
* **tables:** expand auto-width tables to fill available page width ([#2109](https://github.com/superdoc-dev/superdoc/issues/2109)) ([15f36bc](https://github.com/superdoc-dev/superdoc/commit/15f36bc9256db1e5a4ac41bd70a2699a751de4de))
* **tables:** fix autofit column scaling, cell width overflow, and page break splitting ([#1987](https://github.com/superdoc-dev/superdoc/issues/1987)) ([61a3f6f](https://github.com/superdoc-dev/superdoc/commit/61a3f6f13ee71d6d10c0fe74fb62a044cbe98c97))
* **tables:** preserve TableGrid defaults and style-driven spacing/bor… ([#2230](https://github.com/superdoc-dev/superdoc/issues/2230)) ([b0a482f](https://github.com/superdoc-dev/superdoc/commit/b0a482fec95135ff46ea7cd40a2bf1e767a4f231))
* **tables:** prevent tblInd double-shrink when using tblGrid widths (SD-1494) ([8750ece](https://github.com/superdoc-dev/superdoc/commit/8750ece019a439a350e93f6595d5833735c1ca35))
* **test:** stabilize flaky cleanUpParagraphWithAnnotations tests ([#2262](https://github.com/superdoc-dev/superdoc/issues/2262)) ([7bafb7f](https://github.com/superdoc-dev/superdoc/commit/7bafb7f9e0fcc0109a0a976d1a01e9ee408f7291))
* text highlight on export ([#2189](https://github.com/superdoc-dev/superdoc/issues/2189)) ([9cbd022](https://github.com/superdoc-dev/superdoc/commit/9cbd022de69ec30dc72895e4da6fcd064d09fb69))
* **toc:** correct zoom scaling and rect.top bug in anchor scroll ([16c768f](https://github.com/superdoc-dev/superdoc/commit/16c768f1b81672c5126833cc1ffbe948a2c11ebd))
* track changes comment text for formatting changes ([#2013](https://github.com/superdoc-dev/superdoc/issues/2013)) ([b2a43ff](https://github.com/superdoc-dev/superdoc/commit/b2a43ffad086df316a4a6b4d5695fd00507f9f78))
* track changes in cli ([3742f68](https://github.com/superdoc-dev/superdoc/commit/3742f6874ebf93d7ef9971232b203b19bed07344))
* track highlight changes ([#2192](https://github.com/superdoc-dev/superdoc/issues/2192)) ([e164625](https://github.com/superdoc-dev/superdoc/commit/e164625489d925a595d48fcb45dd0e04f004fcf6))
* **track-changes:** correct format change description for already-formatted text (SD-2077) ([#2253](https://github.com/superdoc-dev/superdoc/issues/2253)) ([b2ffc0d](https://github.com/superdoc-dev/superdoc/commit/b2ffc0dffefaacdf339c13d9da7aa6b646ceb80b))
* **track-changes:** handle ReplaceAroundStep in tracked changes mode (SD-2061) ([#2225](https://github.com/superdoc-dev/superdoc/issues/2225)) ([8f3cbe4](https://github.com/superdoc-dev/superdoc/commit/8f3cbe46f49cf0e46720e74273aef0de23cb69e3))
* **track-changes:** remove ghost TrackFormat on multi-node format cancel ([#2233](https://github.com/superdoc-dev/superdoc/issues/2233)) ([e925ef9](https://github.com/superdoc-dev/superdoc/commit/e925ef948a81d87090e1f38f0077d354995de02c))
* **tracked-changes:** colors should be restored when format rejected ([#1970](https://github.com/superdoc-dev/superdoc/issues/1970)) ([01ea504](https://github.com/superdoc-dev/superdoc/commit/01ea504737e38815c8ed7e5e585308ca5600e169))
* **tracked-changes:** fix suggested insertions from paste failures ([#1969](https://github.com/superdoc-dev/superdoc/issues/1969)) ([e74c14a](https://github.com/superdoc-dev/superdoc/commit/e74c14a76c9bbad994d9bde3699e0d8c911c061a))
* trigger patch release ([7bc1b74](https://github.com/superdoc-dev/superdoc/commit/7bc1b747b8f265e2b7d70118e425d442736a0f92))
* trigger patch release ([32ced9c](https://github.com/superdoc-dev/superdoc/commit/32ced9c4822cdaf51fafa4b7c54993ea8ea89f9d))
* trigger patch release ([da7f484](https://github.com/superdoc-dev/superdoc/commit/da7f484027c90cad9d3c5fd1c3ef61d0e39c3996))
* trigger release ([8367dd6](https://github.com/superdoc-dev/superdoc/commit/8367dd6760dc2d0bf61c1b445c3daceb0b522c63))
* undo/redo actions ([#2161](https://github.com/superdoc-dev/superdoc/issues/2161)) ([495e92f](https://github.com/superdoc-dev/superdoc/commit/495e92f3599ed01f77538c1155eb4890638ac85f))
* use correct template syntax for GitHub release URL in PR comments ([9d1bca2](https://github.com/superdoc-dev/superdoc/commit/9d1bca2cd9aa0d99e42b836ad093b07c6b5a513f))
* use DEFLATE compression for docx export instead of STORE ([#1933](https://github.com/superdoc-dev/superdoc/issues/1933)) ([ebcd986](https://github.com/superdoc-dev/superdoc/commit/ebcd98644ff7859cf297da79c549257e6c241523))
* **virtualization:** compute scrollY relative to scroll container, not viewport ([#2263](https://github.com/superdoc-dev/superdoc/issues/2263)) ([370ca5e](https://github.com/superdoc-dev/superdoc/commit/370ca5ea025bd5fb57f1dfe9b79871afbcdfd9b5))
* **virtualization:** correct scroll mapping and viewport sizing at non-100% zoom ([#2171](https://github.com/superdoc-dev/superdoc/issues/2171)) ([84af4c0](https://github.com/superdoc-dev/superdoc/commit/84af4c0814b6bdd89248a2d68154f2efc90ad80c)), closes [#registryKey](https://github.com/superdoc-dev/superdoc/issues/registryKey)
* wire DocumentApi to Editor.doc with lifecycle-safe caching ([57326ea](https://github.com/superdoc-dev/superdoc/commit/57326eaf417309051132c6f39c6b819c23193af5))
* zIndex updates ([#1973](https://github.com/superdoc-dev/superdoc/issues/1973)) ([3ca7aa3](https://github.com/superdoc-dev/superdoc/commit/3ca7aa390abf12838a88ca36d96bd5667ed83225))

### Features

* adaptive insert table column width ([#1533](https://github.com/superdoc-dev/superdoc/issues/1533)) ([d4cae2d](https://github.com/superdoc-dev/superdoc/commit/d4cae2dd0f954be52f754df6203ac72c6452e1e3))
* add pdf infra, migrate layers ([#2078](https://github.com/superdoc-dev/superdoc/issues/2078)) ([7d416e9](https://github.com/superdoc-dev/superdoc/commit/7d416e9b8d8bce2fbd914684a4d3e0f10ab5eff1))
* add public scroll to page method ([#1791](https://github.com/superdoc-dev/superdoc/issues/1791)) ([1b7687b](https://github.com/superdoc-dev/superdoc/commit/1b7687be295a6d658cf49b17cb1900dae6c2b914))
* allow custom accept/reject handlers for TC bubbles ([#1921](https://github.com/superdoc-dev/superdoc/issues/1921)) ([e30abf6](https://github.com/superdoc-dev/superdoc/commit/e30abf68b7d270b4051200b949756ecbf2771e9d))
* **comments:** improve floating comments ui ([#2195](https://github.com/superdoc-dev/superdoc/issues/2195)) ([e870cfb](https://github.com/superdoc-dev/superdoc/commit/e870cfb26e83b514cc344489a17b3ab32f6e6688))
* cropped images ([#1940](https://github.com/superdoc-dev/superdoc/issues/1940)) ([3767a49](https://github.com/superdoc-dev/superdoc/commit/3767a49f950425e20f756fcd82052d8f4855f660))
* **document-api:** add format operations font size alignment color font family ([#2179](https://github.com/superdoc-dev/superdoc/issues/2179)) ([f19c688](https://github.com/superdoc-dev/superdoc/commit/f19c688604fc2bc89daff3541c973f939dba32ee))
* **document-api:** add get markdown to sdks ([e42b56d](https://github.com/superdoc-dev/superdoc/commit/e42b56d96a08113b8576dd805e78288935d1703d))
* **document-api:** add getHtml operation, fix HTML insert and SDK tool selection ([#2264](https://github.com/superdoc-dev/superdoc/issues/2264)) ([c554678](https://github.com/superdoc-dev/superdoc/commit/c554678b425c7b97670aff5d7389bbbdfe8a5c04))
* **document-api:** add plan-based mutation engine with query.match and style capture ([#2160](https://github.com/superdoc-dev/superdoc/issues/2160)) ([365293a](https://github.com/superdoc-dev/superdoc/commit/365293a9d961bf05f550d37eb25085a03e71755c))
* **document-api:** clear content command ([#2300](https://github.com/superdoc-dev/superdoc/issues/2300)) ([46b5261](https://github.com/superdoc-dev/superdoc/commit/46b5261f34b6793d41ab6452fb117e0f81b7437a))
* **document-api:** default table style setting ([#2248](https://github.com/superdoc-dev/superdoc/issues/2248)) ([3ad4e9f](https://github.com/superdoc-dev/superdoc/commit/3ad4e9f5c8c90b188a4eac6805285b015e673278))
* **document-api:** default target-less insert to document end ([#2244](https://github.com/superdoc-dev/superdoc/issues/2244)) ([c717e2b](https://github.com/superdoc-dev/superdoc/commit/c717e2bfa7af567ce3a79aa72f358f4e61b530ba))
* **document-api:** doc default initial styles ([#2184](https://github.com/superdoc-dev/superdoc/issues/2184)) ([f25e41f](https://github.com/superdoc-dev/superdoc/commit/f25e41f45ab75da41ab6bee74328c66632371e4a))
* **document-api:** format.paragraph for w:pPr formatting ([#2218](https://github.com/superdoc-dev/superdoc/issues/2218)) ([32c9991](https://github.com/superdoc-dev/superdoc/commit/32c999116ecbd081c65637507618062f3dfb1a07))
* **document-api:** history name space ([#2219](https://github.com/superdoc-dev/superdoc/issues/2219)) ([41dea37](https://github.com/superdoc-dev/superdoc/commit/41dea37a7dc85a14341cdd58513c9b1729f62882))
* **document-api:** hyperlinks commands ([#2294](https://github.com/superdoc-dev/superdoc/issues/2294)) ([4d3bebd](https://github.com/superdoc-dev/superdoc/commit/4d3bebd6c89dd1cbd5c143e61c71beca45daba1b))
* **document-api:** include anchored text in comments list response ([#2177](https://github.com/superdoc-dev/superdoc/issues/2177)) ([b3a2912](https://github.com/superdoc-dev/superdoc/commit/b3a29125bc0dd7ebd4b9724ecf9117601b22c5c1))
* **document-api:** initial image commands ([#2290](https://github.com/superdoc-dev/superdoc/issues/2290)) ([d624231](https://github.com/superdoc-dev/superdoc/commit/d624231a97872af746d93de70129ac734cd363b8))
* **document-api:** inline formatting parity core end-to-end ([#2197](https://github.com/superdoc-dev/superdoc/issues/2197)) ([b405b03](https://github.com/superdoc-dev/superdoc/commit/b405b03c79cafe184bd5db10c9a66a04f118576b))
* **document-api:** inline formatting rpr parity ([#2198](https://github.com/superdoc-dev/superdoc/issues/2198)) ([41ab771](https://github.com/superdoc-dev/superdoc/commit/41ab77144f257cef33e97924dfeda000ae843a71))
* **document-api:** insert table adds extra separator to match ms word ([#2301](https://github.com/superdoc-dev/superdoc/issues/2301)) ([5e49613](https://github.com/superdoc-dev/superdoc/commit/5e496130249a8fc5403f201c667106c5da4961fb))
* **document-api:** lists namespace  ([#2223](https://github.com/superdoc-dev/superdoc/issues/2223)) ([09ebfcb](https://github.com/superdoc-dev/superdoc/commit/09ebfcb65dda25fd46ad58320d9d6fb04b2e6f8b))
* **document-api:** make styles.apply registry-driven with schema/validation ([#2267](https://github.com/superdoc-dev/superdoc/issues/2267)) ([cab54ba](https://github.com/superdoc-dev/superdoc/commit/cab54badc20e7002ce82be6f4e02f84e71802717))
* **document-api:** more image commands ([#2295](https://github.com/superdoc-dev/superdoc/issues/2295)) ([4fbbbc9](https://github.com/superdoc-dev/superdoc/commit/4fbbbc987e2469b8fd70c1a07a79dacc801f6733))
* **document-api:** more lists commands ([#2288](https://github.com/superdoc-dev/superdoc/issues/2288)) ([eb48bf1](https://github.com/superdoc-dev/superdoc/commit/eb48bf1cf72da0c780998cf033e851aadc144206))
* **document-api:** section commands ([#2199](https://github.com/superdoc-dev/superdoc/issues/2199)) ([ec4abe3](https://github.com/superdoc-dev/superdoc/commit/ec4abe3993dfb30f4c850dc76cfd55b4237cca77))
* **document-api:** support deleting entire block nodes not only text ([#2181](https://github.com/superdoc-dev/superdoc/issues/2181)) ([2897246](https://github.com/superdoc-dev/superdoc/commit/28972465167ad67824758abb163b5bffef2b7c1c))
* **document-api:** table of contents commands ([#2200](https://github.com/superdoc-dev/superdoc/issues/2200)) ([baa72c4](https://github.com/superdoc-dev/superdoc/commit/baa72c47f89a280df9e400d6af2c63998345c79d))
* **document-api:** tables namespace and commands ([#2182](https://github.com/superdoc-dev/superdoc/issues/2182)) ([b80ee31](https://github.com/superdoc-dev/superdoc/commit/b80ee31230134419a6a0eabadedffe6c4a21e6bd))
* **document-api:** toc commands ([#2220](https://github.com/superdoc-dev/superdoc/issues/2220)) ([767e010](https://github.com/superdoc-dev/superdoc/commit/767e010c8344255e457866f7212e95457f36ad1d))
* enabled telemetry by default and added documentation ([#2001](https://github.com/superdoc-dev/superdoc/issues/2001)) ([8598ef7](https://github.com/superdoc-dev/superdoc/commit/8598ef7d200e666911c68c6c116996ef47fa9261))
* enhance telemetry handling for sub-editors ([#2017](https://github.com/superdoc-dev/superdoc/issues/2017)) ([37bc030](https://github.com/superdoc-dev/superdoc/commit/37bc030bb30a999cb73de0b1a8cd96cc588780dd))
* expose setZoom and getZoom API on SuperDoc ([#2137](https://github.com/superdoc-dev/superdoc/issues/2137)) ([ab09dd5](https://github.com/superdoc-dev/superdoc/commit/ab09dd5dee38081054a3215650d5fc8e6994f128)), closes [#928](https://github.com/superdoc-dev/superdoc/issues/928)
* extend document-api with format, examples, create.heading ([#2092](https://github.com/superdoc-dev/superdoc/issues/2092)) ([fdf8c7c](https://github.com/superdoc-dev/superdoc/commit/fdf8c7cab059dde93ef60c801be8b15a0121b30c))
* **images:** allow drag-and-drop for images in editor ([#2227](https://github.com/superdoc-dev/superdoc/issues/2227)) ([4b36780](https://github.com/superdoc-dev/superdoc/commit/4b367804c35e843f9bf28cce24c4f0b47dfa9e9c))
* layout snapshot testing ([#2035](https://github.com/superdoc-dev/superdoc/issues/2035)) ([b070cd7](https://github.com/superdoc-dev/superdoc/commit/b070cd79d376c528fdc4efdb3371c55a1a3cf908))
* **layout-engine:** render table headers, tblLook support ([#2256](https://github.com/superdoc-dev/superdoc/issues/2256)) ([db6a2ff](https://github.com/superdoc-dev/superdoc/commit/db6a2ffbcb445b2d64e72c2210584e1ac2506bd5))
* **link-popover:** custom link popovers ([#2222](https://github.com/superdoc-dev/superdoc/issues/2222)) ([070190f](https://github.com/superdoc-dev/superdoc/commit/070190fd786d3237a18e057058bf40743645c616))
* **links:** convert pasted hyperlinks into real docx links ([#2270](https://github.com/superdoc-dev/superdoc/issues/2270)) ([7d75522](https://github.com/superdoc-dev/superdoc/commit/7d7552203f0bbc6779149656e447432d50eb2697))
* **lists:** support hidden list indicators via w:vanish ([#2069](https://github.com/superdoc-dev/superdoc/issues/2069)) ([#2080](https://github.com/superdoc-dev/superdoc/issues/2080)) ([0bed0fd](https://github.com/superdoc-dev/superdoc/commit/0bed0fd6e9c40d9b8fbba7ef22d02258d2d363c0))
* llm tools (alpha version) ([#2292](https://github.com/superdoc-dev/superdoc/issues/2292)) ([f954e3d](https://github.com/superdoc-dev/superdoc/commit/f954e3dabead19d3c24a5d5a11a257a0ebce9c2c))
* **markdown:** add markdown override to sdk, improve conversion ([#2196](https://github.com/superdoc-dev/superdoc/issues/2196)) ([04a1c71](https://github.com/superdoc-dev/superdoc/commit/04a1c7179a30fb725bf1e5f5e818f0825b709dc3))
* **markdown:** import images from markdown ([#2303](https://github.com/superdoc-dev/superdoc/issues/2303)) ([b2f6a1a](https://github.com/superdoc-dev/superdoc/commit/b2f6a1ad5692153b60edb5b88347b5c8e37191f7))
* preserve w:view setting through DOCX round-trip ([#2190](https://github.com/superdoc-dev/superdoc/issues/2190)) ([48b4210](https://github.com/superdoc-dev/superdoc/commit/48b421071372793808c3a28578f58ac39490f59d)), closes [#2070](https://github.com/superdoc-dev/superdoc/issues/2070)
* real time collab in python sdk ([#2243](https://github.com/superdoc-dev/superdoc/issues/2243)) ([dc3b4fd](https://github.com/superdoc-dev/superdoc/commit/dc3b4fd742f5d32fa0b553f69102098455df1ec9))
* **super-editor:** add w:lock support for StructuredContent nodes (SD-1616) ([#1939](https://github.com/superdoc-dev/superdoc/issues/1939)) ([2c16f1c](https://github.com/superdoc-dev/superdoc/commit/2c16f1c906ae522e1dd9fb1604d9d7b19d941eef))
* superdoc cli ([d808464](https://github.com/superdoc-dev/superdoc/commit/d808464b7de14ab93e28af594e0ee2ea66e7c153))
* superdoc sdk ([#2129](https://github.com/superdoc-dev/superdoc/issues/2129)) ([3f55d23](https://github.com/superdoc-dev/superdoc/commit/3f55d2366b025d9468ae26f9848582446b280569))
* support TIFF images in DOCX rendering ([#2284](https://github.com/superdoc-dev/superdoc/issues/2284)) ([6436d86](https://github.com/superdoc-dev/superdoc/commit/6436d861efbdb52d592a0069fc84a1f5d830f358)), closes [#2064](https://github.com/superdoc-dev/superdoc/issues/2064)
* **tables:** allow resizing table rows ([#2226](https://github.com/superdoc-dev/superdoc/issues/2226)) ([2c6da10](https://github.com/superdoc-dev/superdoc/commit/2c6da10e4dd217a53f70d7cce741c83943ea5339))
* **tables:** improve cell color application (context), column dragging, table pasting ([#2228](https://github.com/superdoc-dev/superdoc/issues/2228)) ([066b9eb](https://github.com/superdoc-dev/superdoc/commit/066b9eb6336839038a6a425399b6f18c19a3085e))
* **table:** toggle header row sets both cell types and repeatHeader atomically ([#2245](https://github.com/superdoc-dev/superdoc/issues/2245)) ([2f5899d](https://github.com/superdoc-dev/superdoc/commit/2f5899dc16e37dfbbe6eff97015b441f515490a4))
* telemetry ([#1932](https://github.com/superdoc-dev/superdoc/issues/1932)) ([fab3ce9](https://github.com/superdoc-dev/superdoc/commit/fab3ce959dc5d3a21bfeffa5283c01f491d2b4c4))
* **template-builder:** add cspNonce support ([#1911](https://github.com/superdoc-dev/superdoc/issues/1911)) ([5b7b34e](https://github.com/superdoc-dev/superdoc/commit/5b7b34ea3971f98078e5314fc5dd1ef23550afd6))
* **template-builder:** add cspNonce support ([#1911](https://github.com/superdoc-dev/superdoc/issues/1911)) ([bcb9d28](https://github.com/superdoc-dev/superdoc/commit/bcb9d285a196c998cf45c760ba7bfa3b94c95d25))
* the document API limited alpha ([#2087](https://github.com/superdoc-dev/superdoc/issues/2087)) ([091c24c](https://github.com/superdoc-dev/superdoc/commit/091c24cc907731f26f765d03289b458136519b0c))
* **track-changes:** clear comment bubbles when bulk accept or reject TCs ([#2159](https://github.com/superdoc-dev/superdoc/issues/2159)) ([27fbe8e](https://github.com/superdoc-dev/superdoc/commit/27fbe8e754883b07bb8c37579cda13d71686890e))
* **tracked-changes:** allow partial tracked change resolution ([#2252](https://github.com/superdoc-dev/superdoc/issues/2252)) ([988598d](https://github.com/superdoc-dev/superdoc/commit/988598d7f20e263e81715a2f0195abc2ecffe75b))
* update telemetry configuration to prioritize root licenseKey ([#2016](https://github.com/superdoc-dev/superdoc/issues/2016)) ([3b4ff6b](https://github.com/superdoc-dev…
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants