// Major page sections
const { useState: useStateS, useEffect: useEffectS, useRef: useRefS } = React;
// ----- Cinematic icons -----
function CinIcon({ name, size = 18 }) {
const c = { width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 1.6, strokeLinecap: "round", strokeLinejoin: "round" };
switch (name) {
case "star": return ;
case "clock": return ;
case "calendar": return ;
case "play": return ;
case "chevL": return ;
case "chevR": return ;
default: return null;
}
}
// ----- HERO (cinematic streaming style) -----
function Hero({ copy, heroVariant }) {
// Local hero video as primary source
const src = "hero_video.MOV";
// German labels for metadata pills (fallback to copy)
const lang = copy.hero.countdownLabels[0] === 'Tage' ? 'de' : 'en';
const metaRating = lang === 'de' ? '5. Edition' : '5th Edition';
const metaDuration = lang === 'de' ? '13 Std · Day & Night' : '13 hrs · Day & Night';
// Stagger helper
const fade = (delay) => ({
className: 'animate-blur-fade-up',
style: { animationDelay: `${delay}ms` },
});
return (
{/* Bottom-only blur overlay */}
{/* Golden summer sun glow from below */}
{/* Metadata row */}
{metaRating}
·
{metaDuration}
·
{copy.hero.date}
{/* Title */}
{copy.hero.title.split('\n').map((l, i) =>
{l}
)}
{/* Claim */}
— {copy.hero.claim}
{/* Description */}
{copy.hero.intro}
{/* CTAs */}
{/* Countdown still beneath, but tightened */}
);
}
// ----- INFO -----
function Info({ copy }) {
return (
{l}
)}/>
{copy.info.lead}
{copy.info.body}
{copy.info.featuresHead}
{copy.info.features.map((f, i) => (
{String(i + 1).padStart(2, '0')}
{f.label}
{f.meta}
))}
);
}
// ----- TICKETS -----
function Tickets({ copy }) {
return (
{copy.tickets.headline.split('\n').map((l, i) => {l}
)}
);
}
// ----- GALLERY -----
function Gallery({ copy }) {
const trackRef = useRefS(null);
const [idx, setIdx] = useStateS(0);
// Real festival photography from Rave im Schloss 2025 by Adrian Camo
const images = [
{ src: "bilder/A7408395_RaveimSchloss_adrian.camo.jpg", caption: "Stage 01 · 2025" },
{ src: "bilder/A7408440_RaveimSchloss_adrian.camo.jpg", caption: "Crowd · Sonnenuntergang" },
{ src: "bilder/A7408615_RaveimSchloss_adrian.camo.jpg", caption: "Dance Floor" },
{ src: "bilder/A7408675_RaveimSchloss_adrian.camo.jpg", caption: "Night · Lights" },
{ src: "bilder/A7408800_RaveimSchloss_adrian.camo.jpg", caption: "Solstice Glow" },
{ src: "bilder/A7408883_RaveimSchloss_adrian.camo.jpg", caption: "Light Show" },
{ src: "bilder/A7409313_RaveimSchloss_adrian.camo.jpg", caption: "Late Night" },
{ src: "bilder/A7409372_RaveimSchloss_adrian.camo.jpg", caption: "Sunrise Closing" },
];
const scroll = (dir) => {
const el = trackRef.current;
if (!el) return;
const card = el.querySelector('.gallery-card');
const w = card ? card.offsetWidth + 16 : 400;
el.scrollBy({ left: dir * w, behavior: 'smooth' });
};
useEffectS(() => {
const el = trackRef.current;
if (!el) return;
const onScroll = () => {
const card = el.querySelector('.gallery-card');
const w = card ? card.offsetWidth + 16 : 400;
setIdx(Math.round(el.scrollLeft / w));
};
el.addEventListener('scroll', onScroll, { passive: true });
return () => el.removeEventListener('scroll', onScroll);
}, []);
// Vary card sizes for visual rhythm
const sizes = [
{ w: 540, h: 380 }, { w: 420, h: 540 }, { w: 640, h: 420 }, { w: 380, h: 540 },
{ w: 520, h: 380 }, { w: 460, h: 540 }, { w: 600, h: 420 }, { w: 480, h: 540 },
];
return (
{images.map((img, i) => {
const s = sizes[i % sizes.length];
return (
);
})}
{String(idx + 1).padStart(2, '0')} / {String(images.length).padStart(2, '0')} · {copy.gallery.counter}
);
}
// ----- TRAVEL -----
function Travel({ copy }) {
return (
{l}
)}/>
{copy.travel.intro}
{copy.travel.cards.map((c, i) => (
{c.title}
{c.bullets.map((b, j) => - {b}
)}
{c.address && {c.address}}
{c.cta && {c.cta}}
))}
);
}
// ----- FAQ -----
function FAQ({ copy }) {
const [open, setOpen] = useStateS(0);
return (
{l}
)}/>
{copy.faq.items.map((item, i) => (
))}
);
}
// ----- IMPRESSUM MODAL -----
function ImpressumModal({ onClose }) {
return (
e.stopPropagation()}>
Impressum
Midsummer Festival
Adresse: Sportplatzweg 23, 6336 Langkampfen, Österreich
Firmenbuchnummer: FN 554118 f
Firmenbuchgericht: Landesgericht Innsbruck
Website: www.midsummerfestival.at
Zuständige Aufsichtsbehörde: Bezirkshauptmannschaft Kufstein
Mitglied der WKO, Sparte Freizeit- und Sportbetriebe
Gewerbeordnung: Veranstaltungsorganisation, Gastronomie
Plattform der EU-Kommission zur Online-Streitbeilegung (OS):
https://ec.europa.eu/odr
Wir sind nicht verpflichtet, an einem Streitbeilegungsverfahren vor einer Verbraucherschlichtungsstelle teilzunehmen.
);
}
// ----- FOOTER -----
function Footer({ copy }) {
const [showImpressum, setShowImpressum] = useStateS(false);
const handleColLink = (e, l) => {
if (l.modal === 'impressum') {
e.preventDefault();
setShowImpressum(true);
}
};
return (
<>
{showImpressum && setShowImpressum(false)}/>}
>
);
}
Object.assign(window, { Hero, Info, Tickets, Gallery, Travel, FAQ, Footer, CinIcon, ImpressumModal });