feat: Implement hero text and model fade-in animations, and update site navigation and footer content.
This commit is contained in:
44
src/App.jsx
44
src/App.jsx
@@ -14,6 +14,7 @@ function App() {
|
|||||||
const lenisRef = useRef()
|
const lenisRef = useRef()
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
// Lenis setup
|
||||||
const lenis = new Lenis({
|
const lenis = new Lenis({
|
||||||
duration: 1.2,
|
duration: 1.2,
|
||||||
easing: (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)),
|
easing: (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)),
|
||||||
@@ -34,8 +35,28 @@ function App() {
|
|||||||
|
|
||||||
requestAnimationFrame(raf)
|
requestAnimationFrame(raf)
|
||||||
|
|
||||||
|
// Hero Text Animation
|
||||||
|
const ctx = gsap.context(() => {
|
||||||
|
const tl = gsap.timeline();
|
||||||
|
tl.from(".hero-title", {
|
||||||
|
y: 100,
|
||||||
|
opacity: 0,
|
||||||
|
duration: 1.5,
|
||||||
|
ease: "power4.out",
|
||||||
|
delay: 0.5
|
||||||
|
})
|
||||||
|
.from(".hero-subtitle", {
|
||||||
|
y: 20,
|
||||||
|
opacity: 0,
|
||||||
|
duration: 1,
|
||||||
|
ease: "power3.out"
|
||||||
|
}, "-=1");
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
lenis.destroy()
|
lenis.destroy()
|
||||||
|
ctx.revert();
|
||||||
}
|
}
|
||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
@@ -64,16 +85,19 @@ function App() {
|
|||||||
mixBlendMode: 'difference', // Ensure text pops against wireframe
|
mixBlendMode: 'difference', // Ensure text pops against wireframe
|
||||||
color: '#fff'
|
color: '#fff'
|
||||||
}}>
|
}}>
|
||||||
<h1 style={{
|
<div style={{ overflow: 'hidden' }}>
|
||||||
fontSize: '8rem',
|
<h1 className="hero-title" style={{
|
||||||
fontWeight: '900',
|
fontSize: '8rem',
|
||||||
lineHeight: '0.8',
|
fontWeight: '900',
|
||||||
letterSpacing: '-0.05em',
|
lineHeight: '0.8',
|
||||||
textTransform: 'uppercase'
|
zIndex: 10,
|
||||||
}}>
|
letterSpacing: '-0.05em',
|
||||||
Matiss <br /> Jurevics
|
textTransform: 'uppercase'
|
||||||
</h1>
|
}}>
|
||||||
<p style={{
|
Matiss <br /> Jurevics
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
<p className="hero-subtitle" style={{
|
||||||
marginTop: '30px',
|
marginTop: '30px',
|
||||||
fontSize: '1.2rem',
|
fontSize: '1.2rem',
|
||||||
fontFamily: 'monospace',
|
fontFamily: 'monospace',
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import * as THREE from 'three';
|
|||||||
|
|
||||||
const Terrain = () => {
|
const Terrain = () => {
|
||||||
const mesh = useRef();
|
const mesh = useRef();
|
||||||
|
const materialRef = useRef();
|
||||||
const noise3D = useMemo(() => createNoise3D(), []);
|
const noise3D = useMemo(() => createNoise3D(), []);
|
||||||
|
|
||||||
// Create geometry with HIGHER segment count for smoother, denser wave like the reference
|
// Create geometry with HIGHER segment count for smoother, denser wave like the reference
|
||||||
@@ -27,16 +28,24 @@ const Terrain = () => {
|
|||||||
// Slight rotation
|
// Slight rotation
|
||||||
mesh.current.rotation.x = -Math.PI / 2.5;
|
mesh.current.rotation.x = -Math.PI / 2.5;
|
||||||
mesh.current.rotation.z += 0.0005;
|
mesh.current.rotation.z += 0.0005;
|
||||||
|
|
||||||
|
// Entrance animation logic (simple lerp for opacity)
|
||||||
|
// We start opacity at 0 in the material and lerp to 0.15
|
||||||
|
// Ideally use a spring or GSAP, but lerp is cheap and easy here
|
||||||
|
if (materialRef.current) {
|
||||||
|
materialRef.current.opacity = THREE.MathUtils.lerp(materialRef.current.opacity, 0.15, 0.02);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<mesh ref={mesh} geometry={geometry}>
|
<mesh ref={mesh} geometry={geometry}>
|
||||||
<meshBasicMaterial
|
<meshBasicMaterial
|
||||||
|
ref={materialRef}
|
||||||
color="#000000"
|
color="#000000"
|
||||||
wireframe={true}
|
wireframe={true}
|
||||||
transparent={true}
|
transparent={true}
|
||||||
opacity={0.15}
|
opacity={0} // Start invisible for animation
|
||||||
/>
|
/>
|
||||||
</mesh>
|
</mesh>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -16,39 +16,26 @@ const Footer = () => {
|
|||||||
gap: '40px'
|
gap: '40px'
|
||||||
}}>
|
}}>
|
||||||
<div>
|
<div>
|
||||||
<h4 className="uppercase" style={{ marginBottom: '20px', color: '#666' }}>Products</h4>
|
<h4 className="uppercase" style={{ marginBottom: '20px', color: '#666' }}>Socials</h4>
|
||||||
<ul style={{ display: 'flex', flexDirection: 'column', gap: '10px' }}>
|
<ul style={{ display: 'flex', flexDirection: 'column', gap: '10px' }}>
|
||||||
<li><a href="#">OP-1 Field</a></li>
|
<li><a href="#">Instagram</a></li>
|
||||||
<li><a href="#">TX-6</a></li>
|
<li><a href="#">Twitter / X</a></li>
|
||||||
<li><a href="#">OP-Z</a></li>
|
<li><a href="#">LinkedIn</a></li>
|
||||||
<li><a href="#">Pocket Operators</a></li>
|
<li><a href="#">GitHub</a></li>
|
||||||
<li><a href="#">OD-11</a></li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<h4 className="uppercase" style={{ marginBottom: '20px', color: '#666' }}>Support</h4>
|
<h4 className="uppercase" style={{ marginBottom: '20px', color: '#666' }}>Contact</h4>
|
||||||
<ul style={{ display: 'flex', flexDirection: 'column', gap: '10px' }}>
|
<ul style={{ display: 'flex', flexDirection: 'column', gap: '10px' }}>
|
||||||
<li><a href="#">Downloads</a></li>
|
<li><a href="mailto:im@mati.ss">im@mati.ss</a></li>
|
||||||
<li><a href="#">Guides</a></li>
|
|
||||||
<li><a href="#">Warranty</a></li>
|
|
||||||
<li><a href="#">Contact</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<h4 className="uppercase" style={{ marginBottom: '20px', color: '#666' }}>Company</h4>
|
|
||||||
<ul style={{ display: 'flex', flexDirection: 'column', gap: '10px' }}>
|
|
||||||
<li><a href="#">About</a></li>
|
|
||||||
<li><a href="#">Press</a></li>
|
|
||||||
<li><a href="#">Careers</a></li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div style={{ minWidth: '300px' }}>
|
<div style={{ minWidth: '300px' }}>
|
||||||
<h4 className="uppercase" style={{ marginBottom: '20px', color: '#ff4d00' }}>Newsletter</h4>
|
<h4 className="uppercase" style={{ marginBottom: '20px', color: '#ff4d00' }}>Stay Updated</h4>
|
||||||
<p style={{ marginBottom: '20px', color: '#888' }}>
|
<p style={{ marginBottom: '20px', color: '#888' }}>
|
||||||
Sign up for the latest news, product releases, and exclusive offers.
|
Occasional updates on new projects and experiments.
|
||||||
</p>
|
</p>
|
||||||
<div style={{ display: 'flex', borderBottom: '1px solid #333' }}>
|
<div style={{ display: 'flex', borderBottom: '1px solid #333' }}>
|
||||||
<input
|
<input
|
||||||
@@ -87,7 +74,7 @@ const Footer = () => {
|
|||||||
alignItems: 'center',
|
alignItems: 'center',
|
||||||
color: '#444'
|
color: '#444'
|
||||||
}}>
|
}}>
|
||||||
<div className="uppercase" style={{ fontSize: '1.2rem', fontWeight: 'bold' }}>Teenage Engineering</div>
|
<div className="uppercase" style={{ fontSize: '1.2rem', fontWeight: 'bold' }}>Matiss Jurevics</div>
|
||||||
<div className="mono" style={{ fontSize: '0.8rem' }}>© 2024</div>
|
<div className="mono" style={{ fontSize: '0.8rem' }}>© 2024</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|||||||
@@ -37,9 +37,6 @@ const Header = () => {
|
|||||||
<a href="#contact">Contact</a>
|
<a href="#contact">Contact</a>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
<div className="cart">
|
|
||||||
Cart (0)
|
|
||||||
</div>
|
|
||||||
</header>
|
</header>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user