Revise content across multiple components for enhanced clarity and user engagement; update About19, Contact21, CTA, FAQ, Footer, Hero, Pricing, and Stats sections with localized messaging and improved structure.

This commit is contained in:
2026-04-22 09:36:12 +02:00
parent f42b535073
commit ec22c238fa
9 changed files with 234 additions and 226 deletions

View File

@@ -20,34 +20,20 @@ const About19 = ({ className }: About19Props) => {
<div className="col-span-3 ml-auto max-w-4xl space-y-15 lg:pl-15"> <div className="col-span-3 ml-auto max-w-4xl space-y-15 lg:pl-15">
<h1 className="text-2xl font-medium tracking-tight"> <h1 className="text-2xl font-medium tracking-tight">
Ich bin Matthias Meister und begleite KMU auf dem Weg zu einem Hallo, ich bin Matthias.
professionellen Online-Auftritt, der klar kommuniziert und
Vertrauen aufbaut.
</h1> </h1>
<p className="text-base text-foreground/40 lg:text-lg"> <p className="text-base text-foreground/40 lg:text-lg">
Mein Fokus liegt auf Websites, die nicht ueberladen wirken, Ich bin in der Region aufgewachsen, war durch die Bundeswehr viele Jahre weg und bin jetzt zurück. Und ich plane zu bleiben.
sondern Orientierung geben und den naechsten Kontakt einfach </p>
machen. <p className="text-base text-foreground/40 lg:text-lg">
Seit über 15 Jahren beschäftige ich mich mit Webentwicklung und Software. Einen Großteil davon intern für die Bundeswehr Projekte die ich Ihnen leider nicht zeigen kann. Was ich Ihnen zeigen kann: Wie ich arbeite. Zuverlässig, präzise und ohne unnötigen Schnickschnack.
</p>
<p className="text-base text-foreground/40 lg:text-lg">
Neben Websites für regionale Unternehmen entwickle ich eigene Software und Apps. Das bedeutet: Wenn Ihre Anforderungen irgendwann über eine einfache Website hinausgehen, bin ich noch immer der richtige Ansprechpartner.
</p>
<p className="text-base text-foreground/40 lg:text-lg">
Mein Ziel ist es, Unternehmen aus der Region Handwerker, Friseure, Ärzte mit dem auszustatten, was Großstadtagenturen ihren Kunden für viel mehr Geld verkaufen. Eine Website die funktioniert, gefunden wird und Ihnen keine Kopfschmerzen macht.
</p> </p>
<div className="flex flex-col justify-between gap-4 lg:flex-row lg:items-center">
<p className="flex-1 text-sm text-foreground/40">
Sie erhalten direkte Abstimmung, klare Schritte und eine
Umsetzung, die zu Ihrem Geschaeft passt.
</p>
<div className="flex w-fit items-center gap-2">
<img
src="https://deifkwefumgah.cloudfront.net/shadcnblocks/block/guri3/avatar1.png"
className="size-10"
alt="avatr"
/>
<div>
<h3 className="font-medium tracking-tight">Matthias Meister</h3>
<p className="text-sm text-foreground/40">
Freelance Webdesigner
</p>
</div>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -73,9 +73,7 @@ const Contact21 = ({ className, onSubmit }: Contact21Props) => {
<div className="mt-20 flex flex-col justify-between gap-15 md:gap-10 lg:flex-row"> <div className="mt-20 flex flex-col justify-between gap-15 md:gap-10 lg:flex-row">
<div className="flex w-full max-w-lg flex-col justify-between gap-10"> <div className="flex w-full max-w-lg flex-col justify-between gap-10">
<p className="indent-[22%] text-3xl font-medium tracking-tight text-muted-foreground/50 lg:text-4xl"> <p className="indent-[22%] text-3xl font-medium tracking-tight text-muted-foreground/50 lg:text-4xl">
Ich unterstuetze Unternehmen dabei, online professionell Erzählen Sie mir kurz von Ihrem Unternehmen ich melde mich innerhalb von 24 Stunden mit einem unverbindlichen Angebot.
aufzutreten. Schreiben Sie mir kurz, worum es geht.{" "}
<span className="text-foreground">Ich melde mich zeitnah</span>
</p> </p>
<div className="mt-5 flex items-center gap-4 lg:mt-20"> <div className="mt-5 flex items-center gap-4 lg:mt-20">
<img <img
@@ -95,24 +93,24 @@ const Contact21 = ({ className, onSubmit }: Contact21Props) => {
</div> </div>
<div className="col-span-4 flex w-full flex-col gap-2 lg:pl-10"> <div className="col-span-4 flex w-full flex-col gap-2 lg:pl-10">
<h1 className="mb-7 text-6xl font-semibold tracking-tight lg:text-5xl"> <h1 className="mb-7 text-6xl font-semibold tracking-tight lg:text-5xl">
Projekt anfragen Jetzt Website anfordern
</h1> </h1>
{isSubmitted && ( {isSubmitted && (
<div <div
className={cn( className={cn(
"mb-4 rounded-lg border border-green-500/20 bg-green-500/10 p-4 text-center transition-opacity duration-500", "mb-4 rounded-lg border border-green-500/20 bg-green-500/10 p-4 text-center transition-opacity duration-500",
showSuccess ? "opacity-100" : "opacity-0", showSuccess ? "opacity-100" : "opacity-0",
)}
>
<p className="text-sm font-medium text-green-600 dark:text-green-400">
Vielen Dank! Ich melde mich in Kürze bei Ihnen.
</p>
</div>
)} )}
>
<p className="text-sm font-medium text-green-600 dark:text-green-400">
Vielen Dank! Ich melde mich in Kuerze bei Ihnen.
</p>
</div>
)}
<form onSubmit={form.handleSubmit(handleFormSubmit)}> <form onSubmit={form.handleSubmit(handleFormSubmit)}>
<FieldGroup className="gap-0"> <FieldGroup className="gap-0">
<Controller <Controller
control={form.control} control={form.control}
name="name" name="name"
@@ -125,7 +123,7 @@ const Contact21 = ({ className, onSubmit }: Contact21Props) => {
{...field} {...field}
id={field.name} id={field.name}
aria-invalid={fieldState.invalid} aria-invalid={fieldState.invalid}
placeholder="Name*" placeholder="Ihr Name*"
className="h-15 rounded-none border-0 border-b border-b-foreground/25 bg-transparent! shadow-none placeholder:text-foreground/20 focus-visible:ring-0 lg:text-base" className="h-15 rounded-none border-0 border-b border-b-foreground/25 bg-transparent! shadow-none placeholder:text-foreground/20 focus-visible:ring-0 lg:text-base"
/> />
{fieldState.invalid && ( {fieldState.invalid && (
@@ -148,7 +146,7 @@ const Contact21 = ({ className, onSubmit }: Contact21Props) => {
id={field.name} id={field.name}
type="email" type="email"
aria-invalid={fieldState.invalid} aria-invalid={fieldState.invalid}
placeholder="E-Mail*" placeholder="Ihre E-Mail*"
className="h-15 rounded-none border-0 border-b border-b-foreground/25 bg-transparent! shadow-none placeholder:text-foreground/20 focus-visible:ring-0 lg:text-base" className="h-15 rounded-none border-0 border-b border-b-foreground/25 bg-transparent! shadow-none placeholder:text-foreground/20 focus-visible:ring-0 lg:text-base"
/> />
{fieldState.invalid && ( {fieldState.invalid && (
@@ -170,7 +168,7 @@ const Contact21 = ({ className, onSubmit }: Contact21Props) => {
{...field} {...field}
id={field.name} id={field.name}
aria-invalid={fieldState.invalid} aria-invalid={fieldState.invalid}
placeholder="Nachricht (Worum geht es bei Ihrem Projekt?)" placeholder="Nachricht: Worum geht es bei Ihrem Projekt?"
className="h-15 rounded-none border-0 border-b border-b-foreground/25 bg-transparent! shadow-none placeholder:text-foreground/20 focus-visible:ring-0 lg:text-base" className="h-15 rounded-none border-0 border-b border-b-foreground/25 bg-transparent! shadow-none placeholder:text-foreground/20 focus-visible:ring-0 lg:text-base"
/> />
{fieldState.invalid && ( {fieldState.invalid && (
@@ -198,7 +196,7 @@ const Contact21 = ({ className, onSubmit }: Contact21Props) => {
) : ( ) : (
<> <>
<CornerDownRight className="size-5" /> <CornerDownRight className="size-5" />
Unverbindlich anfragen Anfrage senden
</> </>
)} )}
</Button> </Button>

View File

@@ -7,20 +7,16 @@ export default function CTASection() {
<div className="rounded-2xl bg-linear-to-r bg-[url('https://images.unsplash.com/photo-1739785890803-7a2191a37ef5?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D')] bg-cover bg-bottom px-8 py-10 md:px-16 md:py-20"> <div className="rounded-2xl bg-linear-to-r bg-[url('https://images.unsplash.com/photo-1739785890803-7a2191a37ef5?q=80&w=2940&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D')] bg-cover bg-bottom px-8 py-10 md:px-16 md:py-20">
<header className="mb-8 max-w-2xl space-y-4"> <header className="mb-8 max-w-2xl space-y-4">
<h2 className="font-heading text-4xl leading-10 text-black lg:text-4xl"> <h2 className="font-heading text-4xl leading-10 text-black lg:text-4xl">
Lassen Sie uns ueber Ihre neue Website sprechen Jetzt Website anfordern
</h2> </h2>
<p className="text-lg text-black/60"> <p className="text-lg text-black/60">
Ob Neuprojekt oder Redesign: Sie erhalten eine klare Empfehlung Erzählen Sie mir kurz von Ihrem Unternehmen ich melde mich innerhalb von 24 Stunden mit einem unverbindlichen Angebot.
und einen realistischen naechsten Schritt.
</p> </p>
</header> </header>
{/* CTA Buttons */} {/* CTA Buttons */}
<div className="flex flex-wrap gap-4"> <div className="flex flex-wrap gap-4">
<Button size="lg">Unverbindlich anfragen</Button> <Button size="lg">Anfrage senden</Button>
<Button size="lg" variant="secondary">
Erstgespraech vereinbaren
</Button>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -9,29 +9,29 @@ import { cn } from "@/lib/utils";
const faqs = [ const faqs = [
{ {
question: "Wie lange dauert die Umsetzung einer neuen Website?", question: "Wie lange dauert es bis meine Website fertig ist?",
answer: answer:
"Das haengt vom Umfang ab. Nach einem kurzen Erstgespraech erhalten Sie einen klaren Ablauf mit realistischem Zeitrahmen.", "In der Regel ist Ihre Website innerhalb von zwei Wochen fertig — vom ersten Gespräch bis zum Go-Live. Nach der Entwicklung bekommen Sie einen Vorschau-Link, damit Sie alles in Ruhe prüfen können. Erst wenn Sie zufrieden sind, geht die Seite online.",
}, },
{ {
question: "Unterstuetzen Sie auch bei Struktur und Texten?", question: "Was passiert wenn ich das Hosting kündige?",
answer: answer:
"Ja. Ich helfe Ihnen dabei, Inhalte sinnvoll zu ordnen und Texte klar zu formulieren, damit Besucher schnell verstehen, was Sie anbieten.", "Ihre Website und Ihre Domain gehören Ihnen — immer. Wenn Sie das Hosting kündigen, übertrage ich Ihnen alles ohne Wenn und Aber. Keine versteckten Abhängigkeiten, das ist vertraglich festgehalten.",
}, },
{ {
question: "Ist die Website auch auf dem Smartphone optimiert?", question: "Ich habe schon eine Domain — was passiert damit?",
answer: answer:
"Ja. Jede Website wird responsive umgesetzt und auf gaengigen Bildschirmgroessen sauber dargestellt.", "Kein Problem. Wir zeigen Ihre bestehende Domain einfach auf die neue Website um. Falls Sie möchten, kann ich die Domain auch zu mir umziehen — das macht die Verwaltung einfacher, ist aber kein Muss.",
}, },
{ {
question: "Wie laufen Korrekturen und Abstimmungen ab?", question: "Brauche ich technisches Wissen?",
answer: answer:
"Wir stimmen zentrale Punkte frueh ab und arbeiten mit klaren Feedbackrunden, damit der Prozess planbar und effizient bleibt.", "Keins. Sie kümmern Sie um Ihr Geschäft, ich um alles Technische. Von der Domain über die E-Mails bis zu Updates — das liegt bei mir.",
}, },
{ {
question: "Was kostet eine Website fuer mein Unternehmen?", question: "Kümmern Sie sich auch um Impressum und Datenschutz?",
answer: answer:
"Die Kosten richten sich nach Ziel, Seitenumfang und gewuenschten Funktionen. Sie erhalten ein transparentes Angebot statt pauschaler Standardpreise.", "Ja, jede Website die ich baue kommt mit einem rechtssicheren Impressum und einer DSGVO-konformen Datenschutzerklärung. Kein Cookie-Banner-Chaos, kein Abmahnrisiko.",
}, },
]; ];

View File

@@ -49,18 +49,18 @@ const Footer27 = ({ className }: Footer27Props) => {
viewport={{ once: true }} viewport={{ once: true }}
className="flex flex-col justify-between md:flex-row md:items-center" className="flex flex-col justify-between md:flex-row md:items-center"
> >
<div className="space-y-8"> <div className="space-y-8">
<motion.div variants={itemVariants} className="space-y-6"> <motion.div variants={itemVariants} className="space-y-6">
<h2 className="text-4xl leading-tight font-bold text-foreground lg:text-5xl"> <h2 className="text-4xl leading-tight font-bold text-foreground lg:text-5xl">
Bereit fuer einen professionellen Webauftritt? Bereit für eine Website, die Kunden bringt?
</h2> </h2>
<p className="max-w-md text-lg leading-relaxed text-muted-foreground"> <p className="max-w-md text-lg leading-relaxed text-muted-foreground">
Unverbindlich, klar und ohne Verkaufsdruck. Erzählen Sie mir kurz von Ihrem Unternehmen ich melde mich innerhalb von 24 Stunden mit einem unverbindlichen Angebot.
</p> </p>
</motion.div> </motion.div>
<motion.div variants={itemVariants}> <motion.div variants={itemVariants}>
<Button size="lg">Erstgespraech vereinbaren</Button> <Button size="lg">Kostenloses Angebot anfordern</Button>
</motion.div> </motion.div>
</div> </div>
@@ -105,29 +105,36 @@ const Footer27 = ({ className }: Footer27Props) => {
<Separator className="mb-8" /> <Separator className="mb-8" />
</motion.div> </motion.div>
<motion.div <motion.div
variants={itemVariants} variants={itemVariants}
className="flex flex-col items-start justify-between gap-4 sm:flex-row sm:items-center" className="flex flex-col items-start justify-between gap-4 sm:flex-row sm:items-center"
> >
<p className="text-sm text-muted-foreground"> <p className="text-sm text-muted-foreground">
© 2025 Matthias Meister. Alle Rechte vorbehalten. © 2025 Matthias Meister Webdesign Crimmitschau
</p> </p>
<div className="flex items-center gap-6 text-sm"> <div className="flex items-center gap-6 text-sm">
<span className="text-muted-foreground"> <span className="text-muted-foreground">
Website von{" "} Kontakt:{" "}
<motion.a <a href="mailto:info@matthias-meister-webdesign.de" className="underline underline-offset-4 transition-colors hover:text-foreground">
href="#" info@matthias-meister-webdesign.de
className="underline underline-offset-4 transition-colors hover:text-foreground" </a>
whileHover={{ scale: 1.05 }} </span>
transition={{ <span className="text-muted-foreground">
type: "spring", Tel:{" "}
stiffness: 300, <a href="tel:037627984400" className="underline underline-offset-4 transition-colors hover:text-foreground">
damping: 20, 03762 798 4400
}} </a>
> </span>
Matthias Meister <span className="text-muted-foreground">
</motion.a> <a href="/impressum" className="underline underline-offset-4 transition-colors hover:text-foreground">
Impressum
</a>
</span>
<span className="text-muted-foreground">
<a href="/datenschutz" className="underline underline-offset-4 transition-colors hover:text-foreground">
Datenschutz
</a>
</span> </span>
</div> </div>
</motion.div> </motion.div>

View File

@@ -1,4 +1,4 @@
import { ArrowDown, BookOpen, LayoutGrid, Sparkles } from "lucide-react"; import { ArrowDown } from "lucide-react";
import { Button } from "@/components/ui/button"; import { Button } from "@/components/ui/button";
import { cn } from "@/lib/utils"; import { cn } from "@/lib/utils";
@@ -7,27 +7,6 @@ interface Hero235Props {
className?: string; className?: string;
} }
const SERVICES = [
{
icon: Sparkles,
title: "Webdesign mit Klarheit",
description:
"Ein moderner Auftritt, der Ihr Unternehmen auf den ersten Blick professionell wirken laesst.",
},
{
icon: LayoutGrid,
title: "Struktur und Texte",
description:
"Ich unterstuetze bei Seitenstruktur und Inhalten, damit Besucher schnell verstehen, was Sie anbieten.",
},
{
icon: BookOpen,
title: "Pflege und Weiterentwicklung",
description:
"Auf Wunsch betreue ich Ihre Website weiter, halte Inhalte aktuell und passe Details laufend an.",
},
];
const Hero235 = ({ className }: Hero235Props) => { const Hero235 = ({ className }: Hero235Props) => {
return ( return (
<section <section
@@ -60,42 +39,17 @@ const Hero235 = ({ className }: Hero235Props) => {
<div className="flex flex-1 items-center justify-center"> <div className="flex flex-1 items-center justify-center">
<div className="mx-auto flex max-w-4xl flex-col items-center text-center"> <div className="mx-auto flex max-w-4xl flex-col items-center text-center">
<h1 className="text-4xl font-semibold tracking-tight text-balance text-foreground md:text-5xl lg:text-8xl"> <h1 className="text-4xl font-semibold tracking-tight text-balance text-foreground md:text-5xl lg:text-8xl">
Eine moderne Webseite kostet kein Vermögen. Hallo, ich bin Matthias - ich baue Websites, die Kunden bringen.
</h1> </h1>
<p className="mt-8 max-w-xl text-pretty text-muted-foreground md:text-lg"> <p className="mt-8 max-w-xl text-pretty text-muted-foreground md:text-lg">
Ich gestalte klare Unternehmenswebsites, die Vertrauen aufbauen, Moderne, blitzschnelle Auftritte für Handwerker, Friseure und Unternehmen aus der Region. Kein Agentur-Preisschild. Kein Overkill. Einfach eine Website, die funktioniert.
Ihre Leistungen verständlich zeigen und Anfragen einfacher
machen.
</p> </p>
<Button size="lg" className="mt-10"> <Button size="lg" className="mt-10">
Projekt anfragen Kostenloses Angebot
<ArrowDown className="shrink-0" aria-hidden /> <ArrowDown className="shrink-0" aria-hidden />
</Button> </Button>
</div> </div>
</div> </div>
<div className="pt-16">
<div className="grid gap-12 lg:grid-cols-3 lg:gap-0">
{SERVICES.map((service) => {
const Icon = service.icon;
return (
<div
key={service.title}
className={cn(
"flex flex-col border-l border-primary px-6 md:px-8",
)}
>
<Icon className="mb-4 size-6" aria-hidden />
<h2 className="font-semibold text-foreground">
{service.title}
</h2>
<p className="mt-2 text-sm text-muted-foreground">
{service.description}
</p>
</div>
);
})}
</div>
</div>
</div> </div>
</section> </section>
); );

View File

@@ -12,8 +12,8 @@ import { cn } from "@/lib/utils";
interface PricingPlan { interface PricingPlan {
name: string; name: string;
badge: string; badge: string;
monthlyPrice: string; price: string;
yearlyPrice: string; description?: string;
features: string[]; features: string[];
buttonText: string; buttonText: string;
isPopular?: boolean; isPopular?: boolean;
@@ -27,54 +27,57 @@ interface Pricing4Props {
} }
const Pricing4 = ({ const Pricing4 = ({
title = "Pakete für Ihre Unternehmenswebsite", title = "Entwicklungspakete",
description = description =
"Sie wählen den passenden Leistungsumfang. Preise nenne ich transparent im Angebot - abgestimmt auf Ziele, Inhalte und Umfang.", "Alle Websites laufen auf deutschen Servern, sind DSGVO-konform und kommen ohne Cookie-Banner aus. Auf Wunsch erhalten Sie monatlich einen Einblick, wie viele Menschen Ihre Website besuchen haben — und woher sie kommen.",
plans = [ plans = [
{ {
name: "Basis", name: "BASIS",
badge: "Basis", badge: "799 €",
monthlyPrice: "auf Anfrage", price: "799 €",
yearlyPrice: "auf Anfrage",
features: [ features: [
"Bis zu 5 Inhaltsseiten", "Eine Seite, fünf Sektionen",
"Individuelles Design auf Basis Ihres Unternehmensauftritts", "Kontaktformular",
"Kontaktformular und rechtliche Standardseiten", "Impressum & Datenschutz",
"Responsive Umsetzung für alle geraetetypischen Ansichten", "Mobilfreundlich & für Google optimiert",
"DSGVO-konformes Kontaktformular",
"Cookiefreies Analytics — ohne Abmahnrisiko",
], ],
buttonText: "Paket anfragen", buttonText: "Kostenloses Angebot anfordern",
}, },
{ {
name: "Plus", name: "PROFI",
badge: "Plus", badge: "1.499 € ⭐ Empfehlung",
monthlyPrice: "auf Anfrage", price: "1.499 €",
yearlyPrice: "auf Anfrage",
features: [ features: [
"Alles aus Basis plus mehr Seitenumfang", "Bis zu 5 Unterseiten",
"Unterstuetzung bei Struktur und Textfeinschliff", "Google Maps Integration",
"Grundlagen für SEO und schnelle Ladezeiten", "SEO-Basis (bessere Auffindbarkeit bei Google)",
"Korrekturschleifen mit klarer Abstimmung", "Optionaler Blog",
"DSGVO-konformes Kontaktformular",
"Cookiefreies Analytics — ohne Abmahnrisiko",
"Alles aus Basis inklusive",
], ],
buttonText: "Paket anfragen", buttonText: "Kostenloses Angebot anfordern",
},
{
name: "Komplett",
badge: "Komplett",
monthlyPrice: "auf Anfrage",
yearlyPrice: "auf Anfrage",
features: [
"Alles aus Plus plus erweiterte Inhaltsstruktur",
"Priorisierte Abstimmung waehrend der Umsetzung",
"Optionales Pflegepaket für Updates und laufende Anpassungen",
"Technische Basis fuer eine langfristig wartbare Website",
],
buttonText: "Paket anfragen",
isPopular: true, isPopular: true,
}, },
{
name: "MASSARBEIT",
badge: "2.499 €",
price: "2.499 €",
features: [
"Individuelles Design nach Ihren Wünschen",
"CMS — Sie pflegen Inhalte selbst",
"DSGVO-konformes Kontaktformular",
"Cookiefreies Analytics — ohne Abmahnrisiko",
"Alles aus Profi inklusive",
],
buttonText: "Kostenloses Angebot anfordern",
},
], ],
className, className,
}: Pricing4Props) => { }: Pricing4Props) => {
const [isAnnually, setIsAnnually] = useState(false); const [isMonthly, setIsMonthly] = useState(false);
return ( return (
<section className={cn("py-32", className)}> <section className={cn("py-32", className)}>
<div className="container mx-auto"> <div className="container mx-auto">
@@ -87,9 +90,9 @@ const Pricing4 = ({
{description} {description}
</p> </p>
<Tabs <Tabs
value={isAnnually ? "annually" : "monthly"} value={isMonthly ? "monthly" : "yearly"}
onValueChange={(value: string) => onValueChange={(value: string) =>
setIsAnnually(value === "annually") setIsMonthly(value === "monthly")
} }
className="w-fit shrink-0" className="w-fit shrink-0"
aria-label="Leistungsvariante" aria-label="Leistungsvariante"
@@ -99,53 +102,119 @@ const Pricing4 = ({
value="monthly" value="monthly"
className="h-full min-h-0 px-7 py-0 font-semibold text-muted-foreground data-active:text-foreground" className="h-full min-h-0 px-7 py-0 font-semibold text-muted-foreground data-active:text-foreground"
> >
Projekt Entwicklung
</TabsTrigger> </TabsTrigger>
<TabsTrigger <TabsTrigger
value="annually" value="yearly"
className="h-full min-h-0 px-7 py-0 font-semibold text-muted-foreground data-active:text-foreground" className="h-full min-h-0 px-7 py-0 font-semibold text-muted-foreground data-active:text-foreground"
> >
Projekt + Pflege Hosting & Wartung
</TabsTrigger> </TabsTrigger>
</TabsList> </TabsList>
</Tabs> </Tabs>
</div> </div>
<div className="flex w-full flex-col items-stretch gap-6 md:flex-row"> <div className="flex w-full flex-col items-stretch gap-6 md:flex-row">
{plans.map((plan) => ( {isMonthly ? (
<div plans.map((plan) => (
key={plan.name} <div
className={`flex w-full flex-col rounded-xl border shadow-sm p-6 text-left ${ key={plan.name}
plan.isPopular ? "bg-muted" : "" className={`flex w-full flex-col rounded-xl border shadow-sm p-6 text-left ${
}`} plan.isPopular ? "bg-muted" : ""
> }`}
<Badge className="mb-8 block w-fit uppercase"> >
{plan.badge} <Badge className="mb-8 block w-fit uppercase">
</Badge> {plan.badge}
<h3 className="font-mono text-4xl lg:text-5xl"> </Badge>
{isAnnually ? plan.yearlyPrice : plan.monthlyPrice} <h3 className="font-mono text-4xl lg:text-5xl">
</h3> {plan.price}
<p className="text-muted-foreground"> </h3>
{isAnnually <p className="text-muted-foreground">Einmalpreis</p>
? "Variante: Projekt + Pflege" <Separator className="my-6" />
: "Variante: Projekt"} <div className="flex h-full flex-col justify-between gap-20">
</p> <ul className="space-y-4 text-muted-foreground md:leading-snug">
<Separator className="my-6" /> {plan.features.map((feature, featureIndex) => (
<div className="flex h-full flex-col justify-between gap-20"> <li
<ul className="space-y-4 text-muted-foreground md:leading-snug"> key={featureIndex}
{plan.features.map((feature, featureIndex) => ( className="flex items-center gap-2"
<li >
key={featureIndex} <Check className="size-4 shrink-0" aria-hidden="true" />
className="flex items-center gap-2" <span>{feature}</span>
> </li>
<Check className="size-4 shrink-0" aria-hidden="true" /> ))}
<span>{feature}</span> </ul>
</li> <Button className="w-full">{plan.buttonText}</Button>
))} </div>
</ul>
<Button className="w-full">{plan.buttonText}</Button>
</div> </div>
</div> ))
))} ) : (
[
{
name: "BASIC HOSTING",
badge: "19 €/Monat",
price: "19 €",
features: [
"Hosting auf deutschen Servern in Sachsen",
"Grünes Schloss im Browser (SSL) — sicher & von Google bevorzugt",
"Tägliche Backups — Ihre Daten sind immer geschützt",
"Domain inklusive",
"Monatlicher Einblick in Ihre Besucherzahlen",
],
},
{
name: "WARTUNG",
badge: "39 €/Monat ⭐ Empfehlung",
price: "39 €",
features: [
"Alles aus Basic Hosting inklusive",
"Regelmäßige Updates & Sicherheitschecks",
"1 Stunde Support pro Monat",
"Monitoring — ich merke bevor Sie es tun, wenn etwas nicht stimmt",
"Wöchentlicher Einblick in Ihre Besucherzahlen",
],
isPopular: true,
},
{
name: "FULL SERVICE",
badge: "69 €/Monat",
price: "69 €",
features: [
"Alles aus Wartung inklusive",
"Kleinere Inhaltsänderungen (bis 2 Stunden/Monat)",
"Täglicher Einblick in Ihre Besucherzahlen",
],
},
].map((plan) => (
<div
key={plan.name}
className={`flex w-full flex-col rounded-xl border shadow-sm p-6 text-left ${
plan.isPopular ? "bg-muted" : ""
}`}
>
<Badge className="mb-8 block w-fit uppercase">
{plan.badge}
</Badge>
<h3 className="font-mono text-4xl lg:text-5xl">
{plan.price}
</h3>
<p className="text-muted-foreground">Monatlicher Preis</p>
<Separator className="my-6" />
<div className="flex h-full flex-col justify-between gap-20">
<ul className="space-y-4 text-muted-foreground md:leading-snug">
{plan.features.map((feature, featureIndex) => (
<li
key={featureIndex}
className="flex items-center gap-2"
>
<Check className="size-4 shrink-0" aria-hidden="true" />
<span>{feature}</span>
</li>
))}
</ul>
<Button className="w-full">Kostenloses Angebot anfordern</Button>
</div>
</div>
))
)}
</div> </div>
</div> </div>
</div> </div>

View File

@@ -13,12 +13,10 @@ const Stats11 = ({ className }: Stats11Props) => {
<div> <div>
<h2 className="mb-16 max-w-3xl text-3xl leading-10 font-semibold sm:mb-24 md:mx-10"> <h2 className="mb-16 max-w-3xl text-3xl leading-10 font-semibold sm:mb-24 md:mx-10">
Eine gute Unternehmenswebsite braucht keinen Hype, sondern einen Für Google optimiert, schnell geladen und klar kalkulierbar.
klaren Ablauf.
<span className="font-medium text-primary/50"> <span className="font-medium text-primary/50">
{" "} {" "}
Von der Struktur bis zur Veroeffentlichung arbeite ich Genau die Zahlen, die bei einer Website wirklich zählen.
transparent und nachvollziehbar.
</span> </span>
</h2> </h2>
<div className="relative grid max-w-2xl gap-4 border-x border-border pb-32 sm:grid-cols-2 sm:gap-10 sm:pb-44 md:ml-10 md:border-0"> <div className="relative grid max-w-2xl gap-4 border-x border-border pb-32 sm:grid-cols-2 sm:gap-10 sm:pb-44 md:ml-10 md:border-0">
@@ -26,37 +24,37 @@ const Stats11 = ({ className }: Stats11Props) => {
<div className="flex flex-col gap-2"> <div className="flex flex-col gap-2">
<span className="flex gap-5 text-3xl font-semibold"> <span className="flex gap-5 text-3xl font-semibold">
<span className="relative -left-px w-px bg-primary/50"></span> <span className="relative -left-px w-px bg-primary/50"></span>
1 SEO-ready
</span> </span>
<p className="pl-5 font-medium text-muted-foreground/80"> <p className="pl-5 font-medium text-muted-foreground/80">
Ansprechpartner Für Google optimiert
</p> </p>
</div> </div>
<div className="flex flex-col gap-2"> <div className="flex flex-col gap-2">
<span className="flex gap-5 text-3xl font-semibold"> <span className="flex gap-5 text-3xl font-semibold">
<span className="relative -left-px w-px bg-primary/50"></span> <span className="relative -left-px w-px bg-primary/50"></span>
3 {"< 1 Sek."}
</span> </span>
<p className="pl-5 font-medium text-muted-foreground/80"> <p className="pl-5 font-medium text-muted-foreground/80">
Klare Schritte Ladezeit
</p> </p>
</div> </div>
<div className="flex flex-col gap-2"> <div className="flex flex-col gap-2">
<span className="flex gap-5 text-3xl font-semibold"> <span className="flex gap-5 text-3xl font-semibold">
<span className="relative -left-px w-px bg-primary/50"></span> <span className="relative -left-px w-px bg-primary/50"></span>
100 % ab 799
</span> </span>
<p className="pl-5 font-medium text-muted-foreground/80"> <p className="pl-5 font-medium text-muted-foreground/80">
Responsive Transparenter Einmalpreis
</p> </p>
</div> </div>
<div className="flex flex-col gap-2"> <div className="flex flex-col gap-2">
<span className="flex gap-5 text-3xl font-semibold"> <span className="flex gap-5 text-3xl font-semibold">
<span className="relative -left-px w-px bg-primary/50"></span> <span className="relative -left-px w-px bg-primary/50"></span>
Klar 2 Wochen
</span> </span>
<p className="pl-5 font-medium text-muted-foreground/80"> <p className="pl-5 font-medium text-muted-foreground/80">
Angebot und Umfang Bis zum Go-Live
</p> </p>
</div> </div>
</div> </div>

View File

@@ -18,7 +18,7 @@ import "@/styles/global.css";
<link rel="icon" href="/favicon.ico" /> <link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width" /> <meta name="viewport" content="width=device-width" />
<meta name="generator" content={Astro.generator} /> <meta name="generator" content={Astro.generator} />
<title>Webdesign für KMU | Matthias Meister Webdesign</title> <title>Matthias Meister Webdesign | Websites für KMU aus der Region</title>
<script <script
src="https://rybbit.matthias.lol/api/script.js" src="https://rybbit.matthias.lol/api/script.js"
data-site-id="60abc81e438a" data-site-id="60abc81e438a"