// 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 */}
{copy.hero.ctaPrimary} {copy.hero.ctaGhost}
{/* 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}
)}
{copy.tickets.eyebrow}

{copy.tickets.warning}

{copy.tickets.cta} {copy.tickets.sub}
); } // ----- 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 (
{l}
)}/>
{images.map((img, i) => { const s = sizes[i % sizes.length]; return (
{img.caption}
); })}
{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) => (
{item.a}
))}
); } // ----- 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 });