react-native-windows 0.79.5 → 0.80.0-preview.10

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 (370) hide show
  1. package/.flowconfig +12 -3
  2. package/Directory.Build.props +11 -2
  3. package/Folly/TEMP_UntilFollyUpdate/json/json.cpp +1 -1
  4. package/Libraries/Alert/Alert.d.ts +4 -1
  5. package/Libraries/Alert/Alert.js +3 -0
  6. package/Libraries/Alert/Alert.windows.js +3 -0
  7. package/Libraries/Alert/RCTAlertManager.js +17 -0
  8. package/Libraries/Animated/Animated.js.flow +1 -3
  9. package/Libraries/Animated/AnimatedEvent.js +4 -3
  10. package/Libraries/Animated/AnimatedExports.js +2 -2
  11. package/Libraries/Animated/AnimatedExports.js.flow +140 -0
  12. package/Libraries/Animated/AnimatedImplementation.js +2 -123
  13. package/Libraries/Animated/Easing.js +13 -15
  14. package/Libraries/Animated/animations/Animation.js +8 -4
  15. package/Libraries/Animated/components/AnimatedFlatList.js +7 -6
  16. package/Libraries/Animated/components/AnimatedScrollView.js +48 -42
  17. package/Libraries/Animated/components/AnimatedSectionList.js +11 -7
  18. package/Libraries/Animated/createAnimatedComponent.js +105 -57
  19. package/Libraries/Animated/nodes/AnimatedNode.js +4 -3
  20. package/Libraries/Animated/nodes/AnimatedProps.js +46 -26
  21. package/Libraries/Animated/nodes/AnimatedValue.js +16 -7
  22. package/Libraries/Animated/nodes/AnimatedValueXY.js +3 -1
  23. package/Libraries/AppState/AppState.js +7 -2
  24. package/Libraries/BatchedBridge/MessageQueue.js +2 -2
  25. package/Libraries/BatchedBridge/NativeModules.js +2 -0
  26. package/Libraries/Blob/BlobManager.js +1 -0
  27. package/Libraries/Blob/FileReader.js +219 -8
  28. package/Libraries/Blob/URL.js +37 -12
  29. package/Libraries/Blob/URLSearchParams.js +106 -31
  30. package/Libraries/Blob/URLSearchParams.js.flow +12 -7
  31. package/Libraries/Components/AccessibilityInfo/AccessibilityInfo.js +1 -1
  32. package/Libraries/Components/AccessibilityInfo/AccessibilityInfo.windows.js +1 -1
  33. package/Libraries/Components/AccessibilityInfo/legacySendAccessibilityEvent.js +17 -0
  34. package/Libraries/Components/ActivityIndicator/ActivityIndicator.js +1 -0
  35. package/Libraries/Components/Button.d.ts +3 -0
  36. package/Libraries/Components/Button.js +1 -1
  37. package/Libraries/Components/Button.windows.js +27 -1
  38. package/Libraries/Components/DrawerAndroid/DrawerLayoutAndroid.android.js +1 -3
  39. package/Libraries/{NewAppScreen/components/Colors.js → Components/DrawerAndroid/DrawerLayoutAndroid.ios.js} +6 -10
  40. package/Libraries/Components/DrawerAndroid/DrawerLayoutAndroid.js +6 -66
  41. package/Libraries/Components/DrawerAndroid/DrawerLayoutAndroid.js.flow +18 -0
  42. package/Libraries/Components/DrawerAndroid/DrawerLayoutAndroidFallback.js +71 -0
  43. package/Libraries/Components/Flyout/Flyout.js +11 -0
  44. package/Libraries/Components/Keyboard/Keyboard.js +5 -3
  45. package/Libraries/Components/Keyboard/KeyboardAvoidingView.js +6 -3
  46. package/Libraries/Components/Keyboard/KeyboardExt.js.map +1 -1
  47. package/Libraries/Components/Popup/Popup.js +11 -0
  48. package/Libraries/Components/Pressable/Pressable.js +20 -4
  49. package/Libraries/Components/Pressable/Pressable.windows.js +20 -4
  50. package/Libraries/Components/ProgressBarAndroid/ProgressBarAndroid.js +25 -3
  51. package/Libraries/Components/ProgressBarAndroid/ProgressBarAndroidTypes.js +29 -20
  52. package/Libraries/Components/RefreshControl/RefreshControl.js +1 -1
  53. package/Libraries/Components/RefreshControl/RefreshControl.windows.js +1 -1
  54. package/Libraries/Components/ScrollView/ScrollView.d.ts +3 -3
  55. package/Libraries/Components/ScrollView/ScrollView.js +132 -122
  56. package/Libraries/Components/ScrollView/ScrollView.windows.js +131 -122
  57. package/Libraries/Components/StaticRenderer.js +1 -1
  58. package/Libraries/Components/Switch/Switch.d.ts +3 -0
  59. package/Libraries/Components/Switch/Switch.js +8 -4
  60. package/Libraries/Components/Switch/Switch.windows.js +17 -4
  61. package/Libraries/Components/TextInput/AndroidTextInputNativeComponent.js +2 -1
  62. package/Libraries/Components/TextInput/RCTTextInputViewConfig.js +2 -4
  63. package/Libraries/Components/TextInput/TextInput.d.ts +70 -33
  64. package/Libraries/Components/TextInput/TextInput.flow.js +100 -51
  65. package/Libraries/Components/TextInput/TextInput.flow.windows.js +1246 -0
  66. package/Libraries/Components/TextInput/TextInput.js +88 -1027
  67. package/Libraries/Components/TextInput/TextInput.windows.js +104 -1092
  68. package/Libraries/Components/TextInput/TextInputState.js +1 -1
  69. package/Libraries/Components/TextInput/TextInputState.windows.js +1 -1
  70. package/Libraries/Components/TextInput/WindowsTextInputNativeComponent.js +2 -1
  71. package/Libraries/{Modal/ModalInjection.js → Components/ToastAndroid/ToastAndroid.ios.js} +3 -5
  72. package/Libraries/Components/ToastAndroid/ToastAndroid.js +4 -32
  73. package/Libraries/Components/ToastAndroid/ToastAndroid.js.flow +109 -0
  74. package/Libraries/Components/ToastAndroid/ToastAndroidFallback.js +45 -0
  75. package/Libraries/Components/Touchable/Touchable.js +5 -5
  76. package/Libraries/Components/Touchable/Touchable.windows.js +5 -5
  77. package/Libraries/Components/Touchable/TouchableBounce.js +14 -7
  78. package/Libraries/Components/Touchable/TouchableBounce.windows.js +14 -7
  79. package/Libraries/Components/Touchable/TouchableHighlight.js +10 -7
  80. package/Libraries/Components/Touchable/TouchableHighlight.windows.js +10 -7
  81. package/Libraries/Components/Touchable/TouchableNativeFeedback.js +6 -6
  82. package/Libraries/Components/Touchable/TouchableNativeFeedback.windows.js +6 -6
  83. package/Libraries/Components/Touchable/TouchableOpacity.js +13 -6
  84. package/Libraries/Components/Touchable/TouchableOpacity.windows.js +13 -6
  85. package/Libraries/Components/View/View.js +18 -21
  86. package/Libraries/Components/View/View.windows.js +39 -41
  87. package/Libraries/Components/View/ViewAccessibility.d.ts +8 -0
  88. package/Libraries/Components/View/ViewAccessibility.js +25 -1
  89. package/Libraries/Components/View/ViewAccessibility.windows.js +9 -1
  90. package/Libraries/Components/View/ViewPropTypes.js +49 -3
  91. package/Libraries/Components/View/ViewPropTypes.windows.js +50 -2
  92. package/Libraries/Core/ReactNativeVersion.js +1 -1
  93. package/Libraries/Core/setUpReactDevTools.js +5 -5
  94. package/Libraries/Debugging/DebuggingOverlayRegistry.js +3 -3
  95. package/Libraries/EventEmitter/NativeEventEmitter.js +9 -4
  96. package/Libraries/Image/AssetSourceResolver.js +17 -4
  97. package/Libraries/Image/AssetSourceResolver.windows.js +17 -4
  98. package/Libraries/Image/Image.d.ts +26 -10
  99. package/Libraries/Image/Image.js +17 -0
  100. package/Libraries/Image/Image.js.flow +5 -5
  101. package/Libraries/Image/Image.windows.js +13 -1
  102. package/Libraries/Image/ImageBackground.js +2 -0
  103. package/Libraries/Image/ImageInjection.js +1 -1
  104. package/Libraries/Image/ImageProps.js +22 -17
  105. package/Libraries/Image/ImageSource.js +3 -1
  106. package/Libraries/Image/ImageSourceUtils.js +4 -2
  107. package/Libraries/Image/ImageTypes.flow.js +1 -1
  108. package/Libraries/Interaction/InteractionManager.d.ts +13 -0
  109. package/Libraries/Interaction/InteractionManager.js +1 -1
  110. package/Libraries/Interaction/PanResponder.js +3 -3
  111. package/Libraries/Interaction/TaskQueue.js +1 -0
  112. package/Libraries/LayoutAnimation/LayoutAnimation.js +2 -2
  113. package/Libraries/Linking/Linking.js +1 -1
  114. package/Libraries/Lists/FlatList.d.ts +2 -2
  115. package/Libraries/Lists/FlatList.js +8 -11
  116. package/Libraries/Lists/SectionList.js +39 -42
  117. package/Libraries/Lists/SectionListModern.js +25 -34
  118. package/Libraries/Lists/VirtualizedList.js +1 -0
  119. package/Libraries/Lists/VirtualizedSectionList.js +1 -0
  120. package/Libraries/LogBox/Data/LogBoxData.js +1 -1
  121. package/Libraries/LogBox/LogBoxNotificationContainer.js +1 -1
  122. package/Libraries/Modal/Modal.js +33 -7
  123. package/Libraries/Modal/Modal.windows.js +33 -10
  124. package/Libraries/NativeComponent/BaseViewConfig.android.js +2 -0
  125. package/Libraries/NativeComponent/BaseViewConfig.ios.js +2 -0
  126. package/Libraries/NativeComponent/BaseViewConfig.js +17 -0
  127. package/Libraries/NativeComponent/BaseViewConfig.windows.js +3 -0
  128. package/Libraries/NativeComponent/PlatformBaseViewConfig.js +2 -2
  129. package/Libraries/NativeModules/specs/NativeDevMenu.js +2 -2
  130. package/Libraries/Network/RCTNetworking.android.js +1 -1
  131. package/Libraries/Network/RCTNetworking.ios.js +1 -1
  132. package/Libraries/Network/RCTNetworking.js +17 -0
  133. package/Libraries/Network/RCTNetworking.js.flow +1 -1
  134. package/Libraries/Network/RCTNetworking.windows.js +1 -1
  135. package/Libraries/Network/XMLHttpRequest.js +781 -10
  136. package/Libraries/Performance/Systrace.js +7 -7
  137. package/Libraries/Pressability/Pressability.js +1 -1
  138. package/Libraries/Pressability/Pressability.windows.js +1 -1
  139. package/Libraries/ReactNative/AppContainer-dev.js +5 -4
  140. package/Libraries/ReactNative/AppRegistry.flow.js +49 -0
  141. package/Libraries/ReactNative/AppRegistry.js +2 -322
  142. package/Libraries/ReactNative/AppRegistry.js.flow +23 -0
  143. package/Libraries/ReactNative/AppRegistryImpl.js +316 -0
  144. package/Libraries/ReactNative/FabricUIManager.js +10 -0
  145. package/Libraries/ReactNative/ReactFabricPublicInstance/ReactFabricHostComponent.js +2 -4
  146. package/Libraries/ReactNative/ReactFabricPublicInstance/ReactFabricPublicInstance.js +1 -4
  147. package/Libraries/ReactNative/RendererImplementation.js +10 -5
  148. package/Libraries/ReactNative/getNativeComponentAttributes.js +1 -0
  149. package/Libraries/ReactNative/renderApplication.js +9 -0
  150. package/Libraries/ReactPrivate/ReactNativePrivateInterface.js +3 -3
  151. package/Libraries/ReactPrivate/ReactNativePrivateInterface.js.flow +51 -0
  152. package/Libraries/Renderer/implementations/ReactFabric-dev.js +4840 -4748
  153. package/Libraries/Renderer/implementations/ReactFabric-prod.js +4947 -4829
  154. package/Libraries/Renderer/implementations/ReactFabric-profiling.js +3998 -3888
  155. package/Libraries/Renderer/implementations/ReactNativeRenderer-dev.js +5005 -4948
  156. package/Libraries/Renderer/implementations/ReactNativeRenderer-prod.js +2744 -2652
  157. package/Libraries/Renderer/implementations/ReactNativeRenderer-profiling.js +5020 -4933
  158. package/Libraries/Renderer/shims/ReactNativeTypes.js +3 -3
  159. package/Libraries/Settings/Settings.ios.js +1 -0
  160. package/Libraries/Settings/Settings.js +13 -19
  161. package/Libraries/Settings/SettingsFallback.js +33 -0
  162. package/Libraries/StyleSheet/PlatformColorValueTypes.js +15 -0
  163. package/Libraries/StyleSheet/PlatformColorValueTypesIOS.js +6 -0
  164. package/Libraries/StyleSheet/Rect.js +1 -0
  165. package/Libraries/StyleSheet/StyleSheet.js +31 -200
  166. package/Libraries/StyleSheet/StyleSheet.js.flow +188 -0
  167. package/Libraries/StyleSheet/StyleSheetExports.js +210 -0
  168. package/Libraries/StyleSheet/StyleSheetExports.js.flow +112 -0
  169. package/Libraries/StyleSheet/StyleSheetTypes.d.ts +1 -1
  170. package/Libraries/StyleSheet/StyleSheetTypes.js +130 -52
  171. package/Libraries/StyleSheet/flattenStyle.js +14 -4
  172. package/Libraries/StyleSheet/private/_TransformStyle.js +49 -21
  173. package/Libraries/StyleSheet/processBackgroundImage.js +670 -214
  174. package/Libraries/Text/Text.d.ts +2 -5
  175. package/Libraries/Text/Text.js +3 -3
  176. package/Libraries/Text/Text.windows.js +3 -3
  177. package/Libraries/Text/TextNativeComponent.js +0 -4
  178. package/Libraries/Text/TextProps.js +5 -33
  179. package/Libraries/Text/TextProps.windows.js +5 -32
  180. package/Libraries/Types/CodegenTypesNamespace.d.ts +45 -0
  181. package/Libraries/{Blob/__mocks__/BlobModule.js → Types/CodegenTypesNamespace.js} +4 -6
  182. package/Libraries/Types/CoreEventTypes.d.ts +6 -1
  183. package/Libraries/Types/CoreEventTypes.js +1 -1
  184. package/Libraries/Types/CoreEventTypes.windows.js +1 -1
  185. package/Libraries/Utilities/Appearance.js +2 -0
  186. package/Libraries/Utilities/BackHandler.js +17 -0
  187. package/Libraries/Utilities/DeviceInfo.js +2 -0
  188. package/Libraries/Utilities/Dimensions.js +1 -1
  189. package/Libraries/Utilities/Platform.js +17 -0
  190. package/Libraries/Utilities/PlatformTypes.js +11 -3
  191. package/Libraries/Utilities/ReactNativeTestTools.js +2 -2
  192. package/Libraries/Utilities/codegenNativeCommands.d.ts +18 -0
  193. package/Libraries/Utilities/codegenNativeComponent.d.ts +26 -0
  194. package/Libraries/WebSocket/WebSocket.js +313 -8
  195. package/Libraries/vendor/core/ErrorUtils.js +28 -2
  196. package/Libraries/vendor/emitter/EventEmitter.js +6 -2
  197. package/Microsoft.ReactNative/CompositionSwitcher.idl +3 -0
  198. package/Microsoft.ReactNative/Fabric/AbiComponentDescriptor.cpp +0 -6
  199. package/Microsoft.ReactNative/Fabric/Composition/CompositionContextHelper.cpp +248 -6
  200. package/Microsoft.ReactNative/Fabric/Composition/CompositionDynamicAutomationProvider.cpp +55 -160
  201. package/Microsoft.ReactNative/Fabric/Composition/CompositionTextRangeProvider.cpp +30 -9
  202. package/Microsoft.ReactNative/Fabric/Composition/CompositionViewComponentView.cpp +36 -0
  203. package/Microsoft.ReactNative/Fabric/Composition/ParagraphComponentView.cpp +36 -33
  204. package/Microsoft.ReactNative/Fabric/Composition/ReactNativeIsland.cpp +22 -0
  205. package/Microsoft.ReactNative/Fabric/Composition/ReactNativeIsland.h +3 -0
  206. package/Microsoft.ReactNative/Fabric/Composition/ScrollViewComponentView.cpp +46 -0
  207. package/Microsoft.ReactNative/Fabric/Composition/ScrollViewComponentView.h +4 -1
  208. package/Microsoft.ReactNative/Fabric/Composition/SwitchComponentView.cpp +11 -0
  209. package/Microsoft.ReactNative/Fabric/Composition/TextDrawing.cpp +37 -5
  210. package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentView.cpp +177 -25
  211. package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentView.h +4 -0
  212. package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputEventEmitter.cpp +29 -0
  213. package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputEventEmitter.h +2 -0
  214. package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputShadowNode.cpp +17 -34
  215. package/Microsoft.ReactNative/Fabric/Composition/UiaHelpers.cpp +225 -0
  216. package/Microsoft.ReactNative/Fabric/Composition/UiaHelpers.h +23 -0
  217. package/Microsoft.ReactNative/Fabric/FabricUIManagerModule.cpp +9 -3
  218. package/Microsoft.ReactNative/Fabric/FabricUIManagerModule.h +2 -0
  219. package/Microsoft.ReactNative/Fabric/ImageManager.cpp +1 -1
  220. package/Microsoft.ReactNative/Fabric/platform/react/renderer/components/view/HostPlatformViewEventEmitter.cpp +16 -0
  221. package/Microsoft.ReactNative/Fabric/platform/react/renderer/components/view/HostPlatformViewEventEmitter.h +1 -0
  222. package/Microsoft.ReactNative/Fabric/platform/react/renderer/components/view/HostPlatformViewProps.cpp +9 -0
  223. package/Microsoft.ReactNative/Fabric/platform/react/renderer/components/view/HostPlatformViewProps.h +1 -0
  224. package/Microsoft.ReactNative/Fabric/platform/react/renderer/components/view/HostPlatformViewTraitsInitializer.h +4 -0
  225. package/Microsoft.ReactNative/Fabric/platform/react/renderer/graphics/PlatformColorUtils.cpp +64 -0
  226. package/Microsoft.ReactNative/Fabric/platform/react/renderer/graphics/PlatformColorUtils.h +11 -0
  227. package/Microsoft.ReactNative/Fabric/platform/react/renderer/textlayoutmanager/WindowsTextLayoutManager.cpp +36 -96
  228. package/Microsoft.ReactNative/Fabric/platform/react/renderer/textlayoutmanager/WindowsTextLayoutManager.h +1 -1
  229. package/Microsoft.ReactNative/Modules/AccessibilityInfoModule.cpp +29 -0
  230. package/Microsoft.ReactNative/Modules/SampleTurboModule.cpp +4 -0
  231. package/Microsoft.ReactNative/Modules/SampleTurboModule.h +3 -0
  232. package/Microsoft.ReactNative/TurboModulesProvider.h +1 -1
  233. package/Microsoft.ReactNative/Utils/ThemeUtils.cpp +49 -0
  234. package/Microsoft.ReactNative/Utils/ThemeUtils.h +31 -0
  235. package/Microsoft.ReactNative.Cxx/JSI/JsiApiContext.h +1 -1
  236. package/Microsoft.ReactNative.Cxx/JSI/LongLivedJsiValue.h +1 -1
  237. package/PropertySheets/Generated/PackageVersion.g.props +4 -4
  238. package/PropertySheets/JSEngine.props +1 -1
  239. package/PropertySheets/React.Cpp.props +4 -0
  240. package/PropertySheets/Warnings.props +45 -0
  241. package/README.md +6 -2
  242. package/ReactCommon/ReactCommon.vcxproj +9 -4
  243. package/ReactCommon/ReactCommon.vcxproj.filters +6 -0
  244. package/ReactCommon/TEMP_UntilReactCommonUpdate/cxxreact/CxxNativeModule.cpp +253 -0
  245. package/ReactCommon/TEMP_UntilReactCommonUpdate/cxxreact/JSExecutor.cpp +5 -2
  246. package/ReactCommon/TEMP_UntilReactCommonUpdate/cxxreact/NativeToJsBridge.cpp +4 -8
  247. package/ReactCommon/TEMP_UntilReactCommonUpdate/cxxreact/TraceSection.h +184 -0
  248. package/ReactCommon/TEMP_UntilReactCommonUpdate/jsinspector-modern/NetworkIOAgent.cpp +22 -0
  249. package/ReactCommon/TEMP_UntilReactCommonUpdate/jsinspector-modern/NetworkIOAgent.h +2 -4
  250. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/nativemodule/core/ReactCommon/TurboModuleWithJSIBindings.cpp +27 -0
  251. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/componentregistry/ComponentDescriptorRegistry.cpp +3 -2
  252. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/components/view/AccessibilityPrimitives.h +1 -1
  253. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/components/view/AccessibilityProps.cpp +308 -0
  254. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/core/DynamicEventPayload.cpp +42 -0
  255. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/renderer/css/CSSTokenizer.h +7 -51
  256. package/ReactCommon/TEMP_UntilReactCommonUpdate/react/runtime/ReactInstance.cpp +10 -5
  257. package/Scripts/creaternwapp.cmd +9 -3
  258. package/Scripts/rnw-dependencies.ps1 +16 -3
  259. package/Shared/Shared.vcxitems +3 -2
  260. package/Shared/Shared.vcxitems.filters +2 -1
  261. package/codegen/NativeAnimatedModuleSpec.g.h +2 -0
  262. package/codegen/NativeAnimatedTurboModuleSpec.g.h +2 -0
  263. package/codegen/NativePerformanceSpec.g.h +14 -0
  264. package/codegen/NativeReactNativeFeatureFlagsSpec.g.h +151 -127
  265. package/codegen/NativeSampleTurboModuleSpec.g.h +14 -8
  266. package/codegen/react/components/rnwcore/EventEmitters.cpp +48 -48
  267. package/codegen/rnwcoreJSI-generated.cpp +159 -129
  268. package/codegen/rnwcoreJSI.h +534 -408
  269. package/index.js +51 -331
  270. package/index.windows.js +70 -352
  271. package/interface.js +0 -4
  272. package/jest/resolver.js +31 -0
  273. package/jest/setup.js +6 -2
  274. package/package.json +29 -28
  275. package/src/private/animated/NativeAnimatedHelper.js +21 -8
  276. package/src/private/animated/createAnimatedPropsHook.js +11 -16
  277. package/src/private/animated/createAnimatedPropsMemoHook.js +1 -2
  278. package/src/private/components/{SafeAreaView_INTERNAL_DO_NOT_USE.js → safeareaview/SafeAreaView_INTERNAL_DO_NOT_USE.js} +6 -6
  279. package/src/private/components/{HScrollViewNativeComponents.js → scrollview/HScrollViewNativeComponents.js} +8 -8
  280. package/src/private/components/scrollview/VScrollViewNativeComponents.js +25 -0
  281. package/src/private/{devmenu → devsupport/devmenu}/DevMenu.js +1 -1
  282. package/src/private/{inspector → devsupport/devmenu/elementinspector}/BorderBox.js +3 -3
  283. package/src/private/{inspector → devsupport/devmenu/elementinspector}/BoxInspector.js +6 -5
  284. package/src/private/{inspector → devsupport/devmenu/elementinspector}/ElementBox.js +8 -6
  285. package/src/private/{inspector → devsupport/devmenu/elementinspector}/ElementProperties.js +11 -10
  286. package/src/private/{inspector → devsupport/devmenu/elementinspector}/Inspector.js +14 -12
  287. package/src/private/{inspector → devsupport/devmenu/elementinspector}/InspectorOverlay.js +5 -4
  288. package/src/private/{inspector → devsupport/devmenu/elementinspector}/InspectorPanel.js +9 -8
  289. package/src/private/{inspector → devsupport/devmenu/elementinspector}/NetworkOverlay.js +10 -9
  290. package/src/private/{inspector → devsupport/devmenu/elementinspector}/ReactDevToolsOverlay.js +7 -7
  291. package/src/private/{inspector → devsupport/devmenu/elementinspector}/StyleInspector.js +7 -6
  292. package/src/private/{inspector → devsupport/devmenu/elementinspector}/XHRInterceptor.js +2 -2
  293. package/src/private/{inspector → devsupport/devmenu/elementinspector}/getInspectorDataForViewAtPoint.js +4 -4
  294. package/src/private/{inspector → devsupport/devmenu/elementinspector}/resolveBoxStyle.js +1 -1
  295. package/src/private/{inspector → devsupport/devmenu/perfmonitor}/PerformanceOverlay.js +6 -5
  296. package/src/private/{specs_DEPRECATED/modules → devsupport/devmenu/specs}/NativeDevMenu.js +2 -2
  297. package/src/private/{debugging → devsupport/rndevtools}/ReactDevToolsSettingsManager.android.js +1 -1
  298. package/src/private/{debugging → devsupport/rndevtools}/ReactDevToolsSettingsManager.ios.js +1 -1
  299. package/src/private/{debugging → devsupport/rndevtools}/ReactDevToolsSettingsManager.windows.js +1 -1
  300. package/src/private/{debugging → devsupport/rndevtools}/setUpFuseboxReactDevToolsDispatcher.js +1 -1
  301. package/src/private/{fusebox → devsupport/rndevtools}/specs/NativeReactDevToolsRuntimeSettingsModule.js +2 -2
  302. package/src/private/{specs_DEPRECATED/modules → devsupport/rndevtools/specs}/NativeReactDevToolsSettingsManager.js +2 -2
  303. package/src/private/featureflags/ReactNativeFeatureFlags.js +82 -80
  304. package/src/private/featureflags/ReactNativeFeatureFlagsBase.js +12 -1
  305. package/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js +17 -13
  306. package/src/private/renderer/errorhandling/ErrorHandlers.js +2 -2
  307. package/src/private/specs_DEPRECATED/modules/NativeAnimatedModule.js +1 -1
  308. package/src/private/specs_DEPRECATED/modules/NativeAnimatedTurboModule.js +1 -1
  309. package/src/private/specs_DEPRECATED/modules/NativeSampleTurboModule.js +3 -0
  310. package/src/private/styles/composeStyles.js +12 -5
  311. package/src/private/types/HostComponent.js +1 -1
  312. package/src/private/types/HostInstance.js +67 -1
  313. package/src/private/webapis/dom/nodes/ReactNativeElement.js +2 -5
  314. package/src/private/webapis/dom/nodes/ReadOnlyNode.js +5 -18
  315. package/src/private/webapis/dom/nodes/internals/NodeInternals.js +6 -0
  316. package/src/private/webapis/performance/Performance.js +1 -3
  317. package/src/private/webapis/performance/PerformanceEntry.js +6 -1
  318. package/src/private/webapis/performance/internals/RawPerformanceEntry.js +3 -0
  319. package/src/private/webapis/performance/specs/NativePerformance.js +10 -1
  320. package/src/types/globals.d.ts +42 -0
  321. package/stubs/double-conversion/double-conversion.h +3 -1
  322. package/templates/cpp-app/template.config.js +2 -1
  323. package/templates/cpp-app/windows/MyApp/MyApp.vcxproj +4 -0
  324. package/templates/cpp-lib/example/metro.config.js +1 -1
  325. package/templates/cpp-lib/windows/MyLib/MyLib.vcxproj +4 -0
  326. package/templates/old/generateWrapper.js +1 -1
  327. package/templates/old/uwp-cpp-app/template.config.js +1 -1
  328. package/types/index.d.ts +6 -3
  329. package/types/public/ReactNativeTypes.d.ts +2 -2
  330. package/Libraries/BatchedBridge/__mocks__/MessageQueueTestConfig.js +0 -38
  331. package/Libraries/BatchedBridge/__mocks__/MessageQueueTestModule.js +0 -22
  332. package/Libraries/Blob/FileReader_new.js +0 -231
  333. package/Libraries/Blob/FileReader_old.js +0 -186
  334. package/Libraries/Blob/__mocks__/FileReaderModule.js +0 -20
  335. package/Libraries/Components/RefreshControl/__mocks__/RefreshControlMock.js +0 -32
  336. package/Libraries/Core/__mocks__/ErrorUtils.js +0 -33
  337. package/Libraries/Core/__mocks__/NativeExceptionsManager.js +0 -19
  338. package/Libraries/EventEmitter/__mocks__/NativeEventEmitter.js +0 -49
  339. package/Libraries/Events/CustomEvent.js +0 -32
  340. package/Libraries/Events/EventPolyfill.js +0 -239
  341. package/Libraries/Lists/__flowtests__/FlatList-flowtest.js +0 -118
  342. package/Libraries/Lists/__flowtests__/SectionList-flowtest.js +0 -134
  343. package/Libraries/Network/XMLHttpRequest_new.js +0 -794
  344. package/Libraries/Network/XMLHttpRequest_old.js +0 -701
  345. package/Libraries/NewAppScreen/components/DebugInstructions.js +0 -41
  346. package/Libraries/NewAppScreen/components/DebugInstructions.windows.js +0 -30
  347. package/Libraries/NewAppScreen/components/Header.js +0 -77
  348. package/Libraries/NewAppScreen/components/HermesBadge.js +0 -53
  349. package/Libraries/NewAppScreen/components/LearnMoreLinks.js +0 -148
  350. package/Libraries/NewAppScreen/components/ReloadInstructions.js +0 -39
  351. package/Libraries/NewAppScreen/components/ReloadInstructions.windows.js +0 -31
  352. package/Libraries/NewAppScreen/components/logo.png +0 -0
  353. package/Libraries/NewAppScreen/index.js +0 -25
  354. package/Libraries/StyleSheet/__flowtests__/StyleSheet-flowtest.js +0 -58
  355. package/Libraries/Utilities/__mocks__/BackHandler.js +0 -45
  356. package/Libraries/Utilities/__mocks__/GlobalPerformanceLogger.js +0 -16
  357. package/Libraries/Utilities/__mocks__/PixelRatio.js +0 -25
  358. package/Libraries/WebSocket/WebSocketEvent.js +0 -30
  359. package/Libraries/WebSocket/WebSocket_new.js +0 -325
  360. package/Libraries/WebSocket/WebSocket_old.js +0 -297
  361. package/Libraries/WebSocket/__mocks__/event-target-shim.js +0 -27
  362. package/Libraries/__flowtests__/ReactNativeTypes-flowtest.js +0 -30
  363. package/Libraries/vendor/emitter/__flowtests__/EventEmitter-flowtest.js +0 -81
  364. package/jest/__tests__/setup-test.js +0 -18
  365. package/src/private/components/VScrollViewNativeComponents.js +0 -25
  366. package/src/private/utilities/ensureInstance.js +0 -21
  367. package/src/private/webapis/performance/specs/__mocks__/NativePerformanceMock.js +0 -267
  368. package/types/modules/LaunchScreen.d.ts +0 -18
  369. /package/src/private/{devmenu → devsupport/devmenu}/DevMenu.d.ts +0 -0
  370. /package/src/private/{debugging → devsupport/rndevtools}/FuseboxSessionObserver.js +0 -0
@@ -1,6 +1,7 @@
1
1
 
2
2
  #include "pch.h"
3
3
  #include "CompositionContextHelper.h"
4
+ #include <algorithm>
4
5
  #if __has_include("Composition.Experimental.SystemCompositionContextHelper.g.cpp")
5
6
  #include "Composition.Experimental.SystemCompositionContextHelper.g.cpp"
6
7
  #endif
@@ -74,6 +75,10 @@ struct CompositionTypeTraits<WindowsTypeTag> {
74
75
  winrt::Windows::UI::Composition::Interactions::InteractionTrackerRequestIgnoredArgs;
75
76
  using InteractionTrackerValuesChangedArgs =
76
77
  winrt::Windows::UI::Composition::Interactions::InteractionTrackerValuesChangedArgs;
78
+ using InteractionTrackerInertiaRestingValue =
79
+ winrt::Windows::UI::Composition::Interactions::InteractionTrackerInertiaRestingValue;
80
+ using InteractionTrackerInertiaModifier =
81
+ winrt::Windows::UI::Composition::Interactions::InteractionTrackerInertiaModifier;
77
82
  using ScalarKeyFrameAnimation = winrt::Windows::UI::Composition::ScalarKeyFrameAnimation;
78
83
  using ShapeVisual = winrt::Windows::UI::Composition::ShapeVisual;
79
84
  using SpriteVisual = winrt::Windows::UI::Composition::SpriteVisual;
@@ -143,6 +148,10 @@ struct CompositionTypeTraits<MicrosoftTypeTag> {
143
148
  winrt::Microsoft::UI::Composition::Interactions::InteractionTrackerRequestIgnoredArgs;
144
149
  using InteractionTrackerValuesChangedArgs =
145
150
  winrt::Microsoft::UI::Composition::Interactions::InteractionTrackerValuesChangedArgs;
151
+ using InteractionTrackerInertiaRestingValue =
152
+ winrt::Microsoft::UI::Composition::Interactions::InteractionTrackerInertiaRestingValue;
153
+ using InteractionTrackerInertiaModifier =
154
+ winrt::Microsoft::UI::Composition::Interactions::InteractionTrackerInertiaModifier;
146
155
  using ScalarKeyFrameAnimation = winrt::Microsoft::UI::Composition::ScalarKeyFrameAnimation;
147
156
  using ShapeVisual = winrt::Microsoft::UI::Composition::ShapeVisual;
148
157
  using SpriteVisual = winrt::Microsoft::UI::Composition::SpriteVisual;
@@ -700,8 +709,23 @@ struct CompScrollerVisual : winrt::implements<
700
709
  void IdleStateEntered(
701
710
  typename TTypeRedirects::InteractionTracker sender,
702
711
  typename TTypeRedirects::InteractionTrackerIdleStateEnteredArgs args) noexcept {
712
+ // If we were in inertia and are now idle, momentum has ended
713
+ if (m_outer->m_inertia) {
714
+ m_outer->FireScrollMomentumEnd({sender.Position().x, sender.Position().y});
715
+ }
716
+
717
+ // If we were interacting but never entered inertia (Interacting -> Idle),
718
+ // and the interaction was user-driven (requestId == 0), fire end-drag here.
719
+ // Note: if the interactionRequestId was non-zero it was caused by a Try* call
720
+ // (programmatic), so we should not fire onScrollEndDrag.
721
+ if (m_outer->m_interacting && args.RequestId() == 0) {
722
+ m_outer->FireScrollEndDrag({sender.Position().x, sender.Position().y});
723
+ }
724
+
725
+ // Clear state flags
703
726
  m_outer->m_custom = false;
704
727
  m_outer->m_inertia = false;
728
+ m_outer->m_interacting = false;
705
729
  }
706
730
  void InertiaStateEntered(
707
731
  typename TTypeRedirects::InteractionTracker sender,
@@ -709,15 +733,26 @@ struct CompScrollerVisual : winrt::implements<
709
733
  m_outer->m_custom = false;
710
734
  m_outer->m_inertia = true;
711
735
  m_outer->m_currentPosition = args.NaturalRestingPosition();
712
- // When the user stops interacting with the object, tracker can go into two paths:
713
- // 1. tracker goes into idle state immediately
714
- // 2. tracker has just started gliding into Inertia state
715
- // Fire ScrollEndDrag
716
- m_outer->FireScrollEndDrag({args.NaturalRestingPosition().x, args.NaturalRestingPosition().y});
736
+
737
+ if (!m_outer->m_interacting && args.RequestId() == 0) {
738
+ m_outer->FireScrollBeginDrag({args.NaturalRestingPosition().x, args.NaturalRestingPosition().y});
739
+ }
740
+
741
+ // If interaction was user-driven (requestId == 0),
742
+ // fire ScrollEndDrag here (Interacting -> Inertia caused by user lift).
743
+ if (m_outer->m_interacting && args.RequestId() == 0) {
744
+ m_outer->FireScrollEndDrag({args.NaturalRestingPosition().x, args.NaturalRestingPosition().y});
745
+ }
746
+
747
+ // Fire momentum scroll begin when we enter inertia (user or programmatic)
748
+ m_outer->FireScrollMomentumBegin({args.NaturalRestingPosition().x, args.NaturalRestingPosition().y});
717
749
  }
718
750
  void InteractingStateEntered(
719
751
  typename TTypeRedirects::InteractionTracker sender,
720
752
  typename TTypeRedirects::InteractionTrackerInteractingStateEnteredArgs args) noexcept {
753
+ // Mark that we're now interacting and remember the requestId (user manipulations => 0)
754
+ m_outer->m_interacting = true;
755
+
721
756
  // Fire when the user starts dragging the object
722
757
  m_outer->FireScrollBeginDrag({sender.Position().x, sender.Position().y});
723
758
  }
@@ -727,6 +762,10 @@ struct CompScrollerVisual : winrt::implements<
727
762
  void ValuesChanged(
728
763
  typename TTypeRedirects::InteractionTracker sender,
729
764
  typename TTypeRedirects::InteractionTrackerValuesChangedArgs args) noexcept {
765
+ if (!m_outer->m_interacting && args.RequestId() == 0) {
766
+ m_outer->FireScrollBeginDrag({args.Position().x, args.Position().y});
767
+ }
768
+ m_outer->m_interacting = true;
730
769
  m_outer->m_currentPosition = args.Position();
731
770
  m_outer->FireScrollPositionChanged({args.Position().x, args.Position().y});
732
771
  }
@@ -782,9 +821,13 @@ struct CompScrollerVisual : winrt::implements<
782
821
  }
783
822
 
784
823
  void Horizontal(bool value) noexcept {
824
+ bool previousHorizontal = m_horizontal;
785
825
  m_horizontal = value;
786
826
 
787
- UpdateInteractionModes();
827
+ if (previousHorizontal != m_horizontal) {
828
+ UpdateInteractionModes();
829
+ ConfigureSnapInertiaModifiers(); // Reconfigure modifiers when direction changes
830
+ }
788
831
  }
789
832
 
790
833
  void UpdateInteractionModes() noexcept {
@@ -855,6 +898,21 @@ struct CompScrollerVisual : winrt::implements<
855
898
  m_interactionTracker.MinScale(minimumZoomScale);
856
899
  }
857
900
 
901
+ void SetSnapPoints(
902
+ bool snapToStart,
903
+ bool snapToEnd,
904
+ winrt::Windows::Foundation::Collections::IVectorView<float> const &offsets) noexcept {
905
+ m_snapToStart = snapToStart;
906
+ m_snapToEnd = snapToEnd;
907
+ m_snapToOffsets.clear();
908
+ if (offsets) {
909
+ for (auto const &offset : offsets) {
910
+ m_snapToOffsets.push_back(offset);
911
+ }
912
+ }
913
+ ConfigureSnapInertiaModifiers();
914
+ }
915
+
858
916
  void Opacity(float opacity) noexcept {
859
917
  m_visual.Opacity(opacity);
860
918
  }
@@ -953,6 +1011,20 @@ struct CompScrollerVisual : winrt::implements<
953
1011
  return m_scrollEndDragEvent.add(handler);
954
1012
  }
955
1013
 
1014
+ winrt::event_token ScrollMomentumBegin(
1015
+ winrt::Windows::Foundation::EventHandler<
1016
+ winrt::Microsoft::ReactNative::Composition::Experimental::IScrollPositionChangedArgs> const
1017
+ &handler) noexcept {
1018
+ return m_scrollMomentumBeginEvent.add(handler);
1019
+ }
1020
+
1021
+ winrt::event_token ScrollMomentumEnd(
1022
+ winrt::Windows::Foundation::EventHandler<
1023
+ winrt::Microsoft::ReactNative::Composition::Experimental::IScrollPositionChangedArgs> const
1024
+ &handler) noexcept {
1025
+ return m_scrollMomentumEndEvent.add(handler);
1026
+ }
1027
+
956
1028
  void ScrollPositionChanged(winrt::event_token const &token) noexcept {
957
1029
  m_scrollPositionChangedEvent.remove(token);
958
1030
  }
@@ -965,6 +1037,14 @@ struct CompScrollerVisual : winrt::implements<
965
1037
  m_scrollEndDragEvent.remove(token);
966
1038
  }
967
1039
 
1040
+ void ScrollMomentumBegin(winrt::event_token const &token) noexcept {
1041
+ m_scrollMomentumBeginEvent.remove(token);
1042
+ }
1043
+
1044
+ void ScrollMomentumEnd(winrt::event_token const &token) noexcept {
1045
+ m_scrollMomentumEndEvent.remove(token);
1046
+ }
1047
+
968
1048
  void ContentSize(winrt::Windows::Foundation::Numerics::float2 const &size) noexcept {
969
1049
  m_contentSize = size;
970
1050
  m_contentVisual.Size(size);
@@ -1043,6 +1123,14 @@ struct CompScrollerVisual : winrt::implements<
1043
1123
  m_scrollEndDragEvent(*this, winrt::make<CompScrollPositionChangedArgs>(position));
1044
1124
  }
1045
1125
 
1126
+ void FireScrollMomentumBegin(winrt::Windows::Foundation::Numerics::float2 position) noexcept {
1127
+ m_scrollMomentumBeginEvent(*this, winrt::make<CompScrollPositionChangedArgs>(position));
1128
+ }
1129
+
1130
+ void FireScrollMomentumEnd(winrt::Windows::Foundation::Numerics::float2 position) noexcept {
1131
+ m_scrollMomentumEndEvent(*this, winrt::make<CompScrollPositionChangedArgs>(position));
1132
+ }
1133
+
1046
1134
  void UpdateMaxPosition() noexcept {
1047
1135
  m_interactionTracker.MaxPosition(
1048
1136
  {std::max<float>(m_contentSize.x - m_visualSize.x, 0),
@@ -1050,10 +1138,158 @@ struct CompScrollerVisual : winrt::implements<
1050
1138
  0});
1051
1139
  }
1052
1140
 
1141
+ void ConfigureSnapInertiaModifiers() noexcept {
1142
+ if (!m_visual || !m_contentVisual || !m_interactionTracker) {
1143
+ return;
1144
+ }
1145
+
1146
+ auto visualSize = m_visual.Size();
1147
+ auto contentSize = m_contentVisual.Size();
1148
+ if (visualSize.x <= 0 || visualSize.y <= 0 || contentSize.x <= 0 || contentSize.y <= 0) {
1149
+ OutputDebugStringW(L"Invalid visual/content size\n");
1150
+ return;
1151
+ }
1152
+
1153
+ auto compositor = m_interactionTracker.Compositor();
1154
+
1155
+ // Collect and deduplicate all snap positions
1156
+ std::vector<float> snapPositions;
1157
+
1158
+ if (m_snapToStart) {
1159
+ snapPositions.push_back(0.0f);
1160
+ }
1161
+
1162
+ snapPositions.insert(snapPositions.end(), m_snapToOffsets.begin(), m_snapToOffsets.end());
1163
+ std::sort(snapPositions.begin(), snapPositions.end());
1164
+ snapPositions.erase(std::unique(snapPositions.begin(), snapPositions.end()), snapPositions.end());
1165
+
1166
+ std::vector<typename TTypeRedirects::InteractionTrackerInertiaRestingValue> restingValues;
1167
+
1168
+ for (size_t i = 0; i < snapPositions.size(); ++i) {
1169
+ const auto position = snapPositions[i];
1170
+ auto restingValue = TTypeRedirects::InteractionTrackerInertiaRestingValue::Create(compositor);
1171
+
1172
+ winrt::hstring axisComponent = m_horizontal ? L"X" : L"Y";
1173
+ winrt::hstring conditionExpr;
1174
+
1175
+ // Build condition expression based on whether there's one or multiple snap points
1176
+ if (snapPositions.size() == 1) {
1177
+ conditionExpr = L"abs(this.Target.NaturalRestingPosition." + axisComponent + L" - snap) < 50";
1178
+ } else {
1179
+ if (i == 0) {
1180
+ conditionExpr = L"this.Target.NaturalRestingPosition." + axisComponent + L" < midpoint";
1181
+ } else if (i == snapPositions.size() - 1) {
1182
+ conditionExpr = L"this.Target.NaturalRestingPosition." + axisComponent + L" >= midpoint";
1183
+ } else {
1184
+ conditionExpr = L"this.Target.NaturalRestingPosition." + axisComponent +
1185
+ L" >= prevMidpoint && this.Target.NaturalRestingPosition." + axisComponent + L" < nextMidpoint";
1186
+ }
1187
+ }
1188
+
1189
+ auto conditionAnim = compositor.CreateExpressionAnimation();
1190
+ conditionAnim.Expression(conditionExpr);
1191
+
1192
+ if (snapPositions.size() == 1) {
1193
+ conditionAnim.SetScalarParameter(L"snap", position);
1194
+ } else {
1195
+ // Multiple snap points - use range-based conditions
1196
+ if (i == 0) {
1197
+ const auto nextPosition = snapPositions[i + 1];
1198
+ const auto midpoint = (position + nextPosition) / 2.0f;
1199
+ conditionAnim.SetScalarParameter(L"midpoint", midpoint);
1200
+ } else if (i == snapPositions.size() - 1) {
1201
+ const auto prevPosition = snapPositions[i - 1];
1202
+ const auto midpoint = (prevPosition + position) / 2.0f;
1203
+ conditionAnim.SetScalarParameter(L"midpoint", midpoint);
1204
+ } else {
1205
+ const auto prevPosition = snapPositions[i - 1];
1206
+ const auto nextPosition = snapPositions[i + 1];
1207
+ const auto prevMidpoint = (prevPosition + position) / 2.0f;
1208
+ const auto nextMidpoint = (position + nextPosition) / 2.0f;
1209
+ conditionAnim.SetScalarParameter(L"prevMidpoint", prevMidpoint);
1210
+ conditionAnim.SetScalarParameter(L"nextMidpoint", nextMidpoint);
1211
+ }
1212
+ }
1213
+
1214
+ restingValue.Condition(conditionAnim);
1215
+
1216
+ // Resting value simply snaps to this position
1217
+ auto restingAnim = compositor.CreateExpressionAnimation();
1218
+ restingAnim.Expression(L"snap");
1219
+ restingAnim.SetScalarParameter(L"snap", position);
1220
+ restingValue.RestingValue(restingAnim);
1221
+
1222
+ restingValues.push_back(restingValue);
1223
+ }
1224
+
1225
+ if (m_snapToEnd) {
1226
+ auto endRestingValue = TTypeRedirects::InteractionTrackerInertiaRestingValue::Create(compositor);
1227
+
1228
+ // Create property sets to dynamically compute content - visual size
1229
+ auto contentSizePropertySet = compositor.CreatePropertySet();
1230
+ contentSizePropertySet.InsertVector2(L"Size", m_contentVisual.Size());
1231
+
1232
+ auto visualSizePropertySet = compositor.CreatePropertySet();
1233
+ visualSizePropertySet.InsertVector2(L"Size", m_visual.Size());
1234
+
1235
+ winrt::hstring endPositionExpr = m_horizontal ? L"max(contentSize.Size.x - visualSize.Size.x, 0)"
1236
+ : L"max(contentSize.Size.y - visualSize.Size.y, 0)";
1237
+
1238
+ float prevPosition = snapPositions.empty() ? 0.0f : snapPositions.back();
1239
+
1240
+ winrt::hstring endConditionExpr = m_horizontal
1241
+ ? L"this.Target.NaturalRestingPosition.X >= ((max(contentSize.Size.x - visualSize.Size.x, 0) + prevSnap) / 2.0)"
1242
+ : L"this.Target.NaturalRestingPosition.Y >= ((max(contentSize.Size.y - visualSize.Size.y, 0) + prevSnap) / 2.0)";
1243
+
1244
+ auto endCondition = compositor.CreateExpressionAnimation();
1245
+ endCondition.Expression(endConditionExpr);
1246
+ endCondition.SetReferenceParameter(L"contentSize", contentSizePropertySet);
1247
+ endCondition.SetReferenceParameter(L"visualSize", visualSizePropertySet);
1248
+ endCondition.SetScalarParameter(L"prevSnap", prevPosition);
1249
+
1250
+ auto endResting = compositor.CreateExpressionAnimation();
1251
+ endResting.Expression(endPositionExpr);
1252
+ endResting.SetReferenceParameter(L"contentSize", contentSizePropertySet);
1253
+ endResting.SetReferenceParameter(L"visualSize", visualSizePropertySet);
1254
+
1255
+ endRestingValue.Condition(endCondition);
1256
+ endRestingValue.RestingValue(endResting);
1257
+
1258
+ restingValues.push_back(endRestingValue);
1259
+ }
1260
+
1261
+ if (!restingValues.empty()) {
1262
+ auto modifiers = winrt::single_threaded_vector<typename TTypeRedirects::InteractionTrackerInertiaModifier>();
1263
+ for (auto &v : restingValues) {
1264
+ auto modifier = v.as<typename TTypeRedirects::InteractionTrackerInertiaModifier>();
1265
+ if (modifier) {
1266
+ modifiers.Append(modifier);
1267
+ }
1268
+ }
1269
+
1270
+ if (m_horizontal) {
1271
+ m_interactionTracker.ConfigurePositionXInertiaModifiers(modifiers);
1272
+ } else {
1273
+ m_interactionTracker.ConfigurePositionYInertiaModifiers(modifiers);
1274
+ }
1275
+ } else {
1276
+ // Clear inertia modifiers when no snapping is configured
1277
+ if (m_horizontal) {
1278
+ m_interactionTracker.ConfigurePositionXInertiaModifiers({});
1279
+ } else {
1280
+ m_interactionTracker.ConfigurePositionYInertiaModifiers({});
1281
+ }
1282
+ }
1283
+ }
1284
+
1053
1285
  bool m_isScrollEnabled{true};
1054
1286
  bool m_horizontal{false};
1287
+ bool m_snapToStart{true};
1288
+ bool m_snapToEnd{true};
1289
+ std::vector<float> m_snapToOffsets;
1055
1290
  bool m_inertia{false};
1056
1291
  bool m_custom{false};
1292
+ bool m_interacting{false};
1057
1293
  winrt::Windows::Foundation::Numerics::float3 m_targetPosition;
1058
1294
  winrt::Windows::Foundation::Numerics::float3 m_currentPosition;
1059
1295
  winrt::Windows::Foundation::Numerics::float2 m_contentSize{0};
@@ -1067,6 +1303,12 @@ struct CompScrollerVisual : winrt::implements<
1067
1303
  winrt::event<winrt::Windows::Foundation::EventHandler<
1068
1304
  winrt::Microsoft::ReactNative::Composition::Experimental::IScrollPositionChangedArgs>>
1069
1305
  m_scrollEndDragEvent;
1306
+ winrt::event<winrt::Windows::Foundation::EventHandler<
1307
+ winrt::Microsoft::ReactNative::Composition::Experimental::IScrollPositionChangedArgs>>
1308
+ m_scrollMomentumBeginEvent;
1309
+ winrt::event<winrt::Windows::Foundation::EventHandler<
1310
+ winrt::Microsoft::ReactNative::Composition::Experimental::IScrollPositionChangedArgs>>
1311
+ m_scrollMomentumEndEvent;
1070
1312
  typename TTypeRedirects::SpriteVisual m_visual{nullptr};
1071
1313
  typename TTypeRedirects::SpriteVisual m_contentVisual{nullptr};
1072
1314
  typename TTypeRedirects::InteractionTracker m_interactionTracker{nullptr};
@@ -14,6 +14,21 @@
14
14
 
15
15
  namespace winrt::Microsoft::ReactNative::implementation {
16
16
 
17
+ // Helper function to check if any parent has NoHideDescendants
18
+ bool IsHiddenByParent(const winrt::Microsoft::ReactNative::ComponentView &view) {
19
+ auto parent = view.Parent();
20
+ while (parent) {
21
+ auto parentProps = std::static_pointer_cast<const facebook::react::ViewProps>(
22
+ winrt::get_self<winrt::Microsoft::ReactNative::implementation::ComponentView>(parent)->props());
23
+ if (parentProps &&
24
+ parentProps->importantForAccessibility == facebook::react::ImportantForAccessibility::NoHideDescendants) {
25
+ return true;
26
+ }
27
+ parent = parent.Parent();
28
+ }
29
+ return false;
30
+ }
31
+
17
32
  CompositionDynamicAutomationProvider::CompositionDynamicAutomationProvider(
18
33
  const winrt::Microsoft::ReactNative::Composition::ComponentView &componentView) noexcept
19
34
  : m_view{componentView} {
@@ -298,161 +313,6 @@ HRESULT __stdcall CompositionDynamicAutomationProvider::GetPatternProvider(PATTE
298
313
  return S_OK;
299
314
  }
300
315
 
301
- long GetControlTypeFromString(const std::string &role) noexcept {
302
- if (role == "adjustable") {
303
- return UIA_SliderControlTypeId;
304
- } else if (role == "group" || role == "search" || role == "radiogroup" || role == "timer" || role.empty()) {
305
- return UIA_GroupControlTypeId;
306
- } else if (role == "button" || role == "imagebutton" || role == "switch" || role == "togglebutton") {
307
- return UIA_ButtonControlTypeId;
308
- } else if (role == "checkbox") {
309
- return UIA_CheckBoxControlTypeId;
310
- } else if (role == "combobox") {
311
- return UIA_ComboBoxControlTypeId;
312
- } else if (role == "alert" || role == "header" || role == "summary" || role == "text") {
313
- return UIA_TextControlTypeId;
314
- } else if (role == "image") {
315
- return UIA_ImageControlTypeId;
316
- } else if (role == "keyboardkey") {
317
- return UIA_CustomControlTypeId;
318
- } else if (role == "link") {
319
- return UIA_HyperlinkControlTypeId;
320
- }
321
- // list and listitem were added by RNW to better support UIA Control Types
322
- else if (role == "list") {
323
- return UIA_ListControlTypeId;
324
- } else if (role == "listitem") {
325
- return UIA_ListItemControlTypeId;
326
- } else if (role == "menu") {
327
- return UIA_MenuControlTypeId;
328
- } else if (role == "menubar") {
329
- return UIA_MenuBarControlTypeId;
330
- } else if (role == "menuitem") {
331
- return UIA_MenuItemControlTypeId;
332
- }
333
- // If role is "none", remove the element from the control tree
334
- // and expose it as a plain element would in the raw tree.
335
- else if (role == "none") {
336
- return UIA_GroupControlTypeId;
337
- } else if (role == "progressbar") {
338
- return UIA_ProgressBarControlTypeId;
339
- } else if (role == "radio") {
340
- return UIA_RadioButtonControlTypeId;
341
- } else if (role == "scrollbar") {
342
- return UIA_ScrollBarControlTypeId;
343
- } else if (role == "spinbutton") {
344
- return UIA_SpinnerControlTypeId;
345
- } else if (role == "splitbutton") {
346
- return UIA_SplitButtonControlTypeId;
347
- } else if (role == "tab") {
348
- return UIA_TabItemControlTypeId;
349
- } else if (role == "tablist") {
350
- return UIA_TabControlTypeId;
351
- } else if (role == "textinput" || role == "searchbox") {
352
- return UIA_EditControlTypeId;
353
- } else if (role == "toolbar") {
354
- return UIA_ToolBarControlTypeId;
355
- } else if (role == "tree") {
356
- return UIA_TreeControlTypeId;
357
- } else if (role == "treeitem") {
358
- return UIA_TreeItemControlTypeId;
359
- } else if (role == "pane") {
360
- return UIA_PaneControlTypeId;
361
- }
362
- assert(false);
363
- return UIA_GroupControlTypeId;
364
- }
365
-
366
- long GetControlTypeFromRole(const facebook::react::Role &role) noexcept {
367
- switch (role) {
368
- case facebook::react::Role::Alert:
369
- return UIA_TextControlTypeId;
370
- case facebook::react::Role::Application:
371
- return UIA_WindowControlTypeId;
372
- case facebook::react::Role::Button:
373
- return UIA_ButtonControlTypeId;
374
- case facebook::react::Role::Checkbox:
375
- return UIA_CheckBoxControlTypeId;
376
- case facebook::react::Role::Columnheader:
377
- return UIA_HeaderControlTypeId;
378
- case facebook::react::Role::Combobox:
379
- return UIA_ComboBoxControlTypeId;
380
- case facebook::react::Role::Document:
381
- return UIA_DocumentControlTypeId;
382
- case facebook::react::Role::Grid:
383
- return UIA_GroupControlTypeId;
384
- case facebook::react::Role::Group:
385
- return UIA_GroupControlTypeId;
386
- case facebook::react::Role::Heading:
387
- return UIA_TextControlTypeId;
388
- case facebook::react::Role::Img:
389
- return UIA_ImageControlTypeId;
390
- case facebook::react::Role::Link:
391
- return UIA_HyperlinkControlTypeId;
392
- case facebook::react::Role::List:
393
- return UIA_ListControlTypeId;
394
- case facebook::react::Role::Listitem:
395
- return UIA_ListItemControlTypeId;
396
- case facebook::react::Role::Menu:
397
- return UIA_MenuControlTypeId;
398
- case facebook::react::Role::Menubar:
399
- return UIA_MenuBarControlTypeId;
400
- case facebook::react::Role::Menuitem:
401
- return UIA_MenuItemControlTypeId;
402
- case facebook::react::Role::None:
403
- return UIA_GroupControlTypeId;
404
- case facebook::react::Role::Presentation:
405
- return UIA_GroupControlTypeId;
406
- case facebook::react::Role::Progressbar:
407
- return UIA_ProgressBarControlTypeId;
408
- case facebook::react::Role::Radio:
409
- return UIA_RadioButtonControlTypeId;
410
- case facebook::react::Role::Radiogroup:
411
- return UIA_GroupControlTypeId;
412
- case facebook::react::Role::Rowgroup:
413
- return UIA_GroupControlTypeId;
414
- case facebook::react::Role::Rowheader:
415
- return UIA_HeaderControlTypeId;
416
- case facebook::react::Role::Scrollbar:
417
- return UIA_ScrollBarControlTypeId;
418
- case facebook::react::Role::Searchbox:
419
- return UIA_EditControlTypeId;
420
- case facebook::react::Role::Separator:
421
- return UIA_SeparatorControlTypeId;
422
- case facebook::react::Role::Slider:
423
- return UIA_SliderControlTypeId;
424
- case facebook::react::Role::Spinbutton:
425
- return UIA_SpinnerControlTypeId;
426
- case facebook::react::Role::Status:
427
- return UIA_StatusBarControlTypeId;
428
- case facebook::react::Role::Summary:
429
- return UIA_GroupControlTypeId;
430
- case facebook::react::Role::Switch:
431
- return UIA_ButtonControlTypeId;
432
- case facebook::react::Role::Tab:
433
- return UIA_TabItemControlTypeId;
434
- case facebook::react::Role::Table:
435
- return UIA_TableControlTypeId;
436
- case facebook::react::Role::Tablist:
437
- return UIA_TabControlTypeId;
438
- case facebook::react::Role::Tabpanel:
439
- return UIA_TabControlTypeId;
440
- case facebook::react::Role::Timer:
441
- return UIA_ButtonControlTypeId;
442
- case facebook::react::Role::Toolbar:
443
- return UIA_ToolBarControlTypeId;
444
- case facebook::react::Role::Tooltip:
445
- return UIA_ToolTipControlTypeId;
446
- case facebook::react::Role::Tree:
447
- return UIA_TreeControlTypeId;
448
- case facebook::react::Role::Treegrid:
449
- return UIA_TreeControlTypeId;
450
- case facebook::react::Role::Treeitem:
451
- return UIA_TreeItemControlTypeId;
452
- }
453
- return UIA_GroupControlTypeId;
454
- }
455
-
456
316
  HRESULT __stdcall CompositionDynamicAutomationProvider::GetPropertyValue(PROPERTYID propertyId, VARIANT *pRetVal) {
457
317
  if (pRetVal == nullptr)
458
318
  return E_POINTER;
@@ -521,23 +381,43 @@ HRESULT __stdcall CompositionDynamicAutomationProvider::GetPropertyValue(PROPERT
521
381
  }
522
382
  case UIA_IsContentElementPropertyId: {
523
383
  pRetVal->vt = VT_BOOL;
524
- pRetVal->boolVal =
525
- (props->accessible && (props->accessibilityRole != "none" || props->role != facebook::react::Role::None))
384
+ // Check if this element or any parent has NoHideDescendants
385
+ bool isHidden =
386
+ props->importantForAccessibility == facebook::react::ImportantForAccessibility::NoHideDescendants ||
387
+ IsHiddenByParent(strongView);
388
+ pRetVal->boolVal = (!isHidden && props->accessible &&
389
+ (props->accessibilityRole != "none" || props->role != facebook::react::Role::None))
526
390
  ? VARIANT_TRUE
527
391
  : VARIANT_FALSE;
528
392
  break;
529
393
  }
394
+
530
395
  case UIA_IsControlElementPropertyId: {
531
396
  pRetVal->vt = VT_BOOL;
532
- pRetVal->boolVal =
533
- (props->accessible && (props->accessibilityRole != "none" || props->role != facebook::react::Role::None))
397
+ // Check if this element or any parent has NoHideDescendants
398
+ bool isHidden =
399
+ props->importantForAccessibility == facebook::react::ImportantForAccessibility::NoHideDescendants ||
400
+ IsHiddenByParent(strongView);
401
+ pRetVal->boolVal = (!isHidden && props->accessible &&
402
+ (props->accessibilityRole != "none" || props->role != facebook::react::Role::None))
534
403
  ? VARIANT_TRUE
535
404
  : VARIANT_FALSE;
536
405
  break;
537
406
  }
538
407
  case UIA_IsOffscreenPropertyId: {
539
408
  pRetVal->vt = VT_BOOL;
540
- pRetVal->boolVal = (compositionView->getClipState() == ClipState::FullyClipped) ? VARIANT_TRUE : VARIANT_FALSE;
409
+
410
+ // Check if element is offscreen - consider modal content special case
411
+ bool isOffscreen = (compositionView->getClipState() == ClipState::FullyClipped);
412
+
413
+ // Modal content may appear clipped but is visible in its own window
414
+ if (isOffscreen) {
415
+ if (const auto hwnd = compositionView->GetHwndForParenting()) {
416
+ isOffscreen = !(IsWindowVisible(hwnd) && !IsIconic(hwnd));
417
+ }
418
+ }
419
+
420
+ pRetVal->boolVal = isOffscreen ? VARIANT_TRUE : VARIANT_FALSE;
541
421
  break;
542
422
  }
543
423
  case UIA_HelpTextPropertyId: {
@@ -588,6 +468,17 @@ HRESULT __stdcall CompositionDynamicAutomationProvider::GetPropertyValue(PROPERT
588
468
  pRetVal->bstrVal = SysAllocString(itemtype.c_str());
589
469
  break;
590
470
  }
471
+ case UIA_FullDescriptionPropertyId: {
472
+ pRetVal->vt = VT_BSTR;
473
+ auto desc = ::Microsoft::Common::Unicode::Utf8ToUtf16(props->accessibilityDescription.value_or(""));
474
+ pRetVal->bstrVal = SysAllocString(desc.c_str());
475
+ break;
476
+ }
477
+ case UIA_HeadingLevelPropertyId: {
478
+ pRetVal->vt = VT_I4;
479
+ pRetVal->lVal = GetHeadingLevel(props->accessibilityLevel, props->accessibilityRole, props->role);
480
+ break;
481
+ }
591
482
  }
592
483
  return hr;
593
484
  }
@@ -979,7 +870,9 @@ HRESULT __stdcall CompositionDynamicAutomationProvider::Expand() {
979
870
 
980
871
  if (!strongView)
981
872
  return UIA_E_ELEMENTNOTAVAILABLE;
873
+
982
874
  DispatchAccessibilityAction(m_view, "expand");
875
+
983
876
  return S_OK;
984
877
  }
985
878
 
@@ -988,7 +881,9 @@ HRESULT __stdcall CompositionDynamicAutomationProvider::Collapse() {
988
881
 
989
882
  if (!strongView)
990
883
  return UIA_E_ELEMENTNOTAVAILABLE;
884
+
991
885
  DispatchAccessibilityAction(m_view, "collapse");
886
+
992
887
  return S_OK;
993
888
  }
994
889