diff --git a/src/blocks/Hero/Component.tsx b/src/blocks/Hero/Component.tsx index f06031c..8b51b99 100644 --- a/src/blocks/Hero/Component.tsx +++ b/src/blocks/Hero/Component.tsx @@ -3,22 +3,22 @@ import React, { useState, useEffect } from 'react' import type { Page } from '../../payload-types' import Link from 'next/link' import Image from 'next/image' -import { Shield, MessageCircle } from 'lucide-react' +import { ArrowRight } from 'lucide-react' type Props = Extract[0], { blockType: 'hero' }> /* PLACEHOLDER - do podmiany na realne zdjęcia klienta */ const heroImages = [ { - url: 'https://images.unsplash.com/photo-1554224155-8d04cb21cd6c?auto=format&fit=crop&w=1200&q=80', + url: 'https://images.unsplash.com/photo-1554224155-8d04cb21cd6c?auto=format&fit=crop&w=2000&q=80', alt: 'Dokumenty podatkowe i praca biurowa', }, { - url: 'https://images.unsplash.com/photo-1497366216548-37526070297c?auto=format&fit=crop&w=1200&q=80', + url: 'https://images.unsplash.com/photo-1497366216548-37526070297c?auto=format&fit=crop&w=2000&q=80', alt: 'Profesjonalne biuro doradztwa podatkowego', }, { - url: 'https://images.unsplash.com/photo-1486312338219-ce68d2c6f44d?auto=format&fit=crop&w=1200&q=80', + url: 'https://images.unsplash.com/photo-1486312338219-ce68d2c6f44d?auto=format&fit=crop&w=2000&q=80', alt: 'Praca z rozliczeniami podatkowymi', }, ] @@ -29,101 +29,71 @@ export const HeroBlock: React.FC = ({ title, subtitle, primaryCta, second useEffect(() => { const timer = setInterval(() => { setCurrentSlide((prev) => (prev + 1) % heroImages.length) - }, 5000) + }, 6000) return () => clearInterval(timer) }, []) return ( -
-
-
- {/* Kolumna tekstowa */} -
- {yearsOfExperience && ( -
- - {yearsOfExperience} -
- )} - -

- {title} -

- -

- {subtitle} -

- -
- - - {primaryCta} - - {secondaryCta?.text && secondaryCta?.url && ( - - {secondaryCta.text} - - )} -
+
+ {/* Pełnoekranowe tło ze sliderem */} +
+ {heroImages.map((img, idx) => ( +
+ {/* PLACEHOLDER - do podmiany na realne zdjęcia klienta */} + {img.alt}
+ ))} + {/* Potężny, gładki overlay z koloru tła aplikacji od dołu i od lewej, dla idealnej czytelności */} +
+
+
- {/* Kolumna ze sliderem zdjęć */} -
-
-
- {heroImages.map((img, idx) => ( -
- {/* PLACEHOLDER - do podmiany na realne zdjęcia klienta */} - {img.alt} -
- ))} - - {/* Kropki nawigacji slidera */} -
- {heroImages.map((_, idx) => ( -
-
- - {/* Subtelna plakietka informacyjna */} -
-
- JK -
-
-

Punkt Doradczy b.b.h.

-

Lohnsteuerhilfeverein e.V.

-
-
+
+
+ {yearsOfExperience && ( +
+ {yearsOfExperience}
+ )} + +

+ {title} +

+ +

+ {subtitle} +

+ +
+ + {primaryCta} + + {secondaryCta?.text && secondaryCta?.url && ( + + {secondaryCta.text} + + + )}
diff --git a/src/blocks/Process/Component.tsx b/src/blocks/Process/Component.tsx index a3fb370..67475dc 100644 --- a/src/blocks/Process/Component.tsx +++ b/src/blocks/Process/Component.tsx @@ -8,34 +8,37 @@ type Props = Extract[0], { blockType: 'process' }> export const ProcessBlock: React.FC = ({ title, steps, ctaText }) => { return ( -
+
-
-

+
+

{title}

-

+

Prosty i przejrzysty proces rozliczenia w 3 krokach — bez zbędnych formalności.

-
+
+ {/* Opcjonalna pozioma linia łącząca na desktopie (bardzo subtelna) */} +
+ {steps?.map((step: NonNullable[0], index: number) => { const stepNumber = String(index + 1).padStart(2, '0') return (
-
-
- {stepNumber} -
-

+
+ {stepNumber} +
+
+

{step.title}

-

+

{step.description}

@@ -45,13 +48,15 @@ export const ProcessBlock: React.FC = ({ title, steps, ctaText }) => {

{ctaText && ( -
+
{ctaText} - +
+ +
)} diff --git a/src/blocks/ServicesList/Component.tsx b/src/blocks/ServicesList/Component.tsx index 19c4ef4..032cb62 100644 --- a/src/blocks/ServicesList/Component.tsx +++ b/src/blocks/ServicesList/Component.tsx @@ -1,44 +1,49 @@ 'use client' import React from 'react' -import { motion } from 'framer-motion' -import { ArrowRight } from 'lucide-react' import Link from 'next/link' import type { Page } from '../../payload-types' +import { ArrowRight } from 'lucide-react' type Props = Extract[0], { blockType: 'servicesList' }> export const ServicesListBlock: React.FC = ({ title, services }) => { return ( -
-
- - {title} - +
+
+
+

+ {title} +

+
-
+
{services?.map((service: NonNullable[0], index: number) => ( - - -

{service.title}

-

{service.description}

-
- {service.linkText} - -
- -
+
+

+ {service.title} +

+
+
+

+ {service.description} +

+
+
+ + {service.linkText} +
+ +
+ +
+
))}
diff --git a/src/blocks/Stats/Component.tsx b/src/blocks/Stats/Component.tsx index 0a41738..d4ffce8 100644 --- a/src/blocks/Stats/Component.tsx +++ b/src/blocks/Stats/Component.tsx @@ -1,3 +1,4 @@ +'use client' import React from 'react' export interface StatsProps { @@ -15,37 +16,37 @@ export const StatsBlock: React.FC = ({ title, subtitle, items }) => if (!items || items.length === 0) return null return ( -
+
{(title || subtitle) && ( -
+
{title && ( -

+

{title}

)} {subtitle && ( -

+

{subtitle}

)}
)} -
+
{items.map((item, index) => (
-
+
{item.stat}
-
+
{item.label}
{item.description && ( -

+

{item.description}

)} diff --git a/src/blocks/Testimonials/Component.tsx b/src/blocks/Testimonials/Component.tsx index 78eaf9b..9adb79c 100644 --- a/src/blocks/Testimonials/Component.tsx +++ b/src/blocks/Testimonials/Component.tsx @@ -1,66 +1,68 @@ 'use client' -import React from 'react' -import { Quote } from 'lucide-react' -import Image from 'next/image' +import React, { useState, useEffect } from 'react' import type { Page } from '../../payload-types' type Props = Extract[0], { blockType: 'testimonials' }> -/* PLACEHOLDER - do podmiany na realne zdjęcia klienta */ -const avatarPlaceholders = [ - 'https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?auto=format&fit=crop&w=150&h=150&q=80', - 'https://images.unsplash.com/photo-1534528741775-53994a69daeb?auto=format&fit=crop&w=150&h=150&q=80', - 'https://images.unsplash.com/photo-1500648767791-00dcc994a43e?auto=format&fit=crop&w=150&h=150&q=80', -] - export const TestimonialsBlock: React.FC = ({ title, testimonials }) => { + const [currentIndex, setCurrentIndex] = useState(0) + + useEffect(() => { + if (!testimonials || testimonials.length <= 1) return + + const timer = setInterval(() => { + setCurrentIndex((prev) => (prev + 1) % testimonials.length) + }, 7000) + + return () => clearInterval(timer) + }, [testimonials]) + + if (!testimonials || testimonials.length === 0) return null + return ( -
-
-
-

- {title} -

-
+
+
+

+ {title} +

-
- {testimonials?.map((t: NonNullable[0], index: number) => { - const avatarUrl = avatarPlaceholders[index % avatarPlaceholders.length] - - return ( -
-
- -

- "{t.quote}" -

-
- -
-
- {/* PLACEHOLDER - do podmiany na realne zdjęcia klienta */} - {t.author -
-
-

- {t.author} -

-

Klient zweryfikowany

-
-
+
+ {testimonials.map((t: NonNullable[0], index: number) => ( +
+

+ "{t.quote}" +

+ +
+
+

+ {t.author} +

+
- ) - })} +
+ ))}
+ + {testimonials.length > 1 && ( +
+ {testimonials.map((_, index) => ( +
+ )}
)