This release includes 2 breaking changes for platform teams planning a safe upgrade.
✓ No known CVEs patched in this version
ReleasePort's take
Moderate signalVersion 0.7.0 introduces several new UI features and critical breaking changes to scroll‑view APIs.
Why it matters: Breaking change severity 80 forces code updates for `scrollView.documentView`; severity 70 alters default insets, requiring opt‑in via `config.safeAreaInsets` to preserve layout behavior.
Summary
AI summaryUpdates Breaking, Main changes, and feat across a mixed release.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Breaking | High |
`scrollView.documentView` is now always an internal container view, never the `NSTextView`. `scrollView.documentView` is now always an internal container view, never the `NSTextView`. Source: llm_adapter@2026-06-11 Confidence: high |
— |
| Breaking | High |
Default `scrollView` content inset is now `0`; opt back in via `config.safeAreaInsets`. Default `scrollView` content inset is now `0`; opt back in via `config.safeAreaInsets`. Source: llm_adapter@2026-06-11 Confidence: high |
— |
| Feature | Medium |
Adds opt-in centered reading column with full-width table breakout (`readingWidth`). Adds opt-in centered reading column with full-width table breakout (`readingWidth`). Source: llm_adapter@2026-06-11 Confidence: high |
— |
| Feature | Medium |
Adds scroll-away header API with interactive SwiftUI view. Adds scroll-away header API with interactive SwiftUI view. Source: llm_adapter@2026-06-11 Confidence: high |
— |
| Feature | Low |
Adds empty-document placeholder `placeholder: NSAttributedString?` ghost text. Adds empty-document placeholder `placeholder: NSAttributedString?` ghost text. Source: llm_adapter@2026-06-11 Confidence: high |
— |
| Feature | Low |
Implements band‑aware bottom overscroll for expanded header. Implements band‑aware bottom overscroll for expanded header. Source: llm_adapter@2026-06-11 Confidence: high |
— |
| Bugfix | Medium |
Suppresses spell‑check on fenced code blocks and inline `code` via `.spellingState: 0`. Suppresses spell‑check on fenced code blocks and inline `code` via `.spellingState: 0`. Source: llm_adapter@2026-06-11 Confidence: high |
— |
Full changelog
Highlights
Two big editor-layout features land in this release: an opt-in centered reading column with full-width table breakout (readingWidth), and a scroll-away header API — the engine can now host an embedder-supplied SwiftUI view above the document body that scrolls with the content and collapses to a pinned top row.
Main changes
- Reading column (
readingWidth) — opt-in fixed wrap width, centered by position (no re-wrap on resize); wide tables break out to the full window width like Google Docs (#60). - Scroll-away header —
NativeTextViewWrappergainsheader: AnyView?,headerCollapsedHeight: CGFloat, andheaderExpanded: Bool. The hosted view scrolls with the document, stays fully interactive, refreshes on every SwiftUI update, and animates between collapsed and expanded; composes withreadingWidth(#61). - Empty-document placeholder — new
placeholder: NSAttributedString?ghost text rendered at the first-line position inside the scrolled content: it sits below the header band, tracks its reveal animation, and hides on the first keystroke (#61). - Band-aware bottom overscroll — the header band counts toward the overscroll activation, so short documents under an expanded header can scroll the band away instead of pinning the caret to the viewport bottom; the comfortable slack stays viewport-based, so long documents behave exactly as before (#61).
- Spell-check suppression on code —
MarkdownASTStylerstamps.spellingState: 0on fenced code blocks and inlinecode, completing the existing convention (links, wiki-links, LaTeX, tables) (#64, thanks @Ender-Wang).
Breaking
- The scroll view's
documentViewis now always an engine-internal container view, never theNSTextViewitself. Embedders that reached intoscrollView.documentViewmust adapt. - The enclosing scroll view no longer applies a hard-coded
top: 55.4content inset; the default is0on every edge. Opt back in viaconfig.safeAreaInsets = SafeAreaInsets(top: …).
Bundled fixes
Height-neutral trailing empty line (typing on the last line at max overscroll no longer shifts the bottom scroll limit), scroll-to-reveal regressions in the reading column, header/body compositing during responsive scroll, live-resize scroll-position restoration.
Tests
swift test — 89 tests across 10 suites.
Full changelog: https://github.com/nodes-app/swift-markdown-engine/compare/0.6.0...0.7.0
What's Changed
- docs: update ARCHITECTURE.md for the AST pipeline by @luca-chen198 in https://github.com/nodes-app/swift-markdown-engine/pull/53
- Add opt-in readingWidth: full-width table breakout by @luca-chen198 in https://github.com/nodes-app/swift-markdown-engine/pull/60
- feat: stamp
.spellingState: 0on fenced code blocks and inlinecodeby @Ender-Wang in https://github.com/nodes-app/swift-markdown-engine/pull/64 - Scrolling header API for the markdown editor (+ live-scroll stability) by @Nicolas-Py in https://github.com/nodes-app/swift-markdown-engine/pull/61
New Contributors
- @Ender-Wang made their first contribution in https://github.com/nodes-app/swift-markdown-engine/pull/64
Full Changelog: https://github.com/nodes-app/swift-markdown-engine/compare/0.6.0...0.7.0
Breaking Changes
- The scroll view's `documentView` is now always an engine‑internal container view, never the `NSTextView` itself; embedders must adapt their access patterns.
- The enclosing scroll view no longer applies a hard‑coded `top: 55.4` content inset; default insets are `0` on all edges; opt back in via `config.safeAreaInsets = SafeAreaInsets(top: …)`.
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About Swift-Markdown-engine
All releases →Related context
Related tools
Earlier breaking changes
- v0.10.0 `==highlight==` and `~~strikethrough~~` are now opt‑in extensions, not core grammar.
Beta — feedback welcome: [email protected]