/** * WEB-3: Lokale Vorschau der öffentlichen Webseite (/webseite/vorschau). * * Zeigt die vom Backend live gerenderte Seite (GET /api/preview/…) in einem * iframe — exakt das HTML/CSS, das später veröffentlicht wird. Navigation * INNERHALB der Vorschau funktioniert über die relativen Links der * gerenderten Seite selbst; zusätzlich gibt es einen Seiten-Wechsler, * einen Smartphone/Desktop-Umschalter und „Neu laden“. * Nur veröffentlichte Seiten werden gerendert (SiteRenderer überspringt * Entwürfe) — der Hinweis dazu steht über der Vorschau. * Veröffentlichen selbst ist WEB-2 (gated) — hier gibt es bewusst keinen * Publish-Knopf. */ import { useMemo, useState } from 'react' import { Link, useSearchParams } from 'react-router-dom' import { de } from '../strings/de' import { listPages, previewUrl } from '../api/pages' import { useApi } from '../hooks/useApi' import './webseiteVorschau.css' type Viewport = 'phone' | 'desktop' export default function WebseiteVorschauPage() { const t = de.pages.webseite.vorschau const [params] = useSearchParams() const pages = useApi(() => listPages(), []) const published = useMemo( () => (pages.data ?? []).filter((p) => p.status === 'Published'), [pages.data], ) const requested = params.get('seite') const [selected, setSelected] = useState(requested) const slug = (selected && published.some((p) => p.slug === selected) ? selected : null) ?? (published.some((p) => p.slug === 'start') ? 'start' : (published[0]?.slug ?? null)) const [viewport, setViewport] = useState('phone') const [reloadKey, setReloadKey] = useState(0) if (pages.loading) return

{de.common.loading}

if (pages.error) { return (

{t.title}

{pages.error}
) } return (

{t.title}

{t.intro}

{de.pages.webseite.back}
{slug === null ? (

{t.empty}

) : ( <>