feat: modernize digital presence, team layout, and hero component parity
Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 17s
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

This commit is contained in:
2026-05-15 11:03:01 +02:00
parent 3808339711
commit 0516dbe743
32 changed files with 824 additions and 495 deletions

View File

@@ -25,6 +25,7 @@ import { InteractiveGermanyMap } from '@/components/blocks/InteractiveGermanyMap
import { FaqBlock } from '@/components/blocks/FaqBlock';
import { CertificatesBlock } from '@/components/blocks/CertificatesBlock';
import { HeroSection } from '@/components/blocks/HeroSection';
import { TeamGrid } from '@/components/blocks/TeamGrid';
import JsonLd from '@/components/JsonLd';
import { Button } from '@/components/ui/Button';
@@ -43,6 +44,7 @@ const mdxComponents = {
FaqBlock,
CertificatesBlock,
HeroSection,
TeamGrid,
JsonLd,
Button,
// Standard HTML element mapping for consistent E-TIB typography

View File

@@ -120,7 +120,7 @@ export default async function ContactPage({ params }: ContactPageProps) {
{
'@type': 'OpeningHoursSpecification',
dayOfWeek: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'],
opens: '08:00',
opens: '07:00',
closes: '17:00',
},
],
@@ -214,6 +214,20 @@ export default async function ContactPage({ params }: ContactPageProps) {
/>
</div>
</div>
<div className="flex items-start gap-4 md:gap-6 group">
<div className="w-10 h-10 md:w-14 md:h-14 rounded-xl md:rounded-2xl bg-saturated/10 flex items-center justify-center text-saturated group-hover:bg-accent group-hover:text-primary-dark transition-all duration-300 shadow-sm flex-shrink-0">
<svg className="w-5 h-5 md:w-7 md:h-7" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z"></path></svg>
</div>
<div>
<h4 className="text-base md:text-xl font-bold text-primary mb-1 md:mb-2">
{locale === 'de' ? 'Telefon' : 'Phone'}
</h4>
<a href="tel:+4935616857733" className="text-sm md:text-lg text-text-secondary hover:text-primary transition-colors font-medium touch-target block">
+49 (0) 3561 / 68577 33
</a>
</div>
</div>
</address>
</div>

View File

@@ -89,7 +89,12 @@ export default async function Layout(props: {
},
{
label: safeLocale === 'de' ? 'Über uns' : 'About Us',
url: `/${safeLocale}/${await mapFileSlugToTranslated('ueber-uns', safeLocale)}`
url: `/${safeLocale}/${await mapFileSlugToTranslated('ueber-uns', safeLocale)}`,
children: [
{ label: safeLocale === 'de' ? 'Firma' : 'Company', url: `/${safeLocale}/${await mapFileSlugToTranslated('ueber-uns', safeLocale)}` },
{ label: safeLocale === 'de' ? 'Unser Team' : 'Our Team', url: `/${safeLocale}/team` },
{ label: safeLocale === 'de' ? 'Zertifikate' : 'Certificates', url: `/${safeLocale}/zertifikate` }
]
},
{
label: safeLocale === 'de' ? 'Referenzen' : 'References',

View File

@@ -1,25 +0,0 @@
import { ImageResponse } from 'next/og';
import { getTranslations } from 'next-intl/server';
import { OGImageTemplate } from '@/components/OGImageTemplate';
import { getOgFonts, OG_IMAGE_SIZE } from '@/lib/og-helper';
export const size = OG_IMAGE_SIZE;
export const contentType = 'image/png';
export const runtime = 'nodejs';
export default async function Image({ params }: { params: Promise<{ locale: string }> }) {
const { locale } = await params;
const t = await getTranslations({ locale, namespace: 'Team' });
const fonts = await getOgFonts();
const title = t('meta.title') || t('hero.subtitle');
const description = t('meta.description') || t('hero.title');
return new ImageResponse(
<OGImageTemplate title={title} description={description} label="Our Team" />,
{
...OG_IMAGE_SIZE,
fonts,
},
);
}

View File

@@ -1,326 +0,0 @@
import { getTranslations, setRequestLocale } from 'next-intl/server';
import { Metadata } from 'next';
import JsonLd from '@/components/JsonLd';
import { getBreadcrumbSchema, SITE_URL } from '@/lib/schema';
import { Section, Container, Heading, Badge } from '@/components/ui';
import Image from 'next/image';
import Reveal from '@/components/Reveal';
import Gallery from '@/components/team/Gallery';
import TrackedButton from '@/components/analytics/TrackedButton';
interface TeamPageProps {
params: Promise<{
locale: string;
}>;
}
export async function generateMetadata({ params }: TeamPageProps): Promise<Metadata> {
const { locale } = await params;
const t = await getTranslations({ locale, namespace: 'Team' });
const title = t('meta.title') || t('hero.subtitle');
const description = t('meta.description') || t('hero.title');
return {
title,
description,
alternates: {
canonical: `${SITE_URL}/${locale}/team`,
languages: {
de: `${SITE_URL}/de/team`,
en: `${SITE_URL}/en/team`,
'x-default': `${SITE_URL}/en/team`,
},
},
openGraph: {
title: `${title} | E-TIB`,
description,
url: `${SITE_URL}/${locale}/team`,
},
twitter: {
card: 'summary_large_image',
title: `${title} | E-TIB`,
description,
},
};
}
export default async function TeamPage({ params }: TeamPageProps) {
const { locale } = await params;
setRequestLocale(locale);
const t = await getTranslations({ locale, namespace: 'Team' });
return (
<div className="flex flex-col min-h-screen bg-neutral-light">
<JsonLd
id="breadcrumb-team"
data={getBreadcrumbSchema([{ name: t('hero.subtitle'), item: `/team` }])}
/>
<JsonLd
id="person-michael"
data={{
'@context': 'https://schema.org',
'@type': 'Person',
name: t('michael.name'),
jobTitle: t('michael.role'),
worksFor: {
'@type': 'Organization',
name: 'E-TIB',
},
sameAs: ['https://www.linkedin.com/in/michael-bodemer-33b493122/'],
image: `${SITE_URL}/uploads/2024/12/DSC07768-Large.webp`,
}}
/>
<JsonLd
id="person-klaus"
data={{
'@context': 'https://schema.org',
'@type': 'Person',
name: t('klaus.name'),
jobTitle: t('klaus.role'),
worksFor: {
'@type': 'Organization',
name: 'E-TIB',
},
sameAs: ['https://www.linkedin.com/in/klaus-mintel-b80a8b193/'],
image: `${SITE_URL}/uploads/2024/12/DSC07963-Large.webp`,
}}
/>
{/* Hero Section */}
<Reveal>
<section className="relative flex items-center justify-center overflow-hidden bg-primary-dark pt-32 pb-24 md:pt-[14%] md:pb-[12%]">
<div className="absolute inset-0 z-0">
<Image
src="/uploads/2024/12/DSC07655-Large.webp"
alt="E-TIB Team"
fill
className="object-cover scale-105 animate-slow-zoom opacity-30 md:opacity-40"
sizes="100vw"
priority
/>
<div className="absolute inset-0 bg-gradient-to-b from-primary-dark/80 via-primary-dark/40 to-primary-dark/80" />
</div>
<Container className="relative z-10 text-center text-white max-w-5xl">
<Badge variant="saturated" className="mb-4 md:mb-8 shadow-lg">
{t('hero.badge')}
</Badge>
<Heading level={1} className="text-white mb-4 md:mb-8">
{t('hero.subtitle')}
</Heading>
<p className="text-lg md:text-2xl text-white/70 font-medium italic">
{t('hero.title')}
</p>
</Container>
</section>
</Reveal>
{/* Michael Bodemer Section - Sticky Narrative Split Layout */}
<article className="relative bg-white overflow-hidden">
<div className="flex flex-col lg:flex-row">
<Reveal className="w-full lg:w-1/2 p-6 md:p-24 lg:p-32 flex flex-col justify-center bg-primary-dark text-white relative order-2 lg:order-1">
<div className="absolute top-0 right-0 w-32 h-full bg-accent/5 -skew-x-12 translate-x-1/2" />
<div className="relative z-10">
<Badge variant="accent" className="mb-4 md:mb-8">
{t('michael.role')}
</Badge>
<Heading level={2} className="text-white mb-6 md:mb-10 text-2xl md:text-4xl">
<span className="text-white">{t('michael.name')}</span>
</Heading>
<div className="relative mb-6 md:mb-12">
<div className="absolute -left-4 md:-left-8 top-0 bottom-0 w-1 md:w-1.5 bg-accent rounded-full" />
<p className="text-base md:text-xl font-bold italic leading-relaxed pl-5 md:pl-8 text-white/90">
{t('michael.quote')}
</p>
</div>
<p className="text-base md:text-xl leading-relaxed text-white/70 mb-6 md:mb-12 max-w-xl">
{t('michael.description')}
</p>
<TrackedButton
href="https://www.linkedin.com/in/michael-bodemer-33b493122/"
variant="accent"
size="lg"
className="group w-full md:w-auto md:h-16 md:px-10 md:text-xl active:scale-95 transition-transform"
eventProperties={{
type: 'social_linkedin',
person: 'Michael Bodemer',
location: 'team_page',
}}
>
{t('michael.linkedin')}
<span className="ml-3 transition-transform group-hover:translate-x-2">&rarr;</span>
</TrackedButton>
</div>
</Reveal>
<Reveal className="w-full lg:w-1/2 relative min-h-[400px] md:min-h-[600px] lg:min-h-screen overflow-hidden order-1 lg:order-2">
<Image
src="/uploads/2024/12/DSC07768-Large.webp"
alt={t('michael.name')}
fill
className="object-cover scale-105 hover:scale-100 transition-transform duration-1000"
quality={100}
sizes="(max-width: 1024px) 100vw, 50vw"
/>
<div className="absolute inset-0 bg-gradient-to-t from-primary-dark/60 lg:bg-gradient-to-r lg:from-primary-dark/20 to-transparent" />
</Reveal>
</div>
</article>
{/* Legacy Section - Immersive Background */}
<Reveal>
<section className="relative py-16 md:py-48 bg-primary-dark text-white overflow-hidden">
<div className="absolute inset-0 z-0">
<Image
src="/uploads/2024/12/1694273920124-copy.webp"
alt={t('legacy.subtitle')}
fill
className="object-cover opacity-20 md:opacity-30 scale-110 animate-slow-zoom"
sizes="100vw"
/>
<div className="absolute inset-0 bg-primary-dark/60 mix-blend-multiply" />
</div>
<Container className="relative z-10">
<div className="grid grid-cols-1 lg:grid-cols-12 gap-8 md:gap-16 items-center">
<div className="lg:col-span-6">
<Heading
level={2}
subtitle={t('legacy.subtitle')}
className="text-white mb-6 md:mb-10"
>
<span className="text-white">{t('legacy.title')}</span>
</Heading>
<div className="space-y-4 md:space-y-8 text-base md:text-2xl text-white/80 leading-relaxed font-medium">
<p className="border-l-4 border-accent pl-5 md:pl-8 py-2 bg-white/5 backdrop-blur-sm rounded-r-xl md:rounded-r-2xl">
{t('legacy.p1')}
</p>
<p className="pl-6 md:pl-9 line-clamp-3 md:line-clamp-none">{t('legacy.p2')}</p>
</div>
</div>
<div className="lg:col-span-6 grid grid-cols-2 md:grid-cols-2 gap-3 md:gap-6">
<div className="p-4 md:p-8 bg-white/5 backdrop-blur-md border border-white/10 rounded-2xl md:rounded-[32px] hover:bg-white/10 transition-colors">
<div className="text-xl md:text-4xl font-extrabold text-accent mb-1 md:mb-2">
{t('legacy.expertise')}
</div>
<div className="text-[10px] md:text-sm font-bold uppercase tracking-widest text-white/50">
{t('legacy.expertiseDesc')}
</div>
</div>
<div className="p-4 md:p-8 bg-white/5 backdrop-blur-md border border-white/10 rounded-2xl md:rounded-[32px] hover:bg-white/10 transition-colors">
<div className="text-xl md:text-4xl font-extrabold text-accent mb-1 md:mb-2">
{t('legacy.network')}
</div>
<div className="text-[10px] md:text-sm font-bold uppercase tracking-widest text-white/50">
{t('legacy.networkDesc')}
</div>
</div>
</div>
</div>
</Container>
</section>
</Reveal>
{/* Klaus Mintel Section - Reversed Split Layout */}
<article className="relative bg-white overflow-hidden">
<div className="flex flex-col lg:flex-row">
<Reveal className="w-full lg:w-1/2 relative min-h-[400px] md:min-h-[600px] lg:min-h-screen overflow-hidden order-1">
<Image
src="/uploads/2024/12/DSC07963-Large.webp"
alt={t('klaus.name')}
fill
className="object-cover scale-105 hover:scale-100 transition-transform duration-1000"
quality={100}
sizes="(max-width: 1024px) 100vw, 50vw"
/>
<div className="absolute inset-0 bg-gradient-to-t from-white/60 lg:bg-gradient-to-l lg:from-primary-dark/20 to-transparent" />
</Reveal>
<Reveal className="w-full lg:w-1/2 p-6 md:p-24 lg:p-32 flex flex-col justify-center bg-neutral-light text-saturated relative order-2">
<div className="absolute top-0 left-0 w-32 h-full bg-saturated/5 skew-x-12 -translate-x-1/2" />
<div className="relative z-10">
<Badge variant="saturated" className="mb-4 md:mb-8">
{t('klaus.role')}
</Badge>
<Heading level={2} className="text-saturated mb-6 md:mb-10 text-2xl md:text-4xl">
{t('klaus.name')}
</Heading>
<div className="relative mb-6 md:mb-12">
<div className="absolute -left-4 md:-left-8 top-0 bottom-0 w-1 md:w-1.5 bg-saturated rounded-full" />
<p className="text-base md:text-xl font-bold italic leading-relaxed pl-5 md:pl-8 text-text-secondary">
{t('klaus.quote')}
</p>
</div>
<p className="text-base md:text-xl leading-relaxed text-text-secondary mb-6 md:mb-12 max-w-xl">
{t('klaus.description')}
</p>
<TrackedButton
href="https://www.linkedin.com/in/klaus-mintel-b80a8b193/"
variant="saturated"
size="lg"
className="group w-full md:w-auto md:h-16 md:px-10 md:text-xl active:scale-95 transition-transform"
eventProperties={{
type: 'social_linkedin',
person: 'Klaus Mintel',
location: 'team_page',
}}
>
{t('klaus.linkedin')}
<span className="ml-3 transition-transform group-hover:translate-x-2">&rarr;</span>
</TrackedButton>
</div>
</Reveal>
</div>
</article>
{/* Manifesto Section - Modern Grid */}
<Section className="bg-white text-primary py-16 md:py-28">
<Container>
<div className="sticky-narrative-container">
<div className="sticky-narrative-sidebar mb-8 lg:mb-0">
<div className="lg:sticky lg:top-32">
<Heading level={2} subtitle={t('manifesto.subtitle')} className="mb-4 md:mb-8">
{t('manifesto.title')}
</Heading>
<p className="text-base md:text-xl text-text-secondary leading-relaxed">
{t('manifesto.tagline')}
</p>
{/* Mobile-only progress indicator */}
<div className="flex lg:hidden mt-8 gap-2">
{[0, 1, 2, 3, 4, 5].map((i) => (
<div
key={i}
className="h-1.5 flex-1 bg-neutral-medium rounded-full overflow-hidden"
>
<div className="h-full bg-accent w-0 group-active:w-full transition-all duration-500" />
</div>
))}
</div>
</div>
</div>
<ul className="sticky-narrative-content grid grid-cols-1 md:grid-cols-2 gap-4 md:gap-10 list-none p-0 m-0">
{[0, 1, 2, 3, 4, 5].map((idx) => (
<li
key={idx}
className="p-6 md:p-10 bg-neutral-light rounded-2xl md:rounded-[40px] border border-transparent hover:border-accent hover:bg-white hover:shadow-2xl transition-all duration-500 group active:scale-[0.98] touch-target-none"
>
<div className="w-10 h-10 md:w-16 md:h-16 bg-white rounded-xl md:rounded-2xl flex items-center justify-center mb-4 md:mb-8 shadow-sm group-hover:bg-accent transition-colors duration-500">
<span className="text-primary font-extrabold text-lg md:text-2xl group-hover:text-primary-dark">
0{idx + 1}
</span>
</div>
<h3 className="text-lg md:text-2xl font-bold mb-2 md:mb-4 text-primary">
{t(`manifesto.items.${idx}.title`)}
</h3>
<p className="text-sm md:text-lg text-text-secondary leading-relaxed">
{t(`manifesto.items.${idx}.description`)}
</p>
</li>
))}
</ul>
</div>
</Container>
</Section>
<Reveal>
<Gallery />
</Reveal>
</div>
);
}

View File

@@ -21,7 +21,7 @@ const defaultMilestones = [
date: '16.12.2015',
year: '2015',
title: 'Gründung E-TIB GmbH',
desc: 'Ausführung elektrischer Infrastrukturprojekte, Kabelbau und Horizontalspülbohrungen.',
desc: 'Ausführung elektrischer Infrastrukturprojekte, Kabeltiefbau und Horizontalspülbohrungen.',
iconName: 'Building2',
},
{

View File

@@ -19,6 +19,7 @@ interface CompetenceBentoGridProps {
title?: string;
description?: string;
tag?: string;
href?: string;
image?: {
url?: string;
alt?: string;
@@ -34,6 +35,7 @@ interface CompetenceBentoGridProps {
title?: string;
description?: string;
tag?: string;
href?: string;
image?: {
url?: string;
alt?: string;
@@ -111,8 +113,11 @@ export function CompetenceBentoGrid(props: CompetenceBentoGridProps) {
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ delay: idx * 0.1 }}
className={gridClasses}
className={`${gridClasses} ${item.href ? 'cursor-pointer hover:-translate-y-1 transition-transform duration-300' : ''}`}
>
{item.href && (
<Link href={item.href} className="absolute inset-0 z-30" aria-label={item.title} />
)}
<div className="absolute top-0 right-0 w-32 h-32 bg-primary/30 blur-3xl rounded-full -mr-10 -mt-10 group-hover:bg-primary/50 transition-colors duration-500" />
{/* Subtle Background Logo Arcs */}
@@ -135,8 +140,11 @@ export function CompetenceBentoGrid(props: CompetenceBentoGridProps) {
whileInView={{ opacity: 1, scale: 1 }}
viewport={{ once: true }}
transition={{ delay: idx * 0.1 }}
className={gridClasses}
className={`${gridClasses} ${item.href ? 'cursor-pointer hover:-translate-y-1 transition-transform duration-300' : ''}`}
>
{item.href && (
<Link href={item.href} className="absolute inset-0 z-30" aria-label={item.title} />
)}
{!imgSrc && (
<div className="absolute inset-0 bg-neutral-dark z-0 transition-colors duration-500 group-hover:bg-primary-dark" />
)}

View File

@@ -42,7 +42,7 @@ export const HeroSection: React.FC<HeroSectionProps> = (props) => {
return (
<section
className={`relative min-h-[50vh] md:min-h-[70vh] flex items-center pt-32 pb-20 md:pt-40 md:pb-32 overflow-hidden bg-primary-dark ${alignment === 'center' ? 'justify-center text-center' : ''}`}
className={`relative min-h-[45vh] md:min-h-[55vh] flex items-center pt-32 pb-20 md:pt-36 md:pb-24 overflow-hidden bg-neutral-dark ${alignment === 'center' ? 'justify-center text-center' : ''}`}
>
{bgSrc && (
<motion.div
@@ -55,14 +55,22 @@ export const HeroSection: React.FC<HeroSectionProps> = (props) => {
src={bgSrc}
alt={title || 'Hero Background'}
fill
className="object-cover opacity-30 md:opacity-40"
className="object-cover filter contrast-110 saturate-110 brightness-95"
style={{
objectPosition: `${backgroundImage?.focalX ?? 50}% ${backgroundImage?.focalY ?? 50}%`,
}}
sizes="100vw"
priority
/>
<div className="absolute inset-0 bg-gradient-to-b from-primary-dark/80 via-primary-dark/40 to-primary-dark/80" />
{/* Cinematic Color Grading Overlay */}
<div className="absolute inset-0 bg-[#0a192f]/30 z-[2] mix-blend-multiply" />
{/* Dramatic Vignette & Fade to content */}
<div className="absolute inset-0 bg-[radial-gradient(ellipse_at_center,_var(--tw-gradient-stops))] from-transparent via-black/20 to-black/80 z-[2]" />
<div className="absolute inset-0 bg-gradient-to-t from-neutral-dark via-neutral-dark/60 to-transparent z-[3]" />
{/* Top Fade for Header Navigation Readability */}
<div className="absolute top-0 left-0 w-full h-48 bg-gradient-to-b from-black/70 to-transparent z-[3] pointer-events-none" />
</motion.div>
)}
<Container className={`relative z-10 ${alignment === 'center' ? 'max-w-5xl' : ''}`}>
@@ -80,19 +88,19 @@ export const HeroSection: React.FC<HeroSectionProps> = (props) => {
</motion.div>
)}
<motion.div variants={itemVariants}>
<Heading level={1} variant="white" className="mb-4 md:mb-8">
<Heading level={1} variant="white" align={alignment || 'left'} className="mb-4 md:mb-8">
{title}
</Heading>
</motion.div>
{subtitle && (
<motion.div variants={itemVariants}>
<p className="text-lg md:text-2xl text-white/70 font-medium leading-relaxed max-w-2xl">
<p className={`text-lg md:text-2xl text-white/70 font-medium leading-relaxed max-w-2xl ${alignment === 'center' ? 'mx-auto' : ''}`}>
{subtitle}
</p>
</motion.div>
)}
{ctaLabel && ctaHref && (
<motion.div variants={itemVariants} className="mt-8">
<motion.div variants={itemVariants} className={`mt-8 ${alignment === 'center' ? 'flex justify-center' : ''}`}>
<Button
href={ctaHref}
variant="accent"

View File

@@ -12,6 +12,7 @@ interface HeroVideoProps {
description?: string;
videoUrl?: string;
posterImage?: any;
backgroundImage?: any;
ctaLabel?: string;
ctaHref?: string;
linkText?: string;
@@ -25,11 +26,11 @@ export function HeroVideo(props: HeroVideoProps) {
const { data } = props;
const title = props.title || data?.title || 'DIE EXPERTEN FÜR KABELTIEFBAU';
const subtitle = props.subtitle || props.description || data?.subtitle || 'Wir verbinden Infrastruktur mit Präzision. Von Horizontalbohrungen bis zu komplexen Leitungsnetzen.';
const videoUrl = props.videoUrl || data?.videoUrl || '/assets/dummy-hero.mp4';
const explicitNoVideo = props.videoUrl === 'none' || props.videoUrl === '';
const videoUrl = explicitNoVideo ? null : (props.videoUrl || data?.videoUrl || '/assets/dummy-hero.mp4');
const posterSrc = data?.posterImage?.url || "/assets/photos/DJI_0048.JPG";
const posterAlt = data?.posterImage?.alt || "E-TIB Gruppe Baustelle";
const posterSrc = props.backgroundImage?.url || props.posterImage?.url || data?.posterImage?.url || "/assets/photos/DJI_0048.JPG";
const posterAlt = props.backgroundImage?.alt || data?.posterImage?.alt || "E-TIB Gruppe Baustelle";
const ctaLabel = props.ctaLabel || props.linkText || data?.ctaLabel || 'Unternehmen entdecken';
const ctaHref = props.ctaHref || props.linkHref || data?.ctaHref || '#unternehmen';
@@ -53,7 +54,7 @@ export function HeroVideo(props: HeroVideoProps) {
{/* Background color while video loads */}
<div className="absolute inset-0 z-0 bg-neutral-dark" />
{videoUrl && (
{videoUrl ? (
<video
key={videoUrl}
className="absolute inset-0 w-full h-full object-cover z-1 pointer-events-none filter contrast-125 saturate-110 brightness-90"
@@ -64,6 +65,15 @@ export function HeroVideo(props: HeroVideoProps) {
playsInline
preload="auto"
/>
) : (
<Image
src={posterSrc}
alt={posterAlt}
fill
className="object-cover z-1 pointer-events-none filter contrast-125 saturate-110 brightness-90"
sizes="100vw"
priority
/>
)}
{/* Cinematic Color Grading Overlay */}

View File

@@ -194,8 +194,8 @@ export function ServiceDetailGrid({
<HoverShineOverlay shineColor="via-primary/5" />
<div className="relative z-10 flex flex-col md:flex-row justify-between items-start mb-12 gap-6">
<div className="pt-2">
<h4 className="text-2xl md:text-3xl font-extrabold text-neutral-dark uppercase tracking-wider">{panel.title}</h4>
<div className="pt-2 flex-1 min-w-0 pr-4">
<h4 className="text-2xl md:text-3xl font-extrabold text-neutral-dark uppercase tracking-wider break-words hyphens-auto" lang="de">{panel.title}</h4>
<div className="h-1 w-12 bg-primary mt-6 transition-all duration-700 group-hover:w-24 rounded-full"></div>
</div>

View File

@@ -3,7 +3,6 @@
import * as React from 'react';
import { motion } from 'framer-motion';
import Image from 'next/image';
import { HoverShineOverlay } from '@/components/ui/HoverShineOverlay';
export interface TeamMember {
id: string;
@@ -15,7 +14,7 @@ export interface TeamMember {
url: string;
alt?: string;
} | string | null;
branch: string;
branch?: string;
}
interface TeamGridProps {
@@ -36,61 +35,137 @@ export function TeamGrid({ members }: TeamGridProps) {
</p>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
{members.map((member, i) => (
{members.length > 0 && (
<div className="mb-20">
<motion.div
initial={{ opacity: 0, y: 30 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
className="relative rounded-[2.5rem] bg-neutral-dark overflow-hidden shadow-2xl border border-white/10"
>
{/* Premium Background Effects */}
<div className="absolute inset-0 bg-[radial-gradient(circle_at_top_right,rgba(238,114,3,0.15),transparent_50%)] pointer-events-none" />
<div className="absolute top-0 right-0 w-[500px] h-[500px] bg-primary/20 blur-[120px] mix-blend-screen rounded-full pointer-events-none" />
<div className="absolute inset-0 opacity-20 pointer-events-none" style={{ backgroundImage: "url('data:image/svg+xml,%3Csvg width=\\'40\\' height=\\'40\\' viewBox=\\'0 0 40 40\\' xmlns=\\'http://www.w3.org/2000/svg\\'%3E%3Cpath d=\\'M0 0h40v40H0V0zm20 20h20v20H20V20zM0 20h20v20H0V20z\\' fill=\\'%23ffffff\\' fill-opacity=\\'0.02\\' fill-rule=\\'evenodd\\'/%3E%3C/svg%3E')" }} />
<div className="relative z-10 flex flex-col lg:flex-row items-center justify-between p-8 md:p-12 lg:p-20 gap-12 lg:gap-16">
{/* Text Content */}
<div className="w-full lg:w-[55%] flex flex-col justify-center text-white">
<div className="inline-flex items-center space-x-2 px-4 py-1.5 mb-8 rounded-full border border-primary/30 bg-primary/10 text-primary text-xs font-bold uppercase tracking-widest self-start backdrop-blur-md shadow-[0_0_20px_rgba(238,114,3,0.2)]">
<span className="relative flex h-2 w-2 mr-1">
<span className="animate-ping absolute inline-flex h-full w-full rounded-full bg-primary opacity-75"></span>
<span className="relative inline-flex rounded-full h-2 w-2 bg-primary"></span>
</span>
Geschäftsführung
</div>
<h3 className="font-heading font-black text-5xl md:text-6xl lg:text-7xl mb-4 leading-[1.1] tracking-tight">
{members[0].name}
</h3>
<p className="text-xl md:text-2xl text-white/70 font-medium mb-10 leading-relaxed max-w-xl">
{members[0].position}
</p>
<div className="flex flex-col sm:flex-row gap-4">
{members[0].email && (
<a href={`mailto:${members[0].email}`} className="group flex items-center justify-center sm:justify-start gap-4 bg-white/5 hover:bg-primary border border-white/10 hover:border-primary px-6 py-4 rounded-2xl transition-all duration-300 shadow-lg">
<svg className="w-5 h-5 text-white/70 group-hover:text-white transition-colors" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2"><path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"></path><polyline points="22,6 12,13 2,6"></polyline></svg>
<span className="font-semibold text-white/90 group-hover:text-white transition-colors">{members[0].email}</span>
</a>
)}
{members[0].phone && (
<a href={`tel:${members[0].phone}`} className="group flex items-center justify-center sm:justify-start gap-4 bg-white/5 hover:bg-white/10 border border-white/10 px-6 py-4 rounded-2xl transition-all duration-300 shadow-lg">
<svg className="w-5 h-5 text-white/70 group-hover:text-white transition-colors" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2"><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z"></path></svg>
<span className="font-semibold text-white/90 group-hover:text-white transition-colors">{members[0].phone}</span>
</a>
)}
</div>
</div>
{/* Premium Image Block */}
<div className="w-full lg:w-[45%] flex justify-center lg:justify-end perspective-1000">
<div className="relative w-64 h-64 md:w-80 md:h-80 lg:w-[400px] lg:h-[400px] rounded-[3rem] overflow-hidden border-4 border-white/10 shadow-[0_30px_60px_rgba(0,0,0,0.6)] transform md:rotate-3 hover:rotate-0 transition-all duration-700 bg-neutral-800 group">
{members[0].image && (typeof members[0].image === 'string' ? members[0].image : members[0].image.url) ? (
<Image
src={typeof members[0].image === 'string' ? members[0].image : members[0].image.url}
alt={members[0].name}
fill
sizes="400px"
className="object-cover scale-110 group-hover:scale-100 transition-transform duration-1000 ease-out"
/>
) : (
<div className="absolute inset-0 flex items-center justify-center text-white/20">
<svg className="w-20 h-20" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1"><path d="M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2"></path><circle cx="12" cy="7" r="4"></circle></svg>
</div>
)}
</div>
</div>
</div>
</motion.div>
</div>
)}
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8 xl:gap-10">
{members.slice(1).map((member, i) => (
<motion.div
key={member.id}
initial={{ opacity: 0, y: 30 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, margin: "-50px" }}
transition={{ delay: i * 0.1, duration: 0.6, ease: [0.16, 1, 0.3, 1] }}
className="group relative bg-neutral-50 rounded-[2rem] p-8 border border-neutral-200/60 transition-all duration-500 hover:bg-white hover:border-primary/30 hover:shadow-[0_20px_40px_-15px_rgba(0,0,0,0.05)] hover:-translate-y-2 overflow-hidden"
className="group flex flex-col bg-white rounded-[2rem] border border-neutral-100 shadow-[0_8px_30px_rgb(0,0,0,0.04)] hover:shadow-[0_20px_40px_rgba(238,114,3,0.1)] transition-all duration-500 hover:-translate-y-2 overflow-hidden"
>
<HoverShineOverlay shineColor="via-primary/5" />
<div className="relative z-10 flex flex-col h-full">
<div className="flex items-center gap-6 mb-6">
<div className="relative w-24 h-24 flex-shrink-0 rounded-[1.25rem] overflow-hidden bg-neutral-200 border border-neutral-100 shadow-sm group-hover:shadow-md transition-shadow duration-500">
{member.image && typeof member.image === 'object' && member.image.url ? (
<Image
src={member.image.url}
alt={member.name}
fill
sizes="96px"
className="object-cover group-hover:scale-110 transition-transform duration-700 ease-in-out"
/>
) : (
<div className="absolute inset-0 flex items-center justify-center text-neutral-400">
<svg className="w-10 h-10" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1"><path d="M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2"></path><circle cx="12" cy="7" r="4"></circle></svg>
</div>
)}
</div>
<div>
<h4 className="font-heading font-bold text-2xl text-neutral-dark mb-1 leading-tight group-hover:text-primary transition-colors duration-300">{member.name}</h4>
<p className="text-primary font-medium text-sm mb-1">{member.position}</p>
<p className="inline-block px-2 py-0.5 mt-1 bg-neutral-100 text-neutral-600 rounded-md text-xs uppercase tracking-widest font-semibold border border-neutral-200/60">
{member.branch === 'e-tib' ? 'E-TIB GmbH' : member.branch === 'ing' ? 'Ingenieurgesellschaft' : 'Bohrtechnik'}
</p>
</div>
{/* Card Banner */}
<div className="h-32 bg-neutral-50 relative border-b border-neutral-100 overflow-hidden">
<div className="absolute inset-0 bg-gradient-to-br from-neutral-100 to-neutral-200/50" />
<div className="absolute inset-0 opacity-[0.03] pointer-events-none" style={{ backgroundImage: "url('data:image/svg+xml,%3Csvg width=\\'20\\' height=\\'20\\' viewBox=\\'0 0 20 20\\' xmlns=\\'http://www.w3.org/2000/svg\\'%3E%3Crect width=\\'1\\' height=\\'1\\' fill=\\'%23000000\\'/%3E%3C/svg%3E')" }} />
</div>
<div className="px-8 pb-8 relative flex-grow flex flex-col">
{/* Overlapping Profile Picture */}
<div className="w-24 h-24 rounded-2xl overflow-hidden border-4 border-white shadow-xl bg-white relative -mt-12 mb-6 group-hover:-translate-y-2 transition-transform duration-500">
{member.image && (typeof member.image === 'string' ? member.image : member.image.url) ? (
<Image
src={typeof member.image === 'string' ? member.image : member.image.url}
alt={member.name}
fill
sizes="96px"
className="object-cover"
/>
) : (
<div className="absolute inset-0 flex items-center justify-center text-neutral-300 bg-neutral-50">
<svg className="w-10 h-10" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1"><path d="M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2"></path><circle cx="12" cy="7" r="4"></circle></svg>
</div>
)}
</div>
{/* Details */}
<h4 className="font-heading font-extrabold text-2xl text-neutral-dark mb-1 group-hover:text-primary transition-colors duration-300 leading-tight">{member.name}</h4>
<p className="text-primary font-bold text-xs uppercase tracking-widest mb-6">{member.position}</p>
<div className="mt-auto pt-6 border-t border-neutral-200/60 space-y-3">
{member.branch && (
<div className="mb-6">
<span className="inline-block px-3 py-1 bg-neutral-100 text-neutral-600 rounded-md text-xs uppercase tracking-widest font-semibold border border-neutral-200/60">
{member.branch === 'e-tib' ? 'E-TIB GmbH' : member.branch === 'ing' ? 'Ingenieurgesellschaft' : member.branch === 'bohrtechnik' ? 'Bohrtechnik' : member.branch}
</span>
</div>
)}
{/* Contacts (Sticky at bottom) */}
<div className="mt-auto pt-6 border-t border-neutral-100 flex flex-col gap-4">
{member.email && (
<a href={`mailto:${member.email}`} className="group/link flex items-center gap-3 text-text-secondary hover:text-primary transition-colors text-sm font-medium">
<div className="w-8 h-8 rounded-full bg-neutral-100 flex items-center justify-center text-neutral-500 group-hover/link:bg-primary/10 group-hover/link:text-primary transition-colors">
<a href={`mailto:${member.email}`} className="group/link flex items-center gap-4 text-text-secondary hover:text-primary transition-colors font-medium">
<div className="w-10 h-10 rounded-xl bg-neutral-50 flex items-center justify-center text-neutral-400 group-hover/link:bg-primary/10 group-hover/link:text-primary transition-colors border border-neutral-100">
<svg className="w-4 h-4" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2"><path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"></path><polyline points="22,6 12,13 2,6"></polyline></svg>
</div>
<span className="truncate">{member.email}</span>
<svg className="w-4 h-4 ml-auto opacity-0 -translate-x-2 group-hover/link:opacity-100 group-hover/link:translate-x-0 transition-all duration-300" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><line x1="5" y1="12" x2="19" y2="12"></line><polyline points="12 5 19 12 12 19"></polyline></svg>
</a>
)}
{member.phone && (
<a href={`tel:${member.phone}`} className="group/link flex items-center gap-3 text-text-secondary hover:text-primary transition-colors text-sm font-medium">
<div className="w-8 h-8 rounded-full bg-neutral-100 flex items-center justify-center text-neutral-500 group-hover/link:bg-primary/10 group-hover/link:text-primary transition-colors">
<a href={`tel:${member.phone}`} className="group/link flex items-center gap-4 text-text-secondary hover:text-primary transition-colors font-medium">
<div className="w-10 h-10 rounded-xl bg-neutral-50 flex items-center justify-center text-neutral-400 group-hover/link:bg-primary/10 group-hover/link:text-primary transition-colors border border-neutral-100">
<svg className="w-4 h-4" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2"><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z"></path></svg>
</div>
<span>{member.phone}</span>
<svg className="w-4 h-4 ml-auto opacity-0 -translate-x-2 group-hover/link:opacity-100 group-hover/link:translate-x-0 transition-all duration-300" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><line x1="5" y1="12" x2="19" y2="12"></line><polyline points="12 5 19 12 12 19"></polyline></svg>
</a>
)}
</div>

View File

@@ -68,6 +68,18 @@ export function Footer({ companyInfo }: FooterProps) {
<p className="font-medium text-neutral-200 group-hover/contact:text-primary transition-colors truncate">{companyInfo.contactPhone}</p>
</a>
</div>
<div className="flex gap-4 p-4 rounded-2xl bg-white/[0.03] border border-white/[0.05] hover:bg-white/[0.05] transition-colors">
<div className="w-10 h-10 rounded-full bg-primary/20 flex items-center justify-center shrink-0">
<svg className="w-5 h-5 text-primary" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><circle cx="12" cy="12" r="10"></circle><polyline points="12 6 12 12 16 14"></polyline></svg>
</div>
<div>
<p className="text-xs text-neutral-400 uppercase tracking-wider mb-1 font-heading">{locale === 'de' ? 'Öffnungszeiten' : 'Opening Hours'}</p>
<div className="text-sm font-medium text-neutral-200">
<p>{locale === 'de' ? 'Mo. Fr.' : 'Mon. Fri.'}: 07:00 17:00 {locale === 'de' ? 'Uhr' : ''}</p>
<p className="text-white/50 mt-0.5">{locale === 'de' ? 'Sa. So.' : 'Sat. Sun.'}: {locale === 'de' ? 'Geschlossen' : 'Closed'}</p>
</div>
</div>
</div>
</div>
)}
</div>
@@ -86,6 +98,7 @@ export function Footer({ companyInfo }: FooterProps) {
{[
{ label: locale === 'de' ? 'Kompetenzen' : 'Competencies', href: `/${locale}/kompetenzen` },
{ label: locale === 'de' ? 'Über uns' : 'About us', href: `/${locale}/ueber-uns` },
{ label: locale === 'de' ? 'Unser Team' : 'Our Team', href: `/${locale}/team` },
{ label: locale === 'de' ? 'Zertifikate' : 'Certificates', href: `/${locale}/zertifikate` },
{ label: locale === 'de' ? 'Karriere' : 'Career', href: `/${locale}/karriere` },
{ label: locale === 'de' ? 'Messen & Events' : 'Fairs & Events', href: `/${locale}/messen` },

View File

@@ -4,12 +4,13 @@ import * as React from 'react';
import { TransitionLink } from '@/components/ui/TransitionLink';
import Image from 'next/image';
import { usePathname } from 'next/navigation';
import { motion, useScroll, useTransform } from 'framer-motion';
import { motion, useScroll, useTransform, AnimatePresence } from 'framer-motion';
import { LanguageSwitcher } from './LanguageSwitcher';
export interface NavLink {
label: string;
url: string;
children?: NavLink[];
}
interface HeaderProps {
@@ -71,7 +72,7 @@ export function Header({ navLinks }: HeaderProps) {
}`}
>
<div
className={`relative overflow-hidden w-full max-w-7xl mx-auto transition-all duration-700 ease-[cubic-bezier(0.16,1,0.3,1)] flex items-center justify-between ${
className={`relative w-full max-w-7xl mx-auto transition-all duration-700 ease-[cubic-bezier(0.16,1,0.3,1)] flex items-center justify-between ${
isSolidMode
? 'rounded-full bg-white/50 backdrop-blur-xl shadow-[0_8px_32px_rgba(0,0,0,0.08)] border border-white/40 py-2.5 px-6 md:px-8'
: 'rounded-none bg-transparent py-6 px-4 md:px-8 border border-transparent'
@@ -114,40 +115,15 @@ export function Header({ navLinks }: HeaderProps) {
<div className="flex items-center gap-2 md:gap-4 ml-auto md:ml-0">
<nav className="relative z-10 hidden md:flex items-center gap-8 lg:gap-10">
{navLinks && navLinks.length > 0 && navLinks.map((link) => {
const mappedUrl = link.url.startsWith('/') && !link.url.match(/^\/(en|de)/)
? `/${currentLocale}${link.url}`
: link.url;
const isActive = pathname === mappedUrl || (mappedUrl !== `/${currentLocale}` && pathname?.startsWith(`${mappedUrl}/`));
return (
<TransitionLink
key={link.url}
href={mappedUrl}
className={`relative font-bold text-xs lg:text-sm uppercase tracking-widest transition-colors duration-300 group py-2 select-none ${
isSolidMode
? (isActive ? 'text-primary' : 'text-text-primary hover:text-primary')
: (isActive ? 'text-white' : 'text-white/80 hover:text-white')
}`}
>
{link.label}
{/* Framer Motion Active Indicator */}
{isActive && (
<motion.div
layoutId="header-active-indicator"
className={`absolute -bottom-1 left-0 right-0 h-0.5 rounded-full ${isSolidMode ? 'bg-primary' : 'bg-white'}`}
transition={{ type: 'spring', stiffness: 400, damping: 30 }}
/>
)}
{/* Subtle hover underline */}
<span className={`absolute -bottom-1 left-1/2 w-0 h-0.5 -translate-x-1/2 rounded-full transition-all duration-300 ease-out group-hover:w-full ${isSolidMode ? 'bg-primary/30' : 'bg-white/30'} ${isActive ? 'opacity-0' : 'opacity-100'}`} />
</TransitionLink>
);
})}
{navLinks && navLinks.length > 0 && navLinks.map((link) => (
<NavItem
key={link.url}
link={link}
currentLocale={currentLocale}
pathname={pathname}
isSolidMode={isSolidMode}
/>
))}
</nav>
{/* Right side elements (Language Switcher always visible, Contact button desktop only) */}
@@ -180,3 +156,83 @@ export function Header({ navLinks }: HeaderProps) {
);
}
function NavItem({ link, currentLocale, pathname, isSolidMode }: { link: NavLink, currentLocale: string, pathname: string, isSolidMode: boolean }) {
const [isHovered, setIsHovered] = React.useState(false);
const mappedUrl = link.url.startsWith('/') && !link.url.match(/^\/(en|de)/)
? `/${currentLocale}${link.url}`
: link.url;
const isActive = pathname === mappedUrl || (mappedUrl !== `/${currentLocale}` && pathname?.startsWith(`${mappedUrl}/`));
return (
<div
className="relative group py-2"
onMouseEnter={() => setIsHovered(true)}
onMouseLeave={() => setIsHovered(false)}
>
<TransitionLink
href={mappedUrl}
className={`relative font-bold text-xs lg:text-sm uppercase tracking-widest transition-colors duration-300 group flex items-center gap-1.5 select-none ${
isSolidMode
? (isActive ? 'text-primary' : 'text-text-primary hover:text-primary')
: (isActive ? 'text-white' : 'text-white/80 hover:text-white')
}`}
>
{link.label}
{link.children && (
<svg className={`w-3.5 h-3.5 transition-transform duration-300 ${isHovered ? 'rotate-180' : ''}`} fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2.5} d="M19 9l-7 7-7-7" />
</svg>
)}
{/* Framer Motion Active Indicator */}
{isActive && !link.children && (
<motion.div
layoutId="header-active-indicator"
className={`absolute -bottom-1 left-0 right-0 h-0.5 rounded-full ${isSolidMode ? 'bg-primary' : 'bg-white'}`}
transition={{ type: 'spring', stiffness: 400, damping: 30 }}
/>
)}
{/* Subtle hover underline */}
<span className={`absolute -bottom-1 left-1/2 w-0 h-0.5 -translate-x-1/2 rounded-full transition-all duration-300 ease-out group-hover:w-full ${isSolidMode ? 'bg-primary/30' : 'bg-white/30'} ${isActive ? 'opacity-0' : 'opacity-100'}`} />
</TransitionLink>
<AnimatePresence>
{isHovered && link.children && (
<motion.div
initial={{ opacity: 0, y: 10, scale: 0.95 }}
animate={{ opacity: 1, y: 0, scale: 1 }}
exit={{ opacity: 0, y: 10, scale: 0.95 }}
transition={{ duration: 0.2, ease: 'easeOut' }}
className="absolute top-full left-1/2 -translate-x-1/2 pt-4 w-56"
>
<div className={`p-2 rounded-3xl shadow-[0_20px_40px_-15px_rgba(0,0,0,0.1)] border ${isSolidMode ? 'bg-white/95 border-neutral-200/60' : 'bg-[#050B14]/90 border-white/10'} backdrop-blur-xl flex flex-col gap-1`}>
{link.children.map((child) => {
const childUrl = child.url.startsWith('/') && !child.url.match(/^\/(en|de)/)
? `/${currentLocale}${child.url}`
: child.url;
const isChildActive = pathname === childUrl;
return (
<TransitionLink
key={child.url}
href={childUrl}
className={`block px-4 py-3 rounded-2xl text-sm font-medium transition-all ${
isSolidMode
? isChildActive ? 'bg-primary/10 text-primary' : 'text-neutral-600 hover:bg-neutral-100 hover:text-primary'
: isChildActive ? 'bg-white/10 text-white' : 'text-neutral-300 hover:bg-white/5 hover:text-white'
}`}
>
{child.label}
</TransitionLink>
);
})}
</div>
</motion.div>
)}
</AnimatePresence>
</div>
);
}

View File

@@ -0,0 +1,60 @@
---
title: "Grabenlose Leitungsverlegung"
date: "2024-03-20"
excerpt: "Präzise Horizontalspülbohrungen und Erdraketen in allen Bodenklassen für eine oberflächenschonende und grabenlose Leitungsverlegung."
layout: "fullBleed"
---
<HeroSection
badge="Kernkompetenz"
title="Grabenlose Verlegung"
subtitle="Oberflächenschonende Horizontalspülbohrungen und Erdraketen"
backgroundImage={{ url: '/assets/photos/DSC08653.JPG' }}
alignment="center"
ctaLabel="Projekt anfragen"
ctaHref="/de/kontakt"
/>
<ServiceDetailGrid
badge="Verfahren"
title="Effizient & Umweltschonend"
descriptionParagraphs={[
"Wenn klassischer Grabenbau aus Platz-, Umwelt- oder Kostengründen nicht in Frage kommt, setzen wir auf **modernste grabenlose Techniken**.",
"Das schont nicht nur die Natur, sondern spart bei aufwändigen Oberflächen signifikant an Wiederherstellungskosten."
]}
panels={[
{
id: "hdd",
title: "Horizontalspülbohrverfahren (HDD)",
icon: "hdd",
fullWidth: false,
lists: [
[
"Max. Bohrlänge: 250 m",
"Max. Durchmesser: 400er Rohr",
"Komplexe Querung von Bahn, Autobahn & Gewässern"
]
]
},
{
id: "erdrakete",
title: "Erdrakete",
icon: "hdd",
fullWidth: false,
lists: [
[
"Max. Durchörterungslänge: 15 m",
"Max. Durchmesser: 160er Rohr",
"Schnelle Hausanschlüsse ohne Graben"
]
]
}
]}
/>
<CallToAction
title="Suchen Sie nach einer grabenlosen Lösung?"
text="Wir beraten Sie gerne zu den Möglichkeiten der Horizontalspülbohrung für Ihr Vorhaben."
buttonText="Kontakt aufnehmen"
buttonLink="/de/kontakt"
/>

60
content/de/glasfaser.mdx Normal file
View File

@@ -0,0 +1,60 @@
---
title: "Kabelleitungstiefbau im Bereich Telekommunikation"
date: "2024-03-20"
excerpt: "Zukunftssichere Infrastruktur durch kompetenten Kabelleitungstiefbau für Glasfaser- und Telekommunikationsnetze."
layout: "fullBleed"
---
<HeroSection
badge="Kernkompetenz"
title="Glasfaser & Telekommunikation"
subtitle="Komplette Infrastruktur-Lösungen für zukunftssichere Breitbandnetze (FTTX)"
backgroundImage={{ url: '/assets/photos/DSC01129.JPG' }}
alignment="center"
ctaLabel="Projekt anfragen"
ctaHref="/de/kontakt"
/>
<ServiceDetailGrid
badge="Leistungsspektrum"
title="Rückgrat der Digitalisierung"
descriptionParagraphs={[
"Schnelles Internet und modernste Telekommunikationsnetze erfordern einen **reibungslosen und professionellen Netzausbau**.",
"E-TIB sorgt mit modernsten Maschinen und spezialisierten Montageteams für höchste Qualität im Glasfaserausbau."
]}
panels={[
{
id: "tiefbau",
title: "Tiefbau & Trassen",
icon: "fiber",
fullWidth: false,
lists: [
[
"Herstellung von Kabel- und Rohrgräben",
"Herstellung von Leerrohrtrassen",
"Stellen von Multifunktionsgehäusen"
]
]
},
{
id: "montage",
title: "Kabelzug & Montage",
icon: "fiber",
fullWidth: false,
lists: [
[
"Einziehen von TK-/LWL-Kabeln",
"Einblasen von Glasfaserkabeln",
"Kabelmontagen TK/LWL"
]
]
}
]}
/>
<CallToAction
title="Sie planen einen FTTX-Ausbau?"
text="Wir beraten Sie gerne rund um den Bereich FTTX und den Glasfaserausbau."
buttonText="Kontakt aufnehmen"
buttonLink="/de/kontakt"
/>

View File

@@ -6,7 +6,7 @@ description: "Die E-TIB GmbH ist Ihr zuverlässiger Partner für komplexe Kabelt
<HomeHero
title={"Die Experten für\nKabeltiefbau"}
description="Wir realisieren komplexe Versorgungsleitungen für eine moderne Gesellschaft. Verlässlich, innovativ und mit höchster Präzision im Kabelbau und der Bohrtechnik."
description="Wir realisieren komplexe Versorgungsleitungen für eine moderne Gesellschaft. Verlässlich, innovativ und mit höchster Präzision im Kabeltiefbau und der Bohrtechnik."
videoUrl="/assets/videos/web/hero-kabelpflug.mp4"
linkText="Unsere Leistungen"
linkHref="/de/kompetenzen"
@@ -110,17 +110,19 @@ description: "Die E-TIB GmbH ist Ihr zuverlässiger Partner für komplexe Kabelt
ctaHref="/de/kompetenzen"
items={[
{
title: "Kabelbau",
title: "Kabeltiefbau",
description: "Verlegung von Mittel- und Niederspannungskabeln",
tag: "Energie",
size: "large",
image: { url: "/assets/photos/DSC01123.JPG", alt: "Kabelbau" }
href: "/de/kabeltiefbau",
image: { url: "/assets/photos/DSC01123.JPG", alt: "Kabeltiefbau" }
},
{
title: "Bohrtechnik",
description: "Horizontalspülbohrverfahren für grabenlose Verlegung",
tag: "Innovation",
size: "medium",
href: "/de/bohrtechnik",
image: { url: "/assets/photos/DSC08653.JPG", alt: "Bohrtechnik" }
},
{
@@ -128,13 +130,15 @@ description: "Die E-TIB GmbH ist Ihr zuverlässiger Partner für komplexe Kabelt
description: "Trassenplanung und Genehmigungsverfahren",
tag: "Präzision",
size: "small",
href: "/de/planung",
image: { url: "/assets/photos/DJI_0048.JPG", alt: "Planung" }
},
{
title: "Vermessung",
description: "Digitale Bestandsdokumentation",
tag: "Digital",
size: "accent"
size: "accent",
href: "/de/vermessung"
}
]}
/>
@@ -159,14 +163,14 @@ description: "Die E-TIB GmbH ist Ihr zuverlässiger Partner für komplexe Kabelt
id: "3",
title: "Neubau Kabeltrasse, 03149 Forst",
slug: "neubau-kabeltrasse-forst",
category: "Kabelbau",
category: "Kabeltiefbau",
image: "/assets/photos/DSC01129.JPG"
},
{
id: "4",
title: "Kabelverbindung U30 - T10, 15890 Eisenhüttenstadt",
slug: "kabelverbindung-eisenhuettenstadt",
category: "Kabelbau",
category: "Kabeltiefbau",
image: "/assets/photos/DSC00010.JPG"
},
{

View File

@@ -0,0 +1,61 @@
---
title: "Kabelleitungstiefbau im Bereich Mittel- und Niederspannung"
date: "2024-03-20"
excerpt: "Professioneller Kabeltiefbau für Mittel- und Niederspannungsnetze: Von der Errichtung von Kabeltrassen über Kabelmontagen bis zur Straßenbeleuchtung."
layout: "fullBleed"
---
<HeroSection
badge="Kernkompetenz"
title="Kabelleitungstiefbau"
subtitle="Komplette Infrastruktur-Lösungen für Mittel- und Niederspannungsnetze"
backgroundImage={{ url: '/assets/photos/DSC01123.JPG' }}
alignment="center"
ctaLabel="Projekt anfragen"
ctaHref="/de/kontakt"
/>
<ServiceDetailGrid
badge="Leistungsspektrum"
title="Alles für Ihr Netz"
descriptionParagraphs={[
"Unsere Leistungen umfassen das **komplette Spektrum** zur Errichtung moderner Kabeltrassen und Energieinfrastruktur.",
"Wir bieten höchste Präzision, moderne Maschinen und zertifizierte Experten für jedes Projekt."
]}
panels={[
{
id: "grabenbau",
title: "Grabenbau & Verlegung",
icon: "energy",
fullWidth: false,
lists: [
[
"Herstellung von Kabel- und Rohrgräben",
"Kabelverlegung von 0,4 kV - 110 kV",
"Kabelmontagen 0,4 kV - 30 kV"
]
]
},
{
id: "anlagen",
title: "Anlagen & Beleuchtung",
icon: "energy",
fullWidth: false,
lists: [
[
"Errichtung von Transformatorstationen",
"Erstellung von Erdungsanlagen",
"Errichtung von Straßenbeleuchtung",
"Schalthandlungen"
]
]
}
]}
/>
<CallToAction
title="Sie haben ein konkretes Projekt?"
text="Wir beraten Sie gerne zu allen Fragen rund um Kabeltiefbau und Leitungsverlegung."
buttonText="Kontakt aufnehmen"
buttonLink="/de/kontakt"
/>

View File

@@ -1,7 +1,7 @@
---
title: "Kompetenzen - Kabeltiefbau & Spülbohrtechnik"
date: "2024-03-20"
excerpt: "Von Kabelbau bis Elektromontage: Wir bieten ganzheitliche Lösungen für moderne Netzinfrastrukturen."
excerpt: "Von Kabeltiefbau bis Elektromontage: Wir bieten ganzheitliche Lösungen für moderne Netzinfrastrukturen."
layout: "fullBleed"
---
@@ -23,17 +23,19 @@ layout: "fullBleed"
ctaHref="/de/kontakt"
items={[
{
title: "Kabelbau",
title: "Kabeltiefbau",
description: "Klassischer Grabenbau und professionelle Verlegung von Mittel- und Niederspannungskabeln.",
tag: "Energie",
size: "large",
image: { url: "/assets/photos/DSC01123.JPG", alt: "Kabelbau" }
href: "/de/kabeltiefbau",
image: { url: "/assets/photos/DSC01123.JPG", alt: "Kabeltiefbau" }
},
{
title: "Bohrtechnik",
description: "Horizontalspülbohrverfahren (HDD) für grabenlose, oberflächenschonende Verlegung.",
tag: "Innovation",
size: "medium",
href: "/de/bohrtechnik",
image: { url: "/assets/photos/DSC08653.JPG", alt: "Bohrtechnik" }
},
{
@@ -41,13 +43,15 @@ layout: "fullBleed"
description: "Ausbau von zukunftssicheren Breitbandnetzen (FTTX).",
tag: "Kommunikation",
size: "small",
href: "/de/glasfaser",
image: { url: "/assets/photos/DSC01129.JPG", alt: "Glasfaser" }
},
{
title: "Planung & Doku",
description: "Trassenplanung, Genehmigungsverfahren und präzise GIS-Dokumentation.",
tag: "Digital",
size: "accent"
size: "accent",
href: "/de/planung"
}
]}
/>
@@ -57,50 +61,53 @@ layout: "fullBleed"
title="Keine Kompromisse am Bau"
problemStatement={{
title: "Die Realität auf vielen Baustellen",
text: "Auf vielen Baustellen werden zunehmend Billiganbieter eingesetzt. Sicherheitsstandards und Dokumentationsanforderungen werden oft missachtet. Daraus resultieren Unfälle, defekte Fremdleitungen und teure Bauverzögerungen."
text: "Auf vielen Baustellen werden zunehmend Billiganbieter eingesetzt. Sicherheitsstandards und Dokumentationsanforderungen werden oft missachtet. Daraus resultieren Unfälle, defekte Fremdleitungen (Strom, Wasser, Gas etc.) und teure Bauverzögerungen, sodass sich ein vermeintliches Schnäppchen als Kostenfalle entpuppt."
}}
solutionStatement={{
title: "Der E-TIB Standard",
text: "Wir arbeiten anders. Durch unsere langjährige Erfahrung erkennen wir Problemstellungen frühzeitig und erarbeiten sichere Lösungen. Unterstützt durch unser Partner-Ingenieurbüro bieten wir Planung, Ausführung und Dokumentation auf höchstem Niveau."
text: "Durch unsere langjährige Erfahrung werden wir frühzeitig auf Problemstellungen aufmerksam und erarbeiten sichere Lösungen. Unterstützt durch unser Partner-Ingenieurbüro bieten wir Planung, Ausführung und Dokumentation auf höchstem Niveau, um Planungsfehler zu vermeiden."
}}
panels={[
{
id: "energy",
title: "Energie & Starkstrom",
title: "Kabelleitungstiefbau (Mittel-/Niederspannung)",
icon: "energy",
lists: [
[
"Kabelbau",
"Herstellung von Kabel- und Rohrgräben",
"Kabelverlegung (0,4kV - 110kV)",
"Elektromontagen bis 110 kV",
"Kabelmontagen 0,4 kV - 30 kV",
"Errichtung von Transformatorstationen",
"Wartung & Störungsdienst"
"Erstellung von Erdungsanlagen",
"Errichtung von Straßenbeleuchtung",
"Schalthandlungen"
]
]
},
{
id: "fiber",
title: "Glasfaser & TK",
title: "Kabelleitungstiefbau (Telekommunikation)",
icon: "fiber",
lists: [
[
"Glasfaser-Kabelmontagen",
"Herstellung von Kabel- und Rohrgräben",
"Herstellung von Leerrohrtrassen",
"Einziehen/Einblasen von LWL-Kabeln",
"Stellen von Multifunktionsgehäusen"
"Einziehen/Einblasen von TK-/LWL-Kabeln",
"Stellen von Multifunktionsgehäusen",
"Kabelmontagen TK/LWL"
]
]
},
{
id: "hdd",
title: "Bohrtechnik & Kabelpflug",
title: "Grabenlose Leitungsverlegung",
icon: "hdd",
lists: [
[
"Horizontalspülbohrungen",
"Kabelpflugarbeiten",
"Komplexe Querung (Bahn, Autobahn, Gewässer)",
"Erdrakete (bis 15m / 160er Rohr)"
"Horizontalspülbohrverfahren (bis 250m)",
"Horizontalspülbohrverfahren (bis 400er Rohr)",
"Erdrakete (bis 15m DÖ-Länge)",
"Erdrakete (bis 160er Rohr)"
]
]
},
@@ -110,10 +117,10 @@ layout: "fullBleed"
icon: "planning",
lists: [
[
"Genehmigungs- und Ausführungsplanung",
"Elektro- und Netzanschlussplanung",
"Ausschreibung & Bauüberwachung",
"Machbarkeitsstudien & Projektprüfung"
"Struktur-/Genehmigungs-/Ausführungsplanung",
"Ausschreibung, Vergabe & Bauüberwachung",
"Zustimmungsplanung",
"Projektprüfung, Studien"
]
]
},
@@ -124,11 +131,8 @@ layout: "fullBleed"
fullWidth: true,
lists: [
[
"Vermessung & Dokumentation",
"Absteckung und Einmessung von Leitungstrassen"
],
[
"Digitale Bestandsdokumentation (GIS)",
"Absteckung und Einmessung von Leitungstrassen",
"Erstellung von Datenbanken zur Projektabrechnung",
"360° Foto-/Video-Erfassung des Baufeldes"
]
]
@@ -139,7 +143,7 @@ layout: "fullBleed"
<JsonLd data={[
{
"@type": "Service",
"name": "Kabelbau",
"name": "Kabeltiefbau",
"description": "Klassischer Grabenbau und professionelle Verlegung von Mittel- und Niederspannungskabeln.",
"provider": { "@type": "Organization", "name": "E-TIB GmbH" }
},

62
content/de/planung.mdx Normal file
View File

@@ -0,0 +1,62 @@
---
title: "Planung und Beratung"
date: "2024-03-20"
excerpt: "Professionelle Planung und Beratung im Bereich Energie- und Telekommunikationsnetze: Trassenplanung, Genehmigungsverfahren und Projektprüfung."
layout: "fullBleed"
---
<HeroSection
badge="Kernkompetenz"
title="Planung & Beratung"
subtitle="Kompetente Begleitung für Energie- und Telekommunikationsnetze"
backgroundImage={{ url: '/assets/photos/DJI_0048.JPG' }}
alignment="center"
ctaLabel="Projekt anfragen"
ctaHref="/de/kontakt"
/>
<ServiceDetailGrid
badge="Ingenieursdienstleistungen"
title="Fundament für den Erfolg"
descriptionParagraphs={[
"Eine solide Planung ist das Fundament jedes erfolgreichen Bauprojekts. Vermeiden Sie teure Planungsfehler und profitieren Sie von unserer umfassenden Expertise.",
"Unser Partner-Ingenieurbüro **E-TIB Ingenieurgesellschaft mbH** unterstützt uns bei der reibungslosen Umsetzung komplexer Netzausbauprojekte."
]}
panels={[
{
id: "planung",
title: "Planung",
icon: "planning",
fullWidth: false,
lists: [
[
"Strukturplanung",
"Genehmigungsplanung",
"Ausführungsplanung",
"Zustimmungsplanung"
]
]
},
{
id: "beratung",
title: "Beratung & Steuerung",
icon: "planning",
fullWidth: false,
lists: [
[
"Ausschreibung & Vergabe",
"Bauüberwachung",
"Projektprüfung",
"Machbarkeitsstudien"
]
]
}
]}
/>
<CallToAction
title="Benötigen Sie Planungssicherheit?"
text="Lassen Sie uns über Ihr Vorhaben sprechen. Wir stehen Ihnen mit Rat und Tat zur Seite."
buttonText="Kontakt aufnehmen"
buttonLink="/de/kontakt"
/>

89
content/de/team.mdx Normal file
View File

@@ -0,0 +1,89 @@
---
title: "Unser Team"
date: "2024-03-20"
excerpt: "Lernen Sie die Experten der E-TIB Gruppe kennen."
layout: "fullBleed"
---
<HeroSection
badge="Unternehmen"
title="Unser Team"
subtitle="Die Experten hinter der E-TIB Gruppe"
backgroundImage={{ url: '/assets/photos/DJI_0048.JPG' }}
alignment="center"
/>
<TeamGrid
members={[
{
id: "danny-joseph",
name: "Danny Joseph",
position: "Geschäftsführung",
email: "d.joseph@e-tib.com",
phone: "+49 1520 7230518",
image: "/assets/photos/team/danny.jpg"
},
{
id: "dirk-schmidt",
name: "Dirk Schmidt",
position: "Projektleitung",
email: "d.schmidt@e-tib.com",
phone: "+49 151 65069040",
image: "/assets/photos/team/dirk.jpg"
},
{
id: "oliver-fiedler",
name: "Oliver Fiedler",
position: "Bauleitung",
email: "o.fiedler@e-tib.com",
phone: "+49 151 52264087",
image: "/assets/photos/team/oliver.jpg"
},
{
id: "martin-polan",
name: "Martin Polan",
position: "Polier",
email: "m.polan@e-tib.com",
phone: "+49 171 3868167",
image: "/assets/photos/team/martin.jpg"
},
{
id: "kerstin-joseph",
name: "Kerstin Joseph",
position: "Sekretariat / Buchhaltung",
email: "k.joseph@e-tib.com",
phone: "+49 3561 6851692",
image: "/assets/photos/team/kerstin.jpg"
},
{
id: "kathrin-lemanski",
name: "Kathrin Lemanski",
position: "Sachbearbeitung",
email: "k.lemanski@e-tib.com",
phone: "+49 3561 6857733",
image: "/assets/photos/team/kathrin.jpg"
},
{
id: "sven-kirbs",
name: "Sven Kirbs",
position: "Vermessung / Dokumentation",
email: "s.kirbs@e-tib.com",
phone: "+49 151 29603652",
image: "/assets/photos/team/sven.jpg"
},
{
id: "maik-weichert",
name: "Maik Weichert",
position: "Fuhrpark / Werkstatt / Lager",
email: "m.weichert@e-tib.com",
image: "/assets/photos/team/maik.jpg"
}
]}
/>
<CallToAction
title="Werden Sie Teil unseres Teams"
text="Wir sind immer auf der Suche nach motivierten Talenten für spannende Infrastrukturprojekte."
buttonText="Offene Stellen ansehen"
buttonLink="/de/karriere"
/>

60
content/de/vermessung.mdx Normal file
View File

@@ -0,0 +1,60 @@
---
title: "Vermessung und Dokumentation"
date: "2024-03-20"
excerpt: "Präzise Vermessung, Absteckung und digitale Dokumentation von Leitungstrassen zur Gewährleistung höchster Sicherheits- und Qualitätsstandards."
layout: "fullBleed"
---
<HeroSection
badge="Kernkompetenz"
title="Vermessung & Dokumentation"
subtitle="Lückenlose und rechtssichere Erfassung aller Bauphasen"
backgroundImage={{ url: '/assets/photos/DSC08653.JPG' }}
alignment="center"
ctaLabel="Projekt anfragen"
ctaHref="/de/kontakt"
/>
<ServiceDetailGrid
badge="Präzision"
title="Höchste Sicherheitsstandards"
descriptionParagraphs={[
"Steigende Dokumentationsanforderungen und strenge Sicherheitsstandards verlangen nach **höchster Präzision auf der Baustelle**.",
"Mit modernster Technik sorgen wir für eine lückenlose und rechtssichere Erfassung aller Leitungen. Dies ist der beste Schutz vor bösen Überraschungen bei der Bauabnahme."
]}
panels={[
{
id: "vermessung",
title: "Geodäsie",
icon: "survey",
fullWidth: false,
lists: [
[
"Absteckung von Leitungstrassen",
"Einmessung von Leitungstrassen",
"GPS-gestützte Geländeaufnahme"
]
]
},
{
id: "dokumentation",
title: "Digitale Dokumentation",
icon: "survey",
fullWidth: false,
lists: [
[
"Erstellung von Datenbanken zur Projektabrechnung",
"360° Foto-/Video-Erfassung des Baufeldes",
"Einbindung in Geoinformationssysteme (GIS)"
]
]
}
]}
/>
<CallToAction
title="Stehen Sie vor hohen Dokumentationsanforderungen?"
text="Kontaktieren Sie uns für professionelle Vermessungs- und Dokumentationsdienstleistungen."
buttonText="Kontakt aufnehmen"
buttonLink="/de/kontakt"
/>

89
content/en/team.mdx Normal file
View File

@@ -0,0 +1,89 @@
---
title: "Our Team"
date: "2024-03-20"
excerpt: "Meet the experts of the E-TIB Group."
layout: "fullBleed"
---
<HeroSection
badge="Company"
title="Our Team"
subtitle="The Experts behind the E-TIB Group"
backgroundImage={{ url: '/assets/photos/DJI_0048.JPG' }}
alignment="center"
/>
<TeamGrid
members={[
{
id: "danny-joseph",
name: "Danny Joseph",
position: "Management",
email: "d.joseph@e-tib.com",
phone: "+49 1520 7230518",
image: "/assets/photos/team/danny.jpg"
},
{
id: "dirk-schmidt",
name: "Dirk Schmidt",
position: "Project Management",
email: "d.schmidt@e-tib.com",
phone: "+49 151 65069040",
image: "/assets/photos/team/dirk.jpg"
},
{
id: "oliver-fiedler",
name: "Oliver Fiedler",
position: "Site Management",
email: "o.fiedler@e-tib.com",
phone: "+49 151 52264087",
image: "/assets/photos/team/oliver.jpg"
},
{
id: "martin-polan",
name: "Martin Polan",
position: "Foreman",
email: "m.polan@e-tib.com",
phone: "+49 171 3868167",
image: "/assets/photos/team/martin.jpg"
},
{
id: "kerstin-joseph",
name: "Kerstin Joseph",
position: "Secretariat / Accounting",
email: "k.joseph@e-tib.com",
phone: "+49 3561 6851692",
image: "/assets/photos/team/kerstin.jpg"
},
{
id: "kathrin-lemanski",
name: "Kathrin Lemanski",
position: "Administration",
email: "k.lemanski@e-tib.com",
phone: "+49 3561 6857733",
image: "/assets/photos/team/kathrin.jpg"
},
{
id: "sven-kirbs",
name: "Sven Kirbs",
position: "Surveying / Documentation",
email: "s.kirbs@e-tib.com",
phone: "+49 151 29603652",
image: "/assets/photos/team/sven.jpg"
},
{
id: "maik-weichert",
name: "Maik Weichert",
position: "Fleet / Workshop / Warehouse",
email: "m.weichert@e-tib.com",
image: "/assets/photos/team/maik.jpg"
}
]}
/>
<CallToAction
title="Become part of our team"
text="We are always looking for motivated talents for exciting infrastructure projects."
buttonText="View open positions"
buttonLink="/en/karriere"
/>

View File

@@ -16,10 +16,10 @@
},
"Index": {
"title": "E-TIB GmbH Experten für Kabeltiefbau & Infrastruktur",
"description": "Ihr Partner für Kabelbau, Horizontalspülbohrungen und Glasfaser-Montage in Guben und bundesweit.",
"description": "Ihr Partner für Kabeltiefbau, Horizontalspülbohrungen und Glasfaser-Montage in Guben und bundesweit.",
"meta": {
"title": "E-TIB GmbH | Spezialist für Kabeltiefbau & Netzausbau",
"description": "E-TIB GmbH aus Guben ist Ihr Experte für Kabelbau, Spülbohrungen, Pflugarbeiten und Elektromontage bis 110 kV. Zuverlässige Infrastruktur für die Energiewende."
"description": "E-TIB GmbH aus Guben ist Ihr Experte für Kabeltiefbau, Spülbohrungen, Pflugarbeiten und Elektromontage bis 110 kV. Zuverlässige Infrastruktur für die Energiewende."
}
},
"Navigation": {
@@ -49,7 +49,7 @@
"Team": {
"meta": {
"title": "Über uns | Die E-TIB Unternehmensgruppe",
"description": "Lernen Sie die E-TIB Gruppe kennen: Spezialisten für Kabelbau, Bohrtechnik und Ingenieurdienstleistungen."
"description": "Lernen Sie die E-TIB Gruppe kennen: Spezialisten für Kabeltiefbau, Bohrtechnik und Ingenieurdienstleistungen."
},
"hero": {
"title": "Infrastruktur für die Zukunft",
@@ -102,7 +102,7 @@
"hours": {
"title": "Öffnungszeiten",
"weekdays": "Mo. Fr.",
"weekdaysTime": "08:00 17:00 Uhr",
"weekdaysTime": "07:00 17:00 Uhr",
"weekend": "Sa. So.",
"closed": "Geschlossen"
},
@@ -130,7 +130,7 @@
"subtitle": "Umfassende Lösungen für den Ausbau moderner Energie- und Datennetze.",
"badge": "Leistungsspektrum",
"items": {
"kabelbau": "Kabelbau",
"kabelbau": "Kabeltiefbau",
"pflugarbeiten": "Kabelpflugarbeiten",
"bohrungen": "Horizontalspülbohrungen",
"elektromontage": "Elektromontagen bis 110 kV",

View File

@@ -15,11 +15,11 @@
"categories": {}
},
"Index": {
"title": "E-TIB GmbH Experts in Cable Construction & Infrastructure",
"description": "Your partner for cable construction, horizontal drilling, and fiber optic installation in Guben and nationwide.",
"title": "E-TIB GmbH Experts in Underground Cable Engineering & Infrastructure",
"description": "Your partner for underground cable engineering, horizontal drilling, and fiber optic installation in Guben and nationwide.",
"meta": {
"title": "E-TIB GmbH | Specialist for Cable Construction & Grid Expansion",
"description": "E-TIB GmbH from Guben is your expert for cable construction, directional drilling, plowing works, and electrical installation up to 110 kV."
"title": "E-TIB GmbH | Specialist for Underground Cable Engineering & Grid Expansion",
"description": "E-TIB GmbH from Guben is your expert for underground cable engineering, directional drilling, plowing works, and electrical installation up to 110 kV."
}
},
"Navigation": {
@@ -44,12 +44,12 @@
"career": "Career",
"contact": "Contact",
"copyright": "Copyright © {year} E-TIB GmbH. All rights reserved.",
"tagline": "Experts for cable construction and the execution of electrical infrastructure projects. Quality and reliability from Guben."
"tagline": "Experts for underground cable engineering and the execution of electrical infrastructure projects. Quality and reliability from Guben."
},
"Team": {
"meta": {
"title": "About Us | The E-TIB Group",
"description": "Get to know the E-TIB Group: Specialists for cable construction, drilling technology, and engineering services."
"description": "Get to know the E-TIB Group: Specialists for underground cable engineering, drilling technology, and engineering services."
},
"hero": {
"title": "Infrastructure for the Future",
@@ -66,7 +66,7 @@
"subtitle": "Specialized units for complex projects",
"etib": {
"title": "ETIB GmbH",
"desc": "Execution of electrical infrastructure projects and cable construction."
"desc": "Execution of electrical infrastructure projects and underground cable engineering."
},
"bohrtechnik": {
"title": "ETIB Bohrtechnik GmbH",
@@ -85,7 +85,7 @@
"Contact": {
"meta": {
"title": "Contact | E-TIB GmbH Guben",
"description": "Get in touch with E-TIB GmbH in Guben. Your partner for cable construction and grid infrastructure."
"description": "Get in touch with E-TIB GmbH in Guben. Your partner for underground cable engineering and grid infrastructure."
},
"title": "Contact Us",
"subtitle": "Do you have questions about our services or a specific project? We are here for you.",
@@ -102,7 +102,7 @@
"hours": {
"title": "Opening Hours",
"weekdays": "Mon. Fri.",
"weekdaysTime": "08:00 17:00",
"weekdaysTime": "07:00 17:00",
"weekend": "Sat. Sun.",
"closed": "Closed"
},
@@ -130,7 +130,7 @@
"subtitle": "Comprehensive solutions for the expansion of modern energy and data networks.",
"badge": "Service Spectrum",
"items": {
"kabelbau": "Cable Construction",
"kabelbau": "Underground Cable Engineering",
"pflugarbeiten": "Cable Plowing",
"bohrungen": "Horizontal Directional Drilling",
"elektromontage": "Electrical Installations up to 110 kV",
@@ -144,7 +144,7 @@
},
"Home": {
"hero": {
"title": "THE EXPERTS FOR <green>CABLE CONSTRUCTION</green>",
"title": "THE EXPERTS FOR <green>UNDERGROUND CABLE ENGINEERING</green>",
"subtitle": "We help expanding the energy cable networks for a green future.",
"cta": "Request now"
},
@@ -173,7 +173,7 @@
"Blog": {
"meta": {
"title": "Blog & News",
"description": "Latest news and insights from the world of cable construction and infrastructure."
"description": "Latest news and insights from the world of underground cable engineering and infrastructure."
},
"featuredPost": "Featured Post",
"readFullArticle": "Read Full Article",

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 300 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 650 KiB