chore(0.83): sync 0.83.10 and backport RedBox 2.0 - #3022
Open
Saad Najmi (Saadnajmi) wants to merge 121 commits into
Open
chore(0.83): sync 0.83.10 and backport RedBox 2.0#3022Saad Najmi (Saadnajmi) wants to merge 121 commits into
Saad Najmi (Saadnajmi) wants to merge 121 commits into
Conversation
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
Tommy Nguyen (tido64)
approved these changes
Jul 29, 2026
Saad Najmi (Saadnajmi)
marked this pull request as ready for review
July 29, 2026 21:07
…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>
Saad Najmi (Saadnajmi)
force-pushed
the
0.83/saadnajmi/merge-0.83.10
branch
from
August 5, 2026 08:08
86581f3 to
77af67b
Compare
| @@ -4,6 +4,6 @@ | |||
| "baseBranch": "origin/main", | |||
Collaborator
Author
There was a problem hiding this comment.
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"])); |
Collaborator
Author
There was a problem hiding this comment.
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'; |
Collaborator
Author
There was a problem hiding this comment.
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 |
Collaborator
Author
There was a problem hiding this comment.
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. |
Collaborator
Author
There was a problem hiding this comment.
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] | ||
| }); |
Collaborator
Author
There was a problem hiding this comment.
Does 2b8f46b also need to land on main?
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)
Saad Najmi (Saadnajmi)
force-pushed
the
0.83/saadnajmi/merge-0.83.10
branch
from
August 6, 2026 00:51
77af67b to
e063ce9
Compare
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.
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:
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
EXIT=0,** BUILD SUCCEEDED **)d7f6c18b7d570d06a79297c774e6343a92e178910374ea9ab5a99d8ac77aad4e842 / 144 / 16total lines / fork lines / top-level macOS guardsmanual 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.