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:
@@ -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>
|
||||
|
||||
|
||||
@@ -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 }}>
|
||||
|
||||
@@ -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>
|
||||
)}
|
||||
|
||||
@@ -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' }}>
|
||||
|
||||
@@ -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}>
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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 = () => {
|
||||
|
||||
Reference in New Issue
Block a user