react-native-screen-transitions 4.1.0-beta.0 → 4.1.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/commonjs/components/boundary/components/boundary-lifecycle.js +40 -8
- package/lib/commonjs/components/boundary/components/boundary-lifecycle.js.map +1 -1
- package/lib/commonjs/components/boundary/components/boundary-target.js +10 -17
- package/lib/commonjs/components/boundary/components/boundary-target.js.map +1 -1
- package/lib/commonjs/components/boundary/create-boundary-component.js +13 -16
- package/lib/commonjs/components/boundary/create-boundary-component.js.map +1 -1
- package/lib/commonjs/components/boundary/helpers/presentation.js +56 -0
- package/lib/commonjs/components/boundary/helpers/presentation.js.map +1 -0
- package/lib/commonjs/components/boundary/hooks/use-boundary-presentation.js +65 -0
- package/lib/commonjs/components/boundary/hooks/use-boundary-presentation.js.map +1 -0
- package/lib/commonjs/components/boundary/hooks/use-composed-boundary-style.js +43 -0
- package/lib/commonjs/components/boundary/hooks/use-composed-boundary-style.js.map +1 -0
- package/lib/commonjs/components/boundary/index.js +2 -3
- package/lib/commonjs/components/boundary/index.js.map +1 -1
- package/lib/commonjs/components/boundary/portal/components/portal-host.js +39 -0
- package/lib/commonjs/components/boundary/portal/components/portal-host.js.map +1 -0
- package/lib/commonjs/components/boundary/portal/components/portal-overlay.js +170 -0
- package/lib/commonjs/components/boundary/portal/components/portal-overlay.js.map +1 -0
- package/lib/commonjs/components/boundary/portal/components/portal.js +88 -0
- package/lib/commonjs/components/boundary/portal/components/portal.js.map +1 -0
- package/lib/commonjs/components/boundary/portal/helpers/offset-style.js.map +1 -0
- package/lib/commonjs/components/boundary/portal/hooks/use-active-portal-boundary-host.js +35 -0
- package/lib/commonjs/components/boundary/portal/hooks/use-active-portal-boundary-host.js.map +1 -0
- package/lib/commonjs/components/boundary/portal/hooks/use-host-measurement.js +83 -0
- package/lib/commonjs/components/boundary/portal/hooks/use-host-measurement.js.map +1 -0
- package/lib/commonjs/components/boundary/portal/hooks/use-placeholder-styles.js.map +1 -0
- package/lib/commonjs/components/boundary/portal/hooks/use-portal-destination.js +58 -0
- package/lib/commonjs/components/boundary/portal/hooks/use-portal-destination.js.map +1 -0
- package/lib/commonjs/components/boundary/portal/index.js +0 -7
- package/lib/commonjs/components/boundary/portal/index.js.map +1 -1
- package/lib/commonjs/components/boundary/portal/{components/boundary-portal/stores → stores}/host-registry.store.js +1 -12
- package/lib/commonjs/components/boundary/portal/stores/host-registry.store.js.map +1 -0
- package/lib/commonjs/components/boundary/portal/{components/boundary-portal/stores → stores}/portal-boundary-host.store.js +17 -17
- package/lib/commonjs/components/boundary/portal/stores/portal-boundary-host.store.js.map +1 -0
- package/lib/commonjs/components/boundary/portal/utils/naming.js +8 -1
- package/lib/commonjs/components/boundary/portal/utils/naming.js.map +1 -1
- package/lib/commonjs/components/boundary/portal/utils/resolve-portal.js +7 -27
- package/lib/commonjs/components/boundary/portal/utils/resolve-portal.js.map +1 -1
- package/lib/commonjs/components/boundary/providers/boundary-root.provider.js +13 -7
- package/lib/commonjs/components/boundary/providers/boundary-root.provider.js.map +1 -1
- package/lib/commonjs/components/screen/container/helpers/layer-component.js +39 -0
- package/lib/commonjs/components/screen/container/helpers/layer-component.js.map +1 -0
- package/lib/commonjs/components/screen/container/{layers/render-component.js → helpers/uses-layer-render-props.js} +1 -1
- package/lib/commonjs/components/screen/container/helpers/uses-layer-render-props.js.map +1 -0
- package/lib/commonjs/components/screen/container/layers/backdrop.js +4 -13
- package/lib/commonjs/components/screen/container/layers/backdrop.js.map +1 -1
- package/lib/commonjs/components/screen/container/layers/clip.js +117 -0
- package/lib/commonjs/components/screen/container/layers/clip.js.map +1 -0
- package/lib/commonjs/components/screen/container/layers/content.js +17 -33
- package/lib/commonjs/components/screen/container/layers/content.js.map +1 -1
- package/lib/commonjs/components/screen/container/layers/surface.js +3 -15
- package/lib/commonjs/components/screen/container/layers/surface.js.map +1 -1
- package/lib/commonjs/components/screen/lifecycle/hooks/use-open-transition-intent.js +15 -0
- package/lib/commonjs/components/screen/lifecycle/hooks/use-open-transition-intent.js.map +1 -1
- package/lib/commonjs/constants.js +3 -1
- package/lib/commonjs/constants.js.map +1 -1
- package/lib/commonjs/hooks/navigation/use-navigation-helpers.js +16 -4
- package/lib/commonjs/hooks/navigation/use-navigation-helpers.js.map +1 -1
- package/lib/commonjs/providers/screen/motion/animation/helpers/build-screen-transition-options.js +0 -1
- package/lib/commonjs/providers/screen/motion/animation/helpers/build-screen-transition-options.js.map +1 -1
- package/lib/commonjs/providers/screen/motion/animation/helpers/hydrate-transition-state/index.js +3 -2
- package/lib/commonjs/providers/screen/motion/animation/helpers/hydrate-transition-state/index.js.map +1 -1
- package/lib/commonjs/providers/screen/motion/options/helpers.js +1 -3
- package/lib/commonjs/providers/screen/motion/options/helpers.js.map +1 -1
- package/lib/commonjs/providers/screen/orchestrator/helpers/use-interpolator-state.js +4 -2
- package/lib/commonjs/providers/screen/orchestrator/helpers/use-interpolator-state.js.map +1 -1
- package/lib/commonjs/providers/screen/orchestrator/helpers/use-pair-presentation.js +79 -0
- package/lib/commonjs/providers/screen/orchestrator/helpers/use-pair-presentation.js.map +1 -0
- package/lib/commonjs/providers/screen/orchestrator/orchestrator.provider.js +3 -0
- package/lib/commonjs/providers/screen/orchestrator/orchestrator.provider.js.map +1 -1
- package/lib/commonjs/providers/screen/orchestrator/styles/constants.js +1 -0
- package/lib/commonjs/providers/screen/orchestrator/styles/constants.js.map +1 -1
- package/lib/commonjs/providers/screen/orchestrator/styles/hooks/slot-resolvers.js +5 -8
- package/lib/commonjs/providers/screen/orchestrator/styles/hooks/slot-resolvers.js.map +1 -1
- package/lib/commonjs/utils/bounds/navigation/reveal/build.js +28 -61
- package/lib/commonjs/utils/bounds/navigation/reveal/build.js.map +1 -1
- package/lib/commonjs/utils/bounds/navigation/reveal/config.js +3 -4
- package/lib/commonjs/utils/bounds/navigation/reveal/config.js.map +1 -1
- package/lib/commonjs/utils/bounds/navigation/reveal/math.js +8 -8
- package/lib/commonjs/utils/bounds/navigation/reveal/math.js.map +1 -1
- package/lib/commonjs/utils/bounds/navigation/reveal/types.js +3 -1
- package/lib/commonjs/utils/bounds/navigation/reveal/types.js.map +1 -1
- package/lib/commonjs/utils/bounds/navigation/zoom/build.js +4 -6
- package/lib/commonjs/utils/bounds/navigation/zoom/build.js.map +1 -1
- package/lib/commonjs/utils/bounds/navigation/zoom/clip.js +64 -0
- package/lib/commonjs/utils/bounds/navigation/zoom/clip.js.map +1 -0
- package/lib/commonjs/utils/bounds/navigation/zoom/drag.js +1 -1
- package/lib/commonjs/utils/bounds/navigation/zoom/drag.js.map +1 -1
- package/lib/commonjs/utils/bounds/navigation/zoom/types.js +3 -1
- package/lib/commonjs/utils/bounds/navigation/zoom/types.js.map +1 -1
- package/lib/module/components/boundary/components/boundary-lifecycle.js +41 -9
- package/lib/module/components/boundary/components/boundary-lifecycle.js.map +1 -1
- package/lib/module/components/boundary/components/boundary-target.js +10 -17
- package/lib/module/components/boundary/components/boundary-target.js.map +1 -1
- package/lib/module/components/boundary/create-boundary-component.js +13 -16
- package/lib/module/components/boundary/create-boundary-component.js.map +1 -1
- package/lib/module/components/boundary/helpers/presentation.js +50 -0
- package/lib/module/components/boundary/helpers/presentation.js.map +1 -0
- package/lib/module/components/boundary/hooks/use-boundary-presentation.js +62 -0
- package/lib/module/components/boundary/hooks/use-boundary-presentation.js.map +1 -0
- package/lib/module/components/boundary/hooks/use-composed-boundary-style.js +39 -0
- package/lib/module/components/boundary/hooks/use-composed-boundary-style.js.map +1 -0
- package/lib/module/components/boundary/index.js +2 -3
- package/lib/module/components/boundary/index.js.map +1 -1
- package/lib/module/components/boundary/portal/components/portal-host.js +34 -0
- package/lib/module/components/boundary/portal/components/portal-host.js.map +1 -0
- package/lib/module/components/boundary/portal/components/portal-overlay.js +165 -0
- package/lib/module/components/boundary/portal/components/portal-overlay.js.map +1 -0
- package/lib/module/components/boundary/portal/components/portal.js +83 -0
- package/lib/module/components/boundary/portal/components/portal.js.map +1 -0
- package/lib/module/components/boundary/portal/helpers/offset-style.js.map +1 -0
- package/lib/module/components/boundary/portal/hooks/use-active-portal-boundary-host.js +31 -0
- package/lib/module/components/boundary/portal/hooks/use-active-portal-boundary-host.js.map +1 -0
- package/lib/module/components/boundary/portal/hooks/use-host-measurement.js +78 -0
- package/lib/module/components/boundary/portal/hooks/use-host-measurement.js.map +1 -0
- package/lib/module/components/boundary/portal/hooks/use-placeholder-styles.js.map +1 -0
- package/lib/module/components/boundary/portal/hooks/use-portal-destination.js +54 -0
- package/lib/module/components/boundary/portal/hooks/use-portal-destination.js.map +1 -0
- package/lib/module/components/boundary/portal/index.js +0 -1
- package/lib/module/components/boundary/portal/index.js.map +1 -1
- package/lib/module/components/boundary/portal/{components/boundary-portal/stores → stores}/host-registry.store.js +1 -12
- package/lib/module/components/boundary/portal/stores/host-registry.store.js.map +1 -0
- package/lib/module/components/boundary/portal/{components/boundary-portal/stores → stores}/portal-boundary-host.store.js +17 -17
- package/lib/module/components/boundary/portal/stores/portal-boundary-host.store.js.map +1 -0
- package/lib/module/components/boundary/portal/utils/naming.js +6 -0
- package/lib/module/components/boundary/portal/utils/naming.js.map +1 -1
- package/lib/module/components/boundary/portal/utils/resolve-portal.js +7 -27
- package/lib/module/components/boundary/portal/utils/resolve-portal.js.map +1 -1
- package/lib/module/components/boundary/providers/boundary-root.provider.js +13 -7
- package/lib/module/components/boundary/providers/boundary-root.provider.js.map +1 -1
- package/lib/module/components/screen/container/helpers/layer-component.js +35 -0
- package/lib/module/components/screen/container/helpers/layer-component.js.map +1 -0
- package/lib/module/components/screen/container/{layers/render-component.js → helpers/uses-layer-render-props.js} +1 -1
- package/lib/module/components/screen/container/helpers/uses-layer-render-props.js.map +1 -0
- package/lib/module/components/screen/container/layers/backdrop.js +5 -13
- package/lib/module/components/screen/container/layers/backdrop.js.map +1 -1
- package/lib/module/components/screen/container/layers/clip.js +112 -0
- package/lib/module/components/screen/container/layers/clip.js.map +1 -0
- package/lib/module/components/screen/container/layers/content.js +18 -33
- package/lib/module/components/screen/container/layers/content.js.map +1 -1
- package/lib/module/components/screen/container/layers/surface.js +4 -15
- package/lib/module/components/screen/container/layers/surface.js.map +1 -1
- package/lib/module/components/screen/lifecycle/hooks/use-open-transition-intent.js +17 -2
- package/lib/module/components/screen/lifecycle/hooks/use-open-transition-intent.js.map +1 -1
- package/lib/module/constants.js +3 -1
- package/lib/module/constants.js.map +1 -1
- package/lib/module/hooks/navigation/use-navigation-helpers.js +16 -4
- package/lib/module/hooks/navigation/use-navigation-helpers.js.map +1 -1
- package/lib/module/providers/screen/motion/animation/helpers/build-screen-transition-options.js +0 -1
- package/lib/module/providers/screen/motion/animation/helpers/build-screen-transition-options.js.map +1 -1
- package/lib/module/providers/screen/motion/animation/helpers/hydrate-transition-state/index.js +3 -2
- package/lib/module/providers/screen/motion/animation/helpers/hydrate-transition-state/index.js.map +1 -1
- package/lib/module/providers/screen/motion/options/helpers.js +1 -3
- package/lib/module/providers/screen/motion/options/helpers.js.map +1 -1
- package/lib/module/providers/screen/orchestrator/helpers/use-interpolator-state.js +6 -4
- package/lib/module/providers/screen/orchestrator/helpers/use-interpolator-state.js.map +1 -1
- package/lib/module/providers/screen/orchestrator/helpers/use-pair-presentation.js +73 -0
- package/lib/module/providers/screen/orchestrator/helpers/use-pair-presentation.js.map +1 -0
- package/lib/module/providers/screen/orchestrator/orchestrator.provider.js +3 -0
- package/lib/module/providers/screen/orchestrator/orchestrator.provider.js.map +1 -1
- package/lib/module/providers/screen/orchestrator/styles/constants.js +1 -0
- package/lib/module/providers/screen/orchestrator/styles/constants.js.map +1 -1
- package/lib/module/providers/screen/orchestrator/styles/hooks/slot-resolvers.js +5 -8
- package/lib/module/providers/screen/orchestrator/styles/hooks/slot-resolvers.js.map +1 -1
- package/lib/module/types/animation.types.js +3 -1
- package/lib/module/types/animation.types.js.map +1 -1
- package/lib/module/utils/bounds/navigation/reveal/build.js +30 -63
- package/lib/module/utils/bounds/navigation/reveal/build.js.map +1 -1
- package/lib/module/utils/bounds/navigation/reveal/config.js +2 -3
- package/lib/module/utils/bounds/navigation/reveal/config.js.map +1 -1
- package/lib/module/utils/bounds/navigation/reveal/math.js +7 -7
- package/lib/module/utils/bounds/navigation/reveal/math.js.map +1 -1
- package/lib/module/utils/bounds/navigation/reveal/types.js +1 -1
- package/lib/module/utils/bounds/navigation/reveal/types.js.map +1 -1
- package/lib/module/utils/bounds/navigation/zoom/build.js +5 -7
- package/lib/module/utils/bounds/navigation/zoom/build.js.map +1 -1
- package/lib/module/utils/bounds/navigation/zoom/clip.js +59 -0
- package/lib/module/utils/bounds/navigation/zoom/clip.js.map +1 -0
- package/lib/module/utils/bounds/navigation/zoom/drag.js +1 -1
- package/lib/module/utils/bounds/navigation/zoom/drag.js.map +1 -1
- package/lib/module/utils/bounds/navigation/zoom/types.js +1 -1
- package/lib/module/utils/bounds/navigation/zoom/types.js.map +1 -1
- package/lib/typescript/components/boundary/components/boundary-lifecycle.d.ts.map +1 -1
- package/lib/typescript/components/boundary/components/boundary-target.d.ts.map +1 -1
- package/lib/typescript/components/boundary/create-boundary-component.d.ts.map +1 -1
- package/lib/typescript/components/boundary/helpers/presentation.d.ts +14 -0
- package/lib/typescript/components/boundary/helpers/presentation.d.ts.map +1 -0
- package/lib/typescript/components/boundary/hooks/use-boundary-presentation.d.ts +9 -0
- package/lib/typescript/components/boundary/hooks/use-boundary-presentation.d.ts.map +1 -0
- package/lib/typescript/components/boundary/hooks/use-composed-boundary-style.d.ts +4 -0
- package/lib/typescript/components/boundary/hooks/use-composed-boundary-style.d.ts.map +1 -0
- package/lib/typescript/components/boundary/index.d.ts +3 -2
- package/lib/typescript/components/boundary/index.d.ts.map +1 -1
- package/lib/typescript/components/boundary/portal/components/portal-host.d.ts +15 -0
- package/lib/typescript/components/boundary/portal/components/portal-host.d.ts.map +1 -0
- package/lib/typescript/components/boundary/portal/components/portal-overlay.d.ts +20 -0
- package/lib/typescript/components/boundary/portal/components/portal-overlay.d.ts.map +1 -0
- package/lib/typescript/components/boundary/portal/components/portal.d.ts +23 -0
- package/lib/typescript/components/boundary/portal/components/portal.d.ts.map +1 -0
- package/lib/typescript/components/boundary/portal/helpers/offset-style.d.ts.map +1 -0
- package/lib/typescript/components/boundary/portal/hooks/use-active-portal-boundary-host.d.ts +11 -0
- package/lib/typescript/components/boundary/portal/hooks/use-active-portal-boundary-host.d.ts.map +1 -0
- package/lib/typescript/components/boundary/portal/hooks/use-host-measurement.d.ts +13 -0
- package/lib/typescript/components/boundary/portal/hooks/use-host-measurement.d.ts.map +1 -0
- package/lib/typescript/components/boundary/portal/hooks/use-placeholder-styles.d.ts.map +1 -0
- package/lib/typescript/components/boundary/portal/hooks/use-portal-destination.d.ts +8 -0
- package/lib/typescript/components/boundary/portal/hooks/use-portal-destination.d.ts.map +1 -0
- package/lib/typescript/components/boundary/portal/index.d.ts +0 -1
- package/lib/typescript/components/boundary/portal/index.d.ts.map +1 -1
- package/lib/typescript/components/boundary/portal/stores/host-registry.store.d.ts.map +1 -0
- package/lib/typescript/components/boundary/portal/{components/boundary-portal/stores → stores}/portal-boundary-host.store.d.ts +2 -3
- package/lib/typescript/components/boundary/portal/stores/portal-boundary-host.store.d.ts.map +1 -0
- package/lib/typescript/components/boundary/portal/utils/naming.d.ts +1 -0
- package/lib/typescript/components/boundary/portal/utils/naming.d.ts.map +1 -1
- package/lib/typescript/components/boundary/portal/utils/resolve-portal.d.ts +2 -7
- package/lib/typescript/components/boundary/portal/utils/resolve-portal.d.ts.map +1 -1
- package/lib/typescript/components/boundary/providers/boundary-root.provider.d.ts +5 -2
- package/lib/typescript/components/boundary/providers/boundary-root.provider.d.ts.map +1 -1
- package/lib/typescript/components/screen/container/helpers/layer-component.d.ts +10 -0
- package/lib/typescript/components/screen/container/helpers/layer-component.d.ts.map +1 -0
- package/lib/typescript/components/screen/container/{layers/render-component.d.ts → helpers/uses-layer-render-props.d.ts} +1 -1
- package/lib/typescript/components/screen/container/helpers/uses-layer-render-props.d.ts.map +1 -0
- package/lib/typescript/components/screen/container/layers/backdrop.d.ts.map +1 -1
- package/lib/typescript/components/screen/container/layers/clip.d.ts +7 -0
- package/lib/typescript/components/screen/container/layers/clip.d.ts.map +1 -0
- package/lib/typescript/components/screen/container/layers/content.d.ts.map +1 -1
- package/lib/typescript/components/screen/container/layers/surface.d.ts.map +1 -1
- package/lib/typescript/components/screen/lifecycle/hooks/use-open-transition-intent.d.ts.map +1 -1
- package/lib/typescript/constants.d.ts +3 -1
- package/lib/typescript/constants.d.ts.map +1 -1
- package/lib/typescript/hooks/navigation/use-navigation-helpers.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/motion/animation/helpers/build-screen-transition-options.d.ts.map +1 -1
- package/lib/typescript/providers/screen/motion/animation/helpers/hydrate-transition-state/index.d.ts.map +1 -1
- package/lib/typescript/providers/screen/motion/options/helpers.d.ts.map +1 -1
- package/lib/typescript/providers/screen/motion/options/types.d.ts +0 -1
- package/lib/typescript/providers/screen/motion/options/types.d.ts.map +1 -1
- package/lib/typescript/providers/screen/orchestrator/helpers/use-interpolator-state.d.ts.map +1 -1
- package/lib/typescript/providers/screen/orchestrator/helpers/use-pair-presentation.d.ts +21 -0
- package/lib/typescript/providers/screen/orchestrator/helpers/use-pair-presentation.d.ts.map +1 -0
- package/lib/typescript/providers/screen/orchestrator/orchestrator.provider.d.ts +2 -0
- package/lib/typescript/providers/screen/orchestrator/orchestrator.provider.d.ts.map +1 -1
- package/lib/typescript/providers/screen/orchestrator/styles/constants.d.ts.map +1 -1
- package/lib/typescript/providers/screen/orchestrator/styles/hooks/slot-resolvers.d.ts +1 -1
- package/lib/typescript/providers/screen/orchestrator/styles/hooks/slot-resolvers.d.ts.map +1 -1
- package/lib/typescript/providers/screen/orchestrator/styles/types.d.ts +1 -1
- package/lib/typescript/providers/screen/orchestrator/styles/types.d.ts.map +1 -1
- package/lib/typescript/types/animation.types.d.ts +16 -4
- package/lib/typescript/types/animation.types.d.ts.map +1 -1
- package/lib/typescript/types/bounds.types.d.ts +7 -15
- package/lib/typescript/types/bounds.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 +1 -8
- package/lib/typescript/types/screen.types.d.ts.map +1 -1
- package/lib/typescript/utils/bounds/navigation/reveal/build.d.ts.map +1 -1
- package/lib/typescript/utils/bounds/navigation/reveal/config.d.ts +2 -3
- package/lib/typescript/utils/bounds/navigation/reveal/config.d.ts.map +1 -1
- package/lib/typescript/utils/bounds/navigation/reveal/math.d.ts +3 -3
- package/lib/typescript/utils/bounds/navigation/reveal/types.d.ts +1 -5
- package/lib/typescript/utils/bounds/navigation/reveal/types.d.ts.map +1 -1
- package/lib/typescript/utils/bounds/navigation/zoom/build.d.ts.map +1 -1
- package/lib/typescript/utils/bounds/navigation/zoom/{mask.d.ts → clip.d.ts} +5 -5
- package/lib/typescript/utils/bounds/navigation/zoom/clip.d.ts.map +1 -0
- package/lib/typescript/utils/bounds/navigation/zoom/drag.d.ts +1 -1
- package/lib/typescript/utils/bounds/navigation/zoom/types.d.ts +1 -5
- package/lib/typescript/utils/bounds/navigation/zoom/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/boundary/components/boundary-lifecycle.tsx +44 -8
- package/src/components/boundary/components/boundary-target.tsx +14 -36
- package/src/components/boundary/create-boundary-component.tsx +16 -17
- package/src/components/boundary/helpers/presentation.ts +88 -0
- package/src/components/boundary/hooks/use-boundary-presentation.ts +82 -0
- package/src/components/boundary/hooks/use-composed-boundary-style.ts +58 -0
- package/src/components/boundary/index.tsx +10 -5
- package/src/components/boundary/portal/components/portal-host.tsx +36 -0
- package/src/components/boundary/portal/components/portal-overlay.tsx +223 -0
- package/src/components/boundary/portal/components/portal.tsx +124 -0
- package/src/components/boundary/portal/hooks/use-active-portal-boundary-host.ts +52 -0
- package/src/components/boundary/portal/hooks/use-host-measurement.ts +101 -0
- package/src/components/boundary/portal/hooks/use-portal-destination.ts +53 -0
- package/src/components/boundary/portal/index.ts +0 -1
- package/src/components/boundary/portal/{components/boundary-portal/stores → stores}/host-registry.store.ts +1 -20
- package/src/components/boundary/portal/{components/boundary-portal/stores → stores}/portal-boundary-host.store.ts +19 -26
- package/src/components/boundary/portal/utils/naming.ts +10 -0
- package/src/components/boundary/portal/utils/resolve-portal.ts +9 -48
- package/src/components/boundary/providers/boundary-root.provider.tsx +34 -22
- package/src/components/screen/container/helpers/layer-component.tsx +38 -0
- package/src/components/screen/container/layers/backdrop.tsx +8 -31
- package/src/components/screen/container/layers/clip.tsx +124 -0
- package/src/components/screen/container/layers/content.tsx +21 -62
- package/src/components/screen/container/layers/surface.tsx +5 -23
- package/src/components/screen/lifecycle/hooks/use-open-transition-intent.ts +26 -2
- package/src/constants.ts +3 -1
- package/src/hooks/navigation/use-navigation-helpers.ts +13 -7
- package/src/index.ts +1 -0
- package/src/providers/screen/motion/animation/helpers/build-screen-transition-options.ts +0 -1
- package/src/providers/screen/motion/animation/helpers/hydrate-transition-state/index.ts +3 -2
- package/src/providers/screen/motion/options/helpers.ts +0 -6
- package/src/providers/screen/motion/options/types.ts +0 -1
- package/src/providers/screen/orchestrator/helpers/use-interpolator-state.ts +13 -8
- package/src/providers/screen/orchestrator/helpers/use-pair-presentation.ts +103 -0
- package/src/providers/screen/orchestrator/orchestrator.provider.tsx +4 -0
- package/src/providers/screen/orchestrator/styles/constants.ts +1 -0
- package/src/providers/screen/orchestrator/styles/hooks/slot-resolvers.tsx +8 -11
- package/src/providers/screen/orchestrator/styles/types.ts +1 -0
- package/src/types/animation.types.ts +35 -4
- package/src/types/bounds.types.ts +7 -15
- package/src/types/index.ts +1 -0
- package/src/types/screen.types.ts +1 -8
- package/src/utils/bounds/navigation/reveal/build.ts +46 -80
- package/src/utils/bounds/navigation/reveal/config.ts +2 -4
- package/src/utils/bounds/navigation/reveal/math.ts +9 -9
- package/src/utils/bounds/navigation/reveal/types.ts +1 -8
- package/src/utils/bounds/navigation/zoom/build.ts +16 -26
- package/src/utils/bounds/navigation/zoom/{mask.ts → clip.ts} +42 -48
- package/src/utils/bounds/navigation/zoom/drag.ts +2 -2
- package/src/utils/bounds/navigation/zoom/types.ts +1 -8
- package/lib/commonjs/components/boundary/hooks/use-boundary-measurement.js +0 -83
- package/lib/commonjs/components/boundary/hooks/use-boundary-measurement.js.map +0 -1
- package/lib/commonjs/components/boundary/portal/components/boundary-content-portal/components/host.js +0 -45
- package/lib/commonjs/components/boundary/portal/components/boundary-content-portal/components/host.js.map +0 -1
- package/lib/commonjs/components/boundary/portal/components/boundary-content-portal/helpers/active-handoff-receiver.js +0 -119
- package/lib/commonjs/components/boundary/portal/components/boundary-content-portal/helpers/active-handoff-receiver.js.map +0 -1
- package/lib/commonjs/components/boundary/portal/components/boundary-content-portal/helpers/handoff-visibility.js +0 -20
- package/lib/commonjs/components/boundary/portal/components/boundary-content-portal/helpers/handoff-visibility.js.map +0 -1
- package/lib/commonjs/components/boundary/portal/components/boundary-content-portal/helpers/host-name.js +0 -14
- package/lib/commonjs/components/boundary/portal/components/boundary-content-portal/helpers/host-name.js.map +0 -1
- package/lib/commonjs/components/boundary/portal/components/boundary-content-portal/hooks/use-boundary-content-portal-attachment.js +0 -136
- package/lib/commonjs/components/boundary/portal/components/boundary-content-portal/hooks/use-boundary-content-portal-attachment.js.map +0 -1
- package/lib/commonjs/components/boundary/portal/components/boundary-content-portal/index.js +0 -53
- package/lib/commonjs/components/boundary/portal/components/boundary-content-portal/index.js.map +0 -1
- package/lib/commonjs/components/boundary/portal/components/boundary-portal/components/host.js +0 -99
- package/lib/commonjs/components/boundary/portal/components/boundary-portal/components/host.js.map +0 -1
- package/lib/commonjs/components/boundary/portal/components/boundary-portal/components/portal-boundary-host.js +0 -104
- package/lib/commonjs/components/boundary/portal/components/boundary-portal/components/portal-boundary-host.js.map +0 -1
- package/lib/commonjs/components/boundary/portal/components/boundary-portal/helpers/local-measurement.js +0 -13
- package/lib/commonjs/components/boundary/portal/components/boundary-portal/helpers/local-measurement.js.map +0 -1
- package/lib/commonjs/components/boundary/portal/components/boundary-portal/helpers/offset-style.js.map +0 -1
- package/lib/commonjs/components/boundary/portal/components/boundary-portal/hooks/use-active-portal-boundary-host.js +0 -82
- package/lib/commonjs/components/boundary/portal/components/boundary-portal/hooks/use-active-portal-boundary-host.js.map +0 -1
- package/lib/commonjs/components/boundary/portal/components/boundary-portal/hooks/use-boundary-portal-attachment.js +0 -58
- package/lib/commonjs/components/boundary/portal/components/boundary-portal/hooks/use-boundary-portal-attachment.js.map +0 -1
- package/lib/commonjs/components/boundary/portal/components/boundary-portal/hooks/use-host-measurement.js +0 -67
- package/lib/commonjs/components/boundary/portal/components/boundary-portal/hooks/use-host-measurement.js.map +0 -1
- package/lib/commonjs/components/boundary/portal/components/boundary-portal/hooks/use-placeholder-styles.js.map +0 -1
- package/lib/commonjs/components/boundary/portal/components/boundary-portal/index.js +0 -68
- package/lib/commonjs/components/boundary/portal/components/boundary-portal/index.js.map +0 -1
- package/lib/commonjs/components/boundary/portal/components/boundary-portal/stores/host-registry.store.js.map +0 -1
- package/lib/commonjs/components/boundary/portal/components/boundary-portal/stores/portal-boundary-host.store.js.map +0 -1
- package/lib/commonjs/components/screen/container/layers/maybe-masked-navigation-container.js +0 -83
- package/lib/commonjs/components/screen/container/layers/maybe-masked-navigation-container.js.map +0 -1
- package/lib/commonjs/components/screen/container/layers/render-component.js.map +0 -1
- package/lib/commonjs/utils/bounds/navigation/zoom/mask.js +0 -73
- package/lib/commonjs/utils/bounds/navigation/zoom/mask.js.map +0 -1
- package/lib/module/components/boundary/hooks/use-boundary-measurement.js +0 -78
- package/lib/module/components/boundary/hooks/use-boundary-measurement.js.map +0 -1
- package/lib/module/components/boundary/portal/components/boundary-content-portal/components/host.js +0 -40
- package/lib/module/components/boundary/portal/components/boundary-content-portal/components/host.js.map +0 -1
- package/lib/module/components/boundary/portal/components/boundary-content-portal/helpers/active-handoff-receiver.js +0 -110
- package/lib/module/components/boundary/portal/components/boundary-content-portal/helpers/active-handoff-receiver.js.map +0 -1
- package/lib/module/components/boundary/portal/components/boundary-content-portal/helpers/handoff-visibility.js +0 -16
- package/lib/module/components/boundary/portal/components/boundary-content-portal/helpers/handoff-visibility.js.map +0 -1
- package/lib/module/components/boundary/portal/components/boundary-content-portal/helpers/host-name.js +0 -9
- package/lib/module/components/boundary/portal/components/boundary-content-portal/helpers/host-name.js.map +0 -1
- package/lib/module/components/boundary/portal/components/boundary-content-portal/hooks/use-boundary-content-portal-attachment.js +0 -131
- package/lib/module/components/boundary/portal/components/boundary-content-portal/hooks/use-boundary-content-portal-attachment.js.map +0 -1
- package/lib/module/components/boundary/portal/components/boundary-content-portal/index.js +0 -42
- package/lib/module/components/boundary/portal/components/boundary-content-portal/index.js.map +0 -1
- package/lib/module/components/boundary/portal/components/boundary-portal/components/host.js +0 -94
- package/lib/module/components/boundary/portal/components/boundary-portal/components/host.js.map +0 -1
- package/lib/module/components/boundary/portal/components/boundary-portal/components/portal-boundary-host.js +0 -99
- package/lib/module/components/boundary/portal/components/boundary-portal/components/portal-boundary-host.js.map +0 -1
- package/lib/module/components/boundary/portal/components/boundary-portal/helpers/local-measurement.js +0 -8
- package/lib/module/components/boundary/portal/components/boundary-portal/helpers/local-measurement.js.map +0 -1
- package/lib/module/components/boundary/portal/components/boundary-portal/helpers/offset-style.js.map +0 -1
- package/lib/module/components/boundary/portal/components/boundary-portal/hooks/use-active-portal-boundary-host.js +0 -76
- package/lib/module/components/boundary/portal/components/boundary-portal/hooks/use-active-portal-boundary-host.js.map +0 -1
- package/lib/module/components/boundary/portal/components/boundary-portal/hooks/use-boundary-portal-attachment.js +0 -53
- package/lib/module/components/boundary/portal/components/boundary-portal/hooks/use-boundary-portal-attachment.js.map +0 -1
- package/lib/module/components/boundary/portal/components/boundary-portal/hooks/use-host-measurement.js +0 -62
- package/lib/module/components/boundary/portal/components/boundary-portal/hooks/use-host-measurement.js.map +0 -1
- package/lib/module/components/boundary/portal/components/boundary-portal/hooks/use-placeholder-styles.js.map +0 -1
- package/lib/module/components/boundary/portal/components/boundary-portal/index.js +0 -63
- package/lib/module/components/boundary/portal/components/boundary-portal/index.js.map +0 -1
- package/lib/module/components/boundary/portal/components/boundary-portal/stores/host-registry.store.js.map +0 -1
- package/lib/module/components/boundary/portal/components/boundary-portal/stores/portal-boundary-host.store.js.map +0 -1
- package/lib/module/components/screen/container/layers/maybe-masked-navigation-container.js +0 -78
- package/lib/module/components/screen/container/layers/maybe-masked-navigation-container.js.map +0 -1
- package/lib/module/components/screen/container/layers/render-component.js.map +0 -1
- package/lib/module/utils/bounds/navigation/zoom/mask.js +0 -68
- package/lib/module/utils/bounds/navigation/zoom/mask.js.map +0 -1
- package/lib/typescript/components/boundary/hooks/use-boundary-measurement.d.ts +0 -28
- package/lib/typescript/components/boundary/hooks/use-boundary-measurement.d.ts.map +0 -1
- package/lib/typescript/components/boundary/portal/components/boundary-content-portal/components/host.d.ts +0 -10
- package/lib/typescript/components/boundary/portal/components/boundary-content-portal/components/host.d.ts.map +0 -1
- package/lib/typescript/components/boundary/portal/components/boundary-content-portal/helpers/active-handoff-receiver.d.ts +0 -45
- package/lib/typescript/components/boundary/portal/components/boundary-content-portal/helpers/active-handoff-receiver.d.ts.map +0 -1
- package/lib/typescript/components/boundary/portal/components/boundary-content-portal/helpers/handoff-visibility.d.ts +0 -8
- package/lib/typescript/components/boundary/portal/components/boundary-content-portal/helpers/handoff-visibility.d.ts.map +0 -1
- package/lib/typescript/components/boundary/portal/components/boundary-content-portal/helpers/host-name.d.ts +0 -2
- package/lib/typescript/components/boundary/portal/components/boundary-content-portal/helpers/host-name.d.ts.map +0 -1
- package/lib/typescript/components/boundary/portal/components/boundary-content-portal/hooks/use-boundary-content-portal-attachment.d.ts +0 -10
- package/lib/typescript/components/boundary/portal/components/boundary-content-portal/hooks/use-boundary-content-portal-attachment.d.ts.map +0 -1
- package/lib/typescript/components/boundary/portal/components/boundary-content-portal/index.d.ts +0 -9
- package/lib/typescript/components/boundary/portal/components/boundary-content-portal/index.d.ts.map +0 -1
- package/lib/typescript/components/boundary/portal/components/boundary-portal/components/host.d.ts +0 -7
- package/lib/typescript/components/boundary/portal/components/boundary-portal/components/host.d.ts.map +0 -1
- package/lib/typescript/components/boundary/portal/components/boundary-portal/components/portal-boundary-host.d.ts +0 -13
- package/lib/typescript/components/boundary/portal/components/boundary-portal/components/portal-boundary-host.d.ts.map +0 -1
- package/lib/typescript/components/boundary/portal/components/boundary-portal/helpers/local-measurement.d.ts +0 -4
- package/lib/typescript/components/boundary/portal/components/boundary-portal/helpers/local-measurement.d.ts.map +0 -1
- package/lib/typescript/components/boundary/portal/components/boundary-portal/helpers/offset-style.d.ts.map +0 -1
- package/lib/typescript/components/boundary/portal/components/boundary-portal/hooks/use-active-portal-boundary-host.d.ts +0 -21
- package/lib/typescript/components/boundary/portal/components/boundary-portal/hooks/use-active-portal-boundary-host.d.ts.map +0 -1
- package/lib/typescript/components/boundary/portal/components/boundary-portal/hooks/use-boundary-portal-attachment.d.ts +0 -10
- package/lib/typescript/components/boundary/portal/components/boundary-portal/hooks/use-boundary-portal-attachment.d.ts.map +0 -1
- package/lib/typescript/components/boundary/portal/components/boundary-portal/hooks/use-host-measurement.d.ts +0 -12
- package/lib/typescript/components/boundary/portal/components/boundary-portal/hooks/use-host-measurement.d.ts.map +0 -1
- package/lib/typescript/components/boundary/portal/components/boundary-portal/hooks/use-placeholder-styles.d.ts.map +0 -1
- package/lib/typescript/components/boundary/portal/components/boundary-portal/index.d.ts +0 -12
- package/lib/typescript/components/boundary/portal/components/boundary-portal/index.d.ts.map +0 -1
- package/lib/typescript/components/boundary/portal/components/boundary-portal/stores/host-registry.store.d.ts.map +0 -1
- package/lib/typescript/components/boundary/portal/components/boundary-portal/stores/portal-boundary-host.store.d.ts.map +0 -1
- package/lib/typescript/components/screen/container/layers/maybe-masked-navigation-container.d.ts +0 -9
- package/lib/typescript/components/screen/container/layers/maybe-masked-navigation-container.d.ts.map +0 -1
- package/lib/typescript/components/screen/container/layers/render-component.d.ts.map +0 -1
- package/lib/typescript/utils/bounds/navigation/zoom/mask.d.ts.map +0 -1
- package/src/components/boundary/hooks/use-boundary-measurement.ts +0 -98
- package/src/components/boundary/portal/components/boundary-content-portal/components/host.tsx +0 -56
- package/src/components/boundary/portal/components/boundary-content-portal/helpers/active-handoff-receiver.ts +0 -192
- package/src/components/boundary/portal/components/boundary-content-portal/helpers/handoff-visibility.ts +0 -23
- package/src/components/boundary/portal/components/boundary-content-portal/helpers/host-name.ts +0 -9
- package/src/components/boundary/portal/components/boundary-content-portal/hooks/use-boundary-content-portal-attachment.ts +0 -252
- package/src/components/boundary/portal/components/boundary-content-portal/index.tsx +0 -81
- package/src/components/boundary/portal/components/boundary-portal/components/host.tsx +0 -119
- package/src/components/boundary/portal/components/boundary-portal/components/portal-boundary-host.tsx +0 -139
- package/src/components/boundary/portal/components/boundary-portal/helpers/local-measurement.ts +0 -10
- package/src/components/boundary/portal/components/boundary-portal/hooks/use-active-portal-boundary-host.ts +0 -118
- package/src/components/boundary/portal/components/boundary-portal/hooks/use-boundary-portal-attachment.ts +0 -64
- package/src/components/boundary/portal/components/boundary-portal/hooks/use-host-measurement.ts +0 -90
- package/src/components/boundary/portal/components/boundary-portal/index.tsx +0 -97
- package/src/components/screen/container/layers/maybe-masked-navigation-container.tsx +0 -113
- /package/lib/commonjs/components/boundary/portal/{components/boundary-portal/helpers → helpers}/offset-style.js +0 -0
- /package/lib/commonjs/components/boundary/portal/{components/boundary-portal/hooks → hooks}/use-placeholder-styles.js +0 -0
- /package/lib/module/components/boundary/portal/{components/boundary-portal/helpers → helpers}/offset-style.js +0 -0
- /package/lib/module/components/boundary/portal/{components/boundary-portal/hooks → hooks}/use-placeholder-styles.js +0 -0
- /package/lib/typescript/components/boundary/portal/{components/boundary-portal/helpers → helpers}/offset-style.d.ts +0 -0
- /package/lib/typescript/components/boundary/portal/{components/boundary-portal/hooks → hooks}/use-placeholder-styles.d.ts +0 -0
- /package/lib/typescript/components/boundary/portal/{components/boundary-portal/stores → stores}/host-registry.store.d.ts +0 -0
- /package/src/components/boundary/portal/{components/boundary-portal/helpers → helpers}/offset-style.ts +0 -0
- /package/src/components/boundary/portal/{components/boundary-portal/hooks → hooks}/use-placeholder-styles.ts +0 -0
- /package/src/components/screen/container/{layers/render-component.ts → helpers/uses-layer-render-props.ts} +0 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import type { View } from "react-native";
|
|
2
|
+
import {
|
|
3
|
+
cancelAnimation,
|
|
4
|
+
type MeasuredDimensions,
|
|
5
|
+
measure,
|
|
6
|
+
useAnimatedReaction,
|
|
7
|
+
useAnimatedRef,
|
|
8
|
+
useDerivedValue,
|
|
9
|
+
useSharedValue,
|
|
10
|
+
withDelay,
|
|
11
|
+
withTiming,
|
|
12
|
+
} from "react-native-reanimated";
|
|
13
|
+
|
|
14
|
+
import type { BoundaryLocalMeasurementValue } from "../../types";
|
|
15
|
+
|
|
16
|
+
const HOST_MEASUREMENT_RETRY_DELAY_MS = 16;
|
|
17
|
+
const MAX_HOST_MEASUREMENT_ATTEMPTS = 20;
|
|
18
|
+
|
|
19
|
+
type UseHostMeasurementParams = {
|
|
20
|
+
measurementKey: string | null;
|
|
21
|
+
boundaryMeasurements: BoundaryLocalMeasurementValue[];
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export const useHostMeasurement = ({
|
|
25
|
+
measurementKey,
|
|
26
|
+
boundaryMeasurements,
|
|
27
|
+
}: UseHostMeasurementParams) => {
|
|
28
|
+
const hostRef = useAnimatedRef<View>();
|
|
29
|
+
const measurement = useSharedValue<{
|
|
30
|
+
key: string;
|
|
31
|
+
bounds: MeasuredDimensions;
|
|
32
|
+
} | null>(null);
|
|
33
|
+
const hostBounds = useDerivedValue(() => {
|
|
34
|
+
const captured = measurement.get();
|
|
35
|
+
return captured?.key === measurementKey ? captured.bounds : null;
|
|
36
|
+
});
|
|
37
|
+
const retryToken = useSharedValue(0);
|
|
38
|
+
const attempts = useSharedValue({ key: measurementKey, count: 0 });
|
|
39
|
+
|
|
40
|
+
useAnimatedReaction(
|
|
41
|
+
() => {
|
|
42
|
+
"worklet";
|
|
43
|
+
if (!measurementKey) {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Hosts mount before their screen is visible. Wait for source capture
|
|
48
|
+
// rather than caching the screen's initial offscreen position.
|
|
49
|
+
let hasSource = false;
|
|
50
|
+
for (const measurement of boundaryMeasurements) {
|
|
51
|
+
if (measurement.get()) {
|
|
52
|
+
hasSource = true;
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (!hasSource) return null;
|
|
57
|
+
return [
|
|
58
|
+
measurementKey,
|
|
59
|
+
measurement.get()?.key ?? null,
|
|
60
|
+
retryToken.get(),
|
|
61
|
+
] as const;
|
|
62
|
+
},
|
|
63
|
+
(state) => {
|
|
64
|
+
"worklet";
|
|
65
|
+
if (!state) {
|
|
66
|
+
cancelAnimation(retryToken);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const [requestedKey, completedKey] = state;
|
|
71
|
+
if (requestedKey === completedKey) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
cancelAnimation(retryToken);
|
|
76
|
+
const count =
|
|
77
|
+
attempts.get().key === requestedKey ? attempts.get().count : 0;
|
|
78
|
+
if (count >= MAX_HOST_MEASUREMENT_ATTEMPTS) return;
|
|
79
|
+
attempts.set({ key: requestedKey, count: count + 1 });
|
|
80
|
+
|
|
81
|
+
const measured = measure(hostRef);
|
|
82
|
+
if (!measured || measured.width <= 0 || measured.height <= 0) {
|
|
83
|
+
if (count + 1 < MAX_HOST_MEASUREMENT_ATTEMPTS) {
|
|
84
|
+
retryToken.set(
|
|
85
|
+
withDelay(
|
|
86
|
+
HOST_MEASUREMENT_RETRY_DELAY_MS,
|
|
87
|
+
withTiming(retryToken.get() + 1, { duration: 0 }),
|
|
88
|
+
),
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
measurement.set({ key: requestedKey, bounds: { ...measured } });
|
|
95
|
+
},
|
|
96
|
+
);
|
|
97
|
+
return {
|
|
98
|
+
hostBounds,
|
|
99
|
+
hostRef,
|
|
100
|
+
};
|
|
101
|
+
};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { useAnimatedProps, useSharedValue } from "react-native-reanimated";
|
|
2
|
+
import { useBoundaryRootStore } from "../../providers/boundary-root.provider";
|
|
3
|
+
import { useActiveHostKey } from "../stores/host-registry.store";
|
|
4
|
+
import {
|
|
5
|
+
createHandoffHostName,
|
|
6
|
+
PORTAL_HOST_NAME_RESET_VALUE,
|
|
7
|
+
} from "../utils/naming";
|
|
8
|
+
import { useActivePortalBoundaryHost } from "./use-active-portal-boundary-host";
|
|
9
|
+
|
|
10
|
+
export type PortalMode = "handoff" | "escapeClipping";
|
|
11
|
+
|
|
12
|
+
export function usePortalDestination(boundaryId: string, mode: PortalMode) {
|
|
13
|
+
const { currentScreenKey, localMeasurement, slotsMap, boundaryPresentation } =
|
|
14
|
+
useBoundaryRootStore((s) => s);
|
|
15
|
+
const portalHostReady = useSharedValue(false);
|
|
16
|
+
const escapeHostKey = useActiveHostKey(
|
|
17
|
+
mode === "escapeClipping" ? currentScreenKey : null,
|
|
18
|
+
);
|
|
19
|
+
const portalHostName = useActivePortalBoundaryHost({
|
|
20
|
+
boundaryId,
|
|
21
|
+
escapeHostKey,
|
|
22
|
+
localMeasurement,
|
|
23
|
+
portalHostReady,
|
|
24
|
+
slotsMap,
|
|
25
|
+
});
|
|
26
|
+
const teleportProps = useAnimatedProps(() => {
|
|
27
|
+
"worklet";
|
|
28
|
+
const { owner, receiver, slots } = boundaryPresentation.get();
|
|
29
|
+
const slot = slots[boundaryId];
|
|
30
|
+
const {
|
|
31
|
+
pointerEvents: _pointerEvents,
|
|
32
|
+
handoffTarget: _handoffTarget,
|
|
33
|
+
...props
|
|
34
|
+
} = slot?.props ?? {};
|
|
35
|
+
let hostName: string | null = PORTAL_HOST_NAME_RESET_VALUE;
|
|
36
|
+
if (mode === "handoff") {
|
|
37
|
+
hostName = createHandoffHostName(receiver, boundaryId);
|
|
38
|
+
} else if (
|
|
39
|
+
owner?.ready &&
|
|
40
|
+
localMeasurement.get()?.pairKey === owner.pairKey &&
|
|
41
|
+
slot !== undefined &&
|
|
42
|
+
portalHostReady.get()
|
|
43
|
+
) {
|
|
44
|
+
hostName = portalHostName;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return { ...props, hostName };
|
|
48
|
+
});
|
|
49
|
+
return {
|
|
50
|
+
teleportProps,
|
|
51
|
+
localHostName: createHandoffHostName(currentScreenKey, boundaryId),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
@@ -6,15 +6,9 @@ export type HostRegistration = {
|
|
|
6
6
|
fallback: boolean;
|
|
7
7
|
};
|
|
8
8
|
|
|
9
|
-
type HostRegistrySnapshot = Record<string, string>;
|
|
10
|
-
|
|
11
|
-
const EMPTY_SNAPSHOT: HostRegistrySnapshot = {};
|
|
12
|
-
|
|
13
9
|
const listeners = new Set<() => void>();
|
|
14
10
|
const hostStacks = new Map<string, HostRegistration[]>();
|
|
15
11
|
|
|
16
|
-
let snapshot: HostRegistrySnapshot = EMPTY_SNAPSHOT;
|
|
17
|
-
|
|
18
12
|
/**
|
|
19
13
|
* The active host for a screen. Stack ordering is the load-bearing invariant:
|
|
20
14
|
* `registerHost` unshifts fallback hosts to the front and pushes real hosts to
|
|
@@ -39,19 +33,7 @@ const getActiveHostFromStack = (
|
|
|
39
33
|
return stack[0]?.hostKey ?? screenKey;
|
|
40
34
|
};
|
|
41
35
|
|
|
42
|
-
const buildSnapshot = (): HostRegistrySnapshot => {
|
|
43
|
-
const nextSnapshot: HostRegistrySnapshot = {};
|
|
44
|
-
|
|
45
|
-
for (const [screenKey, stack] of hostStacks) {
|
|
46
|
-
nextSnapshot[screenKey] = getActiveHostFromStack(screenKey, stack);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
return nextSnapshot;
|
|
50
|
-
};
|
|
51
|
-
|
|
52
36
|
const emit = () => {
|
|
53
|
-
snapshot = buildSnapshot();
|
|
54
|
-
|
|
55
37
|
for (const listener of listeners) {
|
|
56
38
|
listener();
|
|
57
39
|
}
|
|
@@ -116,7 +98,7 @@ export const unregisterHost = (screenKey: string, hostKey: string) => {
|
|
|
116
98
|
};
|
|
117
99
|
|
|
118
100
|
export const getActiveHostKey = (screenKey: string) => {
|
|
119
|
-
return
|
|
101
|
+
return getActiveHostFromStack(screenKey, hostStacks.get(screenKey));
|
|
120
102
|
};
|
|
121
103
|
|
|
122
104
|
export const useActiveHostKey = (screenKey?: string | null) => {
|
|
@@ -129,6 +111,5 @@ export const useActiveHostKey = (screenKey?: string | null) => {
|
|
|
129
111
|
|
|
130
112
|
export const resetHostRegistry = () => {
|
|
131
113
|
hostStacks.clear();
|
|
132
|
-
snapshot = EMPTY_SNAPSHOT;
|
|
133
114
|
emit();
|
|
134
115
|
};
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import { useSyncExternalStore } from "react";
|
|
2
2
|
import type { SharedValue } from "react-native-reanimated";
|
|
3
|
-
import type { NormalizedTransitionInterpolatedStyle } from "
|
|
4
|
-
import type { BoundaryLocalMeasurementValue } from "
|
|
3
|
+
import type { NormalizedTransitionInterpolatedStyle } from "../../../../types/animation.types";
|
|
4
|
+
import type { BoundaryLocalMeasurementValue } from "../../types";
|
|
5
5
|
|
|
6
6
|
export type ActivePortalBoundaryHost = {
|
|
7
7
|
boundaryId: string;
|
|
8
8
|
hostKey: string;
|
|
9
9
|
localMeasurement: BoundaryLocalMeasurementValue;
|
|
10
|
-
pairKey: string;
|
|
11
10
|
portalHostName: string;
|
|
12
11
|
portalHostReady: SharedValue<boolean>;
|
|
13
12
|
slotsMap: SharedValue<NormalizedTransitionInterpolatedStyle>;
|
|
@@ -26,26 +25,17 @@ let snapshot: PortalSnapshot = {
|
|
|
26
25
|
hostsByScope: {},
|
|
27
26
|
};
|
|
28
27
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
for (const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
return {
|
|
39
|
-
hostsByScope,
|
|
40
|
-
};
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
const emit = () => {
|
|
44
|
-
snapshot = buildSnapshot();
|
|
45
|
-
|
|
46
|
-
for (const listener of listeners) {
|
|
47
|
-
listener();
|
|
28
|
+
// Preserve other overlays' snapshots so a registration only rerenders its owners.
|
|
29
|
+
const emit = (...hostKeys: string[]) => {
|
|
30
|
+
const hostsByScope = { ...snapshot.hostsByScope };
|
|
31
|
+
for (const hostKey of new Set(hostKeys)) {
|
|
32
|
+
hostsByScope[hostKey] = Array.from(activeBoundaryHosts.values()).filter(
|
|
33
|
+
(host) => host.hostKey === hostKey,
|
|
34
|
+
);
|
|
35
|
+
if (!hostsByScope[hostKey].length) delete hostsByScope[hostKey];
|
|
48
36
|
}
|
|
37
|
+
snapshot = { hostsByScope };
|
|
38
|
+
for (const listener of listeners) listener();
|
|
49
39
|
};
|
|
50
40
|
|
|
51
41
|
const isSameHost = (
|
|
@@ -56,7 +46,6 @@ const isSameHost = (
|
|
|
56
46
|
a.boundaryId === b.boundaryId &&
|
|
57
47
|
a.hostKey === b.hostKey &&
|
|
58
48
|
a.localMeasurement === b.localMeasurement &&
|
|
59
|
-
a.pairKey === b.pairKey &&
|
|
60
49
|
a.portalHostName === b.portalHostName &&
|
|
61
50
|
a.portalHostReady === b.portalHostReady &&
|
|
62
51
|
a.slotsMap === b.slotsMap
|
|
@@ -70,17 +59,21 @@ export const mountPortalBoundaryHost = (host: ActivePortalBoundaryHost) => {
|
|
|
70
59
|
}
|
|
71
60
|
|
|
72
61
|
activeBoundaryHosts.set(host.portalHostName, host);
|
|
73
|
-
emit();
|
|
62
|
+
emit(host.hostKey, previous?.hostKey ?? host.hostKey);
|
|
74
63
|
};
|
|
75
64
|
|
|
76
65
|
export const unmountPortalBoundaryHostByName = (
|
|
77
66
|
portalHostName: string | null | undefined,
|
|
78
67
|
) => {
|
|
79
|
-
|
|
68
|
+
const host = portalHostName
|
|
69
|
+
? activeBoundaryHosts.get(portalHostName)
|
|
70
|
+
: undefined;
|
|
71
|
+
if (!host) {
|
|
80
72
|
return;
|
|
81
73
|
}
|
|
82
74
|
|
|
83
|
-
|
|
75
|
+
activeBoundaryHosts.delete(host.portalHostName);
|
|
76
|
+
emit(host.hostKey);
|
|
84
77
|
};
|
|
85
78
|
|
|
86
79
|
const subscribe = (listener: () => void) => {
|
|
@@ -10,3 +10,13 @@ export const createBoundaryPortalHostName = (
|
|
|
10
10
|
};
|
|
11
11
|
|
|
12
12
|
export const PORTAL_HOST_NAME_RESET_VALUE = null;
|
|
13
|
+
|
|
14
|
+
const BOUNDARY_CONTENT_PORTAL_HOST_NAME_SUFFIX = "-content-portal-host";
|
|
15
|
+
|
|
16
|
+
export const createHandoffHostName = (
|
|
17
|
+
screenKey: string,
|
|
18
|
+
boundaryId: string,
|
|
19
|
+
) => {
|
|
20
|
+
"worklet";
|
|
21
|
+
return `${screenKey}-${boundaryId}${BOUNDARY_CONTENT_PORTAL_HOST_NAME_SUFFIX}`;
|
|
22
|
+
};
|
|
@@ -1,58 +1,19 @@
|
|
|
1
|
+
import type { BoundaryRuntimeFlags } from "../../../../stores/bounds/types";
|
|
1
2
|
import { logger } from "../../../../utils/logger";
|
|
2
3
|
import { isTeleportAvailable } from "../teleport";
|
|
3
4
|
|
|
4
|
-
export type BoundaryPortalRuntime = Readonly<{
|
|
5
|
-
handoff: boolean;
|
|
6
|
-
escapeClipping: boolean;
|
|
7
|
-
}>;
|
|
8
|
-
|
|
9
|
-
type ResolveBoundaryPortalParams = {
|
|
10
|
-
handoff?: boolean;
|
|
11
|
-
escapeClipping?: boolean;
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
const DISABLED_RUNTIME: BoundaryPortalRuntime = {
|
|
15
|
-
handoff: false,
|
|
16
|
-
escapeClipping: false,
|
|
17
|
-
};
|
|
18
|
-
const HANDOFF_RUNTIME: BoundaryPortalRuntime = {
|
|
19
|
-
handoff: true,
|
|
20
|
-
escapeClipping: false,
|
|
21
|
-
};
|
|
22
|
-
const ESCAPE_CLIPPING_RUNTIME: BoundaryPortalRuntime = {
|
|
23
|
-
handoff: false,
|
|
24
|
-
escapeClipping: true,
|
|
25
|
-
};
|
|
26
|
-
const HANDOFF_ESCAPE_CLIPPING_RUNTIME: BoundaryPortalRuntime = {
|
|
27
|
-
handoff: true,
|
|
28
|
-
escapeClipping: true,
|
|
29
|
-
};
|
|
30
|
-
|
|
31
5
|
export const resolveBoundaryPortal = ({
|
|
32
|
-
handoff,
|
|
33
|
-
escapeClipping,
|
|
34
|
-
}:
|
|
35
|
-
|
|
36
|
-
const resolvedEscapeClipping = escapeClipping ?? false;
|
|
37
|
-
|
|
38
|
-
const enabled = resolvedHandoff || resolvedEscapeClipping;
|
|
39
|
-
|
|
40
|
-
if (!enabled) {
|
|
41
|
-
return DISABLED_RUNTIME;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
if (!isTeleportAvailable) {
|
|
6
|
+
handoff = false,
|
|
7
|
+
escapeClipping = false,
|
|
8
|
+
}: BoundaryRuntimeFlags) => {
|
|
9
|
+
if (!isTeleportAvailable && (handoff || escapeClipping)) {
|
|
45
10
|
logger.warnOnce(
|
|
46
11
|
"boundary:teleport-missing",
|
|
47
12
|
"react-native-teleport is not installed; handoff and escapeClipping boundaries will render inline.",
|
|
48
13
|
);
|
|
49
|
-
|
|
50
|
-
return DISABLED_RUNTIME;
|
|
51
14
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
: HANDOFF_RUNTIME
|
|
57
|
-
: ESCAPE_CLIPPING_RUNTIME;
|
|
15
|
+
return {
|
|
16
|
+
handoff: isTeleportAvailable && handoff,
|
|
17
|
+
escapeClipping: isTeleportAvailable && escapeClipping,
|
|
18
|
+
};
|
|
58
19
|
};
|
|
@@ -10,20 +10,15 @@ import type { View } from "react-native";
|
|
|
10
10
|
import type { AnimatedRef } from "react-native-reanimated";
|
|
11
11
|
import { useAnimatedRef, useSharedValue } from "react-native-reanimated";
|
|
12
12
|
import { useBuilderStore } from "../../../providers/screen/builder";
|
|
13
|
-
import {
|
|
14
|
-
useComposedSlotStyles,
|
|
15
|
-
useSlotStackingStyles,
|
|
16
|
-
} from "../../../providers/screen/orchestrator/styles";
|
|
17
13
|
import { useBlankStackStore } from "../../../providers/stack/blank-stack.provider";
|
|
18
14
|
import { createBoundTag } from "../../../stores/bounds/helpers/link-pairs.helpers";
|
|
19
15
|
import type { BoundTag } from "../../../stores/bounds/types";
|
|
20
16
|
import createProvider from "../../../utils/create-provider";
|
|
21
17
|
import { logger } from "../../../utils/logger";
|
|
22
18
|
import { BoundaryLifecycle } from "../components/boundary-lifecycle";
|
|
23
|
-
import {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
} from "../portal/utils/resolve-portal";
|
|
19
|
+
import { useBoundaryPresentation } from "../hooks/use-boundary-presentation";
|
|
20
|
+
import { useComposedBoundaryStyle } from "../hooks/use-composed-boundary-style";
|
|
21
|
+
import { resolveBoundaryPortal } from "../portal/utils/resolve-portal";
|
|
27
22
|
import type {
|
|
28
23
|
BoundaryConfigProps,
|
|
29
24
|
BoundaryId,
|
|
@@ -42,13 +37,17 @@ export const TARGET_OUTSIDE_ROOT_WARNING =
|
|
|
42
37
|
"Boundary.Target must be rendered inside Transition.Boundary or a component created by createBoundaryComponent.";
|
|
43
38
|
|
|
44
39
|
export type BoundaryRootRenderState = {
|
|
40
|
+
boundaryPresentation: ReturnType<
|
|
41
|
+
typeof useBoundaryPresentation
|
|
42
|
+
>["presentation"];
|
|
43
|
+
slotsMap: ReturnType<typeof useBoundaryPresentation>["slotsMap"];
|
|
45
44
|
attachedStyle: unknown;
|
|
46
45
|
boundTag: BoundTag;
|
|
47
46
|
currentScreenKey: string;
|
|
48
47
|
handoffEnabled: boolean;
|
|
49
48
|
localMeasurement: BoundaryLocalMeasurementValue;
|
|
50
49
|
measurementRef: AnimatedRef<View>;
|
|
51
|
-
portalRuntime:
|
|
50
|
+
portalRuntime: ReturnType<typeof resolveBoundaryPortal>;
|
|
52
51
|
ref: AnimatedRef<View>;
|
|
53
52
|
shouldRenderBoundaryRootThroughPortal: boolean;
|
|
54
53
|
shouldRenderHandoffHost: boolean;
|
|
@@ -94,10 +93,10 @@ export const {
|
|
|
94
93
|
() => createBoundTag(String(id), group),
|
|
95
94
|
[id, group],
|
|
96
95
|
);
|
|
97
|
-
const portalRuntime =
|
|
98
|
-
handoff,
|
|
99
|
-
escapeClipping,
|
|
100
|
-
|
|
96
|
+
const portalRuntime = useMemo(
|
|
97
|
+
() => resolveBoundaryPortal({ handoff, escapeClipping }),
|
|
98
|
+
[handoff, escapeClipping],
|
|
99
|
+
);
|
|
101
100
|
|
|
102
101
|
const currentScreenKey = useBuilderStore(
|
|
103
102
|
(s) => s.derivations.currentScreenKey,
|
|
@@ -124,8 +123,19 @@ export const {
|
|
|
124
123
|
const shouldAttachAssociatedStyles = enabled;
|
|
125
124
|
const shouldEscapeBoundaryRootToScreenHost = portalRuntime.escapeClipping;
|
|
126
125
|
|
|
127
|
-
const
|
|
128
|
-
|
|
126
|
+
const { presentation: boundaryPresentation, slotsMap } =
|
|
127
|
+
useBoundaryPresentation(
|
|
128
|
+
boundTag.tag,
|
|
129
|
+
enabled && (portalRuntime.handoff || portalRuntime.escapeClipping),
|
|
130
|
+
);
|
|
131
|
+
|
|
132
|
+
const associatedStyles = useComposedBoundaryStyle(
|
|
133
|
+
slotsMap,
|
|
134
|
+
boundTag.tag,
|
|
135
|
+
style,
|
|
136
|
+
hasTarget ? "stacking" : "full",
|
|
137
|
+
);
|
|
138
|
+
|
|
129
139
|
const rootRef = useAnimatedRef<View>();
|
|
130
140
|
const measurementRef = useAnimatedRef<View>();
|
|
131
141
|
const localMeasurement = useSharedValue<BoundaryLocalMeasurement | null>(
|
|
@@ -155,16 +165,16 @@ export const {
|
|
|
155
165
|
// Host-only handoff receivers still need the associated style: their
|
|
156
166
|
// handoff host is absolute-filled inside this root, so the root is the
|
|
157
167
|
// visual frame that animates the received payload.
|
|
158
|
-
const attachedStyle =
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
: associatedStyles
|
|
164
|
-
: undefined;
|
|
168
|
+
const attachedStyle =
|
|
169
|
+
shouldAttachAssociatedStyles &&
|
|
170
|
+
(hasTarget || !shouldRenderBoundaryRootThroughPortal)
|
|
171
|
+
? associatedStyles
|
|
172
|
+
: undefined;
|
|
165
173
|
|
|
166
174
|
const value = useMemo<BoundaryRootContextValue>(
|
|
167
175
|
() => ({
|
|
176
|
+
boundaryPresentation,
|
|
177
|
+
slotsMap,
|
|
168
178
|
attachedStyle,
|
|
169
179
|
boundTag,
|
|
170
180
|
currentScreenKey,
|
|
@@ -177,6 +187,8 @@ export const {
|
|
|
177
187
|
shouldRenderHandoffHost: handoffEnabled && !hasTarget,
|
|
178
188
|
}),
|
|
179
189
|
[
|
|
190
|
+
boundaryPresentation,
|
|
191
|
+
slotsMap,
|
|
180
192
|
attachedStyle,
|
|
181
193
|
boundTag,
|
|
182
194
|
currentScreenKey,
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type ComponentType, type ReactNode, useMemo } from "react";
|
|
2
|
+
import type { ViewProps } from "react-native";
|
|
3
|
+
import Animated from "react-native-reanimated";
|
|
4
|
+
import type { ScreenLayerComponentProps } from "../../../../types";
|
|
5
|
+
import { usesLayerRenderProps } from "./uses-layer-render-props";
|
|
6
|
+
|
|
7
|
+
/** Adapts the two supported custom layer APIs without changing component identity. */
|
|
8
|
+
export function LayerComponent({
|
|
9
|
+
component,
|
|
10
|
+
styles,
|
|
11
|
+
props,
|
|
12
|
+
pointerEvents,
|
|
13
|
+
children,
|
|
14
|
+
collapsable,
|
|
15
|
+
}: ScreenLayerComponentProps & {
|
|
16
|
+
component?: ComponentType<any>;
|
|
17
|
+
children?: ReactNode;
|
|
18
|
+
collapsable?: ViewProps["collapsable"];
|
|
19
|
+
}) {
|
|
20
|
+
const renderProps = component && usesLayerRenderProps(component);
|
|
21
|
+
const Component = useMemo<ComponentType<any>>(() => {
|
|
22
|
+
if (!component) return Animated.View;
|
|
23
|
+
return usesLayerRenderProps(component)
|
|
24
|
+
? component
|
|
25
|
+
: Animated.createAnimatedComponent(component);
|
|
26
|
+
}, [component]);
|
|
27
|
+
return (
|
|
28
|
+
<Component
|
|
29
|
+
{...(renderProps
|
|
30
|
+
? { styles, props }
|
|
31
|
+
: { style: styles, animatedProps: props })}
|
|
32
|
+
pointerEvents={pointerEvents}
|
|
33
|
+
collapsable={collapsable}
|
|
34
|
+
>
|
|
35
|
+
{children}
|
|
36
|
+
</Component>
|
|
37
|
+
);
|
|
38
|
+
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { memo, useCallback } from "react";
|
|
2
2
|
import { Pressable, StyleSheet } from "react-native";
|
|
3
|
-
import Animated from "react-native-reanimated";
|
|
4
3
|
import { scheduleOnRN, scheduleOnUI } from "react-native-worklets";
|
|
5
4
|
import { DefaultSnapSpec } from "../../../../configs/specs";
|
|
6
5
|
import { useBuilderStore } from "../../../../providers/screen/builder";
|
|
@@ -15,7 +14,7 @@ import type {
|
|
|
15
14
|
} from "../../../../types/screen.types";
|
|
16
15
|
import { animateToProgress } from "../../../../utils/animation/animate-to-progress";
|
|
17
16
|
import { findCollapseTarget } from "../helpers/find-collapse-target";
|
|
18
|
-
import {
|
|
17
|
+
import { LayerComponent } from "../helpers/layer-component";
|
|
19
18
|
|
|
20
19
|
export const BackdropLayer = memo(function BackdropLayer({
|
|
21
20
|
backdropBehavior,
|
|
@@ -41,16 +40,6 @@ export const BackdropLayer = memo(function BackdropLayer({
|
|
|
41
40
|
const { targetProgress, animationProgress, resolvedAutoSnapPoint } =
|
|
42
41
|
animations;
|
|
43
42
|
|
|
44
|
-
const AnimatedBackdropComponent = useMemo(
|
|
45
|
-
() =>
|
|
46
|
-
BackdropComponent && !usesLayerRenderProps(BackdropComponent)
|
|
47
|
-
? Animated.createAnimatedComponent(
|
|
48
|
-
BackdropComponent as ComponentType<any>,
|
|
49
|
-
)
|
|
50
|
-
: null,
|
|
51
|
-
[BackdropComponent],
|
|
52
|
-
);
|
|
53
|
-
|
|
54
43
|
const handleBackdropPress = useCallback(() => {
|
|
55
44
|
if (backdropBehavior === "dismiss") {
|
|
56
45
|
onDismissRequest?.();
|
|
@@ -140,24 +129,12 @@ export const BackdropLayer = memo(function BackdropLayer({
|
|
|
140
129
|
pointerEvents={backdropBehavior === "passthrough" ? "none" : "auto"}
|
|
141
130
|
onPress={isBackdropActive ? handleBackdropPress : undefined}
|
|
142
131
|
>
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
) : BackdropComponent ? (
|
|
150
|
-
<BackdropComponent
|
|
151
|
-
styles={backdropStyles}
|
|
152
|
-
props={backdropProps}
|
|
153
|
-
pointerEvents={backdropPointerEvents}
|
|
154
|
-
/>
|
|
155
|
-
) : (
|
|
156
|
-
<Animated.View
|
|
157
|
-
style={backdropStyles}
|
|
158
|
-
pointerEvents={backdropPointerEvents}
|
|
159
|
-
/>
|
|
160
|
-
)}
|
|
132
|
+
<LayerComponent
|
|
133
|
+
component={BackdropComponent}
|
|
134
|
+
styles={backdropStyles}
|
|
135
|
+
props={BackdropComponent ? backdropProps : undefined}
|
|
136
|
+
pointerEvents={backdropPointerEvents}
|
|
137
|
+
/>
|
|
161
138
|
</Pressable>
|
|
162
139
|
);
|
|
163
140
|
});
|