test: add consumer type checks for theme exports and preset theme validation#2469
Merged
caio-pizzol merged 2 commits intoartem/css-vars-themingfrom Mar 19, 2026
Merged
Conversation
Contributor
caio-pizzol
commented
Mar 19, 2026
- Add createTheme/buildTheme imports to consumer-types smoke test so broken .d.ts exports are caught during CI
- Add preset theme structural validation to compat.test.ts: verifies all three presets exist and every variable they declare is defined in variables.css
…idation - Add createTheme/buildTheme imports to consumer-types smoke test so broken .d.ts exports are caught during CI - Add preset theme structural validation to compat.test.ts: verifies all three presets exist and every variable they declare is defined in variables.css
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 9b45db3c1d
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
…n mismatch `type X = never` compiles without error, so the previous assertions were no-ops. `AssertExtends<false>` violates the `extends true` constraint and produces a real compile error.
caio-pizzol
added a commit
that referenced
this pull request
Mar 19, 2026
…idation (#2469) * test: add consumer type checks for theme exports and preset theme validation - Add createTheme/buildTheme imports to consumer-types smoke test so broken .d.ts exports are caught during CI - Add preset theme structural validation to compat.test.ts: verifies all three presets exist and every variable they declare is defined in variables.css * fix(test): use constrained generic so type assertions actually fail on mismatch `type X = never` compiles without error, so the previous assertions were no-ops. `AssertExtends<false>` violates the `extends true` constraint and produces a real compile error.
caio-pizzol
added a commit
that referenced
this pull request
Mar 19, 2026
* feat: css vars theming * fix: add backward compat aliases, fix hardcoded values, add theming docs (#2441) * fix: add backward compat aliases, fix hardcoded values, add theming docs - Add compat.css with aliases mapping old CSS variable names to new ones (prevents breaking change for customers using --sd-comment-*, --sd-track-*, etc.) - Fix hardcoded #ffffff in CommentDialog.vue input backgrounds (use token) - Fix hardcoded #dbdbdb in CommentHeader.vue hover (use token) - Add --sd-ui-comments-panel-input-background token to variables.css and neon-night theme - Extract cssToken() helper in renderer.ts to eliminate fallback duplication - Simplify applyDevTheme() to single template literal - Add theming overview page (getting-started/theming.mdx) - Add custom themes guide with full per-component variable reference - Add CSS variable migration guide with old-to-new mapping table * fix: wire CSS variable cascade so semantic tier changes propagate to all components Component-specific variables (dropdown, context menu, comments panel, content controls, layout) now reference semantic-tier variables instead of hardcoding hex values. This means setting --sd-ui-surface, --sd-ui-text, --sd-ui-border, --sd-ui-action, and --sd-ui-font-family cascades through every component automatically. Shadows and intentional deviations (tooltip inverse palette, comment card tint, highlight colors) remain component-specific. * refactor: rename CSS variables for consistency and DX Standardize naming convention across all CSS variables: - surface/background → bg (consistent property naming) - context-menu → menu (shorter, no disambiguation needed) - comments-panel → comments (drop redundant -panel-) - State placement: standardize to {state}-{property} pattern (e.g., dropdown-hover-bg not dropdown-surface-hover) Average variable name length drops from ~42 to ~28 chars. 62 variables renamed across 29 files. Backward compat aliases in compat.css already point old (pre-PR) names to new names. * docs: rewrite theming docs to match CLAUDE.md voice and style guidelines - Sentence case headings throughout - Developer register: show code first, explain after - "You" framing, short sentences, no buzzwords - Getting Started page is high-level overview, links to detail - Custom themes guide: resolved default values (not var() refs), "inherits X" for cascading vars, scannable tables - Migration guide: tighter tables, less prose - Remove Tips/Warnings from Getting Started page per page depth rules * fix: add tokens to link popover and comment action buttons - LinkInput: title text, input icon, high-contrast mode, and submit button now use --sd-ui-* tokens instead of hardcoded colors - CommentDialog: reply button text and cancel button use tokens * test: add tests for cssToken helper and compat alias integrity - Extract cssToken() to css-token.ts for testability - Test that cssToken builds correct var() strings with synced fallbacks - Test that every compat alias points to a variable defined in variables.css - Test that compat doesn't re-declare any variable from variables.css - Test key old→new mappings (comment-bg, surface-card, track-insert, etc.) * fix(docs): theme class must be on <html>, not any wrapper element Some SuperDoc elements (popovers, dropdowns) are appended to <body>, so they only inherit CSS variables from <html>. * fix: make old CSS variable overrides actually work (two-way compat) The compat aliases were one-way: setting --sd-comment-bg on a wrapper had no effect because components read --sd-ui-comments-card-bg directly. Fix: new tokens in variables.css now fall back to old names via var(): --sd-ui-comments-card-bg: var(--sd-comment-bg, #f3f6fd); CSS resolves var() at computed-value time, so customer overrides of old names propagate automatically. Setting the new name still works too — it overrides the whole expression. compat.css is trimmed to only aliases where the old name maps to a different concept (no direct fallback possible). All 1:1 renames are handled by the fallbacks in variables.css. * docs: update migration guide to reflect two-way compat mechanism The compat approach changed from one-way aliases in compat.css to var() fallbacks in variables.css. Updated the explanation and code examples. * feat: add createTheme() and buildTheme() helpers for JS-based theming createTheme() takes a typed config object and returns a CSS class name. Apply it to <html> to theme the entire UI. Maps a small set of high-level options (colors, font, radius) to the full CSS variable system. - colors: action, bg, text, border cascade to every component - Component overrides: toolbar, dropdown, menu, comments, highlights, etc. - buildTheme() returns { className, css } for SSR - Style element auto-injected, idempotent on re-call with same name - Exported from superdoc package: import { createTheme } from 'superdoc' - 11 unit tests - Docs updated to lead with createTheme(), CSS variables as advanced option * Revert "feat: add createTheme() and buildTheme() helpers for JS-based theming" This reverts commit 2bf71ff. * feat(theme): add createTheme() and buildTheme() helpers (SD-2255) (#2445) * feat(theme): add createTheme() and buildTheme() helpers (SD-2255) Shadcn-inspired JS theming API. Set ~10 semantic color properties and the entire UI updates. A `vars` escape hatch covers any CSS variable not in the semantic layer. API: createTheme({ colors, font, radius, shadow, vars }) → className buildTheme(config) → { className, css } (for SSR) - colors: action, bg, text, border, etc. map to --sd-ui-* variables - font/radius/shadow: top-level shortcuts - vars: raw CSS variable overrides for power users - Style element auto-injected, idempotent on re-call - Exported from superdoc package - 17 unit tests * refactor(theme): extract generateTheme() to eliminate _lastCss side-channel buildTheme() was reading CSS from a mutable property on createTheme(), which returned stale data when called with an empty config. Both functions now call a shared generateTheme() that returns { className, css } directly. Also extracted injectThemeStyle() for clarity. * docs: update theming pages with createTheme() as primary API Theming overview now leads with createTheme() JS helper. CSS variables moved to "advanced" section. Custom themes guide shows full API options including the vars escape hatch and a dark theme example. * feat: ship AGENTS.md with npm package for AI agent discovery Bun-style approach: agents working in projects that use SuperDoc read node_modules/superdoc/AGENTS.md and instantly know how to use createTheme(), configure the editor, and find all CSS variables. * feat: add theming example and update CLAUDE.md for agent discovery - Add examples/features/theming/ — React + TypeScript demo with 7 themes (3 via createTheme(), 3 presets, 1 default). Follows existing example pattern (comments, track-changes, etc.) - Add theming section to packages/superdoc/CLAUDE.md — agents working in the repo or reading node_modules/superdoc/ find createTheme() API, file pointers, and common vars keys - Add theming rows to root CLAUDE.md "Where to Look" table * chore: update lock file * fix(theme): make buildTheme() pure, document CSP nonce limitation - buildTheme() no longer injects styles into the DOM. It returns { className, css } without side effects, matching its SSR purpose. - createTheme() JSDoc notes that strict CSP environments should use buildTheme() + manual injection with a nonce attribute. - Added test verifying buildTheme does not inject styles. * fix(examples): fix Laravel and Nuxt smoke test failures - Laravel: bind artisan serve to 0.0.0.0 so Playwright can reach it in CI containers (was only listening on 127.0.0.1) - Nuxt: increase body visibility timeout to 10s and use domcontentloaded wait strategy (Nuxt hydration briefly hides body during init) * refactor(theme): convert createTheme to TypeScript Replace JSDoc types with native TypeScript interfaces (ThemeColors, ThemeConfig, ThemeResult). Exports typed interfaces for consumers. Also fix theming example height and restore smoke test assertion. * test: add consumer type checks for theme exports and preset theme validation (#2469) * test: add consumer type checks for theme exports and preset theme validation - Add createTheme/buildTheme imports to consumer-types smoke test so broken .d.ts exports are caught during CI - Add preset theme structural validation to compat.test.ts: verifies all three presets exist and every variable they declare is defined in variables.css * fix(test): use constrained generic so type assertions actually fail on mismatch `type X = never` compiles without error, so the previous assertions were no-ops. `AssertExtends<false>` violates the `extends true` constraint and produces a real compile error. * fix(theme): sanitize theme names and add --sd-ui-action-text variable - Sanitize `name` in createTheme() to strip characters invalid in CSS class names (spaces, slashes, etc.) — prevents classList.add() crash and invalid CSS selectors - Add `--sd-ui-action-text` variable (default #ffffff) for text on action-colored buttons. Replaces incorrect use of `--sd-ui-bg` which produced poor contrast in dark themes - Add `actionText` to ThemeColors interface and COLORS_TO_VARS mapping - Update docs variable reference and dark theme example * docs: add actionText to createTheme() examples --------- Co-authored-by: Caio Pizzol <97641911+caio-pizzol@users.noreply.github.com> Co-authored-by: Caio Pizzol <caio@harbourshare.com>
superdoc-bot bot
pushed a commit
that referenced
this pull request
Mar 20, 2026
# [0.3.0](cli-v0.2.0...cli-v0.3.0) (2026-03-20) ### Bug Fixes * arrow key navigation through and out of tables (SD-2236) ([#2476](#2476)) ([d5317ef](d5317ef)) * behavior tests ([#2436](#2436)) ([2d087f2](2d087f2)) * bug text edit commands fail on targets returned by find ([#2488](#2488)) ([7a9a448](7a9a448)) * change default link protocol ([#2319](#2319)) ([1deda06](1deda06)) * clear linked style for the next paragraph ([#2344](#2344)) ([9714ffb](9714ffb)) * clear selection on undo/redo ([#2385](#2385)) ([6473acf](6473acf)) * cli skills install ([ed7436a](ed7436a)) * **cli:** include allowed values in oneOf const validation errors ([#2455](#2455)) ([8802f90](8802f90)) * **cli:** restore tracked diff redline roundtrip ([#2438](#2438)) ([f609371](f609371)) * close toolbar overflow menu on click outside ([#2377](#2377)) ([ba74245](ba74245)) * **collaboration:** preserve body section properties across Yjs sync ([#2356](#2356)) ([ea702d6](ea702d6)) * **comments:** keep floating comment bubbles aligned with the selected thread (SD-2210 and SD-2223) ([#2390](#2390)) ([b014618](b014618)) * **comments:** resolve double-click activation and edit mode issues (SD-2035) ([#2259](#2259)) ([d9465aa](d9465aa)) * declare w15 namespace when bootstrapping numbering.xml ([#2470](#2470)) ([a14004d](a14004d)) * **diffing:** ignore volatile OOXML attrs in image and paragraph diff comparison ([#2421](#2421)) ([ca91225](ca91225)) * disable table resizing UI in viewing mode ([#2403](#2403)) ([697e799](697e799)) * doc-api story regressions and export app.xml stats ([#2478](#2478)) ([d06ff4e](d06ff4e)) * **doc-api:** gate textStyle attrs and sync reference coverage ([#2430](#2430)) ([e2d6ca6](e2d6ca6)) * **docs:** coherence pass on doc api, clean up dead code, update CLI SKILL.md ([#2424](#2424)) ([bf0d4b8](bf0d4b8)) * **document-api:** add document diff API and fix tracked diff replay in CLI host session ([#2418](#2418)) ([2a804f7](2a804f7)) * **document-api:** add mutation-ready cell addresses to tables.getCells ([#2461](#2461)) ([99bd4e5](99bd4e5)) * **document-api:** clear styles before paragraph.setStyle ([#2449](#2449)) ([bce4bb8](bce4bb8)) * **document-api:** make find/get treat content controls as sdt ([6688b8c](6688b8c)) * **document-api:** rename atRowIndex to rowIndex in tables.split ([#2473](#2473)) ([7de2864](7de2864)) * **document-api:** return fresh table ref in mutation responses ([#2453](#2453)) ([af6de73](af6de73)) * **document-api:** return NodeAddress from find and getNode instead of SDAddress (SD-2168) ([#2342](#2342)) ([edcb3c6](edcb3c6)) * **editor:** arrow key navigation across page boundaries and auto-scroll (SD-1950) ([#2191](#2191)) ([f7961d7](f7961d7)), closes [#scrollCaretIntoViewIfNeeded](https://github.com/superdoc-dev/superdoc/issues/scrollCaretIntoViewIfNeeded) [this.#painterHost](https://github.com/this./issues/painterHost) [#scrollScreenRectIntoView](https://github.com/superdoc-dev/superdoc/issues/scrollScreenRectIntoView) [#scrollCaretIntoViewIfNeeded](https://github.com/superdoc-dev/superdoc/issues/scrollCaretIntoViewIfNeeded) [#scrollActiveEndIntoView](https://github.com/superdoc-dev/superdoc/issues/scrollActiveEndIntoView) * **editor:** prevent scroll-to-top when clicking toolbar buttons ([#2236](#2236)) ([ab30a36](ab30a36)) * ensure ruler 0 is visible ([#2487](#2487)) ([096d9f0](096d9f0)) * **export:** prevent DOCX corruption from UTF-16 XML parts and schema violations (SD-2170) ([#2349](#2349)) ([fed1d6b](fed1d6b)) * faulty TOC import/export (SD-2183) ([#2371](#2371)) ([45b4452](45b4452)) * guard drawing export against invalid structures and zero IDs (SD-824) ([#2363](#2363)) ([9c7fc2e](9c7fc2e)) * **header-footer:** normalize page-relative anchor layout ([#2484](#2484)) ([6e62198](6e62198)) * **image:** sync headless image media to Y.Doc for collab persistence ([#2313](#2313)) ([72c64ed](72c64ed)) * import regression ([#2452](#2452)) ([cac5e24](cac5e24)) * improve document API dry runs, query matching, and reference block mutations ([#2498](#2498)) ([5959c5f](5959c5f)) * improve multi-column rendering ([#2369](#2369)) ([d231640](d231640)) * isolate document surface and toolbar/ruler stacking contexts ([#2491](#2491)) ([976ce14](976ce14)) * issue with vertical cells merging ([#2387](#2387)) ([e8f1c10](e8f1c10)) * **layout-engine:** match partial-row split height to renderer semantics ([#2486](#2486)) ([e0982da](e0982da)) * **layout-engine:** require bilateral opt-in for contextual spacing ([#2475](#2475)) ([40e04c2](40e04c2)) * **layout-engine:** skip redundant pageBreakBefore after page-forcing section breaks ([a950ed2](a950ed2)) * **lists:** stabilize list item addresses for docs without paraIds ([#2429](#2429)) ([0070de6](0070de6)) * match Word list marker geometry and section-carrier pagination ([#2358](#2358)) ([36d562f](36d562f)) * merged table cells owning outer borders in DOM painter ([c55f65a](c55f65a)) * newline formatting inheritance without serializing style-derived formatting (SD-2228) ([#2417](#2417)) ([5a3318f](5a3318f)) * open links in view mode ([#2350](#2350)) ([25f0aad](25f0aad)) * **painter-dom:** skip non-scrollable scroll container in virtualization (SD-2199) ([#2383](#2383)) ([1e075f6](1e075f6)) * **presentation-editor:** arrow key scroll-into-view with unconstrained containers (SD-1950) ([#2411](#2411)) ([fa8afc8](fa8afc8)), closes [#findScrollableAncestor](https://github.com/superdoc-dev/superdoc/issues/findScrollableAncestor) * preserve imported letter spacing through editor and layout ([ca9cf6a](ca9cf6a)) * preserve tracked format changes through DOCX export roundtrip ([#2395](#2395)) ([0ee9fa0](0ee9fa0)) * register DOCX numbering metadata for lists.create ([#2432](#2432)) ([129772f](129772f)) * remove syncing of runProperties with paragraph (SD-2143) ([#2343](#2343)) ([3e74426](3e74426)) * **rendering:** apply superscript/subscript font-size scaling during layout ([#2340](#2340)) ([7e9c24f](7e9c24f)) * **rendering:** show comment highlight on text with Word highlight formatting (SD-2188) ([#2370](#2370)) ([8fe0afd](8fe0afd)), closes [#ffff00](https://github.com/superdoc-dev/superdoc/issues/ffff00) * replace file running twice ([#2396](#2396)) ([a79fcaa](a79fcaa)) * **sdk:** improve agent tool definitions for better LLM accuracy ([#2494](#2494)) ([e914af7](e914af7)), closes [#8](#8) [#9](#9) [#10](#10) * seed base docx package for collaboration exports ([#2416](#2416)) ([df36853](df36853)) * show correct paragraph font in toolbar when selection is empty (SD-2145) ([#2402](#2402)) ([39e1477](39e1477)) * **super-editor:** guard against style definition nodes without elements ([#2379](#2379)) ([7dd57f8](7dd57f8)) * **super-editor:** make notes-part mutations canonical for footnotes ([#2361](#2361)) ([e232129](e232129)) * **super-editor:** preserve fontFamily in runProperties when set via document API (SD-2249) ([#2433](#2433)) ([491c3fe](491c3fe)) * **super-editor:** preserve root doc attrs during collaboration seeding ([#2359](#2359)) ([018469a](018469a)) * **super-editor:** prevent cursor jump when changing font from toolbar ([#2468](#2468)) ([c315599](c315599)) * **super-editor:** reconcile OPC package metadata during DOCX export ([#2357](#2357)) ([863254a](863254a)) * **superdoc:** expose header/footer edits in update callbacks ([#2368](#2368)) ([78d0056](78d0056)) * **superdoc:** prevent duplicate prosemirror-view bundles in dist ([32c1045](32c1045)) * surface hyperlink tracked changes in comments ([#2485](#2485)) ([ae55118](ae55118)) * **tables:** handle insertColumn right of last column ([#2451](#2451)) ([74c37ff](74c37ff)) * **tables:** prevent resize overlay artifacts during drag ([#2479](#2479)) ([1b1e712](1b1e712)) * text selection inside headers/footers ([#2404](#2404)) ([09677dc](09677dc)) * **toc:** anchor scroll precision within pages navigation (SD-2186) ([#2372](#2372)) ([cfb9a72](cfb9a72)), closes [#scrollContainer](https://github.com/superdoc-dev/superdoc/issues/scrollContainer) * **toc:** inject _Toc bookmarks so exported DOCX TOC links work without manual Update Table ([#2431](#2431)) ([54c5aa7](54c5aa7)) * toolbar state after document load (SD-2145) ([#2448](#2448)) ([6347ffe](6347ffe)) * **track-changes:** allow linked style changes in suggesting mode (SD-2182) ([#2373](#2373)) ([6400a1f](6400a1f)) * **track-changes:** cancel tracked format changes when reverted to original (SD-2181) ([#2365](#2365)) ([72077b2](72077b2)) * **track-changes:** remove logic that combines adjacent TCs with different IDs ([#2326](#2326)) ([b2f088b](b2f088b)) * **tracked-changes:** do not render empty space in TC within lists ([#2316](#2316)) ([00672dc](00672dc)) * **tracked-changes:** sync tracked changes store on undo and redo ([#2164](#2164)) ([94f0056](94f0056)) * **tracked-changes:** undo/redo applies to both document and comment bubbles ([#2437](#2437)) ([bc7cba3](bc7cba3)) * **types:** fix broken .d.ts imports in published superdoc package (SD-2227) ([#2392](#2392)) ([77807e5](77807e5)) * update list marker font before adding list item ([#2312](#2312)) ([8721614](8721614)) * update skill file ([240fb66](240fb66)) * watermark shading mismatch (SD-2147) ([#2353](#2353)) ([c94320c](c94320c)) ### Features * charts ([#2322](#2322)) ([dff2edc](dff2edc)) * cli improvements, block deletion ([#2360](#2360)) ([26972ff](26972ff)) * **cli:** add --version flag ([6199a9c](6199a9c)) * **collab:** wait for Y fragment settling before initializing editor ([b75ee17](b75ee17)) * **comments:** add scrollToComment API ([#2440](#2440)) ([0132d0e](0132d0e)) * diffing extension for comparing documents (SD-1324 and SD-89) ([#2306](#2306)) ([33e2ce6](33e2ce6)) * **doc-info:** add live page counts to doc.info ([#2435](#2435)) ([e631f4b](e631f4b)) * **doc-info:** live doc.info counts for characters, tracked changes, SDT fields, and lists ([#2428](#2428)) ([2978507](2978507)) * **document-api:** accept table coordinates in unmergeCells ([#2462](#2462)) ([5eca65b](5eca65b)) * **document-api:** add 'story' targeting for parts targeting with main api functions ([#2477](#2477)) ([49dc4ef](49dc4ef)) * **document-api:** add paragraph direction ops and clarify format.rtl ([#2474](#2474)) ([86600ac](86600ac)) * **document-api:** add table convenience ops and sync reference doc ([#2471](#2471)) ([137b1d9](137b1d9)) * **document-api:** content controls ([#2320](#2320)) ([2747e81](2747e81)) * **document-api:** headers & footers ([#2323](#2323)) ([b6511ca](b6511ca)) * **document-api:** improve cross block selection and deleting ([#2391](#2391)) ([cb8fedd](cb8fedd)) * **document-api:** insert/replace structural content ([#2305](#2305)) ([ce0c719](ce0c719)) * **document-api:** list creation and style edit commands ([#2457](#2457)) ([1d6d4bb](1d6d4bb)) * **document-api:** references ([#2321](#2321)) ([6da4d9c](6da4d9c)) * **docx:** support Word document statistic fields and F9 field updates ([#2460](#2460)) ([57b3ecc](57b3ecc)) * **headless:** collaborative comment and tracked-change parity ([#2315](#2315)) ([4dc1be1](4dc1be1)) * **layout:** implement AutoFit table layout algorithm (SD-2174) ([#2355](#2355)) ([5c05535](5c05535)) * llm tools beta ([#2393](#2393)) ([f725f36](f725f36)) * make images uploaded into table cell adjust to width of cell ([#2317](#2317)) ([c79b1d1](c79b1d1)) * parts sync system including yjs ([#2325](#2325)) ([84d8945](84d8945)) * **presentation-editor:** enhance zoom functionality in web layout ([#2408](#2408)) ([d44de69](d44de69)), closes [#applyZoom](https://github.com/superdoc-dev/superdoc/issues/applyZoom) * remove naive ui ([#2240](#2240)) ([fd5444f](fd5444f)) * **sdk:** ensure sdk clients are not global, change open() to return document handle ([#2497](#2497)) ([3b6eede](3b6eede)) * **sdk:** improve AI tool definitions for LLM accuracy (25% → 95% pass rate) ([#2446](#2446)) ([2e10e26](2e10e26)) * seed blank docx parts when loading JSON into editor ([#2401](#2401)) ([89c982f](89c982f)) * **super-editor:** bridge editor selection into Document API commands ([#2458](#2458)) ([26cef26](26cef26)) * support paragraph between borders (w:pBdr/w:between) ([#2324](#2324)) ([03f8207](03f8207)), closes [#2074](#2074) * **tables:** support lastRow style options with OOXML roundtrip parity ([#2467](#2467)) ([e84f695](e84f695)) * theming with css variables ([#2386](#2386)) ([529c500](529c500)), closes [#2441](#2441) [#ffffff](https://github.com/superdoc-dev/superdoc/issues/ffffff) [#dbdbdb](https://github.com/superdoc-dev/superdoc/issues/dbdbdb) [hi#level](https://github.com/hi/issues/level) [hi#contrast](https://github.com/hi/issues/contrast) [#f3f6fd](https://github.com/superdoc-dev/superdoc/issues/f3f6fd) [hi#level](https://github.com/hi/issues/level) [#2445](#2445) [#2469](#2469) [#ffffff](https://github.com/superdoc-dev/superdoc/issues/ffffff) ### Performance Improvements * **test:** move one-time setup to beforeAll in contract-conformance ([#2483](#2483)) ([ed4839b](ed4839b)) * **test:** speed up unit tests and migrate to bun ([#2492](#2492)) ([af44051](af44051)) ### Reverts * Revert "fix(types): fix broken .d.ts imports in published superdoc package (S…" ([#2443](#2443)) ([33215ee](33215ee)) * Revert "fix(types): fix broken .d.ts imports in published superdoc package (S…" ([#2443](#2443)) ([#2444](#2444)) ([2bde895](2bde895))
harbournick
pushed a commit
that referenced
this pull request
Mar 20, 2026
# [1.21.0](v1.20.0...v1.21.0) (2026-03-20) ### Bug Fixes * arrow key navigation through and out of tables (SD-2236) ([#2476](#2476)) ([d5317ef](d5317ef)) * bug text edit commands fail on targets returned by find ([#2488](#2488)) ([7a9a448](7a9a448)) * declare w15 namespace when bootstrapping numbering.xml ([#2470](#2470)) ([a14004d](a14004d)) * doc-api story regressions and export app.xml stats ([#2478](#2478)) ([d06ff4e](d06ff4e)) * **document-api:** add mutation-ready cell addresses to tables.getCells ([#2461](#2461)) ([99bd4e5](99bd4e5)) * **document-api:** clear styles before paragraph.setStyle ([#2449](#2449)) ([bce4bb8](bce4bb8)) * **document-api:** rename atRowIndex to rowIndex in tables.split ([#2473](#2473)) ([7de2864](7de2864)) * **document-api:** return fresh table ref in mutation responses ([#2453](#2453)) ([af6de73](af6de73)) * ensure ruler 0 is visible ([#2487](#2487)) ([096d9f0](096d9f0)) * **header-footer:** normalize page-relative anchor layout ([#2484](#2484)) ([6e62198](6e62198)) * import regression ([#2452](#2452)) ([cac5e24](cac5e24)) * improve document API dry runs, query matching, and reference block mutations ([#2498](#2498)) ([5959c5f](5959c5f)) * isolate document surface and toolbar/ruler stacking contexts ([#2491](#2491)) ([976ce14](976ce14)) * issue with vertical cells merging ([#2387](#2387)) ([e8f1c10](e8f1c10)) * **layout-engine:** match partial-row split height to renderer semantics ([#2486](#2486)) ([e0982da](e0982da)) * **layout-engine:** require bilateral opt-in for contextual spacing ([#2475](#2475)) ([40e04c2](40e04c2)) * **sdk:** improve agent tool definitions for better LLM accuracy ([#2494](#2494)) ([e914af7](e914af7)), closes [#8](#8) [#9](#9) [#10](#10) * **super-editor:** preserve fontFamily in runProperties when set via document API (SD-2249) ([#2433](#2433)) ([491c3fe](491c3fe)) * **super-editor:** prevent cursor jump when changing font from toolbar ([#2468](#2468)) ([c315599](c315599)) * surface hyperlink tracked changes in comments ([#2485](#2485)) ([ae55118](ae55118)) * **tables:** handle insertColumn right of last column ([#2451](#2451)) ([74c37ff](74c37ff)) * **tables:** prevent resize overlay artifacts during drag ([#2479](#2479)) ([1b1e712](1b1e712)) * toolbar state after document load (SD-2145) ([#2448](#2448)) ([6347ffe](6347ffe)) * **track-changes:** allow linked style changes in suggesting mode (SD-2182) ([#2373](#2373)) ([6400a1f](6400a1f)) * **tracked-changes:** undo/redo applies to both document and comment bubbles ([#2437](#2437)) ([bc7cba3](bc7cba3)) * update list marker font before adding list item ([#2312](#2312)) ([8721614](8721614)) ### Features * **document-api:** accept table coordinates in unmergeCells ([#2462](#2462)) ([5eca65b](5eca65b)) * **document-api:** add 'story' targeting for parts targeting with main api functions ([#2477](#2477)) ([49dc4ef](49dc4ef)) * **document-api:** add paragraph direction ops and clarify format.rtl ([#2474](#2474)) ([86600ac](86600ac)) * **document-api:** add table convenience ops and sync reference doc ([#2471](#2471)) ([137b1d9](137b1d9)) * **document-api:** list creation and style edit commands ([#2457](#2457)) ([1d6d4bb](1d6d4bb)) * **docx:** support Word document statistic fields and F9 field updates ([#2460](#2460)) ([57b3ecc](57b3ecc)) * make images uploaded into table cell adjust to width of cell ([#2317](#2317)) ([c79b1d1](c79b1d1)) * **super-editor:** bridge editor selection into Document API commands ([#2458](#2458)) ([26cef26](26cef26)) * **tables:** support lastRow style options with OOXML roundtrip parity ([#2467](#2467)) ([e84f695](e84f695)) * theming with css variables ([#2386](#2386)) ([529c500](529c500)), closes [#2441](#2441) [#ffffff](https://github.com/superdoc-dev/superdoc/issues/ffffff) [#dbdbdb](https://github.com/superdoc-dev/superdoc/issues/dbdbdb) [hi#level](https://github.com/hi/issues/level) [hi#contrast](https://github.com/hi/issues/contrast) [#f3f6fd](https://github.com/superdoc-dev/superdoc/issues/f3f6fd) [hi#level](https://github.com/hi/issues/level) [#2445](#2445) [#2469](#2469) [#ffffff](https://github.com/superdoc-dev/superdoc/issues/ffffff) ### Performance Improvements * **test:** move one-time setup to beforeAll in contract-conformance ([#2483](#2483)) ([ed4839b](ed4839b)) * **test:** speed up unit tests and migrate to bun ([#2492](#2492)) ([af44051](af44051))
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.