From 17a807c48b750fb0fe4e90908426eed43496e092 Mon Sep 17 00:00:00 2001 From: Marc Mintel Date: Sun, 14 Jun 2026 10:03:46 +0200 Subject: [PATCH] feat: integrate standalone standorte pages with real photos and map routing --- app/[locale]/layout.tsx | 1 + app/[locale]/standorte/[slug]/page.tsx | 202 ++++++++++++++++++++ app/[locale]/standorte/page.tsx | 143 ++++++++++++++ components/analytics/TrackedLink.tsx | 6 +- components/blocks/InteractiveGermanyMap.tsx | 37 +++- lib/map-data.ts | 4 +- lib/standorte-data.ts | 162 ++++++++++++++++ 7 files changed, 543 insertions(+), 12 deletions(-) create mode 100644 app/[locale]/standorte/[slug]/page.tsx create mode 100644 app/[locale]/standorte/page.tsx create mode 100644 lib/standorte-data.ts diff --git a/app/[locale]/layout.tsx b/app/[locale]/layout.tsx index eac0756b6..e202ea1af 100644 --- a/app/[locale]/layout.tsx +++ b/app/[locale]/layout.tsx @@ -92,6 +92,7 @@ export default async function Layout(props: { url: `/${safeLocale}/${await mapFileSlugToTranslated('ueber-uns', safeLocale)}`, children: [ { label: safeLocale === 'de' ? 'Firma' : 'Company', url: `/${safeLocale}/${await mapFileSlugToTranslated('ueber-uns', safeLocale)}` }, + { label: safeLocale === 'de' ? 'Standorte' : 'Locations', url: `/${safeLocale}/standorte` }, { label: safeLocale === 'de' ? 'Unser Team' : 'Our Team', url: `/${safeLocale}/team` }, { label: safeLocale === 'de' ? 'Zertifikate' : 'Certificates', url: `/${safeLocale}/zertifikate` } ] diff --git a/app/[locale]/standorte/[slug]/page.tsx b/app/[locale]/standorte/[slug]/page.tsx new file mode 100644 index 000000000..4b1f10607 --- /dev/null +++ b/app/[locale]/standorte/[slug]/page.tsx @@ -0,0 +1,202 @@ +import { Container } from '@/components/ui'; +import { getTranslations, setRequestLocale } from 'next-intl/server'; +import { Metadata } from 'next'; +import { notFound } from 'next/navigation'; +import { standorteData, getStandortById } from '@/lib/standorte-data'; +import { SITE_URL } from '@/lib/schema'; +import Image from 'next/image'; +import { MapPin, Phone, Mail, Navigation, CheckCircle2, ArrowUpRight } from 'lucide-react'; +import { getButtonClasses, ButtonOverlay } from '@/components/ui/Button'; +import TrackedLink from '@/components/analytics/TrackedLink'; +import { AnimatedGlossyBorder } from '@/components/ui/AnimatedGlossyBorder'; + +interface PageProps { + params: Promise<{ + locale: string; + slug: string; + }>; +} + +export async function generateStaticParams() { + const locales = ['de', 'en']; + const params: { locale: string; slug: string }[] = []; + + for (const locale of locales) { + for (const standort of standorteData) { + params.push({ locale, slug: standort.id }); + } + } + + return params; +} + +export async function generateMetadata({ params }: PageProps): Promise { + const { locale, slug } = await params; + if (locale !== 'de' && locale !== 'en') return {}; + + const standort = getStandortById(slug); + if (!standort) return {}; + + return { + title: `${standort.name} | E-TIB Gruppe`, + description: standort.description[locale], + alternates: { + canonical: `${SITE_URL}/${locale}/standorte/${slug}`, + languages: { + de: `${SITE_URL}/de/standorte/${slug}`, + en: `${SITE_URL}/en/standorte/${slug}`, + 'x-default': `${SITE_URL}/en/standorte/${slug}`, + }, + }, + }; +} + +export default async function StandortDetail(props: { params: Promise<{ locale: string; slug: string }> }) { + const { locale, slug } = await props.params; + const safeLocale = locale === 'de' ? 'de' : 'en'; + setRequestLocale(safeLocale); + const t = await getTranslations('StandardPage'); + + const standort = getStandortById(slug); + if (!standort) { + notFound(); + } + + return ( +
+ + {/* Header Section */} +
+
+ + {standort.type === 'hq' ? (safeLocale === 'de' ? 'Hauptsitz' : 'Headquarters') : (safeLocale === 'de' ? 'Niederlassung' : 'Branch')} +
+

+ {standort.name} +

+

+ {standort.description[safeLocale]} +

+
+ +
+ {/* Main Content (Images & Description) */} +
+ {/* Featured Image */} +
+ {standort.name} +
+
+ + {/* Key Features */} +
+

+ {safeLocale === 'de' ? 'Unsere Leistungen vor Ort' : 'Our Local Services'} +

+
    + {standort.keyFeatures[safeLocale].map((feature, idx) => ( +
  • + + {feature} +
  • + ))} +
+
+ + {/* Gallery (if any) */} + {standort.gallery && standort.gallery.length > 0 && ( +
+ {standort.gallery.map((img, idx) => ( +
+ {`Gallery +
+ ))} +
+ )} +
+ + {/* Sidebar (Contact & Address) */} +
+
+ + {/* Contact Card */} +
+ +
+ +
+

+ + {safeLocale === 'de' ? 'Kontakt & Anfahrt' : 'Contact & Directions'} +

+ +
+
+
+ +
+
+
+ {safeLocale === 'de' ? 'Adresse' : 'Address'} +
+
+ {standort.address.street}
+ {standort.address.city} +
+ + {safeLocale === 'de' ? 'In Google Maps öffnen' : 'Open in Google Maps'} + + +
+
+ +
+
+ +
+
+
+ {safeLocale === 'de' ? 'Telefon' : 'Phone'} +
+ + {standort.contact.phone} + +
+
+ +
+
+ +
+ +
+
+
+
+ +
+
+
+ +
+ ); +} diff --git a/app/[locale]/standorte/page.tsx b/app/[locale]/standorte/page.tsx new file mode 100644 index 000000000..893e1b223 --- /dev/null +++ b/app/[locale]/standorte/page.tsx @@ -0,0 +1,143 @@ +import { Container } from '@/components/ui'; +import { getTranslations, setRequestLocale } from 'next-intl/server'; +import { Metadata } from 'next'; +import TrackedLink from '@/components/analytics/TrackedLink'; +import { MapPin, Navigation, ArrowUpRight } from 'lucide-react'; +import { getButtonClasses, ButtonOverlay } from '@/components/ui/Button'; +import { SITE_URL } from '@/lib/schema'; +import Image from 'next/image'; +import { standorteData } from '@/lib/standorte-data'; +import { InteractiveGermanyMap } from '@/components/blocks/InteractiveGermanyMap'; + +interface PageProps { + params: Promise<{ + locale: string; + }>; +} + +export async function generateMetadata({ params }: PageProps): Promise { + const { locale } = await params; + if (locale !== 'de' && locale !== 'en') return {}; + + return { + title: locale === 'de' ? 'Standorte | E-TIB Gruppe' : 'Locations | E-TIB Group', + description: locale === 'de' + ? 'Die operativen Standorte der E-TIB Gruppe: Guben, Kirchheilingen und Bülstedt.' + : 'The operational locations of the E-TIB Group: Guben, Kirchheilingen and Bülstedt.', + alternates: { + canonical: `${SITE_URL}/${locale}/standorte`, + languages: { + de: `${SITE_URL}/de/standorte`, + en: `${SITE_URL}/en/standorte`, + 'x-default': `${SITE_URL}/en/standorte`, + }, + }, + }; +} + +export default async function StandorteOverview(props: { params: Promise<{ locale: string }> }) { + const { locale } = await props.params; + const safeLocale = locale === 'de' ? 'de' : 'en'; + setRequestLocale(safeLocale); + const t = await getTranslations('StandardPage'); + + return ( +
+ {/* Map Hero Section */} + + + {/* Main Content Area */} + +
+ {standorteData.map((standort) => ( + +
+ {/* Image Section */} +
+ {standort.name} +
+ + {/* Location Badge */} +
+ + + {standort.address.city} + +
+
+ + {/* Content Section */} +
+
+

+ {standort.name} +

+ +
+ +

+ {standort.description[safeLocale]} +

+ + {/* Meta Data */} +
+
+ + {safeLocale === 'de' ? 'Adresse' : 'Address'} + + + + {standort.address.street}, {standort.address.city} + +
+
+
+
+ + ))} +
+ + {/* Support Section */} +
+
+
+

{t('nextProjectTitle')}

+

{t('nextProjectDesc')}

+ + + {t('contactUs')} + + → + + + + +
+
+ +
+ ); +} diff --git a/components/analytics/TrackedLink.tsx b/components/analytics/TrackedLink.tsx index 8b9d2b694..8e4136c22 100644 --- a/components/analytics/TrackedLink.tsx +++ b/components/analytics/TrackedLink.tsx @@ -12,6 +12,8 @@ interface TrackedLinkProps { className?: string; children: React.ReactNode; onClick?: () => void; + target?: string; + rel?: string; } /** @@ -25,6 +27,8 @@ export default function TrackedLink({ className, children, onClick, + target, + rel, }: TrackedLinkProps) { const { trackEvent } = useAnalytics(); @@ -41,7 +45,7 @@ export default function TrackedLink({ }; return ( - + {children} ); diff --git a/components/blocks/InteractiveGermanyMap.tsx b/components/blocks/InteractiveGermanyMap.tsx index 87ec620f1..e6e2711bd 100644 --- a/components/blocks/InteractiveGermanyMap.tsx +++ b/components/blocks/InteractiveGermanyMap.tsx @@ -5,6 +5,7 @@ import { motion, AnimatePresence } from 'framer-motion'; import { MapPin, Factory, Zap, CheckCircle2, ArrowUpRight } from 'lucide-react'; import Image from 'next/image'; import { useRouter } from 'next/navigation'; +import Link from 'next/link'; import { AnimatedGlossyBorder } from '@/components/ui/AnimatedGlossyBorder'; import { Location, defaultLocations, minorLocations } from '@/lib/map-data'; import { useLocale, useTranslations } from 'next-intl'; @@ -15,6 +16,7 @@ interface Stat { value: string; suffix?: string; label: string; + href?: string; } interface InteractiveGermanyMapProps { @@ -42,7 +44,7 @@ export function InteractiveGermanyMap({ const finalStats = stats || [ { value: '100', suffix: '%', label: locale === 'en' ? 'Nationwide Reach' : 'Überregionale Reichweite' }, - { value: '3', suffix: '', label: locale === 'en' ? 'Operational Locations' : 'Operative Standorte' }, + { value: '3', suffix: '', label: locale === 'en' ? 'Operational Locations' : 'Operative Standorte', href: `/${locale}/standorte` }, ]; const finalBadge = badge || tStandard('badge'); @@ -90,17 +92,32 @@ export function InteractiveGermanyMap({ {/* Industrial Stats Grid */}
- {finalStats.map((stat, i) => ( -
-
-
-
- {stat.value}{stat.suffix} + {finalStats.map((stat, i) => { + const StatCard = () => ( +
+
+
+
+ {stat.value}{stat.suffix} +
+
+ {stat.label} + {stat.href && } +
-
{stat.label}
-
- ))} + ); + + return stat.href ? ( + + + + ) : ( +
+ +
+ ); + })}
diff --git a/lib/map-data.ts b/lib/map-data.ts index e9100e2e6..844243d21 100644 --- a/lib/map-data.ts +++ b/lib/map-data.ts @@ -18,6 +18,7 @@ export const defaultLocations: Location[] = [ x: 85, y: 41.1, description: 'E-TIB GmbH Holding & Bohrtechnik GmbH', + href: '/standorte/guben', details: ['Zentrale Steuerung', 'Kabelleitungstiefbau', 'Maschinenpark'], }, { @@ -27,7 +28,7 @@ export const defaultLocations: Location[] = [ x: 52, y: 55, description: 'Standort in Thüringen', - href: '/bohrtechnik', + href: '/standorte/kirchheilingen', details: ['Bahnhofstraße 180a', '99947 Kirchheilingen'], }, { @@ -37,6 +38,7 @@ export const defaultLocations: Location[] = [ x: 37, y: 25.33, description: 'E-TIB Ingenieurgesellschaft mbH', + href: '/standorte/buelstedt', details: ['Planung & Projektierung', 'Vermessung', 'Dokumentation'], }, { diff --git a/lib/standorte-data.ts b/lib/standorte-data.ts new file mode 100644 index 000000000..a346f8168 --- /dev/null +++ b/lib/standorte-data.ts @@ -0,0 +1,162 @@ +import { LucideIcon, MapPin, Building2, HardHat, Phone, Mail, Navigation } from 'lucide-react'; + +export interface ContactPerson { + name: string; + role: string; + phone: string; + email: string; + image?: string; +} + +export interface StandortData { + id: string; + name: string; + shortName: string; + description: Record<'de' | 'en', string>; + address: { + street: string; + city: string; + }; + contact: { + phone: string; + email: string; + }; + coordinates: { + lat: number; + lng: number; + }; + keyFeatures: Record<'de' | 'en', string[]>; + image: string; + gallery: string[]; + type: 'hq' | 'branch'; +} + +export const standorteData: StandortData[] = [ + { + id: 'guben', + name: 'E-TIB GmbH Holding & Bohrtechnik GmbH', + shortName: 'Guben (Hauptsitz)', + type: 'hq', + description: { + de: 'Unser Hauptsitz in Guben bildet das strategische und operative Zentrum der E-TIB Gruppe. Von hier aus steuern wir bundesweit Großprojekte im Kabelleitungstiefbau und koordinieren unseren hochmodernen Maschinenpark.', + en: 'Our headquarters in Guben forms the strategic and operational center of the E-TIB Group. From here, we manage large-scale civil engineering projects nationwide and coordinate our state-of-the-art machinery fleet.' + }, + address: { + street: 'Gewerbestraße 22', + city: '03172 Guben' + }, + contact: { + phone: '+49 (0) 3561 / 68577 33', + email: 'info@e-tib.com' + }, + coordinates: { + lat: 51.942, + lng: 14.717 + }, + keyFeatures: { + de: [ + 'Zentrale strategische Steuerung', + 'Kabelleitungstiefbau & Infrastruktur', + 'Koordination Großmaschinenpark', + 'Zentrales Projektmanagement' + ], + en: [ + 'Central strategic management', + 'Underground cable engineering & infrastructure', + 'Coordination of heavy machinery', + 'Central project management' + ] + }, + image: '/assets/photos/Etib_E-tib_Tiefbau_Guben_Netzanbindung_Energie-100.jpg', + gallery: [ + '/assets/photos/DSC02114.jpg', + '/assets/photos/Etib_E-tib_Tiefbau_Guben_Netzanbindung_Energie-45.jpg' + ] + }, + { + id: 'kirchheilingen', + name: 'E-TIB Bohrtechnik GmbH', + shortName: 'Standort Thüringen', + type: 'branch', + description: { + de: 'Unser spezialisierter Standort für Horizontalspülbohrtechnik in Thüringen. Mit modernsten Bohranlagen realisieren wir grabenlose Leitungsverlegungen für komplexe Infrastrukturprojekte, umweltschonend und hocheffizient.', + en: 'Our specialized location for horizontal directional drilling in Thuringia. Utilizing state-of-the-art drilling rigs, we implement trenchless cable laying for complex infrastructure projects, environmentally friendly and highly efficient.' + }, + address: { + street: 'Bahnhofstraße 180a', + city: '99947 Kirchheilingen' + }, + contact: { + phone: '+49 (0) 3561 / 68577 33', // Placeholder, using central + email: 'info@e-tib.com' + }, + coordinates: { + lat: 51.1852, + lng: 10.6865 + }, + keyFeatures: { + de: [ + 'Horizontalspülbohrtechnik (HDD)', + 'Grabenlose Rohrverlegung', + 'Felsbohrungen', + 'Unterquerung von Gewässern & Straßen' + ], + en: [ + 'Horizontal Directional Drilling (HDD)', + 'Trenchless pipe laying', + 'Rock drilling', + 'Crossing underneath water bodies & roads' + ] + }, + image: '/assets/photos/Etib_E-tib_Tiefbau_Guben_Netzanbindung_Energie_Vermessung_(247_von_80).jpg', + gallery: [ + '/assets/photos/DSC02089.jpg', + '/assets/photos/Etib_E-tib_Tiefbau_Guben_Netzanbindung_Energie-6.jpg' + ] + }, + { + id: 'buelstedt', + name: 'E-TIB Ingenieurgesellschaft mbH', + shortName: 'Bülstedt (Ingenieurgesellschaft)', + type: 'branch', + description: { + de: 'Unsere Ingenieurgesellschaft in Bülstedt ist spezialisiert auf die hochpräzise Planung, Vermessung und Projektierung von Energie- und Telekommunikationsnetzen. Hier verschmelzen technische Expertise und modernes Datenmanagement.', + en: 'Our engineering firm in Bülstedt specializes in the high-precision planning, surveying, and project management of energy and telecommunication networks. This is where technical expertise and modern data management converge.' + }, + address: { + street: 'Dorfstraße 1', // Placeholder + city: '27412 Bülstedt' + }, + contact: { + phone: '+49 (0) 3561 / 68577 33', // Placeholder, using central + email: 'info@e-tib.com' + }, + coordinates: { + lat: 53.2167, + lng: 9.15 + }, + keyFeatures: { + de: [ + 'Trassenplanung & Projektierung', + 'Geodätische Vermessung (GPS/Tachymetrie)', + 'As-Built Dokumentation (GIS/CAD)', + 'Genehmigungsmanagement' + ], + en: [ + 'Route planning & project management', + 'Geodetic surveying (GPS/Tacheometry)', + 'As-built documentation (GIS/CAD)', + 'Permit management' + ] + }, + image: '/assets/photos/etib_ingenieure_tiefbau_solar_pv_planung_vermessung_gis-256.jpg', + gallery: [ + '/assets/photos/etib_ingenieure_tiefbau_solar_pv_planung_vermessung_gis-294.jpg', + '/assets/photos/etib_ingenieure_tiefbau_solar_pv_planung_vermessung_gis-298.jpg' + ] + } +]; + +export function getStandortById(id: string): StandortData | undefined { + return standorteData.find(s => s.id === id); +}