Skip to content

feat: merge 0.85-merge into 0.84-merge#3033

Draft
Saadnajmi wants to merge 586 commits into
microsoft:0.84-mergefrom
Saadnajmi:0.85-merge
Draft

feat: merge 0.85-merge into 0.84-merge#3033
Saadnajmi wants to merge 586 commits into
microsoft:0.84-mergefrom
Saadnajmi:0.85-merge

Conversation

@Saadnajmi

@Saadnajmi Saadnajmi commented Jul 17, 2026

Copy link
Copy Markdown
Collaborator

Summary

Merge the exact React Native 0.85 fork point, b5c815c1ca794ae5d1c0cb8b23e94418b7a4b140, into Microsoft 0.84-merge at 2777fb703e8416d44eff7f5b5d29b498040a8883.

The recreated mechanical merge is 49d78710e7a97fbbd0280ccd956d5e9d0e35afe1, with those exact first and second parents. The Facebook 0.85-stable tip 2049278a5a76fbebf27b2b86f58ce865b673ba14 is intentionally excluded (59 commits after the fork point).

This branch should remain based on 0.84-merge until #3030 lands, then be retargeted to main.

Conflict resolution

The initial merge produced 83 conflicted paths / 290 conflict hunks / 249 terms / 7 deletion conflicts. Every path is represented exactly once below and every hunk is represented in the external per-hunk-resolution-ledger.json.

Area Upstream change macOS decision
Workspaces/Jest Extracted @react-native/jest-preset and updated the 0.85 dependency graph. Added strict pnpm linkage, RNM module mapping, macos haste resolution, and AccessibilityInfo parity.
Public JS/events Modernized Flow and event declarations. Preserved drag, auxiliary-click, double-click, keyboard, accessibility, and RNM virtualized-list APIs without duplicate declarations.
Apple components Updated UIKit, lifecycle, VirtualView, text/input/image, and availability behavior. Combined with RCTUIKit/AppKit, fixed image orientation and display-link ownership, and made iOS/visionOS/macOS builds pass.
Legacy interop Moved implementation under platform/ios. Retained the macOS coordinator while compiling the new descriptor and exactly one coordinator implementation per platform.
SwiftPM/CocoaPods Added 0.85 sources and platform targets. Preserved source swapping and duplicate-source avoidance; regenerated RNTester CocoaPods metadata.
Hermes Defaulted to Hermes V1. Preserved RNM version mapping/source fallback and pinned the matching compiler 250829098.0.6.
Generated output Updated lockfiles, API declarations, and snapshots. Regenerated each in separate reversible commits after semantic integration.
Diff-tag compliance Fork-specific code follows the canonical inline-diff convention. Audited 101 scoped paths and corrected missing/malformed single-line, block, guard, and file-level markers without editing the format guide.

Layered commits

Commit Purpose
49d78710 Mechanical two-parent conflict resolution
aa440a62 Workspace/package integration
9c8feac5 Jest/macOS platform resolution
96966e2f iOS prebuild and Hermes integration
38543525 Public type/event integration
6e8bc144 Apple platform integration
109e8dab Regenerated yarn.lock
2b4fb687 Regenerated RNTester Podfile.lock
37fc2849 Regenerated API and test snapshots
982851e8 Superseded docs attempt, fully reverted in the final tree
2741f447 Restored the format guide and audited/corrected 0.85 macOS diff tags
404aa453 Empty no-op audit marker created after guide restoration; retained transparently under the additive/no-force policy
dcd3d603 Aligned two multiline hover guards with upstream 0.85

Validation

All final gates passed from a fresh exported Git checkout:

  • immutable Yarn install and constraints
  • generated API/types and snapshot determinism
  • 282 Jest suites / 5,631 passing tests / 1,826 snapshots
  • Flow, ESLint, Prettier, TypeScript, generated TypeScript
  • iOS prebuild parser and syntax checks
  • Bundler and CocoaPods (87 Podfile dependencies / 86 pods)
  • both Swift package dumps
  • RNTester macOS, iOS simulator, and visionOS simulator builds
  • DAG topology, unique Change IDs, object connectivity, stable-tip exclusion, conflict-marker scan, and clean final checkout
  • canonical guide byte identity; 101-path diff-tag inventory; zero block-pair, preprocessor-pattern, or macOS-only-file marker issues
  • post-dcd3d603 focused rerun: exact upstream guard-alignment audit, CocoaPods, and RNTester macOS, iOS simulator, and visionOS simulator builds; all 10 gates passed and the exported checkout returned clean

Diff-tag gate and independent review

The executor treated compliance with docsite/docs/contributing/diffs-with-upstream.md as blocking and saved both the 101-path classification and validation logs. Justified exceptions are: 33 JSON/generated artifacts that cannot carry comments, 5 resolved deletions, 5 paths now equal to upstream, and 1 whitespace-only path.

Independent judge requirement: re-audit the actual diff tags rather than trusting the executor summary. Fail this execution for any untagged or mistagged retained/new fork difference, stale tag around removed behavior, changed macOS-only file without a file-level [macOS] marker, or upstream conditional that was restructured when a minimal additive clause would suffice.

Evidence: external diff-tag-audit-inventory.tsv, validation/diff-tag-audit.log, validation/diff-tag-final-checks.log, validation/judge-cleanup-summary.tsv, and judge-cleanup-validation.md. The audit records APPROVED_UPSTREAM_ALIGNMENTS=2 and NON_COMMENT_DIFFS=0.

The 0.85 feature/divergence analysis is preserved externally in diffs-with-upstream-audit.md. The repository guide is byte-identical to 37fc2849 and has no net PR diff.

Complete conflicted-path inventory

83 paths
  • .github/actions/setup-xcode/action.yml
  • .gitignore
  • 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/debugger-shell/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/Libraries/AppDelegate/RCTDefaultReactNativeFactoryDelegate.mm
  • packages/react-native/Libraries/AppDelegate/RCTRootViewFactory.mm
  • packages/react-native/Libraries/Components/AccessibilityInfo/AccessibilityInfo.js
  • packages/react-native/Libraries/Components/TextInput/TextInput.flow.js
  • packages/react-native/Libraries/Components/Touchable/Touchable.js
  • packages/react-native/Libraries/Components/View/ReactNativeViewAttributes.js
  • packages/react-native/Libraries/Components/View/ViewPropTypes.js
  • packages/react-native/Libraries/Image/RCTImageUtils.mm
  • packages/react-native/Libraries/LogBox/Data/parseLogBoxLog.js
  • packages/react-native/Libraries/LogBox/UI/LogBoxInspectorReactFrames.js
  • packages/react-native/Libraries/LogBox/UI/LogBoxInspectorStackFrame.js
  • packages/react-native/Libraries/Text/Text.js
  • packages/react-native/Libraries/Text/TextInput/Multiline/RCTUITextView.mm
  • packages/react-native/Libraries/Text/TextInput/RCTBackedTextInputDelegateAdapter.mm
  • packages/react-native/Libraries/Text/TextProps.js
  • packages/react-native/Libraries/Types/CoreEventTypes.js
  • packages/react-native/Package.swift
  • packages/react-native/React/Base/RCTUtils.mm
  • packages/react-native/React/CoreModules/RCTClipboard.mm
  • packages/react-native/React/CoreModules/RCTDeviceInfo.mm
  • packages/react-native/React/CoreModules/RCTKeyboardObserver.mm
  • packages/react-native/React/CoreModules/RCTPerfMonitor.mm
  • packages/react-native/React/CoreModules/RCTRedBox.mm
  • packages/react-native/React/Fabric/Mounting/ComponentViews/InputAccessory/RCTInputAccessoryComponentView.mm
  • packages/react-native/React/Fabric/Mounting/ComponentViews/Modal/RCTFabricModalHostViewController.mm
  • packages/react-native/React/Fabric/Mounting/ComponentViews/Modal/RCTModalHostViewComponentView.mm
  • packages/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm
  • packages/react-native/React/Fabric/Mounting/ComponentViews/Text/RCTParagraphComponentView.mm
  • packages/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm
  • packages/react-native/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputUtils.mm
  • packages/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm
  • packages/react-native/React/Fabric/Mounting/ComponentViews/VirtualView/RCTVirtualViewComponentView.mm
  • packages/react-native/React/Fabric/Mounting/ComponentViews/VirtualViewExperimental/RCTVirtualViewExperimentalComponentView.h
  • packages/react-native/React/Fabric/Mounting/ComponentViews/VirtualViewExperimental/RCTVirtualViewExperimentalComponentView.mm
  • packages/react-native/React/Modules/RCTLayoutAnimation.m
  • packages/react-native/React/Modules/RCTUIManager.mm
  • packages/react-native/React/Views/RCTComponentData.mm
  • packages/react-native/React/Views/RCTView.m
  • packages/react-native/ReactApple/RCTSwiftUIWrapper/RCTSwiftUIWrapper.podspec
  • packages/react-native/ReactCommon/React-FabricComponents.podspec
  • packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/RCTLegacyViewManagerInteropCoordinator.h
  • packages/react-native/ReactCommon/react/renderer/components/legacyviewmanagerinterop/RCTLegacyViewManagerInteropCoordinator.mm
  • packages/react-native/ReactCommon/react/renderer/components/view/BaseTouch.h
  • packages/react-native/ReactNativeApi.d.ts
  • packages/react-native/jest/mocks/AccessibilityInfo.js
  • packages/react-native/jest-preset.js
  • packages/react-native/package.json
  • packages/react-native/scripts/ios-prebuild/headers.js
  • packages/react-native/scripts/ios-prebuild/hermes.js
  • packages/react-native/scripts/ios-prebuild/xcframework.js
  • packages/react-native/sdks/hermes-engine/hermes-engine.podspec
  • 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/rn-tester/Gemfile
  • packages/rn-tester/js/types/RNTesterTypes.js
  • packages/rn-tester/package.json
  • packages/typescript-config/package.json
  • packages/virtualized-lists/Lists/__tests__/__snapshots__/VirtualizedList-test.js.snap
  • packages/virtualized-lists/package.json
  • private/react-native-bots/package.json
  • private/react-native-codegen-typescript-test/package.json
  • yarn.lock

Novel conflict classes

  • Jujutsu working-copy snapshot/layer-boundary hazard
  • Hermes V1 inversion plus fork version mapping
  • platform replacement with retained macOS implementation
  • generated output folded into a mechanical snapshot
  • path-dependent CocoaPods spec checksums
  • strict pnpm linkage for a new upstream workspace
  • public type/event convergence and deduplication
  • Apple availability differences across macOS/iOS/visionOS

mvitousek and others added 30 commits February 11, 2026 12:35
Summary:
Pull Request resolved: react#55525

[changelog](https://github.com/facebook/flow/blob/main/Changelog.md)
Changelog: [Internal]

Reviewed By: marcoww6

Differential Revision: D92902224

fbshipit-source-id: 52ef18ab4c8d841d3e84acbcac03813366a528e6
Summary:
Pull Request resolved: react#55526

This allows character styling to be implemented, which can draw to the canvas, before or after main text draw, with full access to layout information. This allows very efficiently drawing some effects not possible on TextView.

Changelog:
[Android][Added] -Add Unstable DrawCommandSpan Usable with PreparedLayoutTextView

Reviewed By: Abbondanzo

Differential Revision: D92796048

fbshipit-source-id: 8ec542152c6a5c7c4a4d9cc99ace2edf42ef493e
…ga/algorithm (react#55522)

Summary: Pull Request resolved: react#55522

Reviewed By: cortinico

Differential Revision: D92810369

fbshipit-source-id: f2125a8fbaae3486b4a4ace59e513ce2a9367824
…in truncated text range (react#55518)

Summary:
### Title

[iOS] Inline attachments in truncated Text still visible (Fabric)

 ---

### Description

On iOS with the New Architecture (Fabric), inline attachments in a `<Text>` that lie beyond the `numberOfLines` limit are still being rendered instead of being clipped.

As a result, the attachment that should be clipped appears just above its wrapper. See screenshots below.

 ---

### MANDATORY Reproducer

https://snack.expo.dev/kamildelekta/truncatedtextattachmentvisiblebug

 ---

### Screenshots of issue

Only `maxLines` changes between these two screenshots. You can check it yourself in the expo snack above.

| Text    | Truncated Text |
| --------- | ------- |
|<img width="250" height="1027" alt="maxLines4" src="https://github.com/user-attachments/assets/bc93a03a-7819-4ec6-84ab-dea2bd7cbe6c" />   | <img width="250" height="1029" alt="maxLines3" src="https://github.com/user-attachments/assets/25eee68d-ef10-40d2-a657-b9dc9e158c1b" />        |

### React Native Version

```
"react-native": "0.83.0"
```

 ---

### Affected Platforms

only IOS New Arch

 ---

Pull Request resolved: react#55518

Test Plan:
**Visible cases**

Tested multiple layouts where the attachment is in range; the attachment is shown and laid out correctly.

**Clipped cases**

Tested both clipping paths: (1) attachment after the last visible line → `isOutsideVisibleRange`; (2) attachment in the truncated "..." range → `isInTruncatedRange`. In both cases the attachment is correctly clipped.

**Context**
Before this change we only had `isInTruncatedRange`. Handling for `isOutsideVisibleRange` was added. The example below shows that these two clipping cases are mutually exclusive; in the app, both cases correctly clip the attachments.

Testing code:

```
<View style={{ flex: 1, justifyContent: 'center', padding: 16, alignItems: 'stretch' }}>
      <Text style={{ fontSize: 20, fontWeight: 'bold', marginBottom: 8, color: 'react#333' }}>
        Correctly clipped
      </Text>
      {/* Case 1: isOutsideVisibleRange: 1, isInTruncatedRange: 0 */}
      <Text numberOfLines={3} style={{ fontSize: 18, borderWidth: 1, marginBottom: 16, textAlign: 'justify' }}>
        Line 1{'\n'}Line 2{'\n'}Line 3{'\n'}
        <View style={{ width: 20, height: 20, backgroundColor: 'red' }} />
      </Text>

      {/* Case 2: isOutsideVisibleRange: 0, isInTruncatedRange: 1 */}
      <Text numberOfLines={1} style={{ fontSize: 18, width: 200, borderWidth: 1, marginBottom: 8 }}>
        Long text that truncates with ellipsis
        <View style={{ width: 20, height: 20, backgroundColor: 'blue' }} />
      </Text>

      <Text style={{ fontSize: 20, fontWeight: 'bold', marginTop: 16, marginBottom: 8, color: 'react#333' }}>
        Visible
      </Text>
      <Text style={{ fontSize: 12, color: 'react#666', marginBottom: 4, marginTop: 8 }}>First char</Text>
      <Text numberOfLines={2} style={{ fontSize: 18, borderWidth: 1, marginBottom: 16, textAlign: 'justify' }}>
        <View style={{ width: 20, height: 20, backgroundColor: 'green' }} />
        text after attachment
      </Text>

      <Text style={{ fontSize: 12, color: 'react#666', marginBottom: 4 }}>Middle of line</Text>
      <Text numberOfLines={3} style={{ fontSize: 18, borderWidth: 1, marginBottom: 16, textAlign: 'justify' }}>
        Line 1{'\n'}Line 2 with
        <View style={{ width: 20, height: 20, backgroundColor: 'green' }} />
        {'\n'}Line 3
      </Text>

      <Text style={{ fontSize: 12, color: 'react#666', marginBottom: 4 }}>End of line 1</Text>
      <Text numberOfLines={3} style={{ fontSize: 18, borderWidth: 1, marginBottom: 16, textAlign: 'justify' }}>
        Line 1
        <View style={{ width: 20, height: 20, backgroundColor: 'orange' }} />
        {'\n'}Line 2{'\n'}Line 3
      </Text>

      <Text style={{ fontSize: 12, color: 'react#666', marginBottom: 4 }}>Short text, end</Text>
      <Text style={{ fontSize: 18, borderWidth: 1, marginBottom: 16, textAlign: 'justify' }}>
        Short text
        <View style={{ width: 20, height: 20, backgroundColor: 'orange' }} />
      </Text>

      <Text style={{ fontSize: 12, color: 'react#666', marginBottom: 4 }}>Only attachment on line</Text>
      <Text numberOfLines={2} style={{ fontSize: 18, borderWidth: 1, textAlign: 'justify' }}>
        <View style={{ width: 20, height: 20, backgroundColor: 'purple' }} />
        {'\n'}Second line
      </Text>
    </View>
```
and here some examples:

| oldArch    | newArch | newArch fixed
| --------- | ------- | ------- |
|<img width="250" height="2622" alt="oldArch" src="https://github.com/user-attachments/assets/aaffac4c-f3da-43ff-9560-7eb6e5258eb3" />   | <img width="250" height="2622" alt="newArch" src="https://github.com/user-attachments/assets/8905bb4e-8431-4f4d-ae46-770705520a61" />        | <img width="250" height="2622" alt="newArchFixed" src="https://github.com/user-attachments/assets/f786178e-438d-4a90-8ccf-9802181b5d8c" />|

 ---

## Changelog:

[iOS] [Fixed] - Inline attachments after the last visible line in truncated text are now correctly marked as clipped.

 ---

### Output of `npx react-native-community/cli info`

```
System:
  OS: macOS 26.2
  CPU: (12) arm64 Apple M4 Pro
  Memory: 982.39 MB / 48.00 GB
  Shell:
    version: "5.9"
    path: /bin/zsh
Binaries:
  Node:
    version: 22.14.0
    path: /nix/store/04fc23dsflkxl4s9p6lkigia1hq3vjp2-nodejs-22.14.0/bin/node
  Yarn:
    version: 1.22.19
    path: /Users/kamil/.nix-profile/bin/yarn
  npm:
    version: 10.9.2
    path: /nix/store/04fc23dsflkxl4s9p6lkigia1hq3vjp2-nodejs-22.14.0/bin/npm
  Watchman:
    version: 2024.03.11.00
    path: /Users/kamil/.nix-profile/bin/watchman
Managers:
  CocoaPods:
    version: 1.15.2
    path: /Users/kamil/.nix-profile/bin/pod
SDKs:
  iOS SDK:
    Platforms:
      - DriverKit 25.2
      - iOS 26.2
      - macOS 26.2
      - tvOS 26.2
      - visionOS 26.2
      - watchOS 26.2
  Android SDK: Not Found
IDEs:
  Android Studio: Not Found
  Xcode:
    version: 26.2/17C52
    path: /usr/bin/xcodebuild
Languages:
  Java: Not Found
  Ruby:
    version: 2.6.10
    path: /usr/bin/ruby
npmPackages:
  "react-native-community/cli":
    installed: 20.0.0
    wanted: 20.0.0
  react:
    installed: 19.2.0
    wanted: 19.2.0
  react-native:
    installed: 0.83.0
    wanted: 0.83.0
  react-native-macos: Not Found
npmGlobalPackages:
  "*react-native*": Not Found
Android:
  hermesEnabled: true
  newArchEnabled: true
iOS:
  hermesEnabled: true
  newArchEnabled: true

info React Native v0.83.2 is now available (your project is running on v0.83.0).
```

 ---

Reviewed By: NickGerleman

Differential Revision: D92991293

Pulled By: CalixTang

fbshipit-source-id: ebd097c4311a18e0f628fe5dd3eec353582ce423
Summary:
Pull Request resolved: react#55499

Fixed multiple lint warnings in NativeViewHierarchyManager.java:

1. ClownyBooleanExpression: Added SuppressLint for intentionally disabled
   DEBUG_MODE (ReactBuildConfig.DEBUG && false). This pattern is used to
   easily enable debug mode by changing to just ReactBuildConfig.DEBUG.

2. NullableAnnotationShouldNotAddToPrimitiveTypes: Removed Nullable from
   getInstanceHandle() which returns a primitive long. Primitives can't be
   null; this method throws exceptions instead of returning null.

3. NotInvokedPrivateMethod: Removed unused private methods arrayContains()
   and getReactContextForView() which were dead code.

changelog: [internal] internal

Reviewed By: alanleedev

Differential Revision: D91992935

fbshipit-source-id: 367f0d9a6b3f5bbbf10d61c0e5ba02071eb60ee8
…ct#55515)

Summary:
Pull Request resolved: react#55515

Add updateRuntimeShadowNodeReferencesOnCommitThread feature flag to enable syncing the shadow nodes on commits running on the allowed thread.

This feature flag is more flexible than updateRuntimeShadowNodeReferencesOnCommit, which only would sync on commits originating from the React renderer.

Changelog: [Internal]

Reviewed By: javache

Differential Revision: D92913632

fbshipit-source-id: ff619d3f88580de2d290305d2fc67bd75d52be79
Summary:
Pull Request resolved: react#55488

This diff introduces docs for the Animation Backend

# Changelog
[General][Added] - AnimationBackend docs

Reviewed By: NickGerleman

Differential Revision: D92826716

fbshipit-source-id: f3f48f66d85c6a586a520f8015a0f988decc5885
…t#55400)

Summary:
Since HermesV1 is enabled by default in React Native 0.84, the prebuilt Android artifacts are compiled with the flag `HERMES_V1_ENABLED`. This results in dropping some inspector symbols, in my case `enableDebugging` and `disableDebugging` from `inspector-modern/chrome/Registration.cpp`.

This is problematic, because even if the app sets `hermesV1Enabled=false` in `gradle.properties`, it's shipped with binaries compiled with `hermesV1Enabled=true`. This makes it so I'm expecting symbols that should be available when `HERMES_V1_ENABLED` macro isn't defined - but they aren't available.

I don't know what other symbols could lead to compilation failures, maybe shipping a whole other binary would be a better idea. For the time being I made a simple fix that would provide fallback implementations instead of not generating them at all.

## Changelog:

[ANDROID] [FIXED] - Provide symbol fallbacks for `inspector-modern/chrome/Registration.h` when HermesV1 is disabled.

Pull Request resolved: react#55400

Test Plan: I tested these changes (although in `Registration.h` file) in a project, not building from source, and they worked.

Reviewed By: cipolleschi

Differential Revision: D92964824

Pulled By: cortinico

fbshipit-source-id: a87ceab6d25095062de200d1a08821dba379240d
…react#55528)

Summary:
Pull Request resolved: react#55528

Move the RCT_DEV_SETTINGS_ENABLE_PACKAGER_CONNECTION define from RCTDefines.h to RCTDevSettings.mm, which is its only consumer. This removes a __has_include dependency from the shared header, making RCTDefines.h usable as a standalone lightweight target without pulling in RCTPackagerConnection.h.

Changelog: [Internal]

Reviewed By: cipolleschi

Differential Revision: D93018381

fbshipit-source-id: bff276bb788197bb59a7f4626cc355d85a8dea87
Summary:
Pull Request resolved: react#55536

Changelog: [Internal]

Reviewed By: vzaidman

Differential Revision: D92831007

fbshipit-source-id: 60089442334ca5be6046bfd7f16c816d57e62408
Summary:
Pull Request resolved: react#55537

Changelog:
[General] [Added] - Create featureflag viewTransitionEnabled

This diff adds a new React Native feature flag `viewTransitionEnabled` to gate the View Transition API feature.

The View Transition API enables animated transitions between views, providing a smooth visual experience when navigating between screens or updating UI elements. This flag allows the feature to be gradually rolled out and tested before full enablement.

The flag is added across all platform layers:
- JavaScript (ReactNativeFeatureFlags.js, NativeReactNativeFeatureFlags.js)
- Android Kotlin (ReactNativeFeatureFlags.kt, provider, accessor, defaults)
- C++/JNI (ReactNativeFeatureFlags.cpp/h, JReactNativeFeatureFlagsCxxInterop)
- Feature flag config (ReactNativeFeatureFlags.config.js)

Default value is `false` to ensure the feature is opt-in during experimentation.

Reviewed By: NickGerleman

Differential Revision: D92713074

fbshipit-source-id: cd9e567df3135f99c8a931fffab655f16883cf94
Summary:
[Android][Fixed] - Fix null pointer crash in FabricUIManagerBinding::driveCxxAnimations by adding null check for scheduler

Pull Request resolved: react#55529

Crash failures during e2e: https://www.internalfb.com/intern/test/562949977559616
logview: https://fburl.com/logview/65na7gyr

Reason: null dereference
Pull Request resolved: react#55529

Crash failures during e2e: https://www.internalfb.com/intern/test/562949977559616
logview: https://fburl.com/logview/65na7gyr

Reason: null dereference

Reviewed By: javache

Differential Revision: D92986523

fbshipit-source-id: 2a193cdc93a44a59fedfb7974bb694546a2000f6
Summary:
Pull Request resolved: react#55501

The BaseVMFocusChangeListener inner class does not reference any members
of its outer class BaseViewManager. Making it static improves memory
efficiency by avoiding the implicit reference to the outer class instance.

Also removed the unused type parameter <V extends View> and changed the
method parameters from T to View since only View interface methods are used.

changelog: [internal] internal

Reviewed By: cortinico

Differential Revision: D92020879

fbshipit-source-id: a26378ed6f9f5dfcc64c49aaf734559e1e7be09e
…5502)

Summary:
Pull Request resolved: react#55502

This change adds missing Override annotations to three methods in LayoutShadowNode that override methods from the parent class:
- setFlex(float)
- setFlexGrow(float)
- setFlexShrink(float)

These methods call super.setFlex/setFlexGrow/setFlexShrink, indicating they override parent methods and should have Override annotations for code clarity and compiler checking.

changelog: [internal] internal

Reviewed By: alanleedev

Differential Revision: D92021000

fbshipit-source-id: 28a4d0676c18d99dddb173066964cd8c5ea321ac
…ct#55503)

Summary:
Pull Request resolved: react#55503

Remove unused code that was triggering lint warnings:
1. Remove `walkUpUntilNativeKindIsParent` private method that was never invoked
2. Remove `parent` variable in `applyLayoutBase` that was never accessed

Both were leftover from NativeKind removal.

changelog: [internal] internal

Reviewed By: alanleedev

Differential Revision: D92021031

fbshipit-source-id: 7549efd01ddf167df4a130c255ccf1c8d663e1d2
…55504)

Summary:
Pull Request resolved: react#55504

Replace `TextUtils.join(", ", features)` with the idiomatic Kotlin
`features.joinToString(", ")`. This fixes the HasBetterKotlinAlternativeMethod
lint warning and removes the now-unused TextUtils import.

changelog: [internal] internal

Reviewed By: alanleedev

Differential Revision: D92021387

fbshipit-source-id: 38510d3c36ccaf899826f604ed4dd1e843ebe039
…AttributeProps (react#55505)

Summary:
Pull Request resolved: react#55505

Replace `TextUtils.join(", ", features)` with Kotlin's idiomatic `features.joinToString(", ")` to fix the HasBetterKotlinAlternativeMethod lint warning. Also removed the now-unused `TextUtils` import while keeping the `TextUtils.TruncateAt` import that is still in use.

changelog: [internal] internal

Reviewed By: alanleedev

Differential Revision: D92021465

fbshipit-source-id: 3cb9e286f9f46f82817b0257dde73230ba2298d6
…t#55491)

Summary:
Pull Request resolved: react#55491

Fixes crash in `ShadowNode::cloneMultipleRecursive` which tried to access a missing root's family from the `childrenCount` map. The main issue is that in some cases there is no path between the given families to update and the root shadow node. The solution is to check after building the `childrenCount` map if it contains the root family and return `nullptr` otherwise. This behavior is closer to the `getAncestors` method which returns an empty array if there is no ancestor-descendant relationship. Due to this change, an additional check in `AnimationBackendCommitHook` is also required.

## Changelog:
[General][Fixed] - Fixed crash in `cloneMultiple` when families have no path to root

Reviewed By: zeyap

Differential Revision: D92838809

fbshipit-source-id: a87de2c171e4f0f71e566806f5c012ab0bac69fd
…react#55534)

Summary:
Pull Request resolved: react#55534

Replace react_native_assert calls with real bounds checks in RawPropsKeyMap::at() and RawPropsKey::render() to prevent SIGILL/SIGTRAP crashes. In at(), an invalid length now returns kRawPropsValueIndexEmpty instead of trapping. In render(), an overlong prop name is clamped to kPropNameLengthHardCap - 1 instead of asserting.

Changelog: [Internal]

Reviewed By: mdvacca

Differential Revision: D93094839

fbshipit-source-id: 29250d06cb93e84507000551a7a60a09f2df8288
Summary:
Pull Request resolved: react#55542

Adds tests demonstrating that all target versions of Hermes (Legacy Hermes, Static Hermes stable, Static Hermes trunk) support multi-session debugging when integrated into React Native's CDP backend.

Changelog: [Internal]

Reviewed By: hoxyq

Differential Revision: D90888853

fbshipit-source-id: 7ea1be837bde6d71ae2bca2b1487e00c62a44928
…ypes) to latest minors (react#55543)

Summary:
Pull Request resolved: react#55543

@public

This diff updates several Babel packages to their latest versions:
- `babel/code-frame`: 7.29.0
- `babel/generator`: 7.29.1
- `babel/parser`: 7.29.0
- `babel/template`: 7.28.6
- `babel/traverse`: 7.29.0
- `babel/types`: 7.29.0

Not bumping `core` or `runtime` here because they're a bit more involved, and I'm mainly interested in `traverse`. The packages here are the closure of traverse's dependency graph.

Changelog: [Internal]

Reviewed By: yungsters

Differential Revision: D92983519

fbshipit-source-id: 9f2e71fb5d453606c697d52539f0056b7a29bc45
Summary:
Pull Request resolved: react#55470

LogBox errors and warnings can affect performance trace measurements by triggering UI updates during profiling. This change adds a mechanism to suppress LogBox messages when CDP performance tracing is active. It clears the logbox when tracing starts and drops messages during tracing

The implementation consists of:

1. **Native observer infrastructure**
(`RuntimeTarget.cpp/h`, `RuntimeTargetPerformanceTracerObserver.cpp/h`): `RuntimeTarget` subscribes to the `PerformanceTracer` singleton's state changes and forwards them into JavaScript. It uses helper functions in                                     `RuntimeTargetPerformanceTracerObserver` to install a `__PERFORMANCE_TRACER_OBSERVER__` object on the JavaScript global (a global because it needs to exist before the module system initializes), which tracks tracing state and notifies subscribers via `onTracingStateChange`.

2. **JavaScript observer** (`PerformanceTracerObserver.js`): Provides a clean API to check tracing status (`isTracing()`) and subscribe to state changes. Gracefully handles environments where native support isn't available.

3. **LogBox integration** (`LogBoxData.js`): Subscribes to the performance tracer observer and:
   - Clears all LogBox messages when tracing starts
   - Skips logging new errors and exceptions while tracing is active

This ensures trace measurements are not impacted by LogBox UI rendering during profiling sessions.

Changelog: [GENERAL] [CHANGED] - Suppress LogBox warnings and errors during CDP performance tracing

Reviewed By: hoxyq

Differential Revision: D92527815

fbshipit-source-id: 975e042766194d9702be2c9e222fd452bb99d841
Summary:
Similiar to how a specific port can be set also allow for setting a specific ip for the dev server.

This allows for easy configuration to aid in generating [reproducible builds](https://izzyondroid.org/docs/reproducibleBuilds/).

## Changelog:

<!-- Help reviewers and the release process by writing your own changelog entry.

Pick one each for the category and type tags:

[ANDROID] [ADDED] - Allow specifying dev server ip via gradle property

For more details, see:
https://reactnative.dev/contributing/changelogs-in-pull-requests
-->

[ANDROID] [ADDED] - Allow specifying dev server ip via gradle property

Pull Request resolved: react#55531

Test Plan:
1) Add `reactNativeDevServerIp=localhost` to `gradle.properties`
2) Generate an APK
3) Analyze the APK and check that the value of the string resource type `react_native_dev_server_ip` matches the value set in `gradle.properties`.

Reviewed By: cortinico

Differential Revision: D93143296

Pulled By: CalixTang

fbshipit-source-id: d0be23e9495f0ba1a6034dc31b6e725fd94a6a02
Summary:
Pull Request resolved: react#55546

Changelog: [Internal]

It looks like we have completely misunderstood the semantic of `clipChildren`.

Looking at the Android [source code](https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/core/java/android/view/ViewGroup.java;l=4607?q=setClipToPadding&ss=android%2Fplatform%2Fsuperproject&fbclid=IwY2xjawP8LExleHRuA2FlbQIxMQBzcnRjBmFwcF9pZAEwAAEeQkZx96WcTaA0mIUVGXeFAxH_aLVBMR0an0N8jeKCYX4E-j9HW0eLnzZcSJI_aem__yWzHP0_x-bPxCQS1nN19w), it seems that `setClipChildren(true)` on a ViewGroup X means clipping **each child** to the **child's own bounds**, not the parent's bound.

Which means also [this](https://www.internalfb.com/code/aosp-vendor-meta-coresdk/[oculus-14.0%3Af0b9166acbb68da2e1e9f7622ba1b7fcee672ebc]/api-src/volumetricwindow/java/horizonos/view/interaction/providers/ViewInteractionNodeProvider.java?lines=502) line in HzOS is based on the same incorrect assumption.

Ultimately, RN should not be populating `clipChildren` when `overflow: hidden` is set.

Reviewed By: javache

Differential Revision: D93237429

fbshipit-source-id: 0c3b18c829ef3880f8cc931263792c50aafa1333
Summary:
Pull Request resolved: react#55547

Changelog: [Internal]

It looks like we have completely misunderstood the semantic of `clipChildren`.

Looking at the Android [source code](https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/core/java/android/view/ViewGroup.java;l=4607?q=setClipToPadding&ss=android%2Fplatform%2Fsuperproject&fbclid=IwY2xjawP8LExleHRuA2FlbQIxMQBzcnRjBmFwcF9pZAEwAAEeQkZx96WcTaA0mIUVGXeFAxH_aLVBMR0an0N8jeKCYX4E-j9HW0eLnzZcSJI_aem__yWzHP0_x-bPxCQS1nN19w), it seems that `setClipChildren(true)` on a ViewGroup X means clipping **each child** to the **child's own bounds**, not the parent's bound.

Which means also [this](https://www.internalfb.com/code/aosp-vendor-meta-coresdk/[oculus-14.0%3Af0b9166acbb68da2e1e9f7622ba1b7fcee672ebc]/api-src/volumetricwindow/java/horizonos/view/interaction/providers/ViewInteractionNodeProvider.java?lines=502) line in HzOS is based on the same incorrect assumption.

Ultimately, RN should not be populating `clipChildren` when `overflow: hidden` is set.

Reviewed By: Abbondanzo

Differential Revision: D93238810

fbshipit-source-id: aff74b1f339fa707bcec1667580ce710a49f93dd
Summary:
Pull Request resolved: react#55551

Changelog: [Internal] -  Migrated 8 files in
`xplat/js/react-native-github/packages/rn-tester/` from the manual `useRef(new Animated.Value(x))` pattern to the `useAnimatedValue(x)` hook.

Reviewed By: fabriziocucci

Differential Revision: D93258352

fbshipit-source-id: 778a2edbd3e168284c5e6b313bd3aa0102d0523f
Summary:
Pull Request resolved: react#55434

This is used by `Image`, to render a different component when under a `TextAncestorContext`, but the underlying component is remapped by Fabric to instead be interpreted as `Image`. We can delete the code JS side safely, since it will use the existing registered View manager, Fabric will already redirect to. We can also then delete the redirection in Fabric, since the component is no longer ever used.

See `componentNameByReactViewName.cpp`, where this is also removed.

Changelog: [Internal]

Reviewed By: mdvacca, javache, cortinico

Differential Revision: D92481981

fbshipit-source-id: c33897efee124eaabed5447266389f34709650e0
Summary:
Pull Request resolved: react#55539

Move `useAnimatedValueXY` and `useAnimatedColor` hooks into react-native-github so they can be used by OSS alongside the existing `useAnimatedValue` hook which can only take number value.

## Changelog:

[General] [Added] - upstream useAnimatedColor and useAnimatedValueXY

Reviewed By: fabriziocucci

Differential Revision: D93125807

fbshipit-source-id: 74fb3925e8d495cddce7b28bdf852995854f85bb
…ing (react#55527)

Summary:
Pull Request resolved: react#55527

On API 25 (Nougat), the `DST_OUT` + `EVEN_ODD` inverse path technique in `clipWithAntiAliasing()` doesn't render correctly — it erases all image content instead of just the area outside the rounded rect.

The bug manifests specifically with ReactImageView (Fresco-backed) but not plain ImageView. ReactImageView's Fresco hierarchy configures `RoundingParams.RoundingMethod.BITMAP_ONLY`, which causes the drawable chain to draw through a `BitmapShader`-based paint. This shader-based drawing interacts badly with the `EVEN_ODD` fill + `DST_OUT` compositing inside a hardware-accelerated `saveLayer` on API 24's Skia renderer.

The fix replaces the `EVEN_ODD` + `DST_OUT` technique with a nested `saveLayer` using `DST_IN` compositing, following the same pattern used by Facebook's Keyframes library (`AbstractLayer.applyClip`). The mask shape is drawn into a separate layer; when restored with `DST_IN`, content is preserved only where the mask is opaque. A `drawColor(CLEAR)` call after `saveLayer` ensures the layer starts fully transparent — without this, on API 24, the layer may retain parent content, causing `DST_IN` to see non-zero alpha everywhere and clip nothing.

Changelog: [Android][Fixed] - Fix image content disappearing on API 24 (Nougat) when antialiased border radius clipping is applied

Reviewed By: NickGerleman

Differential Revision: D92980234

fbshipit-source-id: ea6d05d8f06346371eab1c406538e91bbd78d0ae
…tency (react#54833)

Summary:
Pull Request resolved: react#54833

Changelog: [General][Changed] - Refactor how shadow tree revisions are promoted as latest for JS consistency

Changes `LazyShadowTreeRevisionConsistencyManager::updateCurrentRevision` to pull the latest commited revision for a given surface id instead of accepting the new revision as a parameter.

This way, the new revision is read from the same place for every update, which opens up the way to implement commit branching. This change will allow to always read from the JS tree revision, if it exists.

Reviewed By: rubennorte

Differential Revision: D88151490

fbshipit-source-id: 05b9c5e0bf87c7984513bc853a173ad25d4ff592
kmsbernard and others added 30 commits February 27, 2026 13:35
…react#55734)

Summary:
This PR fixes an Android Native Animated crash in tracking + spring animations when the tracked `toValue` node is detached.

In `TrackingAnimatedNode.update`, if the tracked node could not be resolved, we used to write `toValue = null` into `animationConfig`. `SpringAnimation.resetConfig` expects `toValue` to be a number, so this could crash with `NullPointerException: null cannot be cast to non-null type kotlin.Number`

This can happen in real apps during graph teardown (for example unmount/re-render/navigation transitions), where tracking may still update for a transient frame after the tracked node has been detached.

Fix:
- Do not propagate null `toValue` from `TrackingAnimatedNode`.
- If the tracked node is missing, fallback to the driven value node’s current value.
- If both nodes are unavailable, return safely.

This PR also adds a regression test.

## Changelog:

[ANDROID] [FIXED] - Prevent Native Animated tracking spring crash when tracked `toValue` node is detached.

Pull Request resolved: react#55734

Test Plan:
Added regression test `NativeAnimatedNodeTraversalTest.testTrackingSpringDoesNotCrashWhenToValueNodeIsDetached`
- On a test-only commit (without the fix), the new test fails with: `NullPointerException: null cannot be cast to non-null type kotlin.Number`
- On this PR (with the fix), test pass.

Reviewed By: christophpurrer

Differential Revision: D94697059

Pulled By: zeyap

fbshipit-source-id: c8f1f619c34ce7887d6f9bfb42a035d41d6a063a
)

Summary:
Pull Request resolved: react#55789

Removes the deprecated `CatalystInstanceImpl` class (Java) and its C++ JNI
counterparts (`CatalystInstanceImpl.h` and `CatalystInstanceImpl.cpp`) as part
of the Legacy Architecture cleanup.

`CatalystInstanceImpl` was the bridge implementation for the old architecture.
Its sole consumer, `ReactInstanceManager`, is itself deprecated — its
constructor already throws `UnsupportedOperationException`. The
`createReactContext` method that instantiated `CatalystInstanceImpl` has been
stubbed to throw `UnsupportedOperationException` as well.

Changes:
- Deleted `CatalystInstanceImpl.java` (621 lines)
- Deleted `CatalystInstanceImpl.h` and `CatalystInstanceImpl.cpp` (523 lines)
- Stubbed `ReactInstanceManager.createReactContext` to throw
- Removed from BUCK and CMakeLists.txt build files
- Removed from ReactAndroid.api public API surface
- Removed from ReactNoNewJavaDetector Java allowlist
- Removed from legacy architecture tracking script
- Added direct `#include <cxxreact/MessageQueueThread.h>` to
  `JavaModuleWrapper.cpp` to replace transitive dependency

Changelog: [Android][Removed] - Remove deprecated CatalystInstanceImpl

Reviewed By: javache

Differential Revision: D94548637

fbshipit-source-id: 5c447b85c80605cff17c1555d62ede5e9e2f18a7
Summary:
Pull Request resolved: react#55815

Changelog: [Internal]

Reviewed By: andra-marinescu

Differential Revision: D94756759

fbshipit-source-id: bab29dc01deda3717d012f6b19717760a4d1b943
Summary:
Pull Request resolved: react#55816

Changelog: [Internal]

Reviewed By: andra-marinescu

Differential Revision: D94756771

fbshipit-source-id: dd5cc72bc2ce65a9407ae728f149d2541d596ef9
…texts (react#55810)

Summary:
Pull Request resolved: react#55810

`DisplayMetricsHolder.initDisplayMetrics()` calls `context.getSystemService(WINDOW_SERVICE)` which throws `IllegalAccessException` on Android 11+ (API 30+) when called from a non-visual context (e.g. Application context). Multiple callers pass non-Activity contexts (ReactHostImpl, UIManagerModule, DeviceInfoModule, ReactInstance, ReactInstanceManager).

This adds a try-catch around the WindowManager access as defense-in-depth. When it fails, `screenDisplayMetrics` retains the values already copied from resource display metrics via `setTo()`, which is a graceful degradation (only missing system decor dimensions like nav bar height).

Changelog: [Internal] - Guard WindowManager access in DisplayMetricsHolder against non-visual contexts on API 30+

Reviewed By: javache, mdvacca

Differential Revision: D94283765

fbshipit-source-id: 51c3ead60784d30d74fcb9111924aed3ca8483ec
…hDevTools`, infer from `env()` instead. (react#55805)

Summary:
Pull request resolved: react#55805

Currently the RN Babel preset has this surprising bit of behaviour:

```js
module.exports = (options, babel) => {
  if (options.withDevTools == null) {
    const env = process.env.BABEL_ENV || process.env.NODE_ENV;
    if (!env || env === 'development') {
      return getPreset(null, {...options, dev: true}, babel);
    }
  }
  return getPreset(null, options, babel);
};
```

If the (undocumented, otherwise unused) `withDevTools` option is set (to anything), we will override any given value of `dev` to `true` if `BABEL_ENV` || `NODE_ENV || 'development' === 'development'`.

To put that another way, with `NODE_ENV=development` and `BABEL_ENV` unset, we would always produce a dev bundle even if `{ dev: false }`

Expo sets `withDevTools: false` to stop this happening, and always set `dev` (so this diff means **no observable change under Expo**):

https://github.com/expo/expo/blob/4a46dbff7a5a77d9fe06d30a70d7fab38cfc7f9a/packages/babel-preset-expo/build/index.js#L235-L236

This odd-looking override was introduced in 2017 in react@bc22a4d / D5237158 as a way to gate `babel/plugin-transform-react-jsx-source`, *before the preset accepted any other options* - it was never intended to override `dev`. Now, we gate that same plugin under `options.dev`.

## Inferring `dev` when unspecified

The one potentially load-bearing piece of this is that, when a consumer specifies neither `withDevTools` nor `dev` (or maybe no options at all), this code serves to infer it from `process.env.BABEL_ENV || process.env.NODE_ENV`, which is reasonable and actually closer to the way typical plugins/presets work, but a better mechanism compatible with Babel's cache is to use the `env()` API (which defaults to `process.env.BABEL_ENV || process.env.NODE_ENV`, so preserves behaviour).

https://babeljs.io/docs/config-files#apienv

## This change
 - Removes the obsolete use of `withDevToolss`, and never overrides the explicitly-passed `dev`
 - Where `dev` is not specified, falls back to the Babel environment.

Changelog:
[General][Fixed] Babel-preset: Don't override explicitly-passed `dev` config if obsolete `withDevTools` is missing

Reviewed By: huntie

Differential Revision: D94660480

fbshipit-source-id: 5dfae8fb704e6881b03120cd14510795382a98ba
…ementation (react#55818)

Summary:
Pull Request resolved: react#55818

This unblocks the Android CI on master

The deprecated getUIImplementation() method was returning null, which could
cause NullPointerExceptions for callers that still depend on it. Return a
new UIImplementation instance instead.

Changelog: [Internal] - Fix `UIManagerModule.getUIImplementation()` to return a non-null `UIImplementation` instead of null

Reviewed By: alanleedev

Differential Revision: D94743629

fbshipit-source-id: df129f87c310a68634678ff7ed90e77275b02b51
Summary:
Pull Request resolved: react#55767

Add new Fantom integration tests for ActivityIndicator, achieving 100% line coverage for ActivityIndicator.js (from 0%).

Changelog: [Internal]

Reviewed By: CalixTang

Differential Revision: D94360957

fbshipit-source-id: 1312e45bdf0ed9cf6c337b101b83c7b9e456c4d1
Summary:
Pull Request resolved: react#55794

Format the error messages coming from bundling to mainting the formatting and make these easier to read.

Changelog: [Internal]

Reviewed By: javache

Differential Revision: D94611951

fbshipit-source-id: cbb8b2d1ff517b5487d4b799b1e2e3476629f84c
Summary:
Pull Request resolved: react#55788

changelog: [internal]

Reviewed By: mdvacca

Differential Revision: D90813408

fbshipit-source-id: cc1c19728a9ccae58408d8e39b83d7121712c49d
…t#55809)

Summary:
When a PR targets a `-stable` branch, `github.ref_name` is the PR branch (not ending in `-stable`), so the version script was incorrectly running. Added a check for `github.base_ref` to also skip the script when the PR target branch is a stable branch.

## Changelog:
[Internal] - Skip set-rn-artifacts-version for PRs targeting stable branches

Pull Request resolved: react#55809

Test Plan: CI should pass without running the artifacts version script on PRs targeting stable branches.

Reviewed By: cortinico

Differential Revision: D94678295

Pulled By: cipolleschi

fbshipit-source-id: 5809ec710c191075f1bc1528ecff95f8bd745257
…t mutate `process.env.BABEL_ENV` (react#55806)

Summary:
Pull Request resolved: react#55806

After react#55805, the RN Babel preset no longer reads `process.env.BABEL_ENV` directly, instead using Babel's `env()` API, which is both cache-aware and properly respects explicit `envName` config.

See:
 - https://babeljs.io/docs/config-files#apienv
 - https://babeljs.io/docs/options#envname

Now, instead of mutating `process.env.BABEL_ENV` to force the environment for a transform (and having to worry about restoring it to avoid side-effects), we can just specify `envName` instead.

Changelog: [Internal]

Reviewed By: javache

Differential Revision: D94662935

fbshipit-source-id: 598a8dd53e33e4b5edfe62778a61c6bf3c48a4e7
Summary:
Pull Request resolved: react#55820

changelog: [internal]

Add Fantom integration test for processBoxShadow. Uses `fantom_flags enableOptimizedBoxShadowParsing:*` to automatically test both code paths.

Reviewed By: joevilches

Differential Revision: D94796393

fbshipit-source-id: 5e56ba3c784b896575a534daf6eb05645475354b
Summary:
Pull Request resolved: react#55680

changelog: [internal]

Replace TinyMap<Tag, X> with std::unordered_map<Tag, X>. There is no detectable regression in performance and code is simpler, let's remove TinyMap.

```
┌────────────────────────────┬──────────────────┬───────────────────────────────────┬───────────────┐
│         Benchmark          │ TinyMap (before) │ unordered_map + ctor size (after) │    Change     │
├────────────────────────────┼──────────────────┼───────────────────────────────────┼───────────────┤
│ 100 uncollapsable views    │ 1,499,917 ns     │ 1,343,333 ns                      │ -10.4%        │
├────────────────────────────┼──────────────────┼───────────────────────────────────┼───────────────┤
│ 1000 uncollapsable views   │ 52,148,021 ns    │ 44,131,792 ns                     │ -15.4%        │
├────────────────────────────┼──────────────────┼───────────────────────────────────┼───────────────┤
│ 100 views large props      │ 5,131,292 ns     │ 4,529,937 ns                      │ -11.7%        │
├────────────────────────────┼──────────────────┼───────────────────────────────────┼───────────────┤
│ 1000 views large props     │ 82,706,813 ns    │ 84,334,167 ns                     │ +2.0% (noise) │
├────────────────────────────┼──────────────────┼───────────────────────────────────┼───────────────┤
│ 1500 views large props     │ 61,470,542 ns    │ 62,976,646 ns                     │ +2.5% (noise) │
├────────────────────────────┼──────────────────┼───────────────────────────────────┼───────────────┤
│ deep (depth=5, breadth=4)  │ 32,672,583 ns    │ 30,700,542 ns                     │ -6.0%         │
├────────────────────────────┼──────────────────┼───────────────────────────────────┼───────────────┤
│ deep (depth=7, breadth=3)  │ 78,523,542 ns    │ 74,121,729 ns                     │ -5.6%         │
├────────────────────────────┼──────────────────┼───────────────────────────────────┼───────────────┤
│ deep (depth=10, breadth=2) │ 48,328,562 ns    │ 45,702,188 ns                     │ -5.4%         │
└────────────────────────────┴──────────────────┴───────────────────────────────────┴───────────────┘
```

Reviewed By: NickGerleman

Differential Revision: D90346356

fbshipit-source-id: 90a26da056202d75bc74fec0ed00439a8dbf16cb
Summary:
Pull Request resolved: react#55851

Changelog: [Internal]

just missing tests

Reviewed By: javache

Differential Revision: D94904120

fbshipit-source-id: fb73fc92e0ea30b3e37a1fd5725d3bec1b89fb1f
react#55850)

Summary:
Pull Request resolved: react#55850

D91320248 removed `receiveTouches` from the `RCTEventEmitter` interface entirely.
This was too big of a breaking change — ecosystem libraries that implement
`RCTEventEmitter` or `RCTModernEventEmitter` and override `receiveTouches` would
fail to compile.

This brings back `receiveTouches` on `RCTEventEmitter` but with a default no-op
implementation, so existing implementers that override it continue to compile, and
new implementers don't need to provide one.

Changelog: [Android][Changed] Re-added `receiveTouches` to `RCTEventEmitter` with a default no-op implementation to avoid breaking ecosystem libraries

Reviewed By: cortinico

Differential Revision: D94903267

fbshipit-source-id: fd89da9714b02a72c6ff271375307f620f5d2e3d
Summary:
Pull Request resolved: react#55825

changelog: [internal]

Hoist regex patterns to module-level constants to avoid recompiling them on every function call. This optimization targets a hotspot identified via JS sampling profiler.

Benchmark results show 6-7% improvement in "views with large props and styles" tests:
- render 100 views with large props/styles: 9.48ms → 8.89ms (-6.2%)
- render 1500 views with large props/styles: 137.2ms → 127.5ms (-7.0%)

Reviewed By: javache, NickGerleman

Differential Revision: D92153667

fbshipit-source-id: d4cd98d34e968b2cea5a491ede4ed727273708cd
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.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.