react-native-drawer-layout 4.0.0-alpha.0 → 4.0.0-alpha.2

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 (83) hide show
  1. package/lib/commonjs/constants.js +5 -9
  2. package/lib/commonjs/constants.js.map +1 -1
  3. package/lib/commonjs/index.js.map +1 -1
  4. package/lib/commonjs/types.js.map +1 -1
  5. package/lib/commonjs/utils/DrawerGestureContext.js +3 -4
  6. package/lib/commonjs/utils/DrawerGestureContext.js.map +1 -1
  7. package/lib/commonjs/utils/DrawerProgressContext.js +3 -4
  8. package/lib/commonjs/utils/DrawerProgressContext.js.map +1 -1
  9. package/lib/commonjs/utils/useDrawerProgress.js +2 -2
  10. package/lib/commonjs/utils/useDrawerProgress.js.map +1 -1
  11. package/lib/commonjs/views/Drawer.js +285 -36
  12. package/lib/commonjs/views/Drawer.js.map +1 -1
  13. package/lib/commonjs/views/GestureHandler.android.js.map +1 -1
  14. package/lib/commonjs/views/GestureHandler.ios.js.map +1 -1
  15. package/lib/commonjs/views/GestureHandler.js +8 -12
  16. package/lib/commonjs/views/GestureHandler.js.map +1 -1
  17. package/lib/commonjs/views/GestureHandlerNative.js +2 -2
  18. package/lib/commonjs/views/GestureHandlerNative.js.map +1 -1
  19. package/lib/commonjs/views/{modern/Overlay.js → Overlay.js} +3 -4
  20. package/lib/commonjs/views/Overlay.js.map +1 -0
  21. package/lib/module/constants.js +1 -1
  22. package/lib/module/constants.js.map +1 -1
  23. package/lib/module/index.js.map +1 -1
  24. package/lib/module/types.js.map +1 -1
  25. package/lib/module/utils/DrawerGestureContext.js.map +1 -1
  26. package/lib/module/utils/DrawerProgressContext.js.map +1 -1
  27. package/lib/module/utils/useDrawerProgress.js.map +1 -1
  28. package/lib/module/views/Drawer.js +285 -37
  29. package/lib/module/views/Drawer.js.map +1 -1
  30. package/lib/module/views/GestureHandler.android.js.map +1 -1
  31. package/lib/module/views/GestureHandler.ios.js.map +1 -1
  32. package/lib/module/views/GestureHandler.js +3 -3
  33. package/lib/module/views/GestureHandler.js.map +1 -1
  34. package/lib/module/views/GestureHandlerNative.js.map +1 -1
  35. package/lib/module/views/Overlay.js.map +1 -0
  36. package/lib/typescript/src/constants.d.ts +1 -1
  37. package/lib/typescript/src/constants.d.ts.map +1 -1
  38. package/lib/typescript/src/types.d.ts +4 -0
  39. package/lib/typescript/src/types.d.ts.map +1 -1
  40. package/lib/typescript/src/utils/DrawerProgressContext.d.ts +1 -1
  41. package/lib/typescript/src/utils/DrawerProgressContext.d.ts.map +1 -1
  42. package/lib/typescript/src/utils/useDrawerProgress.d.ts +1 -1
  43. package/lib/typescript/src/utils/useDrawerProgress.d.ts.map +1 -1
  44. package/lib/typescript/src/views/Drawer.d.ts +2 -17
  45. package/lib/typescript/src/views/Drawer.d.ts.map +1 -1
  46. package/lib/typescript/src/views/GestureHandlerNative.d.ts +3 -2
  47. package/lib/typescript/src/views/GestureHandlerNative.d.ts.map +1 -1
  48. package/lib/typescript/src/views/Overlay.d.ts +106 -0
  49. package/lib/typescript/src/views/Overlay.d.ts.map +1 -0
  50. package/package.json +10 -10
  51. package/src/constants.tsx +1 -1
  52. package/src/types.tsx +5 -0
  53. package/src/utils/DrawerProgressContext.tsx +1 -1
  54. package/src/utils/useDrawerProgress.tsx +1 -3
  55. package/src/views/Drawer.tsx +424 -62
  56. package/src/views/GestureHandlerNative.tsx +1 -1
  57. package/lib/commonjs/views/legacy/Drawer.js +0 -452
  58. package/lib/commonjs/views/legacy/Drawer.js.map +0 -1
  59. package/lib/commonjs/views/legacy/Overlay.js +0 -73
  60. package/lib/commonjs/views/legacy/Overlay.js.map +0 -1
  61. package/lib/commonjs/views/modern/Drawer.js +0 -304
  62. package/lib/commonjs/views/modern/Drawer.js.map +0 -1
  63. package/lib/commonjs/views/modern/Overlay.js.map +0 -1
  64. package/lib/module/views/legacy/Drawer.js +0 -442
  65. package/lib/module/views/legacy/Drawer.js.map +0 -1
  66. package/lib/module/views/legacy/Overlay.js +0 -63
  67. package/lib/module/views/legacy/Overlay.js.map +0 -1
  68. package/lib/module/views/modern/Drawer.js +0 -295
  69. package/lib/module/views/modern/Drawer.js.map +0 -1
  70. package/lib/module/views/modern/Overlay.js.map +0 -1
  71. package/lib/typescript/src/views/legacy/Drawer.d.ts +0 -51
  72. package/lib/typescript/src/views/legacy/Drawer.d.ts.map +0 -1
  73. package/lib/typescript/src/views/legacy/Overlay.d.ts +0 -104
  74. package/lib/typescript/src/views/legacy/Overlay.d.ts.map +0 -1
  75. package/lib/typescript/src/views/modern/Drawer.d.ts +0 -9
  76. package/lib/typescript/src/views/modern/Drawer.d.ts.map +0 -1
  77. package/lib/typescript/src/views/modern/Overlay.d.ts +0 -104
  78. package/lib/typescript/src/views/modern/Overlay.d.ts.map +0 -1
  79. package/src/views/legacy/Drawer.tsx +0 -690
  80. package/src/views/legacy/Overlay.tsx +0 -85
  81. package/src/views/modern/Drawer.tsx +0 -441
  82. /package/lib/module/views/{modern/Overlay.js → Overlay.js} +0 -0
  83. /package/src/views/{modern/Overlay.tsx → Overlay.tsx} +0 -0
@@ -1,85 +0,0 @@
1
- import * as React from 'react';
2
- import { Platform, Pressable, StyleSheet } from 'react-native';
3
- import Animated from 'react-native-reanimated';
4
-
5
- const {
6
- // @ts-expect-error: this is to support reanimated 1
7
- interpolate: interpolateDeprecated,
8
- interpolateNode,
9
- cond,
10
- greaterThan,
11
- } = Animated;
12
-
13
- const interpolate: typeof interpolateNode =
14
- interpolateNode ?? interpolateDeprecated;
15
-
16
- const PROGRESS_EPSILON = 0.05;
17
-
18
- type Props = React.ComponentProps<typeof Animated.View> & {
19
- progress: Animated.Node<number>;
20
- onPress: () => void;
21
- accessibilityLabel?: string;
22
- };
23
-
24
- export const Overlay = React.forwardRef(function Overlay(
25
- {
26
- progress,
27
- onPress,
28
- style,
29
- accessibilityLabel = 'Close drawer',
30
- ...props
31
- }: Props,
32
- ref: React.Ref<Animated.View>
33
- ) {
34
- const animatedStyle = {
35
- opacity: interpolate(progress, {
36
- // Default input range is [PROGRESS_EPSILON, 1]
37
- // On Windows, the output value is 1 when input value is out of range for some reason
38
- // The default value 0 will be interpolated to 1 in this case, which is not what we want.
39
- // Therefore changing input range on Windows to [0,1] instead.
40
- inputRange:
41
- Platform.OS === 'windows' || Platform.OS === 'macos'
42
- ? [0, 1]
43
- : [PROGRESS_EPSILON, 1],
44
- outputRange: [0, 1],
45
- }),
46
- // We don't want the user to be able to press through the overlay when drawer is open
47
- // One approach is to adjust the pointerEvents based on the progress
48
- // But we can also send the overlay behind the screen, which works, and is much less code
49
- zIndex: cond(greaterThan(progress, PROGRESS_EPSILON), 0, -1),
50
- };
51
-
52
- return (
53
- <Animated.View
54
- {...props}
55
- ref={ref}
56
- style={[styles.overlay, overlayStyle, animatedStyle, style]}
57
- >
58
- <Pressable
59
- onPress={onPress}
60
- style={styles.pressable}
61
- accessibilityRole="button"
62
- accessibilityLabel={accessibilityLabel}
63
- />
64
- </Animated.View>
65
- );
66
- });
67
-
68
- const overlayStyle = Platform.select<Record<string, string>>({
69
- web: {
70
- // Disable touch highlight on mobile Safari.
71
- // WebkitTapHighlightColor must be used outside of StyleSheet.create because react-native-web will omit the property.
72
- WebkitTapHighlightColor: 'transparent',
73
- },
74
- default: {},
75
- });
76
-
77
- const styles = StyleSheet.create({
78
- overlay: {
79
- ...StyleSheet.absoluteFillObject,
80
- backgroundColor: 'rgba(0, 0, 0, 0.5)',
81
- },
82
- pressable: {
83
- flex: 1,
84
- },
85
- });
@@ -1,441 +0,0 @@
1
- import * as React from 'react';
2
- import {
3
- InteractionManager,
4
- Keyboard,
5
- Platform,
6
- StatusBar,
7
- StyleSheet,
8
- View,
9
- } from 'react-native';
10
- import Animated, {
11
- interpolate,
12
- runOnJS,
13
- useAnimatedGestureHandler,
14
- useAnimatedStyle,
15
- useDerivedValue,
16
- useSharedValue,
17
- withSpring,
18
- } from 'react-native-reanimated';
19
- import useLatestCallback from 'use-latest-callback';
20
-
21
- import {
22
- DEFAULT_DRAWER_WIDTH,
23
- SWIPE_MIN_DISTANCE,
24
- SWIPE_MIN_OFFSET,
25
- SWIPE_MIN_VELOCITY,
26
- } from '../../constants';
27
- import type { DrawerProps } from '../../types';
28
- import { DrawerProgressContext } from '../../utils/DrawerProgressContext';
29
- import {
30
- GestureState,
31
- PanGestureHandler,
32
- PanGestureHandlerGestureEvent,
33
- } from '../GestureHandler';
34
- import { Overlay } from './Overlay';
35
-
36
- const minmax = (value: number, start: number, end: number) => {
37
- 'worklet';
38
-
39
- return Math.min(Math.max(value, start), end);
40
- };
41
-
42
- type Props = DrawerProps & {
43
- layout: { width: number };
44
- };
45
-
46
- export function Drawer({
47
- layout,
48
- drawerPosition,
49
- drawerStyle,
50
- drawerType,
51
- gestureHandlerProps,
52
- hideStatusBarOnOpen,
53
- keyboardDismissMode,
54
- onClose,
55
- onOpen,
56
- onGestureStart,
57
- onGestureCancel,
58
- onGestureEnd,
59
- onTransitionStart,
60
- onTransitionEnd,
61
- open,
62
- overlayStyle,
63
- overlayAccessibilityLabel,
64
- statusBarAnimation,
65
- swipeEnabled,
66
- swipeEdgeWidth,
67
- swipeMinDistance = SWIPE_MIN_DISTANCE,
68
- swipeMinVelocity = SWIPE_MIN_VELOCITY,
69
- renderDrawerContent,
70
- children,
71
- }: Props) {
72
- const getDrawerWidth = (): number => {
73
- const { width = DEFAULT_DRAWER_WIDTH } =
74
- StyleSheet.flatten(drawerStyle) || {};
75
-
76
- if (typeof width === 'string' && width.endsWith('%')) {
77
- // Try to calculate width if a percentage is given
78
- const percentage = Number(width.replace(/%$/, ''));
79
-
80
- if (Number.isFinite(percentage)) {
81
- return layout.width * (percentage / 100);
82
- }
83
- }
84
-
85
- return typeof width === 'number' ? width : 0;
86
- };
87
-
88
- const drawerWidth = getDrawerWidth();
89
-
90
- const isOpen = drawerType === 'permanent' ? true : open;
91
- const isRight = drawerPosition === 'right';
92
-
93
- const getDrawerTranslationX = React.useCallback(
94
- (open: boolean) => {
95
- 'worklet';
96
-
97
- if (drawerPosition === 'left') {
98
- return open ? 0 : -drawerWidth;
99
- }
100
-
101
- return open ? 0 : drawerWidth;
102
- },
103
- [drawerPosition, drawerWidth]
104
- );
105
-
106
- const hideStatusBar = React.useCallback(
107
- (hide: boolean) => {
108
- if (hideStatusBarOnOpen) {
109
- StatusBar.setHidden(hide, statusBarAnimation);
110
- }
111
- },
112
- [hideStatusBarOnOpen, statusBarAnimation]
113
- );
114
-
115
- React.useEffect(() => {
116
- hideStatusBar(isOpen);
117
-
118
- return () => hideStatusBar(false);
119
- }, [isOpen, hideStatusBarOnOpen, statusBarAnimation, hideStatusBar]);
120
-
121
- const interactionHandleRef = React.useRef<number | null>(null);
122
-
123
- const startInteraction = () => {
124
- interactionHandleRef.current = InteractionManager.createInteractionHandle();
125
- };
126
-
127
- const endInteraction = () => {
128
- if (interactionHandleRef.current != null) {
129
- InteractionManager.clearInteractionHandle(interactionHandleRef.current);
130
- interactionHandleRef.current = null;
131
- }
132
- };
133
-
134
- const hideKeyboard = () => {
135
- if (keyboardDismissMode === 'on-drag') {
136
- Keyboard.dismiss();
137
- }
138
- };
139
-
140
- const onGestureBegin = () => {
141
- onGestureStart?.();
142
- startInteraction();
143
- hideKeyboard();
144
- hideStatusBar(true);
145
- };
146
-
147
- const onGestureFinish = () => {
148
- onGestureEnd?.();
149
- endInteraction();
150
- };
151
-
152
- // FIXME: Currently hitSlop is broken when on Android when drawer is on right
153
- // https://github.com/software-mansion/react-native-gesture-handler/issues/569
154
- const hitSlop = isRight
155
- ? // Extend hitSlop to the side of the screen when drawer is closed
156
- // This lets the user drag the drawer from the side of the screen
157
- { right: 0, width: isOpen ? undefined : swipeEdgeWidth }
158
- : { left: 0, width: isOpen ? undefined : swipeEdgeWidth };
159
-
160
- const touchStartX = useSharedValue(0);
161
- const touchX = useSharedValue(0);
162
- const translationX = useSharedValue(getDrawerTranslationX(open));
163
- const gestureState = useSharedValue<GestureState>(GestureState.UNDETERMINED);
164
-
165
- const handleAnimationStart = useLatestCallback((open: boolean) => {
166
- onTransitionStart?.(!open);
167
- });
168
-
169
- const handleAnimationEnd = useLatestCallback(
170
- (open: boolean, finished?: boolean) => {
171
- if (!finished) return;
172
- onTransitionEnd?.(!open);
173
- }
174
- );
175
-
176
- const toggleDrawer = React.useCallback(
177
- (open: boolean, velocity?: number) => {
178
- 'worklet';
179
-
180
- const translateX = getDrawerTranslationX(open);
181
-
182
- if (velocity === undefined) {
183
- runOnJS(handleAnimationStart)(open);
184
- }
185
-
186
- touchStartX.value = 0;
187
- touchX.value = 0;
188
- translationX.value = withSpring(
189
- translateX,
190
- {
191
- velocity,
192
- stiffness: 1000,
193
- damping: 500,
194
- mass: 3,
195
- overshootClamping: true,
196
- restDisplacementThreshold: 0.01,
197
- restSpeedThreshold: 0.01,
198
- },
199
- (finished) => runOnJS(handleAnimationEnd)(open, finished)
200
- );
201
-
202
- if (open) {
203
- runOnJS(onOpen)();
204
- } else {
205
- runOnJS(onClose)();
206
- }
207
- },
208
- [
209
- getDrawerTranslationX,
210
- handleAnimationEnd,
211
- handleAnimationStart,
212
- onClose,
213
- onOpen,
214
- touchStartX,
215
- touchX,
216
- translationX,
217
- ]
218
- );
219
-
220
- React.useEffect(() => toggleDrawer(open), [open, toggleDrawer]);
221
-
222
- const onGestureEvent = useAnimatedGestureHandler<
223
- PanGestureHandlerGestureEvent,
224
- { startX: number; hasCalledOnStart: boolean }
225
- >({
226
- onStart: (event, ctx) => {
227
- ctx.hasCalledOnStart = false;
228
- ctx.startX = translationX.value;
229
- gestureState.value = event.state;
230
- touchStartX.value = event.x;
231
- },
232
- onCancel: () => {
233
- runOnJS(() => onGestureCancel?.())();
234
- },
235
- onActive: (event, ctx) => {
236
- touchX.value = event.x;
237
- translationX.value = ctx.startX + event.translationX;
238
- gestureState.value = event.state;
239
-
240
- // onStart will _always_ be called, even when the activation
241
- // criteria isn't met yet. This makes sure onGestureBegin is only
242
- // called when the criteria is really met.
243
- if (!ctx.hasCalledOnStart) {
244
- ctx.hasCalledOnStart = true;
245
- runOnJS(onGestureBegin)();
246
- }
247
- },
248
- onEnd: (event) => {
249
- gestureState.value = event.state;
250
-
251
- const nextOpen =
252
- (Math.abs(event.translationX) > SWIPE_MIN_OFFSET &&
253
- Math.abs(event.translationX) > swipeMinVelocity) ||
254
- Math.abs(event.translationX) > swipeMinDistance
255
- ? drawerPosition === 'left'
256
- ? // If swiped to right, open the drawer, otherwise close it
257
- (event.velocityX === 0 ? event.translationX : event.velocityX) > 0
258
- : // If swiped to left, open the drawer, otherwise close it
259
- (event.velocityX === 0 ? event.translationX : event.velocityX) < 0
260
- : open;
261
-
262
- toggleDrawer(nextOpen, event.velocityX);
263
- },
264
- onFinish: () => {
265
- runOnJS(onGestureFinish)();
266
- },
267
- });
268
-
269
- const translateX = useDerivedValue(() => {
270
- // Comment stolen from react-native-gesture-handler/DrawerLayout
271
- //
272
- // While closing the drawer when user starts gesture outside of its area (in greyed
273
- // out part of the window), we want the drawer to follow only once finger reaches the
274
- // edge of the drawer.
275
- // E.g. on the diagram below drawer is illustrate by X signs and the greyed out area by
276
- // dots. The touch gesture starts at '*' and moves left, touch path is indicated by
277
- // an arrow pointing left
278
- // 1) +---------------+ 2) +---------------+ 3) +---------------+ 4) +---------------+
279
- // |XXXXXXXX|......| |XXXXXXXX|......| |XXXXXXXX|......| |XXXXX|.........|
280
- // |XXXXXXXX|......| |XXXXXXXX|......| |XXXXXXXX|......| |XXXXX|.........|
281
- // |XXXXXXXX|......| |XXXXXXXX|......| |XXXXXXXX|......| |XXXXX|.........|
282
- // |XXXXXXXX|......| |XXXXXXXX|.<-*..| |XXXXXXXX|<--*..| |XXXXX|<-----*..|
283
- // |XXXXXXXX|......| |XXXXXXXX|......| |XXXXXXXX|......| |XXXXX|.........|
284
- // |XXXXXXXX|......| |XXXXXXXX|......| |XXXXXXXX|......| |XXXXX|.........|
285
- // |XXXXXXXX|......| |XXXXXXXX|......| |XXXXXXXX|......| |XXXXX|.........|
286
- // +---------------+ +---------------+ +---------------+ +---------------+
287
- //
288
- // For the above to work properly we define animated value that will keep start position
289
- // of the gesture. Then we use that value to calculate how much we need to subtract from
290
- // the translationX. If the gesture started on the greyed out area we take the distance from the
291
- // edge of the drawer to the start position. Otherwise we don't subtract at all and the
292
- // drawer be pulled back as soon as you start the pan.
293
- //
294
- // This is used only when drawerType is "front"
295
- const touchDistance =
296
- drawerType === 'front' && gestureState.value === GestureState.ACTIVE
297
- ? minmax(
298
- drawerPosition === 'left'
299
- ? touchStartX.value - drawerWidth
300
- : layout.width - drawerWidth - touchStartX.value,
301
- 0,
302
- layout.width
303
- )
304
- : 0;
305
-
306
- const translateX =
307
- drawerPosition === 'left'
308
- ? minmax(translationX.value + touchDistance, -drawerWidth, 0)
309
- : minmax(translationX.value - touchDistance, 0, drawerWidth);
310
-
311
- return translateX;
312
- });
313
-
314
- const drawerAnimatedStyle = useAnimatedStyle(() => {
315
- return {
316
- transform:
317
- drawerType === 'permanent'
318
- ? // Reanimated needs the property to be present, but it results in Browser bug
319
- // https://bugs.chromium.org/p/chromium/issues/detail?id=20574
320
- []
321
- : [
322
- {
323
- translateX:
324
- // The drawer stays in place when `drawerType` is `back`
325
- drawerType === 'back' ? 0 : translateX.value,
326
- },
327
- ],
328
- };
329
- });
330
-
331
- const contentAnimatedStyle = useAnimatedStyle(() => {
332
- return {
333
- transform:
334
- drawerType === 'permanent'
335
- ? // Reanimated needs the property to be present, but it results in Browser bug
336
- // https://bugs.chromium.org/p/chromium/issues/detail?id=20574
337
- []
338
- : [
339
- {
340
- translateX:
341
- // The screen content stays in place when `drawerType` is `front`
342
- drawerType === 'front'
343
- ? 0
344
- : translateX.value +
345
- drawerWidth * (drawerPosition === 'left' ? 1 : -1),
346
- },
347
- ],
348
- };
349
- });
350
-
351
- const progress = useDerivedValue(() => {
352
- return drawerType === 'permanent'
353
- ? 1
354
- : interpolate(
355
- translateX.value,
356
- [getDrawerTranslationX(false), getDrawerTranslationX(true)],
357
- [0, 1]
358
- );
359
- });
360
-
361
- return (
362
- <DrawerProgressContext.Provider value={progress}>
363
- <PanGestureHandler
364
- activeOffsetX={[-SWIPE_MIN_OFFSET, SWIPE_MIN_OFFSET]}
365
- failOffsetY={[-SWIPE_MIN_OFFSET, SWIPE_MIN_OFFSET]}
366
- hitSlop={hitSlop}
367
- enabled={drawerType !== 'permanent' && swipeEnabled}
368
- onGestureEvent={onGestureEvent}
369
- {...gestureHandlerProps}
370
- >
371
- {/* Immediate child of gesture handler needs to be an Animated.View */}
372
- <Animated.View
373
- style={[
374
- styles.main,
375
- {
376
- flexDirection:
377
- drawerType === 'permanent' && !isRight ? 'row-reverse' : 'row',
378
- },
379
- ]}
380
- >
381
- <Animated.View style={[styles.content, contentAnimatedStyle]}>
382
- <View
383
- accessibilityElementsHidden={isOpen && drawerType !== 'permanent'}
384
- importantForAccessibility={
385
- isOpen && drawerType !== 'permanent'
386
- ? 'no-hide-descendants'
387
- : 'auto'
388
- }
389
- style={styles.content}
390
- >
391
- {children}
392
- </View>
393
- {drawerType !== 'permanent' ? (
394
- <Overlay
395
- progress={progress}
396
- onPress={() => toggleDrawer(false)}
397
- style={overlayStyle}
398
- accessibilityLabel={overlayAccessibilityLabel}
399
- />
400
- ) : null}
401
- </Animated.View>
402
- <Animated.View
403
- removeClippedSubviews={Platform.OS !== 'ios'}
404
- style={[
405
- styles.container,
406
- {
407
- position: drawerType === 'permanent' ? 'relative' : 'absolute',
408
- zIndex: drawerType === 'back' ? -1 : 0,
409
- },
410
- drawerAnimatedStyle,
411
- drawerStyle as any,
412
- ]}
413
- >
414
- {renderDrawerContent()}
415
- </Animated.View>
416
- </Animated.View>
417
- </PanGestureHandler>
418
- </DrawerProgressContext.Provider>
419
- );
420
- }
421
-
422
- const styles = StyleSheet.create({
423
- container: {
424
- top: 0,
425
- bottom: 0,
426
- maxWidth: '100%',
427
- width: DEFAULT_DRAWER_WIDTH,
428
- },
429
- content: {
430
- flex: 1,
431
- },
432
- main: {
433
- flex: 1,
434
- ...Platform.select({
435
- // FIXME: We need to hide `overflowX` on Web so the translated content doesn't show offscreen.
436
- // But adding `overflowX: 'hidden'` prevents content from collapsing the URL bar.
437
- web: null,
438
- default: { overflow: 'hidden' },
439
- }),
440
- },
441
- });
File without changes