feat(260925-bow): Was-ist-neu-Fenster im Portal-Rahmen

- release-notes.ts: reine Auswahl der Versionsabschnitte aus CHANGELOG.md
- release-notice-actions.ts ('use server'): Abruf und Merken ueber die API
- ReleaseNoticeDialog: barrierefreies Fenster, Eintraege ueber ChangelogView (variant plain)
- ReleaseNoticeHost in AppShell: einmal je Seitenladung, merkt erst beim Schliessen
- Texte releaseNotice in de.json und en.json

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-25 08:48:25 +02:00
parent cf7784e409
commit 187fb76c91
8 changed files with 577 additions and 2 deletions
@@ -15,8 +15,19 @@ import { useTheme } from 'next-themes';
* uebereinstimmen (mounted-Guard wie in AppShell). Der Markdown-Text kommt
* als Prop von der Server-Seite; dieses Modul importiert `@/lib/changelog`
* bewusst NICHT, damit der Text nicht in Client-Chunks landet.
*
* quick-260925-bow: `variant="plain"` laesst Rahmen, Hintergrund und
* Innenabstand weg — so rendert das "Was ist neu"-Fenster seine Abschnitte mit
* demselben Renderer wie die Seite /changelog (Vorgabe `card`, Seite
* unveraendert).
*/
export function ChangelogView({ markdown }: { markdown: string }) {
export function ChangelogView({
markdown,
variant = 'card',
}: {
markdown: string;
variant?: 'card' | 'plain';
}) {
const { resolvedTheme } = useTheme();
const [mounted, setMounted] = useState(false);
@@ -27,7 +38,10 @@ export function ChangelogView({ markdown }: { markdown: string }) {
const mode: 'light' | 'dark' = mounted && resolvedTheme === 'dark' ? 'dark' : 'light';
return (
<div data-testid="changelog-markdown" className="rounded-md border border-border bg-card p-4">
<div
data-testid="changelog-markdown"
className={variant === 'card' ? 'rounded-md border border-border bg-card p-4' : undefined}
>
<MDEditor.Markdown
source={markdown}
rehypePlugins={[[rehypeSanitize]]}