Files
kunstenkamp/apps/web/src/components/homepage/Hero.tsx
zias 3a2e403ee9 Update event date to 24 april, add venue, add Ichtus Antwerpen as co-sponsor
- Change event date from 18 to 24 april across all pages, hero, meta and constants
- Add venue (Lange Winkelstraat 5, 2000 Antwerpen) to contact page, Q&A, and transactional emails
- Add LOCATION constant to packages/api/src/constants.ts
- Add Ichtus Antwerpen (ichtusantwerpen.com) as co-sponsor in footer and contact page
- Add location info card to confirmation, update, payment reminder and payment confirmation emails
2026-03-11 18:17:40 +01:00

176 lines
5.9 KiB
TypeScript

import { useEffect, useState } from "react";
export default function Hero() {
const [micVisible, setMicVisible] = useState(false);
useEffect(() => {
// Trigger entrance animation after component mounts
const timer = setTimeout(() => {
setMicVisible(true);
}, 100);
return () => clearTimeout(timer);
}, []);
const scrollToRegistration = () => {
document
.getElementById("registration")
?.scrollIntoView({ behavior: "smooth" });
};
const scrollToInfo = () => {
document.getElementById("info")?.scrollIntoView({ behavior: "smooth" });
};
return (
<section className="relative h-[100dvh] w-full overflow-hidden bg-white">
{/* Desktop Layout - hidden on mobile */}
<div className="relative hidden h-full w-full flex-col gap-[10px] p-[10px] lg:flex">
{/* Desktop Microphone - positioned on top of top sections, under bottom sections */}
<div
className={`pointer-events-none absolute z-20 transition-all duration-1000 ease-out motion-reduce:transition-none ${
micVisible
? "translate-x-0 translate-y-0 opacity-100"
: "translate-x-24 -translate-y-24 opacity-0"
}`}
style={{
right: "5%",
top: "0",
width: "38%",
}}
>
<img
src="/assets/mic.png"
alt="Vintage microfoon - Open Mic Night"
className="h-full w-full object-contain drop-shadow-2xl"
loading="eager"
fetchPriority="high"
/>
</div>
{/* Top row - 2:1 ratio using flex */}
<div className="relative flex h-[65%] min-h-0 flex-shrink-0 gap-[10px]">
{/* Top Left - Magenta with title - under mic */}
<div className="relative z-10 flex min-w-0 flex-[2] flex-col justify-center bg-[#d82560] px-[5%] py-[5%]">
<h1 className="font-['Intro',sans-serif] font-normal text-[clamp(3rem,7vw,6rem)] text-white uppercase leading-[1]">
OPEN MIC
<br />
NIGHT
</h1>
<button
onClick={scrollToInfo}
type="button"
className="link-hover mt-4 cursor-pointer text-left font-['Intro',sans-serif] font-normal text-[clamp(1.25rem,2.5vw,2.625rem)] text-white/70 transition-colors duration-200 hover:text-white"
>
Ongedesemd Woord
</button>
</div>
{/* Top Right - Teal - under mic */}
<div className="relative z-10 min-w-0 flex-1 bg-[#52979b]" />
</div>
{/* Bottom row - equal width */}
<div className="relative z-30 flex min-h-0 flex-1 gap-[10px]">
{/* Bottom Left - Mustard - above mic */}
<div className="relative flex flex-1 items-center bg-[#d09035] px-[3%]">
<p className="font-['Intro',sans-serif] font-normal text-[clamp(1.25rem,2.5vw,2.625rem)] text-white leading-tight">
Een kunstenkamp
<br />
initiatief
</p>
</div>
{/* Bottom Right - Dark Teal with date - above mic */}
<div className="relative flex flex-1 items-center justify-end bg-[#214e51]">
<p className="px-12 text-right font-['Intro',sans-serif] font-normal text-[clamp(2rem,5vw,6rem)] text-white uppercase leading-[1.1]">
VRIJDAG 24
<br />
april
</p>
</div>
</div>
{/* Desktop CTA Button - centered at bottom */}
<div className="absolute bottom-[10px] left-1/2 z-30 -translate-x-1/2 py-12">
<button
onClick={scrollToRegistration}
type="button"
className="bg-black px-[40px] py-[10px] font-['Intro',sans-serif] font-normal text-[30px] text-white transition-all hover:scale-105 hover:bg-gray-900"
>
Registreer je nu!
</button>
</div>
</div>
{/* Mobile Responsive Layout */}
<div className="relative flex h-full w-full flex-col lg:hidden">
{/* Mobile: Single column stacked */}
<div className="flex flex-1 flex-col gap-[10px] overflow-hidden p-[10px]">
{/* Mobile Top - Magenta */}
<div className="relative z-10 flex flex-1 flex-col justify-center overflow-hidden bg-[#d82560] px-6 py-8">
<h1 className="font-['Intro',sans-serif] font-normal text-[15vw] text-white uppercase leading-[0.95]">
OPEN MIC
<br />
NIGHT
</h1>
<p className="mt-4 font-['Intro',sans-serif] font-normal text-[5vw] text-white/90">
Ongedesemd Woord
</p>
{/* Mobile Microphone - positioned inside magenta section, clipped by overflow */}
<div
className={`pointer-events-none absolute z-10 transition-all duration-1000 ease-out motion-reduce:transition-none ${
micVisible
? "translate-x-0 translate-y-0 opacity-100"
: "translate-x-12 -translate-y-12 opacity-0"
}`}
style={{
right: "-30%",
bottom: "-55%",
width: "70%",
height: "130%",
}}
>
<img
src="/assets/mic.png"
alt="Vintage microfoon - Open Mic Night"
className="h-full w-full object-contain object-bottom drop-shadow-2xl"
loading="lazy"
/>
</div>
</div>
{/* Mobile Bottom Row - Mustard + Dark Teal */}
<div className="relative z-20 flex flex-1 gap-[10px]">
<div className="flex flex-1 items-center bg-[#d09035] px-4">
<p className="font-['Intro',sans-serif] font-normal text-[4vw] text-white leading-tight">
Een kunstenkamp
<br />
initiatief
</p>
</div>
<div className="flex flex-1 flex-col items-end justify-center bg-[#214e51] p-4">
<p className="text-right font-['Intro',sans-serif] font-normal text-[8vw] text-white uppercase leading-tight">
VRIJDAG
<br />
24 april
</p>
</div>
</div>
</div>
{/* Mobile CTA */}
<div className="px-[10px] pb-[calc(10px+env(safe-area-inset-bottom))]">
<button
onClick={scrollToRegistration}
type="button"
className="w-full bg-black py-3 font-['Intro',sans-serif] font-normal text-lg text-white transition-all hover:scale-105 hover:bg-gray-900"
>
Registreer je nu!
</button>
</div>
</div>
</section>
);
}