@office-iss/react-native-win32 0.76.1 → 0.77.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 (248) hide show
  1. package/.eslintignore +1 -1
  2. package/.flowconfig +5 -1
  3. package/CHANGELOG.json +172 -46
  4. package/CHANGELOG.md +78 -24
  5. package/Libraries/ActionSheetIOS/ActionSheetIOS.d.ts +1 -0
  6. package/Libraries/ActionSheetIOS/ActionSheetIOS.js +13 -0
  7. package/Libraries/Animated/AnimatedEvent.js +1 -1
  8. package/Libraries/Animated/AnimatedImplementation.js +2 -2
  9. package/Libraries/Animated/NativeAnimatedAllowlist.js +20 -9
  10. package/Libraries/Animated/animations/Animation.js +60 -25
  11. package/Libraries/Animated/animations/DecayAnimation.js +26 -38
  12. package/Libraries/Animated/animations/SpringAnimation.js +33 -39
  13. package/Libraries/Animated/animations/TimingAnimation.js +34 -42
  14. package/Libraries/Animated/components/AnimatedFlatList.js +1 -1
  15. package/Libraries/Animated/components/AnimatedSectionList.js +3 -1
  16. package/Libraries/Animated/createAnimatedComponent.js +60 -33
  17. package/Libraries/Animated/nodes/AnimatedColor.js +1 -1
  18. package/Libraries/Animated/nodes/AnimatedInterpolation.js +1 -1
  19. package/Libraries/Animated/nodes/AnimatedNode.js +39 -45
  20. package/Libraries/Animated/nodes/AnimatedObject.js +13 -3
  21. package/Libraries/Animated/nodes/AnimatedProps.js +96 -46
  22. package/Libraries/Animated/nodes/AnimatedStyle.js +108 -39
  23. package/Libraries/Animated/nodes/AnimatedTransform.js +56 -23
  24. package/Libraries/Animated/nodes/AnimatedValue.js +1 -1
  25. package/Libraries/Animated/nodes/AnimatedWithChildren.js +1 -3
  26. package/Libraries/Animated/useAnimatedProps.js +41 -35
  27. package/Libraries/Components/AccessibilityInfo/AccessibilityInfo.d.ts +19 -3
  28. package/Libraries/Components/AccessibilityInfo/AccessibilityInfo.js +77 -5
  29. package/Libraries/Components/AccessibilityInfo/AccessibilityInfo.win32.js +82 -5
  30. package/Libraries/Components/ActivityIndicator/ActivityIndicator.js +4 -4
  31. package/Libraries/Components/Button.js +9 -4
  32. package/Libraries/Components/Button.win32.js +12 -4
  33. package/Libraries/Components/DrawerAndroid/DrawerLayoutAndroid.js +3 -1
  34. package/Libraries/Components/Keyboard/KeyboardAvoidingView.js +7 -0
  35. package/Libraries/Components/Pressable/Pressable.js +4 -4
  36. package/Libraries/Components/Pressable/Pressable.win32.js +4 -4
  37. package/Libraries/Components/ProgressBarAndroid/ProgressBarAndroid.android.js +13 -7
  38. package/Libraries/Components/RefreshControl/__mocks__/RefreshControlMock.js +3 -2
  39. package/Libraries/Components/SafeAreaView/SafeAreaView.js +4 -4
  40. package/Libraries/Components/SafeAreaView/SafeAreaView.win32.js +4 -4
  41. package/Libraries/Components/ScrollView/AndroidHorizontalScrollViewNativeComponent.js +0 -1
  42. package/Libraries/Components/ScrollView/ScrollView.js +49 -88
  43. package/Libraries/Components/ScrollView/ScrollViewCommands.js +1 -1
  44. package/Libraries/Components/ScrollView/ScrollViewContext.js +2 -0
  45. package/Libraries/Components/ScrollView/ScrollViewNativeComponent.js +0 -2
  46. package/Libraries/Components/ScrollView/ScrollViewStickyHeader.js +8 -9
  47. package/Libraries/Components/Switch/Switch.js +8 -6
  48. package/Libraries/Components/TextInput/InputAccessoryView.js +1 -1
  49. package/Libraries/Components/TextInput/RCTMultilineTextInputNativeComponent.js +4 -4
  50. package/Libraries/Components/TextInput/RCTSingelineTextInputNativeComponent.js +6 -4
  51. package/Libraries/Components/TextInput/RCTTextInputViewConfig.js +2 -1
  52. package/Libraries/Components/TextInput/TextInput.d.ts +27 -4
  53. package/Libraries/Components/TextInput/TextInput.flow.js +36 -19
  54. package/Libraries/Components/TextInput/TextInput.js +37 -13
  55. package/Libraries/Components/TextInput/TextInput.win32.js +40 -15
  56. package/Libraries/Components/TextInput/TextInputState.js +11 -13
  57. package/Libraries/Components/TextInput/TextInputState.win32.js +13 -16
  58. package/Libraries/Components/TextInput/Win32TextInputNativeComponent.js +3 -0
  59. package/Libraries/Components/Touchable/BoundingDimensions.js +11 -3
  60. package/Libraries/Components/Touchable/Position.js +7 -2
  61. package/Libraries/Components/Touchable/Touchable.js +4 -0
  62. package/Libraries/Components/Touchable/Touchable.win32.js +4 -0
  63. package/Libraries/Components/Touchable/TouchableBounce.js +6 -2
  64. package/Libraries/Components/Touchable/TouchableHighlight.js +5 -5
  65. package/Libraries/Components/Touchable/TouchableOpacity.js +6 -5
  66. package/Libraries/Components/Touchable/TouchableWithoutFeedback.js +1 -2
  67. package/Libraries/Components/View/ReactNativeStyleAttributes.js +6 -1
  68. package/Libraries/Components/View/View.js +4 -4
  69. package/Libraries/Components/View/View.win32.js +4 -4
  70. package/Libraries/Components/View/ViewNativeComponent.js +6 -98
  71. package/Libraries/Components/View/ViewPropTypes.d.ts +7 -0
  72. package/Libraries/Components/View/ViewPropTypes.js +0 -3
  73. package/Libraries/Components/View/ViewPropTypes.win32.js +0 -3
  74. package/Libraries/Components/View/ViewWin32.js +1 -0
  75. package/Libraries/Core/ExceptionsManager.js +50 -29
  76. package/Libraries/Core/ReactNativeVersion.js +3 -3
  77. package/Libraries/Core/__mocks__/NativeExceptionsManager.js +0 -1
  78. package/Libraries/Core/setUpBatchedBridge.js +1 -10
  79. package/Libraries/Core/setUpDeveloperTools.js +1 -5
  80. package/Libraries/Core/setUpErrorHandling.js +20 -18
  81. package/Libraries/Core/setUpReactDevTools.js +107 -8
  82. package/Libraries/Core/setUpSegmentFetcher.js +1 -0
  83. package/Libraries/Core/setUpTimers.js +21 -18
  84. package/Libraries/Debugging/DebuggingOverlay.js +4 -5
  85. package/Libraries/Image/AssetSourceResolver.js +12 -1
  86. package/Libraries/Image/Image.android.js +1 -5
  87. package/Libraries/Image/Image.d.ts +20 -29
  88. package/Libraries/Image/Image.ios.js +0 -2
  89. package/Libraries/Image/Image.win32.js +0 -2
  90. package/Libraries/Image/ImageBackground.js +2 -5
  91. package/Libraries/Image/ImageProps.js +7 -6
  92. package/Libraries/Image/ImageResizeMode.d.ts +8 -1
  93. package/Libraries/Image/ImageResizeMode.js +4 -1
  94. package/Libraries/Image/ImageSource.d.ts +0 -2
  95. package/Libraries/Image/ImageSource.js +0 -2
  96. package/Libraries/Image/ImageTypes.flow.js +11 -9
  97. package/Libraries/Image/ImageUtils.js +6 -3
  98. package/Libraries/Image/ImageViewNativeComponent.js +5 -3
  99. package/Libraries/Inspector/Inspector.js +1 -0
  100. package/Libraries/Inspector/Inspector.win32.js +2 -1
  101. package/Libraries/Inspector/NetworkOverlay.js +4 -0
  102. package/Libraries/Inspector/ReactDevToolsOverlay.js +8 -14
  103. package/Libraries/Inspector/getInspectorDataForViewAtPoint.js +3 -5
  104. package/Libraries/Interaction/InteractionManager.js +6 -1
  105. package/Libraries/Interaction/InteractionManagerStub.js +176 -0
  106. package/Libraries/Interaction/TouchHistoryMath.js +22 -19
  107. package/Libraries/JSInspector/NetworkAgent.js +1 -1
  108. package/Libraries/Lists/FlatList.d.ts +1 -2
  109. package/Libraries/Lists/FlatList.js +2 -2
  110. package/Libraries/Lists/SectionListModern.js +7 -7
  111. package/Libraries/Lists/__flowtests__/FlatList-flowtest.js +2 -2
  112. package/Libraries/Lists/__flowtests__/SectionList-flowtest.js +1 -1
  113. package/Libraries/LogBox/Data/LogBoxData.js +3 -3
  114. package/Libraries/LogBox/LogBox.js +18 -5
  115. package/Libraries/LogBox/LogBoxInspectorContainer.js +1 -1
  116. package/Libraries/LogBox/LogBoxNotificationContainer.js +2 -2
  117. package/Libraries/LogBox/UI/AnsiHighlight.js +26 -17
  118. package/Libraries/LogBox/UI/LogBoxInspectorCodeFrame.js +6 -1
  119. package/Libraries/LogBox/UI/LogBoxInspectorCodeFrame.win32.js +6 -1
  120. package/Libraries/LogBox/UI/LogBoxInspectorHeader.js +1 -1
  121. package/Libraries/LogBox/UI/LogBoxInspectorHeader.win32.js +1 -1
  122. package/Libraries/LogBox/UI/LogBoxInspectorStackFrames.js +1 -1
  123. package/Libraries/LogBox/UI/LogBoxMessage.js +2 -2
  124. package/Libraries/Modal/Modal.d.ts +12 -0
  125. package/Libraries/Modal/Modal.js +31 -4
  126. package/Libraries/NativeComponent/BaseViewConfig.android.js +72 -1
  127. package/Libraries/NativeComponent/BaseViewConfig.ios.js +2 -1
  128. package/Libraries/NativeComponent/BaseViewConfig.win32.js +3 -11
  129. package/Libraries/NativeComponent/NativeComponentRegistry.js +3 -3
  130. package/Libraries/NativeComponent/StaticViewConfigValidator.js +0 -1
  131. package/Libraries/Network/XHRInterceptor.js +63 -14
  132. package/Libraries/Network/XMLHttpRequest.js +26 -1
  133. package/Libraries/NewAppScreen/components/HermesBadge.js +1 -1
  134. package/Libraries/PermissionsAndroid/PermissionsAndroid.d.ts +49 -2
  135. package/Libraries/PermissionsAndroid/PermissionsAndroid.js +4 -4
  136. package/Libraries/Pressability/HoverState.js +2 -0
  137. package/Libraries/Pressability/HoverState.win32.js +2 -0
  138. package/Libraries/Pressability/Pressability.js +2 -3
  139. package/Libraries/Pressability/Pressability.win32.js +2 -3
  140. package/Libraries/Pressability/usePressability.js +4 -1
  141. package/Libraries/ReactNative/AppContainer.js +1 -1
  142. package/Libraries/ReactNative/AppRegistry.js +1 -11
  143. package/Libraries/ReactNative/DisplayMode.js +1 -1
  144. package/Libraries/ReactNative/ReactFabricPublicInstance/ReactFabricHostComponent.js +2 -3
  145. package/Libraries/ReactNative/RendererImplementation.js +18 -17
  146. package/Libraries/ReactNative/getCachedComponentWithDebugName.js +1 -3
  147. package/Libraries/ReactNative/renderApplication.js +9 -8
  148. package/Libraries/ReactNative/requireNativeComponent.js +5 -2
  149. package/Libraries/Renderer/shims/ReactFabric.js +3 -3
  150. package/Libraries/Renderer/shims/ReactFeatureFlags.js +2 -2
  151. package/Libraries/Renderer/shims/ReactNative.js +3 -3
  152. package/Libraries/Renderer/shims/ReactNativeTypes.js +22 -35
  153. package/Libraries/Renderer/shims/ReactNativeViewConfigRegistry.js +5 -6
  154. package/Libraries/Renderer/shims/createReactNativeComponentClass.js +2 -2
  155. package/Libraries/StyleSheet/StyleSheet.js +7 -1
  156. package/Libraries/StyleSheet/StyleSheet.win32.js +7 -1
  157. package/Libraries/StyleSheet/StyleSheetTypes.d.ts +13 -2
  158. package/Libraries/StyleSheet/StyleSheetTypes.js +24 -6
  159. package/Libraries/StyleSheet/processBackgroundImage.js +87 -110
  160. package/Libraries/StyleSheet/processTransform.js +3 -34
  161. package/Libraries/Text/Text.js +248 -249
  162. package/Libraries/Text/Text.win32.js +282 -295
  163. package/Libraries/Text/TextNativeComponent.js +0 -1
  164. package/Libraries/TurboModule/TurboModuleRegistry.js +5 -5
  165. package/Libraries/Types/CoreEventTypes.d.ts +3 -10
  166. package/Libraries/Types/CoreEventTypes.js +4 -6
  167. package/Libraries/Types/CoreEventTypes.win32.js +4 -6
  168. package/Libraries/Utilities/Appearance.js +3 -1
  169. package/Libraries/Utilities/BackHandler.android.js +6 -18
  170. package/Libraries/Utilities/BackHandler.d.ts +0 -4
  171. package/Libraries/Utilities/BackHandler.ios.js +0 -7
  172. package/Libraries/Utilities/BackHandler.win32.js +6 -18
  173. package/Libraries/Utilities/FocusManager.win32.js +1 -1
  174. package/Libraries/Utilities/HMRClient.js +3 -4
  175. package/Libraries/Utilities/Platform.flow.js +2 -2
  176. package/Libraries/Utilities/Platform.flow.win32.js +3 -2
  177. package/Libraries/Utilities/__mocks__/BackHandler.js +3 -8
  178. package/Libraries/Utilities/codegenNativeComponent.js +1 -1
  179. package/Libraries/Utilities/useMergeRefs.js +26 -7
  180. package/Libraries/WebSocket/WebSocketEvent.js +4 -1
  181. package/Libraries/WebSocket/WebSocketInterceptor.js +31 -13
  182. package/Libraries/__flowtests__/ReactNativeTypes-flowtest.js +6 -5
  183. package/Libraries/promiseRejectionTrackingOptions.js +1 -1
  184. package/index.js +10 -3
  185. package/index.win32.js +10 -3
  186. package/jest/setup.js +36 -1
  187. package/overrides.json +37 -37
  188. package/package.json +20 -20
  189. package/src/private/animated/NativeAnimatedHelper.js +18 -16
  190. package/src/private/animated/NativeAnimatedHelper.win32.js +18 -15
  191. package/src/private/animated/useAnimatedPropsMemo.js +348 -0
  192. package/src/private/components/HScrollViewNativeComponents.js +1 -27
  193. package/src/private/components/SafeAreaView_INTERNAL_DO_NOT_USE.js +11 -8
  194. package/src/private/components/VScrollViewNativeComponents.js +2 -25
  195. package/src/private/debugging/ReactDevToolsSettingsManager.android.js +20 -0
  196. package/src/private/debugging/ReactDevToolsSettingsManager.ios.js +30 -0
  197. package/src/private/debugging/ReactDevToolsSettingsManager.win32.js +20 -0
  198. package/src/private/{fusebox → debugging}/setUpFuseboxReactDevToolsDispatcher.js +6 -0
  199. package/src/private/devmenu/DevMenu.d.ts +20 -0
  200. package/src/private/devmenu/DevMenu.js +31 -0
  201. package/src/private/featureflags/ReactNativeFeatureFlags.js +95 -86
  202. package/src/private/featureflags/ReactNativeFeatureFlagsBase.js +8 -2
  203. package/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js +17 -19
  204. package/src/private/fusebox/specs/NativeReactDevToolsRuntimeSettingsModule.js +34 -0
  205. package/src/private/setup/setUpDOM.js +14 -6
  206. package/src/private/setup/setUpMutationObserver.js +5 -0
  207. package/src/private/specs/components/AndroidHorizontalScrollContentViewNativeComponent.js +1 -0
  208. package/src/private/specs/components/RCTModalHostViewNativeComponent.js +8 -0
  209. package/src/private/specs/modules/NativeAccessibilityInfo.js +9 -0
  210. package/src/private/specs/modules/NativeAccessibilityInfoWin32.js +9 -0
  211. package/src/private/specs/modules/NativeAccessibilityManager.js +4 -0
  212. package/src/private/specs/modules/NativeActionSheetManager.js +2 -0
  213. package/src/private/specs/modules/NativeAppearance.js +4 -10
  214. package/src/private/specs/modules/NativeExceptionsManager.js +0 -12
  215. package/src/private/specs/modules/{NativeDevToolsSettingsManager.js → NativeReactDevToolsSettingsManager.js} +3 -5
  216. package/src/private/webapis/dom/geometry/DOMRect.js +2 -2
  217. package/src/private/webapis/dom/geometry/DOMRectReadOnly.js +2 -2
  218. package/src/private/webapis/dom/nodes/ReactNativeElement.js +2 -3
  219. package/src/private/webapis/intersectionobserver/IntersectionObserver.js +102 -11
  220. package/src/private/webapis/intersectionobserver/IntersectionObserverEntry.js +26 -0
  221. package/src/private/webapis/intersectionobserver/IntersectionObserverManager.js +1 -0
  222. package/src/private/webapis/intersectionobserver/specs/NativeIntersectionObserver.js +1 -0
  223. package/src/private/webapis/intersectionobserver/specs/__mocks__/NativeIntersectionObserver.js +9 -0
  224. package/src/private/webapis/performance/EventTiming.js +13 -8
  225. package/src/private/webapis/performance/Performance.js +66 -73
  226. package/src/private/webapis/performance/PerformanceEntry.js +2 -5
  227. package/src/private/webapis/performance/PerformanceObserver.js +65 -164
  228. package/src/private/webapis/performance/RawPerformanceEntry.js +1 -1
  229. package/src/private/webapis/performance/UserTiming.js +11 -7
  230. package/src/private/webapis/performance/Utilities.js +18 -0
  231. package/src/private/webapis/performance/specs/NativePerformance.js +71 -2
  232. package/src/private/webapis/performance/specs/__mocks__/NativePerformanceMock.js +267 -0
  233. package/src-win/Libraries/Components/AccessibilityInfo/AccessibilityInfo.d.ts +19 -3
  234. package/src-win/Libraries/Components/View/ViewPropTypes.d.ts +7 -0
  235. package/types/index.d.ts +1 -1
  236. package/types/public/ReactNativeTypes.d.ts +4 -8
  237. package/Libraries/DevToolsSettings/DevToolsSettingsManager.android.js +0 -35
  238. package/Libraries/DevToolsSettings/DevToolsSettingsManager.d.ts +0 -20
  239. package/Libraries/DevToolsSettings/DevToolsSettingsManager.ios.js +0 -49
  240. package/Libraries/DevToolsSettings/DevToolsSettingsManager.win32.js +0 -35
  241. package/Libraries/DevToolsSettings/NativeDevToolsSettingsManager.js +0 -13
  242. package/Libraries/ReactNative/ReactFabricInternals.js +0 -17
  243. package/src/private/components/useSyncOnScroll.js +0 -48
  244. package/src/private/webapis/performance/specs/NativePerformanceObserver.js +0 -61
  245. package/src/private/webapis/performance/specs/__mocks__/NativePerformance.js +0 -67
  246. package/src/private/webapis/performance/specs/__mocks__/NativePerformanceObserver.js +0 -127
  247. package/types/experimental.d.ts +0 -59
  248. /package/src/private/{fusebox → debugging}/FuseboxSessionObserver.js +0 -0
@@ -55,7 +55,8 @@ export interface FlexStyle {
55
55
  borderTopWidth?: number | undefined;
56
56
  borderWidth?: number | undefined;
57
57
  bottom?: DimensionValue | undefined;
58
- display?: 'none' | 'flex' | undefined;
58
+ boxSizing?: 'border-box' | 'content-box' | undefined;
59
+ display?: 'none' | 'flex' | 'contents' | undefined;
59
60
  end?: DimensionValue | undefined;
60
61
  flex?: number | undefined;
61
62
  flexBasis?: DimensionValue | undefined;
@@ -411,6 +412,10 @@ export interface ViewStyle extends FlexStyle, ShadowStyleIOS, TransformsStyle {
411
412
  borderTopLeftRadius?: AnimatableNumericValue | string | undefined;
412
413
  borderTopRightRadius?: AnimatableNumericValue | string | undefined;
413
414
  borderTopStartRadius?: AnimatableNumericValue | string | undefined;
415
+ outlineColor?: ColorValue | undefined;
416
+ outlineOffset?: AnimatableNumericValue | undefined;
417
+ outlineStyle?: 'solid' | 'dotted' | 'dashed' | undefined;
418
+ outlineWidth?: AnimatableNumericValue | undefined;
414
419
  opacity?: AnimatableNumericValue | undefined;
415
420
  /**
416
421
  * Sets the elevation of a view, using Android's underlying
@@ -429,6 +434,12 @@ export interface ViewStyle extends FlexStyle, ShadowStyleIOS, TransformsStyle {
429
434
  cursor?: CursorValue | undefined;
430
435
  boxShadow?: ReadonlyArray<BoxShadowValue> | string | undefined;
431
436
  filter?: ReadonlyArray<FilterFunction> | string | undefined;
437
+
438
+ mixBlendMode?: BlendMode | undefined;
439
+ experimental_backgroundImage?:
440
+ | ReadonlyArray<GradientValue>
441
+ | string
442
+ | undefined;
432
443
  }
433
444
 
434
445
  export type FontVariant =
@@ -557,6 +568,6 @@ export interface ImageStyle extends FlexStyle, ShadowStyleIOS, TransformsStyle {
557
568
  overlayColor?: ColorValue | undefined;
558
569
  tintColor?: ColorValue | undefined;
559
570
  opacity?: AnimatableNumericValue | undefined;
560
- objectFit?: 'cover' | 'contain' | 'fill' | 'scale-down' | undefined;
571
+ objectFit?: 'cover' | 'contain' | 'fill' | 'scale-down' | 'none' | undefined;
561
572
  cursor?: CursorValue | undefined;
562
573
  }
@@ -11,6 +11,7 @@
11
11
  'use strict';
12
12
 
13
13
  import type AnimatedNode from '../Animated/nodes/AnimatedNode';
14
+ import type {ImageResizeMode} from './../Image/ImageResizeMode';
14
15
  import type {
15
16
  ____DangerouslyImpreciseStyle_InternalOverrides,
16
17
  ____ImageStyle_InternalOverrides,
@@ -58,7 +59,7 @@ type ____LayoutStyle_Internal = $ReadOnly<{
58
59
  * It works similarly to `display` in CSS, but only support 'flex' and 'none'.
59
60
  * 'flex' is the default.
60
61
  */
61
- display?: 'none' | 'flex',
62
+ display?: 'none' | 'flex' | 'contents',
62
63
 
63
64
  /** `width` sets the width of this component.
64
65
  *
@@ -612,6 +613,19 @@ type ____LayoutStyle_Internal = $ReadOnly<{
612
613
  */
613
614
  aspectRatio?: number | string,
614
615
 
616
+ /**
617
+ * Box sizing controls whether certain size properties apply to the node's
618
+ * content box or border box. The size properties in question include `width`,
619
+ * `height`, `minWidth`, `minHeight`, `maxWidth`, `maxHeight`, and `flexBasis`.
620
+ *
621
+ * e.g: Say a node has 10px of padding and 10px of borders on all
622
+ * sides and a defined `width` and `height` of 100px and 50px. Then the total
623
+ * size of the node (content area + padding + border) would be 100px by 50px
624
+ * under `boxSizing: border-box` and 120px by 70px under
625
+ * `boxSizing: content-box`.
626
+ */
627
+ boxSizing?: 'border-box' | 'content-box',
628
+
615
629
  /** `zIndex` controls which components display on top of others.
616
630
  * Normally, you don't use `zIndex`. Components render according to
617
631
  * their order in the document tree, so later components draw over
@@ -785,12 +799,16 @@ export type ____ViewStyle_InternalCore = $ReadOnly<{
785
799
  borderStartWidth?: AnimatableNumericValue,
786
800
  borderTopWidth?: AnimatableNumericValue,
787
801
  opacity?: AnimatableNumericValue,
802
+ outlineColor?: ____ColorValue_Internal,
803
+ outlineOffset?: AnimatableNumericValue,
804
+ outlineStyle?: 'solid' | 'dotted' | 'dashed',
805
+ outlineWidth?: AnimatableNumericValue,
788
806
  elevation?: number,
789
807
  pointerEvents?: 'auto' | 'none' | 'box-none' | 'box-only',
790
808
  cursor?: CursorValue,
791
809
  boxShadow?: $ReadOnlyArray<BoxShadowValue> | string,
792
810
  filter?: $ReadOnlyArray<FilterFunction> | string,
793
- experimental_mixBlendMode?: ____BlendMode_Internal,
811
+ mixBlendMode?: ____BlendMode_Internal,
794
812
  experimental_backgroundImage?: $ReadOnlyArray<GradientValue> | string,
795
813
  isolation?: 'auto' | 'isolate',
796
814
  }>;
@@ -924,8 +942,8 @@ export type ____TextStyle_Internal = $ReadOnly<{
924
942
 
925
943
  export type ____ImageStyle_InternalCore = $ReadOnly<{
926
944
  ...$Exact<____ViewStyle_Internal>,
927
- resizeMode?: 'contain' | 'cover' | 'stretch' | 'center' | 'repeat',
928
- objectFit?: 'cover' | 'contain' | 'fill' | 'scale-down',
945
+ resizeMode?: ImageResizeMode,
946
+ objectFit?: 'cover' | 'contain' | 'fill' | 'scale-down' | 'none',
929
947
  tintColor?: ____ColorValue_Internal,
930
948
  overlayColor?: string,
931
949
  }>;
@@ -937,8 +955,8 @@ export type ____ImageStyle_Internal = $ReadOnly<{
937
955
 
938
956
  export type ____DangerouslyImpreciseStyle_InternalCore = $ReadOnly<{
939
957
  ...$Exact<____TextStyle_Internal>,
940
- resizeMode?: 'contain' | 'cover' | 'stretch' | 'center' | 'repeat',
941
- objectFit?: 'cover' | 'contain' | 'fill' | 'scale-down',
958
+ resizeMode?: ImageResizeMode,
959
+ objectFit?: 'cover' | 'contain' | 'fill' | 'scale-down' | 'none',
942
960
  tintColor?: ____ColorValue_Internal,
943
961
  overlayColor?: string,
944
962
  }>;
@@ -14,25 +14,28 @@ import type {ProcessedColorValue} from './processColor';
14
14
  import type {GradientValue} from './StyleSheetTypes';
15
15
 
16
16
  const processColor = require('./processColor').default;
17
- const DIRECTION_REGEX =
18
- /^to\s+(?:top|bottom|left|right)(?:\s+(?:top|bottom|left|right))?/;
17
+ const DIRECTION_KEYWORD_REGEX =
18
+ /^to\s+(?:top|bottom|left|right)(?:\s+(?:top|bottom|left|right))?/i;
19
19
  const ANGLE_UNIT_REGEX = /^([+-]?\d*\.?\d+)(deg|grad|rad|turn)$/i;
20
20
 
21
- const TO_BOTTOM_START_END_POINTS = {
22
- start: {x: 0.5, y: 0},
23
- end: {x: 0.5, y: 1},
24
- };
21
+ type LinearGradientDirection =
22
+ | {type: 'angle', value: number}
23
+ | {type: 'keyword', value: string};
25
24
 
26
25
  type ParsedGradientValue = {
27
26
  type: 'linearGradient',
28
- start: {x: number, y: number},
29
- end: {x: number, y: number},
27
+ direction: LinearGradientDirection,
30
28
  colorStops: $ReadOnlyArray<{
31
29
  color: ProcessedColorValue,
32
30
  position: number,
33
31
  }>,
34
32
  };
35
33
 
34
+ const DEFAULT_DIRECTION: LinearGradientDirection = {
35
+ type: 'angle',
36
+ value: 180,
37
+ };
38
+
36
39
  export default function processBackgroundImage(
37
40
  backgroundImage: ?($ReadOnlyArray<GradientValue> | string),
38
41
  ): $ReadOnlyArray<ParsedGradientValue> {
@@ -76,37 +79,43 @@ export default function processBackgroundImage(
76
79
  }
77
80
  }
78
81
 
79
- let points: {
80
- start: ParsedGradientValue['start'],
81
- end: ParsedGradientValue['end'],
82
- } | null = null;
83
-
84
- if (typeof bgImage.direction === 'undefined') {
85
- points = TO_BOTTOM_START_END_POINTS;
86
- } else if (ANGLE_UNIT_REGEX.test(bgImage.direction)) {
87
- const angle = parseAngle(bgImage.direction);
88
- if (angle != null) {
89
- points = calculateStartEndPointsFromAngle(angle);
90
- }
91
- } else if (DIRECTION_REGEX.test(bgImage.direction)) {
92
- const processedPoints = calculateStartEndPointsFromDirection(
93
- bgImage.direction,
94
- );
95
- if (processedPoints != null) {
96
- points = processedPoints;
82
+ let direction: LinearGradientDirection = DEFAULT_DIRECTION;
83
+ const bgDirection =
84
+ bgImage.direction != null ? bgImage.direction.toLowerCase() : null;
85
+
86
+ if (bgDirection != null) {
87
+ if (ANGLE_UNIT_REGEX.test(bgDirection)) {
88
+ const parsedAngle = getAngleInDegrees(bgDirection);
89
+ if (parsedAngle != null) {
90
+ direction = {
91
+ type: 'angle',
92
+ value: parsedAngle,
93
+ };
94
+ } else {
95
+ // If an angle is invalid, return an empty array and do not apply any gradient. Same as web.
96
+ return [];
97
+ }
98
+ } else if (DIRECTION_KEYWORD_REGEX.test(bgDirection)) {
99
+ const parsedDirection = getDirectionForKeyword(bgDirection);
100
+ if (parsedDirection != null) {
101
+ direction = parsedDirection;
102
+ } else {
103
+ // If a direction is invalid, return an empty array and do not apply any gradient. Same as web.
104
+ return [];
105
+ }
106
+ } else {
107
+ // If a direction is invalid, return an empty array and do not apply any gradient. Same as web.
108
+ return [];
97
109
  }
98
110
  }
99
111
 
100
112
  const fixedColorStops = getFixedColorStops(processedColorStops);
101
113
 
102
- if (points != null) {
103
- result = result.concat({
104
- type: 'linearGradient',
105
- start: points.start,
106
- end: points.end,
107
- colorStops: fixedColorStops,
108
- });
109
- }
114
+ result = result.concat({
115
+ type: 'linearGradient',
116
+ direction,
117
+ colorStops: fixedColorStops,
118
+ });
110
119
  }
111
120
  }
112
121
 
@@ -118,30 +127,39 @@ function parseCSSLinearGradient(
118
127
  ): $ReadOnlyArray<ParsedGradientValue> {
119
128
  const gradients = [];
120
129
  let match;
130
+
131
+ // matches one or more linear-gradient functions in CSS
121
132
  const linearGradientRegex = /linear-gradient\s*\(((?:\([^)]*\)|[^())])*)\)/gi;
122
133
 
123
134
  while ((match = linearGradientRegex.exec(cssString))) {
124
135
  const gradientContent = match[1];
125
136
  const parts = gradientContent.split(',');
126
- let points = TO_BOTTOM_START_END_POINTS;
137
+ let direction: LinearGradientDirection = DEFAULT_DIRECTION;
127
138
  const trimmedDirection = parts[0].trim().toLowerCase();
139
+
140
+ // matches individual color stops in a gradient function
141
+ // supports various color formats: named colors, hex colors, rgb(a), and hsl(a)
142
+ // e.g. "red 20%", "blue 50%", "rgba(0, 0, 0, 0.5) 30% 50%"
143
+ // TODO: does not support color hint syntax yet. It is WIP.
128
144
  const colorStopRegex =
129
145
  /\s*((?:(?:rgba?|hsla?)\s*\([^)]+\))|#[0-9a-fA-F]+|[a-zA-Z]+)(?:\s+(-?[0-9.]+%?)(?:\s+(-?[0-9.]+%?))?)?\s*/gi;
130
146
 
131
147
  if (ANGLE_UNIT_REGEX.test(trimmedDirection)) {
132
- const angle = parseAngle(trimmedDirection);
133
- if (angle != null) {
134
- points = calculateStartEndPointsFromAngle(angle);
148
+ const parsedAngle = getAngleInDegrees(trimmedDirection);
149
+ if (parsedAngle != null) {
150
+ direction = {
151
+ type: 'angle',
152
+ value: parsedAngle,
153
+ };
135
154
  parts.shift();
136
155
  } else {
137
156
  // If an angle is invalid, return an empty array and do not apply any gradient. Same as web.
138
157
  return [];
139
158
  }
140
- } else if (DIRECTION_REGEX.test(trimmedDirection)) {
141
- const parsedPoints =
142
- calculateStartEndPointsFromDirection(trimmedDirection);
143
- if (parsedPoints != null) {
144
- points = parsedPoints;
159
+ } else if (DIRECTION_KEYWORD_REGEX.test(trimmedDirection)) {
160
+ const parsedDirection = getDirectionForKeyword(trimmedDirection);
161
+ if (parsedDirection != null) {
162
+ direction = parsedDirection;
145
163
  parts.shift();
146
164
  } else {
147
165
  // If a direction is invalid, return an empty array and do not apply any gradient. Same as web.
@@ -198,8 +216,7 @@ function parseCSSLinearGradient(
198
216
 
199
217
  gradients.push({
200
218
  type: 'linearGradient',
201
- start: points.start,
202
- end: points.end,
219
+ direction,
203
220
  colorStops: fixedColorStops,
204
221
  });
205
222
  }
@@ -207,83 +224,43 @@ function parseCSSLinearGradient(
207
224
  return gradients;
208
225
  }
209
226
 
210
- function calculateStartEndPointsFromDirection(direction: string): ?{
211
- start: {x: number, y: number},
212
- end: {x: number, y: number},
213
- } {
227
+ function getDirectionForKeyword(direction?: string): ?LinearGradientDirection {
228
+ if (direction == null) {
229
+ return null;
230
+ }
214
231
  // Remove extra whitespace
215
- const normalizedDirection = direction.replace(/\s+/g, ' ');
232
+ const normalized = direction.replace(/\s+/g, ' ').toLowerCase();
216
233
 
217
- switch (normalizedDirection) {
234
+ switch (normalized) {
235
+ case 'to top':
236
+ return {type: 'angle', value: 0};
218
237
  case 'to right':
219
- return {
220
- start: {x: 0, y: 0.5},
221
- end: {x: 1, y: 0.5},
222
- };
223
- case 'to left':
224
- return {
225
- start: {x: 1, y: 0.5},
226
- end: {x: 0, y: 0.5},
227
- };
238
+ return {type: 'angle', value: 90};
228
239
  case 'to bottom':
229
- return TO_BOTTOM_START_END_POINTS;
230
- case 'to top':
231
- return {
232
- start: {x: 0.5, y: 1},
233
- end: {x: 0.5, y: 0},
234
- };
240
+ return {type: 'angle', value: 180};
241
+ case 'to left':
242
+ return {type: 'angle', value: 270};
243
+ case 'to top right':
244
+ case 'to right top':
245
+ return {type: 'keyword', value: 'to top right'};
235
246
  case 'to bottom right':
236
247
  case 'to right bottom':
237
- return {
238
- start: {x: 0, y: 0},
239
- end: {x: 1, y: 1},
240
- };
248
+ return {type: 'keyword', value: 'to bottom right'};
241
249
  case 'to top left':
242
250
  case 'to left top':
243
- return {
244
- start: {x: 1, y: 1},
245
- end: {x: 0, y: 0},
246
- };
251
+ return {type: 'keyword', value: 'to top left'};
247
252
  case 'to bottom left':
248
253
  case 'to left bottom':
249
- return {
250
- start: {x: 1, y: 0},
251
- end: {x: 0, y: 1},
252
- };
253
- case 'to top right':
254
- case 'to right top':
255
- return {
256
- start: {x: 0, y: 1},
257
- end: {x: 1, y: 0},
258
- };
254
+ return {type: 'keyword', value: 'to bottom left'};
259
255
  default:
260
256
  return null;
261
257
  }
262
258
  }
263
259
 
264
- function calculateStartEndPointsFromAngle(angleRadians: number): {
265
- start: {x: number, y: number},
266
- end: {x: number, y: number},
267
- } {
268
- // Normalize angle to be between 0 and 2π
269
- let angleRadiansNormalized = angleRadians % (2 * Math.PI);
270
- if (angleRadiansNormalized < 0) {
271
- angleRadiansNormalized += 2 * Math.PI;
260
+ function getAngleInDegrees(angle?: string): ?number {
261
+ if (angle == null) {
262
+ return null;
272
263
  }
273
-
274
- const endX = 0.5 + 0.5 * Math.sin(angleRadiansNormalized);
275
- const endY = 0.5 - 0.5 * Math.cos(angleRadiansNormalized);
276
-
277
- const startX = 1 - endX;
278
- const startY = 1 - endY;
279
-
280
- return {
281
- start: {x: startX, y: startY},
282
- end: {x: endX, y: endY},
283
- };
284
- }
285
-
286
- function parseAngle(angle: string): ?number {
287
264
  const match = angle.match(ANGLE_UNIT_REGEX);
288
265
  if (!match) {
289
266
  return null;
@@ -294,13 +271,13 @@ function parseAngle(angle: string): ?number {
294
271
  const numericValue = parseFloat(value);
295
272
  switch (unit) {
296
273
  case 'deg':
297
- return (numericValue * Math.PI) / 180;
274
+ return numericValue;
298
275
  case 'grad':
299
- return (numericValue * Math.PI) / 200;
276
+ return numericValue * 0.9; // 1 grad = 0.9 degrees
300
277
  case 'rad':
301
- return numericValue;
278
+ return (numericValue * 180) / Math.PI;
302
279
  case 'turn':
303
- return numericValue * 2 * Math.PI;
280
+ return numericValue * 360; // 1 turn = 360 degrees
304
281
  default:
305
282
  return null;
306
283
  }
@@ -26,7 +26,7 @@ function processTransform(
26
26
  ): Array<Object> | Array<number> {
27
27
  if (typeof transform === 'string') {
28
28
  const regex = new RegExp(/(\w+)\(([^)]+)\)/g);
29
- let transformArray: Array<Object> = [];
29
+ const transformArray: Array<Object> = [];
30
30
  let matches;
31
31
 
32
32
  while ((matches = regex.exec(transform))) {
@@ -50,23 +50,7 @@ function processTransform(
50
50
  }
51
51
 
52
52
  const _getKeyAndValueFromCSSTransform: (
53
- key:
54
- | string
55
- | $TEMPORARY$string<'matrix'>
56
- | $TEMPORARY$string<'perspective'>
57
- | $TEMPORARY$string<'rotate'>
58
- | $TEMPORARY$string<'rotateX'>
59
- | $TEMPORARY$string<'rotateY'>
60
- | $TEMPORARY$string<'rotateZ'>
61
- | $TEMPORARY$string<'scale'>
62
- | $TEMPORARY$string<'scaleX'>
63
- | $TEMPORARY$string<'scaleY'>
64
- | $TEMPORARY$string<'skewX'>
65
- | $TEMPORARY$string<'skewY'>
66
- | $TEMPORARY$string<'translate'>
67
- | $TEMPORARY$string<'translate3d'>
68
- | $TEMPORARY$string<'translateX'>
69
- | $TEMPORARY$string<'translateY'>,
53
+ key: string,
70
54
  args: string,
71
55
  ) => {key: string, value?: Array<string | number> | number | string} = (
72
56
  key,
@@ -169,22 +153,7 @@ function _validateTransforms(transform: Array<Object>): void {
169
153
  }
170
154
 
171
155
  function _validateTransform(
172
- key:
173
- | string
174
- | $TEMPORARY$string<'matrix'>
175
- | $TEMPORARY$string<'perspective'>
176
- | $TEMPORARY$string<'rotate'>
177
- | $TEMPORARY$string<'rotateX'>
178
- | $TEMPORARY$string<'rotateY'>
179
- | $TEMPORARY$string<'rotateZ'>
180
- | $TEMPORARY$string<'scale'>
181
- | $TEMPORARY$string<'scaleX'>
182
- | $TEMPORARY$string<'scaleY'>
183
- | $TEMPORARY$string<'skewX'>
184
- | $TEMPORARY$string<'skewY'>
185
- | $TEMPORARY$string<'translate'>
186
- | $TEMPORARY$string<'translateX'>
187
- | $TEMPORARY$string<'translateY'>,
156
+ key: string,
188
157
  value: any | number | string,
189
158
  transformation: any,
190
159
  ) {