From 03d425d4b1ad3360c495b1abc97352c190d69ccc Mon Sep 17 00:00:00 2001
From: MichalC <103170279+wSBMichalee@users.noreply.github.com>
Date: Sat, 4 Jul 2026 19:38:22 +0200
Subject: [PATCH] =?UTF-8?q?feat:=20nowe=20strony=20SEO,=20zdj=C4=99cia=20m?=
=?UTF-8?q?iast,=20loga=20marek,=20dane=20firmy,=20nawigacja,=20cennik?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/kontakt/page.tsx | 4 +-
app/sklep/page.tsx | 2 +-
components/layout/Header.tsx | 26 +++---
components/sections/BrandsGrid.tsx | 18 ++--
components/sections/HeroSection.tsx | 2 +-
components/shop/ProductCard.tsx | 19 ++--
components/shop/ProductPageClient.tsx | 19 ++--
components/shop/ProductsGrid.tsx | 8 +-
content/cities.ts | 26 +++---
content/company.ts | 25 ++----
content/wroclaw-districts.ts | 4 +-
public/brands/CHV.jpeg | Bin 36030 -> 0 bytes
public/brands/CHV.svg | 85 ------------------
public/brands/Fuji.png | Bin 20499 -> 0 bytes
public/brands/Fuji.svg | 87 ------------------
public/brands/LG.png | Bin 29959 -> 0 bytes
public/brands/LG.svg | 35 --------
public/brands/Mitsubishi.png | Bin 33594 -> 0 bytes
public/brands/Mitsubishi.svg | 100 ---------------------
public/brands/aux-brand | Bin 5680 -> 0 bytes
public/brands/aux.webp | Bin 0 -> 7640 bytes
public/brands/chv.webp | Bin 0 -> 5438 bytes
public/brands/daikin.png | Bin 5248 -> 0 bytes
public/brands/daikin.svg | 13 ---
public/brands/daikin.webp | Bin 0 -> 8490 bytes
public/brands/fuji.webp | Bin 0 -> 5522 bytes
public/brands/haier.jpg | Bin 33185 -> 0 bytes
public/brands/haier.svg | 41 ---------
public/brands/haier.webp | Bin 0 -> 18008 bytes
public/brands/lg.webp | Bin 0 -> 12640 bytes
public/brands/mitsubishi.webp | Bin 0 -> 20012 bytes
public/brands/rotenso.png | Bin 87359 -> 0 bytes
public/brands/rotenso.svg | 92 -------------------
public/brands/rotenso.webp | Bin 0 -> 11464 bytes
public/brands/samsung.png | Bin 73566 -> 0 bytes
public/brands/samsung.svg | 92 -------------------
public/brands/samsung.webp | Bin 0 -> 19682 bytes
public/brands/toshiba.jpg | Bin 27739 -> 0 bytes
public/brands/toshiba.svg | 46 ----------
public/brands/toshiba.webp | Bin 0 -> 15162 bytes
public/images/cities/.gitkeep | 1 +
public/images/cities/jelenia_gora.webp | Bin 0 -> 669400 bytes
public/images/cities/klodzko.webp | Bin 0 -> 68008 bytes
public/images/cities/krzyki.webp | Bin 0 -> 64276 bytes
public/images/cities/legnica.webp | Bin 0 -> 338020 bytes
public/images/cities/lubin.webp | Bin 0 -> 133214 bytes
public/images/cities/olawa.webp | Bin 0 -> 207506 bytes
public/images/cities/olesnica.webp | Bin 0 -> 263408 bytes
public/images/cities/opole.webp | Bin 0 -> 334618 bytes
public/images/cities/psie_pole.webp | Bin 0 -> 177556 bytes
public/images/cities/siechnice.webp | Bin 0 -> 115302 bytes
public/images/cities/sroda_slaska.webp | Bin 0 -> 242328 bytes
public/images/cities/strzelin.webp | Bin 0 -> 818248 bytes
public/images/cities/swidnica.webp | Bin 0 -> 147480 bytes
public/images/cities/trzebnica.webp | Bin 0 -> 73680 bytes
public/images/cities/walbrzych.webp | Bin 0 -> 87796 bytes
public/images/hero/.gitkeep | 1 +
public/images/hero/hero-section-image.webp | Bin 0 -> 1475904 bytes
public/images/hero/shop-section-image.webp | Bin 0 -> 1385102 bytes
59 files changed, 71 insertions(+), 675 deletions(-)
delete mode 100644 public/brands/CHV.jpeg
delete mode 100644 public/brands/CHV.svg
delete mode 100644 public/brands/Fuji.png
delete mode 100644 public/brands/Fuji.svg
delete mode 100644 public/brands/LG.png
delete mode 100644 public/brands/LG.svg
delete mode 100644 public/brands/Mitsubishi.png
delete mode 100644 public/brands/Mitsubishi.svg
delete mode 100644 public/brands/aux-brand
create mode 100644 public/brands/aux.webp
create mode 100644 public/brands/chv.webp
delete mode 100644 public/brands/daikin.png
delete mode 100644 public/brands/daikin.svg
create mode 100644 public/brands/daikin.webp
create mode 100644 public/brands/fuji.webp
delete mode 100644 public/brands/haier.jpg
delete mode 100644 public/brands/haier.svg
create mode 100644 public/brands/haier.webp
create mode 100644 public/brands/lg.webp
create mode 100644 public/brands/mitsubishi.webp
delete mode 100644 public/brands/rotenso.png
delete mode 100644 public/brands/rotenso.svg
create mode 100644 public/brands/rotenso.webp
delete mode 100644 public/brands/samsung.png
delete mode 100644 public/brands/samsung.svg
create mode 100644 public/brands/samsung.webp
delete mode 100644 public/brands/toshiba.jpg
delete mode 100644 public/brands/toshiba.svg
create mode 100644 public/brands/toshiba.webp
create mode 100644 public/images/cities/.gitkeep
create mode 100644 public/images/cities/jelenia_gora.webp
create mode 100644 public/images/cities/klodzko.webp
create mode 100644 public/images/cities/krzyki.webp
create mode 100644 public/images/cities/legnica.webp
create mode 100644 public/images/cities/lubin.webp
create mode 100644 public/images/cities/olawa.webp
create mode 100644 public/images/cities/olesnica.webp
create mode 100644 public/images/cities/opole.webp
create mode 100644 public/images/cities/psie_pole.webp
create mode 100644 public/images/cities/siechnice.webp
create mode 100644 public/images/cities/sroda_slaska.webp
create mode 100644 public/images/cities/strzelin.webp
create mode 100644 public/images/cities/swidnica.webp
create mode 100644 public/images/cities/trzebnica.webp
create mode 100644 public/images/cities/walbrzych.webp
create mode 100644 public/images/hero/.gitkeep
create mode 100644 public/images/hero/hero-section-image.webp
create mode 100644 public/images/hero/shop-section-image.webp
diff --git a/app/kontakt/page.tsx b/app/kontakt/page.tsx
index ff79b37..0510b08 100644
--- a/app/kontakt/page.tsx
+++ b/app/kontakt/page.tsx
@@ -1,7 +1,7 @@
import { Metadata } from 'next';
import { HeroSection } from '@/components/sections/HeroSection';
import { ContactSection } from '@/components/sections/ContactSection';
-import { MapEmbed } from '@/components/sections/MapEmbed';
+
export const metadata: Metadata = {
title: 'Kontakt — Klimatyzacja Wrocław | ThermCool',
@@ -27,7 +27,7 @@ export default function KontaktPage() {
-
+
);
}
diff --git a/app/sklep/page.tsx b/app/sklep/page.tsx
index fd8a8fa..68a88ce 100644
--- a/app/sklep/page.tsx
+++ b/app/sklep/page.tsx
@@ -25,7 +25,7 @@ export default function ShopPage() {
ctaLink="/kontakt"
secondaryCtaText=""
secondaryCtaLink=""
- backgroundImage="https://images.unsplash.com/photo-1621905251189-08b45d6a269e?w=1600&q=80"
+ backgroundImage="/images/hero/shop-section-image.webp"
/>
diff --git a/components/layout/Header.tsx b/components/layout/Header.tsx
index e4c9045..6749215 100644
--- a/components/layout/Header.tsx
+++ b/components/layout/Header.tsx
@@ -112,24 +112,24 @@ export function Header() {
{
title: "Dolny Śląsk — centrum",
items: [
- { label: "Klimatyzacja Wrocław", href: "/klimatyzacja/wroclaw", description: "Montaż i serwis we Wrocławiu" },
- { label: "Klimatyzacja Oława", href: "/klimatyzacja/olawa", description: "25 km od Wrocławia" },
- { label: "Klimatyzacja Oleśnica", href: "/klimatyzacja/olesnica", description: "30 km od Wrocławia" },
- { label: "Klimatyzacja Środa Śląska", href: "/klimatyzacja/sroda-slaska", description: "35 km od Wrocławia" },
- { label: "Klimatyzacja Trzebnica", href: "/klimatyzacja/trzebnica", description: "25 km od Wrocławia" },
- { label: "Klimatyzacja Siechnice", href: "/klimatyzacja/siechnice", description: "15 km od Wrocławia" },
+ { label: "Klimatyzacja Wrocław", href: "/klimatyzacja/wroclaw" },
+ { label: "Klimatyzacja Oława", href: "/klimatyzacja/olawa" },
+ { label: "Klimatyzacja Oleśnica", href: "/klimatyzacja/olesnica" },
+ { label: "Klimatyzacja Środa Śląska", href: "/klimatyzacja/sroda-slaska" },
+ { label: "Klimatyzacja Trzebnica", href: "/klimatyzacja/trzebnica" },
+ { label: "Klimatyzacja Siechnice", href: "/klimatyzacja/siechnice" },
],
},
{
title: "Dolny Śląsk — regiony",
items: [
- { label: "Klimatyzacja Legnica", href: "/klimatyzacja/legnica", description: "Legnica i okolice" },
- { label: "Klimatyzacja Wałbrzych", href: "/klimatyzacja/walbrzych", description: "Wałbrzych i Kotlina" },
- { label: "Klimatyzacja Jelenia Góra", href: "/klimatyzacja/jelenia-gora", description: "Karkonosze i okolice" },
- { label: "Klimatyzacja Lubin", href: "/klimatyzacja/lubin", description: "Zagłębie Miedziowe" },
- { label: "Klimatyzacja Głogów", href: "/klimatyzacja/glogow", description: "Głogów i powiat" },
- { label: "Klimatyzacja Świdnica", href: "/klimatyzacja/swidnica", description: "Świdnica i okolice" },
- { label: "Klimatyzacja Opole", href: "/klimatyzacja/opole", description: "100 km od Wrocławia" },
+ { label: "Klimatyzacja Legnica", href: "/klimatyzacja/legnica" },
+ { label: "Klimatyzacja Wałbrzych", href: "/klimatyzacja/walbrzych" },
+ { label: "Klimatyzacja Jelenia Góra", href: "/klimatyzacja/jelenia-gora" },
+ { label: "Klimatyzacja Lubin", href: "/klimatyzacja/lubin" },
+ { label: "Klimatyzacja Głogów", href: "/klimatyzacja/glogow" },
+ { label: "Klimatyzacja Świdnica", href: "/klimatyzacja/swidnica" },
+ { label: "Klimatyzacja Opole", href: "/klimatyzacja/opole" },
],
},
];
diff --git a/components/sections/BrandsGrid.tsx b/components/sections/BrandsGrid.tsx
index ec73342..39bed83 100644
--- a/components/sections/BrandsGrid.tsx
+++ b/components/sections/BrandsGrid.tsx
@@ -2,14 +2,16 @@ import React from 'react';
import Image from 'next/image';
const brands = [
- { name: 'Daikin', logo: '/brands/daikin.svg' }, // Placeholders, we will just show text if image fails or use a generic box
- { name: 'Mitsubishi', logo: '/brands/mitsubishi.svg' },
- { name: 'Gree', logo: '/brands/gree.svg' },
- { name: 'Rotenso', logo: '/brands/rotenso.svg' },
- { name: 'LG', logo: '/brands/lg.svg' },
- { name: 'Samsung', logo: '/brands/samsung.svg' },
- { name: 'Panasonic', logo: '/brands/panasonic.svg' },
- { name: 'Aux', logo: '/brands/aux.svg' },
+ { name: 'Daikin', logo: '/brands/daikin.webp' },
+ { name: 'Mitsubishi Electric', logo: '/brands/mitsubishi.webp' },
+ { name: 'Gree', logo: '/brands/gree.webp' },
+ { name: 'Rotenso', logo: '/brands/rotenso.webp' },
+ { name: 'LG', logo: '/brands/lg.webp' },
+ { name: 'Samsung', logo: '/brands/samsung.webp' },
+ { name: 'Haier', logo: '/brands/haier.webp' },
+ { name: 'CHV', logo: '/brands/chv.webp' },
+ { name: 'Toshiba', logo: '/brands/toshiba.webp' },
+ { name: 'Fuji Electric', logo: '/brands/fuji.webp' },
];
export const BrandsGrid = () => {
diff --git a/components/sections/HeroSection.tsx b/components/sections/HeroSection.tsx
index 11f2089..c5b1d00 100644
--- a/components/sections/HeroSection.tsx
+++ b/components/sections/HeroSection.tsx
@@ -27,7 +27,7 @@ export function HeroSection({
ctaLink = "/kontakt",
secondaryCtaText = "Zobacz ofertę",
secondaryCtaLink = "/sklep",
- backgroundImage = "/hero.jpg",
+ backgroundImage = "/images/hero/hero-section-image.webp",
features
}: HeroSectionProps = {}) {
return (
diff --git a/components/shop/ProductCard.tsx b/components/shop/ProductCard.tsx
index 383c4d4..c2c5fbf 100644
--- a/components/shop/ProductCard.tsx
+++ b/components/shop/ProductCard.tsx
@@ -10,16 +10,15 @@ import { useState } from 'react';
const brandLogos: Record = {
'Gree': '/brands/gree.webp',
- 'Rotenso': '/brands/rotenso.png',
- 'Toshiba': '/brands/toshiba.jpg',
- 'Daikin': '/brands/daikin.png',
- 'CHV': '/brands/chv.jpeg',
- 'Haier': '/brands/haier.jpg',
- 'Aux': '/brands/aux.png',
- 'LG': '/brands/lg.png',
- 'Samsung': '/brands/samsung.png',
- 'Mitsubishi Electric': '/brands/mitsubishi-electric.png',
- 'Fuji Electric': '/brands/fuji-electric.png',
+ 'Rotenso': '/brands/rotenso.webp',
+ 'Toshiba': '/brands/toshiba.webp',
+ 'Daikin': '/brands/daikin.webp',
+ 'CHV': '/brands/chv.webp',
+ 'Haier': '/brands/haier.webp',
+ 'LG': '/brands/lg.webp',
+ 'Samsung': '/brands/samsung.webp',
+ 'Mitsubishi Electric': '/brands/mitsubishi.webp',
+ 'Fuji Electric': '/brands/fuji.webp',
};
interface ProductCardProps {
diff --git a/components/shop/ProductPageClient.tsx b/components/shop/ProductPageClient.tsx
index 12fdcdb..4b2555e 100644
--- a/components/shop/ProductPageClient.tsx
+++ b/components/shop/ProductPageClient.tsx
@@ -14,16 +14,15 @@ import { getProductVariants } from '@/content/product-variants';
const brandLogos: Record = {
'Gree': '/brands/gree.webp',
- 'Rotenso': '/brands/rotenso.png',
- 'Toshiba': '/brands/toshiba.jpg',
- 'Daikin': '/brands/daikin.png',
- 'CHV': '/brands/chv.jpeg',
- 'Haier': '/brands/haier.jpg',
- 'Aux': '/brands/aux.png',
- 'LG': '/brands/lg.png',
- 'Samsung': '/brands/samsung.png',
- 'Mitsubishi Electric': '/brands/mitsubishi-electric.png',
- 'Fuji Electric': '/brands/fuji-electric.png',
+ 'Rotenso': '/brands/rotenso.webp',
+ 'Toshiba': '/brands/toshiba.webp',
+ 'Daikin': '/brands/daikin.webp',
+ 'CHV': '/brands/chv.webp',
+ 'Haier': '/brands/haier.webp',
+ 'LG': '/brands/lg.webp',
+ 'Samsung': '/brands/samsung.webp',
+ 'Mitsubishi Electric': '/brands/mitsubishi.webp',
+ 'Fuji Electric': '/brands/fuji.webp',
};
interface Props {
diff --git a/components/shop/ProductsGrid.tsx b/components/shop/ProductsGrid.tsx
index fe79dcc..0fd7c57 100644
--- a/components/shop/ProductsGrid.tsx
+++ b/components/shop/ProductsGrid.tsx
@@ -81,8 +81,8 @@ export function ProductsGrid({ products, brands }: ProductsGridProps) {
const urlBrand = searchParams.get('brand') || '';
const urlCategory = searchParams.get('category') || 'all';
- const [category, setCategory] = useState<'all' | 'scienne' | 'multisplit' | 'kasetonowe' | 'kanalowe' | 'konsolowe' | 'podlogowe' | 'jednostka-scienna'>(
- urlCategory as 'all' | 'scienne' | 'multisplit' | 'kasetonowe' | 'kanalowe' | 'konsolowe' | 'podlogowe' | 'jednostka-scienna'
+ const [category, setCategory] = useState<'all' | 'scienne' | 'multisplit' | 'kasetonowe' | 'podlogowe' | 'jednostka-scienna'>(
+ urlCategory as 'all' | 'scienne' | 'multisplit' | 'kasetonowe' | 'podlogowe' | 'jednostka-scienna'
);
const [selectedBrands, setSelectedBrands] = useState(urlBrand ? [urlBrand] : []);
const [searchQuery, setSearchQuery] = useState(urlSearch);
@@ -99,7 +99,7 @@ export function ProductsGrid({ products, brands }: ProductsGridProps) {
setSearchQuery(urlSearch);
setSelectedBrands(urlBrand ? [urlBrand] : []);
if (urlCategory !== 'all') {
- setCategory(urlCategory as 'scienne' | 'multisplit' | 'kasetonowe' | 'kanalowe' | 'konsolowe' | 'podlogowe' | 'jednostka-scienna');
+ setCategory(urlCategory as 'scienne' | 'multisplit' | 'kasetonowe' | 'podlogowe' | 'jednostka-scienna');
} else {
setCategory('all');
}
@@ -227,8 +227,6 @@ export function ProductsGrid({ products, brands }: ProductsGridProps) {
{ val: 'scienne', label: 'Ścienne split' },
{ val: 'multisplit', label: 'Multisplit' },
{ val: 'kasetonowe', label: 'Kasetonowe' },
- { val: 'konsolowe', label: 'Konsolowe' },
- { val: 'kanalowe', label: 'Kanałowe' },
].map(opt => (