From ea918849cbbffc4694f7c172eed98e53d9939deb Mon Sep 17 00:00:00 2001 From: Shubh Porwal Date: Sat, 24 Oct 2026 01:17:52 +0530 Subject: [PATCH] Fix shadowColor and outline prop defaults in BaseViewManagerDelegate BaseViewManagerDelegate reset shadowColor to 0 and outlineOffset and outlineWidth to YogaConstants.UNDEFINED when the props were removed, instead of the @ReactProp defaults in BaseViewManager (Color.BLACK and 0f). On components with a codegen delegate, removing shadowColor hid the elevation shadow and removing outlineOffset hid the outline. Co-Authored-By: Claude Opus 5.5 --- .../uimanager/BaseViewManagerDelegate.kt | 16 ++++++-------- .../BaseViewManagerDelegateTest.java | 22 +++++++++++++++++++ 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManagerDelegate.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManagerDelegate.kt index c1d63abe3a7e..fb4ca1ad6ea4 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManagerDelegate.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManagerDelegate.kt @@ -7,6 +7,7 @@ package com.facebook.react.uimanager +import android.graphics.Color import android.view.View import com.facebook.react.bridge.ColorPropConverter import com.facebook.react.bridge.Dynamic @@ -89,7 +90,10 @@ public abstract class BaseViewManagerDelegate< ViewProps.MIX_BLEND_MODE -> mViewManager.setMixBlendMode(view, value as String?) ViewProps.SHADOW_COLOR -> - mViewManager.setShadowColor(view, ColorPropConverter.getColor(value, view.context, 0)) + mViewManager.setShadowColor( + view, + ColorPropConverter.getColor(value, view.context, Color.BLACK), + ) ViewProps.IMPORTANT_FOR_ACCESSIBILITY -> mViewManager.setImportantForAccessibility(view, value as String?) @@ -113,18 +117,12 @@ public abstract class BaseViewManagerDelegate< ) ViewProps.OUTLINE_OFFSET -> - mViewManager.setOutlineOffset( - view, - (value as Double?)?.toFloat() ?: YogaConstants.UNDEFINED, - ) + mViewManager.setOutlineOffset(view, (value as Double?)?.toFloat() ?: 0.0f) ViewProps.OUTLINE_STYLE -> mViewManager.setOutlineStyle(view, value as String?) ViewProps.OUTLINE_WIDTH -> - mViewManager.setOutlineWidth( - view, - (value as Double?)?.toFloat() ?: YogaConstants.UNDEFINED, - ) + mViewManager.setOutlineWidth(view, (value as Double?)?.toFloat() ?: 0.0f) ViewProps.RENDER_TO_HARDWARE_TEXTURE -> mViewManager.setRenderToHardwareTexture(view, value as Boolean? ?: false) diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/BaseViewManagerDelegateTest.java b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/BaseViewManagerDelegateTest.java index 13ad5c6a95c3..a3823d3fe2e0 100644 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/BaseViewManagerDelegateTest.java +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/BaseViewManagerDelegateTest.java @@ -10,6 +10,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; +import android.graphics.Color; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactTestHelper; import com.facebook.react.internal.featureflags.ReactNativeFeatureFlags; @@ -60,4 +61,25 @@ public void setOutlineColorPreservesNull() { verify(viewManager).setOutlineColor(view, null); } + + @Test + public void setShadowColorResetsToBlack() { + delegate.setProperty(view, ViewProps.SHADOW_COLOR, null); + + verify(viewManager).setShadowColor(view, Color.BLACK); + } + + @Test + public void setOutlineOffsetResetsToZero() { + delegate.setProperty(view, ViewProps.OUTLINE_OFFSET, null); + + verify(viewManager).setOutlineOffset(view, 0f); + } + + @Test + public void setOutlineWidthResetsToZero() { + delegate.setProperty(view, ViewProps.OUTLINE_WIDTH, null); + + verify(viewManager).setOutlineWidth(view, 0f); + } }