UI fixes (colors, favicon) and codebase comment cleanup

This commit is contained in:
MichalC
2026-08-11 09:46:19 +02:00
parent 2be143af0f
commit fa51241628
46 changed files with 13 additions and 290 deletions
-12
View File
@@ -139,12 +139,10 @@ export default async function BlogPostPage({ params }: BlogPostPageProps) {
return (
<main className="bg-slate-50 pt-24 pb-16">
{/* Skrypty JSON-LD dla SEO */}
<JsonLd data={jsonLdArticle} />
<JsonLd data={jsonLdBreadcrumb} />
<article className="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8">
{/* Powrót */}
<Link
href="/blog"
className="inline-flex items-center gap-2 text-sm font-semibold text-primary/70 hover:text-primary transition-colors mb-8"
@@ -152,8 +150,6 @@ export default async function BlogPostPage({ params }: BlogPostPageProps) {
<ArrowLeft className="w-4 h-4" />
Wróć do listy artykułów
</Link>
{/* Header artykułu */}
<header className="mb-10 text-center md:text-left">
<div className="flex flex-wrap items-center justify-center md:justify-start gap-4 mb-6 text-sm font-medium text-text-muted">
<span className="px-3 py-1 bg-accent/10 text-accent font-bold rounded-full uppercase tracking-wider">
@@ -179,8 +175,6 @@ export default async function BlogPostPage({ params }: BlogPostPageProps) {
{post.excerpt}
</p>
</header>
{/* Główny obraz */}
<div className="relative w-full aspect-video rounded-2xl overflow-hidden mb-12 shadow-md">
<Image
src={post.image || '/images/hero/hero-section-image.webp'}
@@ -190,8 +184,6 @@ export default async function BlogPostPage({ params }: BlogPostPageProps) {
className="object-cover"
/>
</div>
{/* Treść */}
<div className="prose prose-lg md:prose-xl prose-slate max-w-none mb-16
prose-headings:font-heading prose-headings:text-primary prose-headings:font-bold
prose-a:text-accent hover:prose-a:text-accent-hover prose-a:font-semibold
@@ -204,16 +196,12 @@ export default async function BlogPostPage({ params }: BlogPostPageProps) {
</div>
</article>
{/* CTA do usługi */}
<CtaBanner
title="Podobał Ci się ten artykuł?"
subtitle="Jeśli potrzebujesz pomocy specjalistów w podobnej sprawie, sprawdź naszą ofertę lub skontaktuj się z nami bezpośrednio."
ctaText="Zobacz naszą ofertę"
ctaLink={getCtaLink()}
/>
{/* Powiązane artykuły */}
{relatedPosts.length > 0 && (
<section className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 mt-16 md:mt-24">
<div className="flex items-center justify-between border-b border-border pb-4 mb-8">
+1 -1
View File
@@ -24,7 +24,7 @@ export default function BlogPage() {
return (
<main>
<HeroSection
eyebrow="Baza Wiedzy"
title="Blog i poradniki"
subtitle="Dzielimy się naszą wiedzą i doświadczeniem. Zobacz, jak dbać o domowe instalacje, na co uważać podczas remontu i jak uzyskać dofinansowanie."
ctaText="Skontaktuj się z nami"
-13
View File
@@ -114,7 +114,6 @@ export default function CennikMontazuPage() {
<>
<JsonLd data={jsonLd} />
<main>
{/* Hero */}
<section className="relative text-white py-24 md:py-32 overflow-hidden">
<Image
src="/images/services/wycena.webp"
@@ -151,12 +150,8 @@ export default function CennikMontazuPage() {
</div>
</div>
</section>
{/* Cennik główny */}
<section className="py-16 bg-white">
<div className="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 flex flex-col gap-10">
{/* Montaż */}
<div>
<div className="flex items-center gap-2 mb-4">
<Wrench className="size-5 text-accent" />
@@ -174,8 +169,6 @@ export default function CennikMontazuPage() {
))}
</div>
</div>
{/* Trasa freonowa */}
<div>
<div className="flex items-center gap-2 mb-4">
<Zap className="size-5 text-accent" />
@@ -195,8 +188,6 @@ export default function CennikMontazuPage() {
</p>
</div>
</div>
{/* Serwis */}
<div>
<div className="flex items-center gap-2 mb-4">
<Wind className="size-5 text-accent" />
@@ -218,8 +209,6 @@ export default function CennikMontazuPage() {
</p>
</div>
</section>
{/* FAQ */}
<section className="py-16 bg-slate-50">
<div className="max-w-3xl mx-auto px-4 sm:px-6 lg:px-8">
<h2 className="text-2xl font-extrabold text-primary font-heading mb-8">Często zadawane pytania o cennik</h2>
@@ -238,8 +227,6 @@ export default function CennikMontazuPage() {
</div>
</div>
</section>
{/* CTA */}
<section className="py-16 bg-primary text-white">
<div className="max-w-2xl mx-auto px-4 text-center">
<h2 className="text-2xl font-extrabold font-heading mb-4">
+2 -2
View File
@@ -72,7 +72,7 @@
--secondary-foreground: #0f2a47;
--muted: #f5f7fa;
--muted-foreground: #5a6678;
--accent: #1030D0;
--accent: #2ba8e0;
--accent-foreground: #ffffff;
--accent-light: #e3f4fc;
--cta: #F39320;
@@ -81,7 +81,7 @@
--destructive: oklch(0.577 0.245 27.325);
--theme-border: #e2e8f0;
--input: #e2e8f0;
--ring: #1030D0;
--ring: #2ba8e0;
--success: #16a34a;
--chart-1: oklch(0.87 0 0);
--chart-2: oklch(0.556 0 0);
+2 -4
View File
@@ -75,7 +75,7 @@ export default function KlimatyzacjaPage() {
<JsonLd data={faqJsonLd} />
<main>
<HeroSection
eyebrow="15+ lat doświadczenia · Split i multisplit · Uprawnienia F-gaz"
title="Montaż klimatyzacji — dobór, instalacja, serwis"
subtitle="Zapewnij sobie idealny klimat w domu i biurze. Oferujemy kompleksowe usługi od bezpłatnego audytu po montaż i opiekę serwisową."
ctaText="Dobierz klimatyzator"
@@ -116,7 +116,7 @@ export default function KlimatyzacjaPage() {
<ProcessSteps
steps={acProcessSteps}
eyebrow="Krok po Kroku"
title="Jak wygląda proces montażu?"
subtitle="Od pierwszej wizyty do pełnego uruchomienia — zobacz, jak działamy u naszych klientów."
/>
@@ -132,8 +132,6 @@ export default function KlimatyzacjaPage() {
<WhyUs />
<FaqAccordion category="klimatyzacja" />
{/* Sekcja miast dla SEO */}
<section id="miasta" className="py-16 bg-slate-50 border-t border-border">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="text-center mb-10">
+1 -1
View File
@@ -16,7 +16,7 @@ export default function KontaktPage() {
return (
<main>
<HeroSection
eyebrow="Kontakt"
title="Jesteśmy do Twojej dyspozycji"
subtitle="Zastanawiasz się nad montażem klimatyzacji ? Potrzebujesz serwisu? Napisz lub zadzwoń — odpowiemy szybko i bezpłatnie."
ctaText="Zadzwoń do nas"
-3
View File
@@ -32,7 +32,6 @@ Przejdź do sklepu
<h1 className="text-2xl font-bold text-primary font-heading mb-8">Twój koszyk</h1>
<div className="grid grid-cols-1 lg:grid-cols-3 gap-8">
{/* Lista produktów */}
<div className="lg:col-span-2 flex flex-col gap-4">
{items.map((item) => (
<div key={item.id} className="bg-white rounded-xl border border-border p-4 flex gap-4 items-center">
@@ -62,8 +61,6 @@ Przejdź do sklepu
</div>
))}
</div>
{/* Podsumowanie */}
<div className="lg:col-span-1">
<div className="bg-white rounded-xl border border-border p-6 sticky top-24">
<h2 className="text-base font-bold text-primary font-heading mb-4">Podsumowanie</h2>
+3
View File
@@ -42,6 +42,9 @@ export const metadata: Metadata = {
'max-snippet': -1,
},
},
icons: {
icon: 'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"></svg>',
},
};
export default function RootLayout({
-13
View File
@@ -90,7 +90,6 @@ export default function MontazKlimatyzacjiPage() {
<>
<JsonLd data={jsonLd} />
<main>
{/* Hero */}
<section className="relative text-white py-24 md:py-32 overflow-hidden">
<Image
src="/images/services/instalacja_klimatyzacji.webp"
@@ -128,8 +127,6 @@ export default function MontazKlimatyzacjiPage() {
</div>
</div>
</section>
{/* Wyróżniki */}
<section className="py-16 bg-white">
<div className="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8">
<h2 className="text-2xl font-extrabold text-primary font-heading mb-8">Dlaczego warto wybrać ThermCool?</h2>
@@ -154,8 +151,6 @@ export default function MontazKlimatyzacjiPage() {
);
})}
</div>
{/* Typy montażu */}
<h2 className="text-2xl font-extrabold text-primary font-heading mb-6">Rodzaje montażu</h2>
<div className="grid grid-cols-1 sm:grid-cols-3 gap-4">
{[
@@ -171,8 +166,6 @@ export default function MontazKlimatyzacjiPage() {
</div>
</div>
</section>
{/* Etapy montażu */}
<section className="py-16 bg-slate-50">
<div className="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8">
<h2 className="text-2xl font-extrabold text-primary font-heading mb-8">Jak wygląda montaż krok po kroku?</h2>
@@ -191,8 +184,6 @@ export default function MontazKlimatyzacjiPage() {
</div>
</div>
</section>
{/* Cennik */}
<section className="py-16 bg-white">
<div className="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8">
<h2 className="text-2xl font-extrabold text-primary font-heading mb-2">Cennik montażu</h2>
@@ -222,8 +213,6 @@ export default function MontazKlimatyzacjiPage() {
</div>
</div>
</section>
{/* FAQ */}
<section className="py-16 bg-slate-50">
<div className="max-w-3xl mx-auto px-4 sm:px-6 lg:px-8">
<h2 className="text-2xl font-extrabold text-primary font-heading mb-8">Często zadawane pytania</h2>
@@ -242,8 +231,6 @@ export default function MontazKlimatyzacjiPage() {
</div>
</div>
</section>
{/* CTA */}
<section className="py-16 bg-primary text-white">
<div className="max-w-2xl mx-auto px-4 text-center">
<h2 className="text-2xl font-extrabold font-heading mb-4">
+1 -1
View File
@@ -17,7 +17,7 @@ export default function ONasPage() {
return (
<main>
<HeroSection
eyebrow="Poznaj Nas"
title={`O firmie ${companyDetails.shortName}`}
subtitle="Jesteśmy zgranym zespołem inżynierów, instalatorów i serwisantów. Od lat dostarczamy sprawdzone rozwiązania z zakresu klimatyzacji, ogrzewania i wykończeń."
ctaText="Skontaktuj się z nami"
-18
View File
@@ -128,7 +128,6 @@ export default function Home() {
return (
<>
{/* LocalBusiness Schema for Google Search SEO */}
<JsonLd data={jsonLd} />
<HeroSection />
@@ -143,14 +142,9 @@ export default function Home() {
<BlogPreview />
{/* Cennik usług */}
{/* Cennik usług */}
<section className="bg-white py-16 px-4">
<div className="bg-slate-50 max-w-7xl mx-auto rounded-[2.5rem] p-6 sm:p-10 lg:p-14">
<div className="max-w-7xl mx-auto flex flex-col gap-8">
{/* Header (Sekcja hero nad kartami) */}
<div className="mb-2">
<div className="inline-flex items-center gap-1.5 text-[10px] font-bold text-accent uppercase tracking-widest mb-6 bg-accent/5 border border-accent/20 px-3 py-1.5 rounded-full">
<Check className="size-3.5" />
@@ -163,11 +157,7 @@ export default function Home() {
Profesjonalna obsługa, certyfikowani specjaliści i szybki czas reakcji na terenie całego Wrocławia. Zadbaj o czyste powietrze i wydajność swoich urządzeń.
</p>
</div>
{/* Cards Grid */}
<div className="grid grid-cols-1 md:grid-cols-3 gap-6">
{/* Card 1: Montaż klimatyzacji */}
<div className="bg-white p-8 flex flex-col rounded-2xl shadow-sm border border-border">
<div className="flex flex-col gap-6 mb-12">
<div className="size-12 bg-slate-100 flex items-center justify-center shrink-0 border border-slate-200 rounded-lg">
@@ -184,8 +174,6 @@ export default function Home() {
<p className="text-[10px] text-text-muted mt-1">* cena standardowego montażu do 5m</p>
</div>
</div>
{/* Card 2: Czyszczenie */}
<div className="bg-white p-8 flex flex-col rounded-2xl shadow-sm border border-border">
<div className="flex flex-col gap-6 mb-12">
<div className="size-12 bg-slate-100 flex items-center justify-center shrink-0 border border-slate-200 rounded-lg">
@@ -201,8 +189,6 @@ export default function Home() {
<p className="text-xl font-extrabold text-primary">od 250 zł</p>
</div>
</div>
{/* Card 3: Przegląd techniczny */}
<div className="bg-white p-8 flex flex-col rounded-2xl shadow-sm border border-border">
<div className="flex flex-col gap-6 mb-12">
<div className="size-12 bg-slate-100 flex items-center justify-center shrink-0 border border-slate-200 rounded-lg">
@@ -218,8 +204,6 @@ export default function Home() {
<p className="text-xl font-extrabold text-primary">od 150 zł</p>
</div>
</div>
{/* Card 4: Uzupełnienie czynnika */}
<div className="bg-white p-8 flex flex-col rounded-2xl shadow-sm border border-border">
<div className="flex flex-col gap-6 mb-12">
<div className="size-12 bg-slate-100 flex items-center justify-center shrink-0 border border-slate-200 rounded-lg">
@@ -235,8 +219,6 @@ export default function Home() {
<p className="text-xl font-extrabold text-primary">od 180 zł</p>
</div>
</div>
{/* Card 5: Naprawa usterek */}
<div className="bg-white p-8 flex flex-col rounded-2xl shadow-sm border border-border">
<div className="flex flex-col gap-6 mb-12">
<div className="size-12 bg-slate-100 flex items-center justify-center shrink-0 border border-slate-200 rounded-lg">
+1 -1
View File
@@ -20,7 +20,7 @@ export default function RealizacjePage() {
return (
<main>
<HeroSection
eyebrow="Portfolio"
title="Nasze realizacje"
subtitle="Zobacz wybrane projekty, które zrealizowaliśmy dla naszych klientów. Każde zlecenie traktujemy indywidualnie, dbając o najwyższą jakość wykonania."
ctaText="Zobacz ofertę"
-11
View File
@@ -134,7 +134,6 @@ export default function SerwisKlimatyzacjiPage() {
<>
<JsonLd data={jsonLd} />
<main>
{/* Hero */}
<section className="relative text-white py-24 md:py-32 overflow-hidden">
<Image
src="/images/services/czyszczenie.webp"
@@ -172,8 +171,6 @@ export default function SerwisKlimatyzacjiPage() {
</div>
</div>
</section>
{/* Usługi serwisowe */}
<section className="py-16 bg-white">
<div className="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8">
<h2 className="text-2xl font-extrabold text-primary font-heading mb-8">Co obejmuje nasz serwis?</h2>
@@ -198,21 +195,17 @@ export default function SerwisKlimatyzacjiPage() {
</div>
</div>
</section>
{/* Marki */}
<section className="py-16 bg-slate-50 overflow-hidden">
<div className="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8">
<h2 className="text-2xl font-extrabold text-primary font-heading mb-6">Serwisujemy wszystkie popularne marki</h2>
<div className="relative flex overflow-hidden w-full mb-4">
<div className="flex w-max animate-marquee gap-4 whitespace-nowrap items-center">
{/* Pierwszy zestaw */}
{BRANDS_WITH_LOGOS.map(m => (
<div key={m.name} className="flex-shrink-0 px-6 py-4 bg-white border border-border rounded-xl flex items-center justify-center w-40 h-20 hover:shadow-md transition-shadow">
<Image src={m.src} alt={m.name} width={120} height={60} className="object-contain w-full h-full" />
</div>
))}
{/* Drugi zestaw (klon) do płynnego przejścia */}
{BRANDS_WITH_LOGOS.map(m => (
<div key={`dup-${m.name}`} className="flex-shrink-0 px-6 py-4 bg-white border border-border rounded-xl flex items-center justify-center w-40 h-20 hover:shadow-md transition-shadow">
<Image src={m.src} alt={m.name} width={120} height={60} className="object-contain w-full h-full" />
@@ -224,8 +217,6 @@ export default function SerwisKlimatyzacjiPage() {
<p className="text-xs text-text-muted">Nie widzisz swojej marki? Zadzwoń — prawdopodobnie też ją obsługujemy.</p>
</div>
</section>
{/* FAQ */}
<section className="py-16 bg-white">
<div className="max-w-3xl mx-auto px-4 sm:px-6 lg:px-8">
<h2 className="text-2xl font-extrabold text-primary font-heading mb-8">Często zadawane pytania</h2>
@@ -244,8 +235,6 @@ export default function SerwisKlimatyzacjiPage() {
</div>
</div>
</section>
{/* CTA */}
<section className="py-16 bg-primary text-white">
<div className="max-w-2xl mx-auto px-4 text-center">
<h2 className="text-2xl font-extrabold font-heading mb-4">
+1 -1
View File
@@ -18,7 +18,7 @@ export default function ShopPage() {
return (
<main>
<HeroSection
eyebrow="Sklep ThermCool"
title="Klimatyzatory split i multisplit"
subtitle={`${splitCount} klimatyzatorów split i ${multiCount} jednostek multisplit. Gree, Rotenso, Haier, Daikin, LG, Samsung i inne marki. Z montażem lub bez.`}
ctaText="Zapytaj o montaż"
-5
View File
@@ -60,7 +60,6 @@ Wróć do sklepu
<h1 className="text-2xl font-bold text-primary font-heading mb-8">Złóż zamówienie</h1>
<div className="grid grid-cols-1 gap-6">
{/* Podsumowanie produktów */}
<div className="bg-white rounded-xl border border-border p-6">
<h2 className="text-base font-bold text-primary font-heading mb-4">Zamawiane produkty</h2>
<div className="flex flex-col gap-2">
@@ -76,8 +75,6 @@ Wróć do sklepu
</div>
</div>
</div>
{/* Formularz */}
<form onSubmit={async (e) => {
e.preventDefault();
const formData = new FormData(e.currentTarget);
@@ -90,8 +87,6 @@ Wróć do sklepu
});
}} className="bg-white rounded-xl border border-border p-6 flex flex-col gap-4">
<h2 className="text-base font-bold text-primary font-heading">Twoje dane</h2>
{/* Hidden: produkty jako JSON */}
<input type="hidden" name="products" value={JSON.stringify(items)} />
<input type="hidden" name="total" value={total} />
-8
View File
@@ -43,7 +43,6 @@ export default async function MultisplitInquiryPage({ params }: Props) {
return (
<main className="bg-slate-50 min-h-screen">
{/* Breadcrumb */}
<div className="bg-white border-b border-border">
<div className="max-w-5xl mx-auto px-4 py-3">
<nav className="flex items-center gap-1.5 text-xs text-text-muted">
@@ -64,7 +63,6 @@ export default async function MultisplitInquiryPage({ params }: Props) {
</Link>
<div className="grid grid-cols-1 lg:grid-cols-2 gap-8 mb-10">
{/* Lewa — zdjęcie + specyfikacja */}
<div className="flex flex-col gap-4">
<div className="bg-white rounded-2xl border border-border p-6">
<div className="flex items-center justify-between mb-4">
@@ -91,8 +89,6 @@ export default async function MultisplitInquiryPage({ params }: Props) {
<p className="text-sm text-text-muted">{product.shortDescription}</p>
)}
</div>
{/* Kluczowe parametry */}
<div className="bg-white rounded-2xl border border-border p-5">
<h2 className="text-sm font-bold text-primary mb-3">Kluczowe parametry</h2>
<div className="grid grid-cols-2 gap-3">
@@ -112,8 +108,6 @@ export default async function MultisplitInquiryPage({ params }: Props) {
})}
</div>
</div>
{/* Wycena indywidualna info */}
<div className="bg-accent/10 border border-accent/20 rounded-2xl p-5">
<p className="text-sm font-bold text-accent mb-1">Wycena indywidualna</p>
<p className="text-xs text-text-muted leading-relaxed">
@@ -125,8 +119,6 @@ export default async function MultisplitInquiryPage({ params }: Props) {
</a>
</div>
</div>
{/* Prawa — formularz */}
<div>
<div className="bg-white rounded-2xl border border-border p-6">
<h2 className="text-base font-extrabold text-primary font-heading mb-1">
-16
View File
@@ -108,7 +108,6 @@ export function ContactForm() {
)}
<div className="grid grid-cols-1 sm:grid-cols-2 gap-6">
{/* Imię */}
<div className="space-y-2">
<label htmlFor="name" className="text-sm font-semibold text-primary">Imię i nazwisko <span className="text-red-500">*</span></label>
<input
@@ -121,8 +120,6 @@ export function ContactForm() {
/>
{errors.name && <p className="text-red-500 text-xs font-medium">{errors.name.message}</p>}
</div>
{/* Telefon */}
<div className="space-y-2">
<label htmlFor="phone" className="text-sm font-semibold text-primary">Telefon <span className="text-red-500">*</span></label>
<input
@@ -138,7 +135,6 @@ export function ContactForm() {
</div>
<div className="grid grid-cols-1 sm:grid-cols-2 gap-6">
{/* Email */}
<div className="space-y-2">
<label htmlFor="email" className="text-sm font-semibold text-primary">Adres e-mail</label>
<input
@@ -150,8 +146,6 @@ export function ContactForm() {
/>
{errors.email && <p className="text-red-500 text-xs font-medium">{errors.email.message}</p>}
</div>
{/* Miasto */}
<div className="space-y-2">
<label htmlFor="city" className="text-sm font-semibold text-primary">Miasto <span className="text-red-500">*</span></label>
<select
@@ -178,8 +172,6 @@ export function ContactForm() {
{errors.city && <p className="text-red-500 text-xs font-medium">{errors.city.message}</p>}
</div>
</div>
{/* Temat */}
<div className="space-y-2">
<label htmlFor="subject" className="text-sm font-semibold text-primary">Temat rozmowy</label>
<select
@@ -195,8 +187,6 @@ export function ContactForm() {
</select>
{errors.subject && <p className="text-red-500 text-xs font-medium">{errors.subject.message}</p>}
</div>
{/* Warunkowe pola dla serwisu */}
{watch('subject') === 'serwis' && (
<div className="grid grid-cols-1 sm:grid-cols-2 gap-6">
<div className="space-y-2">
@@ -236,8 +226,6 @@ export function ContactForm() {
</div>
</div>
)}
{/* Wiadomość */}
<div className="space-y-2">
<label htmlFor="message" className="text-sm font-semibold text-primary">Wiadomość</label>
<textarea
@@ -249,8 +237,6 @@ export function ContactForm() {
/>
{errors.message && <p className="text-red-500 text-xs font-medium">{errors.message.message}</p>}
</div>
{/* Załączniki */}
<div className="flex flex-col gap-1.5">
<label className="text-sm font-medium text-primary">
Załącz zdjęcia <span className="text-text-muted font-normal">(opcjonalnie)</span>
@@ -282,8 +268,6 @@ export function ContactForm() {
</label>
<p className="text-xs text-text-muted">Zdjęcia miejsca montażu znacznie przyspieszają wycenę.</p>
</div>
{/* RODO */}
<div className="space-y-2">
<div className="flex items-start gap-3 cursor-pointer" onClick={() => setConsent(!consent)}>
<div className={`size-5 rounded border-2 shrink-0 mt-0.5 flex items-center justify-center transition-colors ${
@@ -149,15 +149,12 @@ export function KalkulatorClient({ products }: Props) {
return (
<main className="bg-slate-50 min-h-screen py-12">
<div className={`mx-auto px-4 sm:px-6 transition-all duration-500 ${step === 3 ? 'max-w-5xl' : 'max-w-2xl'}`}>
{/* Header */}
<div className="text-center mb-8">
<h1 className="text-3xl font-extrabold text-primary font-heading mb-2">
Dobierz urządzenie
</h1>
<p className="text-text-muted">Odpowiedz na {STEPS.length} krótkich pytań — pokażemy Ci najlepsze opcje z naszej oferty</p>
</div>
{/* Pasek postępu */}
<div className="flex items-center mb-8">
{STEPS.map((s, i) => (
<div key={s} className="flex items-start flex-1 last:flex-none">
@@ -175,11 +172,7 @@ export function KalkulatorClient({ products }: Props) {
</div>
))}
</div>
{/* Karty kroków */}
<div className="bg-white rounded-2xl border border-border p-6 md:p-8">
{/* Krok 0: Pomieszczenie */}
{step === 0 && (
<div className="flex flex-col gap-6">
<div className="flex items-center gap-3 mb-2">
@@ -191,8 +184,6 @@ export function KalkulatorClient({ products }: Props) {
<p className="text-xs text-text-muted">Metraż i warunki</p>
</div>
</div>
{/* Lista pomieszczeń */}
<div className="flex flex-col gap-3">
{pomieszczenia.map((p, i) => (
<div key={i} className="bg-slate-50 rounded-xl border border-border p-4">
@@ -247,8 +238,6 @@ export function KalkulatorClient({ products }: Props) {
+ Dodaj kolejne pomieszczenie
</button>
)}
{/* Ograniczenie szerokości */}
<div className="bg-slate-50 border border-border rounded-xl p-4">
<div className="flex items-start justify-between gap-3 mb-2">
<div>
@@ -385,8 +374,6 @@ export function KalkulatorClient({ products }: Props) {
</div>
</div>
)}
{/* Krok 2: Instalacja */}
{step === 1 && (
<div className="flex flex-col gap-6">
<div className="flex items-center gap-3 mb-2">
@@ -461,8 +448,6 @@ export function KalkulatorClient({ products }: Props) {
</div>
</div>
)}
{/* Krok 3: Budżet */}
{step === 2 && (
<div className="flex flex-col gap-6">
<div className="flex items-center gap-3 mb-2">
@@ -560,7 +545,6 @@ export function KalkulatorClient({ products }: Props) {
{step === 2 && (
<div className="flex flex-col gap-6">
{/* Podsumowanie */}
<div className="bg-slate-50 rounded-2xl border border-border p-5">
<h2 className="text-lg font-bold text-primary font-heading mb-4">
Dopasowane klimatyzatory
@@ -603,8 +587,6 @@ export function KalkulatorClient({ products }: Props) {
</div>
</div>
)}
{/* Nawigacja */}
<div className="flex justify-between mt-8 pt-6 border-t border-border">
{step > 0 ? (
<button onClick={() => setStep(s => s - 1)}
-13
View File
@@ -8,10 +8,8 @@ export function Footer() {
return (
<footer className="bg-[#00188D] text-primary-foreground">
{/* Main Footer Content */}
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-16">
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-12">
{/* Column 1: Company details */}
<div className="flex flex-col gap-4">
<Link href="/" className="inline-block">
<span className="text-2xl font-bold font-heading text-white">
@@ -53,8 +51,6 @@ export function Footer() {
</div>
</div>
</div>
{/* Column 2: Services */}
<div>
<h3 className="text-base font-semibold font-heading text-white mb-6 uppercase tracking-wider">
Usługi
@@ -74,8 +70,6 @@ export function Footer() {
</li>
</ul>
</div>
{/* Column 3: Information */}
<div>
<h3 className="text-base font-semibold font-heading text-white mb-6 uppercase tracking-wider">
Informacje
@@ -118,8 +112,6 @@ export function Footer() {
</li>
</ul>
</div>
{/* Column 4: Obsługa Klienta */}
<div>
<h3 className="text-base font-semibold font-heading text-white mb-6 uppercase tracking-wider">
Obsługa Klienta
@@ -134,8 +126,6 @@ export function Footer() {
</div>
</div>
</div>
{/* Bottom Bar */}
<div className="border-t border-slate-800 bg-slate-950/40 py-6">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 flex flex-col sm:flex-row justify-between items-center gap-4">
<div className="flex flex-col gap-2">
@@ -146,7 +136,6 @@ export function Footer() {
</div>
<div className="flex items-center gap-6">
{/* Social Icons */}
<div className="flex gap-4">
<a
href={companyDetails.socials.facebook}
@@ -167,8 +156,6 @@ export function Footer() {
<Instagram className="size-4" />
</a>
</div>
{/* Trust Symbol */}
<div className="flex items-center gap-1.5 text-xs text-slate-400 border-l border-slate-800 pl-6">
<ShieldCheck className="size-4 text-white" />
<span>Bezpieczne płatności SSL</span>
-14
View File
@@ -85,7 +85,6 @@ export function Header() {
return (
<>
{/* ----------------- DESKTOP: NAV BAR (STICKY) ----------------- */}
<header
className={cn(
"hidden lg:block sticky top-0 z-40 bg-background transition-all duration-300 border-b border-border",
@@ -93,16 +92,12 @@ export function Header() {
)}
>
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 flex items-center justify-between gap-4">
{/* Left: Logo */}
<Link href="/" className="shrink-0 flex items-center gap-3">
<span className="text-2xl font-bold font-heading text-primary">
{companyDetails.shortName}
<span className="text-accent">.</span>
</span>
</Link>
{/* Middle: Main Navigation */}
<nav className="flex items-center gap-6">
<NavDropdown
label="Klimatyzacja"
@@ -145,8 +140,6 @@ export function Header() {
Kontakt
</Link>
</nav>
{/* Right: Phone, Cart, CTA */}
<div className="flex items-center gap-5">
<a
href={`tel:${companyDetails.phoneRaw}`}
@@ -173,8 +166,6 @@ export function Header() {
</div>
</div>
</header>
{/* ----------------- MOBILE: HEADER (STICKY) ----------------- */}
<header
className={cn(
"lg:hidden sticky top-0 z-40 bg-background border-b border-border transition-all duration-300",
@@ -182,15 +173,12 @@ export function Header() {
)}
>
<div className="max-w-7xl mx-auto px-4 sm:px-6 flex items-center justify-between">
{/* Mobile Logo */}
<Link href="/" className="shrink-0 flex items-center">
<span className="text-xl font-bold font-heading text-primary">
{companyDetails.shortName}
<span className="text-accent">.</span>
</span>
</Link>
{/* Mobile Icons (Cart + Hamburger) */}
<div className="flex items-center gap-3">
<Link href="/koszyk" className="p-2 text-primary hover:text-accent hover:bg-muted transition-colors rounded-lg relative outline-none" aria-label="Koszyk">
<ShoppingBag className="size-5" />
@@ -211,8 +199,6 @@ export function Header() {
</div>
</div>
</header>
{/* ----------------- MOBILE MENU DRAWER ----------------- */}
<MobileMenu
isOpen={isMobileMenuOpen}
onClose={() => setIsMobileMenuOpen(false)}
-7
View File
@@ -99,8 +99,6 @@ export function MobileMenu({ isOpen, onClose }: MobileMenuProps) {
</ul>
</div>
</details>
{/* Usługi i serwis */}
<details className="collapse collapse-arrow border-b border-border rounded-none">
<summary className="collapse-title text-sm font-medium text-primary hover:text-accent py-3 px-0 min-h-0">
Usługi i serwis
@@ -124,9 +122,6 @@ export function MobileMenu({ isOpen, onClose }: MobileMenuProps) {
</details>
{/* 2. Pompy Ciepła */}
{/* Sklep */}
<details className="collapse collapse-arrow border-b border-border rounded-none">
<summary className="collapse-title text-sm font-medium text-primary hover:text-accent py-3 px-0 min-h-0">
Sklep
@@ -200,8 +195,6 @@ export function MobileMenu({ isOpen, onClose }: MobileMenuProps) {
</div>
</div>
{/* Drawer Footer */}
<div className="border-t border-border p-6 bg-slate-50 flex flex-col gap-4">
<a
href={`tel:${companyDetails.phoneRaw}`}
-4
View File
@@ -8,7 +8,6 @@ export function AboutStory() {
return (
<section className="py-16 md:py-24 max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="grid grid-cols-1 lg:grid-cols-2 gap-12 lg:gap-20 items-center">
{/* Lewa: Obraz */}
<div className="relative">
<div className="relative aspect-[4/5] rounded-3xl overflow-hidden shadow-2xl">
<Image
@@ -18,7 +17,6 @@ export function AboutStory() {
className="object-cover"
/>
</div>
{/* Ozdobny element zaufania */}
<div className="absolute -bottom-8 -right-8 bg-white p-6 rounded-2xl shadow-xl hidden md:block">
<div className="flex items-center gap-4">
<div className="flex-shrink-0 w-16 h-16 bg-accent/10 rounded-full flex items-center justify-center">
@@ -33,8 +31,6 @@ export function AboutStory() {
</div>
</div>
</div>
{/* Prawa: Tekst */}
<div>
<SectionHeading
eyebrow="Nasza Historia"
+1 -1
View File
@@ -12,7 +12,7 @@ export function AdvantagesBar() {
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="grid grid-cols-1 md:grid-cols-3 gap-4 md:gap-6">
{advantages.map((adv, idx) => (
<div key={idx} className="flex items-center justify-center md:justify-start gap-3">
<div key={idx} className="flex items-center justify-center gap-3">
<adv.icon className="size-5 text-accent shrink-0" />
<span className="text-sm font-medium leading-tight">
{adv.text}
-14
View File
@@ -34,8 +34,6 @@ export function BlogPreview() {
subtitle="Dzielimy się wiedzą i doświadczeniem. Zobacz nasze wpisy dotyczące klimatyzacji i pomp ciepła oraz oszczędzania energii."
align="center"
/>
{/* Blog Posts Grid */}
<div className="grid grid-cols-1 md:grid-cols-3 gap-8">
{latestPosts.map((post) => (
<article
@@ -43,7 +41,6 @@ export function BlogPreview() {
className="group flex flex-col justify-between border border-border rounded-xl overflow-hidden hover:shadow-md transition-shadow h-full"
>
<div>
{/* Thumbnail */}
<div className="relative aspect-video bg-slate-50 border-b border-border">
<Image
src={post.image}
@@ -53,10 +50,7 @@ export function BlogPreview() {
sizes="(max-width: 768px) 100vw, 33vw"
/>
</div>
{/* Content */}
<div className="p-6">
{/* Category & Date */}
<div className="flex items-center gap-4 text-xs text-text-muted mb-3">
<span className="font-semibold uppercase tracking-wider text-accent">
{getCategoryLabel(post.category)}
@@ -66,20 +60,14 @@ export function BlogPreview() {
<span>{formatDate(post.date)}</span>
</span>
</div>
{/* Title */}
<h3 className="text-lg font-bold text-primary font-heading line-clamp-2 leading-snug group-hover:text-accent transition-colors">
<Link href={`/blog/${post.slug}`}>{post.title}</Link>
</h3>
{/* Excerpt */}
<p className="text-sm text-text-muted mt-3 line-clamp-2 leading-relaxed">
{post.excerpt}
</p>
</div>
</div>
{/* Read More Link */}
<div className="p-6 pt-0 mt-auto">
<Link
href={`/blog/${post.slug}`}
@@ -92,8 +80,6 @@ export function BlogPreview() {
</article>
))}
</div>
{/* Blog Catalog Button */}
<div className="flex justify-center mt-12">
<Link href="/blog" className="btn btn-outline btn-primary bg-white font-bold flex items-center gap-2 group">
-1
View File
@@ -30,7 +30,6 @@ export const BrandsGrid = () => {
href={`/sklep?brand=${encodeURIComponent(brand.name)}`}
className="group flex justify-center items-center h-16 bg-slate-50 rounded-xl p-3 border border-border hover:border-accent hover:bg-accent/5 hover:shadow-sm transition-all duration-300"
>
{/* Tutaj docelowo można dać tag Image */}
<span className="font-bold text-primary text-sm md:text-base tracking-tight opacity-70 group-hover:opacity-100 group-hover:text-accent transition-all">{brand.name}</span>
</Link>
))}
@@ -14,7 +14,6 @@ const steps = [
export const ConfiguratorTeaser = () => {
return (
<section className="py-20 bg-primary text-white relative overflow-hidden">
{/* Background decoration */}
<div className="absolute top-0 right-0 w-1/2 h-full bg-gradient-to-l from-accent/20 to-transparent pointer-events-none" />
<div className="absolute -bottom-24 -left-24 w-64 h-64 bg-accent rounded-full blur-[120px] opacity-20 pointer-events-none" />
@@ -39,7 +38,6 @@ export const ConfiguratorTeaser = () => {
</div>
<div className="relative">
{/* Visual representation of steps */}
<div className="bg-white/10 backdrop-blur-sm border border-white/20 rounded-2xl p-8">
<div className="space-y-6 relative before:absolute before:inset-0 before:ml-6 before:-translate-x-px md:before:mx-auto md:before:translate-x-0 before:h-full before:w-0.5 before:bg-gradient-to-b before:from-transparent before:via-white/30 before:to-transparent">
{steps.map((step, idx) => {
@@ -57,8 +55,6 @@ export const ConfiguratorTeaser = () => {
);
})}
</div>
{/* Pro tip card */}
<div className="mt-8 bg-accent/20 border border-accent/40 rounded-xl p-4 flex items-start">
<Lightbulb className="w-6 h-6 text-accent shrink-0 mr-3 mt-0.5" />
<div>
-11
View File
@@ -7,7 +7,6 @@ export function ContactSection() {
return (
<section className="py-16 md:py-24 max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="grid grid-cols-1 lg:grid-cols-2 gap-16 lg:gap-24">
{/* Lewa kolumna: Dane kontaktowe */}
<div className="flex flex-col">
<h2 className="text-3xl md:text-4xl font-extrabold text-primary font-heading mb-6">
Porozmawiajmy o Twoim projekcie
@@ -17,7 +16,6 @@ export function ContactSection() {
</p>
<div className="space-y-8 flex-grow">
{/* Telefon */}
<div className="flex items-start gap-4 group">
<div className="w-12 h-12 rounded-xl bg-accent/10 text-accent flex items-center justify-center shrink-0 group-hover:bg-accent group-hover:text-white transition-colors">
<Phone className="w-6 h-6" />
@@ -29,8 +27,6 @@ export function ContactSection() {
</a>
</div>
</div>
{/* Email */}
<div className="flex items-start gap-4 group">
<div className="w-12 h-12 rounded-xl bg-accent/10 text-accent flex items-center justify-center shrink-0 group-hover:bg-accent group-hover:text-white transition-colors">
<Mail className="w-6 h-6" />
@@ -42,8 +38,6 @@ export function ContactSection() {
</a>
</div>
</div>
{/* Adres */}
<div className="flex items-start gap-4 group">
<div className="w-12 h-12 rounded-xl bg-accent/10 text-accent flex items-center justify-center shrink-0 group-hover:bg-accent group-hover:text-white transition-colors">
<MapPin className="w-6 h-6" />
@@ -57,8 +51,6 @@ export function ContactSection() {
</div>
</div>
</div>
{/* Godziny i NIP */}
<div className="grid grid-cols-1 sm:grid-cols-2 gap-8 pt-8 border-t border-border">
<div className="flex items-start gap-3">
<Clock className="w-5 h-5 text-primary/60 mt-0.5 shrink-0" />
@@ -77,10 +69,7 @@ export function ContactSection() {
</div>
</div>
</div>
{/* Prawa kolumna: Formularz */}
<div className="relative">
{/* Tło dekoracyjne */}
<div className="absolute inset-0 bg-primary/5 rounded-[2.5rem] transform translate-x-4 translate-y-4 -z-10 hidden sm:block" />
<ContactForm />
</div>
-4
View File
@@ -22,7 +22,6 @@ export function CtaBanner({
return (
<section className="relative overflow-hidden py-16 md:py-20">
{/* Background and overlays */}
<div
className={cn(
"absolute inset-0 z-0",
@@ -38,7 +37,6 @@ export function CtaBanner({
<div className="relative z-10 max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="flex flex-col lg:flex-row items-center justify-between gap-10">
{/* Text Area */}
<div className="max-w-2xl text-center lg:text-left flex flex-col gap-3">
<h2
className={cn(
@@ -57,8 +55,6 @@ export function CtaBanner({
{subtitle}
</p>
</div>
{/* Action buttons */}
<div className="flex flex-col sm:flex-row items-center gap-4 mt-8 w-full sm:w-auto shrink-0 justify-center">
<Link href={ctaLink} className="w-fit sm:w-auto btn btn-primary font-bold text-white px-6">
<span>{ctaText}</span>
-1
View File
@@ -5,7 +5,6 @@ import { companyDetails } from '@/content/company';
export const EmergencyBlock = () => {
return (
<section className="py-12 bg-cta text-white relative overflow-hidden">
{/* Dekoracyjne tło */}
<div className="absolute top-0 right-0 w-1/2 h-full bg-gradient-to-l from-white/10 to-transparent pointer-events-none" />
<div className="absolute -bottom-24 -left-24 w-64 h-64 bg-white/20 rounded-full blur-[100px] pointer-events-none" />
-3
View File
@@ -29,7 +29,6 @@ export function FeaturedPost({ post }: FeaturedPostProps) {
return (
<div className="group relative rounded-2xl overflow-hidden bg-white border border-border shadow-sm hover:shadow-lg transition-all duration-300">
<div className="flex flex-col md:flex-row">
{/* Obraz */}
<div className="relative w-full md:w-3/5 aspect-video md:aspect-auto md:min-h-[400px]">
<Image
src={post.image || '/images/hero/hero-section-image.webp'}
@@ -43,8 +42,6 @@ export function FeaturedPost({ post }: FeaturedPostProps) {
</span>
</div>
</div>
{/* Treść */}
<div className="p-8 md:p-12 flex flex-col justify-center w-full md:w-2/5">
<div className="flex items-center gap-4 text-text-muted text-sm font-medium mb-4">
<div className="flex items-center gap-1.5">
-4
View File
@@ -16,15 +16,11 @@ export function FeaturedProducts() {
subtitle="Poznaj wybrane modele urządzeń chłodzących i grzewczych od wiodących marek. Zapewniamy kompleksowy montaż."
align="center"
/>
{/* Products Grid */}
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6 md:gap-8">
{featured.map((product) => (
<ProductCard key={product.slug} product={product} />
))}
</div>
{/* Catalog Link */}
<div className="flex justify-center mt-12">
<Link href="/sklep" className="btn btn-outline btn-primary bg-white font-bold flex items-center gap-2 group">
-3
View File
@@ -50,7 +50,6 @@ export const FundingSection = () => {
</div>
<div className="relative">
{/* Dekoracyjna karta */}
<div className="bg-white rounded-3xl p-8 shadow-xl relative z-10 border border-white/50">
<div className="flex justify-between items-start mb-8">
<div>
@@ -81,8 +80,6 @@ export const FundingSection = () => {
</div>
</div>
</div>
{/* Background elements */}
<div className="absolute -top-6 -right-6 w-full h-full bg-accent/20 rounded-3xl -z-10 blur-sm"></div>
<div className="absolute -bottom-8 -left-8 w-32 h-32 bg-white/40 rounded-full -z-10 blur-xl"></div>
</div>
-19
View File
@@ -4,7 +4,6 @@ import { ArrowRight, Star } from "lucide-react";
import { buttonClasses } from "@/components/ui/Button";
export interface HeroSectionProps {
eyebrow?: string;
title?: React.ReactNode;
subtitle?: string;
ctaText?: string;
@@ -16,7 +15,6 @@ export interface HeroSectionProps {
}
export function HeroSection({
eyebrow = "Wrocław i Dolny Śląsk",
title = (
<>
<span className="text-white">Klimatyzacja</span><br />
@@ -42,31 +40,16 @@ export function HeroSection({
sizes="100vw"
className="object-cover"
/>
{/* NAKŁADKA POD TEKST - jednolita, przyciemniająca */}
<div className="absolute inset-0 bg-black/50" />
<div className="relative z-10 w-full max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-16 md:py-24">
<div className="flex flex-col items-start text-left max-w-3xl">
{/* Badge */}
{eyebrow && (
<div className="inline-flex items-center gap-1.5 px-3.5 py-1.5 rounded-full bg-accent/20 border border-accent/30 text-white text-xs font-semibold uppercase tracking-wider mb-6 font-heading">
<span className="size-2 rounded-full bg-accent" />
{eyebrow}
</div>
)}
{/* Heading */}
<h1 className="text-3xl md:text-5xl lg:text-6xl font-extrabold tracking-tight font-heading leading-[1.1] text-white">
{title}
</h1>
{/* Subtitle */}
<p className="mt-6 text-base md:text-lg lg:text-xl text-white/90 max-w-2xl leading-relaxed">
{subtitle}
</p>
{/* Optional Features List */}
{features && features.length > 0 && (
<ul className="mt-6 grid grid-cols-2 gap-3 text-white/90 font-medium">
{features.map((feature, idx) => (
@@ -77,8 +60,6 @@ export function HeroSection({
))}
</ul>
)}
{/* CTA Buttons */}
<div className="mt-10 flex flex-col sm:flex-row items-start sm:items-center gap-4 w-full sm:w-auto">
{ctaText && ctaLink && (
<Link href={ctaLink} className={buttonClasses({ variant: 'primary', size: 'md', className: 'w-fit sm:w-auto group' })}>
-12
View File
@@ -20,11 +20,7 @@ export function HomeServices() {
Profesjonalna obsługa, certyfikowani specjaliści i szybki czas reakcji na terenie całego Wrocławia. Zadbaj o czyste powietrze i wydajność swoich urządzeń.
</p>
</div>
{/* Cards Grid */}
<div className="grid grid-cols-1 md:grid-cols-3 gap-6">
{/* Card 1: Montaż klimatyzacji */}
<div className="bg-white p-8 flex flex-col rounded-2xl shadow-sm border border-border">
<div className="flex flex-col gap-6 mb-12">
<div className="size-12 bg-slate-100 flex items-center justify-center shrink-0 border border-slate-200 rounded-lg">
@@ -41,8 +37,6 @@ export function HomeServices() {
<p className="text-[10px] text-text-muted mt-1">* cena standardowego montażu do 5m</p>
</div>
</div>
{/* Card 2: Czyszczenie */}
<div className="bg-white p-8 flex flex-col rounded-2xl shadow-sm border border-border">
<div className="flex flex-col gap-6 mb-12">
<div className="size-12 bg-slate-100 flex items-center justify-center shrink-0 border border-slate-200 rounded-lg">
@@ -58,8 +52,6 @@ export function HomeServices() {
<p className="text-xl font-extrabold text-primary">od 250 zł</p>
</div>
</div>
{/* Card 3: Przegląd techniczny */}
<div className="bg-white p-8 flex flex-col rounded-2xl shadow-sm border border-border">
<div className="flex flex-col gap-6 mb-12">
<div className="size-12 bg-slate-100 flex items-center justify-center shrink-0 border border-slate-200 rounded-lg">
@@ -75,8 +67,6 @@ export function HomeServices() {
<p className="text-xl font-extrabold text-primary">od 150 zł</p>
</div>
</div>
{/* Card 4: Uzupełnienie czynnika */}
<div className="bg-white p-8 flex flex-col rounded-2xl shadow-sm border border-border">
<div className="flex flex-col gap-6 mb-12">
<div className="size-12 bg-slate-100 flex items-center justify-center shrink-0 border border-slate-200 rounded-lg">
@@ -92,8 +82,6 @@ export function HomeServices() {
<p className="text-xl font-extrabold text-primary">od 180 zł</p>
</div>
</div>
{/* Card 5: Naprawa usterek */}
<div className="bg-white p-8 flex flex-col rounded-2xl shadow-sm border border-border">
<div className="flex flex-col gap-6 mb-12">
<div className="size-12 bg-slate-100 flex items-center justify-center shrink-0 border border-slate-200 rounded-lg">
-2
View File
@@ -17,8 +17,6 @@ export function MapEmbed() {
className="absolute inset-0"
></iframe>
*/}
{/* Poniżej znajduje się Placeholder */}
<div className="absolute inset-0 flex items-center justify-center bg-slate-200 border-y border-border">
<div className="text-center p-6 bg-white/80 backdrop-blur-sm rounded-xl border border-white/50 shadow-sm max-w-sm mx-4">
<svg className="w-12 h-12 text-primary/40 mx-auto mb-3" fill="none" viewBox="0 0 24 24" stroke="currentColor">
-5
View File
@@ -6,9 +6,7 @@ export function PillarsSection() {
<section className="py-16 md:py-24 bg-white">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="grid grid-cols-1 lg:grid-cols-2 gap-8">
{/* Pillar 1: Chłód i Ogrzewanie */}
<div className="group relative rounded-2xl border border-border p-8 md:p-12 bg-slate-50 hover:bg-white hover:border-accent hover:shadow-xl transition-all duration-300 flex flex-col justify-between overflow-hidden">
{/* Visual background gradient glow on hover */}
<div className="absolute right-0 top-0 size-48 rounded-full bg-accent/5 filter blur-3xl opacity-0 group-hover:opacity-100 transition-opacity" />
<div>
@@ -32,10 +30,7 @@ export function PillarsSection() {
</Link>
</div>
</div>
{/* Pillar 2: Twój Dom */}
<div className="group relative rounded-2xl border border-border p-8 md:p-12 bg-slate-50 hover:bg-white hover:border-cta hover:shadow-xl transition-all duration-300 flex flex-col justify-between overflow-hidden">
{/* Visual background gradient glow on hover */}
<div className="absolute right-0 top-0 size-48 rounded-full bg-cta/5 filter blur-3xl opacity-0 group-hover:opacity-100 transition-opacity" />
<div>
-7
View File
@@ -47,15 +47,12 @@ export function PostsGrid({ posts, featuredPost }: PostsGridProps) {
return (
<div className="py-12">
{/* Artykuł Wyróżniony (tylko na 1 stronie) */}
{featuredPost && currentPage === 1 && (
<div className="mb-16">
<h2 className="text-2xl font-bold text-primary font-heading mb-8">Artykuł wyróżniony</h2>
<FeaturedPost post={featuredPost} />
</div>
)}
{/* Filtry */}
<div className="flex flex-wrap items-center gap-3 mb-12">
{categories.map((category) => (
<button
@@ -72,8 +69,6 @@ export function PostsGrid({ posts, featuredPost }: PostsGridProps) {
</button>
))}
</div>
{/* Siatka Artykułów */}
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
{visiblePosts.map((post) => {
const dateObj = new Date(post.date);
@@ -136,8 +131,6 @@ export function PostsGrid({ posts, featuredPost }: PostsGridProps) {
<p className="text-lg text-text-muted font-medium">Brak artykułów w tej kategorii.</p>
</div>
)}
{/* Paginacja */}
{totalPages > 1 && (
<div className="mt-12 flex flex-wrap justify-center items-center gap-2">
<button
-5
View File
@@ -37,23 +37,18 @@ export const PricingTable = () => {
</tr>
</thead>
<tbody>
{/* Split */}
<tr>
<td colSpan={3} className="bg-gray-50/80 py-3 px-4 font-semibold text-primary text-sm uppercase">
Montaż układów SPLIT
</td>
</tr>
{renderTableRows(splitItems)}
{/* Multisplit */}
<tr>
<td colSpan={3} className="bg-gray-50/80 py-3 px-4 font-semibold text-primary text-sm uppercase">
Montaż układów MULTISPLIT
</td>
</tr>
{renderTableRows(multisplitItems)}
{/* Usługi dodatkowe */}
<tr>
<td colSpan={3} className="bg-gray-50/80 py-3 px-4 font-semibold text-primary text-sm uppercase">
Usługi dodatkowe i serwis
-6
View File
@@ -43,8 +43,6 @@ export function ProcessSteps({
subtitle={subtitle}
align="center"
/>
{/* Process Steps Timeline */}
<div className="relative mt-12">
{/* Desktop connecting line (only if few steps, otherwise wrap) */}
@@ -53,9 +51,7 @@ export function ProcessSteps({
const Icon = iconMap[step.icon || ""] || HelpCircle;
return (
<div key={idx} className="flex flex-col items-center text-center group">
{/* Circle Badge with Icon & Number */}
<div className="relative size-20 rounded-full bg-slate-50 border-2 border-slate-200 flex items-center justify-center text-primary group-hover:border-accent group-hover:bg-accent-light group-hover:text-accent transition-all duration-300 shadow-sm z-10">
{/* Step Number */}
{step.icon && iconMap[step.icon] && (
<span className="absolute -top-1.5 -right-1.5 size-6 rounded-full bg-accent text-white text-xs font-bold flex items-center justify-center font-heading border-2 border-white shadow-sm">
{step.number}
@@ -66,8 +62,6 @@ export function ProcessSteps({
: <span className="text-2xl font-extrabold font-heading text-accent">{step.number}</span>
}
</div>
{/* Title & Description */}
<h3 className="text-lg font-bold text-primary font-heading mt-6 mb-2">
{step.title}
</h3>
-5
View File
@@ -24,7 +24,6 @@ export function ProjectsGrid() {
return (
<section className="py-16 md:py-24 max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
{/* Filtry */}
<div className="flex flex-wrap items-center justify-center gap-3 mb-12">
{categories.map((category) => (
<button
@@ -41,8 +40,6 @@ export function ProjectsGrid() {
</button>
))}
</div>
{/* Siatka */}
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
{filteredProjects.map((project) => (
<div
@@ -55,8 +52,6 @@ export function ProjectsGrid() {
fill
className="object-cover transition-transform duration-700 group-hover:scale-105"
/>
{/* Nakładka gradientowa */}
<div className="absolute inset-0 bg-gradient-to-t from-primary/90 via-primary/40 to-transparent opacity-80 group-hover:opacity-90 transition-opacity duration-300" />
{/* Treść (Zawsze widoczna lokalizacja i kategoria, pojawiający się opis) */}
-3
View File
@@ -30,7 +30,6 @@ export function WhyUs() {
<section className="py-16 md:py-24 bg-slate-50 border-t border-b border-border">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="grid grid-cols-1 lg:grid-cols-12 gap-12 lg:gap-16 items-center">
{/* Left Column: Title, Intro and Statistics */}
<div className="lg:col-span-5 flex flex-col gap-6">
<div>
<span className="text-xs md:text-sm font-semibold uppercase tracking-wider text-accent font-heading">
@@ -54,8 +53,6 @@ export function WhyUs() {
</div>
{/* Right Column: Advantages Grid */}
<div className="lg:col-span-7 grid grid-cols-1 sm:grid-cols-2 gap-6">
{advantages.map((adv, idx) => {
const Icon = adv.icon;
-2
View File
@@ -36,8 +36,6 @@ export function CompareBar() {
</button>
</div>
))}
{/* Puste sloty */}
{Array.from({ length: 3 - items.length }).map((_, i) => (
<div key={i} className="size-11 rounded-lg border-2 border-dashed border-border flex items-center justify-center text-text-muted shrink-0">
<span className="text-lg">+</span>
@@ -81,7 +81,6 @@ export default function MultisplitContactForm({ productName, productSku }: Props
return (
<div className="flex flex-col gap-4">
{/* Produkt info */}
<div className="bg-slate-50 rounded-xl px-4 py-3 text-xs text-text-muted">
Zapytanie dotyczy: <span className="font-bold text-primary">{productName}</span>
</div>
-4
View File
@@ -100,8 +100,6 @@ export function ProductCard({ product }: ProductCardProps) {
Multisplit
</span>
)}
{/* Porównywarka - pojawia się na hover */}
<button
onClick={handleCompare}
disabled={compareDisabled}
@@ -140,8 +138,6 @@ export function ProductCard({ product }: ProductCardProps) {
</span>
)}
</div>
{/* Cena + CTA */}
<div className="mt-auto pt-2 flex items-end justify-between gap-2">
{product.category === 'multisplit' ? (
<>
-4
View File
@@ -311,8 +311,6 @@ export function ProductsGrid({ products, brands }: ProductsGridProps) {
))}
</ul>
</Accordion>
{/* Ilość jednostek wewnętrznych */}
{(category === 'all' || category === 'multisplit') && (
<Accordion title="Ilość jednostek wewn.">
<ul className="flex flex-col gap-2">
@@ -371,8 +369,6 @@ export function ProductsGrid({ products, brands }: ProductsGridProps) {
/>
</div>
</Accordion>
{/* Wielkość pomieszczenia */}
<Accordion title="Wielkość pomieszczenia">
<ul className="flex flex-col gap-2">
{ROOM_BUCKETS.map(b => (
-3
View File
@@ -13,7 +13,6 @@ export function AnalyticsWrapper() {
return (
<>
{/* GA4 */}
<Script
src={`https://www.googletagmanager.com/gtag/js?id=${GA_ID}`}
strategy="afterInteractive"
@@ -28,8 +27,6 @@ export function AnalyticsWrapper() {
});
`}
</Script>
{/* Microsoft Clarity */}
<Script id="clarity-init" strategy="afterInteractive">
{`
(function(c,l,a,r,i,t,y){