Files
johannes-portfolio/src/pages/index.tsx

697 lines
34 KiB
TypeScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { Card } from "@/components/ui/card";
import { Montserrat, Playfair_Display } from "next/font/google";
import { motion, AnimatePresence } from "framer-motion";
import Link from "next/link";
import Image from "next/image";
import React from "react";
import Head from 'next/head';
const playfair = Playfair_Display({
subsets: ["latin"],
display: "swap",
variable: "--font-playfair",
});
const montserrat = Montserrat({
subsets: ["latin"],
variable: "--font-montserrat",
});
const MotionCard = motion(Card);
const focusStyles = `
focus:outline-none focus:ring-2 focus:ring-white focus:ring-offset-2 focus:ring-offset-black
focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white focus-visible:ring-offset-2 focus-visible:ring-offset-black
`;
export default function Home() {
const [isScrolled, setIsScrolled] = React.useState(false);
const [isMenuVisible, setIsMenuVisible] = React.useState(false);
const lastScrollY = React.useRef(0);
React.useEffect(() => {
const updateScroll = () => {
const currentScrollY = window.scrollY;
setIsScrolled(currentScrollY > 100);
if (currentScrollY === 0) {
setIsMenuVisible(false);
return;
}
if (currentScrollY < lastScrollY.current && currentScrollY > 100) {
setIsMenuVisible(true);
}
else if (currentScrollY > lastScrollY.current) {
setIsMenuVisible(false);
}
lastScrollY.current = currentScrollY;
};
window.addEventListener('scroll', updateScroll);
updateScroll();
return () => window.removeEventListener('scroll', updateScroll);
}, []);
const scrollToTop = () => {
window.scrollTo({ top: 0, behavior: 'smooth' });
};
const scrollToSection = (sectionId: string) => {
const element = document.getElementById(sectionId);
if (element) {
element.scrollIntoView({ behavior: 'smooth' });
}
};
return (
<AnimatePresence>
<>
<Head>
<title>Johannes Behrens - International Model</title>
<meta
name="description"
content="Johannes Behrens is an international model based in Hamburg, Germany. Specializing in commercial, fitness, and editorial modeling with a dynamic and charismatic presence."
/>
<meta name="viewport" content="width=device-width, initial-scale=1" />
</Head>
<motion.main
className={`${playfair.variable} ${montserrat.variable} min-h-screen font-sans bg-black`}
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
exit={{ opacity: 0 }}
transition={{ duration: 0.7, ease: [0.32, 0.72, 0, 1] }}
>
<a
href="#main-content"
className={`
sr-only focus:not-sr-only focus:absolute focus:top-4 focus:left-4
bg-white text-black px-4 py-2 z-50 ${focusStyles}
`}
>
Skip to main content
</a>
<header>
<motion.nav
className="fixed top-0 left-0 right-0 z-50 bg-black/90 backdrop-blur-md border-b border-white/10"
initial={{ y: -100 }}
animate={{ y: isMenuVisible ? 0 : -100 }}
transition={{ duration: 0.3, ease: [0.32, 0.72, 0, 1] }}
role="navigation"
aria-label="Main navigation"
>
<div className="container mx-auto px-4 sm:px-6 md:px-8 h-16 flex items-center justify-between">
<motion.button
className="flex items-center h-full"
onClick={scrollToTop}
whileHover={{ scale: 1.02 }}
transition={{ duration: 0.2 }}
aria-label="Back to top"
>
<div className="flex flex-col leading-[0.8]">
<span className="font-playfair text-xl text-white font-black tracking-tight">Johannes</span>
<span className="font-playfair text-xl text-white font-black tracking-tight pl-4">Behrens</span>
</div>
</motion.button>
<div className="flex items-center gap-8" role="menubar">
<motion.button
className={`font-montserrat text-sm text-white/60 hover:text-white transition-colors ${focusStyles}`}
onClick={() => scrollToSection('about')}
whileHover={{ scale: 1.02 }}
transition={{ duration: 0.2 }}
aria-label="Go to about section"
role="menuitem"
tabIndex={0}
>
About
</motion.button>
<motion.button
className="font-montserrat text-sm text-white/60 hover:text-white transition-colors"
onClick={() => scrollToSection('portfolio')}
whileHover={{ scale: 1.02 }}
transition={{ duration: 0.2 }}
aria-label="Go to portfolio section"
role="menuitem"
>
Portfolio
</motion.button>
<motion.button
className="font-montserrat text-sm text-white/60 hover:text-white transition-colors"
onClick={() => scrollToSection('contact')}
whileHover={{ scale: 1.02 }}
transition={{ duration: 0.2 }}
aria-label="Go to contact section"
role="menuitem"
>
Contact
</motion.button>
</div>
</div>
</motion.nav>
</header>
<div id="main-content" tabIndex={-1}>
<section
className="relative h-[100svh] bg-black overflow-hidden"
aria-label="Hero section"
>
<motion.div
className="absolute inset-0 w-full md:w-[80%] left-0 md:left-[-15%]"
initial={{ opacity: 0, scale: 1.1 }}
animate={{ opacity: 1, scale: 1 }}
transition={{ duration: 1.4, ease: [0.32, 0.72, 0, 1], delay: 0.3 }}
aria-hidden="true"
>
<div className="relative w-full h-full md:hidden">
<Image
src="/images/hero-background.jpg"
alt="Johannes Behrens, professional model, standing confidently in a fashion pose"
fill
className="object-cover object-[center_15%]"
priority
quality={85}
sizes="100vw"
loading="eager"
fetchPriority="high"
/>
<motion.div
className="absolute inset-0 bg-gradient-to-b from-black/80 via-black/30 to-black/80"
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ duration: 1, ease: [0.32, 0.72, 0, 1], delay: 0.6 }}
/>
</div>
<div className="relative w-full h-full hidden md:block">
<Image
src="/images/hero-background.jpg"
alt="Johannes Behrens, professional model, standing confidently in a fashion pose"
fill
className="object-cover"
priority
quality={85}
sizes="(max-width: 768px) 100vw, 80vw"
loading="eager"
fetchPriority="high"
/>
<motion.div
className="absolute inset-0 bg-gradient-to-r from-black via-black/20 to-transparent"
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ duration: 1, ease: [0.32, 0.72, 0, 1], delay: 0.6 }}
/>
</div>
</motion.div>
<div className="absolute inset-0 flex items-center md:justify-start">
<div className="w-full md:w-[80%] px-6 sm:px-8 md:pl-[25%] md:pr-0 lg:pl-[50%]">
<div className="relative">
<motion.div
className="relative z-20 text-center md:text-left"
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.7, ease: [0.32, 0.72, 0, 1], delay: 0.7 }}
>
<div className="mix-blend-difference">
<motion.div
className="overflow-hidden mb-4"
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ duration: 0.7, ease: [0.32, 0.72, 0, 1], delay: 0.9 }}
>
<div className="font-montserrat tracking-[0.3em] md:tracking-[0.5em] text-white/90 text-xs sm:text-sm uppercase font-medium">
International Model
</div>
</motion.div>
<motion.h1
className="font-playfair text-[4.5rem] sm:text-[5rem] md:text-[7rem] lg:text-[8rem] font-black text-white leading-[0.8] tracking-tight"
initial={{ opacity: 0, y: 30 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.9, ease: [0.32, 0.72, 0, 1], delay: 1 }}
>
Johannes
</motion.h1>
<span className="font-playfair text-[3.5rem] sm:text-[4rem] md:text-[5rem] lg:text-[6rem] font-black text-white md:leading-[0.7] tracking-tight md:pl-14">
Behrens
</span>
</div>
</motion.div>
<motion.div
className="mt-8 md:mt-12 mix-blend-difference"
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.7, ease: [0.32, 0.72, 0, 1], delay: 1.2 }}
>
<div className="grid grid-cols-3 gap-3 md:gap-4 text-white/80 text-center md:text-left">
<div className="space-y-2">
<h2 className="font-montserrat text-[10px] md:text-xs tracking-[0.2em] uppercase font-semibold">Based in</h2>
<p className="font-montserrat text-lg md:text-xl font-medium">Hamburg</p>
</div>
<div className="space-y-2">
<h2 className="font-montserrat text-[10px] md:text-xs tracking-[0.2em] uppercase font-semibold">Height</h2>
<p className="font-montserrat text-lg md:text-xl font-medium">183 cm</p>
</div>
<div className="space-y-2">
<h2 className="font-montserrat text-[10px] md:text-xs tracking-[0.2em] uppercase font-semibold">Bookings</h2>
<p className="font-montserrat text-lg md:text-xl font-medium">Worldwide</p>
</div>
</div>
</motion.div>
<motion.div
className="mt-8 text-center md:hidden"
initial={{ opacity: 0, y: 15 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.7, ease: [0.32, 0.72, 0, 1], delay: 1.4 }}
>
<p className="font-montserrat text-[10px] tracking-[0.3em] text-white/60 uppercase font-medium">
Commercial Fitness
</p>
</motion.div>
</div>
</div>
</div>
<motion.div
className="fixed bottom-6 md:bottom-8 right-6 md:right-8 z-50"
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ duration: 0.7, ease: [0.32, 0.72, 0, 1], delay: 1.6 }}
>
<motion.button
onClick={scrollToTop}
className={`group relative flex items-center gap-2 h-10 ${focusStyles}`}
whileHover={{ scale: 1.05 }}
transition={{ duration: 0.3, ease: [0.32, 0.72, 0, 1] }}
aria-label="Scroll to top"
tabIndex={0}
>
<motion.div
className="absolute right-0 bg-black/50 backdrop-blur-md rounded-full"
initial={{ opacity: 0, scale: 0.8 }}
animate={{
opacity: isScrolled ? 1 : 0,
scale: isScrolled ? 1 : 0.8,
width: isScrolled ? 40 : 120,
}}
transition={{ duration: 0.3, ease: [0.32, 0.72, 0, 1] }}
style={{
height: 40,
}}
/>
<motion.div
className="flex items-center gap-2 px-3"
animate={{
opacity: isScrolled ? 0 : 1,
pointerEvents: isScrolled ? "none" : "auto",
}}
transition={{ duration: 0.2, ease: [0.32, 0.72, 0, 1] }}
>
<div className="font-montserrat tracking-[0.3em] text-white/60 text-[10px] uppercase font-medium mix-blend-difference">
Scroll
</div>
<div className="w-[40px] md:w-[50px] h-px bg-white/60 origin-right mix-blend-difference" />
</motion.div>
<motion.div
className="absolute right-0 flex items-center justify-center w-10 h-10"
initial={{ opacity: 0 }}
animate={{
opacity: isScrolled ? 1 : 0,
pointerEvents: isScrolled ? "auto" : "none",
}}
transition={{ duration: 0.2, ease: [0.32, 0.72, 0, 1] }}
>
<svg
width="14"
height="14"
viewBox="0 0 14 14"
fill="none"
xmlns="http://www.w3.org/2000/svg"
className="text-white/60"
>
<path
d="M7 1L7 13M7 1L13 7M7 1L1 7"
stroke="currentColor"
strokeWidth="1.5"
strokeLinecap="round"
strokeLinejoin="round"
/>
</svg>
</motion.div>
</motion.button>
</motion.div>
</section>
<section id="about" className="py-16 sm:py-20 md:py-24 lg:py-32 bg-black border-t border-white/10">
<div className="container mx-auto px-4 sm:px-6 md:px-8">
<div className="grid grid-cols-1 md:grid-cols-2 gap-12 md:gap-16 lg:gap-24 max-w-7xl mx-auto">
<motion.div
initial={{ opacity: 0, y: 30 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, margin: "-10%" }}
transition={{ duration: 0.9, ease: [0.32, 0.72, 0, 1] }}
className="space-y-8"
>
<div>
<motion.div
className="font-montserrat tracking-[0.3em] text-white/60 text-xs uppercase mb-4 sm:mb-6 font-semibold"
initial={{ opacity: 0 }}
whileInView={{ opacity: 1 }}
viewport={{ once: true }}
>
About
</motion.div>
<motion.p
className="font-montserrat text-white/80 text-base sm:text-lg leading-relaxed font-medium"
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.9, ease: [0.32, 0.72, 0, 1], delay: 0.2 }}
>
With a versatile athletic background and a strong stage presence as a drummer, I bring dynamic and charismatic energy to every project. Reliable, adaptable, and passionate about delivering outstanding results.
</motion.p>
</div>
</motion.div>
<motion.div
initial={{ opacity: 0, y: 30 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, margin: "-10%" }}
transition={{ duration: 0.9, ease: [0.32, 0.72, 0, 1] }}
className="space-y-10 sm:space-y-12"
>
<div>
<motion.div
className="font-montserrat tracking-[0.3em] text-white/60 text-xs uppercase mb-6 font-semibold"
initial={{ opacity: 0 }}
whileInView={{ opacity: 1 }}
viewport={{ once: true }}
>
Measurements
</motion.div>
<div className="grid grid-cols-2 sm:grid-cols-3 gap-x-6 sm:gap-x-8 gap-y-6">
<div>
<h2 className="font-montserrat text-white/60 uppercase tracking-[0.2em] text-[10px] sm:text-xs mb-2 font-semibold">Height</h2>
<p className="font-montserrat text-lg sm:text-xl text-white font-medium">183 cm</p>
</div>
<div>
<h2 className="font-montserrat text-white/60 uppercase tracking-[0.2em] text-[10px] sm:text-xs mb-2 font-semibold">Chest</h2>
<p className="font-montserrat text-lg sm:text-xl text-white font-medium">95 cm</p>
</div>
<div>
<h2 className="font-montserrat text-white/60 uppercase tracking-[0.2em] text-[10px] sm:text-xs mb-2 font-semibold">Waist</h2>
<p className="font-montserrat text-lg sm:text-xl text-white font-medium">73 cm</p>
</div>
<div>
<h2 className="font-montserrat text-white/60 uppercase tracking-[0.2em] text-[10px] sm:text-xs mb-2 font-semibold">Hip</h2>
<p className="font-montserrat text-lg sm:text-xl text-white font-medium">88 cm</p>
</div>
<div>
<h2 className="font-montserrat text-white/60 uppercase tracking-[0.2em] text-[10px] sm:text-xs mb-2 font-semibold">Suit Size</h2>
<p className="font-montserrat text-lg sm:text-xl text-white font-medium">48</p>
</div>
<div>
<h2 className="font-montserrat text-white/60 uppercase tracking-[0.2em] text-[10px] sm:text-xs mb-2 font-semibold">Shoe Size</h2>
<p className="font-montserrat text-lg sm:text-xl text-white font-medium">45</p>
</div>
</div>
</div>
<div>
<h3 className="font-montserrat text-white/60 uppercase tracking-[0.2em] text-[10px] sm:text-xs mb-3 font-semibold">Features</h3>
<div className="grid grid-cols-2 gap-x-8 gap-y-2">
<p className="font-montserrat text-white/80 text-sm sm:text-base font-medium">Brown Eyes</p>
<p className="font-montserrat text-white/80 text-sm sm:text-base font-medium">Brown Hair</p>
</div>
</div>
</motion.div>
</div>
</div>
</section>
<section className="relative py-16 sm:py-20 md:py-24 lg:py-32 bg-white">
<div className="absolute inset-0" style={{
backgroundImage: `linear-gradient(to right, rgba(0, 0, 0, 0.03) 1px, transparent 1px), linear-gradient(to bottom, rgba(0, 0, 0, 0.03) 1px, transparent 1px)`,
backgroundSize: '48px 48px'
}} />
<div className="container mx-auto px-4 sm:px-6 md:px-8 relative">
<motion.div
className="max-w-screen-lg mx-auto mb-16 sm:mb-20 md:mb-24 lg:mb-32 text-center space-y-4 sm:space-y-6"
>
<motion.div
className="font-montserrat tracking-[0.3em] sm:tracking-[0.5em] text-black/70 text-xs sm:text-sm uppercase font-medium"
>
Categories
</motion.div>
<motion.h2
className="font-playfair text-2xl sm:text-3xl md:text-4xl lg:text-5xl text-black font-bold"
>
Modeling Services
</motion.h2>
</motion.div>
<div className="grid grid-cols-1 md:grid-cols-3 gap-8 md:gap-12 max-w-5xl mx-auto">
<motion.div
className="text-center space-y-4"
>
<div className="w-16 h-16 mx-auto mb-6">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" className="w-full h-full text-black/70">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth="1.5" d="M3 3h18v18H3zM9 3v18M15 3v18M3 9h18M3 15h18" />
</svg>
</div>
<h3 className="font-montserrat text-black uppercase tracking-[0.2em] text-base font-semibold">Commercial</h3>
<p className="font-montserrat text-black/70 text-sm leading-relaxed max-w-xs mx-auto font-medium">
Product campaigns, lifestyle shoots, and brand representation with a focus on authentic engagement and natural presence.
</p>
</motion.div>
<motion.div
className="text-center space-y-4"
>
<div className="w-16 h-16 mx-auto mb-6">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" className="w-full h-full text-black/70">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth="1.5" d="M6.5 6.5h11v11h-11z" />
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth="1.5" d="M3 9V6.5h3.5M21 9V6.5h-3.5M3 15v2.5h3.5M21 15v2.5h-3.5" />
</svg>
</div>
<h3 className="font-montserrat text-black uppercase tracking-[0.2em] text-base font-semibold">Fitness</h3>
<p className="font-montserrat text-black/70 text-sm leading-relaxed max-w-xs mx-auto font-medium">
Athletic wear, sports campaigns, and dynamic movement shoots showcasing strength and functional fitness.
</p>
</motion.div>
<motion.div
className="text-center space-y-4"
>
<div className="w-16 h-16 mx-auto mb-6">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" className="w-full h-full text-black/70">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth="1.5" d="M4 21V3h16v18M8 3v18M16 3v18" />
</svg>
</div>
<h3 className="font-montserrat text-black uppercase tracking-[0.2em] text-base font-semibold">Editorial</h3>
<p className="font-montserrat text-black/70 text-sm leading-relaxed max-w-xs mx-auto font-medium">
Fashion editorials, magazine features, and artistic collaborations with a focus on storytelling and style.
</p>
</motion.div>
</div>
</div>
</section>
<section id="portfolio" className="relative py-16 sm:py-20 md:py-24 lg:py-32 bg-white">
<div className="absolute inset-0" style={{
backgroundImage: `linear-gradient(to right, rgba(0, 0, 0, 0.03) 1px, transparent 1px), linear-gradient(to bottom, rgba(0, 0, 0, 0.03) 1px, transparent 1px)`,
backgroundSize: '48px 48px'
}} />
<div className="container mx-auto px-4 sm:px-6 md:px-8 relative">
<motion.div
className="max-w-screen-lg mx-auto mb-16 sm:mb-20 md:mb-24 lg:mb-32 text-center space-y-4 sm:space-y-6"
>
<motion.div
className="font-montserrat tracking-[0.3em] sm:tracking-[0.5em] text-black/70 text-xs sm:text-sm uppercase font-medium"
>
Portfolio
</motion.div>
<motion.h2
className="font-playfair text-2xl sm:text-3xl md:text-4xl lg:text-5xl text-black font-bold"
>
Selected Work
</motion.h2>
</motion.div>
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4 sm:gap-6 md:gap-8 lg:gap-12">
{[1, 2, 3, 4, 5, 6].map((index) => (
<MotionCard
key={index}
className="overflow-hidden group border-0 bg-transparent relative"
initial={{ opacity: 0, y: 30 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, margin: "-100px" }}
transition={{ duration: 0.9, ease: [0.32, 0.72, 0, 1], delay: index * 0.05 }}
>
<motion.div
className="relative w-full aspect-[3/4] overflow-hidden"
whileHover={{ scale: 1.02 }}
transition={{ duration: 0.4, ease: [0.32, 0.72, 0, 1] }}
>
<Image
src={`/images/portfolio-${index}.jpg`}
alt={`Portfolio image ${index} - Professional modeling work by Johannes Behrens`}
fill
className="object-cover grayscale group-hover:grayscale-0 transition-all duration-200"
sizes="(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw"
quality={85}
priority={index <= 2}
loading={index <= 2 ? "eager" : "lazy"}
/>
<motion.div
className="absolute inset-0 bg-gradient-to-b from-black/0 to-black/20 opacity-0 group-hover:opacity-100 transition-opacity duration-200"
/>
</motion.div>
</MotionCard>
))}
</div>
</div>
</section>
<section id="contact" className="py-16 sm:py-20 md:py-24 lg:py-32 bg-black">
<div className="container mx-auto px-4 sm:px-6 md:px-8">
<motion.div
className="max-w-screen-lg mx-auto"
initial={{ opacity: 0, y: 30 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.9, ease: [0.32, 0.72, 0, 1] }}
>
<div className="text-center mb-12 sm:mb-16 md:mb-20 lg:mb-24">
<motion.div
className="font-montserrat tracking-[0.3em] sm:tracking-[0.4em] md:tracking-[0.5em] text-white/60 text-xs sm:text-sm uppercase mb-4 font-semibold"
initial={{ opacity: 0 }}
whileInView={{ opacity: 1 }}
viewport={{ once: true }}
>
Contact
</motion.div>
</div>
<motion.div
className="grid grid-cols-1 md:grid-cols-2 gap-12 sm:gap-16 md:gap-24 max-w-5xl mx-auto text-center"
initial={{ opacity: 0, y: 30 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.9, ease: [0.32, 0.72, 0, 1], delay: 0.2 }}
>
<div className="space-y-12">
<motion.div
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.9, ease: [0.32, 0.72, 0, 1] }}
>
<h3 className="font-montserrat text-white/60 uppercase tracking-[0.2em] text-[10px] sm:text-xs mb-2 font-semibold">Email</h3>
<motion.p
className="font-montserrat text-lg sm:text-xl md:text-2xl lg:text-3xl break-words font-medium"
whileHover={{ opacity: 0.8 }}
transition={{ duration: 0.4, ease: [0.32, 0.72, 0, 1] }}
>
<Link
href="mailto:contact@johannesbehrens.com"
className={`hover:opacity-80 transition-opacity ${focusStyles}`}
tabIndex={0}
>
contact@johannesbehrens.com
</Link>
</motion.p>
</motion.div>
<motion.div
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.9, ease: [0.32, 0.72, 0, 1], delay: 0.1 }}
>
<h3 className="font-montserrat text-white/60 uppercase tracking-[0.2em] text-[10px] sm:text-xs mb-2 font-semibold">Based in</h3>
<p className="font-montserrat text-lg sm:text-xl md:text-2xl lg:text-3xl font-medium">Hamburg, Germany</p>
</motion.div>
</div>
<div className="space-y-12">
<motion.div
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.9, ease: [0.32, 0.72, 0, 1], delay: 0.2 }}
>
<h3 className="font-montserrat text-white/60 uppercase tracking-[0.2em] text-[10px] sm:text-xs mb-2 font-semibold">Agency</h3>
<p className="font-montserrat text-lg sm:text-xl md:text-2xl lg:text-3xl font-medium">Model Management</p>
</motion.div>
<motion.div
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.9, ease: [0.32, 0.72, 0, 1], delay: 0.3 }}
>
<h3 className="font-montserrat text-white/60 uppercase tracking-[0.2em] text-[10px] sm:text-xs mb-2 font-semibold">Social</h3>
<div className="space-y-3">
<motion.p
className="font-montserrat text-lg sm:text-xl md:text-2xl lg:text-3xl font-medium"
whileHover={{ opacity: 0.8 }}
transition={{ duration: 0.4, ease: [0.32, 0.72, 0, 1] }}
>
<Link
href="https://www.instagram.com/johannes.brh/"
target="_blank"
rel="noopener noreferrer"
className={`hover:opacity-80 transition-opacity duration-200 ${focusStyles}`}
tabIndex={0}
>
Instagram
</Link>
</motion.p>
<motion.p
className="font-montserrat text-lg sm:text-xl md:text-2xl lg:text-3xl font-medium"
whileHover={{ opacity: 0.8 }}
transition={{ duration: 0.4, ease: [0.32, 0.72, 0, 1] }}
>
<Link href="#" className="hover:opacity-80 transition-opacity duration-200">
LinkedIn
</Link>
</motion.p>
</div>
</motion.div>
</div>
</motion.div>
</motion.div>
</div>
</section>
</div>
<footer
className="py-8 bg-black border-t border-white/10"
role="contentinfo"
>
<div className="container mx-auto px-4 text-center">
<p className="font-montserrat text-sm text-white/90">
Made with by{" "}
<Link
href="https://jleibl.net"
target="_blank"
rel="noopener noreferrer"
className={`text-white hover:text-white/80 transition-colors duration-200 ${focusStyles}`}
aria-label="Visit Jan-Marlon Leibl's website (opens in new tab)"
>
Jan-Marlon Leibl
</Link>
</p>
</div>
</footer>
</motion.main>
</>
</AnimatePresence>
);
}