feat(privat/CV): sync to latest upstream (cv-upstream/main, 30f9608b)

This commit is contained in:
2026-07-07 15:20:55 +02:00
parent 8ac664d33d
commit a4efabbc60
417 changed files with 48564 additions and 712 deletions
@@ -0,0 +1,32 @@
import React from 'react'
import { useParams, Link } from 'react-router-dom'
import { useContentItem } from '../hooks/useContent'
import { formatDate } from '../utils/formatDate'
export default function KniepunktIssue() {
const { slug } = useParams()
const issue = useContentItem('kniepunkt', slug)
if (!issue) {
return (
<main style={{ paddingTop: '120px', minHeight: '100vh' }}>
<div className="app-container" style={{ textAlign: 'center' }}>
<h1>Ausgabe nicht gefunden</h1>
<p style={{ color: 'var(--text-secondary)' }}>Diese Kniepunkt-Ausgabe existiert nicht.</p>
<Link to="/kniepunkt" className="secondary-button">Zurück zur Übersicht</Link>
</div>
</main>
)
}
return (
<main style={{ paddingTop: '120px', minHeight: '100vh' }}>
<div className="app-container" style={{ maxWidth: '700px' }}>
<Link to="/kniepunkt" style={{ color: 'var(--text-secondary)', fontSize: '0.9rem', marginBottom: '24px', display: 'inline-block' }}>&larr; Alle Ausgaben</Link>
<h1 style={{ marginBottom: '12px' }}>{issue.title}</h1>
<p style={{ color: 'var(--text-secondary)', marginBottom: '40px' }}>{formatDate(issue.date)}</p>
<div className="content-body" dangerouslySetInnerHTML={{ __html: issue.body }} />
</div>
</main>
)
}