From 42f49abcc39d3100ca35cff1dbeb752359333545 Mon Sep 17 00:00:00 2001 From: Saad Najmi Date: Wed, 15 Oct 2025 11:37:57 -0700 Subject: [PATCH] feat(fabric): Add some missing macOS only props --- .../View/RCTViewComponentView.mm | 30 +++++++++++++++++ .../components/view/HostPlatformViewProps.cpp | 32 ++++++++++++++++++- .../components/view/HostPlatformViewProps.h | 4 +++ .../view/HostPlatformViewTraitsInitializer.h | 9 +++--- 4 files changed, 70 insertions(+), 5 deletions(-) diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm b/packages/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm index af394b1535ddf7..c48815a95920f3 100644 --- a/packages/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm +++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm @@ -57,6 +57,7 @@ @implementation RCTViewComponentView { BOOL _hasMouseOver; BOOL _hasClipViewBoundsObserver; NSTrackingArea *_trackingArea; + BOOL _allowsVibrancy; #endif // macOS] NSMutableArray *_reactSubviews; // [macOS] NSSet *_Nullable _propKeysManagedByAnimated_DO_NOT_USE_THIS_IS_BROKEN; @@ -81,6 +82,10 @@ - (instancetype)initWithFrame:(CGRect)frame #endif // [macOS] _useCustomContainerView = NO; _removeClippedSubviews = NO; +#if TARGET_OS_OSX // [macOS + _allowsVibrancy = NO; + self.mouseDownCanMoveWindow = YES; +#endif // macOS] } return self; } @@ -141,6 +146,11 @@ - (void)resetCursorRects [self addCursorRect:self.bounds cursor:cursor]; } } + +- (BOOL)allowsVibrancy +{ + return _allowsVibrancy; +} #endif // macOS] #if !TARGET_OS_OSX @@ -593,6 +603,21 @@ - (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared & } #if TARGET_OS_OSX // [macOS + // `acceptsFirstMouse` + if (oldViewProps.acceptsFirstMouse != newViewProps.acceptsFirstMouse) { + self.acceptsFirstMouse = newViewProps.acceptsFirstMouse; + } + + // `mouseDownCanMoveWindow` + if (oldViewProps.mouseDownCanMoveWindow != newViewProps.mouseDownCanMoveWindow) { + self.mouseDownCanMoveWindow = newViewProps.mouseDownCanMoveWindow; + } + + // `allowsVibrancy` + if (oldViewProps.allowsVibrancy != newViewProps.allowsVibrancy) { + _allowsVibrancy = newViewProps.allowsVibrancy; + } + // `draggedTypes` if (oldViewProps.draggedTypes != newViewProps.draggedTypes) { if (!oldViewProps.draggedTypes.empty()) { @@ -712,6 +737,11 @@ - (void)prepareForRecycle _isJSResponder = NO; _removeClippedSubviews = NO; _reactSubviews = [NSMutableArray new]; +#if TARGET_OS_OSX // [macOS + _allowsVibrancy = NO; + self.acceptsFirstMouse = NO; + self.mouseDownCanMoveWindow = YES; +#endif // macOS] } - (void)setPropKeysManagedByAnimated_DO_NOT_USE_THIS_IS_BROKEN:(NSSet *_Nullable)props diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/platform/macos/react/renderer/components/view/HostPlatformViewProps.cpp b/packages/react-native/ReactCommon/react/renderer/components/view/platform/macos/react/renderer/components/view/HostPlatformViewProps.cpp index 2ef2fdd7dfb313..318ebfb8b76fac 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/platform/macos/react/renderer/components/view/HostPlatformViewProps.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/view/platform/macos/react/renderer/components/view/HostPlatformViewProps.cpp @@ -83,7 +83,34 @@ HostPlatformViewProps::HostPlatformViewProps( rawProps, "tooltip", sourceProps.tooltip, - {})) {} + {})), + acceptsFirstMouse( + ReactNativeFeatureFlags::enableCppPropsIteratorSetter() + ? sourceProps.acceptsFirstMouse + : convertRawProp( + context, + rawProps, + "acceptsFirstMouse", + sourceProps.acceptsFirstMouse, + {})), + allowsVibrancy( + ReactNativeFeatureFlags::enableCppPropsIteratorSetter() + ? sourceProps.allowsVibrancy + : convertRawProp( + context, + rawProps, + "allowsVibrancy", + sourceProps.allowsVibrancy, + {})), + mouseDownCanMoveWindow( + ReactNativeFeatureFlags::enableCppPropsIteratorSetter() + ? sourceProps.mouseDownCanMoveWindow + : convertRawProp( + context, + rawProps, + "mouseDownCanMoveWindow", + sourceProps.mouseDownCanMoveWindow, + {})) {} #define VIEW_EVENT_CASE_MACOS(eventType) \ case CONSTEXPR_RAW_PROPS_KEY_HASH("on" #eventType): { \ @@ -122,6 +149,9 @@ void HostPlatformViewProps::setProp( RAW_SET_PROP_SWITCH_CASE_BASIC(keyUpEvents); RAW_SET_PROP_SWITCH_CASE_BASIC(draggedTypes); RAW_SET_PROP_SWITCH_CASE_BASIC(tooltip); + RAW_SET_PROP_SWITCH_CASE_BASIC(acceptsFirstMouse); + RAW_SET_PROP_SWITCH_CASE_BASIC(allowsVibrancy); + RAW_SET_PROP_SWITCH_CASE_BASIC(mouseDownCanMoveWindow); } } diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/platform/macos/react/renderer/components/view/HostPlatformViewProps.h b/packages/react-native/ReactCommon/react/renderer/components/view/platform/macos/react/renderer/components/view/HostPlatformViewProps.h index 27f0e3d1e30a9a..427a70f0196079 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/platform/macos/react/renderer/components/view/HostPlatformViewProps.h +++ b/packages/react-native/ReactCommon/react/renderer/components/view/platform/macos/react/renderer/components/view/HostPlatformViewProps.h @@ -50,5 +50,9 @@ class HostPlatformViewProps : public BaseViewProps { std::vector draggedTypes{}; std::optional tooltip{}; + + bool acceptsFirstMouse{false}; + bool allowsVibrancy{false}; + bool mouseDownCanMoveWindow{true}; }; } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/platform/macos/react/renderer/components/view/HostPlatformViewTraitsInitializer.h b/packages/react-native/ReactCommon/react/renderer/components/view/platform/macos/react/renderer/components/view/HostPlatformViewTraitsInitializer.h index 74d4f57ad74c4d..560d487cf663d5 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/platform/macos/react/renderer/components/view/HostPlatformViewTraitsInitializer.h +++ b/packages/react-native/ReactCommon/react/renderer/components/view/platform/macos/react/renderer/components/view/HostPlatformViewTraitsInitializer.h @@ -13,13 +13,14 @@ namespace facebook::react::HostPlatformViewTraitsInitializer { inline bool formsStackingContext(const ViewProps& props) { - return false; + return props.allowsVibrancy || + props.mouseDownCanMoveWindow || + props.acceptsFirstMouse || + props.hostPlatformEvents.bits.any(); } inline bool formsView(const ViewProps& props) { - return props.focusable || - props.hostPlatformEvents[HostPlatformViewEvents::Offset::MouseEnter] || - props.hostPlatformEvents[HostPlatformViewEvents::Offset::MouseLeave]; + return props.focusable; } } // namespace facebook::react::HostPlatformViewTraitsInitializer