diff --git a/packages/react-native/React/Fabric/RCTSurfacePresenter.mm b/packages/react-native/React/Fabric/RCTSurfacePresenter.mm index 9c2c7aba96a6d5..da9a026dafefd8 100644 --- a/packages/react-native/React/Fabric/RCTSurfacePresenter.mm +++ b/packages/react-native/React/Fabric/RCTSurfacePresenter.mm @@ -284,6 +284,10 @@ - (RCTScheduler *)_createScheduler CoreFeatures::enableClonelessStateProgression = true; } + if (reactNativeConfig && reactNativeConfig->getBool("react_fabric:position_relative_default")) { + CoreFeatures::positionRelativeDefault = true; + } + auto componentRegistryFactory = [factory = wrapManagedObject(_mountingManager.componentViewRegistry.componentViewFactory)]( const EventDispatcher::Weak &eventDispatcher, const ContextContainer::Shared &contextContainer) { diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java index ee1b3c44354cb2..ea1b2ba963749b 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java @@ -182,4 +182,7 @@ public class ReactFeatureFlags { * when there is work to do. */ public static boolean enableOnDemandReactChoreographer = false; + + /** When enabled, the default value of the position style property is relative. */ + public static boolean positionRelativeDefault = false; } diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/fabric/Binding.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/fabric/Binding.cpp index 0f89b1ee8fe29b..1024afce2b7c9a 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/fabric/Binding.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/fabric/Binding.cpp @@ -424,6 +424,8 @@ void Binding::installFabricUIManager( getFeatureFlagValue("enableClonelessStateProgression"); CoreFeatures::excludeYogaFromRawProps = getFeatureFlagValue("excludeYogaFromRawProps"); + CoreFeatures::positionRelativeDefault = + getFeatureFlagValue("positionRelativeDefault"); // RemoveDelete mega-op ShadowViewMutation::PlatformSupportsRemoveDeleteTreeInstruction = diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/YogaStylableProps.cpp b/packages/react-native/ReactCommon/react/renderer/components/view/YogaStylableProps.cpp index 7c888d1e3d9959..996b976bae4294 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/YogaStylableProps.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/view/YogaStylableProps.cpp @@ -38,7 +38,9 @@ YogaStylableProps::YogaStylableProps( /*static*/ const yoga::Style& YogaStylableProps::defaultStyle() { static const auto defaultStyle = []() { yoga::Style style; - style.setPositionType(yoga::PositionType::Static); + style.setPositionType( + CoreFeatures::positionRelativeDefault ? yoga::PositionType::Relative + : yoga::PositionType::Static); return style; }(); diff --git a/packages/react-native/ReactCommon/react/utils/CoreFeatures.cpp b/packages/react-native/ReactCommon/react/utils/CoreFeatures.cpp index c967febaac7a21..2cd2e161c530c7 100644 --- a/packages/react-native/ReactCommon/react/utils/CoreFeatures.cpp +++ b/packages/react-native/ReactCommon/react/utils/CoreFeatures.cpp @@ -23,5 +23,6 @@ bool CoreFeatures::enableClonelessStateProgression = false; bool CoreFeatures::excludeYogaFromRawProps = false; bool CoreFeatures::enableMicrotasks = false; bool CoreFeatures::enableReportEventPaintTime = false; +bool CoreFeatures::positionRelativeDefault = false; } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/utils/CoreFeatures.h b/packages/react-native/ReactCommon/react/utils/CoreFeatures.h index 3ad24c5e02e4d8..ffc81e01e7247b 100644 --- a/packages/react-native/ReactCommon/react/utils/CoreFeatures.h +++ b/packages/react-native/ReactCommon/react/utils/CoreFeatures.h @@ -67,6 +67,9 @@ class CoreFeatures { // Report paint time inside the Event Timing API implementation // (PerformanceObserver). static bool enableReportEventPaintTime; + + // Sets the default position of nodes to be relative instead of static + static bool positionRelativeDefault; }; } // namespace facebook::react