This commit is contained in:
2026-01-17 02:57:53 +01:00
parent de87c62312
commit 021d23ab93
21 changed files with 967 additions and 578 deletions

View File

@@ -1,6 +1,6 @@
import { notFound } from 'next/navigation';
import { MDXRemote } from 'next-mdx-remote/rsc';
import { getPostBySlug } from '@/lib/blog';
import { Section, Container, Heading, Badge } from '@/components/ui';
interface PageProps {
params: {
@@ -10,14 +10,6 @@ interface PageProps {
}
export default async function StandardPage({ params: { locale, slug } }: PageProps) {
const page = await getPostBySlug(slug, locale); // Reusing blog logic for now as structure is same
// If not found in blog, try pages directory (we need to implement getPageBySlug)
// Actually, let's implement getPageBySlug in lib/mdx.ts or similar
// For now, let's assume we use a unified loader or separate.
// Let's use a separate loader for pages.
const { getPageBySlug } = await import('@/lib/pages');
const pageData = await getPageBySlug(slug, locale);
@@ -26,11 +18,63 @@ export default async function StandardPage({ params: { locale, slug } }: PagePro
}
return (
<div className="container mx-auto px-4 py-12 max-w-4xl">
<h1 className="text-4xl font-bold text-primary mb-8">{pageData.frontmatter.title}</h1>
<div className="prose prose-lg max-w-none">
<MDXRemote source={pageData.content} />
</div>
<div className="flex flex-col min-h-screen bg-neutral-light">
{/* Hero Section */}
<section className="bg-primary-dark text-white py-32 relative overflow-hidden">
<div className="absolute inset-0 opacity-20">
<div className="absolute top-0 left-0 w-full h-full bg-[radial-gradient(circle_at_center,_var(--tw-gradient-stops))] from-accent via-transparent to-transparent" />
</div>
<Container className="relative z-10">
<div className="max-w-4xl animate-slide-up">
<Badge variant="accent" className="mb-6">Information</Badge>
<Heading level={1} className="text-white mb-0">
<span className="text-white">{pageData.frontmatter.title}</span>
</Heading>
</div>
</Container>
</section>
<Section className="bg-white -mt-12 relative z-20 rounded-t-[60px] shadow-2xl">
<Container>
<div className="grid grid-cols-1 lg:grid-cols-12 gap-16">
{/* Sticky Narrative Sidebar */}
<div className="lg:col-span-4">
<div className="sticky top-32 space-y-8">
<div className="p-8 bg-neutral-light rounded-3xl border border-neutral-medium">
<h3 className="text-xl font-bold text-primary mb-4">Quick Navigation</h3>
<nav className="space-y-4">
<div className="h-1 w-12 bg-accent rounded-full" />
<p className="text-text-secondary leading-relaxed">
Explore the details of {pageData.frontmatter.title}. KLZ provides comprehensive information on all our services and corporate policies.
</p>
</nav>
</div>
<div className="p-8 bg-primary-dark rounded-3xl text-white">
<h3 className="text-xl font-bold mb-4">Need Help?</h3>
<p className="text-white/70 mb-6">Our support team is available for any questions regarding this topic.</p>
<a href={`/${locale}/contact`} className="text-accent font-bold hover:underline">Contact Us &rarr;</a>
</div>
</div>
</div>
{/* Main Content */}
<div className="lg:col-span-8">
<article className="prose prose-xl prose-primary max-w-none
prose-headings:text-primary prose-headings:font-bold prose-headings:tracking-tight
prose-p:text-text-secondary prose-p:leading-relaxed
prose-strong:text-primary prose-strong:font-extrabold
prose-a:text-primary prose-a:font-bold prose-a:no-underline hover:prose-a:underline
prose-img:rounded-3xl prose-img:shadow-2xl
prose-ul:list-disc prose-ul:pl-6
prose-li:text-text-secondary
">
<MDXRemote source={pageData.content} />
</article>
</div>
</div>
</Container>
</Section>
</div>
);
}

View File

@@ -1,6 +1,6 @@
import Link from 'next/link';
import { getAllPosts } from '@/lib/blog';
import { getTranslations } from 'next-intl/server';
import { Section, Container, Heading, Card, Badge, Button } from '@/components/ui';
interface BlogIndexProps {
params: {
@@ -29,117 +29,116 @@ export default async function BlogIndex({ params: { locale } }: BlogIndexProps)
const remainingPosts = sortedPosts.slice(1);
return (
<div className="bg-neutral-50 min-h-screen">
{/* Hero Section */}
<div className="bg-primary text-white py-20">
<div className="container mx-auto px-4">
<div className="max-w-3xl">
<h1 className="text-5xl md:text-6xl font-extrabold mb-6 leading-tight">
{locale === 'de' ? 'KLZ Blog' : 'KLZ Blog'}
</h1>
<p className="text-xl text-white/80 leading-relaxed">
{locale === 'de'
? 'Insights, News und technisches Know-how aus der Welt der Kabelinfrastruktur und erneuerbaren Energien.'
: 'Insights, news and technical know-how from the world of cable infrastructure and renewable energies.'}
</p>
</div>
</div>
</div>
<div className="container mx-auto px-4 -mt-10 pb-20">
{/* Featured Post */}
{featuredPost && (
<Link href={`/${locale}/blog/${featuredPost.slug}`} className="group block mb-16">
<article className="bg-white rounded-2xl shadow-xl overflow-hidden flex flex-col lg:flex-row transition-all hover:shadow-2xl">
{featuredPost.frontmatter.featuredImage && (
<div className="lg:w-1/2 relative h-64 lg:h-auto overflow-hidden">
<img
src={featuredPost.frontmatter.featuredImage}
alt={featuredPost.frontmatter.title}
className="absolute inset-0 w-full h-full object-cover transition-transform duration-700 group-hover:scale-105"
/>
<div className="absolute inset-0 bg-gradient-to-r from-black/20 to-transparent" />
</div>
)}
<div className="lg:w-1/2 p-8 lg:p-12 flex flex-col justify-center">
{featuredPost.frontmatter.category && (
<span className="inline-block px-3 py-1 bg-primary/10 text-primary text-xs font-bold uppercase tracking-widest rounded-full mb-6">
{featuredPost.frontmatter.category}
</span>
)}
<h2 className="text-3xl md:text-4xl font-bold text-text-primary mb-6 group-hover:text-primary transition-colors">
<div className="bg-neutral-light min-h-screen">
{/* Hero Section - Immersive Magazine Feel */}
<section className="relative h-[70vh] min-h-[600px] flex items-center overflow-hidden bg-primary-dark">
{featuredPost && featuredPost.frontmatter.featuredImage && (
<>
<img
src={featuredPost.frontmatter.featuredImage}
alt={featuredPost.frontmatter.title}
className="absolute inset-0 w-full h-full object-cover scale-105 animate-slow-zoom opacity-60"
/>
<div className="absolute inset-0 bg-gradient-to-t from-primary-dark via-primary-dark/40 to-transparent" />
</>
)}
<Container className="relative z-10">
<div className="max-w-4xl animate-slide-up">
<Badge variant="accent" className="mb-6">Featured Post</Badge>
{featuredPost && (
<>
<h1 className="text-5xl md:text-7xl font-extrabold text-white mb-8 leading-[1.1]">
{featuredPost.frontmatter.title}
</h2>
<p className="text-lg text-text-secondary mb-8 line-clamp-3">
</h1>
<p className="text-xl md:text-2xl text-white/80 mb-10 line-clamp-2 max-w-2xl">
{featuredPost.frontmatter.excerpt}
</p>
<div className="flex items-center gap-4 mt-auto">
<div className="w-10 h-10 rounded-full bg-primary/10 flex items-center justify-center text-primary font-bold">
KLZ
</div>
<div>
<div className="text-sm font-bold text-text-primary">KLZ Cables</div>
<div className="text-xs text-text-secondary">
{new Date(featuredPost.frontmatter.date).toLocaleDateString(locale, {
<Button href={`/${locale}/blog/${featuredPost.slug}`} variant="accent" size="xl" className="group">
{locale === 'de' ? 'Vollständigen Artikel lesen' : 'Read Full Article'}
<span className="ml-3 transition-transform group-hover:translate-x-2">&rarr;</span>
</Button>
</>
)}
</div>
</Container>
</section>
<Section className="bg-neutral-light">
<Container>
<div className="flex flex-col md:flex-row items-end justify-between mb-16 gap-6">
<Heading level={2} subtitle="Latest News" className="mb-0">
{locale === 'de' ? 'Alle Beiträge' : 'All Articles'}
</Heading>
<div className="flex gap-4">
{/* Category filters could go here */}
<Badge variant="primary" className="cursor-pointer hover:bg-primary hover:text-white transition-colors">All</Badge>
<Badge variant="neutral" className="cursor-pointer hover:bg-primary hover:text-white transition-colors">Industry</Badge>
<Badge variant="neutral" className="cursor-pointer hover:bg-primary hover:text-white transition-colors">Technical</Badge>
<Badge variant="neutral" className="cursor-pointer hover:bg-primary hover:text-white transition-colors">Sustainability</Badge>
</div>
</div>
{/* Grid for remaining posts */}
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-12">
{remainingPosts.map((post) => (
<Link key={post.slug} href={`/${locale}/blog/${post.slug}`} className="group block">
<Card className="h-full flex flex-col border-none shadow-lg hover:shadow-2xl transition-all duration-500 rounded-3xl overflow-hidden">
{post.frontmatter.featuredImage && (
<div className="relative h-72 overflow-hidden">
<img
src={post.frontmatter.featuredImage}
alt={post.frontmatter.title}
className="w-full h-full object-cover transition-transform duration-1000 group-hover:scale-110"
/>
<div className="absolute inset-0 bg-gradient-to-t from-primary-dark/80 via-transparent to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-500" />
{post.frontmatter.category && (
<Badge variant="accent" className="absolute top-6 left-6 shadow-lg">
{post.frontmatter.category}
</Badge>
)}
</div>
)}
<div className="p-10 flex flex-col flex-1">
<div className="text-sm font-bold text-accent-dark mb-4 tracking-widest uppercase">
{new Date(post.frontmatter.date).toLocaleDateString(locale, {
year: 'numeric',
month: 'long',
day: 'numeric'
})}
</div>
</div>
</div>
</div>
</article>
</Link>
)}
{/* Grid for remaining posts */}
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-10">
{remainingPosts.map((post) => (
<Link key={post.slug} href={`/${locale}/blog/${post.slug}`} className="group block">
<article className="bg-white rounded-xl shadow-sm overflow-hidden border border-neutral-200 h-full flex flex-col transition-all hover:shadow-lg hover:-translate-y-1">
{post.frontmatter.featuredImage && (
<div className="relative h-56 overflow-hidden">
<img
src={post.frontmatter.featuredImage}
alt={post.frontmatter.title}
className="w-full h-full object-cover transition-transform duration-500 group-hover:scale-110"
/>
{post.frontmatter.category && (
<span className="absolute top-4 left-4 px-3 py-1 bg-white/90 backdrop-blur-sm text-primary text-[10px] font-bold uppercase tracking-wider rounded-md shadow-sm">
{post.frontmatter.category}
<h3 className="text-2xl font-bold text-primary mb-6 group-hover:text-accent-dark transition-colors line-clamp-2 leading-tight">
{post.frontmatter.title}
</h3>
<p className="text-text-secondary text-lg line-clamp-3 mb-8 leading-relaxed">
{post.frontmatter.excerpt}
</p>
<div className="mt-auto pt-8 border-t border-neutral-medium flex items-center justify-between">
<span className="text-primary font-extrabold group-hover:text-accent-dark transition-colors">
{locale === 'de' ? 'Weiterlesen' : 'Read more'}
</span>
)}
<div className="w-10 h-10 rounded-full bg-primary-light flex items-center justify-center text-primary group-hover:bg-accent group-hover:text-primary-dark transition-all duration-300">
<svg className="w-5 h-5 transition-transform group-hover:translate-x-1" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M17 8l4 4m0 0l-4 4m4-4H3" />
</svg>
</div>
</div>
</div>
)}
<div className="p-6 flex flex-col flex-1">
<div className="text-xs text-text-secondary mb-3">
{new Date(post.frontmatter.date).toLocaleDateString(locale, {
year: 'numeric',
month: 'long',
day: 'numeric'
})}
</div>
<h3 className="text-xl font-bold text-text-primary mb-4 group-hover:text-primary transition-colors line-clamp-2">
{post.frontmatter.title}
</h3>
<p className="text-text-secondary text-sm line-clamp-3 mb-6">
{post.frontmatter.excerpt}
</p>
<div className="mt-auto pt-4 border-t border-neutral-100 flex items-center justify-between">
<span className="text-primary text-sm font-bold group-hover:underline">
{locale === 'de' ? 'Weiterlesen' : 'Read more'}
</span>
<svg className="w-5 h-5 text-primary transition-transform group-hover:translate-x-1" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M17 8l4 4m0 0l-4 4m4-4H3" />
</svg>
</div>
</div>
</article>
</Link>
))}
</div>
</div>
</Card>
</Link>
))}
</div>
{/* Pagination Placeholder */}
<div className="mt-24 flex justify-center gap-4">
<Button variant="outline" size="md" disabled>Previous</Button>
<Button variant="primary" size="md">1</Button>
<Button variant="outline" size="md">2</Button>
<Button variant="outline" size="md">3</Button>
<Button variant="outline" size="md">Next</Button>
</div>
</Container>
</Section>
</div>
);
}

View File

@@ -1,87 +1,153 @@
import { useTranslations } from 'next-intl';
import { Section, Container, Button } from '@/components/ui';
import { Section, Container, Button, Heading, Card } from '@/components/ui';
export default function ContactPage() {
const t = useTranslations('Contact');
return (
<div className="flex flex-col min-h-screen">
<Section className="bg-neutral">
<Container>
<div className="max-w-3xl mx-auto text-center mb-12">
<h1 className="text-4xl font-bold mb-4">{t('title')}</h1>
<p className="text-xl text-text-secondary">
<div className="flex flex-col min-h-screen bg-neutral-light">
{/* Hero Section */}
<section className="bg-primary-dark text-white py-32 relative overflow-hidden">
<div className="absolute inset-0 opacity-20">
<div className="absolute top-0 left-0 w-full h-full bg-[radial-gradient(circle_at_center,_var(--tw-gradient-stops))] from-accent via-transparent to-transparent" />
</div>
<Container className="relative z-10">
<div className="max-w-4xl animate-slide-up">
<Heading level={1} subtitle="Get in Touch" className="text-white mb-6">
<span className="text-white">{t('title')}</span>
</Heading>
<p className="text-2xl text-white/70 leading-relaxed max-w-2xl">
{t('subtitle')}
</p>
</div>
</Container>
</section>
<div className="grid grid-cols-1 md:grid-cols-2 gap-12 max-w-5xl mx-auto">
<Section className="bg-neutral-light -mt-20 relative z-20">
<Container>
<div className="grid grid-cols-1 lg:grid-cols-12 gap-16">
{/* Contact Info */}
<div className="space-y-8">
<div>
<h3 className="text-xl font-bold mb-4">{t('info.title')}</h3>
<div className="space-y-4 text-text-secondary">
<p className="flex items-start">
<svg className="w-6 h-6 text-primary mr-3 mt-1" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z" />
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 11a3 3 0 11-6 0 3 3 0 016 0z" />
</svg>
<span className="whitespace-pre-line">
{t('info.address')}
</span>
</p>
<p className="flex items-center">
<svg className="w-6 h-6 text-primary mr-3" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z" />
</svg>
<a href="tel:+4988192537298" className="hover:text-primary transition-colors">+49 881 92537298</a>
</p>
<p className="flex items-center">
<svg className="w-6 h-6 text-primary mr-3" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" />
</svg>
<a href="mailto:info@klz-vertriebs-gmbh.com" className="hover:text-primary transition-colors">info@klz-vertriebs-gmbh.com</a>
</p>
<div className="lg:col-span-5 space-y-12">
<div className="animate-fade-in">
<Heading level={3} subtitle="Contact Details" className="mb-8">
How to Reach Us
</Heading>
<div className="space-y-8">
<div className="flex items-start gap-6 group">
<div className="w-14 h-14 rounded-2xl bg-primary-light flex items-center justify-center text-primary group-hover:bg-accent group-hover:text-primary-dark transition-all duration-300 shadow-sm">
<svg className="w-7 h-7" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z" />
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 11a3 3 0 11-6 0 3 3 0 016 0z" />
</svg>
</div>
<div>
<h4 className="text-xl font-bold text-primary mb-2">Our Office</h4>
<p className="text-lg text-text-secondary leading-relaxed whitespace-pre-line">
{t('info.address')}
</p>
</div>
</div>
<div className="flex items-start gap-6 group">
<div className="w-14 h-14 rounded-2xl bg-primary-light flex items-center justify-center text-primary group-hover:bg-accent group-hover:text-primary-dark transition-all duration-300 shadow-sm">
<svg className="w-7 h-7" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z" />
</svg>
</div>
<div>
<h4 className="text-xl font-bold text-primary mb-2">Phone</h4>
<a href="tel:+4988192537298" className="text-lg text-text-secondary hover:text-primary transition-colors font-medium">+49 881 92537298</a>
</div>
</div>
<div className="flex items-start gap-6 group">
<div className="w-14 h-14 rounded-2xl bg-primary-light flex items-center justify-center text-primary group-hover:bg-accent group-hover:text-primary-dark transition-all duration-300 shadow-sm">
<svg className="w-7 h-7" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" />
</svg>
</div>
<div>
<h4 className="text-xl font-bold text-primary mb-2">Email</h4>
<a href="mailto:info@klz-vertriebs-gmbh.com" className="text-lg text-text-secondary hover:text-primary transition-colors font-medium">info@klz-vertriebs-gmbh.com</a>
</div>
</div>
</div>
</div>
<div>
<h3 className="text-xl font-bold mb-4">{t('hours.title')}</h3>
<ul className="space-y-2 text-text-secondary">
<li className="flex justify-between">
<span>{t('hours.weekdays')}</span>
<span>{t('hours.weekdaysTime')}</span>
<div className="p-10 bg-white rounded-3xl border border-neutral-medium shadow-sm animate-fade-in">
<Heading level={4} className="mb-6">{t('hours.title')}</Heading>
<ul className="space-y-4">
<li className="flex justify-between items-center pb-4 border-b border-neutral-medium">
<span className="font-bold text-primary">{t('hours.weekdays')}</span>
<span className="text-text-secondary">{t('hours.weekdaysTime')}</span>
</li>
<li className="flex justify-between">
<span>{t('hours.weekend')}</span>
<span>{t('hours.closed')}</span>
<li className="flex justify-between items-center">
<span className="font-bold text-primary">{t('hours.weekend')}</span>
<span className="text-accent-dark font-bold">{t('hours.closed')}</span>
</li>
</ul>
</div>
</div>
{/* Contact Form Placeholder */}
<div className="bg-white p-8 rounded-lg shadow-sm border border-neutral-dark">
<h3 className="text-xl font-bold mb-6">{t('form.title')}</h3>
<form className="space-y-4">
<div>
<label htmlFor="name" className="block text-sm font-medium text-text-primary mb-1">{t('form.name')}</label>
<input type="text" id="name" className="w-full px-4 py-2 border border-neutral-dark rounded-md focus:ring-primary focus:border-primary" />
</div>
<div>
<label htmlFor="email" className="block text-sm font-medium text-text-primary mb-1">{t('form.email')}</label>
<input type="email" id="email" className="w-full px-4 py-2 border border-neutral-dark rounded-md focus:ring-primary focus:border-primary" />
</div>
<div>
<label htmlFor="message" className="block text-sm font-medium text-text-primary mb-1">{t('form.message')}</label>
<textarea id="message" rows={4} className="w-full px-4 py-2 border border-neutral-dark rounded-md focus:ring-primary focus:border-primary"></textarea>
</div>
<Button type="submit" className="w-full">{t('form.submit')}</Button>
</form>
{/* Contact Form */}
<div className="lg:col-span-7">
<Card className="p-12 rounded-[40px] border-none shadow-2xl animate-slide-up">
<Heading level={3} subtitle="Send a Message" className="mb-10">
{t('form.title')}
</Heading>
<form className="grid grid-cols-1 md:grid-cols-2 gap-8">
<div className="space-y-2">
<label htmlFor="name" className="text-sm font-extrabold text-primary uppercase tracking-widest">{t('form.name')}</label>
<input
type="text"
id="name"
className="w-full px-6 py-4 bg-neutral rounded-2xl border-2 border-transparent focus:border-primary focus:bg-white transition-all outline-none text-lg"
placeholder="Your Name"
/>
</div>
<div className="space-y-2">
<label htmlFor="email" className="text-sm font-extrabold text-primary uppercase tracking-widest">{t('form.email')}</label>
<input
type="email"
id="email"
className="w-full px-6 py-4 bg-neutral rounded-2xl border-2 border-transparent focus:border-primary focus:bg-white transition-all outline-none text-lg"
placeholder="your@email.com"
/>
</div>
<div className="md:col-span-2 space-y-2">
<label htmlFor="message" className="text-sm font-extrabold text-primary uppercase tracking-widest">{t('form.message')}</label>
<textarea
id="message"
rows={6}
className="w-full px-6 py-4 bg-neutral rounded-2xl border-2 border-transparent focus:border-primary focus:bg-white transition-all outline-none text-lg resize-none"
placeholder="How can we help you?"
></textarea>
</div>
<div className="md:col-span-2 pt-4">
<Button type="submit" size="xl" className="w-full shadow-xl shadow-primary/20">
{t('form.submit')}
</Button>
</div>
</form>
</Card>
</div>
</div>
</Container>
</Section>
{/* Map Placeholder */}
<section className="h-[500px] bg-neutral-medium relative overflow-hidden grayscale hover:grayscale-0 transition-all duration-1000">
<div className="absolute inset-0 flex items-center justify-center">
<div className="text-center">
<div className="w-20 h-20 bg-primary rounded-full flex items-center justify-center text-white mb-4 mx-auto shadow-2xl animate-bounce">
<svg className="w-10 h-10" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z" />
</svg>
</div>
<p className="font-bold text-primary text-xl">Interactive Map Coming Soon</p>
</div>
</div>
</section>
</div>
);
}

View File

@@ -16,11 +16,11 @@ export default async function LocaleLayout({
const messages = await getMessages();
return (
<html lang={locale}>
<body className="flex flex-col min-h-screen">
<html lang={locale} className="scroll-smooth">
<body className="flex flex-col min-h-screen font-sans selection:bg-accent selection:text-primary-dark">
<NextIntlClientProvider messages={messages} locale={locale}>
<Header />
<main className="flex-grow">
<main className="flex-grow animate-fade-in">
{children}
</main>
<Footer />

View File

@@ -1,7 +1,7 @@
import Link from 'next/link';
import Image from 'next/image';
import { useTranslations } from 'next-intl';
import { Section, Container } from '@/components/ui';
import { Section, Container, Heading, Card, Badge } from '@/components/ui';
interface ProductsPageProps {
params: {
@@ -44,47 +44,86 @@ export default function ProductsPage({ params }: ProductsPageProps) {
];
return (
<div className="flex flex-col min-h-screen">
<Section className="bg-neutral-light">
<Container>
<div className="max-w-3xl mx-auto text-center mb-16">
<h1 className="text-4xl font-bold mb-6">{t('title')}</h1>
<p className="text-xl text-text-secondary">
<div className="flex flex-col min-h-screen bg-neutral-light">
{/* Hero Section */}
<section className="bg-primary-dark text-white py-32 relative overflow-hidden">
<div className="absolute inset-0 opacity-30">
<div className="absolute top-0 right-0 w-1/2 h-full bg-accent/10 skew-x-12 translate-x-1/4" />
</div>
<Container className="relative z-10">
<div className="max-w-4xl animate-slide-up">
<Heading level={1} subtitle="Product Portfolio" className="text-white mb-6">
<span className="text-white">{t('title')}</span>
</Heading>
<p className="text-2xl text-white/70 leading-relaxed max-w-2xl">
{t('subtitle')}
</p>
</div>
</Container>
</section>
<div className="grid grid-cols-1 md:grid-cols-2 gap-8">
<Section className="bg-neutral-light -mt-16 relative z-20">
<Container>
<div className="grid grid-cols-1 md:grid-cols-2 gap-12">
{categories.map((category, idx) => (
<Link key={idx} href={category.href} className="group block bg-white rounded-lg overflow-hidden shadow-sm border border-neutral-dark hover:shadow-md transition-all">
<div className="relative h-64 overflow-hidden">
<Image
src={category.img}
alt={category.title}
fill
className="object-cover transition-transform duration-700 group-hover:scale-110"
/>
<div className="absolute inset-0 bg-black/20 group-hover:bg-black/30 transition-colors" />
</div>
<div className="p-8">
<div className="flex items-center mb-4">
<div className="w-12 h-12 bg-primary/10 rounded-full flex items-center justify-center mr-4">
<img src={category.icon} alt="" className="w-8 h-8" />
<Link key={idx} href={category.href} className="group block">
<Card className="h-full border-none shadow-xl hover:shadow-2xl transition-all duration-700 rounded-[40px] overflow-hidden bg-white">
<div className="relative h-[400px] overflow-hidden">
<Image
src={category.img}
alt={category.title}
fill
className="object-cover transition-transform duration-1000 group-hover:scale-110"
/>
<div className="absolute inset-0 bg-gradient-to-t from-primary-dark/90 via-primary-dark/20 to-transparent" />
<div className="absolute top-8 right-8 w-20 h-20 bg-white/10 backdrop-blur-xl rounded-3xl flex items-center justify-center border border-white/20 shadow-2xl">
<img src={category.icon} alt="" className="w-12 h-12 brightness-0 invert" />
</div>
<div className="absolute bottom-10 left-10 right-10">
<Badge variant="accent" className="mb-4 shadow-lg">Category</Badge>
<h2 className="text-4xl font-bold text-white mb-4 leading-tight">{category.title}</h2>
</div>
<h2 className="text-2xl font-bold text-text-primary group-hover:text-primary transition-colors">{category.title}</h2>
</div>
<p className="text-text-secondary text-lg mb-6">
{category.desc}
</p>
<span className="text-primary font-medium group-hover:translate-x-1 transition-transform inline-flex items-center">
{t('viewProducts')} &rarr;
</span>
</div>
<div className="p-12">
<p className="text-text-secondary text-xl leading-relaxed mb-10">
{category.desc}
</p>
<div className="flex items-center text-primary font-extrabold text-lg group-hover:text-accent-dark transition-colors">
{t('viewProducts')}
<div className="ml-4 w-12 h-12 rounded-full bg-primary-light flex items-center justify-center text-primary group-hover:bg-accent group-hover:text-primary-dark transition-all duration-300">
<svg className="w-6 h-6 transition-transform group-hover:translate-x-1" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M17 8l4 4m0 0l-4 4m4-4H3" />
</svg>
</div>
</div>
</div>
</Card>
</Link>
))}
</div>
</Container>
</Section>
{/* Technical Support CTA */}
<Section className="bg-white">
<Container>
<div className="bg-primary-dark rounded-[60px] p-16 md:p-24 relative overflow-hidden">
<div className="absolute top-0 right-0 w-1/2 h-full bg-accent/5 -skew-x-12 translate-x-1/4" />
<div className="relative z-10 flex flex-col lg:flex-row items-center justify-between gap-12">
<div className="max-w-2xl text-center lg:text-left">
<h2 className="text-4xl md:text-5xl font-bold text-white mb-6">Need Technical Assistance?</h2>
<p className="text-xl text-white/70 leading-relaxed">
Our team of experts is ready to help you find the perfect cable solution for your specific technical requirements and environmental conditions.
</p>
</div>
<Link href={`/${params.locale}/contact`} className="inline-flex items-center justify-center h-20 px-12 rounded-full bg-accent text-primary-dark font-extrabold text-xl hover:bg-accent-dark transition-all shadow-2xl shadow-accent/20 group">
Contact Experts
<span className="ml-4 transition-transform group-hover:translate-x-2">&rarr;</span>
</Link>
</div>
</div>
</Container>
</Section>
</div>
);
}

View File

@@ -1,144 +1,185 @@
import { useTranslations } from 'next-intl';
import { Section, Container } from '@/components/ui';
import { Section, Container, Heading, Card, Badge, Button } from '@/components/ui';
import Image from 'next/image';
export default function TeamPage() {
const t = useTranslations('Team');
return (
<div className="flex flex-col min-h-screen">
<div className="flex flex-col min-h-screen bg-neutral-light">
{/* Hero Section */}
<section className="relative flex items-center justify-center overflow-hidden bg-neutral-dark pt-[14%] pb-[12%]">
<section className="relative flex items-center justify-center overflow-hidden bg-primary-dark pt-[14%] pb-[12%]">
<div className="absolute inset-0 z-0">
<Image
src="/uploads/2024/12/DSC07655-Large.webp"
alt="KLZ Team"
fill
className="object-cover"
className="object-cover scale-105 animate-slow-zoom opacity-40"
priority
/>
<div className="absolute inset-0 bg-gradient-to-r from-[#0a0000] to-[rgba(10,10,10,0.5)] opacity-80" />
<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-4xl">
<h5 className="text-xl md:text-2xl font-medium mb-4 text-primary">
{t('hero.title')}
</h5>
<h2 className="text-3xl md:text-5xl lg:text-6xl font-bold tracking-tight leading-tight">
<Container className="relative z-10 text-center text-white max-w-5xl animate-slide-up">
<Badge variant="accent" className="mb-8 shadow-lg">Our People</Badge>
<h1 className="text-5xl md:text-7xl lg:text-8xl font-extrabold tracking-tight leading-[1.1] mb-8">
{t('hero.subtitle')}
</h2>
</h1>
<p className="text-2xl md:text-3xl text-white/70 font-medium italic">
{t('hero.title')}
</p>
</Container>
</section>
{/* Michael Bodemer Section */}
<section className="relative bg-[#011fff] text-white overflow-hidden">
<div className="flex flex-col md:flex-row">
<div className="w-full md:w-1/2 p-12 md:p-24 flex flex-col justify-center">
<h1 className="text-4xl md:text-5xl font-bold mb-8">{t('michael.name')}</h1>
<div className="w-12 h-1 bg-white mb-8" />
<h2 className="text-2xl md:text-3xl font-medium italic mb-8 leading-relaxed">
{t('michael.quote')}
</h2>
<div className="w-12 h-1 bg-white mb-8" />
<p className="text-lg leading-relaxed opacity-90 mb-8">
{t('michael.description')}
</p>
<a
href="https://www.linkedin.com/in/michael-bodemer-33b493122/"
target="_blank"
rel="noopener noreferrer"
className="inline-flex items-center text-white font-bold border-2 border-white px-6 py-3 rounded-full hover:bg-white hover:text-[#011fff] transition-colors w-fit group"
>
{t('michael.linkedin')}
<span className="ml-2 group-hover:translate-x-1 transition-transform">&rarr;</span>
</a>
{/* Michael Bodemer Section - Sticky Narrative Split Layout */}
<section className="relative bg-white overflow-hidden">
<div className="flex flex-col lg:flex-row">
<div className="w-full lg:w-1/2 p-12 md:p-24 lg:p-32 flex flex-col justify-center bg-primary-dark text-white relative">
<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 animate-fade-in">
<Badge variant="accent" className="mb-8">Managing Director</Badge>
<Heading level={2} className="text-white mb-10 text-5xl md:text-6xl">
<span className="text-white">{t('michael.name')}</span>
</Heading>
<div className="relative mb-12">
<div className="absolute -left-8 top-0 bottom-0 w-1.5 bg-accent rounded-full" />
<p className="text-2xl md:text-3xl font-bold italic leading-relaxed pl-8 text-white/90">
"{t('michael.quote')}"
</p>
</div>
<p className="text-xl leading-relaxed text-white/70 mb-12 max-w-xl">
{t('michael.description')}
</p>
<Button
href="https://www.linkedin.com/in/michael-bodemer-33b493122/"
variant="accent"
size="xl"
className="group"
>
{t('michael.linkedin')}
<span className="ml-3 transition-transform group-hover:translate-x-2">&rarr;</span>
</Button>
</div>
</div>
<div className="w-full md:w-1/2 relative min-h-[50vh] md:min-h-full">
<div className="w-full lg:w-1/2 relative min-h-[600px] lg:min-h-screen overflow-hidden">
<Image
src="/uploads/2024/12/DSC07768-Large.webp"
alt={t('michael.name')}
fill
className="object-cover"
className="object-cover scale-105 hover:scale-100 transition-transform duration-1000"
/>
<div className="absolute inset-0 bg-gradient-to-r from-primary-dark/20 to-transparent" />
</div>
</div>
</section>
{/* Legacy Section */}
<section className="relative py-[10%] bg-neutral-dark text-white overflow-hidden">
{/* Legacy Section - Immersive Background */}
<section className="relative py-32 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="Legacy"
fill
className="object-cover"
className="object-cover opacity-30 scale-110 animate-slow-zoom"
/>
<div className="absolute inset-0 bg-[#263336] opacity-90" />
<div className="absolute inset-0 bg-primary-dark/60 mix-blend-multiply" />
</div>
<Container className="relative z-10">
<div className="grid grid-cols-1 md:grid-cols-12 gap-12">
<div className="md:col-span-5">
<h3 className="text-3xl font-bold mb-6">{t('legacy.title')}</h3>
<div className="space-y-6 text-lg opacity-90">
<p>
<div className="grid grid-cols-1 lg:grid-cols-12 gap-16 items-center">
<div className="lg:col-span-6">
<Heading level={2} subtitle="Our Heritage" className="text-white mb-10">
<span className="text-white">{t('legacy.title')}</span>
</Heading>
<div className="space-y-8 text-xl md:text-2xl text-white/80 leading-relaxed font-medium">
<p className="border-l-4 border-accent pl-8 py-2 bg-white/5 backdrop-blur-sm rounded-r-2xl">
{t('legacy.p1')}
</p>
<p>
<p className="pl-9">
{t('legacy.p2')}
</p>
</div>
</div>
<div className="lg:col-span-6 grid grid-cols-2 gap-6">
{[
{ label: 'Founded', value: '1998' },
{ label: 'Global Reach', value: '45+' },
{ label: 'Team Members', value: '120+' },
{ label: 'Innovation Awards', value: '12' },
].map((stat, i) => (
<div key={i} className="p-8 bg-white/5 backdrop-blur-md border border-white/10 rounded-[32px] hover:bg-white/10 transition-colors">
<div className="text-4xl font-extrabold text-accent mb-2">{stat.value}</div>
<div className="text-sm font-bold uppercase tracking-widest text-white/50">{stat.label}</div>
</div>
))}
</div>
</div>
</Container>
</section>
{/* Klaus Mintel Section */}
<section className="relative bg-[#011fff] text-white overflow-hidden">
<div className="flex flex-col md:flex-row">
<div className="w-full md:w-1/2 relative min-h-[50vh] md:min-h-full order-2 md:order-1">
{/* Klaus Mintel Section - Reversed Split Layout */}
<section className="relative bg-white overflow-hidden">
<div className="flex flex-col lg:flex-row">
<div className="w-full lg:w-1/2 relative min-h-[600px] lg:min-h-screen overflow-hidden order-2 lg:order-1">
<Image
src="/uploads/2024/12/DSC07963-Large.webp"
alt={t('klaus.name')}
fill
className="object-cover"
className="object-cover scale-105 hover:scale-100 transition-transform duration-1000"
/>
<div className="absolute inset-0 bg-gradient-to-l from-primary-dark/20 to-transparent" />
</div>
<div className="w-full md:w-1/2 p-12 md:p-24 flex flex-col justify-center order-1 md:order-2">
<h1 className="text-4xl md:text-5xl font-bold mb-8">{t('klaus.name')}</h1>
<div className="w-12 h-1 bg-white mb-8" />
<h2 className="text-2xl md:text-3xl font-medium italic mb-8 leading-relaxed">
{t('klaus.quote')}
</h2>
<div className="w-12 h-1 bg-white mb-8" />
<p className="text-lg leading-relaxed opacity-90 mb-8">
{t('klaus.description')}
</p>
<a
href="https://www.linkedin.com/in/klaus-mintel-b80a8b193/"
target="_blank"
rel="noopener noreferrer"
className="inline-flex items-center text-white font-bold border-2 border-white px-6 py-3 rounded-full hover:bg-white hover:text-[#011fff] transition-colors w-fit group"
>
{t('klaus.linkedin')}
<span className="ml-2 group-hover:translate-x-1 transition-transform">&rarr;</span>
</a>
<div className="w-full lg:w-1/2 p-12 md:p-24 lg:p-32 flex flex-col justify-center bg-neutral-light text-primary relative order-1 lg:order-2">
<div className="absolute top-0 left-0 w-32 h-full bg-primary/5 skew-x-12 -translate-x-1/2" />
<div className="relative z-10 animate-fade-in">
<Badge variant="primary" className="mb-8">Founder & Visionary</Badge>
<Heading level={2} className="text-primary mb-10 text-5xl md:text-6xl">
{t('klaus.name')}
</Heading>
<div className="relative mb-12">
<div className="absolute -left-8 top-0 bottom-0 w-1.5 bg-primary rounded-full" />
<p className="text-2xl md:text-3xl font-bold italic leading-relaxed pl-8 text-text-secondary">
"{t('klaus.quote')}"
</p>
</div>
<p className="text-xl leading-relaxed text-text-secondary mb-12 max-w-xl">
{t('klaus.description')}
</p>
<Button
href="https://www.linkedin.com/in/klaus-mintel-b80a8b193/"
variant="primary"
size="xl"
className="group"
>
{t('klaus.linkedin')}
<span className="ml-3 transition-transform group-hover:translate-x-2">&rarr;</span>
</Button>
</div>
</div>
</div>
</section>
{/* Manifesto Section */}
<Section className="bg-white text-neutral-dark">
{/* Manifesto Section - Modern Grid */}
<Section className="bg-white text-primary">
<Container>
<div className="grid grid-cols-1 lg:grid-cols-12 gap-12">
<div className="grid grid-cols-1 lg:grid-cols-12 gap-20">
<div className="lg:col-span-4">
<h2 className="text-4xl font-bold text-primary mb-6 sticky top-24">{t('manifesto.title')}</h2>
<div className="sticky top-32">
<Heading level={2} subtitle="Our Values">
{t('manifesto.title')}
</Heading>
<p className="text-xl text-text-secondary leading-relaxed">
Our core principles guide every decision we make and every cable we deliver.
</p>
</div>
</div>
<div className="lg:col-span-8 grid grid-cols-1 md:grid-cols-2 gap-8">
<div className="lg:col-span-8 grid grid-cols-1 md:grid-cols-2 gap-10">
{[0, 1, 2, 3, 4, 5].map((idx) => (
<div key={idx} className="bg-neutral-light p-6 rounded-lg border border-neutral hover:border-primary transition-colors">
<div className="text-primary font-mono text-xl mb-4">0{idx + 1}</div>
<h3 className="text-xl font-bold mb-3">{t(`manifesto.items.${idx}.title`)}</h3>
<p className="text-text-secondary">{t(`manifesto.items.${idx}.description`)}</p>
<div key={idx} className="p-10 bg-neutral-light rounded-[40px] border border-transparent hover:border-accent hover:bg-white hover:shadow-2xl transition-all duration-500 group">
<div className="w-16 h-16 bg-white rounded-2xl flex items-center justify-center mb-8 shadow-sm group-hover:bg-accent transition-colors duration-500">
<span className="text-primary font-extrabold text-2xl group-hover:text-primary-dark">0{idx + 1}</span>
</div>
<h3 className="text-2xl font-bold mb-4 text-primary">{t(`manifesto.items.${idx}.title`)}</h3>
<p className="text-text-secondary text-lg leading-relaxed">{t(`manifesto.items.${idx}.description`)}</p>
</div>
))}
</div>
@@ -146,10 +187,13 @@ export default function TeamPage() {
</Container>
</Section>
{/* Gallery Section */}
<Section className="bg-neutral-dark py-0 pb-24 pt-24">
{/* Gallery Section - Premium Treatment */}
<Section className="bg-primary-dark py-32">
<Container>
<div className="grid grid-cols-2 md:grid-cols-5 gap-4">
<Heading level={2} subtitle="Behind the Scenes" align="center" className="text-white mb-20">
<span className="text-white">Life at KLZ</span>
</Heading>
<div className="grid grid-cols-2 md:grid-cols-5 gap-6">
{[
'/uploads/2024/12/DSC07539-Large-600x400.webp',
'/uploads/2024/12/DSC07460-Large-600x400.webp',
@@ -157,8 +201,10 @@ export default function TeamPage() {
'/uploads/2024/12/DSC07433-Large-600x400.webp',
'/uploads/2024/12/DSC07387-Large-600x400.webp'
].map((src, idx) => (
<div key={idx} className="relative aspect-video rounded-lg overflow-hidden opacity-80 hover:opacity-100 transition-opacity">
<Image src={src} alt="Team Gallery" fill className="object-cover" />
<div key={idx} className="relative aspect-[3/4] rounded-[32px] overflow-hidden group shadow-2xl">
<Image src={src} alt="Team Gallery" fill className="object-cover transition-transform duration-1000 group-hover:scale-110" />
<div className="absolute inset-0 bg-primary-dark/40 group-hover:bg-transparent transition-all duration-500" />
<div className="absolute inset-0 border-0 group-hover:border-[12px] border-white/10 transition-all duration-500 pointer-events-none" />
</div>
))}
</div>