utm-scroll-scene 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.tsx","../components/ScrollScene.tsx","../components/DroneScene.tsx","../lib/three/setup.ts","../lib/three/path.ts","../components/NarrationRevolver.tsx","../components/PhoneUI.tsx","../lib/animation/timeline.ts","../lib/animation/types.ts","../lib/hooks/useReducedMotion.ts"],"sourcesContent":["export { ScrollScene } from \"../components/ScrollScene\";\nexport type { DroneSceneHandle } from \"../components/DroneScene\";\n","\"use client\";\n\nimport { useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport gsap from \"gsap\";\nimport { DroneScene, type DroneSceneHandle } from \"@/components/DroneScene\";\nimport { NarrationRevolver, type NarrationRevolverHandle } from \"@/components/NarrationRevolver\";\nimport PhoneUI from \"@/components/PhoneUI\";\nimport { createMasterTimeline } from \"@/lib/animation/timeline\";\nimport {\n createInitialNarrativeState,\n type NarrativeState,\n} from \"@/lib/animation/types\";\nimport { useReducedMotion } from \"@/lib/hooks/useReducedMotion\";\n\nexport function ScrollScene() {\n const rootRef = useRef<HTMLElement | null>(null);\n const droneRef = useRef<DroneSceneHandle | null>(null);\n const narrationRef = useRef<NarrationRevolverHandle | null>(null);\n const reducedMotion = useReducedMotion();\n const [mobileViewport, setMobileViewport] = useState(false);\n const stateRef = useRef<NarrativeState>(createInitialNarrativeState());\n\n useEffect(() => {\n const media = window.matchMedia(\"(max-width: 900px)\");\n const update = () => setMobileViewport(media.matches);\n update();\n media.addEventListener(\"change\", update);\n return () => media.removeEventListener(\"change\", update);\n }, []);\n\n useLayoutEffect(() => {\n if (!rootRef.current) {\n return;\n }\n\n const root = rootRef.current;\n const webglDisabled = reducedMotion || mobileViewport;\n const state = stateRef.current;\n const updateLayers = () => {\n root.style.setProperty(\"--phone-opacity\", state.phoneOpacity.toFixed(4));\n root.style.setProperty(\"--phone-mask-open\", state.phoneMaskOpen.toFixed(4));\n root.style.setProperty(\"--phone-tilt\", `${state.phoneTilt.toFixed(3)}deg`);\n root.style.setProperty(\"--phone-scale\", state.phoneScale.toFixed(4));\n root.style.setProperty(\"--portal-bloom\", state.portalBloom.toFixed(4));\n root.style.setProperty(\"--ui-pulse\", state.uiPulse.toFixed(4));\n root.style.setProperty(\"--emerge\", state.emergeT.toFixed(4));\n root.style.setProperty(\"--flight-progress\", state.flightT.toFixed(4));\n root.style.setProperty(\"--flight-depth\", state.flightDepth.toFixed(4));\n root.style.setProperty(\"--hover\", state.hover.toFixed(4));\n root.style.setProperty(\"--drop\", state.drop.toFixed(4));\n root.style.setProperty(\"--cloud-far\", state.cloudFarShift.toFixed(4));\n root.style.setProperty(\"--cloud-near\", state.cloudNearShift.toFixed(4));\n root.style.setProperty(\"--ground-rise\", state.groundRise.toFixed(4));\n root.style.setProperty(\"--kiosk-reveal\", state.kioskReveal.toFixed(4));\n root.style.setProperty(\"--active-heading\", state.activeHeading.toFixed(4));\n narrationRef.current?.setActiveHeading(state.activeHeading);\n root.style.setProperty(\"--exit\", state.exit.toFixed(4));\n\n if (!webglDisabled) {\n const width = root.clientWidth;\n const height = root.clientHeight;\n droneRef.current?.resize(width, height, window.devicePixelRatio || 1);\n droneRef.current?.setState(state);\n }\n };\n\n const timeline = createMasterTimeline(root, state, updateLayers);\n\n const renderFromTicker = () => {\n if (!webglDisabled) {\n droneRef.current?.renderFrame();\n }\n };\n gsap.ticker.add(renderFromTicker);\n\n updateLayers();\n\n const onResize = () => {\n updateLayers();\n timeline.scrollTrigger?.refresh();\n };\n window.addEventListener(\"resize\", onResize);\n\n return () => {\n window.removeEventListener(\"resize\", onResize);\n gsap.ticker.remove(renderFromTicker);\n timeline.scrollTrigger?.kill();\n timeline.kill();\n };\n }, [mobileViewport, reducedMotion]);\n\n const showWebgl = !reducedMotion && !mobileViewport;\n\n return (\n <section ref={rootRef} className=\"zipline-scroll-scene\">\n <div className=\"zipline-dom-layer\">\n <NarrationRevolver ref={narrationRef} />\n </div>\n\n <svg\n className=\"zipline-svg-layer\"\n viewBox=\"0 0 1440 900\"\n preserveAspectRatio=\"xMidYMid slice\"\n aria-hidden=\"true\"\n >\n <defs>\n <linearGradient id=\"zip-sky\" x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor=\"#a9d4ff\" />\n <stop offset=\"52%\" stopColor=\"#d5ebff\" />\n <stop offset=\"100%\" stopColor=\"#f5f9ff\" />\n </linearGradient>\n </defs>\n\n <rect className=\"zipline-sky\" x=\"0\" y=\"0\" width=\"1440\" height=\"900\" fill=\"url(#zip-sky)\" />\n <g className=\"zipline-cloud-far\">\n <ellipse cx=\"1100\" cy=\"225\" rx=\"360\" ry=\"128\" fill=\"rgba(255,255,255,0.35)\" />\n <ellipse cx=\"540\" cy=\"272\" rx=\"300\" ry=\"106\" fill=\"rgba(255,255,255,0.3)\" />\n <ellipse cx=\"880\" cy=\"412\" rx=\"460\" ry=\"132\" fill=\"rgba(255,255,255,0.28)\" />\n </g>\n <g className=\"zipline-cloud-near\">\n <ellipse cx=\"360\" cy=\"610\" rx=\"350\" ry=\"110\" fill=\"rgba(255,255,255,0.45)\" />\n <ellipse cx=\"920\" cy=\"620\" rx=\"320\" ry=\"92\" fill=\"rgba(255,255,255,0.4)\" />\n <ellipse cx=\"1220\" cy=\"540\" rx=\"230\" ry=\"74\" fill=\"rgba(255,255,255,0.34)\" />\n </g>\n <rect className=\"zipline-ground\" x=\"0\" y=\"705\" width=\"1440\" height=\"240\" />\n </svg>\n\n <div className=\"zipline-phone-wrapper\">\n <PhoneUI />\n </div>\n\n {showWebgl ? <DroneScene ref={droneRef} className=\"zipline-webgl-layer\" /> : null}\n <div className=\"zipline-mobile-fallback\" aria-hidden={showWebgl}>\n <div className=\"zipline-fallback-drone\" />\n <div className=\"zipline-fallback-package\" />\n </div>\n </section>\n );\n}\n","\"use client\";\n\nimport { forwardRef, useEffect, useImperativeHandle, useRef } from \"react\";\nimport type { NarrativeState } from \"@/lib/animation/types\";\nimport {\n createDroneRig,\n disposeDroneRig,\n renderDroneState,\n resizeDroneRig,\n type DroneRig,\n} from \"@/lib/three/setup\";\n\nexport type DroneSceneHandle = {\n setState: (nextState: NarrativeState) => void;\n resize: (width: number, height: number, dpr: number) => void;\n renderFrame: () => void;\n};\n\ntype DroneSceneProps = {\n className?: string;\n};\n\nexport const DroneScene = forwardRef<DroneSceneHandle, DroneSceneProps>(function DroneScene(\n { className },\n ref\n) {\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const rigRef = useRef<DroneRig | null>(null);\n const stateRef = useRef<NarrativeState | null>(null);\n\n useImperativeHandle(ref, () => ({\n setState(nextState) {\n stateRef.current = nextState;\n },\n resize(width, height, dpr) {\n if (!rigRef.current) {\n return;\n }\n resizeDroneRig(rigRef.current, width, height, dpr);\n },\n renderFrame() {\n if (!rigRef.current || !stateRef.current) {\n return;\n }\n renderDroneState(rigRef.current, stateRef.current);\n },\n }));\n\n useEffect(() => {\n if (!canvasRef.current) {\n return;\n }\n const rig = createDroneRig(canvasRef.current);\n rigRef.current = rig;\n\n return () => {\n if (!rigRef.current) {\n return;\n }\n disposeDroneRig(rigRef.current);\n rigRef.current = null;\n };\n }, []);\n\n return <canvas ref={canvasRef} className={className} />;\n});\n","import * as THREE from \"three\";\nimport { GLTFLoader } from \"three/addons/loaders/GLTFLoader.js\";\nimport { RoundedBoxGeometry } from \"three/addons/geometries/RoundedBoxGeometry.js\";\nimport type { NarrativeState } from \"@/lib/animation/types\";\nimport { clamp01, launchPath, flightPath, flightPath2, exitPath, KIOSK_TOP_Y, PICKUP_KIOSK_POS, KIOSK_CENTER, INTRO_DRONE_POS, INTRO_DRONE_SCALE } from \"./path\";\n\nexport type DroneRig = {\n renderer: THREE.WebGLRenderer;\n scene: THREE.Scene;\n camera: THREE.PerspectiveCamera;\n dronePayload: THREE.Group;\n drone: THREE.Object3D;\n package: THREE.Mesh;\n pickupKiosk: THREE.Object3D;\n kiosk: THREE.Object3D;\n};\n\nfunction createFallbackDrone(): THREE.Group {\n const group = new THREE.Group();\n const bodyGeo = new THREE.BoxGeometry(0.12, 0.06, 0.16);\n const bodyMat = new THREE.MeshStandardMaterial({\n color: \"#d7d1c4\",\n metalness: 0.3,\n roughness: 0.6,\n });\n const body = new THREE.Mesh(bodyGeo, bodyMat);\n body.castShadow = true;\n group.add(body);\n const propGeo = new THREE.CylinderGeometry(0.02, 0.02, 0.005, 8);\n const propMat = new THREE.MeshStandardMaterial({ color: \"#333\" });\n for (let i = 0; i < 4; i++) {\n const prop = new THREE.Mesh(propGeo, propMat);\n const angle = (i / 4) * Math.PI * 2;\n prop.position.set(\n Math.cos(angle) * 0.1,\n 0.04,\n Math.sin(angle) * 0.1\n );\n group.add(prop);\n }\n group.rotation.x = Math.PI / 2;\n return group;\n}\n\nfunction createPackageMesh(): THREE.Mesh {\n const geo = new RoundedBoxGeometry(0.08, 0.05, 0.12, 2, 0.008);\n const mat = new THREE.MeshStandardMaterial({\n color: \"#8B6F47\",\n metalness: 0,\n roughness: 0.92,\n envMapIntensity: 0.3,\n });\n const mesh = new THREE.Mesh(geo, mat);\n mesh.castShadow = true;\n return mesh;\n}\n\nfunction createKioskMesh(): THREE.Mesh {\n const geo = new THREE.BoxGeometry(0.5, 0.35, 0.4);\n const mat = new THREE.MeshStandardMaterial({\n color: \"#e8e4dc\",\n metalness: 0.1,\n roughness: 0.8,\n });\n const mesh = new THREE.Mesh(geo, mat);\n mesh.castShadow = true;\n mesh.receiveShadow = true;\n return mesh;\n}\n\nexport function createDroneRig(canvas: HTMLCanvasElement): DroneRig {\n const renderer = new THREE.WebGLRenderer({\n canvas,\n antialias: true,\n alpha: true,\n });\n renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));\n renderer.toneMapping = THREE.ACESFilmicToneMapping;\n renderer.toneMappingExposure = 1;\n renderer.outputColorSpace = THREE.SRGBColorSpace;\n renderer.shadowMap.enabled = true;\n renderer.shadowMap.type = THREE.PCFSoftShadowMap;\n\n const scene = new THREE.Scene();\n scene.background = null;\n\n const camera = new THREE.PerspectiveCamera(\n 45,\n canvas.clientWidth / canvas.clientHeight,\n 0.1,\n 100\n );\n camera.position.set(0, 0.5, 4);\n camera.lookAt(0, 0.3, 0);\n\n const ambient = new THREE.AmbientLight(0xffffff, 0.7);\n scene.add(ambient);\n const dirLight = new THREE.DirectionalLight(0xffffff, 0.9);\n dirLight.position.set(2, 4, 3);\n dirLight.castShadow = true;\n dirLight.shadow.mapSize.set(1024, 1024);\n dirLight.shadow.camera.near = 0.5;\n dirLight.shadow.camera.far = 20;\n dirLight.shadow.camera.left = -4;\n dirLight.shadow.camera.right = 4;\n dirLight.shadow.camera.top = 4;\n dirLight.shadow.camera.bottom = -4;\n scene.add(dirLight);\n\n const dronePayload = new THREE.Group();\n const drone = createFallbackDrone();\n dronePayload.add(drone);\n\n const loader = new GLTFLoader();\n loader.load(\n \"/3d-models/assets/drone/scene.gltf\",\n (gltf) => {\n const root = gltf.scene;\n root.traverse((child) => {\n if (child instanceof THREE.Mesh) {\n child.castShadow = true;\n }\n });\n root.scale.setScalar(0.15);\n while (drone.children.length) drone.remove(drone.children[0]);\n drone.add(root);\n },\n undefined,\n () => {}\n );\n\n const pkg = createPackageMesh();\n pkg.position.set(PICKUP_KIOSK_POS.x, PICKUP_KIOSK_POS.y + 0.175 + PACKAGE_HEIGHT / 2, PICKUP_KIOSK_POS.z);\n pkg.visible = false;\n scene.add(pkg);\n\n scene.add(dronePayload);\n\n const pickupKiosk = new THREE.Group();\n pickupKiosk.position.copy(PICKUP_KIOSK_POS);\n pickupKiosk.visible = false;\n const pickupKioskFallback = createKioskMesh();\n pickupKiosk.add(pickupKioskFallback);\n scene.add(pickupKiosk);\n const pickupKioskLoader = new GLTFLoader();\n pickupKioskLoader.load(\n \"/3d-models/assets/smart_box/scene.gltf\",\n (gltf) => {\n const root = gltf.scene;\n root.traverse((child) => {\n if (child instanceof THREE.Mesh) {\n child.castShadow = true;\n child.receiveShadow = true;\n }\n });\n root.scale.setScalar(0.2);\n root.position.set(0, 0, 0);\n pickupKiosk.remove(pickupKioskFallback);\n pickupKioskFallback.geometry.dispose();\n (pickupKioskFallback.material as THREE.Material).dispose();\n pickupKiosk.add(root);\n },\n undefined,\n () => {}\n );\n\n const kiosk = new THREE.Group();\n kiosk.position.copy(KIOSK_CENTER);\n kiosk.visible = false;\n const kioskFallback = createKioskMesh();\n kiosk.add(kioskFallback);\n scene.add(kiosk);\n const kioskLoader = new GLTFLoader();\n kioskLoader.load(\n \"/3d-models/assets/smart_box/scene.gltf\",\n (gltf) => {\n const root = gltf.scene;\n root.traverse((child) => {\n if (child instanceof THREE.Mesh) {\n child.castShadow = true;\n child.receiveShadow = true;\n }\n });\n root.scale.setScalar(0.2);\n root.position.set(0, 0, 0);\n kiosk.remove(kioskFallback);\n kioskFallback.geometry.dispose();\n (kioskFallback.material as THREE.Material).dispose();\n kiosk.add(root);\n },\n undefined,\n () => {}\n );\n\n return {\n renderer,\n scene,\n camera,\n dronePayload,\n drone,\n package: pkg,\n pickupKiosk,\n kiosk,\n };\n}\n\nexport function resizeDroneRig(\n rig: DroneRig,\n width: number,\n height: number,\n dpr: number\n): void {\n rig.renderer.setPixelRatio(Math.min(dpr, 2));\n rig.renderer.setSize(width, height);\n rig.camera.aspect = width / height;\n rig.camera.updateProjectionMatrix();\n}\n\nfunction lerp(a: number, b: number, t: number): number {\n return a + (b - a) * clamp01(t);\n}\n\nconst HOVER_ALTITUDE = 1.0;\nconst PACKAGE_HEIGHT = 0.05;\nconst PACKAGE_LAND_Y = KIOSK_TOP_Y + PACKAGE_HEIGHT / 2;\nconst PACKAGE_OFFSET_BELOW_DRONE = 0.4;\nconst RELEASE_ALTITUDE = PACKAGE_LAND_Y + PACKAGE_OFFSET_BELOW_DRONE + 0.06;\n\nexport function renderDroneState(\n rig: DroneRig,\n state: NarrativeState\n): void {\n const { dronePayload, drone, package: pkg, pickupKiosk, kiosk, camera } = rig;\n\n const introDroneT = clamp01(state.introDroneT);\n const emergeT = clamp01(state.emergeT);\n const flightT = clamp01(state.flightT);\n const flight2T = clamp01(state.flight2T);\n const pickupT = clamp01(state.pickupT);\n const dropT = clamp01(state.drop);\n const releaseT = clamp01(state.release);\n const departT = clamp01(state.depart);\n const hoverT = clamp01(state.hover);\n const bank = state.bank;\n const pickupKioskReveal = clamp01(state.pickupKioskReveal);\n const kioskReveal = clamp01(state.kioskReveal);\n\n let scale: number;\n let pos: THREE.Vector3;\n\n if (introDroneT > 0) {\n const launchStart = launchPath.getPoint(0);\n pos = introDroneT >= 1 ? INTRO_DRONE_POS.clone() : INTRO_DRONE_POS.clone().lerp(launchStart, 1 - introDroneT);\n scale = lerp(1, INTRO_DRONE_SCALE, introDroneT);\n } else if (departT > 0) {\n scale = lerp(1, 0, departT);\n pos = exitPath.getPoint(departT);\n } else if (emergeT < 1) {\n scale = 1;\n pos = launchPath.getPoint(emergeT);\n } else {\n scale = 1;\n if (flightT < 1) {\n pos = flightPath.getPoint(flightT);\n } else if (pickupT < 1) {\n const flightEnd = flightPath.getPoint(1);\n const pickupHover = new THREE.Vector3(0.65, 0.5, 0.1);\n pos = flightEnd.clone().lerp(pickupHover, pickupT);\n } else if (flight2T < 1) {\n pos = flightPath2.getPoint(flight2T);\n const flyOutEnd = 0.35;\n const flyInStart = 0.65;\n if (flight2T <= flyOutEnd) {\n scale = lerp(1, 0.12, flight2T / flyOutEnd);\n } else if (flight2T >= flyInStart) {\n scale = lerp(0.12, 1, (flight2T - flyInStart) / (1 - flyInStart));\n } else {\n scale = 0.12;\n }\n } else if (dropT > 0) {\n const descendY = lerp(HOVER_ALTITUDE, RELEASE_ALTITUDE, dropT);\n pos = new THREE.Vector3(-0.08, descendY, -3.12);\n } else {\n const flight2End = flightPath2.getPoint(1);\n const hoverPos = new THREE.Vector3(-0.08, HOVER_ALTITUDE, -3.12);\n pos = flight2End.clone().lerp(hoverPos, hoverT);\n }\n }\n\n dronePayload.position.copy(pos);\n dronePayload.scale.setScalar(scale);\n dronePayload.updateMatrixWorld(true);\n\n const bankRad = bank * 0.45;\n dronePayload.rotation.order = \"YXZ\";\n dronePayload.rotation.x = Math.PI / 2;\n dronePayload.rotation.y = 0;\n dronePayload.rotation.z = departT > 0 ? -0.2 : -bankRad;\n\n const depthT = state.flightDepth;\n const camOffsetX = -1.0;\n const camOffsetZ = 2;\n const camX = pos.x + camOffsetX;\n const camZ = pos.z + camOffsetZ;\n const camY = lerp(0.5, pos.y * 0.3 + 0.4, depthT);\n camera.position.set(camX, camY, camZ);\n const lookZ = pos.z - 0.4;\n const lookY = pos.y * 0.6 + 0.15;\n camera.lookAt(pos.x + 0.3, lookY, lookZ);\n\n const pickupKioskRiseY = lerp(PICKUP_KIOSK_POS.y - 0.5, PICKUP_KIOSK_POS.y, pickupKioskReveal);\n const pickupKioskTopY = pickupKioskRiseY + 0.175;\n const pickupPackageY = pickupKioskTopY + PACKAGE_HEIGHT / 2;\n const deliveryKioskPos = new THREE.Vector3(-0.08, PACKAGE_LAND_Y, -3.12);\n\n pkg.visible = introDroneT <= 0 && pickupKioskReveal > 0;\n\n if (pkg.visible) {\n if (pickupT < 1) {\n if (pkg.parent) {\n pkg.parent.remove(pkg);\n rig.scene.add(pkg);\n }\n const pickupPos = new THREE.Vector3(0.65, pickupPackageY, 0.1);\n const attachWorld = new THREE.Vector3(0, 0.40, 0).applyMatrix4(drone.matrixWorld);\n pkg.position.lerpVectors(pickupPos, attachWorld, pickupT);\n pkg.rotation.set(0, 0, 0);\n pkg.scale.setScalar(1);\n } else if (releaseT >= 1) {\n if (pkg.parent) {\n pkg.parent.remove(pkg);\n rig.scene.add(pkg);\n }\n pkg.position.copy(deliveryKioskPos);\n pkg.rotation.set(0, 0, 0);\n pkg.scale.setScalar(1);\n } else if (releaseT > 0) {\n if (pkg.parent) {\n pkg.parent.remove(pkg);\n rig.scene.add(pkg);\n }\n const attachedWorld = new THREE.Vector3(0, 0.4, 0).applyMatrix4(drone.matrixWorld);\n pkg.position.lerpVectors(attachedWorld, deliveryKioskPos, releaseT);\n pkg.rotation.set(0, 0, 0);\n pkg.scale.setScalar(lerp(scale, 1, releaseT));\n } else {\n if (pkg.parent !== rig.drone) {\n rig.scene.remove(pkg);\n rig.drone.add(pkg);\n }\n pkg.position.set(0, 0.40, 0);\n pkg.rotation.set(0, 0, 0);\n pkg.scale.setScalar(1);\n }\n }\n\n pickupKiosk.visible = pickupKioskReveal > 0;\n pickupKiosk.position.set(PICKUP_KIOSK_POS.x, pickupKioskRiseY, PICKUP_KIOSK_POS.z);\n\n kiosk.visible = kioskReveal > 0;\n kiosk.traverse((obj) => {\n if (obj instanceof THREE.Mesh && obj.material) {\n const mat = Array.isArray(obj.material) ? obj.material[0] : obj.material;\n if (mat instanceof THREE.MeshStandardMaterial) {\n mat.opacity = kioskReveal;\n mat.transparent = kioskReveal < 1;\n }\n }\n });\n\n rig.renderer.render(rig.scene, rig.camera);\n}\n\nexport function disposeDroneRig(rig: DroneRig): void {\n rig.renderer.dispose();\n rig.dronePayload.traverse((obj) => {\n if (obj instanceof THREE.Mesh) {\n obj.geometry?.dispose();\n if (Array.isArray(obj.material)) {\n obj.material.forEach((m) => m.dispose());\n } else {\n obj.material?.dispose();\n }\n }\n });\n rig.package.geometry.dispose();\n (rig.package.material as THREE.Material).dispose();\n rig.pickupKiosk.traverse((obj) => {\n if (obj instanceof THREE.Mesh) {\n obj.geometry?.dispose();\n if (Array.isArray(obj.material)) {\n obj.material.forEach((m) => m.dispose());\n } else {\n obj.material?.dispose();\n }\n }\n });\n rig.kiosk.traverse((obj) => {\n if (obj instanceof THREE.Mesh) {\n obj.geometry?.dispose();\n if (Array.isArray(obj.material)) {\n obj.material.forEach((m) => m.dispose());\n } else {\n obj.material?.dispose();\n }\n }\n });\n}\n","import * as THREE from \"three\";\n\nconst launch0 = new THREE.Vector3(1.92, 0.35, 1.48);\nconst launch1 = new THREE.Vector3(1.75, 0.42, 1.22);\nconst launch2 = new THREE.Vector3(1.42, 0.5, 1.0);\nconst launch3 = new THREE.Vector3(1.0, 0.58, 0.7);\n\nconst flight0 = new THREE.Vector3(1.0, 0.58, 0.7);\nconst flight1 = new THREE.Vector3(0.4, 1.5, -0.4);\nconst flight2 = new THREE.Vector3(0, 1.75, -1.8);\nconst flight3 = new THREE.Vector3(0.65, 0.5, 0.1);\n\nconst flight2_0 = new THREE.Vector3(0.65, 0.5, 0.1);\nconst flight2_1 = new THREE.Vector3(0.4, 1.5, -1.5);\nconst flight2_2 = new THREE.Vector3(0.1, 2.2, -4.5);\nconst flight2_3 = new THREE.Vector3(-0.05, 1.5, -3.5);\nconst flight2_4 = new THREE.Vector3(-0.08, 1.0, -3.12);\n\nconst exit0 = new THREE.Vector3(-0.08, 0.35, -3.12);\nconst exit1 = new THREE.Vector3(-0.08, 1.3, -4.5);\nconst exit2 = new THREE.Vector3(-0.08, 2.4, -6.5);\n\nexport const launchPath = new THREE.CatmullRomCurve3(\n [launch0, launch1, launch2, launch3],\n false,\n \"catmullrom\",\n 0.5\n);\n\nexport const flightPath = new THREE.CatmullRomCurve3(\n [flight0, flight1, flight2, flight3],\n false,\n \"catmullrom\",\n 0.42\n);\n\nexport const flightPath2 = new THREE.CatmullRomCurve3(\n [flight2_0, flight2_1, flight2_2, flight2_3, flight2_4],\n false,\n \"catmullrom\",\n 0.42\n);\n\nexport const INTRO_DRONE_POS = new THREE.Vector3(1.4, 0.5, 0.5);\nexport const INTRO_DRONE_SCALE = 1.8;\nexport const PICKUP_KIOSK_POS = new THREE.Vector3(0.65, -0.15, 0.1);\n\nexport const exitPath = new THREE.CatmullRomCurve3(\n [exit0, exit1, exit2],\n false,\n \"catmullrom\",\n 0.5\n);\n\nexport const KIOSK_CENTER = new THREE.Vector3(-0.08, -0.175, -3.12);\nexport const KIOSK_TOP_Y = 0;\n\nexport function clamp01(value: number) {\n return Math.max(0, Math.min(1, value));\n}\n","\"use client\";\n\nimport { forwardRef, useImperativeHandle } from \"react\";\nimport { motion, useMotionValue, useSpring, useTransform } from \"motion/react\";\n\nconst NARRATIONS = [\n {\n text: \"Kỷ nguyên mới của vận tải thông minh lấy UAV làm cốt lõi\",\n tag: \"h1\",\n className: \"zipline-narration-intro\",\n },\n {\n text: \"Đặt hàng tiện lợi trên ứng dụng\",\n tag: \"h2\",\n className: \"zipline-narration-order\",\n },\n {\n text: \"Giao hàng siêu tốc trong vài phút\",\n tag: \"h2\",\n className: \"zipline-narration-order\",\n },\n {\n text: \"Nhận hàng trong vài giây\",\n tag: \"h2\",\n className: \"zipline-narration-delivers\",\n },\n {\n text: \"Không cần chờ. UAV giao ngay. Kết nối trăm triệu khách hàng. Tham gia LAE Sandbox ngay\",\n tag: \"h3\",\n className: \"zipline-narration-cta\",\n },\n] as const;\n\nexport type NarrationRevolverHandle = {\n setActiveHeading: (value: number) => void;\n};\n\nexport const NarrationRevolver = forwardRef<NarrationRevolverHandle>(function NarrationRevolver(\n _,\n ref\n) {\n const activeHeading = useMotionValue(0);\n const springHeading = useSpring(activeHeading, {\n stiffness: 100,\n damping: 25,\n restDelta: 0.001,\n });\n\n useImperativeHandle(ref, () => ({\n setActiveHeading(value: number) {\n activeHeading.set(value);\n },\n }));\n\n const stripY = useTransform(springHeading, (v) => `${-v * 100}%`);\n\n return (\n <div className=\"zipline-narration-viewport\">\n <motion.div className=\"zipline-narration-strip\" style={{ y: stripY }}>\n {NARRATIONS.map((item, index) => {\n const Tag = item.tag;\n const slotRotateX = useTransform(\n springHeading,\n (v) => (v - index) * 18\n );\n return (\n <motion.div\n key={index}\n className={`zipline-narration-slot ${item.className}`}\n style={{\n rotateX: slotRotateX,\n transformOrigin: \"left top -300px\",\n backfaceVisibility: \"hidden\",\n }}\n >\n <Tag>{item.text}</Tag>\n </motion.div>\n );\n })}\n </motion.div>\n </div>\n );\n});\n","\"use client\";\n\nimport { forwardRef } from \"react\";\n\ninterface PhoneUIProps {\n screenRef?: React.Ref<HTMLDivElement>;\n}\n\nconst PhoneUI = forwardRef<HTMLDivElement, PhoneUIProps>(\n function PhoneUI({ screenRef }, ref) {\n return (\n <div\n ref={ref}\n className=\"phone-container\"\n style={{\n width: \"280px\",\n perspective: \"1000px\",\n position: \"relative\",\n }}\n >\n <svg\n viewBox=\"0 0 280 560\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{ width: \"100%\", height: \"auto\", display: \"block\" }}\n >\n <defs>\n <clipPath id=\"screenClip\">\n <rect x=\"12\" y=\"12\" width=\"256\" height=\"536\" rx=\"28\" />\n </clipPath>\n <linearGradient id=\"phoneBg\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"#f7f9fc\" />\n <stop offset=\"100%\" stopColor=\"#edf1f7\" />\n </linearGradient>\n <filter id=\"phoneShadow\">\n <feDropShadow dx=\"0\" dy=\"8\" stdDeviation=\"16\" floodOpacity=\"0.15\" />\n </filter>\n </defs>\n\n <rect\n x=\"2\"\n y=\"2\"\n width=\"276\"\n height=\"556\"\n rx=\"36\"\n fill=\"#1a1a1a\"\n filter=\"url(#phoneShadow)\"\n />\n <rect\n x=\"6\"\n y=\"6\"\n width=\"268\"\n height=\"548\"\n rx=\"33\"\n fill=\"#2a2a2a\"\n />\n\n <g clipPath=\"url(#screenClip)\">\n <rect x=\"12\" y=\"12\" width=\"256\" height=\"536\" fill=\"url(#phoneBg)\" />\n\n <rect x=\"92\" y=\"22\" width=\"96\" height=\"24\" rx=\"12\" fill=\"#1a1a1a\" />\n <circle cx=\"140\" cy=\"34\" r=\"5\" fill=\"#333\" />\n\n <text\n x=\"140\"\n y=\"72\"\n textAnchor=\"middle\"\n fill=\"#1a6bff\"\n fontSize=\"11\"\n fontWeight=\"700\"\n fontFamily=\"system-ui, sans-serif\"\n >\n LAE Sandbox\n </text>\n\n <rect x=\"32\" y=\"90\" width=\"216\" height=\"100\" rx=\"16\" fill=\"#ffffff\" />\n <rect\n x=\"32\"\n y=\"90\"\n width=\"216\"\n height=\"100\"\n rx=\"16\"\n fill=\"none\"\n stroke=\"#e5e7eb\"\n strokeWidth=\"1\"\n />\n\n <circle cx=\"60\" cy=\"120\" r=\"16\" fill=\"#eef4ff\" />\n <text\n x=\"60\"\n y=\"124\"\n textAnchor=\"middle\"\n fill=\"#1a6bff\"\n fontSize=\"14\"\n >\n 📦\n </text>\n\n <text\n x=\"88\"\n y=\"118\"\n fill=\"#111\"\n fontSize=\"12\"\n fontWeight=\"600\"\n fontFamily=\"system-ui, sans-serif\"\n >\n Đơn hàng hỏa tốc\n </text>\n <text\n x=\"88\"\n y=\"136\"\n fill=\"#6b7280\"\n fontSize=\"10\"\n fontFamily=\"system-ui, sans-serif\"\n >\n Đến trong ~4 phút\n </text>\n\n <rect x=\"88\" y=\"152\" width=\"140\" height=\"6\" rx=\"3\" fill=\"#e5e7eb\" />\n <rect x=\"88\" y=\"152\" width=\"95\" height=\"6\" rx=\"3\" fill=\"#1a6bff\" />\n\n <rect x=\"32\" y=\"210\" width=\"216\" height=\"180\" rx=\"16\" fill=\"#e8f0fe\" />\n <circle cx=\"140\" cy=\"280\" r=\"28\" fill=\"#ffffff\" stroke=\"#1a6bff\" strokeWidth=\"2\" />\n <text\n x=\"140\"\n y=\"276\"\n textAnchor=\"middle\"\n fill=\"#1a6bff\"\n fontSize=\"16\"\n fontWeight=\"700\"\n fontFamily=\"system-ui, sans-serif\"\n >\n 4\n </text>\n <text\n x=\"140\"\n y=\"292\"\n textAnchor=\"middle\"\n fill=\"#1a6bff\"\n fontSize=\"8\"\n fontFamily=\"system-ui, sans-serif\"\n >\n MIN\n </text>\n\n <circle cx=\"100\" cy=\"340\" r=\"4\" fill=\"#1a6bff\" />\n <circle cx=\"140\" cy=\"340\" r=\"4\" fill=\"#1a6bff\" opacity=\"0.5\" />\n <circle cx=\"180\" cy=\"340\" r=\"4\" fill=\"#d1d5db\" />\n\n <text\n x=\"140\"\n y=\"370\"\n textAnchor=\"middle\"\n fill=\"#9ca3af\"\n fontSize=\"9\"\n fontFamily=\"system-ui, sans-serif\"\n >\n Theo dõi trực tiếp\n </text>\n\n <rect x=\"32\" y=\"420\" width=\"216\" height=\"44\" rx=\"22\" fill=\"#1a6bff\" />\n <text\n x=\"140\"\n y=\"447\"\n textAnchor=\"middle\"\n fill=\"#ffffff\"\n fontSize=\"13\"\n fontWeight=\"600\"\n fontFamily=\"system-ui, sans-serif\"\n >\n Theo dõi đơn hàng\n </text>\n\n </g>\n </svg>\n\n <div\n ref={screenRef}\n style={{\n position: \"absolute\",\n top: \"12px\",\n left: \"12px\",\n right: \"12px\",\n bottom: \"12px\",\n pointerEvents: \"none\",\n }}\n />\n </div>\n );\n }\n);\n\nexport default PhoneUI;\n","\"use client\";\n\nimport gsap from \"gsap\";\nimport { ScrollTrigger } from \"gsap/ScrollTrigger\";\nimport type { NarrativeState } from \"@/lib/animation/types\";\n\ngsap.registerPlugin(ScrollTrigger);\n\nexport function createMasterTimeline(\n root: HTMLElement,\n state: NarrativeState,\n onUpdate: () => void\n) {\n const timeline = gsap.timeline({\n defaults: { ease: \"none\" },\n onUpdate,\n scrollTrigger: {\n trigger: root,\n start: \"top top\",\n end: \"+=8000\",\n pin: true,\n scrub: true,\n anticipatePin: 1,\n invalidateOnRefresh: true,\n },\n });\n\n timeline\n .addLabel(\"intro\", 0)\n .set(state, {\n introDroneT: 1,\n phoneOpacity: 0,\n phoneMaskOpen: 0,\n phoneTilt: 0,\n phoneScale: 1,\n portalBloom: 0,\n uiPulse: 0,\n emergeT: 0,\n flightT: 0,\n flight2T: 0,\n pickupT: 0,\n flightDepth: 0,\n bank: 0,\n hover: 0,\n drop: 0,\n release: 0,\n reel: 0,\n depart: 0,\n settle: 0,\n cloudFarShift: 0,\n cloudNearShift: 0,\n groundRise: 0,\n pickupKioskReveal: 0,\n kioskReveal: 0,\n activeHeading: 0,\n })\n .addLabel(\"order_intro\", 0.5)\n .to(state, { introDroneT: 0, duration: 0.55 }, \"order_intro\")\n .to(state, { phoneOpacity: 1, duration: 0.5 }, \"order_intro\")\n .to(state, { activeHeading: 1, duration: 0.55, ease: \"power2.inOut\" }, \"order_intro\")\n .addLabel(\"order_confirmed\", 1.15)\n .to(state, { uiPulse: 1, duration: 0.28 }, \"order_confirmed\")\n .to(state, { phoneMaskOpen: 0.3, duration: 0.45 }, \"order_confirmed+=0.05\")\n .to(state, { phoneTilt: -6, phoneScale: 0.95, duration: 0.48 }, \"order_confirmed+=0.08\")\n .addLabel(\"drone_launch\", 1.7)\n .to(state, { portalBloom: 1, duration: 0.32 }, \"drone_launch\")\n .to(state, { emergeT: 1, duration: 0.75 }, \"drone_launch+=0.04\")\n .to(state, { phoneMaskOpen: 1, duration: 0.7 }, \"drone_launch+=0.08\")\n .to(state, { phoneOpacity: 0.35, duration: 0.55 }, \"drone_launch+=0.1\")\n .to(state, { activeHeading: 2, duration: 0.5 }, \"drone_launch+=0.22\")\n .addLabel(\"flight\", 2.65)\n .to(state, { flightT: 1, duration: 2.0 }, \"flight\")\n .to(state, { flightDepth: 1, duration: 1.8 }, \"flight+=0.08\")\n .to(state, { bank: 1.15, duration: 0.5 }, \"flight\")\n .to(state, { bank: -0.88, duration: 0.5 }, \"flight+=0.5\")\n .to(state, { bank: 0.25, duration: 0.6 }, \"flight+=1.1\")\n .to(state, { cloudFarShift: 1, duration: 2.0 }, \"flight\")\n .to(state, { cloudNearShift: 1, duration: 2.0 }, \"flight+=0.08\")\n .addLabel(\"pickup\", 4.7)\n .to(state, { pickupKioskReveal: 1, duration: 0.4 }, \"pickup\")\n .to(state, { pickupT: 1, duration: 0.22 }, \"pickup+=0.45\")\n .addLabel(\"flight_to_delivery\", 5.42)\n .to(state, { flight2T: 1, duration: 2.2 }, \"flight_to_delivery\")\n .addLabel(\"package_drop\", 6.8)\n .to(state, { kioskReveal: 1, duration: 0.52 }, \"package_drop\")\n .to(state, { hover: 1, duration: 0.45 }, \"package_drop\")\n .to(state, { activeHeading: 3, duration: 0.45, ease: \"power2.inOut\" }, \"package_drop+=0.06\")\n .to(state, { drop: 1, duration: 1.25 }, \"package_drop+=0.12\")\n .to(state, { groundRise: 1, duration: 1.25 }, \"package_drop+=0.12\")\n .to(state, { settle: 1, duration: 0.3 }, \"package_drop+=1.28\")\n .to(state, { release: 1, duration: 0.08 }, \"package_drop+=1.3\")\n .to(state, { reel: 1, duration: 0.01 }, \"package_drop+=1.3\")\n .to(state, { depart: 1, duration: 2.0 }, \"package_drop+=1.58\")\n .addLabel(\"exit\", 8.5)\n .to(state, { activeHeading: 4, duration: 0.5, ease: \"power2.inOut\" }, \"exit\")\n .to(state, { phoneOpacity: 0, portalBloom: 0, duration: 0.5 }, \"exit\")\n .to(state, { exit: 1, duration: 0.65 }, \"exit+=0.08\");\n\n return timeline;\n}\n","export type NarrativeState = {\n introDroneT: number;\n phoneOpacity: number;\n phoneMaskOpen: number;\n phoneTilt: number;\n phoneScale: number;\n portalBloom: number;\n uiPulse: number;\n emergeT: number;\n flightT: number;\n flight2T: number;\n pickupT: number;\n flightDepth: number;\n bank: number;\n hover: number;\n drop: number;\n release: number;\n reel: number;\n depart: number;\n settle: number;\n cloudFarShift: number;\n cloudNearShift: number;\n groundRise: number;\n pickupKioskReveal: number;\n kioskReveal: number;\n activeHeading: number;\n exit: number;\n};\n\nexport function createInitialNarrativeState(): NarrativeState {\n return {\n introDroneT: 1,\n phoneOpacity: 0,\n phoneMaskOpen: 0,\n phoneTilt: 0,\n phoneScale: 1,\n portalBloom: 0,\n uiPulse: 0,\n emergeT: 0,\n flightT: 0,\n flight2T: 0,\n pickupT: 0,\n flightDepth: 0,\n bank: 0,\n hover: 0,\n drop: 0,\n release: 0,\n reel: 0,\n depart: 0,\n settle: 0,\n cloudFarShift: 0,\n cloudNearShift: 0,\n groundRise: 0,\n pickupKioskReveal: 0,\n kioskReveal: 0,\n activeHeading: 0,\n exit: 0,\n };\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nexport function useReducedMotion(): boolean {\n const [prefersReduced, setPrefersReduced] = useState(false);\n\n useEffect(() => {\n const media = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n setPrefersReduced(media.matches);\n const handler = (e: MediaQueryListEvent) => setPrefersReduced(e.matches);\n media.addEventListener(\"change\", handler);\n return () => media.removeEventListener(\"change\", handler);\n }, []);\n\n return prefersReduced;\n}\n"],"mappings":"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","names":["import_react","import_gsap","THREE","DroneScene","import_react","import_jsx_runtime","NarrationRevolver","import_react","import_jsx_runtime","PhoneUI","gsap","import_react","import_jsx_runtime","gsap"]}
@@ -0,0 +1,40 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare function ScrollScene(): react_jsx_runtime.JSX.Element;
4
+
5
+ type NarrativeState = {
6
+ introDroneT: number;
7
+ phoneOpacity: number;
8
+ phoneMaskOpen: number;
9
+ phoneTilt: number;
10
+ phoneScale: number;
11
+ portalBloom: number;
12
+ uiPulse: number;
13
+ emergeT: number;
14
+ flightT: number;
15
+ flight2T: number;
16
+ pickupT: number;
17
+ flightDepth: number;
18
+ bank: number;
19
+ hover: number;
20
+ drop: number;
21
+ release: number;
22
+ reel: number;
23
+ depart: number;
24
+ settle: number;
25
+ cloudFarShift: number;
26
+ cloudNearShift: number;
27
+ groundRise: number;
28
+ pickupKioskReveal: number;
29
+ kioskReveal: number;
30
+ activeHeading: number;
31
+ exit: number;
32
+ };
33
+
34
+ type DroneSceneHandle = {
35
+ setState: (nextState: NarrativeState) => void;
36
+ resize: (width: number, height: number, dpr: number) => void;
37
+ renderFrame: () => void;
38
+ };
39
+
40
+ export { type DroneSceneHandle, ScrollScene };
@@ -0,0 +1,40 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare function ScrollScene(): react_jsx_runtime.JSX.Element;
4
+
5
+ type NarrativeState = {
6
+ introDroneT: number;
7
+ phoneOpacity: number;
8
+ phoneMaskOpen: number;
9
+ phoneTilt: number;
10
+ phoneScale: number;
11
+ portalBloom: number;
12
+ uiPulse: number;
13
+ emergeT: number;
14
+ flightT: number;
15
+ flight2T: number;
16
+ pickupT: number;
17
+ flightDepth: number;
18
+ bank: number;
19
+ hover: number;
20
+ drop: number;
21
+ release: number;
22
+ reel: number;
23
+ depart: number;
24
+ settle: number;
25
+ cloudFarShift: number;
26
+ cloudNearShift: number;
27
+ groundRise: number;
28
+ pickupKioskReveal: number;
29
+ kioskReveal: number;
30
+ activeHeading: number;
31
+ exit: number;
32
+ };
33
+
34
+ type DroneSceneHandle = {
35
+ setState: (nextState: NarrativeState) => void;
36
+ resize: (width: number, height: number, dpr: number) => void;
37
+ renderFrame: () => void;
38
+ };
39
+
40
+ export { type DroneSceneHandle, ScrollScene };