Skip to content

fix(fabric): fix Text overflow in ScrollView on first render (macOS)#2880

Merged
Saadnajmi merged 1 commit intomicrosoft:mainfrom
Saadnajmi:fix-scrollview-text-overflow-first-render
Apr 2, 2026
Merged

fix(fabric): fix Text overflow in ScrollView on first render (macOS)#2880
Saadnajmi merged 1 commit intomicrosoft:mainfrom
Saadnajmi:fix-scrollview-text-overflow-first-render

Conversation

@Saadnajmi
Copy link
Copy Markdown
Collaborator

@Saadnajmi Saadnajmi commented Mar 31, 2026

Summary

  • Add a layoutSubviews override in RCTScrollViewComponentView on macOS that resets the _containerView (documentView) frame to _contentSize after AppKit's autoresizing corrupts it
  • This fixes massive horizontal and vertical overflow when Text is nested inside a ScrollView on the first render

Root Cause

On macOS, the _containerView serves as the NSScrollView's documentView, whose frame directly determines the scrollable content area (unlike iOS where UIScrollView.contentSize is a separate property).

React's layout system explicitly manages _containerView.frame via updateState: to match the content bounding rect. However, autoresizingMask caused AppKit to also resize the container whenever the NSClipView resized (e.g., during initial tile after mounting). This added the clip view's size delta to the container's dimensions, inflating it well beyond the correct content size.

The layoutSubviews override runs after AppKit's layout pass (which triggers autoresizing), so it reliably corrects the frame back to the React-managed _contentSize.

The issue self-corrects on window resize because the size change triggers a React re-layout that overwrites the corrupted frame with fresh measurements.

Test plan

Before (bug) After (fix)

Fixes #2857

🤖 Generated with Claude Code

@Saadnajmi Saadnajmi requested a review from a team as a code owner March 31, 2026 23:19
@changeset-bot
Copy link
Copy Markdown

changeset-bot bot commented Mar 31, 2026

⚠️ No Changeset found

Latest commit: f3650be

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

On macOS, the _containerView (NSScrollView's documentView) has
autoresizingMask set so it fills the visible area before React's first
layout pass. However, AppKit's autoresizing corrupts the documentView's
frame by adding the NSClipView's size delta to the container's
dimensions (e.g., during initial tile or window attachment), inflating it
well beyond the correct content size and producing massive horizontal and
vertical overflow on first render.

The fix adds a layoutSubviews override on macOS that resets the
documentView frame to the correct React-managed content size after
AppKit's layout pass (which triggers autoresizing). This corrects the
corruption while preserving the autoresizingMask needed for the
documentView to fill the visible area before React's first updateState.

Fixes microsoft#2857

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@Saadnajmi Saadnajmi force-pushed the fix-scrollview-text-overflow-first-render branch from 731e9fe to f3650be Compare April 1, 2026 18:39
@Saadnajmi Saadnajmi merged commit 92a0916 into microsoft:main Apr 2, 2026
41 of 70 checks passed
Saadnajmi added a commit to Saadnajmi/react-native-macos that referenced this pull request Apr 2, 2026
…icrosoft#2880)

## Summary

- Add a `layoutSubviews` override in `RCTScrollViewComponentView` on
macOS that resets the `_containerView` (documentView) frame to
`_contentSize` after AppKit's autoresizing corrupts it
- This fixes massive horizontal and vertical overflow when Text is
nested inside a ScrollView on the first render

## Root Cause

On macOS, the `_containerView` serves as the `NSScrollView`'s
`documentView`, whose frame **directly determines the scrollable content
area** (unlike iOS where `UIScrollView.contentSize` is a separate
property).

React's layout system explicitly manages `_containerView.frame` via
`updateState:` to match the content bounding rect. However,
`autoresizingMask` caused AppKit to **also** resize the container
whenever the `NSClipView` resized (e.g., during initial `tile` after
mounting). This added the clip view's size delta to the container's
dimensions, inflating it well beyond the correct content size.

The `layoutSubviews` override runs after AppKit's layout pass (which
triggers autoresizing), so it reliably corrects the frame back to the
React-managed `_contentSize`.

The issue self-corrects on window resize because the size change
triggers a React re-layout that overwrites the corrupted frame with
fresh measurements.

## Test plan

| Before (bug) | After (fix) |
|---|---|
| <img
src="https://github.com/user-attachments/assets/6a63357e-6dd3-4f69-b134-2d0f78c5b995"
/> | <img
src="https://github.com/user-attachments/assets/5678e2ad-bc40-4987-aaa3-5854c809649e"
/> |





Fixes microsoft#2857

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
@Saadnajmi Saadnajmi deleted the fix-scrollview-text-overflow-first-render branch April 2, 2026 21:16
Saadnajmi added a commit that referenced this pull request Apr 3, 2026
## Summary

Backport of 3 fixes from `main` to `0.81-stable`:

- **fix(fabric):** Switch default Text color to `labelColor` (#2878)
- **fix(fabric):** fix Text overflow in ScrollView on first render
(#2880)
- **fix(fabric):** Add back compat layer for `validKeysDown` and
`validKeysUp` (#2879)

Each fix is a separate commit for easy rebasing when upstream PRs are
updated.

### Conflict resolutions
- **PR #2878:** 0.81-stable uses `RCTUIColor` (renamed from
`RCTPlatformColor` on main). Resolved by keeping `RCTUIColor` while
applying the `blackColor` → `labelColor` change.
- **PRs #2880 and #2879** cherry-picked cleanly. #2879 (open PR) was
squash-cherry-picked into a single commit.

## Test plan
- [ ] Verify default text color respects dark/light mode
- [ ] Verify Text in ScrollView renders correctly on first load
- [ ] Verify legacy `validKeysDown`/`validKeysUp` props still work in
Fabric

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Text inside the ScrollView has massive vertical and horizontal overflow on the first render

2 participants