Files
j_kedzierski/prompts/10-architektura-cms.md

137 lines
9.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 `[email protected]` |
| 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
`<head>`, 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`).