Compare commits

..

7 Commits

Author SHA1 Message Date
766c385704 fix(content): replace video hero with image hero on messen pages
Some checks failed
CI - Lint, Typecheck & Test / quality-assurance (pull_request) Failing after 58s
Build & Deploy / 🔍 Prepare (push) Successful in 22s
Build & Deploy / 🧪 QA (push) Failing after 59s
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 1s
2026-06-15 14:42:56 +02:00
6c9d2b6832 fix(content): update images and review feedback
Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 21s
CI - Lint, Typecheck & Test / quality-assurance (pull_request) Failing after 59s
Build & Deploy / 🧪 QA (push) Failing after 49s
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 1s
2026-06-15 13:54:57 +02:00
7a9d4d7f18 fix(content): Update URL for Werkstatt Kabel 2026
Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 20s
Build & Deploy / 🧪 QA (push) Failing after 49s
Build & Deploy / 🚀 Deploy (push) Has been skipped
Build & Deploy / 🏗️ Build (push) Has been skipped
Build & Deploy / 🧪 Post-Deploy Verification (push) Has been skipped
Build & Deploy / 🔔 Notify (push) Successful in 1s
2026-06-15 13:41:03 +02:00
0b9929c2ec fix(content): Address all user review feedback
Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 22s
Build & Deploy / 🧪 QA (push) Failing after 50s
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
- Replace Mitarbeiter with Mitarbeitenden
- Add specialization sentence to Kabeltiefbau
- Update Werkstatt Kabel link
- Add Karriere to main navigation
- Add Referenzen to Footer
- Fix 404 for EN legal pages by using consistent internal slugs
2026-06-15 13:38:52 +02:00
aa0dfdf331 fix: refactor standorte detail page layout to match standard mdx pages and fix bohrtechnik links
All checks were successful
Build & Deploy / 🔍 Prepare (push) Successful in 34s
Build & Deploy / 🧪 QA (push) Successful in 1m10s
Build & Deploy / 🏗️ Build (push) Successful in 2m13s
Build & Deploy / 🚀 Deploy (push) Successful in 27s
Build & Deploy / 🧪 Post-Deploy Verification (push) Successful in 45s
Build & Deploy / 🔔 Notify (push) Successful in 2s
2026-06-15 11:26:09 +02:00
4c9028f58b feat(map): separate standorte and project map variants
All checks were successful
Build & Deploy / 🔍 Prepare (push) Successful in 24s
Build & Deploy / 🧪 QA (push) Successful in 56s
Build & Deploy / 🏗️ Build (push) Successful in 1m36s
Build & Deploy / 🚀 Deploy (push) Successful in 25s
Build & Deploy / 🧪 Post-Deploy Verification (push) Successful in 42s
Build & Deploy / 🔔 Notify (push) Successful in 2s
2026-06-15 00:19:56 +02:00
9de5f2938b fix(map): include standorteLocations in md pages
All checks were successful
Build & Deploy / 🔍 Prepare (push) Successful in 21s
Build & Deploy / 🧪 QA (push) Successful in 56s
Build & Deploy / 🏗️ Build (push) Successful in 1m35s
Build & Deploy / 🚀 Deploy (push) Successful in 26s
Build & Deploy / 🧪 Post-Deploy Verification (push) Successful in 43s
Build & Deploy / 🔔 Notify (push) Successful in 2s
2026-06-15 00:02:20 +02:00
37 changed files with 262 additions and 194 deletions

BIN
after-login.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 KiB

View File

@@ -10,7 +10,6 @@ import TrackedLink from '@/components/analytics/TrackedLink';
import { getButtonClasses, ButtonOverlay } from '@/components/ui/Button'; import { getButtonClasses, ButtonOverlay } from '@/components/ui/Button';
import { getAllReferences } from '@/lib/references'; import { getAllReferences } from '@/lib/references';
import { defaultLocations, minorLocations } from '@/lib/map-data'; import { defaultLocations, minorLocations } from '@/lib/map-data';
// Import components used in MDX // Import components used in MDX
import { HeroVideo as HomeHero } from '@/components/blocks/HeroVideo'; import { HeroVideo as HomeHero } from '@/components/blocks/HeroVideo';
import { SubCompanyTiles as HomeSubCompanyTiles } from '@/components/blocks/SubCompanyTiles'; import { SubCompanyTiles as HomeSubCompanyTiles } from '@/components/blocks/SubCompanyTiles';

View File

@@ -101,6 +101,10 @@ export default async function Layout(props: {
label: safeLocale === 'de' ? 'Referenzen' : 'References', label: safeLocale === 'de' ? 'Referenzen' : 'References',
url: `/${safeLocale}/referenzen` url: `/${safeLocale}/referenzen`
}, },
{
label: safeLocale === 'de' ? 'Karriere' : 'Career',
url: `/${safeLocale}/${safeLocale === 'de' ? 'karriere' : 'career'}`
},
{ {
label: safeLocale === 'de' ? 'Messen' : 'Events', label: safeLocale === 'de' ? 'Messen' : 'Events',
url: `/${safeLocale}/${await mapFileSlugToTranslated('messen', safeLocale)}` url: `/${safeLocale}/${await mapFileSlugToTranslated('messen', safeLocale)}`

View File

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

View File

@@ -63,9 +63,9 @@ export default async function StandortDetail(props: { params: Promise<{ locale:
} }
return ( return (
<div className="flex flex-col min-h-screen bg-neutral-50 pb-16 md:pb-24"> <div className="flex flex-col min-h-screen bg-white">
{/* Industrial Hero Section */} {/* Generic Hero Section to match standard pages */}
<section className="bg-primary-dark text-white pt-40 pb-12 md:pt-48 md:pb-16 min-h-[40vh] md:min-h-[45vh] flex flex-col justify-end relative overflow-hidden"> <section className="bg-primary-dark text-white pt-40 pb-12 md:pt-56 md:pb-16 min-h-[40vh] md:min-h-[45vh] flex flex-col justify-end relative overflow-hidden">
<div className="absolute inset-0 opacity-20 pointer-events-none"> <div className="absolute inset-0 opacity-20 pointer-events-none">
<div className="absolute top-0 left-0 w-full h-full bg-[radial-gradient(circle_at_center,_var(--tw-gradient-stops))] from-accent/50 via-transparent to-transparent" /> <div className="absolute top-0 left-0 w-full h-full bg-[radial-gradient(circle_at_center,_var(--tw-gradient-stops))] from-accent/50 via-transparent to-transparent" />
</div> </div>
@@ -75,139 +75,110 @@ export default async function StandortDetail(props: { params: Promise<{ locale:
<MapPin className="w-4 h-4" /> <MapPin className="w-4 h-4" />
{standort.type === 'hq' ? (safeLocale === 'de' ? 'Hauptsitz' : 'Headquarters') : (safeLocale === 'de' ? 'Niederlassung' : 'Branch')} {standort.type === 'hq' ? (safeLocale === 'de' ? 'Hauptsitz' : 'Headquarters') : (safeLocale === 'de' ? 'Niederlassung' : 'Branch')}
</Badge> </Badge>
<Heading level={1} variant="white" className="mb-6 drop-shadow-sm"> <Heading level={1} variant="white" className="mb-0 drop-shadow-sm">
{standort.name} {standort.name}
</Heading> </Heading>
<p className="text-xl md:text-2xl text-white/80 max-w-3xl leading-relaxed font-medium">
{standort.description[safeLocale]}
</p>
</div> </div>
</Container> </Container>
</section> </section>
<Container className="relative z-20 mt-12 md:mt-16"> {/* Main Content Area */}
<Container className="py-16 md:py-24">
{/* Excerpt/Lead paragraph */}
<div className="mb-16 max-w-4xl mx-auto">
<p className="text-xl md:text-2xl text-text-primary leading-relaxed font-medium border-l-4 border-primary pl-8 py-2 italic">
{standort.description[safeLocale]}
</p>
</div>
<div className="grid grid-cols-1 lg:grid-cols-12 gap-8 lg:gap-12"> {/* Main content in prose style */}
{/* Main Content (Images & Description) */} <div className="max-w-4xl mx-auto">
<div className="lg:col-span-8 space-y-8"> <div className="prose prose-lg md:prose-xl prose-neutral max-w-none prose-headings:font-heading prose-headings:font-bold prose-headings:tracking-tight prose-h1:text-4xl prose-h2:text-3xl prose-h2:mt-12 prose-h2:border-b prose-h2:border-neutral-200 prose-h2:pb-4 prose-h3:text-2xl prose-p:text-text-secondary prose-p:leading-relaxed prose-a:text-primary prose-a:font-medium prose-a:underline prose-a:underline-offset-4 prose-a:decoration-primary/30 hover:prose-a:decoration-primary prose-strong:text-text-primary prose-strong:font-semibold prose-li:text-text-secondary prose-ul:list-disc prose-ol:list-decimal">
{/* Featured Image */}
<div className="relative aspect-video w-full rounded-3xl overflow-hidden bg-neutral-900 shadow-xl border border-neutral-200">
<Image
src={standort.image}
alt={standort.name}
fill
className="object-cover"
priority
/>
<div className="absolute inset-0 bg-gradient-to-t from-black/40 to-transparent" />
</div>
{/* Key Features */}
<div className="bg-white rounded-3xl p-8 md:p-10 shadow-sm border border-neutral-100">
<h2 className="text-2xl font-bold font-heading mb-6 text-neutral-dark">
{safeLocale === 'de' ? 'Unsere Leistungen vor Ort' : 'Our Local Services'}
</h2>
<ul className="grid grid-cols-1 sm:grid-cols-2 gap-4">
{standort.keyFeatures[safeLocale].map((feature, idx) => (
<li key={idx} className="flex items-start gap-3">
<CheckCircle2 className="w-5 h-5 text-primary shrink-0 mt-0.5" />
<span className="text-neutral-700 font-medium">{feature}</span>
</li>
))}
</ul>
</div>
{/* Gallery (if any) */} <img className="rounded-2xl shadow-2xl my-12 max-w-full h-auto border border-neutral-100" src={standort.image} alt={standort.name} />
<h2 className="mt-16 mb-6 border-b border-neutral-100 pb-4">{safeLocale === 'de' ? 'Unsere Leistungen vor Ort' : 'Our Local Services'}</h2>
<ul className="list-none mb-8 space-y-3 text-base md:text-lg text-text-secondary font-medium max-w-3xl">
{standort.keyFeatures[safeLocale].map((feature, idx) => (
<li key={idx} className="relative pl-6 before:content-[''] before:absolute before:left-0 before:top-[0.6em] before:w-2 before:h-2 before:bg-primary/50 before:rounded-sm">
{feature}
</li>
))}
</ul>
<h2 className="mt-16 mb-6 border-b border-neutral-100 pb-4">{safeLocale === 'de' ? 'Kontakt & Anfahrt' : 'Contact & Directions'}</h2>
<p className="text-base md:text-lg text-text-secondary leading-[1.8] mb-6 font-medium max-w-3xl">
<strong>{safeLocale === 'de' ? 'Adresse:' : 'Address:'}</strong><br/>
{standort.address.street}<br/>
{standort.address.city}
</p>
<p className="text-base md:text-lg text-text-secondary leading-[1.8] mb-6 font-medium max-w-3xl">
<TrackedLink
href={`https://maps.google.com/?q=${encodeURIComponent(`${standort.address.street}, ${standort.address.city}`)}`}
target="_blank"
rel="noopener noreferrer"
className="text-primary hover:text-primary-dark underline decoration-primary/30 underline-offset-4 hover:decoration-primary transition-all font-bold flex items-center gap-1 w-fit"
eventProperties={{ location: 'standort_maps_link', slug: standort.id }}
>
{safeLocale === 'de' ? 'In Google Maps öffnen' : 'Open in Google Maps'}
<ArrowUpRight className="w-4 h-4 inline-block" />
</TrackedLink>
</p>
<p className="text-base md:text-lg text-text-secondary leading-[1.8] mb-6 font-medium max-w-3xl">
<strong>{safeLocale === 'de' ? 'Telefon:' : 'Phone:'}</strong><br/>
<a href={`tel:${standort.contact.phone.replace(/[^0-9+]/g, '')}`} className="text-primary hover:text-primary-dark underline decoration-primary/30 underline-offset-4 hover:decoration-primary transition-all font-bold">
{standort.contact.phone}
</a>
</p>
<p className="text-base md:text-lg text-text-secondary leading-[1.8] mb-6 font-medium max-w-3xl">
<strong>Email:</strong><br/>
<a href={`mailto:${standort.contact.email}`} className="text-primary hover:text-primary-dark underline decoration-primary/30 underline-offset-4 hover:decoration-primary transition-all font-bold">
{standort.contact.email}
</a>
</p>
{standort.gallery && standort.gallery.length > 0 && ( {standort.gallery && standort.gallery.length > 0 && (
<div className="grid grid-cols-2 gap-4"> <>
{standort.gallery.map((img, idx) => ( <h2 className="mt-16 mb-6 border-b border-neutral-100 pb-4">Galerie</h2>
<div key={idx} className="relative aspect-[4/3] rounded-2xl overflow-hidden bg-neutral-100"> <div className="grid grid-cols-1 md:grid-cols-2 gap-6 not-prose my-12">
<Image src={img} alt={`Gallery ${idx + 1}`} fill className="object-cover" /> {standort.gallery.map((img, idx) => (
</div> <div key={idx} className="relative aspect-[4/3] rounded-2xl overflow-hidden bg-neutral-100 border border-neutral-200 shadow-md hover:shadow-xl transition-shadow duration-300">
))} <Image src={img} alt={`Gallery ${idx + 1}`} fill className="object-cover transition-transform duration-700 hover:scale-105" />
</div> </div>
))}
</div>
</>
)} )}
</div> </div>
</div>
</Container>
{/* Sidebar (Contact & Address) */} {/* Support Section */}
<div className="lg:col-span-4"> <Container>
<div className="sticky top-32 space-y-6"> <div className="mt-12 mb-24 p-8 md:p-12 bg-primary-dark rounded-3xl text-white shadow-2xl relative overflow-hidden group animate-slight-fade-in-from-bottom">
<div className="absolute top-0 right-0 w-64 h-full bg-accent/5 -skew-x-12 translate-x-1/2 transition-transform group-hover:translate-x-1/3" />
{/* Contact Card */} <div className="relative z-10 max-w-2xl">
<div className="bg-[#050B14] text-white rounded-3xl p-8 shadow-2xl relative overflow-hidden group"> <h3 className="text-2xl md:text-3xl font-bold mb-4">{t('needHelp')}</h3>
<AnimatedGlossyBorder opacity={0.5} className="z-10" /> <p className="text-lg text-white/70 mb-8">{t('supportTeamAvailable')}</p>
<div className="absolute top-0 right-0 w-64 h-full bg-primary/5 blur-3xl -translate-y-1/2 translate-x-1/3" /> <TrackedLink
href={`/${locale}/${locale === 'de' ? 'kontakt' : 'contact'}`}
<div className="relative z-20"> className={getButtonClasses('accent', 'lg')}
<h3 className="text-xl font-bold font-heading mb-6 flex items-center gap-2"> eventProperties={{
<Navigation className="w-5 h-5 text-primary" /> location: 'standort_page_support_cta',
{safeLocale === 'de' ? 'Kontakt & Anfahrt' : 'Contact & Directions'} page_slug: slug,
</h3> }}
>
<div className="space-y-6"> <span className="relative z-10 flex items-center justify-center gap-2 transition-colors duration-500 group-hover/btn:text-primary-dark">
<div className="flex items-start gap-4"> {t('contactUs')}
<div className="w-10 h-10 rounded-full bg-white/5 flex items-center justify-center shrink-0"> <span className="ml-2 transition-transform group-hover/btn:translate-x-1">
<MapPin className="w-5 h-5 text-primary" /> &rarr;
</div> </span>
<div> </span>
<div className="text-xs text-white/50 font-bold uppercase tracking-wider mb-1"> <ButtonOverlay variant="accent" />
{safeLocale === 'de' ? 'Adresse' : 'Address'} </TrackedLink>
</div>
<div className="text-white font-medium">
{standort.address.street}<br />
{standort.address.city}
</div>
{(() => {
const baseUrl = 'https://maps.google.com/';
const mapsUrl = `${baseUrl}?q=${encodeURIComponent(`${standort.address.street}, ${standort.address.city}`)}`;
return (
<TrackedLink
href={mapsUrl}
target="_blank"
rel="noopener noreferrer"
className="inline-flex items-center gap-1 mt-2 text-primary hover:text-white transition-colors text-sm font-bold"
eventProperties={{ location: 'standort_maps_link', slug: standort.id }}
>
{safeLocale === 'de' ? 'In Google Maps öffnen' : 'Open in Google Maps'}
<ArrowUpRight className="w-3.5 h-3.5" />
</TrackedLink>
);
})()}
</div>
</div>
<div className="flex items-start gap-4">
<div className="w-10 h-10 rounded-full bg-white/5 flex items-center justify-center shrink-0">
<Phone className="w-5 h-5 text-primary" />
</div>
<div>
<div className="text-xs text-white/50 font-bold uppercase tracking-wider mb-1">
{safeLocale === 'de' ? 'Telefon' : 'Phone'}
</div>
<a href={`tel:${standort.contact.phone.replace(/[^0-9+]/g, '')}`} className="text-white font-medium hover:text-primary transition-colors">
{standort.contact.phone}
</a>
</div>
</div>
<div className="flex items-start gap-4">
<div className="w-10 h-10 rounded-full bg-white/5 flex items-center justify-center shrink-0">
<Mail className="w-5 h-5 text-primary" />
</div>
<div>
<div className="text-xs text-white/50 font-bold uppercase tracking-wider mb-1">
Email
</div>
<a href={`mailto:${standort.contact.email}`} className="text-white font-medium hover:text-primary transition-colors">
{standort.contact.email}
</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div> </div>
</div> </div>
</Container> </Container>

View File

@@ -6,7 +6,7 @@ import { MapPin, Navigation, ArrowUpRight } from 'lucide-react';
import { getButtonClasses, ButtonOverlay } from '@/components/ui/Button'; import { getButtonClasses, ButtonOverlay } from '@/components/ui/Button';
import { SITE_URL } from '@/lib/schema'; import { SITE_URL } from '@/lib/schema';
import Image from 'next/image'; import Image from 'next/image';
import { standorteData } from '@/lib/standorte-data'; import { standorteData, standorteLocations } from '@/lib/standorte-data';
import { InteractiveGermanyMap } from '@/components/blocks/InteractiveGermanyMap'; import { InteractiveGermanyMap } from '@/components/blocks/InteractiveGermanyMap';
interface PageProps { interface PageProps {
@@ -15,17 +15,15 @@ interface PageProps {
}>; }>;
} }
export async function generateMetadata({ params }: PageProps): Promise<Metadata> { export async function generateMetadata({ params }: { params: Promise<{ locale: string }> }): Promise<Metadata> {
const { locale } = await params; const { locale } = await params;
if (locale !== 'de' && locale !== 'en') return {}; const safeLocale = locale === 'de' ? 'de' : 'en';
return { return {
title: locale === 'de' ? 'Standorte | E-TIB Gruppe' : 'Locations | E-TIB Group', title: safeLocale === 'en' ? 'Our Locations' : 'Unsere Standorte',
description: locale === 'de' description: safeLocale === 'en' ? 'Our operational locations across Germany.' : 'Unsere operativen Standorte deutschlandweit.',
? '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: { alternates: {
canonical: `${SITE_URL}/${locale}/standorte`, canonical: `${SITE_URL}/${safeLocale}/standorte`,
languages: { languages: {
de: `${SITE_URL}/de/standorte`, de: `${SITE_URL}/de/standorte`,
en: `${SITE_URL}/en/standorte`, en: `${SITE_URL}/en/standorte`,
@@ -46,6 +44,7 @@ export default async function StandorteOverview(props: { params: Promise<{ local
{/* Map Hero Section */} {/* Map Hero Section */}
<InteractiveGermanyMap <InteractiveGermanyMap
isHero={true} isHero={true}
locations={standorteLocations}
badge={safeLocale === 'en' ? 'Our Locations' : 'Unsere Standorte'} badge={safeLocale === 'en' ? 'Our Locations' : 'Unsere Standorte'}
title={safeLocale === 'en' ? 'Nationwide operational for you.' : 'Deutschlandweit für Sie im Einsatz.'} title={safeLocale === 'en' ? 'Nationwide operational for you.' : 'Deutschlandweit für Sie im Einsatz.'}
description={safeLocale === 'en' description={safeLocale === 'en'

View File

@@ -7,12 +7,10 @@ import Image from 'next/image';
import { useRouter } from 'next/navigation'; import { useRouter } from 'next/navigation';
import Link from 'next/link'; import Link from 'next/link';
import { AnimatedGlossyBorder } from '@/components/ui/AnimatedGlossyBorder'; import { AnimatedGlossyBorder } from '@/components/ui/AnimatedGlossyBorder';
import { Location, defaultLocations, minorLocations } from '@/lib/map-data'; import { Location, defaultLocations, minorLocations, projectLocations } from '@/lib/map-data';
import { standorteLocations } from '@/lib/standorte-data'; import { standorteLocations } from '@/lib/standorte-data';
import { useLocale, useTranslations } from 'next-intl'; import { useLocale, useTranslations } from 'next-intl';
const allLocations = [...standorteLocations, ...defaultLocations, ...minorLocations];
interface Stat { interface Stat {
value: string; value: string;
suffix?: string; suffix?: string;
@@ -34,7 +32,7 @@ export function InteractiveGermanyMap({
title, title,
description, description,
stats, stats,
locations = allLocations, locations = projectLocations,
isHero = false isHero = false
}: InteractiveGermanyMapProps) { }: InteractiveGermanyMapProps) {
const [activeLocation, setActiveLocation] = useState<Location | null>(null); const [activeLocation, setActiveLocation] = useState<Location | null>(null);

View File

@@ -134,7 +134,7 @@ export function ReferencesSlider(props: ReferencesSliderProps) {
href={`/${locale}/referenzen/${ref.slug}`} href={`/${locale}/referenzen/${ref.slug}`}
data-testid="reference-tile" data-testid="reference-tile"
onClick={(e) => { onClick={(e) => {
if (dragDistanceRef.current > 5) { if (dragDistanceRef.current > 15) {
e.preventDefault(); e.preventDefault();
} }
}} }}

View File

@@ -108,6 +108,7 @@ export function Footer({ companyInfo }: FooterProps) {
{ label: locale === 'de' ? 'Über uns' : 'About us', href: `/${locale}/${locale === 'de' ? 'ueber-uns' : 'about-us'}` }, { label: locale === 'de' ? 'Über uns' : 'About us', href: `/${locale}/${locale === 'de' ? 'ueber-uns' : 'about-us'}` },
{ label: locale === 'de' ? 'Unser Team' : 'Our Team', href: `/${locale}/team` }, { label: locale === 'de' ? 'Unser Team' : 'Our Team', href: `/${locale}/team` },
{ label: locale === 'de' ? 'Zertifikate' : 'Certificates', href: `/${locale}/zertifikate` }, { label: locale === 'de' ? 'Zertifikate' : 'Certificates', href: `/${locale}/zertifikate` },
{ label: locale === 'de' ? 'Referenzen' : 'References', href: `/${locale}/referenzen` },
{ label: locale === 'de' ? 'Karriere' : 'Career', href: `/${locale}/${locale === 'de' ? 'karriere' : 'career'}` }, { label: locale === 'de' ? 'Karriere' : 'Career', href: `/${locale}/${locale === 'de' ? 'karriere' : 'career'}` },
{ label: locale === 'de' ? 'Messen & Events' : 'Fairs & Events', href: `/${locale}/${locale === 'de' ? 'messen' : 'trade-fairs'}` }, { label: locale === 'de' ? 'Messen & Events' : 'Fairs & Events', href: `/${locale}/${locale === 'de' ? 'messen' : 'trade-fairs'}` },
{ label: locale === 'de' ? 'Kontakt' : 'Contact', href: `/${locale}/${locale === 'de' ? 'kontakt' : 'contact'}` }, { label: locale === 'de' ? 'Kontakt' : 'Contact', href: `/${locale}/${locale === 'de' ? 'kontakt' : 'contact'}` },

File diff suppressed because one or more lines are too long

1
contact-page-debug.html Normal file

File diff suppressed because one or more lines are too long

BIN
contact.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 288 KiB

View File

@@ -9,7 +9,7 @@ layout: "fullBleed"
badge="Kernkompetenz" badge="Kernkompetenz"
title="Bohrtechnik" title="Bohrtechnik"
subtitle="Grabenlose Leitungsverlegung, Horizontalspülbohrungen und Erdraketen" subtitle="Grabenlose Leitungsverlegung, Horizontalspülbohrungen und Erdraketen"
backgroundImage={{ url: '/assets/photos/DSC08653.JPG' }} backgroundImage={{ url: '/assets/photos/Etib_E-tib_Tiefbau_Guben_Netzanbindung_Energie-47.jpg' }}
alignment="center" alignment="center"
ctaLabel="Projekt anfragen" ctaLabel="Projekt anfragen"
ctaHref="/de/kontakt" ctaHref="/de/kontakt"

View File

@@ -21,14 +21,14 @@ description: "Die E-TIB GmbH ist Ihr zuverlässiger Partner für komplexe Kabelt
description: "Das komplette Leistungsspektrum zur Errichtung von Kabeltrassen aus einer Hand.", 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", icon: "M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z",
url: "/de/standorte/guben", url: "/de/standorte/guben",
backgroundImage: "/assets/photos/DJI_0243.JPG" backgroundImage: "/assets/photos/Etib_E-tib_Tiefbau_Guben_Netzanbindung_Energie-54.jpg"
}, },
{ {
title: "E-TIB Ingenieurgesellschaft mbH", title: "E-TIB Ingenieurgesellschaft mbH",
description: "Unsere Ingenieure planen für Sie die Energie- und Telekommunikationsnetze der Zukunft - Vermessung und Dokumentation inklusive.", description: "Unsere Ingenieure planen für Sie die Energie- und Telekommunikationsnetze der Zukunft - Vermessung und Dokumentation inklusive.",
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", 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: "https://www.etib-ing.com/", url: "https://www.etib-ing.com/",
backgroundImage: "/assets/photos/DSC01137.JPG" backgroundImage: "/assets/photos/etib_ingenieure_tiefbau_solar_pv_planung_vermessung_gis-298.jpg"
}, },
{ {
title: "E-TIB Verwaltung GmbH", title: "E-TIB Verwaltung GmbH",
@@ -122,7 +122,7 @@ description: "Die E-TIB GmbH ist Ihr zuverlässiger Partner für komplexe Kabelt
tag: "Energie", tag: "Energie",
size: "large", size: "large",
href: "/de/kabeltiefbau", href: "/de/kabeltiefbau",
image: { url: "/assets/photos/DSC01123.JPG", alt: "Kabelleitungstiefbau" } image: { url: "/assets/photos/Etib_E-tib_Tiefbau_Guben_Netzanbindung_Energie-54.jpg", alt: "Kabelleitungstiefbau" }
}, },
{ {
title: "Bohrtechnik", title: "Bohrtechnik",
@@ -130,7 +130,7 @@ description: "Die E-TIB GmbH ist Ihr zuverlässiger Partner für komplexe Kabelt
tag: "Innovation", tag: "Innovation",
size: "medium", size: "medium",
href: "/de/bohrtechnik", href: "/de/bohrtechnik",
image: { url: "/assets/photos/DSC08653.JPG", alt: "Bohrtechnik" } image: { url: "/assets/photos/Etib_E-tib_Tiefbau_Guben_Netzanbindung_Energie-47.jpg", alt: "Bohrtechnik" }
}, },
{ {
title: "Planung", title: "Planung",
@@ -138,14 +138,15 @@ description: "Die E-TIB GmbH ist Ihr zuverlässiger Partner für komplexe Kabelt
tag: "Präzision", tag: "Präzision",
size: "small", size: "small",
href: "/de/planung", href: "/de/planung",
image: { url: "/assets/photos/DJI_0048.JPG", alt: "Planung" } image: { url: "/assets/photos/etib_ingenieure_tiefbau_solar_pv_planung_vermessung_gis-298.jpg", alt: "Planung" }
}, },
{ {
title: "Vermessung", title: "Vermessung",
description: "Digitale Bestandsdokumentation", description: "Digitale Bestandsdokumentation",
tag: "Digital", tag: "Digital",
size: "accent", size: "accent",
href: "/de/vermessung" href: "/de/vermessung",
image: { url: "/assets/photos/Etib_E-tib_Tiefbau_Guben_Netzanbindung_Energie_Vermessung_(26_von_99).jpg", alt: "Vermessung" }
} }
]} ]}
/> />

View File

@@ -26,7 +26,7 @@ layout: "fullBleed"
## Alles aus einer Hand ## Alles aus einer Hand
Durch unsere langjährige Erfahrung erkennen wir Problemstellungen frühzeitig und erarbeiten für unsere Auftraggeber im Vorfeld sichere und zufriedenstellende Lösungen. Die E-TIB GmbH hat sich voll und ganz auf den Kabelnetzbau spezialisiert. Durch unsere langjährige Erfahrung erkennen wir Problemstellungen frühzeitig und erarbeiten für unsere Auftraggeber im Vorfeld sichere und zufriedenstellende Lösungen.
Wir bieten Ihnen das komplette Leistungsspektrum zur Errichtung von Kabeltrassen aus einer Hand mit eigenem, hochmodernem Maschinenpark und festangestelltem Fachpersonal. In direkter Zusammenarbeit mit unserem Partnerbüro, der E-TIB Ingenieurgesellschaft mbH, können wir zudem frühzeitig Planungsfehler ausschließen und selbst die komplexesten Dokumentationsanforderungen souverän erfüllen. Wir bieten Ihnen das komplette Leistungsspektrum zur Errichtung von Kabeltrassen aus einer Hand mit eigenem, hochmodernem Maschinenpark und festangestelltem Fachpersonal. In direkter Zusammenarbeit mit unserem Partnerbüro, der E-TIB Ingenieurgesellschaft mbH, können wir zudem frühzeitig Planungsfehler ausschließen und selbst die komplexesten Dokumentationsanforderungen souverän erfüllen.
@@ -36,7 +36,9 @@ layout: "fullBleed"
<ServiceDetailGrid <ServiceDetailGrid
badge="Leistungsspektrum" badge="Leistungsspektrum"
title="Alles für Ihr Netz" title="Alles für Ihr Netz"
descriptionParagraphs={[]} descriptionParagraphs={[
"Wir bieten höchste Präzision, modernste Maschinen und zertifizierte Experten für Ihr Projekt."
]}
panels={[ panels={[
{ {
id: "grabenbau", id: "grabenbau",

View File

@@ -18,8 +18,8 @@ layout: "fullBleed"
<BenefitGrid <BenefitGrid
badge="E-TIB Standard" badge="E-TIB Standard"
title="Wir bieten unseren Mitarbeitern" title="Wir bieten unseren Mitarbeitenden"
description="Die E-TIB GmbH wurde aus der Motivation gegründet, hochwertige Leistungen sowie faire Entlohnung zu ermöglichen. Neben der Entlohnung steht die Wertschätzung jedes einzelnen Mitarbeiters bei uns an oberster Stelle." description="Die E-TIB GmbH wurde aus der Motivation gegründet, hochwertige Leistungen sowie faire Entlohnung zu ermöglichen. Neben der Entlohnung steht die Wertschätzung jedes einzelnen Mitarbeitenden bei uns an oberster Stelle."
benefits={[ benefits={[
{ {
id: "region", id: "region",

View File

@@ -5,13 +5,14 @@ excerpt: "Treffen Sie das Team der E-TIB Gruppe persönlich auf Fachmessen und B
layout: "fullBleed" layout: "fullBleed"
--- ---
<HomeHero <HeroSection
badge="Messen & Events" badge="Messen & Events"
title="Treffen Sie uns persönlich" title="Treffen Sie uns persönlich"
description="Lernen Sie die E-TIB Gruppe auf den führenden Branchenmessen kennen." subtitle="Lernen Sie die E-TIB Gruppe auf den führenden Branchenmessen kennen."
videoUrl="/assets/videos/web/hero-bahnkreuzung.mp4" backgroundImage={{ url: '/assets/photos/Etib_E-tib_Tiefbau_Guben_Netzanbindung_Energie-100.jpg' }}
linkText="Kontakt aufnehmen" alignment="center"
linkHref="/de/kontakt" ctaLabel="Kontakt aufnehmen"
ctaHref="/de/kontakt"
/> />
<div id="termine"> <div id="termine">
@@ -21,7 +22,7 @@ layout: "fullBleed"
fairs={[ fairs={[
{ name: 'Intersolar München', date: '23. - 25. Juni 2026', type: 'Messe', location: 'München', url: 'https://www.intersolar.de/' }, { name: 'Intersolar München', date: '23. - 25. Juni 2026', type: 'Messe', location: 'München', url: 'https://www.intersolar.de/' },
{ name: 'Windenergietage Linstow', date: '10. - 12. November 2026', type: 'Fachkongress', location: 'Linstow', url: 'https://www.windenergietage.de/' }, { name: 'Windenergietage Linstow', date: '10. - 12. November 2026', type: 'Fachkongress', location: 'Linstow', url: 'https://www.windenergietage.de/' },
{ name: 'Werkstatt Kabel 2026', date: '24. - 25. November 2026', type: 'Fachtagung', location: 'Wiesbaden' } { name: 'Werkstatt Kabel 2026', date: '24. - 25. November 2026', type: 'Fachtagung', location: 'Wiesbaden', url: 'https://werkstatt-kabel.essociation.de/' }
]} ]}
/> />
</div> </div>

View File

@@ -9,7 +9,7 @@ layout: "fullBleed"
badge="Kernkompetenz" badge="Kernkompetenz"
title="Planung & Beratung" title="Planung & Beratung"
subtitle="Kompetente Begleitung für Energie- und Telekommunikationsnetze" subtitle="Kompetente Begleitung für Energie- und Telekommunikationsnetze"
backgroundImage={{ url: '/assets/photos/DJI_0048.JPG' }} backgroundImage={{ url: '/assets/photos/etib_ingenieure_tiefbau_solar_pv_planung_vermessung_gis-298.jpg' }}
alignment="center" alignment="center"
ctaLabel="Projekt anfragen" ctaLabel="Projekt anfragen"
ctaHref="/de/kontakt" ctaHref="/de/kontakt"

View File

@@ -33,7 +33,7 @@ layout: "fullBleed"
<div className="grid grid-cols-2 gap-6"> <div className="grid grid-cols-2 gap-6">
<div className="bg-white p-8 rounded-2xl shadow-sm border border-neutral-100"> <div className="bg-white p-8 rounded-2xl shadow-sm border border-neutral-100">
<div className="text-4xl font-extrabold text-primary mb-2">100+</div> <div className="text-4xl font-extrabold text-primary mb-2">100+</div>
<div className="text-neutral-dark font-semibold">Mitarbeiter</div> <div className="text-neutral-dark font-semibold">Mitarbeitende</div>
</div> </div>
<div className="bg-white p-8 rounded-2xl shadow-sm border border-neutral-100"> <div className="bg-white p-8 rounded-2xl shadow-sm border border-neutral-100">
<div className="text-4xl font-extrabold text-primary mb-2">2015</div> <div className="text-4xl font-extrabold text-primary mb-2">2015</div>
@@ -66,14 +66,14 @@ layout: "fullBleed"
description: "Das komplette Leistungsspektrum zur Errichtung von Kabeltrassen aus einer Hand.", 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", icon: "M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z",
url: "/de/standorte/guben", url: "/de/standorte/guben",
backgroundImage: "/assets/photos/DJI_0243.JPG" backgroundImage: "/assets/photos/Etib_E-tib_Tiefbau_Guben_Netzanbindung_Energie-54.jpg"
}, },
{ {
title: "E-TIB Ingenieurgesellschaft mbH", title: "E-TIB Ingenieurgesellschaft mbH",
description: "Unsere Ingenieure planen für Sie die Energie- und Telekommunikationsnetze der Zukunft - Vermessung und Dokumentation inklusive.", description: "Unsere Ingenieure planen für Sie die Energie- und Telekommunikationsnetze der Zukunft - Vermessung und Dokumentation inklusive.",
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", 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: "https://www.etib-ing.com/", url: "https://www.etib-ing.com/",
backgroundImage: "/assets/photos/DSC01137.JPG" backgroundImage: "/assets/photos/etib_ingenieure_tiefbau_solar_pv_planung_vermessung_gis-298.jpg"
}, },
{ {
title: "E-TIB Verwaltung GmbH", title: "E-TIB Verwaltung GmbH",
@@ -86,8 +86,8 @@ layout: "fullBleed"
title: "E-TIB Bohrtechnik GmbH", title: "E-TIB Bohrtechnik GmbH",
description: "Präzise Horizontalspülbohrungen in allen Bodenklassen für eine oberflächenschonende und grabenlose Leitungsverlegung.", description: "Präzise Horizontalspülbohrungen in allen Bodenklassen für eine oberflächenschonende und grabenlose Leitungsverlegung.",
icon: "M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z", icon: "M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z",
url: "/de/bohrtechnik", url: "/de/standorte/kirchheilingen",
backgroundImage: "/assets/photos/DSC08653.JPG" backgroundImage: "/assets/photos/Etib_E-tib_Tiefbau_Guben_Netzanbindung_Energie-47.jpg"
} }
]} ]}
/> />

View File

@@ -8,8 +8,8 @@ layout: "fullBleed"
<HeroSection <HeroSection
badge="Kernkompetenz" badge="Kernkompetenz"
title="Vermessung & Dokumentation" title="Vermessung & Dokumentation"
subtitle="Lückenlose und rechtssichere Erfassung aller Bauphasen" subtitle="Hochpräzise digitale Bestandsdokumentation, 3D-Scans und Drohnenvermessung für Ihre Leitungstrassen und Anlagen."
backgroundImage={{ url: '/assets/photos/DSC08653.JPG' }} backgroundImage={{ url: '/assets/photos/Etib_E-tib_Tiefbau_Guben_Netzanbindung_Energie_Vermessung_(24_von_99)_groß2.jpg' }}
alignment="center" alignment="center"
ctaLabel="Projekt anfragen" ctaLabel="Projekt anfragen"
ctaHref="/de/kontakt" ctaHref="/de/kontakt"

View File

@@ -9,7 +9,7 @@ layout: "fullBleed"
badge="Core Competency" badge="Core Competency"
title="Drilling Technology" title="Drilling Technology"
subtitle="Trenchless Laying, horizontal directional drilling and earth rockets" subtitle="Trenchless Laying, horizontal directional drilling and earth rockets"
backgroundImage={{ url: '/assets/photos/DSC08653.JPG' }} backgroundImage={{ url: '/assets/photos/Etib_E-tib_Tiefbau_Guben_Netzanbindung_Energie-47.jpg' }}
alignment="center" alignment="center"
ctaLabel="Request a project" ctaLabel="Request a project"
ctaHref="/en/contact" ctaHref="/en/contact"

View File

@@ -21,14 +21,14 @@ description: "E-TIB GmbH is your reliable partner for complex cable routes, hori
description: "The complete range of services for the construction of cable routes from a single source.", 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", icon: "M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z",
url: "/en/standorte/guben", url: "/en/standorte/guben",
backgroundImage: "/assets/photos/DJI_0243.JPG" backgroundImage: "/assets/photos/Etib_E-tib_Tiefbau_Guben_Netzanbindung_Energie-54.jpg"
}, },
{ {
title: "E-TIB Ingenieurgesellschaft mbH", title: "E-TIB Ingenieurgesellschaft mbH",
description: "Our engineers plan the energy and telecommunications networks of the future for you - surveying and documentation included.", description: "Our engineers plan the energy and telecommunications networks of the future for you - surveying and documentation included.",
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", 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: "https://www.etib-ing.com/", url: "https://www.etib-ing.com/",
backgroundImage: "/assets/photos/DSC01137.JPG" backgroundImage: "/assets/photos/etib_ingenieure_tiefbau_solar_pv_planung_vermessung_gis-298.jpg"
}, },
{ {
title: "E-TIB Verwaltung GmbH", title: "E-TIB Verwaltung GmbH",
@@ -122,7 +122,7 @@ description: "E-TIB GmbH is your reliable partner for complex cable routes, hori
tag: "Energy", tag: "Energy",
size: "large", size: "large",
href: "/en/cable-civil-engineering", href: "/en/cable-civil-engineering",
image: { url: "/assets/photos/DSC01123.JPG", alt: "Cable Civil Engineering" } image: { url: "/assets/photos/Etib_E-tib_Tiefbau_Guben_Netzanbindung_Energie-54.jpg", alt: "Cable Civil Engineering" }
}, },
{ {
title: "Drilling Technology", title: "Drilling Technology",
@@ -130,7 +130,7 @@ description: "E-TIB GmbH is your reliable partner for complex cable routes, hori
tag: "Innovation", tag: "Innovation",
size: "medium", size: "medium",
href: "/en/drilling-technology", href: "/en/drilling-technology",
image: { url: "/assets/photos/DSC08653.JPG", alt: "Drilling Technology" } image: { url: "/assets/photos/Etib_E-tib_Tiefbau_Guben_Netzanbindung_Energie-47.jpg", alt: "Drilling Technology" }
}, },
{ {
title: "Planning", title: "Planning",
@@ -138,14 +138,15 @@ description: "E-TIB GmbH is your reliable partner for complex cable routes, hori
tag: "Precision", tag: "Precision",
size: "small", size: "small",
href: "/en/planning", href: "/en/planning",
image: { url: "/assets/photos/DJI_0048.JPG", alt: "Planning" } image: { url: "/assets/photos/etib_ingenieure_tiefbau_solar_pv_planung_vermessung_gis-298.jpg", alt: "Planning" }
}, },
{ {
title: "Surveying", title: "Surveying",
description: "Digital as-built documentation", description: "Digital as-built documentation",
tag: "Digital", tag: "Digital",
size: "accent", size: "accent",
href: "/en/surveying" href: "/en/surveying",
image: { url: "/assets/photos/Etib_E-tib_Tiefbau_Guben_Netzanbindung_Energie_Vermessung_(26_von_99).jpg", alt: "Surveying" }
} }
]} ]}
/> />

View File

@@ -24,19 +24,21 @@ layout: "fullBleed"
Modern civil engineering is plagued by low-cost contractors who routinely **compromise on safety margins and technical documentation**. The repercussions are severe: catastrophic utility strikes (power, water, gas, telecom), costly project delays, and massive budget overruns. What begins as a low-bid shortcut quickly turns into a financial and legal nightmare. Modern civil engineering is plagued by low-cost contractors who routinely **compromise on safety margins and technical documentation**. The repercussions are severe: catastrophic utility strikes (power, water, gas, telecom), costly project delays, and massive budget overruns. What begins as a low-bid shortcut quickly turns into a financial and legal nightmare.
## Integrated Excellence from a Single Source ## Everything from a single source
At E-TIB, we leverage decades of collective expertise to anticipate structural and geological bottlenecks long before the first shovel hits the ground. E-TIB GmbH is fully specialized in cable network construction. Thanks to our many years of experience, we identify problems early on and develop safe and satisfactory solutions for our clients in advance.
We deliver turnkey cable routes entirely in-house. Our operations are powered by a cutting-edge fleet of heavy machinery and staffed exclusively by highly trained, permanent professionals. Working in close synergy with our sister firm, **E-TIB Ingenieurgesellschaft mbH**, we eliminate planning oversights at the inception phase and effortlessly handle the most complex GIS and administrative documentation requirements in the industry. We offer you the complete range of services for the construction of cable routes from a single source - with our own ultra-modern machine park and permanently employed specialist staff. In direct cooperation with our partner office, E-TIB Ingenieurgesellschaft mbH, we can also rule out planning errors early on and master even the most complex documentation requirements confidently.
<DataGridPulse /> <DataGridPulse />
</div> </div>
<ServiceDetailGrid <ServiceDetailGrid
badge="Service Portfolio" badge="Service Spectrum"
title="Everything for Your Network" title="Everything for your network"
descriptionParagraphs={[]} descriptionParagraphs={[
"We offer the highest precision, state-of-the-art machinery, and certified experts for your project."
]}
panels={[ panels={[
{ {
id: "grabenbau", id: "grabenbau",

View File

@@ -5,13 +5,14 @@ excerpt: "Meet the team of the E-TIB Group personally at trade fairs and industr
layout: "fullBleed" layout: "fullBleed"
--- ---
<HomeHero <HeroSection
badge="Fairs & Events" badge="Fairs & Events"
title="Meet us personally" title="Meet us personally"
description="Get to know the E-TIB Group at the leading industry trade fairs." subtitle="Get to know the E-TIB Group at the leading industry trade fairs."
videoUrl="/assets/videos/web/hero-bahnkreuzung.mp4" backgroundImage={{ url: '/assets/photos/Etib_E-tib_Tiefbau_Guben_Netzanbindung_Energie-100.jpg' }}
linkText="Get in Touch" alignment="center"
linkHref="/en/contact" ctaLabel="Get in Touch"
ctaHref="/en/contact"
/> />
<div id="termine"> <div id="termine">
@@ -21,7 +22,7 @@ layout: "fullBleed"
fairs={[ fairs={[
{ name: 'Intersolar Munich', date: 'June 2325, 2026', type: 'Fair', location: 'Munich', url: 'https://www.intersolar.de/' }, { name: 'Intersolar Munich', date: 'June 2325, 2026', type: 'Fair', location: 'Munich', url: 'https://www.intersolar.de/' },
{ name: 'Wind Energy Days Linstow', date: 'November 1012, 2026', type: 'Specialist Congress', location: 'Linstow', url: 'https://www.windenergietage.de/' }, { name: 'Wind Energy Days Linstow', date: 'November 1012, 2026', type: 'Specialist Congress', location: 'Linstow', url: 'https://www.windenergietage.de/' },
{ name: 'Werkstatt Kabel 2026', date: 'November 2425, 2026', type: 'Symposium', location: 'Wiesbaden' } { name: 'Werkstatt Kabel 2026', date: 'November 2425, 2026', type: 'Symposium', location: 'Wiesbaden', url: 'https://werkstatt-kabel.essociation.de/' }
]} ]}
/> />
</div> </div>

View File

@@ -9,7 +9,7 @@ layout: "fullBleed"
badge="Core Competency" badge="Core Competency"
title="Planning & Consulting" title="Planning & Consulting"
subtitle="Competent support for energy and telecommunications networks" subtitle="Competent support for energy and telecommunications networks"
backgroundImage={{ url: '/assets/photos/DJI_0048.JPG' }} backgroundImage={{ url: '/assets/photos/etib_ingenieure_tiefbau_solar_pv_planung_vermessung_gis-298.jpg' }}
alignment="center" alignment="center"
ctaLabel="Request a project" ctaLabel="Request a project"
ctaHref="/en/contact" ctaHref="/en/contact"

View File

@@ -66,14 +66,14 @@ layout: "fullBleed"
description: "The complete range of services for the construction of cable routes from a single source.", 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", icon: "M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z",
url: "/en/standorte/guben", url: "/en/standorte/guben",
backgroundImage: "/assets/photos/DJI_0243.JPG" backgroundImage: "/assets/photos/Etib_E-tib_Tiefbau_Guben_Netzanbindung_Energie-54.jpg"
}, },
{ {
title: "E-TIB Ingenieurgesellschaft mbH", title: "E-TIB Ingenieurgesellschaft mbH",
description: "Our engineers plan the energy and telecommunications networks of the future for you - surveying and documentation included.", description: "Our engineers plan the energy and telecommunications networks of the future for you - surveying and documentation included.",
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", 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: "https://www.etib-ing.com/", url: "https://www.etib-ing.com/",
backgroundImage: "/assets/photos/DSC01137.JPG" backgroundImage: "/assets/photos/etib_ingenieure_tiefbau_solar_pv_planung_vermessung_gis-298.jpg"
}, },
{ {
title: "E-TIB Verwaltung GmbH", title: "E-TIB Verwaltung GmbH",
@@ -86,8 +86,8 @@ layout: "fullBleed"
title: "E-TIB Bohrtechnik GmbH", title: "E-TIB Bohrtechnik GmbH",
description: "Precise horizontal directional drilling in all soil classes for surface-friendly and trenchless pipe laying.", description: "Precise horizontal directional drilling in all soil classes for surface-friendly and trenchless pipe laying.",
icon: "M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z", icon: "M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z",
url: "/en/drilling-technology", url: "/en/standorte/kirchheilingen",
backgroundImage: "/assets/photos/DSC08653.JPG" backgroundImage: "/assets/photos/Etib_E-tib_Tiefbau_Guben_Netzanbindung_Energie-47.jpg"
} }
]} ]}
/> />

View File

@@ -8,8 +8,8 @@ layout: "fullBleed"
<HeroSection <HeroSection
badge="Core Competency" badge="Core Competency"
title="Surveying & Documentation" title="Surveying & Documentation"
subtitle="Seamless and legally compliant recording of all construction phases" subtitle="High-precision digital as-built documentation, 3D scans, and drone surveying for your line routes and facilities."
backgroundImage={{ url: '/assets/photos/DSC08653.JPG' }} backgroundImage={{ url: '/assets/photos/Etib_E-tib_Tiefbau_Guben_Netzanbindung_Energie_Vermessung_(24_von_99)_groß2.jpg' }}
alignment="center" alignment="center"
ctaLabel="Request a project" ctaLabel="Request a project"
ctaHref="/en/contact" ctaHref="/en/contact"

View File

@@ -896,3 +896,4 @@ export const minorLocations: Location[] = [
description: 'pv', description: 'pv',
}, },
]; ];
export const projectLocations = [...defaultLocations, ...minorLocations];

1
login-result.html Normal file

File diff suppressed because one or more lines are too long

View File

@@ -29,7 +29,12 @@ async function run() {
console.log(` Waiting for potential Gatekeeper redirect...`); console.log(` Waiting for potential Gatekeeper redirect...`);
await new Promise((resolve) => setTimeout(resolve, 3000)); await new Promise((resolve) => setTimeout(resolve, 3000));
const isGatekeeper = await page.$('input[name="password"]'); let isGatekeeper = null;
try {
isGatekeeper = await page.$('input[name="password"]');
} catch (e) {
console.log('Navigation happened while checking gatekeeper:', e.message);
}
if (isGatekeeper) { if (isGatekeeper) {
await page.type('input[name="password"]', gatekeeperPassword); await page.type('input[name="password"]', gatekeeperPassword);
await Promise.all([ await Promise.all([
@@ -65,7 +70,7 @@ async function run() {
urls.map(async (url) => { urls.map(async (url) => {
if (url.includes('openstreetmap.org') || url.includes('unpkg.com')) return; if (url.includes('openstreetmap.org') || url.includes('unpkg.com')) return;
try { try {
const res = await fetch(url, { method: 'HEAD' }); const res = await fetch(url, { method: 'GET' });
if (res.status >= 400) { if (res.status >= 400) {
// Diagnostic: check if the raw source is available // Diagnostic: check if the raw source is available
const rawUrlMatch = url.match(/[?&]url=([^&]+)/); const rawUrlMatch = url.match(/[?&]url=([^&]+)/);
@@ -73,7 +78,7 @@ async function run() {
const rawPath = decodeURIComponent(rawUrlMatch[1]); const rawPath = decodeURIComponent(rawUrlMatch[1]);
const baseUrl = new URL(url).origin; const baseUrl = new URL(url).origin;
const rawUrl = `${baseUrl}${rawPath}`; const rawUrl = `${baseUrl}${rawPath}`;
const rawRes = await fetch(rawUrl, { method: 'HEAD' }); const rawRes = await fetch(rawUrl, { method: 'GET' });
broken.push(`${url} (Status: ${res.status}, Raw Status: ${rawRes.status})`); broken.push(`${url} (Status: ${res.status}, Raw Status: ${rawRes.status})`);
} else { } else {
broken.push(`${url} (Status: ${res.status})`); broken.push(`${url} (Status: ${res.status})`);

32
test-contact-auth.cjs Normal file
View File

@@ -0,0 +1,32 @@
const puppeteer = require('puppeteer');
(async () => {
const targetUrl = 'https://test.e-tib.com';
const gatekeeperPassword = process.env.GATEKEEPER_PASSWORD || 'klz2026';
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.goto(targetUrl, { waitUntil: 'domcontentloaded' });
await new Promise((resolve) => setTimeout(resolve, 3000));
const isGatekeeper = await page.$('input[name="password"]');
if (isGatekeeper) {
await page.type('input[name="password"]', gatekeeperPassword);
await Promise.all([
page.click('button[type="submit"]'),
]);
await new Promise((resolve) => setTimeout(resolve, 5000));
}
await page.screenshot({ path: 'after-login.png' });
await page.goto(`${targetUrl}/de/kontakt`, { waitUntil: 'domcontentloaded' });
await new Promise(r => setTimeout(r, 2000));
const html = await page.content();
const fs = require('fs');
fs.writeFileSync('contact-page-auth-debug.html', html);
await page.screenshot({ path: 'contact.png' });
await browser.close();
})();

12
test-contact.cjs Normal file
View File

@@ -0,0 +1,12 @@
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.goto('https://test.e-tib.com/de/kontakt', { waitUntil: 'networkidle0' });
const html = await page.content();
const fs = require('fs');
fs.writeFileSync('contact-page-debug.html', html);
await browser.close();
})();

12
test-contact.js Normal file
View File

@@ -0,0 +1,12 @@
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.goto('https://test.e-tib.com/de/kontakt', { waitUntil: 'networkidle0' });
const html = await page.content();
const fs = require('fs');
fs.writeFileSync('contact-page-debug.html', html);
await browser.close();
})();

24
test-login-error.cjs Normal file
View File

@@ -0,0 +1,24 @@
const puppeteer = require('puppeteer');
(async () => {
const targetUrl = 'https://test.e-tib.com';
const gatekeeperPassword = process.env.GATEKEEPER_PASSWORD || 'klz2026';
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.goto(targetUrl, { waitUntil: 'networkidle0' });
const isGatekeeper = await page.$('input[name="password"]');
if (isGatekeeper) {
await page.type('input[name="password"]', gatekeeperPassword);
await Promise.all([
page.click('button[type="submit"]'),
page.waitForNavigation({ waitUntil: 'networkidle0' }).catch(() => {})
]);
const html = await page.content();
const fs = require('fs');
fs.writeFileSync('login-result.html', html);
} else {
console.log("No gatekeeper found!");
}
await browser.close();
})();