Skip to content

fix(presentation-editor): arrow key scroll-into-view with unconstrained containers (SD-1950)#2411

Merged
harbournick merged 2 commits intomainfrom
fix/sd-1950-arrow-key-scroll-into-view
Mar 17, 2026
Merged

fix(presentation-editor): arrow key scroll-into-view with unconstrained containers (SD-1950)#2411
harbournick merged 2 commits intomainfrom
fix/sd-1950-arrow-key-scroll-into-view

Conversation

@tupizz
Copy link
Copy Markdown
Contributor

@tupizz tupizz commented Mar 17, 2026

Demo

CleanShot.2026-03-17.at.09.40.14.mp4

Summary

Fixes SD-1950: Arrow key up/down navigation was not auto-scrolling to keep the cursor visible when the consumer's container had overflow: auto but no height constraint.

Root Cause

#findScrollableAncestor() detects the scroll container at setup time by walking the DOM and returning the first ancestor with overflow-y: auto|scroll. However, it cannot verify that the element actually constrains content height — content isn't laid out yet at that point.

When a consumer sets overflow: auto on the SuperDoc container without constraining its height (no height, max-height, or bounded flex parent), the container expands to fit all content instead of scrolling. This makes scrollHeight === clientHeight, meaning the element is never actually scrollable.

This caused three cascading failures:

Problem Impact
Caret scroll-into-view getBoundingClientRect() on the ~15,000px container always contained the caret, so the scroll-down/scroll-up conditions in #scrollScreenRectIntoView never triggered
Virtualization domPainter.setScrollContainer() received the wrong element, computing page visibility against the full expanded container instead of the actual viewport
Scroll offsets All scroll-relative logic referenced a container that never actually scrolled

Reproduction

Observed in SuperDoc Labs Version Tester (v1.18.2) where #superdoc has overflow: auto; flex: 1 but no height constraint in the ancestor chain. The DOM hierarchy showed:

#superdoc (overflow: auto, scrollHeight: 15138, clientHeight: 15138) ← detected as scroll container, but NOT actually scrollable
  ...
<html> (scrollHeight: 15326, clientHeight: 992) ← where scrolling actually happens

Fix

Added #revalidateScrollContainer() — called once after the first layout completes. At that point content is laid out and we can reliably check scrollHeight > clientHeight.

If the initially detected scroll container isn't actually scrollable:

  1. Walks further up the DOM to find an ancestor that truly constrains content
  2. Falls back to window if none found
  3. Updates scroll event listener and domPainter.setScrollContainer() reference

Why this approach

  • Fixes the root cause — corrects scroll container detection, not individual symptoms. All three problems (caret scroll, virtualization, scroll offsets) are fixed by correcting the single source of truth (this.#scrollContainer)
  • Non-breaking — if the consumer properly constrains height, the revalidation is a no-op (early return on line 2: scrollHeight > clientHeight + 1)
  • Consumers don't need to change anything — SuperDoc adapts to whatever container layout it's given
  • Minimal surface area — one new method, one new boolean flag, one call site. No modifications to existing methods or APIs
  • Runs once — guarded by #scrollContainerValidated flag, no per-keystroke overhead

Changes

  • #scrollContainerValidated field (line 318) — ensures revalidation runs only once
  • #revalidateScrollContainer() method (lines 3068–3116) — post-layout scroll container validation
  • Call site in #rerender() (line 3852) — invoked after first layout completes, before permission overlay update

Test plan

  • Existing scrollCaretIntoView.test.ts tests pass (9/9)
  • Lint and format hooks pass
  • Manual test: Load editor in Version Tester (v1.18.2), place cursor, press ArrowDown repeatedly — caret should remain visible with auto-scroll
  • Manual test: ArrowUp near top boundary should auto-scroll upward
  • Manual test: Arrow navigation inside tables should auto-scroll
  • Manual test: Verify virtualization works (pages outside viewport should unmount in large documents)
  • Manual test: Consumer with properly constrained container (height: 100vh; overflow: auto) still works as before

@linear
Copy link
Copy Markdown

linear Bot commented Mar 17, 2026

Copy link
Copy Markdown

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

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 57468f0afc

ℹ️ About Codex in GitHub

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

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

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

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

Comment thread packages/super-editor/src/core/presentation-editor/PresentationEditor.ts Outdated
…out (SD-1950)

Arrow key navigation was not auto-scrolling to keep the cursor visible
when the consumer's container had overflow:auto but no height constraint.

The root cause was in #findScrollableAncestor — at setup time it picks the
first ancestor with overflow-y:auto|scroll, but cannot verify the element
actually constrains content height (content isn't laid out yet). When the
consumer sets overflow:auto without a height constraint, the container
expands to fit all content instead of scrolling, making scrollHeight equal
to clientHeight. This caused three cascading failures:

1. Caret scroll-into-view: getBoundingClientRect() on the ~15000px container
   always contained the caret, so the scroll condition never triggered.
2. Virtualization: domPainter received the wrong scroll container, computing
   page visibility against the full container instead of the viewport.
3. Scroll offset calculations: all scroll-relative logic used a container
   that never actually scrolled.

The fix adds #revalidateScrollContainer(), called once after the first
layout completes. At that point content is laid out and we can check
scrollHeight vs clientHeight. If the detected container isn't actually
scrollable, we walk further up the DOM to find one that is, or fall back
to window — then update the scroll listener and domPainter reference.
@tupizz tupizz force-pushed the fix/sd-1950-arrow-key-scroll-into-view branch from 57468f0 to 167256b Compare March 17, 2026 12:42
@tupizz tupizz removed their assignment Mar 17, 2026
@tupizz tupizz self-assigned this Mar 17, 2026
…cases

Two fixes based on review feedback:

1. Avoid falsely switching away from properly constrained containers.
   A container with height:600px and overflow:auto may not overflow on
   first layout if the document is short. The previous check would
   switch to window in that case and never retry. Now we also verify
   the container grew beyond the viewport before switching — a clear
   signal its height is unconstrained.

2. Clear domPainter scroll container when falling back to window.
   When revalidation resolves to window, the domPainter was keeping
   the stale HTMLElement reference from #ensurePainter. Now we pass
   null, which makes the domPainter use viewport-based calculations.
Copy link
Copy Markdown
Collaborator

@harbournick harbournick left a comment

Choose a reason for hiding this comment

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

LGTM

@harbournick harbournick merged commit fa8afc8 into main Mar 17, 2026
7 checks passed
@harbournick harbournick deleted the fix/sd-1950-arrow-key-scroll-into-view branch March 17, 2026 23:48
@superdoc-bot
Copy link
Copy Markdown
Contributor

superdoc-bot Bot commented Mar 17, 2026

🎉 This PR is included in superdoc v1.19.1-next.7

The release is available on GitHub release

@superdoc-bot
Copy link
Copy Markdown
Contributor

superdoc-bot Bot commented Mar 17, 2026

🎉 This PR is included in superdoc-cli v0.3.0-next.8

The release is available on GitHub release

harbournick pushed a commit that referenced this pull request Mar 18, 2026
# [1.20.0](v1.19.1...v1.20.0) (2026-03-18)

### Bug Fixes

* behavior tests ([#2436](#2436)) ([2d087f2](2d087f2))
* change default link protocol ([#2319](#2319)) ([1deda06](1deda06))
* **cli:** restore tracked diff redline roundtrip ([#2438](#2438)) ([f609371](f609371))
* **comments:** resolve double-click activation and edit mode issues (SD-2035) ([#2259](#2259)) ([d9465aa](d9465aa))
* **diffing:** ignore volatile OOXML attrs in image and paragraph diff comparison ([#2421](#2421)) ([ca91225](ca91225))
* **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))
* **editor:** prevent scroll-to-top when clicking toolbar buttons ([#2236](#2236)) ([ab30a36](ab30a36))
* guard drawing export against invalid structures and zero IDs (SD-824) ([#2363](#2363)) ([9c7fc2e](9c7fc2e))
* improve multi-column rendering ([#2369](#2369)) ([d231640](d231640))
* **lists:** stabilize list item addresses for docs without paraIds ([#2429](#2429)) ([0070de6](0070de6))
* newline formatting inheritance without serializing style-derived formatting (SD-2228) ([#2417](#2417)) ([5a3318f](5a3318f))
* open links in view mode ([#2350](#2350)) ([25f0aad](25f0aad))
* **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)
* register DOCX numbering metadata for lists.create ([#2432](#2432)) ([129772f](129772f))
* 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))
* text selection inside headers/footers ([#2404](#2404)) ([09677dc](09677dc))
* **toc:** inject _Toc bookmarks so exported DOCX TOC links work without manual Update Table ([#2431](#2431)) ([54c5aa7](54c5aa7))

### Features

* **comments:** add scrollToComment API ([#2440](#2440)) ([0132d0e](0132d0e))
* **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))

### Reverts

* Revert "fix(types): fix broken .d.ts imports in published superdoc package (S…" ([#2443](#2443)) ([33215ee](33215ee))
@harbournick
Copy link
Copy Markdown
Collaborator

🎉 This PR is included in superdoc v1.20.0

The release is available on GitHub release

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))
@superdoc-bot
Copy link
Copy Markdown
Contributor

superdoc-bot Bot commented Mar 20, 2026

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

The release is available on GitHub release

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants