2c6bee9eb1
Master Classes: - Detail popup on card click with description, all dates, location+address - Card shows only first date (or "Скоро" if no dates) - Trainer name clickable to open bio - Text backdrop panel on cards for readability - No photo overlay darkening - Fix crash when MC has no/empty slots - Price "BYN" no longer duplicated - Admin: ImageCropField replaces PhotoPreview (with focal/zoom) - Admin: RichTextarea for description - Admin: photo+fields side-by-side layout, fixed photo width Pricing: - Added rentalSubtitle field for rental tab info
64 lines
3.0 KiB
TypeScript
64 lines
3.0 KiB
TypeScript
import { Hero } from "@/components/sections/Hero";
|
|
import { Team } from "@/components/sections/Team";
|
|
import { About } from "@/components/sections/About";
|
|
import { Classes } from "@/components/sections/Classes";
|
|
import { MasterClasses } from "@/components/sections/MasterClasses";
|
|
import { Schedule } from "@/components/sections/Schedule";
|
|
import { Pricing } from "@/components/sections/Pricing";
|
|
import { News } from "@/components/sections/News";
|
|
import { FAQ } from "@/components/sections/FAQ";
|
|
import { Contact } from "@/components/sections/Contact";
|
|
import { BackToTop } from "@/components/ui/BackToTop";
|
|
import { FloatingContact } from "@/components/ui/FloatingContact";
|
|
import { Header } from "@/components/layout/Header";
|
|
import { Footer } from "@/components/layout/Footer";
|
|
import { ClientShell } from "@/components/layout/ClientShell";
|
|
import { getContent } from "@/lib/content";
|
|
|
|
export const dynamic = "force-dynamic";
|
|
import { OpenDay } from "@/components/sections/OpenDay";
|
|
import { getActiveOpenDay } from "@/lib/openDay";
|
|
import { getAllMcRegistrations } from "@/lib/db";
|
|
|
|
export default function HomePage() {
|
|
const content = getContent();
|
|
const openDayData = getActiveOpenDay();
|
|
// Count MC registrations per title for capacity check
|
|
const allMcRegs = getAllMcRegistrations();
|
|
const mcRegCounts: Record<string, number> = {};
|
|
for (const reg of allMcRegs) mcRegCounts[reg.masterClassTitle] = (mcRegCounts[reg.masterClassTitle] || 0) + 1;
|
|
|
|
return (
|
|
<>
|
|
<ClientShell>
|
|
<Header />
|
|
<main id="main-content">
|
|
{content?.hero && <Hero data={content.hero} />}
|
|
{content?.about && (
|
|
<About
|
|
data={content.about}
|
|
stats={{
|
|
trainers: content.team?.members?.length ?? 0,
|
|
classes: content.classes?.items?.length ?? 0,
|
|
locations: content.schedule?.locations?.length ?? 0,
|
|
}}
|
|
/>
|
|
)}
|
|
{content?.classes && <Classes data={content.classes} />}
|
|
{content?.team && <Team data={content.team} schedule={content.schedule?.locations} scheduleConfig={content.scheduleConfig} />}
|
|
{openDayData && content?.popups && <OpenDay data={openDayData} popups={content.popups} teamMembers={content.team?.members ?? []} locations={content.schedule?.locations} />}
|
|
{content?.schedule && <Schedule data={content.schedule} scheduleConfig={content.scheduleConfig} classItems={content.classes?.items ?? []} teamMembers={content.team?.members ?? []} />}
|
|
{content?.pricing && <Pricing data={content.pricing} />}
|
|
{content?.masterClasses && <MasterClasses data={content.masterClasses} regCounts={mcRegCounts} popups={content.popups} locations={content.schedule?.locations} />}
|
|
{content?.news && <News data={content.news} />}
|
|
{content?.faq && <FAQ data={content.faq} />}
|
|
{content?.contact && <Contact data={content.contact} />}
|
|
<BackToTop />
|
|
<FloatingContact />
|
|
</main>
|
|
<Footer />
|
|
</ClientShell>
|
|
</>
|
|
);
|
|
}
|