feat: add templates catalog page and interactive live previews
All checks were successful
Production Build & Deploy / build-and-deploy (push) Successful in 27s

This commit is contained in:
DanielS
2026-07-07 00:35:52 +02:00
parent 074affba62
commit 3e7ab96567
2 changed files with 948 additions and 0 deletions

View File

@@ -0,0 +1,521 @@
---
import Layout from '../../layouts/Layout.astro';
import Navbar from '../../components/Navbar.astro';
import Footer from '../../components/Footer.astro';
import { FaArrowLeft, FaCheck, FaPhoneAlt, FaEnvelope } from 'react-icons/fa';
export function getStaticPaths() {
const templates = [
{
id: "01",
name: "Der Handwerker-Klassiker",
style: "Einfach & Bodenständig",
layout: "Boxed Layout",
design: "Brutalismus",
colorScheme: "Warm & Earthy (Sand & Terrakotta)",
bgClass: "bg-[#FDFBF7] text-[#2C1A11]",
borderClass: "border-2 border-[#2C1A11]",
accentText: "text-[#D97706]",
accentBg: "bg-[#D97706] hover:bg-[#B45309] text-white",
cardClass: "bg-white border border-[#2C1A11]/20",
theme: "light",
businessType: "Schreinerei & Innenausbau"
},
{
id: "02",
name: "Dachdecker Meister",
style: "Elegant & Professionell",
layout: "Split-Screen",
design: "Glassmorphismus",
colorScheme: "Deep Dark (Anthrazit & Gold)",
bgClass: "bg-[#0B0F19] text-white",
borderClass: "border border-white/10",
accentText: "text-amber-400",
accentBg: "bg-amber-500 hover:bg-amber-600 text-zinc-950",
cardClass: "bg-slate-900/50 backdrop-blur border border-white/10",
theme: "dark",
businessType: "Dachdeckerei & Spenglerei"
},
{
id: "03",
name: "Solar & Photovoltaik",
style: "Tech & Zukunft",
layout: "Bento-Grid",
design: "SaaS-Minimalismus",
colorScheme: "Tech-Vibrant (Grau & Neon-Orange)",
bgClass: "bg-zinc-950 text-zinc-100",
borderClass: "border border-zinc-800",
accentText: "text-orange-500",
accentBg: "bg-orange-600 hover:bg-orange-700 text-white",
cardClass: "bg-zinc-900 border border-zinc-800",
theme: "dark",
businessType: "Solartechnik & Energiesysteme"
},
{
id: "04",
name: "Die Kanzlei",
style: "Seriös & Clean",
layout: "Asymmetrisch",
design: "Glassmorphismus",
colorScheme: "Deep Dark (Anthrazit & Smaragd-Grün)",
bgClass: "bg-[#0B0F19] text-white",
borderClass: "border border-white/10",
accentText: "text-emerald-400",
accentBg: "bg-emerald-600 hover:bg-emerald-700 text-white",
cardClass: "bg-slate-900/50 backdrop-blur border border-white/10",
theme: "dark",
businessType: "Rechtsanwälte & Notare"
},
{
id: "05",
name: "Bio-Hofladen",
style: "Rustikal & Natur",
layout: "Minimalistisch 1-spaltig",
design: "Neomorphismus",
colorScheme: "Warm & Earthy (Terrakotta)",
bgClass: "bg-[#FAF7F2] text-[#4A3B32]",
borderClass: "border border-[#E8DCC4]",
accentText: "text-[#C2410C]",
accentBg: "bg-[#C2410C] hover:bg-[#A8370A] text-white",
cardClass: "bg-[#FAF7F2] shadow-[4px_4px_10px_rgba(0,0,0,0.05),-4px_-4px_10px_rgba(255,255,255,0.8)] border border-[#FAF7F2]",
theme: "light",
businessType: "Bio-Bauernhof & Hofladen"
},
{
id: "06",
name: "Sanitär & Heizung",
style: "Klar & Zuverlässig",
layout: "Bento-Grid",
design: "SaaS-Minimalismus",
colorScheme: "Clean Light (Weiß & Navy-Blau)",
bgClass: "bg-slate-50 text-slate-900",
borderClass: "border border-slate-200",
accentText: "text-blue-700",
accentBg: "bg-blue-700 hover:bg-blue-800 text-white",
cardClass: "bg-white border border-slate-200 shadow-sm",
theme: "light",
businessType: "Heizung, Sanitär & Klima"
},
{
id: "07",
name: "KFZ-Werkstatt Schnellservice",
style: "Dynamisch & Direkt",
layout: "Split-Screen",
design: "Brutalismus",
colorScheme: "Tech-Vibrant (Grau & Neon-Orange)",
bgClass: "bg-zinc-900 text-white",
borderClass: "border-2 border-zinc-700",
accentText: "text-orange-500",
accentBg: "bg-orange-600 hover:bg-orange-700 text-white",
cardClass: "bg-zinc-800 border border-zinc-700",
theme: "dark",
businessType: "Kfz-Meisterbetrieb"
},
{
id: "08",
name: "Schreinerei Holzart",
style: "Handwerk & Präzision",
layout: "Boxed Layout",
design: "SaaS-Minimalismus",
colorScheme: "Warm & Earthy (Sand-Töne)",
bgClass: "bg-[#F5F2EB] text-[#3D3A36]",
borderClass: "border border-[#D9D2C5]",
accentText: "text-[#8B5A2B]",
accentBg: "bg-[#8B5A2B] hover:bg-[#6F4722] text-white",
cardClass: "bg-white border border-[#EBE6DC] shadow-sm",
theme: "light",
businessType: "Möbel- & Bauschreinerei"
},
{
id: "09",
name: "Steuerberater Premium",
style: "Exklusiv & Diskret",
layout: "Bento-Grid",
design: "Glassmorphismus",
colorScheme: "Deep Dark (Anthrazit & Gold)",
bgClass: "bg-slate-950 text-slate-100",
borderClass: "border border-slate-800",
accentText: "text-amber-400",
accentBg: "bg-amber-500 hover:bg-amber-600 text-zinc-950",
cardClass: "bg-slate-900/40 backdrop-blur border border-white/10",
theme: "dark",
businessType: "Steuerberatungskanzlei"
},
{
id: "10",
name: "Garten- & Landschaftsbau",
style: "Frisch & Modern",
layout: "Asymmetrisch",
design: "Glassmorphismus",
colorScheme: "Clean Light (Weiß & Salbei-Grün)",
bgClass: "bg-emerald-50/30 text-slate-900",
borderClass: "border border-emerald-100",
accentText: "text-emerald-700",
accentBg: "bg-emerald-700 hover:bg-emerald-800 text-white",
cardClass: "bg-white/80 backdrop-blur border border-emerald-100 shadow-sm",
theme: "light",
businessType: "Garten- & Landschaftsbau"
},
{
id: "11",
name: "Modern Dentists Zahnarzt",
style: "Clean & Vertrauensvoll",
layout: "Minimalistisch 1-spaltig",
design: "SaaS-Minimalismus",
colorScheme: "Clean Light (Weiß & Navy-Blau)",
bgClass: "bg-white text-slate-900",
borderClass: "border border-slate-200",
accentText: "text-blue-800",
accentBg: "bg-blue-800 hover:bg-blue-900 text-white",
cardClass: "bg-slate-50 border border-slate-150",
theme: "light",
businessType: "Zahnarztpraxis"
},
{
id: "12",
name: "Bäckerei Traditionsbäcker",
style: "Gemütlich & Lecker",
layout: "Boxed Layout",
design: "Neomorphismus",
colorScheme: "Warm & Earthy (Terrakotta)",
bgClass: "bg-[#FDF9F3] text-[#5C3E21]",
borderClass: "border border-[#EADCC9]",
accentText: "text-[#B45309]",
accentBg: "bg-[#B45309] hover:bg-[#92400E] text-white",
cardClass: "bg-[#FDF9F3] shadow-[4px_4px_10px_rgba(0,0,0,0.04),-4px_-4px_10px_rgba(255,255,255,0.75)] border border-transparent",
theme: "light",
businessType: "Feinbäckerei & Konditorei"
},
{
id: "13",
name: "Elektro-Technik Meister",
style: "Präzise & Leistungsstark",
layout: "Split-Screen",
design: "Brutalismus",
colorScheme: "Tech-Vibrant (Grau & Electric-Purple)",
bgClass: "bg-neutral-950 text-neutral-100",
borderClass: "border border-neutral-800",
accentText: "text-purple-400",
accentBg: "bg-purple-600 hover:bg-purple-700 text-white",
cardClass: "bg-neutral-900 border border-neutral-800",
theme: "dark",
businessType: "Elektrotechnik & Smart Home"
},
{
id: "14",
name: "Fitness- & Kraftstudio",
style: "Stark & Motivierend",
layout: "Asymmetrisch",
design: "Brutalismus",
colorScheme: "Deep Dark (Schwarz & Neon-Orange)",
bgClass: "bg-black text-white",
borderClass: "border-2 border-zinc-800",
accentText: "text-orange-500",
accentBg: "bg-orange-500 hover:bg-orange-600 text-black font-bold",
cardClass: "bg-zinc-950 border border-zinc-800",
theme: "dark",
businessType: "Premium Gym & Fitness"
},
{
id: "15",
name: "Architekturbüro Struktur",
style: "Minimalismus & Ästhetik",
layout: "Split-Screen",
design: "SaaS-Minimalismus",
colorScheme: "Clean Light (Weiß & Navy-Blau)",
bgClass: "bg-white text-zinc-900",
borderClass: "border border-zinc-200",
accentText: "text-zinc-900",
accentBg: "bg-zinc-900 hover:bg-zinc-800 text-white",
cardClass: "bg-zinc-50 border border-zinc-200",
theme: "light",
businessType: "Architektur & Generalplanung"
},
{
id: "16",
name: "Physiotherapie Praxis",
style: "Achtsam & Gesund",
layout: "Minimalistisch 1-spaltig",
design: "Glassmorphismus",
colorScheme: "Clean Light (Weiß & Salbei-Grün)",
bgClass: "bg-[#FAFDFB] text-slate-800",
borderClass: "border border-emerald-100",
accentText: "text-emerald-600",
accentBg: "bg-emerald-600 hover:bg-emerald-700 text-white",
cardClass: "bg-white/80 backdrop-blur border border-emerald-100 shadow-sm",
theme: "light",
businessType: "Physiotherapie & Osteopathie"
},
{
id: "17",
name: "Metallbau & Schlosserei",
style: "Hart & Präzise",
layout: "Boxed Layout",
design: "Brutalismus",
colorScheme: "Deep Dark (Anthrazit & Smaragd-Grün)",
bgClass: "bg-zinc-900 text-zinc-100",
borderClass: "border-2 border-zinc-700",
accentText: "text-emerald-400",
accentBg: "bg-emerald-600 hover:bg-emerald-700 text-white",
cardClass: "bg-zinc-800 border-2 border-zinc-700",
theme: "dark",
businessType: "Schlosserei & Konstruktion"
},
{
id: "18",
name: "Restaurant & Gaststube",
style: "Rustikal & Einladend",
layout: "Bento-Grid",
design: "Neomorphismus",
colorScheme: "Warm & Earthy (Sand-Töne)",
bgClass: "bg-[#FCFAF7] text-[#4E3629]",
borderClass: "border border-[#ECE4D9]",
accentText: "text-[#A75D5D]",
accentBg: "bg-[#A75D5D] hover:bg-[#8B4C4C] text-white",
cardClass: "bg-[#FCFAF7] shadow-[5px_5px_12px_rgba(0,0,0,0.03),-5px_-5px_12px_rgba(255,255,255,0.8)] border border-transparent",
theme: "light",
businessType: "Wirtshaus & Feinkost"
},
{
id: "19",
name: "Software-Entwicklung Byte",
style: "Sauber & Strukturiert",
layout: "Bento-Grid",
design: "SaaS-Minimalismus",
colorScheme: "Tech-Vibrant (Grau & Electric-Purple)",
bgClass: "bg-[#0C0C0F] text-zinc-100",
borderClass: "border border-zinc-800",
accentText: "text-indigo-400",
accentBg: "bg-indigo-600 hover:bg-indigo-700 text-white",
cardClass: "bg-zinc-900 border border-zinc-800",
theme: "dark",
businessType: "Software & Webanwendungen"
},
{
id: "20",
name: "Malerbetrieb Farbenfroh",
style: "Kreativ & Präzise",
layout: "Asymmetrisch",
design: "Glassmorphismus",
colorScheme: "Tech-Vibrant (Grau & Neon-Orange)",
bgClass: "bg-[#161622] text-zinc-100",
borderClass: "border border-white/5",
accentText: "text-orange-400",
accentBg: "bg-orange-500 hover:bg-orange-600 text-white",
cardClass: "bg-slate-900/60 backdrop-blur border border-white/10",
theme: "dark",
businessType: "Maler- & Lackiererbetrieb"
}
];
return templates.map((tpl) => ({
params: { id: tpl.id },
props: { tpl }
}));
}
const { tpl } = Astro.props;
---
<Layout title={`${tpl.name} | Live-Vorschau`}>
<div class="fixed top-0 left-0 w-full bg-[#0b0f19]/90 backdrop-blur border-b border-white/10 py-3 z-50 text-white flex justify-between items-center px-4 sm:px-8">
<div class="flex items-center gap-3">
<a href="/templates" class="flex items-center gap-1 text-xs uppercase tracking-wider text-zinc-400 hover:text-brand-arcticBlue transition-colors font-bold">
<FaArrowLeft class="w-3 h-3" /> Zurück
</a>
<span class="text-zinc-600">|</span>
<div class="text-xs sm:text-sm font-semibold">
Design-Vorschau: <span class="text-brand-arcticBlue">{tpl.name}</span>
</div>
</div>
<div class="flex items-center gap-2">
<span class="text-[10px] uppercase font-mono px-2 py-0.5 bg-white/10 rounded">Stil: {tpl.design}</span>
<span class="text-[10px] uppercase font-mono px-2 py-0.5 bg-brand-arcticBlue/20 text-brand-arcticBlue rounded hidden sm:inline">{tpl.layout}</span>
</div>
</div>
<div class={`min-h-screen pt-16 pb-12 ${tpl.bgClass}`}>
{/* Boxed structure wrapper if selected */}
<div class={tpl.layout === "Boxed Layout" ? "max-w-6xl mx-auto my-8 border-4 border-black/10 dark:border-white/10 rounded-2xl overflow-hidden shadow-2xl" : ""}>
{/* 1. Header (Dynamic) */}
<header class="py-6 px-8 flex justify-between items-center border-b border-current/10">
<div class="font-bold text-xl uppercase tracking-wider">
{tpl.businessType.split(' ')[0]} <span class={tpl.accentText}>MUSTERMANN</span>
</div>
<div class="hidden md:flex gap-6 text-sm font-semibold opacity-85">
<span class="cursor-pointer">Leistungen</span>
<span class="cursor-pointer">Über uns</span>
<span class="cursor-pointer">Referenzen</span>
<span class="cursor-pointer">Kontakt</span>
</div>
</header>
{/* 2. Hero Section (Dynamic Layouts) */}
<main class="px-8 py-16 sm:py-24">
{tpl.layout === "Split-Screen" ? (
<div class="grid grid-cols-1 md:grid-cols-2 gap-12 items-center">
<div>
<span class={`text-xs font-mono font-bold uppercase tracking-widest ${tpl.accentText}`}>Echtes Handwerk seit 1995</span>
<h1 class="text-4xl sm:text-5xl font-extrabold tracking-tight mt-2 mb-6 leading-tight">
Qualität und Zuverlässigkeit für Ihr Projekt.
</h1>
<p class="opacity-80 text-sm sm:text-base mb-8 max-w-md leading-relaxed">
Wir planen und realisieren Ihr Projekt nach Maß. Termingerecht, sauber und absolut professionell vom Meisterbetrieb.
</p>
<button class={`px-6 py-3 rounded text-sm font-bold uppercase tracking-wider transition-colors ${tpl.accentBg}`}>
Jetzt Angebot anfragen
</button>
</div>
<div class={`h-[350px] rounded-2xl flex items-center justify-center p-8 text-center border border-current/10 bg-current/5`}>
<div class="space-y-2">
<div class="text-4xl font-bold">100%</div>
<div class="text-xs uppercase tracking-wider font-semibold opacity-60">Kundenzufriedenheit</div>
</div>
</div>
</div>
) : tpl.layout === "Bento-Grid" ? (
<div>
<div class="text-center max-w-2xl mx-auto mb-16">
<span class={`text-xs font-mono font-bold uppercase tracking-widest ${tpl.accentText}`}>Bento Grid Showcase</span>
<h1 class="text-4xl sm:text-5xl font-extrabold tracking-tight mt-2 mb-6">Moderne Struktur. Voller Fokus.</h1>
</div>
<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
<div class={`md:col-span-2 rounded-2xl p-8 ${tpl.cardClass}`}>
<h2 class="text-2xl font-bold mb-4">Meisterliche Ausführung</h2>
<p class="opacity-80 text-xs sm:text-sm leading-relaxed mb-6">
Wir stehen für Handwerkskunst der Spitzenklasse. Durch modernste Planung und traditionelles Können schaffen wir dauerhafte Werte für Ihr Gebäude.
</p>
<button class={`px-5 py-2.5 rounded text-xs font-bold uppercase tracking-wider ${tpl.accentBg}`}>
Kontakt aufnehmen
</button>
</div>
<div class={`rounded-2xl p-8 flex flex-col justify-between ${tpl.cardClass}`}>
<div class="text-2xl font-mono font-bold">DEUTSCHLAND</div>
<div class="text-xs opacity-75">Regionaler Service direkt vor Ort bei Ihnen.</div>
</div>
<div class={`rounded-2xl p-8 flex flex-col justify-between ${tpl.cardClass}`}>
<div class="text-2xl font-mono font-bold">> 25 JAHRE</div>
<div class="text-xs opacity-75">Erfahrung, auf die Sie bauen können.</div>
</div>
<div class={`md:col-span-2 rounded-2xl p-8 ${tpl.cardClass} flex flex-col sm:flex-row justify-between items-start sm:items-center gap-4`}>
<div>
<h3 class="text-lg font-bold">Direkt & Unverbindlich</h3>
<p class="opacity-70 text-xs">Fragen Sie Ihr Projekt einfach kostenlos an.</p>
</div>
<button class={`px-4 py-2 rounded text-xs font-bold uppercase tracking-wider ${tpl.accentBg} shrink-0`}>
Rückruf anfordern
</button>
</div>
</div>
</div>
) : tpl.layout === "Asymmetrisch" ? (
<div class="grid grid-cols-1 lg:grid-cols-5 gap-12 items-center">
<div class="lg:col-span-3">
<h1 class="text-4xl sm:text-6xl font-extrabold tracking-tight leading-tight mb-6">
Ihr Partner für <span class={tpl.accentText}>{tpl.businessType.split(' ')[0]}</span>.
</h1>
<p class="opacity-80 text-sm sm:text-base leading-relaxed mb-8 max-w-xl">
Wir konzipieren und setzen maßgeschneiderte Lösungen für private und gewerbliche Kunden um. Verlässlich, smart und von Experten ausgeführt.
</p>
<div class="flex flex-wrap gap-4">
<button class={`px-6 py-3 rounded text-sm font-bold uppercase tracking-wider ${tpl.accentBg}`}>
Erstgespräch vereinbaren
</button>
</div>
</div>
<div class="lg:col-span-2 space-y-6">
<div class={`rounded-2xl p-6 ${tpl.cardClass}`}>
<h4 class="font-bold mb-1">01. Beratung</h4>
<p class="opacity-70 text-xs">Persönliche Vorort-Analyse Ihrer Wünsche.</p>
</div>
<div class={`rounded-2xl p-6 translate-x-0 md:translate-x-4 ${tpl.cardClass}`}>
<h4 class="font-bold mb-1">02. Konzept</h4>
<p class="opacity-70 text-xs">Transparente Planung und Angebotserstellung.</p>
</div>
<div class={`rounded-2xl p-6 ${tpl.cardClass}`}>
<h4 class="font-bold mb-1">03. Umsetzung</h4>
<p class="opacity-70 text-xs">Schnelle, saubere Montage & Abnahme.</p>
</div>
</div>
</div>
) : (
/* Minimalistisch 1-spaltig / Default */
<div class="text-center max-w-2xl mx-auto py-8">
<span class={`text-xs font-mono font-bold uppercase tracking-widest ${tpl.accentText}`}>{tpl.businessType}</span>
<h1 class="text-4xl sm:text-6xl font-extrabold tracking-tight mt-4 mb-6 leading-tight">
Einfach. Klar. Auf den Punkt.
</h1>
<p class="opacity-80 text-sm sm:text-base leading-relaxed mb-10 max-w-lg mx-auto">
Keine unnötigen Ablenkungen. Wir liefern genau das, was Ihr Betrieb für den Erfolg braucht. Technisch präzise gearbeitet und pünktlich geliefert.
</p>
<div class="flex gap-4 justify-center">
<button class={`px-6 py-3 rounded text-sm font-bold uppercase tracking-wider ${tpl.accentBg}`}>
Kontakt aufnehmen
</button>
</div>
</div>
)}
</main>
{/* 3. Features Section */}
<section class="border-t border-current/10 py-16 px-8">
<div class="grid grid-cols-1 sm:grid-cols-3 gap-8">
<div class="space-y-2">
<div class={`font-mono font-bold text-lg ${tpl.accentText}`}>[ 01 ] Meisterqualität</div>
<p class="opacity-70 text-xs sm:text-sm">Wir arbeiten ausschließlich mit geprüften Fachkräften und hochwertigen Materialien.</p>
</div>
<div class="space-y-2">
<div class={`font-mono font-bold text-lg ${tpl.accentText}`}>[ 02 ] Feste Termine</div>
<p class="opacity-70 text-xs sm:text-sm">Pünktlichkeit ist unsere Zusage. Wir halten uns an vereinbarte Ausführungszeiten.</p>
</div>
<div class="space-y-2">
<div class={`font-mono font-bold text-lg ${tpl.accentText}`}>[ 03 ] Transparente Preise</div>
<p class="opacity-70 text-xs sm:text-sm">Keine versteckten Gebühren. Jedes Angebot ist detailliert und verbindlich.</p>
</div>
</div>
</section>
{/* 4. Mock Contact Form */}
<section class="border-t border-current/10 py-16 px-8">
<div class="max-w-xl mx-auto text-center mb-8">
<h2 class="text-2xl sm:text-3xl font-bold">Sprechen Sie uns an.</h2>
<p class="opacity-70 text-xs mt-2">Wir melden uns innerhalb eines Werktages persönlich bei Ihnen.</p>
</div>
<form class="max-w-md mx-auto space-y-4" onsubmit="event.preventDefault()">
<div>
<label class="block text-[10px] font-semibold uppercase opacity-60 mb-1">Ihr Name</label>
<input type="text" required class="w-full bg-current/5 border border-current/20 rounded p-2.5 text-xs focus:outline-none focus:border-current" />
</div>
<div>
<label class="block text-[10px] font-semibold uppercase opacity-60 mb-1">E-Mail-Adresse</label>
<input type="email" required class="w-full bg-current/5 border border-current/20 rounded p-2.5 text-xs focus:outline-none focus:border-current" />
</div>
<div>
<label class="block text-[10px] font-semibold uppercase opacity-60 mb-1">Nachricht</label>
<textarea rows="3" required class="w-full bg-current/5 border border-current/20 rounded p-2.5 text-xs focus:outline-none focus:border-current resize-none"></textarea>
</div>
<button type="submit" class={`w-full py-2.5 rounded text-xs font-bold uppercase tracking-wider ${tpl.accentBg}`}>
Senden
</button>
</form>
</section>
{/* 5. Footer */}
<footer class="border-t border-current/10 py-8 px-8 flex flex-col sm:flex-row justify-between items-center gap-4 text-xs opacity-60">
<div>
&copy; {new Date().getFullYear()} {tpl.businessType.split(' ')[0]} Mustermann GbR.
</div>
<div class="flex gap-4">
<span>Datenschutz</span>
<span>Impressum</span>
</div>
</footer>
</div>
</div>
</Layout>