# KONTRAKTUS.md — Urbino public-spa · fejlesztői kontraktus

**Cél:** a fejlesztés forrása az urbino-docs spec — `apps/polgari-web/spec/10_publikus_oldalak_es_seo.md` és `apps/polgari-web/spec/20_webes_capture_es_koveto_oldal.md` (v2.0). Ez a fájl **viselkedés- és komponens-referencia** a spec mellé; **ütközésnél a spec nyer**. Nem a képernyők leírása — azt a `.dc.html` keretek adják, és az `ATADAS.md` a design-döntéseket. Ez a három tábla azt rögzíti, ami a képekből **nem** olvasható ki: a route- és állapot-átmenetek, a komponens-felelősségek, és a mezőnkénti láthatóság.

**Frissítve:** 2026. 09. 16. · **Spec-oldali igazítás:** 2026. 09. 22. (a szerző engedélyével — tételesen: `../../SPEC-OLDALI-MODOSITASOK.md`) · **Forrás:** a kanonikus `.dc.html` keretek + `ATADAS.md` + `Reszponzív nézetek.dc.html` t29 kontraktus.

## Hogyan olvasd

| Jelölés | Jelentés |
|---|---|
| **kötött** | jóváhagyott UX-tény — a design-kör döntötte el, ne térj el tőle (ha a spec mást mond, a spec nyer) |
| *javaslat* | backend- vagy implementációs alak, amit a design nem dönt el — a végleges alakot a spec adja |
| `kulcs` | i18n-kulcs vagy mezőnév |

**Amit ez a fájl nem tesz:** nem definiál végpontot, sémát, adatbázist. Ahol adatra hivatkozik, az a *megjelenés igénye*, nem a szerződés. A végpontok és a DTO-k a spec 3. szakaszaiban élnek.

**Három tilalom, ami minden alább leírtat felülír** (láthatósági invariánsok, `ATADAS.md` §4):
1. Csak jóváhagyott bejelentés publikus; a `Beérkezett` állapot kizárólag a bejelentőnek, a saját fiókjában (ownOnly).
2. Publikus felületen bejelentő-név **soha**, a cím házszám nélkül (a szerver vágja le); a felelős (staff) neve **sehol**.
3. „Elutasítva", „Lezárva", „Kiosztva", „Új" polgár felé **soha** — a kliens a szerver `citizenStatus`-ából renderel (§3.5).

---

## 1 · Route- és állapot-tábla

### 1.1 · Útvonalak

`:telepules` a bérlő slugja (alkönyvtár-architektúra, K-044 — egy domain). `:displayId` formátuma `ALM-1051`.

| URL | Nézet | Auth | Index | Belépési pont | Engedélyezett átmenetek | Megőrzött állapot |
|---|---|---|---|---|---|---|
| `/` | Gyökéroldal (4a) | — | ✓ | kampány, organikus | → `/:telepules` (település-kártya) · → `/onkormanyzatoknak` · → `/app` · kereslet-jelzés **helyben** (nem navigál) | a kereslet-jelzés kártya állapota a session-ben (elküldve után visszaigazolás marad újratöltésig) |
| `/app` | App-áthidaló — belépés-mentő (33a · 33c) | — | ✓ (canonical `urbino.io/app`) | lábléc, OG-kártya, nyomtatott anyag, QR · a mobil belépési levél linkje böngészőben megnyitva | **statikus**, mindenkinek ugyanaz (a tokenről nem tud) · UA-átirányítás **nincs** · → store-badge-ek (a store-URL-ek configból) | — |
| `/onkormanyzatoknak` | B2B oldal (28a) | — | ✓ | lábléc, hideg kampány | → `/:telepules` („élőben") · **„Demót kérek" e-mail gomb** (a cím configból) — demó-kérés űrlap és helyben váltó visszaigazolás (28b) a v1-ben **nincs** | — |
| `/adatkezeles` · `/aszf` · `/impresszum` | Jogi statikus oldalak | — | ✓ | lábléc jogi sora | — | — |
| `/belepes` | Belépés (14f) | kijelentkezve | **noindex** | fejléc „Fiók", védett route-ról terelés | → SSO-szolgáltató → `/belepes/vissza` · → „link elküldve" **helyben** (kód-mezővel) · sikeres belépés → `returnUrl` vagy `/fiok/bejelentesek` | **`returnUrl`** (kötött: a belépés után oda tér vissza, ahonnan indult) |
| `/belepes/vissza` | SSO-visszatérés · hibák (18e) | — | noindex | SSO-callback, magic-link | siker → `returnUrl` · hiba → inline hiba a `/belepes`-en (nem külön oldal) | `returnUrl` · capture-vázlat (lásd 1.2) |
| `/fiok` | — | belépve | noindex | fejléc-avatar | **redirect** → `/fiok/bejelentesek` | — |
| `/fiok/bejelentesek` | Bejelentéseid lista (14b) | belépve | noindex | avatar-menü, modul-sín, sikerpillanat, e-mail-link | → `/fiok/bejelentesek/:displayId` · → modul-váltás (Adataim) | lista-szűrés nincs (a lista rövid) · érkezés-toast egyszer (24e) |
| `/fiok/bejelentesek/:displayId` | Bejelentés-részlet **own módban** (14b) | belépve + sajátja | noindex | lista, e-mail-link, megerősítés | → publikus oldal (új fül) · ← lista | — |
| `/reports/:displayId` | — (alias) | — | noindex | a vendég-megerősítő levél linkje (a backend ezt az alakot fűzi a linkbe) | **alias** → `/fiok/bejelentesek/:displayId` | — |
| `/fiok/adataim` | Adataim (21a) | belépve | noindex | avatar-menü, modul-sín | dialógusok **helyben** (követés-megszüntetés 31a · fiók-törlés 18g) · törlés után → `/` | a nyitott űrlap-kártya és a beírt érték dialógus-nyitáskor megmarad |
| `/:telepules` | Település-oldal (2b) | — | ✓ (a `?allapot=` alak noindex, canonical a szűretlenre) | gyökér, keresés, megosztás | → bejelentés-oldal · → kategória-nézet · → hírek és programok · → capture · követés **helyben** (app-híd, 1.4; CaptureOnly-n nincs) | **`?allapot=` státusz-szűrő a query-ben** (megoszthatóság) · **`?kovetes=1`** — a belépés utáni automatikus csatlakozás (1.4) |
| `/:telepules/kategoria/:kategoriaSlug` | Kategória-nézet (23a) | — | ✓ | SEO, kategória-chip | → bejelentés-oldal · → szűretlen település-oldal | `?allapot=` query (noindex) · **canonical a szűretlen kategória-URL-re** (kötött) |
| `/:telepules/bejelentesek/:displayId[-slug]` | Publikus bejelentés-oldal (8a · 17h) | — | ✓ ha publikus | megosztás, lista, OG | → kategória-nézet · → település-oldal · → capture | — (a feloldás kulcsa a `displayId`; elavult/hiányzó slug → 301 a canonical alakra) |
| `/:telepules/bejelentes` | Capture-flow (9a) | — | **noindex** | fő-CTA minden publikus felületről | lásd **1.2** | **a teljes vázlat** (kötött, lásd 1.2) |
| `/:telepules/bejelentes/elkuldve` | Visszaigazolás (9d) | — | **noindex** | a capture beküldése | belépve → `/fiok/bejelentesek/:displayId` (fiók-kártya) · vendég: megerősítés-kérés (csak link, 1.2) | — |
| `/:telepules/hirek-es-programok` | Hír- és program-listázó + sapka (6a) | — | ✓ (sitemapben) | menü, település-oldal | → hír-aloldal · → program-listázó | — |
| `/:telepules/hirek-es-programok/hirek/:id[-slug]` | Hír-aloldal (6a) | — | ✓ (sitemapben) | listázó, OG, sapka | ← listázó · megosztás | — |
| `/:telepules/hirek-es-programok/programok` | Program-listázó (32a) | — | ✓ (sitemapben) | listázó, menü | → program-aloldal · → „Korábbi programok" (lapozással) | idő-ablak-pozíció görgetésnél |
| `/:telepules/hirek-es-programok/programok/:id[-slug]` | Program-aloldal (32b–32f) | — | ✓ (sitemapben) | listázó, OG, sapka | ← listázó · naptár-export · megosztás | — |

**Index-szabály:** a hír- és program-oldalak **mind indexeltek**, és a sitemapben vannak. **Noindex:** `/belepes*`, `/fiok*`, `/reports/*`, a capture-útvonalak és a szűrő-paraméteres alakok.

**Hibás/nem elérhető útvonalak** (a minták a `Rendszer-állapotok.dc.html`-ben):

| Eset | Válasz | Nézet |
|---|---|---|
| nem létező bejelentés-slug | 404 | 17e — kontextus-függő kiutakkal |
| létező, de **nem publikus** bejelentés | **404, létezés-információ nélkül** (kötött, AC-C2/C5) | 23b — „jelenleg nem nyilvános" + fiók-kiút |
| triage előtt elutasított bejelentés | 404 (ownOnly — publikus oldala nincs) | 23b |
| nem-továbbított soft-lezárás publikus linkje | 404 | 23b |
| betöltési hiba (hálózat, 5xx) | oldal marad, hiba-kártya | 17d — „egy tény, egy kiút", nincs „Hoppá" |
| védett route kijelentkezve | terelés `/belepes?returnUrl=…` | 14f |
| idegen fiók bejelentés-részlete | 404 | 23b (nem 403 — létezés-információ) |

### 1.2 · Capture-folyam — állapotgép

A **vázlat** (*javaslat: `ReportDraft`*) a folyam alatt megőrzendő — ez a legfontosabb nem-vizuális követelmény: a polgár telefonon, utcán, egy kézzel jelent be, és minden megszakítás elveszített bejelentés.

```
1/2 Helyszín ──(cím feloldva + kategória? nem: a kategória a 2/2-n)──► 2/2 Részletek ──► identitás
   ▲                                                                      │
   └──────────────────── vissza (a vázlat megmarad) ◄─────────────────────┘

identitás ─┬─ belépve ──────────────────────────────► 9d sikerpillanat (köszönet + fiók-kártya + app-CTA, ha van app)
           └─ vendég ── e-mail ──► 9d megerősítés-kérés ──(a levél linkje)──► fiók + követés létrejön
                                        └── +2 / +7 nap emlékeztető (kézi újraküldés nincs)
```

| Állapot | Kötött szabály | Hiba-ág |
|---|---|---|
| 1/2 helyszín | lokáció **kötelező** (K-049) · a cím-feloldás **gombra** fut, nem gépelésre (spec 4.1) | határon kívül: **lágy figyelmeztetés**, nem blokkol |
| 2/2 részletek | kategória + **rövid összefoglaló** kötelező (ez lesz a bejelentés címe; max 200) · **bővebb leírás** opcionális (max 4000) · fotó opcionális, de ösztönzött | mezővalidáció: inline piros hairline + görgetés az első hibára (17i) |
| beküldés | — | 17j beküldés-hiba („minden adatod megvan" kártya a gomb fölött) · **24a** bot-ellenőrzés (403) · **24b** rate-limit (429) |
| identitás | SSO vagy e-mail (K-045) · belépve összecsukott összefoglaló „Nem te vagy?" kiúttal | **24c** SSO-visszatérés: **a vázlat megőrzendő** (kötött) |
| vendég-megerősítés | a bejelentés **csak a megerősítés után** jut a településhez (SD-124) · a megerősítés **kizárólag a levél linkjével** történik — 6 jegyű kód a vendég-ágon nincs (SD-160) · app-CTA ezen a képernyőn **nincs** | — |
| megerősítés után | létrejön a fiók (ha nincs) **és** a település-követés (PA-11) · a bejelentés a fiókban nyílik (`/reports/:displayId` → `/fiok/bejelentesek/:displayId`, egyszeri érkezés-toast — 24e) | — |

### 1.3 · Belépés és e-mail-megerősítés — állapotgép

| Szabály | Érték |
|---|---|
| belépési link + kód érvényessége | **15 perc** (kötött, 06 3.9) |
| link felhasználhatósága | **egyszer**; mindig a **legutóbb kért** él (a korábbi azonnal érvénytelen) |
| kód | 6 jegyű, a linkkel egyenértékű; **más eszközön is** beváltható — **csak a sima belépésnél** (`/belepes`) |
| vendég-megerősítő levél | **csak link** — kód nincs (SD-160); a link a `/reports/:displayId` alias-on át, belépett állapotban a saját részletre visz |
| jelszó | nincs (SD-84) — SSO vagy magic-link |
| fiók keletkezése | az első belépés / az első megerősített bejelentés hozza létre |
| e-mail-cím | a fiók horgonya, **nem módosítható** (MVP-döntés) |
| hibák | felhasznált/érvénytelen link → 18e egy közös képernyő · SSO-hiba → **inline** a belépés-oldalon |

### 1.4 · Követés (tagság) — állapotgép

A követés **fiók-szintű tagság** (*javaslat: `TownMembership`*) — egy lista, két felület (app ↔ web szinkron). **App nélküli (CaptureOnly) településen a követés-felület nem jelenik meg.**

| Keletkezés | Út |
|---|---|
| explicit, belépve | „Követem" a település-hero-ban → egy kattintás |
| explicit, kijelentkezve | e-mail-kapu (22a) → **belépési link** (a szokásos belépés, 15 perc; a fiók is ekkor jön létre, ha még nincs) → visszatérés a `/:telepules?kovetes=1` alakra → a csatlakozás **automatikus** (külön követés-mód nincs) |
| explicit, fiókból | Adataim → „Település hozzáadása" (31b kereső-minta) |
| implicit | bejelentés beküldése az adott településen (vendégnél a megerősítéskor) |

**Tartalma a weben — app-híd:** a település a fiókod településeihez kerül (app ↔ web szinkron); hírei és programjai az Urbino-appban, értesítéssel érkeznek. E-mailes hír-, program- vagy kérdőív-levél **nincs**. A megszüntetés nem destruktív (a bejelentéseid maradnak, bármikor újra követhető), megerősítő dialógussal (31a).

---

## 2 · Komponens-leltár

A DS atomokat (`u-btn`, `u-input`, `u-chip`, `u-card`, `u-list-tile`, `u-timeline`, `u-skel`, `u-dialog`, `u-toast`, `u-popover`, `u-breadcrumb`, `u-table`, `u-avatar`) a design system adja — ezeket **ne építsd újra**, csak komponálj velük (`.urbino-cit.urbino-cit-web` világ). Az alábbi lista a **projekt-szintű organizmusokat** rögzíti: mit tud, mi a bemenete, milyen állapotai vannak, és melyik reszponzív szabály tartozik hozzá.

A „RK §12" hivatkozás az `ATADAS.md` reszponzív kontraktusának sorára mutat; a normatív forrás a `Reszponzív nézetek.dc.html` t29 transzformáció-táblája.

| Komponens *(javasolt név)* | Felelősség | Bemenet | Állapotok | Reszponzív |
|---|---|---|---|---|
| *CitHeader* | publikus fejléc | `tenant`, `activeNav`, `user?`, `showAppCta` | kijelentkezve (halk „Fiók" link) · belépve (avatar-chip a jobb szélen) · ≤900 hamburger | RK: publikus fejléc |
| *CitHeaderFocus* | capture fókusz-fejléc | `step`, `totalSteps`, `user?` | 1/2 · 2/2 · ≤900: lépésjelző külön sávban | RK: fókusz-fejléc |
| *TownSwitcher* | település-váltó | `memberships[]`, `activeTenant` | zárt chip · nyitott popover · ≤900 alsó lap | RK: település-váltó |
| *AccountMenu* | avatar-menü | `user`, `railCounts` | zárt · nyitott popover · ≤900 alsó lap — tartalom: Bejelentéseid · Adataim · Kilépés | RK: avatar-menü |
| *PrivateStrip* | privát sáv a fiók-felületeken | `user.email` | teljes · ≤480 e-mail nélkül, tördelve | RK: privát sáv |
| *AccountRail* | fiók modul-sín (v1: Bejelentéseid · Adataim) | `modules[]`, `counts`, `active`, `loading` | normál · üres modul (**szám eltűnik, nem 0**) · betöltés (skeleton-pill) · ≤900 vízszintes chips | RK: fiók modul-sín |
| *StatusChip* | polgár-látható badge | `citizenStatus` | Beérkezett (csak own) · Jóváhagyva · Folyamatban · Megoldódott · Továbbítva · Lezárult (csak own) | — |
| *CatChip* | kategória-chip / szűrő | `category`, `selected`, `href?` | alap · kiválasztott · link-mód (kategória-URL) | RK: szűrő-chipsor |
| *ReportCard* | bejelentés-kártya listákban | `report`, `variant: public\|own` | 5 badge-állapot · fotó nélkül | RK: kártya-rács |
| *ReportDetail* | bejelentés-részlet — **egy sablon, két nézet** | `report`, `mode: public\|own` | public (támogatás-kártya, morzsa, 420 px oldalsáv) · own (sín nélkül, „Saját bejelentésed" chip, „Publikus oldal" kártya, 300 px) | RK: oldalsáv · idővonal |
| *CaseTimeline* | „Mi történt eddig" | `events[]` | done · current · upcoming; lépés-szöveg **csak** a Megoldódott/Továbbítva lépésen (a lezárás-üzenet) — felelős-név és lépésenkénti jegyzet sehol | RK: idővonal |
| *StatusCard* | „Itt tartunk" kártya | `citizenStatus`, `message?`, `forwardedTo?` | amber (folyamatban) · green (megoldódott) · slate (továbbítva/lezárult) | — |
| *MapPreview* | térkép | `lat`, `lng`, `interactive` | interaktív (oldalsáv) · ≤480 kompakt előnézet + „Megnyitom a térképen" · koordináta nélkül: **nem jelenik meg** | RK: térkép |
| *CategoryPicker* | capture kategória-választó | `categories[]` | 3×2 rács · ≤480 **2×3, 56 px cellák** (nem lista) | RK: kategória-választó |
| *StickyCtaBar* | capture rögzített sáv | `label`, `disabled`, `note?` | alap · tiltott · validáció-jegyzettel; safe-area padding | RK: rögzített CTA-sáv |
| *FormCard* | Adataim-kártyák | `title`, `value`, `editable` | olvasó · szerkesztő · mentve (toast) · nem módosítható (e-mail) | RK: űrlap-kártya |
| *ConfirmSheet* | megerősítő dialógus | `title`, `body`, `confirmLabel`, `danger` | dialógus ≥481 · **alsó lap ≤480** (elsődleges gomb felül, „Mégsem" alatta) | RK: dialógus |
| *EmptyState* | üres állapotok | `icon`, `title`, `body`, `cta?` | hívó (fiók, település) · tájékoztató (hírek) | — |
| *SkeletonScreen* | betöltés | `archetype: hero\|list\|detail\|account` | 4 recept: ami a route-ból tudható, **azonnal kirajzolódik** | RK: mind |
| *NewsCard* / *EventCard* | hír- és program-kártya | `item` | hír · program (dátum-csempe 4 fajtája: pont · tartomány · hónapváltó · „most") · Elmarad (áthúzott cím) / Változott (áthúzás nélkül) · lezajlott (halvány) | RK: kártya-rács |
| *EventFacts* | program tény-kártya | `event` | időpont · helyszín · részvétel · ismétlődés; „Több helyszínen" gyűjtőnél · online-változat **nincs** (nincs rá adatmező) | RK: táblázat |
| *InterestCard* | kereslet-jelzés | `townQuery?` | zárt · kereső nyitva (19f) · elküldve (19h) · már jelezted (19i) · validáció (19j) | RK: űrlap-kártya |
| *PageFooter* | lábléc | `tenant?` | publikus (4 hasáb) · kompakt (fiók, capture) · ≤900 2 hasáb · ≤480 1 hasáb | RK: lábléc |

**Két komponens-szabály, ami a keretekből nem látszik:**
- A *ReportDetail* **egy** komponens két módban — ne szülessen külön „publikus" és „fiók" részlet-oldal. A módot a route adja, nem a bérlő-konfig.
- A *ConfirmSheet* és a *TownSwitcher*/*AccountMenu* ≤480-on **ugyanaz a lap-geometria** (16 px felső radius, fogantyú, 48 px sorok) — egy alsó-lap primitív, három használat.

---

## 3 · Adat-kontraktus (megjelenés + láthatóság)

Ez a tábla azt mondja meg, **mi látszik és hol** — nem azt, hogy milyen a séma. A mezőnevek *javaslatok*; a végleges DTO-k a spec 3. szakaszaiban élnek.

### 3.1 · Bejelentés

| Mező *(javaslat)* | Megjelenés | Publikus | Saját (own) | Formátum-kötés |
|---|---|---|---|---|
| `displayId` | mono azonosító | ✓ | ✓ | **`ALM-1051`** — `displayPrefix-ticketNumber`, `#` és évszám nélkül (SD-16) |
| `title` | H1 — a capture **rövid összefoglalója** | ✓ | ✓ | 38 px publikus · 30 px own · 24–26 px mobil |
| `description` | törzs — a **bővebb leírás** (opcionális) | ✓ | ✓ | — |
| `category` | eyebrow-chip + kategória-URL | ✓ | ✓ | a 6 kategória emojijával (az egyetlen engedett emoji-hely) |
| `citizenStatus` | StatusChip + StatusCard | ✓ a 4+1 publikus készletből | ✓ + Beérkezett / Lezárult | a szerver értéke; leképezés: §3.5 |
| `createdAt` | mono meta | ✓ | ✓ | **`2026. 05. 10.`** |
| `photo` | figure a leírás után | ✓ csak a bejelentés sajátja | ✓ | fotó nélkül a layout nem törik |
| `lat` / `lng` | MapPreview | ✓ | ✓ | hiányban **nincs pin** (nem közelítünk) |
| `address` | helyszín-szöveg | ✓ **házszám nélkül** — a szerver vágja le | ✓ teljes | a kliens nem vág |
| `reporterName` | — | **soha** | „Te jelentetted be" | K-053 |
| `assigneeName` | — | **soha** | **soha** | a polgári API nem adja |
| `timeline[]` | CaseTimeline | ✓ | ✓ + a Beérkezett-lépés | lépés-szöveg **csak** a Megoldódott/Továbbítva lépésen (a lezárás-üzenet); a Jóváhagyva/Folyamatban lépésnek nincs jegyzete |
| `resolutionMessage` | StatusCard törzse | ✓ Továbbítva/Megoldódott esetén | ✓ | a soft-close kártya szövegei a spec-katalógusból (`apps/polgari-web/spec/i18n/hu.json`) |
| `forwardedToName` | „Továbbítva: {név}" | ✓ | ✓ | a szervezet neve, nem rövidítve |
| `supportCount` | támogatás-kártya | ✓ olvasható | — | az akció app-CTA (K-023) |

### 3.2 · Hír és program

| Mező *(javaslat)* | Megjelenés | Kötés |
|---|---|---|
| `title`, `lead`, `body` | cikk-aloldal | a lead 18 px, a törzs 16 px |
| `coverPhoto` | figure + OG-kép | hiányban a település borítófotója (30a·2) |
| `publishedAt` | meta | `2026. 06. 08.` |
| `startsAt` / `endsAt` | dátum-csempe + tény-kártya | 4 csempe-fajta; idősáv `16:00–22:00` |
| `eventStatus` | banner (áthúzott cím **csak** az elmaradtnál) | `cancelled` → „Ez a program elmarad." · `changed` → egyetlen általános szöveg: „A program adatai megváltoztak." (időpont/helyszín szerinti bontás nincs) |
| `recurrence` | heti menetrend tábla | a tény-kártyán a **következő** előfordulás |
| `registrationRequired`, `price` | Részvétel-blokk | „Ingyenes" · „Regisztráció szükséges"; összeg nélküli belépő is lehet |
| `isCollection`, `children[]` | „Napról napra" agenda | „Több helyszínen" a gyűjtő gyerek-programjainak helyszíneiből · ≤480 accordion |

### 3.3 · Fiók

| Mező *(javaslat)* | Megjelenés | Kötés |
|---|---|---|
| `email` | Adataim-kártya | **nem módosítható** — a fiók horgonya; publikusan soha |
| `firstName` / `lastName` | üdvözlés + Adataim | **önkéntes**, csak az üdvözléshez; publikusan soha. Név nélkül: **„Jó napot! 👋"** |
| `avatarInitial` | fejléc-chip | a névből, név nélkül az e-mailből |
| `memberships[]` | Követett települések kártya | követési idő szerint; app ↔ web szinkron (1.4) |
| `notifications` | egyetlen kapcsoló — „a bejelentéseid változásairól" | a **fiók-szintű** beállítás: az appra és az e-mailre egyaránt hat (külön webes e-mail-kapcsoló nincs); a fiókban minden változás enélkül is látszik |
| fiók-törlés | 18g dialógus | a publikus bejelentések (név nélkül) **megmaradnak**, és újraregisztrálásnál **nem kapcsolódnak vissza** |

*(A korábbi 3.4 Kérdőív-szakasz a v1-ből kimaradt — a számozás a hivatkozások miatt változatlan.)*

### 3.5 · Státusz-leképezés (kötött)

A kliens a szerver **`citizenStatus`** értékéből renderel — nem backend-állapotból.

| `citizenStatus` (szerver) | Weben polgár felé | Hol |
|---|---|---|
| `Received` | **Beérkezett** | **csak a saját** nézetben (triage előtti bejelentés, ownOnly) |
| `Approved` | **Jóváhagyva** | publikus + own |
| `InProgress` | **Folyamatban** | publikus + own |
| `Resolved` | **Megoldódott** | publikus + own — lépés-szöveg: a lezárás-üzenet |
| `Forwarded` | **Továbbítva** (slate) | publikus + own — „Továbbítva: {forwardedToName}" + `resolutionMessage` |
| `Closed` | **Lezárult** (slate) | **csak a saját** nézetben + soft-close kártya; publikus oldala nincs → 404 (23b) |

### 3.6 · Formátum-kánon (kötött)

| Mi | Alak |
|---|---|
| dátum | `2026. 07. 13.` |
| idő | `14:30` (24 h) |
| azonosító | mono `ALM-1051` |
| cím | `8220 Balatonalmádi, Petőfi Sándor utca 12.` (publikuson házszám nélkül — a szerver vágja le) |
| összeg | `12 500 Ft` |
| megszólítás | tegezés mindenhol; felkiáltójel **csak** az üdvözlésben |
| tiltott szavak polgár felé | „ügy", „elutasítva", „lezárva", „kiosztva", „új", „státusz", „Ön", „VárosApp" |

---

## Kapcsolódó fájlok

| Fájl | Mit ad |
|---|---|
| `apps/polgari-web/spec/10_publikus_oldalak_es_seo.md` · `20_webes_capture_es_koveto_oldal.md` | **a fejlesztés forrása** (v2.0) — végpontok, DTO-k, viselkedés, AC-k; ütközésnél ez nyer |
| `apps/polgari-web/spec/i18n/hu.json` | a szövegek kanonikus katalógusa |
| `ATADAS.md` | a design-döntések háttere: láthatósági invariánsok · badge-leképezés · **§12 reszponzív kontraktus (kötött)** · döntésnapló |
| `00 Áttekintés.dc.html` | belépő-nézet: sitemap · láthatóság · funkció-leltár · állapot-mátrix · reszponzív lefedettség · hiánylista — *a design-projektben él, ebben a csomagban nincs* |
| `Reszponzív nézetek.dc.html` t29 | a **normatív** transzformáció-tábla (21 organizmus × 4 lépcső) + öröklés-tábla — *a design-projektben él, ebben a csomagban nincs* (a csomagban: W11 screen-mock + `ATADAS.md` §12) |
| `Microcopy-tábla.dc.html` | a design-kör szöveg-táblája — *a design-projektben él, ebben a csomagban nincs*; a kanonikus szövegek a spec-katalógusban |
| kanonikus `.dc.html` keretek | a vizuális igazság a design-projektben — *ebben a csomagban nincsenek*; az `atadas/` csomag generált vizuális referencia (nem kódkiindulás) |
