Skip to content

πŸ”„ Sync stable β†’ main#3778

Open
superdoc-bot[bot] wants to merge 74 commits into
mainfrom
sync/stable-to-main-20260626-185433
Open

πŸ”„ Sync stable β†’ main#3778
superdoc-bot[bot] wants to merge 74 commits into
mainfrom
sync/stable-to-main-20260626-185433

Conversation

@superdoc-bot

@superdoc-bot superdoc-bot Bot commented Jun 26, 2026

Copy link
Copy Markdown
Contributor

Summary

Merges latest stable patches into main with a real merge commit so stable release tags remain reachable from main.

This keeps @next prerelease version calculation ahead of the latest published stable release.

Merge requirement

This PR must be merged with GitHub's merge-commit option. Squash or rebase merging will discard stable ancestry and break @next version calculation again.

Conflict handling

Merge status: clean.

Version-only release artifact conflicts are auto-resolved to keep stable's already-published versions. Non-version conflicts fail this workflow instead of committing conflict markers.


Auto-created by sync-patches workflow.

github-actions Bot and others added 30 commits June 12, 2026 13:32
Based on the commit messages, here are the release notes:

### What's New

- **Textbox editing** β€” Edit text content inside VML and DrawingML textboxes with full interaction support; clicks map to content positions.
- **Font family combobox** β€” Browse and select fonts directly from the toolbar.
- **Font size options** β€” UI API exposes font size choices for custom toolbars.
- **Comments API expansion** β€” `ui.comments.setActive()` highlights a comment without scrolling; pending-comments-update event carries `pendingSelection`.
- **Viewport scroll container** β€” `ui.viewport.getScrollContainer()` returns the editor's resolved scroll element.
- **Text range viewport geometry** β€” `ui.viewport.getRect()` now accepts Document API text addresses and targets.
- **Sidebar viewport observation** β€” `ui.viewport.observe` fires when comments rail opens or closes.
- **Zoom modes** β€” Manual and fit-width zoom with observable transitions, viewport metrics, `useSuperDocZoom` React hook, and toolbar command.
- **Table of contents hover** β€” Hovering TOC entries highlights corresponding sections.

### Improvements

- **Multi-column section balancing** β€” Continuous sections balance correctly with explicit per-column widths preserved throughout layout.
- **Column spacing precision** β€” Per-column gaps drive separator positions per ECMA-376; unequal-width columns honor per-column `w:space`.
- **Font substitutes** β€” Metric-compatible fallbacks load for Calibri, Cambria, Arial, Times New Roman, and Courier New before measurement.
- **Tracked table changes** β€” Inline cell edits consolidate into single review items instead of separate entries.

### Fixes

- Paragraphs with pageBreakBefore style no longer add blank pages when directly following explicit page breaks.
- Textbox text alignment matches Word when tables are inside textboxes.
- Table cell selection highlights appear over empty space; multiline selection interior lines render at full width.
- Plan engine recovers from stale block identities on recompile without crashes.
- Tab carets anchor to line top instead of bottom; soft-break continuation carets position alignment-aware at line start.
- DOCX export preserves generated line breaks as `<w:br/>` elements instead of raw newlines.
- Font toolbar no longer races on editor handoff; combobox selection flow handles edge cases.
- Viewport geometry invalidates on sidebar toggle without px-level jitter.
- Zoom state β€” PDF documents contribute to viewport metrics; mode-only transitions emit correctly.
- TOC anchor navigation preserves bookmark start/end order.
- Image alpha modifiers process correctly on import and export.
- Font picker keyboard behavior consistent across selection modes.
- Formatting preserved when typing text over toolbar font selections.
### What's New

- **Textbox editing** β€” Edit text content inside VML and DrawingML textboxes; clicks map to content positions with full interaction support.
- **Font family combobox** β€” Browse and select fonts directly from the toolbar.
- **Font size options** β€” UI API exposes font size choices for custom toolbars.
- **Comments API: activate-only highlight** β€” `ui.comments.setActive()` marks a comment active without scrolling.
- **Pending selection on comments event** β€” `pending-comments-update` event carries `pendingSelection` captured before the live selection clears.
- **Scroll container getter** β€” `ui.viewport.getScrollContainer()` returns the editor's resolved scroll element for overlay consumers.
- **Text range viewport geometry** β€” `ui.viewport.getRect()` accepts Document API text addresses and targets, not just entities.
- **Sidebar viewport observation** β€” `ui.viewport.observe` fires when the comments rail opens or closes.
- **Zoom modes** β€” Manual and fit-width zoom with observable mode transitions, viewport metrics, `useSuperDocZoom` React hook, and toolbar command.
- **Table of contents hover** β€” Hovering TOC entries highlights corresponding sections in the document.

### Improvements

- **Multi-column section balancing** β€” Continuous sections balance correctly with explicit per-column widths preserved throughout layout.
- **Column spacing precision** β€” Per-column gaps drive separator positions per ECMA-376; unequal-width columns honor per-column `w:space`.
- **Font substitutes** β€” Metric-compatible fallbacks load for Calibri, Cambria, Arial, Times New Roman, and Courier New before measurement; no reflow.
- **Tracked table changes** β€” Inline cell edits consolidate into single review items instead of separate entries.

### Fixes

- Paragraphs with `pageBreakBefore` style no longer add blank pages when directly following explicit page breaks.
- Textbox text alignment now matches Word when tables are inside textboxes.
- Table cell selection highlights appear over empty space; multiline selection interior lines render at full width.
- Plan engine recovers from stale block identities on recompile without crashes.
- Tab carets anchor to line top instead of bottom; soft-break continuation carets position alignment-aware at line start.
- DOCX export preserves generated line breaks as `<w:br/>` elements instead of raw newlines.
- Font toolbar no longer races on editor handoff; combobox selection flow handles edge cases.
- Viewport geometry invalidates on sidebar toggle without px-level jitter.
- Zoom state β€” PDF documents contribute to viewport metrics; mode-only transitions emit correctly.
- TOC anchor navigation preserves bookmark start/end order.
- Image alpha modifiers process correctly on import and export.
- Font picker keyboard behavior consistent across selection modes.
- Formatting preserved when typing text over toolbar font selections.
### What's New

- **Textbox editing** β€” Click, type, and select text directly inside VML and DrawingML textboxes; full caret and selection support.
- **Font family combobox** β€” Browse and select fonts from the toolbar; font selection flows through custom UI.
- **Font size API** β€” `ui.viewport` exposes available font sizes for custom toolbars and programmatic queries.
- **Comments API: activate-only highlight** β€” `ui.comments.setActive()` marks a comment active without scrolling or moving selection.
- **Pending selection on comment events** β€” `pending-comments-update` event carries `pendingSelection` captured before the live DOM selection clears.
- **Scroll container access** β€” `ui.viewport.getScrollContainer()` returns the editor's resolved scroll element for overlay consumers.
- **Text range viewport geometry** β€” `ui.viewport.getRect()` now accepts Document API text addresses and targets, not just entities.
- **Sidebar viewport observation** β€” `ui.viewport.observe` fires when the comments rail opens or closes.
- **Zoom modes** β€” Manual and fit-width zoom modes with observable transitions, viewport metrics, `useSuperDocZoom` React hook, and toolbar command.
- **Table of contents hover** β€” Hovering TOC entries highlights corresponding document sections.

### Improvements

- **Multi-column section balancing** β€” Continuous sections now balance correctly; explicit per-column widths preserved throughout layout.
- **Column spacing precision** β€” Per-column gaps drive separator positions per ECMA-376; unequal-width columns honor per-column `w:space` values.
- **Font substitutes load before measurement** β€” Metric-compatible fallbacks for Calibri, Cambria, Arial, Times New Roman, and Courier New load upfront; no reflow.
- **Tracked table changes consolidation** β€” Inline cell edits fold into a single review item instead of separate entries; one decision applies to the whole table.

### Fixes

- Paragraphs styled with `pageBreakBefore` no longer insert blank pages when directly following explicit page breaks.
- Textbox text alignment now matches Word behavior when tables are nested inside textboxes.
- Table cell selection highlights render over empty space; multiline selections show full-width interior lines.
- Plan engine recovers from stale block identities on recompile without crashes.
- Tab carets anchor to line top (not bottom); soft-break continuation carets position at line start with alignment-aware offset.
- DOCX export preserves generated line breaks as `<w:br/>` elements instead of raw newlines.
- Font toolbar no longer races on editor handoff; combobox selection handles edge cases correctly.
- Viewport geometry invalidates on sidebar toggle without pixel-level jitter.
- Zoom state β€” PDF documents contribute to viewport metrics; mode-only transitions emit correctly.
- TOC anchor navigation preserves `bookmarkStart`/`bookmarkEnd` order.
- Image alpha modifiers process correctly on import and export.
- Font picker keyboard behavior consistent across selection modes.
- Formatting is preserved when typing text over a toolbar font selection.
Now I have enough context. Let me write the release notes based on the actual changes:

### What's New

- **Textbox content editing** β€” Click, type, and edit text inside VML and DrawingML textboxes. Selection, caret rendering, and text updates work across body, header/footer, and table cell contexts.
- **Zoom modes and fit-width** β€” Set zoom as `manual` or `fit-width` (auto-fit to container). `ui.zoom` exposes mode, value, calculated fit-zoom, bounds, and viewport metrics; PDF documents measure at their rendered scale.
- **Viewport metrics and responsive layout events** β€” `viewport-change` event fires on container resize with measurements (document width, available width, fit-zoom). Consume viewport metrics from `getViewportMetrics()` to implement responsive zoom without polling.
- **Font family combobox** β€” Typeahead-enabled font picker in toolbar with per-document font options and substitution evidence (metric-safe vs. visual-only); dropdown stays in viewport.
- **Comments API expansion** β€” `ui.comments.setActive()` highlights a comment without scrolling; `pendingSelection` on pending comment events gives consumers the captured selection to pass to comment creation APIs.
- **Text range viewport targets** β€” `ui.viewport.getRect()` now accepts Document API text targets (addresses and segments), resolving to painted DOM rects for custom overlay and floating-UI anchoring.
- **Scroll container exposure** β€” `ui.viewport.getScrollContainer()` returns the actual scrollable ancestor (or null for document/window scroll), letting overlay consumers attach scroll listeners to the right element.
- **Sidebar geometry signals** β€” `ui.viewport.observe` fires when the comments rail opens/closes, invalidating cached viewport geometry.
- **TOC interactions** β€” Hover highlighting and section-link navigation for table of contents.

### Improvements

- **Column balancing at continuous breaks** β€” Multi-column sections now balance correctly at continuous section breaks, matching Word's layout. Explicit column widths (equal or unequal) and per-column spacing extract accurately.
- **Tracked change granularity** β€” Inline cell changes within a whole-table tracked change consolidate into one logical change in the review API (groupTrackedChanges), mirroring the comments containment rule.
- **Line break handling in mutations** β€” Generated newlines in text-mode mutations serialize as Word-native `<w:br/>` elements; read model treats lineBreak nodes as `\n` so search/query/rewrite stay consistent.
- **Caret geometry for tabs and soft breaks** β€” Tab carets anchor to line top; soft-break continuation carets position at line start with alignment-aware offset instead of the page right edge.
- **Page break suppression** β€” Style-driven pageBreakBefore directly after an explicit page break no longer renders a redundant blank page, matching Word's structural rule.
- **Textbox table content rendering** β€” Tables inside textboxes render with correct alignment and text flow.
- **Plan-engine block identity repair** β€” Runtime self-healing of duplicate block identities on compile, preventing stale cross-document references.
- **Font substitution evidence** β€” Font reports carry per-face evidence (metric-safe, visual-only, glyph exceptions) from the docfonts registry, giving consumers the fidelity detail behind each substitution.

### Fixes

- **Table cell selection collapse** β€” Dragging a body selection into an empty table cell no longer collapses the selection; prosemirror-tables normalization guard keeps the extended range.
- **Multiline selection rendering** β€” Interior lines of multi-line selections now render the full width highlight instead of slivers; per-line rect computation handles absolutely-positioned `.superdoc-line` elements across browsers.
- **Empty cell geometry** β€” Empty table cell paragraphs (no runs) resolve to their PM start instead of null, preventing frozen selections during active drags.
- **Image alpha export** β€” Process alphaModFix for images on export, preserving transparency properties.
- **Text selection in generated lineBreak contexts** β€” Search and offset resolution now treat lineBreak nodes as `\n`, so a match spanning text+lineBreak+text coalesces to one contiguous range.
- **Font toolbar updates** β€” Document font toolbar rebuilds and layout re-renders on fonts-changed events; dropdown state persists through editor handoff.
- **UV-deprecated legacy visual testing infrastructure** β€” Removed `/devtools/visual-testing`; layout validation now runs in the standard test suite.
### What's New

- **Textbox content editing** β€” Click to edit text inside textboxes in body, headers, footers, and table cells with full selection and caret support.
- **Zoom modes and fit-width** β€” Choose zoom mode (`manual` or `fit-width` for auto-fit) and read state, calculations, bounds, and viewport metrics from `ui.zoom`.
- **Viewport change events** β€” Listen for `viewport-change` when the container resizes to receive document width, available width, and calculated fit-zoom.
- **Font family combobox** β€” Search for fonts in the toolbar by name and see per-document options with substitution evidence.
- **Comments activation API** β€” Highlight comments without scrolling using `ui.comments.setActive()`, and access the captured selection from pending comment events.
- **Text range viewport rects** β€” Pass Document API text targets to `ui.viewport.getRect()` to get painted rects for overlay positioning.
- **Scroll container access** β€” Call `ui.viewport.getScrollContainer()` to find the element that actually scrolls, or null for window scroll.
- **Sidebar geometry updates** β€” `ui.viewport.observe` fires when the comments rail opens or closes.
- **TOC interactions** β€” Hover highlights sections in the table of contents, and click navigates to them.

### Improvements

- **Column balancing** β€” Multi-column sections balance at continuous section breaks, matching Word's behavior.
- **Grouped tracked changes** β€” Inline cell changes inside a whole-table tracked change now group as one review item.
- **Line break serialization** β€” Newlines in text mutations serialize as `<w:br/>` and round-trip without loss.
- **Tab and soft-break carets** β€” Tab carets anchor to line top, and soft-break carets position at line start with alignment awareness.
- **Page break suppression** β€” Removed blank pages when `pageBreakBefore` appears directly after an explicit page break.
- **Textbox table rendering** β€” Tables inside textboxes render with correct alignment and text flow.
- **Block identity repair** β€” Duplicate block identities fix automatically on compile.
- **Font substitution evidence** β€” Font reports carry per-face evidence (metric-safe, visual-only, glyph exceptions).

### Fixes

- **Empty table cell selection** β€” Dragging a selection into an empty cell no longer collapses.
- **Multiline selection rendering** β€” Interior lines of multi-line selections render full-width highlights.
- **Empty cell geometry** β€” Empty cell paragraphs resolve to a valid position for interaction.
- **Image alpha on export** β€” Images with transparency now preserve alpha on DOCX export.
- **Linebreak text selection** β€” Search spans and selections spanning text+linebreak+text now coalesce correctly.
- **Font toolbar updates** β€” Toolbar rebuilds when document fonts change or editor switches.
### What's New

- **Textbox content editing** β€” Click, type, and edit text inside VML and DrawingML textboxes. Selection, caret rendering, and text updates work across body, header/footer, and table cell contexts.
- **Zoom modes and fit-width** β€” Set zoom as `manual` or `fit-width` (auto-fit to container). `ui.zoom` exposes mode, value, calculated fit-zoom, bounds, and viewport metrics; PDF documents measure at their rendered scale.
- **Viewport metrics and responsive layout events** β€” `viewport-change` event fires on container resize with measurements (document width, available width, fit-zoom). Consume viewport metrics from `getViewportMetrics()` to implement responsive zoom without polling.
- **Font family combobox** β€” Typeahead-enabled font picker in toolbar with per-document font options and substitution evidence (metric-safe vs. visual-only); dropdown stays in viewport.
- **Comments API expansion** β€” `ui.comments.setActive()` highlights a comment without scrolling; `pendingSelection` on pending comment events gives consumers the captured selection to pass to comment creation APIs.
- **Text range viewport targets** β€” `ui.viewport.getRect()` now accepts Document API text targets (addresses and segments), resolving to painted DOM rects for custom overlay and floating-UI anchoring.
- **Scroll container exposure** β€” `ui.viewport.getScrollContainer()` returns the actual scrollable ancestor (or null for document/window scroll), letting overlay consumers attach scroll listeners to the right element.
- **Sidebar geometry signals** β€” `ui.viewport.observe` fires when the comments rail opens/closes, invalidating cached viewport geometry.
- **Table of contents interactions** β€” Hover highlighting and section-link navigation for table of contents.

### Improvements

- **Column balancing at continuous breaks** β€” Multi-column sections now balance correctly at continuous section breaks, matching Word's layout. Explicit column widths (equal or unequal) and per-column spacing extract accurately.
- **Tracked change granularity** β€” Inline cell changes within a whole-table tracked change consolidate into one logical change in the review API, mirroring the comments containment rule.
- **Line break handling in mutations** β€” Generated newlines in text-mode mutations serialize as Word-native `<w:br/>` elements; read model treats lineBreak nodes as `\n` so search/query/rewrite stay consistent.
- **Caret geometry for tabs and soft breaks** β€” Tab carets anchor to line top; soft-break continuation carets position at line start with alignment-aware offset instead of the page right edge.
- **Page break suppression** β€” Style-driven pageBreakBefore directly after an explicit page break no longer renders a redundant blank page, matching Word's structural rule.
- **Textbox table content rendering** β€” Tables inside textboxes render with correct alignment and text flow.
- **Plan-engine block identity repair** β€” Runtime self-healing of duplicate block identities on compile, preventing stale cross-document references.
- **Font substitution evidence** β€” Font reports carry per-face evidence (metric-safe, visual-only, glyph exceptions) from the docfonts registry, giving consumers the fidelity detail behind each substitution.

### Fixes

- **Table cell selection collapse** β€” Dragging a body selection into an empty table cell no longer collapses the selection; prosemirror-tables normalization guard keeps the extended range.
- **Multiline selection rendering** β€” Interior lines of multi-line selections now render the full width highlight instead of slivers; per-line rect computation handles absolutely-positioned `.superdoc-line` elements across browsers.
- **Empty cell geometry** β€” Empty table cell paragraphs (no runs) resolve to their ProseMirror start instead of null, preventing frozen selections during active drags.
- **Image alpha export** β€” Process alphaModFix for images on export, preserving transparency properties.
- **Text selection in generated lineBreak contexts** β€” Search and offset resolution now treat lineBreak nodes as `\n`, so a match spanning text+lineBreak+text coalesces to one contiguous range.
- **Font toolbar updates** β€” Document font toolbar rebuilds and layout re-renders on fonts-changed events; dropdown state persists through editor handoff.
Based on my analysis of the commits and changes, here are the release notes:

### Fixes

- **Page breaks** β€” Removed redundant blank pages when a paragraph with pageBreakBefore style follows an explicit page break. Word's rule is structural, not geometric; we now match that behavior exactly.
- **Table cell selection** β€” Fixed selection highlight disappearing over empty space inside table cells. Also fixed multiline selection rendering and empty cell hit detection.
- **Textbox rendering** β€” Corrected rendering and text alignment for textboxes containing tables.
- **Image alpha transparency** β€” Process `alphaModFix` attributes correctly during import and export to preserve image transparency settings.
- **Block identity repair** β€” Runtime self-healing for duplicate block identities on compile, preventing stale references from breaking document operations.

### What's New

- **Textbox editing** β€” Phase 0 and 1 of textbox content editing. Render and edit VML and DrawingML textbox content. Full support for textboxes in headers, footers, and table cells with proper position preservation through import/export.

### Improvements

- **Font system** β€” Bundle docfonts 0.15 and 0.16 with expanded census rows and legal-cleared fallback fonts for better coverage.
- **Documentation** β€” Updated examples for custom UI APIs and clarified viewport geometry behavior.
Based on my analysis of the commits, v0.17.1 contains a single fix: rolling back the default toolbar font options to a conservative baseline.

### Fixes

- **Toolbar fonts** β€” Reverted default font dropdown to the conservative baseline (Arial, Courier New, Georgia, Times New Roman). Per-document font options remain available through the font selector.
### Fixes

- **Default toolbar fonts** β€” Rolled back font dropdown to a conservative baseline (Arial, Courier New, Georgia, Times New Roman). Per-document font options remain available through the font selector.
Based on my analysis of the git diff, this patch release contains a single fix related to the toolbar font dropdown. Here are the release notes:

### Fixes

- **Toolbar fonts** β€” Rolled back font dropdown to conservative baseline (Arial, Courier New, Georgia, Times New Roman). Per-document font options remain available through the font selector.
### Fixes

- Toolbar font dropdown reverted to a conservative baseline (Arial, Courier New, Georgia, Times New Roman) while the optional font-pack selection UI is finalized. Full font resolution through documents remains unchanged.
### Fixes

- Toolbar font dropdown returns to a conservative baseline (Arial, Courier New, Georgia, Times New Roman) while the optional font-pack selection UI is finalized β€” full font resolution within documents remains unchanged.
### Fixes

- Toolbar font dropdown reverted to a conservative baseline (Arial, Courier New, Georgia, Times New Roman) while the optional font-pack selection UI is finalized. Document rendering of all fonts remains unchanged.
### What's New

- **Bundled fonts are now explicit and predictable.** The optional `@superdoc-dev/fonts` package (renamed from `@superdoc/fonts`) is now the only source for bundled font substitutes. Without it, the toolbar shows a safe baseline (Arial, Times New Roman, Courier New) and documents render with system fonts. With it configured, the full reviewed set becomes available.

- **Config-gated font availability prevents stray requests.** An unconfigured app never tries to fetch a substitute `.woff2` file it cannot serve, so there are no spurious 404s or one-time warnings. Availability is a config decision, not a runtime probe.

- **Curate bundled fonts by name with `createSuperDocFonts()`.** Use `include` to allow only specific Word families, or `exclude` to keep everything except a few. Names are validated at setup time β€” a typo fails fast instead of silently hiding fonts. Curation changes what the toolbar advertises and which families SuperDoc substitutes.

  ```js
  import { createSuperDocFonts } from '@superdoc-dev/fonts';

  new SuperDoc({
    selector: '#editor',
    document: 'contract.docx',
    fonts: createSuperDocFonts({ exclude: ['Cooper Black', 'Brush Script MT'] }),
  });
  ```

- **Document-scoped activation and curation.** Each document decides which bundled fonts it uses. A curated document never reuses a full-pack document's cached font measures, so resolution stays accurate regardless of what curation layers are in use.

### Improvements

- Updated all getting-started examples and documentation to use the new `@superdoc-dev/fonts` package and curation APIs.
- Toolbar font dropdown now correctly reflects availability based on pack configuration.
### What's New

- **Bundled fonts are now explicit and predictable.** The optional `@superdoc-dev/fonts` package (renamed from `@superdoc/fonts`) is now the only source for metric-compatible font substitutes. Without it, the toolbar shows a safe baseline (Arial, Courier New, Times New Roman) and documents render with system fonts. With it configured, the full 30-family set becomes available.

- **Config-gated font availability prevents stray requests.** An unconfigured app never tries to fetch a `.woff2` file it cannot serve β€” no spurious 404s, no one-time warnings. Availability is explicit, determined by your config, not discovered at runtime.

- **Curate bundled fonts by name with `createSuperDocFonts()`.** Use `include` to allow only specific Word families, or `exclude` to block a few. Names are validated at setup time β€” a typo fails fast with suggestions instead of silently hiding fonts. Curation changes what the toolbar advertises and which families get substituted.

  ```js
  import { createSuperDocFonts } from '@superdoc-dev/fonts';

  new SuperDoc({
    selector: '#editor',
    document: 'contract.docx',
    fonts: createSuperDocFonts({ exclude: ['Cooper Black', 'Brush Script MT'] }),
  });
  ```

- **Document-scoped activation and curation.** Each document independently decides which bundled fonts it uses. A curated document never reuses a full-pack document's cached font measures, so resolution stays accurate regardless of what layers are in use.

### Improvements

- Updated all getting-started examples and framework guides to use the new `@superdoc-dev/fonts` package.
- Toolbar font dropdown now correctly reflects availability based on your pack configuration.
- Font availability and curation signature are now document-scoped, eliminating cache collisions across different configurations.
semantic-release-bot and others added 23 commits June 23, 2026 15:24
### Changes

- Merge remote-tracking branch 'origin/main' into merge/main-into-stable-2026-06-23
- Merge pull request #126 from superdoc/artem/SD-3474

### Features

- shadow effects, group transform composition, and shape-clipped image rendering (SD-2999 and SD-3033)
### What's New

- **Shadow effects on vector shapes** β€” Outer shadows render with SVG filters (`feDropShadow` for filled shapes, filter composite chains for outline-only shapes). Shadow paint extent shared between measurer and renderer ensures correct layout.
- **Shape group transforms** β€” Groups compose with `rotation`, `flipH`, and `flipV`; nested transforms apply as container transforms so child and parent orientation compose correctly.
- **Images clipped to preset shape geometry** β€” Images masked by a preset shape (`prstGeom` on `pic:spPr`) carry a `shapeClipPath` and `objectFit` through the rendering pipeline. Stretched fills map to the right fit: `cover` for shape-masked stretches, `fill` for srcRect-clipped stretches.
- **Paragraph spacing in textbox shapes** β€” Textbox paragraph `before` and `after` spacing render per logical paragraph with an `isParagraphBoundary` flag distinguishing breaks from intra-paragraph `<w:br>` elements.

### Improvements

- **Anchoring and layout** β€” Page-relative anchors now participate in wrap and resolve against the active section. Anchored objects on section-marker paragraphs preserve the marker while registering anchors at the marker origin with Word-compatible offsets. Header/footer anchored `wrapNone` media render as page-level absolute overlays.
- **Preset geometry** β€” Arrow shapes regenerate with Word-compatible geometry. `roundRect` paths generate in target coordinate space. Large-coordinate-scale shapes preserve stroke width via `vector-effect: non-scaling-stroke`.
- **Z-index ordering** β€” Page-background (behind-doc) decorations stack by authored OOXML z-index instead of document order.
Now I have a clear picture of the changes. Let me write focused release notes.

### What's New

- **Outer shadow effects on vector shapes** β€” Render drop shadows with blur radius, distance, and direction; effect extent math shared between painters and measurers so shadows paint consistently.
- **Shape-group transforms** β€” Groups now support rotation, horizontal flip, and vertical flip; child transforms compose correctly with nested affine orientation.
- **Pictures clipped to preset shape geometry** β€” Images masked by preset shapes (`prstGeom`) now carry shape clip paths and object-fit behavior through the full pipeline.
- **Paragraph spacing in shape text** β€” Text boxes preserve `before` and `after` spacing per logical paragraph, rendered with correct boundaries.

### Fixes & Improvements

- Anchored objects on section-marker paragraphs (`sectPr`-only empty paragraphs) are now preserved β€” markers stay invisible while their anchors register at the marker origin with Word-compatible offsets.
- Page-relative anchors resolve against the active section and participate in paragraph wrap; stale pre-registered wraps are dropped.
- Header/footer anchored `wrapNone` media render as page-level absolute overlays with correct z-order stacking by authored OOXML z-index instead of document order.
- Non-page-relative overlays position from container origin; ordinary `wrapNone` media are measured and anchored media are excluded from decoration normalization.
- Arrow shape geometry regenerated with Word-compatible points.
- Stroke width preserved on large-coordinate-scale shapes via `vector-effect: non-scaling-stroke`.
- Stretched fills mapped correctly: `cover` for shape-masked stretches, `fill` for srcRect-clipped stretches, with explicit handling of negative `srcRect` values (which Word treats as canvas growth).
- Grouped picture children get correct clipping and edge-stroke paint room.
- Layout-bridge dirties inline image masks and rendered drawing changes so mask edits repaint.
…ain [SD-3502]

Cherry-pick of the editing-mode direct-edit fix to stable. A collapsed insertion strictly inside another user's tracked insertion or deletion (track changes off) now stays plain text and splits the existing suggestion, instead of being recorded as a tracked change. Includes the slice.size mark-cleanup fix plus unit and export tests.

The original commit's apps/cli/src/lib/context.ts formatting hunk was intentionally omitted: stable's version differs (it carries ACCEPTED_RUNTIME_VALUES) and is already prettier-clean, so the hunk does not apply and is unrelated to the fix.

(cherry picked from commit 71fb047)
… keep pasted review marks

The editing-mode mark cleanup used removeMark by TYPE across the whole inserted range, so pasting a SuperDoc slice that already carries trackInsert/trackDelete into the interior of another suggestion silently dropped the pasted review marks (and exported them as plain text). Strip only the specific ENCLOSING mark instances inherited from the neighbour (matched by type + attrs); marks the pasted slice carries in (a different review id) are preserved. Adds a paste-with-marks regression. Addresses review on PR #3771.
…-3502-stable

fix(super-editor): keep editing-mode typing inside tracked changes plain [SD-3502]
### Fixes

- **Track changes in editing mode** β€” When pasting content that carries its own review marks into another user's suggestion, the pasted marks are now preserved instead of being silently dropped during mark cleanup.
- **Typing inside tracked changes** β€” Text inserted strictly inside another user's tracked change (insertion or deletion) while track changes are off now stays plain and splits the existing suggestion, instead of being absorbed into it.
### Fixes

- **Tracked changes with pasted review marks** β€” When pasting content that carries review marks into another user's suggestion, the marks are now preserved instead of being silently dropped during cleanup.
- **Typing inside tracked changes** β€” Text inserted strictly inside another user's tracked change while track changes are off now stays plain and splits the existing suggestion, instead of being absorbed into it.
### Fixes

- **Pasted review marks in tracked changes** β€” When pasting content with tracked changes into another user's suggestion, the pasted marks are now preserved instead of being dropped during cleanup.
- **Typing inside tracked changes** β€” Text inserted strictly inside another user's tracked insertion or deletion while track changes are off now stays plain and splits the existing suggestion, instead of being absorbed into it.
### Fixes

- **Editing-mode direct inserts now stay plain inside tracked changes** β€” When track changes are off, typing or pasting directly inside another user's tracked insertion or deletion no longer expands the suggestion or becomes a tracked change itself. The suggestion is split around the inserted text, preserving its original id and content.

- **Pasted review marks are preserved on paste-inside-suggestion** β€” Pasting a SuperDoc slice that carries its own tracked-change metadata into another suggestion now keeps the pasted marks intact, instead of silently stripping them. Only the enclosing suggestion's inherited marks are removed from the new text.
### Fixes

- **Typing inside tracked changes now stays plain** β€” When track changes are off, collapsing your cursor inside another user's tracked insertion or deletion and typing produces plain text; the suggestion is split around the new characters instead of absorbing them.
- **Deleting inside tracked changes now stays plain** β€” Direct deletions inside another user's tracked suggestion remain untracked and don't expand the suggestion's scope.
- **Pasted tracked changes are preserved** β€” Pasting a SuperDoc slice that carries its own tracked-change metadata into another suggestion preserves the pasted marks. Only inherited marks from the enclosing suggestion are stripped.
### Fixes

- **Editing-mode direct inserts now stay plain inside tracked changes** β€” When track changes are off, typing or pasting directly inside another user's tracked insertion or deletion no longer expands the suggestion or becomes a tracked change itself. The suggestion is split around the inserted text, preserving its original id and content.

- **Pasted review marks are preserved on paste-inside-suggestion** β€” Pasting a SuperDoc slice that carries its own tracked-change metadata into another suggestion now keeps the pasted marks intact, instead of silently stripping them. Only the enclosing suggestion's inherited marks are removed from the new text.
…ing (SD-3028)

The SD-3028 round-2 change made getBorderBandWidthPx paint a thick border at
the authored width (1px floor) instead of the old 2x multiplier, but left two
painter tests and two code comments asserting the doubled behavior. CI on the
main-into-stable merge fails on those two stale assertions. Update them to match
the shared helper (and the Word probe it is based on): thick width:1 -> 1px,
width:3 -> 3px.
### Table Rendering Fidelity

- **Compound borders** β€” Double, triple, and thinThick variants now paint with measured band widths and interior gridlines matching Word's nested rectangle rendering.
- **Border conflict resolution** β€” Shared cell edges resolve by weight, style, and color per ECMA-376 spec; no doubling or dropped lines.
- **Table styles** β€” Base `tcPr` shading surfaces as the wholeTable conditional layer; firstRow/lastRow/firstColumn/lastColumn and banding resolve by grid column.
- **Percent-width tables** β€” Now honor authored grid proportions instead of content-sizing; total width and column splits match Word.
- **Merged cells** β€” vMerge-only rows retain one-line height; interior row boundaries paint continuously across both rows' extents.
- **Outset/inset borders** β€” Render as separate-borders bevel (raised frame, sunken cells) instead of heavy black.

### Fixes

- **Image rendering inside textbox** β€” Images display correctly within textbox shapes.
- **Toolbar with mixed fonts** β€” Shows blank instead of falling back to Arial when multiple fonts are selected.
- **Font picker dropdown** β€” Opens on input click.
- **CJK wrapping after numeric** β€” Breaks correctly after numeric runs in long-word line breaking.
- **Heading style conflicts** β€” Resolves localized Word styles to inherit from built-in style definitions.
- **Nested SDT rendering** β€” Structured document tags render when nested.
- **Tracked changes in editing mode** β€” Typing remains plain text, not marked as change.
- **Tracked rewrite corruption** β€” Large single tracked mutations now use coarse whole-range rewrite to prevent artifact anchors in projections.

### Improvements

- **Document diffing** β€” Enhanced algorithms for change detection.

### Breaking Changes

Removed unstable operations from Document API:
- `blocks.split` β€” Split paragraph at text offset
- `blocks.merge` β€” Merge adjacent paragraphs
- `blocks.move` β€” Move paragraph within story
- `lists.getState`, `lists.apply`, `lists.continue`, `lists.restart`, `lists.remove` β€” Older list mutation operations
- `tables.moveRow` β€” Move row within table
- `paragraphs.setMarkRunProps` β€” Mark run properties on paragraph

These operations were not production-ready. Use core insert/delete/replace operations instead.
Based on my analysis of the commits and changes in this release, here are the release notes:

### What's New

- **Document host package** β€” Headless structured document runtime for invoking operations and exporting .docx files without the visual editor; collaboration is optional.

### Improvements

- **Table rendering fidelity** β€” Compound borders (double, triple, thinThick variants) now render with measured band widths matching Word's nested rectangles; interior gridlines paint continuously.
- **Border conflict resolution** β€” Shared cell edges resolve by weight, style, and color per ECMA-376 spec; no more doubling or dropped lines.
- **Table styles** β€” Base shading from table styles now surfaces as the wholeTable conditional layer; firstRow/lastRow/firstColumn/lastColumn conditional regions resolve correctly across gridSpan and vMerge.
- **Percent-width tables** β€” Tables now honor authored grid proportions instead of content-sizing; total width and column splits match Word exactly.
- **Merged cell rendering** β€” vMerge-only rows retain one-line height; interior row boundaries paint continuously across both rows' extents without gaps.
- **Outset/inset borders** β€” Render as separate-borders bevel (raised frames and sunken cells) instead of heavy black lines.
- **Document diffing** β€” Enhanced change detection algorithms.

### Fixes

- **Image rendering inside textbox** β€” Images now display correctly within textbox shapes.
- **Toolbar with mixed fonts** β€” Shows blank instead of falling back to Arial when multiple fonts are selected.
- **Font picker dropdown** β€” Opens on input click instead of requiring double-click.
- **CJK wrapping after numeric runs** β€” Line breaking now works correctly after numeric runs in long-word scenarios.
- **Heading style conflicts** β€” Localized Word styles now resolve correctly to inherit from built-in style definitions.
- **Nested structured document tags** β€” SDTs now render when nested inside other SDTs.
- **Tracked changes in editing mode** β€” Direct typing in editing mode stays plain text instead of being marked as a change.
- **Tracked rewrite corruption** β€” Large single tracked mutations now use coarse whole-range rewrites to prevent artifact anchors in projected edits.

### Breaking Changes

Removed the following unstable Document API operations β€” use core `insert`/`delete`/`replace` operations instead:
- `blocks.split`, `blocks.merge`, `blocks.move` β€” paragraph manipulation
- `lists.getState`, `lists.apply`, `lists.continue`, `lists.restart`, `lists.remove` β€” older list mutations
- `tables.moveRow` β€” row repositioning
- `paragraphs.setMarkRunProps` β€” run property marking
Now I have enough information to write the release notes. Let me compile them based on the commits, changes, and voice guide:

### What's New

- **Document Host** β€” Headless structured document runtime for invoking operations and exporting .docx files without the visual editor.

### Fixes

- **Image rendering inside textbox** β€” Images now display correctly within textbox shapes.
- **Toolbar with mixed fonts** β€” Shows blank instead of falling back to Arial when multiple fonts are selected.
- **Font picker dropdown** β€” Opens on input click instead of requiring double-click.
- **CJK wrapping after numeric runs** β€” Line breaking now works correctly in long-word scenarios.
- **Heading style conflicts** β€” Localized Word styles now resolve correctly to inherit from built-in style definitions.
- **Nested structured document tags** β€” SDTs now render when nested inside other SDTs.
- **Tracked changes in editing mode** β€” Direct typing stays plain text instead of being marked as a change.
- **Tracked rewrite corruption** β€” Large single tracked mutations now use coarse whole-range rewrites to prevent artifact anchors in projected edits.

### Improvements

- **Table border fidelity** β€” Compound borders (double, triple, thinThick variants) now render with measured band widths matching Word; interior gridlines paint continuously.
- **Border conflict resolution** β€” Shared cell edges resolve by weight, style, and color per ECMA-376 spec.
- **Table styles** β€” Base shading from table styles surfaces as the wholeTable conditional layer; conditional regions resolve correctly across gridSpan and vMerge.
- **Percent-width tables** β€” Tables now honor authored grid proportions instead of content-sizing; total width and column splits match Word exactly.
- **Merged cell rendering** β€” vMerge-only rows retain one-line height; interior row boundaries paint continuously without gaps.
- **Outset/inset borders** β€” Render as separate-borders bevel (raised frames and sunken cells) instead of heavy black lines.
- **Document diffing** β€” Enhanced change detection algorithms.

### Breaking Changes

The following unstable Document API operations have been removed β€” use core `insert`/`delete`/`replace` operations instead:
- `blocks.split`, `blocks.merge`, `blocks.move`
- `lists.getState`, `lists.apply`, `lists.continue`, `lists.restart`, `lists.remove`
- `tables.moveRow`
- `paragraphs.setMarkRunProps`
Based on my analysis of the changes, here are the release notes:

---

### Fixes

- **Images inside textboxes** β€” Fixed inconsistent measurement of images within shape containers. Image dimensions now measure consistently across the layout engine, eliminating rendering artifacts when documents contain images in textboxes or other shape content.
### Bug Fixes

- align thick-border tests with authored-width rendering (SD-3028)
- table rendering fidelity round 2 (SD-3028: borders, styles, widths, merged, overhang)
- image rendering inside textbox
- toolbar should be blank with multiple fonts selected
- use coarse tracked rewrite for large single changes (SD-3478) (#174)

### Changes

- Merge pull request #194 from superdoc/caio-pizzol/document-host-runtime
- Merge pull request #158 from superdoc/sd-3465_nested-sdt
- Merge pull request #180 from superdoc/caio-pizzol/editing-mode-direct-edits
- Merge pull request #128 from superdoc/sd-3453_font-picker-dropdown
- Merge pull request #159 from superdoc/colep/sd-3483-collab-mergefield-integration-coverage-for-sd-3363-one-field
- Merge pull request #89 from superdoc/artem/SD-3318
- Merge pull request #148 from superdoc/colep/sd-3403-bug-localized-word-heading-styles-render-with-incorrect-font
- Merge pull request #162 from superdoc/artem/doc-diffing-v5
- Merge pull request #160 from superdoc/luccas/sd-3478-bug-atomic-tracked-textrewrite-batch-corrupts-later-rewrite
- πŸ”„ Sync stable β†’ main

### Chores

- merge stable into main
- reversions
### Bug Fixes

- **Table rendering (SD-3028)** β€” Compound borders render as nested rectangles; border conflicts resolve per ECMA-376 rules; percent-width tables honor grid proportions; vMerge-only rows maintain line height; interior row boundaries render as continuous lines; insertTable emits Word-style cell widths.
- **Images in textboxes** β€” Images render correctly when placed inside textboxes.
- **Toolbar with multiple fonts** β€” Shows blank instead of falling back to Arial when multiple fonts selected; user-applied fonts persist when text is highlighted again.
- **Tracked rewrites (SD-3478)** β€” Large single tracked mutations use coarse rewrite path to prevent preserved anchors in projections; batch rewrites no longer corrupt subsequent rewrites.
- **Nested structured document tags** β€” Nested SDT elements render correctly.
- **Editing mode with tracked changes (SD-3502)** β€” Text entered in editing mode stays plain within tracked changes.
- **Font dropdown** β€” Opens when input is clicked.
- **CJK text wrapping (SD-3318)** β€” CJK text wraps correctly after numeric runs in long-word line breaking.
- **Heading styles (SD-3403)** β€” Localized heading styles render with correct font by inheriting Word's built-in styles.

### Improvements

- **Document diffing** β€” Upgraded diffing engine.

### New

- **Headless document runtime** β€” Enables programmatic document control without visual interface.
Based on my analysis of the commits and code changes in this patch release, here are the release notes:

## What's New

- **Document host** β€” headless runtime for structured document sessions; call `openDocument()`, `invoke()`, `export()` without CLI overhead.

## Rendering Fixes

- **Table borders** β€” compound borders (double, triple, thin/thick variants) render as nested rectangles with measured band widths; shared edges resolve conflicts by weight, style, and color.
- **Table styling** β€” base conditional shading from table styles now applies across the whole table; firstRow/lastRow/firstColumn/lastColumn resolve correctly across gridSpan and vMerge.
- **Table widths** β€” auto and percent-width tables now content-size exactly like Word; column proportions and total width match the authored grid.
- **Merged cells** β€” vMerge-only rows hold one-line height instead of collapsing; interior row boundaries paint as one continuous line across both rows.
- **Image rendering** β€” images render correctly when placed inside textboxes.
- **Nested SDT** β€” structured content tags now render when nested.
- **Heading styles** β€” localized Word heading styles resolve correctly to inherit built-in style attributes.

## Toolbar & Editor Fixes

- **Font selection** β€” toolbar shows blank when multiple fonts are selected; font changes persist when text is highlighted again.
- **Font picker** β€” dropdown opens when clicking the input field.
- **CJK line breaking** β€” wrapping works correctly after numeric runs in long-word line breaking.
- **Tracking in edit mode** β€” typing stays plain within tracked changes during editing mode.

## Plan Engine Improvements

- **Large tracked rewrites** β€” mutations exceeding a granular threshold now take the coarse path, replacing the full range with replacement text and preventing anchor visibility in accepted projections.
- **Batch rewrite optimization** β€” tracked batch rewrites short-circuit for cleaner execution.

## Document Diffing Upgrades

- **Algorithm enhancements** β€” generic diffing, inline diffing, paragraph diffing, and semantic normalization all improved with comprehensive test coverage across real Word documents.
- **Replay fidelity** β€” diff replay now correctly handles complex document structures.
@superdoc-bot superdoc-bot Bot requested a review from a team as a code owner June 26, 2026 18:54

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

Copy link
Copy Markdown

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: 570c727b23

ℹ️ 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".

Comment thread apps/cli/package.json
{
"name": "@superdoc-dev/cli",
"version": "0.20.1",
"version": "0.20.2",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Preserve stable release ancestry

This sync replayed the stable changes as a single-parent commit (git cat-file -p 8dba4aec shows only parent 2b50f53b), so the stable release commits/tags that produced these version bumps are still not ancestors of the result. Since the stated purpose is to make stable tags reachable for @next prerelease calculation, merging this squashed/cherry-picked version line leaves that release calculation broken; please replace it with a real merge of the stable branch history.

Useful? React with πŸ‘Β / πŸ‘Ž.

@codecov-commenter

Copy link
Copy Markdown

Codecov Report

βœ… All modified and coverable lines are covered by tests.

πŸ“’ Thoughts on this report? Let us know!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

patch-sync Patch sync from release branch review: careful

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants