Backup eingespielt
This commit is contained in:
1 parent
b87d2894bf
commit
574e07603d
17 files changed
+518
-25
No files matched your search
Whitespace-only changes.
@@ -0,0 +1,34 @@
|
||||
import { notFound } from "next/navigation";
|
||||
import Image from "next/image";
|
||||
import { branchenloesungen } from "../data";
|
||||
|
||||
export function generateStaticParams() {
|
||||
return branchenloesungen.map((item) => ({
|
||||
slug: item.slug,
|
||||
}));
|
||||
}
|
||||
|
||||
export default async function LeistungDetail({
|
||||
params,
|
||||
}: {
|
||||
params: Promise<{ slug: string }>;
|
||||
}) {
|
||||
const { slug } = await params;
|
||||
const leistung = branchenloesungen.find((item) => item.slug === slug);
|
||||
|
||||
if (!leistung) notFound();
|
||||
|
||||
return (
|
||||
<main>
|
||||
<h1>{leistung.title}</h1>
|
||||
<p>{leistung.text}</p>
|
||||
|
||||
<Image
|
||||
src={leistung.image}
|
||||
alt={leistung.title}
|
||||
width={1200}
|
||||
height={800}
|
||||
/>
|
||||
</main>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
export const branchenloesungen = [
|
||||
{
|
||||
slug: "bueros",
|
||||
title: "Büros",
|
||||
text: "Glas- und Fensterreinigung",
|
||||
image: "/images/leistungen/webdesign.jpg",
|
||||
},
|
||||
{
|
||||
slug: "kanzlei",
|
||||
title: "Kanzlei",
|
||||
text: "Unterhaltsreinigung",
|
||||
image: "/images/leistungen/seo.jpg",
|
||||
},
|
||||
{
|
||||
slug: "hallen-und-lagerflaechen",
|
||||
title: "Hallen und Lagerflächen",
|
||||
text: "Treppenhausreinigung",
|
||||
image: "/images/leistungen/branding.jpg",
|
||||
},
|
||||
{
|
||||
slug: "wohn-und-geschaeftshaeuser",
|
||||
title: "Wohn- und Geschäftshäuse",
|
||||
text: "Performante E-Commerce-Lösungen.",
|
||||
image: "/images/leistungen/shop.jpg",
|
||||
},
|
||||
];
|
||||
@@ -0,0 +1,3 @@
|
||||
export default function Branchenloesungen() {
|
||||
return <h1>Branchenlösungen</h1>;
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
export default function Kontakt() {
|
||||
return <h1>Kontakt</h1>;
|
||||
}
|
||||
@@ -0,0 +1,172 @@
|
||||
.hero {
|
||||
background: var(--color-background-linear);
|
||||
padding-block: var(--space-16);
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.inner {
|
||||
max-width: var(--container-width);
|
||||
margin-inline: auto;
|
||||
padding-inline: var(--space-4);
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--space-8);
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.decoration {
|
||||
position: absolute;
|
||||
top: var(--space-8);
|
||||
right: var(--space-8);
|
||||
display: none;
|
||||
grid-template-columns: repeat(6, 1fr);
|
||||
grid-template-rows: repeat(3, 1fr);
|
||||
gap: var(--space-3);
|
||||
pointer-events: none;
|
||||
z-index: 0;
|
||||
}
|
||||
|
||||
.dot {
|
||||
width: 14px;
|
||||
height: 14px;
|
||||
border-radius: var(--radius-full);
|
||||
background-color: var(--color-accent);
|
||||
opacity: 0.8;
|
||||
}
|
||||
|
||||
.heading {
|
||||
color: var(--color-heading);
|
||||
max-width: 24ch;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--space-1);
|
||||
text-align: center;
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
.headingSub {
|
||||
font-size: var(--font-size-h3);
|
||||
font-weight: var(--font-weight-bold);
|
||||
color: var(--color-text-muted);
|
||||
letter-spacing: var(--letter-spacing-tight);
|
||||
}
|
||||
|
||||
.content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--space-6);
|
||||
}
|
||||
|
||||
.imageWrapper {
|
||||
position: relative;
|
||||
width: min(100%, 300px);
|
||||
margin-inline: auto;
|
||||
aspect-ratio: 4 / 3;
|
||||
flex-shrink: 0;
|
||||
order: -1;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.imageWrapper::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
left: 8%;
|
||||
right: 8%;
|
||||
bottom: -4px;
|
||||
height: 28%;
|
||||
background: color-mix(in srgb, var(--color-accent) 55%, transparent);
|
||||
filter: blur(22px);
|
||||
opacity: 0.45;
|
||||
border-radius: 999px;
|
||||
z-index: -1;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.imageFrame {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
border-radius: var(--radius-lg);
|
||||
overflow: hidden;
|
||||
box-shadow:
|
||||
0 10px 30px rgba(0, 0, 0, 0.08),
|
||||
0 24px 60px rgba(0, 0, 0, 0.06);
|
||||
}
|
||||
|
||||
.image {
|
||||
object-fit: cover;
|
||||
}
|
||||
|
||||
.body {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
gap: var(--space-6);
|
||||
align-items: center;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.lead {
|
||||
font-size: var(--font-size-base);
|
||||
text-align: center;
|
||||
width: min(100%, 48ch);
|
||||
margin-inline: auto;
|
||||
}
|
||||
|
||||
/* Tablet: 768px */
|
||||
@media (min-width: 768px) {
|
||||
.content {
|
||||
flex-direction: row;
|
||||
align-items: flex-start;
|
||||
gap: var(--space-8);
|
||||
}
|
||||
|
||||
.inner {
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
.heading {
|
||||
text-align: left;
|
||||
align-self: flex-start;
|
||||
}
|
||||
|
||||
.body {
|
||||
align-items: flex-start;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.lead {
|
||||
text-align: left;
|
||||
margin-inline: 0;
|
||||
}
|
||||
|
||||
.decoration {
|
||||
display: grid;
|
||||
top: -24px;
|
||||
}
|
||||
|
||||
.imageWrapper {
|
||||
width: 260px;
|
||||
|
||||
order: 0; /* zurück zur normalen Reihenfolge */
|
||||
}
|
||||
|
||||
.dot {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
}
|
||||
}
|
||||
|
||||
/* Desktop: 1024px */
|
||||
@media (min-width: 1024px) {
|
||||
.hero {
|
||||
padding-block: var(--space-36);
|
||||
}
|
||||
|
||||
.decoration {
|
||||
top: -42px;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
import { notFound } from "next/navigation";
|
||||
import { leistungen } from "../data";
|
||||
import Image from "next/image";
|
||||
import Link from "next/link";
|
||||
import { ArrowRightIcon } from "@phosphor-icons/react/dist/ssr";
|
||||
import styles from "./page.module.css";
|
||||
|
||||
export function generateStaticParams() {
|
||||
return leistungen.map((item) => ({ slug: item.slug }));
|
||||
}
|
||||
|
||||
export default async function LeistungDetail({
|
||||
params,
|
||||
}: {
|
||||
params: Promise<{ slug: string }>;
|
||||
}) {
|
||||
const { slug } = await params;
|
||||
const leistung = leistungen.find((item) => item.slug === slug);
|
||||
|
||||
if (!leistung) notFound();
|
||||
|
||||
return (
|
||||
<main>
|
||||
<section className={styles.hero} aria-labelledby="hero-heading">
|
||||
<div className={styles.inner}>
|
||||
<div className={styles.decoration} aria-hidden="true">
|
||||
{Array.from({ length: 18 }).map((_, i) => (
|
||||
<span key={i} className={styles.dot} />
|
||||
))}
|
||||
</div>
|
||||
<h1 id="hero-heading" className={styles.heading}>
|
||||
{leistung.titleMain}
|
||||
<span className={styles.headingSub}>{leistung.titleSub}</span>
|
||||
</h1>
|
||||
|
||||
<div className={styles.content}>
|
||||
<div className={styles.imageWrapper}>
|
||||
<div className={styles.imageFrame}>
|
||||
<Image
|
||||
src={leistung.image}
|
||||
alt={leistung.imageAlt}
|
||||
fill
|
||||
className={styles.image}
|
||||
sizes="(max-width: 640px) 100vw, 260px"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className={styles.body}>
|
||||
<p className={`lead ${styles.lead}`}>{leistung.text}</p>
|
||||
<Link href="/kontakt" className="btn btn--filled">
|
||||
<span className="btn-icon animate" aria-hidden="true">
|
||||
<ArrowRightIcon size={18} weight="bold" />
|
||||
</span>
|
||||
Jetzt Angebot anfragen
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
export const leistungen = [
|
||||
{
|
||||
slug: "fensterreinigung",
|
||||
titleMain: "Professionelle Fensterreinigung",
|
||||
titleSub: "in Hannover und Umgebung",
|
||||
text: "Streifenfreie Fenster und Glasfronten sind das Aushängeschild Ihres Unternehmens. Wir reinigen Fenster, Rahmen, Glasfassaden und Eingangsbereiche zuverlässig – für einen professionellen ersten Eindruck bei Kunden, Mitarbeitenden und Besuchern.",
|
||||
image: "/images/services/Fensterreinigung.jpg",
|
||||
imageAlt: "Gereinigte Fensterfront eines Geschäftsgebäudes",
|
||||
},
|
||||
{
|
||||
slug: "unterhaltsreinigung",
|
||||
titleMain: "Professionelle Unterhaltsreinigung",
|
||||
titleSub: "in Hannover und Umgebung",
|
||||
text: "Regelmäßige Unterhaltsreinigung für Büros, Praxen und Schulen – zuverlässig, gründlich und zu festen Terminen. Wir stimmen die Reinigungsintervalle individuell auf Ihre Räumlichkeiten ab, damit Ihre Flächen dauerhaft gepflegt und einladend wirken.",
|
||||
image: "/images/services/unterhaltsreinigung.jpg",
|
||||
imageAlt: "Reinigungskraft bei der Unterhaltsreinigung in einem Büro",
|
||||
},
|
||||
{
|
||||
slug: "treppenhausreinigung",
|
||||
titleMain: "Professionelle Treppenhausreinigung",
|
||||
titleSub: "in Hannover und Umgebung",
|
||||
text: "Gepflegte Treppenhäuser und Eingangsbereiche hinterlassen bei Mitarbeitenden, Kundschaft und Besuchern einen guten ersten Eindruck. Wir übernehmen die regelmäßige Reinigung zuverlässig und termingerecht – für eine saubere Visitenkarte Ihres Gebäudes.",
|
||||
image: "/images/services/treppenhausreinigung.jpg",
|
||||
imageAlt: "Sauberes Treppenhaus in einem Gewerbeobjekt",
|
||||
},
|
||||
{
|
||||
slug: "grundreinigung",
|
||||
titleMain: "Professionelle Grundreinigung",
|
||||
titleSub: "in Hannover und Umgebung",
|
||||
text: "Intensive Tiefenreinigung für Räume mit besonderem Pflegebedarf – gründlich, termingerecht und mit professionellem Equipment. Ob nach Umzug, vor Neueröffnung oder als saisonale Maßnahme: Wir sorgen für einen makellosen Ausgangszustand.",
|
||||
image: "/images/services/grundreinigung.jpg",
|
||||
imageAlt: "Sauberer Büroarbeitsplatz nach der Grundreinigung",
|
||||
},
|
||||
{
|
||||
slug: "hausmeisterdienste",
|
||||
titleMain: "Professionelle Hausmeisterdienste",
|
||||
titleSub: "in Hannover und Umgebung",
|
||||
text: "Vom Winterdienst bis zur Grünpflege – wir übernehmen zuverlässig alle anfallenden Hausmeisteraufgaben. Ob Kleinreparaturen, Objektbetreuung oder regelmäßige Kontrollgänge: Ein fester Ansprechpartner sorgt für reibungslose Abläufe in Ihrem Objekt.",
|
||||
image: "/images/services/Hausmeisterdienste.jpg",
|
||||
imageAlt: "Hausmeister bei der Außenpflege eines Gebäudes",
|
||||
},
|
||||
];
|
||||
@@ -0,0 +1,3 @@
|
||||
export default function Leistungen() {
|
||||
return <h1>Leistungen</h1>;
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
import AboutUsSection from "@/components/AboutUsSection";
|
||||
import BenefitsSection from "@/components/benefitsSection";
|
||||
import ContactCtaSection from "@/components/contact/ContactCtaSection";
|
||||
import CtaSection from "@/components/CtaSection";
|
||||
import { homepageFaq } from "@/components/faq/faqData";
|
||||
import FaqSection from "@/components/faq/FaqSection";
|
||||
import HeroSection from "@/components/HeroSection";
|
||||
@@ -13,6 +14,7 @@ export default function Home() {
|
||||
<HeroSection />
|
||||
<ServiceSection />
|
||||
<BenefitsSection />
|
||||
<CtaSection />
|
||||
<IndustrySolutionsSection />
|
||||
<FaqSection
|
||||
title="In drei Schritten zu planbarer Sauberkeit"
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
|
||||
export default function Datenschutz() {
|
||||
return (
|
||||
<main>
|
||||
<h1>Datenschutz</h1>
|
||||
</main>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
|
||||
export default function Impressum() {
|
||||
return (
|
||||
<main>
|
||||
<h1>impressum</h1>
|
||||
</main>
|
||||
);
|
||||
}
|
||||
+55
-13
@@ -25,29 +25,71 @@ export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
|
||||
priority: 1.0,
|
||||
},
|
||||
{
|
||||
url: `${BASE_URL}/about`,
|
||||
url: `${BASE_URL}/leistungen`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: "monthly",
|
||||
priority: 0.8,
|
||||
},
|
||||
{
|
||||
url: `${BASE_URL}/leistungen/fensterreinigung`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: "monthly",
|
||||
priority: 0.8,
|
||||
},
|
||||
{
|
||||
url: `${BASE_URL}/leistungen/grundreinigung`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: "monthly",
|
||||
priority: 0.8,
|
||||
},
|
||||
{
|
||||
url: `${BASE_URL}/leistungen/unterhaltsreinigung`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: "monthly",
|
||||
priority: 0.8,
|
||||
},
|
||||
{
|
||||
url: `${BASE_URL}/leistungen/hausmeisterdienste`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: "monthly",
|
||||
priority: 0.8,
|
||||
},
|
||||
{
|
||||
url: `${BASE_URL}/leistungen/treppenhausreinigung`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: "monthly",
|
||||
priority: 0.8,
|
||||
},
|
||||
{
|
||||
url: `${BASE_URL}/branchenloesungen/bueros`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: "monthly",
|
||||
priority: 0.6,
|
||||
},
|
||||
{
|
||||
url: `${BASE_URL}/branchenloesungen/kanzlei`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: "monthly",
|
||||
priority: 0.6,
|
||||
},
|
||||
{
|
||||
url: `${BASE_URL}/branchenloesungen/hallen-und-lagerflaechen`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: "monthly",
|
||||
priority: 0.6,
|
||||
},
|
||||
{
|
||||
url: `${BASE_URL}/branchenloesungen/wohn-und-geschaeftshaeuser`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: "monthly",
|
||||
priority: 0.6,
|
||||
},
|
||||
{
|
||||
url: `${BASE_URL}/kontakt`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: "yearly",
|
||||
priority: 0.6,
|
||||
},
|
||||
{
|
||||
url: `${BASE_URL}/datenschutz`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: "yearly",
|
||||
priority: 0.3,
|
||||
},
|
||||
{
|
||||
url: `${BASE_URL}/impressum`,
|
||||
lastModified: new Date(),
|
||||
changeFrequency: "yearly",
|
||||
priority: 0.3,
|
||||
},
|
||||
];
|
||||
|
||||
// ─── Dynamische Blog-Seiten (auskommentiert bis Blog vorhanden) ────────────
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
.cta {
|
||||
background: linear-gradient(135deg, #267361 0%, #1f5f50 100%);
|
||||
padding-block: var(--space-16);
|
||||
}
|
||||
|
||||
.inner {
|
||||
max-width: var(--container-width);
|
||||
margin: 0 auto;
|
||||
padding-inline: var(--space-4);
|
||||
}
|
||||
|
||||
.content {
|
||||
max-width: 48rem;
|
||||
margin: 0 auto;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: var(--space-6);
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.heading {
|
||||
color: #ffffff;
|
||||
max-width: 22ch;
|
||||
}
|
||||
|
||||
.actions {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: var(--space-4);
|
||||
}
|
||||
|
||||
.actions :global(.btn) {
|
||||
font-weight: var(--font-weight-semibold);
|
||||
}
|
||||
|
||||
.actions :global(.btn--tertiary) {
|
||||
padding-top: 0;
|
||||
padding-bottom: 0;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
@media (min-width: 768px) {
|
||||
.cta {
|
||||
padding-block: var(--space-20);
|
||||
}
|
||||
|
||||
.actions {
|
||||
flex-direction: row;
|
||||
justify-content: center;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
import { ArrowRightIcon, PhoneIcon } from "@phosphor-icons/react/dist/ssr";
|
||||
import Link from "next/link";
|
||||
import { companyData } from "@/data/companyData";
|
||||
import styles from "./CtaSection.module.css";
|
||||
|
||||
export default function CtaSection() {
|
||||
return (
|
||||
<section className={styles.cta} aria-labelledby="cta-heading">
|
||||
<div className={styles.inner}>
|
||||
<div className={styles.content}>
|
||||
<h2 id="cta-heading" className={styles.heading}>
|
||||
Saubere Räume für einen starken ersten Eindruck
|
||||
</h2>
|
||||
|
||||
<div className={styles.actions}>
|
||||
<Link href="/kontakt" className="btn btn btn--filled-inverse">
|
||||
<span className="btn-icon animate" aria-hidden="true">
|
||||
<ArrowRightIcon size={18} weight="bold" />
|
||||
</span>
|
||||
Jetzt Angebot anfragen
|
||||
</Link>
|
||||
|
||||
<a
|
||||
href={`tel:${companyData.contact.phone.value}`}
|
||||
className="btn btn--tertiary"
|
||||
>
|
||||
<span className="btn-icon" aria-hidden="true">
|
||||
<PhoneIcon size={18} weight="bold" />
|
||||
</span>
|
||||
{companyData.contact.phone.display}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
}
|
||||
@@ -53,10 +53,10 @@ export default function Footer() {
|
||||
<span className={styles["footer__nav-title"]}>Rechtliches</span>
|
||||
<ul>
|
||||
<li>
|
||||
<Link href="/impressum">Impressum</Link>
|
||||
<Link href="/rechtliches/impressum">Impressum</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link href="/datenschutz">Datenschutz</Link>
|
||||
<Link href="/rechtliches/datenschutz">Datenschutz</Link>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
+7
-10
@@ -18,23 +18,23 @@ export const subMenus: SubMenu[] = [
|
||||
items: [
|
||||
{
|
||||
label: "Unterhaltsreinigung",
|
||||
to: "/dienstleistungen/unterhaltsreinigung",
|
||||
to: "/leistungen/unterhaltsreinigung",
|
||||
},
|
||||
{
|
||||
label: "Treppenhausreinigung",
|
||||
to: "/dienstleistungen/treppenhausreinigung",
|
||||
to: "/leistungen/treppenhausreinigung",
|
||||
},
|
||||
{
|
||||
label: "Fensterreinigung",
|
||||
to: "/dienstleistungen/fensterreinigung",
|
||||
to: "/leistungen/fensterreinigung",
|
||||
},
|
||||
{
|
||||
label: "Grundreinigung",
|
||||
to: "/dienstleistungen/grundreinigung",
|
||||
to: "/leistungen/grundreinigung",
|
||||
},
|
||||
{
|
||||
label: "Hausmeisterdienste",
|
||||
to: "/dienstleistungen/hausmeisterdienste",
|
||||
to: "/leistungen/hausmeisterdienste",
|
||||
},
|
||||
],
|
||||
},
|
||||
@@ -49,14 +49,11 @@ export const subMenus: SubMenu[] = [
|
||||
},
|
||||
{
|
||||
label: "Wohn- und Geschäftshäuser",
|
||||
to: "/branchenloesungen/wohn--und-geschaeftshaeuser",
|
||||
to: "/branchenloesungen/wohn-und-geschaeftshaeuser",
|
||||
},
|
||||
{ label: "Kanzlei", to: "/branchenloesungen/kanzlei" },
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
export const endLinks: NavItem[] = [
|
||||
{ label: "Unternehmen", to: "/unternehmen" },
|
||||
{ label: "Kontakt", to: "/kontakt" },
|
||||
];
|
||||
export const endLinks: NavItem[] = [{ label: "Kontakt", to: "/kontakt" }];
|
||||
Reference in new issue
Block a user