← Volver
Hyper Speed Tunnel Hero (Extended Narrative)
Cinematic hyper-speed tunnel hero with extended storytelling text, layered typography, and immersive space effect
Marketing
Preview
<section class="w-full h-screen bg-black overflow-hidden relative">
<canvas id="tunnel"></canvas>
<!-- CONTENT -->
<div class="absolute inset-0 flex flex-col items-center justify-center text-center px-6 pointer-events-none">
<div class="max-w-3xl space-y-6">
<p class="text-xs tracking-[0.3em] text-white/40">
SYSTEM INITIALIZED
</p>
<h1 class="text-white text-4xl md:text-6xl font-semibold tracking-tight leading-tight">
Enter Hyper Speed
<span class="block text-transparent bg-clip-text bg-gradient-to-r from-cyan-300 to-white">
Beyond Interface Limits
</span>
</h1>
<p class="text-white/70 text-sm md:text-lg max-w-xl mx-auto">
Experience a new dimension of interaction where motion, depth, and speed converge into a seamless digital flow.
</p>
<p class="text-white/50 text-xs md:text-sm max-w-lg mx-auto">
This is not just animation — it’s a perception shift. Designed for high-impact landing pages, futuristic systems, and immersive product storytelling.
</p>
<div class="pt-4">
<button class="px-6 py-3 bg-white text-black rounded-xl hover:scale-105 transition">
Launch Experience →
</button>
</div>
</div>
</div>
<script>
const canvas = document.getElementById("tunnel");
const ctx = canvas.getContext("2d");
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
let centerX = canvas.width / 2;
let centerY = canvas.height / 2;
let targetX = centerX;
let targetY = centerY;
const stars = [];
// Starfield technique uses canvas + requestAnimationFrame for smooth motion :contentReference[oaicite:0]{index=0}
for (let i = 0; i < 400; i++) {
stars.push({
x: (Math.random() - 0.5) * canvas.width,
y: (Math.random() - 0.5) * canvas.height,
z: Math.random() * canvas.width
});
}
window.addEventListener("mousemove", (e) => {
targetX = e.clientX;
targetY = e.clientY;
});
function animate() {
ctx.fillStyle = "black";
ctx.fillRect(0, 0, canvas.width, canvas.height);
centerX += (targetX - centerX) * 0.05;
centerY += (targetY - centerY) * 0.05;
stars.forEach(star => {
star.z -= 8;
if (star.z <= 0) {
star.z = canvas.width;
}
const k = 128 / star.z;
const x = star.x * k + centerX;
const y = star.y * k + centerY;
const size = (1 - star.z / canvas.width) * 3;
const px = star.x * (128 / (star.z + 8)) + centerX;
const py = star.y * (128 / (star.z + 8)) + centerY;
ctx.strokeStyle = "rgba(255,255,255,0.8)";
ctx.lineWidth = size;
ctx.beginPath();
ctx.moveTo(px, py);
ctx.lineTo(x, y);
ctx.stroke();
});
requestAnimationFrame(animate);
}
animate();
window.addEventListener("resize", () => {
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
});
</script>
</section>