Jelajahi Sumber

P1-35 + P1-36 afgerond, P2-21 visueel nagerekend, P1-41 toegevoegd

P1-35: AdBanner verwijderd van horecagelegenheidCurrent en EventCurrent
(besluit Bob: helemaal weg van de detailpagina's; p_uitgaan_page houdt
de zijne).

P1-36: categorielabels uit de Stack gehaald op
HorecagelegenheidoverzichtKaart -- staan nu onder titel/adres/plaats in
een Wrap, grijze scrim-Container weg, radius 12 -> 0. Geverifieerd met
verse export + dart analyze (0 errors) + live op toestel.

P2-21: visueel narekenen afgerond (3/2/1 kolommen bij 1280/800/411 dp).

P1-41 (nieuw): zelfde pil-over-afbeelding-patroon op de Home-kaarten;
de pilvorm zit in het gedeelde TagCategorieComponent (9 gebruikers).

CLAUDE.md: widget-tree-slepen werkt wel (drop = altijd eerste kind) en
een losse exportmap heeft .fvmrc/.fvm/pubspec.lock nodig om te builden.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bob 1 Minggu lalu
induk
melakukan
5bf0996f9d
2 mengubah file dengan 98 tambahan dan 27 penghapusan
  1. 37 0
      CLAUDE.md
  2. 61 27
      TASKS.md

+ 37 - 0
CLAUDE.md

@@ -341,6 +341,18 @@ export PATH="/home/bob/fvm/bin:$HOME/.pub-cache/bin:$PATH" && /home/bob/Projects
   twijfel welke JDK's beschikbaar zijn met
   `ls /snap/android-studio/*/jbr/bin/java` (elke revisie los te
   aanroepen met `-version`) en `readlink -f /snap/android-studio/current`.
+- **Een losse exportmap (`/tmp/ff-checkN`) is niet zomaar te builden:
+  kopieer er eerst `.fvmrc`, `.fvm/` én `pubspec.lock` uit het project
+  naartoe.** Bevestigd 2026-09-03: `flutterflow export-code` levert geen
+  van drieën op. Zonder `pubspec.lock` trekt `pub get` de nieuwste
+  packages binnen; zonder `.fvmrc` valt `fvm flutter` terug op de
+  **nieuwste geïnstalleerde** Flutter (3.44.6) i.p.v. de projectversie
+  (3.35.7). De build faalt dan met misleidende package-fouten diep in
+  `~/.pub-cache` (`The class 'IconData' can't be extended outside of its
+  library`, `Couldn't find constructor 'CupertinoPageTransitionsBuilder'`)
+  — die wijzen naar een SDK-mismatch, niet naar een kapotte dependency.
+  Ga daar dus niet in de packages zoeken; check `fvm flutter --version`
+  in de exportmap.
 - Interactief script (device-run + hot-restart-loop) → Bash met
   `run_in_background: true`. Volg tot minimaal "All done!" én
   idealiter een succesvolle app-launch (`Launching lib/main.dart...`,
@@ -1388,6 +1400,31 @@ Component"** (maakt een volledige, werkende kopie inclusief Backend
 Query en pagination), en **"Copy Action Chain"/"Paste Action(s)"** voor
 losse actieketens (zie de valkuil daarbij elders in dit bestand).
 
+**Een widget VERPLAATSEN lukt wél — sleep de rij in de Widget Tree, en
+een drop op een container-rij voegt hem er altijd als EERSTE kind in.**
+Bevestigd 2026-09-03 (P1-36, `HorecagelegenheidoverzichtKaart`): een
+complete subtree (`Container` > `Column` met Generate Dynamic Children >
+groene labels) verhuisde in één sleepactie van de `Stack` naar de
+rechterkolom, mét behoud van de dynamische kinderen, de `.take(3)` en de
+tekstbinding. Dat is dus de werkende tegenhanger van het copy/paste-dode-
+spoor hierboven: kopiëren kan niet, **verplaatsen wel**.
+- **Het insert-gedrag is deterministisch: altijd positie 0.** Een drop op
+  de onder- of bovenhelft van een rij maakt geen verschil, en een drop in
+  de lege ruimte ónder de boom doet niets. Wil je een node dus als
+  *laatste* kind: laat 'm niet slepen naar de plek waar hij moet komen,
+  maar **drop alle siblings ná hem opnieuw op de ouder-rij, in omgekeerde
+  volgorde**. Van `[C, A, B]` naar `[A, B, C]` is: drop `B` op de ouder →
+  `[B, C, A]`, drop `A` op de ouder → `[A, B, C]`. Drie voorspelbare
+  sleepacties i.p.v. mikken op een tussenpositie.
+- Klap de te verslepen node eerst in (chevron) — dat houdt de boom kort
+  genoeg om bron én doel tegelijk in beeld te hebben, wat nodig is omdat
+  het boompaneel niet met het muiswiel scrollt.
+- Is de omhullende node na de verhuizing overbodig geworden (alleen nog
+  padding/alignment): rechtsklik → **Remove Widget** haalt alleen die
+  Container weg en tilt de kinderen een niveau omhoog — precies wat je
+  wilt, en het scheelt het gevecht met de padding-velden (die vielen hier
+  buiten het klikbare gebied, zie de clipping-notities elders).
+
 **Een `ListView`/`GridView` met pagination van widgettype wisselen —
 Replace weigert eerst.** Rechtsklik → Replace geeft *"Can't replace a
 widget that has pagination enabled. Go to the 'Backend Query' pane and

+ 61 - 27
TASKS.md

@@ -2068,25 +2068,42 @@ in Drupal, geen uitputtende audit.
 
 ---
 
-*(Onderstaande taken komen uit de merkanalyse web-vs-app van 2026-08-30.
-Volledige onderbouwing met screenshots: [Designbrug-rapport](https://claude.ai/code/artifact/29f3412a-305f-49f3-971c-cd9bd310beb1).
-Afvinkbare werklijst: [Designbrug werklijst](https://claude.ai/code/artifact/0c0c7347-d681-417d-83d7-7feb1de6457d).)*
-
-**P1-35 · Eigenaar: Claude — bezig (sessie 2026-09-03, live pair met Bob in de builder)** (klein per pagina). Advertentieblok staat op
-de detailpagina's direct onder de titel en duwt tabs/adres/tijden onder
-de vouw. De site zet advertenties consequent ná de inhoud. Verplaats de
-`AdBanner`-node naar onder de Info-tab of onderaan de pagina, op
-`horecagelegenheid_current` en `event_current`/
-`evenement_horecagelegenheid`.
-
-**P1-36 · Eigenaar: Claude — bezig (sessie 2026-09-03, live pair met Bob in de builder).** In `horecagelegenheidoverzicht_kaart_widget.dart`
-liggen drie groene categoriepillen over het logo van de zaak heen
-(precies over de naam in het beeldmerk), met daarnaast een leeg grijs
-vlak van dezelfde grootte — leest als een kapotte afbeelding. Fix:
-labels uit de `Stack` halen en onder titel/adres plaatsen (zoals de
-site), leeg grijs vlak weg, en meteen labelvorm van pil naar recht
-blokje (radius 8 → 0). Los van P2-12 (blur-hash-laadplaatshouder,
-al afgerond) — dit is een leeg vlak, geen laadprobleem.
+**P1-41 · Eigenaar: Onbepaald.** Gevonden 2026-09-03 tijdens het live
+narekenen van P2-21 (Home op tablet én telefoon): de kaarten van
+`HomeUitgaantabelKaartComponent` hebben **exact dezelfde ontwerpfout die
+P1-36 net op de horeca-overzichtskaart heeft opgelost** — twee groene
+categoriepillen liggen linksonder óver de afbeelding heen (op de
+donkerste hoek, slecht leesbaar), en het zijn nog pillen (radius 12)
+i.p.v. rechte blokjes. Op smalle kaarten breekt "Kindvriendelijk" ook
+midden in het woord af.
+Fix = hetzelfde recept als P1-36: labels uit de `Stack` naar onder de
+tekst, `Column` → `Wrap` (Replace), radius 12 → 0.
+**De taak valt in twee helften uiteen, en de eerste is één klik
+(uitgezocht 2026-09-03):**
+1. **Pilvorm → recht blokje: één wijziging voor álles.** De groene tag is
+   op Home géén losse widget maar het gedeelde component
+   `lib/shared/tag_categorie_component/` (regel 101-102:
+   `Color(0xFF09B34A)` + `BorderRadius.circular(12.0)`). Dat component
+   wordt gebruikt door **9 levende kaartcomponenten**
+   (`HomeUitgaantabelKaartComponent`, `PUitgaanSliderKaartComponent`,
+   `KaartTabelUitgaanComp`, `KaartTabelUitgaanSComp`,
+   `KaartSliderUitgaanSComp`, `UitgaantabelKaart`, e.a.). Radius daar op
+   0 zetten maakt in één keer élke categorietag in de app merkconform.
+   **Dit is een ontwerpbesluit voor Bob** — het raakt veel meer schermen
+   dan P1-36 deed, dus niet ongevraagd doorvoeren.
+2. **Positie (labels van de afbeelding af):** die zit wél per
+   kaartcomponent, in de `Stack` van elk van die componenten, en moet dus
+   per stuk verplaatst worden. Het sleep-recept staat in `CLAUDE.md`
+   ("Een widget VERPLAATSEN lukt wél").
+De horeca-overzichtskaart uit P1-36 gebruikt dit gedeelde component
+**niet** (die had een eigen inline groene Container), dus die is met de
+fix van 2026-09-03 al klaar en verandert hier niet door mee.
+
+**Los administratief punt (2026-09-03):** `P2-21` verwijst twee keer naar
+**`P1-38`** ("punt 5 wacht op P1-38"), maar er bestaat geen P1-38-blok
+meer in dit bestand — die taak is ooit afgevoerd zonder de verwijzing bij
+te werken. Bob: of P2-21 punt 5 is nu gewoon vrij om op te pakken, of de
+verwijzing moet naar de juiste taak wijzen.
 
 ## P2 — features & concept, na livegang
 
@@ -2192,6 +2209,13 @@ starten.** Tekstzoeken op naam **én categorie**, per tab van
 overeenkomstige namen", nodig op elke tab; uitgebreid met een
 categorie-filter na een live test hieronder).
 
+**Meegenomen besluit (2026-09-03, Bob):** de twee lege `TextFormField`s
+in de tabs Activiteiten en Cultuur op `HorecagelegenhedenOverzicht`
+(hint-tekst letterlijk `TextField`, `textController1`/`2` worden nergens
+uitgelezen — geen onChange, geen filter) **blijven staan** tot deze taak
+ze van een echte binding voorziet. Niet verwijderen; ze zijn de
+plaatshouder voor het zoekveld dat hier gebouwd wordt.
+
 **Kritieke bevinding (2026-08-25, Claude, live curl-test op de
 productie-endpoint) — verandert de aanpak:** `HorecagelegenheidoverzichtCall`
 (`flutterflowmobiel_establishments.json`) hangt vast aan een **harde cap
@@ -2699,7 +2723,7 @@ overwegen bij een volgende theme-update:
 
 ---
 
-**P2-15 · Eigenaar: Claude — bezig (sessie 2026-09-03, verificatie + live test `stadsactiviteitAanmaken`; sessie 2026-09-02 afgesloten; de pagina `uitgaansevenementAanmaken` staat er en de export is open. Zie "STAND VAN ZAKEN bouwstap 5" voor wat er nog moet).
+**P2-15 · Eigenaar: Claude — bezig (sessie 2026-09-03b, bouwstap 5 afmaken op `uitgaansevenementAanmaken`: argumenten `evenementCreate` binden, horeca-dropdown, tickets-URL, page state, page parameter. Werkt zelf in de builder, Bob kijkt mee).
 Bouwstap 1 afgerond en bevestigd (2026-08-27): custom action
 `bestandUpload` (`lib/custom_code/actions/bestand_upload.dart`) upload
 foto → fid, live getest tegen productie
@@ -3695,9 +3719,11 @@ i.p.v. uitrekken.
 
 **Breekpunten** staan in `lib/flutter_flow/flutter_flow_util.dart`:
 `kBreakpointSmall` 479, `kBreakpointMedium` 767, `kBreakpointLarge` 991
-(logische px). `emulator-5556` = 1280x800 dp liggend / 800x1280 staand;
-telefoon-referentie 411x731 dp. Het overal toegepaste patroon is
-**1 / 1 / 2 / 3** kolommen.
+(logische px). Telefoon-referentie 411x731 dp. Het overal toegepaste
+patroon is **1 / 1 / 2 / 3** kolommen. **Let op: welke emulator de tablet
+is wisselt** — op 2026-09-03 was `emulator-5554` de tablet (2560x1600 @
+320dpi = 1280x800 dp) en `emulator-5556` de telefoon. Altijd eerst
+`adb -s <device> shell wm size` draaien.
 
 **Afgerond:**
 1. Horeca-overzicht (gemeente én provincie) — was al goed; dit was het
@@ -3718,10 +3744,18 @@ telefoon-referentie 411x731 dp. Het overal toegepaste patroon is
 van 960 dp breed. Verdient dezelfde breekpunt-behandeling
 (bv. 0.75 / 0.5 / 0.35).
 
-**Nog te doen: visueel narekenen op `emulator-5556`** (tablet, liggend
-én staand via `adb -s emulator-5556 shell wm size 1600x2560`, daarna
-`wm size reset`) en op telefoonformaat. De code klopt, het oog nog niet
-gecontroleerd.
+**Visueel narekenen: AFGEROND (2026-09-03, Claude, profile-build op de
+tablet-emulator).** Alle drie de formaten kloppen met het ontwerp, op
+Home (`HomeUitgaantabelKaartComponent`, raakt alle 5 de tabs):
+- liggend, 1280 dp → **3 kolommen** ✓
+- staand, 800 dp (`wm size 1600x2560`) → **2 kolommen** ✓
+- telefoonformaat, 411 dp (`wm size 1080x2160` + `wm density 420`) →
+  **1 kolom** ✓ — daarna `wm size reset` / `wm density reset`.
+Geen overflow, geen leeg vlak, kaarten vullen de breedte netjes.
+**Wat het oog wél bevestigt is punt 5 hieronder:** de sliderband bovenaan
+is op tablet echt storend — één kaart van ~960 dp met een brede grijze
+band eromheen, plus een half afgesneden lege kaart links en rechts. Dat
+is nu het meest zichtbare tabletprobleem dat er nog ligt.
 
 **Het recept om de pagination-blokkade te omzeilen staat nu in
 `CLAUDE.md`** (Replace weigert bij pagination; infinite scroll uit, `page`