PraxaLing / app /components /HeroSection.tsx
Reubencf's picture
Deploy PraxaLing: component refactor, bug fixes, unified neo-brutal design, Qwen3.5 everywhere
2992997
Raw
History Blame Contribute Delete
3.65 kB
"use client";
import { useEffect, useRef } from "react";
import { motion } from "framer-motion";
import { ArrowRight } from "lucide-react";
import { WordsPullUp } from "./WordsPullUp";
const VIDEO_URL =
"https://d8j0ntlcm91z4.cloudfront.net/user_34DpnLwtmxkLgtVe8psPn1j2G8i/hf_20260505_151902_782a6426-d5ef-40eb-b482-d807701834c1.mp4";
const EASE = [0.16, 1, 0.3, 1] as const;
export function HeroSection() {
return (
<main className="overflow-hidden bg-black" style={{ color: "#E1E0CC" }}>
<Hero />
</main>
);
}
function Hero() {
const videoRef = useRef<HTMLVideoElement>(null);
useEffect(() => {
const v = videoRef.current;
if (!v) return;
v.muted = true;
const tryPlay = () => v.play().catch(() => {});
tryPlay();
v.addEventListener("canplay", tryPlay);
return () => v.removeEventListener("canplay", tryPlay);
}, []);
return (
<section className="h-screen p-4 md:p-6">
<div className="relative h-full overflow-hidden rounded-2xl bg-black md:rounded-[2rem]">
<video
ref={videoRef}
autoPlay
loop
muted
playsInline
preload="auto"
className="absolute inset-0 h-full w-full object-cover"
src={VIDEO_URL}
/>
<div className="noise-overlay pointer-events-none absolute inset-0 opacity-[0.7] mix-blend-overlay" />
<div className="absolute inset-0 bg-gradient-to-b from-black/30 via-transparent to-black/60" />
<div className="absolute bottom-0 left-0 right-0 z-10 px-4 pb-6 sm:px-6 md:px-10 md:pb-10">
<div className="grid grid-cols-12 items-end gap-5 md:gap-8">
<div className="col-span-12 lg:col-span-8">
<h1 className="font-medium leading-[0.85] tracking-[0] pb-[0.15em]">
<WordsPullUp
text="PraxaLing"
className="text-[3.2rem] sm:text-[5rem] md:text-[6.8rem] lg:text-[8rem] xl:text-[9.25rem] 2xl:text-[10rem]"
suffix="*"
suffixClassName="absolute top-[0.65em] -right-[0.3em] text-[0.31em] leading-none"
/>
</h1>
</div>
<div className="col-span-12 max-w-md pb-2 lg:col-span-4 lg:pb-5">
<motion.p
className="text-xs leading-[1.3] text-white font-medium drop-shadow sm:text-sm md:text-base"
initial={{ y: 20, opacity: 0 }}
animate={{ y: 0, opacity: 1 }}
transition={{ duration: 0.8, delay: 0.5, ease: EASE }}
>
Practicing languages using PraxaLing.
</motion.p>
<motion.a
href="/api/auth/login"
className="group mt-5 inline-flex items-center gap-3 rounded-full bg-white py-2 pl-6 pr-2 text-sm font-bold text-black transition-all duration-300 hover:gap-4 hover:shadow-[0_0_25px_rgba(255,255,255,0.3)] sm:text-base"
initial={{ y: 20, opacity: 0 }}
animate={{ y: 0, opacity: 1 }}
transition={{ duration: 0.8, delay: 0.7, ease: EASE }}
>
<span className="flex items-center gap-2">
<span className="text-lg">🤗</span>
Start with Hugging Face
</span>
<span className="grid h-9 w-9 place-items-center rounded-full bg-black text-white transition-transform group-hover:scale-110 sm:h-10 sm:w-10">
<ArrowRight size={18} />
</span>
</motion.a>
</div>
</div>
</div>
</div>
</section>
);
}