react-native-windows 0.84.0-preview.9 → 0.85.0-preview.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (487) hide show
  1. package/.flowconfig +1 -5
  2. package/Common/unicode.cpp +36 -0
  3. package/Common/unicode.h +8 -0
  4. package/Directory.Build.props +1 -16
  5. package/Directory.Build.targets +12 -4
  6. package/Folly/ThreadNameStub.cpp +4 -6
  7. package/Libraries/ActionSheetIOS/ActionSheetIOS.js +3 -3
  8. package/Libraries/Animated/Animated.d.ts +8 -1
  9. package/Libraries/Animated/AnimatedEvent.js +4 -4
  10. package/Libraries/Animated/AnimatedImplementation.js +2 -2
  11. package/Libraries/Animated/animations/Animation.js +3 -3
  12. package/Libraries/Animated/animations/DecayAnimation.js +4 -4
  13. package/Libraries/Animated/animations/SpringAnimation.js +5 -5
  14. package/Libraries/Animated/animations/TimingAnimation.js +5 -5
  15. package/Libraries/Animated/createAnimatedComponent.js +7 -7
  16. package/Libraries/Animated/nodes/AnimatedColor.js +2 -2
  17. package/Libraries/Animated/nodes/AnimatedInterpolation.js +12 -12
  18. package/Libraries/Animated/nodes/AnimatedNode.js +3 -3
  19. package/Libraries/Animated/nodes/AnimatedObject.js +3 -3
  20. package/Libraries/Animated/nodes/AnimatedProps.js +6 -6
  21. package/Libraries/Animated/nodes/AnimatedStyle.js +7 -7
  22. package/Libraries/Animated/nodes/AnimatedTransform.js +13 -13
  23. package/Libraries/Animated/nodes/AnimatedValue.js +1 -1
  24. package/Libraries/Animated/nodes/AnimatedValueXY.js +1 -1
  25. package/Libraries/Animated/nodes/AnimatedWithChildren.js +1 -1
  26. package/Libraries/Animated/useAnimatedColor.d.ts +15 -0
  27. package/Libraries/Animated/useAnimatedColor.js +25 -0
  28. package/Libraries/Animated/useAnimatedValueXY.d.ts +15 -0
  29. package/Libraries/Animated/useAnimatedValueXY.js +26 -0
  30. package/Libraries/AppState/AppState.js +1 -1
  31. package/Libraries/BatchedBridge/MessageQueue.js +3 -3
  32. package/Libraries/BatchedBridge/NativeModules.js +12 -10
  33. package/Libraries/Components/AccessibilityInfo/AccessibilityInfo.js +30 -26
  34. package/Libraries/Components/AccessibilityInfo/AccessibilityInfo.windows.js +34 -30
  35. package/Libraries/Components/ActivityIndicator/ActivityIndicator.js +2 -2
  36. package/Libraries/Components/Button.js +2 -2
  37. package/Libraries/Components/Button.windows.js +2 -2
  38. package/Libraries/Components/DrawerAndroid/DrawerLayoutAndroidTypes.js +2 -2
  39. package/Libraries/Components/Keyboard/Keyboard.js +6 -6
  40. package/Libraries/Components/Keyboard/KeyboardAvoidingView.js +1 -1
  41. package/Libraries/Components/LayoutConformance/LayoutConformance.js +1 -1
  42. package/Libraries/Components/LayoutConformance/LayoutConformanceNativeComponent.js +1 -1
  43. package/Libraries/Components/Pressable/Pressable.d.ts +5 -0
  44. package/Libraries/Components/Pressable/Pressable.js +3 -3
  45. package/Libraries/Components/Pressable/Pressable.windows.js +3 -3
  46. package/Libraries/Components/Pressable/useAndroidRippleForView.js +4 -4
  47. package/Libraries/Components/ProgressBarAndroid/ProgressBarAndroid.js +1 -1
  48. package/Libraries/Components/ProgressBarAndroid/ProgressBarAndroidTypes.js +3 -3
  49. package/Libraries/Components/RefreshControl/RefreshControl.js +5 -5
  50. package/Libraries/Components/RefreshControl/RefreshControl.windows.js +5 -5
  51. package/Libraries/Components/ScrollView/AndroidHorizontalScrollViewNativeComponent.js +8 -12
  52. package/Libraries/Components/ScrollView/ScrollView.d.ts +9 -0
  53. package/Libraries/Components/ScrollView/ScrollView.js +19 -9
  54. package/Libraries/Components/ScrollView/ScrollView.windows.js +19 -9
  55. package/Libraries/Components/ScrollView/ScrollViewNativeComponent.js +8 -18
  56. package/Libraries/Components/ScrollView/ScrollViewNativeComponent.windows.js +8 -18
  57. package/Libraries/Components/ScrollView/ScrollViewNativeComponentType.js +4 -3
  58. package/Libraries/Components/ScrollView/ScrollViewStickyHeader.js +1 -1
  59. package/Libraries/Components/StaticRenderer.js +1 -1
  60. package/Libraries/Components/StatusBar/StatusBar.js +8 -8
  61. package/Libraries/Components/Switch/Switch.js +3 -3
  62. package/Libraries/Components/Switch/Switch.windows.js +3 -3
  63. package/Libraries/Components/TextInput/AndroidTextInputNativeComponent.js +33 -48
  64. package/Libraries/Components/TextInput/InputAccessoryView.js +1 -1
  65. package/Libraries/Components/TextInput/RCTTextInputViewConfig.js +6 -11
  66. package/Libraries/Components/TextInput/TextInput.flow.js +21 -20
  67. package/Libraries/Components/TextInput/TextInput.flow.windows.js +23 -22
  68. package/Libraries/Components/TextInput/TextInput.js +8 -4
  69. package/Libraries/Components/TextInput/TextInput.windows.js +3 -4
  70. package/Libraries/Components/TextInput/WindowsTextInputNativeComponent.js +33 -48
  71. package/Libraries/Components/Touchable/PooledClass.js +1 -1
  72. package/Libraries/Components/Touchable/Touchable.js +2 -2
  73. package/Libraries/Components/Touchable/Touchable.windows.js +2 -2
  74. package/Libraries/Components/Touchable/TouchableBounce.js +4 -4
  75. package/Libraries/Components/Touchable/TouchableBounce.windows.js +4 -4
  76. package/Libraries/Components/Touchable/TouchableHighlight.js +8 -8
  77. package/Libraries/Components/Touchable/TouchableHighlight.windows.js +9 -9
  78. package/Libraries/Components/Touchable/TouchableNativeFeedback.js +7 -7
  79. package/Libraries/Components/Touchable/TouchableNativeFeedback.windows.js +7 -7
  80. package/Libraries/Components/Touchable/TouchableOpacity.js +4 -4
  81. package/Libraries/Components/Touchable/TouchableOpacity.windows.js +4 -4
  82. package/Libraries/Components/Touchable/TouchableWithoutFeedback.js +1 -1
  83. package/Libraries/Components/Touchable/TouchableWithoutFeedback.windows.js +1 -1
  84. package/Libraries/Components/UnimplementedViews/UnimplementedView.js +1 -1
  85. package/Libraries/Components/View/ReactNativeStyleAttributes.js +68 -31
  86. package/Libraries/Components/View/View.windows.js +1 -1
  87. package/Libraries/Components/View/ViewAccessibility.js +7 -7
  88. package/Libraries/Components/View/ViewAccessibility.windows.js +7 -7
  89. package/Libraries/Components/View/ViewPropTypes.js +14 -14
  90. package/Libraries/Components/View/ViewPropTypes.windows.js +18 -16
  91. package/Libraries/Core/Devtools/parseHermesStack.js +8 -8
  92. package/Libraries/Core/Devtools/symbolicateStackTrace.js +2 -2
  93. package/Libraries/Core/ExceptionsManager.js +2 -2
  94. package/Libraries/Core/ExtendedError.js +3 -3
  95. package/Libraries/Core/RawEventEmitter.js +1 -1
  96. package/Libraries/Core/ReactNativeVersion.js +2 -2
  97. package/Libraries/Core/Timers/JSTimers.js +3 -2
  98. package/Libraries/Core/setUpDeveloperTools.js +1 -1
  99. package/Libraries/Core/setUpErrorHandling.js +4 -2
  100. package/Libraries/Core/setUpReactDevTools.js +23 -6
  101. package/Libraries/Core/setUpSegmentFetcher.js +1 -1
  102. package/Libraries/Debugging/DebuggingOverlay.js +2 -2
  103. package/Libraries/EventEmitter/NativeEventEmitter.js +7 -9
  104. package/Libraries/EventEmitter/RCTDeviceEventEmitter.js +1 -1
  105. package/Libraries/Image/AssetSourceResolver.js +1 -1
  106. package/Libraries/Image/AssetSourceResolver.windows.js +1 -1
  107. package/Libraries/Image/Image.android.js +172 -306
  108. package/Libraries/Image/ImageProps.js +9 -11
  109. package/Libraries/Image/ImageSource.js +2 -2
  110. package/Libraries/Image/ImageSourceUtils.js +8 -4
  111. package/Libraries/Image/ImageTypes.flow.js +2 -2
  112. package/Libraries/Image/ImageViewNativeComponent.js +7 -16
  113. package/Libraries/Image/nativeImageSource.js +1 -1
  114. package/Libraries/Interaction/InteractionManager.js +5 -4
  115. package/Libraries/Interaction/PanResponder.js +1 -1
  116. package/Libraries/LayoutAnimation/LayoutAnimation.js +2 -2
  117. package/Libraries/Linking/Linking.js +1 -1
  118. package/Libraries/Lists/FlatList.js +3 -3
  119. package/Libraries/Lists/SectionList.js +1 -1
  120. package/Libraries/Lists/SectionListModern.js +2 -2
  121. package/Libraries/LogBox/Data/LogBoxData.js +38 -24
  122. package/Libraries/LogBox/Data/LogBoxLog.js +43 -112
  123. package/Libraries/LogBox/Data/parseLogBoxLog.js +21 -117
  124. package/Libraries/LogBox/LogBox.js +42 -19
  125. package/Libraries/LogBox/LogBoxInspectorContainer.js +2 -2
  126. package/Libraries/LogBox/LogBoxNotificationContainer.js +2 -2
  127. package/Libraries/LogBox/UI/LogBoxButton.js +14 -16
  128. package/Libraries/LogBox/UI/LogBoxInspector.js +2 -2
  129. package/Libraries/LogBox/UI/LogBoxInspectorCodeFrame.js +6 -9
  130. package/Libraries/LogBox/UI/LogBoxInspectorCodeFrame.windows.js +6 -9
  131. package/Libraries/LogBox/UI/LogBoxInspectorFooter.js +1 -1
  132. package/Libraries/LogBox/UI/LogBoxInspectorFooterButton.js +1 -1
  133. package/Libraries/LogBox/UI/LogBoxInspectorHeader.js +1 -1
  134. package/Libraries/LogBox/UI/LogBoxInspectorHeader.windows.js +1 -1
  135. package/Libraries/LogBox/UI/LogBoxInspectorHeaderButton.js +1 -1
  136. package/Libraries/LogBox/UI/LogBoxInspectorMessageHeader.js +10 -15
  137. package/Libraries/LogBox/UI/LogBoxInspectorReactFrames.js +25 -18
  138. package/Libraries/LogBox/UI/LogBoxInspectorReactFrames.windows.js +15 -16
  139. package/Libraries/LogBox/UI/LogBoxInspectorSection.js +5 -7
  140. package/Libraries/LogBox/UI/LogBoxInspectorSourceMapStatus.js +8 -10
  141. package/Libraries/LogBox/UI/LogBoxInspectorStackFrame.js +8 -6
  142. package/Libraries/LogBox/UI/LogBoxInspectorStackFrame.windows.js +3 -5
  143. package/Libraries/LogBox/UI/LogBoxInspectorStackFrames.js +17 -29
  144. package/Libraries/LogBox/UI/LogBoxMessage.js +28 -37
  145. package/Libraries/LogBox/UI/LogBoxNotification.js +1 -1
  146. package/Libraries/Modal/Modal.d.ts +4 -0
  147. package/Libraries/Modal/Modal.js +3 -3
  148. package/Libraries/Modal/Modal.windows.js +7 -3
  149. package/Libraries/NativeComponent/BaseViewConfig.android.js +28 -52
  150. package/Libraries/NativeComponent/BaseViewConfig.ios.js +19 -21
  151. package/Libraries/NativeComponent/BaseViewConfig.windows.js +26 -17
  152. package/Libraries/Network/RCTNetworking.android.js +1 -1
  153. package/Libraries/Network/RCTNetworking.ios.js +1 -1
  154. package/Libraries/Network/RCTNetworking.js.flow +1 -1
  155. package/Libraries/Network/RCTNetworking.windows.js +1 -1
  156. package/Libraries/Network/RCTNetworkingEventDefinitions.flow.js +1 -1
  157. package/Libraries/Network/XMLHttpRequest.js +1 -1
  158. package/Libraries/PermissionsAndroid/PermissionsAndroid.js +3 -3
  159. package/Libraries/Pressability/Pressability.js +5 -5
  160. package/Libraries/Pressability/Pressability.windows.js +5 -5
  161. package/Libraries/Pressability/PressabilityDebug.js +1 -1
  162. package/Libraries/Pressability/PressabilityPerformanceEventEmitter.js +1 -1
  163. package/Libraries/Pressability/usePressability.js +3 -14
  164. package/Libraries/PushNotificationIOS/PushNotificationIOS.js +2 -2
  165. package/Libraries/ReactNative/AppContainer-dev.js +18 -1
  166. package/Libraries/ReactNative/AppContainer.js +1 -1
  167. package/Libraries/ReactNative/AppRegistry.flow.js +2 -2
  168. package/Libraries/ReactNative/AppRegistryImpl.js +2 -2
  169. package/Libraries/ReactNative/FabricUIManager.js +1 -1
  170. package/Libraries/ReactNative/RendererImplementation.js +4 -4
  171. package/Libraries/ReactNative/UIManagerProperties.js +1 -1
  172. package/Libraries/Renderer/implementations/ReactNativeRenderer-dev.js +3 -2
  173. package/Libraries/Renderer/implementations/ReactNativeRenderer-prod.js +3 -2
  174. package/Libraries/Renderer/implementations/ReactNativeRenderer-profiling.js +3 -2
  175. package/Libraries/Renderer/shims/ReactFabric.js +1 -3
  176. package/Libraries/Renderer/shims/ReactFeatureFlags.js +1 -3
  177. package/Libraries/Renderer/shims/ReactNative.js +3 -2
  178. package/Libraries/Renderer/shims/ReactNativeTypes.js +1 -3
  179. package/Libraries/Renderer/shims/ReactNativeTypes.windows.js +1 -3
  180. package/Libraries/Renderer/shims/ReactNativeViewConfigRegistry.js +1 -3
  181. package/Libraries/Renderer/shims/createReactNativeComponentClass.js +1 -3
  182. package/Libraries/StyleSheet/PointPropType.js +1 -1
  183. package/Libraries/StyleSheet/Rect.js +1 -1
  184. package/Libraries/StyleSheet/StyleSheet.d.ts +0 -5
  185. package/Libraries/StyleSheet/StyleSheet.js +1 -1
  186. package/Libraries/StyleSheet/StyleSheet.js.flow +1 -1
  187. package/Libraries/StyleSheet/StyleSheetExports.js +16 -25
  188. package/Libraries/StyleSheet/StyleSheetExports.js.flow +2 -7
  189. package/Libraries/StyleSheet/StyleSheetTypes.js +33 -35
  190. package/Libraries/StyleSheet/private/_StyleSheetTypesOverrides.js +5 -5
  191. package/Libraries/StyleSheet/private/_TransformStyle.js +7 -7
  192. package/Libraries/StyleSheet/processBackgroundImage.js +7 -7
  193. package/Libraries/StyleSheet/processBackgroundPosition.js +4 -4
  194. package/Libraries/StyleSheet/processBackgroundRepeat.js +4 -4
  195. package/Libraries/StyleSheet/processBackgroundSize.js +4 -4
  196. package/Libraries/StyleSheet/processBoxShadow.js +44 -4
  197. package/Libraries/StyleSheet/processColorArray.js +2 -2
  198. package/Libraries/StyleSheet/processFilter.js +2 -2
  199. package/Libraries/Text/Text.js +295 -627
  200. package/Libraries/Text/Text.windows.js +342 -717
  201. package/Libraries/Text/TextNativeComponent.js +14 -7
  202. package/Libraries/Text/TextProps.js +4 -4
  203. package/Libraries/Text/TextProps.windows.js +4 -4
  204. package/Libraries/Types/CodegenTypes.js +1 -1
  205. package/Libraries/Types/CoreEventTypes.js +21 -21
  206. package/Libraries/Types/CoreEventTypes.windows.js +21 -21
  207. package/Libraries/Types/ReactDevToolsTypes.js +2 -2
  208. package/Libraries/Utilities/Appearance.js +6 -1
  209. package/Libraries/Utilities/Dimensions.js +1 -1
  210. package/Libraries/Utilities/HMRClient.js +32 -5
  211. package/Libraries/Utilities/IPerformanceLogger.js +4 -4
  212. package/Libraries/Utilities/codegenNativeCommands.js +4 -4
  213. package/Libraries/Utilities/codegenNativeComponent.d.ts +2 -0
  214. package/Libraries/Utilities/codegenNativeComponent.js +2 -2
  215. package/Libraries/Utilities/logError.js +1 -1
  216. package/Libraries/Utilities/stringifySafe.js +3 -3
  217. package/Libraries/Utilities/useMergeRefs.js +2 -2
  218. package/Libraries/vendor/core/ErrorUtils.js +4 -4
  219. package/Libraries/vendor/emitter/EventEmitter.js +16 -20
  220. package/Microsoft.ReactNative/CallInvoker.cpp +14 -4
  221. package/Microsoft.ReactNative/Fabric/AbiComponentDescriptor.cpp +1 -1
  222. package/Microsoft.ReactNative/Fabric/AbiPortalShadowNode.cpp +2 -2
  223. package/Microsoft.ReactNative/Fabric/AbiViewComponentDescriptor.h +1 -1
  224. package/Microsoft.ReactNative/Fabric/Composition/BorderPrimitive.cpp +73 -97
  225. package/Microsoft.ReactNative/Fabric/Composition/BorderPrimitive.h +4 -1
  226. package/Microsoft.ReactNative/Fabric/Composition/CompositionContextHelper.cpp +0 -1
  227. package/Microsoft.ReactNative/Fabric/Composition/CompositionDynamicAutomationProvider.cpp +5 -0
  228. package/Microsoft.ReactNative/Fabric/Composition/CompositionEventHandler.cpp +94 -26
  229. package/Microsoft.ReactNative/Fabric/Composition/CompositionEventHandler.h +11 -0
  230. package/Microsoft.ReactNative/Fabric/Composition/CompositionViewComponentView.cpp +135 -18
  231. package/Microsoft.ReactNative/Fabric/Composition/CompositionViewComponentView.h +10 -0
  232. package/Microsoft.ReactNative/Fabric/Composition/ImageComponentView.cpp +7 -2
  233. package/Microsoft.ReactNative/Fabric/Composition/ImageComponentView.h +2 -0
  234. package/Microsoft.ReactNative/Fabric/Composition/Modal/WindowsModalHostViewComponentView.cpp +63 -15
  235. package/Microsoft.ReactNative/Fabric/Composition/ParagraphComponentView.cpp +9 -5
  236. package/Microsoft.ReactNative/Fabric/Composition/ScrollViewComponentView.cpp +28 -6
  237. package/Microsoft.ReactNative/Fabric/Composition/TextDrawing.cpp +1 -1
  238. package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentView.cpp +1 -1
  239. package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputState.cpp +1 -1
  240. package/Microsoft.ReactNative/Fabric/Composition/TooltipService.cpp +80 -0
  241. package/Microsoft.ReactNative/Fabric/Composition/TooltipService.h +17 -0
  242. package/Microsoft.ReactNative/Fabric/FabricUIManagerModule.cpp +11 -0
  243. package/Microsoft.ReactNative/Fabric/FabricUIManagerModule.h +1 -0
  244. package/Microsoft.ReactNative/Fabric/platform/react/renderer/graphics/HostPlatformColor.h +3 -0
  245. package/Microsoft.ReactNative/Fabric/platform/react/renderer/graphics/PlatformColorUtils.cpp +0 -3
  246. package/Microsoft.ReactNative/Fabric/platform/react/renderer/textlayoutmanager/WindowsTextLayoutManager.cpp +3 -8
  247. package/Microsoft.ReactNative/IReactPackageBuilder.idl +6 -0
  248. package/Microsoft.ReactNative/Microsoft.ReactNative.vcxproj +4 -63
  249. package/Microsoft.ReactNative/Microsoft.ReactNative.vcxproj.filters +1 -26
  250. package/Microsoft.ReactNative/Modules/AlertModule.cpp +2 -1
  251. package/Microsoft.ReactNative/Modules/AppStateModule.cpp +2 -17
  252. package/Microsoft.ReactNative/Modules/AppStateModule.h +0 -4
  253. package/Microsoft.ReactNative/Modules/AppThemeModuleUwp.cpp +0 -2
  254. package/Microsoft.ReactNative/Modules/AppearanceModule.cpp +16 -15
  255. package/Microsoft.ReactNative/Modules/AppearanceModule.h +5 -1
  256. package/Microsoft.ReactNative/Modules/DeviceInfoModule.cpp +2 -7
  257. package/Microsoft.ReactNative/Modules/DeviceInfoModule.h +0 -1
  258. package/Microsoft.ReactNative/Modules/I18nManagerModule.h +4 -4
  259. package/Microsoft.ReactNative/QuirkSettings.cpp +0 -133
  260. package/Microsoft.ReactNative/QuirkSettings.h +0 -43
  261. package/Microsoft.ReactNative/QuirkSettings.idl +0 -41
  262. package/Microsoft.ReactNative/ReactHost/CrashManager.cpp +0 -4
  263. package/Microsoft.ReactNative/ReactHost/MsoReactContext.cpp +0 -2
  264. package/Microsoft.ReactNative/ReactHost/React.h +0 -5
  265. package/Microsoft.ReactNative/ReactHost/ReactHost.cpp +0 -1
  266. package/Microsoft.ReactNative/ReactHost/ReactInstanceWin.cpp +3 -26
  267. package/Microsoft.ReactNative/ReactHost/ReactInstanceWin.h +0 -5
  268. package/Microsoft.ReactNative/ReactHost/React_Win.h +0 -2
  269. package/Microsoft.ReactNative/ReactNativeAppBuilder.idl +3 -0
  270. package/Microsoft.ReactNative/ReactPackageBuilder.cpp +7 -0
  271. package/Microsoft.ReactNative/ReactPackageBuilder.h +1 -0
  272. package/Microsoft.ReactNative/RedBox.cpp +0 -9
  273. package/Microsoft.ReactNative/RedBoxHandler.cpp +0 -4
  274. package/Microsoft.ReactNative/TurboModulesProvider.cpp +5 -10
  275. package/Microsoft.ReactNative/TurboModulesProvider.h +2 -0
  276. package/Microsoft.ReactNative/Utils/LocalBundleReader.cpp +33 -25
  277. package/Microsoft.ReactNative/Utils/LocalBundleReader.h +5 -3
  278. package/Microsoft.ReactNative/Utils/ValueUtils.cpp +1 -1
  279. package/Microsoft.ReactNative.Cxx/CppWinRTIncludes.h +0 -7
  280. package/Microsoft.ReactNative.Cxx/DesktopWindowBridge.h +0 -22
  281. package/Microsoft.ReactNative.Cxx/ModuleRegistration.cpp +8 -2
  282. package/Microsoft.ReactNative.Cxx/ModuleRegistration.h +36 -20
  283. package/Microsoft.ReactNative.Cxx/NamespaceRedirect.h +0 -3
  284. package/Microsoft.ReactNative.Cxx/NativeModules.h +8 -2
  285. package/Microsoft.ReactNative.Cxx/XamlUtils.h +0 -9
  286. package/Microsoft.ReactNative.Managed/Microsoft.ReactNative.Managed.csproj +3 -3
  287. package/Microsoft.ReactNative.Managed/ReactContext.cs +0 -9
  288. package/Microsoft.ReactNative.Managed.CodeGen/Microsoft.ReactNative.Managed.CodeGen.csproj +10 -10
  289. package/Microsoft.ReactNative.Managed.CodeGen/Properties/PublishProfiles/DeployAsTool-Debug.pubxml +1 -1
  290. package/Microsoft.ReactNative.Managed.CodeGen/Properties/PublishProfiles/DeployAsTool-Release.pubxml +1 -1
  291. package/PropertySheets/Autolink.props +1 -1
  292. package/PropertySheets/Bundle.props +1 -1
  293. package/PropertySheets/Codegen.props +1 -1
  294. package/PropertySheets/Generated/PackageVersion.g.props +3 -3
  295. package/PropertySheets/JSEngine.props +1 -1
  296. package/PropertySheets/NuGet.LockFile.props +8 -0
  297. package/PropertySheets/React.Cpp.props +8 -7
  298. package/PropertySheets/ReactNativeArchitecture.props +6 -24
  299. package/PropertySheets/WinUI.props +2 -2
  300. package/ReactCommon/ReactCommon.vcxproj +5 -6
  301. package/ReactCommon/TEMP_UntilReactCommonUpdate/jsi/jsi/test/testlib.cpp +1 -1
  302. package/ReactCommon/TEMP_UntilReactCommonUpdate/jsinspector-modern/NetworkIOAgent.cpp +15 -4
  303. package/ReactCommon/TEMP_UntilReactCommonUpdate/jsinspector-modern/NetworkIOAgent.h +13 -0
  304. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/nativemodule/defaults/DefaultTurboModules.cpp +69 -0
  305. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/animationbackend/AnimatedPropSerializer.cpp +717 -0
  306. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/components/text/ParagraphShadowNode.cpp +10 -10
  307. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/components/view/AccessibilityPrimitives.h +2 -21
  308. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/components/view/TouchEventEmitter.cpp +151 -0
  309. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/components/view/TouchEventEmitter.h +50 -0
  310. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/mapbuffer/MapBuffer.cpp +178 -0
  311. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/uimanager/UIManager.cpp +69 -39
  312. package/Scripts/JustMyXaml.ps1 +8 -8
  313. package/Scripts/OfficeReact.Win32.nuspec +0 -1
  314. package/Scripts/Tfs/Layout-Desktop-Headers.ps1 +4 -39
  315. package/Scripts/UnitTest.ps1 +3 -1
  316. package/Scripts/creaternwapp.cmd +1 -9
  317. package/Scripts/creaternwlib.cmd +4 -24
  318. package/Scripts/rnw-dependencies.ps1 +15 -16
  319. package/Shared/DevSettings.h +0 -3
  320. package/Shared/DevSupportManager.cpp +55 -48
  321. package/Shared/DevSupportManager.h +0 -1
  322. package/Shared/Modules/IWebSocketModuleContentHandler.h +15 -0
  323. package/Shared/Modules/WebSocketModule.cpp +8 -3
  324. package/Shared/Networking/DefaultBlobResource.cpp +37 -0
  325. package/Shared/Networking/DefaultBlobResource.h +12 -0
  326. package/Shared/Networking/WinRTWebSocketResource.cpp +23 -408
  327. package/Shared/Networking/WinRTWebSocketResource.h +8 -120
  328. package/Shared/Shared.vcxitems +63 -38
  329. package/Shared/Shared.vcxitems.filters +54 -0
  330. package/Shared/Utils.cpp +0 -88
  331. package/Shared/Utils.h +0 -14
  332. package/Shared/WebSocketResourceFactory.cpp +28 -0
  333. package/Shared/tracing/fbsystrace.h +1 -0
  334. package/codegen/NativeReactNativeFeatureFlagsSpec.g.h +172 -160
  335. package/codegen/react/components/rnwcore/ModalHostView.g.h +8 -0
  336. package/codegen/react/components/rnwcore/Props.cpp +17 -7
  337. package/codegen/react/components/rnwcore/Props.h +3 -1
  338. package/codegen/react/components/rnwcore/VirtualViewExperimental.g.h +4 -4
  339. package/codegen/rnwcoreJSI.h +93 -77
  340. package/index.js +9 -0
  341. package/index.windows.js +9 -0
  342. package/jest/RefreshControlMock.js +2 -2
  343. package/jest/assetFileTransformer.js +8 -3
  344. package/jest/mockComponent.js +3 -4
  345. package/jest/mockNativeComponent.js +1 -1
  346. package/jest/mocks/ActivityIndicator.js +2 -2
  347. package/jest/mocks/Image.js +2 -2
  348. package/jest/mocks/Modal.js +2 -2
  349. package/jest/mocks/RefreshControl.js +3 -3
  350. package/jest/mocks/RendererProxy.js +2 -2
  351. package/jest/mocks/ScrollView.js +5 -5
  352. package/jest/mocks/Text.js +2 -2
  353. package/jest/mocks/TextInput.js +2 -2
  354. package/jest/mocks/View.js +2 -2
  355. package/jest/mocks/ViewNativeComponent.js +1 -1
  356. package/jest/mocks/requireNativeComponent.js +1 -1
  357. package/jest/mocks/useColorScheme.js +1 -1
  358. package/jest/setup.js +68 -31
  359. package/just-task.js +13 -2
  360. package/package.json +25 -20
  361. package/src/private/animated/NativeAnimatedHelper.js +2 -2
  362. package/src/private/animated/createAnimatedPropsMemoHook.js +19 -19
  363. package/src/private/components/virtualview/VirtualView.js +14 -21
  364. package/src/private/components/virtualview/VirtualViewExperimentalNativeComponent.js +11 -10
  365. package/src/private/components/virtualview/VirtualViewNativeComponent.js +4 -4
  366. package/src/private/devsupport/devmenu/elementinspector/BorderBox.js +2 -2
  367. package/src/private/devsupport/devmenu/elementinspector/BoxInspector.js +3 -3
  368. package/src/private/devsupport/devmenu/elementinspector/ElementBox.js +4 -4
  369. package/src/private/devsupport/devmenu/elementinspector/ElementProperties.js +1 -1
  370. package/src/private/devsupport/devmenu/elementinspector/Inspector.js +39 -17
  371. package/src/private/devsupport/devmenu/elementinspector/InspectorOverlay.js +15 -3
  372. package/src/private/devsupport/devmenu/elementinspector/InspectorPanel.js +2 -2
  373. package/src/private/devsupport/devmenu/elementinspector/ReactDevToolsOverlay.js +2 -8
  374. package/src/private/devsupport/devmenu/elementinspector/StyleInspector.js +1 -1
  375. package/src/private/devsupport/devmenu/elementinspector/resolveBoxStyle.js +1 -1
  376. package/src/private/devsupport/devmenu/elementinspector/useExternalInspection.js +102 -0
  377. package/src/private/devsupport/rndevtools/FuseboxSessionObserver.js +12 -25
  378. package/src/private/devsupport/rndevtools/GlobalStateObserver.js +56 -0
  379. package/src/private/devsupport/rndevtools/TracingStateObserver.js +28 -0
  380. package/src/private/featureflags/ReactNativeFeatureFlags.js +71 -79
  381. package/src/private/featureflags/ReactNativeFeatureFlagsBase.js +2 -2
  382. package/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js +14 -12
  383. package/src/private/setup/setUpDefaultReactNativeEnvironment.js +6 -0
  384. package/src/private/specs_DEPRECATED/components/ActivityIndicatorViewNativeComponent.js +1 -1
  385. package/src/private/specs_DEPRECATED/components/AndroidDrawerLayoutNativeComponent.js +3 -3
  386. package/src/private/specs_DEPRECATED/components/AndroidHorizontalScrollContentViewNativeComponent.js +1 -1
  387. package/src/private/specs_DEPRECATED/components/AndroidSwipeRefreshLayoutNativeComponent.js +2 -2
  388. package/src/private/specs_DEPRECATED/components/AndroidSwitchNativeComponent.js +2 -2
  389. package/src/private/specs_DEPRECATED/components/DebuggingOverlayNativeComponent.js +3 -3
  390. package/src/private/specs_DEPRECATED/components/ProgressBarAndroidNativeComponent.js +1 -1
  391. package/src/private/specs_DEPRECATED/components/PullToRefreshViewNativeComponent.js +1 -1
  392. package/src/private/specs_DEPRECATED/components/RCTInputAccessoryViewNativeComponent.js +1 -1
  393. package/src/private/specs_DEPRECATED/components/RCTModalHostViewNativeComponent.js +7 -3
  394. package/src/private/specs_DEPRECATED/components/RCTSafeAreaViewNativeComponent.js +1 -1
  395. package/src/private/specs_DEPRECATED/components/SwitchNativeComponent.js +2 -2
  396. package/src/private/specs_DEPRECATED/components/UnimplementedNativeViewNativeComponent.js +1 -1
  397. package/src/private/specs_DEPRECATED/modules/NativeImageLoaderIOS.js +1 -1
  398. package/src/private/styles/composeStyles.js +1 -1
  399. package/src/private/utilities/toError.js +27 -0
  400. package/src/private/utilities/toExtendedError.js +30 -0
  401. package/src/private/webapis/dom/events/Event.js +1 -1
  402. package/src/private/webapis/dom/events/EventHandlerAttributes.js +2 -2
  403. package/src/private/webapis/dom/events/EventTarget.js +3 -3
  404. package/src/private/webapis/dom/events/internals/EventInternals.js +2 -2
  405. package/src/private/webapis/dom/nodes/ReadOnlyElement.js +1 -1
  406. package/src/private/webapis/dom/nodes/ReadOnlyNode.js +2 -2
  407. package/src/private/webapis/dom/nodes/specs/NativeDOM.js +14 -14
  408. package/src/private/webapis/dom/oldstylecollections/HTMLCollection.js +2 -2
  409. package/src/private/webapis/dom/oldstylecollections/NodeList.js +2 -2
  410. package/src/private/webapis/geometry/DOMRectList.js +2 -2
  411. package/src/private/webapis/intersectionobserver/IntersectionObserver.js +8 -8
  412. package/src/private/webapis/intersectionobserver/specs/NativeIntersectionObserver.js +6 -6
  413. package/src/private/webapis/mutationobserver/MutationObserver.js +2 -2
  414. package/src/private/webapis/mutationobserver/MutationRecord.js +2 -2
  415. package/src/private/webapis/mutationobserver/internals/MutationObserverManager.js +1 -1
  416. package/src/private/webapis/mutationobserver/specs/NativeMutationObserver.js +3 -3
  417. package/src/private/webapis/performance/LongTasks.js +3 -3
  418. package/src/private/webapis/performance/Performance.js +4 -4
  419. package/src/private/webapis/performance/PerformanceEntry.js +1 -1
  420. package/src/private/webapis/performance/PerformanceObserver.js +2 -2
  421. package/src/private/webapis/performance/specs/NativePerformance.js +8 -8
  422. package/src/private/webapis/structuredClone/structuredClone.js +2 -2
  423. package/src/types/globals.d.ts +4 -4
  424. package/template/cpp-lib/proj/MyLib.sln +0 -33
  425. package/template/cpp-lib/proj/MyLib.vcxproj +1 -1
  426. package/template/cs-lib/proj/MyLib.sln +0 -33
  427. package/template/metro.config.js +12 -2
  428. package/templates/cpp-app/metro.config.js +12 -2
  429. package/templates/cpp-app/windows/MyApp/MyApp.cpp +9 -6
  430. package/templates/cpp-app/windows/MyApp/MyApp.vcxproj +2 -2
  431. package/templates/cpp-app/windows/MyApp.sln +0 -33
  432. package/templates/cpp-lib/example/metro.config.js +12 -2
  433. package/templates/cpp-lib/windows/MyLib/MyLib.vcxproj +2 -2
  434. package/templates/cpp-lib/windows/MyLib.sln +0 -33
  435. package/types/index.d.ts +2 -0
  436. package/Folly/.clang-format +0 -2
  437. package/Folly/Folly.natvis +0 -25
  438. package/Folly/Folly.vcxproj +0 -378
  439. package/Folly/Folly.vcxproj.filters +0 -558
  440. package/Folly/TEMP_UntilFollyUpdate/ConstexprMath.h +0 -978
  441. package/Folly/TEMP_UntilFollyUpdate/Conv.cpp +0 -1205
  442. package/Folly/TEMP_UntilFollyUpdate/chrono/Hardware.h +0 -155
  443. package/Folly/TEMP_UntilFollyUpdate/concurrency/CacheLocality.cpp +0 -633
  444. package/Folly/TEMP_UntilFollyUpdate/json/dynamic-inl.h +0 -1438
  445. package/Folly/TEMP_UntilFollyUpdate/json/json.cpp +0 -1118
  446. package/Folly/TEMP_UntilFollyUpdate/lang/SafeAssert.h +0 -188
  447. package/Folly/TEMP_UntilFollyUpdate/lang/ToAscii.cpp +0 -348
  448. package/Folly/TEMP_UntilFollyUpdate/lang/ToAscii.h +0 -182
  449. package/Folly/TEMP_UntilFollyUpdate/portability/Unistd.cpp +0 -33
  450. package/Folly/cgmanifest.json +0 -25
  451. package/Libraries/Components/View/ReactNativeViewAttributes.js +0 -60
  452. package/Libraries/Components/View/ReactNativeViewAttributes.windows.js +0 -64
  453. package/Libraries/Image/TextInlineImageNativeComponent.js +0 -49
  454. package/Microsoft.ReactNative/Fabric/Composition/CompositionContextHelper_emptyimpl.cpp +0 -75
  455. package/Microsoft.ReactNative/Fabric/Composition/CompositionUIService_emptyimpl.cpp +0 -27
  456. package/Microsoft.ReactNative/Fabric/Composition/Theme_emptyimpl.cpp +0 -81
  457. package/Microsoft.ReactNative/Modules/CreateModules.cpp +0 -24
  458. package/Microsoft.ReactNative/ReactSupport.cpp +0 -221
  459. package/Microsoft.ReactNative/ReactSupport.h +0 -13
  460. package/Microsoft.ReactNative/Utils/UwpPreparedScriptStore.cpp +0 -107
  461. package/Microsoft.ReactNative/Utils/UwpPreparedScriptStore.h +0 -62
  462. package/Microsoft.ReactNative/Utils/UwpScriptStore.cpp +0 -56
  463. package/Microsoft.ReactNative/Utils/UwpScriptStore.h +0 -22
  464. package/Microsoft.ReactNative/XamlUIService.cpp +0 -68
  465. package/Microsoft.ReactNative/XamlUIService.h +0 -37
  466. package/Microsoft.ReactNative/XamlUIService.idl +0 -53
  467. package/ReactCommon/TEMP_UntilReactCommonUpdate/cxxreact/CxxNativeModule.cpp +0 -259
  468. package/ReactCommon/TEMP_UntilReactCommonUpdate/cxxreact/Instance.cpp +0 -381
  469. package/ReactCommon/TEMP_UntilReactCommonUpdate/cxxreact/JSIndexedRAMBundle.cpp +0 -145
  470. package/ReactCommon/TEMP_UntilReactCommonUpdate/cxxreact/MethodCall.cpp +0 -100
  471. package/ReactCommon/TEMP_UntilReactCommonUpdate/cxxreact/ModuleRegistry.cpp +0 -256
  472. package/ReactCommon/TEMP_UntilReactCommonUpdate/cxxreact/NativeToJsBridge.cpp +0 -363
  473. package/ReactCommon/TEMP_UntilReactCommonUpdate/cxxreact/RAMBundleRegistry.cpp +0 -93
  474. package/ReactCommon/TEMP_UntilReactCommonUpdate/cxxreact/ReactMarker.cpp +0 -148
  475. package/ReactCommon/TEMP_UntilReactCommonUpdate/cxxreact/TraceSection.h +0 -190
  476. package/ReactCommon/TEMP_UntilReactCommonUpdate/jsiexecutor/jsireact/JSINativeModules.cpp +0 -123
  477. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/nativemodule/core/ReactCommon/TurboModuleWithJSIBindings.cpp +0 -27
  478. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/nativemodule/webperformance/NativePerformance.cpp +0 -414
  479. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/components/text/platform/android/react/renderer/components/text/ParagraphState.h +0 -91
  480. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/core/EventDispatcher.cpp +0 -80
  481. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/core/EventQueueProcessor.cpp +0 -138
  482. package/fmt/.clang-format +0 -2
  483. package/fmt/cgmanifest.json +0 -15
  484. package/fmt/fmt.vcxproj +0 -153
  485. package/fmt/fmt.vcxproj.filters +0 -59
  486. package/fmt/pch.cpp +0 -4
  487. package/fmt/pch.h +0 -2
@@ -88,13 +88,13 @@ facebook::react::SharedEventEmitter EventEmitterForComponent(
88
88
  auto viewComponent = descriptor.view.as<winrt::Microsoft::ReactNative::Composition::implementation::ComponentView>();
89
89
  auto emitter = viewComponent->GetEventEmitter();
90
90
  if (emitter)
91
- return emitter;
91
+ return std::const_pointer_cast<facebook::react::ViewEventEmitter>(emitter);
92
92
 
93
93
  for (auto it = view.Parent(); it; it = it.Parent()) {
94
94
  auto emitter =
95
95
  it.as<winrt::Microsoft::ReactNative::Composition::implementation::ComponentView>()->GetEventEmitter();
96
96
  if (emitter)
97
- return emitter;
97
+ return std::const_pointer_cast<facebook::react::ViewEventEmitter>(emitter);
98
98
  }
99
99
 
100
100
  return nullptr;
@@ -224,6 +224,28 @@ void CompositionEventHandler::Initialize() noexcept {
224
224
  }
225
225
  });
226
226
 
227
+ // Issue #16047: when ScrollView calls VisualInteractionSource::TryRedirectForManipulation
228
+ // and the OS hands the pointer over to the InteractionTracker, WinAppSDK
229
+ // does not fire PointerCaptureLost on this source — but it does fire
230
+ // PointerRoutedAway. Treat it the same way as captureloss: cancel any
231
+ // active touch RN is tracking for this pointer so Pressables don't get
232
+ // stuck in their pressed state.
233
+ m_pointerRoutedAwayToken =
234
+ pointerSource.PointerRoutedAway([wkThis = weak_from_this()](
235
+ winrt::Microsoft::UI::Input::InputPointerSource const &,
236
+ winrt::Microsoft::UI::Input::PointerEventArgs const &args) {
237
+ if (auto strongThis = wkThis.lock()) {
238
+ if (auto strongRootView = strongThis->m_wkRootView.get()) {
239
+ if (strongThis->SurfaceId() == -1)
240
+ return;
241
+
242
+ auto pp = winrt::make<winrt::Microsoft::ReactNative::Composition::Input::implementation::PointerPoint>(
243
+ args.CurrentPoint(), strongRootView.ScaleFactor());
244
+ strongThis->onPointerRoutedAway(pp, args.KeyModifiers());
245
+ }
246
+ }
247
+ });
248
+
227
249
  m_pointerWheelChangedToken =
228
250
  pointerSource.PointerWheelChanged([wkThis = weak_from_this()](
229
251
  winrt::Microsoft::UI::Input::InputPointerSource const &,
@@ -369,6 +391,7 @@ CompositionEventHandler::~CompositionEventHandler() {
369
391
  pointerSource.PointerReleased(m_pointerReleasedToken);
370
392
  pointerSource.PointerMoved(m_pointerMovedToken);
371
393
  pointerSource.PointerCaptureLost(m_pointerCaptureLostToken);
394
+ pointerSource.PointerRoutedAway(m_pointerRoutedAwayToken);
372
395
  pointerSource.PointerWheelChanged(m_pointerWheelChangedToken);
373
396
  pointerSource.PointerExited(m_pointerExitedToken);
374
397
  auto keyboardSource = winrt::Microsoft::UI::Input::InputKeyboardSource::GetForIsland(island);
@@ -1116,6 +1139,50 @@ void CompositionEventHandler::onPointerCaptureLost(
1116
1139
 
1117
1140
  m_pointerCapturingComponentTag = -1;
1118
1141
  }
1142
+
1143
+ // Defense-in-depth cleanup for the specific pointer that lost capture, even
1144
+ // when no JS-level CapturePointer was ever issued. The ScrollView
1145
+ // TryRedirectForManipulation path comes in via PointerRoutedAway, not
1146
+ // PointerCaptureLost (see onPointerRoutedAway and issue #16047), so this
1147
+ // path covers the remaining system-driven losses (focus change, another
1148
+ // window stealing input, system back gesture, etc.).
1149
+ CancelActiveTouchForPointerInternal(pointerPoint.PointerId(), pointerPoint, keyModifiers);
1150
+ }
1151
+
1152
+ void CompositionEventHandler::onPointerRoutedAway(
1153
+ const winrt::Microsoft::ReactNative::Composition::Input::PointerPoint &pointerPoint,
1154
+ winrt::Windows::System::VirtualKeyModifiers keyModifiers) noexcept {
1155
+ if (SurfaceId() == -1)
1156
+ return;
1157
+
1158
+ // Issue #16047: WinAppSDK fires PointerRoutedAway when the OS hands the
1159
+ // pointer to another InputPointerSource — most importantly for us, when
1160
+ // ScrollView calls VisualInteractionSource::TryRedirectForManipulation and
1161
+ // the InteractionTracker takes the gesture for scrolling. We never get
1162
+ // PointerMoved / PointerReleased / PointerCaptureLost for that pointer
1163
+ // afterwards, so without this cleanup m_activeTouches keeps a zombie entry
1164
+ // and the originally-pressed Pressable stays stuck in its pressed state.
1165
+ CancelActiveTouchForPointerInternal(pointerPoint.PointerId(), pointerPoint, keyModifiers);
1166
+ }
1167
+
1168
+ bool CompositionEventHandler::CancelActiveTouchForPointerInternal(
1169
+ PointerId pointerId,
1170
+ const winrt::Microsoft::ReactNative::Composition::Input::PointerPoint &pointerPoint,
1171
+ winrt::Windows::System::VirtualKeyModifiers keyModifiers) noexcept {
1172
+ auto activeTouch = m_activeTouches.find(pointerId);
1173
+ if (activeTouch == m_activeTouches.end()) {
1174
+ return false;
1175
+ }
1176
+
1177
+ ActiveTouch cancelledTouchCopy = std::move(activeTouch->second);
1178
+ m_activeTouches.erase(activeTouch);
1179
+
1180
+ if (!cancelledTouchCopy.eventEmitter) {
1181
+ return false;
1182
+ }
1183
+
1184
+ DispatchSynthesizedTouchCancelForActiveTouch(cancelledTouchCopy, pointerPoint, keyModifiers);
1185
+ return true;
1119
1186
  }
1120
1187
 
1121
1188
  void CompositionEventHandler::onPointerMoved(
@@ -1366,7 +1433,7 @@ void CompositionEventHandler::onPointerPressed(
1366
1433
 
1367
1434
  UpdateActiveTouch(activeTouch, ptScaled, ptLocal);
1368
1435
 
1369
- activeTouch.isPrimary = pointerId == 1;
1436
+ activeTouch.isPrimary = pointerPoint.Properties().IsPrimary();
1370
1437
  // Map the Windows pointer ID to a small identifier (0–19) safe for use as a JS array index.
1371
1438
  // Windows touch IDs can be arbitrarily large (e.g. 2233), which causes React Native to warn
1372
1439
  // and corrupts touch state, leaving Pressables stuck after a scroll.
@@ -1614,16 +1681,6 @@ bool CompositionEventHandler::IsPointerWithinInitialTree(const ActiveTouch &acti
1614
1681
  currentView = currentView.Parent();
1615
1682
  }
1616
1683
 
1617
- // Fallback: if the pointer drifted spatially but the original target
1618
- // is still structurally within the initial tree, honor the tap.
1619
- // This provides touch-device tolerance for finger drift.
1620
- auto targetView = viewRegistry.componentViewDescriptorWithTag(activeTouch.touch.target).view;
1621
- while (targetView) {
1622
- if (targetView.Tag() == initialTag)
1623
- return true;
1624
- targetView = targetView.Parent();
1625
- }
1626
-
1627
1684
  return false;
1628
1685
  }
1629
1686
 
@@ -1685,7 +1742,15 @@ void CompositionEventHandler::DispatchTouchEvent(
1685
1742
 
1686
1743
  facebook::react::TouchEvent event;
1687
1744
 
1688
- size_t index = 0;
1745
+ // First pass: build changedTouches and the set of unique emitters from every active
1746
+ // touch. The per-pointer PointerEvent dispatch (onPointerDown/Move/Up/Cancel/Click) is
1747
+ // fired only for the touch whose state actually changed — non-changed touches contribute
1748
+ // to the W3C TouchEvent's touches/targetTouches sets in the loops below but must not
1749
+ // re-fire pointer events of their own. Previously we dispatched the per-pointer event
1750
+ // for every entry in m_activeTouches, which produced duplicated onPointerMove on
1751
+ // non-moving fingers and replayed onPointerUp/onClick on stale targets after the OS
1752
+ // reclaimed a pointer (e.g. ScrollView manipulation redirect leaving a zombie touch).
1753
+ const ActiveTouch *changedTouch = nullptr;
1689
1754
  for (const auto &pair : m_activeTouches) {
1690
1755
  const auto &activeTouch = pair.second;
1691
1756
 
@@ -1694,14 +1759,17 @@ void CompositionEventHandler::DispatchTouchEvent(
1694
1759
  }
1695
1760
 
1696
1761
  if (pair.first == pointerId) {
1762
+ changedTouch = &activeTouch;
1697
1763
  event.changedTouches.insert(activeTouch.touch);
1698
1764
  }
1699
1765
  uniqueEventEmitters.insert(activeTouch.eventEmitter);
1766
+ }
1700
1767
 
1701
- facebook::react::PointerEvent pointerEvent = CreatePointerEventFromActiveTouch(activeTouch, eventType);
1768
+ if (changedTouch) {
1769
+ facebook::react::PointerEvent pointerEvent = CreatePointerEventFromActiveTouch(*changedTouch, eventType);
1702
1770
 
1703
1771
  winrt::Microsoft::ReactNative::ComponentView targetView{nullptr};
1704
- bool shouldLeave = (eventType == TouchEventType::End && activeTouch.shouldLeaveWhenReleased) ||
1772
+ bool shouldLeave = (eventType == TouchEventType::End && changedTouch->shouldLeaveWhenReleased) ||
1705
1773
  eventType == TouchEventType::Cancel;
1706
1774
  if (!shouldLeave) {
1707
1775
  auto *rootViewForHit = RootComponentView();
@@ -1716,29 +1784,29 @@ void CompositionEventHandler::DispatchTouchEvent(
1716
1784
  }
1717
1785
  }
1718
1786
 
1719
- auto handler = [this, &activeTouch, eventType, &pointerEvent](
1787
+ auto handler = [this, changedTouch, eventType, &pointerEvent](
1720
1788
  std::vector<winrt::Microsoft::ReactNative::ComponentView> &eventPathViews) {
1721
1789
  switch (eventType) {
1722
1790
  case TouchEventType::Start:
1723
- activeTouch.eventEmitter->onPointerDown(pointerEvent);
1791
+ changedTouch->eventEmitter->onPointerDown(pointerEvent);
1724
1792
  break;
1725
1793
  case TouchEventType::Move: {
1726
- activeTouch.eventEmitter->onPointerMove(pointerEvent);
1794
+ changedTouch->eventEmitter->onPointerMove(pointerEvent);
1727
1795
  break;
1728
1796
  }
1729
1797
  case TouchEventType::End:
1730
- activeTouch.eventEmitter->onPointerUp(pointerEvent);
1798
+ changedTouch->eventEmitter->onPointerUp(pointerEvent);
1731
1799
  if (pointerEvent.isPrimary && pointerEvent.button == 0) {
1732
- if (IsPointerWithinInitialTree(activeTouch)) {
1733
- activeTouch.eventEmitter->onClick(pointerEvent);
1800
+ if (IsPointerWithinInitialTree(*changedTouch)) {
1801
+ changedTouch->eventEmitter->onClick(pointerEvent);
1734
1802
  }
1735
- } /* else if (IsPointerWithinInitialTree(activeTouch)) {
1736
- activeTouch.eventEmitter->onAuxClick(pointerEvent);
1737
- } */
1803
+ } else if (IsPointerWithinInitialTree(*changedTouch)) {
1804
+ changedTouch->eventEmitter->onAuxClick(pointerEvent);
1805
+ }
1738
1806
  break;
1739
1807
  case TouchEventType::Cancel:
1740
1808
  case TouchEventType::CaptureLost:
1741
- activeTouch.eventEmitter->onPointerCancel(pointerEvent);
1809
+ changedTouch->eventEmitter->onPointerCancel(pointerEvent);
1742
1810
  break;
1743
1811
  }
1744
1812
  };
@@ -66,6 +66,9 @@ class CompositionEventHandler : public std::enable_shared_from_this<CompositionE
66
66
  void onPointerCaptureLost(
67
67
  const winrt::Microsoft::ReactNative::Composition::Input::PointerPoint &pointerPoint,
68
68
  winrt::Windows::System::VirtualKeyModifiers keyModifiers) noexcept;
69
+ void onPointerRoutedAway(
70
+ const winrt::Microsoft::ReactNative::Composition::Input::PointerPoint &pointerPoint,
71
+ winrt::Windows::System::VirtualKeyModifiers keyModifiers) noexcept;
69
72
  void onKeyDown(const winrt::Microsoft::ReactNative::Composition::Input::KeyRoutedEventArgs &args) noexcept;
70
73
  void onKeyUp(const winrt::Microsoft::ReactNative::Composition::Input::KeyRoutedEventArgs &args) noexcept;
71
74
  void onCharacterReceived(
@@ -156,6 +159,13 @@ class CompositionEventHandler : public std::enable_shared_from_this<CompositionE
156
159
  const winrt::Microsoft::ReactNative::Composition::Input::PointerPoint &pointerPoint,
157
160
  winrt::Windows::System::VirtualKeyModifiers keyModifiers);
158
161
 
162
+ // Look up the active touch for pointerId, erase it, and dispatch cancel events.
163
+ // Returns true iff a touch was found and cancel events were dispatched.
164
+ bool CancelActiveTouchForPointerInternal(
165
+ PointerId pointerId,
166
+ const winrt::Microsoft::ReactNative::Composition::Input::PointerPoint &pointerPoint,
167
+ winrt::Windows::System::VirtualKeyModifiers keyModifiers) noexcept;
168
+
159
169
  std::vector<winrt::Microsoft::ReactNative::ComponentView> GetTouchableViewsInPathToRoot(
160
170
  const winrt::Microsoft::ReactNative::ComponentView &componentView);
161
171
 
@@ -186,6 +196,7 @@ class CompositionEventHandler : public std::enable_shared_from_this<CompositionE
186
196
  winrt::event_token m_pointerMovedToken;
187
197
  winrt::event_token m_pointerWheelChangedToken;
188
198
  winrt::event_token m_pointerCaptureLostToken;
199
+ winrt::event_token m_pointerRoutedAwayToken;
189
200
  winrt::event_token m_pointerExitedToken;
190
201
  winrt::event_token m_keyDownToken;
191
202
  winrt::event_token m_keyUpToken;
@@ -38,9 +38,11 @@ constexpr float FOCUS_VISUAL_RADIUS = 3.0f;
38
38
 
39
39
  // m_outerVisual
40
40
  // |
41
- // ----- m_visual <-- Background / clip - Can be a custom visual depending on Component type
41
+ // ----- m_visual - Can be a custom visual depending on Component type
42
42
  // |
43
- // ----- Border Visuals x N (BorderPrimitive attached to m_visual)
43
+ // ----- m_backgroundVisual <-- Background / clip (ComponentViewFeatures::Background)
44
+ // ----- Border Visuals x N (BorderPrimitive attached to m_visual) (ComponentViewFeatures::NativeBorder)
45
+ // ----- Outline Visuals x N(BorderPrimitive) (ComponentViewFeatures::NativeBorder)
44
46
  // ----- <children> (default: directly in m_visual after border visuals)
45
47
  // ----- m_childrenContainer (created on demand when overflow:hidden, children moved here)
46
48
  // ------Focus Visual Container (created when hosting focus visuals)
@@ -79,18 +81,16 @@ facebook::react::Props::Shared ComponentView::props() noexcept {
79
81
  }
80
82
 
81
83
  void ComponentView::onThemeChanged() noexcept {
82
- if ((m_flags & ComponentViewFeatures::Background) == ComponentViewFeatures::Background) {
83
- if (viewProps()->backgroundColor) {
84
- Visual().as<Experimental::ISpriteVisual>().Brush(theme()->Brush(*viewProps()->backgroundColor));
85
- } else {
86
- Visual().as<Experimental::ISpriteVisual>().Brush(nullptr);
87
- }
88
- }
84
+ if (m_backgroundVisual)
85
+ m_backgroundVisual.Brush(theme()->Brush(*viewProps()->backgroundColor));
89
86
 
90
87
  if (m_borderPrimitive) {
91
88
  m_borderPrimitive->onThemeChanged(
92
89
  m_layoutMetrics, BorderPrimitive::resolveAndAlignBorderMetrics(m_layoutMetrics, *viewProps()));
93
90
  }
91
+ if (m_outlinePrimitive) {
92
+ m_outlinePrimitive->onThemeChanged(outlineLayoutMetrics(), outlineBorderMetrics());
93
+ }
94
94
  if (m_componentHostingFocusVisual) {
95
95
  if (m_componentHostingFocusVisual->m_focusPrimitive->m_focusInnerPrimitive) {
96
96
  auto innerFocusMetrics = focusLayoutMetrics(true /*inner*/);
@@ -154,10 +154,18 @@ void ComponentView::updateProps(
154
154
 
155
155
  if ((m_flags & ComponentViewFeatures::Background) == ComponentViewFeatures::Background) {
156
156
  if (oldViewProps.backgroundColor != newViewProps.backgroundColor) {
157
- if (newViewProps.backgroundColor) {
158
- Visual().as<Experimental::ISpriteVisual>().Brush(theme()->Brush(*newViewProps.backgroundColor));
157
+ if (facebook::react::isColorMeaningful(newViewProps.backgroundColor)) {
158
+ if (!m_backgroundVisual) {
159
+ m_backgroundVisual = m_compContext.CreateSpriteVisual();
160
+ m_backgroundVisual.RelativeSizeWithOffset({0, 0}, {1.0f, 1.0f});
161
+ Visual().InsertAt(m_backgroundVisual, 0);
162
+ }
163
+ m_backgroundVisual.Brush(theme()->Brush(*newViewProps.backgroundColor));
164
+ updateClippingPath(m_layoutMetrics, *viewProps());
159
165
  } else {
160
- Visual().as<Experimental::ISpriteVisual>().Brush(nullptr);
166
+ if (m_backgroundVisual) {
167
+ m_backgroundVisual.Brush(nullptr);
168
+ }
161
169
  }
162
170
  }
163
171
  }
@@ -166,6 +174,16 @@ void ComponentView::updateProps(
166
174
  m_borderPrimitive->updateProps(oldViewProps, newViewProps);
167
175
  }
168
176
 
177
+ if (m_outlinePrimitive) {
178
+ if (oldViewProps.outlineOffset != newViewProps.outlineOffset ||
179
+ oldViewProps.outlineWidth != newViewProps.outlineWidth ||
180
+ oldViewProps.borderRadii != newViewProps.borderRadii ||
181
+ oldViewProps.outlineColor != newViewProps.outlineColor ||
182
+ oldViewProps.outlineStyle != newViewProps.outlineStyle) {
183
+ m_outlinePrimitive->markNeedsUpdate();
184
+ }
185
+ }
186
+
169
187
  if (m_componentHostingFocusVisual) {
170
188
  if (!newViewProps.enableFocusRing) {
171
189
  m_componentHostingFocusVisual->hostFocusVisual(false, get_strong());
@@ -200,8 +218,9 @@ void ComponentView::updateProps(
200
218
  void ComponentView::updateLayoutMetrics(
201
219
  facebook::react::LayoutMetrics const &layoutMetrics,
202
220
  facebook::react::LayoutMetrics const &oldLayoutMetrics) noexcept {
221
+ updateClippingPath(layoutMetrics, *viewProps());
222
+
203
223
  if ((m_flags & ComponentViewFeatures::NativeBorder) == ComponentViewFeatures::NativeBorder) {
204
- updateClippingPath(layoutMetrics, *viewProps());
205
224
  OuterVisual().Size(
206
225
  {layoutMetrics.frame.size.width * layoutMetrics.pointScaleFactor,
207
226
  layoutMetrics.frame.size.height * layoutMetrics.pointScaleFactor});
@@ -218,6 +237,9 @@ void ComponentView::updateLayoutMetrics(
218
237
  if (m_borderPrimitive) {
219
238
  m_borderPrimitive->markNeedsUpdate();
220
239
  }
240
+ if (m_outlinePrimitive) {
241
+ m_outlinePrimitive->markNeedsUpdate();
242
+ }
221
243
 
222
244
  if (m_componentHostingFocusVisual) {
223
245
  m_componentHostingFocusVisual->updateFocusLayoutMetrics();
@@ -301,6 +323,23 @@ void ComponentView::FinalizeUpdates(winrt::Microsoft::ReactNative::ComponentView
301
323
  if (m_borderPrimitive) {
302
324
  m_borderPrimitive->finalize(m_layoutMetrics, borderMetrics);
303
325
  }
326
+
327
+ auto outlineMetrics = outlineBorderMetrics();
328
+ if (!m_outlinePrimitive && BorderPrimitive::requiresBorder(outlineMetrics, theme())) {
329
+ m_outlinePrimitive = std::make_shared<BorderPrimitive>(*this);
330
+ Visual().InsertAt(
331
+ m_outlinePrimitive->RootVisual(),
332
+ (m_backgroundVisual ? 1 : 0) + (m_borderPrimitive ? m_borderPrimitive->numberOfVisuals() : 0));
333
+ }
334
+
335
+ if (m_outlinePrimitive) {
336
+ auto offset = pixelRoundAndScaleBorderWidth(viewProps()->outlineWidth, m_layoutMetrics.pointScaleFactor) +
337
+ std::round(viewProps()->outlineOffset * m_layoutMetrics.pointScaleFactor);
338
+ m_outlinePrimitive->RootVisual().Offset({-offset, -offset, 0.0f});
339
+ m_outlinePrimitive->RootVisual().RelativeSizeWithOffset({offset * 2, offset * 2}, {1.0f, 1.0f});
340
+
341
+ m_outlinePrimitive->finalize(outlineLayoutMetrics(), outlineMetrics);
342
+ }
304
343
  }
305
344
 
306
345
  if (m_componentHostingFocusVisual) {
@@ -581,6 +620,67 @@ facebook::react::LayoutMetrics ComponentView::focusLayoutMetrics(bool inner) con
581
620
  return layoutMetrics;
582
621
  }
583
622
 
623
+ facebook::react::LayoutMetrics ComponentView::outlineLayoutMetrics() const noexcept {
624
+ auto &props = *viewProps();
625
+ auto offset = (pixelRoundAndScaleBorderWidth(viewProps()->outlineWidth, m_layoutMetrics.pointScaleFactor) +
626
+ std::round(viewProps()->outlineOffset * m_layoutMetrics.pointScaleFactor)) /
627
+ m_layoutMetrics.pointScaleFactor;
628
+ facebook::react::LayoutMetrics layoutMetrics = m_layoutMetrics;
629
+ layoutMetrics.frame.origin.x -= offset;
630
+ layoutMetrics.frame.origin.y -= offset;
631
+ layoutMetrics.frame.size.height += offset * 2;
632
+ layoutMetrics.frame.size.width += offset * 2;
633
+ return layoutMetrics;
634
+ }
635
+
636
+ facebook::react::BorderMetrics ComponentView::outlineBorderMetrics() const noexcept {
637
+ auto &props = *viewProps();
638
+
639
+ facebook::react::BorderMetrics metrics = BorderPrimitive::resolveAndAlignBorderMetrics(m_layoutMetrics, props);
640
+ metrics.borderColors.bottom = metrics.borderColors.left = metrics.borderColors.right = metrics.borderColors.top =
641
+ props.outlineColor;
642
+
643
+ auto offset = pixelRoundAndScaleBorderWidth(viewProps()->outlineWidth, m_layoutMetrics.pointScaleFactor) +
644
+ std::round(viewProps()->outlineOffset * m_layoutMetrics.pointScaleFactor);
645
+
646
+ if (metrics.borderRadii.bottomLeft.horizontal)
647
+ metrics.borderRadii.bottomLeft.horizontal = std::max(0.0f, metrics.borderRadii.bottomLeft.horizontal + offset);
648
+ if (metrics.borderRadii.bottomLeft.vertical)
649
+ metrics.borderRadii.bottomLeft.vertical = std::max(0.0f, metrics.borderRadii.bottomLeft.vertical + offset);
650
+ if (metrics.borderRadii.bottomRight.horizontal)
651
+ metrics.borderRadii.bottomRight.horizontal = std::max(0.0f, metrics.borderRadii.bottomRight.horizontal + offset);
652
+ if (metrics.borderRadii.bottomRight.vertical)
653
+ metrics.borderRadii.bottomRight.vertical = std::max(0.0f, metrics.borderRadii.bottomRight.vertical + offset);
654
+ if (metrics.borderRadii.topLeft.horizontal)
655
+ metrics.borderRadii.topLeft.horizontal = std::max(0.0f, metrics.borderRadii.topLeft.horizontal + offset);
656
+ if (metrics.borderRadii.topLeft.vertical)
657
+ metrics.borderRadii.topLeft.vertical = std::max(0.0f, metrics.borderRadii.topLeft.vertical + offset);
658
+ if (metrics.borderRadii.topRight.horizontal)
659
+ metrics.borderRadii.topRight.horizontal = std::max(0.0f, metrics.borderRadii.topRight.horizontal + offset);
660
+ if (metrics.borderRadii.topRight.vertical)
661
+ metrics.borderRadii.topRight.vertical = std::max(0.0f, metrics.borderRadii.topRight.vertical + offset);
662
+
663
+ static_assert(
664
+ facebook::react::BorderStyle::Solid ==
665
+ static_cast<facebook::react::BorderStyle>(facebook::react::OutlineStyle::Solid));
666
+ static_assert(
667
+ facebook::react::BorderStyle::Dotted ==
668
+ static_cast<facebook::react::BorderStyle>(facebook::react::OutlineStyle::Dotted));
669
+ static_assert(
670
+ facebook::react::BorderStyle::Dashed ==
671
+ static_cast<facebook::react::BorderStyle>(facebook::react::OutlineStyle::Dashed));
672
+ assert(
673
+ props.outlineStyle == facebook::react::OutlineStyle::Solid ||
674
+ props.outlineStyle == facebook::react::OutlineStyle::Dotted ||
675
+ props.outlineStyle == facebook::react::OutlineStyle::Dashed);
676
+ metrics.borderStyles.bottom = metrics.borderStyles.left = metrics.borderStyles.right = metrics.borderStyles.top =
677
+ static_cast<facebook::react::BorderStyle>(props.outlineStyle);
678
+
679
+ metrics.borderWidths.bottom = metrics.borderWidths.left = metrics.borderWidths.right = metrics.borderWidths.top =
680
+ pixelRoundAndScaleBorderWidth(viewProps()->outlineWidth, m_layoutMetrics.pointScaleFactor);
681
+ return metrics;
682
+ }
683
+
584
684
  facebook::react::BorderMetrics ComponentView::focusBorderMetrics(
585
685
  bool inner,
586
686
  const facebook::react::LayoutMetrics &layoutMetrics) const noexcept {
@@ -654,7 +754,7 @@ void ComponentView::hostFocusVisual(bool show, winrt::com_ptr<ComponentView> vie
654
754
  assert(
655
755
  view.get() ==
656
756
  this); // When not using lifted comp, focus visuals should always host within their own component
657
- OuterVisual().InsertAt(m_focusPrimitive->m_focusVisual, 1);
757
+ OuterVisual().InsertAt(m_focusPrimitive->m_focusVisual, (m_backgroundVisual ? 2 : 1));
658
758
  }
659
759
  }
660
760
 
@@ -898,9 +998,23 @@ void ComponentView::Toggle() noexcept {
898
998
  // no-op
899
999
  }
900
1000
 
1001
+ // This offset ensures that the m_borderPrimitive inserts its layers above the background
1002
+ int32_t ComponentView::borderInsertAtIndex() const noexcept {
1003
+ return m_backgroundVisual ? 1 : 0;
1004
+ }
1005
+
1006
+ winrt::Microsoft::ReactNative::Composition::Experimental::IVisual ComponentView::VisualToApplyBackgroundClipTo()
1007
+ const noexcept {
1008
+ return m_backgroundVisual;
1009
+ }
1010
+
901
1011
  void ComponentView::updateClippingPath(
902
1012
  facebook::react::LayoutMetrics const &layoutMetrics,
903
1013
  const facebook::react::ViewProps &viewProps) noexcept {
1014
+ auto clipTarget = VisualToApplyBackgroundClipTo();
1015
+ if (!clipTarget)
1016
+ return;
1017
+
904
1018
  auto borderMetrics = BorderPrimitive::resolveAndAlignBorderMetrics(layoutMetrics, viewProps);
905
1019
 
906
1020
  bool hasRoundedCorners = borderMetrics.borderRadii.topLeft.horizontal != 0 ||
@@ -919,10 +1033,10 @@ void ComponentView::updateClippingPath(
919
1033
  winrt::com_ptr<ID2D1PathGeometry> pathGeometry = BorderPrimitive::GenerateRoundedRectPathGeometry(
920
1034
  m_compContext, borderMetrics.borderRadii, {0, 0, 0, 0}, {0, 0, viewWidth, viewHeight});
921
1035
 
922
- Visual().as<::Microsoft::ReactNative::Composition::Experimental::IVisualInterop>()->SetClippingPath(
1036
+ clipTarget.as<::Microsoft::ReactNative::Composition::Experimental::IVisualInterop>()->SetClippingPath(
923
1037
  pathGeometry.get());
924
1038
  } else {
925
- Visual().as<::Microsoft::ReactNative::Composition::Experimental::IVisualInterop>()->SetClippingPath(nullptr);
1039
+ clipTarget.as<::Microsoft::ReactNative::Composition::Experimental::IVisualInterop>()->SetClippingPath(nullptr);
926
1040
  }
927
1041
  }
928
1042
 
@@ -934,6 +1048,9 @@ void ComponentView::indexOffsetForBorder(uint32_t &index) const noexcept {
934
1048
  if (m_borderPrimitive) {
935
1049
  index += m_borderPrimitive->numberOfVisuals();
936
1050
  }
1051
+ if (m_outlinePrimitive) {
1052
+ index += 1;
1053
+ }
937
1054
  }
938
1055
 
939
1056
  void ComponentView::OnRenderingDeviceLost() noexcept {}
@@ -1084,7 +1201,7 @@ void ViewComponentView::ensureVisual() noexcept {
1084
1201
  } else {
1085
1202
  m_visual = createVisual();
1086
1203
  }
1087
- OuterVisual().InsertAt(m_visual, 0);
1204
+ OuterVisual().InsertAt(m_visual, m_backgroundVisual ? 1 : 0);
1088
1205
  }
1089
1206
  }
1090
1207
 
@@ -1382,7 +1499,7 @@ void ViewComponentView::updateChildrenClippingPath(
1382
1499
  }
1383
1500
 
1384
1501
  // Insert m_childrenContainer after border visuals in m_visual
1385
- Visual().InsertAt(m_childrenContainer, borderCount);
1502
+ Visual().InsertAt(m_childrenContainer, (m_backgroundVisual ? 1 : 0) + borderCount);
1386
1503
 
1387
1504
  // Use relative sizing so container automatically tracks parent's size
1388
1505
  m_childrenContainer.RelativeSizeWithOffset({0, 0}, {1, 1});
@@ -111,6 +111,9 @@ struct ComponentView : public ComponentViewT<
111
111
  bool getAcccessiblityIsReadOnly() noexcept override;
112
112
  ToggleState getToggleState() noexcept override;
113
113
  void Toggle() noexcept override;
114
+
115
+ int32_t borderInsertAtIndex() const noexcept;
116
+
114
117
  virtual winrt::Microsoft::ReactNative::implementation::ClipState getClipState() noexcept;
115
118
 
116
119
  virtual std::pair<facebook::react::Cursor, HCURSOR> cursor() const noexcept;
@@ -130,6 +133,8 @@ struct ComponentView : public ComponentViewT<
130
133
  void ThemeChanged(winrt::event_token const &token) noexcept;
131
134
 
132
135
  protected:
136
+ virtual winrt::Microsoft::ReactNative::Composition::Experimental::IVisual VisualToApplyBackgroundClipTo()
137
+ const noexcept;
133
138
  bool anyHitTestHelper(
134
139
  facebook::react::Tag &targetTag,
135
140
  facebook::react::Point &ptContent,
@@ -141,6 +146,7 @@ struct ComponentView : public ComponentViewT<
141
146
  winrt::Microsoft::ReactNative::Composition::Experimental::ICompositionContext m_compContext;
142
147
  comp::CompositionPropertySet m_centerPropSet{nullptr};
143
148
  facebook::react::SharedViewEventEmitter m_eventEmitter;
149
+ winrt::Microsoft::ReactNative::Composition::Experimental::ISpriteVisual m_backgroundVisual{nullptr};
144
150
 
145
151
  private:
146
152
  void updateFocusLayoutMetrics() noexcept;
@@ -157,6 +163,9 @@ struct ComponentView : public ComponentViewT<
157
163
  facebook::react::BorderMetrics focusBorderMetrics(bool inner, const facebook::react::LayoutMetrics &layoutMetrics)
158
164
  const noexcept;
159
165
 
166
+ facebook::react::LayoutMetrics outlineLayoutMetrics() const noexcept;
167
+ facebook::react::BorderMetrics outlineBorderMetrics() const noexcept;
168
+
160
169
  virtual winrt::Microsoft::ReactNative::Composition::Experimental::IVisual visualToHostFocus() noexcept;
161
170
  virtual winrt::com_ptr<ComponentView> focusVisualRoot(const facebook::react::Rect &focusRect) noexcept;
162
171
 
@@ -168,6 +177,7 @@ struct ComponentView : public ComponentViewT<
168
177
  winrt::com_ptr<ComponentView>
169
178
  m_componentHostingFocusVisual; // The component that we are showing our focus visuals within
170
179
  std::shared_ptr<BorderPrimitive> m_borderPrimitive;
180
+ std::shared_ptr<BorderPrimitive> m_outlinePrimitive;
171
181
  std::unique_ptr<FocusPrimitive> m_focusPrimitive{nullptr};
172
182
  winrt::Microsoft::ReactNative::Composition::Experimental::IVisual m_outerVisual{nullptr};
173
183
  winrt::event<winrt::Windows::Foundation::EventHandler<winrt::IInspectable>> m_themeChangedEvent;
@@ -189,14 +189,14 @@ void ImageComponentView::setStateAndResubscribeImageResponseObserver(
189
189
  facebook::react::ImageShadowNode::ConcreteState::Shared const &state) noexcept {
190
190
  if (m_state) {
191
191
  auto &observerCoordinator = m_state->getData().getImageRequest().getObserverCoordinator();
192
- observerCoordinator.removeObserver(*m_imageResponseObserver);
192
+ observerCoordinator.removeObserver(m_imageResponseObserver);
193
193
  }
194
194
 
195
195
  m_state = state;
196
196
 
197
197
  if (m_state) {
198
198
  auto &observerCoordinator = m_state->getData().getImageRequest().getObserverCoordinator();
199
- observerCoordinator.addObserver(*m_imageResponseObserver);
199
+ observerCoordinator.addObserver(m_imageResponseObserver);
200
200
  }
201
201
  }
202
202
 
@@ -237,6 +237,11 @@ void ImageComponentView::onThemeChanged() noexcept {
237
237
  Super::onThemeChanged();
238
238
  }
239
239
 
240
+ winrt::Microsoft::ReactNative::Composition::Experimental::IVisual ImageComponentView::VisualToApplyBackgroundClipTo()
241
+ const noexcept {
242
+ return Visual();
243
+ }
244
+
240
245
  void ImageComponentView::ensureDrawingSurface() noexcept {
241
246
  assert(m_reactContext.UIDispatcher().HasThreadAccess());
242
247
 
@@ -52,6 +52,8 @@ struct ImageComponentView : ImageComponentViewT<ImageComponentView, ViewComponen
52
52
 
53
53
  virtual std::string DefaultControlType() const noexcept;
54
54
  static facebook::react::SharedViewProps defaultProps() noexcept;
55
+ winrt::Microsoft::ReactNative::Composition::Experimental::IVisual VisualToApplyBackgroundClipTo()
56
+ const noexcept override;
55
57
 
56
58
  ImageComponentView(
57
59
  const winrt::Microsoft::ReactNative::Composition::Experimental::ICompositionContext &compContext,