Compare commits

...

4 Commits

Author SHA1 Message Date
DanielS
11e836fc30 feat: add template marquee and fix gdpr google fonts request
All checks were successful
Production Build & Deploy / build-and-deploy (push) Successful in 28s
2026-07-18 04:37:41 +02:00
DanielS
ad2f7c32a1 feat: add industry filtering logic with transitions to templates showcase 2026-07-18 04:22:56 +02:00
DanielS
16284b6f03 fix: implement keyboard accessible FAQ accordions with aria attributes and adjust border thickness to border-[0.5px] 2026-07-18 04:17:09 +02:00
DanielS
03c37e592a docs: formalize comprehensive technical, legal, and UX standards in agents guidelines 2026-07-18 04:16:26 +02:00
8 changed files with 415 additions and 151 deletions

View File

@@ -19,3 +19,30 @@
- **Don't Open Internal Links in New Tabs:** Let users control their own browsing journey instead of hijacking their back button. - **Don't Open Internal Links in New Tabs:** Let users control their own browsing journey instead of hijacking their back button.
- **Don't Use Text Gradients:** Avoid using gradient colors on text elements to maintain maximum readability, high contrast, and a clean, non-AI-generated look. - **Don't Use Text Gradients:** Avoid using gradient colors on text elements to maintain maximum readability, high contrast, and a clean, non-AI-generated look.
- **Don't Violate Familiarity (Jakob's Law):** Adhere to common design patterns (e.g. logo top-left redirects home) so users do not have to relearn basic navigation. - **Don't Violate Familiarity (Jakob's Law):** Adhere to common design patterns (e.g. logo top-left redirects home) so users do not have to relearn basic navigation.
# Technische & Rechtliche Standards
## 1. Technische Barrierefreiheit (A11y)
- **Touch-Targets:** Mindestens 44x44 CSS-Pixel für interaktive Elemente.
- **Kontraste:** Text-Kontrast mind. 4,5:1. Bei Liquid Glass `backdrop-blur-xl` und deckende Hintergrund-Opacities sicherstellen.
- **Tastatur-Navigation:** Sinnvolle `:focus-visible` Ringe für die Tab-Navigation nutzen.
- **Screenreader:** Explizite `<label>`-Tags für Inputs. Akkordeons mit `aria-expanded` und `aria-controls`. Dekorative Icons mit `aria-hidden="true"`.
## 2. Rechtliche Sicherheit (100% DSGVO-Konformität)
- **Zero-Third-Party-Requests:** Keine externen CDNs (Fonts, Skripte, Icons lokal ausliefern).
- **Keine Cookies/Opt-Ins:** Ausschließlich funktionale Daten (wie Darkmode im LocalStorage) verwenden.
- **Formularverarbeitung:** DSGVO-konforme Übermittlung ohne ungefragte US-Drittdienste.
## 3. Design & Ästhetik ("Liquid Glass" & Clean Look)
- **Lesbarkeit:** Aurora-Glows dezent halten (z-0, Opacity max. 10-20%) und Text lesbar halten.
- **Kanten-Effekt:** Hauchdünne Borders (`border-[0.5px]` oder `border`) mit semi-transparenten Farben für edle Lichtkanten.
- **Theme-Transition:** Weiche Farbübergänge (`transition-colors duration-300`) auf großen Flächen zur Vermeidung harter Blitze.
## 4. Performance & Astro Hybrid-Architektur
- **Kein FOUC:** Darkmode-Erkennungsskripte blockierend im `<head>` als `is:inline` laden.
- **Image-Optimierung:** Astros `<Image/>` Komponente mit WebP/AVIF und festen Dimensionen verwenden, um CLS zu verhindern.
- **Teilhydrierung:** Clientseitiges JS minimieren. Animationen über CSS-Keyframes und nativen IntersectionObserver steuern.
## 5. Conversion & Psychologie (KMU Zielgruppe)
- **Verständlichkeit:** Kundensprache statt Tech-Sprech.
- **Sorgenfrei-Versprechen:** FAQ zu Änderungen, kostenlosem Domain-Umzug und Festpreisgarantie direkt positionieren.

20
package-lock.json generated
View File

@@ -10,6 +10,8 @@
"dependencies": { "dependencies": {
"@astrojs/react": "^3.6.3", "@astrojs/react": "^3.6.3",
"@astrojs/tailwind": "^5.1.4", "@astrojs/tailwind": "^5.1.4",
"@fontsource/inter": "^5.2.8",
"@fontsource/space-grotesk": "^5.2.10",
"@types/react": "^19.2.17", "@types/react": "^19.2.17",
"@types/react-dom": "^19.2.3", "@types/react-dom": "^19.2.3",
"astro": "^4.16.0", "astro": "^4.16.0",
@@ -575,6 +577,24 @@
"node": ">=12" "node": ">=12"
} }
}, },
"node_modules/@fontsource/inter": {
"version": "5.2.8",
"resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-5.2.8.tgz",
"integrity": "sha512-P6r5WnJoKiNVV+zvW2xM13gNdFhAEpQ9dQJHt3naLvfg+LkF2ldgSLiF4T41lf1SQCM9QmkqPTn4TH568IRagg==",
"license": "OFL-1.1",
"funding": {
"url": "https://github.com/sponsors/ayuhito"
}
},
"node_modules/@fontsource/space-grotesk": {
"version": "5.2.10",
"resolved": "https://registry.npmjs.org/@fontsource/space-grotesk/-/space-grotesk-5.2.10.tgz",
"integrity": "sha512-XNXEbT74OIITPqw2H6HXwPDp85fy43uxfBwFR5PU+9sLnjuLj12KlhVM9nZVN6q6dlKjkuN8JisW/OBxwxgUew==",
"license": "OFL-1.1",
"funding": {
"url": "https://github.com/sponsors/ayuhito"
}
},
"node_modules/@img/sharp-darwin-arm64": { "node_modules/@img/sharp-darwin-arm64": {
"version": "0.33.5", "version": "0.33.5",
"resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz",

View File

@@ -14,6 +14,8 @@
"dependencies": { "dependencies": {
"@astrojs/react": "^3.6.3", "@astrojs/react": "^3.6.3",
"@astrojs/tailwind": "^5.1.4", "@astrojs/tailwind": "^5.1.4",
"@fontsource/inter": "^5.2.8",
"@fontsource/space-grotesk": "^5.2.10",
"@types/react": "^19.2.17", "@types/react": "^19.2.17",
"@types/react-dom": "^19.2.3", "@types/react-dom": "^19.2.3",
"astro": "^4.16.0", "astro": "^4.16.0",

View File

@@ -215,53 +215,53 @@
<div class="space-y-4 reveal"> <div class="space-y-4 reveal">
<!-- FAQ 1 --> <!-- FAQ 1 -->
<details class="group rounded-2xl border border-white/80 dark:border-white/[0.06] bg-white/40 dark:bg-transparent backdrop-blur-xl transition-all duration-300 shadow-sm"> <details id="faq-1" class="group rounded-2xl border-[0.5px] border-white/80 dark:border-white/[0.06] bg-white/40 dark:bg-transparent backdrop-blur-xl transition-all duration-300 shadow-sm">
<summary class="flex justify-between items-center p-6 text-slate-900 dark:text-white font-bold text-sm sm:text-base cursor-pointer list-none select-none"> <summary id="faq-summary-1" aria-controls="faq-content-1" aria-expanded="false" class="flex justify-between items-center p-6 text-slate-900 dark:text-white font-bold text-sm sm:text-base cursor-pointer list-none select-none">
<span>Ist die Erstellung der Website wirklich im Hosting-Abo inklusive?</span> <span>Ist die Erstellung der Website wirklich im Hosting-Abo inklusive?</span>
<span class="transition-transform duration-300 group-open:rotate-180 text-sky-600 dark:text-sky-400"> <span class="transition-transform duration-300 group-open:rotate-180 text-sky-600 dark:text-sky-400">
<svg class="w-5 h-5 fill-none stroke-current stroke-2" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M19 9l-7 7-7-7"/></svg> <svg class="w-5 h-5 fill-none stroke-current stroke-2" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M19 9l-7 7-7-7"/></svg>
</span> </span>
</summary> </summary>
<div class="px-6 pb-6 text-slate-600 dark:text-zinc-400 text-xs sm:text-sm leading-relaxed border-t border-slate-100 dark:border-white/5 pt-4"> <div id="faq-content-1" class="px-6 pb-6 text-slate-600 dark:text-zinc-400 text-xs sm:text-sm leading-relaxed border-t border-slate-100 dark:border-white/5 pt-4">
Ja. Wir erstellen Ihren neuen Internetauftritt passend zum Hosting direkt mit. Es gibt keine hohen einmaligen Einrichtungskosten alles ist in der monatlichen Pauschale enthalten. Ja. Wir erstellen Ihren neuen Internetauftritt passend zum Hosting direkt mit. Es gibt keine hohen einmaligen Einrichtungskosten alles ist in der monatlichen Pauschale enthalten.
</div> </div>
</details> </details>
<!-- FAQ 2 --> <!-- FAQ 2 -->
<details class="group rounded-2xl border border-white/80 dark:border-white/[0.06] bg-white/40 dark:bg-transparent backdrop-blur-xl transition-all duration-300 shadow-sm"> <details id="faq-2" class="group rounded-2xl border-[0.5px] border-white/80 dark:border-white/[0.06] bg-white/40 dark:bg-transparent backdrop-blur-xl transition-all duration-300 shadow-sm">
<summary class="flex justify-between items-center p-6 text-slate-900 dark:text-white font-bold text-sm sm:text-base cursor-pointer list-none select-none"> <summary id="faq-summary-2" aria-controls="faq-content-2" aria-expanded="false" class="flex justify-between items-center p-6 text-slate-900 dark:text-white font-bold text-sm sm:text-base cursor-pointer list-none select-none">
<span>Kann ich meine bestehende Domain mitnehmen?</span> <span>Kann ich meine bestehende Domain mitnehmen?</span>
<span class="transition-transform duration-300 group-open:rotate-180 text-sky-600 dark:text-sky-400"> <span class="transition-transform duration-300 group-open:rotate-180 text-sky-600 dark:text-sky-400">
<svg class="w-5 h-5 fill-none stroke-current stroke-2" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M19 9l-7 7-7-7"/></svg> <svg class="w-5 h-5 fill-none stroke-current stroke-2" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M19 9l-7 7-7-7"/></svg>
</span> </span>
</summary> </summary>
<div class="px-6 pb-6 text-slate-600 dark:text-zinc-400 text-xs sm:text-sm leading-relaxed border-t border-slate-100 dark:border-white/5 pt-4"> <div id="faq-content-2" class="px-6 pb-6 text-slate-600 dark:text-zinc-400 text-xs sm:text-sm leading-relaxed border-t border-slate-100 dark:border-white/5 pt-4">
Selbstverständlich. Wir übernehmen den kompletten Domain-Umzug für Sie. Ihre Website bleibt währenddessen unterbrechungsfrei erreichbar. Selbstverständlich. Wir übernehmen den kompletten Domain-Umzug für Sie. Ihre Website bleibt währenddessen unterbrechungsfrei erreichbar.
</div> </div>
</details> </details>
<!-- FAQ 3 --> <!-- FAQ 3 -->
<details class="group rounded-2xl border border-white/80 dark:border-white/[0.06] bg-white/40 dark:bg-transparent backdrop-blur-xl transition-all duration-300 shadow-sm"> <details id="faq-3" class="group rounded-2xl border-[0.5px] border-white/80 dark:border-white/[0.06] bg-white/40 dark:bg-transparent backdrop-blur-xl transition-all duration-300 shadow-sm">
<summary class="flex justify-between items-center p-6 text-slate-900 dark:text-white font-bold text-sm sm:text-base cursor-pointer list-none select-none"> <summary id="faq-summary-3" aria-controls="faq-content-3" aria-expanded="false" class="flex justify-between items-center p-6 text-slate-900 dark:text-white font-bold text-sm sm:text-base cursor-pointer list-none select-none">
<span>Wie laufen spätere Änderungen an meiner Website ab?</span> <span>Wie laufen spätere Änderungen an meiner Website ab?</span>
<span class="transition-transform duration-300 group-open:rotate-180 text-sky-600 dark:text-sky-400"> <span class="transition-transform duration-300 group-open:rotate-180 text-sky-600 dark:text-sky-400">
<svg class="w-5 h-5 fill-none stroke-current stroke-2" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M19 9l-7 7-7-7"/></svg> <svg class="w-5 h-5 fill-none stroke-current stroke-2" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M19 9l-7 7-7-7"/></svg>
</span> </span>
</summary> </summary>
<div class="px-6 pb-6 text-slate-600 dark:text-zinc-400 text-xs sm:text-sm leading-relaxed border-t border-slate-100 dark:border-white/5 pt-4"> <div id="faq-content-3" class="px-6 pb-6 text-slate-600 dark:text-zinc-400 text-xs sm:text-sm leading-relaxed border-t border-slate-100 dark:border-white/5 pt-4">
Senden Sie uns einfach eine kurze Nachricht mit Ihren Änderungswünschen (z. B. neue Öffnungszeiten oder Bilder). Wir setzen diese zeitnah und zuverlässig für Sie um ohne Zusatzkosten. Senden Sie uns einfach eine kurze Nachricht mit Ihren Änderungswünschen (z. B. neue Öffnungszeiten oder Bilder). Wir setzen diese zeitnah und zuverlässig für Sie um ohne Zusatzkosten.
</div> </div>
</details> </details>
<!-- FAQ 4 --> <!-- FAQ 4 -->
<details class="group rounded-2xl border border-white/80 dark:border-white/[0.06] bg-white/40 dark:bg-transparent backdrop-blur-xl transition-all duration-300 shadow-sm"> <details id="faq-4" class="group rounded-2xl border-[0.5px] border-white/80 dark:border-white/[0.06] bg-white/40 dark:bg-transparent backdrop-blur-xl transition-all duration-300 shadow-sm">
<summary class="flex justify-between items-center p-6 text-slate-900 dark:text-white font-bold text-sm sm:text-base cursor-pointer list-none select-none"> <summary id="faq-summary-4" aria-controls="faq-content-4" aria-expanded="false" class="flex justify-between items-center p-6 text-slate-900 dark:text-white font-bold text-sm sm:text-base cursor-pointer list-none select-none">
<span>Wie flexibel ist das Sorgenfrei-Paket und wie sind die Laufzeiten?</span> <span>Wie flexibel ist das Sorgenfrei-Paket und wie sind die Laufzeiten?</span>
<span class="transition-transform duration-300 group-open:rotate-180 text-sky-600 dark:text-sky-400"> <span class="transition-transform duration-300 group-open:rotate-180 text-sky-600 dark:text-sky-400">
<svg class="w-5 h-5 fill-none stroke-current stroke-2" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M19 9l-7 7-7-7"/></svg> <svg class="w-5 h-5 fill-none stroke-current stroke-2" viewBox="0 0 24 24" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M19 9l-7 7-7-7"/></svg>
</span> </span>
</summary> </summary>
<div class="px-6 pb-6 text-slate-600 dark:text-zinc-400 text-xs sm:text-sm leading-relaxed border-t border-slate-100 dark:border-white/5 pt-4"> <div id="faq-content-4" class="px-6 pb-6 text-slate-600 dark:text-zinc-400 text-xs sm:text-sm leading-relaxed border-t border-slate-100 dark:border-white/5 pt-4">
Unser Angebot richtet sich ganz nach Ihrem Bedarf. Die Preise und genauen Konditionen kalkulieren wir auf Anfrage. Jede Anfrage ist für Sie vollkommen unverbindlich. Unser Angebot richtet sich ganz nach Ihrem Bedarf. Die Preise und genauen Konditionen kalkulieren wir auf Anfrage. Jede Anfrage ist für Sie vollkommen unverbindlich.
</div> </div>
</details> </details>
@@ -317,4 +317,18 @@
}); });
revealElements.forEach(el => observer.observe(el)); revealElements.forEach(el => observer.observe(el));
// A11y FAQ Details Sync
const faqDetails = document.querySelectorAll('details');
faqDetails.forEach((details) => {
const summary = details.querySelector('summary');
if (summary) {
// Set initial state
summary.setAttribute('aria-expanded', details.open ? 'true' : 'false');
details.addEventListener('toggle', () => {
summary.setAttribute('aria-expanded', details.open ? 'true' : 'false');
});
}
});
</script> </script>

View File

@@ -0,0 +1,145 @@
---
// src/components/TemplateMarquee.astro
const templates = [
{ id: "01", name: "Der Handwerker-Klassiker", style: "Einfach & Bodenständig", layout: "boxed", design: "Brutalismus", colors: "from-[#FDFBF7] to-[#FAF7F2] text-[#2C1A11]" },
{ id: "02", name: "Dachdecker Meister", style: "Elegant & Professionell", layout: "split", design: "Glassmorphismus", colors: "from-zinc-900 to-zinc-950 text-white border-yellow-500/20" },
{ id: "03", name: "Solar & Photovoltaik", style: "Tech & Zukunft", layout: "bento", design: "SaaS-Minimalismus", colors: "from-zinc-900 to-black text-zinc-100 border-orange-500/20" },
{ id: "04", name: "Die Kanzlei", style: "Seriös & Clean", layout: "asymmetric", design: "Glassmorphismus", colors: "from-[#0B0F19] to-[#070A13] text-white border-emerald-500/20" },
{ id: "05", name: "Bio-Hofladen", style: "Rustikal & Natur", layout: "single", design: "Neomorphismus", colors: "from-[#FAF7F2] to-[#E8DCC4] text-[#4A3B32]" },
{ id: "06", name: "Sanitär & Heizung", style: "Klar & Zuverlässig", layout: "bento", design: "SaaS-Minimalismus", colors: "from-white to-slate-50 text-slate-800 border-slate-200" },
{ id: "07", name: "KFZ Schnellservice", style: "Dynamisch & Direkt", layout: "split", design: "Brutalismus", colors: "from-zinc-800 to-zinc-900 text-white border-zinc-700" },
{ id: "08", name: "Schreinerei Holzart", style: "Handwerk & Präzision", layout: "boxed", design: "SaaS-Minimalismus", colors: "from-[#F5F2EB] to-[#D9D2C5] text-[#3D3A36]" }
];
// Double list for infinite wrap animation
const rowData = [...templates, ...templates];
---
<section class="py-12 bg-slate-50 dark:bg-[#070A13] overflow-hidden relative border-t border-slate-200 dark:border-white/5 transition-colors duration-300">
<!-- Subtle background glow -->
<div class="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[80%] h-[60%] bg-sky-500/5 dark:bg-sky-500/[0.02] blur-[120px] rounded-full pointer-events-none"></div>
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 mb-8 relative z-10">
<div class="max-w-3xl">
<h2 class="text-2xl sm:text-3xl font-extrabold text-slate-900 dark:text-white tracking-tight uppercase">
Unsere Design-Vorlagen
</h2>
<p class="text-slate-600 dark:text-zinc-400 text-xs sm:text-sm mt-2">
Entdecken Sie vorkonfigurierte Layouts. Vollständig anpassbar und optimiert.
</p>
</div>
</div>
<!-- Single Marquee row container -->
<div class="relative z-10 w-full overflow-hidden">
<div class="marquee-wrapper">
<div class="marquee-track marquee-left">
{rowData.map((item, index) => (
<div class="marquee-item group relative w-72 sm:w-80 h-44 rounded-2xl border border-white/80 dark:border-white/[0.06] bg-gradient-to-br backdrop-blur-xl transition-all duration-300 hover:-translate-y-1.5 hover:border-sky-300 dark:hover:border-sky-500/30 shadow-sm hover:shadow-xl p-4 flex flex-col justify-between overflow-hidden cursor-pointer select-none" class:list={[item.colors]}>
<!-- Top bar -->
<div class="flex justify-between items-center border-b border-black/5 dark:border-white/5 pb-2">
<span class="text-[9px] font-mono opacity-60 tracking-wider">TEMPLATE {item.id}</span>
<div class="flex gap-1">
<span class="w-1.5 h-1.5 rounded-full bg-black/10 dark:bg-white/10"></span>
<span class="w-1.5 h-1.5 rounded-full bg-black/10 dark:bg-white/10"></span>
<span class="w-1.5 h-1.5 rounded-full bg-black/10 dark:bg-white/10"></span>
</div>
</div>
<!-- Mini layout representations -->
<div class="flex-grow py-3 flex gap-2">
{item.layout === "bento" && (
<div class="w-full grid grid-cols-3 gap-1 opacity-40">
<div class="col-span-2 h-7 bg-current/10 rounded"></div>
<div class="h-7 bg-current/10 rounded"></div>
<div class="h-10 bg-current/10 rounded"></div>
<div class="col-span-2 h-10 bg-current/10 rounded"></div>
</div>
)}
{item.layout === "split" && (
<div class="w-full grid grid-cols-2 gap-2 opacity-40">
<div class="h-16 bg-current/10 rounded"></div>
<div class="h-16 bg-current/20 rounded flex flex-col justify-end p-1"><div class="h-2 w-3/4 bg-current/20 rounded"></div></div>
</div>
)}
{item.layout === "boxed" && (
<div class="w-full border border-current/10 rounded p-1 opacity-40 flex flex-col gap-1">
<div class="h-3 bg-current/10 rounded"></div>
<div class="h-10 bg-current/10 rounded"></div>
</div>
)}
{item.layout === "asymmetric" && (
<div class="w-full flex gap-2 opacity-40">
<div class="w-1/3 h-16 bg-current/10 rounded"></div>
<div class="w-2/3 h-12 bg-current/15 rounded"></div>
</div>
)}
{item.layout === "single" && (
<div class="w-full flex flex-col gap-1.5 opacity-40">
<div class="h-4 bg-current/10 rounded"></div>
<div class="h-4 bg-current/10 rounded"></div>
<div class="h-8 bg-current/10 rounded"></div>
</div>
)}
</div>
<!-- Bottom info -->
<div class="flex justify-between items-end pt-2 border-t border-black/5 dark:border-white/5">
<div>
<h3 class="text-xs font-bold leading-none">{item.name}</h3>
<span class="text-[9px] opacity-60 mt-1 block">{item.style}</span>
</div>
<span class="text-[9px] font-mono px-1.5 py-0.5 rounded bg-black/5 dark:bg-white/5 uppercase">{item.design}</span>
</div>
<!-- Hover Preview Overlay Button -->
<div class="absolute inset-0 bg-slate-900/60 dark:bg-black/75 backdrop-blur-sm opacity-0 group-hover:opacity-100 flex items-center justify-center transition-all duration-300 z-20">
<a href="/templates" class="px-4 py-2 bg-sky-500 hover:bg-sky-400 text-white font-bold text-xs uppercase tracking-wider rounded shadow-md transform translate-y-4 group-hover:translate-y-0 transition-all duration-300">
Vorschau
</a>
</div>
</div>
))}
</div>
</div>
</div>
</section>
<style>
.marquee-wrapper {
display: flex;
width: 100%;
overflow: hidden;
user-select: none;
mask-image: linear-gradient(to right, transparent 0%, black 10%, black 90%, transparent 100%);
}
.marquee-track {
display: flex;
flex-shrink: 0;
gap: 1.5rem;
min-width: 100%;
padding: 0.5rem 0.75rem;
will-change: transform;
transform: translateZ(0);
}
.marquee-left {
animation: scroll-left 45s linear infinite;
}
/* Hover to pause animation */
.marquee-wrapper:hover .marquee-track {
animation-play-state: paused;
}
@keyframes scroll-left {
0% {
transform: translateX(0);
}
100% {
transform: translateX(-50%);
}
}
</style>

View File

@@ -1,4 +1,14 @@
--- ---
import '@fontsource/inter/300.css';
import '@fontsource/inter/400.css';
import '@fontsource/inter/500.css';
import '@fontsource/inter/600.css';
import '@fontsource/inter/700.css';
import '@fontsource/space-grotesk/400.css';
import '@fontsource/space-grotesk/500.css';
import '@fontsource/space-grotesk/600.css';
import '@fontsource/space-grotesk/700.css';
interface Props { interface Props {
title: string; title: string;
description?: string; description?: string;
@@ -16,11 +26,6 @@ const { title, description = "Professionelles Webdesign & moderne Websites für
<link rel="icon" type="image/svg+xml" href="/favicon.svg" /> <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<title>{title}</title> <title>{title}</title>
<!-- Google Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Space+Grotesk:wght@400;500;600;700&display=swap" rel="stylesheet">
<!-- Inline script to set dark/light mode before page renders --> <!-- Inline script to set dark/light mode before page renders -->
<script is:inline> <script is:inline>
(function() { (function() {

View File

@@ -3,6 +3,7 @@ import Layout from '../layouts/Layout.astro';
import Navbar from '../components/Navbar.astro'; import Navbar from '../components/Navbar.astro';
import Footer from '../components/Footer.astro'; import Footer from '../components/Footer.astro';
import HeroAndLiquidGlass from '../components/HeroAndLiquidGlass.astro'; import HeroAndLiquidGlass from '../components/HeroAndLiquidGlass.astro';
import TemplateMarquee from '../components/TemplateMarquee.astro';
--- ---
<Layout title="N&D i-t SOLUTIONS | Webdesign & Entwicklung"> <Layout title="N&D i-t SOLUTIONS | Webdesign & Entwicklung">
@@ -12,6 +13,9 @@ import HeroAndLiquidGlass from '../components/HeroAndLiquidGlass.astro';
{/* Clean, modular Hero and Liquid Glass section */} {/* Clean, modular Hero and Liquid Glass section */}
<HeroAndLiquidGlass /> <HeroAndLiquidGlass />
<!-- Infinite Template Marquee Ticker -->
<TemplateMarquee />
<!-- Contact section (separate, clean layout) --> <!-- Contact section (separate, clean layout) -->
<section id="contact" class="py-20 bg-slate-50 dark:bg-[#0B0F19] relative border-t border-slate-200 dark:border-white/5 transition-colors duration-300"> <section id="contact" class="py-20 bg-slate-50 dark:bg-[#0B0F19] relative border-t border-slate-200 dark:border-white/5 transition-colors duration-300">
<div class="absolute inset-0 opacity-[0.015] pointer-events-none bg-[radial-gradient(#000_1px,transparent_1px)] dark:bg-[radial-gradient(#fff_1px,transparent_1px)] [background-size:16px_16px] transition-opacity duration-300"></div> <div class="absolute inset-0 opacity-[0.015] pointer-events-none bg-[radial-gradient(#000_1px,transparent_1px)] dark:bg-[radial-gradient(#fff_1px,transparent_1px)] [background-size:16px_16px] transition-opacity duration-300"></div>

View File

@@ -1,8 +1,8 @@
--- ---
import Layout from '../layouts/Layout.astro'; import Layout from "../layouts/Layout.astro";
import Navbar from '../components/Navbar.astro'; import Navbar from "../components/Navbar.astro";
import Footer from '../components/Footer.astro'; import Footer from "../components/Footer.astro";
import { FaArrowLeft, FaEye, FaDesktop } from 'react-icons/fa'; import { FaArrowLeft, FaEye, FaDesktop } from "react-icons/fa";
// List of 20 design templates showcasing maximum diversity in color, structure, and style // List of 20 design templates showcasing maximum diversity in color, structure, and style
const templates = [ const templates = [
@@ -17,7 +17,7 @@ const templates = [
theme: "light", theme: "light",
accentColor: "bg-[#D97706]", accentColor: "bg-[#D97706]",
badgeClass: "bg-[#D97706]/10 text-[#D97706]", badgeClass: "bg-[#D97706]/10 text-[#D97706]",
layoutPreview: "boxed" layoutPreview: "boxed",
}, },
{ {
id: "02", id: "02",
@@ -30,7 +30,7 @@ const templates = [
theme: "dark", theme: "dark",
accentColor: "bg-yellow-500", accentColor: "bg-yellow-500",
badgeClass: "bg-yellow-500/10 text-yellow-400", badgeClass: "bg-yellow-500/10 text-yellow-400",
layoutPreview: "split" layoutPreview: "split",
}, },
{ {
id: "03", id: "03",
@@ -43,7 +43,7 @@ const templates = [
theme: "dark", theme: "dark",
accentColor: "bg-orange-500", accentColor: "bg-orange-500",
badgeClass: "bg-orange-500/10 text-orange-400", badgeClass: "bg-orange-500/10 text-orange-400",
layoutPreview: "bento" layoutPreview: "bento",
}, },
{ {
id: "04", id: "04",
@@ -56,7 +56,7 @@ const templates = [
theme: "dark", theme: "dark",
accentColor: "bg-emerald-500", accentColor: "bg-emerald-500",
badgeClass: "bg-emerald-500/10 text-emerald-400", badgeClass: "bg-emerald-500/10 text-emerald-400",
layoutPreview: "asymmetric" layoutPreview: "asymmetric",
}, },
{ {
id: "05", id: "05",
@@ -69,7 +69,7 @@ const templates = [
theme: "light", theme: "light",
accentColor: "bg-[#C2410C]", accentColor: "bg-[#C2410C]",
badgeClass: "bg-[#C2410C]/10 text-[#C2410C]", badgeClass: "bg-[#C2410C]/10 text-[#C2410C]",
layoutPreview: "single" layoutPreview: "single",
}, },
{ {
id: "06", id: "06",
@@ -82,7 +82,7 @@ const templates = [
theme: "light", theme: "light",
accentColor: "bg-blue-800", accentColor: "bg-blue-800",
badgeClass: "bg-blue-800/10 text-blue-800", badgeClass: "bg-blue-800/10 text-blue-800",
layoutPreview: "bento" layoutPreview: "bento",
}, },
{ {
id: "07", id: "07",
@@ -95,7 +95,7 @@ const templates = [
theme: "dark", theme: "dark",
accentColor: "bg-orange-600", accentColor: "bg-orange-600",
badgeClass: "bg-orange-600/15 text-orange-400", badgeClass: "bg-orange-600/15 text-orange-400",
layoutPreview: "split" layoutPreview: "split",
}, },
{ {
id: "08", id: "08",
@@ -108,7 +108,7 @@ const templates = [
theme: "light", theme: "light",
accentColor: "bg-[#8B5A2B]", accentColor: "bg-[#8B5A2B]",
badgeClass: "bg-[#8B5A2B]/10 text-[#8B5A2B]", badgeClass: "bg-[#8B5A2B]/10 text-[#8B5A2B]",
layoutPreview: "boxed" layoutPreview: "boxed",
}, },
{ {
id: "09", id: "09",
@@ -121,7 +121,7 @@ const templates = [
theme: "dark", theme: "dark",
accentColor: "bg-amber-500", accentColor: "bg-amber-500",
badgeClass: "bg-amber-500/10 text-amber-400", badgeClass: "bg-amber-500/10 text-amber-400",
layoutPreview: "bento" layoutPreview: "bento",
}, },
{ {
id: "10", id: "10",
@@ -134,7 +134,7 @@ const templates = [
theme: "light", theme: "light",
accentColor: "bg-emerald-700", accentColor: "bg-emerald-700",
badgeClass: "bg-emerald-700/10 text-emerald-800", badgeClass: "bg-emerald-700/10 text-emerald-800",
layoutPreview: "asymmetric" layoutPreview: "asymmetric",
}, },
{ {
id: "11", id: "11",
@@ -147,7 +147,7 @@ const templates = [
theme: "light", theme: "light",
accentColor: "bg-[#1E3A8A]", accentColor: "bg-[#1E3A8A]",
badgeClass: "bg-[#1E3A8A]/10 text-[#1E3A8A]", badgeClass: "bg-[#1E3A8A]/10 text-[#1E3A8A]",
layoutPreview: "single" layoutPreview: "single",
}, },
{ {
id: "12", id: "12",
@@ -160,7 +160,7 @@ const templates = [
theme: "light", theme: "light",
accentColor: "bg-[#B45309]", accentColor: "bg-[#B45309]",
badgeClass: "bg-[#B45309]/10 text-[#B45309]", badgeClass: "bg-[#B45309]/10 text-[#B45309]",
layoutPreview: "boxed" layoutPreview: "boxed",
}, },
{ {
id: "13", id: "13",
@@ -173,7 +173,7 @@ const templates = [
theme: "dark", theme: "dark",
accentColor: "bg-purple-600", accentColor: "bg-purple-600",
badgeClass: "bg-purple-600/10 text-purple-400", badgeClass: "bg-purple-600/10 text-purple-400",
layoutPreview: "split" layoutPreview: "split",
}, },
{ {
id: "14", id: "14",
@@ -186,7 +186,7 @@ const templates = [
theme: "dark", theme: "dark",
accentColor: "bg-orange-500", accentColor: "bg-orange-500",
badgeClass: "bg-orange-500/10 text-orange-500", badgeClass: "bg-orange-500/10 text-orange-500",
layoutPreview: "asymmetric" layoutPreview: "asymmetric",
}, },
{ {
id: "15", id: "15",
@@ -199,7 +199,7 @@ const templates = [
theme: "light", theme: "light",
accentColor: "bg-zinc-900", accentColor: "bg-zinc-900",
badgeClass: "bg-zinc-950/10 text-zinc-900", badgeClass: "bg-zinc-950/10 text-zinc-900",
layoutPreview: "split" layoutPreview: "split",
}, },
{ {
id: "16", id: "16",
@@ -212,7 +212,7 @@ const templates = [
theme: "light", theme: "light",
accentColor: "bg-emerald-600", accentColor: "bg-emerald-600",
badgeClass: "bg-emerald-600/10 text-emerald-700", badgeClass: "bg-emerald-600/10 text-emerald-700",
layoutPreview: "single" layoutPreview: "single",
}, },
{ {
id: "17", id: "17",
@@ -225,7 +225,7 @@ const templates = [
theme: "dark", theme: "dark",
accentColor: "bg-emerald-600", accentColor: "bg-emerald-600",
badgeClass: "bg-emerald-600/10 text-emerald-400", badgeClass: "bg-emerald-600/10 text-emerald-400",
layoutPreview: "boxed" layoutPreview: "boxed",
}, },
{ {
id: "18", id: "18",
@@ -238,7 +238,7 @@ const templates = [
theme: "light", theme: "light",
accentColor: "bg-[#A75D5D]", accentColor: "bg-[#A75D5D]",
badgeClass: "bg-[#A75D5D]/10 text-[#A75D5D]", badgeClass: "bg-[#A75D5D]/10 text-[#A75D5D]",
layoutPreview: "bento" layoutPreview: "bento",
}, },
{ {
id: "19", id: "19",
@@ -251,7 +251,7 @@ const templates = [
theme: "dark", theme: "dark",
accentColor: "bg-indigo-500", accentColor: "bg-indigo-500",
badgeClass: "bg-indigo-500/10 text-indigo-400", badgeClass: "bg-indigo-500/10 text-indigo-400",
layoutPreview: "bento" layoutPreview: "bento",
}, },
{ {
id: "20", id: "20",
@@ -264,159 +264,206 @@ const templates = [
theme: "dark", theme: "dark",
accentColor: "bg-orange-500", accentColor: "bg-orange-500",
badgeClass: "bg-orange-500/10 text-orange-400", badgeClass: "bg-orange-500/10 text-orange-400",
layoutPreview: "asymmetric" layoutPreview: "asymmetric",
} },
]; ];
--- ---
<Layout title="Template-Katalog | N&D i-t SOLUTIONS"> <Layout title="Template-Katalog | N&D i-t SOLUTIONS">
<Navbar /> <Navbar />
<main class="relative min-h-screen bg-brand-darkBg text-white pt-28 pb-20 px-4 sm:px-6 lg:px-8 overflow-hidden tactile-grid-bg"> <main
class="relative min-h-screen bg-brand-darkBg text-white pt-28 pb-20 px-4 sm:px-6 lg:px-8 overflow-hidden tactile-grid-bg"
>
<!-- Background Glow (Aurora Effect - kept extremely subtle) --> <!-- Background Glow (Aurora Effect - kept extremely subtle) -->
<div class="absolute top-1/4 left-1/2 -translate-x-1/2 w-[600px] h-[600px] bg-sky-500/[0.02] blur-[150px] pointer-events-none rounded-full"></div> <div
<div class="absolute top-2/3 left-1/3 w-[400px] h-[400px] bg-blue-600/[0.02] blur-[120px] pointer-events-none rounded-full"></div> class="absolute top-1/4 left-1/2 -translate-x-1/2 w-[600px] h-[600px] bg-sky-500/[0.02] blur-[150px] pointer-events-none rounded-full"
>
</div>
<div
class="absolute top-2/3 left-1/3 w-[400px] h-[400px] bg-blue-600/[0.02] blur-[120px] pointer-events-none rounded-full"
>
</div>
<div class="max-w-7xl mx-auto relative z-10"> <div class="max-w-7xl mx-auto relative z-10">
<!-- Back Link --> <!-- Back Link -->
<a href="/" class="inline-flex items-center gap-2 text-zinc-400 hover:text-brand-arcticBlue text-xs uppercase tracking-wider font-semibold mb-8 group transition-colors"> <a
<FaArrowLeft class="w-3 h-3 group-hover:-translate-x-1 transition-transform" /> href="/"
class="inline-flex items-center gap-2 text-zinc-400 hover:text-brand-arcticBlue text-xs uppercase tracking-wider font-semibold mb-8 group transition-colors"
>
<FaArrowLeft
class="w-3 h-3 group-hover:-translate-x-1 transition-transform"
/>
Zurück zur Startseite Zurück zur Startseite
</a> </a>
<!-- Header Section --> <!-- Header Section -->
<div class="max-w-3xl mb-16"> <div class="max-w-3xl mb-16">
<h1 class="text-4xl sm:text-6xl font-bold tracking-tight mb-4"> <h1 class="text-4xl sm:text-6xl font-bold tracking-tight mb-4">
Die perfekte Struktur für <span class="text-brand-arcticBlue">jeden Betrieb.</span> Die perfekte Struktur für <span class="text-brand-arcticBlue"
>jeden Betrieb.</span
>
</h1> </h1>
<p class="text-zinc-400 text-sm sm:text-base leading-relaxed"> <p class="text-zinc-400 text-sm sm:text-base leading-relaxed">
Egal ob klassische Schreinerei, moderne Anwaltskanzlei oder lokaler Handwerker: Wir passen das Design perfekt an Ihren Stil an. Hier sind 20 beispielhafte Bento-Kombinationen, Farbwelten und Layout-Konzepte. Egal ob klassische Schreinerei, moderne Anwaltskanzlei oder lokaler
Handwerker: Wir passen das Design perfekt an Ihren Stil an. Hier sind
20 beispielhafte Bento-Kombinationen, Farbwelten und Layout-Konzepte.
</p> </p>
</div> </div>
<!-- Grid System Container (20 Bento-Kacheln) --> <!-- Grid System Container (20 Bento-Kacheln) -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-6"> <div
class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-6"
{templates.map((tpl) => ( >
<a href={`/templates/${tpl.id}`} class={`group relative rounded-2xl p-6 border transition-all duration-300 hover:scale-[1.01] flex flex-col justify-between h-[340px] ${tpl.bgClass} ${tpl.theme === 'dark' ? 'hover:border-white/20' : 'hover:border-black/20'} shadow-lg cursor-pointer block tactile-noise`}> {
templates.map((tpl) => (
{/* Precision Blueprint Corner Markers */} <a
<span class="absolute top-2 left-2 w-1.5 h-1.5 border-t border-l border-current/25"></span> href={`/templates/${tpl.id}`}
<span class="absolute top-2 right-2 w-1.5 h-1.5 border-t border-r border-current/25"></span> class={`group relative rounded-2xl p-6 border transition-all duration-300 hover:scale-[1.01] flex flex-col justify-between h-[340px] ${tpl.bgClass} ${tpl.theme === "dark" ? "hover:border-white/20" : "hover:border-black/20"} shadow-lg cursor-pointer block tactile-noise`}
<span class="absolute bottom-2 left-2 w-1.5 h-1.5 border-b border-l border-current/25"></span> >
<span class="absolute bottom-2 right-2 w-1.5 h-1.5 border-b border-r border-current/25"></span> {/* Precision Blueprint Corner Markers */}
<span class="absolute top-2 left-2 w-1.5 h-1.5 border-t border-l border-current/25" />
<span class="absolute top-2 right-2 w-1.5 h-1.5 border-t border-r border-current/25" />
<span class="absolute bottom-2 left-2 w-1.5 h-1.5 border-b border-l border-current/25" />
<span class="absolute bottom-2 right-2 w-1.5 h-1.5 border-b border-r border-current/25" />
{/* Overlay glow for modern style */} {/* Overlay glow for modern style */}
<div class="absolute inset-0 bg-white/[0.01] dark:bg-white/[0.02] rounded-2xl pointer-events-none opacity-0 group-hover:opacity-100 transition-opacity duration-300"></div> <div class="absolute inset-0 bg-white/[0.01] dark:bg-white/[0.02] rounded-2xl pointer-events-none opacity-0 group-hover:opacity-100 transition-opacity duration-300" />
<div> <div>
{/* Badge & ID & Status Indicator */} {/* Badge & ID & Status Indicator */}
<div class="flex items-center justify-between mb-4"> <div class="flex items-center justify-between mb-4">
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<span class={`text-[10px] font-mono font-bold uppercase px-2 py-0.5 rounded ${tpl.badgeClass}`}> <span
{tpl.style} class={`text-[10px] font-mono font-bold uppercase px-2 py-0.5 rounded ${tpl.badgeClass}`}
</span> >
<span class="relative flex h-2 w-2" title="Vorschau aktiv"> {tpl.style}
<span class="animate-ping absolute inline-flex h-full w-full rounded-full bg-emerald-400 opacity-75"></span> </span>
<span class="relative inline-flex rounded-full h-2 w-2 bg-emerald-500"></span> <span class="relative flex h-2 w-2" title="Vorschau aktiv">
</span> <span class="animate-ping absolute inline-flex h-full w-full rounded-full bg-emerald-400 opacity-75" />
<span class="relative inline-flex rounded-full h-2 w-2 bg-emerald-500" />
</span>
</div>
<span class="text-xs font-mono opacity-40">#{tpl.id}</span>
</div> </div>
<span class="text-xs font-mono opacity-40">#{tpl.id}</span>
</div>
{/* Title & Description */} {/* Title & Description */}
<h3 class="text-lg font-bold tracking-tight mb-2 line-clamp-2 leading-snug"> <h3 class="text-lg font-bold tracking-tight mb-2 line-clamp-2 leading-snug">
{tpl.name} {tpl.name}
</h3> </h3>
<div class="space-y-1 mt-3">
<div class="flex items-center gap-1.5 text-[11px] opacity-70">
<span class="font-bold">Stil:</span> {tpl.design}
</div>
<div class="flex items-center gap-1.5 text-[11px] opacity-70">
<span class="font-bold">Farbe:</span> {tpl.colorScheme}
</div>
</div>
</div>
{/* Visual Mini-Layout Preview Component inside card (Bento Content-Mix) */} <div class="space-y-1 mt-3">
<div class="my-4 h-16 w-full rounded border border-black/[0.06] dark:border-white/[0.06] bg-black/5 dark:bg-white/5 p-1.5 flex gap-1 justify-center items-stretch relative overflow-hidden"> <div class="flex items-center gap-1.5 text-[11px] opacity-70">
<span class="font-bold">Stil:</span> {tpl.design}
{tpl.layoutPreview === "bento" && ( </div>
<div class="w-full grid grid-cols-3 gap-1"> <div class="flex items-center gap-1.5 text-[11px] opacity-70">
<div class={`col-span-2 rounded ${tpl.accentColor} opacity-70`}></div> <span class="font-bold">Farbe:</span> {tpl.colorScheme}
<div class="rounded bg-black/10 dark:bg-white/10"></div>
<div class="rounded bg-black/10 dark:bg-white/10"></div>
<div class="col-span-2 rounded bg-black/10 dark:bg-white/10"></div>
</div>
)}
{tpl.layoutPreview === "split" && (
<div class="w-full flex gap-1">
<div class={`w-1/2 rounded ${tpl.accentColor} opacity-70`}></div>
<div class="w-1/2 rounded bg-black/10 dark:bg-white/10"></div>
</div>
)}
{tpl.layoutPreview === "boxed" && (
<div class="w-full flex justify-center items-center p-2">
<div class="w-full h-full rounded border border-black/20 dark:border-white/20 p-1 flex gap-1">
<div class={`w-1/3 rounded ${tpl.accentColor} opacity-70`}></div>
<div class="w-2/3 rounded bg-black/10 dark:bg-white/10"></div>
</div> </div>
</div> </div>
)}
{tpl.layoutPreview === "asymmetric" && (
<div class="w-full grid grid-cols-4 gap-1">
<div class="rounded bg-black/10 dark:bg-white/10"></div>
<div class={`col-span-2 rounded ${tpl.accentColor} opacity-70`}></div>
<div class="rounded bg-black/10 dark:bg-white/10"></div>
</div>
)}
{tpl.layoutPreview === "single" && (
<div class="w-full flex flex-col gap-1 justify-center">
<div class={`h-3 w-3/4 mx-auto rounded ${tpl.accentColor} opacity-70`}></div>
<div class="h-2 w-1/2 mx-auto rounded bg-black/10 dark:bg-white/10"></div>
<div class="h-2 w-2/3 mx-auto rounded bg-black/10 dark:bg-white/10"></div>
</div>
)}
</div>
{/* CTA action bottom */}
<div class="flex items-center justify-between pt-3 border-t border-black/[0.06] dark:border-white/[0.06]">
<span class="text-[10px] font-mono opacity-50 uppercase">{tpl.layout}</span>
<div class="flex items-center gap-1.5 text-xs font-semibold group-hover:translate-x-0.5 transition-transform">
<span>Vorschau</span>
<FaDesktop class="w-3 h-3 opacity-60" />
</div> </div>
</div>
</a> {/* Visual Mini-Layout Preview Component inside card (Bento Content-Mix) */}
))} <div class="my-4 h-16 w-full rounded border border-black/[0.06] dark:border-white/[0.06] bg-black/5 dark:bg-white/5 p-1.5 flex gap-1 justify-center items-stretch relative overflow-hidden">
{tpl.layoutPreview === "bento" && (
<div class="w-full grid grid-cols-3 gap-1">
<div
class={`col-span-2 rounded ${tpl.accentColor} opacity-70`}
/>
<div class="rounded bg-black/10 dark:bg-white/10" />
<div class="rounded bg-black/10 dark:bg-white/10" />
<div class="col-span-2 rounded bg-black/10 dark:bg-white/10" />
</div>
)}
{tpl.layoutPreview === "split" && (
<div class="w-full flex gap-1">
<div
class={`w-1/2 rounded ${tpl.accentColor} opacity-70`}
/>
<div class="w-1/2 rounded bg-black/10 dark:bg-white/10" />
</div>
)}
{tpl.layoutPreview === "boxed" && (
<div class="w-full flex justify-center items-center p-2">
<div class="w-full h-full rounded border border-black/20 dark:border-white/20 p-1 flex gap-1">
<div
class={`w-1/3 rounded ${tpl.accentColor} opacity-70`}
/>
<div class="w-2/3 rounded bg-black/10 dark:bg-white/10" />
</div>
</div>
)}
{tpl.layoutPreview === "asymmetric" && (
<div class="w-full grid grid-cols-4 gap-1">
<div class="rounded bg-black/10 dark:bg-white/10" />
<div
class={`col-span-2 rounded ${tpl.accentColor} opacity-70`}
/>
<div class="rounded bg-black/10 dark:bg-white/10" />
</div>
)}
{tpl.layoutPreview === "single" && (
<div class="w-full flex flex-col gap-1 justify-center">
<div
class={`h-3 w-3/4 mx-auto rounded ${tpl.accentColor} opacity-70`}
/>
<div class="h-2 w-1/2 mx-auto rounded bg-black/10 dark:bg-white/10" />
<div class="h-2 w-2/3 mx-auto rounded bg-black/10 dark:bg-white/10" />
</div>
)}
</div>
{/* CTA action bottom */}
<div class="flex items-center justify-between pt-3 border-t border-black/[0.06] dark:border-white/[0.06]">
<span class="text-[10px] font-mono opacity-50 uppercase">
{tpl.layout}
</span>
<div class="flex items-center gap-1.5 text-xs font-semibold group-hover:translate-x-0.5 transition-transform">
<span>Vorschau</span>
<FaDesktop class="w-3 h-3 opacity-60" />
</div>
</div>
</a>
))
}
</div> </div>
<!-- Bottom Info Callout --> <!-- Bottom Info Callout -->
<div class="mt-20 p-8 rounded-2xl bg-brand-darkCard/40 border border-brand-darkBorder relative overflow-hidden group"> <div
<div class="absolute inset-0 bg-gradient-to-r from-brand-arcticBlue/5 to-transparent pointer-events-none"></div> class="mt-20 p-8 rounded-2xl bg-brand-darkCard/40 border border-brand-darkBorder relative overflow-hidden group"
<div class="relative z-10 flex flex-col md:flex-row items-start md:items-center justify-between gap-6"> >
<div
class="absolute inset-0 bg-gradient-to-r from-brand-arcticBlue/5 to-transparent pointer-events-none"
>
</div>
<div
class="relative z-10 flex flex-col md:flex-row items-start md:items-center justify-between gap-6"
>
<div> <div>
<h3 class="text-xl font-bold mb-2">Ihr Wunsch-Design ist nicht dabei?</h3> <h3 class="text-xl font-bold mb-2">
<p class="text-zinc-400 text-xs sm:text-sm max-w-2xl leading-relaxed"> Ihr Wunsch-Design ist nicht dabei?
Kein Problem. Jedes Layout wird von uns individuell im Code programmiert. Wir nutzen keine starren Fertig-Systeme. Teilen Sie uns einfach Ihre Vorstellungen mit, und wir setzen sie passgenau um. </h3>
<p
class="text-zinc-400 text-xs sm:text-sm max-w-2xl leading-relaxed"
>
Kein Problem. Jedes Layout wird von uns individuell im Code
programmiert. Wir nutzen keine starren Fertig-Systeme. Teilen Sie
uns einfach Ihre Vorstellungen mit, und wir setzen sie passgenau
um.
</p> </p>
</div> </div>
<a href="/#contact" class="inline-flex items-center gap-2 px-5 py-2.5 bg-brand-arcticBlue text-zinc-950 font-semibold text-xs tracking-wider uppercase rounded hover:bg-white transition-all duration-200 shrink-0"> <a
href="/#contact"
class="inline-flex items-center gap-2 px-5 py-2.5 bg-brand-arcticBlue text-zinc-950 font-semibold text-xs tracking-wider uppercase rounded hover:bg-white transition-all duration-200 shrink-0"
>
Design besprechen Design besprechen
<FaDesktop class="w-3 h-3" /> <FaDesktop class="w-3 h-3" />
</a> </a>
</div> </div>
</div> </div>
</div> </div>
</main> </main>