Compare commits

...

4 Commits

Author SHA1 Message Date
3bb6eb3447 fix: revert bohrtechnik to competence link, remove kirchheilingen location
All checks were successful
Build & Deploy / 🔍 Prepare (push) Successful in 20s
Build & Deploy / 🧪 QA (push) Successful in 1m5s
Build & Deploy / 🏗️ Build (push) Successful in 2m11s
Build & Deploy / 🚀 Deploy (push) Successful in 33s
Build & Deploy / 🧪 Post-Deploy Verification (push) Successful in 42s
Build & Deploy / 🔔 Notify (push) Successful in 1s
2026-06-14 22:46:16 +02:00
a3c732dd13 fix: add individual standorte to header dropdown
Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 44s
Build & Deploy / 🧪 QA (push) Successful in 1m6s
Build & Deploy / 🏗️ Build (push) Successful in 2m5s
Build & Deploy / 🚀 Deploy (push) Failing after 31s
Build & Deploy / 🧪 Post-Deploy Verification (push) Has been skipped
Build & Deploy / 🔔 Notify (push) Successful in 1s
2026-06-14 22:33:33 +02:00
aaa1a8793c fix(types): resolve typecheck errors for SubCompanyTiles and standorteLocations
All checks were successful
Build & Deploy / 🔍 Prepare (push) Successful in 20s
Build & Deploy / 🧪 QA (push) Successful in 55s
Build & Deploy / 🏗️ Build (push) Successful in 1m40s
Build & Deploy / 🚀 Deploy (push) Successful in 24s
Build & Deploy / 🧪 Post-Deploy Verification (push) Successful in 41s
Build & Deploy / 🔔 Notify (push) Successful in 2s
2026-06-14 22:02:36 +02:00
233509db67 fix(links): update all maps and tiles to use standorte pages as single source of truth
Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 43s
Build & Deploy / 🧪 QA (push) Failing after 1m5s
Build & Deploy / 🏗️ Build (push) Has been skipped
Build & Deploy / 🚀 Deploy (push) Has been skipped
Build & Deploy / 🧪 Post-Deploy Verification (push) Has been skipped
Build & Deploy / 🔔 Notify (push) Successful in 2s
2026-06-14 21:40:48 +02:00
10 changed files with 78 additions and 108 deletions

View File

@@ -92,7 +92,9 @@ 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' ? 'Standorte Übersicht' : 'Locations Overview', url: `/${safeLocale}/standorte` },
{ label: 'Standort Guben', url: `/${safeLocale}/standorte/guben` },
{ label: 'Standort Bülstedt', url: `/${safeLocale}/standorte/buelstedt` },
{ label: safeLocale === 'de' ? 'Unser Team' : 'Our Team', url: `/${safeLocale}/team` },
{ label: safeLocale === 'de' ? 'Zertifikate' : 'Certificates', url: `/${safeLocale}/zertifikate` }
]

View File

@@ -9,6 +9,7 @@ import { SITE_URL } from '@/lib/schema';
import Image from 'next/image';
import { InteractiveGermanyMap } from '@/components/blocks/InteractiveGermanyMap';
import { defaultLocations, minorLocations } from '@/lib/map-data';
import { standorteLocations } from '@/lib/standorte-data';
interface PageProps {
params: Promise<{
@@ -52,7 +53,7 @@ export default async function ReferenzenOverview(props: { params: Promise<{ loca
const references = await getAllReferences(locale);
const allLocations = [...defaultLocations, ...minorLocations];
const allLocations = [...standorteLocations, ...defaultLocations, ...minorLocations];
const enrichedLocations = allLocations.map(loc => {
if (loc.type === 'project') {
const ref = references.find(r => r.slug === loc.id);

View File

@@ -8,9 +8,10 @@ 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 { standorteLocations } from '@/lib/standorte-data';
import { useLocale, useTranslations } from 'next-intl';
const allLocations = [...defaultLocations, ...minorLocations];
const allLocations = [...standorteLocations, ...defaultLocations, ...minorLocations];
interface Stat {
value: string;

View File

@@ -3,6 +3,7 @@
import * as React from 'react';
import { motion, Variants } from 'framer-motion';
import Image from 'next/image';
import Link from 'next/link';
import { HoverShineOverlay } from '@/components/ui/HoverShineOverlay';
import { AnimatedGlossyBorder } from '@/components/ui/AnimatedGlossyBorder';
@@ -87,8 +88,9 @@ export function SubCompanyTiles(props: SubCompanyTilesProps) {
{companiesData.map((company: any, index: number) => {
const isCurrent = company.title.toUpperCase() === 'E-TIB GMBH';
const hasUrl = !!company.url;
const CardWrapper = hasUrl ? 'a' : 'div';
const wrapperProps = hasUrl ? { href: company.url, target: "_blank", rel: "noopener noreferrer" } : {};
const isExternal = hasUrl && company.url.startsWith('http');
const CardWrapper = hasUrl ? (isExternal ? 'a' : Link) : 'div';
const wrapperProps = hasUrl ? (isExternal ? { href: company.url, target: "_blank", rel: "noopener noreferrer" } : { href: company.url }) : {};
// Generate logo representation based on title
const isEtib = company.title.includes('E-TIB');
@@ -112,33 +114,21 @@ export function SubCompanyTiles(props: SubCompanyTilesProps) {
const positionClass = bgPositionClasses[index % bgPositionClasses.length];
const animationClass = animationClasses[index % animationClasses.length];
return (
<motion.div
key={index}
variants={itemVariants}
className="h-full"
>
<CardWrapper
{...wrapperProps}
className={`group relative overflow-hidden aspect-[4/3] flex flex-col justify-center items-center shadow-xl transition-all duration-500 bg-neutral-dark block w-full h-full sm:rounded-xl select-none ${
isCurrent
? 'border-2 border-primary shadow-[0_0_30px_rgba(17,124,97,0.15)] cursor-default'
: 'border border-white/5 hover:shadow-2xl hover:-translate-y-1 hover:border-white/10 cursor-pointer'
}`}
>
<div className="absolute inset-0 bg-[#0a192f] z-0">
<Image
src={company.backgroundImage}
alt="Background"
fill
className={`object-cover transition-all duration-1000 ease-out ${
isCurrent
? 'opacity-30 grayscale-0 scale-105'
: 'opacity-40 grayscale-[50%] group-hover:opacity-30 group-hover:grayscale-0 group-hover:scale-110'
}`}
sizes="(max-width: 768px) 100vw, 33vw"
/>
</div>
const CardContent = (
<>
<div className="absolute inset-0 bg-[#0a192f] z-0">
<Image
src={company.backgroundImage}
alt="Background"
fill
className={`object-cover transition-all duration-1000 ease-out ${
isCurrent
? 'opacity-30 grayscale-0 scale-105'
: 'opacity-40 grayscale-[50%] group-hover:opacity-30 group-hover:grayscale-0 group-hover:scale-110'
}`}
sizes="(max-width: 768px) 100vw, 33vw"
/>
</div>
{/* Heavy dark gradient overlay to make logos pop */}
<div className={`absolute inset-0 z-0 transition-colors duration-700 mix-blend-multiply ${
@@ -227,13 +217,42 @@ export function SubCompanyTiles(props: SubCompanyTilesProps) {
{company.url && (
<div className="absolute bottom-6 left-0 right-0 flex justify-center opacity-0 group-hover:opacity-100 transform translate-y-4 group-hover:translate-y-0 transition-all duration-500 z-20">
<div className="flex items-center text-white font-bold uppercase text-xs tracking-widest bg-white/10 backdrop-blur-md px-4 py-2 rounded-full border border-white/20">
Website Besuchen
{isExternal ? (isDe ? 'Website Besuchen' : 'Visit Website') : (isDe ? 'Zum Standort' : 'View Location')}
<svg className="w-4 h-4 ml-2" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2"><path d="M5 12h14M12 5l7 7-7 7"/></svg>
</div>
</div>
)}
</CardWrapper>
</>
);
const sharedClass = `group relative overflow-hidden aspect-[4/3] flex flex-col justify-center items-center shadow-xl transition-all duration-500 bg-neutral-dark block w-full h-full sm:rounded-xl select-none ${
isCurrent
? 'border border-white/5 hover:shadow-2xl hover:-translate-y-1 hover:border-white/10 cursor-pointer'
: 'border border-white/5 hover:shadow-2xl hover:-translate-y-1 hover:border-white/10 cursor-pointer'
}`;
return (
<motion.div
key={index}
variants={itemVariants}
className="h-full"
>
{hasUrl ? (
isExternal ? (
<a href={company.url} target="_blank" rel="noopener noreferrer" className={sharedClass}>
{CardContent}
</a>
) : (
<Link href={company.url as string} className={sharedClass}>
{CardContent}
</Link>
)
) : (
<div className={sharedClass}>
{CardContent}
</div>
)}
</motion.div>
);
})}

View File

@@ -20,6 +20,7 @@ description: "Die E-TIB GmbH ist Ihr zuverlässiger Partner für komplexe Kabelt
title: "E-TIB GMBH",
description: "Das komplette Leistungsspektrum zur Errichtung von Kabeltrassen aus einer Hand.",
icon: "M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z",
url: "/de/standorte/guben",
backgroundImage: "/assets/photos/DJI_0243.JPG"
},
{
@@ -33,6 +34,7 @@ description: "Die E-TIB GmbH ist Ihr zuverlässiger Partner für komplexe Kabelt
title: "E-TIB Verwaltung GmbH",
description: "Zentrale Dienste, Einkauf und Finanzen sowie Verwaltung von Immobilien, Grundstücken, Maschinen und Geräten.",
icon: "M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4",
url: "/de/standorte/buelstedt",
backgroundImage: "/assets/photos/DJI_0048.JPG"
},
{

View File

@@ -65,7 +65,7 @@ layout: "fullBleed"
title: "E-TIB GMBH",
description: "Das komplette Leistungsspektrum zur Errichtung von Kabeltrassen aus einer Hand.",
icon: "M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z",
url: "/de/kabeltiefbau",
url: "/de/standorte/guben",
backgroundImage: "/assets/photos/DJI_0243.JPG"
},
{
@@ -79,6 +79,7 @@ layout: "fullBleed"
title: "E-TIB Verwaltung GmbH",
description: "Zentrale Dienste, Einkauf und Finanzen sowie Verwaltung von Immobilien, Grundstücken, Maschinen und Geräten.",
icon: "M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4",
url: "/de/standorte/buelstedt",
backgroundImage: "/assets/photos/DJI_0048.JPG"
},
{

View File

@@ -20,6 +20,7 @@ description: "E-TIB GmbH is your reliable partner for complex cable routes, hori
title: "E-TIB GMBH",
description: "The complete range of services for the construction of cable routes from a single source.",
icon: "M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z",
url: "/en/standorte/guben",
backgroundImage: "/assets/photos/DJI_0243.JPG"
},
{
@@ -33,6 +34,7 @@ description: "E-TIB GmbH is your reliable partner for complex cable routes, hori
title: "E-TIB Verwaltung GmbH",
description: "Central services, purchasing, finance, and management of real estate, properties, machinery, and equipment.",
icon: "M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4",
url: "/en/standorte/buelstedt",
backgroundImage: "/assets/photos/DJI_0048.JPG"
},
{

View File

@@ -65,7 +65,7 @@ layout: "fullBleed"
title: "E-TIB GMBH",
description: "The complete range of services for the construction of cable routes from a single source.",
icon: "M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z",
url: "/en/cable-civil-engineering",
url: "/en/standorte/guben",
backgroundImage: "/assets/photos/DJI_0243.JPG"
},
{
@@ -79,6 +79,7 @@ layout: "fullBleed"
title: "E-TIB Verwaltung GmbH",
description: "Central services, purchasing, finance, and management of real estate, properties, machinery, and equipment.",
icon: "M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4",
url: "/en/standorte/buelstedt",
backgroundImage: "/assets/photos/DJI_0048.JPG"
},
{

View File

@@ -11,36 +11,6 @@ export interface Location {
}
export const defaultLocations: Location[] = [
{
id: 'guben',
name: 'Guben (Hauptsitz)',
type: 'hq',
x: 85,
y: 41.1,
description: 'E-TIB GmbH Holding & Bohrtechnik GmbH',
href: '/standorte/guben',
details: ['Zentrale Steuerung', 'Kabelleitungstiefbau', 'Maschinenpark'],
},
{
id: 'kirchheilingen',
name: 'E-TIB Bohrtechnik GmbH',
type: 'branch',
x: 52,
y: 55,
description: 'Standort in Thüringen',
href: '/standorte/kirchheilingen',
details: ['Bahnhofstraße 180a', '99947 Kirchheilingen'],
},
{
id: 'buelstedt',
name: 'Bülstedt (Ingenieurgesellschaft)',
type: 'branch',
x: 37,
y: 25.33,
description: 'E-TIB Ingenieurgesellschaft mbH',
href: '/standorte/buelstedt',
details: ['Planung & Projektierung', 'Vermessung', 'Dokumentation'],
},
{
id: 'dettmannsdorf',
name: 'Dettmannsdorf (PV)',

View File

@@ -73,47 +73,6 @@ export const standorteData: StandortData[] = [
'/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',
@@ -160,3 +119,15 @@ export const standorteData: StandortData[] = [
export function getStandortById(id: string): StandortData | undefined {
return standorteData.find(s => s.id === id);
}
// Convert StandortData to the Location format required by the map
export const standorteLocations = standorteData.map(standort => ({
id: standort.id,
name: standort.shortName,
type: standort.type,
x: standort.id === 'buelstedt' ? 37 : 85,
y: standort.id === 'buelstedt' ? 25.33 : 41.1,
description: standort.name,
href: `/standorte/${standort.id}`,
details: standort.keyFeatures.de.slice(0, 3)
}));