react-native-screen-transitions 4.0.0-alpha.8 → 4.0.0-alpha.9
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.
- package/README.md +1 -1
- package/lib/commonjs/components/boundary/create-boundary-component.js +5 -1
- package/lib/commonjs/components/boundary/create-boundary-component.js.map +1 -1
- package/lib/commonjs/components/boundary/portal/teleport.js +1 -13
- package/lib/commonjs/components/boundary/portal/teleport.js.map +1 -1
- package/lib/commonjs/constants.js +2 -1
- package/lib/commonjs/constants.js.map +1 -1
- package/lib/commonjs/providers/screen/animation/helpers/build-screen-transition-options.js +1 -0
- package/lib/commonjs/providers/screen/animation/helpers/build-screen-transition-options.js.map +1 -1
- package/lib/commonjs/providers/screen/animation/helpers/hydrate-transition-state/gesture-progress.js +20 -5
- package/lib/commonjs/providers/screen/animation/helpers/hydrate-transition-state/gesture-progress.js.map +1 -1
- package/lib/commonjs/providers/screen/animation/helpers/hydrate-transition-state/index.js +16 -1
- package/lib/commonjs/providers/screen/animation/helpers/hydrate-transition-state/index.js.map +1 -1
- package/lib/commonjs/providers/screen/animation/helpers/selected-interpolator-options.js +1 -1
- package/lib/commonjs/providers/screen/animation/helpers/selected-interpolator-options.js.map +1 -1
- package/lib/commonjs/providers/screen/gestures/pan/behavior/pan-release.js +28 -6
- package/lib/commonjs/providers/screen/gestures/pan/behavior/pan-release.js.map +1 -1
- package/lib/commonjs/providers/screen/gestures/pinch/behavior/pinch-release.js +26 -6
- package/lib/commonjs/providers/screen/gestures/pinch/behavior/pinch-release.js.map +1 -1
- package/lib/commonjs/providers/screen/gestures/shared/policy.js +1 -0
- package/lib/commonjs/providers/screen/gestures/shared/policy.js.map +1 -1
- package/lib/commonjs/providers/screen/gestures/shared/snap-points.js +71 -1
- package/lib/commonjs/providers/screen/gestures/shared/snap-points.js.map +1 -1
- package/lib/commonjs/providers/screen/options/helpers.js +8 -1
- package/lib/commonjs/providers/screen/options/helpers.js.map +1 -1
- package/lib/commonjs/providers/screen/styles/constants.js +0 -1
- package/lib/commonjs/providers/screen/styles/constants.js.map +1 -1
- package/lib/commonjs/providers/screen/styles/slot.provider.js.map +1 -1
- package/lib/module/components/boundary/create-boundary-component.js +6 -2
- package/lib/module/components/boundary/create-boundary-component.js.map +1 -1
- package/lib/module/components/boundary/portal/teleport.js +1 -14
- package/lib/module/components/boundary/portal/teleport.js.map +1 -1
- package/lib/module/constants.js +1 -0
- package/lib/module/constants.js.map +1 -1
- package/lib/module/providers/screen/animation/helpers/build-screen-transition-options.js +1 -0
- package/lib/module/providers/screen/animation/helpers/build-screen-transition-options.js.map +1 -1
- package/lib/module/providers/screen/animation/helpers/hydrate-transition-state/gesture-progress.js +20 -5
- package/lib/module/providers/screen/animation/helpers/hydrate-transition-state/gesture-progress.js.map +1 -1
- package/lib/module/providers/screen/animation/helpers/hydrate-transition-state/index.js +16 -1
- package/lib/module/providers/screen/animation/helpers/hydrate-transition-state/index.js.map +1 -1
- package/lib/module/providers/screen/animation/helpers/selected-interpolator-options.js +1 -1
- package/lib/module/providers/screen/animation/helpers/selected-interpolator-options.js.map +1 -1
- package/lib/module/providers/screen/gestures/pan/behavior/pan-release.js +29 -7
- package/lib/module/providers/screen/gestures/pan/behavior/pan-release.js.map +1 -1
- package/lib/module/providers/screen/gestures/pinch/behavior/pinch-release.js +27 -7
- package/lib/module/providers/screen/gestures/pinch/behavior/pinch-release.js.map +1 -1
- package/lib/module/providers/screen/gestures/shared/policy.js +2 -1
- package/lib/module/providers/screen/gestures/shared/policy.js.map +1 -1
- package/lib/module/providers/screen/gestures/shared/snap-points.js +66 -0
- package/lib/module/providers/screen/gestures/shared/snap-points.js.map +1 -1
- package/lib/module/providers/screen/options/helpers.js +9 -2
- package/lib/module/providers/screen/options/helpers.js.map +1 -1
- package/lib/module/providers/screen/styles/constants.js +0 -1
- package/lib/module/providers/screen/styles/constants.js.map +1 -1
- package/lib/module/providers/screen/styles/slot.provider.js.map +1 -1
- package/lib/module/types/animation.types.js.map +1 -1
- package/lib/typescript/components/boundary/create-boundary-component.d.ts.map +1 -1
- package/lib/typescript/components/boundary/portal/teleport.d.ts +1 -1
- package/lib/typescript/components/boundary/portal/teleport.d.ts.map +1 -1
- package/lib/typescript/constants.d.ts +2 -1
- package/lib/typescript/constants.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +1 -1
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/providers/screen/animation/helpers/build-screen-transition-options.d.ts.map +1 -1
- package/lib/typescript/providers/screen/animation/helpers/hydrate-transition-state/gesture-progress.d.ts +2 -1
- package/lib/typescript/providers/screen/animation/helpers/hydrate-transition-state/gesture-progress.d.ts.map +1 -1
- package/lib/typescript/providers/screen/animation/helpers/hydrate-transition-state/index.d.ts.map +1 -1
- package/lib/typescript/providers/screen/animation/helpers/selected-interpolator-options.d.ts.map +1 -1
- package/lib/typescript/providers/screen/gestures/pan/behavior/pan-release.d.ts.map +1 -1
- package/lib/typescript/providers/screen/gestures/pinch/behavior/pinch-release.d.ts.map +1 -1
- package/lib/typescript/providers/screen/gestures/shared/policy.d.ts +2 -1
- package/lib/typescript/providers/screen/gestures/shared/policy.d.ts.map +1 -1
- package/lib/typescript/providers/screen/gestures/shared/snap-points.d.ts +11 -0
- package/lib/typescript/providers/screen/gestures/shared/snap-points.d.ts.map +1 -1
- package/lib/typescript/providers/screen/gestures/types.d.ts +2 -0
- package/lib/typescript/providers/screen/gestures/types.d.ts.map +1 -1
- package/lib/typescript/providers/screen/options/helpers.d.ts.map +1 -1
- package/lib/typescript/providers/screen/options/types.d.ts +1 -0
- package/lib/typescript/providers/screen/options/types.d.ts.map +1 -1
- package/lib/typescript/providers/screen/styles/constants.d.ts.map +1 -1
- package/lib/typescript/providers/screen/styles/slot.provider.d.ts +1 -1
- package/lib/typescript/providers/screen/styles/slot.provider.d.ts.map +1 -1
- package/lib/typescript/types/animation.types.d.ts +1 -5
- package/lib/typescript/types/animation.types.d.ts.map +1 -1
- package/lib/typescript/types/index.d.ts +1 -1
- package/lib/typescript/types/index.d.ts.map +1 -1
- package/lib/typescript/types/screen.types.d.ts +19 -0
- package/lib/typescript/types/screen.types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/boundary/create-boundary-component.tsx +10 -2
- package/src/components/boundary/portal/teleport.ts +2 -23
- package/src/constants.ts +2 -0
- package/src/index.ts +1 -0
- package/src/providers/screen/animation/helpers/build-screen-transition-options.ts +1 -0
- package/src/providers/screen/animation/helpers/hydrate-transition-state/gesture-progress.ts +26 -0
- package/src/providers/screen/animation/helpers/hydrate-transition-state/index.ts +20 -0
- package/src/providers/screen/animation/helpers/selected-interpolator-options.ts +1 -0
- package/src/providers/screen/gestures/pan/behavior/pan-release.ts +46 -7
- package/src/providers/screen/gestures/pinch/behavior/pinch-release.ts +45 -4
- package/src/providers/screen/gestures/shared/policy.ts +4 -0
- package/src/providers/screen/gestures/shared/snap-points.ts +87 -0
- package/src/providers/screen/gestures/types.ts +2 -0
- package/src/providers/screen/options/helpers.ts +18 -0
- package/src/providers/screen/options/types.ts +1 -0
- package/src/providers/screen/styles/constants.ts +0 -1
- package/src/providers/screen/styles/slot.provider.tsx +0 -1
- package/src/types/animation.types.ts +1 -4
- package/src/types/index.ts +1 -0
- package/src/types/screen.types.ts +21 -0
|
@@ -10,7 +10,10 @@ import {
|
|
|
10
10
|
BOUNDARY_TARGET_ACTIVE_PROP,
|
|
11
11
|
BoundaryTarget,
|
|
12
12
|
} from "./components/boundary-target";
|
|
13
|
-
import {
|
|
13
|
+
import {
|
|
14
|
+
BoundaryContentPortal,
|
|
15
|
+
BoundaryContentPortalHost,
|
|
16
|
+
} from "./portal/components/boundary-content-portal";
|
|
14
17
|
import { BoundaryPortal } from "./portal/components/boundary-portal";
|
|
15
18
|
import { BoundaryRootProvider } from "./providers/boundary-root.provider";
|
|
16
19
|
import type { BoundaryComponentProps } from "./types";
|
|
@@ -91,7 +94,12 @@ export function createBoundaryComponent<P extends object>(
|
|
|
91
94
|
enabled={root.shouldRenderHandoffHost}
|
|
92
95
|
screenKey={root.currentScreenKey}
|
|
93
96
|
>
|
|
94
|
-
|
|
97
|
+
<BoundaryContentPortal
|
|
98
|
+
boundaryId={root.boundTag.tag}
|
|
99
|
+
enabled={root.shouldRenderHandoffHost}
|
|
100
|
+
>
|
|
101
|
+
{targetResolution.children}
|
|
102
|
+
</BoundaryContentPortal>
|
|
95
103
|
</BoundaryContentPortalHost>
|
|
96
104
|
</AnimatedComponent>
|
|
97
105
|
</BoundaryPortal>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { ComponentType, ReactNode } from "react";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* `react-native-teleport` is an optional peer dependency. The require sits in a
|
|
@@ -9,33 +9,12 @@ import { type ComponentType, createElement, type ReactNode } from "react";
|
|
|
9
9
|
* inline rendering; everything else keeps working.
|
|
10
10
|
*/
|
|
11
11
|
let mod: any = null;
|
|
12
|
-
let managerMod: any = null;
|
|
13
|
-
let providerViewMod: any = null;
|
|
14
12
|
try {
|
|
15
13
|
mod = require("react-native-teleport");
|
|
16
|
-
managerMod = require("react-native-teleport/lib/module/contexts/PortalManager");
|
|
17
|
-
providerViewMod = require("react-native-teleport/lib/module/views/PortalProvider");
|
|
18
14
|
} catch {}
|
|
19
15
|
|
|
20
|
-
const NativePortalProviderView: ComponentType<{ children: ReactNode }> | null =
|
|
21
|
-
providerViewMod?.default ?? null;
|
|
22
|
-
const PortalManagerProvider: ComponentType<{ children: ReactNode }> | null =
|
|
23
|
-
managerMod?.PortalManagerProvider ?? null;
|
|
24
|
-
|
|
25
16
|
const SafeNativePortalProvider: ComponentType<{ children: ReactNode }> | null =
|
|
26
|
-
|
|
27
|
-
? ({ children }: { children: ReactNode }) => {
|
|
28
|
-
const managedChildren = createElement(
|
|
29
|
-
PortalManagerProvider,
|
|
30
|
-
null,
|
|
31
|
-
children,
|
|
32
|
-
);
|
|
33
|
-
|
|
34
|
-
return NativePortalProviderView
|
|
35
|
-
? createElement(NativePortalProviderView, null, managedChildren)
|
|
36
|
-
: managedChildren;
|
|
37
|
-
}
|
|
38
|
-
: null;
|
|
17
|
+
mod?.PortalProvider ?? null;
|
|
39
18
|
|
|
40
19
|
export const isTeleportAvailable =
|
|
41
20
|
mod !== null && SafeNativePortalProvider !== null;
|
package/src/constants.ts
CHANGED
|
@@ -10,6 +10,7 @@ import type {
|
|
|
10
10
|
GestureTracking,
|
|
11
11
|
Layout,
|
|
12
12
|
SheetScrollGestureBehavior,
|
|
13
|
+
SheetSnapBehavior,
|
|
13
14
|
} from "./types/screen.types";
|
|
14
15
|
import type { BaseStackRoute } from "./types/stack.types";
|
|
15
16
|
|
|
@@ -167,6 +168,7 @@ export const DEFAULT_GESTURE_RELEASE_VELOCITY_SCALE = 1;
|
|
|
167
168
|
export const DEFAULT_GESTURE_DIRECTION = "horizontal";
|
|
168
169
|
export const DEFAULT_GESTURE_TRACKING: GestureTracking = "auto";
|
|
169
170
|
export const DEFAULT_GESTURE_SNAP_LOCKED = false;
|
|
171
|
+
export const DEFAULT_SHEET_SNAP_BEHAVIOR: SheetSnapBehavior = "continuous";
|
|
170
172
|
export const DEFAULT_GESTURE_ACTIVATION_AREA: ActivationArea = "screen";
|
|
171
173
|
export const DEFAULT_SHEET_SCROLL_GESTURE_BEHAVIOR: SheetScrollGestureBehavior =
|
|
172
174
|
"expand-and-collapse";
|
package/src/index.ts
CHANGED
|
@@ -17,6 +17,7 @@ export const buildScreenTransitionOptions = (
|
|
|
17
17
|
gestureSnapVelocityImpact: options.gestureSnapVelocityImpact,
|
|
18
18
|
gestureReleaseVelocityScale: options.gestureReleaseVelocityScale,
|
|
19
19
|
gestureSnapLocked: options.gestureSnapLocked,
|
|
20
|
+
sheetSnapBehavior: options.sheetSnapBehavior,
|
|
20
21
|
sheetScrollGestureBehavior:
|
|
21
22
|
options.sheetScrollGestureBehavior !== undefined
|
|
22
23
|
? resolveSheetScrollGestureBehavior(options)
|
|
@@ -4,6 +4,7 @@ import type {
|
|
|
4
4
|
GestureDirectionOption,
|
|
5
5
|
GestureValues,
|
|
6
6
|
} from "../../../../../types/gesture.types";
|
|
7
|
+
import type { SheetSnapBehavior } from "../../../../../types/screen.types";
|
|
7
8
|
import {
|
|
8
9
|
getPanActivationDirections,
|
|
9
10
|
getPanSnapAxisConfigForDirection,
|
|
@@ -12,6 +13,7 @@ import {
|
|
|
12
13
|
getSnapPinchDirectionConfig,
|
|
13
14
|
isResolvedPanGestureDirection,
|
|
14
15
|
} from "../../../gestures/shared/directions";
|
|
16
|
+
import { resolveStepSnapProgress } from "../../../gestures/shared/snap-points";
|
|
15
17
|
import type { SnapBounds } from "./types";
|
|
16
18
|
|
|
17
19
|
type PanProgressDelta = {
|
|
@@ -26,6 +28,8 @@ const resolvePanGestureAffectedProgress = (
|
|
|
26
28
|
gestureDirection: GestureDirectionOption,
|
|
27
29
|
hasSnapPoints: boolean,
|
|
28
30
|
snapBounds: SnapBounds | null,
|
|
31
|
+
snapPoints: number[],
|
|
32
|
+
sheetSnapBehavior: SheetSnapBehavior,
|
|
29
33
|
) => {
|
|
30
34
|
"worklet";
|
|
31
35
|
|
|
@@ -46,6 +50,13 @@ const resolvePanGestureAffectedProgress = (
|
|
|
46
50
|
const axisValue =
|
|
47
51
|
activeAxis.axis === "horizontal" ? progressDelta.x : progressDelta.y;
|
|
48
52
|
const signedProgressDelta = activeAxis.config.progressSign * axisValue;
|
|
53
|
+
if (sheetSnapBehavior === "step") {
|
|
54
|
+
return resolveStepSnapProgress({
|
|
55
|
+
baseline: transitionProgress,
|
|
56
|
+
normalizedDelta: signedProgressDelta,
|
|
57
|
+
snapPoints,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
49
60
|
|
|
50
61
|
return clamp(
|
|
51
62
|
transitionProgress + signedProgressDelta,
|
|
@@ -85,6 +96,8 @@ const resolvePinchGestureAffectedProgress = (
|
|
|
85
96
|
gestureDirection: GestureDirectionOption,
|
|
86
97
|
hasSnapPoints: boolean,
|
|
87
98
|
snapBounds: SnapBounds | null,
|
|
99
|
+
snapPoints: number[],
|
|
100
|
+
sheetSnapBehavior: SheetSnapBehavior,
|
|
88
101
|
) => {
|
|
89
102
|
"worklet";
|
|
90
103
|
const pinchDirection =
|
|
@@ -108,6 +121,13 @@ const resolvePinchGestureAffectedProgress = (
|
|
|
108
121
|
snapDirections.collapse === pinchDirection
|
|
109
122
|
? -Math.abs(gesture.normScale)
|
|
110
123
|
: Math.abs(gesture.normScale);
|
|
124
|
+
if (sheetSnapBehavior === "step") {
|
|
125
|
+
return resolveStepSnapProgress({
|
|
126
|
+
baseline: transitionProgress,
|
|
127
|
+
normalizedDelta: progressDelta,
|
|
128
|
+
snapPoints,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
111
131
|
|
|
112
132
|
return clamp(
|
|
113
133
|
transitionProgress + progressDelta,
|
|
@@ -134,6 +154,8 @@ export const resolveGestureAffectedProgress = (
|
|
|
134
154
|
panProgressDelta: PanProgressDelta,
|
|
135
155
|
gestureDirection: GestureDirectionOption | undefined,
|
|
136
156
|
snapBounds: SnapBounds | null,
|
|
157
|
+
snapPoints: number[] = [],
|
|
158
|
+
sheetSnapBehavior: SheetSnapBehavior = "continuous",
|
|
137
159
|
) => {
|
|
138
160
|
"worklet";
|
|
139
161
|
const resolvedGestureDirection =
|
|
@@ -152,6 +174,8 @@ export const resolveGestureAffectedProgress = (
|
|
|
152
174
|
resolvedGestureDirection,
|
|
153
175
|
hasSnapPoints,
|
|
154
176
|
snapBounds,
|
|
177
|
+
snapPoints,
|
|
178
|
+
sheetSnapBehavior,
|
|
155
179
|
);
|
|
156
180
|
}
|
|
157
181
|
|
|
@@ -162,5 +186,7 @@ export const resolveGestureAffectedProgress = (
|
|
|
162
186
|
resolvedGestureDirection,
|
|
163
187
|
hasSnapPoints,
|
|
164
188
|
snapBounds,
|
|
189
|
+
snapPoints,
|
|
190
|
+
sheetSnapBehavior,
|
|
165
191
|
);
|
|
166
192
|
};
|
|
@@ -35,6 +35,8 @@ const mergeTransitionOptions = (
|
|
|
35
35
|
effective.gestureReleaseVelocityScale ?? base.gestureReleaseVelocityScale;
|
|
36
36
|
slot.gestureSnapLocked =
|
|
37
37
|
effective.gestureSnapLocked ?? base.gestureSnapLocked;
|
|
38
|
+
slot.sheetSnapBehavior =
|
|
39
|
+
effective.sheetSnapBehavior ?? base.sheetSnapBehavior;
|
|
38
40
|
slot.sheetScrollGestureBehavior =
|
|
39
41
|
effective.sheetScrollGestureBehavior ?? base.sheetScrollGestureBehavior;
|
|
40
42
|
slot.backdropBehavior = effective.backdropBehavior ?? base.backdropBehavior;
|
|
@@ -56,6 +58,22 @@ export const hydrateTransitionState = (
|
|
|
56
58
|
s.optionsSlot,
|
|
57
59
|
);
|
|
58
60
|
const canDismiss = options.gestureEnabled !== false;
|
|
61
|
+
const resolvedSnapPoints = [...s.sortedNumericSnapPoints];
|
|
62
|
+
const resolvedAutoSnapPoint = s.hasAutoSnapPoint
|
|
63
|
+
? s.resolvedAutoSnapPoint.get()
|
|
64
|
+
: null;
|
|
65
|
+
if (resolvedAutoSnapPoint !== null) {
|
|
66
|
+
resolvedSnapPoints.push(resolvedAutoSnapPoint);
|
|
67
|
+
}
|
|
68
|
+
if (canDismiss) {
|
|
69
|
+
resolvedSnapPoints.push(0);
|
|
70
|
+
}
|
|
71
|
+
resolvedSnapPoints.sort((a, b) => a - b);
|
|
72
|
+
for (let index = resolvedSnapPoints.length - 1; index > 0; index--) {
|
|
73
|
+
if (resolvedSnapPoints[index] === resolvedSnapPoints[index - 1]) {
|
|
74
|
+
resolvedSnapPoints.splice(index, 1);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
59
77
|
out.transitionProgress = transitionProgress;
|
|
60
78
|
out.willAnimate = s.willAnimate.get();
|
|
61
79
|
out.closing = s.closing.get();
|
|
@@ -159,6 +177,8 @@ export const hydrateTransitionState = (
|
|
|
159
177
|
s.hasAutoSnapPoint ? s.resolvedAutoSnapPoint.get() : null,
|
|
160
178
|
canDismiss,
|
|
161
179
|
),
|
|
180
|
+
resolvedSnapPoints,
|
|
181
|
+
options.sheetSnapBehavior,
|
|
162
182
|
);
|
|
163
183
|
|
|
164
184
|
if (s.visualProgress.get() !== out.progress) {
|
|
@@ -65,6 +65,7 @@ const areInterpolatorOptionsEqual = (
|
|
|
65
65
|
left.gestureSnapVelocityImpact === right.gestureSnapVelocityImpact &&
|
|
66
66
|
left.gestureReleaseVelocityScale === right.gestureReleaseVelocityScale &&
|
|
67
67
|
left.gestureSnapLocked === right.gestureSnapLocked &&
|
|
68
|
+
left.sheetSnapBehavior === right.sheetSnapBehavior &&
|
|
68
69
|
left.sheetScrollGestureBehavior === right.sheetScrollGestureBehavior &&
|
|
69
70
|
left.backdropBehavior === right.backdropBehavior
|
|
70
71
|
);
|
|
@@ -13,8 +13,12 @@ import {
|
|
|
13
13
|
resolveGestureSnapTransitionSpec,
|
|
14
14
|
} from "../../shared/release";
|
|
15
15
|
import {
|
|
16
|
+
getStepSnapProgressVelocityScale,
|
|
16
17
|
primeRuntimeSnapPoint,
|
|
17
18
|
resolveRuntimeGestureSnapPoints,
|
|
19
|
+
resolveRuntimeGestureSnapTargets,
|
|
20
|
+
resolveStepSnapProgress,
|
|
21
|
+
resolveStepSnapTargets,
|
|
18
22
|
} from "../../shared/snap-points";
|
|
19
23
|
import { determineDismissal, determineSnapTarget } from "../../shared/targets";
|
|
20
24
|
import type {
|
|
@@ -80,6 +84,8 @@ const getPanSnapReleaseProgress = ({
|
|
|
80
84
|
activeAxis,
|
|
81
85
|
minSnapPoint,
|
|
82
86
|
maxSnapPoint,
|
|
87
|
+
snapPoints,
|
|
88
|
+
sheetSnapBehavior,
|
|
83
89
|
}: {
|
|
84
90
|
runtime: PanGestureRuntime;
|
|
85
91
|
event: PanGestureEvent;
|
|
@@ -87,6 +93,8 @@ const getPanSnapReleaseProgress = ({
|
|
|
87
93
|
activeAxis: NonNullable<ReturnType<typeof resolveActivePanSnapAxis>>;
|
|
88
94
|
minSnapPoint: number;
|
|
89
95
|
maxSnapPoint: number;
|
|
96
|
+
snapPoints: number[];
|
|
97
|
+
sheetSnapBehavior: PanGestureRuntime["policy"]["sheetSnapBehavior"];
|
|
90
98
|
}) => {
|
|
91
99
|
"worklet";
|
|
92
100
|
const isHorizontal = activeAxis.axis === "horizontal";
|
|
@@ -95,9 +103,17 @@ const getPanSnapReleaseProgress = ({
|
|
|
95
103
|
: event.translationY;
|
|
96
104
|
const axisDimension = isHorizontal ? dimensions.width : dimensions.height;
|
|
97
105
|
const axisProgress = axisTranslation / Math.max(1, axisDimension);
|
|
106
|
+
const signedProgressDelta = activeAxis.config.progressSign * axisProgress;
|
|
107
|
+
if (sheetSnapBehavior === "step") {
|
|
108
|
+
return resolveStepSnapProgress({
|
|
109
|
+
baseline: runtime.stores.gestures.internal.progressBaseline.get(),
|
|
110
|
+
normalizedDelta: signedProgressDelta,
|
|
111
|
+
snapPoints,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
98
114
|
const progress =
|
|
99
115
|
runtime.stores.gestures.internal.progressBaseline.get() +
|
|
100
|
-
|
|
116
|
+
signedProgressDelta;
|
|
101
117
|
|
|
102
118
|
return clamp(progress, minSnapPoint, maxSnapPoint);
|
|
103
119
|
};
|
|
@@ -180,6 +196,24 @@ export const resolveSnapPanRelease = (
|
|
|
180
196
|
);
|
|
181
197
|
const { resolvedSnapPoints, resolvedMinSnapPoint, resolvedMaxSnapPoint } =
|
|
182
198
|
resolveRuntimeGestureSnapPoints(runtime);
|
|
199
|
+
const allSnapTargets = resolveRuntimeGestureSnapTargets(runtime);
|
|
200
|
+
const axisTranslation =
|
|
201
|
+
activeAxis.axis === "horizontal" ? event.translationX : event.translationY;
|
|
202
|
+
const progressDirection =
|
|
203
|
+
activeAxis.config.progressSign * axisTranslation || -snapVelocity;
|
|
204
|
+
const releaseSnapPoints =
|
|
205
|
+
policy.sheetSnapBehavior === "step"
|
|
206
|
+
? resolveStepSnapTargets({
|
|
207
|
+
baseline: runtime.stores.gestures.internal.progressBaseline.get(),
|
|
208
|
+
direction: progressDirection,
|
|
209
|
+
snapPoints: allSnapTargets,
|
|
210
|
+
})
|
|
211
|
+
: resolvedSnapPoints;
|
|
212
|
+
const canDismissToReleaseTarget =
|
|
213
|
+
participation.canDismiss &&
|
|
214
|
+
(policy.gestureSnapLocked ||
|
|
215
|
+
policy.sheetSnapBehavior === "continuous" ||
|
|
216
|
+
releaseSnapPoints.includes(0));
|
|
183
217
|
const currentProgress = getPanSnapReleaseProgress({
|
|
184
218
|
runtime,
|
|
185
219
|
event,
|
|
@@ -187,6 +221,8 @@ export const resolveSnapPanRelease = (
|
|
|
187
221
|
activeAxis,
|
|
188
222
|
minSnapPoint: resolvedMinSnapPoint,
|
|
189
223
|
maxSnapPoint: resolvedMaxSnapPoint,
|
|
224
|
+
snapPoints: allSnapTargets,
|
|
225
|
+
sheetSnapBehavior: policy.sheetSnapBehavior,
|
|
190
226
|
});
|
|
191
227
|
const result = determineSnapTarget({
|
|
192
228
|
currentProgress,
|
|
@@ -195,24 +231,27 @@ export const resolveSnapPanRelease = (
|
|
|
195
231
|
runtime.stores.gestures.internal.lockedSnapPoint.get() ??
|
|
196
232
|
resolvedMaxSnapPoint,
|
|
197
233
|
]
|
|
198
|
-
:
|
|
234
|
+
: releaseSnapPoints,
|
|
199
235
|
velocity: snapVelocity,
|
|
200
236
|
dimension: axisDimension,
|
|
201
237
|
velocityFactor: policy.gestureSnapVelocityImpact,
|
|
202
|
-
canDismiss:
|
|
238
|
+
canDismiss: canDismissToReleaseTarget,
|
|
203
239
|
});
|
|
204
240
|
|
|
205
241
|
const shouldDismiss = participation.canDismiss && result.shouldDismiss;
|
|
206
242
|
const target = shouldDismiss ? 0 : result.targetProgress;
|
|
243
|
+
const progressVelocityScale =
|
|
244
|
+
policy.sheetSnapBehavior === "step" && !policy.gestureSnapLocked
|
|
245
|
+
? getStepSnapProgressVelocityScale(releaseSnapPoints)
|
|
246
|
+
: 1;
|
|
207
247
|
|
|
208
248
|
return {
|
|
209
249
|
target,
|
|
210
250
|
shouldDismiss,
|
|
211
251
|
initialVelocity: getProgressVelocityTowardTarget({
|
|
212
|
-
handoffVelocity:
|
|
213
|
-
axisVelocity,
|
|
214
|
-
|
|
215
|
-
),
|
|
252
|
+
handoffVelocity:
|
|
253
|
+
getPanReleaseHandoffVelocity(axisVelocity, axisDimension) *
|
|
254
|
+
progressVelocityScale,
|
|
216
255
|
target,
|
|
217
256
|
currentProgress,
|
|
218
257
|
}),
|
|
@@ -10,8 +10,12 @@ import {
|
|
|
10
10
|
resolveGestureSnapTransitionSpec,
|
|
11
11
|
} from "../../shared/release";
|
|
12
12
|
import {
|
|
13
|
+
getStepSnapProgressVelocityScale,
|
|
13
14
|
primeRuntimeSnapPoint,
|
|
14
15
|
resolveRuntimeGestureSnapPoints,
|
|
16
|
+
resolveRuntimeGestureSnapTargets,
|
|
17
|
+
resolveStepSnapProgress,
|
|
18
|
+
resolveStepSnapTargets,
|
|
15
19
|
} from "../../shared/snap-points";
|
|
16
20
|
import { determineSnapTarget } from "../../shared/targets";
|
|
17
21
|
import type {
|
|
@@ -56,11 +60,13 @@ const getPinchSnapReleaseProgress = ({
|
|
|
56
60
|
normalizedScale,
|
|
57
61
|
minSnapPoint,
|
|
58
62
|
maxSnapPoint,
|
|
63
|
+
snapPoints,
|
|
59
64
|
}: {
|
|
60
65
|
runtime: PinchGestureRuntime;
|
|
61
66
|
normalizedScale: number;
|
|
62
67
|
minSnapPoint: number;
|
|
63
68
|
maxSnapPoint: number;
|
|
69
|
+
snapPoints: number[];
|
|
64
70
|
}) => {
|
|
65
71
|
"worklet";
|
|
66
72
|
const pinchDirection = getPinchSnapDirection(normalizedScale);
|
|
@@ -74,6 +80,13 @@ const getPinchSnapReleaseProgress = ({
|
|
|
74
80
|
snapDirections.collapse === pinchDirection
|
|
75
81
|
? -Math.abs(normalizedScale)
|
|
76
82
|
: Math.abs(normalizedScale);
|
|
83
|
+
if (runtime.policy.sheetSnapBehavior === "step") {
|
|
84
|
+
return resolveStepSnapProgress({
|
|
85
|
+
baseline: runtime.stores.gestures.internal.progressBaseline.get(),
|
|
86
|
+
normalizedDelta: progressDelta,
|
|
87
|
+
snapPoints,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
77
90
|
|
|
78
91
|
return clamp(
|
|
79
92
|
runtime.stores.gestures.internal.progressBaseline.get() + progressDelta,
|
|
@@ -141,11 +154,34 @@ export const resolveSnapPinchRelease = (
|
|
|
141
154
|
|
|
142
155
|
const { resolvedSnapPoints, resolvedMinSnapPoint, resolvedMaxSnapPoint } =
|
|
143
156
|
resolveRuntimeGestureSnapPoints(runtime);
|
|
157
|
+
const allSnapTargets = resolveRuntimeGestureSnapTargets(runtime);
|
|
158
|
+
const snapVelocity = getPinchSnapVelocity(event, runtime, normalizedScale);
|
|
159
|
+
const pinchDirection = getPinchSnapDirection(normalizedScale);
|
|
160
|
+
const progressDirection =
|
|
161
|
+
pinchDirection && policy.snapDirections
|
|
162
|
+
? policy.snapDirections.collapse === pinchDirection
|
|
163
|
+
? -1
|
|
164
|
+
: 1
|
|
165
|
+
: -snapVelocity;
|
|
166
|
+
const releaseSnapPoints =
|
|
167
|
+
policy.sheetSnapBehavior === "step"
|
|
168
|
+
? resolveStepSnapTargets({
|
|
169
|
+
baseline: runtime.stores.gestures.internal.progressBaseline.get(),
|
|
170
|
+
direction: progressDirection,
|
|
171
|
+
snapPoints: allSnapTargets,
|
|
172
|
+
})
|
|
173
|
+
: resolvedSnapPoints;
|
|
174
|
+
const canDismissToReleaseTarget =
|
|
175
|
+
participation.canDismiss &&
|
|
176
|
+
(policy.gestureSnapLocked ||
|
|
177
|
+
policy.sheetSnapBehavior === "continuous" ||
|
|
178
|
+
releaseSnapPoints.includes(0));
|
|
144
179
|
const currentProgress = getPinchSnapReleaseProgress({
|
|
145
180
|
runtime,
|
|
146
181
|
normalizedScale,
|
|
147
182
|
minSnapPoint: resolvedMinSnapPoint,
|
|
148
183
|
maxSnapPoint: resolvedMaxSnapPoint,
|
|
184
|
+
snapPoints: allSnapTargets,
|
|
149
185
|
});
|
|
150
186
|
|
|
151
187
|
const result = determineSnapTarget({
|
|
@@ -155,16 +191,21 @@ export const resolveSnapPinchRelease = (
|
|
|
155
191
|
runtime.stores.gestures.internal.lockedSnapPoint.get() ??
|
|
156
192
|
resolvedMaxSnapPoint,
|
|
157
193
|
]
|
|
158
|
-
:
|
|
159
|
-
velocity:
|
|
194
|
+
: releaseSnapPoints,
|
|
195
|
+
velocity: snapVelocity,
|
|
160
196
|
dimension: 1,
|
|
161
197
|
velocityFactor: policy.gestureSnapVelocityImpact,
|
|
162
|
-
canDismiss:
|
|
198
|
+
canDismiss: canDismissToReleaseTarget,
|
|
163
199
|
});
|
|
164
200
|
|
|
165
201
|
const shouldDismiss = participation.canDismiss && result.shouldDismiss;
|
|
166
202
|
const target = shouldDismiss ? 0 : result.targetProgress;
|
|
167
|
-
const
|
|
203
|
+
const progressVelocityScale =
|
|
204
|
+
policy.sheetSnapBehavior === "step" && !policy.gestureSnapLocked
|
|
205
|
+
? getStepSnapProgressVelocityScale(releaseSnapPoints)
|
|
206
|
+
: 1;
|
|
207
|
+
const progressVelocity =
|
|
208
|
+
getPinchReleaseHandoffVelocity(event.velocity) * progressVelocityScale;
|
|
168
209
|
const handoffVelocity = getPinchReleaseHandoffVelocity(
|
|
169
210
|
event.velocity,
|
|
170
211
|
policy.gestureReleaseVelocityScale,
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
DEFAULT_GESTURE_TRACKING,
|
|
9
9
|
DEFAULT_GESTURE_VELOCITY_IMPACT,
|
|
10
10
|
DEFAULT_SHEET_SCROLL_GESTURE_BEHAVIOR,
|
|
11
|
+
DEFAULT_SHEET_SNAP_BEHAVIOR,
|
|
11
12
|
} from "../../../../constants";
|
|
12
13
|
import type {
|
|
13
14
|
GestureDirectionActivationArea,
|
|
@@ -19,6 +20,7 @@ import type {
|
|
|
19
20
|
GestureTracking,
|
|
20
21
|
ScreenTransitionConfig,
|
|
21
22
|
SheetScrollGestureBehavior,
|
|
23
|
+
SheetSnapBehavior,
|
|
22
24
|
SnapPoint,
|
|
23
25
|
} from "../../../../types/screen.types";
|
|
24
26
|
import { computeClaimedDirections } from "../ownership/compute-claimed-directions";
|
|
@@ -50,6 +52,7 @@ export type GesturePolicyOptions = {
|
|
|
50
52
|
gestureSnapLocked?: boolean;
|
|
51
53
|
gestureSnapVelocityImpact?: number;
|
|
52
54
|
gestureVelocityImpact?: number;
|
|
55
|
+
sheetSnapBehavior?: SheetSnapBehavior;
|
|
53
56
|
sheetScrollGestureBehavior?: SheetScrollGestureBehavior;
|
|
54
57
|
snapPoints?: SnapPoint[];
|
|
55
58
|
transitionSpec?: ScreenTransitionConfig["transitionSpec"];
|
|
@@ -152,6 +155,7 @@ const resolveCommonGesturePolicy = (options: GesturePolicyOptions) => {
|
|
|
152
155
|
gestureSnapVelocityImpact:
|
|
153
156
|
options.gestureSnapVelocityImpact ?? DEFAULT_GESTURE_SNAP_VELOCITY_IMPACT,
|
|
154
157
|
gestureSnapLocked: options.gestureSnapLocked ?? DEFAULT_GESTURE_SNAP_LOCKED,
|
|
158
|
+
sheetSnapBehavior: options.sheetSnapBehavior ?? DEFAULT_SHEET_SNAP_BEHAVIOR,
|
|
155
159
|
gestureReleaseVelocityScale:
|
|
156
160
|
options.gestureReleaseVelocityScale ??
|
|
157
161
|
DEFAULT_GESTURE_RELEASE_VELOCITY_SCALE,
|
|
@@ -204,6 +204,18 @@ export const resolveRuntimeGestureSnapPoints = (
|
|
|
204
204
|
});
|
|
205
205
|
};
|
|
206
206
|
|
|
207
|
+
export const resolveRuntimeGestureSnapTargets = (
|
|
208
|
+
runtime: GestureRuntime<GesturePolicy>,
|
|
209
|
+
): number[] => {
|
|
210
|
+
"worklet";
|
|
211
|
+
const { resolvedSnapPoints } = resolveRuntimeGestureSnapPoints(runtime);
|
|
212
|
+
const targets = runtime.participation.canDismiss
|
|
213
|
+
? [0, ...resolvedSnapPoints]
|
|
214
|
+
: resolvedSnapPoints;
|
|
215
|
+
|
|
216
|
+
return Array.from(new Set(targets)).sort((a, b) => a - b);
|
|
217
|
+
};
|
|
218
|
+
|
|
207
219
|
const findNearestSnapPoint = (
|
|
208
220
|
progress: number,
|
|
209
221
|
snapPoints: number[],
|
|
@@ -226,6 +238,81 @@ const findNearestSnapPoint = (
|
|
|
226
238
|
return nearest;
|
|
227
239
|
};
|
|
228
240
|
|
|
241
|
+
const findNearestSnapPointIndex = (
|
|
242
|
+
progress: number,
|
|
243
|
+
snapPoints: number[],
|
|
244
|
+
): number => {
|
|
245
|
+
"worklet";
|
|
246
|
+
let nearestIndex = 0;
|
|
247
|
+
let smallestDistance = Math.abs(progress - (snapPoints[0] ?? progress));
|
|
248
|
+
|
|
249
|
+
for (let i = 1; i < snapPoints.length; i++) {
|
|
250
|
+
const distance = Math.abs(progress - snapPoints[i]);
|
|
251
|
+
if (distance < smallestDistance) {
|
|
252
|
+
smallestDistance = distance;
|
|
253
|
+
nearestIndex = i;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
return nearestIndex;
|
|
258
|
+
};
|
|
259
|
+
|
|
260
|
+
interface ResolveStepSnapProps {
|
|
261
|
+
baseline: number;
|
|
262
|
+
direction: number;
|
|
263
|
+
snapPoints: number[];
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
export const resolveStepSnapTargets = ({
|
|
267
|
+
baseline,
|
|
268
|
+
direction,
|
|
269
|
+
snapPoints,
|
|
270
|
+
}: ResolveStepSnapProps): number[] => {
|
|
271
|
+
"worklet";
|
|
272
|
+
if (snapPoints.length === 0) {
|
|
273
|
+
return [baseline];
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
const baselineIndex = findNearestSnapPointIndex(baseline, snapPoints);
|
|
277
|
+
const start = snapPoints[baselineIndex] ?? baseline;
|
|
278
|
+
const adjacentIndex = baselineIndex + Math.sign(direction);
|
|
279
|
+
const adjacent = snapPoints[adjacentIndex];
|
|
280
|
+
|
|
281
|
+
if (direction === 0 || adjacent === undefined) {
|
|
282
|
+
return [start];
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
return direction < 0 ? [adjacent, start] : [start, adjacent];
|
|
286
|
+
};
|
|
287
|
+
|
|
288
|
+
export const resolveStepSnapProgress = ({
|
|
289
|
+
baseline,
|
|
290
|
+
normalizedDelta,
|
|
291
|
+
snapPoints,
|
|
292
|
+
}: Omit<ResolveStepSnapProps, "direction"> & {
|
|
293
|
+
normalizedDelta: number;
|
|
294
|
+
}): number => {
|
|
295
|
+
"worklet";
|
|
296
|
+
const targets = resolveStepSnapTargets({
|
|
297
|
+
baseline,
|
|
298
|
+
direction: normalizedDelta,
|
|
299
|
+
snapPoints,
|
|
300
|
+
});
|
|
301
|
+
const target = normalizedDelta < 0 ? targets[0] : targets[targets.length - 1];
|
|
302
|
+
const localProgress = Math.min(1, Math.abs(normalizedDelta));
|
|
303
|
+
|
|
304
|
+
return baseline + (target - baseline) * localProgress;
|
|
305
|
+
};
|
|
306
|
+
|
|
307
|
+
export const getStepSnapProgressVelocityScale = (targets: number[]): number => {
|
|
308
|
+
"worklet";
|
|
309
|
+
if (targets.length < 2) {
|
|
310
|
+
return 0;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
return Math.abs(targets[targets.length - 1] - targets[0]);
|
|
314
|
+
};
|
|
315
|
+
|
|
229
316
|
export const primeRuntimeSnapPoint = (
|
|
230
317
|
runtime: GestureRuntime<GesturePolicy>,
|
|
231
318
|
) => {
|
|
@@ -114,6 +114,7 @@ export interface PanGesturePolicy {
|
|
|
114
114
|
gestureReleaseVelocityScale: number;
|
|
115
115
|
gestureActivationArea: ResolvedGestureActivationArea;
|
|
116
116
|
gestureSnapLocked: boolean;
|
|
117
|
+
sheetSnapBehavior: NonNullable<ScreenTransitionConfig["sheetSnapBehavior"]>;
|
|
117
118
|
sheetScrollGestureBehavior: NonNullable<
|
|
118
119
|
ScreenTransitionConfig["sheetScrollGestureBehavior"]
|
|
119
120
|
>;
|
|
@@ -129,6 +130,7 @@ export interface PinchGesturePolicy {
|
|
|
129
130
|
gestureSensitivity: NonNullable<ScreenTransitionConfig["gestureSensitivity"]>;
|
|
130
131
|
gestureSnapVelocityImpact: number;
|
|
131
132
|
gestureSnapLocked: boolean;
|
|
133
|
+
sheetSnapBehavior: NonNullable<ScreenTransitionConfig["sheetSnapBehavior"]>;
|
|
132
134
|
gestureReleaseVelocityScale: number;
|
|
133
135
|
transitionSpec: TransitionSpec | undefined;
|
|
134
136
|
}
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
DEFAULT_GESTURE_TRACKING,
|
|
8
8
|
DEFAULT_GESTURE_VELOCITY_IMPACT,
|
|
9
9
|
DEFAULT_SHEET_SCROLL_GESTURE_BEHAVIOR,
|
|
10
|
+
DEFAULT_SHEET_SNAP_BEHAVIOR,
|
|
10
11
|
} from "../../../constants";
|
|
11
12
|
import type {
|
|
12
13
|
GestureDirection,
|
|
@@ -129,6 +130,14 @@ const resolveSheetScrollGestureBehaviorOption = (
|
|
|
129
130
|
: fallback;
|
|
130
131
|
};
|
|
131
132
|
|
|
133
|
+
const resolveSheetSnapBehaviorOption = (
|
|
134
|
+
value: unknown,
|
|
135
|
+
fallback: RequiredScreenOption<"sheetSnapBehavior">,
|
|
136
|
+
): RequiredScreenOption<"sheetSnapBehavior"> => {
|
|
137
|
+
"worklet";
|
|
138
|
+
return value === "continuous" || value === "step" ? value : fallback;
|
|
139
|
+
};
|
|
140
|
+
|
|
132
141
|
const resolveGestureTrackingOption = (
|
|
133
142
|
value: unknown,
|
|
134
143
|
fallback: RequiredScreenOption<"gestureTracking">,
|
|
@@ -205,6 +214,7 @@ const areScreenOptionsEqual = (
|
|
|
205
214
|
left.gestureSnapVelocityImpact === right.gestureSnapVelocityImpact &&
|
|
206
215
|
left.gestureReleaseVelocityScale === right.gestureReleaseVelocityScale &&
|
|
207
216
|
left.gestureSnapLocked === right.gestureSnapLocked &&
|
|
217
|
+
left.sheetSnapBehavior === right.sheetSnapBehavior &&
|
|
208
218
|
left.sheetScrollGestureBehavior === right.sheetScrollGestureBehavior &&
|
|
209
219
|
left.backdropBehavior === right.backdropBehavior &&
|
|
210
220
|
left.transitionSpec === right.transitionSpec &&
|
|
@@ -249,6 +259,10 @@ export const resolveBaseScreenOptions = (
|
|
|
249
259
|
options.gestureSnapLocked,
|
|
250
260
|
DEFAULT_GESTURE_SNAP_LOCKED,
|
|
251
261
|
),
|
|
262
|
+
sheetSnapBehavior: resolveSheetSnapBehaviorOption(
|
|
263
|
+
options.sheetSnapBehavior,
|
|
264
|
+
DEFAULT_SHEET_SNAP_BEHAVIOR,
|
|
265
|
+
),
|
|
252
266
|
sheetScrollGestureBehavior: resolveSheetScrollGestureBehaviorOption(
|
|
253
267
|
resolveSheetScrollGestureBehavior(options),
|
|
254
268
|
DEFAULT_SHEET_SCROLL_GESTURE_BEHAVIOR,
|
|
@@ -315,6 +329,10 @@ export const syncScreenOptionsOverrides = (
|
|
|
315
329
|
options?.gestureSnapLocked,
|
|
316
330
|
base.gestureSnapLocked,
|
|
317
331
|
),
|
|
332
|
+
sheetSnapBehavior: resolveSheetSnapBehaviorOption(
|
|
333
|
+
options?.sheetSnapBehavior,
|
|
334
|
+
base.sheetSnapBehavior,
|
|
335
|
+
),
|
|
318
336
|
sheetScrollGestureBehavior: resolveSheetScrollGestureBehaviorOption(
|
|
319
337
|
options?.sheetScrollGestureBehavior,
|
|
320
338
|
base.sheetScrollGestureBehavior,
|
|
@@ -18,6 +18,7 @@ export type ScreenOptionsSnapshot = {
|
|
|
18
18
|
gestureSnapVelocityImpact: RequiredScreenOption<"gestureSnapVelocityImpact">;
|
|
19
19
|
gestureReleaseVelocityScale: RequiredScreenOption<"gestureReleaseVelocityScale">;
|
|
20
20
|
gestureSnapLocked: RequiredScreenOption<"gestureSnapLocked">;
|
|
21
|
+
sheetSnapBehavior: RequiredScreenOption<"sheetSnapBehavior">;
|
|
21
22
|
sheetScrollGestureBehavior: RequiredScreenOption<"sheetScrollGestureBehavior">;
|
|
22
23
|
backdropBehavior: OptionalScreenOption<"backdropBehavior">;
|
|
23
24
|
transitionSpec: OptionalScreenOption<"transitionSpec">;
|