"use client"; import { useEffect, useRef } from "react"; import { SectionShell } from "@/components/ui/SectionShell"; import { MonoTick } from "@/components/ui/MonoTick"; import { Reveal } from "@/components/ui/Reveal"; import { Video } from "@/components/ui/Video"; import { media } from "@/lib/assets"; /** * Form factor — the weight story on a white plate (the original's deliberate light * contrast against the black stage). Beyond 1 → a violet line sweeps left to right * → Beyond 2, then the footage, then the payoff line. The sweep replays whenever * the comparison re-enters view (it's a narrative, not a one-shot reveal). */ export function FormFactor() { const wrapRef = useRef(null); const leftRef = useRef(null); const lineRef = useRef(null); const rightRef = useRef(null); useEffect(() => { if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return; const wrap = wrapRef.current; const left = leftRef.current; const line = lineRef.current; const right = rightRef.current; if (!wrap || !left || !line || !right) return; const EASE = "cubic-bezier(0.16,1,0.3,1)"; let timers: number[] = []; let cooldown = false; const reset = () => { timers.forEach(clearTimeout); timers = []; for (const el of [left, right]) { el.style.transition = "none"; el.style.opacity = "0"; } left.style.transform = "translateX(-16px)"; right.style.transform = "translateX(16px)"; line.style.transition = "none"; line.style.transform = "scaleX(0)"; }; const play = () => { requestAnimationFrame(() => requestAnimationFrame(() => { left.style.transition = `opacity 600ms ${EASE}, transform 600ms ${EASE}`; left.style.opacity = "1"; left.style.transform = "none"; timers.push( window.setTimeout(() => { line.style.transition = `transform 900ms ${EASE}`; line.style.transform = "scaleX(1)"; }, 200), ); timers.push( window.setTimeout(() => { right.style.transition = `opacity 600ms ${EASE}, transform 600ms ${EASE}`; right.style.opacity = "1"; right.style.transform = "none"; }, 1000), ); }), ); }; reset(); const io = new IntersectionObserver( (entries) => { if (cooldown) return; if (entries[0].isIntersecting) { play(); } else { cooldown = true; reset(); window.setTimeout(() => (cooldown = false), 400); } }, { threshold: 0.6 }, ); io.observe(wrap); return () => { io.disconnect(); timers.forEach(clearTimeout); }; }, []); return ( {/* weight comparison sweep */}
BEYOND 1
127g
BEYOND 2
107g
{/* the footage */}
{/* the payoff */}
16% lighter than the original

Bigscreen Beyond 2 weighs just 107 grams, compared to the 127 gram first-generation Beyond. This obsessive focus on weight and form factor delivers unbeatable comfort for long-duration virtual reality experiences.

); }