Terminal
1npm install next-transition-router gsap
Depth of field effect known from photography and film. Page 'moves away' and loses focus, new page 'approaches' with focus effect. Ideal for photo galleries and immersive experiences.
npm install next-transition-router gsapscale + filter: blur() for depth-of-fieldtransformOrigin: 'center center' for zoom from center1npm install next-transition-router gsap
1'use client'23import { useRef } from 'react'4import { TransitionRouter } from 'next-transition-router'5import gsap from 'gsap'67export default function ZoomProvider({ children }: { children: React.ReactNode }) {8 const wrapperRef = useRef<HTMLDivElement>(null)910 return (11 <TransitionRouter12 auto13 leave={(next) => {14 const tl = gsap.timeline({ onComplete: next })15 const wrapper = wrapperRef.current16 const content = wrapper?.querySelectorAll('h1, p, .btn, .demo-badge')1718 tl.to(content, {19 scale: 0.95,20 opacity: 0,21 stagger: 0.03,22 duration: 0.3,23 ease: 'power2.in',24 })2526 tl.to(wrapper, {27 scale: 0.92,28 opacity: 0,29 filter: 'blur(8px)',30 duration: 0.4,31 ease: 'power3.in',32 }, '-=0.2')33 }}34 enter={(next) => {35 const tl = gsap.timeline({ onComplete: next })36 const wrapper = wrapperRef.current37 const content = wrapper?.querySelectorAll('h1, p, .btn, .demo-badge')3839 gsap.set(wrapper, { scale: 1.15, opacity: 0, filter: 'blur(12px)' })40 gsap.set(content, { scale: 1.1, opacity: 0 })4142 tl.to(wrapper, {43 scale: 1,44 opacity: 1,45 filter: 'blur(0px)',46 duration: 0.5,47 ease: 'power3.out',48 })4950 tl.to(content, {51 scale: 1,52 opacity: 1,53 stagger: 0.05,54 duration: 0.4,55 ease: 'power2.out',56 }, '-=0.3')57 }}58 >59 <div ref={wrapperRef} style={{ transformOrigin: 'center center' }}>60 {children}61 </div>62 </TransitionRouter>63 )64}