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 { Link } from "react-router-dom";
|
||||||
import { Button } from "@/components/ui/button";
|
import { Button } from "@/components/ui/button";
|
||||||
import { ArrowLeft, FileText } from "lucide-react";
|
import { ArrowLeft, FileText } from "lucide-react";
|
||||||
|
import { usePageMeta } from "@/hooks/use-page-meta";
|
||||||
|
|
||||||
const contractDivider = (
|
const contractDivider = (
|
||||||
<div className="my-8 border-t border-border" aria-hidden />
|
<div className="my-8 border-t border-border" aria-hidden />
|
||||||
);
|
);
|
||||||
|
|
||||||
const AGB = () => {
|
const AGB = () => {
|
||||||
|
usePageMeta("AGB", "Allgemeine Geschäftsbedingungen der WEBklar GbR.");
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="min-h-screen bg-background">
|
<div className="min-h-screen bg-background">
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { Link } from "react-router-dom";
|
import { Link } from "react-router-dom";
|
||||||
import { Button } from "@/components/ui/button";
|
import { Button } from "@/components/ui/button";
|
||||||
import { ArrowLeft, Server } from "lucide-react";
|
import { ArrowLeft, Server } from "lucide-react";
|
||||||
|
import { usePageMeta } from "@/hooks/use-page-meta";
|
||||||
|
|
||||||
const PORTAL = "https://project.webklar.com";
|
const PORTAL = "https://project.webklar.com";
|
||||||
const STEUER = "Endpreis, gemäß § 19 UStG ohne Umsatzsteuer";
|
const STEUER = "Endpreis, gemäß § 19 UStG ohne Umsatzsteuer";
|
||||||
@@ -28,6 +29,11 @@ const leistungen = [
|
|||||||
];
|
];
|
||||||
|
|
||||||
const HostingAbo = () => {
|
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 (
|
return (
|
||||||
<div className="min-h-screen bg-background">
|
<div className="min-h-screen bg-background">
|
||||||
<header className="fixed top-0 left-0 right-0 z-50 glass-nav py-4">
|
<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 { Link } from "react-router-dom";
|
||||||
import { Button } from "@/components/ui/button";
|
import { Button } from "@/components/ui/button";
|
||||||
import { ArrowLeft, Scale } from "lucide-react";
|
import { ArrowLeft, Scale } from "lucide-react";
|
||||||
|
import { usePageMeta } from "@/hooks/use-page-meta";
|
||||||
|
|
||||||
const impressumDivider = (
|
const impressumDivider = (
|
||||||
<div className="my-8 border-t border-border" aria-hidden />
|
<div className="my-8 border-t border-border" aria-hidden />
|
||||||
);
|
);
|
||||||
|
|
||||||
const Impressum = () => {
|
const Impressum = () => {
|
||||||
|
usePageMeta("Impressum", "Impressum der WEBklar GbR, Winnweiler.");
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="min-h-screen bg-background">
|
<div className="min-h-screen bg-background">
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
import { Link, useLocation } from "react-router-dom";
|
import { Link, useLocation } from "react-router-dom";
|
||||||
import { useEffect } from "react";
|
import { useEffect } from "react";
|
||||||
|
import { usePageMeta } from "@/hooks/use-page-meta";
|
||||||
|
|
||||||
const NotFound = () => {
|
const NotFound = () => {
|
||||||
const location = useLocation();
|
const location = useLocation();
|
||||||
|
usePageMeta("Seite nicht gefunden");
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
console.error("404 Error: User attempted to access non-existent route:", location.pathname);
|
console.error("404 Error: User attempted to access non-existent route:", location.pathname);
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { Link } from "react-router-dom";
|
import { Link } from "react-router-dom";
|
||||||
import { Button } from "@/components/ui/button";
|
import { Button } from "@/components/ui/button";
|
||||||
import { ArrowLeft, ShieldCheck } from "lucide-react";
|
import { ArrowLeft, ShieldCheck } from "lucide-react";
|
||||||
|
import { usePageMeta } from "@/hooks/use-page-meta";
|
||||||
|
|
||||||
const PORTAL = "https://project.webklar.com";
|
const PORTAL = "https://project.webklar.com";
|
||||||
const STEUER = "Endpreis, gemäß § 19 UStG ohne Umsatzsteuer";
|
const STEUER = "Endpreis, gemäß § 19 UStG ohne Umsatzsteuer";
|
||||||
@@ -28,6 +29,11 @@ const leistungen = [
|
|||||||
];
|
];
|
||||||
|
|
||||||
const WartungsAbo = () => {
|
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 (
|
return (
|
||||||
<div className="min-h-screen bg-background">
|
<div className="min-h-screen bg-background">
|
||||||
<header className="fixed top-0 left-0 right-0 z-50 glass-nav py-4">
|
<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");
|
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