Jelajahi Sumber

132-G afgerond op 1 pagina na; tweetalig-patroon naar CLAUDE.md

TASKS: 132-G ingekort tot wat er nog ligt (ProvinciePage 6 tabs met de
teksten erbij, nieuwsbrieven-lijst, fotocarousels als eigen besluit).
De null-kaarten op MijnAanmeldingen staan nu als eigen punt 132-G2.

CLAUDE.md: het tweetalig()-patroon (custom function die via
platformDispatcher.locales bij de taal komt, non-nullable return),
LegeLijstMelding als opvolger van LegeLijstComponent, de netwerk-uit-truc
om een lege staat te testen, en dat het Issues-paneel niet scrollt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bob 1 hari lalu
induk
melakukan
afbb60b225
2 mengubah file dengan 104 tambahan dan 297 penghapusan
  1. 61 7
      CLAUDE.md
  2. 43 290
      TASKS.md

+ 61 - 7
CLAUDE.md

@@ -2329,13 +2329,13 @@ bevestigde pogingen stoppen en aan Bob vragen — geef het exacte pad
   `isEmpty`, dan lijkt een geslaagde wijziging ten onrechte mislukt.
   `isEmpty`, dan lijkt een geslaagde wijziging ten onrechte mislukt.
   ⚠️ **Widget Type biedt alleen *Image* of *Component* — géén Text** (bevestigd
   ⚠️ **Widget Type biedt alleen *Image* of *Component* — géén Text** (bevestigd
   2026-09-20 door Bob). Een lege lijst die moet uitleggen wáárom hij leeg is,
   2026-09-20 door Bob). Een lege lijst die moet uitleggen wáárom hij leeg is,
-  gaat dus via een component. Dat staat er sinds die datum als
-  **`LegeLijstComponent`** (`lib/shared/lege_lijst_component/`): Icon
-  `event_busy` + gecentreerde `Text` op `bodyMedium`/`secondaryText`, met één
-  **required** String-parameter `tekst`. Hergebruiken, niet opnieuw bouwen —
-  ook op de plekken waar nu nog een kaal `logo800px.png`/applogo als lege staat
-  staat. **Let op:** een parameterwaarde is een letterlijke string, geen
-  i18n-sleutel, dus zo'n melding krijgt géén globe en dus geen EN-vertaling.
+  gaat dus via een component. **Gebruik `LegeLijstMelding`**
+  (`lib/shared/lege_lijst_melding/`, sinds 2026-09-23): Icon `event_busy` +
+  gecentreerde `Text`, padding 24 rondom, en **twee** required String-parameters
+  `nlTekst` / `enTekst` — tweetalig via `tweetalig()`, zie het blok hieronder.
+  Hergebruiken, niet opnieuw bouwen. Het oudere `LegeLijstComponent` (één
+  parameter `tekst`, eentalig) staat er nog voor 4 plekken op `mijnProfiel`;
+  niet meer gebruiken voor nieuw werk.
 - **Recept dat 2026-09-22 in één ronde werkte (op een `GridView`):** widget
 - **Recept dat 2026-09-22 in één ronde werkte (op een `GridView`):** widget
   selecteren → Styling-tab → eigenschappen-filter `Empty` → **Show Empty List
   selecteren → Styling-tab → eigenschappen-filter `Empty` → **Show Empty List
   Widget** aan → filter wissen (anders verbergt het de vervolgopties, wat eruitziet
   Widget** aan → filter wissen (anders verbergt het de vervolgopties, wat eruitziet
@@ -2345,6 +2345,60 @@ bevestigde pogingen stoppen en aan Bob vragen — geef het exacte pad
   label "Parameters") → **Center Component** aan. Export:
   label "Parameters") → **Center Component** aan. Export:
   `return LegeLijstComponentWidget(tekst: '…');`
   `return LegeLijstComponentWidget(tekst: '…');`
 
 
+**Tweetalige tekst op een plek waar de globe niet kan komen: de custom function
+`tweetalig(nlText, enText)`.** Bedacht en bewezen 2026-09-23. Een
+component-*parameterwaarde* is een letterlijke string, dus die krijgt geen
+i18n-sleutel en geen Engelse vertaling. Een custom **function** kan wél bij de
+taal — ook zonder `BuildContext`:
+
+```dart
+String tweetalig(String nlText, String enText) {
+  final locales = WidgetsBinding.instance.platformDispatcher.locales;
+  for (final l in locales) {
+    if (l.languageCode == 'en') { return enText; }
+    if (l.languageCode == 'nl') { return nlText; }
+  }
+  return nlText;
+}
+```
+
+- **`WidgetsBinding` komt via de `material.dart`-import die FlutterFlow standaard
+  in `custom_functions.dart` zet** — geen extra import nodig (en het import-blok
+  van een custom function is toch niet bewerkbaar). Geverifieerd met
+  `dart analyze` in een verse exportmap: 0 errors.
+- **De fallback klopt met Flutter zelf:** bij een niet-ondersteunde systeemtaal
+  valt Flutter terug op `supportedLocales.first`, en dat is hier `Locale('nl')`
+  (`app.dart:150` in de SDK). Vandaar `return nlText` als sluitstuk.
+- ⚠️ **Return-type String met *Nullable* UIT, en beide argumenten ook
+  non-nullable.** Bij `String?` eist FlutterFlow een "Default Variable Value", en
+  `valueOrDefault` substitueert die óók bij een lege string. Met non-nullable
+  komt er een kale `functions.tweetalig(a, b)` in de export, zonder wrapper.
+- **Patroon:** zet de functie één keer in een component (Text-waarde → bind aan
+  `tweetalig`, argumenten → de twee component-parameters). Elke gebruiksplek
+  vult daarna alleen twee letterlijke strings in het parameterpaneel in — dat is
+  makkelijk klikwerk, en de fragiele Set-Variable-dialoog komt maar één keer voor.
+- **Prijs:** deze teksten staan niet in `internationalization.dart`, dus geen
+  globe en geen vertaalaudit. Daar staat tegenover dat NL en EN op één regel in
+  de export staan: `grep -rn "functions.tweetalig(" lib/ --include=*.dart` toont
+  beide talen naast elkaar.
+- 💡 **Een component-parameter HERNOEMEN behoudt zijn bindingen.** `tekst` →
+  `nlTekst` liet de bestaande Text-binding intact; dat scheelt een fragiele
+  herbouw. Zelfde truc als bij een page-state-veld.
+
+**Een lege lijst forceren om de lege staat te testen, zonder in te loggen: zet
+het netwerk uit.** `adb shell svc wifi disable` + `svc data disable`, dan de
+pagina via een deep link starten. Werkt zolang de paging-binding
+`(getJsonField(..., r'$') ?? []).toList()` is (JSON Path `$`) — die geeft bij een
+mislukte call netjes `[]`. Vergeet `svc wifi enable` achteraf niet.
+⚠️ *Uitgelogd* navigeren werkt niet als test: een endpoint dat anoniem een
+foutmelding-array teruggeeft, rendert die als lijst-met-items (zie 132-G2 in
+`TASKS.md`).
+
+**Het Issues-paneel scrollt niet.** Het toont vier regels en blijft daarbij, ook
+met muiswiel — bij 69 warnings zie je er dus vier. Wil je weten of een teller
+door jouw werk is opgelopen: noteer hem vóór je begint en vergelijk, dat is
+betrouwbaarder dan de lijst proberen te lezen.
+
 **⚠️ Een blok verbergen met een Visibility-conditie op het KIND laat de lege
 **⚠️ Een blok verbergen met een Visibility-conditie op het KIND laat de lege
 ruimte van de ouder staan — zet de conditie op de Container met de vaste
 ruimte van de ouder staan — zet de conditie op de Container met de vaste
 hoogte.** Bevestigd 2026-09-22 op het fotoboek-blok: de conditie stond op de
 hoogte.** Bevestigd 2026-09-22 op het fotoboek-blok: de conditie stond op de

+ 43 - 290
TASKS.md

@@ -554,308 +554,61 @@ De labels eten de ruimte op die de responsive `Max Lines` veronderstelt. Bij é
 label klopt het wel. Overweeg de labels op één regel te begrenzen, of de
 label klopt het wel. Overweeg de labels op één regel te begrenzen, of de
 omschrijving één regel korter.
 omschrijving één regel korter.
 
 
-### 132-G · Lege lijst toont een logo i.p.v. een melding · Eigenaar: **Claude** (2026-09-23: FASE 1 AF EN OP TOESTEL BEWEZEN — fase 2 kan beginnen)
-
-#### ✅ Fase 1 volledig af (2026-09-23), inclusief toesteltest
-
-- **Custom function `tweetalig(nlText, enText)`** staat er — beide argumenten
-  non-nullable String, return String met *Nullable* uit. Export regel 562 van
-  `custom_functions.dart`.
-- **Component `LegeLijstMelding`** (`lib/shared/lege_lijst_melding/`) —
-  gedupliceerd van `LegeLijstComponent`, parameters `nlTekst` + `enTekst` (beide
-  required String). De Text-binding werd `functions.tweetalig(widget!.nlTekst!,
-  widget!.enTekst!)` — **zonder `valueOrDefault`-wrapper**, precies zoals
-  bedoeld bij een non-nullable return.
-  - 💡 *Een component-parameter HERNOEMEN behoudt de binding:* `tekst` →
-    `nlTekst` liet de bestaande Text-binding intact, dus die hoefde niet opnieuw.
-- **Proefplek `MijnAanmeldingen`** — `StaggeredView` → Empty List Widget →
-  Widget Type *Component* → `LegeLijstMelding`, Center Component aan.
-  Export regel 211-217; de apostrof in "haven't" is netjes geëscaped.
-- `dart analyze` op de verse export: **0 errors**.
-
-- **Horizontale padding toegevoegd** op de Column van het component (nu
-  `EdgeInsets.fromSTEB(24, 24, 24, 24)`, paneel toont *Symmetric (24, 24)*) —
-  zonder die padding plakt een lange Engelse regel tegen beide schermranden.
-  Geldt meteen voor alle toekomstige plekken.
-
-**✅ Toesteltest geslaagd** (x64-release-APK op `emulator-5554`, telefoon):
-NL toont *"Je hebt nog geen komende evenementen of activiteiten aangemaakt."*,
-EN toont *"You haven't created any upcoming events or activities yet."* — dus
-`tweetalig` kiest de juiste tak. Emulator daarna hersteld (netwerk aan, locale
-terug op `nl-NL`).
-
-💡 **Recept om een lege staat te forceren zonder in te loggen:** zet het netwerk
-uit (`svc wifi disable` + `svc data disable`) en start de pagina via een deep
-link. De paging-binding van `MijnAanmeldingen` is `(getJsonField(..., r'$') ??
-[]).toList()`, dus een mislukte call geeft netjes `[]` → de lege-lijst-widget.
-*Uitgelogd* werkt **niet** als test — zie de bug hieronder.
-
-⚠️ **BIJVANGST-BUG (nieuw, niet in scope van 132-G): `MijnAanmeldingen` toont
-uitgelogd vier kaarten met "null".** Het endpoint geeft anoniem een
-foutmelding-array terug, en die wordt als lijst-met-items gerenderd: vier witte
-kaarten met 3× `null` en een Kopie-knop. Gemeten 2026-09-23 op een release-APK
-na `pm clear`. Hoort een lege staat of een inlog-uitnodiging te zijn.
-
-⚠️ **Niet van ons:** de Issues-teller stond op 5 errors bij aanvang en ging naar 7
-tijdens deze sessie — dubbele *Upload Data action*-namen op `ButtonLogo`/
-`ButtonFotos` (het bekende `Duplicate Page`-patroon, van de fotoboek-sessie).
-`export-code` slaagt er gewoon mee, maar ze horen opgeruimd.
-
-#### Het oorspronkelijke besluit
-
-#### ✅ BESLUIT 2026-09-23 (Bob): route A, maar met een custom FUNCTION — geen custom widget
-
-Het uitgangspunt "custom widget" bleek niet nodig. Een custom **function** kan wél bij
-de taal, ook zonder `BuildContext`:
+### 132-G · Lege lijsten: melding i.p.v. logo — **grotendeels AF**, 1 pagina te gaan
 
 
-```dart
-String tweetalig(String nlText, String enText) {
-  final locales = WidgetsBinding.instance.platformDispatcher.locales;
-  for (final l in locales) {
-    if (l.languageCode == 'en') { return enText; }
-    if (l.languageCode == 'nl') { return nlText; }
-  }
-  return nlText;
-}
-```
-
-- **Getest, niet aangenomen:** `WidgetsBinding` komt via de `material.dart`-import die
-  FlutterFlow standaard in `custom_functions.dart` zet — `dart analyze` in een verse
-  exportmap gaf **0 errors**, geen extra import nodig (en het import-blok van een
-  custom function is toch niet bewerkbaar).
-- **De fallback klopt met Flutter zelf:** bij een niet-ondersteunde systeemtaal valt
-  Flutter terug op `supportedLocales.first`, en dat is `Locale('nl')` (nagekeken in
-  `app.dart:150` van de SDK). Vandaar `return nlText` als sluitstuk.
-- **Waarom dit beter is dan een custom widget:** de melding blijft een gewone
-  FlutterFlow-`Text`, dus alle styling blijft in de builder aanpasbaar. Bij een custom
-  widget zou die naar Dart verhuizen.
-- ⚠️ **Return-type: String met *Nullable* UIT.** Bij `String?` eist FlutterFlow een
-  "Default Variable Value", en `valueOrDefault` substitueert die óók bij een lege
-  string.
-- **Prijs:** deze teksten komen niet in `internationalization.dart`, dus geen globe en
-  geen vertaalaudit. Daar staat tegenover dat NL en EN op één regel in de export staan:
-  `grep -rn "functions.tweetalig(" lib/ --include=*.dart` toont beide talen naast
-  elkaar, wat een diff tussen twee bestanden vervangt.
-
-**Bouwen, eenmalig:**
-1. Custom function `tweetalig` (body hierboven).
-2. Nieuw component **`LegeLijstMelding`** — dupliceer `LegeLijstComponent` (Icon + Text
-   staan dan al goed), geef het twee **required** String-parameters `nlTekst` /
-   `enTekst`, en bind de Text-waarde één keer aan `tweetalig(nlTekst, enTekst)`.
-
-Het bestaande `LegeLijstComponent` blijft ongemoeid staan met zijn vier plekken op
-`mijnProfiel` — bewust gefaseerd, zodat er niets breekt en we per plek overschakelen.
-**Per gebruiksplek daarna alleen nog:** Empty List Widget → Widget Type *Component* →
-`LegeLijstMelding` → twee letterlijke strings in het parameterpaneel. Dat is het
-makkelijke klikwerk; de fragiele Set-Variable-dialoog komt maar één keer voor (stap 2).
-
-**Fasering:**
-
-| Fase | Wat | Omvang |
-|---|---|---|
-| 1 | Functie + component + **één** proefplek (`MijnAanmeldingen`) + EN-test op toestel | eenmalig |
-| 2 | De 4 evenementen-plekken (Home-tabs, Home-slider, PUitgaan-lijst, PUitgaan-slider) | 4× |
-| 3 | Horeca: overzicht Current (6) + ProvinciePage (6) + `thuisBezorgen` (1) | 13× |
-| 4 | Later: Favorieten tab 1-3 (hebben nu géén lege staat) + de 4 bestaande `mijnProfiel`-plekken omzetten | optioneel |
-
-EN-test na fase 1:
-`adb shell cmd locale set-app-locales com.uitgaanskrant.app --locales en-US` (daarna
-terug naar `nl-NL`).
-
-#### ✅ STAND 2026-09-23 — volledige audit van ALLE lijsten in levende code
-
-Niet meer alleen "waar staat een logo", maar elke `PagedMasonryGridView` /
-`MasonryGridView` / `ListView.builder` / `CarouselSlider` in bereikbare code,
-afgezet tegen wat hij bij leeg toont. Dat leverde meer op dan de eerste
-inventaris, die alleen op logo's zocht.
-
-**Klaar: 15 instanties `LegeLijstMelding`**, alle met beide talen gevuld,
-`dart analyze` 0 errors.
-
-**1 · Nog te doen — `HorecagelegenhedenOverzichtProvinciePage`, 5 van de 6 tabs · Eigenaar: Bob (besluit 2026-09-23)**
-Stand 2026-09-23 (Claude, export-geverifieerd): **tab 4 (Overnachten) staat**, met de
-juiste NL/EN-tekst. Tab 1, 2, 3, 5 en 6 staan nog op `logo800px`. Claude kwam
-niet verder: bij de zoom van het Chrome-venster toont de gefilterde boom maar
-drie van de zes tabs en scrollt niet, en de eerste poging landde daardoor op de
-verkeerde tab (inmiddels gecorrigeerd). **Exacte stappen per tab, in je eigen
-browser (5×):**
-1. Pagina openen → Widget Tree → zoekveld `StaggeredView` → de boom toont zes
-   `StaggeredView`-rijen in **tabvolgorde** (1 Activiteiten · 2 Cultuur ·
-   3 Eetgelegenheden · 4 Overnachten ✅ · 5 Uitgaan · 6 Verhuur). Klik de rij.
-2. Rechterpaneel → "Search properties..." → `Widget Type` → dropdown staat op
-   *Image* → kies **Component**.
-3. Zoekfilter → `Component` → knop **Select Component** → zoek
-   `LegeLijstMelding` → aanklikken. *Center Component* staat dan al aan.
-4. Zoekfilter → `Parameter` → rij **nlTekst** openklappen → Value → NL-tekst
-   uit de tabel in blok B hieronder → rij **enTekst** → Value → EN-tekst.
-   (Toggle "Show Empty List Widget" staat op deze pagina al aan; niets aan doen.)
-5. Controle in één keer, op een verse export:
-   `grep -c logo800px lib/horecagelegenhedenoverzicht/horecagelegenheden_overzicht_provincie_page/*_widget.dart`
-   hoort op **0** uit te komen, en
-   `grep -n "nlTekst:" -A1 <zelfde bestand>` toont de zes teksten in tabvolgorde.
- Zelfde zes tabs in dezelfde volgorde als
-`...OverzichtCurrent`, dus de teksten uit blok B zijn één-op-één te hergebruiken
-(Bob koos voor tab 3-6 de korte variant *"Geen gelegenheden gevonden..."* /
-*"No places found..."*). Filter de tree op `StaggeredView` → zes in tabvolgorde.
-Bereikbaar via de drawer onder **Provincie**.
-
-**2 · Nieuw gevonden — `mijnProfiel`, tab Nieuwsbrieven**
-De `ListView` op `NieuwsbrievenCall` (regel ~2243) heeft **geen** lege staat;
-gebouwd in taak 128. Voorstel: *"Er zijn op dit moment geen nieuwsbrieven."* /
-*"There are no newsletters at the moment."*
-
-**3 · Andere categorie: drie FOTOcarousels, geen lijsten**
-Een tekstmelding in een beeldcarousel is discutabel — eigen besluit, niet
-automatisch meenemen:
-- `HorecagelegenheidCurrent` (~r266) — foto's van de zaak, toont nu een logo
-- `EvenementHorecagelegenheid` (~r1084) — toont niets
-- `EventCurrent` (~r241) — toont niets
-
-**4 · Werkt al, alleen niet tweetalig: 4× het oude `LegeLijstComponent`**
-op `mijnProfiel` (+1 in `FotoboekGridComponent`). Die tonen gewoon Nederlandse
-tekst; omzetten naar `LegeLijstMelding` kan later, is geen bug.
-
-**Wezen — niet doen:** `evenement_component` (hangt aan de pagina `Event`,
-0 aanroepers) en `SliderUitgaanComponentSmallCurrent` (0 aanroepers).
-
-*Gecorrigeerd 2026-09-23 door Claude:* op `...OverzichtCurrent` tab 4
-(**Overnachten**, `horcat 17965`) stond de Nederlandse tekst óók in het
-`enTekst`-veld; nu *"No places found..."*.
-
-⚠️ **Kleine inconsistentie, geen bug:** *Center Component* staat op de
-horeca-tabs **uit** en op `MijnAanmeldingen` **aan**.
-
-#### 📋 WERKLIJST — alle plekken + de tekst per plek (gemeten 2026-09-23)
-
-20 instellingen te gaan (`MijnAanmeldingen` is al gedaan). Per plek: node
-selecteren → Styling → filter `Empty` → toggle → filter **wissen** → sectie
-*Empty List Widget* → Widget Type **Component** → `LegeLijstMelding` → de twee
-teksten → *Center Component* aan.
+Het component **`LegeLijstMelding`** (`lib/shared/lege_lijst_melding/`) vervangt
+overal het kale `logo800px.png`. Het is tweetalig via de custom function
+`tweetalig(nlText, enText)` — zie `CLAUDE.md` voor dat patroon.
 
 
-**A · Vier componenten — één instelling dekt alle tabs die hem gebruiken**
+**Stand (geverifieerd met een verse export, `dart analyze` 0 errors):**
+15 instanties, alle met NL én EN gevuld — Home-tabs, beide sliders,
+PUitgaanPage, `horecagelegenhedenOverzichtCurrent` (6 tabs), `thuisBezorgen`,
+`MijnAanmeldingen`, Favorieten (3 tabs). NL- en EN-tak zijn op een release-APK
+bewezen.
 
 
-| # | Component | Dekt | nlTekst / enTekst |
-|---|---|---|---|
-| A1 | `HomeUitgaantabelKaartComponent` | **alle 5 Home-tabs** (Uitgaan, Activiteiten, Cultuur & Info, Films, Jeugd) | Er staat hier nog niets gepland. Probeer een andere datum of categorie. / Nothing is planned here yet. Try another date or category. |
-| A2 | `PUitgaantabelKaartComponent` | `PUitgaanPage` (alle categorieën) | Geen evenementen gevonden. Probeer een andere datum of zoekterm. / No events found. Try another date or search term. |
-| A3 | `HomeUitgaanSliderComponent` | Home-slider (**Carousel**) | Op dit moment niets uitgelicht. / Nothing featured right now. |
-| A4 | `PUitgaanSliderComponent` | PUitgaan-slider (**Carousel**) | Op dit moment niets uitgelicht. / Nothing featured right now. |
-
-⚠️ A3/A4 zijn Carousels; de toggle staat daar al aan (er staat een Image), maar
-`CLAUDE.md` meldt die sectie als voor Claude onbereikbaar — mogelijk Bob-werk.
-
-**B · Horeca-overzicht — 6 tabs × 2 pagina's = 12 instellingen, 6 teksten**
-
-Beide pagina's (`horecagelegenhedenOverzichtCurrent` en
-`HorecagelegenhedenOverzichtProvinciePage`) hebben **dezelfde zes tabs in
-dezelfde volgorde**, dus dezelfde tekst kan twee keer gebruikt worden. Filter de
-tree op `StaggeredView`: dan staan ze in documentvolgorde = tabvolgorde.
-
-| Tab (volgorde) | `horcat` | nlTekst / enTekst |
-|---|---|---|
-| 1 Activiteiten | 17969 | Geen activiteiten gevonden. Probeer een andere categorie. / No activities found. Try another category. |
-| 2 Cultuur | 17963 | Geen culturele gelegenheden gevonden. Probeer een andere categorie. / No cultural venues found. Try another category. |
-| 3 Eetgelegenheden | 34 | Geen eetgelegenheden gevonden. Probeer een andere categorie. / No places to eat found. Try another category. |
-| 4 Overnachten | 17965 | Geen overnachtingen gevonden. Probeer een andere categorie. / No places to stay found. Try another category. |
-| 5 Uitgaan | 17967 | Geen uitgaansgelegenheden gevonden. Probeer een andere categorie. / No nightlife venues found. Try another category. |
-| 6 Verhuur, catering | 17968 | Geen verhuur of catering gevonden. Probeer een andere categorie. / No rental or catering found. Try another category. |
-
-*Waarom "probeer een andere categorie": de categorie-dropdown toont de hele
-taxonomie, niet alleen wat er in die plaats staat — in Amsterdam leveren 9 van de
-13 opties op de tab Activiteiten niets op. Dat is de meest voorkomende reden dat
-deze lijsten leeg zijn.*
+#### Wat er nog ligt
 
 
-**C · Eén losse lijst**
+**1 · `HorecagelegenhedenOverzichtProvinciePage` — 6 tabs** (staat er nog met
+6× `logo800px`). Bereikbaar via de drawer onder **Provincie**. Zelfde zes tabs in
+dezelfde volgorde als `...OverzichtCurrent`; filter de tree op `StaggeredView`,
+dan staan ze in tabvolgorde. Per plek: node → Styling → filter `Empty` → toggle →
+filter **wissen** → sectie *Empty List Widget* → Widget Type **Component** →
+`LegeLijstMelding` → twee teksten.
 
 
-| # | Waar | nlTekst / enTekst |
+| Tab | nlTekst | enTekst |
 |---|---|---|
 |---|---|---|
-| C1 | `thuisBezorgen` | Geen bezorgdiensten gevonden in deze plaats. / No delivery services found in this town. |
-
-**D · Favorieten — ✅ AF (stond al in de export van 2026-09-23 13:45: alle drie de tabs tonen `LegeLijstMeldingWidget`; onderstaande tabel alleen nog ter referentie)**
-
-Deze drie tonen nu een volledig leeg scherm. Naast het component moet hier eerst
-*Show Empty List Widget* aangezet worden.
-
-| # | Tab | Lijst | nlTekst / enTekst |
-|---|---|---|---|
-| D1 | 1 Persoonlijke agenda | `favorietenAgendaItems` | Je persoonlijke agenda is nog leeg. / Your personal agenda is still empty. |
-| D2 | 2 Favoriete gemeenten | `favorieteGemeenteItem` | Je volgt nog geen gemeenten. / You are not following any municipalities yet. |
-| D3 | 3 Favoriete Gelegenheden | `favorieteHorecagelegenheid` | Je hebt nog geen favoriete gelegenheden. Tik op het hartje bij een zaak om hem hier te bewaren. / You have no favourite venues yet. Tap the heart on a venue to save it here. |
+| 1 Activiteiten | Geen activiteiten gevonden. Probeer een andere categorie. | No activities found. Try another category. |
+| 2 Cultuur | Geen culturele gelegenheden gevonden... | No cultural venues found... |
+| 3 Eetgelegenheden | Geen gelegenheden gevonden... | No places found... |
+| 4 Overnachten | Geen gelegenheden gevonden... | No places found... |
+| 5 Uitgaan | Geen gelegenheden gevonden... | No places found... |
+| 6 Verhuur, catering | Geen gelegenheden gevonden... | No places found... |
+
+**2 · `mijnProfiel`, tab Nieuwsbrieven** — die `ListView` (op `NieuwsbrievenCall`)
+heeft géén lege staat. Voorstel: *"Er zijn op dit moment geen nieuwsbrieven."* /
+*"There are no newsletters at the moment."*
 
 
-**Bewust NIET doen**
+**3 · Drie FOTOcarousels — eigen besluit, geen lijsten.** Een tekstmelding in een
+beeldcarousel is discutabel: `HorecagelegenheidCurrent` (toont nu een logo),
+`EvenementHorecagelegenheid` en `EventCurrent` (tonen niets).
 
 
-- `evenement_component` (`lib/evenement/evenement_component/`) — hangt alleen aan
-  de pagina `Event`, en die heeft **0 aanroepers**: wees. Overslaan.
-- `HorecagelegenheidCurrent` regel ~245 — dat is de **fotocarousel** van een zaak
-  zonder foto's, geen lege lijst. Een tekstmelding in een beeldcarousel is raar;
-  hier is verbergen of een beeld-placeholder logischer. Aparte beslissing voor Bob.
+**4 · Optioneel:** 4× het oude `LegeLijstComponent` op `mijnProfiel` (+1 in
+`FotoboekGridComponent`) omzetten naar `LegeLijstMelding`. Werkt prima, alleen
+eentalig — geen bug.
 
 
-#### De inventaris (onderzoek 2026-09-22)
+**Wezen, niet doen:** `evenement_component` (pagina `Event`, 0 aanroepers) en
+`SliderUitgaanComponentSmallCurrent` (0 aanroepers).
 
 
-Kies je een categorie zonder treffers, dan verschijnt een kaal `logo800px.png`.
-`LegeLijstComponent` (Icon `event_busy` + `Text`) doet dit al goed op `mijnProfiel`.
+⚠️ Kleine inconsistentie, geen bug: *Center Component* staat op de horeca-tabs
+**uit** en op `MijnAanmeldingen` **aan**.
 
 
-**Volledige inventaris — 18 plekken in LEVENDE code, 9 bestanden.** De dode
-kopieën (`kanweg/*`, `home_copy`, `home_copy2`, `p_uitgaan_page_copy{,2,3}`,
-`drawer_component_copy`, `mijn_profiel_copy*`, `evenement/event`) bevatten nog
-~15 logo's; geverifieerd wees (alleen zelfreferenties), overslaan.
+### 132-G2 · `MijnAanmeldingen` toont UITGELOGD vier kaarten met "null"
 
 
-| Waar | Plekken | Dekt |
-|---|---|---|
-| `HomeUitgaantabelKaartComponent` | 1 | **alle 5 Home-tabs** (één component) |
-| `HomeUitgaanSliderComponent` | 1 | Home-slider (Carousel) |
-| `PUitgaantabelKaartComponent` | 1 | PUitgaanPage-lijst |
-| `PUitgaanSliderComponent` | 1 | PUitgaan-slider (Carousel) |
-| `MijnAanmeldingen` | 1 | staat op `uitgaanskrant.com-applogo.jpg` |
-| `horecagelegenhedenOverzichtCurrent` | 6 | één per tab |
-| `HorecagelegenhedenOverzichtProvinciePage` | 6 | ⚠️ **wél bereikbaar**, `drawer_component_widget.dart:1209` |
-| `thuisBezorgen` | 1 | |
-| `HorecagelegenheidCurrent:248` | 1 | fotocarousel van een zaak — ander geval, beeld-placeholder verdedigbaar |
-
-Daarnaast: **Favorieten tab 1-3 hebben helemáál geen Empty List Widget** (zie
-132-H), en de agenda-tab van een zaak gebruikt een eigen component
-`GeenEvenementenComponentmoetweg` (Icon + vaste tekst) — functioneel al goed,
-opruimkandidaat.
-
-**Carousels:** op #2 en #4 staat de toggle al aan (er staat immers een Image),
-dus alleen *Widget Type* → Component. Reken er toch op dat dit er twee voor Bob
-zijn; `CLAUDE.md` meldt die checkbox als voor Claude onbereikbaar.
-
-#### i18n — onderzocht 2026-09-22, dit is de kern
-
-De `tekst`-parameter is een **letterlijke string**, dus geen globe en geen
-Engelse vertaling. Drie dingen uitgezocht:
-
-1. **`FFLocalizations.getVariableText({nlText, enText})` bestaat al** in
-   `internationalization.dart` — dat is wat FlutterFlow genereert voor een
-   niet-statische tekst. Nergens in gebruik.
-2. ⚠️ **De Global Property `locale` is in dit project ONBRUIKBAAR — altijd
-   `null`.** `MyApp._locale` begint op `null` en `setAppLanguage()` heeft
-   **nul aanroepers** (er is geen taalkiezer). De werkelijke taal komt uit de
-   Localizations-delegate (systeemtaal), en die is in de builder geen bron. Een
-   Visibility-conditie op "huidige taal" werkt hier dus niet. Niet proberen.
-3. Een custom **function** kan er niet bij (geen `BuildContext`); een custom
-   **widget** wel.
-
-**Drie werkbare routes:**
-
-- **D (aanbevolen) — losse componenten per melding.** `Duplicate Component` van
-  `LegeLijstComponent`, `tekst`-parameter eraf, vaste `Text` + globe. Nul
-  condities, per aanroepplek alleen "Empty List Widget → Component → kies".
-  Teksten belanden in `internationalization.dart`, dus de vertaalaudit ziet ze.
-  Kosten: ~10-12 componenten in de lijst.
-- **C — één component met een `soort`-parameter** (String) en N conditionele
-  `Text`-widgets, elk met eigen i18n-sleutel. Houdt de componentenlijst schoon,
-  maar kost 12× een Visibility-conditie met een letterlijke Second Value (het
-  bekende verstopte veld). Het patroon zelf is bewezen: `mijn_aanmeldingen_widget.dart:408`
-  heeft al `if (widget!.type == 'go_out_event')`.
-- **A — custom widget** met `getVariableText(nlText:, enText:)` en twee
-  String-parameters. Minste fragiele klikwerk, maar de teksten staan dan niet in
-  `internationalization.dart` (geen globe, geen audit).
-
-**Openstaand besluit voor Bob: D, C of A.** Reken op ~10-12 unieke teksten en
-22 aanroepplekken (18 hierboven + de 4 bestaande op `mijnProfiel` die van
-`tekst:` af moeten bij route D of C).
+Gevonden 2026-09-23 op een release-APK na `pm clear`. Het endpoint geeft anoniem
+een foutmelding-array terug, en die wordt als lijst-met-items gerenderd: vier
+witte kaarten met 3× `null` en een Kopie-knop. Hoort een lege staat of een
+inlog-uitnodiging te zijn. *(Terzijde: hierdoor werkt "uitgelogd" niet als test
+voor een lege lijst — zet in plaats daarvan het netwerk uit, zie `CLAUDE.md`.)*
 
 
 ### 132-H · Favorieten is uitgelogd een leeg scherm
 ### 132-H · Favorieten is uitgelogd een leeg scherm