feat: Implement initial website structure with core pages, layout, and reusable UI components, alongside ESLint configuration and SEO setup.

This commit is contained in:
1elle1
2026-01-30 14:45:52 +01:00
parent f0e917ef5d
commit f1cb4ef2cc
20 changed files with 6800 additions and 19 deletions
+222
View File
@@ -0,0 +1,222 @@
import { Container } from "@/components/ui/Container";
import { Button } from "@/components/ui/Button";
import { SectionHeading } from "@/components/ui/SectionHeading";
import { Card } from "@/components/ui/Card";
import { FadeIn } from "@/components/ui/FadeIn";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Studio",
description:
"Entdecken Sie unsere modernen Räumlichkeiten und hochwertigen Fitnessgeräte bei Sportbox Reutte.",
openGraph: {
title: "Studio | Sportbox Reutte",
description:
"Moderne Räumlichkeiten und hochwertige Fitnessgeräte bei Sportbox Reutte in Reutte, Tirol.",
url: "https://sportbox-reutte.at/studio",
},
};
const AREAS = [
{
title: "Kraftbereich",
description:
"Freie Gewichte, Kabelzüge und Kraftgeräte der neuesten Generation für effektives Krafttraining.",
},
{
title: "Cardio-Zone",
description:
"Laufbänder, Ergometer und Rudergeräte für Ihr Ausdauertraining in angenehmer Atmosphäre.",
},
{
title: "Functional Area",
description:
"Offener Trainingsbereich mit Rig, Kettlebells, Medizinbällen und TRX für funktionelles Training.",
},
{
title: "Kursraum",
description:
"Großer, heller Kursraum für Yoga, Pilates, HIIT und weitere Gruppenkurse.",
},
{
title: "Umkleiden & Duschen",
description:
"Moderne Umkleidebereiche mit Schließfächern, Duschen und allem, was Sie brauchen.",
},
{
title: "Lounge",
description:
"Gemütlicher Aufenthaltsbereich zum Ankommen, Austauschen und Entspannen nach dem Training.",
},
] as const;
const GALLERY_ITEMS = [
"Trainingsbereich",
"Cardio-Zone",
"Kursraum",
"Eingangsbereich",
"Functional Area",
"Lounge",
] as const;
export default function StudioPage() {
return (
<main>
{/* Hero */}
<section className="pt-32 pb-[var(--spacing-section)] md:pt-40 md:pb-[var(--spacing-4xl)] bg-primary text-secondary">
<Container>
<FadeIn>
<p className="text-sm uppercase tracking-[0.2em] text-secondary/60 mb-4">
Unser Studio
</p>
</FadeIn>
<FadeIn delay={0.1}>
<h1
className="font-bold max-w-2xl"
style={{
fontSize: "clamp(var(--text-3xl), 4vw, var(--text-5xl))",
lineHeight: "1.1",
letterSpacing: "var(--text-5xl-letter-spacing)",
}}
>
Ihr Trainingsraum in Reutte.
</h1>
</FadeIn>
<FadeIn delay={0.2}>
<p className="mt-6 max-w-xl text-secondary/70" style={{ fontSize: "var(--text-lg)" }}>
Moderne Geräte, durchdachte Räumlichkeiten und eine Atmosphäre,
die zum Training motiviert.
</p>
</FadeIn>
</Container>
</section>
{/* Studio Overview */}
<section className="py-[var(--spacing-section)] md:py-[var(--spacing-4xl)]">
<Container>
<div className="grid grid-cols-1 lg:grid-cols-2 gap-12 items-center">
<FadeIn>
<div>
<p className="text-sm uppercase tracking-[0.2em] text-muted mb-4">
Räumlichkeiten
</p>
<h2
className="font-bold mb-6"
style={{
fontSize: "var(--text-3xl)",
lineHeight: "var(--text-3xl-line-height)",
letterSpacing: "var(--text-3xl-letter-spacing)",
}}
>
Trainieren mit Blick auf das Wesentliche.
</h2>
<p className="text-muted leading-relaxed mb-4">
Unser Studio verbindet Funktionalität mit Atmosphäre. Auf
großzügiger Fläche finden Sie alles, was Sie für ein
effektives Training brauchen ohne Ablenkung, aber mit Stil.
</p>
<p className="text-muted leading-relaxed">
Hochwertige Geräte namhafter Hersteller, durchdachte
Trainingszonen und eine klare Raumaufteilung sorgen dafür,
dass Sie sich auf das konzentrieren können, was zählt: Ihr
Training.
</p>
</div>
</FadeIn>
<FadeIn delay={0.15}>
<div
className="aspect-[4/3] bg-neutral flex items-center justify-center"
style={{ borderRadius: "var(--radius-md)" }}
>
<p className="text-muted text-sm">PLACEHOLDER: Studio-Übersicht</p>
</div>
</FadeIn>
</div>
</Container>
</section>
{/* Areas */}
<section className="py-[var(--spacing-section)] md:py-[var(--spacing-4xl)] bg-neutral">
<Container>
<FadeIn>
<SectionHeading
title="Unsere Bereiche"
subtitle="Jeder Bereich ist darauf ausgelegt, Ihnen das bestmögliche Trainingserlebnis zu bieten."
/>
</FadeIn>
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6">
{AREAS.map((area, index) => (
<FadeIn key={area.title} delay={index * 0.08}>
<Card className="h-full bg-background">
<h3 className="text-base font-bold mb-2">{area.title}</h3>
<p className="text-sm text-muted">{area.description}</p>
</Card>
</FadeIn>
))}
</div>
</Container>
</section>
{/* Gallery */}
<section className="py-[var(--spacing-section)] md:py-[var(--spacing-4xl)]">
<Container>
<FadeIn>
<SectionHeading
title="Einblicke"
subtitle="Werfen Sie einen Blick in unsere Räumlichkeiten."
/>
</FadeIn>
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
{GALLERY_ITEMS.map((item, index) => (
<FadeIn key={item} delay={index * 0.05}>
<div
className="aspect-[4/3] bg-neutral flex items-center justify-center"
style={{ borderRadius: "var(--radius-md)" }}
>
<p className="text-muted text-sm">PLACEHOLDER: {item}</p>
</div>
</FadeIn>
))}
</div>
</Container>
</section>
{/* CTA */}
<section className="py-[var(--spacing-section)] md:py-[var(--spacing-4xl)] bg-primary text-secondary">
<Container className="text-center">
<FadeIn>
<h2
className="font-bold mb-4"
style={{
fontSize: "var(--text-3xl)",
lineHeight: "var(--text-3xl-line-height)",
}}
>
Überzeugen Sie sich selbst.
</h2>
<p className="text-secondary/70 mb-8 max-w-lg mx-auto">
Vereinbaren Sie einen Termin für ein unverbindliches Probetraining
in unserem Studio.
</p>
<div className="flex flex-col sm:flex-row justify-center gap-4">
<Button
href="/leistungen#kontakt"
variant="secondary"
className="border-secondary text-secondary hover:bg-secondary hover:text-primary"
>
Jetzt Termin buchen
</Button>
<Button
href="/leistungen"
variant="ghost"
className="text-secondary/80 hover:text-secondary"
>
Unsere Leistungen
</Button>
</div>
</FadeIn>
</Container>
</section>
</main>
);
}