react-native-screen-transitions 3.4.0-alpha.1 → 3.4.0-alpha.3
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 +11 -1109
- package/lib/commonjs/blank-stack/navigators/create-blank-stack-navigator.js +69 -2
- package/lib/commonjs/blank-stack/navigators/create-blank-stack-navigator.js.map +1 -1
- package/lib/commonjs/component-stack/navigators/create-component-stack-navigator.js +9 -0
- package/lib/commonjs/component-stack/navigators/create-component-stack-navigator.js.map +1 -1
- package/lib/commonjs/shared/components/create-boundary-component/hooks/helpers/measurement-rules.js +195 -0
- package/lib/commonjs/shared/components/create-boundary-component/hooks/helpers/measurement-rules.js.map +1 -0
- package/lib/commonjs/shared/components/create-boundary-component/hooks/use-auto-source-measurement.js +7 -14
- package/lib/commonjs/shared/components/create-boundary-component/hooks/use-auto-source-measurement.js.map +1 -1
- package/lib/commonjs/shared/components/create-boundary-component/hooks/use-boundary-measure-and-store.js +19 -18
- package/lib/commonjs/shared/components/create-boundary-component/hooks/use-boundary-measure-and-store.js.map +1 -1
- package/lib/commonjs/shared/components/create-boundary-component/hooks/use-deferred-measurement-trigger.js +54 -0
- package/lib/commonjs/shared/components/create-boundary-component/hooks/use-deferred-measurement-trigger.js.map +1 -0
- package/lib/commonjs/shared/components/create-boundary-component/hooks/use-group-active-measurement.js +40 -8
- package/lib/commonjs/shared/components/create-boundary-component/hooks/use-group-active-measurement.js.map +1 -1
- package/lib/commonjs/shared/components/create-boundary-component/hooks/use-group-active-source-measurement.js +72 -0
- package/lib/commonjs/shared/components/create-boundary-component/hooks/use-group-active-source-measurement.js.map +1 -0
- package/lib/commonjs/shared/components/create-boundary-component/hooks/use-initial-layout-handler.js +16 -7
- package/lib/commonjs/shared/components/create-boundary-component/hooks/use-initial-layout-handler.js.map +1 -1
- package/lib/commonjs/shared/components/create-boundary-component/hooks/use-pending-destination-measurement.js +7 -4
- package/lib/commonjs/shared/components/create-boundary-component/hooks/use-pending-destination-measurement.js.map +1 -1
- package/lib/commonjs/shared/components/create-boundary-component/hooks/use-pending-destination-retry-measurement.js +14 -15
- package/lib/commonjs/shared/components/create-boundary-component/hooks/use-pending-destination-retry-measurement.js.map +1 -1
- package/lib/commonjs/shared/components/create-boundary-component/hooks/use-scroll-settled-measurement.js +27 -9
- package/lib/commonjs/shared/components/create-boundary-component/hooks/use-scroll-settled-measurement.js.map +1 -1
- package/lib/commonjs/shared/components/create-boundary-component/index.js +23 -10
- package/lib/commonjs/shared/components/create-boundary-component/index.js.map +1 -1
- package/lib/commonjs/shared/components/create-transition-aware-component.js +4 -4
- package/lib/commonjs/shared/components/create-transition-aware-component.js.map +1 -1
- package/lib/commonjs/shared/components/native-screen-container.js +12 -6
- package/lib/commonjs/shared/components/native-screen-container.js.map +1 -1
- package/lib/commonjs/shared/components/native-screen.js +35 -8
- package/lib/commonjs/shared/components/native-screen.js.map +1 -1
- package/lib/commonjs/shared/components/screen-container/deferred-visibility-host.js +43 -0
- package/lib/commonjs/shared/components/screen-container/deferred-visibility-host.js.map +1 -0
- package/lib/commonjs/shared/components/screen-container/hooks/use-content-layout.js +60 -0
- package/lib/commonjs/shared/components/screen-container/hooks/use-content-layout.js.map +1 -0
- package/lib/commonjs/shared/components/screen-container/index.js +7 -4
- package/lib/commonjs/shared/components/screen-container/index.js.map +1 -1
- package/lib/commonjs/shared/components/screen-container/layers/content.js +32 -48
- package/lib/commonjs/shared/components/screen-container/layers/content.js.map +1 -1
- package/lib/commonjs/shared/components/screen-container/layers/maybe-masked-navigation-container.js +9 -20
- package/lib/commonjs/shared/components/screen-container/layers/maybe-masked-navigation-container.js.map +1 -1
- package/lib/commonjs/shared/configs/presets.js +6 -6
- package/lib/commonjs/shared/configs/presets.js.map +1 -1
- package/lib/commonjs/shared/constants.js +10 -4
- package/lib/commonjs/shared/constants.js.map +1 -1
- package/lib/commonjs/shared/hooks/animation/use-associated-style.js +9 -34
- package/lib/commonjs/shared/hooks/animation/use-associated-style.js.map +1 -1
- package/lib/commonjs/shared/index.js +4 -10
- package/lib/commonjs/shared/index.js.map +1 -1
- package/lib/commonjs/shared/providers/gestures/handlers/use-handlers.js +6 -7
- package/lib/commonjs/shared/providers/gestures/handlers/use-handlers.js.map +1 -1
- package/lib/commonjs/shared/providers/gestures/helpers/gesture-activation.js +11 -6
- package/lib/commonjs/shared/providers/gestures/helpers/gesture-activation.js.map +1 -1
- package/lib/commonjs/shared/providers/layout-anchor.provider.js +4 -6
- package/lib/commonjs/shared/providers/layout-anchor.provider.js.map +1 -1
- package/lib/commonjs/shared/providers/screen/animation/helpers/pipeline.js +14 -7
- package/lib/commonjs/shared/providers/screen/animation/helpers/pipeline.js.map +1 -1
- package/lib/commonjs/shared/providers/screen/helpers/resolve-interpolated-style-output.js +36 -0
- package/lib/commonjs/shared/providers/screen/helpers/resolve-interpolated-style-output.js.map +1 -0
- package/lib/commonjs/shared/providers/screen/styles.provider.js +31 -10
- package/lib/commonjs/shared/providers/screen/styles.provider.js.map +1 -1
- package/lib/commonjs/shared/providers/stack/core.provider.js +14 -21
- package/lib/commonjs/shared/providers/stack/core.provider.js.map +1 -1
- package/lib/commonjs/shared/stores/animation.store.js +3 -1
- package/lib/commonjs/shared/stores/animation.store.js.map +1 -1
- package/lib/commonjs/shared/stores/bounds/internals/presence.js.map +1 -1
- package/lib/commonjs/shared/utils/bounds/helpers/compute-bounds-styles.js +16 -7
- package/lib/commonjs/shared/utils/bounds/helpers/compute-bounds-styles.js.map +1 -1
- package/lib/commonjs/shared/utils/bounds/helpers/resolve-bound-tag.js +0 -5
- package/lib/commonjs/shared/utils/bounds/helpers/resolve-bound-tag.js.map +1 -1
- package/lib/commonjs/shared/utils/bounds/index.js +10 -0
- package/lib/commonjs/shared/utils/bounds/index.js.map +1 -1
- package/lib/commonjs/shared/utils/bounds/types/frame-props.js +6 -0
- package/lib/commonjs/shared/utils/bounds/types/frame-props.js.map +1 -0
- package/lib/commonjs/shared/utils/bounds/zoom/build.js +34 -31
- package/lib/commonjs/shared/utils/bounds/zoom/build.js.map +1 -1
- package/lib/commonjs/shared/utils/resolve-screen-transition-options.js +25 -0
- package/lib/commonjs/shared/utils/resolve-screen-transition-options.js.map +1 -0
- package/lib/module/blank-stack/navigators/create-blank-stack-navigator.js +69 -3
- package/lib/module/blank-stack/navigators/create-blank-stack-navigator.js.map +1 -1
- package/lib/module/component-stack/navigators/create-component-stack-navigator.js +9 -0
- package/lib/module/component-stack/navigators/create-component-stack-navigator.js.map +1 -1
- package/lib/module/shared/components/create-boundary-component/hooks/helpers/measurement-rules.js +182 -0
- package/lib/module/shared/components/create-boundary-component/hooks/helpers/measurement-rules.js.map +1 -0
- package/lib/module/shared/components/create-boundary-component/hooks/use-auto-source-measurement.js +7 -14
- package/lib/module/shared/components/create-boundary-component/hooks/use-auto-source-measurement.js.map +1 -1
- package/lib/module/shared/components/create-boundary-component/hooks/use-boundary-measure-and-store.js +19 -18
- package/lib/module/shared/components/create-boundary-component/hooks/use-boundary-measure-and-store.js.map +1 -1
- package/lib/module/shared/components/create-boundary-component/hooks/use-deferred-measurement-trigger.js +49 -0
- package/lib/module/shared/components/create-boundary-component/hooks/use-deferred-measurement-trigger.js.map +1 -0
- package/lib/module/shared/components/create-boundary-component/hooks/use-group-active-measurement.js +41 -8
- package/lib/module/shared/components/create-boundary-component/hooks/use-group-active-measurement.js.map +1 -1
- package/lib/module/shared/components/create-boundary-component/hooks/use-group-active-source-measurement.js +67 -0
- package/lib/module/shared/components/create-boundary-component/hooks/use-group-active-source-measurement.js.map +1 -0
- package/lib/module/shared/components/create-boundary-component/hooks/use-initial-layout-handler.js +16 -7
- package/lib/module/shared/components/create-boundary-component/hooks/use-initial-layout-handler.js.map +1 -1
- package/lib/module/shared/components/create-boundary-component/hooks/use-pending-destination-measurement.js +7 -4
- package/lib/module/shared/components/create-boundary-component/hooks/use-pending-destination-measurement.js.map +1 -1
- package/lib/module/shared/components/create-boundary-component/hooks/use-pending-destination-retry-measurement.js +14 -15
- package/lib/module/shared/components/create-boundary-component/hooks/use-pending-destination-retry-measurement.js.map +1 -1
- package/lib/module/shared/components/create-boundary-component/hooks/use-scroll-settled-measurement.js +27 -9
- package/lib/module/shared/components/create-boundary-component/hooks/use-scroll-settled-measurement.js.map +1 -1
- package/lib/module/shared/components/create-boundary-component/index.js +23 -10
- package/lib/module/shared/components/create-boundary-component/index.js.map +1 -1
- package/lib/module/shared/components/create-transition-aware-component.js +4 -4
- package/lib/module/shared/components/create-transition-aware-component.js.map +1 -1
- package/lib/module/shared/components/native-screen-container.js +12 -6
- package/lib/module/shared/components/native-screen-container.js.map +1 -1
- package/lib/module/shared/components/native-screen.js +35 -8
- package/lib/module/shared/components/native-screen.js.map +1 -1
- package/lib/module/shared/components/screen-container/deferred-visibility-host.js +38 -0
- package/lib/module/shared/components/screen-container/deferred-visibility-host.js.map +1 -0
- package/lib/module/shared/components/screen-container/hooks/use-content-layout.js +56 -0
- package/lib/module/shared/components/screen-container/hooks/use-content-layout.js.map +1 -0
- package/lib/module/shared/components/screen-container/index.js +7 -4
- package/lib/module/shared/components/screen-container/index.js.map +1 -1
- package/lib/module/shared/components/screen-container/layers/content.js +37 -53
- package/lib/module/shared/components/screen-container/layers/content.js.map +1 -1
- package/lib/module/shared/components/screen-container/layers/maybe-masked-navigation-container.js +10 -21
- package/lib/module/shared/components/screen-container/layers/maybe-masked-navigation-container.js.map +1 -1
- package/lib/module/shared/configs/presets.js +7 -7
- package/lib/module/shared/configs/presets.js.map +1 -1
- package/lib/module/shared/constants.js +9 -3
- package/lib/module/shared/constants.js.map +1 -1
- package/lib/module/shared/hooks/animation/use-associated-style.js +10 -35
- package/lib/module/shared/hooks/animation/use-associated-style.js.map +1 -1
- package/lib/module/shared/index.js +1 -1
- package/lib/module/shared/index.js.map +1 -1
- package/lib/module/shared/providers/gestures/handlers/use-handlers.js +6 -7
- package/lib/module/shared/providers/gestures/handlers/use-handlers.js.map +1 -1
- package/lib/module/shared/providers/gestures/helpers/gesture-activation.js +11 -6
- package/lib/module/shared/providers/gestures/helpers/gesture-activation.js.map +1 -1
- package/lib/module/shared/providers/layout-anchor.provider.js +4 -6
- package/lib/module/shared/providers/layout-anchor.provider.js.map +1 -1
- package/lib/module/shared/providers/screen/animation/helpers/pipeline.js +14 -7
- package/lib/module/shared/providers/screen/animation/helpers/pipeline.js.map +1 -1
- package/lib/module/shared/providers/screen/helpers/resolve-interpolated-style-output.js +31 -0
- package/lib/module/shared/providers/screen/helpers/resolve-interpolated-style-output.js.map +1 -0
- package/lib/module/shared/providers/screen/styles.provider.js +30 -11
- package/lib/module/shared/providers/screen/styles.provider.js.map +1 -1
- package/lib/module/shared/providers/stack/core.provider.js +14 -21
- package/lib/module/shared/providers/stack/core.provider.js.map +1 -1
- package/lib/module/shared/stores/animation.store.js +3 -1
- package/lib/module/shared/stores/animation.store.js.map +1 -1
- package/lib/module/shared/stores/bounds/internals/presence.js.map +1 -1
- package/lib/module/shared/utils/bounds/helpers/compute-bounds-styles.js +17 -8
- package/lib/module/shared/utils/bounds/helpers/compute-bounds-styles.js.map +1 -1
- package/lib/module/shared/utils/bounds/helpers/resolve-bound-tag.js +0 -5
- package/lib/module/shared/utils/bounds/helpers/resolve-bound-tag.js.map +1 -1
- package/lib/module/shared/utils/bounds/index.js +10 -0
- package/lib/module/shared/utils/bounds/index.js.map +1 -1
- package/lib/module/shared/utils/bounds/types/frame-props.js +4 -0
- package/lib/module/shared/utils/bounds/types/frame-props.js.map +1 -0
- package/lib/module/shared/utils/bounds/zoom/build.js +35 -32
- package/lib/module/shared/utils/bounds/zoom/build.js.map +1 -1
- package/lib/module/shared/utils/resolve-screen-transition-options.js +19 -0
- package/lib/module/shared/utils/resolve-screen-transition-options.js.map +1 -0
- package/lib/typescript/blank-stack/index.d.ts +1 -1
- package/lib/typescript/blank-stack/index.d.ts.map +1 -1
- package/lib/typescript/blank-stack/navigators/create-blank-stack-navigator.d.ts +29 -4
- package/lib/typescript/blank-stack/navigators/create-blank-stack-navigator.d.ts.map +1 -1
- package/lib/typescript/blank-stack/types.d.ts +33 -4
- package/lib/typescript/blank-stack/types.d.ts.map +1 -1
- package/lib/typescript/component-stack/navigators/create-component-stack-navigator.d.ts +8 -0
- package/lib/typescript/component-stack/navigators/create-component-stack-navigator.d.ts.map +1 -1
- package/lib/typescript/shared/components/create-boundary-component/hooks/helpers/measurement-rules.d.ts +81 -0
- package/lib/typescript/shared/components/create-boundary-component/hooks/helpers/measurement-rules.d.ts.map +1 -0
- package/lib/typescript/shared/components/create-boundary-component/hooks/use-auto-source-measurement.d.ts.map +1 -1
- package/lib/typescript/shared/components/create-boundary-component/hooks/use-boundary-measure-and-store.d.ts +2 -3
- package/lib/typescript/shared/components/create-boundary-component/hooks/use-boundary-measure-and-store.d.ts.map +1 -1
- package/lib/typescript/shared/components/create-boundary-component/hooks/use-deferred-measurement-trigger.d.ts +11 -0
- package/lib/typescript/shared/components/create-boundary-component/hooks/use-deferred-measurement-trigger.d.ts.map +1 -0
- package/lib/typescript/shared/components/create-boundary-component/hooks/use-group-active-measurement.d.ts +2 -2
- package/lib/typescript/shared/components/create-boundary-component/hooks/use-group-active-measurement.d.ts.map +1 -1
- package/lib/typescript/shared/components/create-boundary-component/hooks/use-group-active-source-measurement.d.ts +11 -0
- package/lib/typescript/shared/components/create-boundary-component/hooks/use-group-active-source-measurement.d.ts.map +1 -0
- package/lib/typescript/shared/components/create-boundary-component/hooks/use-initial-layout-handler.d.ts.map +1 -1
- package/lib/typescript/shared/components/create-boundary-component/hooks/use-pending-destination-measurement.d.ts.map +1 -1
- package/lib/typescript/shared/components/create-boundary-component/hooks/use-pending-destination-retry-measurement.d.ts +3 -3
- package/lib/typescript/shared/components/create-boundary-component/hooks/use-pending-destination-retry-measurement.d.ts.map +1 -1
- package/lib/typescript/shared/components/create-boundary-component/hooks/use-scroll-settled-measurement.d.ts +2 -2
- package/lib/typescript/shared/components/create-boundary-component/hooks/use-scroll-settled-measurement.d.ts.map +1 -1
- package/lib/typescript/shared/components/create-boundary-component/index.d.ts +5 -3
- package/lib/typescript/shared/components/create-boundary-component/index.d.ts.map +1 -1
- package/lib/typescript/shared/components/create-boundary-component/types.d.ts +2 -4
- package/lib/typescript/shared/components/create-boundary-component/types.d.ts.map +1 -1
- package/lib/typescript/shared/components/create-transition-aware-component.d.ts +1 -0
- package/lib/typescript/shared/components/create-transition-aware-component.d.ts.map +1 -1
- package/lib/typescript/shared/components/native-screen-container.d.ts.map +1 -1
- package/lib/typescript/shared/components/native-screen.d.ts.map +1 -1
- package/lib/typescript/shared/components/screen-container/deferred-visibility-host.d.ts +13 -0
- package/lib/typescript/shared/components/screen-container/deferred-visibility-host.d.ts.map +1 -0
- package/lib/typescript/shared/components/screen-container/hooks/use-content-layout.d.ts +3 -0
- package/lib/typescript/shared/components/screen-container/hooks/use-content-layout.d.ts.map +1 -0
- package/lib/typescript/shared/components/screen-container/index.d.ts.map +1 -1
- package/lib/typescript/shared/components/screen-container/layers/content.d.ts.map +1 -1
- package/lib/typescript/shared/components/screen-container/layers/maybe-masked-navigation-container.d.ts +3 -1
- package/lib/typescript/shared/components/screen-container/layers/maybe-masked-navigation-container.d.ts.map +1 -1
- package/lib/typescript/shared/configs/index.d.ts.map +1 -1
- package/lib/typescript/shared/constants.d.ts +9 -3
- package/lib/typescript/shared/constants.d.ts.map +1 -1
- package/lib/typescript/shared/hooks/animation/use-associated-style.d.ts +5 -11
- package/lib/typescript/shared/hooks/animation/use-associated-style.d.ts.map +1 -1
- package/lib/typescript/shared/index.d.ts +1 -2
- package/lib/typescript/shared/index.d.ts.map +1 -1
- package/lib/typescript/shared/providers/gestures/handlers/use-handlers.d.ts +1 -1
- package/lib/typescript/shared/providers/gestures/handlers/use-handlers.d.ts.map +1 -1
- package/lib/typescript/shared/providers/gestures/helpers/gesture-activation.d.ts.map +1 -1
- package/lib/typescript/shared/providers/layout-anchor.provider.d.ts +1 -1
- package/lib/typescript/shared/providers/layout-anchor.provider.d.ts.map +1 -1
- package/lib/typescript/shared/providers/screen/animation/helpers/pipeline.d.ts.map +1 -1
- package/lib/typescript/shared/providers/screen/helpers/resolve-interpolated-style-output.d.ts +10 -0
- package/lib/typescript/shared/providers/screen/helpers/resolve-interpolated-style-output.d.ts.map +1 -0
- package/lib/typescript/shared/providers/screen/styles.provider.d.ts +4 -2
- package/lib/typescript/shared/providers/screen/styles.provider.d.ts.map +1 -1
- package/lib/typescript/shared/providers/stack/core.provider.d.ts +2 -0
- package/lib/typescript/shared/providers/stack/core.provider.d.ts.map +1 -1
- package/lib/typescript/shared/stores/animation.store.d.ts +5 -3
- package/lib/typescript/shared/stores/animation.store.d.ts.map +1 -1
- package/lib/typescript/shared/stores/bounds/internals/presence.d.ts.map +1 -1
- package/lib/typescript/shared/types/animation.types.d.ts +13 -1
- package/lib/typescript/shared/types/animation.types.d.ts.map +1 -1
- package/lib/typescript/shared/types/screen.types.d.ts +51 -22
- package/lib/typescript/shared/types/screen.types.d.ts.map +1 -1
- package/lib/typescript/shared/utils/bounds/helpers/compute-bounds-styles.d.ts +11 -1
- package/lib/typescript/shared/utils/bounds/helpers/compute-bounds-styles.d.ts.map +1 -1
- package/lib/typescript/shared/utils/bounds/helpers/resolve-bound-tag.d.ts.map +1 -1
- package/lib/typescript/shared/utils/bounds/index.d.ts +2 -2
- package/lib/typescript/shared/utils/bounds/index.d.ts.map +1 -1
- package/lib/typescript/shared/utils/bounds/types/frame-props.d.ts +5 -0
- package/lib/typescript/shared/utils/bounds/types/frame-props.d.ts.map +1 -0
- package/lib/typescript/shared/utils/bounds/zoom/accessor.d.ts +4 -4
- package/lib/typescript/shared/utils/bounds/zoom/accessor.d.ts.map +1 -1
- package/lib/typescript/shared/utils/bounds/zoom/build.d.ts +2 -2
- package/lib/typescript/shared/utils/bounds/zoom/build.d.ts.map +1 -1
- package/lib/typescript/shared/utils/bounds/zoom/types.d.ts +3 -3
- package/lib/typescript/shared/utils/bounds/zoom/types.d.ts.map +1 -1
- package/lib/typescript/shared/utils/resolve-screen-transition-options.d.ts +5 -0
- package/lib/typescript/shared/utils/resolve-screen-transition-options.d.ts.map +1 -0
- package/package.json +2 -1
- package/src/blank-stack/index.ts +1 -0
- package/src/blank-stack/navigators/create-blank-stack-navigator.tsx +138 -19
- package/src/blank-stack/types.ts +33 -5
- package/src/component-stack/navigators/create-component-stack-navigator.tsx +8 -0
- package/src/shared/components/create-boundary-component/hooks/helpers/measurement-rules.ts +258 -0
- package/src/shared/components/create-boundary-component/hooks/use-auto-source-measurement.ts +7 -17
- package/src/shared/components/create-boundary-component/hooks/use-boundary-measure-and-store.ts +38 -28
- package/src/shared/components/create-boundary-component/hooks/use-deferred-measurement-trigger.ts +58 -0
- package/src/shared/components/create-boundary-component/hooks/use-group-active-measurement.ts +41 -10
- package/src/shared/components/create-boundary-component/hooks/use-group-active-source-measurement.ts +82 -0
- package/src/shared/components/create-boundary-component/hooks/use-initial-layout-handler.ts +24 -12
- package/src/shared/components/create-boundary-component/hooks/use-pending-destination-measurement.ts +11 -9
- package/src/shared/components/create-boundary-component/hooks/use-pending-destination-retry-measurement.ts +29 -26
- package/src/shared/components/create-boundary-component/hooks/use-scroll-settled-measurement.ts +26 -17
- package/src/shared/components/create-boundary-component/index.tsx +25 -7
- package/src/shared/components/create-boundary-component/types.ts +8 -4
- package/src/shared/components/create-transition-aware-component.tsx +5 -3
- package/src/shared/components/native-screen-container.tsx +11 -3
- package/src/shared/components/native-screen.tsx +65 -20
- package/src/shared/components/screen-container/deferred-visibility-host.tsx +37 -0
- package/src/shared/components/screen-container/hooks/use-content-layout.ts +82 -0
- package/src/shared/components/screen-container/index.tsx +5 -2
- package/src/shared/components/screen-container/layers/content.tsx +53 -80
- package/src/shared/components/screen-container/layers/maybe-masked-navigation-container.tsx +12 -27
- package/src/shared/configs/presets.ts +10 -10
- package/src/shared/constants.ts +5 -3
- package/src/shared/hooks/animation/use-associated-style.ts +10 -54
- package/src/shared/index.ts +2 -3
- package/src/shared/providers/gestures/handlers/use-handlers.ts +8 -5
- package/src/shared/providers/gestures/helpers/gesture-activation.ts +11 -6
- package/src/shared/providers/layout-anchor.provider.tsx +2 -5
- package/src/shared/providers/register-bounds.provider.tsx +1 -1
- package/src/shared/providers/screen/animation/helpers/pipeline.ts +24 -8
- package/src/shared/providers/screen/helpers/resolve-interpolated-style-output.ts +41 -0
- package/src/shared/providers/screen/styles.provider.tsx +95 -72
- package/src/shared/providers/stack/core.provider.tsx +27 -14
- package/src/shared/stores/animation.store.ts +11 -7
- package/src/shared/stores/bounds/internals/presence.ts +3 -1
- package/src/shared/types/animation.types.ts +13 -1
- package/src/shared/types/screen.types.ts +55 -22
- package/src/shared/utils/bounds/helpers/compute-bounds-styles.ts +17 -3
- package/src/shared/utils/bounds/helpers/resolve-bound-tag.ts +0 -6
- package/src/shared/utils/bounds/index.ts +16 -5
- package/src/shared/utils/bounds/types/frame-props.ts +5 -0
- package/src/shared/utils/bounds/zoom/accessor.ts +3 -3
- package/src/shared/utils/bounds/zoom/build.ts +46 -32
- package/src/shared/utils/bounds/zoom/types.ts +3 -3
- package/src/shared/utils/resolve-screen-transition-options.ts +37 -0
- package/lib/commonjs/shared/providers/viewport.provider.js +0 -33
- package/lib/commonjs/shared/providers/viewport.provider.js.map +0 -1
- package/lib/module/shared/providers/viewport.provider.js +0 -27
- package/lib/module/shared/providers/viewport.provider.js.map +0 -1
- package/lib/typescript/shared/providers/viewport.provider.d.ts +0 -13
- package/lib/typescript/shared/providers/viewport.provider.d.ts.map +0 -1
- package/src/shared/providers/viewport.provider.tsx +0 -39
package/src/shared/components/create-boundary-component/hooks/use-deferred-measurement-trigger.ts
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { useCallback } from "react";
|
|
2
|
+
import {
|
|
3
|
+
type SharedValue,
|
|
4
|
+
useAnimatedReaction,
|
|
5
|
+
useSharedValue,
|
|
6
|
+
} from "react-native-reanimated";
|
|
7
|
+
|
|
8
|
+
export const useDeferredMeasurementTrigger = (params: {
|
|
9
|
+
enabled: boolean;
|
|
10
|
+
isAnimating: SharedValue<number>;
|
|
11
|
+
canFlush?: () => boolean;
|
|
12
|
+
onFlush: () => void;
|
|
13
|
+
}) => {
|
|
14
|
+
const { enabled, isAnimating, canFlush, onFlush } = params;
|
|
15
|
+
const hasPendingMeasurement = useSharedValue(false);
|
|
16
|
+
|
|
17
|
+
const clearPendingMeasurement = useCallback(() => {
|
|
18
|
+
"worklet";
|
|
19
|
+
hasPendingMeasurement.value = false;
|
|
20
|
+
}, [hasPendingMeasurement]);
|
|
21
|
+
|
|
22
|
+
const queueOrFlushMeasurement = useCallback(() => {
|
|
23
|
+
"worklet";
|
|
24
|
+
if (!enabled) return;
|
|
25
|
+
|
|
26
|
+
if (isAnimating.value) {
|
|
27
|
+
hasPendingMeasurement.value = true;
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
hasPendingMeasurement.value = false;
|
|
32
|
+
onFlush();
|
|
33
|
+
}, [enabled, isAnimating, hasPendingMeasurement, onFlush]);
|
|
34
|
+
|
|
35
|
+
useAnimatedReaction(
|
|
36
|
+
() => {
|
|
37
|
+
"worklet";
|
|
38
|
+
if (!enabled) return false;
|
|
39
|
+
if (!hasPendingMeasurement.value) return false;
|
|
40
|
+
if (isAnimating.value) return false;
|
|
41
|
+
return canFlush ? canFlush() : true;
|
|
42
|
+
},
|
|
43
|
+
(shouldFlush, previousShouldFlush) => {
|
|
44
|
+
"worklet";
|
|
45
|
+
if (!enabled) return;
|
|
46
|
+
if (!shouldFlush || shouldFlush === previousShouldFlush) return;
|
|
47
|
+
|
|
48
|
+
hasPendingMeasurement.value = false;
|
|
49
|
+
onFlush();
|
|
50
|
+
},
|
|
51
|
+
[enabled, isAnimating, hasPendingMeasurement, canFlush, onFlush],
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
return {
|
|
55
|
+
clearPendingMeasurement,
|
|
56
|
+
queueOrFlushMeasurement,
|
|
57
|
+
};
|
|
58
|
+
};
|
package/src/shared/components/create-boundary-component/hooks/use-group-active-measurement.ts
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
import { useAnimatedReaction } from "react-native-reanimated";
|
|
2
|
-
import type { AnimationStore } from "../../../stores/animation.store";
|
|
1
|
+
import { type SharedValue, useAnimatedReaction } from "react-native-reanimated";
|
|
3
2
|
import { BoundStore } from "../../../stores/bounds";
|
|
4
3
|
import type { BoundaryId, MaybeMeasureAndStoreParams } from "../types";
|
|
4
|
+
import {
|
|
5
|
+
canFlushGroupActiveMeasurement,
|
|
6
|
+
resolveGroupActiveMeasurementAction,
|
|
7
|
+
} from "./helpers/measurement-rules";
|
|
8
|
+
import { useDeferredMeasurementTrigger } from "./use-deferred-measurement-trigger";
|
|
5
9
|
|
|
6
10
|
/**
|
|
7
11
|
* Watches the group's active id in the BoundStore.
|
|
@@ -15,7 +19,7 @@ export const useGroupActiveMeasurement = (params: {
|
|
|
15
19
|
group: string | undefined;
|
|
16
20
|
id: BoundaryId;
|
|
17
21
|
shouldUpdateDestination: boolean;
|
|
18
|
-
isAnimating:
|
|
22
|
+
isAnimating: SharedValue<number>;
|
|
19
23
|
maybeMeasureAndStore: (options: MaybeMeasureAndStoreParams) => void;
|
|
20
24
|
}) => {
|
|
21
25
|
const {
|
|
@@ -29,6 +33,24 @@ export const useGroupActiveMeasurement = (params: {
|
|
|
29
33
|
const idStr = String(id);
|
|
30
34
|
|
|
31
35
|
const allGroups = BoundStore.getGroups();
|
|
36
|
+
const { clearPendingMeasurement, queueOrFlushMeasurement } =
|
|
37
|
+
useDeferredMeasurementTrigger({
|
|
38
|
+
enabled,
|
|
39
|
+
isAnimating,
|
|
40
|
+
canFlush: () => {
|
|
41
|
+
"worklet";
|
|
42
|
+
return canFlushGroupActiveMeasurement({
|
|
43
|
+
enabled,
|
|
44
|
+
isEligible: !!group && shouldUpdateDestination,
|
|
45
|
+
memberId: idStr,
|
|
46
|
+
activeId: group ? (allGroups.value[group]?.activeId ?? null) : null,
|
|
47
|
+
});
|
|
48
|
+
},
|
|
49
|
+
onFlush: () => {
|
|
50
|
+
"worklet";
|
|
51
|
+
maybeMeasureAndStore({ intent: "refresh-destination" });
|
|
52
|
+
},
|
|
53
|
+
});
|
|
32
54
|
|
|
33
55
|
useAnimatedReaction(
|
|
34
56
|
() => {
|
|
@@ -39,12 +61,21 @@ export const useGroupActiveMeasurement = (params: {
|
|
|
39
61
|
},
|
|
40
62
|
(activeId, previousActiveId) => {
|
|
41
63
|
"worklet";
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
64
|
+
const action = resolveGroupActiveMeasurementAction({
|
|
65
|
+
enabled,
|
|
66
|
+
isEligible: !!group && shouldUpdateDestination,
|
|
67
|
+
memberId: idStr,
|
|
68
|
+
activeId,
|
|
69
|
+
previousActiveId,
|
|
70
|
+
});
|
|
45
71
|
|
|
46
|
-
if (
|
|
47
|
-
|
|
72
|
+
if (action === "clear-pending") {
|
|
73
|
+
clearPendingMeasurement();
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (action === "queue-or-flush") {
|
|
78
|
+
queueOrFlushMeasurement();
|
|
48
79
|
}
|
|
49
80
|
},
|
|
50
81
|
[
|
|
@@ -52,8 +83,8 @@ export const useGroupActiveMeasurement = (params: {
|
|
|
52
83
|
group,
|
|
53
84
|
idStr,
|
|
54
85
|
shouldUpdateDestination,
|
|
55
|
-
|
|
56
|
-
|
|
86
|
+
clearPendingMeasurement,
|
|
87
|
+
queueOrFlushMeasurement,
|
|
57
88
|
],
|
|
58
89
|
);
|
|
59
90
|
};
|
package/src/shared/components/create-boundary-component/hooks/use-group-active-source-measurement.ts
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { type SharedValue, useAnimatedReaction } from "react-native-reanimated";
|
|
2
|
+
import { BoundStore } from "../../../stores/bounds";
|
|
3
|
+
import type { BoundaryId, MaybeMeasureAndStoreParams } from "../types";
|
|
4
|
+
import {
|
|
5
|
+
canFlushGroupActiveMeasurement,
|
|
6
|
+
resolveGroupActiveMeasurementAction,
|
|
7
|
+
} from "./helpers/measurement-rules";
|
|
8
|
+
import { useDeferredMeasurementTrigger } from "./use-deferred-measurement-trigger";
|
|
9
|
+
|
|
10
|
+
export const useGroupActiveSourceMeasurement = (params: {
|
|
11
|
+
enabled: boolean;
|
|
12
|
+
group: string | undefined;
|
|
13
|
+
id: BoundaryId;
|
|
14
|
+
hasNextScreen: boolean;
|
|
15
|
+
isAnimating: SharedValue<number>;
|
|
16
|
+
maybeMeasureAndStore: (options: MaybeMeasureAndStoreParams) => void;
|
|
17
|
+
}) => {
|
|
18
|
+
const {
|
|
19
|
+
enabled,
|
|
20
|
+
group,
|
|
21
|
+
id,
|
|
22
|
+
hasNextScreen,
|
|
23
|
+
isAnimating,
|
|
24
|
+
maybeMeasureAndStore,
|
|
25
|
+
} = params;
|
|
26
|
+
const idStr = String(id);
|
|
27
|
+
const allGroups = BoundStore.getGroups();
|
|
28
|
+
const { clearPendingMeasurement, queueOrFlushMeasurement } =
|
|
29
|
+
useDeferredMeasurementTrigger({
|
|
30
|
+
enabled,
|
|
31
|
+
isAnimating,
|
|
32
|
+
canFlush: () => {
|
|
33
|
+
"worklet";
|
|
34
|
+
return canFlushGroupActiveMeasurement({
|
|
35
|
+
enabled,
|
|
36
|
+
isEligible: !!group && hasNextScreen,
|
|
37
|
+
memberId: idStr,
|
|
38
|
+
activeId: group ? (allGroups.value[group]?.activeId ?? null) : null,
|
|
39
|
+
});
|
|
40
|
+
},
|
|
41
|
+
onFlush: () => {
|
|
42
|
+
"worklet";
|
|
43
|
+
maybeMeasureAndStore({ intent: "refresh-source" });
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
useAnimatedReaction(
|
|
48
|
+
() => {
|
|
49
|
+
"worklet";
|
|
50
|
+
if (!enabled) return null;
|
|
51
|
+
if (!group) return null;
|
|
52
|
+
return allGroups.value[group]?.activeId ?? null;
|
|
53
|
+
},
|
|
54
|
+
(activeId, previousActiveId) => {
|
|
55
|
+
"worklet";
|
|
56
|
+
const action = resolveGroupActiveMeasurementAction({
|
|
57
|
+
enabled,
|
|
58
|
+
isEligible: !!group && hasNextScreen,
|
|
59
|
+
memberId: idStr,
|
|
60
|
+
activeId,
|
|
61
|
+
previousActiveId,
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
if (action === "clear-pending") {
|
|
65
|
+
clearPendingMeasurement();
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (action === "queue-or-flush") {
|
|
70
|
+
queueOrFlushMeasurement();
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
[
|
|
74
|
+
enabled,
|
|
75
|
+
group,
|
|
76
|
+
idStr,
|
|
77
|
+
hasNextScreen,
|
|
78
|
+
clearPendingMeasurement,
|
|
79
|
+
queueOrFlushMeasurement,
|
|
80
|
+
],
|
|
81
|
+
);
|
|
82
|
+
};
|
|
@@ -4,6 +4,7 @@ import { AnimationStore } from "../../../stores/animation.store";
|
|
|
4
4
|
import { BoundStore } from "../../../stores/bounds";
|
|
5
5
|
import { resolvePendingSourceKey } from "../helpers/resolve-pending-source-key";
|
|
6
6
|
import type { MaybeMeasureAndStoreParams } from "../types";
|
|
7
|
+
import { resolveInitialLayoutMeasurementIntent } from "./helpers/measurement-rules";
|
|
7
8
|
|
|
8
9
|
export const useInitialLayoutHandler = (params: {
|
|
9
10
|
enabled: boolean;
|
|
@@ -46,21 +47,32 @@ export const useInitialLayoutHandler = (params: {
|
|
|
46
47
|
}
|
|
47
48
|
}
|
|
48
49
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
50
|
+
let hasPendingLinkFromSource = false;
|
|
51
|
+
|
|
52
|
+
if (isAnyAnimating) {
|
|
53
|
+
const resolvedSourceKey = resolvePendingSourceKey(
|
|
54
|
+
sharedBoundTag,
|
|
55
|
+
expectedSourceScreenKey,
|
|
56
|
+
);
|
|
57
|
+
if (
|
|
58
|
+
resolvedSourceKey &&
|
|
59
|
+
BoundStore.hasPendingLinkFromSource(sharedBoundTag, resolvedSourceKey)
|
|
60
|
+
) {
|
|
61
|
+
hasPendingLinkFromSource = true;
|
|
62
|
+
}
|
|
59
63
|
}
|
|
60
64
|
|
|
65
|
+
const intent = resolveInitialLayoutMeasurementIntent({
|
|
66
|
+
enabled,
|
|
67
|
+
hasSharedBoundTag: !!sharedBoundTag,
|
|
68
|
+
hasMeasuredOnLayout: hasMeasuredOnLayout.get(),
|
|
69
|
+
isAnyAnimating: !!isAnyAnimating,
|
|
70
|
+
hasPendingLinkFromSource,
|
|
71
|
+
});
|
|
72
|
+
if (!intent) return;
|
|
73
|
+
|
|
61
74
|
maybeMeasureAndStore({
|
|
62
|
-
|
|
63
|
-
shouldSetDestination: true,
|
|
75
|
+
intent,
|
|
64
76
|
});
|
|
65
77
|
|
|
66
78
|
hasMeasuredOnLayout.set(true);
|
package/src/shared/components/create-boundary-component/hooks/use-pending-destination-measurement.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { useAnimatedReaction } from "react-native-reanimated";
|
|
|
2
2
|
import { BoundStore } from "../../../stores/bounds";
|
|
3
3
|
import { resolvePendingSourceKey } from "../helpers/resolve-pending-source-key";
|
|
4
4
|
import type { MaybeMeasureAndStoreParams } from "../types";
|
|
5
|
+
import { resolvePendingDestinationCaptureSignal } from "./helpers/measurement-rules";
|
|
5
6
|
|
|
6
7
|
export const usePendingDestinationMeasurement = (params: {
|
|
7
8
|
sharedBoundTag: string;
|
|
@@ -19,19 +20,20 @@ export const usePendingDestinationMeasurement = (params: {
|
|
|
19
20
|
useAnimatedReaction(
|
|
20
21
|
() => {
|
|
21
22
|
"worklet";
|
|
22
|
-
if (!enabled) return 0;
|
|
23
23
|
const resolvedSourceKey = resolvePendingSourceKey(
|
|
24
24
|
sharedBoundTag,
|
|
25
25
|
expectedSourceScreenKey,
|
|
26
26
|
);
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
return BoundStore.hasPendingLinkFromSource(
|
|
30
|
-
sharedBoundTag,
|
|
27
|
+
return resolvePendingDestinationCaptureSignal({
|
|
28
|
+
enabled,
|
|
31
29
|
resolvedSourceKey,
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
30
|
+
hasPendingLinkFromSource: resolvedSourceKey
|
|
31
|
+
? BoundStore.hasPendingLinkFromSource(
|
|
32
|
+
sharedBoundTag,
|
|
33
|
+
resolvedSourceKey,
|
|
34
|
+
)
|
|
35
|
+
: false,
|
|
36
|
+
});
|
|
35
37
|
},
|
|
36
38
|
(captureSignal, previousCaptureSignal) => {
|
|
37
39
|
"worklet";
|
|
@@ -40,7 +42,7 @@ export const usePendingDestinationMeasurement = (params: {
|
|
|
40
42
|
return;
|
|
41
43
|
}
|
|
42
44
|
|
|
43
|
-
maybeMeasureAndStore({
|
|
45
|
+
maybeMeasureAndStore({ intent: "complete-destination" });
|
|
44
46
|
},
|
|
45
47
|
[enabled, sharedBoundTag, expectedSourceScreenKey, maybeMeasureAndStore],
|
|
46
48
|
);
|
|
@@ -1,16 +1,20 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import {
|
|
2
|
+
type SharedValue,
|
|
3
|
+
useAnimatedReaction,
|
|
4
|
+
useSharedValue,
|
|
5
|
+
} from "react-native-reanimated";
|
|
3
6
|
import { BoundStore } from "../../../stores/bounds";
|
|
4
7
|
import { resolvePendingSourceKey } from "../helpers/resolve-pending-source-key";
|
|
5
8
|
import type { MaybeMeasureAndStoreParams } from "../types";
|
|
9
|
+
import { resolvePendingDestinationRetrySignal } from "./helpers/measurement-rules";
|
|
6
10
|
|
|
7
11
|
export const usePendingDestinationRetryMeasurement = (params: {
|
|
8
12
|
sharedBoundTag: string;
|
|
9
13
|
enabled: boolean;
|
|
10
14
|
currentScreenKey: string;
|
|
11
15
|
expectedSourceScreenKey?: string;
|
|
12
|
-
progress:
|
|
13
|
-
animating:
|
|
16
|
+
progress: SharedValue<number>;
|
|
17
|
+
animating: SharedValue<number>;
|
|
14
18
|
maybeMeasureAndStore: (options: MaybeMeasureAndStoreParams) => void;
|
|
15
19
|
}) => {
|
|
16
20
|
const {
|
|
@@ -31,31 +35,30 @@ export const usePendingDestinationRetryMeasurement = (params: {
|
|
|
31
35
|
useAnimatedReaction(
|
|
32
36
|
() => {
|
|
33
37
|
"worklet";
|
|
34
|
-
if (!enabled) return 0;
|
|
35
|
-
if (retryCount.get() >= MAX_RETRIES) return 0;
|
|
36
|
-
if (!animating.get()) return 0;
|
|
37
|
-
if (BoundStore.hasDestinationLink(sharedBoundTag, currentScreenKey))
|
|
38
|
-
return 0;
|
|
39
|
-
|
|
40
|
-
const currentProgress = progress.get();
|
|
41
|
-
if (currentProgress <= 0 || currentProgress >= RETRY_PROGRESS_MAX) {
|
|
42
|
-
return 0;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
38
|
const resolvedSourceKey = resolvePendingSourceKey(
|
|
46
39
|
sharedBoundTag,
|
|
47
40
|
expectedSourceScreenKey,
|
|
48
41
|
);
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
42
|
+
return resolvePendingDestinationRetrySignal({
|
|
43
|
+
enabled,
|
|
44
|
+
retryCount: retryCount.get(),
|
|
45
|
+
maxRetries: MAX_RETRIES,
|
|
46
|
+
isAnimating: !!animating.get(),
|
|
47
|
+
hasDestinationLink: BoundStore.hasDestinationLink(
|
|
48
|
+
sharedBoundTag,
|
|
49
|
+
currentScreenKey,
|
|
50
|
+
),
|
|
51
|
+
progress: progress.get(),
|
|
52
|
+
retryProgressMax: RETRY_PROGRESS_MAX,
|
|
53
|
+
retryProgressBuckets: RETRY_PROGRESS_BUCKETS,
|
|
54
|
+
resolvedSourceKey,
|
|
55
|
+
hasPendingLinkFromSource: resolvedSourceKey
|
|
56
|
+
? BoundStore.hasPendingLinkFromSource(
|
|
57
|
+
sharedBoundTag,
|
|
58
|
+
resolvedSourceKey,
|
|
59
|
+
)
|
|
60
|
+
: false,
|
|
61
|
+
});
|
|
59
62
|
},
|
|
60
63
|
(captureSignal) => {
|
|
61
64
|
"worklet";
|
|
@@ -67,7 +70,7 @@ export const usePendingDestinationRetryMeasurement = (params: {
|
|
|
67
70
|
|
|
68
71
|
if (retryCount.get() >= MAX_RETRIES) return;
|
|
69
72
|
retryCount.set(retryCount.get() + 1);
|
|
70
|
-
maybeMeasureAndStore({
|
|
73
|
+
maybeMeasureAndStore({ intent: "complete-destination" });
|
|
71
74
|
},
|
|
72
75
|
[
|
|
73
76
|
enabled,
|
package/src/shared/components/create-boundary-component/hooks/use-scroll-settled-measurement.ts
CHANGED
|
@@ -1,40 +1,49 @@
|
|
|
1
|
-
import { useAnimatedReaction } from "react-native-reanimated";
|
|
1
|
+
import { type SharedValue, useAnimatedReaction } from "react-native-reanimated";
|
|
2
2
|
import { useScrollSettleContext } from "../../../providers/scroll-settle.provider";
|
|
3
|
-
import type { AnimationStore } from "../../../stores/animation.store";
|
|
4
3
|
import type { MaybeMeasureAndStoreParams } from "../types";
|
|
4
|
+
import { shouldTriggerScrollSettledRefresh } from "./helpers/measurement-rules";
|
|
5
|
+
import { useDeferredMeasurementTrigger } from "./use-deferred-measurement-trigger";
|
|
5
6
|
|
|
6
7
|
export const useScrollSettledMeasurement = (params: {
|
|
7
8
|
enabled: boolean;
|
|
8
9
|
group: string | undefined;
|
|
9
10
|
hasNextScreen: boolean;
|
|
10
|
-
isAnimating:
|
|
11
|
+
isAnimating: SharedValue<number>;
|
|
11
12
|
maybeMeasureAndStore: (options: MaybeMeasureAndStoreParams) => void;
|
|
12
13
|
}) => {
|
|
13
14
|
const { enabled, group, hasNextScreen, isAnimating, maybeMeasureAndStore } =
|
|
14
15
|
params;
|
|
15
16
|
const scrollSettle = useScrollSettleContext();
|
|
16
17
|
const settledSignal = scrollSettle?.settledSignal;
|
|
18
|
+
const { queueOrFlushMeasurement } = useDeferredMeasurementTrigger({
|
|
19
|
+
enabled,
|
|
20
|
+
isAnimating,
|
|
21
|
+
onFlush: () => {
|
|
22
|
+
"worklet";
|
|
23
|
+
maybeMeasureAndStore({ intent: "refresh-source" });
|
|
24
|
+
},
|
|
25
|
+
});
|
|
17
26
|
|
|
18
27
|
useAnimatedReaction(
|
|
19
28
|
() => settledSignal?.value ?? 0,
|
|
20
29
|
(signal, previousSignal) => {
|
|
21
30
|
"worklet";
|
|
22
|
-
if (
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
31
|
+
if (
|
|
32
|
+
!shouldTriggerScrollSettledRefresh({
|
|
33
|
+
enabled,
|
|
34
|
+
group,
|
|
35
|
+
hasNextScreen,
|
|
36
|
+
hasSettledSignal: !!settledSignal,
|
|
37
|
+
signal,
|
|
38
|
+
previousSignal,
|
|
39
|
+
})
|
|
40
|
+
) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
27
43
|
// Re-measure source bounds after scroll settles while idle.
|
|
28
44
|
// This captures post-scroll positions before close transition starts.
|
|
29
|
-
|
|
45
|
+
queueOrFlushMeasurement();
|
|
30
46
|
},
|
|
31
|
-
[
|
|
32
|
-
enabled,
|
|
33
|
-
group,
|
|
34
|
-
hasNextScreen,
|
|
35
|
-
settledSignal,
|
|
36
|
-
isAnimating,
|
|
37
|
-
maybeMeasureAndStore,
|
|
38
|
-
],
|
|
47
|
+
[enabled, group, hasNextScreen, settledSignal, queueOrFlushMeasurement],
|
|
39
48
|
);
|
|
40
49
|
};
|
|
@@ -17,6 +17,7 @@ import { useAutoSourceMeasurement } from "./hooks/use-auto-source-measurement";
|
|
|
17
17
|
import { useBoundaryMeasureAndStore } from "./hooks/use-boundary-measure-and-store";
|
|
18
18
|
import { useBoundaryPresence } from "./hooks/use-boundary-presence";
|
|
19
19
|
import { useGroupActiveMeasurement } from "./hooks/use-group-active-measurement";
|
|
20
|
+
import { useGroupActiveSourceMeasurement } from "./hooks/use-group-active-source-measurement";
|
|
20
21
|
import { useInitialLayoutHandler } from "./hooks/use-initial-layout-handler";
|
|
21
22
|
import { usePendingDestinationMeasurement } from "./hooks/use-pending-destination-measurement";
|
|
22
23
|
import { usePendingDestinationRetryMeasurement } from "./hooks/use-pending-destination-retry-measurement";
|
|
@@ -24,15 +25,23 @@ import { useScrollSettledMeasurement } from "./hooks/use-scroll-settled-measurem
|
|
|
24
25
|
import type { BoundaryComponentProps, BoundaryConfigProps } from "./types";
|
|
25
26
|
import { buildBoundaryMatchKey } from "./utils/build-boundary-match-key";
|
|
26
27
|
|
|
27
|
-
const
|
|
28
|
+
const setGroupSelectionOnUI = (group: string, id: string) => {
|
|
28
29
|
"worklet";
|
|
29
30
|
BoundStore.setGroupActiveId(group, id);
|
|
30
31
|
};
|
|
31
32
|
|
|
33
|
+
interface CreateBoundaryComponentOptions {
|
|
34
|
+
alreadyAnimated?: boolean;
|
|
35
|
+
}
|
|
36
|
+
|
|
32
37
|
export function createBoundaryComponent<P extends object>(
|
|
33
38
|
Wrapped: ComponentType<P>,
|
|
39
|
+
options: CreateBoundaryComponentOptions = {},
|
|
34
40
|
) {
|
|
35
|
-
const
|
|
41
|
+
const { alreadyAnimated = false } = options;
|
|
42
|
+
const AnimatedComponent = alreadyAnimated
|
|
43
|
+
? Wrapped
|
|
44
|
+
: Animated.createAnimatedComponent(Wrapped);
|
|
36
45
|
|
|
37
46
|
const Inner = forwardRef<
|
|
38
47
|
React.ComponentRef<typeof AnimatedComponent>,
|
|
@@ -99,7 +108,6 @@ export function createBoundaryComponent<P extends object>(
|
|
|
99
108
|
const { associatedStyles } = useAssociatedStyles({
|
|
100
109
|
id: sharedBoundTag,
|
|
101
110
|
resetTransformOnUnset: true,
|
|
102
|
-
waitForFirstResolvedStyle: true,
|
|
103
111
|
});
|
|
104
112
|
|
|
105
113
|
const maybeMeasureAndStore = useBoundaryMeasureAndStore({
|
|
@@ -171,6 +179,18 @@ export function createBoundaryComponent<P extends object>(
|
|
|
171
179
|
maybeMeasureAndStore,
|
|
172
180
|
});
|
|
173
181
|
|
|
182
|
+
// Source-side analog for grouped retargeting: when an unfocused/source
|
|
183
|
+
// boundary becomes the active member, refresh its snapshot (and source
|
|
184
|
+
// link when one exists) so close transitions don't use stale geometry.
|
|
185
|
+
useGroupActiveSourceMeasurement({
|
|
186
|
+
enabled: runtimeEnabled,
|
|
187
|
+
group,
|
|
188
|
+
id,
|
|
189
|
+
hasNextScreen,
|
|
190
|
+
isAnimating,
|
|
191
|
+
maybeMeasureAndStore,
|
|
192
|
+
});
|
|
193
|
+
|
|
174
194
|
// While idle on source screens, re-measure after scroll settles so a later
|
|
175
195
|
// close transition starts from up-to-date source geometry.
|
|
176
196
|
useScrollSettledMeasurement({
|
|
@@ -196,9 +216,9 @@ export function createBoundaryComponent<P extends object>(
|
|
|
196
216
|
(...args: unknown[]) => {
|
|
197
217
|
// Press path has priority: capture source before user onPress/navigation.
|
|
198
218
|
if (group) {
|
|
199
|
-
runOnUI(
|
|
219
|
+
runOnUI(setGroupSelectionOnUI)(group, String(id));
|
|
200
220
|
}
|
|
201
|
-
runOnUI(maybeMeasureAndStore)({
|
|
221
|
+
runOnUI(maybeMeasureAndStore)({ intent: "capture-source" });
|
|
202
222
|
|
|
203
223
|
if (typeof onPress === "function") {
|
|
204
224
|
onPress(...args);
|
|
@@ -258,6 +278,4 @@ export const Boundary = {
|
|
|
258
278
|
View: BoundaryView,
|
|
259
279
|
/** Pressable boundary wrapper with press-priority source capture. */
|
|
260
280
|
Pressable: BoundaryPressable,
|
|
261
|
-
/** Factory for custom boundary wrappers. */
|
|
262
|
-
createBoundaryComponent,
|
|
263
281
|
};
|
|
@@ -39,9 +39,13 @@ export type BoundaryComponentProps<P extends object> = Omit<P, "id"> &
|
|
|
39
39
|
/** Convenience alias for a View-based boundary (the most common case). */
|
|
40
40
|
export type BoundaryProps = BoundaryComponentProps<ViewProps>;
|
|
41
41
|
|
|
42
|
+
export type MeasurementIntent =
|
|
43
|
+
| "capture-source"
|
|
44
|
+
| "complete-destination"
|
|
45
|
+
| "refresh-source"
|
|
46
|
+
| "refresh-destination"
|
|
47
|
+
| "snapshot-only";
|
|
48
|
+
|
|
42
49
|
export interface MaybeMeasureAndStoreParams {
|
|
43
|
-
|
|
44
|
-
shouldSetDestination?: boolean;
|
|
45
|
-
shouldUpdateSource?: boolean;
|
|
46
|
-
shouldUpdateDestination?: boolean;
|
|
50
|
+
intent?: MeasurementIntent | readonly MeasurementIntent[];
|
|
47
51
|
}
|
|
@@ -17,15 +17,18 @@ import type { TransitionAwareProps } from "../types/screen.types";
|
|
|
17
17
|
|
|
18
18
|
interface CreateTransitionAwareComponentOptions {
|
|
19
19
|
isScrollable?: boolean;
|
|
20
|
+
alreadyAnimated?: boolean;
|
|
20
21
|
}
|
|
21
22
|
|
|
22
23
|
export function createTransitionAwareComponent<P extends object>(
|
|
23
24
|
Wrapped: ComponentType<P>,
|
|
24
25
|
options: CreateTransitionAwareComponentOptions = {},
|
|
25
26
|
) {
|
|
26
|
-
const { isScrollable = false } = options;
|
|
27
|
+
const { isScrollable = false, alreadyAnimated = false } = options;
|
|
27
28
|
|
|
28
|
-
const AnimatedComponent =
|
|
29
|
+
const AnimatedComponent = alreadyAnimated
|
|
30
|
+
? Wrapped
|
|
31
|
+
: Animated.createAnimatedComponent(Wrapped);
|
|
29
32
|
|
|
30
33
|
const ScrollableInner = forwardRef<
|
|
31
34
|
React.ComponentRef<typeof Wrapped>,
|
|
@@ -137,7 +140,6 @@ export function createTransitionAwareComponent<P extends object>(
|
|
|
137
140
|
id: sharedBoundTag || styleId,
|
|
138
141
|
style,
|
|
139
142
|
resetTransformOnUnset: !!sharedBoundTag,
|
|
140
|
-
waitForFirstResolvedStyle: false,
|
|
141
143
|
});
|
|
142
144
|
|
|
143
145
|
return (
|
|
@@ -8,14 +8,22 @@ interface Props {
|
|
|
8
8
|
|
|
9
9
|
export const NativeScreenContainer = ({ children }: Props) => {
|
|
10
10
|
const {
|
|
11
|
-
flags: {
|
|
11
|
+
flags: {
|
|
12
|
+
DISABLE_NATIVE_SCREENS = false,
|
|
13
|
+
DISABLE_NATIVE_SCREEN_CONTAINER = false,
|
|
14
|
+
},
|
|
12
15
|
} = useStack();
|
|
13
|
-
if (!DISABLE_NATIVE_SCREENS) {
|
|
16
|
+
if (!DISABLE_NATIVE_SCREENS && !DISABLE_NATIVE_SCREEN_CONTAINER) {
|
|
14
17
|
return (
|
|
15
18
|
<ScreenContainer style={styles.container}>{children}</ScreenContainer>
|
|
16
19
|
);
|
|
17
20
|
}
|
|
18
|
-
return
|
|
21
|
+
return (
|
|
22
|
+
// Mirror ScreenContainer's native boundary when screens are disabled.
|
|
23
|
+
<View collapsable={false} style={styles.container}>
|
|
24
|
+
{children}
|
|
25
|
+
</View>
|
|
26
|
+
);
|
|
19
27
|
};
|
|
20
28
|
|
|
21
29
|
const styles = StyleSheet.create({
|