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 => (