react-native-screens 3.35.0-rc.0 → 4.0.0-beta.0

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 (115) hide show
  1. package/android/build.gradle +2 -2
  2. package/android/src/main/java/com/swmansion/rnscreens/InsetsObserverProxy.kt +67 -0
  3. package/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt +2 -0
  4. package/android/src/main/java/com/swmansion/rnscreens/Screen.kt +101 -4
  5. package/android/src/main/java/com/swmansion/rnscreens/ScreenContentWrapper.kt +38 -0
  6. package/android/src/main/java/com/swmansion/rnscreens/ScreenContentWrapperManager.kt +25 -0
  7. package/android/src/main/java/com/swmansion/rnscreens/ScreenFooter.kt +287 -0
  8. package/android/src/main/java/com/swmansion/rnscreens/ScreenFooterManager.kt +25 -0
  9. package/android/src/main/java/com/swmansion/rnscreens/ScreenFragment.kt +11 -19
  10. package/android/src/main/java/com/swmansion/rnscreens/ScreenFragmentWrapper.kt +4 -0
  11. package/android/src/main/java/com/swmansion/rnscreens/ScreenModalFragment.kt +281 -0
  12. package/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt +62 -19
  13. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.kt +403 -41
  14. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragmentWrapper.kt +4 -1
  15. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.kt +2 -2
  16. package/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt +95 -11
  17. package/android/src/main/java/com/swmansion/rnscreens/ScreenWindowTraits.kt +39 -28
  18. package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/BottomSheetDialogRootView.kt +104 -0
  19. package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/BottomSheetDialogScreen.kt +26 -0
  20. package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/DimmingFragment.kt +488 -0
  21. package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/DimmingView.kt +66 -0
  22. package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/GestureTransparentViewGroup.kt +24 -0
  23. package/android/src/main/java/com/swmansion/rnscreens/bottomsheet/SheetUtils.kt +127 -0
  24. package/android/src/main/java/com/swmansion/rnscreens/events/SheetDetentChangedEvent.kt +27 -0
  25. package/android/src/main/java/com/swmansion/rnscreens/ext/NumericExt.kt +12 -0
  26. package/android/src/main/java/com/swmansion/rnscreens/ext/ViewExt.kt +32 -0
  27. package/android/src/main/java/com/swmansion/rnscreens/utils/ScreenDummyLayoutHelper.kt +45 -8
  28. package/android/src/main/res/base/drawable/rns_rounder_top_corners_shape.xml +8 -0
  29. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContentWrapperManagerDelegate.java +25 -0
  30. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContentWrapperManagerInterface.java +16 -0
  31. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenFooterManagerDelegate.java +25 -0
  32. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenFooterManagerInterface.java +16 -0
  33. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerDelegate.java +9 -2
  34. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java +5 -2
  35. package/ios/RNSConvert.h +5 -3
  36. package/ios/RNSConvert.mm +14 -20
  37. package/ios/RNSScreen.h +3 -2
  38. package/ios/RNSScreen.mm +433 -49
  39. package/ios/RNSScreenContentWrapper.h +44 -0
  40. package/ios/RNSScreenContentWrapper.mm +61 -0
  41. package/ios/RNSScreenFooter.h +30 -0
  42. package/ios/RNSScreenFooter.mm +137 -0
  43. package/lib/commonjs/components/Screen.js +6 -2
  44. package/lib/commonjs/components/Screen.js.map +1 -1
  45. package/lib/commonjs/components/ScreenContentWrapper.js +19 -0
  46. package/lib/commonjs/components/ScreenContentWrapper.js.map +1 -0
  47. package/lib/commonjs/components/ScreenFooter.js +23 -0
  48. package/lib/commonjs/components/ScreenFooter.js.map +1 -0
  49. package/lib/commonjs/fabric/ModalScreenNativeComponent.js.map +1 -1
  50. package/lib/commonjs/fabric/ScreenContentWrapperNativeComponent.js +10 -0
  51. package/lib/commonjs/fabric/ScreenContentWrapperNativeComponent.js.map +1 -0
  52. package/lib/commonjs/fabric/ScreenFooterNativeComponent.js +10 -0
  53. package/lib/commonjs/fabric/ScreenFooterNativeComponent.js.map +1 -0
  54. package/lib/commonjs/fabric/ScreenNativeComponent.js.map +1 -1
  55. package/lib/commonjs/index.js +30 -0
  56. package/lib/commonjs/index.js.map +1 -1
  57. package/lib/commonjs/native-stack/views/FooterComponent.js +18 -0
  58. package/lib/commonjs/native-stack/views/FooterComponent.js.map +1 -0
  59. package/lib/commonjs/native-stack/views/NativeStackView.js +59 -14
  60. package/lib/commonjs/native-stack/views/NativeStackView.js.map +1 -1
  61. package/lib/module/components/Screen.js +6 -2
  62. package/lib/module/components/Screen.js.map +1 -1
  63. package/lib/module/components/ScreenContentWrapper.js +12 -0
  64. package/lib/module/components/ScreenContentWrapper.js.map +1 -0
  65. package/lib/module/components/ScreenFooter.js +17 -0
  66. package/lib/module/components/ScreenFooter.js.map +1 -0
  67. package/lib/module/fabric/ModalScreenNativeComponent.js.map +1 -1
  68. package/lib/module/fabric/ScreenContentWrapperNativeComponent.js +3 -0
  69. package/lib/module/fabric/ScreenContentWrapperNativeComponent.js.map +1 -0
  70. package/lib/module/fabric/ScreenFooterNativeComponent.js +3 -0
  71. package/lib/module/fabric/ScreenFooterNativeComponent.js.map +1 -0
  72. package/lib/module/fabric/ScreenNativeComponent.js.map +1 -1
  73. package/lib/module/index.js +2 -0
  74. package/lib/module/index.js.map +1 -1
  75. package/lib/module/native-stack/views/FooterComponent.js +11 -0
  76. package/lib/module/native-stack/views/FooterComponent.js.map +1 -0
  77. package/lib/module/native-stack/views/NativeStackView.js +61 -15
  78. package/lib/module/native-stack/views/NativeStackView.js.map +1 -1
  79. package/lib/typescript/components/Screen.d.ts.map +1 -1
  80. package/lib/typescript/components/ScreenContentWrapper.d.ts +6 -0
  81. package/lib/typescript/components/ScreenContentWrapper.d.ts.map +1 -0
  82. package/lib/typescript/components/ScreenFooter.d.ts +12 -0
  83. package/lib/typescript/components/ScreenFooter.d.ts.map +1 -0
  84. package/lib/typescript/fabric/ModalScreenNativeComponent.d.ts +2 -3
  85. package/lib/typescript/fabric/ModalScreenNativeComponent.d.ts.map +1 -1
  86. package/lib/typescript/fabric/ScreenContentWrapperNativeComponent.d.ts +7 -0
  87. package/lib/typescript/fabric/ScreenContentWrapperNativeComponent.d.ts.map +1 -0
  88. package/lib/typescript/fabric/ScreenFooterNativeComponent.d.ts +7 -0
  89. package/lib/typescript/fabric/ScreenFooterNativeComponent.d.ts.map +1 -0
  90. package/lib/typescript/fabric/ScreenNativeComponent.d.ts +9 -3
  91. package/lib/typescript/fabric/ScreenNativeComponent.d.ts.map +1 -1
  92. package/lib/typescript/index.d.ts +2 -0
  93. package/lib/typescript/index.d.ts.map +1 -1
  94. package/lib/typescript/native-stack/types.d.ts +63 -23
  95. package/lib/typescript/native-stack/types.d.ts.map +1 -1
  96. package/lib/typescript/native-stack/views/FooterComponent.d.ts +7 -0
  97. package/lib/typescript/native-stack/views/FooterComponent.d.ts.map +1 -0
  98. package/lib/typescript/native-stack/views/NativeStackView.d.ts.map +1 -1
  99. package/lib/typescript/types.d.ts +42 -17
  100. package/lib/typescript/types.d.ts.map +1 -1
  101. package/native-stack/README.md +16 -14
  102. package/package.json +1 -1
  103. package/react-native.config.js +18 -16
  104. package/src/components/Screen.tsx +6 -2
  105. package/src/components/ScreenContentWrapper.tsx +12 -0
  106. package/src/components/ScreenFooter.tsx +18 -0
  107. package/src/fabric/ModalScreenNativeComponent.ts +2 -4
  108. package/src/fabric/ScreenContentWrapperNativeComponent.ts +9 -0
  109. package/src/fabric/ScreenFooterNativeComponent.ts +6 -0
  110. package/src/fabric/ScreenNativeComponent.ts +10 -4
  111. package/src/index.tsx +10 -0
  112. package/src/native-stack/types.tsx +57 -23
  113. package/src/native-stack/views/FooterComponent.tsx +10 -0
  114. package/src/native-stack/views/NativeStackView.tsx +74 -11
  115. package/src/types.tsx +41 -16
@@ -1,5 +1,6 @@
1
+ /* eslint-disable camelcase */
1
2
  import * as React from 'react';
2
- import { Animated, Platform, StyleSheet, View, ViewProps } from 'react-native';
3
+ import { Animated, Platform, StyleSheet, ViewProps } from 'react-native';
3
4
  // @ts-ignore Getting private component
4
5
  // eslint-disable-next-line import/no-named-as-default, import/default, import/no-named-as-default-member, import/namespace
5
6
  import AppContainer from 'react-native/Libraries/ReactNative/AppContainer';
@@ -10,6 +11,7 @@ import {
10
11
  ScreenContext,
11
12
  GHContext,
12
13
  GestureDetectorBridge,
14
+ ScreenContentWrapper,
13
15
  } from 'react-native-screens';
14
16
  import {
15
17
  ParamListBase,
@@ -37,24 +39,29 @@ import getDefaultHeaderHeight from '../utils/getDefaultHeaderHeight';
37
39
  import getStatusBarHeight from '../utils/getStatusBarHeight';
38
40
  import HeaderHeightContext from '../utils/HeaderHeightContext';
39
41
  import AnimatedHeaderHeightContext from '../utils/AnimatedHeaderHeightContext';
42
+ import FooterComponent from './FooterComponent';
40
43
 
41
44
  const isAndroid = Platform.OS === 'android';
42
45
 
43
- let Container = View;
46
+ let Container = ScreenContentWrapper;
44
47
 
45
48
  if (__DEV__) {
46
49
  const DebugContainer = (
47
50
  props: ViewProps & { stackPresentation: StackPresentationTypes },
48
51
  ) => {
49
52
  const { stackPresentation, ...rest } = props;
50
- if (Platform.OS === 'ios' && stackPresentation !== 'push') {
53
+ if (
54
+ Platform.OS === 'ios' &&
55
+ stackPresentation !== 'push' &&
56
+ stackPresentation !== 'formSheet'
57
+ ) {
51
58
  return (
52
59
  <AppContainer>
53
- <View {...rest} />
60
+ <ScreenContentWrapper {...rest} />
54
61
  </AppContainer>
55
62
  );
56
63
  }
57
- return <View {...rest} />;
64
+ return <ScreenContentWrapper {...rest} />;
58
65
  };
59
66
  // @ts-ignore Wrong props
60
67
  Container = DebugContainer;
@@ -72,7 +79,11 @@ const MaybeNestedStack = ({
72
79
  children: React.ReactNode;
73
80
  }) => {
74
81
  const { colors } = useTheme();
75
- const { headerShown = true, contentStyle } = options;
82
+ const {
83
+ headerShown = true,
84
+ contentStyle,
85
+ unstable_screenStyle = null,
86
+ } = options;
76
87
 
77
88
  const Screen = React.useContext(ScreenContext);
78
89
 
@@ -96,7 +107,11 @@ const MaybeNestedStack = ({
96
107
  const content = (
97
108
  <Container
98
109
  style={[
99
- styles.container,
110
+ stackPresentation === 'formSheet'
111
+ ? Platform.OS === 'ios'
112
+ ? styles.absoluteFillNoBottom
113
+ : null
114
+ : styles.container,
100
115
  stackPresentation !== 'transparentModal' &&
101
116
  stackPresentation !== 'containedTransparentModal' && {
102
117
  backgroundColor: colors.background,
@@ -138,7 +153,7 @@ const MaybeNestedStack = ({
138
153
  enabled
139
154
  isNativeStack
140
155
  hasLargeHeader={hasLargeHeader}
141
- style={StyleSheet.absoluteFill}>
156
+ style={[StyleSheet.absoluteFill, unstable_screenStyle]}>
142
157
  <HeaderHeightContext.Provider value={headerHeight}>
143
158
  <HeaderConfig {...options} route={route} />
144
159
  {content}
@@ -173,17 +188,19 @@ const RouteView = ({
173
188
  screensRefs: ScreensRefsHolder;
174
189
  }) => {
175
190
  const { options, render: renderScene } = descriptors[route.key];
191
+
176
192
  const {
177
193
  fullScreenSwipeShadowEnabled = false,
178
194
  gestureEnabled,
179
195
  headerShown,
180
196
  hideKeyboardOnSwipe,
181
197
  homeIndicatorHidden,
182
- sheetAllowedDetents = 'large',
183
- sheetLargestUndimmedDetent = 'all',
198
+ sheetLargestUndimmedDetent = -1,
184
199
  sheetGrabberVisible = false,
185
200
  sheetCornerRadius = -1.0,
201
+ sheetElevation = 24,
186
202
  sheetExpandsWhenScrolledToEdge = true,
203
+ sheetInitialDetent = 0,
187
204
  nativeBackButtonDismissalEnabled = false,
188
205
  navigationBarColor,
189
206
  navigationBarTranslucent,
@@ -198,16 +215,28 @@ const RouteView = ({
198
215
  swipeDirection = 'horizontal',
199
216
  transitionDuration,
200
217
  freezeOnBlur,
218
+ unstable_footerComponent = null,
201
219
  } = options;
202
220
 
203
221
  let {
222
+ sheetAllowedDetents = [1.0],
204
223
  customAnimationOnSwipe,
205
224
  fullScreenSwipeEnabled,
206
225
  gestureResponseDistance,
207
226
  stackAnimation,
208
227
  stackPresentation = 'push',
228
+ unstable_screenStyle = null,
209
229
  } = options;
210
230
 
231
+ // We only want to allow backgroundColor for now
232
+ unstable_screenStyle = unstable_screenStyle
233
+ ? { backgroundColor: unstable_screenStyle.backgroundColor }
234
+ : null;
235
+
236
+ if (sheetAllowedDetents === 'fitToContents') {
237
+ sheetAllowedDetents = [-1];
238
+ }
239
+
211
240
  if (swipeDirection === 'vertical') {
212
241
  // for `vertical` direction to work, we need to set `fullScreenSwipeEnabled` to `true`
213
242
  // so the screen can be dismissed from any point on screen.
@@ -286,11 +315,13 @@ const RouteView = ({
286
315
  enabled
287
316
  isNativeStack
288
317
  hasLargeHeader={hasLargeHeader}
289
- style={StyleSheet.absoluteFill}
318
+ style={[StyleSheet.absoluteFill, unstable_screenStyle]}
290
319
  sheetAllowedDetents={sheetAllowedDetents}
291
320
  sheetLargestUndimmedDetent={sheetLargestUndimmedDetent}
292
321
  sheetGrabberVisible={sheetGrabberVisible}
322
+ sheetInitialDetent={sheetInitialDetent}
293
323
  sheetCornerRadius={sheetCornerRadius}
324
+ sheetElevation={sheetElevation}
294
325
  sheetExpandsWhenScrolledToEdge={sheetExpandsWhenScrolledToEdge}
295
326
  customAnimationOnSwipe={customAnimationOnSwipe}
296
327
  freezeOnBlur={freezeOnBlur}
@@ -323,6 +354,7 @@ const RouteView = ({
323
354
  });
324
355
  }}
325
356
  onWillAppear={() => {
357
+ console.log(`onWillAppear/transitionStart route: ${route.key}`);
326
358
  navigation.emit({
327
359
  type: 'transitionStart',
328
360
  data: { closing: false },
@@ -330,6 +362,7 @@ const RouteView = ({
330
362
  });
331
363
  }}
332
364
  onWillDisappear={() => {
365
+ console.log(`onWillDisappear/transitionStart route: ${route.key}`);
333
366
  navigation.emit({
334
367
  type: 'transitionStart',
335
368
  data: { closing: true },
@@ -337,10 +370,12 @@ const RouteView = ({
337
370
  });
338
371
  }}
339
372
  onAppear={() => {
373
+ console.log(`onAppear/appear route: ${route.key}`);
340
374
  navigation.emit({
341
375
  type: 'appear',
342
376
  target: route.key,
343
377
  });
378
+ console.log(`onAppear/transitionEnd route: ${route.key}`);
344
379
  navigation.emit({
345
380
  type: 'transitionEnd',
346
381
  data: { closing: false },
@@ -348,6 +383,7 @@ const RouteView = ({
348
383
  });
349
384
  }}
350
385
  onDisappear={() => {
386
+ console.log(`onDisappear/transitionEnd route: ${route.key}`);
351
387
  navigation.emit({
352
388
  type: 'transitionEnd',
353
389
  data: { closing: true },
@@ -367,6 +403,7 @@ const RouteView = ({
367
403
  }
368
404
  }}
369
405
  onDismissed={e => {
406
+ console.log(`onDismissed/dismiss route: ${route.key}`);
370
407
  navigation.emit({
371
408
  type: 'dismiss',
372
409
  target: route.key,
@@ -381,6 +418,16 @@ const RouteView = ({
381
418
  target: stateKey,
382
419
  });
383
420
  }}
421
+ onSheetDetentChanged={e => {
422
+ navigation.emit({
423
+ type: 'sheetDetentChange',
424
+ target: route.key,
425
+ data: {
426
+ index: e.nativeEvent.index,
427
+ isStable: e.nativeEvent.isStable,
428
+ },
429
+ });
430
+ }}
384
431
  onGestureCancel={() => {
385
432
  navigation.emit({
386
433
  type: 'gestureCancel',
@@ -403,6 +450,9 @@ const RouteView = ({
403
450
  route={route}
404
451
  headerShown={isHeaderInPush}
405
452
  />
453
+ {unstable_footerComponent && (
454
+ <FooterComponent>{unstable_footerComponent}</FooterComponent>
455
+ )}
406
456
  </HeaderHeightContext.Provider>
407
457
  </AnimatedHeaderHeightContext.Provider>
408
458
  </Screen>
@@ -487,4 +537,17 @@ const styles = StyleSheet.create({
487
537
  container: {
488
538
  flex: 1,
489
539
  },
540
+ absoluteFill: {
541
+ position: 'absolute',
542
+ top: 0,
543
+ left: 0,
544
+ right: 0,
545
+ bottom: 0,
546
+ },
547
+ absoluteFillNoBottom: {
548
+ position: 'absolute',
549
+ top: 0,
550
+ left: 0,
551
+ right: 0,
552
+ },
490
553
  });
package/src/types.tsx CHANGED
@@ -7,6 +7,7 @@ import {
7
7
  TargetedEvent,
8
8
  TextInputFocusEventData,
9
9
  ColorValue,
10
+ ViewStyle,
10
11
  } from 'react-native';
11
12
  import { NativeStackNavigatorProps } from './native-stack/types';
12
13
 
@@ -95,13 +96,13 @@ export type GestureResponseDistanceType = {
95
96
  bottom?: number;
96
97
  };
97
98
 
98
- export type SheetDetentTypes = 'medium' | 'large' | 'all';
99
99
  export type SearchBarPlacement = 'automatic' | 'inline' | 'stacked';
100
100
 
101
101
  export interface ScreenProps extends ViewProps {
102
102
  active?: 0 | 1 | Animated.AnimatedInterpolation<number>;
103
103
  activityState?: 0 | 1 | 2 | Animated.AnimatedInterpolation<number>;
104
104
  children?: React.ReactNode;
105
+ unstable_footer?: React.ReactNode;
105
106
  /**
106
107
  * Boolean indicating that swipe dismissal should trigger animation provided by `stackAnimation`. Defaults to `false`.
107
108
  *
@@ -231,6 +232,12 @@ export interface ScreenProps extends ViewProps {
231
232
  onNativeDismissCancelled?: (
232
233
  e: NativeSyntheticEvent<{ dismissCount: number }>,
233
234
  ) => void;
235
+ /**
236
+ * A callback that gets called when the current screen is in `formSheet` presentation and its detent has changed.
237
+ */
238
+ onSheetDetentChanged?: (
239
+ e: NativeSyntheticEvent<{ index: number; isStable: boolean }>,
240
+ ) => void;
234
241
  /**
235
242
  * An internal callback called every frame during the transition of screens of `native-stack`, used to feed transition context.
236
243
  */
@@ -273,20 +280,36 @@ export interface ScreenProps extends ViewProps {
273
280
  * - "landscape_right" – landscape-right orientation is permitted
274
281
  */
275
282
  screenOrientation?: ScreenOrientationTypes;
283
+ /**
284
+ * Allows to set background color for the `Screen` component itself.
285
+ * This might come handy when using `formSheet` stack presentation, when the content view is clipped.
286
+ *
287
+ * We plan to get rid of this prop once the workaround is no longer needed.
288
+ */
289
+ unstable_screenStyle?: Pick<ViewStyle, 'backgroundColor'>;
276
290
  /**
277
291
  * Describes heights where a sheet can rest.
278
292
  * Works only when `stackPresentation` is set to `formSheet`.
279
- * Defaults to `large`.
280
293
  *
281
- * Available values:
294
+ * Heights should be described as fraction (a number from `[0, 1]` interval) of screen height / maximum detent height.
295
+ * There is also possibility to specify `[-1]` literal array with single element, which intets to set the sheet height
296
+ * to the height of its contents.
282
297
  *
283
- * - `large` - only large detent level will be allowed
284
- * - `medium` - only medium detent level will be allowed
285
- * - `all` - all detent levels will be allowed
298
+ * Please note that the array **must** be sorted in ascending order.
286
299
  *
287
- * @platform ios
300
+ * Defaults to `[1.0]` literal.
288
301
  */
289
- sheetAllowedDetents?: SheetDetentTypes;
302
+ sheetAllowedDetents?: number[];
303
+ /**
304
+ * Integer value describing elevation of the sheet, impacting shadow on the top edge of the sheet.
305
+ *
306
+ * Not dynamic - changing it after the component is rendered won't have an effect.
307
+ *
308
+ * Defaults to `24`.
309
+ *
310
+ * @platform Android
311
+ */
312
+ sheetElevation?: number;
290
313
  /**
291
314
  * Whether the sheet should expand to larger detent when scrolling.
292
315
  * Works only when `stackPresentation` is set to `formSheet`.
@@ -318,17 +341,19 @@ export interface ScreenProps extends ViewProps {
318
341
  * The largest sheet detent for which a view underneath won't be dimmed.
319
342
  * Works only when `stackPresentation` is set to `formSheet`.
320
343
  *
321
- * If this prop is set to:
322
- *
323
- * - `large` - the view underneath won't be dimmed at any detent level
324
- * - `medium` - the view underneath will be dimmed only when detent level is `large`
325
- * - `all` - the view underneath will be dimmed for any detent level
344
+ * This prop can be set to an number, which indicates index of detent in `sheetAllowedDetents` array for which
345
+ * there won't be a dimming view beneath the sheet.
326
346
  *
327
- * Defaults to `all`.
347
+ * Defaults to `-1`, indicating that the dimming view should be always present.
348
+ */
349
+ sheetLargestUndimmedDetent?: number;
350
+ /**
351
+ * Index of the detent the sheet should expand to after being opened.
352
+ * Works only when `stackPresentation` is set to `formSheet`.
328
353
  *
329
- * @platform ios
354
+ * Defaults to `0` - which represents first detent in the detents array.
330
355
  */
331
- sheetLargestUndimmedDetent?: SheetDetentTypes;
356
+ sheetInitialDetent?: number;
332
357
  /**
333
358
  * How the screen should appear/disappear when pushed or popped at the top of the stack.
334
359
  * The following values are currently supported: