diff --git a/AGENTS.md b/AGENTS.md index 8bd0e39..41e1aa8 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,5 +1,109 @@ - -# This is NOT the Next.js you know +# AGENTS.md — Reguły projektu -This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` before writing any code. Heed deprecation notices. - +> Ten plik definiuje stałe zasady dla każdego agenta pracującego nad projektem. +> Czytaj go na początku każdej sesji i stosuj się do niego bez wyjątku. +> Szczegółowe specyfikacje znajdują się w `docs/specs/` i `docs/pages/`. + +--- + +## 1. Czym jest ten projekt + +Strona firmy z branży HVAC i usług domowych. Firma oferuje: +- **Klimatyzacja** — montaż, serwis, sprzedaż (sklep z koszykiem). +- **Pompy ciepła** — dobór, montaż, dofinansowania. +- **Usługi domowe** — remonty i wykończenia, hydraulika, serwis lodówek/AGD, drobne naprawy. + +Dwa cele biznesowe: (1) generowanie leadów (kontakt/wycena), (2) sprzedaż klimatyzatorów online. +Język interfejsu: **polski**. Grupa docelowa: klienci indywidualni i małe firmy. + +--- + +## 2. Rola agenta + +Działaj jak **Senior Next.js Developer** z dbałością o jakość produkcyjną. +- Przed kodowaniem zadania złożonego — przygotuj plan i listę zadań (tryb Planning). +- Po implementacji UI — uruchom dev server i zweryfikuj w przeglądarce (desktop + mobile). +- Na końcu każdego etapu — krótkie podsumowanie + zrzut ekranu, zanim przejdziesz dalej. +- Nie mieszaj refaktoru z nowymi funkcjami w jednym zadaniu. + +--- + +## 3. Stack technologiczny (obowiązkowy) + +- **Next.js** (najnowsza stabilna) — App Router + Server Components. +- **TypeScript** — tryb strict, bez `any` bez uzasadnienia. +- **Tailwind CSS** — stylowanie, tokeny w configu (patrz `docs/specs/02-design-system.md`). +- **shadcn/ui** — biblioteka komponentów bazowych. +- **lucide-react** — ikony. +- **React Hook Form + Zod** — formularze i walidacja. +- **Zustand** — stan koszyka (lekki, bez Reduxa). +- **next/image**, **next/font** — obrazy i fonty. +- Brak zewnętrznego backendu na tym etapie. Dane = pliki w `content/`. Formularze = Server Actions + (przygotuj miejsce na integrację e-mail, na razie bez realnej wysyłki). + +--- + +## 4. Twarde zasady jakości (nie do pominięcia) + +1. **Architektura** — trzymaj się struktury z `docs/specs/01-architecture.md`. Żadnych plików „na skróty". +2. **Komponenty** — reużywalne, typowane, jedna odpowiedzialność. Header/Footer/sekcje współdzielone, + nigdy kopiowane między stronami. +3. **Server vs Client** — domyślnie Server Components. `"use client"` tylko tam, gdzie potrzebna + interaktywność (formularze, koszyk, dropdowny, slidery). +4. **Responsywność** — mobile-first. Każda strona działa od 360px do 1920px. +5. **Dostępność** — semantyczny HTML, ARIA gdzie trzeba, widoczny focus, kontrast min. WCAG AA. +6. **SEO** — patrz `docs/specs/03-seo.md`. Metadata per strona, jeden H1, JSON-LD gdzie wskazano. +7. **Wydajność** — obrazy zoptymalizowane, lazy loading, minimum JS po stronie klienta. +8. **Build** — `npm run build` musi przechodzić bez błędów i ostrzeżeń TypeScript. + +--- + +## 5. Konwencje kodu + +- Nazwy plików komponentów: PascalCase (`HeroSection.tsx`). Pozostałe: kebab-case. +- Jeden komponent = jeden plik. Eksport nazwany dla komponentów współdzielonych. +- Importy absolutne przez alias `@/` (skonfiguruj w tsconfig). +- Teksty UI po polsku, trzymane blisko komponentu lub w `content/` (nie hardcode w wielu miejscach). +- Komentarze tylko tam, gdzie wyjaśniają „dlaczego", nie „co". +- Każda sekcja strony = osobny komponent w `components/sections/`. + +--- + +## 6. System projektowy (skrót — pełnia w docs/specs/02) + +- Kolory: granat `#0F2A47` (primary), cyjan `#2BA8E0` (akcent), pomarańcz `#F39320` (CTA), + biały + jasnoszary `#F5F7FA` (tła), ciemnoszary tekst. +- Font: Inter lub Poppins (next/font). Duże, wyraźne nagłówki. +- Karty: `rounded-xl`, subtelny cień. Przyciski CTA: pomarańcz z wyraźnym hover. +- Estetyka: czysta, profesjonalna, dużo wolnej przestrzeni. NIE zatłaczaj sekcji. +- Spójność: identyczny header, footer i styl na wszystkich stronach. + +--- + +## 7. Kolejność realizacji (etapy) + +Realizuj projekt etapami. Nie przeskakuj — każdy etap bazuje na poprzednim. + +| Etap | Zakres | Dokumentacja | +|------|--------|--------------| +| 1 | Setup: Next.js+TS+Tailwind+shadcn/ui+fonty+tokeny | `docs/specs/01`, `02` | +| 2 | Layout wspólny: header (dropdowny, mobile menu), footer, pasek zaufania | `docs/specs/04-layouts.md` | +| 3 | Strona główna (wszystkie sekcje jako komponenty) | `docs/pages/01-home.md` | +| 4 | Strony usługowe: klimatyzacja, pompy ciepła, usługi domowe + 3 podstrony | `docs/pages/02–07` | +| 5 | Realizacje, blog (+ [slug]), o nas, kontakt (formularz) | `docs/pages/08–11` | +| 6 | E-commerce: sklep, produkt, koszyk, raty | `docs/pages/12–15` | +| 7 | Strony formalne + finalne SEO/JSON-LD | `docs/pages/16`, `docs/specs/03` | +| 8 | Build produkcyjny, naprawa błędów, weryfikacja w przeglądarce | — | + +--- + +## 8. Jak czytać dokumentację + +- `docs/specs/01-architecture.md` — struktura katalogów, routing, wzorce. +- `docs/specs/02-design-system.md` — pełne tokeny, typografia, komponenty UI. +- `docs/specs/03-seo.md` — metadata, JSON-LD, sitemap. +- `docs/specs/04-layouts.md` — header, footer, nawigacja, wspólne elementy. +- `docs/specs/05-data-model.md` — modele danych i mock content. +- `docs/pages/NN-*.md` — szczegółowy brief każdej strony (sekcje, komponenty, treść). + +Gdy budujesz daną stronę — najpierw przeczytaj jej plik w `docs/pages/`, potem odpowiednie specs. diff --git a/README.md b/README.md index e215bc4..83c4441 100644 --- a/README.md +++ b/README.md @@ -1,36 +1,50 @@ -This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). +# Paczka promptów — strona HVAC w Next.js (dla Google Antigravity) -## Getting Started +Kompletna dokumentacja projektowa rozbita na warstwy. Antigravity czyta `AGENTS.md` +automatycznie i traktuje go jako stałe reguły; reszta to szczegółowe specyfikacje, do których +agent sięga podczas pracy nad konkretnym etapem/stroną. -First, run the development server: +## Jak użyć -```bash -npm run dev -# or -yarn dev -# or -pnpm dev -# or -bun dev +1. Utwórz folder nowego projektu i skopiuj do niego całą tę zawartość + (`AGENTS.md` w katalogu głównym, folder `docs/` obok). +2. Otwórz folder w Antigravity. +3. Agent Manager → New Task → tryb **Planning** (projekt jest wielo-plikowy). +4. Pierwszy prompt: + > Przeczytaj `AGENTS.md` i całą dokumentację w `docs/`. Przygotuj plan implementacji + > i listę zadań zgodnie z etapami z sekcji 7 AGENTS.md. Zacznij od Etapu 1 (setup). + > Po każdym etapie pokaż podsumowanie i zrzut ekranu, zanim przejdziesz dalej. +5. Przejrzyj wygenerowany plan/Task List PRZED akceptacją. Potem prowadź etap po etapie. + +## Struktura paczki + +``` +AGENTS.md # reguły projektu (czytane automatycznie) +docs/ +├── specs/ +│ ├── 01-architecture.md # struktura katalogów, routing, wzorce +│ ├── 02-design-system.md # kolory, typografia, komponenty UI +│ ├── 03-seo.md # metadata, JSON-LD, sitemap +│ ├── 04-layouts.md # header, footer, nawigacja, CTA +│ └── 05-data-model.md # typy i mock content +└── pages/ + ├── 01-home.md + ├── 02-klimatyzacja.md + ├── 03-pompy-ciepla.md + ├── 04-uslugi-domowe.md + ├── 05-07-podstrony-uslug.md # remonty, hydraulika, serwis AGD + ├── 08-11-realizacje-blog-onas-kontakt.md + ├── 12-15-ecommerce.md # sklep, produkt, koszyk, raty + └── 16-strony-formalne.md ``` -Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. +## Kolejność pracy +Trzymaj się etapów z `AGENTS.md` (sekcja 7). Nie buduj wszystkiego naraz — +każdy etap bazuje na poprzednim, a weryfikacja w przeglądarce po etapie łapie błędy wcześnie. -You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. - -This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. - -## Learn More - -To learn more about Next.js, take a look at the following resources: - -- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. -- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. - -You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! - -## Deploy on Vercel - -The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. - -Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. +## Co uzupełnić po wygenerowaniu (właściciel) +- Dane firmy (adres, NIP, telefon, godziny) — `content/company.ts`. +- Zdjęcia (hero, realizacje, produkty) — w miejscach oznaczonych `TODO`. +- Treści prawne — strony formalne. +- Realne ceny i produkty — `content/products.ts`, `content/pricing.ts`. +- Integracja wysyłki formularza (np. Resend) i ewentualny realny checkout. diff --git a/app/(formalne)/dostawa/page.tsx b/app/(formalne)/dostawa/page.tsx new file mode 100644 index 0000000..d56b24d --- /dev/null +++ b/app/(formalne)/dostawa/page.tsx @@ -0,0 +1,67 @@ +import { Metadata } from 'next'; + +export const metadata: Metadata = { + title: 'Dostawa i Płatności | AirProject', + description: 'Koszty, formy i szacowane czasy dostawy urządzeń w sklepie AirProject.', + alternates: { + canonical: '/dostawa', + } +}; + +export default function DostawaPage() { + return ( + <> +

Dostawa i Płatności

+ +

+ Sprawdź dostępne metody wysyłki urządzeń oraz formy płatności akceptowane w naszym sklepie. +

+ + {/* TODO: treść prawna do uzupełnienia przez właściciela */} + +

1. Metody i koszty dostawy

+

Dla wygody naszych klientów przygotowaliśmy kilka opcji odbioru towaru:

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Opcja dostawyCzas realizacjiKoszt brutto
Kurier Paletowy (Klimatyzatory)2-3 dni robocze0 zł (Darmowa)
Kurier Standard (Mniejsze elementy)1-2 dni robocze19 zł
Dostawa przez naszych InstalatorówW dniu montażu0 zł
+
+ +

2. Dostawa podczas montażu

+

+ Jeśli wybierzesz wariant zakupu "Z montażem", urządzenie nie jest wysyłane z wyprzedzeniem za pośrednictwem zewnętrznej firmy kurierskiej. Sprzęt w dniu umówionej instalacji przywozi nasza własna ekipa monterska, dzięki czemu minimalizujemy ryzyko uszkodzenia urządzenia w transporcie i zdejmujemy z Ciebie obowiązek składowania gabarytowych kartonów. +

+ +

3. Metody płatności

+ + + ); +} diff --git a/app/(formalne)/gwarancja/page.tsx b/app/(formalne)/gwarancja/page.tsx new file mode 100644 index 0000000..4810fa4 --- /dev/null +++ b/app/(formalne)/gwarancja/page.tsx @@ -0,0 +1,60 @@ +import { Metadata } from 'next'; +import Link from 'next/link'; +import { ShieldCheck } from 'lucide-react'; + +export const metadata: Metadata = { + title: 'Gwarancja na Klimatyzatory i Montaż | AirProject', + description: 'Szczegółowe informacje dotyczące warunków gwarancji na instalowane urządzenia oraz usługi montażowe.', + alternates: { + canonical: '/gwarancja', + } +}; + +export default function GwarancjaPage() { + return ( + <> +
+ +

Gwarancja i Serwis

+
+ +

+ Jesteśmy autoryzowanym partnerem wszystkich sprzedawanych przez nas urządzeń, co oznacza pełne bezpieczeństwo Twojej inwestycji i bezproblemową realizację świadczeń gwarancyjnych. +

+ + {/* TODO: treść prawna do uzupełnienia przez właściciela */} + +

1. Gwarancja na urządzenia

+

Czas trwania gwarancji zależy od wybranego producenta:

+ + +
+ Ważne: Warunkiem zachowania gwarancji jest wykonywanie regularnych (płatnych) przeglądów technicznych zgodnie z zaleceniami producenta – zazwyczaj dwa razy do roku. +
+ +

2. Gwarancja na usługę montażu

+

+ Bierzemy pełną odpowiedzialność za wykonaną przez nas pracę. Udzielamy 5-letniej rękojmi na poprawność działania całej instalacji chłodniczej i odpływu skroplin. Jeśli jakikolwiek problem wynika z błędu montażowego, naprawimy go na własny koszt. +

+ +

3. Autoryzowany Serwis

+

+ Posiadamy pełne zaplecze techniczne, własnych wykwalifikowanych serwisantów i uprawnienia UDT oraz certyfikaty F-GAZ. Co to oznacza dla Ciebie? + W przypadku awarii, nie odsyłamy Cię do producenta. Przyjeżdżamy na miejsce diagnozując usterkę, a w razie konieczności zamawiamy części i realizujemy naprawę, oszczędzając Twój czas i nerwy. +

+ +

4. Zleć nam przegląd gwarancyjny

+

+ Oferujemy atrakcyjne pakiety stałej opieki serwisowej. Przy stałej współpracy koszty serwisu są niższe, a my sami pilnujemy za Ciebie terminów obowiązkowych przeglądów narzucanych przez producentów sprzętu. +

+ Skontaktuj się z nami, aby zarezerwować termin wizyty serwisowej. +

+ + ); +} diff --git a/app/(formalne)/layout.tsx b/app/(formalne)/layout.tsx new file mode 100644 index 0000000..d8818cb --- /dev/null +++ b/app/(formalne)/layout.tsx @@ -0,0 +1,17 @@ +import React from 'react'; + +export default function FormalneLayout({ + children, +}: { + children: React.ReactNode; +}) { + return ( +
+
+
+ {children} +
+
+
+ ); +} diff --git a/app/(formalne)/polityka-prywatnosci/page.tsx b/app/(formalne)/polityka-prywatnosci/page.tsx new file mode 100644 index 0000000..a0c4328 --- /dev/null +++ b/app/(formalne)/polityka-prywatnosci/page.tsx @@ -0,0 +1,56 @@ +import { Metadata } from 'next'; + +export const metadata: Metadata = { + title: 'Polityka Prywatności i Cookies | AirProject', + description: 'Zasady przetwarzania danych osobowych oraz wykorzystania plików cookies w serwisie AirProject.', + alternates: { + canonical: '/polityka-prywatnosci', + } +}; + +export default function PolitykaPrywatnosciPage() { + return ( + <> +

Polityka Prywatności i Cookies

+ +

+ Twoja prywatność jest dla nas ważna. W tym dokumencie opisujemy, jakie dane zbieramy, w jakim celu je wykorzystujemy oraz jakie masz w związku z tym prawa. +

+ + {/* TODO: treść prawna do uzupełnienia przez właściciela i weryfikacji z inspektorem ochrony danych / radcą prawnym */} + +

1. Administrator danych

+

+ Administratorem Twoich danych osobowych jest: + [TUTAJ WPISZ DANE FIRMY: Nazwa, Adres, NIP, e-mail kontaktowy]. +

+ +

2. Zakres i cele przetwarzania

+

Przetwarzamy dane osobowe podane przez Ciebie w formularzu kontaktowym oraz w procesie składania zamówienia w celu:

+ + +

3. Twoje prawa

+

Zgodnie z przepisami RODO masz prawo do:

+ + +

4. Pliki Cookies

+

+ Nasza strona wykorzystuje pliki cookies (ciasteczka) w celu zapewnienia prawidłowego działania serwisu (np. zapamiętania zawartości koszyka) oraz w celach analitycznych. Możesz zarządzać ustawieniami cookies z poziomu przeglądarki internetowej. +

+ +

+ Ostatnia aktualizacja dokumentu: 1 stycznia 2026 r. +

+ + ); +} diff --git a/app/(formalne)/regulamin/page.tsx b/app/(formalne)/regulamin/page.tsx new file mode 100644 index 0000000..9ccfce4 --- /dev/null +++ b/app/(formalne)/regulamin/page.tsx @@ -0,0 +1,66 @@ +import { Metadata } from 'next'; + +export const metadata: Metadata = { + title: 'Regulamin Sklepu i Usług | AirProject', + description: 'Regulamin świadczenia usług, zasady korzystania ze sklepu, prawa i obowiązki klienta.', + alternates: { + canonical: '/regulamin', + } +}; + +export default function RegulaminPage() { + return ( + <> +

Regulamin Serwisu i Sklepu Internetowego

+ +

+ Niniejszy dokument określa zasady korzystania z serwisu AirProject oraz dokonywania w nim zakupów urządzeń i usług montażu. +

+ + {/* TODO: treść prawna do uzupełnienia przez właściciela i weryfikacji przez radcę prawnego */} + +

§ 1. Postanowienia ogólne

+

+ 1. Sklep internetowy działający pod adresem internetowym airproject.pl prowadzony jest przez: + [TUTAJ WPISZ DANE FIRMY: Nazwa, Adres, NIP, REGON]. +

+

+ 2. Niniejszy Regulamin określa zasady zawierania umów sprzedaży i świadczenia usług za pośrednictwem serwisu. +

+ +

§ 2. Definicje

+ + +

§ 3. Zasady składania i realizacji zamówień

+

+ 1. Informacje zawarte na Stronie Internetowej Sklepu nie stanowią oferty w rozumieniu Kodeksu Cywilnego, a jedynie zaproszenie do zawarcia umowy. +
+ 2. Klient może składać zamówienia 24 godziny na dobę przez 7 dni w tygodniu. +
+ 3. Realizacja usług montażowych odbywa się po uprzednim kontakcie i ustaleniu terminu. +

+ +

§ 4. Płatności i ceny

+

+ 1. Wszystkie ceny na stronie są cenami brutto (zawierają podatek VAT). +
+ 2. Podatek VAT na urządzenia sprzedawane z usługą montażu dla osób fizycznych w budynkach mieszkalnych o powierzchni do 300 m² rozliczany jest zgodnie z odpowiednimi przepisami podatkowymi (np. stawką 8%). +

+ +

§ 5. Odstąpienie od umowy

+

+ 1. Konsument ma prawo odstąpić od umowy zawartej na odległość bez podania przyczyny w terminie 14 dni od dnia dostarczenia towaru. +
+ 2. Prawo odstąpienia nie przysługuje w odniesieniu do usług, które zostały w pełni wykonane za wyraźną zgodą Konsumenta. +

+ +

+ Ostatnia aktualizacja regulaminu: 1 stycznia 2026 r. +

+ + ); +} diff --git a/app/(formalne)/reklamacje/page.tsx b/app/(formalne)/reklamacje/page.tsx new file mode 100644 index 0000000..26a99cf --- /dev/null +++ b/app/(formalne)/reklamacje/page.tsx @@ -0,0 +1,63 @@ +import { Metadata } from 'next'; +import Link from 'next/link'; + +export const metadata: Metadata = { + title: 'Reklamacje i Zwroty | AirProject', + description: 'Zasady i procedury składania reklamacji oraz zwrotów produktów i usług w sklepie AirProject.', + alternates: { + canonical: '/reklamacje', + } +}; + +export default function ReklamacjePage() { + return ( + <> +

Reklamacje i Zwroty

+ +

+ Dokładamy wszelkich starań, aby nasze produkty i usługi były najwyższej jakości. Jeśli jednak cokolwiek nie spełnia Twoich oczekiwań, masz pełne prawo złożyć reklamację lub dokonać zwrotu. +

+ + {/* TODO: treść prawna do uzupełnienia przez właściciela */} + +

1. Zwroty (Odstąpienie od umowy)

+

+ Zgodnie z polskim prawem konsument ma prawo zwrócić zakupiony produkt bez podania przyczyny w ciągu 14 dni od dnia jego otrzymania. Pamiętaj jednak, że: +

+ + +

Jak dokonać zwrotu?

+
    +
  1. Powiadom nas drogą mailową na adres: kontakt@twoj-sklep.pl.
  2. +
  3. Zapakuj bezpiecznie produkt w oryginalne opakowanie.
  4. +
  5. Odeślij go na wskazany przez nas adres magazynu.
  6. +
  7. Po weryfikacji sprzętu, środki zwrócimy Ci w ciągu 14 dni roboczych.
  8. +
+ +

2. Procedura Reklamacyjna (Rękojmia i Gwarancja)

+

+ Wszystkie wady urządzeń mogą być zgłaszane z tytułu gwarancji producenta lub rękojmi. + Gwarancje na poszczególne urządzenia mogą wynosić od 2 do 5 lat (szczegóły w karcie produktu i zakładce Gwarancja). +

+ +

Jak zgłosić usterkę?

+

+ W razie awarii sprzętu zamontowanego przez naszą firmę, zalecamy kontakt telefoniczny lub poprzez e-mail: +

+ + +
+

Masz dodatkowe pytania?

+

Zadzwoń do nas pod numer +48 000 000 000 lub skorzystaj z formularza kontaktowego.

+
+ + ); +} diff --git a/app/blog/[slug]/page.tsx b/app/blog/[slug]/page.tsx new file mode 100644 index 0000000..8f8df42 --- /dev/null +++ b/app/blog/[slug]/page.tsx @@ -0,0 +1,252 @@ +import { Metadata } from 'next'; +import Image from 'next/image'; +import Link from 'next/link'; +import { notFound } from 'next/navigation'; +import { getPosts, getPostBySlug, getRelatedPosts } from '@/content/posts'; +import { CtaBanner } from '@/components/sections/CtaBanner'; +import { Calendar, User, ArrowLeft, ArrowRight } from 'lucide-react'; +import { companyDetails } from '@/content/company'; + +interface BlogPostPageProps { + params: { + slug: string; + }; +} + +// Generowanie ścieżek statycznych dla wpisów +export async function generateStaticParams() { + const posts = getPosts(); + return posts.map((post) => ({ + slug: post.slug, + })); +} + +// Generowanie metadanych dla danego wpisu +export async function generateMetadata({ params }: BlogPostPageProps): Promise { + const { slug } = await params; + const post = getPostBySlug(slug); + + if (!post) { + return { + title: 'Nie znaleziono wpisu', + }; + } + + return { + title: `${post.title} | Blog AirProject`, + description: post.excerpt, + alternates: { + canonical: `/blog/${post.slug}`, + }, + openGraph: { + title: post.title, + description: post.excerpt, + type: 'article', + publishedTime: post.date, + authors: [post.author || companyDetails.shortName], + images: [ + { + url: post.image || '/hero.jpg', + }, + ], + }, + }; +} + +export default async function BlogPostPage({ params }: BlogPostPageProps) { + const { slug } = await params; + const post = getPostBySlug(slug); + + if (!post) { + notFound(); + } + + const relatedPosts = getRelatedPosts(post.slug, post.category, 3); + + const dateObj = new Date(post.date); + const formattedDate = dateObj.toLocaleDateString('pl-PL', { + day: 'numeric', month: 'long', year: 'numeric' + }); + + const categoryLabels: Record = { + 'klimatyzacja': 'Klimatyzacja', + 'pompy-ciepla': 'Pompy Ciepła', + 'remonty': 'Remonty', + 'hydraulika': 'Hydraulika', + 'porady': 'Porady' + }; + + // Ustawienie CTA dopasowanego do kategorii wpisu + const getCtaLink = () => { + switch(post.category) { + case 'klimatyzacja': return '/klimatyzacja'; + case 'pompy-ciepla': return '/pompy-ciepla'; + case 'remonty': return '/uslugi-domowe/remonty'; + case 'hydraulika': return '/uslugi-domowe/hydraulika'; + default: return '/kontakt'; + } + }; + + // --- JSON-LD --- + const jsonLdArticle = { + '@context': 'https://schema.org', + '@type': 'BlogPosting', + headline: post.title, + image: post.image, + datePublished: post.date, + dateModified: post.date, + author: { + '@type': 'Person', + name: post.author || companyDetails.name, + }, + publisher: { + '@type': 'Organization', + name: companyDetails.name, + logo: { + '@type': 'ImageObject', + url: 'https://aeroservice-demo.pl/logo.png', // MOCK URL + }, + }, + description: post.excerpt, + }; + + const jsonLdBreadcrumb = { + '@context': 'https://schema.org', + '@type': 'BreadcrumbList', + itemListElement: [ + { + '@type': 'ListItem', + position: 1, + name: 'Strona Główna', + item: 'https://aeroservice-demo.pl', + }, + { + '@type': 'ListItem', + position: 2, + name: 'Blog', + item: 'https://aeroservice-demo.pl/blog', + }, + { + '@type': 'ListItem', + position: 3, + name: post.title, + item: `https://aeroservice-demo.pl/blog/${post.slug}`, + }, + ], + }; + + return ( +
+ {/* Skrypty JSON-LD dla SEO */} +