>
);
}
diff --git a/components/ContactForm.tsx b/components/ContactForm.tsx
index bdab4f65b..913ac0bf1 100644
--- a/components/ContactForm.tsx
+++ b/components/ContactForm.tsx
@@ -160,6 +160,7 @@ export default function ContactForm() {
name="name"
autoComplete="name"
enterKeyHint="next"
+ placeholder={t('form.namePlaceholder') || 'Ihr Name'}
onFocus={() => handleFocus('contact-name')}
required
/>
diff --git a/components/blocks/HeroVideo.tsx b/components/blocks/HeroVideo.tsx
index 202e4f74d..e3d33fd35 100644
--- a/components/blocks/HeroVideo.tsx
+++ b/components/blocks/HeroVideo.tsx
@@ -34,8 +34,17 @@ export function HeroVideo(props: HeroVideoProps) {
const ctaLabel = props.ctaLabel || props.linkText || data?.ctaLabel || 'Unternehmen entdecken';
const ctaHref = props.ctaHref || props.linkHref || data?.ctaHref || '#unternehmen';
- const secondaryCtaLabel = props.secondaryCtaLabel || data?.secondaryCtaLabel || 'Projekt anfragen';
- const secondaryCtaHref = props.secondaryCtaHref || data?.secondaryCtaHref || '/kontakt';
+ let currentLocale = 'de';
+ try {
+ // We can't unconditionally call hooks if they might fail outside context, but HeroVideo is usually in context.
+ // However, to be safe and avoid adding new imports, we can use window.location or default to 'de' if not available.
+ if (typeof window !== 'undefined') {
+ currentLocale = window.location.pathname.startsWith('/en') ? 'en' : 'de';
+ }
+ } catch (e) {}
+
+ const secondaryCtaLabel = props.secondaryCtaLabel || data?.secondaryCtaLabel || (currentLocale === 'de' ? 'Projekt anfragen' : 'Inquire Project');
+ const secondaryCtaHref = props.secondaryCtaHref || data?.secondaryCtaHref || `/${currentLocale}/${currentLocale === 'de' ? 'contact' : 'contact'}`;
return (
@@ -72,7 +81,7 @@ export function HeroVideo(props: HeroVideoProps) {
>
KABELTIEFBAU').replace(/\n/g, '
') }}
+ dangerouslySetInnerHTML={{ __html: title.replace('KABELTIEFBAU', 'KABELTIEFBAU').replace(/\\n|\n/g, '
') }}
/>
diff --git a/components/blocks/JobListingBlock.tsx b/components/blocks/JobListingBlock.tsx
index 91c5a266d..e656622ed 100644
--- a/components/blocks/JobListingBlock.tsx
+++ b/components/blocks/JobListingBlock.tsx
@@ -1,13 +1,21 @@
import React from 'react';
import Link from 'next/link';
import { Button } from '@/components/ui/Button';
+import { HoverShineOverlay } from '@/components/ui/HoverShineOverlay';
export interface JobListingBlockProps {
title?: string;
showJobs?: boolean;
showFairs?: boolean;
fairsTitle?: string;
- fairs?: Array<{ name: string; date: string; type: string }>;
+ fairs?: Array<{
+ name: string;
+ date: string;
+ type: string;
+ location?: string;
+ booth?: string;
+ url?: string;
+ }>;
emptyStateMessage?: string;
emptyStateLinkText?: string;
emptyStateLinkHref?: string;
@@ -20,9 +28,9 @@ export const JobListingBlock = async (props: JobListingBlockProps) => {
showFairs,
fairsTitle = 'Nächste Messetermine 2026',
fairs = [
- { name: 'Intersolar München', date: '19. - 21. Juni 2026', type: 'Energie-Messe' },
- { name: 'Windenergietage Linstow', date: '04. - 06. November 2026', type: 'Fachkongress' },
- { name: 'Kabelwerkstatt Wiesbaden', date: '02. - 03. Dezember 2026', type: 'Fachmesse' }
+ { name: 'Intersolar München', date: '19. - 21. Juni 2026', type: 'Energie-Messe', location: 'Messe München', booth: 'Halle A3, Stand 110', url: 'https://www.intersolar.de' },
+ { name: 'Windenergietage Linstow', date: '04. - 06. November 2026', type: 'Fachkongress', location: 'Van der Valk Resort Linstow', booth: 'Stand 42', url: 'https://windenergietage.de' },
+ { name: 'Kabelwerkstatt Wiesbaden', date: '02. - 03. Dezember 2026', type: 'Fachmesse', location: 'RheinMain CongressCenter', booth: 'Halle 1, Stand B20' }
],
emptyStateMessage = 'Aktuell sind alle Positionen besetzt. Senden Sie uns gerne eine Initiativbewerbung!',
emptyStateLinkText = 'Jetzt Kontakt aufnehmen',
@@ -34,27 +42,97 @@ export const JobListingBlock = async (props: JobListingBlockProps) => {
return (
-
+
{showFairs && (
-
-
-
-
+
+
+
{fairsTitle}
-
- {fairs.map((messe) => (
- -
-
-
{messe.type}
-
{messe.name}
+
+ {fairs.map((messe, idx) => {
+ const isLink = !!messe.url;
+ const innerContent = (
+ <>
+ {/* Glass Background Elements */}
+
+
+
+
+
+
+
+
+
+ {messe.type}
+
+ {isLink && (
+
+ )}
+
+
+
+ {messe.name}
+
+
+
+
+
+ {messe.location && (
+
+
+
+
Location
+
{messe.location}
+
+
+ )}
+
+ {messe.booth && (
+
+
+
+
Stand
+
{messe.booth}
+
+
+ )}
+
+
+ >
+ );
+
+ const baseClasses = "group relative bg-[#050B14] rounded-[2rem] p-8 overflow-hidden border border-white/5 shadow-2xl transition-all duration-500 hover:scale-[1.02] hover:shadow-primary/10 flex flex-col h-full";
+
+ if (isLink) {
+ return (
+
+ {innerContent}
+
+ );
+ }
+
+ return (
+
+ {innerContent}
-
- {messe.date}
-
-
- ))}
-
+ );
+ })}
+
)}
diff --git a/components/layout/Footer.tsx b/components/layout/Footer.tsx
index e9829bf83..f776e373a 100644
--- a/components/layout/Footer.tsx
+++ b/components/layout/Footer.tsx
@@ -18,115 +18,136 @@ export function Footer({ companyInfo }: FooterProps) {
const locale = useLocale();
return (
-