From 77672b55d33d96c326009f775eee4eaee84a6d79 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 1 Oct 2026 10:42:43 +0000 Subject: [PATCH] =?UTF-8?q?Seitentitel=20und=20Beschreibung=20f=C3=BCr=20A?= =?UTF-8?q?bo-,=20AGB-,=20Impressum-=20und=20404-Seite?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit usePageMeta setzt jetzt auch auf /wartungs-abo, /hosting-abo, /agb, /impressum und der 404-Seite Titel (Wartungs-Abo, Hosting-Abo, AGB, Impressum, Seite nicht gefunden; der Hook ergänzt " | WEBklar") und Beschreibung. Die Abo-Beschreibungen nennen nur Preis, Mindestlaufzeit und Leistungen, die auf der jeweiligen Seite stehen; Impressum nennt Winnweiler wie die Seite selbst. Die 404-Seite behält die Standardbeschreibung. Co-Authored-By: Claude Sonnet 5.5 --- src/pages/AGB.tsx | 3 ++ src/pages/HostingAbo.tsx | 6 ++++ src/pages/Impressum.tsx | 3 ++ src/pages/NotFound.tsx | 2 ++ src/pages/WartungsAbo.tsx | 6 ++++ src/test/sofort-paket.test.tsx | 62 ++++++++++++++++++++++++++++++++++ 6 files changed, 82 insertions(+) diff --git a/src/pages/AGB.tsx b/src/pages/AGB.tsx index 6be0925..7e1b4a2 100644 --- a/src/pages/AGB.tsx +++ b/src/pages/AGB.tsx @@ -1,12 +1,15 @@ import { Link } from "react-router-dom"; import { Button } from "@/components/ui/button"; import { ArrowLeft, FileText } from "lucide-react"; +import { usePageMeta } from "@/hooks/use-page-meta"; const contractDivider = (
); const AGB = () => { + usePageMeta("AGB", "Allgemeine Geschäftsbedingungen der WEBklar GbR."); + return (
{/* Header */} diff --git a/src/pages/HostingAbo.tsx b/src/pages/HostingAbo.tsx index 34ff91a..5c2f8fb 100644 --- a/src/pages/HostingAbo.tsx +++ b/src/pages/HostingAbo.tsx @@ -1,6 +1,7 @@ import { Link } from "react-router-dom"; import { Button } from "@/components/ui/button"; import { ArrowLeft, Server } from "lucide-react"; +import { usePageMeta } from "@/hooks/use-page-meta"; const PORTAL = "https://project.webklar.com"; const STEUER = "Endpreis, gemäß § 19 UStG ohne Umsatzsteuer"; @@ -28,6 +29,11 @@ const leistungen = [ ]; const HostingAbo = () => { + usePageMeta( + "Hosting-Abo", + "Ihre statische Website auf unserem Server in Deutschland: 20,00 € pro Monat, 12 Monate Mindestlaufzeit. Inklusive Domain und E-Mail-Postfach." + ); + return (
diff --git a/src/pages/Impressum.tsx b/src/pages/Impressum.tsx index 7bda1e1..7c95810 100644 --- a/src/pages/Impressum.tsx +++ b/src/pages/Impressum.tsx @@ -1,12 +1,15 @@ import { Link } from "react-router-dom"; import { Button } from "@/components/ui/button"; import { ArrowLeft, Scale } from "lucide-react"; +import { usePageMeta } from "@/hooks/use-page-meta"; const impressumDivider = (
); const Impressum = () => { + usePageMeta("Impressum", "Impressum der WEBklar GbR, Winnweiler."); + return (
{/* Header */} diff --git a/src/pages/NotFound.tsx b/src/pages/NotFound.tsx index ee6c9f3..19c58cb 100644 --- a/src/pages/NotFound.tsx +++ b/src/pages/NotFound.tsx @@ -1,8 +1,10 @@ import { Link, useLocation } from "react-router-dom"; import { useEffect } from "react"; +import { usePageMeta } from "@/hooks/use-page-meta"; const NotFound = () => { const location = useLocation(); + usePageMeta("Seite nicht gefunden"); useEffect(() => { console.error("404 Error: User attempted to access non-existent route:", location.pathname); diff --git a/src/pages/WartungsAbo.tsx b/src/pages/WartungsAbo.tsx index dcad046..cba2b30 100644 --- a/src/pages/WartungsAbo.tsx +++ b/src/pages/WartungsAbo.tsx @@ -1,6 +1,7 @@ import { Link } from "react-router-dom"; import { Button } from "@/components/ui/button"; import { ArrowLeft, ShieldCheck } from "lucide-react"; +import { usePageMeta } from "@/hooks/use-page-meta"; const PORTAL = "https://project.webklar.com"; const STEUER = "Endpreis, gemäß § 19 UStG ohne Umsatzsteuer"; @@ -28,6 +29,11 @@ const leistungen = [ ]; const WartungsAbo = () => { + usePageMeta( + "Wartungs-Abo", + "Betrieb, Pflege und Betreuung Ihrer Website: 50,00 € pro Monat, 12 Monate Mindestlaufzeit. Mit Domain, Postfächern und 1 Stunde Arbeitszeit pro Monat." + ); + return (
diff --git a/src/test/sofort-paket.test.tsx b/src/test/sofort-paket.test.tsx index 08e71de..c0ed658 100644 --- a/src/test/sofort-paket.test.tsx +++ b/src/test/sofort-paket.test.tsx @@ -388,3 +388,65 @@ describe("C2 Datenschutzhinweis am Kontaktformular", () => { expect(screen.getByRole("link", { name: "Datenschutzerklärung" })).toHaveClass("text-foreground", "underline"); }); }); + +describe("C3 Seitentitel und Beschreibung der Unterseiten", () => { + // Beschreibungen nur aus Fakten, die auf der jeweiligen Seite stehen (Preis, Mindestlaufzeit, Leistungen). + const FAELLE: { pfad: string; titel: string; beschreibung: string; auf_der_seite: string[] }[] = [ + { + pfad: "/wartungs-abo", + titel: "Wartungs-Abo | WEBklar", + beschreibung: + "Betrieb, Pflege und Betreuung Ihrer Website: 50,00 € pro Monat, 12 Monate Mindestlaufzeit. Mit Domain, Postfächern und 1 Stunde Arbeitszeit pro Monat.", + auf_der_seite: [ + "Betrieb, Pflege und Betreuung Ihrer Website", + "50,00 € pro Monat", + "12 Monate Mindestlaufzeit", + "1 Domain inklusive", + "Postfächer", + "1 Stunde Arbeitszeit pro Monat", + ], + }, + { + pfad: "/hosting-abo", + titel: "Hosting-Abo | WEBklar", + beschreibung: + "Ihre statische Website auf unserem Server in Deutschland: 20,00 € pro Monat, 12 Monate Mindestlaufzeit. Inklusive Domain und E-Mail-Postfach.", + auf_der_seite: [ + "Ihre statische Website auf unserem Server in Deutschland: 20,00 € pro Monat, 12 Monate Mindestlaufzeit.", + "1 Domain inklusive", + "1 E-Mail-Postfach", + ], + }, + { + pfad: "/agb", + titel: "AGB | WEBklar", + beschreibung: "Allgemeine Geschäftsbedingungen der WEBklar GbR.", + auf_der_seite: [], + }, + { + pfad: "/impressum", + titel: "Impressum | WEBklar", + beschreibung: "Impressum der WEBklar GbR, Winnweiler.", + auf_der_seite: ["WEBklar GbR", "67722 Winnweiler"], + }, + ]; + + it.each(FAELLE)("$pfad setzt Titel und Beschreibung", ({ pfad, titel, beschreibung }) => { + seite(pfad); + expect(document.title).toBe(titel); + expect(meta("description")).toBe(beschreibung); + expect(beschreibung.length).toBeLessThanOrEqual(160); + }); + + it.each(FAELLE)("$pfad: jede Aussage der Beschreibung steht auch auf der Seite", ({ pfad, auf_der_seite }) => { + seite(pfad); + const text = (document.body.textContent ?? "").replace(/\s+/g, " "); + for (const fakt of auf_der_seite) expect(text).toContain(fakt); + }); + + it("die 404-Seite setzt den Titel »Seite nicht gefunden«", () => { + vi.spyOn(console, "error").mockImplementation(() => {}); + seite("/gibt-es-nicht"); + expect(document.title).toBe("Seite nicht gefunden | WEBklar"); + }); +});