chore: rozwiązanie konfliktów, aktualizacja zależności i usunięcie wpisu na blogu

This commit is contained in:
MichalC
2026-07-19 14:01:52 +02:00
parent 2060990ab9
commit d545e7fdcc
19 changed files with 48 additions and 57 deletions
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 185 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 185 KiB

+2 -2
View File
@@ -146,7 +146,7 @@ export default async function MiastoPage({ params }: Props) {
<PricingTable /> <PricingTable />
{/* POMPY CIEPŁA CTA */} {/* POMPY CIEPŁA CTA */}
<section className="py-16 bg-primary"> {/* <section className="py-16 bg-primary">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> <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-10 items-center"> <div className="grid grid-cols-1 lg:grid-cols-2 gap-10 items-center">
<div> <div>
@@ -180,7 +180,7 @@ export default async function MiastoPage({ params }: Props) {
</div> </div>
</div> </div>
</div> </div>
</section> </section> */}
{/* DLACZEGO MY */} {/* DLACZEGO MY */}
<WhyUs /> <WhyUs />
+1 -1
View File
@@ -81,7 +81,7 @@ export default function KlimatyzacjaPage() {
ctaLink="/sklep" ctaLink="/sklep"
secondaryCtaText="Sprawdź cennik" secondaryCtaText="Sprawdź cennik"
secondaryCtaLink="#cennik" secondaryCtaLink="#cennik"
backgroundImage="https://images.unsplash.com/photo-1527689638836-411945a2b57c?w=1600&q=80" backgroundImage="/images/services/montaz.webp"
features={[ features={[
'Bezpłatny audyt', 'Bezpłatny audyt',
'Estetyczny montaż', 'Estetyczny montaż',
+2 -2
View File
@@ -22,10 +22,10 @@ const fontHeading = Poppins({
export const metadata: Metadata = { export const metadata: Metadata = {
title: { title: {
default: "ThermCool | Klimatyzacja i Pompy Ciepła Wrocław — Dolny Śląsk", default: "ThermCool | Klimatyzacja Wrocław — Dolny Śląsk",
template: "%s | ThermCool", template: "%s | ThermCool",
}, },
description: "Profesjonalny montaż i serwis klimatyzacji oraz pomp ciepła na Dolnym Śląsku. Uprawnienia F-Gaz, bezpłatny audyt, estetyczny montaż. Zadzwoń po wycenę!", description: "Profesjonalny montaż i serwis klimatyzacji na Dolnym Śląsku. Uprawnienia F-Gaz, bezpłatny audyt, estetyczny montaż. Zadzwoń po wycenę!",
metadataBase: new URL(process.env.NEXT_PUBLIC_BASE_URL || 'https://thermcool.pl'), metadataBase: new URL(process.env.NEXT_PUBLIC_BASE_URL || 'https://thermcool.pl'),
openGraph: { openGraph: {
type: 'website', type: 'website',
+4
View File
@@ -18,7 +18,11 @@ export const metadata: Metadata = {
} }
}; };
import { notFound } from 'next/navigation';
export default function PompyCieplaPage() { export default function PompyCieplaPage() {
notFound();
const faqPompyJsonLd = { const faqPompyJsonLd = {
"@context": "https://schema.org", "@context": "https://schema.org",
"@type": "FAQPage", "@type": "FAQPage",
+2 -2
View File
@@ -288,12 +288,12 @@ export function KalkulatorClient({ products }: Props) {
<p className="font-bold text-primary">Klimatyzacja</p> <p className="font-bold text-primary">Klimatyzacja</p>
<p className="text-xs text-text-muted mt-1">Chłodzenie latem, opcjonalne grzanie zimą</p> <p className="text-xs text-text-muted mt-1">Chłodzenie latem, opcjonalne grzanie zimą</p>
</button> </button>
<button onClick={() => setDeviceType('pompa')} {/* <button onClick={() => setDeviceType('pompa')}
className={`p-5 rounded-xl border-2 text-left transition-all ${deviceType === 'pompa' ? 'border-accent bg-accent/5' : 'border-border hover:border-accent'}`}> className={`p-5 rounded-xl border-2 text-left transition-all ${deviceType === 'pompa' ? 'border-accent bg-accent/5' : 'border-border hover:border-accent'}`}>
<span className="text-3xl mb-2 block">🔥</span> <span className="text-3xl mb-2 block">🔥</span>
<p className="font-bold text-primary">Pompa ciepła</p> <p className="font-bold text-primary">Pompa ciepła</p>
<p className="text-xs text-text-muted mt-1">Głównie ogrzewanie domu z niskim kosztem eksploatacji</p> <p className="text-xs text-text-muted mt-1">Głównie ogrzewanie domu z niskim kosztem eksploatacji</p>
</button> </button> */}
</div> </div>
{deviceType === 'pompa' && !pumpFormSent && ( {deviceType === 'pompa' && !pumpFormSent && (
<div className="mt-4 p-5 bg-white border border-border rounded-2xl flex flex-col gap-4"> <div className="mt-4 p-5 bg-white border border-border rounded-2xl flex flex-col gap-4">
+2 -2
View File
@@ -65,11 +65,11 @@ export function Footer() {
Klimatyzacja i Montaż Klimatyzacja i Montaż
</Link> </Link>
</li> </li>
<li> {/* <li>
<Link href="/pompy-ciepla" className="hover:text-accent transition-colors"> <Link href="/pompy-ciepla" className="hover:text-accent transition-colors">
Pompy Ciepła Pompy Ciepła
</Link> </Link>
</li> </li> */}
<li> <li>
<Link href="/sklep" className="hover:text-accent transition-colors"> <Link href="/sklep" className="hover:text-accent transition-colors">
+3 -3
View File
@@ -146,7 +146,7 @@ export function Header() {
<span className="text-accent">.</span> <span className="text-accent">.</span>
</span> </span>
<span className="text-xs text-muted-foreground font-medium border-l border-border pl-3"> <span className="text-xs text-muted-foreground font-medium border-l border-border pl-3">
Klimatyzacja i pompy ciepła Klimatyzacja na Dolnym Śląsku
</span> </span>
</Link> </Link>
@@ -200,12 +200,12 @@ export function Header() {
sections={acSections} sections={acSections}
align="left" align="left"
/> />
<Link {/* <Link
href="/pompy-ciepla" href="/pompy-ciepla"
className="text-sm font-medium text-primary hover:text-accent transition-colors" className="text-sm font-medium text-primary hover:text-accent transition-colors"
> >
Pompy ciepła Pompy ciepła
</Link> </Link> */}
<NavDropdown <NavDropdown
label="Miasta" label="Miasta"
sections={miastaSections} sections={miastaSections}
+2 -2
View File
@@ -133,7 +133,7 @@ export function MobileMenu({ isOpen, onClose }: MobileMenuProps) {
</details> </details>
{/* 2. Pompy Ciepła */} {/* 2. Pompy Ciepła */}
<div className="border-b border-border py-3"> {/* <div className="border-b border-border py-3">
<Link <Link
href="/pompy-ciepla" href="/pompy-ciepla"
onClick={onClose} onClick={onClose}
@@ -141,7 +141,7 @@ export function MobileMenu({ isOpen, onClose }: MobileMenuProps) {
> >
Pompy ciepła Pompy ciepła
</Link> </Link>
</div> </div> */}
{/* Nowa sekcja: Miasta */} {/* Nowa sekcja: Miasta */}
<div className="border-b border-border py-3"> <div className="border-b border-border py-3">
+1 -1
View File
@@ -19,7 +19,7 @@ export function BlogPreview() {
const getCategoryLabel = (cat: string) => { const getCategoryLabel = (cat: string) => {
const labels: Record<string, string> = { const labels: Record<string, string> = {
klimatyzacja: "Klimatyzacja", klimatyzacja: "Klimatyzacja",
"pompy-ciepla": "Pompy ciepła", // "pompy-ciepla": "Pompy ciepła",
porady: "Porady ogólne", porady: "Porady ogólne",
}; };
return labels[cat] || cat; return labels[cat] || cat;
+13 -8
View File
@@ -1,5 +1,6 @@
import React from 'react'; import React from 'react';
import Image from 'next/image'; import Image from 'next/image';
import Link from 'next/link';
const brands = [ const brands = [
{ name: 'Daikin', logo: '/brands/daikin.webp' }, { name: 'Daikin', logo: '/brands/daikin.webp' },
@@ -16,18 +17,22 @@ const brands = [
export const BrandsGrid = () => { export const BrandsGrid = () => {
return ( return (
<section className="py-16 bg-white border-t border-gray-100"> <section className="py-16 bg-white border-t border-border">
<div className="container mx-auto px-4 md:px-8 max-w-7xl text-center"> <div className="container mx-auto px-4 md:px-8 max-w-5xl text-center">
<h3 className="text-xl font-semibold text-gray-500 mb-8 uppercase tracking-wider text-sm"> <h3 className="text-xl font-semibold text-text-muted mb-8 uppercase tracking-wider text-sm">
Autoryzowany partner czołowych producentów Autoryzowany partner czołowych producentów
</h3> </h3>
<div className="grid grid-cols-2 md:grid-cols-4 lg:grid-cols-8 gap-6 items-center opacity-60 grayscale hover:grayscale-0 transition-all duration-500"> <div className="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-5 gap-4 lg:gap-6 items-center">
{brands.map((brand, idx) => ( {brands.map((brand, idx) => (
<div key={idx} className="flex justify-center items-center h-16 bg-gray-50 rounded-lg p-3 hover:bg-gray-100 transition-colors"> <Link
{/* Fallback to text for placeholder since we don't have images */} key={idx}
<span className="font-bold text-gray-600 text-lg tracking-tight">{brand.name}</span> href={`/sklep?brand=${encodeURIComponent(brand.name)}`}
</div> 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>
))} ))}
</div> </div>
</div> </div>
+1 -1
View File
@@ -18,7 +18,7 @@ export function HeroSection({
eyebrow = "Wrocław i Dolny Śląsk", eyebrow = "Wrocław i Dolny Śląsk",
title = ( title = (
<> <>
<span className="text-white">Klimatyzacja i pompy ciepła</span><br /> <span className="text-white">Klimatyzacja</span><br />
<span className="text-accent">na Dolnym Śląsku</span> <span className="text-accent">na Dolnym Śląsku</span>
</> </>
), ),
+1 -1
View File
@@ -19,7 +19,7 @@ export function PillarsSection() {
Chłód i Ogrzewanie Chłód i Ogrzewanie
</h3> </h3>
<p className="text-text-muted text-base leading-relaxed mb-8 max-w-md"> <p className="text-text-muted text-base leading-relaxed mb-8 max-w-md">
Klimatyzacja i pompy ciepła dla Twojego domu lub biura. Oferujemy profesjonalny audyt, dobór optymalnej mocy, autoryzowany montaż i stałą opiekę serwisową. Klimatyzacja dla Twojego domu lub biura. Oferujemy profesjonalny audyt, dobór optymalnej mocy, autoryzowany montaż i stałą opiekę serwisową.
</p> </p>
</div> </div>
+2 -2
View File
@@ -16,7 +16,7 @@ const POSTS_PER_PAGE = 6;
const categories = [ const categories = [
{ id: 'wszystkie', label: 'Wszystkie' }, { id: 'wszystkie', label: 'Wszystkie' },
{ id: 'klimatyzacja', label: 'Klimatyzacja' }, { id: 'klimatyzacja', label: 'Klimatyzacja' },
{ id: 'pompy-ciepla', label: 'Pompy ciepła' }, // { id: 'pompy-ciepla', label: 'Pompy ciepła' },
{ id: 'porady', label: 'Porady' }, { id: 'porady', label: 'Porady' },
]; ];
@@ -39,7 +39,7 @@ export function PostsGrid({ posts }: PostsGridProps) {
const categoryLabels: Record<string, string> = { const categoryLabels: Record<string, string> = {
'klimatyzacja': 'Klimatyzacja', 'klimatyzacja': 'Klimatyzacja',
'pompy-ciepla': 'Pompy Ciepła', // 'pompy-ciepla': 'Pompy Ciepła',
'porady': 'Porady' 'porady': 'Porady'
}; };
+2 -2
View File
@@ -81,10 +81,10 @@ export const PricingTable = () => {
</div> </div>
<div className="md:w-64 shrink-0 flex flex-col gap-4"> <div className="md:w-64 shrink-0 flex flex-col gap-4">
<button className="btn btn-outline btn-primary bg-white w-full justify-between group"> <a href="/pdf/cennik-thermcool-2026.pdf" target="_blank" rel="noopener noreferrer" className="btn btn-outline btn-primary bg-white w-full justify-between group flex items-center px-4 py-2 border rounded-lg hover:bg-gray-50 text-sm font-semibold text-primary">
Pobierz cennik PDF Pobierz cennik PDF
<Download className="w-4 h-4 ml-2 group-hover:-translate-y-1 transition-transform" /> <Download className="w-4 h-4 ml-2 group-hover:-translate-y-1 transition-transform" />
</button> </a>
</div> </div>
</div> </div>
</div> </div>
+10 -28
View File
@@ -401,27 +401,7 @@ export const posts: Post[] = [
<p>Nasza wycena zawsze jest darmowa i ostateczna. Po audycie w Wałbrzychu lub Świdnicy otrzymujesz gwarancję ceny — nie zaskoczymy Cię dodatkowymi kosztami ukrytymi na fakturze końcowej. Sprawdź nas!</p> <p>Nasza wycena zawsze jest darmowa i ostateczna. Po audycie w Wałbrzychu lub Świdnicy otrzymujesz gwarancję ceny — nie zaskoczymy Cię dodatkowymi kosztami ukrytymi na fakturze końcowej. Sprawdź nas!</p>
` `
}, },
{
slug: 'klimatyzacja-jelenia-gora-pensjonat',
title: 'Klimatyzacja dla pensjonatów i hoteli w Jeleniej Górze i Karkonoszach',
category: 'klimatyzacja',
excerpt: 'Dobre opinie na Booking zależą od komfortu w upały. Specyfika montażu klimatyzacji dla branży HoReCa w Karkonoszach i Jeleniej Górze.',
date: '2026-05-12T10:00:00Z',
author: 'Tomasz Kowalski',
image: '',
content: `
<h2>Inwestycja w oceny na Booking.com</h2>
<p>Hotele i pensjonaty w Jeleniej Górze, Karpaczu czy Szklarskiej Porębie żyją z turystyki przez cały rok. O ile zimą kluczowe jest ogrzewanie, o tyle letnie upały w dusznych, poddaszowych pokojach prowadzą do lawiny słabych ocen od gości. Klimatyzacja to dziś konieczność.</p>
<h3>Systemy Multi Split dla obiektów turystycznych</h3>
<p>W hotelarstwie najlepiej sprawdzają się rozbudowane instalacje multisplit lub systemy VRF/VRV.</p>
<ul>
<li><strong>Estetyka elewacji:</strong> Kilkanaście pokoi obsługiwanych przez 1-2 agregaty schowane na płaskim dachu lub za budynkiem.</li>
<li><strong>Centralne sterowanie:</strong> Recepcja może zablokować widełki temperatur (np. min. 22°C), odciąć chłodzenie w pustych pokojach lub wyłączyć je po otwarciu okna (kontaktrony).</li>
<li><strong>Cisza absolutna:</strong> W pokojach hotelowych wymogiem jest tryb super silent poniżej 20 dB, aby nie zakłócać snu.</li>
</ul>
<p>Przygotowujemy zaawansowane projekty dla branży HoReCa w Karkonoszach z bezinwazyjnym montażem (ukrycie instalacji na strychach). Skontaktuj się z działem B2B ThermCool.</p>
`
},
{ {
slug: 'pompa-ciepla-stary-dom', slug: 'pompa-ciepla-stary-dom',
title: 'Pompa ciepła w starym domu — czy to możliwe bez termomodernizacji?', title: 'Pompa ciepła w starym domu — czy to możliwe bez termomodernizacji?',
@@ -1781,15 +1761,17 @@ export const posts: Post[] = [
} }
]; ];
export const getPosts = () => posts; const activePosts = posts.filter(p => p.category !== 'pompy-ciepla');
export const getPostBySlug = (slug: string) => posts.find((p) => p.slug === slug);
export const getFeaturedPosts = (limit = 3) => posts.filter((p) => p.featured).slice(0, limit); export const getPosts = () => activePosts;
export const getPostsByCategory = (category: string) => posts.filter((p) => p.category === category); export const getPostBySlug = (slug: string) => activePosts.find((p) => p.slug === slug);
export const getRecentPosts = (limit = 6) => [...posts].sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime()).slice(0, limit); export const getFeaturedPosts = (limit = 3) => activePosts.filter((p) => p.featured).slice(0, limit);
export const getPostsByCategory = (category: string) => activePosts.filter((p) => p.category === category);
export const getRecentPosts = (limit = 6) => [...activePosts].sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime()).slice(0, limit);
// Dodane z powrotem funkcje wywoływane w komponentach, które nie zostały uwzględnione w prompcie: // Dodane z powrotem funkcje wywoływane w komponentach, które nie zostały uwzględnione w prompcie:
export const getFeaturedPost = () => posts.find((p) => p.featured) || posts[0]; export const getFeaturedPost = () => activePosts.find((p) => p.featured) || activePosts[0];
export const getLatestPosts = (limit = 3) => getRecentPosts(limit); export const getLatestPosts = (limit = 3) => getRecentPosts(limit);
export const getRelatedPosts = (slug: string, category: string, limit = 2) => { export const getRelatedPosts = (slug: string, category: string, limit = 2) => {
return posts.filter(p => p.slug !== slug && p.category === category).slice(0, limit); return activePosts.filter(p => p.slug !== slug && p.category === category).slice(0, limit);
}; };
Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB