From 43d031a27985e9b1acce9969939904dd69ee076a Mon Sep 17 00:00:00 2001 From: Krzysztof Ligarski Date: Mon, 27 Oct 2025 09:19:21 +0100 Subject: [PATCH 01/13] add prop to stack screen --- ios/RNSConvert.h | 3 +++ ios/RNSConvert.mm | 17 +++++++++++++++++ ios/RNSScreenStackHeaderConfig.h | 1 + ios/RNSScreenStackHeaderConfig.mm | 12 ++++++++++++ .../ScreenStackHeaderConfigNativeComponent.ts | 6 ++++++ src/types.tsx | 6 ++++++ 6 files changed, 45 insertions(+) diff --git a/ios/RNSConvert.h b/ios/RNSConvert.h index a71899f70d..6b7aa33658 100644 --- a/ios/RNSConvert.h +++ b/ios/RNSConvert.h @@ -52,6 +52,9 @@ namespace react = facebook::react; + (RNSOptionalBoolean)RNSOptionalBooleanFromRNSSearchBarHideNavigationBar: (react::RNSSearchBarHideNavigationBar)hideNavigationBar; ++ (UIUserInterfaceStyle)UIUserInterfaceStyleFromCppEquivalent: + (react::RNSScreenStackHeaderConfigUnstable_overrideUserInterfaceStyle)userInterfaceStyle; + + (NSMutableArray *)arrayFromVector:(const std::vector &)vector; + (RNSBlurEffectStyle)RNSBlurEffectStyleFromCppEquivalent:(react::RNSScreenStackHeaderConfigBlurEffect)blurEffect; diff --git a/ios/RNSConvert.mm b/ios/RNSConvert.mm index e94f7b33f4..c1d4a992d2 100644 --- a/ios/RNSConvert.mm +++ b/ios/RNSConvert.mm @@ -275,6 +275,23 @@ + (RNSOptionalBoolean)RNSOptionalBooleanFromRNSSearchBarHideNavigationBar: } } ++ (UIUserInterfaceStyle)UIUserInterfaceStyleFromCppEquivalent: + (react::RNSScreenStackHeaderConfigUnstable_overrideUserInterfaceStyle)userInterfaceStyle +{ + switch (userInterfaceStyle) { + using enum react::RNSScreenStackHeaderConfigUnstable_overrideUserInterfaceStyle; + + case Unspecified: + return UIUserInterfaceStyleUnspecified; + case Light: + return UIUserInterfaceStyleLight; + case Dark: + return UIUserInterfaceStyleDark; + default: + RCTLogError(@"[RNScreens] unsupported user interface style"); + } +} + + (NSMutableArray *)arrayFromVector:(const std::vector &)vector { NSMutableArray *array = [NSMutableArray arrayWithCapacity:vector.size()]; diff --git a/ios/RNSScreenStackHeaderConfig.h b/ios/RNSScreenStackHeaderConfig.h index d45f822520..bb46b6afa6 100644 --- a/ios/RNSScreenStackHeaderConfig.h +++ b/ios/RNSScreenStackHeaderConfig.h @@ -58,6 +58,7 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic) BOOL backButtonInCustomView; @property (nonatomic) UISemanticContentAttribute direction; @property (nonatomic) UINavigationItemBackButtonDisplayMode backButtonDisplayMode; +@property (nonatomic) UIUserInterfaceStyle unstable_userInterfaceStyle; @property (nonatomic) RNSBlurEffectStyle blurEffect; @property (nonatomic, copy, nullable) NSArray *> *headerRightBarButtonItems; @property (nonatomic, copy, nullable) NSArray *> *headerLeftBarButtonItems; diff --git a/ios/RNSScreenStackHeaderConfig.mm b/ios/RNSScreenStackHeaderConfig.mm index 175b418f33..c8c6ccdd9c 100644 --- a/ios/RNSScreenStackHeaderConfig.mm +++ b/ios/RNSScreenStackHeaderConfig.mm @@ -584,6 +584,8 @@ + (void)updateViewController:(UIViewController *)vc return; } + navctr.navigationBar.overrideUserInterfaceStyle = config.unstable_userInterfaceStyle; + #if !TARGET_OS_TV [config configureBackItem:prevItem withPrevVC:prevVC]; @@ -1139,6 +1141,11 @@ - (void)updateProps:(react::Props::Shared const &)props oldProps:(react::Props:: _backButtonDisplayMode = [RNSConvert UINavigationItemBackButtonDisplayModeFromCppEquivalent:newScreenProps.backButtonDisplayMode]; + if (newScreenProps.unstable_overrideUserInterfaceStyle != oldScreenProps.unstable_overrideUserInterfaceStyle) { + _unstable_userInterfaceStyle = + [RNSConvert UIUserInterfaceStyleFromCppEquivalent:newScreenProps.unstable_overrideUserInterfaceStyle]; + } + if (newScreenProps.direction != oldScreenProps.direction) { _direction = [RNSConvert UISemanticContentAttributeFromCppEquivalent:newScreenProps.direction]; } @@ -1287,6 +1294,11 @@ - (RCTShadowView *)shadowView RCT_EXPORT_VIEW_PROPERTY(backButtonInCustomView, BOOL) RCT_EXPORT_VIEW_PROPERTY(disableBackButtonMenu, BOOL) RCT_EXPORT_VIEW_PROPERTY(backButtonDisplayMode, UINavigationItemBackButtonDisplayMode) +RCT_REMAP_VIEW_PROPERTY( + unstable_overrideUserInterfaceStyle, + unstable_userInterfaceStyle, + UIUserInterfaceStyle) // `overrideUserInterfaceStyle` is an UIView property, we need to use different name + // internally RCT_REMAP_VIEW_PROPERTY(hidden, hide, BOOL) // `hidden` is an UIView property, we need to use different name internally RCT_EXPORT_VIEW_PROPERTY(translucent, BOOL) RCT_EXPORT_VIEW_PROPERTY(headerLeftBarButtonItems, NSArray) diff --git a/src/fabric/ScreenStackHeaderConfigNativeComponent.ts b/src/fabric/ScreenStackHeaderConfigNativeComponent.ts index e1bb4db9d4..f67762b64a 100644 --- a/src/fabric/ScreenStackHeaderConfigNativeComponent.ts +++ b/src/fabric/ScreenStackHeaderConfigNativeComponent.ts @@ -45,6 +45,8 @@ type BlurEffect = | 'systemThickMaterialDark' | 'systemChromeMaterialDark'; +type UserInterfaceStyle = 'unspecified' | 'light' | 'dark'; + export interface NativeProps extends ViewProps { onAttached?: DirectEventHandler; onDetached?: DirectEventHandler; @@ -82,6 +84,10 @@ export interface NativeProps extends ViewProps { onPressHeaderBarButtonItem?: DirectEventHandler; onPressHeaderBarButtonMenuItem?: DirectEventHandler; synchronousShadowStateUpdatesEnabled?: WithDefault; + unstable_overrideUserInterfaceStyle?: WithDefault< + UserInterfaceStyle, + 'unspecified' + >; } export default codegenNativeComponent( diff --git a/src/types.tsx b/src/types.tsx index bbc3056bc1..8f47fd6aec 100644 --- a/src/types.tsx +++ b/src/types.tsx @@ -83,6 +83,8 @@ export type HeaderSubviewTypes = | 'center' | 'searchBar'; +export type UserInterfaceStyle = 'unspecified' | 'light' | 'dark'; + export type HeaderHeightChangeEventType = { headerHeight: number; }; @@ -755,6 +757,10 @@ export interface ScreenStackHeaderConfigProps extends ViewProps { * Boolean indicating whether the navigation bar is translucent. */ translucent?: boolean; + /** + * + */ + unstable_overrideUserInterfaceStyle?: UserInterfaceStyle; } export interface SearchBarProps { From 2bc9c9c23dd7ae23a2e2b9749c0557aa7ba989a6 Mon Sep 17 00:00:00 2001 From: Krzysztof Ligarski Date: Mon, 27 Oct 2025 09:39:48 +0100 Subject: [PATCH 02/13] add prop to tabs screen --- .../RNSBottomTabsScreenComponentView.h | 2 ++ .../RNSBottomTabsScreenComponentView.mm | 7 +++++++ .../RNSBottomTabsScreenComponentViewManager.mm | 6 ++++++ ios/bottom-tabs/RNSTabBarController.mm | 8 ++++++++ ios/conversion/RNSConversions-BottomTabs.mm | 16 ++++++++++++++++ ios/conversion/RNSConversions.h | 3 +++ .../bottom-tabs/BottomTabsScreen.types.ts | 9 +++++++++ .../BottomTabsScreenNativeComponent.ts | 7 +++++++ 8 files changed, 58 insertions(+) diff --git a/ios/bottom-tabs/RNSBottomTabsScreenComponentView.h b/ios/bottom-tabs/RNSBottomTabsScreenComponentView.h index 1fe957972c..acb1f3b11d 100644 --- a/ios/bottom-tabs/RNSBottomTabsScreenComponentView.h +++ b/ios/bottom-tabs/RNSBottomTabsScreenComponentView.h @@ -87,6 +87,8 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic) RNSScrollEdgeEffect rightScrollEdgeEffect; @property (nonatomic) RNSScrollEdgeEffect topScrollEdgeEffect; +@property (nonatomic) UIUserInterfaceStyle unstable_userInterfaceStyle; + @property (nonatomic) RNSBottomTabsScreenSystemItem systemItem; @end diff --git a/ios/bottom-tabs/RNSBottomTabsScreenComponentView.mm b/ios/bottom-tabs/RNSBottomTabsScreenComponentView.mm index 770bcc8293..5078d48dad 100644 --- a/ios/bottom-tabs/RNSBottomTabsScreenComponentView.mm +++ b/ios/bottom-tabs/RNSBottomTabsScreenComponentView.mm @@ -105,6 +105,8 @@ - (void)resetProps _selectedIconSfSymbolName = nil; _systemItem = RNSBottomTabsScreenSystemItemNone; + + _unstable_userInterfaceStyle = UIUserInterfaceStyleUnspecified; } RNS_IGNORE_SUPER_CALL_BEGIN @@ -402,6 +404,11 @@ - (void)updateProps:(const facebook::react::Props::Shared &)props scrollEdgeEffectsNeedUpdate = YES; } + if (newComponentProps.unstable_overrideUserInterfaceStyle != oldComponentProps.unstable_overrideUserInterfaceStyle) { + _unstable_userInterfaceStyle = rnscreens::conversion::UIUserInterfaceStyleFromBottomTabsScreenCppEquivalent( + newComponentProps.unstable_overrideUserInterfaceStyle); + } + if (tabBarItemNeedsRecreation) { [self createTabBarItem]; tabBarItemNeedsUpdate = YES; diff --git a/ios/bottom-tabs/RNSBottomTabsScreenComponentViewManager.mm b/ios/bottom-tabs/RNSBottomTabsScreenComponentViewManager.mm index 248a1681ae..2914bf1115 100644 --- a/ios/bottom-tabs/RNSBottomTabsScreenComponentViewManager.mm +++ b/ios/bottom-tabs/RNSBottomTabsScreenComponentViewManager.mm @@ -43,6 +43,12 @@ - (UIView *)view RCT_EXPORT_VIEW_PROPERTY(rightScrollEdgeEffect, RNSScrollEdgeEffect); RCT_EXPORT_VIEW_PROPERTY(topScrollEdgeEffect, RNSScrollEdgeEffect); +RCT_REMAP_VIEW_PROPERTY( + unstable_overrideUserInterfaceStyle, + unstable_userInterfaceStyle, + UIUserInterfaceStyle) // `overrideUserInterfaceStyle` is an UIView property, we need to use different name + // internally + RCT_EXPORT_VIEW_PROPERTY(systemItem, RNSBottomTabsScreenSystemItem); RCT_EXPORT_VIEW_PROPERTY(onWillAppear, RCTDirectEventBlock); diff --git a/ios/bottom-tabs/RNSTabBarController.mm b/ios/bottom-tabs/RNSTabBarController.mm index 1dce6d08b2..efaf0faad4 100644 --- a/ios/bottom-tabs/RNSTabBarController.mm +++ b/ios/bottom-tabs/RNSTabBarController.mm @@ -154,6 +154,14 @@ - (void)updateSelectedViewController RNSLog(@"Change selected view controller to: %@", selectedViewController); + if (@available(iOS 26.0, *)) { + // On iOS 26, we need to set user interface style 2 parent views above the tab bar + // for this prop to take effect. + self.tabBar.superview.superview.overrideUserInterfaceStyle = + selectedViewController.tabScreenComponentView.unstable_userInterfaceStyle; + } else { + self.tabBar.overrideUserInterfaceStyle = selectedViewController.tabScreenComponentView.unstable_userInterfaceStyle; + } [selectedViewController.tabScreenComponentView overrideScrollViewBehaviorInFirstDescendantChainIfNeeded]; [selectedViewController.tabScreenComponentView updateContentScrollViewEdgeEffectsIfExists]; [self setSelectedViewController:selectedViewController]; diff --git a/ios/conversion/RNSConversions-BottomTabs.mm b/ios/conversion/RNSConversions-BottomTabs.mm index 8647af3914..c38198b1e2 100644 --- a/ios/conversion/RNSConversions-BottomTabs.mm +++ b/ios/conversion/RNSConversions-BottomTabs.mm @@ -400,4 +400,20 @@ RNSScrollEdgeEffect RNSBottomTabsScrollEdgeEffectFromBottomTabsScreenTopScrollEd #undef SWITCH_EDGE_EFFECT +UIUserInterfaceStyle UIUserInterfaceStyleFromBottomTabsScreenCppEquivalent( + react::RNSBottomTabsScreenUnstable_overrideUserInterfaceStyle userInterfaceStyle) +{ + using enum facebook::react::RNSBottomTabsScreenUnstable_overrideUserInterfaceStyle; + switch (userInterfaceStyle) { + case Unspecified: + return UIUserInterfaceStyleUnspecified; + case Light: + return UIUserInterfaceStyleLight; + case Dark: + return UIUserInterfaceStyleDark; + default: + RCTLogError(@"[RNScreens] unsupported user interface style"); + } +} + }; // namespace rnscreens::conversion diff --git a/ios/conversion/RNSConversions.h b/ios/conversion/RNSConversions.h index 79b7e553f6..e13f300761 100644 --- a/ios/conversion/RNSConversions.h +++ b/ios/conversion/RNSConversions.h @@ -72,6 +72,9 @@ RNSScrollEdgeEffect RNSBottomTabsScrollEdgeEffectFromBottomTabsScreenRightScroll RNSScrollEdgeEffect RNSBottomTabsScrollEdgeEffectFromBottomTabsScreenTopScrollEdgeEffectCppEquivalent( react::RNSBottomTabsScreenTopScrollEdgeEffect edgeEffect); +UIUserInterfaceStyle UIUserInterfaceStyleFromBottomTabsScreenCppEquivalent( + react::RNSBottomTabsScreenUnstable_overrideUserInterfaceStyle userInterfaceStyle); + RCTImageSource *RCTImageSourceFromImageSourceAndIconType( const facebook::react::ImageSource *imageSource, RNSBottomTabsIconType iconType); diff --git a/src/components/bottom-tabs/BottomTabsScreen.types.ts b/src/components/bottom-tabs/BottomTabsScreen.types.ts index 358c9e2e5c..48576e4521 100644 --- a/src/components/bottom-tabs/BottomTabsScreen.types.ts +++ b/src/components/bottom-tabs/BottomTabsScreen.types.ts @@ -57,6 +57,11 @@ export type BottomTabsSystemItem = | 'search' | 'topRated'; +export type BottomTabsScreenUserInterfaceStyle = + | 'unspecified' + | 'light' + | 'dark'; + // Currently iOS-only export type BottomTabsScreenOrientation = | 'inherit' @@ -511,6 +516,10 @@ export interface BottomTabsScreenProps { right?: ScrollEdgeEffect; top?: ScrollEdgeEffect; }; + /** + * + */ + unstable_overrideUserInterfaceStyle?: BottomTabsScreenUserInterfaceStyle; // #endregion iOS-only appearance // #region Events diff --git a/src/fabric/bottom-tabs/BottomTabsScreenNativeComponent.ts b/src/fabric/bottom-tabs/BottomTabsScreenNativeComponent.ts index 5f922e6f19..2d918c0832 100644 --- a/src/fabric/bottom-tabs/BottomTabsScreenNativeComponent.ts +++ b/src/fabric/bottom-tabs/BottomTabsScreenNativeComponent.ts @@ -111,6 +111,8 @@ type SystemItem = type ScrollEdgeEffect = 'automatic' | 'hard' | 'soft' | 'hidden'; +type UserInterfaceStyle = 'unspecified' | 'light' | 'dark'; + export interface NativeProps extends ViewProps { // Events onLifecycleStateChange?: DirectEventHandler; @@ -164,6 +166,11 @@ export interface NativeProps extends ViewProps { leftScrollEdgeEffect?: WithDefault; rightScrollEdgeEffect?: WithDefault; topScrollEdgeEffect?: WithDefault; + + unstable_overrideUserInterfaceStyle?: WithDefault< + UserInterfaceStyle, + 'unspecified' + >; } export default codegenNativeComponent('RNSBottomTabsScreen', {}); From a63d12a924eae96ecac2e7ebe675429b8f133ce2 Mon Sep 17 00:00:00 2001 From: Krzysztof Ligarski Date: Mon, 27 Oct 2025 09:48:07 +0100 Subject: [PATCH 03/13] docs --- guides/GUIDE_FOR_LIBRARY_AUTHORS.md | 4 ++++ src/components/bottom-tabs/BottomTabsScreen.types.ts | 5 +++++ src/types.tsx | 5 +++++ 3 files changed, 14 insertions(+) diff --git a/guides/GUIDE_FOR_LIBRARY_AUTHORS.md b/guides/GUIDE_FOR_LIBRARY_AUTHORS.md index 45f8a4a19f..ea214474d2 100644 --- a/guides/GUIDE_FOR_LIBRARY_AUTHORS.md +++ b/guides/GUIDE_FOR_LIBRARY_AUTHORS.md @@ -770,6 +770,10 @@ A flag to that lets you opt out of insetting the header. You may want to set thi When set to true, it makes native navigation bar semi transparent. It adds blur effect on iOS. The default value is false. +### `unstable_userInterfaceStyle` (iOS only) + +Allows to override system appearance for the navigation bar. Does not support dynamic changes to the prop value for the currently visible screen. The default value is `unspecified`. + # Guide for native component authors If you are adding a new native component to be used from the React Native app, you may want it to respond to navigation lifecycle events. diff --git a/src/components/bottom-tabs/BottomTabsScreen.types.ts b/src/components/bottom-tabs/BottomTabsScreen.types.ts index 48576e4521..1b93394b70 100644 --- a/src/components/bottom-tabs/BottomTabsScreen.types.ts +++ b/src/components/bottom-tabs/BottomTabsScreen.types.ts @@ -517,7 +517,12 @@ export interface BottomTabsScreenProps { top?: ScrollEdgeEffect; }; /** + * @summary Allows to override system appearance for the navigation bar. * + * Does not support dynamic changes to the prop value for the currently visible screen. + * + * @default unspecified + * @platform ios */ unstable_overrideUserInterfaceStyle?: BottomTabsScreenUserInterfaceStyle; // #endregion iOS-only appearance diff --git a/src/types.tsx b/src/types.tsx index 8f47fd6aec..4525087bfc 100644 --- a/src/types.tsx +++ b/src/types.tsx @@ -758,7 +758,12 @@ export interface ScreenStackHeaderConfigProps extends ViewProps { */ translucent?: boolean; /** + * Allows to override system appearance for the navigation bar. * + * Does not support dynamic changes to the prop value for the currently visible screen. + * + * @default unspecified + * @platform ios */ unstable_overrideUserInterfaceStyle?: UserInterfaceStyle; } From 7351ab10f84de05ab139761f447bfc6a0714b372 Mon Sep 17 00:00:00 2001 From: Krzysztof Ligarski Date: Mon, 27 Oct 2025 09:58:10 +0100 Subject: [PATCH 04/13] mocks on Android --- .../rnscreens/ScreenStackHeaderConfigViewManager.kt | 7 +++++++ .../swmansion/rnscreens/gamma/tabs/TabScreenViewManager.kt | 5 +++++ .../viewmanagers/RNSBottomTabsScreenManagerDelegate.java | 3 +++ .../viewmanagers/RNSBottomTabsScreenManagerInterface.java | 1 + .../RNSScreenStackHeaderConfigManagerDelegate.java | 3 +++ .../RNSScreenStackHeaderConfigManagerInterface.java | 1 + 6 files changed, 20 insertions(+) diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt b/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt index ec09178054..4dd7c09a85 100644 --- a/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt +++ b/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt @@ -340,4 +340,11 @@ class ScreenStackHeaderConfigViewManager : ) { logNotAvailable("headerRightBarButtonItems") } + + override fun setUnstable_overrideUserInterfaceStyle( + view: ScreenStackHeaderConfig?, + value: String?, + ) { + logNotAvailable("unstable_overrideUserInterfaceStyle") + } } diff --git a/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabScreenViewManager.kt b/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabScreenViewManager.kt index 3d0fbaa248..0fd02e3f1c 100644 --- a/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabScreenViewManager.kt +++ b/android/src/main/java/com/swmansion/rnscreens/gamma/tabs/TabScreenViewManager.kt @@ -190,6 +190,11 @@ class TabScreenViewManager : value: String?, ) = Unit + override fun setUnstable_overrideUserInterfaceStyle( + view: TabScreen, + value: String?, + ) = Unit + @ReactProp(name = "imageIconResource") override fun setImageIconResource( view: TabScreen, diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsScreenManagerDelegate.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsScreenManagerDelegate.java index 8db05361df..ffd63206fa 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsScreenManagerDelegate.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsScreenManagerDelegate.java @@ -98,6 +98,9 @@ public void setProperty(T view, String propName, @Nullable Object value) { case "topScrollEdgeEffect": mViewManager.setTopScrollEdgeEffect(view, (String) value); break; + case "unstable_overrideUserInterfaceStyle": + mViewManager.setUnstable_overrideUserInterfaceStyle(view, (String) value); + break; default: super.setProperty(view, propName, value); } diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsScreenManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsScreenManagerInterface.java index ac3e0737a3..ed7548b445 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsScreenManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSBottomTabsScreenManagerInterface.java @@ -40,4 +40,5 @@ public interface RNSBottomTabsScreenManagerInterface { void setLeftScrollEdgeEffect(T view, @Nullable String value); void setRightScrollEdgeEffect(T view, @Nullable String value); void setTopScrollEdgeEffect(T view, @Nullable String value); + void setUnstable_overrideUserInterfaceStyle(T view, @Nullable String value); } diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerDelegate.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerDelegate.java index 331f711000..8acc8a5a4e 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerDelegate.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerDelegate.java @@ -118,6 +118,9 @@ public void setProperty(T view, String propName, @Nullable Object value) { case "synchronousShadowStateUpdatesEnabled": mViewManager.setSynchronousShadowStateUpdatesEnabled(view, value == null ? false : (boolean) value); break; + case "unstable_overrideUserInterfaceStyle": + mViewManager.setUnstable_overrideUserInterfaceStyle(view, (String) value); + break; default: super.setProperty(view, propName, value); } diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java index 58917121a6..fbd5cdb8db 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java @@ -46,4 +46,5 @@ public interface RNSScreenStackHeaderConfigManagerInterface { void setHeaderLeftBarButtonItems(T view, @Nullable ReadableArray value); void setHeaderRightBarButtonItems(T view, @Nullable ReadableArray value); void setSynchronousShadowStateUpdatesEnabled(T view, boolean value); + void setUnstable_overrideUserInterfaceStyle(T view, @Nullable String value); } From 859be5eddaae39f98d0f1fbf0ff04e85f6d88299 Mon Sep 17 00:00:00 2001 From: Krzysztof Ligarski Date: Mon, 27 Oct 2025 10:11:11 +0100 Subject: [PATCH 05/13] add test screen --- apps/src/tests/Test3342.tsx | 153 ++++++++++++++++++++++++++++++++++++ apps/src/tests/index.ts | 1 + 2 files changed, 154 insertions(+) create mode 100644 apps/src/tests/Test3342.tsx diff --git a/apps/src/tests/Test3342.tsx b/apps/src/tests/Test3342.tsx new file mode 100644 index 0000000000..7abaf3e0a8 --- /dev/null +++ b/apps/src/tests/Test3342.tsx @@ -0,0 +1,153 @@ +import React from 'react'; +import { + DefaultTheme, + NavigationContainer, + ParamListBase, +} from '@react-navigation/native'; +import { + NativeStackNavigationProp, + createNativeStackNavigator, +} from '@react-navigation/native-stack'; +import { Button, StyleSheet, Text, TextInput, View } from 'react-native'; +import ConfigWrapperContext, { + Configuration, + DEFAULT_GLOBAL_CONFIGURATION, +} from '../shared/gamma/containers/bottom-tabs/ConfigWrapperContext'; +import { + BottomTabsContainer, + TabConfiguration, +} from '../shared/gamma/containers/bottom-tabs/BottomTabsContainer'; +import Colors from '../shared/styling/Colors'; + +type RouteParamList = { + Screen1: undefined; + Screen2: undefined; + Screen3: undefined; +}; + +type NavigationProp = { + navigation: NativeStackNavigationProp; +}; + +type StackNavigationProp = NavigationProp; + +const Stack = createNativeStackNavigator(); + +function Screen1({ navigation }: StackNavigationProp) { + return ( + + Enable system dark mode and observe the back button. +