chore: rozwiązanie konfliktów, aktualizacja zależności i usunięcie wpisu na blogu
This commit is contained in:
Binary file not shown.
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 185 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 185 KiB |
@@ -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 />
|
||||||
|
|||||||
@@ -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
@@ -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',
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
</>
|
</>
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|
||||||
|
|||||||
@@ -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'
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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
@@ -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 |
Reference in New Issue
Block a user