Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 8s
Build & Deploy / 🧪 QA (push) Successful in 1m29s
Build & Deploy / 🏗️ Build (push) Has started running
Build & Deploy / 🚀 Deploy (push) Has been cancelled
Build & Deploy / 🧪 Smoke Test (push) Has been cancelled
Build & Deploy / ⚡ Lighthouse (push) Has been cancelled
Build & Deploy / 🔔 Notify (push) Has been cancelled
- Dynamically imported ToolCoordinator dependencies - Removes ~400KB from global layout (html2canvas, framer-motion) - Implemented IntersectionObserver in VideoSection - Prevents 1.8MB .webm autoPlay blocking initial network - Restored SSR hydration visibility for LCP elements in Hero
60 lines
1.9 KiB
TypeScript
60 lines
1.9 KiB
TypeScript
'use client';
|
|
|
|
import React, { useState, useEffect, useRef } from 'react';
|
|
import Scribble from '@/components/Scribble';
|
|
import { useTranslations } from 'next-intl';
|
|
|
|
export default function VideoSection() {
|
|
const t = useTranslations('Home.video');
|
|
const [isVisible, setIsVisible] = useState(false);
|
|
const sectionRef = useRef<HTMLElement>(null);
|
|
|
|
useEffect(() => {
|
|
const observer = new IntersectionObserver(
|
|
([entry]) => {
|
|
if (entry.isIntersecting) {
|
|
setIsVisible(true);
|
|
observer.disconnect();
|
|
}
|
|
},
|
|
{ rootMargin: '200px' },
|
|
);
|
|
|
|
if (sectionRef.current) {
|
|
observer.observe(sectionRef.current);
|
|
}
|
|
|
|
return () => observer.disconnect();
|
|
}, []);
|
|
|
|
return (
|
|
<section ref={sectionRef} className="relative h-[70vh] overflow-hidden bg-primary">
|
|
{isVisible && (
|
|
<video className="w-full h-full object-cover opacity-60" autoPlay muted loop playsInline>
|
|
<source
|
|
src="/uploads/2024/12/making-of-metal-cable-on-factory-2023-11-27-04-55-16-utc-2.webm"
|
|
type="video/webm"
|
|
/>
|
|
</video>
|
|
)}
|
|
<div className="absolute inset-0 bg-gradient-to-b from-primary/60 via-transparent to-primary/60 flex items-center justify-center pointer-events-none">
|
|
<div className="max-w-5xl px-6 text-center animate-slide-up pointer-events-auto">
|
|
<h2 className="text-3xl md:text-4xl lg:text-5xl font-extrabold text-white leading-[1.1]">
|
|
{t.rich('title', {
|
|
future: (chunks) => (
|
|
<span className="relative inline-block mx-2">
|
|
<span className="relative z-10 italic text-accent">{chunks}</span>
|
|
<Scribble
|
|
variant="underline"
|
|
className="w-full h-4 -bottom-2 left-0 text-accent/40"
|
|
/>
|
|
</span>
|
|
),
|
|
})}
|
|
</h2>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
);
|
|
}
|