fix
This commit is contained in:
@@ -1,14 +1,11 @@
|
|||||||
'use client';
|
|
||||||
|
|
||||||
import { useTranslations } from 'next-intl';
|
|
||||||
import { getTranslations } from 'next-intl/server';
|
import { getTranslations } from 'next-intl/server';
|
||||||
import { Metadata } from 'next';
|
import { Metadata } from 'next';
|
||||||
import JsonLd from '@/components/JsonLd';
|
import JsonLd from '@/components/JsonLd';
|
||||||
import { getBreadcrumbSchema, SITE_URL } from '@/lib/schema';
|
import { getBreadcrumbSchema, SITE_URL } from '@/lib/schema';
|
||||||
import { Section, Container, Heading, Badge, Button } from '@/components/ui';
|
import { Section, Container, Heading, Badge, Button } from '@/components/ui';
|
||||||
import Image from 'next/image';
|
import Image from 'next/image';
|
||||||
import Lightbox from '@/components/Lightbox';
|
|
||||||
import Reveal from '@/components/Reveal';
|
import Reveal from '@/components/Reveal';
|
||||||
|
import Gallery from '@/components/team/Gallery';
|
||||||
|
|
||||||
interface TeamPageProps {
|
interface TeamPageProps {
|
||||||
params: {
|
params: {
|
||||||
@@ -42,19 +39,8 @@ export async function generateMetadata({ params: { locale } }: TeamPageProps): P
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function TeamPage() {
|
export default async function TeamPage({ params: { locale } }: TeamPageProps) {
|
||||||
const t = useTranslations('Team');
|
const t = await getTranslations({ locale, namespace: 'Team' });
|
||||||
|
|
||||||
const [lightboxOpen, setLightboxOpen] = React.useState(false);
|
|
||||||
const [lightboxIndex, setLightboxIndex] = React.useState(0);
|
|
||||||
|
|
||||||
const teamGalleryImages = [
|
|
||||||
'/uploads/2024/12/DSC07539-Large-600x400.webp',
|
|
||||||
'/uploads/2024/12/DSC07460-Large-600x400.webp',
|
|
||||||
'/uploads/2024/12/DSC07469-Large-600x400.webp',
|
|
||||||
'/uploads/2024/12/DSC07433-Large-600x400.webp',
|
|
||||||
'/uploads/2024/12/DSC07387-Large-600x400.webp'
|
|
||||||
];
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-col min-h-screen bg-neutral-light">
|
<div className="flex flex-col min-h-screen bg-neutral-light">
|
||||||
@@ -287,37 +273,7 @@ export default function TeamPage() {
|
|||||||
</Container>
|
</Container>
|
||||||
</Section>
|
</Section>
|
||||||
|
|
||||||
{/* Gallery Section - Premium Treatment */}
|
<Gallery />
|
||||||
<Section className="bg-primary-dark py-16 md:py-32">
|
|
||||||
<Container>
|
|
||||||
<Heading level={2} subtitle={t('gallery.subtitle')} align="center" className="text-white mb-12 md:mb-20">
|
|
||||||
<span className="text-white">{t('gallery.title')}</span>
|
|
||||||
</Heading>
|
|
||||||
<div className="grid grid-cols-2 md:grid-cols-5 gap-3 md:gap-6">
|
|
||||||
{teamGalleryImages.map((src, idx) => (
|
|
||||||
<button
|
|
||||||
key={idx}
|
|
||||||
onClick={() => {
|
|
||||||
setLightboxIndex(idx);
|
|
||||||
setLightboxOpen(true);
|
|
||||||
}}
|
|
||||||
className="relative aspect-[3/4] rounded-2xl md:rounded-[32px] overflow-hidden group shadow-2xl cursor-pointer"
|
|
||||||
>
|
|
||||||
<Image src={src} alt={t('gallery.title')} 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-[8px] md:group-hover:border-[12px] border-white/10 transition-all duration-500 pointer-events-none" />
|
|
||||||
</button>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</Container>
|
|
||||||
|
|
||||||
<Lightbox
|
|
||||||
isOpen={lightboxOpen}
|
|
||||||
images={teamGalleryImages}
|
|
||||||
initialIndex={lightboxIndex}
|
|
||||||
onClose={() => setLightboxOpen(false)}
|
|
||||||
/>
|
|
||||||
</Section>
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React from 'react';
|
import React, { useState, useEffect } from 'react';
|
||||||
import { useTranslations } from 'next-intl';
|
import { useTranslations } from 'next-intl';
|
||||||
import { Container, Button, Section, Heading } from '@/components/ui';
|
import { Container, Button, Section, Heading } from '@/components/ui';
|
||||||
import Scribble from '@/components/Scribble';
|
import Scribble from '@/components/Scribble';
|
||||||
@@ -7,38 +7,46 @@ import HeroIllustration from './HeroIllustration';
|
|||||||
export default function Hero() {
|
export default function Hero() {
|
||||||
const t = useTranslations('Home.hero');
|
const t = useTranslations('Home.hero');
|
||||||
|
|
||||||
|
const [mounted, setMounted] = useState(false);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
setMounted(true);
|
||||||
|
}, []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Section className="relative min-h-[85vh] md:h-[90vh] flex items-center justify-center overflow-hidden bg-primary py-12 md:py-0 lg:py-0">
|
<Section className="relative min-h-[85vh] md:h-[90vh] flex items-center justify-center overflow-hidden bg-primary py-12 md:py-0 lg:py-0">
|
||||||
<HeroIllustration />
|
<div className={`absolute inset-0 z-0 opacity-0 scale-[0.96] blur-lg transition-all duration-[2200ms] ease-out delay-[50ms] ${mounted ? 'opacity-100 scale-100 blur-0' : ''}`}>
|
||||||
|
<HeroIllustration />
|
||||||
|
</div>
|
||||||
|
|
||||||
<Container className="relative z-10 text-left text-white w-full">
|
<Container className="relative z-10 text-left text-white w-full">
|
||||||
<div className="max-w-5xl animate-slide-up">
|
<div className="max-w-5xl">
|
||||||
<Heading level={1} className="mb-6 md:mb-8 max-w-[12ch] md:max-w-none text-white text-4xl sm:text-5xl md:text-7xl">
|
<Heading level={1} className="mb-6 md:mb-8 max-w-[12ch] md:max-w-none text-white text-4xl sm:text-5xl md:text-7xl opacity-0 translate-y-12 scale-[0.88] transition-all duration-[1400ms] ease-out delay-[450ms] ${mounted ? 'opacity-100 translate-y-0 scale-100' : ''}">
|
||||||
{t.rich('title', {
|
{t.rich('title', {
|
||||||
green: (chunks) => (
|
green: (chunks) => (
|
||||||
<span className="relative inline-block">
|
<span className="relative inline-block">
|
||||||
<span className="relative z-10 text-accent italic">{chunks}</span>
|
<span className={`relative z-10 text-accent italic opacity-0 scale-[0.92] transition-all duration-[900ms] ease-out delay-[650ms] ${mounted ? 'opacity-100 scale-100' : ''}`}>{chunks}</span>
|
||||||
<Scribble variant="circle" className="w-[140%] h-[140%] -top-[20%] -left-[20%] text-accent/30 hidden md:block" />
|
<Scribble variant="circle" className={`w-[140%] h-[140%] -top-[20%] -left-[20%] text-accent/30 hidden md:block opacity-0 scale-0 origin-center transition-all duration-[800ms] ease-out delay-[850ms] ${mounted ? 'opacity-100 scale-100' : ''}`} />
|
||||||
</span>
|
</span>
|
||||||
)
|
)
|
||||||
})}
|
})}
|
||||||
</Heading>
|
</Heading>
|
||||||
<p className="text-lg md:text-xl text-white/90 leading-relaxed max-w-2xl mb-10 md:mb-12">
|
<p className="text-lg md:text-xl text-white/90 leading-relaxed max-w-2xl mb-10 md:mb-12 opacity-0 translate-y-8 scale-[0.94] transition-all duration-[1100ms] ease-out delay-[850ms] ${mounted ? 'opacity-100 translate-y-0 scale-100' : ''}">
|
||||||
{t('subtitle')}
|
{t('subtitle')}
|
||||||
</p>
|
</p>
|
||||||
<div className="flex flex-col sm:flex-row gap-4 md:gap-6">
|
<div className="flex flex-col sm:flex-row gap-4 md:gap-6">
|
||||||
<Button href="/contact" variant="accent" size="lg" className="group w-full sm:w-auto h-14 md:h-16 px-8 md:px-10 text-base md:text-lg">
|
<Button href="/contact" variant="accent" size="lg" className="group w-full sm:w-auto h-14 md:h-16 px-8 md:px-10 text-base md:text-lg opacity-0 translate-y-6 scale-[0.92] transition-all duration-[900ms] ease-out delay-[1250ms] ${mounted ? 'opacity-100 translate-y-0 scale-100' : ''}">
|
||||||
{t('cta')}
|
{t('cta')}
|
||||||
<span className="ml-3 transition-transform group-hover:translate-x-1">→</span>
|
<span className="ml-3 transition-transform group-hover:translate-x-1">→</span>
|
||||||
</Button>
|
</Button>
|
||||||
<Button href="/products" variant="ghost" size="lg" className="group w-full sm:w-auto h-14 md:h-16 px-8 md:px-10 text-base md:text-lg text-white border-white/20 hover:bg-white/10 md:bg-white md:text-saturated md:hover:bg-neutral-light md:border-none">
|
<Button href="/products" variant="ghost" size="lg" className="group w-full sm:w-auto h-14 md:h-16 px-8 md:px-10 text-base md:text-lg text-white border-white/20 hover:bg-white/10 md:bg-white md:text-saturated md:hover:bg-neutral-light md:border-none opacity-0 translate-y-6 scale-[0.92] transition-all duration-[900ms] ease-out delay-[1550ms] ${mounted ? 'opacity-100 translate-y-0 scale-100' : ''}">
|
||||||
{t('exploreProducts')}
|
{t('exploreProducts')}
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</Container>
|
</Container>
|
||||||
|
|
||||||
<div className="absolute bottom-6 md:bottom-10 left-1/2 -translate-x-1/2 animate-bounce hidden sm:block">
|
<div className={`absolute bottom-6 md:bottom-10 left-1/2 -translate-x-1/2 animate-bounce opacity-0 translate-y-4 transition-all duration-[1000ms] ease-out delay-[3000ms] ${mounted ? 'opacity-100 translate-y-0' : ''} hidden sm:block`}>
|
||||||
<div className="w-6 h-10 border-2 border-white/30 rounded-full flex justify-center p-1">
|
<div className="w-6 h-10 border-2 border-white/30 rounded-full flex justify-center p-1">
|
||||||
<div className="w-1 h-2 bg-white rounded-full" />
|
<div className="w-1 h-2 bg-white rounded-full" />
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
55
components/team/Gallery.tsx
Normal file
55
components/team/Gallery.tsx
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
'use client';
|
||||||
|
|
||||||
|
import { useTranslations } from 'next-intl';
|
||||||
|
import { useState } from 'react';
|
||||||
|
import Image from 'next/image';
|
||||||
|
import Lightbox from '@/components/Lightbox';
|
||||||
|
import { Section, Container, Heading } from '@/components/ui';
|
||||||
|
|
||||||
|
export default function Gallery() {
|
||||||
|
const t = useTranslations('Team');
|
||||||
|
|
||||||
|
const [lightboxOpen, setLightboxOpen] = useState(false);
|
||||||
|
const [lightboxIndex, setLightboxIndex] = useState(0);
|
||||||
|
|
||||||
|
const teamGalleryImages = [
|
||||||
|
'/uploads/2024/12/DSC07539-Large-600x400.webp',
|
||||||
|
'/uploads/2024/12/DSC07460-Large-600x400.webp',
|
||||||
|
'/uploads/2024/12/DSC07469-Large-600x400.webp',
|
||||||
|
'/uploads/2024/12/DSC07433-Large-600x400.webp',
|
||||||
|
'/uploads/2024/12/DSC07387-Large-600x400.webp'
|
||||||
|
];
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Section className="bg-primary-dark py-16 md:py-32">
|
||||||
|
<Container>
|
||||||
|
<Heading level={2} subtitle={t('gallery.subtitle')} align="center" className="text-white mb-12 md:mb-20">
|
||||||
|
<span className="text-white">{t('gallery.title')}</span>
|
||||||
|
</Heading>
|
||||||
|
<div className="grid grid-cols-2 md:grid-cols-5 gap-3 md:gap-6">
|
||||||
|
{teamGalleryImages.map((src, idx) => (
|
||||||
|
<button
|
||||||
|
key={idx}
|
||||||
|
onClick={() => {
|
||||||
|
setLightboxIndex(idx);
|
||||||
|
setLightboxOpen(true);
|
||||||
|
}}
|
||||||
|
className="relative aspect-[3/4] rounded-2xl md:rounded-[32px] overflow-hidden group shadow-2xl cursor-pointer"
|
||||||
|
>
|
||||||
|
<Image src={src} alt={t('gallery.title')} 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-[8px] md:group-hover:border-[12px] border-white/10 transition-all duration-500 pointer-events-none" />
|
||||||
|
</button>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</Container>
|
||||||
|
|
||||||
|
<Lightbox
|
||||||
|
isOpen={lightboxOpen}
|
||||||
|
images={teamGalleryImages}
|
||||||
|
initialIndex={lightboxIndex}
|
||||||
|
onClose={() => setLightboxOpen(false)}
|
||||||
|
/>
|
||||||
|
</Section>
|
||||||
|
);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user