From 7f76d11ec15c53133d5e60c6696fd8fb974a0740 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 12 Jun 2026 16:20:50 +0000 Subject: [PATCH 01/59] chore(cli): 0.17.0 [skip ci] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 `` 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. --- apps/cli/package.json | 2 +- apps/cli/platforms/cli-darwin-arm64/package.json | 2 +- apps/cli/platforms/cli-darwin-x64/package.json | 2 +- apps/cli/platforms/cli-linux-arm64/package.json | 2 +- apps/cli/platforms/cli-linux-x64/package.json | 2 +- apps/cli/platforms/cli-windows-x64/package.json | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/cli/package.json b/apps/cli/package.json index fa5b6c5847..995be5f378 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/cli", - "version": "0.16.0", + "version": "0.17.0", "type": "module", "bin": { "superdoc": "./dist/index.js" diff --git a/apps/cli/platforms/cli-darwin-arm64/package.json b/apps/cli/platforms/cli-darwin-arm64/package.json index 454186b9ab..80dfc38363 100644 --- a/apps/cli/platforms/cli-darwin-arm64/package.json +++ b/apps/cli/platforms/cli-darwin-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/cli-darwin-arm64", - "version": "0.16.0", + "version": "0.17.0", "os": [ "darwin" ], diff --git a/apps/cli/platforms/cli-darwin-x64/package.json b/apps/cli/platforms/cli-darwin-x64/package.json index e73012fe24..da36337445 100644 --- a/apps/cli/platforms/cli-darwin-x64/package.json +++ b/apps/cli/platforms/cli-darwin-x64/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/cli-darwin-x64", - "version": "0.16.0", + "version": "0.17.0", "os": [ "darwin" ], diff --git a/apps/cli/platforms/cli-linux-arm64/package.json b/apps/cli/platforms/cli-linux-arm64/package.json index f99a13af25..5924526d3b 100644 --- a/apps/cli/platforms/cli-linux-arm64/package.json +++ b/apps/cli/platforms/cli-linux-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/cli-linux-arm64", - "version": "0.16.0", + "version": "0.17.0", "os": [ "linux" ], diff --git a/apps/cli/platforms/cli-linux-x64/package.json b/apps/cli/platforms/cli-linux-x64/package.json index b96157e6dc..6073f0162d 100644 --- a/apps/cli/platforms/cli-linux-x64/package.json +++ b/apps/cli/platforms/cli-linux-x64/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/cli-linux-x64", - "version": "0.16.0", + "version": "0.17.0", "os": [ "linux" ], diff --git a/apps/cli/platforms/cli-windows-x64/package.json b/apps/cli/platforms/cli-windows-x64/package.json index 8507e93fd4..8da2323f0e 100644 --- a/apps/cli/platforms/cli-windows-x64/package.json +++ b/apps/cli/platforms/cli-windows-x64/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/cli-windows-x64", - "version": "0.16.0", + "version": "0.17.0", "os": [ "win32" ], From 9306083755b25379ecd4d902e7b999dcaad96130 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 12 Jun 2026 16:27:43 +0000 Subject: [PATCH 02/59] chore(sdk): 1.16.0 [skip ci] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### 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 `` 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. --- packages/sdk/langs/node/package.json | 2 +- .../node/platforms/sdk-darwin-arm64/package.json | 2 +- .../langs/node/platforms/sdk-darwin-x64/package.json | 2 +- .../node/platforms/sdk-linux-arm64/package.json | 2 +- .../langs/node/platforms/sdk-linux-x64/package.json | 2 +- .../node/platforms/sdk-windows-x64/package.json | 2 +- .../superdoc-sdk-cli-darwin-arm64/pyproject.toml | 2 +- .../superdoc-sdk-cli-darwin-x64/pyproject.toml | 2 +- .../superdoc-sdk-cli-linux-arm64/pyproject.toml | 2 +- .../superdoc-sdk-cli-linux-x64/pyproject.toml | 2 +- .../superdoc-sdk-cli-windows-x64/pyproject.toml | 2 +- packages/sdk/langs/python/pyproject.toml | 12 ++++++------ packages/sdk/package.json | 2 +- packages/sdk/version.json | 2 +- 14 files changed, 19 insertions(+), 19 deletions(-) diff --git a/packages/sdk/langs/node/package.json b/packages/sdk/langs/node/package.json index 6ca098bd20..45afda8812 100644 --- a/packages/sdk/langs/node/package.json +++ b/packages/sdk/langs/node/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/sdk", - "version": "1.15.0", + "version": "1.16.0", "private": false, "type": "module", "main": "./dist/index.cjs", diff --git a/packages/sdk/langs/node/platforms/sdk-darwin-arm64/package.json b/packages/sdk/langs/node/platforms/sdk-darwin-arm64/package.json index 54a61cd289..e34a2b4565 100644 --- a/packages/sdk/langs/node/platforms/sdk-darwin-arm64/package.json +++ b/packages/sdk/langs/node/platforms/sdk-darwin-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/sdk-darwin-arm64", - "version": "1.15.0", + "version": "1.16.0", "os": [ "darwin" ], diff --git a/packages/sdk/langs/node/platforms/sdk-darwin-x64/package.json b/packages/sdk/langs/node/platforms/sdk-darwin-x64/package.json index b8cf6d87f5..0330ba2d77 100644 --- a/packages/sdk/langs/node/platforms/sdk-darwin-x64/package.json +++ b/packages/sdk/langs/node/platforms/sdk-darwin-x64/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/sdk-darwin-x64", - "version": "1.15.0", + "version": "1.16.0", "os": [ "darwin" ], diff --git a/packages/sdk/langs/node/platforms/sdk-linux-arm64/package.json b/packages/sdk/langs/node/platforms/sdk-linux-arm64/package.json index d4edc3e642..f08b8a4adf 100644 --- a/packages/sdk/langs/node/platforms/sdk-linux-arm64/package.json +++ b/packages/sdk/langs/node/platforms/sdk-linux-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/sdk-linux-arm64", - "version": "1.15.0", + "version": "1.16.0", "os": [ "linux" ], diff --git a/packages/sdk/langs/node/platforms/sdk-linux-x64/package.json b/packages/sdk/langs/node/platforms/sdk-linux-x64/package.json index f75e2f7f58..9814f3d95a 100644 --- a/packages/sdk/langs/node/platforms/sdk-linux-x64/package.json +++ b/packages/sdk/langs/node/platforms/sdk-linux-x64/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/sdk-linux-x64", - "version": "1.15.0", + "version": "1.16.0", "os": [ "linux" ], diff --git a/packages/sdk/langs/node/platforms/sdk-windows-x64/package.json b/packages/sdk/langs/node/platforms/sdk-windows-x64/package.json index c4caf40b3f..55287528c3 100644 --- a/packages/sdk/langs/node/platforms/sdk-windows-x64/package.json +++ b/packages/sdk/langs/node/platforms/sdk-windows-x64/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/sdk-windows-x64", - "version": "1.15.0", + "version": "1.16.0", "os": [ "win32" ], diff --git a/packages/sdk/langs/python/platforms/superdoc-sdk-cli-darwin-arm64/pyproject.toml b/packages/sdk/langs/python/platforms/superdoc-sdk-cli-darwin-arm64/pyproject.toml index ef28e2e688..d0fa17d630 100644 --- a/packages/sdk/langs/python/platforms/superdoc-sdk-cli-darwin-arm64/pyproject.toml +++ b/packages/sdk/langs/python/platforms/superdoc-sdk-cli-darwin-arm64/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "superdoc-sdk-cli-darwin-arm64" -version = "1.15.0" +version = "1.16.0" description = "SuperDoc CLI binary for macOS ARM64 (Apple Silicon)" readme = "README.md" requires-python = ">=3.9" diff --git a/packages/sdk/langs/python/platforms/superdoc-sdk-cli-darwin-x64/pyproject.toml b/packages/sdk/langs/python/platforms/superdoc-sdk-cli-darwin-x64/pyproject.toml index 9cdf270eec..f72b3a4b7b 100644 --- a/packages/sdk/langs/python/platforms/superdoc-sdk-cli-darwin-x64/pyproject.toml +++ b/packages/sdk/langs/python/platforms/superdoc-sdk-cli-darwin-x64/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "superdoc-sdk-cli-darwin-x64" -version = "1.15.0" +version = "1.16.0" description = "SuperDoc CLI binary for macOS x64 (Intel)" readme = "README.md" requires-python = ">=3.9" diff --git a/packages/sdk/langs/python/platforms/superdoc-sdk-cli-linux-arm64/pyproject.toml b/packages/sdk/langs/python/platforms/superdoc-sdk-cli-linux-arm64/pyproject.toml index c1f4b54499..697f980161 100644 --- a/packages/sdk/langs/python/platforms/superdoc-sdk-cli-linux-arm64/pyproject.toml +++ b/packages/sdk/langs/python/platforms/superdoc-sdk-cli-linux-arm64/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "superdoc-sdk-cli-linux-arm64" -version = "1.15.0" +version = "1.16.0" description = "SuperDoc CLI binary for Linux ARM64" readme = "README.md" requires-python = ">=3.9" diff --git a/packages/sdk/langs/python/platforms/superdoc-sdk-cli-linux-x64/pyproject.toml b/packages/sdk/langs/python/platforms/superdoc-sdk-cli-linux-x64/pyproject.toml index ae3d95a3e5..9936dc6a89 100644 --- a/packages/sdk/langs/python/platforms/superdoc-sdk-cli-linux-x64/pyproject.toml +++ b/packages/sdk/langs/python/platforms/superdoc-sdk-cli-linux-x64/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "superdoc-sdk-cli-linux-x64" -version = "1.15.0" +version = "1.16.0" description = "SuperDoc CLI binary for Linux x64" readme = "README.md" requires-python = ">=3.9" diff --git a/packages/sdk/langs/python/platforms/superdoc-sdk-cli-windows-x64/pyproject.toml b/packages/sdk/langs/python/platforms/superdoc-sdk-cli-windows-x64/pyproject.toml index 88b0e3015b..c4417fcc19 100644 --- a/packages/sdk/langs/python/platforms/superdoc-sdk-cli-windows-x64/pyproject.toml +++ b/packages/sdk/langs/python/platforms/superdoc-sdk-cli-windows-x64/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "superdoc-sdk-cli-windows-x64" -version = "1.15.0" +version = "1.16.0" description = "SuperDoc CLI binary for Windows x64" readme = "README.md" requires-python = ">=3.9" diff --git a/packages/sdk/langs/python/pyproject.toml b/packages/sdk/langs/python/pyproject.toml index e929aaf68c..c308c6c350 100644 --- a/packages/sdk/langs/python/pyproject.toml +++ b/packages/sdk/langs/python/pyproject.toml @@ -4,18 +4,18 @@ build-backend = "setuptools.build_meta" [project] name = "superdoc-sdk" -version = "1.15.0" +version = "1.16.0" description = "SuperDoc SDK (CLI-backed)" readme = "README.md" requires-python = ">=3.9" license = "AGPL-3.0" authors = [{ name = "SuperDoc" }] dependencies = [ - "superdoc-sdk-cli-darwin-arm64==1.15.0; platform_system == 'Darwin' and (platform_machine == 'arm64' or platform_machine == 'aarch64' or platform_machine == 'ARM64')", - "superdoc-sdk-cli-darwin-x64==1.15.0; platform_system == 'Darwin' and (platform_machine == 'x86_64' or platform_machine == 'AMD64' or platform_machine == 'amd64')", - "superdoc-sdk-cli-linux-x64==1.15.0; platform_system == 'Linux' and (platform_machine == 'x86_64' or platform_machine == 'AMD64' or platform_machine == 'amd64')", - "superdoc-sdk-cli-linux-arm64==1.15.0; platform_system == 'Linux' and (platform_machine == 'arm64' or platform_machine == 'aarch64' or platform_machine == 'ARM64')", - "superdoc-sdk-cli-windows-x64==1.15.0; platform_system == 'Windows' and (platform_machine == 'x86_64' or platform_machine == 'AMD64' or platform_machine == 'amd64')", + "superdoc-sdk-cli-darwin-arm64==1.16.0; platform_system == 'Darwin' and (platform_machine == 'arm64' or platform_machine == 'aarch64' or platform_machine == 'ARM64')", + "superdoc-sdk-cli-darwin-x64==1.16.0; platform_system == 'Darwin' and (platform_machine == 'x86_64' or platform_machine == 'AMD64' or platform_machine == 'amd64')", + "superdoc-sdk-cli-linux-x64==1.16.0; platform_system == 'Linux' and (platform_machine == 'x86_64' or platform_machine == 'AMD64' or platform_machine == 'amd64')", + "superdoc-sdk-cli-linux-arm64==1.16.0; platform_system == 'Linux' and (platform_machine == 'arm64' or platform_machine == 'aarch64' or platform_machine == 'ARM64')", + "superdoc-sdk-cli-windows-x64==1.16.0; platform_system == 'Windows' and (platform_machine == 'x86_64' or platform_machine == 'AMD64' or platform_machine == 'amd64')", ] [tool.setuptools] diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 6d430269be..4c4449bcc4 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/sdk-workspace", - "version": "1.15.0", + "version": "1.16.0", "private": true, "type": "module", "scripts": { diff --git a/packages/sdk/version.json b/packages/sdk/version.json index 107ebf79c4..f774c59589 100644 --- a/packages/sdk/version.json +++ b/packages/sdk/version.json @@ -1,3 +1,3 @@ { - "sdkVersion": "1.15.0" + "sdkVersion": "1.16.0" } From bc7e216a038ddc58306db5b73ffb82aaca645d92 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 12 Jun 2026 16:33:35 +0000 Subject: [PATCH 03/59] chore(mcp): 0.12.0 [skip ci] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### 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 `` 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. --- apps/mcp/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/mcp/package.json b/apps/mcp/package.json index 197785da20..a91cf6cdd1 100644 --- a/apps/mcp/package.json +++ b/apps/mcp/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/mcp", - "version": "0.11.0", + "version": "0.12.0", "type": "module", "engines": { "node": ">=20" From e80feb67474522e03edc46ad59b3ea582ec3aade Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 12 Jun 2026 16:37:07 +0000 Subject: [PATCH 04/59] chore(release): 1.40.0 [skip ci] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 `` 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. --- packages/superdoc/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/superdoc/package.json b/packages/superdoc/package.json index 5c2648d27f..3674e29d6c 100644 --- a/packages/superdoc/package.json +++ b/packages/superdoc/package.json @@ -1,7 +1,7 @@ { "name": "superdoc", "type": "module", - "version": "1.39.0", + "version": "1.40.0", "license": "AGPL-3.0", "repository": { "type": "git", From 550d4bee4f26d38dff12d71ee158dee528564870 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 12 Jun 2026 16:43:23 +0000 Subject: [PATCH 05/59] chore(react): 1.11.0 [skip ci] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### 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 `` 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. --- packages/react/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react/package.json b/packages/react/package.json index 49ec4c81cf..62aec5c54e 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/react", - "version": "1.10.0", + "version": "1.11.0", "description": "Official React wrapper for the SuperDoc document editor", "type": "module", "main": "./dist/index.cjs", From cc4402d98aa73a4faf36a7b3c78437bcb381dd72 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 12 Jun 2026 16:46:35 +0000 Subject: [PATCH 06/59] chore(vscode): 2.12.0 [skip ci] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### 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 `` 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. --- apps/vscode-ext/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/vscode-ext/package.json b/apps/vscode-ext/package.json index 89d5bac910..089952001a 100644 --- a/apps/vscode-ext/package.json +++ b/apps/vscode-ext/package.json @@ -2,7 +2,7 @@ "name": "superdoc-vscode-ext", "displayName": "SuperDoc - Word Document Editor", "description": "Open and edit Word documents (.docx) directly in VS Code using SuperDoc", - "version": "2.11.0", + "version": "2.12.0", "publisher": "superdoc-dev", "icon": "logo.png", "homepage": "https://superdoc.dev", From 44aceda4e82e1ed981668baee0ec5dd032d7baa7 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 12 Jun 2026 16:55:22 +0000 Subject: [PATCH 07/59] chore(esign): 2.7.2 [skip ci] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- packages/esign/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/esign/package.json b/packages/esign/package.json index 2e402e9d2e..bd97389649 100644 --- a/packages/esign/package.json +++ b/packages/esign/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/esign", - "version": "2.7.1", + "version": "2.7.2", "description": "React eSignature component for SuperDoc", "type": "module", "main": "./dist/index.js", From 07de01213c65f40c67a356e9259e7570dabd2443 Mon Sep 17 00:00:00 2001 From: Caio Pizzol Date: Fri, 12 Jun 2026 19:46:36 -0300 Subject: [PATCH 08/59] fix: roll back default toolbar fonts --- .../v1/components/toolbar/constants.js | 7 +- .../v1/components/toolbar/constants.test.js | 66 +++++------------- .../src/headless-toolbar/constants.test.ts | 22 +----- .../src/headless-toolbar/constants.ts | 9 ++- .../src/ui/create-super-doc-ui.test.ts | 68 +------------------ .../super-editor/src/ui/react/hooks.test.tsx | 18 ----- .../src/document-font-options.test.ts | 17 ----- shared/font-system/src/font-offerings.test.ts | 51 ++------------ shared/font-system/src/font-offerings.ts | 39 ++++------- 9 files changed, 48 insertions(+), 249 deletions(-) diff --git a/packages/super-editor/src/editors/v1/components/toolbar/constants.js b/packages/super-editor/src/editors/v1/components/toolbar/constants.js index 623a8b673e..5e25a90ad0 100644 --- a/packages/super-editor/src/editors/v1/components/toolbar/constants.js +++ b/packages/super-editor/src/editors/v1/components/toolbar/constants.js @@ -1,10 +1,9 @@ import { fontOfferingRenderStack, fontOfferingStack, getBuiltInToolbarFontOfferings } from '@superdoc/font-system'; /** - * Built-in toolbar font dropdown options, DERIVED from the shared font-offering registry - * (`@superdoc/font-system`) instead of a hand-maintained list. Bundled clean defaults and explicit - * qualified/category fallback choices are advertised; unbundled candidates are intentionally absent - * from the static defaults. + * Built-in toolbar font dropdown options, derived from the shared font-offering registry + * (`@superdoc/font-system`) instead of a hand-maintained list. The registry owns the conservative + * no-package toolbar baseline. * * Per `FontConfig`: `label` is the Word-facing logical name (stored on the selection + active-state * match), `key` is the logical CSS stack, and the row preview renders in the physical clone that diff --git a/packages/super-editor/src/editors/v1/components/toolbar/constants.test.js b/packages/super-editor/src/editors/v1/components/toolbar/constants.test.js index e44af345a1..5a425d47f6 100644 --- a/packages/super-editor/src/editors/v1/components/toolbar/constants.test.js +++ b/packages/super-editor/src/editors/v1/components/toolbar/constants.test.js @@ -2,48 +2,35 @@ import { describe, expect, it } from 'vitest'; import { composeToolbarFontOptions, TOOLBAR_FONTS } from './constants'; describe('TOOLBAR_FONTS (built-in font dropdown, derived from the font-offering registry)', () => { - it('advertises bundled defaults and selected bundled fallback choices, in alphabetical order', () => { - expect(TOOLBAR_FONTS.map((f) => f.label)).toEqual([ - 'Arial', - 'Arial Black', - 'Arial Narrow', - 'Baskerville Old Face', - 'Bookman Old Style', - 'Brush Script MT', - 'Calibri', - 'Century', - 'Century Gothic', - 'Comic Sans MS', - 'Cooper Black', - 'Courier New', - 'Garamond', - 'Georgia', - 'Gill Sans MT Condensed', - 'Helvetica', - 'Lucida Console', - 'Segoe UI', - 'Tahoma', - 'Times New Roman', - 'Trebuchet MS', - 'Verdana', - ]); + it('advertises the conservative no-package baseline, in alphabetical order', () => { + expect(TOOLBAR_FONTS.map((f) => f.label)).toEqual(['Arial', 'Courier New', 'Georgia', 'Times New Roman']); }); it('does not leak non-advertised fonts into the default dropdown', () => { const labels = new Set(TOOLBAR_FONTS.map((f) => f.label)); - for (const name of ['Aptos', 'Cambria', 'Calibri Light', 'Century Schoolbook', 'Arial MT', 'Courier', 'Times']) { + for (const name of [ + 'Aptos', + 'Calibri', + 'Cambria', + 'Calibri Light', + 'Century Schoolbook', + 'Helvetica', + 'Arial MT', + 'Courier', + 'Times', + ]) { expect(labels.has(name)).toBe(false); } }); it('builds a FontConfig: logical label + logical key + physical-clone preview', () => { - const calibri = TOOLBAR_FONTS.find((f) => f.label === 'Calibri'); - expect(calibri).toMatchObject({ - label: 'Calibri', // applied to the selection + active-state match (Word-facing name) - key: 'Calibri, sans-serif', // logical CSS stack (option identity) + const arial = TOOLBAR_FONTS.find((f) => f.label === 'Arial'); + expect(arial).toMatchObject({ + label: 'Arial', // applied to the selection + active-state match (Word-facing name) + key: 'Arial, sans-serif', // logical CSS stack (option identity) fontWeight: 400, props: { - style: { fontFamily: 'Carlito, sans-serif' }, // preview renders in the bundled clone that paints + style: { fontFamily: 'Liberation Sans, sans-serif' }, // preview renders in the bundled clone that paints 'data-item': 'btn-fontFamily-option', }, }); @@ -81,28 +68,11 @@ describe('composeToolbarFontOptions (document fonts unioned with the bundled def 'Apple Chancery', 'Aptos', 'Arial', - 'Arial Black', - 'Arial Narrow', 'Bangla MN', - 'Baskerville Old Face', - 'Bookman Old Style', - 'Brush Script MT', 'Calibri', - 'Century', - 'Century Gothic', - 'Comic Sans MS', - 'Cooper Black', 'Courier New', - 'Garamond', 'Georgia', - 'Gill Sans MT Condensed', - 'Helvetica', - 'Lucida Console', - 'Segoe UI', - 'Tahoma', 'Times New Roman', - 'Trebuchet MS', - 'Verdana', ]); expect(options.filter((o) => o.label === 'Calibri')).toHaveLength(1); }); diff --git a/packages/super-editor/src/headless-toolbar/constants.test.ts b/packages/super-editor/src/headless-toolbar/constants.test.ts index 21c6d104e8..e81f481900 100644 --- a/packages/super-editor/src/headless-toolbar/constants.test.ts +++ b/packages/super-editor/src/headless-toolbar/constants.test.ts @@ -2,38 +2,22 @@ import { describe, expect, it } from 'vitest'; import { DEFAULT_FONT_FAMILY_OPTIONS } from './constants'; describe('DEFAULT_FONT_FAMILY_OPTIONS (headless default font options, derived from the font-offering registry)', () => { - it('advertises bundled defaults and selected bundled fallback choices (logical name + logical stack)', () => { + it('advertises the conservative no-package baseline (logical name + logical stack)', () => { expect(DEFAULT_FONT_FAMILY_OPTIONS).toEqual([ { label: 'Arial', value: 'Arial, sans-serif' }, - { label: 'Arial Black', value: 'Arial Black, sans-serif' }, - { label: 'Arial Narrow', value: 'Arial Narrow, sans-serif' }, - { label: 'Baskerville Old Face', value: 'Baskerville Old Face, serif' }, - { label: 'Bookman Old Style', value: 'Bookman Old Style, serif' }, - { label: 'Brush Script MT', value: 'Brush Script MT, serif' }, - { label: 'Calibri', value: 'Calibri, sans-serif' }, - { label: 'Century', value: 'Century, serif' }, - { label: 'Century Gothic', value: 'Century Gothic, sans-serif' }, - { label: 'Comic Sans MS', value: 'Comic Sans MS, sans-serif' }, - { label: 'Cooper Black', value: 'Cooper Black, serif' }, { label: 'Courier New', value: 'Courier New, monospace' }, - { label: 'Garamond', value: 'Garamond, serif' }, { label: 'Georgia', value: 'Georgia, serif' }, - { label: 'Gill Sans MT Condensed', value: 'Gill Sans MT Condensed, sans-serif' }, - { label: 'Helvetica', value: 'Helvetica, sans-serif' }, - { label: 'Lucida Console', value: 'Lucida Console, monospace' }, - { label: 'Segoe UI', value: 'Segoe UI, sans-serif' }, - { label: 'Tahoma', value: 'Tahoma, sans-serif' }, { label: 'Times New Roman', value: 'Times New Roman, serif' }, - { label: 'Trebuchet MS', value: 'Trebuchet MS, sans-serif' }, - { label: 'Verdana', value: 'Verdana, sans-serif' }, ]); }); it('drops non-advertised fonts from defaults', () => { const labels = new Set(DEFAULT_FONT_FAMILY_OPTIONS.map((o) => o.label)); expect(labels.has('Aptos')).toBe(false); + expect(labels.has('Calibri')).toBe(false); expect(labels.has('Cambria')).toBe(false); expect(labels.has('Calibri Light')).toBe(false); + expect(labels.has('Helvetica')).toBe(false); expect(labels.has('Century Schoolbook')).toBe(false); expect(labels.has('Arial MT')).toBe(false); expect(labels.has('Courier')).toBe(false); diff --git a/packages/super-editor/src/headless-toolbar/constants.ts b/packages/super-editor/src/headless-toolbar/constants.ts index e0cb9cce01..6e1ac46dd4 100644 --- a/packages/super-editor/src/headless-toolbar/constants.ts +++ b/packages/super-editor/src/headless-toolbar/constants.ts @@ -62,11 +62,10 @@ export const DEFAULT_FONT_SIZE_OPTIONS = [ ] as const; /** - * Default headless-toolbar font options, DERIVED from the shared font-offering registry - * (`@superdoc/font-system`) instead of a hand-maintained list. Bundled clean defaults and explicit - * qualified choices are advertised; customer-supplied and category fallback rows stay absent. - * `label` is the Word-facing logical name (stored/exported); `value` is the logical CSS stack applied - * to the run. + * Default headless-toolbar font options, derived from the shared font-offering registry + * (`@superdoc/font-system`) instead of a hand-maintained list. The registry owns the conservative + * no-package toolbar baseline. `label` is the Word-facing logical name (stored/exported); + * `value` is the logical CSS stack applied to the run. */ export const DEFAULT_FONT_FAMILY_OPTIONS = getDefaultFontFamilyOptions(); diff --git a/packages/super-editor/src/ui/create-super-doc-ui.test.ts b/packages/super-editor/src/ui/create-super-doc-ui.test.ts index f7ea11ea7d..92b9862981 100644 --- a/packages/super-editor/src/ui/create-super-doc-ui.test.ts +++ b/packages/super-editor/src/ui/create-super-doc-ui.test.ts @@ -152,28 +152,11 @@ describe('createSuperDocUI', () => { expect(options.map((option) => option.label)).toEqual([ 'Aptos', 'Arial', - 'Arial Black', - 'Arial Narrow', 'Bangla MN', - 'Baskerville Old Face', - 'Bookman Old Style', - 'Brush Script MT', 'Calibri', - 'Century', - 'Century Gothic', - 'Comic Sans MS', - 'Cooper Black', 'Courier New', - 'Garamond', 'Georgia', - 'Gill Sans MT Condensed', - 'Helvetica', - 'Lucida Console', - 'Segoe UI', - 'Tahoma', 'Times New Roman', - 'Trebuchet MS', - 'Verdana', ]); expect(options.find((option) => option.label === 'Aptos')).toEqual({ label: 'Aptos', @@ -214,55 +197,8 @@ describe('createSuperDocUI', () => { superdoc.fireSuperdoc('fonts-changed'); await flushMicrotasks(); - expect(observed.at(0)).toEqual([ - 'Arial', - 'Arial Black', - 'Arial Narrow', - 'Baskerville Old Face', - 'Bookman Old Style', - 'Brush Script MT', - 'Calibri', - 'Century', - 'Century Gothic', - 'Comic Sans MS', - 'Cooper Black', - 'Courier New', - 'Garamond', - 'Georgia', - 'Gill Sans MT Condensed', - 'Helvetica', - 'Lucida Console', - 'Segoe UI', - 'Tahoma', - 'Times New Roman', - 'Trebuchet MS', - 'Verdana', - ]); - expect(observed.at(-1)).toEqual([ - 'Aptos', - 'Arial', - 'Arial Black', - 'Arial Narrow', - 'Baskerville Old Face', - 'Bookman Old Style', - 'Brush Script MT', - 'Calibri', - 'Century', - 'Century Gothic', - 'Comic Sans MS', - 'Cooper Black', - 'Courier New', - 'Garamond', - 'Georgia', - 'Gill Sans MT Condensed', - 'Helvetica', - 'Lucida Console', - 'Segoe UI', - 'Tahoma', - 'Times New Roman', - 'Trebuchet MS', - 'Verdana', - ]); + expect(observed.at(0)).toEqual(['Arial', 'Courier New', 'Georgia', 'Times New Roman']); + expect(observed.at(-1)).toEqual(['Aptos', 'Arial', 'Courier New', 'Georgia', 'Times New Roman']); }); it('refreshes ui.fonts for delimiter-colliding font names', async () => { diff --git a/packages/super-editor/src/ui/react/hooks.test.tsx b/packages/super-editor/src/ui/react/hooks.test.tsx index faba8450f1..dd99a26fb1 100644 --- a/packages/super-editor/src/ui/react/hooks.test.tsx +++ b/packages/super-editor/src/ui/react/hooks.test.tsx @@ -186,27 +186,9 @@ describe('domain hooks', () => { expect(options?.map((option) => option.label)).toEqual([ 'Aptos', 'Arial', - 'Arial Black', - 'Arial Narrow', - 'Baskerville Old Face', - 'Bookman Old Style', - 'Brush Script MT', - 'Calibri', - 'Century', - 'Century Gothic', - 'Comic Sans MS', - 'Cooper Black', 'Courier New', - 'Garamond', 'Georgia', - 'Gill Sans MT Condensed', - 'Helvetica', - 'Lucida Console', - 'Segoe UI', - 'Tahoma', 'Times New Roman', - 'Trebuchet MS', - 'Verdana', ]); expect(options?.find((option) => option.label === 'Aptos')).toEqual({ label: 'Aptos', diff --git a/shared/font-system/src/document-font-options.test.ts b/shared/font-system/src/document-font-options.test.ts index 6e2cb57d8f..3be341eb21 100644 --- a/shared/font-system/src/document-font-options.test.ts +++ b/shared/font-system/src/document-font-options.test.ts @@ -127,28 +127,11 @@ describe('buildFontFamilyOptions (custom UI font picker rows)', () => { 'Apple Chancery', 'Aptos', 'Arial', - 'Arial Black', - 'Arial Narrow', 'Bangla MN', - 'Baskerville Old Face', - 'Bookman Old Style', - 'Brush Script MT', 'Calibri', - 'Century', - 'Century Gothic', - 'Comic Sans MS', - 'Cooper Black', 'Courier New', - 'Garamond', 'Georgia', - 'Gill Sans MT Condensed', - 'Helvetica', - 'Lucida Console', - 'Segoe UI', - 'Tahoma', 'Times New Roman', - 'Trebuchet MS', - 'Verdana', ]); expect(options.filter((option) => option.label === 'Calibri')).toHaveLength(1); expect(options.every((option) => !('status' in option))).toBe(true); diff --git a/shared/font-system/src/font-offerings.test.ts b/shared/font-system/src/font-offerings.test.ts index 4239f2276a..0a9058a84d 100644 --- a/shared/font-system/src/font-offerings.test.ts +++ b/shared/font-system/src/font-offerings.test.ts @@ -10,30 +10,7 @@ import { import { SUBSTITUTION_EVIDENCE } from './substitution-evidence'; const EXPECTED_DEFAULTS = ['Arial', 'Calibri', 'Courier New', 'Helvetica', 'Times New Roman']; -const EXPECTED_BUILT_IN_TOOLBAR = [ - 'Arial', - 'Arial Black', - 'Arial Narrow', - 'Baskerville Old Face', - 'Bookman Old Style', - 'Brush Script MT', - 'Calibri', - 'Century', - 'Century Gothic', - 'Comic Sans MS', - 'Cooper Black', - 'Courier New', - 'Garamond', - 'Georgia', - 'Gill Sans MT Condensed', - 'Helvetica', - 'Lucida Console', - 'Segoe UI', - 'Tahoma', - 'Times New Roman', - 'Trebuchet MS', - 'Verdana', -]; +const EXPECTED_BUILT_IN_TOOLBAR = ['Arial', 'Courier New', 'Georgia', 'Times New Roman']; /** * Must NOT appear as DEFAULT options yet. Aptos has no clone, Cambria/Georgia/Cooper Black/ @@ -85,13 +62,15 @@ describe('font offerings', () => { } }); - it('built-in toolbar offerings include advertised bundled rows without reclassifying them as defaults', () => { + it('built-in toolbar offerings use the conservative no-package baseline', () => { expect(getBuiltInToolbarFontOfferings().map((o) => o.logicalFamily)).toEqual(EXPECTED_BUILT_IN_TOOLBAR); - expect(getBuiltInToolbarFontOfferings().find((o) => o.logicalFamily === 'Cooper Black')).toMatchObject({ + expect(getBuiltInToolbarFontOfferings().find((o) => o.logicalFamily === 'Georgia')).toMatchObject({ offering: 'qualified', - verdict: 'visual_only', + verdict: 'near_metric', bundled: true, }); + expect(getBuiltInToolbarFontOfferings().some((o) => o.logicalFamily === 'Calibri')).toBe(false); + expect(getBuiltInToolbarFontOfferings().some((o) => o.logicalFamily === 'Helvetica')).toBe(false); }); it('classifies the qualified and category rows distinctly (carried for the later fidelity layer)', () => { @@ -214,27 +193,9 @@ describe('font offerings', () => { it('getDefaultFontFamilyOptions returns logical label + logical stack', () => { expect(getDefaultFontFamilyOptions()).toEqual([ { label: 'Arial', value: 'Arial, sans-serif' }, - { label: 'Arial Black', value: 'Arial Black, sans-serif' }, - { label: 'Arial Narrow', value: 'Arial Narrow, sans-serif' }, - { label: 'Baskerville Old Face', value: 'Baskerville Old Face, serif' }, - { label: 'Bookman Old Style', value: 'Bookman Old Style, serif' }, - { label: 'Brush Script MT', value: 'Brush Script MT, serif' }, - { label: 'Calibri', value: 'Calibri, sans-serif' }, - { label: 'Century', value: 'Century, serif' }, - { label: 'Century Gothic', value: 'Century Gothic, sans-serif' }, - { label: 'Comic Sans MS', value: 'Comic Sans MS, sans-serif' }, - { label: 'Cooper Black', value: 'Cooper Black, serif' }, { label: 'Courier New', value: 'Courier New, monospace' }, - { label: 'Garamond', value: 'Garamond, serif' }, { label: 'Georgia', value: 'Georgia, serif' }, - { label: 'Gill Sans MT Condensed', value: 'Gill Sans MT Condensed, sans-serif' }, - { label: 'Helvetica', value: 'Helvetica, sans-serif' }, - { label: 'Lucida Console', value: 'Lucida Console, monospace' }, - { label: 'Segoe UI', value: 'Segoe UI, sans-serif' }, - { label: 'Tahoma', value: 'Tahoma, sans-serif' }, { label: 'Times New Roman', value: 'Times New Roman, serif' }, - { label: 'Trebuchet MS', value: 'Trebuchet MS, sans-serif' }, - { label: 'Verdana', value: 'Verdana, sans-serif' }, ]); }); diff --git a/shared/font-system/src/font-offerings.ts b/shared/font-system/src/font-offerings.ts index b0da75d2c8..19d943b446 100644 --- a/shared/font-system/src/font-offerings.ts +++ b/shared/font-system/src/font-offerings.ts @@ -53,24 +53,11 @@ export interface FontOffering { const BUNDLED_FAMILIES: ReadonlySet = new Set(BUNDLED_MANIFEST.map((f) => f.family)); const SUPPORTED_ALIAS_FAMILIES: ReadonlySet = new Set(['Arial MT', 'Courier', 'Times']); -const ADVERTISED_BUILT_IN_TOOLBAR_FAMILIES: ReadonlySet = new Set([ - 'Arial Black', - 'Arial Narrow', - 'Baskerville Old Face', - 'Bookman Old Style', - 'Brush Script MT', - 'Century', - 'Century Gothic', - 'Cooper Black', - 'Comic Sans MS', - 'Garamond', +const BUILT_IN_TOOLBAR_BASELINE_FAMILIES: ReadonlySet = new Set([ + 'Arial', + 'Courier New', 'Georgia', - 'Gill Sans MT Condensed', - 'Lucida Console', - 'Segoe UI', - 'Tahoma', - 'Trebuchet MS', - 'Verdana', + 'Times New Roman', ]); /** Classify one evidence row by its policy action, verdict, and whether its target is bundled. */ @@ -128,18 +115,16 @@ export function getDefaultFontOfferings(): FontOffering[] { } /** - * Built-in font picker options SuperDoc can render from its bundled assets. Includes clean defaults plus - * explicitly advertised qualified/category fallbacks. Consumers that need strict metric-safe choices - * should use {@link getDefaultFontOfferings}. + * Built-in font picker options shown without any customer font configuration. + * + * AIDEV-NOTE: Keep this SD-3441 toolbar baseline conservative while the optional + * font-pack selection UX is settled. Documents still resolve the full reviewed + * substitute table through the resolver. */ export function getBuiltInToolbarFontOfferings(): FontOffering[] { - return FONT_OFFERINGS.filter( - (o) => - o.offering === 'default' || - (o.bundled && - ADVERTISED_BUILT_IN_TOOLBAR_FAMILIES.has(o.logicalFamily) && - (o.offering === 'qualified' || o.offering === 'category_fallback')), - ).sort(compareLogicalFamily); + return FONT_OFFERINGS.filter((o) => o.bundled && BUILT_IN_TOOLBAR_BASELINE_FAMILIES.has(o.logicalFamily)).sort( + compareLogicalFamily, + ); } /** The logical CSS stack stored/applied when an offering is chosen, e.g. "Calibri, sans-serif". */ From 6681153b3e693f84e3e7aae8707c218b6b07d8b8 Mon Sep 17 00:00:00 2001 From: Caio Pizzol Date: Fri, 12 Jun 2026 20:05:47 -0300 Subject: [PATCH 09/59] test: update font dropdown behavior expectations --- .../font-dropdown-document-options.spec.ts | 51 +++++++------------ 1 file changed, 19 insertions(+), 32 deletions(-) diff --git a/tests/behavior/tests/toolbar/font-dropdown-document-options.spec.ts b/tests/behavior/tests/toolbar/font-dropdown-document-options.spec.ts index 52946ad67e..c2362e5f38 100644 --- a/tests/behavior/tests/toolbar/font-dropdown-document-options.spec.ts +++ b/tests/behavior/tests/toolbar/font-dropdown-document-options.spec.ts @@ -5,30 +5,7 @@ test.use({ config: { toolbar: 'full', showSelection: true } }); const FONT_OPTION = '[data-item="btn-fontFamily-option"]'; const FONT_TOGGLE = '[data-item="btn-fontFamily-toggle"]'; const OPTION_LABEL = `${FONT_OPTION} .toolbar-dropdown-option__label`; -const DEFAULT_FONT_LABELS = [ - 'Arial', - 'Arial Black', - 'Arial Narrow', - 'Baskerville Old Face', - 'Bookman Old Style', - 'Brush Script MT', - 'Calibri', - 'Century', - 'Century Gothic', - 'Comic Sans MS', - 'Cooper Black', - 'Courier New', - 'Garamond', - 'Georgia', - 'Gill Sans MT Condensed', - 'Helvetica', - 'Lucida Console', - 'Segoe UI', - 'Tahoma', - 'Times New Roman', - 'Trebuchet MS', - 'Verdana', -]; +const DEFAULT_FONT_LABELS = ['Arial', 'Courier New', 'Georgia', 'Times New Roman']; function expectedLabelsWithDocumentFonts(documentLabels: string[]): string[] { return Array.from(new Set([...DEFAULT_FONT_LABELS, ...documentLabels])).sort((left, right) => @@ -110,7 +87,17 @@ test('font dropdown opens immediately with the built-in font list and an enabled const labels = await fontOptionLabels(superdoc); expect(labels).toEqual(DEFAULT_FONT_LABELS); - for (const absent of ['Aptos', 'Cambria', 'Calibri Light', 'Century Schoolbook', 'Arial MT', 'Courier', 'Times']) { + for (const absent of [ + 'Aptos', + 'Calibri', + 'Cambria', + 'Calibri Light', + 'Century Schoolbook', + 'Helvetica', + 'Arial MT', + 'Courier', + 'Times', + ]) { expect(labels).not.toContain(absent); } }); @@ -124,10 +111,10 @@ test('selecting a default font applies its logical Word-facing family to the sel await superdoc.waitForStable(); await openFontFamilyDropdown(superdoc); - await selectFontOption(superdoc, 'Helvetica'); + await selectFontOption(superdoc, 'Georgia'); - await expect(superdoc.page.locator('[data-item="btn-fontFamily"] .sd-button-label')).toHaveText('Helvetica'); - await superdoc.assertTextMarkAttrs('Default font sample', 'textStyle', { fontFamily: 'Helvetica' }); + await expect(superdoc.page.locator('[data-item="btn-fontFamily"] .sd-button-label')).toHaveText('Georgia'); + await superdoc.assertTextMarkAttrs('Default font sample', 'textStyle', { fontFamily: 'Georgia' }); }); test('typing in the font combobox applies to the selected text without opening the list', async ({ superdoc }) => { @@ -189,14 +176,14 @@ test('tabbing through font family and size preserves formatting when all text is await superdoc.waitForStable(); await replaceSelectionThroughFontInputs(superdoc, { - fontPrefix: 'cal', + fontPrefix: 'geo', fontSize: '20', replacement: 'done', }); await superdoc.assertTextContent('done'); await superdoc.assertTextMarkAttrs('done', 'textStyle', { - fontFamily: 'Calibri', + fontFamily: 'Georgia', fontSize: '20pt', }); }); @@ -215,14 +202,14 @@ test('pressing Enter in the font combobox preserves formatting when all text is await fontInput.click(); await expectFontFamilyDropdownClosed(superdoc); - await superdoc.page.keyboard.type('cal'); + await superdoc.page.keyboard.type('geo'); await superdoc.page.keyboard.press('Enter'); await superdoc.page.keyboard.type('done'); await superdoc.waitForStable(); await superdoc.assertTextContent('done'); await superdoc.assertTextMarkAttrs('done', 'textStyle', { - fontFamily: 'Calibri', + fontFamily: 'Georgia', }); }); From 74b86bb5f799a56e0d922d4a9cf6beb31cb31629 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 12 Jun 2026 23:43:08 +0000 Subject: [PATCH 10/59] chore(cli): 0.17.1 [skip ci] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- apps/cli/package.json | 2 +- apps/cli/platforms/cli-darwin-arm64/package.json | 2 +- apps/cli/platforms/cli-darwin-x64/package.json | 2 +- apps/cli/platforms/cli-linux-arm64/package.json | 2 +- apps/cli/platforms/cli-linux-x64/package.json | 2 +- apps/cli/platforms/cli-windows-x64/package.json | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/cli/package.json b/apps/cli/package.json index 995be5f378..e2a0e4ef85 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/cli", - "version": "0.17.0", + "version": "0.17.1", "type": "module", "bin": { "superdoc": "./dist/index.js" diff --git a/apps/cli/platforms/cli-darwin-arm64/package.json b/apps/cli/platforms/cli-darwin-arm64/package.json index 80dfc38363..93275b8134 100644 --- a/apps/cli/platforms/cli-darwin-arm64/package.json +++ b/apps/cli/platforms/cli-darwin-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/cli-darwin-arm64", - "version": "0.17.0", + "version": "0.17.1", "os": [ "darwin" ], diff --git a/apps/cli/platforms/cli-darwin-x64/package.json b/apps/cli/platforms/cli-darwin-x64/package.json index da36337445..25925369b3 100644 --- a/apps/cli/platforms/cli-darwin-x64/package.json +++ b/apps/cli/platforms/cli-darwin-x64/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/cli-darwin-x64", - "version": "0.17.0", + "version": "0.17.1", "os": [ "darwin" ], diff --git a/apps/cli/platforms/cli-linux-arm64/package.json b/apps/cli/platforms/cli-linux-arm64/package.json index 5924526d3b..b38dc2b9dd 100644 --- a/apps/cli/platforms/cli-linux-arm64/package.json +++ b/apps/cli/platforms/cli-linux-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/cli-linux-arm64", - "version": "0.17.0", + "version": "0.17.1", "os": [ "linux" ], diff --git a/apps/cli/platforms/cli-linux-x64/package.json b/apps/cli/platforms/cli-linux-x64/package.json index 6073f0162d..04bbd68ab6 100644 --- a/apps/cli/platforms/cli-linux-x64/package.json +++ b/apps/cli/platforms/cli-linux-x64/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/cli-linux-x64", - "version": "0.17.0", + "version": "0.17.1", "os": [ "linux" ], diff --git a/apps/cli/platforms/cli-windows-x64/package.json b/apps/cli/platforms/cli-windows-x64/package.json index 8da2323f0e..595b1b880e 100644 --- a/apps/cli/platforms/cli-windows-x64/package.json +++ b/apps/cli/platforms/cli-windows-x64/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/cli-windows-x64", - "version": "0.17.0", + "version": "0.17.1", "os": [ "win32" ], From 33e6b9128e3b92ec7f3eaa7d7cb70f1ac8d16982 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 12 Jun 2026 23:47:53 +0000 Subject: [PATCH 11/59] chore(sdk): 1.16.1 [skip ci] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### 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. --- packages/sdk/langs/node/package.json | 2 +- .../node/platforms/sdk-darwin-arm64/package.json | 2 +- .../langs/node/platforms/sdk-darwin-x64/package.json | 2 +- .../node/platforms/sdk-linux-arm64/package.json | 2 +- .../langs/node/platforms/sdk-linux-x64/package.json | 2 +- .../node/platforms/sdk-windows-x64/package.json | 2 +- .../superdoc-sdk-cli-darwin-arm64/pyproject.toml | 2 +- .../superdoc-sdk-cli-darwin-x64/pyproject.toml | 2 +- .../superdoc-sdk-cli-linux-arm64/pyproject.toml | 2 +- .../superdoc-sdk-cli-linux-x64/pyproject.toml | 2 +- .../superdoc-sdk-cli-windows-x64/pyproject.toml | 2 +- packages/sdk/langs/python/pyproject.toml | 12 ++++++------ packages/sdk/package.json | 2 +- packages/sdk/version.json | 2 +- 14 files changed, 19 insertions(+), 19 deletions(-) diff --git a/packages/sdk/langs/node/package.json b/packages/sdk/langs/node/package.json index 45afda8812..97750d6e45 100644 --- a/packages/sdk/langs/node/package.json +++ b/packages/sdk/langs/node/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/sdk", - "version": "1.16.0", + "version": "1.16.1", "private": false, "type": "module", "main": "./dist/index.cjs", diff --git a/packages/sdk/langs/node/platforms/sdk-darwin-arm64/package.json b/packages/sdk/langs/node/platforms/sdk-darwin-arm64/package.json index e34a2b4565..762b928329 100644 --- a/packages/sdk/langs/node/platforms/sdk-darwin-arm64/package.json +++ b/packages/sdk/langs/node/platforms/sdk-darwin-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/sdk-darwin-arm64", - "version": "1.16.0", + "version": "1.16.1", "os": [ "darwin" ], diff --git a/packages/sdk/langs/node/platforms/sdk-darwin-x64/package.json b/packages/sdk/langs/node/platforms/sdk-darwin-x64/package.json index 0330ba2d77..b14ffc5edc 100644 --- a/packages/sdk/langs/node/platforms/sdk-darwin-x64/package.json +++ b/packages/sdk/langs/node/platforms/sdk-darwin-x64/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/sdk-darwin-x64", - "version": "1.16.0", + "version": "1.16.1", "os": [ "darwin" ], diff --git a/packages/sdk/langs/node/platforms/sdk-linux-arm64/package.json b/packages/sdk/langs/node/platforms/sdk-linux-arm64/package.json index f08b8a4adf..30b34627ce 100644 --- a/packages/sdk/langs/node/platforms/sdk-linux-arm64/package.json +++ b/packages/sdk/langs/node/platforms/sdk-linux-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/sdk-linux-arm64", - "version": "1.16.0", + "version": "1.16.1", "os": [ "linux" ], diff --git a/packages/sdk/langs/node/platforms/sdk-linux-x64/package.json b/packages/sdk/langs/node/platforms/sdk-linux-x64/package.json index 9814f3d95a..1935f3523d 100644 --- a/packages/sdk/langs/node/platforms/sdk-linux-x64/package.json +++ b/packages/sdk/langs/node/platforms/sdk-linux-x64/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/sdk-linux-x64", - "version": "1.16.0", + "version": "1.16.1", "os": [ "linux" ], diff --git a/packages/sdk/langs/node/platforms/sdk-windows-x64/package.json b/packages/sdk/langs/node/platforms/sdk-windows-x64/package.json index 55287528c3..09824a53db 100644 --- a/packages/sdk/langs/node/platforms/sdk-windows-x64/package.json +++ b/packages/sdk/langs/node/platforms/sdk-windows-x64/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/sdk-windows-x64", - "version": "1.16.0", + "version": "1.16.1", "os": [ "win32" ], diff --git a/packages/sdk/langs/python/platforms/superdoc-sdk-cli-darwin-arm64/pyproject.toml b/packages/sdk/langs/python/platforms/superdoc-sdk-cli-darwin-arm64/pyproject.toml index d0fa17d630..89abf06638 100644 --- a/packages/sdk/langs/python/platforms/superdoc-sdk-cli-darwin-arm64/pyproject.toml +++ b/packages/sdk/langs/python/platforms/superdoc-sdk-cli-darwin-arm64/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "superdoc-sdk-cli-darwin-arm64" -version = "1.16.0" +version = "1.16.1" description = "SuperDoc CLI binary for macOS ARM64 (Apple Silicon)" readme = "README.md" requires-python = ">=3.9" diff --git a/packages/sdk/langs/python/platforms/superdoc-sdk-cli-darwin-x64/pyproject.toml b/packages/sdk/langs/python/platforms/superdoc-sdk-cli-darwin-x64/pyproject.toml index f72b3a4b7b..2a6c964ab0 100644 --- a/packages/sdk/langs/python/platforms/superdoc-sdk-cli-darwin-x64/pyproject.toml +++ b/packages/sdk/langs/python/platforms/superdoc-sdk-cli-darwin-x64/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "superdoc-sdk-cli-darwin-x64" -version = "1.16.0" +version = "1.16.1" description = "SuperDoc CLI binary for macOS x64 (Intel)" readme = "README.md" requires-python = ">=3.9" diff --git a/packages/sdk/langs/python/platforms/superdoc-sdk-cli-linux-arm64/pyproject.toml b/packages/sdk/langs/python/platforms/superdoc-sdk-cli-linux-arm64/pyproject.toml index 697f980161..7438c5f1bd 100644 --- a/packages/sdk/langs/python/platforms/superdoc-sdk-cli-linux-arm64/pyproject.toml +++ b/packages/sdk/langs/python/platforms/superdoc-sdk-cli-linux-arm64/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "superdoc-sdk-cli-linux-arm64" -version = "1.16.0" +version = "1.16.1" description = "SuperDoc CLI binary for Linux ARM64" readme = "README.md" requires-python = ">=3.9" diff --git a/packages/sdk/langs/python/platforms/superdoc-sdk-cli-linux-x64/pyproject.toml b/packages/sdk/langs/python/platforms/superdoc-sdk-cli-linux-x64/pyproject.toml index 9936dc6a89..a6d674b94f 100644 --- a/packages/sdk/langs/python/platforms/superdoc-sdk-cli-linux-x64/pyproject.toml +++ b/packages/sdk/langs/python/platforms/superdoc-sdk-cli-linux-x64/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "superdoc-sdk-cli-linux-x64" -version = "1.16.0" +version = "1.16.1" description = "SuperDoc CLI binary for Linux x64" readme = "README.md" requires-python = ">=3.9" diff --git a/packages/sdk/langs/python/platforms/superdoc-sdk-cli-windows-x64/pyproject.toml b/packages/sdk/langs/python/platforms/superdoc-sdk-cli-windows-x64/pyproject.toml index c4417fcc19..5cb0ad03bb 100644 --- a/packages/sdk/langs/python/platforms/superdoc-sdk-cli-windows-x64/pyproject.toml +++ b/packages/sdk/langs/python/platforms/superdoc-sdk-cli-windows-x64/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "superdoc-sdk-cli-windows-x64" -version = "1.16.0" +version = "1.16.1" description = "SuperDoc CLI binary for Windows x64" readme = "README.md" requires-python = ">=3.9" diff --git a/packages/sdk/langs/python/pyproject.toml b/packages/sdk/langs/python/pyproject.toml index c308c6c350..ef24f35839 100644 --- a/packages/sdk/langs/python/pyproject.toml +++ b/packages/sdk/langs/python/pyproject.toml @@ -4,18 +4,18 @@ build-backend = "setuptools.build_meta" [project] name = "superdoc-sdk" -version = "1.16.0" +version = "1.16.1" description = "SuperDoc SDK (CLI-backed)" readme = "README.md" requires-python = ">=3.9" license = "AGPL-3.0" authors = [{ name = "SuperDoc" }] dependencies = [ - "superdoc-sdk-cli-darwin-arm64==1.16.0; platform_system == 'Darwin' and (platform_machine == 'arm64' or platform_machine == 'aarch64' or platform_machine == 'ARM64')", - "superdoc-sdk-cli-darwin-x64==1.16.0; platform_system == 'Darwin' and (platform_machine == 'x86_64' or platform_machine == 'AMD64' or platform_machine == 'amd64')", - "superdoc-sdk-cli-linux-x64==1.16.0; platform_system == 'Linux' and (platform_machine == 'x86_64' or platform_machine == 'AMD64' or platform_machine == 'amd64')", - "superdoc-sdk-cli-linux-arm64==1.16.0; platform_system == 'Linux' and (platform_machine == 'arm64' or platform_machine == 'aarch64' or platform_machine == 'ARM64')", - "superdoc-sdk-cli-windows-x64==1.16.0; platform_system == 'Windows' and (platform_machine == 'x86_64' or platform_machine == 'AMD64' or platform_machine == 'amd64')", + "superdoc-sdk-cli-darwin-arm64==1.16.1; platform_system == 'Darwin' and (platform_machine == 'arm64' or platform_machine == 'aarch64' or platform_machine == 'ARM64')", + "superdoc-sdk-cli-darwin-x64==1.16.1; platform_system == 'Darwin' and (platform_machine == 'x86_64' or platform_machine == 'AMD64' or platform_machine == 'amd64')", + "superdoc-sdk-cli-linux-x64==1.16.1; platform_system == 'Linux' and (platform_machine == 'x86_64' or platform_machine == 'AMD64' or platform_machine == 'amd64')", + "superdoc-sdk-cli-linux-arm64==1.16.1; platform_system == 'Linux' and (platform_machine == 'arm64' or platform_machine == 'aarch64' or platform_machine == 'ARM64')", + "superdoc-sdk-cli-windows-x64==1.16.1; platform_system == 'Windows' and (platform_machine == 'x86_64' or platform_machine == 'AMD64' or platform_machine == 'amd64')", ] [tool.setuptools] diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 4c4449bcc4..e9bda569c3 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/sdk-workspace", - "version": "1.16.0", + "version": "1.16.1", "private": true, "type": "module", "scripts": { diff --git a/packages/sdk/version.json b/packages/sdk/version.json index f774c59589..be0f037e15 100644 --- a/packages/sdk/version.json +++ b/packages/sdk/version.json @@ -1,3 +1,3 @@ { - "sdkVersion": "1.16.0" + "sdkVersion": "1.16.1" } From d4de658695245934d842a477718c7a3d526a6727 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 12 Jun 2026 23:51:22 +0000 Subject: [PATCH 12/59] chore(mcp): 0.12.1 [skip ci] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- apps/mcp/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/mcp/package.json b/apps/mcp/package.json index a91cf6cdd1..e935800a09 100644 --- a/apps/mcp/package.json +++ b/apps/mcp/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/mcp", - "version": "0.12.0", + "version": "0.12.1", "type": "module", "engines": { "node": ">=20" From e75e52d807666b312798f8930fd0f9fcd6798159 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 12 Jun 2026 23:52:02 +0000 Subject: [PATCH 13/59] chore(release): 1.40.1 [skip ci] ### 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. --- packages/superdoc/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/superdoc/package.json b/packages/superdoc/package.json index 3674e29d6c..e6482513b3 100644 --- a/packages/superdoc/package.json +++ b/packages/superdoc/package.json @@ -1,7 +1,7 @@ { "name": "superdoc", "type": "module", - "version": "1.40.0", + "version": "1.40.1", "license": "AGPL-3.0", "repository": { "type": "git", From 155ae82e8c0b7082555f366b3bdcc017bdc2ad18 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 12 Jun 2026 23:54:52 +0000 Subject: [PATCH 14/59] chore(react): 1.11.1 [skip ci] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### 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. --- packages/react/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react/package.json b/packages/react/package.json index 62aec5c54e..438a914f15 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/react", - "version": "1.11.0", + "version": "1.11.1", "description": "Official React wrapper for the SuperDoc document editor", "type": "module", "main": "./dist/index.cjs", From d9be57093cf42d00645d1f8eb151c3b2c3c266a2 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 12 Jun 2026 23:55:41 +0000 Subject: [PATCH 15/59] chore(vscode): 2.12.1 [skip ci] ### 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. --- apps/vscode-ext/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/vscode-ext/package.json b/apps/vscode-ext/package.json index 089952001a..dcdd7d4de4 100644 --- a/apps/vscode-ext/package.json +++ b/apps/vscode-ext/package.json @@ -2,7 +2,7 @@ "name": "superdoc-vscode-ext", "displayName": "SuperDoc - Word Document Editor", "description": "Open and edit Word documents (.docx) directly in VS Code using SuperDoc", - "version": "2.12.0", + "version": "2.12.1", "publisher": "superdoc-dev", "icon": "logo.png", "homepage": "https://superdoc.dev", From 11cc3d11955aeadfdbb22076c0c1e33aabfba926 Mon Sep 17 00:00:00 2001 From: Caio Pizzol Date: Sun, 14 Jun 2026 19:58:33 -0300 Subject: [PATCH 16/59] fix: resolve stable merge conflicts --- packages/sdk/langs/python/pyproject.toml | 12 ----- .../v1/components/toolbar/constants.js | 6 --- .../v1/components/toolbar/constants.test.js | 46 +++++++----------- .../src/headless-toolbar/constants.test.ts | 14 ------ .../src/headless-toolbar/constants.ts | 7 --- shared/font-system/src/font-offerings.test.ts | 48 ++++++++++++------- shared/font-system/src/font-offerings.ts | 26 +++------- 7 files changed, 54 insertions(+), 105 deletions(-) diff --git a/packages/sdk/langs/python/pyproject.toml b/packages/sdk/langs/python/pyproject.toml index c03ee5842c..ef24f35839 100644 --- a/packages/sdk/langs/python/pyproject.toml +++ b/packages/sdk/langs/python/pyproject.toml @@ -4,30 +4,18 @@ build-backend = "setuptools.build_meta" [project] name = "superdoc-sdk" -<<<<<<< HEAD version = "1.16.1" -======= -version = "1.16.0" ->>>>>>> origin/main description = "SuperDoc SDK (CLI-backed)" readme = "README.md" requires-python = ">=3.9" license = "AGPL-3.0" authors = [{ name = "SuperDoc" }] dependencies = [ -<<<<<<< HEAD "superdoc-sdk-cli-darwin-arm64==1.16.1; platform_system == 'Darwin' and (platform_machine == 'arm64' or platform_machine == 'aarch64' or platform_machine == 'ARM64')", "superdoc-sdk-cli-darwin-x64==1.16.1; platform_system == 'Darwin' and (platform_machine == 'x86_64' or platform_machine == 'AMD64' or platform_machine == 'amd64')", "superdoc-sdk-cli-linux-x64==1.16.1; platform_system == 'Linux' and (platform_machine == 'x86_64' or platform_machine == 'AMD64' or platform_machine == 'amd64')", "superdoc-sdk-cli-linux-arm64==1.16.1; platform_system == 'Linux' and (platform_machine == 'arm64' or platform_machine == 'aarch64' or platform_machine == 'ARM64')", "superdoc-sdk-cli-windows-x64==1.16.1; platform_system == 'Windows' and (platform_machine == 'x86_64' or platform_machine == 'AMD64' or platform_machine == 'amd64')", -======= - "superdoc-sdk-cli-darwin-arm64==1.16.0; platform_system == 'Darwin' and (platform_machine == 'arm64' or platform_machine == 'aarch64' or platform_machine == 'ARM64')", - "superdoc-sdk-cli-darwin-x64==1.16.0; platform_system == 'Darwin' and (platform_machine == 'x86_64' or platform_machine == 'AMD64' or platform_machine == 'amd64')", - "superdoc-sdk-cli-linux-x64==1.16.0; platform_system == 'Linux' and (platform_machine == 'x86_64' or platform_machine == 'AMD64' or platform_machine == 'amd64')", - "superdoc-sdk-cli-linux-arm64==1.16.0; platform_system == 'Linux' and (platform_machine == 'arm64' or platform_machine == 'aarch64' or platform_machine == 'ARM64')", - "superdoc-sdk-cli-windows-x64==1.16.0; platform_system == 'Windows' and (platform_machine == 'x86_64' or platform_machine == 'AMD64' or platform_machine == 'amd64')", ->>>>>>> origin/main ] [tool.setuptools] diff --git a/packages/super-editor/src/editors/v1/components/toolbar/constants.js b/packages/super-editor/src/editors/v1/components/toolbar/constants.js index 518efe81d1..fc45894db5 100644 --- a/packages/super-editor/src/editors/v1/components/toolbar/constants.js +++ b/packages/super-editor/src/editors/v1/components/toolbar/constants.js @@ -6,15 +6,9 @@ import { } from '@superdoc/font-system'; /** -<<<<<<< HEAD - * Built-in toolbar font dropdown options, derived from the shared font-offering registry - * (`@superdoc/font-system`) instead of a hand-maintained list. The registry owns the conservative - * no-package toolbar baseline. -======= * Build the built-in toolbar font dropdown options for a bundled-font activation, DERIVED from the * shared font-offering registry (`@superdoc/font-system`). Without a configured pack this is the * conservative baseline; with one it is the curated rich set. ->>>>>>> origin/main * * Per `FontConfig`: `label` is the Word-facing logical name (stored on the selection + active-state * match), `key` is the logical CSS stack, and the row preview renders in the physical clone that diff --git a/packages/super-editor/src/editors/v1/components/toolbar/constants.test.js b/packages/super-editor/src/editors/v1/components/toolbar/constants.test.js index b08d9f593b..622c5ab6d5 100644 --- a/packages/super-editor/src/editors/v1/components/toolbar/constants.test.js +++ b/packages/super-editor/src/editors/v1/components/toolbar/constants.test.js @@ -2,11 +2,6 @@ import { describe, expect, it } from 'vitest'; import { FULLY_ACTIVE_BUNDLED } from '@superdoc/font-system'; import { composeToolbarFontOptions, TOOLBAR_FONTS, toolbarFontOptionsFor } from './constants'; -<<<<<<< HEAD -describe('TOOLBAR_FONTS (built-in font dropdown, derived from the font-offering registry)', () => { - it('advertises the conservative no-package baseline, in alphabetical order', () => { - expect(TOOLBAR_FONTS.map((f) => f.label)).toEqual(['Arial', 'Courier New', 'Georgia', 'Times New Roman']); -======= const RICH_LABELS = [ 'Arial', 'Arial Black', @@ -35,23 +30,10 @@ const RICH_LABELS = [ describe('TOOLBAR_FONTS (static built-in font dropdown)', () => { it('is the conservative no-pack baseline: one Word font per CSS generic', () => { expect(TOOLBAR_FONTS.map((f) => f.label)).toEqual(['Arial', 'Courier New', 'Times New Roman']); ->>>>>>> origin/main }); it('does not advertise the rich pack or unsupported fonts in the static default', () => { const labels = new Set(TOOLBAR_FONTS.map((f) => f.label)); -<<<<<<< HEAD - for (const name of [ - 'Aptos', - 'Calibri', - 'Cambria', - 'Calibri Light', - 'Century Schoolbook', - 'Helvetica', - 'Arial MT', - 'Courier', - 'Times', -======= // Georgia is a second serif: a pack-enabled rich option, not part of the one-per-generic baseline. for (const name of [ 'Calibri', @@ -62,7 +44,6 @@ describe('TOOLBAR_FONTS (static built-in font dropdown)', () => { 'Cambria', 'Calibri Light', 'Arial MT', ->>>>>>> origin/main ]) { expect(labels.has(name)).toBe(false); } @@ -81,20 +62,13 @@ describe('toolbarFontOptionsFor (the configured rich set)', () => { }); it('builds a FontConfig: logical label + logical key + physical-clone preview', () => { -<<<<<<< HEAD - const arial = TOOLBAR_FONTS.find((f) => f.label === 'Arial'); - expect(arial).toMatchObject({ - label: 'Arial', // applied to the selection + active-state match (Word-facing name) - key: 'Arial, sans-serif', // logical CSS stack (option identity) -======= const calibri = toolbarFontOptionsFor(FULLY_ACTIVE_BUNDLED).find((f) => f.label === 'Calibri'); expect(calibri).toMatchObject({ label: 'Calibri', // applied to the selection + active-state match (Word-facing name) key: 'Calibri, sans-serif', // logical CSS stack (option identity) ->>>>>>> origin/main fontWeight: 400, props: { - style: { fontFamily: 'Liberation Sans, sans-serif' }, // preview renders in the bundled clone that paints + style: { fontFamily: 'Carlito, sans-serif' }, // preview renders in the bundled clone that paints 'data-item': 'btn-fontFamily-option', }, }); @@ -126,8 +100,6 @@ describe('composeToolbarFontOptions (document fonts unioned with the built-in se 'Apple Chancery', 'Aptos', 'Arial', -<<<<<<< HEAD -======= 'Bangla MN', 'Calibri', 'Courier New', @@ -148,12 +120,26 @@ describe('composeToolbarFontOptions (document fonts unioned with the built-in se 'Arial', 'Arial Black', 'Arial Narrow', ->>>>>>> origin/main 'Bangla MN', + 'Baskerville Old Face', + 'Bookman Old Style', + 'Brush Script MT', 'Calibri', + 'Century', + 'Century Gothic', + 'Comic Sans MS', + 'Cooper Black', 'Courier New', + 'Garamond', 'Georgia', + 'Gill Sans MT Condensed', + 'Helvetica', + 'Lucida Console', + 'Segoe UI', + 'Tahoma', 'Times New Roman', + 'Trebuchet MS', + 'Verdana', ]); expect(options.filter((o) => o.label === 'Calibri')).toHaveLength(1); }); diff --git a/packages/super-editor/src/headless-toolbar/constants.test.ts b/packages/super-editor/src/headless-toolbar/constants.test.ts index 2d25fddfae..d45bd51817 100644 --- a/packages/super-editor/src/headless-toolbar/constants.test.ts +++ b/packages/super-editor/src/headless-toolbar/constants.test.ts @@ -2,18 +2,10 @@ import { describe, expect, it } from 'vitest'; import { DEFAULT_FONT_FAMILY_OPTIONS } from './constants'; describe('DEFAULT_FONT_FAMILY_OPTIONS (headless default font options, derived from the font-offering registry)', () => { -<<<<<<< HEAD - it('advertises the conservative no-package baseline (logical name + logical stack)', () => { - expect(DEFAULT_FONT_FAMILY_OPTIONS).toEqual([ - { label: 'Arial', value: 'Arial, sans-serif' }, - { label: 'Courier New', value: 'Courier New, monospace' }, - { label: 'Georgia', value: 'Georgia, serif' }, -======= it('is the conservative no-pack baseline: one Word font per CSS generic', () => { expect(DEFAULT_FONT_FAMILY_OPTIONS).toEqual([ { label: 'Arial', value: 'Arial, sans-serif' }, { label: 'Courier New', value: 'Courier New, monospace' }, ->>>>>>> origin/main { label: 'Times New Roman', value: 'Times New Roman, serif' }, ]); }); @@ -28,14 +20,8 @@ describe('DEFAULT_FONT_FAMILY_OPTIONS (headless default font options, derived fr expect(labels.has('Verdana')).toBe(false); // Never-default fonts stay absent regardless. expect(labels.has('Aptos')).toBe(false); - expect(labels.has('Calibri')).toBe(false); expect(labels.has('Cambria')).toBe(false); expect(labels.has('Calibri Light')).toBe(false); -<<<<<<< HEAD - expect(labels.has('Helvetica')).toBe(false); - expect(labels.has('Century Schoolbook')).toBe(false); -======= ->>>>>>> origin/main expect(labels.has('Arial MT')).toBe(false); }); }); diff --git a/packages/super-editor/src/headless-toolbar/constants.ts b/packages/super-editor/src/headless-toolbar/constants.ts index 190773cb06..df65e6e917 100644 --- a/packages/super-editor/src/headless-toolbar/constants.ts +++ b/packages/super-editor/src/headless-toolbar/constants.ts @@ -62,12 +62,6 @@ export const DEFAULT_FONT_SIZE_OPTIONS = [ ] as const; /** -<<<<<<< HEAD - * Default headless-toolbar font options, derived from the shared font-offering registry - * (`@superdoc/font-system`) instead of a hand-maintained list. The registry owns the conservative - * no-package toolbar baseline. `label` is the Word-facing logical name (stored/exported); - * `value` is the logical CSS stack applied to the run. -======= * Default headless-toolbar font options, DERIVED from the shared font-offering registry * (`@superdoc/font-system`). This static const is the conservative NO-PACK baseline - one Word font * per CSS generic (Arial, Times New Roman, Courier New) - the floor for a headless toolbar with no @@ -75,7 +69,6 @@ export const DEFAULT_FONT_SIZE_OPTIONS = [ * A headless consumer that wires the bundled pack and wants the curated rich set builds its options * per instance from `getDefaultFontFamilyOptions(deriveBundledActivation(fontsConfig))`. `label` is * the Word-facing logical name (stored/exported); `value` is the logical CSS stack applied to the run. ->>>>>>> origin/main */ export const DEFAULT_FONT_FAMILY_OPTIONS = getDefaultFontFamilyOptions(); diff --git a/shared/font-system/src/font-offerings.test.ts b/shared/font-system/src/font-offerings.test.ts index efdae40ea9..0a9ad4c873 100644 --- a/shared/font-system/src/font-offerings.test.ts +++ b/shared/font-system/src/font-offerings.test.ts @@ -15,7 +15,30 @@ import { SUBSTITUTION_EVIDENCE } from './substitution-evidence'; const EXPECTED_BASELINE = ['Arial', 'Courier New', 'Times New Roman']; const EXPECTED_DEFAULTS = ['Arial', 'Calibri', 'Courier New', 'Helvetica', 'Times New Roman']; -const EXPECTED_BUILT_IN_TOOLBAR = ['Arial', 'Courier New', 'Georgia', 'Times New Roman']; +const EXPECTED_BUILT_IN_TOOLBAR = [ + 'Arial', + 'Arial Black', + 'Arial Narrow', + 'Baskerville Old Face', + 'Bookman Old Style', + 'Brush Script MT', + 'Calibri', + 'Century', + 'Century Gothic', + 'Comic Sans MS', + 'Cooper Black', + 'Courier New', + 'Garamond', + 'Georgia', + 'Gill Sans MT Condensed', + 'Helvetica', + 'Lucida Console', + 'Segoe UI', + 'Tahoma', + 'Times New Roman', + 'Trebuchet MS', + 'Verdana', +]; /** * Must NOT appear as DEFAULT options yet. Aptos has no clone, Cambria/Georgia/Cooper Black/ @@ -67,17 +90,6 @@ describe('font offerings', () => { } }); -<<<<<<< HEAD - it('built-in toolbar offerings use the conservative no-package baseline', () => { - expect(getBuiltInToolbarFontOfferings().map((o) => o.logicalFamily)).toEqual(EXPECTED_BUILT_IN_TOOLBAR); - expect(getBuiltInToolbarFontOfferings().find((o) => o.logicalFamily === 'Georgia')).toMatchObject({ - offering: 'qualified', - verdict: 'near_metric', - bundled: true, - }); - expect(getBuiltInToolbarFontOfferings().some((o) => o.logicalFamily === 'Calibri')).toBe(false); - expect(getBuiltInToolbarFontOfferings().some((o) => o.logicalFamily === 'Helvetica')).toBe(false); -======= it('built-in toolbar offerings default to the conservative no-pack baseline', () => { // No activation (and the explicit BASELINE_BUNDLED) = no pack configured = the baseline (one per generic). expect(getBuiltInToolbarFontOfferings().map((o) => o.logicalFamily)).toEqual(EXPECTED_BASELINE); @@ -108,7 +120,6 @@ describe('font offerings', () => { createBundledActivation({ packConfigured: true, include: ['Calibri', 'Georgia', 'Arial'] }), ).map((o) => o.logicalFamily); expect(included).toEqual(['Arial', 'Calibri', 'Georgia']); ->>>>>>> origin/main }); it('classifies the qualified and category rows distinctly (carried for the later fidelity layer)', () => { @@ -231,8 +242,6 @@ describe('font offerings', () => { it('getDefaultFontFamilyOptions returns the baseline by default (logical label + logical stack)', () => { expect(getDefaultFontFamilyOptions()).toEqual([ { label: 'Arial', value: 'Arial, sans-serif' }, -<<<<<<< HEAD -======= { label: 'Courier New', value: 'Courier New, monospace' }, { label: 'Times New Roman', value: 'Times New Roman, serif' }, ]); @@ -251,10 +260,17 @@ describe('font offerings', () => { { label: 'Century Gothic', value: 'Century Gothic, sans-serif' }, { label: 'Comic Sans MS', value: 'Comic Sans MS, sans-serif' }, { label: 'Cooper Black', value: 'Cooper Black, serif' }, ->>>>>>> origin/main { label: 'Courier New', value: 'Courier New, monospace' }, + { label: 'Garamond', value: 'Garamond, serif' }, { label: 'Georgia', value: 'Georgia, serif' }, + { label: 'Gill Sans MT Condensed', value: 'Gill Sans MT Condensed, sans-serif' }, + { label: 'Helvetica', value: 'Helvetica, sans-serif' }, + { label: 'Lucida Console', value: 'Lucida Console, monospace' }, + { label: 'Segoe UI', value: 'Segoe UI, sans-serif' }, + { label: 'Tahoma', value: 'Tahoma, sans-serif' }, { label: 'Times New Roman', value: 'Times New Roman, serif' }, + { label: 'Trebuchet MS', value: 'Trebuchet MS, sans-serif' }, + { label: 'Verdana', value: 'Verdana, sans-serif' }, ]); }); diff --git a/shared/font-system/src/font-offerings.ts b/shared/font-system/src/font-offerings.ts index fab2c44840..3804290e14 100644 --- a/shared/font-system/src/font-offerings.ts +++ b/shared/font-system/src/font-offerings.ts @@ -54,11 +54,6 @@ export interface FontOffering { const BUNDLED_FAMILIES: ReadonlySet = new Set(BUNDLED_MANIFEST.map((f) => f.family)); const SUPPORTED_ALIAS_FAMILIES: ReadonlySet = new Set(['Arial MT', 'Courier', 'Times']); -<<<<<<< HEAD -const BUILT_IN_TOOLBAR_BASELINE_FAMILIES: ReadonlySet = new Set([ - 'Arial', - 'Courier New', -======= /** * The conservative toolbar baseline shown when the bundled pack is NOT configured: one common @@ -85,9 +80,13 @@ const ADVERTISED_BUILT_IN_TOOLBAR_FAMILIES: ReadonlySet = new Set([ 'Cooper Black', 'Comic Sans MS', 'Garamond', ->>>>>>> origin/main 'Georgia', - 'Times New Roman', + 'Gill Sans MT Condensed', + 'Lucida Console', + 'Segoe UI', + 'Tahoma', + 'Trebuchet MS', + 'Verdana', ]); /** Classify one evidence row by its policy action, verdict, and whether its target is bundled. */ @@ -145,18 +144,6 @@ export function getDefaultFontOfferings(): FontOffering[] { } /** -<<<<<<< HEAD - * Built-in font picker options shown without any customer font configuration. - * - * AIDEV-NOTE: Keep this SD-3441 toolbar baseline conservative while the optional - * font-pack selection UX is settled. Documents still resolve the full reviewed - * substitute table through the resolver. - */ -export function getBuiltInToolbarFontOfferings(): FontOffering[] { - return FONT_OFFERINGS.filter((o) => o.bundled && BUILT_IN_TOOLBAR_BASELINE_FAMILIES.has(o.logicalFamily)).sort( - compareLogicalFamily, - ); -======= * Built-in font picker options for a document, gated on its bundled-font {@link BundledActivation}: * * - pack NOT configured (the default): the conservative {@link BUILT_IN_TOOLBAR_BASELINE_FAMILIES} @@ -183,7 +170,6 @@ export function getBuiltInToolbarFontOfferings(activation: BundledActivation = B (o.offering === 'qualified' || o.offering === 'category_fallback'))) && activation.isActive(o.logicalFamily), ).sort(compareLogicalFamily); ->>>>>>> origin/main } /** The logical CSS stack stored/applied when an offering is chosen, e.g. "Calibri, sans-serif". */ From 30cd343591f30b28f2aa4642a1480b18cb10b935 Mon Sep 17 00:00:00 2001 From: Caio Pizzol Date: Sun, 14 Jun 2026 20:20:25 -0300 Subject: [PATCH 17/59] fix: update font dropdown behavior expectations --- .../font-dropdown-document-options.spec.ts | 51 ++++++++++++------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/tests/behavior/tests/toolbar/font-dropdown-document-options.spec.ts b/tests/behavior/tests/toolbar/font-dropdown-document-options.spec.ts index c2362e5f38..52946ad67e 100644 --- a/tests/behavior/tests/toolbar/font-dropdown-document-options.spec.ts +++ b/tests/behavior/tests/toolbar/font-dropdown-document-options.spec.ts @@ -5,7 +5,30 @@ test.use({ config: { toolbar: 'full', showSelection: true } }); const FONT_OPTION = '[data-item="btn-fontFamily-option"]'; const FONT_TOGGLE = '[data-item="btn-fontFamily-toggle"]'; const OPTION_LABEL = `${FONT_OPTION} .toolbar-dropdown-option__label`; -const DEFAULT_FONT_LABELS = ['Arial', 'Courier New', 'Georgia', 'Times New Roman']; +const DEFAULT_FONT_LABELS = [ + 'Arial', + 'Arial Black', + 'Arial Narrow', + 'Baskerville Old Face', + 'Bookman Old Style', + 'Brush Script MT', + 'Calibri', + 'Century', + 'Century Gothic', + 'Comic Sans MS', + 'Cooper Black', + 'Courier New', + 'Garamond', + 'Georgia', + 'Gill Sans MT Condensed', + 'Helvetica', + 'Lucida Console', + 'Segoe UI', + 'Tahoma', + 'Times New Roman', + 'Trebuchet MS', + 'Verdana', +]; function expectedLabelsWithDocumentFonts(documentLabels: string[]): string[] { return Array.from(new Set([...DEFAULT_FONT_LABELS, ...documentLabels])).sort((left, right) => @@ -87,17 +110,7 @@ test('font dropdown opens immediately with the built-in font list and an enabled const labels = await fontOptionLabels(superdoc); expect(labels).toEqual(DEFAULT_FONT_LABELS); - for (const absent of [ - 'Aptos', - 'Calibri', - 'Cambria', - 'Calibri Light', - 'Century Schoolbook', - 'Helvetica', - 'Arial MT', - 'Courier', - 'Times', - ]) { + for (const absent of ['Aptos', 'Cambria', 'Calibri Light', 'Century Schoolbook', 'Arial MT', 'Courier', 'Times']) { expect(labels).not.toContain(absent); } }); @@ -111,10 +124,10 @@ test('selecting a default font applies its logical Word-facing family to the sel await superdoc.waitForStable(); await openFontFamilyDropdown(superdoc); - await selectFontOption(superdoc, 'Georgia'); + await selectFontOption(superdoc, 'Helvetica'); - await expect(superdoc.page.locator('[data-item="btn-fontFamily"] .sd-button-label')).toHaveText('Georgia'); - await superdoc.assertTextMarkAttrs('Default font sample', 'textStyle', { fontFamily: 'Georgia' }); + await expect(superdoc.page.locator('[data-item="btn-fontFamily"] .sd-button-label')).toHaveText('Helvetica'); + await superdoc.assertTextMarkAttrs('Default font sample', 'textStyle', { fontFamily: 'Helvetica' }); }); test('typing in the font combobox applies to the selected text without opening the list', async ({ superdoc }) => { @@ -176,14 +189,14 @@ test('tabbing through font family and size preserves formatting when all text is await superdoc.waitForStable(); await replaceSelectionThroughFontInputs(superdoc, { - fontPrefix: 'geo', + fontPrefix: 'cal', fontSize: '20', replacement: 'done', }); await superdoc.assertTextContent('done'); await superdoc.assertTextMarkAttrs('done', 'textStyle', { - fontFamily: 'Georgia', + fontFamily: 'Calibri', fontSize: '20pt', }); }); @@ -202,14 +215,14 @@ test('pressing Enter in the font combobox preserves formatting when all text is await fontInput.click(); await expectFontFamilyDropdownClosed(superdoc); - await superdoc.page.keyboard.type('geo'); + await superdoc.page.keyboard.type('cal'); await superdoc.page.keyboard.press('Enter'); await superdoc.page.keyboard.type('done'); await superdoc.waitForStable(); await superdoc.assertTextContent('done'); await superdoc.assertTextMarkAttrs('done', 'textStyle', { - fontFamily: 'Georgia', + fontFamily: 'Calibri', }); }); From 90be5e81f52f2778b20d2f0ca025c74dfe3df3eb Mon Sep 17 00:00:00 2001 From: Caio Pizzol Date: Sun, 14 Jun 2026 20:46:21 -0300 Subject: [PATCH 18/59] fix: align font option tests with rich pack --- .../src/document-font-options.test.ts | 27 +++++++++++++++++++ .../font-system/src/document-font-options.ts | 8 +++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/shared/font-system/src/document-font-options.test.ts b/shared/font-system/src/document-font-options.test.ts index ddbd1b096e..b542c0ce69 100644 --- a/shared/font-system/src/document-font-options.test.ts +++ b/shared/font-system/src/document-font-options.test.ts @@ -144,17 +144,44 @@ describe('buildFontFamilyOptions (custom UI font picker rows)', () => { expect(options.every((option) => !('status' in option))).toBe(true); }); + it('baseline built-in rows preview in the logical family; configured rows preview in the physical clone', () => { + // In baseline the physical clone (e.g. Liberation Serif) is neither registered nor served, so the + // row must preview in the logical family that actually renders - not the clone. + const baselineTnr = buildFontFamilyOptions([], BASELINE_BUNDLED).find((o) => o.label === 'Times New Roman'); + expect(baselineTnr?.previewFamily).toBe('Times New Roman'); + // With the pack configured the clone is served, so the preview uses the physical clone. + const richTnr = buildFontFamilyOptions([], FULLY_ACTIVE_BUNDLED).find((o) => o.label === 'Times New Roman'); + expect(richTnr?.previewFamily).not.toBe('Times New Roman'); + }); + it('with the pack configured: the full built-in set plus document fonts', () => { const options = buildFontFamilyOptions(documentOptions, FULLY_ACTIVE_BUNDLED); expect(options.map((option) => option.label)).toEqual([ 'Apple Chancery', 'Aptos', 'Arial', + 'Arial Black', + 'Arial Narrow', 'Bangla MN', + 'Baskerville Old Face', + 'Bookman Old Style', + 'Brush Script MT', 'Calibri', + 'Century', + 'Century Gothic', + 'Comic Sans MS', + 'Cooper Black', 'Courier New', + 'Garamond', 'Georgia', + 'Gill Sans MT Condensed', + 'Helvetica', + 'Lucida Console', + 'Segoe UI', + 'Tahoma', 'Times New Roman', + 'Trebuchet MS', + 'Verdana', ]); expect(options.filter((option) => option.label === 'Calibri')).toHaveLength(1); }); diff --git a/shared/font-system/src/document-font-options.ts b/shared/font-system/src/document-font-options.ts index bbd0b0767f..25ee2e3b4b 100644 --- a/shared/font-system/src/document-font-options.ts +++ b/shared/font-system/src/document-font-options.ts @@ -102,10 +102,16 @@ export function buildFontFamilyOptions( const key = normalizeKey(offering.logicalFamily); if (seen.has(key)) continue; seen.add(key); + // Preview in the physical clone (e.g. Carlito) only when the pack is configured and thus served. + // In baseline the clone is neither registered nor served, so previewing in it would render a + // generic fallback that misrepresents the painted text - use the logical family that renders. + const previewFamily = activation.packConfigured + ? offering.physicalFamily || offering.logicalFamily + : offering.logicalFamily; options.push({ label: offering.logicalFamily, value: offering.logicalFamily, - previewFamily: offering.physicalFamily || offering.logicalFamily, + previewFamily, }); } for (const option of documentOptions) { From 5796b6e111360542d771372a25d15d8c2e200c10 Mon Sep 17 00:00:00 2001 From: Caio Pizzol Date: Mon, 15 Jun 2026 09:59:15 -0300 Subject: [PATCH 19/59] fix: update ui font option expectations --- .../src/ui/create-super-doc-ui.test.ts | 68 ++++++++++++++++++- 1 file changed, 66 insertions(+), 2 deletions(-) diff --git a/packages/super-editor/src/ui/create-super-doc-ui.test.ts b/packages/super-editor/src/ui/create-super-doc-ui.test.ts index e3b20aa3ec..de7b9658d3 100644 --- a/packages/super-editor/src/ui/create-super-doc-ui.test.ts +++ b/packages/super-editor/src/ui/create-super-doc-ui.test.ts @@ -178,11 +178,28 @@ describe('createSuperDocUI', () => { expect(options.map((option) => option.label)).toEqual([ 'Aptos', 'Arial', + 'Arial Black', + 'Arial Narrow', 'Bangla MN', + 'Baskerville Old Face', + 'Bookman Old Style', + 'Brush Script MT', 'Calibri', + 'Century', + 'Century Gothic', + 'Comic Sans MS', + 'Cooper Black', 'Courier New', + 'Garamond', 'Georgia', + 'Gill Sans MT Condensed', + 'Helvetica', + 'Lucida Console', + 'Segoe UI', + 'Tahoma', 'Times New Roman', + 'Trebuchet MS', + 'Verdana', ]); expect(options.find((option) => option.label === 'Aptos')).toEqual({ label: 'Aptos', @@ -224,8 +241,55 @@ describe('createSuperDocUI', () => { superdoc.fireSuperdoc('fonts-changed'); await flushMicrotasks(); - expect(observed.at(0)).toEqual(['Arial', 'Courier New', 'Georgia', 'Times New Roman']); - expect(observed.at(-1)).toEqual(['Aptos', 'Arial', 'Courier New', 'Georgia', 'Times New Roman']); + expect(observed.at(0)).toEqual([ + 'Arial', + 'Arial Black', + 'Arial Narrow', + 'Baskerville Old Face', + 'Bookman Old Style', + 'Brush Script MT', + 'Calibri', + 'Century', + 'Century Gothic', + 'Comic Sans MS', + 'Cooper Black', + 'Courier New', + 'Garamond', + 'Georgia', + 'Gill Sans MT Condensed', + 'Helvetica', + 'Lucida Console', + 'Segoe UI', + 'Tahoma', + 'Times New Roman', + 'Trebuchet MS', + 'Verdana', + ]); + expect(observed.at(-1)).toEqual([ + 'Aptos', + 'Arial', + 'Arial Black', + 'Arial Narrow', + 'Baskerville Old Face', + 'Bookman Old Style', + 'Brush Script MT', + 'Calibri', + 'Century', + 'Century Gothic', + 'Comic Sans MS', + 'Cooper Black', + 'Courier New', + 'Garamond', + 'Georgia', + 'Gill Sans MT Condensed', + 'Helvetica', + 'Lucida Console', + 'Segoe UI', + 'Tahoma', + 'Times New Roman', + 'Trebuchet MS', + 'Verdana', + ]); }); it('refreshes ui.fonts for delimiter-colliding font names', async () => { From e9eb179a7f8ff2b5d4692b077832ccef33dd99f3 Mon Sep 17 00:00:00 2001 From: Caio Pizzol Date: Mon, 15 Jun 2026 10:23:34 -0300 Subject: [PATCH 20/59] fix: avoid contract demo rebuild on dev --- demos/contract-templates/package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/demos/contract-templates/package.json b/demos/contract-templates/package.json index 42ce1e50bb..149f7377a8 100644 --- a/demos/contract-templates/package.json +++ b/demos/contract-templates/package.json @@ -3,7 +3,6 @@ "private": true, "type": "module", "scripts": { - "predev": "pnpm --filter superdoc build", "dev": "vite", "build": "tsc --noEmit && vite build", "preview": "vite preview" From d8c70b1bfd1a2271dd2d88a105f39fef4e104b01 Mon Sep 17 00:00:00 2001 From: Caio Pizzol Date: Mon, 15 Jun 2026 11:18:44 -0300 Subject: [PATCH 21/59] fix: update react font hook expectations --- .../super-editor/src/ui/react/hooks.test.tsx | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/packages/super-editor/src/ui/react/hooks.test.tsx b/packages/super-editor/src/ui/react/hooks.test.tsx index 4a5bdab11e..36e54ed1f3 100644 --- a/packages/super-editor/src/ui/react/hooks.test.tsx +++ b/packages/super-editor/src/ui/react/hooks.test.tsx @@ -192,9 +192,27 @@ describe('domain hooks', () => { expect(options?.map((option) => option.label)).toEqual([ 'Aptos', 'Arial', + 'Arial Black', + 'Arial Narrow', + 'Baskerville Old Face', + 'Bookman Old Style', + 'Brush Script MT', + 'Calibri', + 'Century', + 'Century Gothic', + 'Comic Sans MS', + 'Cooper Black', 'Courier New', + 'Garamond', 'Georgia', + 'Gill Sans MT Condensed', + 'Helvetica', + 'Lucida Console', + 'Segoe UI', + 'Tahoma', 'Times New Roman', + 'Trebuchet MS', + 'Verdana', ]); expect(options?.find((option) => option.label === 'Aptos')).toEqual({ label: 'Aptos', From 32624be249c3d81fd9da6394c40a0d407e374a70 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 15 Jun 2026 16:08:27 +0000 Subject: [PATCH 22/59] chore(cli): 0.18.0 [skip ci] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### 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. --- apps/cli/package.json | 2 +- apps/cli/platforms/cli-darwin-arm64/package.json | 2 +- apps/cli/platforms/cli-darwin-x64/package.json | 2 +- apps/cli/platforms/cli-linux-arm64/package.json | 2 +- apps/cli/platforms/cli-linux-x64/package.json | 2 +- apps/cli/platforms/cli-windows-x64/package.json | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/cli/package.json b/apps/cli/package.json index e2a0e4ef85..bd0c629514 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/cli", - "version": "0.17.1", + "version": "0.18.0", "type": "module", "bin": { "superdoc": "./dist/index.js" diff --git a/apps/cli/platforms/cli-darwin-arm64/package.json b/apps/cli/platforms/cli-darwin-arm64/package.json index 93275b8134..e968dfe24b 100644 --- a/apps/cli/platforms/cli-darwin-arm64/package.json +++ b/apps/cli/platforms/cli-darwin-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/cli-darwin-arm64", - "version": "0.17.1", + "version": "0.18.0", "os": [ "darwin" ], diff --git a/apps/cli/platforms/cli-darwin-x64/package.json b/apps/cli/platforms/cli-darwin-x64/package.json index 25925369b3..b30aa2145a 100644 --- a/apps/cli/platforms/cli-darwin-x64/package.json +++ b/apps/cli/platforms/cli-darwin-x64/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/cli-darwin-x64", - "version": "0.17.1", + "version": "0.18.0", "os": [ "darwin" ], diff --git a/apps/cli/platforms/cli-linux-arm64/package.json b/apps/cli/platforms/cli-linux-arm64/package.json index b38dc2b9dd..957f33a36a 100644 --- a/apps/cli/platforms/cli-linux-arm64/package.json +++ b/apps/cli/platforms/cli-linux-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/cli-linux-arm64", - "version": "0.17.1", + "version": "0.18.0", "os": [ "linux" ], diff --git a/apps/cli/platforms/cli-linux-x64/package.json b/apps/cli/platforms/cli-linux-x64/package.json index 04bbd68ab6..d2f8410a36 100644 --- a/apps/cli/platforms/cli-linux-x64/package.json +++ b/apps/cli/platforms/cli-linux-x64/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/cli-linux-x64", - "version": "0.17.1", + "version": "0.18.0", "os": [ "linux" ], diff --git a/apps/cli/platforms/cli-windows-x64/package.json b/apps/cli/platforms/cli-windows-x64/package.json index 595b1b880e..12e5c5bb91 100644 --- a/apps/cli/platforms/cli-windows-x64/package.json +++ b/apps/cli/platforms/cli-windows-x64/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/cli-windows-x64", - "version": "0.17.1", + "version": "0.18.0", "os": [ "win32" ], From 74cfa3d61b3815f20729a3ea8fafc56c9b219516 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 15 Jun 2026 16:14:27 +0000 Subject: [PATCH 23/59] chore(sdk): 1.17.0 [skip ci] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### 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. --- packages/sdk/langs/node/package.json | 2 +- .../node/platforms/sdk-darwin-arm64/package.json | 2 +- .../langs/node/platforms/sdk-darwin-x64/package.json | 2 +- .../node/platforms/sdk-linux-arm64/package.json | 2 +- .../langs/node/platforms/sdk-linux-x64/package.json | 2 +- .../node/platforms/sdk-windows-x64/package.json | 2 +- .../superdoc-sdk-cli-darwin-arm64/pyproject.toml | 2 +- .../superdoc-sdk-cli-darwin-x64/pyproject.toml | 2 +- .../superdoc-sdk-cli-linux-arm64/pyproject.toml | 2 +- .../superdoc-sdk-cli-linux-x64/pyproject.toml | 2 +- .../superdoc-sdk-cli-windows-x64/pyproject.toml | 2 +- packages/sdk/langs/python/pyproject.toml | 12 ++++++------ packages/sdk/package.json | 2 +- packages/sdk/version.json | 2 +- 14 files changed, 19 insertions(+), 19 deletions(-) diff --git a/packages/sdk/langs/node/package.json b/packages/sdk/langs/node/package.json index 97750d6e45..95d581319b 100644 --- a/packages/sdk/langs/node/package.json +++ b/packages/sdk/langs/node/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/sdk", - "version": "1.16.1", + "version": "1.17.0", "private": false, "type": "module", "main": "./dist/index.cjs", diff --git a/packages/sdk/langs/node/platforms/sdk-darwin-arm64/package.json b/packages/sdk/langs/node/platforms/sdk-darwin-arm64/package.json index 762b928329..65dbcc8afb 100644 --- a/packages/sdk/langs/node/platforms/sdk-darwin-arm64/package.json +++ b/packages/sdk/langs/node/platforms/sdk-darwin-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/sdk-darwin-arm64", - "version": "1.16.1", + "version": "1.17.0", "os": [ "darwin" ], diff --git a/packages/sdk/langs/node/platforms/sdk-darwin-x64/package.json b/packages/sdk/langs/node/platforms/sdk-darwin-x64/package.json index b14ffc5edc..45b3cf1aca 100644 --- a/packages/sdk/langs/node/platforms/sdk-darwin-x64/package.json +++ b/packages/sdk/langs/node/platforms/sdk-darwin-x64/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/sdk-darwin-x64", - "version": "1.16.1", + "version": "1.17.0", "os": [ "darwin" ], diff --git a/packages/sdk/langs/node/platforms/sdk-linux-arm64/package.json b/packages/sdk/langs/node/platforms/sdk-linux-arm64/package.json index 30b34627ce..eedce9b981 100644 --- a/packages/sdk/langs/node/platforms/sdk-linux-arm64/package.json +++ b/packages/sdk/langs/node/platforms/sdk-linux-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/sdk-linux-arm64", - "version": "1.16.1", + "version": "1.17.0", "os": [ "linux" ], diff --git a/packages/sdk/langs/node/platforms/sdk-linux-x64/package.json b/packages/sdk/langs/node/platforms/sdk-linux-x64/package.json index 1935f3523d..f7cdeb6c82 100644 --- a/packages/sdk/langs/node/platforms/sdk-linux-x64/package.json +++ b/packages/sdk/langs/node/platforms/sdk-linux-x64/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/sdk-linux-x64", - "version": "1.16.1", + "version": "1.17.0", "os": [ "linux" ], diff --git a/packages/sdk/langs/node/platforms/sdk-windows-x64/package.json b/packages/sdk/langs/node/platforms/sdk-windows-x64/package.json index 09824a53db..0c2bf6d74d 100644 --- a/packages/sdk/langs/node/platforms/sdk-windows-x64/package.json +++ b/packages/sdk/langs/node/platforms/sdk-windows-x64/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/sdk-windows-x64", - "version": "1.16.1", + "version": "1.17.0", "os": [ "win32" ], diff --git a/packages/sdk/langs/python/platforms/superdoc-sdk-cli-darwin-arm64/pyproject.toml b/packages/sdk/langs/python/platforms/superdoc-sdk-cli-darwin-arm64/pyproject.toml index 89abf06638..5422fbbce4 100644 --- a/packages/sdk/langs/python/platforms/superdoc-sdk-cli-darwin-arm64/pyproject.toml +++ b/packages/sdk/langs/python/platforms/superdoc-sdk-cli-darwin-arm64/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "superdoc-sdk-cli-darwin-arm64" -version = "1.16.1" +version = "1.17.0" description = "SuperDoc CLI binary for macOS ARM64 (Apple Silicon)" readme = "README.md" requires-python = ">=3.9" diff --git a/packages/sdk/langs/python/platforms/superdoc-sdk-cli-darwin-x64/pyproject.toml b/packages/sdk/langs/python/platforms/superdoc-sdk-cli-darwin-x64/pyproject.toml index 2a6c964ab0..2539f6f502 100644 --- a/packages/sdk/langs/python/platforms/superdoc-sdk-cli-darwin-x64/pyproject.toml +++ b/packages/sdk/langs/python/platforms/superdoc-sdk-cli-darwin-x64/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "superdoc-sdk-cli-darwin-x64" -version = "1.16.1" +version = "1.17.0" description = "SuperDoc CLI binary for macOS x64 (Intel)" readme = "README.md" requires-python = ">=3.9" diff --git a/packages/sdk/langs/python/platforms/superdoc-sdk-cli-linux-arm64/pyproject.toml b/packages/sdk/langs/python/platforms/superdoc-sdk-cli-linux-arm64/pyproject.toml index 7438c5f1bd..200d2efeae 100644 --- a/packages/sdk/langs/python/platforms/superdoc-sdk-cli-linux-arm64/pyproject.toml +++ b/packages/sdk/langs/python/platforms/superdoc-sdk-cli-linux-arm64/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "superdoc-sdk-cli-linux-arm64" -version = "1.16.1" +version = "1.17.0" description = "SuperDoc CLI binary for Linux ARM64" readme = "README.md" requires-python = ">=3.9" diff --git a/packages/sdk/langs/python/platforms/superdoc-sdk-cli-linux-x64/pyproject.toml b/packages/sdk/langs/python/platforms/superdoc-sdk-cli-linux-x64/pyproject.toml index a6d674b94f..b802ab4c67 100644 --- a/packages/sdk/langs/python/platforms/superdoc-sdk-cli-linux-x64/pyproject.toml +++ b/packages/sdk/langs/python/platforms/superdoc-sdk-cli-linux-x64/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "superdoc-sdk-cli-linux-x64" -version = "1.16.1" +version = "1.17.0" description = "SuperDoc CLI binary for Linux x64" readme = "README.md" requires-python = ">=3.9" diff --git a/packages/sdk/langs/python/platforms/superdoc-sdk-cli-windows-x64/pyproject.toml b/packages/sdk/langs/python/platforms/superdoc-sdk-cli-windows-x64/pyproject.toml index 5cb0ad03bb..287c24f543 100644 --- a/packages/sdk/langs/python/platforms/superdoc-sdk-cli-windows-x64/pyproject.toml +++ b/packages/sdk/langs/python/platforms/superdoc-sdk-cli-windows-x64/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "superdoc-sdk-cli-windows-x64" -version = "1.16.1" +version = "1.17.0" description = "SuperDoc CLI binary for Windows x64" readme = "README.md" requires-python = ">=3.9" diff --git a/packages/sdk/langs/python/pyproject.toml b/packages/sdk/langs/python/pyproject.toml index ef24f35839..f787ad6459 100644 --- a/packages/sdk/langs/python/pyproject.toml +++ b/packages/sdk/langs/python/pyproject.toml @@ -4,18 +4,18 @@ build-backend = "setuptools.build_meta" [project] name = "superdoc-sdk" -version = "1.16.1" +version = "1.17.0" description = "SuperDoc SDK (CLI-backed)" readme = "README.md" requires-python = ">=3.9" license = "AGPL-3.0" authors = [{ name = "SuperDoc" }] dependencies = [ - "superdoc-sdk-cli-darwin-arm64==1.16.1; platform_system == 'Darwin' and (platform_machine == 'arm64' or platform_machine == 'aarch64' or platform_machine == 'ARM64')", - "superdoc-sdk-cli-darwin-x64==1.16.1; platform_system == 'Darwin' and (platform_machine == 'x86_64' or platform_machine == 'AMD64' or platform_machine == 'amd64')", - "superdoc-sdk-cli-linux-x64==1.16.1; platform_system == 'Linux' and (platform_machine == 'x86_64' or platform_machine == 'AMD64' or platform_machine == 'amd64')", - "superdoc-sdk-cli-linux-arm64==1.16.1; platform_system == 'Linux' and (platform_machine == 'arm64' or platform_machine == 'aarch64' or platform_machine == 'ARM64')", - "superdoc-sdk-cli-windows-x64==1.16.1; platform_system == 'Windows' and (platform_machine == 'x86_64' or platform_machine == 'AMD64' or platform_machine == 'amd64')", + "superdoc-sdk-cli-darwin-arm64==1.17.0; platform_system == 'Darwin' and (platform_machine == 'arm64' or platform_machine == 'aarch64' or platform_machine == 'ARM64')", + "superdoc-sdk-cli-darwin-x64==1.17.0; platform_system == 'Darwin' and (platform_machine == 'x86_64' or platform_machine == 'AMD64' or platform_machine == 'amd64')", + "superdoc-sdk-cli-linux-x64==1.17.0; platform_system == 'Linux' and (platform_machine == 'x86_64' or platform_machine == 'AMD64' or platform_machine == 'amd64')", + "superdoc-sdk-cli-linux-arm64==1.17.0; platform_system == 'Linux' and (platform_machine == 'arm64' or platform_machine == 'aarch64' or platform_machine == 'ARM64')", + "superdoc-sdk-cli-windows-x64==1.17.0; platform_system == 'Windows' and (platform_machine == 'x86_64' or platform_machine == 'AMD64' or platform_machine == 'amd64')", ] [tool.setuptools] diff --git a/packages/sdk/package.json b/packages/sdk/package.json index e9bda569c3..3891cf089b 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/sdk-workspace", - "version": "1.16.1", + "version": "1.17.0", "private": true, "type": "module", "scripts": { diff --git a/packages/sdk/version.json b/packages/sdk/version.json index be0f037e15..d56d8e8b70 100644 --- a/packages/sdk/version.json +++ b/packages/sdk/version.json @@ -1,3 +1,3 @@ { - "sdkVersion": "1.16.1" + "sdkVersion": "1.17.0" } From 7549a8f574d2c9e4c2c1794850e8fc2470ff2ea4 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 15 Jun 2026 16:18:33 +0000 Subject: [PATCH 24/59] chore(mcp): 0.13.0 [skip ci] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### 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 reviewed 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 curation 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. --- apps/mcp/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/mcp/package.json b/apps/mcp/package.json index e935800a09..cb1a137362 100644 --- a/apps/mcp/package.json +++ b/apps/mcp/package.json @@ -1,6 +1,6 @@ { "name": "@superdoc-dev/mcp", - "version": "0.12.1", + "version": "0.13.0", "type": "module", "engines": { "node": ">=20" From 806dca10e4d153a2953515d82f59637af2fc32ed Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 15 Jun 2026 16:20:20 +0000 Subject: [PATCH 25/59] chore(fonts): 0.1.1 [skip ci] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Based on my analysis of the changes in this release, here are the release notes: ### What's New - **@superdoc-dev/fonts is now the only bundled font source** — The fonts package is now the single recommended way to load metric-compatible fallbacks. The core `superdoc` package no longer ships or bundles fonts. ### Improvements - **Simplified fonts API** — Pass `superdocFonts` directly to SuperDoc's config, or use `createSuperDocFonts({ include, exclude })` to curate which families you need. - **CDN build is baseline-by-default** — The CDN/`