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">