diff --git a/app/[locale]/layout.tsx b/app/[locale]/layout.tsx index b6a48d44d..ca3e168f7 100644 --- a/app/[locale]/layout.tsx +++ b/app/[locale]/layout.tsx @@ -129,6 +129,7 @@ export default async function Layout(props: { 'ReferencesSlider', 'CompanyTimeline', 'TeamGrid', + 'AISearch', ]; const clientMessages: Record = {}; for (const key of clientKeys) { diff --git a/app/[locale]/referenzen/[slug]/page.tsx b/app/[locale]/referenzen/[slug]/page.tsx index 04c36406c..a4e10e6a7 100644 --- a/app/[locale]/referenzen/[slug]/page.tsx +++ b/app/[locale]/referenzen/[slug]/page.tsx @@ -57,6 +57,7 @@ export default async function ReferenceDetail(props: { params: Promise<{ locale: setRequestLocale(locale); const reference = await getReferenceBySlug(slug, locale); + const t = await getTranslations('ReferenceDetail'); if (!reference) { notFound(); @@ -119,12 +120,12 @@ export default async function ReferenceDetail(props: { params: Promise<{ locale: eventProperties={{ location: 'reference_back_btn' }} > - Zurück zur Übersicht + {t('backToOverview')}
- Projektreferenz + {t('projectReference')} {reference.frontmatter.title} @@ -134,21 +135,21 @@ export default async function ReferenceDetail(props: { params: Promise<{ locale:
-

Ort

+

{t('location')}

{reference.frontmatter.location}

-

Auftraggeber

+

{t('client')}

{reference.frontmatter.client}

-

Zeitraum

+

{t('period')}

{reference.frontmatter.dateString || new Date(reference.frontmatter.date).getFullYear()}

@@ -160,7 +161,7 @@ export default async function ReferenceDetail(props: { params: Promise<{ locale: {/* Main Content Area */}
-

Leistungsumfang & Projektbeschreibung

+

{t('scopeTitle')}

@@ -173,7 +174,7 @@ export default async function ReferenceDetail(props: { params: Promise<{ locale: eventProperties={{ location: 'reference_bottom_back_btn' }} > - Alle Referenzen ansehen + {t('viewAll')} diff --git a/components/LeafletMap.tsx b/components/LeafletMap.tsx index ac475b13b..a3036449b 100644 --- a/components/LeafletMap.tsx +++ b/components/LeafletMap.tsx @@ -36,7 +36,7 @@ export default function LeafletMap({ locations }: LeafletMapProps) { const firstLoc = locations[0]; const map = L.map(mapRef.current, { center: [firstLoc.lat, firstLoc.lng], - zoom: locations.length === 1 ? 14 : 6, + zoom: locations.length === 1 ? 16 : 6, scrollWheelZoom: false, }); diff --git a/components/blocks/CertificatesBlock.tsx b/components/blocks/CertificatesBlock.tsx index 8e83d023b..1bab60231 100644 --- a/components/blocks/CertificatesBlock.tsx +++ b/components/blocks/CertificatesBlock.tsx @@ -29,42 +29,42 @@ const defaultCertificates: Certificate[] = [ { title: 'ISO 14001:2015', description: 'Umweltmanagementsystem', - pdfUrl: '/assets/certificates/231214_Zertifikat ISO 14001 Umweltmanagement.pdf', + pdfUrl: '/assets/certificates/iso14001.pdf', type: 'iso', date: '14.12.2023', }, { title: 'ISO 9001:2015', description: 'Qualitätsmanagementsystem', - pdfUrl: '/assets/certificates/231214_Zertifikat ISO 9001 Qualitätsmanagement.pdf', + pdfUrl: '/assets/certificates/iso9001.pdf', type: 'iso', date: '14.12.2023', }, { title: 'DIN EN ISO 45001:2018', description: 'Arbeits- und Gesundheitsschutz', - pdfUrl: '/assets/certificates/Zertifizierung DIN EN ISO 45001 bis 05122028.pdf', + pdfUrl: '/assets/certificates/iso45001.pdf', type: 'iso', date: '05.12.2025', // Assuming valid till }, { title: 'Freistellungsbescheinigung', description: 'Nach § 48 b EStG', - pdfUrl: '/assets/certificates/240209_Freistellungsbescheinigung § 48 b.pdf', + pdfUrl: '/assets/certificates/freistellung.pdf', type: 'tax', date: '09.02.2024', }, { title: 'Nachweis § 13b UStG', description: 'Steuerschuldnerschaft des Leistungsempfängers', - pdfUrl: '/assets/certificates/240209_Nachweis § 13 b.pdf', + pdfUrl: '/assets/certificates/nachweis13b.pdf', type: 'tax', date: '09.02.2024', }, { title: 'Bescheinigung in Steuersachen', description: 'Zertifikat des Finanzamtes', - pdfUrl: '/assets/certificates/250213_Bescheinigung in Steuersachen.pdf', + pdfUrl: '/assets/certificates/bescheinigung.pdf', type: 'tax', date: '13.02.2025', }, diff --git a/components/blocks/InteractiveGermanyMap.tsx b/components/blocks/InteractiveGermanyMap.tsx index 4b0b314f8..55440c238 100644 --- a/components/blocks/InteractiveGermanyMap.tsx +++ b/components/blocks/InteractiveGermanyMap.tsx @@ -30,10 +30,7 @@ export function InteractiveGermanyMap({ badge, title, description, - stats = [ - { value: '100', suffix: '%', label: 'Überregionale Reichweite' }, - { value: '2', suffix: '+', label: 'Operative Standorte' }, - ], + stats, locations = allLocations, isHero = false }: InteractiveGermanyMapProps) { @@ -43,6 +40,11 @@ export function InteractiveGermanyMap({ const t = useTranslations('InteractiveGermanyMap'); const tStandard = useTranslations('StandardPage'); + const finalStats = stats || [ + { value: '100', suffix: '%', label: locale === 'en' ? 'Nationwide Reach' : 'Überregionale Reichweite' }, + { value: '2', suffix: '+', label: locale === 'en' ? 'Operational Locations' : 'Operative Standorte' }, + ]; + const finalBadge = badge || tStandard('badge'); // the map is mostly used with specific props, so we leave title & description to fallbacks if not provided const finalTitle = title || (locale === 'en' ? <>Nationwide
in operation for you. : <>Deutschlandweit
für Sie im Einsatz.); @@ -88,7 +90,7 @@ export function InteractiveGermanyMap({ {/* Industrial Stats Grid */}
- {stats.map((stat, i) => ( + {finalStats.map((stat, i) => (
diff --git a/components/forms/ContactForm.tsx b/components/forms/ContactForm.tsx index 60ed11b11..903b8c153 100644 --- a/components/forms/ContactForm.tsx +++ b/components/forms/ContactForm.tsx @@ -3,6 +3,7 @@ import * as React from 'react'; import { motion } from 'framer-motion'; import { Button } from '@/components/ui/Button'; +import { sendContactFormAction } from '@/app/actions/contact'; export function ContactForm() { const [status, setStatus] = React.useState<'idle' | 'loading' | 'success' | 'error'>('idle'); @@ -11,10 +12,18 @@ export function ContactForm() { e.preventDefault(); setStatus('loading'); - // Simulate server action using @mintel/mail or API route - setTimeout(() => { - setStatus('success'); - }, 1500); + const formData = new FormData(e.currentTarget); + try { + const result = await sendContactFormAction(formData); + if (result.success) { + setStatus('success'); + } else { + setStatus('error'); + } + } catch (error) { + console.error(error); + setStatus('error'); + } }; return ( @@ -41,13 +50,31 @@ export function ContactForm() {

Vielen Dank für Ihr Interesse an der E-TIB Gruppe. Ein Ansprechpartner wird sich zeitnah mit Ihnen in Verbindung setzen.

- ) : ( + ) : status === 'error' ? ( + +
+ +
+
+

Fehler beim Senden

+

Leider ist ein Fehler aufgetreten. Bitte versuchen Sie es später noch einmal oder kontaktieren Sie uns direkt per E-Mail oder Telefon.

+ +
+
+ ) : null} + + {status !== 'success' && status !== 'error' && (
- + E-Mail Adresse Unternehmen (Optional) Ihre Nachricht