Seitentitel und Beschreibung für Abo-, AGB-, Impressum- und 404-Seite
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 <noreply@anthropic.com>
This commit is contained in:
1 parent
f0ae8c0be2
commit
77672b55d3
6 files changed
+82
No files matched your search
@@ -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 = (
|
||||
<div className="my-8 border-t border-border" aria-hidden />
|
||||
);
|
||||
|
||||
const AGB = () => {
|
||||
usePageMeta("AGB", "Allgemeine Geschäftsbedingungen der WEBklar GbR.");
|
||||
|
||||
return (
|
||||
<div className="min-h-screen bg-background">
|
||||
{/* Header */}
|
||||
|
||||
@@ -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 (
|
||||
<div className="min-h-screen bg-background">
|
||||
<header className="fixed top-0 left-0 right-0 z-50 glass-nav py-4">
|
||||
|
||||
@@ -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 = (
|
||||
<div className="my-8 border-t border-border" aria-hidden />
|
||||
);
|
||||
|
||||
const Impressum = () => {
|
||||
usePageMeta("Impressum", "Impressum der WEBklar GbR, Winnweiler.");
|
||||
|
||||
return (
|
||||
<div className="min-h-screen bg-background">
|
||||
{/* Header */}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 (
|
||||
<div className="min-h-screen bg-background">
|
||||
<header className="fixed top-0 left-0 right-0 z-50 glass-nav py-4">
|
||||
|
||||
@@ -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");
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user