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 />
{/* 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="grid grid-cols-1 lg:grid-cols-2 gap-10 items-center">
<div>
@@ -180,7 +180,7 @@ export default async function MiastoPage({ params }: Props) {
</div>
</div>
</div>
</section>
</section> */}
{/* DLACZEGO MY */}
<WhyUs />
+1 -1
View File
@@ -81,7 +81,7 @@ export default function KlimatyzacjaPage() {
ctaLink="/sklep"
secondaryCtaText="Sprawdź cennik"
secondaryCtaLink="#cennik"
backgroundImage="https://images.unsplash.com/photo-1527689638836-411945a2b57c?w=1600&q=80"
backgroundImage="/images/services/montaz.webp"
features={[
'Bezpłatny audyt',
'Estetyczny montaż',
+2 -2
View File
@@ -22,10 +22,10 @@ const fontHeading = Poppins({
export const metadata: Metadata = {
title: {
default: "ThermCool | Klimatyzacja i Pompy Ciepła Wrocław — Dolny Śląsk",
default: "ThermCool | Klimatyzacja Wrocław — Dolny Śląsk",
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'),
openGraph: {
type: 'website',
+4
View File
@@ -18,7 +18,11 @@ export const metadata: Metadata = {
}
};
import { notFound } from 'next/navigation';
export default function PompyCieplaPage() {
notFound();
const faqPompyJsonLd = {
"@context": "https://schema.org",
"@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="text-xs text-text-muted mt-1">Chłodzenie latem, opcjonalne grzanie zimą</p>
</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'}`}>
<span className="text-3xl mb-2 block">🔥</span>
<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>
</button>
</button> */}
</div>
{deviceType === 'pompa' && !pumpFormSent && (
<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ż
</Link>
</li>
<li>
{/* <li>
<Link href="/pompy-ciepla" className="hover:text-accent transition-colors">
Pompy Ciepła
</Link>
</li>
</li> */}
<li>
<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>
<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>
</Link>
@@ -200,12 +200,12 @@ export function Header() {
sections={acSections}
align="left"
/>
<Link
{/* <Link
href="/pompy-ciepla"
className="text-sm font-medium text-primary hover:text-accent transition-colors"
>
Pompy ciepła
</Link>
</Link> */}
<NavDropdown
label="Miasta"
sections={miastaSections}
+2 -2
View File
@@ -133,7 +133,7 @@ export function MobileMenu({ isOpen, onClose }: MobileMenuProps) {
</details>
{/* 2. Pompy Ciepła */}
<div className="border-b border-border py-3">
{/* <div className="border-b border-border py-3">
<Link
href="/pompy-ciepla"
onClick={onClose}
@@ -141,7 +141,7 @@ export function MobileMenu({ isOpen, onClose }: MobileMenuProps) {
>
Pompy ciepła
</Link>
</div>
</div> */}
{/* Nowa sekcja: Miasta */}
<div className="border-b border-border py-3">
+1 -1
View File
@@ -19,7 +19,7 @@ export function BlogPreview() {
const getCategoryLabel = (cat: string) => {
const labels: Record<string, string> = {
klimatyzacja: "Klimatyzacja",
"pompy-ciepla": "Pompy ciepła",
// "pompy-ciepla": "Pompy ciepła",
porady: "Porady ogólne",
};
return labels[cat] || cat;
+13 -8
View File
@@ -1,5 +1,6 @@
import React from 'react';
import Image from 'next/image';
import Link from 'next/link';
const brands = [
{ name: 'Daikin', logo: '/brands/daikin.webp' },
@@ -16,18 +17,22 @@ const brands = [
export const BrandsGrid = () => {
return (
<section className="py-16 bg-white border-t border-gray-100">
<div className="container mx-auto px-4 md:px-8 max-w-7xl text-center">
<h3 className="text-xl font-semibold text-gray-500 mb-8 uppercase tracking-wider text-sm">
<section className="py-16 bg-white border-t border-border">
<div className="container mx-auto px-4 md:px-8 max-w-5xl text-center">
<h3 className="text-xl font-semibold text-text-muted mb-8 uppercase tracking-wider text-sm">
Autoryzowany partner czołowych producentów
</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) => (
<div key={idx} className="flex justify-center items-center h-16 bg-gray-50 rounded-lg p-3 hover:bg-gray-100 transition-colors">
{/* Fallback to text for placeholder since we don't have images */}
<span className="font-bold text-gray-600 text-lg tracking-tight">{brand.name}</span>
</div>
<Link
key={idx}
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>
))}
</div>
</div>
+1 -1
View File
@@ -18,7 +18,7 @@ export function HeroSection({
eyebrow = "Wrocław i Dolny Śląsk",
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>
</>
),
+1 -1
View File
@@ -19,7 +19,7 @@ export function PillarsSection() {
Chłód i Ogrzewanie
</h3>
<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>
</div>
+2 -2
View File
@@ -16,7 +16,7 @@ const POSTS_PER_PAGE = 6;
const categories = [
{ id: 'wszystkie', label: 'Wszystkie' },
{ id: 'klimatyzacja', label: 'Klimatyzacja' },
{ id: 'pompy-ciepla', label: 'Pompy ciepła' },
// { id: 'pompy-ciepla', label: 'Pompy ciepła' },
{ id: 'porady', label: 'Porady' },
];
@@ -39,7 +39,7 @@ export function PostsGrid({ posts }: PostsGridProps) {
const categoryLabels: Record<string, string> = {
'klimatyzacja': 'Klimatyzacja',
'pompy-ciepla': 'Pompy Ciepła',
// 'pompy-ciepla': 'Pompy Ciepła',
'porady': 'Porady'
};
+2 -2
View File
@@ -81,10 +81,10 @@ export const PricingTable = () => {
</div>
<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
<Download className="w-4 h-4 ml-2 group-hover:-translate-y-1 transition-transform" />
</button>
</a>
</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>
`
},
{
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',
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;
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 getPostsByCategory = (category: string) => posts.filter((p) => p.category === category);
export const getRecentPosts = (limit = 6) => [...posts].sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime()).slice(0, limit);
const activePosts = posts.filter(p => p.category !== 'pompy-ciepla');
export const getPosts = () => activePosts;
export const getPostBySlug = (slug: string) => activePosts.find((p) => p.slug === slug);
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:
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 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