syncova-policies/components/site-footer.tsx
Weapie 0134dd6db4
All checks were successful
Container-Image bauen und veröffentlichen / build-and-push (push) Successful in 1m33s
alangu.de fuer die Gebaerdensprach-Einbindung freigeben
Der Player wird als iframe eingebunden, aber nicht als rohes HTML aus dem
Textfeld: Die Anwendung setzt die Attribute, im Admin steht nur die
Adresse. Damit laesst sich ueber das Feld nichts anderes einschleusen.

Freigegeben ist alangu.de samt Unterdomains, sonst nichts. Die Pruefung
haengt am Hostnamen, nicht an einem Textvergleich - getestet mit
boese-alangu.de.angreifer.example und evil.example/?a=alangu.de, beide
werden abgewiesen, ebenso http statt https.

Vom uebergebenen Einbettungscode weggelassen: accelerometer und
gyroscope. Ein Videoplayer braucht keine Bewegungssensoren.

Ausserdem: Die Gebaerdensprach-Seite erscheint jetzt auch ohne Text,
wenn eine Videoadresse hinterlegt ist - dort ist das Video der Inhalt.
Fusszeile und Seite entscheiden das ueber dieselbe Funktion, sonst gaebe
es eine erreichbare Seite ohne Link.

Geprueft am echten Player: laedt mit HTTP 200 samt CSS, JS und hls.js,
axe-core meldet in hell und dunkel keine Verstoesse, der Rahmen ist per
Tastatur erreichbar, und die Fusszeile verlinkt die Seite.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-08 16:28:41 +02:00

46 lines
1.6 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import Link from "next/link"
import { appName } from "@/lib/app-config"
import { SITE_PAGES, SITE_PAGE_META, hasSitePageContent } from "@/lib/site-pages"
import { readSitePages } from "@/lib/site-pages.server"
/**
* Fußzeile der öffentlichen Seiten mit den rechtlichen Pflichtangaben.
*
* Serverseitig gerendert: Das Impressum muss unmittelbar erreichbar sein, also
* auch ohne JavaScript im Dokument stehen. Verlinkt wird nur, was im Admin
* gepflegt ist – ein Link auf eine leere Impressumsseite wäre schlechter als
* gar keiner.
*/
export async function SiteFooter() {
const pages = await readSitePages()
const links = SITE_PAGES.filter((key) => hasSitePageContent(pages, key))
return (
<footer className="mt-12 border-t">
<div className="mx-auto flex max-w-5xl flex-col gap-3 px-4 py-6 text-sm text-muted-foreground sm:flex-row sm:items-center sm:justify-between sm:px-6">
<span>
© {new Date().getFullYear()} {appName()}
</span>
{links.length > 0 && (
<nav aria-label="Rechtliche Hinweise">
<ul className="flex flex-wrap items-center gap-x-5 gap-y-2">
{links.map((key) => (
<li key={key}>
<Link
href={SITE_PAGE_META[key].path}
className="underline-offset-4 hover:text-foreground hover:underline"
>
{SITE_PAGE_META[key].title}
</Link>
</li>
))}
</ul>
</nav>
)}
</div>
</footer>
)
}