Feedback round 2: dashes, status, nav, jury chair, content fixes

- Global em-dash to en-dash for consistency (#7/#8)
- Headline "Ihr Weg zum Preis" (#31), heading "Partner & Sponsoren" (#12)
- Hero status badge "Bewerbungsphase 2026 geschlossen" (#138)
- Slimmed navigation sub-items (#163)
- Prominent Jury-Vorsitz area + larger jury cards + role-split note (#180/#186/#179)
- Netzwerk desktop stat fix (Mehrstufig), About fee wording fix

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Sebastian Pachon
2026-06-05 13:40:19 +02:00
parent 9c75d44165
commit 6a50fe4be0
22 changed files with 225 additions and 186 deletions

View File

@@ -72,7 +72,7 @@ export default function TestimonialsSection() {
{/* ── DESKTOP ── */}
{!isMobile && (
<div style={{ display: 'grid', gridTemplateColumns: '42% 58%', height: 560, position: 'relative', zIndex: 1 }}>
{/* Left — portrait photo */}
{/* Left – portrait photo */}
<div style={{ position: 'relative', overflow: 'hidden', height: isMobile ? 280 : 'auto' }}>
<img
key={t.img}
@@ -83,7 +83,7 @@ export default function TestimonialsSection() {
<div style={{ position: 'absolute', inset: 0, background: isMobile ? 'linear-gradient(to bottom, transparent 70%, #fff 100%)' : 'linear-gradient(to right, transparent 60%, #fff 100%)' }} />
</div>
{/* Right — quote */}
{/* Right – quote */}
<div style={{ padding: isMobile ? '40px 22px 56px' : '80px 72px 80px 56px', display: 'flex', flexDirection: 'column', justifyContent: 'center' }}>
<span style={{ fontFamily: FF, fontSize: 10, color: '#4A8FC9', textTransform: 'uppercase', letterSpacing: '0.3em', fontWeight: 700, display: 'block', marginBottom: 14 }}>Stimmen der Preisträger</span>

View File

@@ -32,10 +32,10 @@ export default function WegZurAuszeichnungSection() {
<div style={{ marginBottom: 36 }}>
<span style={{ fontFamily: FF, fontSize: 10, color: '#4A8FC9', textTransform: 'uppercase', letterSpacing: '0.32em', fontWeight: 700, display: 'block', marginBottom: 12 }}>Schritt für Schritt</span>
<h2 style={{ fontFamily: FF, fontSize: 'clamp(1.9rem, 8vw, 2.6rem)', fontWeight: 900, color: '#fff', textTransform: 'uppercase', letterSpacing: '-0.025em', lineHeight: 1.05, margin: '0 0 16px' }}>
IHR WEG ZUR<br />AUSZEICHNUNG.
IHR WEG ZUM<br />PREIS.
</h2>
<p style={{ fontFamily: FB, fontSize: 15, color: 'rgba(255,255,255,0.65)', lineHeight: 1.7, margin: 0 }}>
Von der Einreichung bis zur Gala — vier klar definierte Schritte auf dem Weg zur höchsten Auszeichnung des bayerischen Mittelstands.
Von der Einreichung bis zur Gala – vier klar definierte Schritte auf dem Weg zur höchsten Auszeichnung des bayerischen Mittelstands.
</p>
</div>
@@ -86,15 +86,15 @@ export default function WegZurAuszeichnungSection() {
<div>
<span style={{ fontFamily: FF, fontSize: 10, color: '#4A8FC9', textTransform: 'uppercase', letterSpacing: '0.32em', fontWeight: 700, display: 'block', marginBottom: 14 }}>Schritt für Schritt</span>
<h2 style={{ fontFamily: FF, fontSize: 'clamp(1.8rem, 3vw, 2.8rem)', fontWeight: 900, color: '#fff', textTransform: 'uppercase', letterSpacing: '-0.025em', lineHeight: 1.03, margin: 0 }}>
IHR WEG ZUR<br />AUSZEICHNUNG.
IHR WEG ZUM<br />PREIS.
</h2>
</div>
<p style={{ fontFamily: FB, fontSize: 14, color: 'rgba(255,255,255,0.65)', lineHeight: 1.8, margin: 0 }}>
Von der Einreichung bis zur Gala — vier klar definierte Schritte auf dem Weg zur höchsten Auszeichnung des bayerischen Mittelstands.
Von der Einreichung bis zur Gala – vier klar definierte Schritte auf dem Weg zur höchsten Auszeichnung des bayerischen Mittelstands.
</p>
</div>
{/* Scroll hint — prominent */}
{/* Scroll hint – prominent */}
<div style={{ padding: '20px 80px', display: 'flex', alignItems: 'center', gap: 14, flexShrink: 0 }}>
{/* Animated chevron stack */}
<div style={{ display: 'flex', flexDirection: 'column', gap: 2 }}>

View File

@@ -74,7 +74,7 @@ function saveElementEdits(e: Record<string, ElementEdit>) {
try { localStorage.setItem(LS_ELEMENT, JSON.stringify(e)); } catch {}
}
// Archived = set of storage keys the user has "binned" — CSS stays active
// Archived = set of storage keys the user has "binned" – CSS stays active
function loadArchived(): Set<string> {
try { return new Set(JSON.parse(localStorage.getItem(LS_ARCHIVED) || '[]')); } catch { return new Set(); }
}
@@ -108,7 +108,7 @@ function saveSaveCount(n: number) {
}
// ---------------------------------------------------------------------------
// CSS builders (backup stylesheet — primary persistence is via setProperty)
// CSS builders (backup stylesheet – primary persistence is via setProperty)
// ---------------------------------------------------------------------------
/** Build CSS only for edits that belong to `forPathname` */
@@ -159,7 +159,7 @@ function injectCSS(id: string, css: string) {
}
// ---------------------------------------------------------------------------
// Apply element edit directly via setProperty — survives React re-renders
// Apply element edit directly via setProperty – survives React re-renders
// because inline !important beats React's non-!important inline style updates
// ---------------------------------------------------------------------------
@@ -209,7 +209,7 @@ function reapplyAllElementEdits(edits: Record<string, ElementEdit>, pathname: st
}
// ---------------------------------------------------------------------------
// Selectors — always include the current route so edits are page-isolated
// Selectors – always include the current route so edits are page-isolated
// ---------------------------------------------------------------------------
function getSectionSelector(section: HTMLElement, pathname: string): string {
@@ -383,7 +383,7 @@ function SmallInput({ label, value, onChange, placeholder }: { label: string; va
}
// ---------------------------------------------------------------------------
// Element popup — full editor with live preview
// Element popup – full editor with live preview
// ---------------------------------------------------------------------------
const FONT_WEIGHTS = [
@@ -419,7 +419,7 @@ function ElementPopup({
const set = <K extends keyof ElementEdit>(key: K, val: ElementEdit[K]) =>
setProps(p => ({ ...p, [key]: val }));
// ── LIVE PREVIEW — apply every prop change directly to the element ──────
// ── LIVE PREVIEW – apply every prop change directly to the element ──────
useEffect(() => {
applyEditToElement(popup.el, props);
if (props.text !== undefined) popup.el.innerText = props.text;
@@ -502,7 +502,7 @@ function ElementPopup({
onChange={e => set('fontFamily', e.target.value)}
style={{ fontFamily: FONT, fontSize: 11, color: '#fff', background: '#0D1540', border: '1px solid rgba(255,255,255,0.12)', padding: '7px 8px', width: '100%', outline: 'none', cursor: 'pointer' }}
>
<option value="">— unverändert —</option>
<option value="">– unverändert –</option>
{FONT_FAMILIES.map(f => (
<option key={f.value} value={f.value}>{f.label}</option>
))}
@@ -619,20 +619,20 @@ export default function LayoutEditor() {
const [editMode, setEditMode] = useState(false);
const [editTarget, setEditTarget] = useState<EditTarget>('section');
// — Module state —
// – Module state –
const [savedModules, setSavedModules] = useState<ModuleEdits>(() => loadModuleEdits());
const [selSel, setSelSel] = useState('');
const [preview, setPreview] = useState<ModuleEdit>({});
// — Element state —
// – Element state –
const [savedElements, setSavedElements] = useState<Record<string, ElementEdit>>(() => loadElementEdits());
const [popup, setPopup] = useState<PopupState | null>(null);
// — Bin (archived keys — CSS still active, hidden from main list) —
// – Bin (archived keys – CSS still active, hidden from main list) –
const [archived, setArchived] = useState<Set<string>>(() => loadArchived());
const [binOpen, setBinOpen] = useState(false);
// — Batch / archive state —
// – Batch / archive state –
const [batches, setBatches] = useState<Batch[]>(() => loadBatches());
const [saveCount, setSaveCount] = useState<number>(() => loadSaveCount());
const [expandedBatch, setExpandedBatch] = useState<number | null>(null);
@@ -705,7 +705,7 @@ export default function LayoutEditor() {
return;
}
// Element mode — open popup for the clicked element
// Element mode – open popup for the clicked element
const sel = getElementSelector(target, location.pathname);
const originalStyle = target.getAttribute('style') || '';
setPopup({ x: e.clientX + 14, y: e.clientY + 14, el: target, sel, originalStyle });
@@ -964,7 +964,7 @@ export default function LayoutEditor() {
</div>
)}
{/* Saved modules list — active (not binned) */}
{/* Saved modules list – active (not binned) */}
{activeModuleKeys.length > 0 && (
<div style={{ padding: '12px 18px', borderBottom: '1px solid rgba(255,255,255,0.08)' }}>
<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 8 }}>
@@ -987,7 +987,7 @@ export default function LayoutEditor() {
</div>
)}
{/* Saved elements list — active (not binned) */}
{/* Saved elements list – active (not binned) */}
{activeElementKeys.length > 0 && (
<div style={{ padding: '12px 18px', borderBottom: '1px solid rgba(255,255,255,0.08)' }}>
<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 8 }}>
@@ -1032,7 +1032,7 @@ export default function LayoutEditor() {
{binOpen && (
<div style={{ padding: '0 18px 12px' }}>
<div style={{ fontSize: 9, color: 'rgba(255,255,255,0.2)', marginBottom: 8, lineHeight: 1.5 }}>
Änderungen sind weiterhin aktiv — nur aus der Hauptliste ausgeblendet.
Änderungen sind weiterhin aktiv – nur aus der Hauptliste ausgeblendet.
</div>
{binKeys.map(key => {
const isMod = key in savedModules;
@@ -1130,7 +1130,7 @@ export default function LayoutEditor() {
{/* Footer */}
<div style={{ marginTop: 'auto', padding: '10px 18px', borderTop: '1px solid rgba(255,255,255,0.06)', fontSize: 9, color: 'rgba(255,255,255,0.12)', textAlign: 'center' }}>
BMP Layout Editor — Dev Only
BMP Layout Editor – Dev Only
</div>
</div>
)}

View File

@@ -545,7 +545,7 @@ export default function BewerbungsForm({ theme = 'dark' }: { theme?: 'dark' | 'g
{[
{ label: 'Unternehmen', value: data.nomFirma },
{ label: 'Branche', value: data.nomBranche },
{ label: 'Standort', value: data.nomStandort || '—' },
{ label: 'Standort', value: data.nomStandort || '–' },
{ label: 'Nominiert von',value: `${data.nomName} · ${data.nomEmail}` },
].map(row => (
<div key={row.label} style={{ display: 'grid', gridTemplateColumns: '100px 1fr', gap: 12, padding: '10px 0', borderBottom: `1px solid ${c.border}`, alignItems: 'baseline' }}>

View File

@@ -100,8 +100,8 @@ const STEPS = [
];
const PAKETE = [
{ value: 'main', title: 'Haupt-Sponsoring', desc: 'Maximale Sichtbarkeit auf allen Kanälen — Bühne, Digital, Print.' },
{ value: 'category', title: 'Kategorie-Partner', desc: 'Namensgebung einer Auszeichnungskategorie — fokussiertes Branding.' },
{ value: 'main', title: 'Haupt-Sponsoring', desc: 'Maximale Sichtbarkeit auf allen Kanälen – Bühne, Digital, Print.' },
{ value: 'category', title: 'Kategorie-Partner', desc: 'Namensgebung einer Auszeichnungskategorie – fokussiertes Branding.' },
{ value: 'event', title: 'Event-Partner', desc: 'Präsenz beim exklusiven Gala-Abend in München.' },
];
@@ -253,7 +253,7 @@ export default function SponsoringForm({ theme = 'dark' }: { theme?: 'dark' | 'g
{step === 0 && (
<div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>
<div>
<p style={{ fontFamily: FF, fontSize: 10, color: c.accentLabel, textTransform: 'uppercase', letterSpacing: '0.25em', fontWeight: 700, marginBottom: 6 }}>Schritt 1 — Paket wählen</p>
<p style={{ fontFamily: FF, fontSize: 10, color: c.accentLabel, textTransform: 'uppercase', letterSpacing: '0.25em', fontWeight: 700, marginBottom: 6 }}>Schritt 1 – Paket wählen</p>
<h3 style={{ fontFamily: FF, fontSize: 18, fontWeight: 900, color: c.heading, textTransform: 'uppercase', letterSpacing: '-0.01em', marginBottom: 12 }}>Interesse an</h3>
</div>
<div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>
@@ -268,7 +268,7 @@ export default function SponsoringForm({ theme = 'dark' }: { theme?: 'dark' | 'g
{step === 1 && (
<div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>
<div>
<p style={{ fontFamily: FF, fontSize: 10, color: c.accentLabel, textTransform: 'uppercase', letterSpacing: '0.25em', fontWeight: 700, marginBottom: 8 }}>Schritt 2 — Unternehmen</p>
<p style={{ fontFamily: FF, fontSize: 10, color: c.accentLabel, textTransform: 'uppercase', letterSpacing: '0.25em', fontWeight: 700, marginBottom: 8 }}>Schritt 2 – Unternehmen</p>
<h3 style={{ fontFamily: FF, fontSize: 18, fontWeight: 900, color: c.heading, textTransform: 'uppercase', letterSpacing: '-0.01em' }}>Ihr Unternehmen</h3>
</div>
<Field c={c} label="Unternehmen *" error={errors.unternehmen}>
@@ -283,7 +283,7 @@ export default function SponsoringForm({ theme = 'dark' }: { theme?: 'dark' | 'g
{step === 2 && (
<div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>
<div>
<p style={{ fontFamily: FF, fontSize: 10, color: c.accentLabel, textTransform: 'uppercase', letterSpacing: '0.25em', fontWeight: 700, marginBottom: 8 }}>Schritt 3 — Kontakt</p>
<p style={{ fontFamily: FF, fontSize: 10, color: c.accentLabel, textTransform: 'uppercase', letterSpacing: '0.25em', fontWeight: 700, marginBottom: 8 }}>Schritt 3 – Kontakt</p>
<h3 style={{ fontFamily: FF, fontSize: 18, fontWeight: 900, color: c.heading, textTransform: 'uppercase', letterSpacing: '-0.01em' }}>Ansprechpartner</h3>
</div>
<Field c={c} label="Ansprechpartner *" error={errors.kontakt}>

View File

@@ -29,19 +29,14 @@ const NAV: NavItem[] = [
sub: [
{ label: 'Alle Preisträger:innen', path: '/preistraeger' },
{ label: 'Sieger & Aufsteiger 2025', path: '/preistraeger' },
{ label: 'Preisträger 2024', path: '/preistraeger' },
{ label: 'Preisträger 2023', path: '/preistraeger' },
{ label: 'Preisträger-Detail →', path: '/preistraeger' },
],
},
{
key: 'teilnahme', label: 'Ihr Weg zum Preis', path: '/teilnahme',
subLabel: 'IHR WEG ZUM PREIS',
sub: [
{ label: 'Die 4 Schritte zum Preis', path: '/teilnahme#schritte' },
{ label: 'Teilnahmevoraussetzungen', path: '/teilnahme#voraussetzungen' },
{ label: 'Kriterien & Bewertung', path: '/teilnahme#kriterien' },
{ label: 'Vorschlag unterbreiten', path: '/teilnahme#bewerben' },
{ label: 'Fristen & Termine', path: '/teilnahme#fristen' },
{ label: 'Bewerbungsformular', path: '/teilnahme#bewerben' },
],
@@ -53,30 +48,24 @@ const NAV: NavItem[] = [
{ label: 'Was ist der Preis?', path: '/der-bmp#was-ist' },
{ label: 'Geschichte & Werte', path: '/der-bmp#geschichte' },
{ label: 'Vorteile der Auszeichnung', path: '/der-bmp#vorteile' },
{ label: 'Bayerischer Mittelstand', path: '/der-bmp#mittelstand' },
{ label: 'Jetzt bewerben →', path: '/teilnahme' },
],
},
{
key: 'netzwerk', label: 'Netzwerk', path: '/netzwerk',
subLabel: 'NETZWERK',
sub: [
{ label: 'Das Netzwerk', path: '/netzwerk' },
{ label: 'Jury-Mitglieder', path: '/netzwerk#jury' },
{ label: 'Partner & Sponsoren', path: '/netzwerk#partner' },
{ label: 'Schirmherrschaft', path: '/netzwerk#schirmherrschaft' },
{ label: 'Mitglied werden', path: '/mitglied-werden' },
{ label: 'Sponsoring-Anfrage →', path: '/netzwerk#sponsoring' },
],
},
{
key: 'presse', label: 'Presse', path: '/presse',
subLabel: 'PRESSE',
sub: [
{ label: 'Aktuelles & News', path: '/presse' },
{ label: 'Events & Gala', path: '/presse#events' },
{ label: 'Downloads & Impressionen', path: '/presse#downloads' },
{ label: 'Pressekontakt →', path: '/kontakt' },
],
},
];
@@ -184,7 +173,7 @@ const Layout: React.FC<LayoutProps> = ({ children }) => {
return () => clearTimeout(t);
}, []);
// Hide floating CTA when the form section (#bewerben) is in view — homepage only
// Hide floating CTA when the form section (#bewerben) is in view – homepage only
useEffect(() => {
setFormVisible(false);
if (location.pathname !== '/') return;
@@ -217,7 +206,7 @@ const Layout: React.FC<LayoutProps> = ({ children }) => {
{/* ═══════════════════════════════════════════════════════════ */}
{/* ══ DESKTOP CHROME (≥768px) — original top bar + overlay ══ */}
{/* ══ DESKTOP CHROME (≥768px) – original top bar + overlay ══ */}
{/* ═══════════════════════════════════════════════════════════ */}
{!isMobile && (
<>
@@ -231,7 +220,7 @@ const Layout: React.FC<LayoutProps> = ({ children }) => {
transition:'transform 0.45s cubic-bezier(0.22,1,0.36,1)',
}}>
{/* LEFT — logo */}
{/* LEFT – logo */}
<div style={{ flex:1, display:'flex', alignItems:'center', padding:'0 24px', height:'100%', borderRight:`1px solid ${LINE}` }}>
<Link to="/" style={{ display:'flex', alignItems:'center', textDecoration:'none' }}>
<img
@@ -242,7 +231,7 @@ const Layout: React.FC<LayoutProps> = ({ children }) => {
</Link>
</div>
{/* CENTER — hamburger */}
{/* CENTER – hamburger */}
<div style={{ flex:1, display:'flex', alignItems:'center', justifyContent:'center', height:'100%', borderRight:`1px solid ${LINE}`, gap:16 }}>
<span style={{ fontSize:8, color:'rgba(5,26,135,0.5)', letterSpacing:2, userSelect:'none' }}>◆</span>
<button
@@ -261,7 +250,7 @@ const Layout: React.FC<LayoutProps> = ({ children }) => {
<span style={{ fontSize:8, color:'rgba(5,26,135,0.5)', letterSpacing:2, userSelect:'none' }}>◆</span>
</div>
{/* RIGHT — social + lang */}
{/* RIGHT – social + lang */}
<div style={{ flex:1, display:'flex', alignItems:'center', justifyContent:'flex-end', gap:20, padding:'0 28px', height:'100%' }}>
<div style={{ display:'flex', gap:14, alignItems:'center' }}>
{SOCIAL.map(s => <SocialLink key={s.label} {...s} />)}
@@ -297,7 +286,7 @@ const Layout: React.FC<LayoutProps> = ({ children }) => {
>
<div style={{ display:'flex', flexDirection:'column', height:'100%', overflow:'hidden' }}>
{/* TOP — tagline + logo */}
{/* TOP – tagline + logo */}
<div style={{ flex:'1 1 50%', display:'flex', alignItems:'flex-end', padding:'0 80px 48px', position:'relative', minHeight:0, zIndex:1 }}>
<div>
<div style={{ fontSize:12, color:'rgba(255,255,255,.4)', letterSpacing:'.12em', textTransform:'uppercase', marginBottom:12, fontFamily:FF_DISPLAY }}>
@@ -312,14 +301,14 @@ const Layout: React.FC<LayoutProps> = ({ children }) => {
</div>
</div>
{/* BOTTOM — 3 columns */}
{/* BOTTOM – 3 columns */}
<div style={{
flex:'0 0 auto',
display:'grid', gridTemplateColumns:'1fr 1.4fr 1fr',
borderTop:`1px solid ${SEP}`,
}}>
{/* LEFT — main nav */}
{/* LEFT – main nav */}
<div style={{ borderRight:`1px solid ${SEP}`, padding:'40px 0 40px 60px' }}>
<ul style={{ listStyle:'none' }}>
{NAV.map((item, idx) => (
@@ -354,7 +343,7 @@ const Layout: React.FC<LayoutProps> = ({ children }) => {
</ul>
</div>
{/* MIDDLE — subnav */}
{/* MIDDLE – subnav */}
<div style={{ borderRight:`1px solid ${SEP}`, padding:'40px 48px', position:'relative', minHeight:440 }}>
{NAV.map(item => (
<div key={item.key} style={{
@@ -389,7 +378,7 @@ const Layout: React.FC<LayoutProps> = ({ children }) => {
))}
</div>
{/* RIGHT — utilities */}
{/* RIGHT – utilities */}
<div style={{ padding:'40px 80px 40px 48px', display:'flex', flexDirection:'column', gap:24 }}>
<div style={{ display:'flex', alignItems:'center', gap:20, flexWrap:'wrap' }}>
@@ -471,7 +460,7 @@ const Layout: React.FC<LayoutProps> = ({ children }) => {
{/* ═══════════════════════════════════════════════════════════ */}
{/* ══ MOBILE CHROME (<768px) — top bar + fullscreen overlay ══ */}
{/* ══ MOBILE CHROME (<768px) – top bar + fullscreen overlay ══ */}
{/* ═══════════════════════════════════════════════════════════ */}
{isMobile && (
<>
@@ -735,7 +724,7 @@ const Layout: React.FC<LayoutProps> = ({ children }) => {
alignItems: 'flex-start',
}}>
{/* Decorative year — desktop only */}
{/* Decorative year – desktop only */}
{!isMobile && (
<div style={{
position: 'absolute',
@@ -913,7 +902,7 @@ const Layout: React.FC<LayoutProps> = ({ children }) => {
</ul>
</div>
{/* Gold vertical separator — desktop only */}
{/* Gold vertical separator – desktop only */}
{!isMobile && (
<div style={{
width: 1,
@@ -960,7 +949,7 @@ const Layout: React.FC<LayoutProps> = ({ children }) => {
</ul>
</div>
{/* Gold vertical separator — desktop only */}
{/* Gold vertical separator – desktop only */}
{!isMobile && (
<div style={{
width: 1,

View File

@@ -420,7 +420,7 @@ function ReviewRow({ label, value }: { label: string; value: string }) {
{label}
</span>
<span style={{ color: WHITE, fontFamily: '"IBM Plex Sans", sans-serif', fontWeight: 500 }}>
{value || "—"}
{value || "–"}
</span>
</div>
);
@@ -513,7 +513,7 @@ function ProgressBar({ current, total }: { current: number; total: number }) {
})}
</div>
{/* Step labels — full list on desktop; on mobile only the active label
{/* Step labels – full list on desktop; on mobile only the active label
(the 5-up text row would overflow / wrap on narrow screens) */}
{isMobile ? (
<div style={{
@@ -691,7 +691,7 @@ function NavButtons({
);
}
// ─── STEP 1 — UNTERNEHMEN ─────────────────────────────────────────────────────
// ─── STEP 1 – UNTERNEHMEN ─────────────────────────────────────────────────────
function Step1({ data, onChange, errors }: {
data: FormData; onChange: (k: keyof FormData, v: string | boolean) => void; errors: Errors;
@@ -742,7 +742,7 @@ function Step1({ data, onChange, errors }: {
);
}
// ─── STEP 2 — KONTAKT ─────────────────────────────────────────────────────────
// ─── STEP 2 – KONTAKT ─────────────────────────────────────────────────────────
function Step2({ data, onChange, errors }: {
data: FormData; onChange: (k: keyof FormData, v: string | boolean) => void; errors: Errors;
@@ -785,7 +785,7 @@ function Step2({ data, onChange, errors }: {
);
}
// ─── STEP 3 — DETAILS ─────────────────────────────────────────────────────────
// ─── STEP 3 – DETAILS ─────────────────────────────────────────────────────────
function Step3({ data, onChange, errors }: {
data: FormData; onChange: (k: keyof FormData, v: string | boolean) => void; errors: Errors;
@@ -857,7 +857,7 @@ function Step3({ data, onChange, errors }: {
);
}
// ─── STEP 4 — SEPA ────────────────────────────────────────────────────────────
// ─── STEP 4 – SEPA ────────────────────────────────────────────────────────────
function Step4({ data, onChange, errors }: {
data: FormData; onChange: (k: keyof FormData, v: string | boolean) => void; errors: Errors;
@@ -929,7 +929,7 @@ function Step4({ data, onChange, errors }: {
);
}
// ─── STEP 5 — SUMMARY + CONSENT ───────────────────────────────────────────────
// ─── STEP 5 – SUMMARY + CONSENT ───────────────────────────────────────────────
function Step5({ data, onChange, errors }: {
data: FormData; onChange: (k: keyof FormData, v: string | boolean) => void; errors: Errors;
@@ -943,7 +943,7 @@ function Step5({ data, onChange, errors }: {
<ReviewRow label="Rechtsform" value={data.rechtsform} />
<ReviewRow label="Adresse" value={`${data.strasse}, ${data.plz} ${data.ort}`} />
<ReviewRow label="Mitarbeiter" value={data.mitarbeiter} />
<ReviewRow label="Website" value={data.website || "—"} />
<ReviewRow label="Website" value={data.website || "–"} />
</Accordion>
<Accordion title="Kontaktperson">

View File

@@ -3,7 +3,7 @@ import React, { useEffect, useRef } from 'react';
/**
* MunichSkylineBg
* Drop inside any light section (position: relative required on parent).
* Uses backgroundPositionY for parallax — no transform, no GPU compositing layer.
* Uses backgroundPositionY for parallax – no transform, no GPU compositing layer.
* No mixBlendMode to avoid Safari compositing bleed into sibling elements.
*/
const MunichSkylineBg: React.FC = () => {