# Döntés-napló — manager-system

A projekt során meghozott UX-döntések, amik a specifikációban nincsenek
benne, vagy egyértelmű choice-pontok. Időrendben.

> **Forma.** Minden bejegyzés: `D-<sorszám>` · dátum · cím · kérdés ·
> opciók · döntés · indoklás. Ne írj át régi bejegyzést; ha egy döntést
> megfordítunk, új D-<n> nyit, és a régiben "Felülírva: D-<n>" jelölés.

---

## D-1 · 2026.05.21 · Page-CTA helye — PageHeader, nem TopBar

**Kérdés.** Hová tegyük a screen-specifikus primer CTA-kat *(pl. `+Új bejelentés`
a Bejelentés-listán, `+Új hír` a Hírek-screen-en)*? Két helyre lehetne logikusan:
*(a)* TopBar jobboldali action-slot, *(b)* PageHeader actions.

**Opciók.**
- **A — Page-CTA a PageHeaderben** *(választott)*. A TopBar action-slot üres marad
  (csak bell + search). Minden screen-specifikus akció a cím mellett, jobbra.
- **B — Globális quick-action a TopBarban**. `+Új bejelentés` konstansul a TopBarban
  minden screen-en, a többi CTA a PageHeaderben.
- C — Mindkettő, page-szintű döntésenként. *(elvetett, redundáns)*

**Döntés.** **A verzió.**

**Indoklás.**
- A spec a TopBart nem rendelkezi mint akció-tartót *(`docs/spacing.md` §4 "Top bar
  (sticky, 56px tall) — owned by AppShell molecule")*; a TopBarba CTA-t tenni
  spec-en kívüli találgatás lenne.
- A Urbino tone-of-voice szerint a felület közhivatali, nem GitHub-style
  developer-velocity. Egy vezető/diszpécser napi 10-30 bejelentést kezel, ehhez
  a 3-kattintásos elérés *(LeftNav → Bejelentések → +Új bejelentés)* bőven elég.
- Egyetlen, konzisztens minta a fejlesztőknek könnyebben karbantartható.

## D-2 · 2026.05.21 · DataTable kiemelése külön tier-be — átszámozás

**Kérdés.** A DataTable a Tier-1-ben (cross-cutting organism-ek) jelentősen
komplexebb a többinél (UserChip, SettingsSection, SettingsSubNav, ConfirmDialog) —
többszöröse a felület, és a finomítások (sort, sűrűség, sor-állapotok,
bulk-action, oszlop-konfiguráció) több iterációt érdemelnek. A jelenlegi
Tier-1 review-kor padding-problémák is felmerültek a DataTable körül.

**Opciók.**
- **A — DataTable a Tier-1-ben marad**. Iteráljunk benne. Kontra: a DataTable
  finomítása blokkolja a többi Tier-1 organism véglegesítését.
- **B — DataTable új, saját tierbe** *(választott)*. A FilterPillBar és a
  TabFilter is mellé kerül (ugyanaz a screen-család). A korábbi Tier-2
  (ág-specifikus) lecsúszik Tier-3-ra, a korábbi Tier-3 (screen-specifikus)
  Tier-4-re.

**Döntés.** **B verzió.**

**Új tier-térkép.**

| Tier | Organism-ek |
|---|---|
| 0 | AppShell · PageHeader · EmptyState |
| 1 | UserChip · SettingsSection · SettingsSubNav · ConfirmDialog |
| 2 *(új)* | DataTable · FilterPillBar · TabFilter |
| 3 *(volt 2)* | StatusTrack · KpiCard · ContentEditor · WeeklyReportCard · RecipientList · PhotoUploader/Gallery · PublishStateChip |
| 4 *(volt 3)* | TriageBar · TicketMetaBar · PhotoGallery · ActivityTimeline · InternalNotesPanel · SimilarTicketsBox · ActionBar · TicketCreateForm · TeamPerformanceTable · PdfPreview · CategoryTreeEditor · IconPicker · GroupMemberList · UserPicker · UserInviteDialog · RoleEditor · LogoUploader · TenantInfoForm · RichTextEditor · CoverImageUploader · DateTimeRangePicker · LinkValidator · ReorderableList · MergeConfirmDialog · RejectionDialog · ReopenDialog |

**Hatás.**
- `tier-1.html`: a DataTable + FilterPillBar artboardok és a Bejelentés-lista
  in-context demó **eltávolítva**. A tier-1 mostantól: UserChip · SettingsSection
  · SettingsSubNav · ConfirmDialog + a Beállítások-in-context demo.
- `tier-2.html`: új fájl. DataTable + FilterPillBar + TabFilter, padding-
  finomításokkal, és a Bejelentés-lista in-context ide kerül.
- `ORGANISMS.md`: tier-besorolás frissítve.
- `SITEMAP.md`: tier-szám-hivatkozások frissítve.
- `Urbino Manager.html` (hub): 7-lépéses terv frissítve — most már 8 lépés
  (a korábbi 3 Tier helyett 4).

---

## D-3 · 2026.05.21 · DataTable sor-end: chevron-only, kebab nélkül

**Kérdés.** A `10_bejelentes_lista_es_adatlap.md` 4.2 a sor-end-en kebab menüt
említ "Megnyitás (ugyanaz explicit)" tartalommal. Mivel a row-click is `→ adatlap`,
ez funkcionálisan duplikálja önmagát. Mi legyen a sor végén?

**Opciók.**
- **A — Csak chevron, kebab nélkül** *(választott)*. A sor klikkelhető *(→ adatlap)*,
  a sor végén egyszerű `›` chevron jelzi az interaktivitást. A "másolás link",
  "új lapon megnyitás" a böngésző Ctrl/Cmd-Click + jobb-klikk natív minta.
- B — Megnyitás-only kebab *(spec szövegéből)*. Vizuális zaj, redundáns.
- C — 3-elemű kebab *(Megnyitás · Új lapon · Link másolás)*. Csak akkor ér,
  ha a navigációs akciók valódi értéket adnak. A pilot scope-ban marginális.
- D — Hover-revealed action-icons *(Hozzám rendelés ⚡ stb.)*. Jövőbeli iteráció,
  state-conditional, a `DataTable` `rowActions` propos felülete fenntartható.

**Döntés.** **A verzió.**

**Indoklás.**
- Egyetlen-elemű kebab anti-pattern: vizuális zaj, redundáns.
- A modern szabvány (Linear, Notion, GitHub Issues) chevron-only sor-end-et használ.
- A navigációs akciók (új lapon, link másolás) böngésző-natív mintákon elérhetők.
- A `Hozzám rendelés` quick-action valódi értéket adhat *(diszpécser-flow gyorsítása)*,
  de funkcionálisan státusz-művelet, nem navigáció — későbbi iterációra halasztva.

**Hatás.**
- `DataTable` organism: `rowActions` prop API-ja fenntartott jövőre; default nem rendel
  semmit a sor-end-re a chevron mellé.
- `tier-2.html` és minden lista-screen-mock: chevron-only sor-end.
- Visszajelzés a spec felé: a `10_bejelentes_lista_es_adatlap.md` 4.2 "kebab: 'Megnyitás'"
  megfogalmazás **chevron-onlyra** finomítható *(spec-szelídítés)*.

---

## D-4 · 2026.05.21 · TriageBar layout, trigger, polgári javaslat, kötelező-jelzés

**Kontextus.** A Tier-4 Bejelentés-ág első iterációja — az A1 adatlap-fej
központi `TriageBar` organism-jét építjük. A spec (`10` 4.3) az
inline-szerkesztés négy mezejét írja le (Kategória · Prioritás · Határidő ·
Felelős), de a vizuális megvalósítás kérdéses négy ponton: layout, az
inline-szerkeszthetőség jelzése, a polgári javaslat
(`citizenSuggestedCategoryLabel`) prezentálása, és az `assign`-feltételek
előjelzése. UX-explorer 4 kérdéssel, 13 opcióval.

**T-1 · Layout-pattern.**
- Opciók: A pill-sor / **B label-value (eyebrow + érték, két soros cella)** /
  C tabular (4 sor egymás alatt).
- **Döntés: B.** Vízszintes sáv egyenlő szélességű cellákkal, mindegyikben
  kis eyebrow felül + érték alul; cellák között hairline-divider.
  *Tool-szerű, adatlap-fejhez illik.* Skálázódik hosszabb értékekre
  (csoport+szerepkör, kategória-fa-út).

**T-2 · Click-to-edit trigger.**
- Opciók: A csak hoveren megjelenő affordance / **B mindig látható chevron** /
  C ceruza-ikon.
- **Döntés: B.** Minden mező végén halvány chevron — a szerkeszthetőség
  *nyugalmi állapotban is kódolt*. A chevron pontosabb jel a dropdown-/picker-
  jellegre, mint a ceruza (az inkább textarea-mintát ígér).

**T-3 · Polgári javaslat — `citizenSuggestedCategory` megjelenítése.**
- Opciók: A hint-szöveg a mező alatt / **B pre-fill amber „javasolt" tag-gel**
  / C külön banner a sáv felett.
- **Döntés: B.** A polgár javaslata előtöltve, az érték halványabb tónusú
  (még nem megerősített), mellette amber „javasolt" tag. Klikkre vagy
  megerősítés (tag eltűnik, érték sötétebb), vagy felülírás. Egy klikk
  a triage-gyorshoz; a sáv ritmusa változatlan; a riport-input
  (`citizenSuggestedCategoryId ≠ categoryId` eltérés-mérés, spec 10 5.3)
  természetes melléktermék.

**T-4 · Kötelező-mező előjelzés.**
- Opciók: A halvány piros mező + tooltip / **B subtle „· kötelező" eyebrow +
  disabled gomb-tooltip** / C banner-summary a sáv alatt / D nem jelez.
- **Döntés: B.** Az eyebrow-ba kerül diszkrét „· kötelező" suffix a két
  kötelező mezőn (Új ügyön Kategória + Felelős); az „Triage kész" gomb
  disabled, hoveren tooltip listázza, mi hiányzik. A spec elvét tükrözi:
  „a kliens előjelezheti — kényelmi réteg, nem a validáció helyettesítője"
  (10 4.3). A szerver így is `422 fieldErrors`-szal felel, ha valami kicsúszik.

**Hatás.**
- `manager-system/organisms/triage-bar.jsx` — új organism. Props: `status`,
  `category`, `citizenSuggestedCategory`, `priority`, `dueDate`, `assignee`,
  `savingField`, `openField`, `onOpen`. SD-26-szerinti `--locked` modifier.
- `manager-system/organisms/ticket-meta-bar.jsx` — új organism. Cím +
  status-chip + meta-sor (`displayId` mono-azonosítóval, ikonos
  helyszín/bejelentő/időpont).
- `_styles.css` — új `.mgr-triage-bar*` + `.mgr-ticket-meta-bar*` +
  `.mgr-rejection-banner*` szekciók.
- `preview/tier-4-bejelentes-adatlap-fej.html` — 8 állapot Hi-Fi.

## D-5 · 2026.05.21 · ActivityTimeline + InternalNotesPanel + ActionBar (Iter 2)

**Kontextus.** A Tier-4 Bejelentés-ág második iterációja — az A1 adatlap body
3 organism-je: a tevékenység-napló (sidebar), a belső jegyzet-panel (main col)
és a sticky akció-sáv (alul). UX-light explorer 6 kérdéssel — kisebb tét, mint
a TriageBar-nál, mert a specifikáció (1.4 + 1.5 + 4.3 + 4.6) erősen behatárolta
a játékteret.

**AT-1 · ActivityTimeline időbélyeg-formátum.**
- Opciók: A abszolút / B relatív / **C hibrid (relatív + tooltip-en abszolút)**.
- **Döntés: C.** Relatív főszöveg, dotted-underline jelzi az affordance-t,
  `title`-attribútum hordozza az abszolút értéket; ~7 nap után automatikusan
  átvált abszolútra. *Gyors átfutás + audit-pontosság.* Bevált pattern
  (GitHub, Linear).

**AT-2 · ActivityTimeline esemény-vizualizáció.**
- Opciók: A egységes dot + vonal / **B event-type ikon halvány színes háttéren** /
  C variánsos (átmenethez chip-pár).
- **Döntés: B.** Lucide-ikonok típusonként, a DS status-token-színekhez igazított
  háttér: státusz-átmenet kék, elutasítás piros, visszanyitás amber, merge
  violet. A 7 eseménytípus egy pillantással szétválasztható. C variáns-keveredés
  miatt elvetve.

**N-1 · InternalNotesPanel — add-mező pozíció.**
- Opciók: A form felül / **B form alul (chat-szerű)**.
- **Döntés: B.** A felhasználó először a kontextust látja, a saját jegyzet
  erre reagálva születik. *Beszélgetés-szerű* együttműködés (diszpécser↔vezető)
  természetesebb.

**N-2 · InternalNotesPanel — rendezés.**
- Opciók: **A régi → új (kronológiai)** / B új → régi (feed-stílus).
- **Döntés: A.** Konzisztens N-1B chat-form-mal: a legfrissebb jegyzet
  közvetlenül a composer mellé kerül. A „mi a legfrissebb?" kérdést a
  scroll-pozíció + relatív időbélyeg megoldja.

**AB-1 · ActionBar pozíció.**
- Opciók: **A sticky a viewport alján** / B inline a content után.
- **Döntés: A.** Konzisztens a mobil-szabállyal (SD-41), és hosszú adatlapon
  (sok fotó, hosszú timeline) is görgetés nélkül elérhető. 8% blur + 94% fehér
  háttér (DS „backdrop-filter" minta). A content kap bottom-paddinget a
  sticky-magassággal.

**AB-2 · ActionBar primer-hierarchia.**
- Opciók: **A egy primer + secondary-k** / B egyenrangú / C primer + danger.
- **Döntés: A.** Minden állapotban egy primer-akció (Új→Kiosztás,
  Kiosztva→Megkezdés, Folyamatban→Lezárás), a többi (Elutasítás, Visszaállítás)
  ghost — *jelen van, de nem provokál akciót*. Lezárt állapotban a Visszanyitás
  secondary (ritka akció). C verzió a Urbino tone-of-voice „dignified — never
  blame" elvével szembe megy.

**Hatás.**
- `manager-system/organisms/activity-timeline.jsx` — új organism. Props:
  `events`, `systemEventActor`, `title`. Eseménytípus-szerinti CSS-modifier
  (`mgr-timeline__icon--<EventType>`).
- `manager-system/organisms/internal-notes-panel.jsx` — új organism. Props:
  `notes`, `readOnly`, `composerValue`, `onComposerChange`, `onSubmit`,
  `pending`, `currentUserInitials`, `title`. `readOnly` → composer rejtve
  (field_worker).
- `manager-system/organisms/action-bar.jsx` — új organism. Props: `status`,
  `actions`, `hint`, `lockedNote`. A status-alapú default-szettet a
  `ActionBar_buildDefaultActions({status, missingFields})` helper adja;
  screen-fájl override-olhatja.
## D-6 · 2026.05.22 · SimilarTicketsBox + MergeDialog (Iter 3, A3 duplikáció)

**Kontextus.** A Tier-4 Bejelentés-ág harmadik iterációja — az A3 duplikáció-szűrés.
A spec (`20_duplikacio_es_osszevonas`) erősen behatárolja a játékteret: a doboz
4 állapotát (loading/empty/findings/error), a sorrendet (`distanceMeters`
növekvő), a 3-4 max közvetlen találatot, és a megerősítő-dialog tartalmát
(választógomb-pár, alapból régebbi, magyarázat). 6 UX-kérdéssel azokat a
vizuális részleteket fedtük, amiket a spec nyitva hagyott.

**SB-1 · Empty state.**
- Opciók: **A csendes szöveg** / B pipa-ikon + szöveg / C doboz nincs.
- **Döntés: A.** Egyetlen halvány szövegsor („Nincs hasonló nyitott bejelentés.").
  Jelzi, hogy a rendszer ellenőrzött, de figyelmet nem kér (K-033). Nem
  „silent failure" (C), és nem tévesen pozitív megerősítés (B).

**SB-2 · Találat-sor — bélyegkép.**
- Opciók: **A kép balra 56×56** / B csak szöveg / C kép jobbra mini.
- **Döntés: A.** Dominánsan a sor bal oldalán; fotó-darabszám-badge jobb-alul.
  A diszpécser kattintás nélkül hasonlíthatja a két ügy fotóját
  (`20` 3.2). Egységes ritmus a többi adatlap-elem listáival (avatar-balra).

**SB-3 · Akciók pozíció.**
- Opciók: **A mindig látható jobb-end** / B hover-revealed / C alsó gomb-row.
- **Döntés: A.** „Megnyitás" mint row-click + chevron-affordance (T-2B
  konzisztens), „Összevonás" mint mindig látható secondary gomb. Diszpécser
  az affordance-ot azonnal látja; a 30 mp triage-cél támogatott.

**SB-4 · Fejléc figyelem-jel.**
- Opciók: **A amber-tinted + ikon + count-badge** / B csak badge / C accent-border.
- **Döntés: A.** Találatok esetén amber fejléc-háttér + alert-ikon + „N találat"
  badge + 3px bal accent-border. Amber „figyelmet kér, de nem riogat" — illik
  a tone-of-voice „never blame" elvéhez. Üres / loading állapotban a fejléc
  semleges.

**MD-1 · Merge-dialog ügy-választó.**
- Opciók: **A két kártya-radio** / B sor-radio / C A-vs-B split.
- **Döntés: A.** Két kártya egymás mellett (1fr 1fr), mindegyiken role-tag
  („élő ügy → marad" / „duplikátum → lezárul"), displayId, status-chip, cím,
  beérkezés relatív+abszolút, felelős. Kijelölt kártya kék border + soft
  háttér + check. Vizuális összehasonlítás egy pillantással. A korábbi
  `MergeBody` (ConfirmDialog Tier-1-body-variant) átírva erre.

**MD-2 · Confirm-gomb tónusa.**
- Opciók: **A primer kék** / B danger piros / C warning amber.
- **Döntés: A.** Konzisztens az állapotgép-akciók kék mintájával (Assign,
  Start, Resolve). Az összevonás nem destruktív aktus — az ügy megőrződik
  mint duplikátum-rekord; a kapcsolat strukturált (`originalTicketId`),
  az activity log mindkét oldalon naplózza. A „dignified — never blame"
  elv tükre.

**Hatás.**
- `manager-system/organisms/similar-tickets-box.jsx` — új organism. Props:
  `state` ('loading'|'empty'|'findings'|'error'), `items` (SimilarTicketDto[]),
  `maxVisible` (3 default), `onOpen`, `onMerge`, `onRetry`.
- `manager-system/organisms/confirm-dialog.jsx` — `MergeBody` átírva kártya-
  radio-ra (MD-1A). Props: `ticketA`, `ticketB`, `defaultKeepId`. Belső
  state-tel kezeli a felcserélést; a parent a confirm-akcióban kapja vissza
  a `keepId`-t.
## D-7 · 2026.05.22 · TicketCreateForm + LocationPicker (Iter 4, A2)

**Kontextus.** A Tier-4 Bejelentés-ág negyedik (és záró) iterációja — az A2
manuális bejelentés-nyitás (`/bejelentesek/uj`). A spec
(`00_architektura_v4.md` 6.1, `02_globalis_allapotgep` 4.) a két create-utat
rögzíti (`New` vagy azonnali `Assigned`), de a UX-keret nyitott. 6 UX-kérdéssel
kezelük a form-elrendezést, a két create-mód közti választást, és a
LocationPicker térkép/cím viszonyát.

**F-1 · Hol jelenjen meg a form?**
- Opciók: **A külön oldal** / B modal / C drawer.
- **Döntés: A.** Saját URL `/bejelentesek/uj` — bookmarklhető, refresh-elhető,
  konzisztens a többi `/uj` flow-val (hír, program, cityinfo). A 8-10 mezős
  forma egy modal/drawer-ben szorítana; a térkép-blokk külön oldalon kényelmes.

**F-2 · Create-mód.**
- Opciók: **A két submit-gomb** / B tab-választó / C auto-detect.
- **Döntés: A.** Egy form, két submit: „Mentés vázlatként" → `status=New`;
  „Mentés és kiosztás" → `status=Assigned`, csak ha a triage-mezők kitöltöttek.
  Explicit, transzparens, egy ágy a flow-nak.

**F-3 · Mező-sorrend / csoportosítás.**
- Opciók: **A 1-oszlopos szekciók** / B 2-oszlopos / C step-flow.
- **Döntés: A.** Négy szekció egymás alatt: A probléma → Helyszín → Bejelentő
  → Triage. Természetes „mese-sorrend", konzisztens a telefonos felvétel-
  flow-val. Mobilbarát is. A térkép-blokk teljes szélességet kap.

**L-1 · LocationPicker layout.**
- Opciók: **A map-first** / B address-first / C side-by-side.
- **Döntés: A.** Nagy térkép (~240px) felül, cím-mező + koord alatta. A
  polgári bejelentések gyakran topográfiai jellegűek („a buszmegálló mellett")
  — a térkép-vizualizáció jobban támogatja a diszpécsert, mint az
  utca/házszám-autocomplete.

**L-2 · Pin-mozgatás módja.**
- Opciók: A click / B drag / **C mindkettő** / D csak autocomplete.
- **Döntés: C.** Leaflet-default mind a kettőre — click az első placeolásra,
  drag a finomhangolásra. Implementáció-költség azonos, ergonómia mindkettőé.

**L-3 · Reverse geocoding időzítése.**
- Opciók: **A automatikus** / B manuális gomb / C hybrid toggle.
- **Döntés: A.** Pin minden mozgására debounced (~400ms) auto-geocode.
  Override-pattern: ha a felhasználó kézzel írt át, az override megmarad a
  következő pin-mozgásig. Külön toggle nem szükséges (a kézi-írás magától
  jelzi a szándékot).

**Hatás.**
- `manager-system/organisms/map-widget.jsx` — új organism. A Tier-3.5-ben
  inline lévő MapWidget kiemelve önálló fájlba a LocationPicker miatt. Props:
  `mode` ('view'|'picker'), `lat`, `lng`, `status`, `popupContent`, `zoom`,
  `containerClass`, `onLocationChange`. Két fogyasztó: SimilarTicketsBox
  (jövőben adatlap-térkép) és LocationPicker.
- `manager-system/organisms/location-picker.jsx` — új organism. Props:
  `value` ({lat, lng, addressText}), `onChange`, `onGeocode` (mock vagy
  Nominatim), `allowGps`, `mapZoom`, `pinStatus`. Auto-geocode override-
  pattern-nel.
- `manager-system/organisms/ticket-create-form.jsx` — új organism. 4
  szekció (A probléma · Helyszín · Bejelentő · Triage), sticky ActionBar két
  submit-gombbal. Triage-szekció toggle-vel kibontható; ha kibontva, a
  TriageBar (Iter 1) read-only mock-ban renderel. Submit-szabályok: vázlat
  bármikor (cím kell), kiosztás csak teljes triage-vel.
- `_styles.css` — új `.mgr-map*` (Tier-3.5-ből áthozva), `.mgr-loc-picker*`,
  `.mgr-tcf*` szekciók.
- `preview/tier-4-uj-bejelentes.html` — 4 form-állapot Hi-Fi + 1 standalone
  LocationPicker (élő Leaflet + state-readout).

**A Bejelentés-ág lezárása.** A Tier-4 Bejelentés-ág 4 iterációja
(TicketMetaBar+TriageBar · Timeline+Notes+ActionBar · SimilarTicketsBox+
MergeDialog · TicketCreateForm+LocationPicker) az A1/A2/A3 feature-eket
fedi. Következik a Beállítás-ág (CategoryTreeEditor + UserInviteDialog +
RoleEditor + a 10-bundle).

## D-8 · 2026.05.22 · CategoryTreeEditor + IconPicker + ImportDialog (Iter 5, A6)

**Kontextus.** A Tier-4 Beállítás-ág első iterációja — `/beallitasok/kategoriak`
fő szerkesztője. A spec (`30_beallitasok` 4.2 + SD-62/63/64 + K-008/036) a
feature gerincét eldönti: csoportosított fa-lista (gyökér mint fejléc,
alkategóriák alatta), inline `name`-szerkesztés (K-026), `isActive` toggle
azonnali, „Új gyökér" csak default-katalógusból (SD-62), törlés kebab-rejtett
(deaktiválás elsődleges, SD-63), reorder szülő-hatókörben (SD-64).

A spec által nyitva hagyott UX-kérdésekhez 4 explorer-kérdést indítottunk.

**C-1 · Reorder UX.**
- Opciók: **A drag-drop fogantyúval** / B ↑/↓ gombok / C "Sorrend mód" toggle.
- **Döntés: A.** Bal-szélen ⋮⋮ grip-handle; csak a szülő hatókörén belül
  engedi (SD-64). 3-7 alkategóriás tipikus eseten gyors, ergonomikus.
  A modeswitch (C) felesleges overhead a Urbino pilot havi-rendszerű
  átrendezéséhez.

**C-2 · IconPicker megjelenése.**
- Opciók: **A inline popover** / B modal + kereső / C csak az
  új-alkategória-modal-form része.
- **Döntés: A.** Az ikon-cella maga interaktív, kattintásra a sor alatt
  ~280px-es 6×N paletta nyílik. Outside-click + Escape zár.
  Konzisztens a K-026 inline-szerkesztés mintájával (`name`-mezővel). A
  pilot-szett ~20 ikonra modal-overhead aránytalan.

**C-3 · Default-import dialog.**
- Opciók: A egyszerű radio-list / **B preview-kártyák** / C stepper.
- **Döntés: B.** Minden default-gyökér egy kártya, az alkategóriái
  chip-ekként előtte. A vezető pontosan látja, mit kap az import során
  (3.1.4 — minden leszármazott behozva). Egy kattintás a választás; a gomb-
  felirat is konkrét („Parkok és zöldterületek importálása") feedback-et ad.

**C-4 · Sor-akciók vizibilitás.**
- Opciók: **A mindig látható** / B hover-revealed / C csak kebab.
- **Döntés: A.** Toggle + ceruza + kebab végig láthatóan. A toggle
  (isActive) fontos state-jelző, hovera-bujtatva elveszne. Konzisztens a
  manager-pattern-nel (TriageBar always-chevron, SimilarTicketsBox
  always-right).

**Hatás.**
- `manager-system/organisms/category-tree-editor.jsx` — új organism. Props:
  `categories` (flat list), `onUpdate`, `onCreate`, `onReorder`, `onDelete`,
  `onOpenImport`, `showInactive`, `onToggleShowInactive`. Inline `name`-
  szerkesztés Enter/Esc-kel; inline IconPicker minden ikon-cellán;
  csoportosított fa-szekciók gyökerenként; per-szekciós „Új alkategória"
  inline-add row.
- `manager-system/organisms/icon-picker.jsx` — új organism. Props: `iconSet`,
  `selected`, `onSelect`, `onClose`, `style`, `title`. Outside-click + Escape
  kezelés. Default 20 emoji-stílusú placeholder ikon; valós deployment
  Lucide-ikonokra cserélheti. Plusz `window.iconGlyph(key)` helper az
  organism-ek közös ikon-feloldására.
- `manager-system/organisms/category-import-dialog.jsx` — új organism.
  Props: `open`, `availableRoots`, `onConfirm`, `onCancel`, `pending`.
  Preview-kártyák, konkrét gomb-felirat („Parkok és zöldterületek
  importálása"). Üres állapot („Minden default-gyökér már importálva van").
## D-9 · 2026.05.22 · UserInviteDialog + RoleEditor + UserDetailPage (Iter 6, A8)

**Kontextus.** A Tier-4 Beállítás-ág második iterációja — `/beallitasok/felhasznalok`
adatlap + meghívó-flow. A spec (`20_felhasznalokezeles`) erősen behatárolja a
feature gerincét: a `Tier-2` `DataTable` kínálja a listát, a `ConfirmDialog`
mintára épül a meghívó-modal, a `[validationForm]`-minta adja a field-error-
megjelenítést. UX-nyitott 4 ponton: invite-layout, role-editor megjelenése,
adatlap szerkesztés-pattern, invariáns-előjelzés.

**UD-1 · UserInviteDialog layout.**
- Opciók: **A lineáris + role-szekció kiemelt** / B sima form dropdown-nal / C 2-step wizard.
- **Döntés: A.** A három mező egymás alatt, a szerepkör-szekció halvány
  amber-tinted blokkban kiemelve. A spec szerinti "POST /v1/users/invite"
  workflow (User + UserTenantRole + UserInvitation egyben) egy modal-on belül.

**UD-2 · RoleEditor megjelenése.**
- Opciók: **A role-rows leírással** / B sima checkbox-cluster / C 2×2 kártya-rács.
- **Döntés: A.** Minden szerepkör külön sor, 1 mondat magyarázattal. Új tenant-
  felvételkor a vezetőnek nem kell külön dokumentációba lapoznia. A négy `TenantRole`
  enum-érték a `05_jogosultsagok_v2.md` 1. szerint termékesített — fix sorrendben.

**UD-3 · Adatlap-szerkesztés.**
- Opciók: **A inline-szekciónkénti 'Szerkesztés'** / B modal-form / C edit-mode.
- **Döntés: A.** Mind a 3 szekció (Alapadatok / Szerepkörök / Csoporttagság) saját
  „Szerkesztés" gombja. Konzisztens a TriageBar inline-mező-mintával (K-026).
  A „Csoporttagság" szekciónál a szerkesztés a Csoportok-oldalra utal, mert ott él
  a `Group.members` n-n kapcsolat (`30_beallitasok.md` 6.2).

**UD-4 · Invariáns-előjelzés.**
- Opciók: **A disabled checkbox + tooltip** / B inline-banner / C nem előjelez.
- **Döntés: A.** Az SD-38 három invariánsa (≥1 szerep, utolsó-manager-tilos,
  saját-kizárás-tilos) a `RoleEditor.locks` propon át. A zárolt checkbox nem
  klikkelhető, „zárolt" tag jelzi, hovera tooltip magyaráz. Saját-deaktiválás:
  a gomb `disabled` + tooltip ugyanazon mintával. Spec elve: „a kliens
  előjelezheti — kényelmi réteg, nem a validáció helyettesítője" (a `Mentés`
  ettől függetlenül `422`-zik).

**Hatás.**
- `manager-system/organisms/role-editor.jsx` — új organism. Props: `value`,
  `onChange`, `locks` (per-role lock-objektum reason-message-szel), `readOnly`
  (adatlap chip-megjelenítéshez). 4 szerepkör magyarázattal a `ROLE_INFO`
  konstansból.
- `manager-system/organisms/user-invite-dialog.jsx` — új organism. Props:
  `open`, `value` ({displayName, email, roles}), `onChange`, `onConfirm`,
  `onCancel`, `pending`, `fieldErrors`, `inPlace`. Hárommezős lineáris form,
  beágyazott RoleEditor-rel. ConfirmDialog-mintára épülve, `u-dialog--md` méret.
- A `UserDetailPage` composition (preview-HTML-en belül) a 3 szekciót
  inline-szerkeszthetőként rendereli, fiók-akció-soron a state-szerinti
  gombokkal (Meghívó újraküldése / Deaktiválás / Reaktiválás), saját-utolsó-
  manager `disabled` + tooltip pattern-nel.
## D-10 · 2026.05.22 · GroupMemberList + UserPicker + GroupDetailPage (Iter 7, A7)

**Kontextus.** A Tier-4 Beállítás-ág harmadik iterációja — `/beallitasok/csoportok`
adatlap. A spec (`30_beallitasok` 4.3) a feature gerincét rögzíti: standard
`TableStateConfig` a listán, `Group ↔ TenantUser` n-n kapcsolat
`[ManyToManyConnection]`-nel, multiselect chip-szerű választó autocomplete-tel,
csak `Active` `TenantUser` választható, delete-guard. UX-nyitott 4 ponton:
edit-pattern, tag-megjelenítés, picker-interakció, remove-confirm.

**G-1 · Csoport-adatlap szerkesztés-pattern.**
- Opciók: **A inline-szekciók (A8-konzisztens)** / B modal-edit (spec-literal).
- **Döntés: A.** A spec 4.3.2 modal-formát javasol, de a D-9 (A8 felhasználó-
  adatlap) inline-szekciónkénti szerkesztést kapott — a Beállítás-ág
  konzisztenciája fontosabb, mint a spec-literál pontosság. Két szekció:
  Alapadatok (név + audit) és Tagok. Külön „Szerkesztés" gomb mindkettőn.
  Spec-szelídítés a 4.3.2-höz: a modal-form ugyanaz, csak inline-szekcióban
  élesedik.

**G-2 · GroupMemberList tag-megjelenítés.**
- Opciók: **A row-lista** / B chip-felhő / C 2-oszlopos rács.
- **Döntés: A.** Soronkénti row-lista: avatar + név + szerepkör + remove-X
  (edit-mode-ban). A szerepkör (mit csinál a tag más kontextusban) informatív
  többlet. Konzisztens a manager-pattern-nel (A8 user-lista, A1 timeline).

**G-3 · UserPicker — tag-hozzáadás interakciója.**
- Opciók: **A inline autocomplete** / B modal-választó-dialog / C multi-select
  chip-input.
- **Döntés: A.** A szerkesztő-üzemben autocomplete-input a tag-lista alatt;
  gépelésre dropdown nyílik soronkénti „+ Hozzáadás" gombbal. Diakritika-
  érzéketlen contains-keresés (név + szerepkör). A spec szerinti „Active
  TenantUser" szűrés explicit hint-ben (a meghívottak nem választhatók). A
  picker önálló organism — máshol is fogyasztható.

**G-4 · Remove-member megerősítés.**
- Opciók: **A direkt remove + undo-toast** / B ConfirmDialog.
- **Döntés: A.** A tag-eltávolítás reverzibilis aktus (a
  `Ticket.assignedGroupId` változatlan). X-klikkre azonnali remove, 5s-os
  toast „Visszavonás" linkkel. Csak destruktív akciókra (user-törlés,
  bejelentés-elutasítás) érdemes ConfirmDialog. Konzisztens a Toast-mintával
  (Tier-3.5).

**Hatás.**
- `manager-system/organisms/user-picker.jsx` — új organism. Props: `users`,
  `selectedIds`, `onAdd`, `placeholder`, `allowedStatuses`, `query`,
  `onQueryChange`, `emptyHint`. Diakritika-érzéketlen kereső, autocomplete-
  dropdown, soronkénti „+ Hozzáadás". Pilot deployment a `GET /v1/lookup/
  tenant-users` lookup-end-pointot fogyaszthatja.
- `manager-system/organisms/group-member-list.jsx` — új organism. Props:
  `members`, `editMode`, `candidates`, `onRemove`, `onAdd`. Edit-mode-ban
  remove-X soronként + beágyazott UserPicker. Read-mode olvasható
  row-lista. Üres állapot saját placeholder-rel.
- A `GroupDetailPage` composition (preview-HTML-en belül) az A8
  user-detail mintát követi (`.mgr-user-detail*` újrahasználva), a
  csoport-specifikus avatar (`.mgr-group-detail__avatar` violet-tonon).
  Interaktív S01 artboard demónálja az élő szerkesztés + undo-toast flow-t.
## D-11 · 2026.05.22 · TenantInfoForm + LogoUploader + RecipientList (Iter 8, A9)

**Kontextus.** A Tier-4 Beállítás-ág negyedik (és záró) iterációja —
`/beallitasok/altalanos` mind a három szekciója. Spec: `30_beallitasok` 3.3 +
4.4 (három logikai szekció: tenant-settings, logó, riport-címzettek). A
`RecipientList` korábban Tier-3-ban inline definíció volt; Iter 8-ban kiemelve
önálló organism-fájlba.

**T-1 · Locked-mezők kezelése.**
- Opciók: **A locked input + info-tooltip** / B read-only InfoRow / C külön
  „Rendszer-adatok" szekció.
- **Döntés: A.** A `code`, `displayPrefix`, `timeZone` ugyanabban a
  layout-pozícióban marad, mint a szerkeszthető mezők — háttér halvány +
  lock-tag a label mellett + magyarázó hint (urbino_admin hatáskör).
  Folyamatos vizuális rend, jól strukturált egységként mutatja a
  Tenant-szekciót.

**L-1 · LogoUploader üres állapot.**
- Opciók: **A drop-zone + tallózás link** / B csak gomb.
- **Döntés: A.** Nagy invitáló drop-zone terület, klikk = file-picker, „tallózz"
  link mint vizuális megerősítés. Drag-drop + click ugyanazt a `POST .../logo`
  multipart végpontot fogyasztja. Format és méret-hint előre szóló.

**L-2 · LogoUploader feltöltött állapot.**
- Opciók: **A preview + 'Csere' / 'Törlés' gombok** / B drag-on-top.
- **Döntés: A.** Logó-thumbnail + meta (fájlnév, feltöltési idő, méret) +
  explicit gombok. „Csere" újra file-picker; „Törlés" piros ghost gomb
  (`DELETE .../logo`). Felfedezhető — a vezető nem kell tudja, hogy ráhúzhat.

**R-1 · Recipient empty state.**
- Opciók: **A informatív card + 'Saját e-mail' shortcut** / B sima EmptyState.
- **Döntés: A.** Amber-tinted card (mint SimilarTicketsBox findings-fejléc,
  D-6/SB-4A) magyarázattal + két shortcut: „Saját e-mailem felvétele" (1
  klikk, pre-fill) és „Új címzett". A spec szerint a vezető nem kerül be
  automatikusan a listára — a UI ezt szabványos pilot-élménnyé teszi.

**Hatás.**
- `manager-system/organisms/tenant-info-form.jsx` — új organism. Props:
  `value`, `onChange`, `editing`, `fieldErrors`. 7 mező 3 locked + 4
  szerkeszthető. Spec szerinti hint-szövegek a contact-mezőkön (pl.
  „a polgári app Ügyfélszolgálat szekciójában jelenik meg").
- `manager-system/organisms/logo-uploader.jsx` — új organism. Props:
  `logoUrl`, `logoMeta`, `fallbackText`, `onUpload`, `onDelete`, `pending`,
  `uploadError`, `readOnly`. Két fő állapot (üres = dropzone, kitöltött =
  preview); a host adja a multipart-feltöltés tényleges flow-ját. Drop +
  click + file-input mindhárom inputon működik. Fallback gradient (initials)
  ha az URL nem renderelhető (`__fallback__`).
- `manager-system/organisms/recipient-list.jsx` — új organism. A
  tier-3-recipient.html inline definíciója kiemelve. Props: `recipients`,
  `editingId`, `readOnly`, `onAdd`, `onEdit`, `onRemove`, `onToggleActive`,
  `onEditSave`, `onEditCancel`, `emptyComponent` (a host R-1A
  informatív-card-ot átadhat). A switch-toggle / inline-edit / remove
  pattern változatlan.
- `_styles.css` — új `.mgr-rec*` (Tier-3-ból áthozva), `.mgr-tif*`,
  `.mgr-logo*` szekciók.
- `preview/tier-4-altalanos.html` — 5 artboard (1 interaktív + 4 statikus
  állapot).

## D-12 · 2026.05.22 · KpiCard + TeamPerformanceTable + DashboardPage (Iter 9, A4)

**Kontextus.** A Tier-4 Riport-ág első iterációja, és egyúttal a Tier-4
záró iterációja. A spec (`40_riport` 3.2 + 4.1) szigorúan prescriptív:
3 blokk (4 KPI-kártya + csapat-tábla + heti riport letöltő), chartok
nincsenek (40 3.2), Wow #2 lefúrás — minden szám link a /bejelentesek
listára előszűrve (40 3.3). UX-explorer **elhagyva**: a spec a vizuális
döntéseket lényegében előírja.

**Bake-in döntések.**
- KPI 4×1 grid (`grid-template-columns: repeat(4, 1fr)`), 960px alatt
  2×2 (CSS media-query, mobil-bevarrt szabály).
- A KPI-kártya egész kattintható (`<a href>` vagy `<button onClick>`),
  hover-on chevron-affordance — konzisztens a TriageBar always-chevron
  mintával (D-4/T-2B).
- Danger tone = piros bal-border + piros érték (a Késésben KPI-hoz).
  Az érték `tabular-nums` family-font (DS `--u-font-display`).
- TeamPerformanceTable saját stílusú grid-row (`.mgr-tpt__head` +
  `.mgr-tpt__row`); nem a generikus DataTable, mert a 4-oszlopos numerikus
  fókusz speciális (Wow #2 név-link + szám-link cellánként). Az átlag-
  lezárási idő hiányzó adatra `—` (mute), egyébként „2,3 nap"-formátum
  vesszős magyar tizedessel.
- Empty team-table: informatív, „Még nincs aktív terepi dolgozó."
  üzenettel — pilot-élmény.

**Hatás.**
- `manager-system/organisms/kpi-card.jsx` — új organism (Tier-3-ból
  kiemelve). Props: `label`, `value`, `hint`, `tone` (`default`|`danger`),
  `delta` ({dir, label}), `href`, `onClick`. A delta-ikon szín-érzéketlen
  (↑/↓ irány), a fg-szín kontextus-szerű (`up` = piros, `down` = zöld).
- `manager-system/organisms/team-performance-table.jsx` — új organism.
  Props: `rows` ({id, displayName, initials, role, closedThisWeek,
  inProgress, avgResolutionDays}[]), `hrefForUser` (default URL-épitő
  → /bejelentesek pre-filtered). Empty állapotot helyben kezeli.
- A `DashboardPage` composition (preview-HTML-en belül) a PageShell mintát
  követi (eyebrow + cím + üdvözlő-sor) és 3 szekcióból áll. A „Heti riport"
  szekció a `WeeklyReportCard` Tier-3-as organism-jét (vagy egy egyszerű
  inline-card-ot) fogyasztja — itt a kompakt inline-változat szerepel.
- `_styles.css` — új `.mgr-kpi*`, `.mgr-tpt*`, `.mgr-dash*` szekciók
  (Tier-3-ból átvonatkoztatva + finomítva).
- `preview/tier-4-dashboard.html` — 3 artboard: teljes dashboard +
  üres-team-tábla állapot + standalone KpiCard-variációk.

**A Tier-4 lezárása.** Az Iter 1-9 az összes feature-szintű organism-et
fedi. A spec szerinti A1–A12 közül A1+A2+A3+A6+A7+A8+A9+A4 teljes; az
A5 (riport-archívum lista + adatlap) lényegében a Tier-3
WeeklyReportCard + DataTable kompozíciója, screen-fázisban (8. lépés)
megépítendő. A tartalom-ág (A10+A11+A12) a Tier-3 ContentEditor-re
épül.

**Hátralévő:** 8. lépés (screen-mock-ok) + 9. lépés (átadási csomag).
Új chatben folytatandó tisztább kontextussal.

## D-13 · 2026.05.22 · DataTable contract-bővítés (audit-meneti retrofit)

**Kontextus.** A 2026.05.22 záró audit (`AUDIT.md`) a 6. fejezetben jelezte, hogy
a `tier-2.html` Hi-Fi katalógus saját inline `DataTable`-t használ — `tickets`
prop, `sortKey`/`sortDir`/`SortableTh`-affordancia, `dimResolved` halványítás,
`loading` overlay meglévő adat felett —, miközben az
`organisms/data-table.jsx` fájl-szinten csak a minimális vázat őrzi (`columns`+`rows`,
basic skeleton, no sort, no row-click). A user a screen-A1-list építését készítve
észrevette, hogy a sorting nincs a kanonikus contract-ban. Az audit-mátrix 5
hiányzó funkciót azonosított, mindegyik a Tier-2 UX-explorer bakelve döntéseiből
maradt el a fájl-szintű organism-átemelésnél.

**Hiányzó funkciók.**
1. **Sortable fejléc-cellák** (T-4: always-visible ⇅, aktívan ▲/▼) — a `columns[].sortable`
   prop a doksiban szerepelt, de a JSX sose renderelte az affordanciát.
2. **Controlled sort-state** — `sortKey`, `sortDir`, `onSortChange(key, dir)` propok.
   Default sort spec szerint: `createdAt DESC` minden tabon, `dueDate ASC` az overdue-on.
3. **`onRowClick(row, event)`** — D-3 sor-klikk → adatlap navigáció. A korábbi
   organism csak `is-clickable` class-t adott, de no-op volt.
4. **`rowClassName(row) => string`** — per-row class hook a T-7-szerű
   dim Lezárt/Elutasítva pattern-hez, generikusan (nem `dimResolved` boolean-ként).
5. **T-9 loading-overlay** — `loading=true && rows.length > 0` → meglévő sorok
   halványítva + spinner-pill overlay (NEM full skeleton-csere). A skeleton-csere
   csak az initial-load-ra (`loading && rows.length === 0`) marad.

**Döntés.** Mind az 5 funkciót retrofitelve az `organisms/data-table.jsx`-be,
visszamenőleg a D-2/D-3/Tier-2-UX-explorer döntéseire hivatkozva — nem új UX-decizió,
hanem **a meglévő bake-in-ek átemelése a kanonikus organism-szintre**. A `tier-2.html`
katalógus-fájl változatlanul él (vizuális demó), de a `tier-2-datatable-contract.html`
referencia-preview kibővítve mind az 5 funkció bemutatására — a screen-fázis
fejlesztője ezt látja a kanonikus contract-nak.

**Hatás.**
- `organisms/data-table.jsx`: signatura kibővítve `sortKey` + `sortDir` +
  `onSortChange` + `onRowClick` + `rowClassName` + `showRowChevron` proppokkal;
  loading-overlay viselkedés `rows.length > 0` esetén; `Pagination` `onChange`-e
  most átengedi a `page` és `perPage` változásokat.
- `_styles.css`: új `.mgr-data-table__th--sortable` (+ `.is-sorted` modifier,
  ⇅/▲/▼ sort-icon szín), `.mgr-data-table__row--dim`, `.mgr-data-table__scroll.is-dimmed`,
  `.mgr-data-table__overlay` + spinner. A meglévő `.mgr-data-table__skeleton-row`
  shimmer-animáció érintetlen.
- `preview/tier-2-datatable-contract.html`: 6 szekció (default sorted + filtered
  default-sort + compact + loading-initial + loading-overlay + empty). A default
  szekció kliens-oldali sort-mockkal él, hogy a kattintós sort tényleg
  átrendezze a sorokat.
- `ORGANISMS.md` § Tier-2 DataTable szekció: full prop-tábla + sort viselkedés +
  loading viselkedés magyarázat.

**Nem a D-13 része.** A `tier-2.html` Hi-Fi katalógus inline DataTable-jét NEM
írtuk át a fájl-szintű organism-re — a katalógus vizuális UX-demónak marad meg
(T-1..T-9 döntések bemutatása). A 8. lépés első screen-mock-ja (`app/bejelentesek-lista.html`)
és a Tier-2-contract-demo a kanonikus fájl-organismet fogyasztja.

---

## D-14 · 2026.05.22 · Settings-nav Pattern N — SettingsSubNav elhagyva, LeftNav 4 leaf

**Kontextus.** A 8. lépés (screen-mock-ok) kezdetekor, az S6.5 explorer során
derült ki, hogy a Beállítások 4 sub-screenje (Általános · Kategóriák · Csoportok
· Felhasználók) **két helyen jelenik meg** a navigációban: a LeftNav-ben mint
4 settings-leaf, **és** a `SettingsSubNav` underline-tabsorral a content-fejlécben.
Ugyanaz a 4 destination, két helyen — duplikáció, és az iOS Settings-szerű
"Settings → sub-page" hierarchia helyett rögtön a négy egyenrangú leaf-re
landolunk a LeftNav-ból. A `SettingsSubNav` redundáns.

**Opciók (S6.5 explorer).**
- **G — LeftNav 1 item + SettingsSubNav 4 tab.** Hagyományos hierarchia:
  Beállítások szülő-item, alatta a 4 sub-page tabként. iOS Settings-szerű.
- **N — LeftNav 4 leaf + SettingsSubNav törölve** *(választott)*. A 4 sub-page
  egyenrangú navigációs leaf, közvetlenül a LeftNav-ban. Egy hely, egy kattintás.
- **C — Marad mindkettő.** *(ellenjavasolt — duplikáció megmarad)*

**Döntés.** **N verzió.**

**Indoklás.**
- A LeftNav már most 4 settings-leaf-et szállít (`navItems` lista a `data/mock.js`
  + `app-shell.jsx`). A `SettingsSubNav` ehhez ugyanazt a 4 destinationt rendelte
  hozzá másodszor — ez minden screen-megnyitáskor 2 location-affordance-t
  rajzol fel. A felhasználó-orientált *"hol vagyok?"* kérdést kétszer válaszolja
  meg.
- A pilot scope-ban (4 sub-screen) a hierarchiát nem indokolja a screen-szám.
  Ha később új sub-screenek jönnek (pl. Webhook-ok, API-kulcsok, Pénzügy),
  akkor másodjára átléphetünk G-pattern-re ↔ szándékos halasztás.
- Implementációs egyszerűsítés: a `SettingsSubNav` organism-fájl (+ CSS) törlés
  helyett **megőrződik a kódban**, de **a screen-fájlok nem fogyasztják**.
  A jövőbeli G-pattern-re visszatérés trivi.

**Hatás.**
- `SettingsSubNav` organism-fájl változatlan (a Tier-1 katalógusból nincs törölve),
  de a 4 settings-screen (A6/A7/A8/A9) Hi-Fi mock-fájljai **nem importálják**
  és nem rendererelik.
- A `tier-1.html` katalógus változatlanul mutatja a `SettingsSubNav` specimentét
  — referencia-célra megőrződik.
- Spec-szelídítés a `30_beallitasok` 4.1-hez: a spec tab-szerű sub-nav-ot
  javasol; a Pattern N spec-felé visszacsatolandó (a `SPEC-FEEDBACK.md`
  Phase 1.4 mellékterméke).
- D-13 (DataTable-retrofit) és D-14 (Settings-nav) **konkurensen** kerültek
  döntésre — mindkettő 2026.05.22-i, a sorszámolás kódolási sorrendben történt.

---

## D-15 · 2026.05.24 · DateTimeRangePicker — két külön input (Pattern A)

**Kontextus.** Az A11 (Városi programok) szerkesztő-screenje a spec szerinti
SD-69 kötelező időtartam-mezőt jeleníti meg. A `DateTimeRangePicker` korábban
nem létezett, az S13 explorer során 3 mintát mértünk fel.

**Opciók (S13 explorer).**
- **A — Két külön input** *(választott)*. Kezdés + Vége egymás mellett,
  mindegyik saját `<input type="datetime-local">` natív popoverrel. Plusz
  "azonos napon" detektor: ha mindkét érték ugyanarra a napra esik, egy
  hint-sor jeleníti meg `"Azonos napon · 2026. máj. 24. szombat, 14:00–17:00"`
  formában.
- B — Single-panel kettős-naptár. Egyetlen popover-ben két naptár-rács +
  két idő-mező; pilot-implementáció költsége többszörös, az ergonomikus
  haszon a programok többségére (azonos-napon-rendezvény) marginális.
- C — Natív böngésző-input pár wrapper nélkül. UI-ról-UI-ra inkonzisztens
  megjelenés.

**Döntés.** **A verzió.**

**Indoklás.**
- A városi programok többsége azonos napon van (1-3 óra hosszú); a "azonos
  napon" detektor + hint-sor a leggyakoribb esetet egyértelművé teszi anélkül,
  hogy a felhasználónak két naptár-rácsot kelljen szinkronban tartania.
- Implementációs költség: két `<input>` + 1 formátum-helper (`fmtDate`/`fmtTime`)
  + 1 detektor-sor. Külső lib nem szükséges (Pilot-elv: első körben natív, ha
  szükséges, később váltunk).
- Konzisztens az SD-69 spec-vel (a kötelezőség az `endAt > startAt` invariánssal
  él, ami a B mintát NEM zárja ki, de NEM is követeli).

**Hatás.**
- `manager-system/organisms/date-time-range-picker.jsx` — új organism. Props:
  `value` ({startAt, endAt}), `onChange`, `minDate`, `error`, `startError`,
  `endError`. `DateTimeField` belső sub-component a két mezőt egységes módon
  jeleníti meg (label + datetime-local input + magyar hosszúdátum-display).
- `_styles.css` — új `.mgr-dtp*` szekció (`.mgr-dtp__field`,
  `.mgr-dtp__field--error`, `.mgr-dtp__same-day-hint`).
- `preview/screens/s13-datetimerangepicker-explorer.html` — UX-explorer
  3 mintával (A/B/C).
- A11 szerkesztő-screen-mock (`a11-programok-szerkeszto.html`) az
  `extraFields` propon át kapja a `DateTimeRangePicker`-t a `ContentEditor` héjban.

---

## D-16 · 2026.05.24 · A4 Dashboard — spec-konform újraépítés (S9 revízió)

**Kontextus.** A D-12 (Iter 9, A4 dashboard) első implementáció során a
Tier-4 dashboard-preview több spec-en kívüli elemet vezetett be: KPI-kártyán
"+5 múlt héthez képest" delta-érték, hét-választó nyilak a fejlécben,
inline-kompakt `WeeklyReportCard` a dashboard-content alján, "Csapat-teljesítmény"
elnevezés. A 8. lépés screen-mock-fázisában az A4 spec-konform újraépítésen
ment át a `40_riport.md` 3.2 és 4.2 alapján.

**Mit törlünk.**
1. **KPI-delta** ("+5 múlt héthez képest" érték) — a spec NEM ír delta-mérést;
   a 4 KPI snapshot-szám (`openTickets`, `newTicketsToday`, `overdueTickets`,
   `closedToday`), nem trend. Wow #2 lefúrás megmarad (egész kártya kattintható).
2. **Hét-választó nyilak** a fejlécben — a spec szerint a dashboard **mindig
   az aktuális hét snapshot-ját** mutatja; archív hetek a `/riportok`
   adatlapokon. A hét-nyilak ezt szándékosan elmosnák.
3. **Inline `WeeklyReportCard` szekció** — a `40_riport.md` 4.2 szerint a
   riport-letöltés a fejléc CTA-jából megy a `/riportok/details/<currentId>`-re.
   Inline kompakt-kártya feleslegesen duplikálja az archívum-screen funkcióját.

**Mit megerősítünk.**
4. **"Heti riport letöltése" CTA a fejlécben** (jobbra, `PageHeader.actions`-be) —
   a spec 4.2 explicit ezt írja elő. Ikonos secondary-gomb.
5. **"Terepi csapat-teljesítmény" elnevezés** — a `40_riport.md` 3.2.2 erre
   tekint mint a `roles ∋ field_worker AND status = Active` szűrésre. Pontosabb,
   mint a generikus "Csapat".
6. **`isTopPerformer` jelölés** — a `40_riport.md` 3.2.2 szerint a sor jobb
   végén a hét csillaga (`max(resolvedThisWeek)` egy-tagú szűrés esetén)
   vizuális jelzéssel. A `TeamPerformanceTable.rows[].isTopPerformer: boolean`
   az új prop.

**Hatás.**
- `manager-system/organisms/kpi-card.jsx` — `delta` prop **deprecated**
  (a propsignature megmarad backward-compat-ből, de a screen-mock-fájl nem
  adja át). A dokumentációs hivatkozás (`ORGANISMS.md`) ezt rögzíti.
- `manager-system/organisms/team-performance-table.jsx` — `rows[].isTopPerformer`
  új mező, a sor jobb-szélén egy csillag-glyph + "A hét teljesítménye" tooltip.
- `preview/screens/a4-fooldal.html` — `PageHeader.actions` a "Heti riport
  letöltése" CTA-val, a `WeeklyReportCard` inline szekciója törölve, a
  hét-választó nyilak törölve.
- D-12 dokumentációja **változatlan** (történeti) — a D-16 a felülvizsgálati
  delta, nem felülírás.

---

## D-17 · 2026.05.22 · ContentEditor publish-bar gomb-sorrend

**Kontextus.** A `ContentEditor` (D-13/ORGANISMS Tier-3) publish-bar 3 gombot
hordoz: **Eldobás** (a piszkozat-változtatások visszavonása), **Vázlat-mentés**
(state változatlan), **Publikálás** (state → `published`). A 8. lépés A10/A11/A12
szerkesztő-screen-mock-jainak építésekor merült fel, hogy a 3 gomb sorrendje és
csoportosítása nem triviális — két csoport (destruktív + nem-destruktív) eltérő
hierarchiát feltételez.

**Opciók.**
- A — [Eldobás] [Vázlat-mentés] [Publikálás] balról jobbra mind egyben.
- **B — [Eldobás] balra · [Vázlat-mentés] [Publikálás] jobbra** *(választott)*.
  A destruktív akció vizuálisan elválik (bal-szél, danger-szín), a kettő nem-
  destruktív akció jobbra szervezve, a primer Publikálás a sor jobb-végén.
- C — [Eldobás] [...] [Vázlat-mentés] [Publikálás] alapok közé feszítve
  (justify-content: space-between). Vizuálisan zavaros.

**Döntés.** **B verzió.** A `mgr-editor__pub-bar` CSS-en `flex: 1` spacer
választja el a bal- és jobb-csoportot.

**Indoklás.**
- F-pattern olvasás-irány: a felhasználó a sor bal-szélén látja az Eldobás-t
  (ritka, destruktív), a jobb-szélén a Publikálás-t (gyakori, primer akció).
  A kettős-csoport vizuálisan kódolja a hierarchiát.
- Konzisztens a Urbino tone-of-voice "dignified — never blame" elvével: a
  destruktív akció nem versenyez a nyugodt Vázlat-mentés/Publikálás párral.
- A merge/rejection-mintával (Tier-1 `ConfirmDialog` Mégse | Confirm) is
  konzisztens: destruktív balra, megerősítő jobbra.

**Hatás.**
- `organisms/content-editor.jsx` `editorPane` JSX — `{onDiscard && (...)}` bal
  oldal, `<span style={{ flex: 1 }} />` spacer, jobb oldal két gombbal.
- A10/A11/A12 szerkesztő-screen-mockok mind ezt fogyasztják.


---

## D-18 · 2026.05.26 · A2 Manual-eredet PhoneBanner — D-7 retrofit F-4 alponttal

**Kontextus.** A D-7 (Iter 4 záró, 2026.05.21) az A2 "Új bejelentés" form-szerkezetét véglegesítette 3 explorer-aldöntéssel (F-1 form-elrendezés, F-2 két-submit, F-3 LocationPicker). A 8. lépés A2 screen-mock-építésekor megjelent egy 4. UI-elem: a `PhoneBanner` (amber-tinted blokk a form fejlécében, ami explicit kódolja az `origin=Manual` magatartást és a `reporterContactText` kötelezőségét). A SF-9 (Phase 2A) feltárta, hogy ez NEM rögzített a D-7 alatt — sem a 6 explorer-kérdés között, sem külön D-X-ben. 🔍 UI-találmány-kategóriába esett.

**Opciók.**
- A — D-7 retrofit F-4 új ponttal (a D-7 részeként, mintha eredetileg ott lett volna). Minimális napló-átszervezés.
- **B — Új D-18 önálló döntés-tételként** *(választott)*. A D-7 időhűsége megmarad (2026.05.21-i állapot), az új döntés (2026.05.26) önálló horgonyt kap.
- C — Nem rögzítjük. **Elvetett** — a Manual-eredet vizualizációja érdemi UX-választás.

**Döntés.** **B verzió** — önálló D-18 a PhoneBanner-mintára.

**A `PhoneBanner` szerződése.**
- Csak akkor renderelt, ha `origin === 'Manual'` (a `TicketCreateForm.origin` prop alapján).
- Vizuális: amber-tinted blokk (`background: var(--u-amber-50)` + `border: 1px solid var(--u-amber-200)`), 36×36 amber kör-ikon (`background: var(--u-amber-500)`, fehér Lucide `phone` glyph — Iter 5-n túli, később felveendő `icon.jsx`-be).
- Tartalom: cím "Telefonos bejelentés-felvétel" + 2-3 mondatos magyarázat.
- Pozíció: a form fejlécében, a PageHeader és a form-mezők között.

**Indoklás.**
- Pedagogikai érték: a diszpécser azonnal tudja, hogy ezen az ágon a `reporterContactText` kötelezővé válik (a polgári-app-bejelentésre ez nem áll fenn).
- Az `origin=Manual` adatmodell-szintű döntés (`Ticket.origin` enum) vizuálisan tükröződik.
- A `PhoneBanner` reuse-szempontból elszigetelt — egyetlen használati helye az A2.

**Hatás.**
- A `TicketCreateForm` organism `origin === 'Manual'` derived feltétellel rendereli (NEM külön prop).
- HANDOFF.md per-organism Angular-skeleton-mintában `<u-phone-banner *ngIf="origin === 'Manual'">`.
- Spec-szintű: az `01_kozos_mintak.md` / `10_bejelentes_lista_es_adatlap.md` §4.1 nem írja explicit — SF-9 alatt a SPEC-FEEDBACK-FOR-SPEC-TEAM-be új SD-X-ként javasolt.
- React-mock-szinten az `a2-uj-bejelentes.html` `StatePhoneIntake` ezt már demonstrálja.


---

## D-19 · 2026.05.26 · Self-aware "Te" identitás-chip cross-screen pattern (`.u-self-chip`)

**Kontextus.** Az A8 "Felhasználók lista" screen-mock vizuálisan jelöli a vezető önmagát egy "Te" mini-chip-pel a `displayName` mellett (`USERS[0].isCurrentUser=true` mock-flag). A SF-51 (Phase 2C) feltárta, hogy ez **nem D-X-ben rögzített** UX-választás — sem a SD-38 invariáns (`cannotDeactivateSelf`), sem a D-9 UD-4A (invariáns-előjelzés disabled+tooltip) nem fedi. 🔍 UI-találmány-kategóriába került, DE pedagogiailag-indokolt és cross-screen érvényesíthető.

**Opciók.**
- A — D-9 UD-4A bővítés a "Te" chip UI-mintájával. Az invariáns-szintű és identitás-szintű információ keveredik.
- **B — Új D-19 cross-screen identitás-pattern, kanonizált `.u-self-chip` class az `_styles.css`-ben** *(választott)*. Tiszta elválasztás: D-9 = akció-szintű disabled+tooltip; D-19 = identitás-szintű chip.
- C — Törölni a "Te" chip-et az A8-on. **Elvetett** — pedagogiailag érdemi.

**Döntés.** **B verzió.**

**A `.u-self-chip` kanonikus szerződése.**
- Vizuális: blue-50 háttér, blue-200 1px border, blue-700 szöveg, ~10px font, font-weight 600, padding 2px 6px, border-radius 4px.
- Tartalom: literal "Te" (i18n-kulcs `common.currentUser.youLabel`).
- Pozíció: a `displayName` mellett közvetlenül jobbra, 6px gap-pal.
- Renderelés: `<span className="u-self-chip">Te</span>` — egyetlen DOM-elem, NEM organism.
- Feltétel: `currentUser.id === entity.id`.

**Cross-screen érvényesítés (cél-állapot).**

| Screen | Hely | Status |
|---|---|---|
| A8 felhasználók lista | `UserCell.a8-uc__name` + State4 self-row | ✅ React-mock-on `.a8-self` osztály, portoláskor `.u-self-chip`-re átnevezve |
| A7 csoport-adatlap | `MemberRow` saját-sor | 🔜 Phase 3 portolás-szempont |
| A1 lista | `AssigneeCell` ha saját-felelős | 🔜 Phase 3 portolás-szempont |

**Indoklás.**
- Béla (vezető) vizuálisan azonnal tudja: önmagát is látja a listán. Elkerüli a "meglepetés-deaktiválás" kockázatát.
- A FirstTime-state self-row-on a chip + magyarázó-szöveg ("Még csak te vagy a tenanton.") kétirányúan megerősíti.
- Cross-screen-konzisztencia: 1 kanonikus class, 3+ helyen használat.
- A SD-38 invariáns-szellem kompatibilis (a chip proaktív identitás-jelzés, nem akció-blokkoló).

**Hatás.**
- `_styles.css`: új `.u-self-chip` kanonikus class (~6 sor) — Iter 7 starter/-portoláskor.
- A8 lista jelenlegi `.a8-self` osztály a portoláskor `.u-self-chip`-re átnevezve.
- SPEC-FEEDBACK-FOR-SPEC-TEAM.md-ben SF-51 mint dokumentált UX-pattern (NEM spec-szelídítés).
- ORGANISMS.md emlékeztető: a manager-listákon a self-row a `.u-self-chip`-pel jelölve.


---

## D-20 · 2026.05.26 · A11 lista TimeCell proximity-color — új `cellType: 'eventTimeWithProximity'`

**Kontextus.** Az A11 "Programok lista" screen-mock a `startsAt`-cellán proximity-szín-kódot használ (derived `when` mező: `today` = amber, `soon` = primary blue, `future` = neutral, `past` = opacity 0.55). A SF-83 (Phase 2D) két problémát tárt fel:

1. **Az amber-tónus `today`-állapoton szemantikai-overload kockázat** — a status-szín-paletta `--u-status-folyamatban-*` szintén amber; a vezető a `today` programot téves "in-progress"-ként értelmezheti.
2. **A `when` derived-cella mint kanonikus oszlop-szerződés nem rögzített** — a `60_tartalom.md` §4.3.1 csak a `startsAt`-mezőt írja le, a proximity-derived render-réteget nem.

**Opciók.**
- A — Maradjon mock-szintű, D-X nélkül. **Elvetett**.
- B — Az amber-tónust megtartani, a status-paletta-átfedést elfogadni. **Elvetett** — vezetői zavar-kockázat.
- **C — Új D-20: `cellType: 'eventTimeWithProximity'` + amber → `--u-blue-100` a `today`-en** *(választott)*.

**Döntés.** **C verzió.**

**Az új `cellType: 'eventTimeWithProximity'` szerződése.**
- Input: `row.startsAt: DateTime` (a `Event.startsAt` mező); a derived `when` kliens-oldalon: `today` ha `startsAt.date === now().date`; `soon` ha `0 < (startsAt - now()) < 7 nap`; `future` egyébként; `past` ha `startsAt < now()`.
- Render: mono-formátum dátum-szöveg, color-modifier `when`-érték szerint:
  - `today`  → `background: var(--u-blue-100)`, `color: var(--u-blue-700)` *(módosítva — eredetileg amber)*
  - `soon`   → `color: var(--u-primary)` *(változatlan)*
  - `future` → `color: var(--u-fg-2)` *(neutral, változatlan)*
  - `past`   → `opacity: 0.55` *(változatlan)*
- A `_styles.css`-en új modifierek: `.mgr-a11-time-cell--today` (kék-100), `--soon` (primary), `--past` (opacity).

**Indoklás.**
- A blue-100 a `Jóváhagyva` státusz-tónussal egyezne (`--u-status-jovahagyva-*`) — Ellentétben az amber-rel, ami a `Folyamatban`-státusszal egyezne. Mindkét csere átfedést okoz, DE: a programok-szempontból a `today` ≈ "ma futó program" — a kék kontextusban (NEM ticket-kontextus), a kétértelműség kisebb.
- Alternatív szín: violet — az Urbino-paletta reserved-szín (Ötletláda + Merge), idegen kontextus. Mellőzve.
- A `cellType` szerződés a Phase 3 Angular-portoláskor a `DataTable.columns[].cellType`-mezőre képezhető le.

**Hatás.**
- A11 lista `TimeCell` mock-implementáció a Phase 4a-ban NEM változott (Iter 4a-1 nem fedte) — Iter 6 SPEC-FEEDBACK-FOR-SPEC-TEAM ÉS Iter 7 HANDOFF.md `cellType`-tábla rögzíti, a `_styles.css` amber → blue-100 csere az Iter 7 Angular-portoláskor.
- A `60_tartalom.md` §4.3.1 oszlop-katalógus-bővítés-jelölt SPEC-FEEDBACK-FOR-SPEC-TEAM-en keresztül.
