# Architektura i zmiany w CMS Zgodnie z `fundamenty-projektu.md` i `standardy-kodu.md` — zmiany warstwowo: co jest treścią (panel), co strukturą (Payload config), co kodem projektu. Zero hardkodu — każda wartość poniżej ląduje w polu `localized`/`upload`/env, zgodnie z `antigravity-zasady-agent.md` A1–A4. --- ## 1. Dane wejściowe od klienta (blokujące, zebrać przed dalszą pracą) To jedyna sekcja tego planu, która nie jest decyzją projektową — to lista pytań do Michała/klienta. Bez tego część planu z plików `02`–`09` zostaje na placeholderach niezależnie od tego, jak dobrze zbudowany będzie kod. | # | Dane | Gdzie trafia | Status w zipie | |---|---|---|---| | 1 | Realny adres biura | global `Company` | `"DO POTWIERDZENIA PRZEZ KLIENTA"` — dwie sprzeczne wersje w poprzednich ustaleniach (Böhlstraße 2 vs Bismarckstr. 112, Ludwigshafen), **wymaga jednoznacznej odpowiedzi klienta** | | 2 | Realny telefon | global `Company` | placeholder `+49 123 456 789` | | 3 | Realny e-mail | global `Company` | placeholder `kontakt@example.com` | | 4 | Numer WhatsApp (format `49XXXXXXXXX`, bez `+`/spacji) | global `Company.whatsappNumber` | placeholder `49123456789` | | 5 | Zdjęcie Janusza (portret + kontekst pracy) | media, użyte w `hero`, `bio` | brak w paczce | | 6 | Logo b.b.h. Lohnsteuerhilfeverein e.V. | media, użyte w `affiliation.logo`, `Footer.association.logo` | klient wg wcześniejszych ustaleń je posiada — brak w paczce, dostarczyć w wersji wektorowej/PNG na przezroczystym tle | | 7 | Logo/marka własnej firmy Janusza (jeśli istnieje osobne od b.b.h.) | `site-settings.logo`, favicon | brak potwierdzenia czy istnieje | | 8 | Forma prawna działalności, ew. Steuernummer/USt-IdNr. | strony prawne (Impressum) | nieustalone, patrz [09-strony-prawne.md](./09-strony-prawne.md) §1 | | 9 | Czy istnieje formularz członkostwa/składka w ramach b.b.h. (dla treści strony Stowarzyszenie) | `/stowarzyszenie` | nieustalone, patrz [07-stowarzyszenie.md](./07-stowarzyszenie.md) §2 Sekcja D | | 10 | Skala firmy: zespół ~20 osób | blok `team` na `/o-nas` | Potrzebne dane (imię, nazwisko, rola, opcjonalnie zdjęcie i krótki opis) dla każdej z ~20 osób, żeby wypełnić panel. | | 11 | Aktualność progów `18 000 € / 36 000 €` i `§4 Nr. 11 StBerG` na bieżący rok podatkowy | blok `eligibility` | treść już jest, wymaga tylko potwierdzenia aktualności, nie przepisywania | | 12 | Teksty bannera cookies PL/DE | global `Cookie Settings` w panelu | puste w bazie — renderuje się angielski fallback z pluginu, wymaga uzupełnienia | | 13 | Dane SMTP do wysyłki maili | Panel CMS → Integrations → Email | Formularz kontaktowy nie wyśle powiadomień bez skonfigurowanego serwera poczty. | | 14 | Klucze Cloudflare Turnstile | `.env` (`NEXT_PUBLIC_TURNSTILE_SITE_KEY`, `TURNSTILE_SECRET_KEY`) | Wymagane do działania weryfikacji antyspamowej w formularzu kontaktowym. | --- ## 2. Zmiany w blokach (Payload config + Component) | Blok | Zmiana | Powód | Priorytet | |---|---|---|---| | `faqTeaser` → nowy `faqFull` (lub rozszerzenie configu istniejącego) | dodać pole grupowania `category` (opcjonalny text) w `questions[]`, wykorzystywane na `/faq`; `faqTeaser` na home zostaje bez zmian strukturalnych, tylko dodać `ctaText`/`ctaUrl` (wzorem `process`) do linkowania na pełne FAQ | patrz [06-faq.md](./06-faq.md) | P1 | | `servicesList` | dodać pole `linkUrl` per usługa (obecnie tylko `linkText` bez celu linku) | naprawia martwe „Zobacz więcej" na home, patrz [02-strona-glowna.md](./02-strona-glowna.md) §5 | P1 | | `affiliation` | wypełnić `trustPoints[]` (pole już istnieje w schemacie, obecnie puste `[]`) i `logo` | patrz [02-strona-glowna.md](./02-strona-glowna.md) §7 | P1 | | `Team/Component.tsx` | dodać warunek: gdy `members.length === 1`, renderować pojedynczą kartę bez siatki grid (albo pominąć render bloku całkowicie — decyzja klienta, patrz [05-o-nas.md](./05-o-nas.md) §3) | unika redundancji z `bio` | P2 | | `hero` | dodać `id` do sekcji `process` na home (`id="jak-to-dziala"`), żeby `secondaryCta.url` z hero (`#jak-to-dziala`) faktycznie trafiał gdzieś | martwy kotwica-link, błąd funkcjonalny | P1 | | `TextSection` (Impressum/Datenschutz/Cookies/Stowarzyszenie/FAQ dziś) | upewnić się, że pole `text` to `richText`, nie zwykły `textarea` — długie strony prawne potrzebują list, nagłówków, linków w treści, nie jednego bloku tekstu | wymóg funkcjonalny dla treści z [07](./07-stowarzyszenie.md) i [09](./09-strony-prawne.md) | P1 | **Nowy blok do rozważenia (faza 2, nie blokuje startu):** `VideoSection` — patrz [02-strona-glowna.md](./02-strona-glowna.md) §11. **Nowy element UI (nie blok CMS, komponent globalny):** floating WhatsApp button — patrz [02-strona-glowna.md](./02-strona-glowna.md) §0. Dane (`whatsappNumber`) już istnieją w globalu `Company` — tylko brakuje komponentu w `layout.tsx`. **Propozycja na przyszłość (Team Modal CTA):** W modalu komponentu Zespół (TeamBlock) można dodać dedykowany przycisk CTA "Napisz na WhatsApp" kierujący do `https://wa.me/...` z prefillowaną wiadomością (np. `?text=Dzień dobry, chciałbym umówić się z [Imię członka zespołu]`). Wymaga to akceptacji klienta. --- ## 3. Media — kolekcja i pipeline - `Media.ts` ma już `normalizeFilenameHook` (zgodnie ze standardem) — bez zmian. - **Brak wariantów rozmiarów (`imageSizes`)** w przejrzanym configu — do dodania zgodnie z `wymagania-projektowe-strony.md` §6 (P1: „Warianty rozmiarowe generowane przy uploadzie w Payload (sharp)"). Bez tego każde zdjęcie (hero, bio, process) ląduje w pełnej rozdzielczości na każdym urządzeniu — bezpośrednio uderza w LCP (cel < 2,5s), patrz [11-integracje-seo-wydajnosc.md](./11-integracje-seo-wydajnosc.md) §5. - Format: AVIF/WebP w `next.config` (`formats: ['image/avif','image/webp']`) — sprawdzić, czy już ustawione. - Favicon: **brak w danych** (`site-settings.favicon: null`) — wgrać przez panel, renderować przez `buildIconsMetadata` z pluginu (NIGDY ręcznie w ``, zgodnie z antywzorcem #favicon w `standardy-kodu.md` §6). --- ## 4. System Pages — role nieprzypisane `site-settings.privacyPolicy`, `.cookiePolicy`, `.termsOfService` = `null` dla obu języków. Bez tego `getSystemPagePath` (używane przez baner cookies, stopkę, formularze) nie ma czego zwrócić — linki do polityk będą albo martwe, albo (gorzej) zahardkodowane jako `/pl/polityka-prywatnosci` w obejściu, co łamie zasadę A3 z `antigravity-zasady-agent.md`. **Do zrobienia w panelu (nie w kodzie):** Site Settings → System Pages → przypisać: - `homepage` → już ustawione (page 1) ✓ - `privacyPolicy` → page 8 (Polityka prywatności / Datenschutzerklärung) - `cookiePolicy` → page 9 (Polityka cookies / Cookie-Richtlinie) - `termsOfService` → **brak strony regulaminu w ogóle w obecnej mapie stron** — do decyzji: czy przy modelu „wizytówka + WhatsApp" (bez zamawiania usług online, bez kont użytkowników) regulamin jest w ogóle wymagany. Wg `wymagania-prawne.md` checklist: „Regulamin — jeśli strona świadczy usługi / sprzedaż / konta" — tu formalnie świadczona jest usługa doradztwa, więc **rekomendacja: dodać krótki regulamin świadczenia usługi drogą elektroniczną (zakres: korzystanie z formularza kontaktowego/WhatsApp, nie regulamin sklepu)**, konsultowany z prawnikiem klienta, jako 11. strona. Impressum ma częściowo tę rolę po stronie niemieckiej, ale nie zastępuje polskiego wymogu regulaminu usług elektronicznych po stronie PL. Satzung/Beitragsordnung (statut i regulamin składek b.b.h., wzorem bbh) — **nie dotyczą tej strony**: to dokumenty SAMEGO stowarzyszenia b.b.h., nie firmy Janusza. Jeśli mają się pojawić, to jako link zewnętrzny do `bbh-lohnsteuerhilfe.de/satzung` w obrębie strony Stowarzyszenie ([07](./07-stowarzyszenie.md)), nie jako własne strony w tym repo. --- ## 5. Nawigacja — Header/Footer Obecna nawigacja header (5 pozycji: Usługi, Jak się umówić, O nas, kotwica FAQ, Kontakt) pomija bezpośredni link do `/stowarzyszenie` — do rozważenia, czy dodać do głównego menu, czy zostawić jako link wtórny (z bloku `affiliation` + stopki, gdzie już jest). Rekomendacja: **zostawić poza głównym menu** — to strona uzupełniająca, nie ścieżka konwersji; upychanie jej w header rozmywa priorytet (Usługi → Jak się umówić → Kontakt to właściwa ścieżka do WhatsApp, nie przeciążać nawigacji). Stopka (`Footer.navigation`) linkuje już do stron 2,3,4,6,8,9,10 — brakuje FAQ (5) i Stowarzyszenie (7) w liście stopki, mimo że istnieją jako strony — **dodać oba do nawigacji stopki**, żeby były osiągalne bez polegania wyłącznie na kotwicach/linkach kontekstowych. --- ## 6. Porządki w repo (drobne, ale wpływają na jakość odbioru) - `src/app/(frontend)/styles.css` — domyślny boilerplate Payloada (`background: rgb(0,0,0)`, `font-family: system-ui`), realny design system żyje w `globals.css` przez Tailwind `@theme`. Zweryfikować, czy plik jest w ogóle importowany; jeśli nie — usunąć, żeby nie mylić przyszłych sesji co do „gdzie są prawdziwe tokeny" (zgodnie z zasadą jednego źródła prawdy, `standardy-kodu.md` §2.2). - `scripts/update_*.py`, `scripts/fix_*.ts` w repo — robocze skrypty migracyjne z wcześniejszych sesji; jeśli zadania już wykonane i nieaktualne, rozważyć przeniesienie do `scripts/archive/` albo usunięcie, żeby nie myliły co do aktualnego sposobu edycji treści (treść edytuje się przez panel, nie przez skrypty — `architektura-tresci.md`).