Skip to content

chore(0.83): sync 0.83.10 and backport RedBox 2.0 - #3022

Open
Saad Najmi (Saadnajmi) wants to merge 121 commits into
0.83-stablefrom
0.83/saadnajmi/merge-0.83.10
Open

chore(0.83): sync 0.83.10 and backport RedBox 2.0#3022
Saad Najmi (Saadnajmi) wants to merge 121 commits into
0.83-stablefrom
0.83/saadnajmi/merge-0.83.10

Conversation

@Saadnajmi

@Saadnajmi Saad Najmi (Saadnajmi) commented Jul 14, 2026

Copy link
Copy Markdown
Collaborator

Summary

This is the single 0.83 stable-line PR for both the upstream sync and the effective RedBox 2.0/AppKit backport. It supersedes #3027.

Provenance

The four additive commits are stacked on the previously reviewed #3022 head:

  1. restore the extracted upstream RedBox 2.0 CoreModules files
  2. apply the focused AppKit V1 adaptation
  3. add the production RCTUIKit table/label/button primitives
  4. add the RedBox 2.0 AppKit consumer

The V1 adaptation is byte-identical to #3027. Every other changed implementation file is byte-identical to the reviewed #3054 production stack. Native RCTUITableView tests and their project wiring are intentionally excluded, matching the repository-owner review decision on #3056.

Validation

  • RNTester macOS build passed (EXIT=0, ** BUILD SUCCEEDED **)
  • all nine changed Objective-C/Objective-C++ implementations compiled
  • RNTester-macOS linked, validated, and produced the app bundle
  • zero compile or linker errors
  • build log SHA-256: d7f6c18b7d570d06a79297c774e6343a92e178910374ea9ab5a99d8ac77aad4e
  • immutable install, lint, format, and focused Jest passed
  • TypeScript failures are pre-existing in files untouched by this PR; generated TypeScript is not configured on this stable branch
  • RedBox 2.0 controller fork ratio remains the reviewed 842 / 144 / 16 total lines / fork lines / top-level macOS guards

manual macOS RedBox 2.0 OFF/ON verification OUTSTANDING; do not undraft until performed

The bounded manual attempt could not obtain a script URL in the DerivedData-built app even with Metro ready and serving the bundle, so no manual OFF or ON behavior item is claimed as passed.

Alex Hunt (huntie) and others added 30 commits November 3, 2025 16:28
Summary:
Pull Request resolved: react#54385

Changelog: [Internal]

`test-release-local` shouldn't be changing the hermes version stored in `version.properties` as this script should be called on a cut branch with hermes already bumped.

Reviewed By: cipolleschi

Differential Revision: D86105703

fbshipit-source-id: 5a1edd9f7a6cd756521749c2b0023ea683dadf82
#publish-packages-to-npm&next
Summary:
Pull Request resolved: react#54419

Changelog: [Internal]

React Native uses `files` field in `package.json` to list everything that should end up in the apckage. `.hermesv1version` file was missing from that list, which is fixed by this diff.

Reviewed By: huntie, cipolleschi

Differential Revision: D86295805

fbshipit-source-id: 8a17191f26f9536884e4aaf09447121c020d1212
…eact#54421)

Summary:
OSS community shared with me that we have a circular dependency in React-utils.podspec that prevent them from building with JSC.
While fixing it, I realized that the dynamic framework build was broken. So I fixed them both.

## Changelog:
[iOS][Fixed] - Fixed build with dynamic frameworks

Pull Request resolved: react#54421

Test Plan: Build RNTester locally with USE_FRAMEWORKS=dynamic

Reviewed By: javache

Differential Revision: D86309592

Pulled By: cipolleschi

fbshipit-source-id: f2995332ae135ce951480b353df7d597ff8a85ec
Summary:
When RCT_SYMBOLICATE_PREBUILT_FRAMEWORKS is enabled, source file paths in dSYMs were incorrectly resolved with extra path segments:

double node_modules (e.g., /path/node_modules/node_modules/...)

The root cause was using File.expand_path(@react_native_path) without the correct base directory. The path was first expanded without a base (causing double node_modules), then fixed to use project_pods_root (ios/Pods/), which still resulted in incorrect paths with an extra ios/ folder.

Fixed by expanding the path relative to Pod::Config.instance.installation_root, which correctly points to the ios/ directory, allowing relative paths like ../node_modules/react-native to resolve properly to the project root's node_modules directory.

## Changelog:

[IOS] [FIXED] - Fix incorrect source path resolution in dSYM remapping in precompiled framework scripts

Pull Request resolved: react#54470

Test Plan:
```
rm -rf ./Pods
pod cache clean --all
RCT_USE_RN_DEP=1 RCT_USE_PREBUILT_RNCORE=1 RCT_SYMBOLICATE_PREBUILT_FRAMEWORKS=1 bundle exec pod install
```

✅ Tested with RN-Tester
✅ Tested in 0.83.rc0 project

Reviewed By: huntie

Differential Revision: D86667786

Pulled By: cipolleschi

fbshipit-source-id: cd6279d02d5ed7188e282e4491c05de35f17a8f1
Summary:
Pull Request resolved: react#54479

Fixes failing CI jobs on `0.83-stable`, e.g. https://github.com/facebook/react-native/actions/runs/19234912061/job/54982161510.

**Changes**

- Simplify main package `package.json` file read with existing `getWorkspaceRoot` util.
- Fix test by mocking `getWorkspaceRoot` (previously: read the real filesystem and caused test breakage outside `main`).
- Add additional `RC0 → RC1` test case.

Changelog: [Internal]

Reviewed By: cipolleschi

Differential Revision: D86674348

fbshipit-source-id: 0b8feb4cbf7b1ac7cf4cc560f066a0a10aec1b5f
Summary:
Pull Request resolved: react#54407

Introduces a new `InspectorSystemState` object and `ReactNativeApplication.systemStateChanged` CDP event, used to assert whether more than one React Native Host has been registered for the current app lifetime.

This will be used to disable the Performance and Network features in React Native DevTools when the debugger backend is in this currently unsupported state. We intend to implement host lifecycle correctness across all features soon.

Changelog: [Internal]

Reviewed By: cipolleschi

Differential Revision: D86201689

fbshipit-source-id: b8525359fc01eb7ae666879f2c0fd4c94f0af81a
…act#54408)

Summary:
Pull Request resolved: react#54408

Follows from the parent commit. This will prevent 3P CDP clients from using the `Tracing` or `Network` domains when we are in an unsupported multi React Native Host setup.

Changelog: [Internal]

Reviewed By: hoxyq

Differential Revision: D86201688

fbshipit-source-id: 052d563a371fd77c1a05ad8518e222d6bc1eb372
Local sync from 0.83-stable branch
#publish-packages-to-npm&next
Summary:
Pull Request resolved: react#54454

Changelog: [Internal] - Add feature flag around IntersectionObserver for canary

Reviewed By: rubennorte, cipolleschi

Differential Revision: D86547485

fbshipit-source-id: 0c6d84e276d1f6337a8da0bea141cc371010cd75
…0.83-stable branch.

Changelog: [General][Added] - React Native DevTools: Enable Network inspection features
#publish-packages-to-npm&next
#publish-packages-to-npm&next
#publish-packages-to-npm&0.83-stable
@Saadnajmi Saad Najmi (Saadnajmi) changed the title chore(0.83): merge up to 0.83.10 from upstream branch chore(0.83): sync 0.83.10 and backport RedBox 2.0 Jul 29, 2026
@Saadnajmi
Saad Najmi (Saadnajmi) marked this pull request as ready for review July 29, 2026 21:07
@Saadnajmi
Saad Najmi (Saadnajmi) requested a review from a team as a code owner July 29, 2026 21:08
Saad Najmi (Saadnajmi) and others added 11 commits August 4, 2026 15:46
…mi/merge-0.83.10

# Conflicts:
#	.github/ISSUE_TEMPLATE.md
#	.gitignore
#	README.md
#	package.json
#	packages/assets/package.json
#	packages/babel-plugin-codegen/package.json
#	packages/community-cli-plugin/package.json
#	packages/core-cli-utils/package.json
#	packages/debugger-frontend/package.json
#	packages/dev-middleware/package.json
#	packages/eslint-config-react-native/package.json
#	packages/eslint-plugin-react-native/package.json
#	packages/eslint-plugin-specs/package.json
#	packages/gradle-plugin/package.json
#	packages/metro-config/package.json
#	packages/new-app-screen/package.json
#	packages/normalize-color/package.json
#	packages/polyfills/package.json
#	packages/react-native-babel-preset/package.json
#	packages/react-native-babel-transformer/package.json
#	packages/react-native-codegen/package.json
#	packages/react-native-compatibility-check/package.json
#	packages/react-native-popup-menu-android/package.json
#	packages/react-native/Package.swift
#	packages/react-native/React/CoreModules/RCTRedBox.mm
#	packages/react-native/React/CoreModules/RCTWebSocketModule.mm
#	packages/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm
#	packages/react-native/gradle/libs.versions.toml
#	packages/react-native/package.json
#	packages/react-native/sdks/.hermesv1version
#	packages/react-native/sdks/.hermesversion
#	packages/react-native/sdks/hermes-engine/version.properties
#	packages/react-native/third-party-podspecs/RCT-Folly.podspec
#	packages/react-native/third-party-podspecs/fmt.podspec
#	packages/rn-tester/Podfile.lock
#	packages/rn-tester/package.json
#	packages/typescript-config/package.json
#	packages/virtualized-lists/package.json
#	private/helloworld/package.json
#	private/react-native-codegen-typescript-test/package.json
#	scripts/releases/ios-prebuild/configuration.js
#	yarn.lock
First react-native-macos 0.83 release, syncing to upstream React Native
0.83.10.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Replace the nx version-plan with a Changesets entry (react-native-macos: minor),
matching the changesets release tooling this branch inherited from main (#2839).
This is the first 0.83 release of react-native-macos, syncing to RN 0.83.10.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- RCTFrameTimingsObserver: the new upstream screenshot observer uses UIKit-only
  APIs (UIScene/UIWindowScene/UIGraphicsImageRenderer/drawViewHierarchyInRect) and
  is only instantiated on iOS (RCTHost.mm, TARGET_OS_IPHONE). Compile a no-op stub
  on macOS so React-Core (static + SwiftPM prebuild) builds.
- yarn.lock: the merge deduped @typescript-eslint/eslint-plugin to 8.36.0 while
  @typescript-eslint/parser resolved to 8.38.0, breaking the transitive
  @typescript-eslint/types link under the pnpm nodeLinker (ESLint failed to load
  the plugin). Re-resolve both root ^8.36.0 deps to a consistent 8.63.0.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
export-versions.mts coerced dependencies['@react-native/codegen'], which is
'workspace:*' in the dev tree, producing the invalid 'workspace:*.0' passed to
the test-app integration's set-react-version. Read peerDependencies['react-native']
instead (the real upstream RN version, e.g. 0.83.10 -> 0.83), matching how the
react-native-macos init workflow derives its version.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The init and test-app integration gates (which only run on *-stable base
branches) pack react-native-macos and install it standalone, but its
@react-native-macos/virtualized-lists workspace dependency is not published at
the 1000.0.0 dev version, so the install failed to resolve it.

Pack virtualized-lists alongside react-native-macos and install/override it:
- init: npm install both tarballs together (npm satisfies the 1000.0.0 dep from
  the local tarball).
- test-app: add it to the set-react-version --overrides map.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@react-native/tester (the private RNTester app) is pinned to the upstream
snapshot version 0.83.0-main, which Changesets graduates to a phantom major
(1.0.0) bump in the release plan, tripping the 'no major bumps' guard in the
changesets check. It is never published, so add it to the changeset ignore list.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
RN 0.83.10 added a -dealloc that hid the loading window via UIWindow/.hidden.
Use the RCTPlatformWindow ivar type and hide via -orderOut: on macOS (NSWindow),
mirroring the existing #if !TARGET_OS_OSX carve-out in -hide.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
change.mts getBaseBranch() derived the git remote from package.json
repository.url, but the monorepo root package.json has no repository field, so
repoPath was empty and `(repoPath && ...) ?? 'origin'` evaluated to an empty
string (?? doesn't catch ''), yielding base ref '/0.83-stable'. changeset status
then failed to find the divergence point. Use || so an empty match falls back to
'origin' (=> origin/<base>).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
set-react-version --overrides only covers the direct react-native-macos dep, so
yarn still tried to fetch the unpublished @react-native-macos/virtualized-lists@1000.0.0
transitively. Add a root resolutions entry pointing at the packed tarball, using
the same mechanism as the @types/react pin.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ease

The 'Test react-native-macos init' and 'react-native-test-app integration' gates
integration-test react-native-macos as a real project consumes it, which requires
the target minor to be published to npm: react-native-macos-init installs a
published react-native-macos (falling back to the previous published minor and
conflicting on the react-native peer), and react-native-test-app declares a
supported react-native-macos version range. Neither can be satisfied for the very
first release of a new minor, before anything is published.

Add a check-release-published gate that queries npm for the target minor and skips
both integration jobs when it is not yet published. They self-heal and run normally
for later patch releases once the minor is on npm. The failures occur at yarn/npm
install (before any bundling/pod/build), so this only skips the pre-publish window,
not real integration coverage.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Saadnajmi
Saad Najmi (Saadnajmi) force-pushed the 0.83/saadnajmi/merge-0.83.10 branch from 86581f3 to 77af67b Compare August 5, 2026 08:08
Comment thread .changeset/config.json Outdated
@@ -4,6 +4,6 @@
"baseBranch": "origin/main",

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

This should be 0.83-stable, correct?

Comment on lines -27 to +30
const { dependencies, peerDependencies } = manifest;
const { peerDependencies } = manifest;

exportValue("react_version", peerDependencies["react"]);
exportValue("react_native_version", coerce(dependencies["@react-native/codegen"]));
exportValue("react_native_version", coerce(peerDependencies["react-native"]));

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

From dbb0b39

This should be a macOS tag, and/or also land in main

Comment on lines -54 to +73
node ../app/scripts/internal/set-react-version.mts ${{ steps.versions.outputs.react_native_version }} --overrides '{ "react-native-macos": "file:${{ runner.temp }}/react-native-macos.tgz" }'
node ../app/scripts/internal/set-react-version.mts ${{ steps.versions.outputs.react_native_version }} --overrides '{ "react-native-macos": "file:${{ runner.temp }}/react-native-macos.tgz", "@react-native-macos/virtualized-lists": "file:${{ runner.temp }}/virtualized-lists.tgz" }'

- name: Pin @types/react to avoid duplicate react-native-macos
- name: Pin dependencies to avoid resolution conflicts
working-directory: react-native-test-app
run: |
# The test app tree carries both @types/react 19.1.x (example-macos)
# and 19.2.x (app), both satisfying react-native-macos's peer. Under
# Yarn's pnpm nodeLinker this virtualizes react-native-macos twice and
# trips the metro duplicate-dependency checker. Pin to a single version.
# 1. The test app tree carries both @types/react 19.1.x (example-macos)
# and 19.2.x (app), both satisfying react-native-macos's peer. Under
# Yarn's pnpm nodeLinker this virtualizes react-native-macos twice and
# trips the metro duplicate-dependency checker. Pin to a single version.
# 2. The packed react-native-macos depends on the unpublished
# @react-native-macos/virtualized-lists@1000.0.0; --overrides only covers
# the direct react-native-macos dep, so force the transitive one here.
node -e "
const fs = require('fs');
const root = JSON.parse(fs.readFileSync('package.json', 'utf8'));
root.resolutions = root.resolutions || {};
root.resolutions['@types/react'] = '~19.1.0';
root.resolutions['@react-native-macos/virtualized-lists'] = 'file:${{ runner.temp }}/virtualized-lists.tgz';

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

These should also be cherry-picked to main. Maybe on a gh stack "fixes from 0.83-stable"

Comment on lines -54 to +66
working-directory: packages/react-native
run: |
set -eox pipefail
# Use a tarball instead of a direct path to avoid symlinks
yarn pack -o ${{ runner.temp }}/react-native-macos.tgz
# Use tarballs instead of direct paths to avoid symlinks. The
# @react-native-macos/virtualized-lists workspace dependency is not
# published at the 1000.0.0 dev version, so pack and install it too.
(cd packages/react-native && yarn pack -o ${{ runner.temp }}/react-native-macos.tgz)
(cd packages/virtualized-lists && yarn pack -o ${{ runner.temp }}/virtualized-lists.tgz)

- name: Install local react-native-macos
working-directory: ${{ runner.temp }}/testcli
run: |
set -eox pipefail
npm install ${{ runner.temp }}/react-native-macos.tgz
npm install ${{ runner.temp }}/virtualized-lists.tgz ${{ runner.temp }}/react-native-macos.tgz

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

similar comment about upstream cherry pick here

Comment on lines +10 to +13
#if !TARGET_OS_OSX // [macOS] This screenshot-capturing observer relies on UIKit-only APIs
// (UIScene/UIWindowScene/UIGraphicsImageRenderer/drawViewHierarchyInRect) and is
// only instantiated on iOS (see RCTHost.mm, guarded by TARGET_OS_IPHONE). Provide a
// no-op stub on macOS below so React-Core still compiles.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

We have a shim for UIGraphicsImageRenderer, RCTUIGraphicsImageRenderer. We should consider a full implementation

Comment on lines 66 to 77
[self clearInitialMessageDelay];
[[NSNotificationCenter defaultCenter] removeObserver:self];
UIWindow *window = _window;
RCTPlatformWindow *window = _window; // [macOS]
_window = nil;
if (window) {
RCTExecuteOnMainQueue(^{
#if !TARGET_OS_OSX // [macOS]
window.hidden = YES;
#else // [macOS]
[window orderOut:nil];
#endif // [macOS]
});

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Does 2b8f46b also need to land on main?

Saad Najmi (Saadnajmi) and others added 5 commits August 5, 2026 17:10
Apply the exact minimal patch from merged main commit b3a73ab on top of the approved 0.83.10 rebase.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 9637e853-bb64-49f6-aad0-2e17df0ccf2f
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
## Summary

Present the macOS `RCTDevLoadingView` banner as a centered child window
instead of a modal sheet. AppKit masks short borderless sheets into a
pointed pill shape; a child window remains attached to and follows the
parent without inheriting the sheet frame mask.

The banner now applies its own subtle continuous corner radius and
matching child windows are detached and hidden during cleanup.

## Changelog

[MACOS] [FIXED] - Prevent the development loading view from being
clipped

## Test Plan

<img width="826" height="226" alt="image"
src="https://github.com/user-attachments/assets/3be70235-7c06-4621-8083-456316ab4af9"
/>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: d1aa7dab-4d8e-4c6c-a425-711e6b644559
(cherry picked from commit 78f5b04)
## Summary

- replace stale Nx Release/version-plan contributor guidance with the
current Changesets workflow
- document pinned-SHA upstream stable syncs, peer updates, Changeset
creation and validation, and lock/pod regeneration
- explain that stable-branch pushes create or update a follow-up
Changesets version PR that materializes versions and changelogs

## Stale behavior corrected

The documented `yarn nx release plan ...` command is now a successful
no-op because Nx version plans are disabled.
These pages now point contributors to `yarn change`, `yarn
change:check`, and the active stable-branch Changesets
workflow instead.

## Docusaurus versioning assessment

The docsite currently has no `versions.json`, `versioned_docs`, or
`versioned_sidebars`. These pages describe the
current contributor and release process rather than version-specific
user-facing APIs, so snapshotting them would
freeze stale operational instructions and multiply maintenance. This PR
keeps them as current docs and does not add
Docusaurus version snapshots.

## Test plan

- `yarn prettier --check docsite/docs/contributing/versioning.md
docsite/docs/releases/patch-release.md`
- `yarn lint-markdown docsite/docs/contributing/versioning.md
docsite/docs/releases/patch-release.md`
- `yarn --cwd docsite build`
- `yarn --cwd docsite typecheck` *(currently reports the pre-existing
missing `@fluentui/react-icons` module in the
  unchanged homepage components)*

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: c19d37f3-daaf-41f8-8166-8400a62733f5
(cherry picked from commit cc5fac9)
## Summary

Adds two narrow RCTUIKit compatibility primitives and adopts them in
RedBox, which collapses most of RedBox's platform forking.

- `RCTUITableView` / `RCTUITableViewCell` — `@compatibility_alias` to
`UITableView`/`UITableViewCell` on iOS and visionOS; on macOS an
`NSScrollView` subclass wrapping a private `NSTableView`, with narrow
data-source/delegate protocols and an exact `NSIndexPath` row/section
bridge, plus a one-case `RCTUITableViewStyle` and a forwarding
`-initWithFrame:style:` so the iOS initializer shape is shared.
- `RCTUILabel` — implements the `text` getter and the
`numberOfLines`/`textAlignment` pairs that were already declared in the
header but never backed.

RedBox goes from 1124 to 1007 lines. `TARGET_OS_OSX` conditional blocks
fall from 30 to 25. Platform-forked lines fall from 431 to 244
(macOS-only 243 → 133, iOS-only 188 → 111); this revision deliberately
gives a few of those back to restore upstream's exact iOS bytes in the
table setup and the two `reuseCell:` methods.

The upstream iOS button code is left untouched. `RCTRedBox.mm`'s
`UIButton (RCTRedBox)` category and its `redBoxButton:` factory are
byte-identical to upstream `a034841`; the macOS variants are added only
inside `TARGET_OS_OSX` guards. Against upstream, the button region has
zero removed lines.

## macOS design notes

- The macOS table flattens sections and headers into a single backing
row list, and uses `NSTableViewStyleInset` explicitly.
- Row heights use AppKit's native `usesAutomaticRowHeights`. Fixed
heights come from an explicit height constraint on the cell;
`tableView:heightOfRow:` supplies the estimate. Automatic heights come
from AutoLayout, with `preferredMaxLayoutWidth` maintained as the cell
resizes so text reflows on window resize.
- Header views are created lazily, cached per reload generation, and
pointer-stable within a generation. Sections with zero header height get
no slot at all.
- Cells go through real `makeViewWithIdentifier:` reuse, so
`prepareForReuse` is driven by AppKit rather than called manually.

## RedBox behavior changes

Visuals are intended to be unchanged. The macOS RedBox keeps its 16pt
inset and 8pt continuous-radius message card, and the buttons keep their
existing borderless momentary-push appearance, attributed titles, and
key equivalents (⎋ / ⌘R / ⌥⌘C).

Bugs fixed along the way, all of which were coupled to the migration:
- Stack rows are now recycled instead of a new cell being built for
every row.
- Reused rows have their line limits and identifiers reset
unconditionally, instead of leaking a 3-line limit onto later rows.
- The message cell's accessibility identifier was `"red box-error"` and
is now `redbox-error`, matching iOS.
- A nil error message is now mapped through the section count rather
than shifting every stack row by one.
- `redBoxButton:` set its accessibility identifier to the literal string
`@"accessibilityIdentifier"` instead of the parameter.
- The macOS message text is selectable again.

## Validation status — draft; a reported visual regression has been
addressed but not re-verified

A macOS capture of the previous revision showed the RedBox message card
losing its rounded
corners and its text insets, and stack frame rows clipped at the top.
This revision addresses
all three:

- The red background and the 8pt continuous corner radius are applied to
the cell's own layer
again, matching the code this PR replaces. No competing background is
drawn over the corners.
- Subtitle-style cells now carry a 5pt top inset and a 5pt bottom inset,
which the previous
  revision had dropped to zero.
- `RCTUITableViewCell` sets `rowSizeStyle =
NSTableViewRowSizeStyleCustom`, so NSTableCellView
  does not apply its own standard metrics to the `textField` outlet.
- Header views now reuse a single identified height constraint instead
of gaining a new one on
  every reload.

These fixes have NOT been visually re-verified.
Do not merge until all of the following pass:

- [ ] RNTester macOS native project build (`pod install` + `xcodebuild`)
- [ ] RNTester iOS native project build
- [ ] visionOS build
- [ ] Capture the RedBox sheet on `main` and on this branch at an
identical window size and
compare corner radius, text insets, glyph tops, 16pt row inset, and the
footer

Known risk: `NSTableView` assigns its `effectiveRowSizeStyle` onto each
cell view, so the
cell-side `rowSizeStyle` may need to be set on the table as well. This
must be validated in the
macOS build and GUI pass.

## Known follow-ups

- The RedBox message-height estimate measures against the scroll view's
content width minus 30, which does not account for the inset style's row
padding. Worth confirming during the GUI pass that long messages are not
clipped.
- `RCTUITableViewAutomaticDimension` and the header APIs have no
consumer in this PR.

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
(cherry picked from commit efb2eb5)
@Saadnajmi
Saad Najmi (Saadnajmi) force-pushed the 0.83/saadnajmi/merge-0.83.10 branch from 77af67b to e063ce9 Compare August 6, 2026 00:51
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.