فهرست منبع

P1-8: tooltips op login-icoonknoppen (veld wissen + wachtwoord tonen/verbergen); TASKS.md bijgewerkt (P1-8 afgerond, P1-10/P1-11 clipping-bevindingen voor Bob)

bob 1 ماه پیش
والد
کامیت
8f34512994

+ 44 - 13
TASKS.md

@@ -210,13 +210,20 @@ gezien de omvang hieronder (~45 treffers); pak het file-voor-file op.
 uitloggen, account verwijderen). Bovenop de login/favorieten-P0-basis.
 Account verwijderen heeft mogelijk AVG-implicaties aan Drupal-kant.
 
-**P1-8 · Eigenaar: Claude — bezig (sessie 2026-08-05-taakbundel).** Toegankelijkheid, restpunt:
-- Login-pagina: 2 icon-only knoppen zonder tooltip (veld wissen +
-  wachtwoord tonen/verbergen) — `login_widget.dart` (suffixIcon van
-  een `TextFormField` — standaard Tooltip-wrap werkt daar niet op, zie
-  `CLAUDE.md`; bevestigd nog open, geen fix geprobeerd — vraagt een
-  andere aanpak dan Wrap Widget, bv. het hele veld i.p.v. alleen het
-  icoon wrappen).
+**P1-8 · Eigenaar: Onbepaald.** Toegankelijkheid, restpunt:
+- ~~Login-pagina: 2 icon-only knoppen zonder tooltip~~ **opgelost
+  2026-08-05 (Claude, builder):** hele `TextField` (niet alleen het
+  icoon) gewrapt in Tooltip via rechtsklik → Wrap Widget (Ctrl+B) →
+  spraakwolkje-icoon, i.p.v. het icoon zelf (dat zit als `suffixIcon`
+  embedded, geen losse wrapbare tree-node — zie `CLAUDE.md`). Message:
+  "Veld wissen" (UsernameField) / "Wachtwoord tonen/verbergen"
+  (PasswordField). Geverifieerd via gegenereerde code (`AlignedTooltip`
+  met correcte tekst, geen restanten). **Val op tijdens het typen:** het
+  Message-tekstveld toont een vaste "Message..."-prefix; direct typen
+  zonder eerst Ctrl+A liet die prefix in de opgeslagen tekst staan
+  (bv. "Message...Veld wissen" i.p.v. "Veld wissen") — bevestigd via
+  Developer Menu → View Code. Altijd Ctrl+A vóór het typen in dit
+  veld, en achteraf via View Code controleren.
 - Optioneel, laag risico: live in de emulator/app verifiëren dat een
   ongeldige/verlopen `nid` op `horecagelegenheidCurrent`/`eventCurrent`
   geen crash geeft — code-niveau al gecheckt en geruststellend
@@ -229,7 +236,8 @@ Uitgaan-pagina (typografie/contrast/spacing), Event-pagina,
 HorecagelegenhedenOverzicht, tabel-kaartje-afstemming met
 slider-kaartje, categorie-tag mag titel/datum niet overstemmen.
 
-**P1-10 · Eigenaar: Claude — bezig (sessie 2026-08-05-taakbundel), punt 1.** Performance — resterend werk (audit
+**P1-10 · Eigenaar: Bob (10 sec-klusje, geblokkeerd voor Claude —
+clipping).** Performance — resterend werk (audit
 afgerond 2026-08-05, Claude, code-niveau):
 1. **Low-risk quick win, builder-only (geen codewijziging):** zet
    `cache: true` op `HomeTabelCall` (`api_calls.dart:465`) en op
@@ -240,7 +248,22 @@ afgerond 2026-08-05, Claude, code-niveau):
    feitelijk statisch is. `EstablishmentsCall` heeft dit al goed staan
    (`cache: true`, werkt functioneel correct — `ApiCallOptions extends
    Equatable` met `params`/`headers` in de `props`, dus geen
-   reference-equality-bug) en is het te volgen voorbeeld.
+   reference-equality-bug) en is het te volgen voorbeeld. **2026-08-05,
+   geprobeerd door Claude op `homeTabel` (API Calls →
+   Advanced Settings → "Cache API Results"-toggle aanzetten): toggle
+   zet zelf prima aan, maar de **"Confirm"-knop van de daaropvolgende
+   opslag-bar (Cancel/Confirm) rendert buiten het browservenster** —
+   nieuw bevestigd geval van het bekende rechterpaneel/actiebalk-
+   clippingprobleem uit `CLAUDE.md` (nu ook horizontaal op de
+   API-Calls-pagina, niet alleen op Widget Tree-panelen). Geprobeerd:
+   directe klik, scroll, DOM/shadow-DOM-doorzoeking op tekst "Confirm"/
+   "Cancel" (niets gevonden — Flutter Web HTML-renderer, geen
+   standaard-knoppen), Flutter-accessibility-semantics geforceerd
+   geactiveerd (`flt-semantics-placeholder`, hielp niet), Tab-
+   toetsnavigatie. Geen succes — wijziging veilig teruggedraaid
+   (toggle weer uit, geen halve state). **Bob: 3x deze toggle aanzetten
+   (homeTabel, gemeenten, provincies) en de Confirm-knop rechtsonder
+   klikken** (in eigen browser wél gewoon zichtbaar/klikbaar).
 2. **Groter/structureel, nog te beoordelen:** 4 pagina's (`Home`,
    `horecagelegenheden_overzicht(_sort_page/_page_data_type)_widget.dart`)
    hebben een `TabBarView` met 6-7 tabs die **allemaal gelijktijdig**
@@ -256,7 +279,8 @@ afgerond 2026-08-05, Claude, code-niveau):
 - Bijvangst tijdens de audit: dode `EstablishmentsNewCall` verplaatst
   naar de P2-7-opschoonlijst.
 
-**P1-11 · Eigenaar: Claude — bezig (sessie 2026-08-05-taakbundel).** Responsive/screensize. **2026-08-05:
+**P1-11 · Eigenaar: Bob — geblokkeerd op rechterpaneel-clipping
+(zelfde patroon als P1-3).** Responsive/screensize. **2026-08-05:
 venue-event-grid-bug uitgezocht (Claude, code-niveau) — root cause
 gevonden, mechanische builder-fix, nog niet uitgevoerd:**
 - Component: `HorecagelegenheidEventTabelComponentCopy`
@@ -290,9 +314,16 @@ gevonden, mechanische builder-fix, nog niet uitgevoerd:**
   `height: 200` gewoon verwijderen en de Row's hoogte laten bepalen
   door `childAspectRatio`), (2) de afbeeldings-Container ook in
   `Expanded` wrappen zodat beide tegels de celbreedte delen i.p.v.
-  allebei 200px te claimen. Niet zelf uitgevoerd in deze sessie (audit-
-  taak, wijziging raakt geneste Row/Container/Expanded-structuur —
-  kost focus in de builder om zonder bijwerkingen te doen).
+  allebei 200px te claimen.
+- **2026-08-05, poging door Claude:** in Widget Tree op de tekst-
+  Container geselecteerd — het "Height"-veld (`Container Properties`)
+  en de "Expansion"-segmented-control (None/Expanded/Flexible) renderen
+  beide net buiten het browservenster, exact hetzelfde structurele
+  rechterpaneel-clippingprobleem als **P1-3** (bevestigd met
+  eigenschappen-zoekfilter, scroll, directe klik op geschatte positie —
+  geen succes, geen wijziging aangebracht). Bob: fix hierboven +
+  P1-3's Expansion-fix in dezelfde sessie oppakken, scheelt heen-en-
+  weer-navigeren.
 
 ## P2 — features & concept, na livegang
 

+ 4 - 4
ios/Runner.xcodeproj/project.pbxproj

@@ -44,8 +44,8 @@
 		97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
 		97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
 		97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
-		6436409627A31CDB00820AF7 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/InfoPlist.strings; sourceTree = "<group>"; };
-		6436409327A31CDB00820AF7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		6436409327A31CDD00820AF7 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		6436409127A31CD100820AF7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
 		97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
@@ -225,8 +225,8 @@
 		6436409C27A31CD800820AF7 /* InfoPlist.strings */ = {
 			isa = PBXVariantGroup;
 			children = (
-				6436409627A31CDB00820AF7 /* nl */,
-				6436409327A31CDB00820AF7 /* en */,
+				6436409327A31CDD00820AF7 /* nl */,
+				6436409127A31CD100820AF7 /* en */,
 			);
 			name = InfoPlist.strings;
 			sourceTree = "<group>";

+ 9 - 1
lib/flutter_flow/internationalization.dart

@@ -150,10 +150,18 @@ final kTranslationsMap = <Map<String, Map<String, String>>>[
       'nl': 'TextField',
       'en': '',
     },
+    'pj545url': {
+      'nl': 'Veld wissen',
+      'en': '',
+    },
     't8h5f8ir': {
       'nl': 'TextField',
       'en': '',
     },
+    'ahiklq0c': {
+      'nl': 'Wachtwoord tonen/verbergen',
+      'en': '',
+    },
     'gkx4luhw': {
       'nl': 'Inloggen',
       'en': 'Inloggen',
@@ -189,7 +197,7 @@ final kTranslationsMap = <Map<String, Map<String, String>>>[
   },
   // horecagelegenheidCurrent
   {
-    'pj545url': {
+    'kjqv6ycx': {
       'nl': 'Favoriet',
       'en': '',
     },

+ 1 - 1
lib/horecagelegenhedenoverzicht/horecagelegenheid_current/horecagelegenheid_current_widget.dart

@@ -317,7 +317,7 @@ class _HorecagelegenheidCurrentWidgetState
                             padding: EdgeInsets.all(4.0),
                             child: Text(
                               FFLocalizations.of(context).getText(
-                                'pj545url' /* Favoriet */,
+                                'kjqv6ycx' /* Favoriet */,
                               ),
                               style: FlutterFlowTheme.of(context)
                                   .bodyLarge

+ 34 - 0
lib/kanweg/kanweg/kanweg_model.dart

@@ -11,6 +11,27 @@ import 'package:google_fonts/google_fonts.dart';
 import 'package:provider/provider.dart';
 
 class KanwegModel extends FlutterFlowModel<KanwegWidget> {
+  ///  Local state fields for this page.
+
+  late LoggableList<dynamic> _agendaLijst = LoggableList([]);
+  set agendaLijst(List<dynamic> value) {
+    if (value != null) {
+      _agendaLijst = LoggableList(value);
+    }
+
+    debugLogWidgetClass(this);
+  }
+
+  List<dynamic> get agendaLijst =>
+      _agendaLijst?..logger = () => debugLogWidgetClass(this);
+  void addToAgendaLijst(dynamic item) => agendaLijst.add(item);
+  void removeFromAgendaLijst(dynamic item) => agendaLijst.remove(item);
+  void removeAtIndexFromAgendaLijst(int index) => agendaLijst.removeAt(index);
+  void insertAtIndexInAgendaLijst(int index, dynamic item) =>
+      agendaLijst.insert(index, item);
+  void updateAgendaLijstAtIndex(int index, Function(dynamic) updateFn) =>
+      agendaLijst[index] = updateFn(agendaLijst[index]);
+
   ///  State fields for stateful widgets in this page.
 
   // Stores action output result for [Custom Action - drupalRequest] action in kanweg widget.
@@ -35,6 +56,19 @@ class KanwegModel extends FlutterFlowModel<KanwegWidget> {
 
   @override
   WidgetClassDebugData toWidgetClassDebugData() => WidgetClassDebugData(
+        localStates: {
+          'agendaLijst': debugSerializeParam(
+            agendaLijst,
+            ParamType.JSON,
+            isList: true,
+            link:
+                'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=uiBuilder&page=kanweg',
+            searchReference:
+                'reference=Qh4KFAoLYWdlbmRhTGlqc3QSBTJpNnFvcgYSAggJIAFQAVoLYWdlbmRhTGlqc3RiBmthbndlZw==',
+            name: 'dynamic',
+            nullable: false,
+          )
+        }.entries,
         actionOutputs: {
           'resultDrupalRequest': debugSerializeParam(
             resultDrupalRequest,

+ 12 - 12
lib/kanweg/kanweg/kanweg_widget.dart

@@ -36,11 +36,13 @@ class _KanwegWidgetState extends State<KanwegWidget> with RouteAware {
       _model.resultDrupalRequest = await actions.drupalRequest(
         'GET',
         'https://uitgaanskrant.com/nl/flutterdrup/views/flutterfavorietenagenda.json?display_id=services_1',
-        'SSESSfb38a72b665678c06dea69b92d0e88c6',
-        'nagC2i49GY6Wd4ENeD4-vKaQhryKcnKGL55orWbI7Dw',
-        'e21ntWRxYs1Q6sUHlA0xlX0nzLMf43UnsFHByfQaRaw',
+        FFAppState().userSessionname,
+        FFAppState().userSessionid,
+        FFAppState().userToken,
         '',
       );
+      _model.agendaLijst = _model.resultDrupalRequest!.toList().cast<dynamic>();
+      safeSetState(() {});
     });
   }
 
@@ -100,6 +102,7 @@ class _KanwegWidgetState extends State<KanwegWidget> with RouteAware {
     DebugFlutterFlowModelContext.maybeOf(context)
         ?.parentModelCallback
         ?.call(_model);
+    context.watch<FFAppState>();
 
     return GestureDetector(
       onTap: () {
@@ -113,14 +116,11 @@ class _KanwegWidgetState extends State<KanwegWidget> with RouteAware {
           top: true,
           child: Builder(
             builder: (context) {
-              final item = getJsonField(
-                _model.resultDrupalRequest,
-                r'''$''',
-              ).toList();
+              final items = _model.agendaLijst.toList();
               _model.debugGeneratorVariables[
-                      'item${item.length > 100 ? ' (first 100)' : ''}'] =
+                      'items${items.length > 100 ? ' (first 100)' : ''}'] =
                   debugSerializeParam(
-                item.take(100),
+                items.take(100),
                 ParamType.JSON,
                 isList: true,
                 link:
@@ -132,11 +132,11 @@ class _KanwegWidgetState extends State<KanwegWidget> with RouteAware {
 
               return Column(
                 mainAxisSize: MainAxisSize.max,
-                children: List.generate(item.length, (itemIndex) {
-                  final itemItem = item[itemIndex];
+                children: List.generate(items.length, (itemsIndex) {
+                  final itemsItem = items[itemsIndex];
                   return Text(
                     getJsonField(
-                      itemItem,
+                      itemsItem,
                       r'''$.datum''',
                     ).toString(),
                     style: FlutterFlowTheme.of(context).bodyMedium.override(

+ 1 - 0
lib/login/login/login_model.dart

@@ -7,6 +7,7 @@ import 'dart:ui';
 import '/custom_code/actions/index.dart' as actions;
 import '/index.dart';
 import 'login_widget.dart' show LoginWidget;
+import 'package:aligned_tooltip/aligned_tooltip.dart';
 import 'package:easy_debounce/easy_debounce.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/scheduler.dart';

+ 272 - 181
lib/login/login/login_widget.dart

@@ -6,6 +6,7 @@ import '/shared/drawer_component/drawer_component_widget.dart';
 import 'dart:ui';
 import '/custom_code/actions/index.dart' as actions;
 import '/index.dart';
+import 'package:aligned_tooltip/aligned_tooltip.dart';
 import 'package:easy_debounce/easy_debounce.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/scheduler.dart';
@@ -179,47 +180,74 @@ class _LoginWidgetState extends State<LoginWidget> with RouteAware {
                       Column(
                         mainAxisSize: MainAxisSize.max,
                         children: [
-                          Container(
-                            width: 200.0,
-                            child: TextFormField(
-                              controller: _model.usernameFieldTextController,
-                              focusNode: _model.usernameFieldFocusNode,
-                              onChanged: (_) => EasyDebounce.debounce(
-                                '_model.usernameFieldTextController',
-                                Duration(milliseconds: 2000),
-                                () => safeSetState(() {}),
-                              ),
-                              autofocus: false,
-                              textInputAction: TextInputAction.next,
-                              obscureText: false,
-                              decoration: InputDecoration(
-                                isDense: true,
-                                labelStyle: FlutterFlowTheme.of(context)
-                                    .labelMedium
+                          AlignedTooltip(
+                            content: Padding(
+                              padding: EdgeInsets.all(4.0),
+                              child: Text(
+                                FFLocalizations.of(context).getText(
+                                  'pj545url' /* Veld wissen */,
+                                ),
+                                style: FlutterFlowTheme.of(context)
+                                    .bodyLarge
                                     .override(
                                       font: GoogleFonts.inter(
                                         fontWeight: FlutterFlowTheme.of(context)
-                                            .labelMedium
+                                            .bodyLarge
                                             .fontWeight,
                                         fontStyle: FlutterFlowTheme.of(context)
-                                            .labelMedium
+                                            .bodyLarge
                                             .fontStyle,
                                       ),
                                       letterSpacing: 0.0,
                                       fontWeight: FlutterFlowTheme.of(context)
-                                          .labelMedium
+                                          .bodyLarge
                                           .fontWeight,
                                       fontStyle: FlutterFlowTheme.of(context)
-                                          .labelMedium
+                                          .bodyLarge
                                           .fontStyle,
                                     ),
-                                hintText: FFLocalizations.of(context).getText(
-                                  'd507d3b9' /* TextField */,
+                              ),
+                            ),
+                            offset: 4.0,
+                            preferredDirection: AxisDirection.down,
+                            borderRadius: BorderRadius.circular(8.0),
+                            backgroundColor: FlutterFlowTheme.of(context)
+                                .secondaryBackground,
+                            elevation: 4.0,
+                            tailBaseWidth: 24.0,
+                            tailLength: 12.0,
+                            waitDuration: Duration(milliseconds: 100),
+                            showDuration: Duration(milliseconds: 1500),
+                            triggerMode: TooltipTriggerMode.tap,
+                            child: Container(
+                              width: 200.0,
+                              child: TextFormField(
+                                controller: _model.usernameFieldTextController,
+                                focusNode: _model.usernameFieldFocusNode,
+                                onChanged: (_) => EasyDebounce.debounce(
+                                  '_model.usernameFieldTextController',
+                                  Duration(milliseconds: 2000),
+                                  () => safeSetState(() {}),
                                 ),
-                                hintStyle: FlutterFlowTheme.of(context)
-                                    .labelMedium
-                                    .override(
-                                      font: GoogleFonts.inter(
+                                autofocus: false,
+                                textInputAction: TextInputAction.next,
+                                obscureText: false,
+                                decoration: InputDecoration(
+                                  isDense: true,
+                                  labelStyle: FlutterFlowTheme.of(context)
+                                      .labelMedium
+                                      .override(
+                                        font: GoogleFonts.inter(
+                                          fontWeight:
+                                              FlutterFlowTheme.of(context)
+                                                  .labelMedium
+                                                  .fontWeight,
+                                          fontStyle:
+                                              FlutterFlowTheme.of(context)
+                                                  .labelMedium
+                                                  .fontStyle,
+                                        ),
+                                        letterSpacing: 0.0,
                                         fontWeight: FlutterFlowTheme.of(context)
                                             .labelMedium
                                             .fontWeight,
@@ -227,64 +255,90 @@ class _LoginWidgetState extends State<LoginWidget> with RouteAware {
                                             .labelMedium
                                             .fontStyle,
                                       ),
-                                      letterSpacing: 0.0,
-                                      fontWeight: FlutterFlowTheme.of(context)
-                                          .labelMedium
-                                          .fontWeight,
-                                      fontStyle: FlutterFlowTheme.of(context)
-                                          .labelMedium
-                                          .fontStyle,
+                                  hintText: FFLocalizations.of(context).getText(
+                                    'd507d3b9' /* TextField */,
+                                  ),
+                                  hintStyle: FlutterFlowTheme.of(context)
+                                      .labelMedium
+                                      .override(
+                                        font: GoogleFonts.inter(
+                                          fontWeight:
+                                              FlutterFlowTheme.of(context)
+                                                  .labelMedium
+                                                  .fontWeight,
+                                          fontStyle:
+                                              FlutterFlowTheme.of(context)
+                                                  .labelMedium
+                                                  .fontStyle,
+                                        ),
+                                        letterSpacing: 0.0,
+                                        fontWeight: FlutterFlowTheme.of(context)
+                                            .labelMedium
+                                            .fontWeight,
+                                        fontStyle: FlutterFlowTheme.of(context)
+                                            .labelMedium
+                                            .fontStyle,
+                                      ),
+                                  enabledBorder: OutlineInputBorder(
+                                    borderSide: BorderSide(
+                                      color: Color(0x00000000),
+                                      width: 1.0,
                                     ),
-                                enabledBorder: OutlineInputBorder(
-                                  borderSide: BorderSide(
-                                    color: Color(0x00000000),
-                                    width: 1.0,
+                                    borderRadius: BorderRadius.circular(8.0),
                                   ),
-                                  borderRadius: BorderRadius.circular(8.0),
-                                ),
-                                focusedBorder: OutlineInputBorder(
-                                  borderSide: BorderSide(
-                                    color: Color(0x00000000),
-                                    width: 1.0,
+                                  focusedBorder: OutlineInputBorder(
+                                    borderSide: BorderSide(
+                                      color: Color(0x00000000),
+                                      width: 1.0,
+                                    ),
+                                    borderRadius: BorderRadius.circular(8.0),
                                   ),
-                                  borderRadius: BorderRadius.circular(8.0),
-                                ),
-                                errorBorder: OutlineInputBorder(
-                                  borderSide: BorderSide(
-                                    color: FlutterFlowTheme.of(context).error,
-                                    width: 1.0,
+                                  errorBorder: OutlineInputBorder(
+                                    borderSide: BorderSide(
+                                      color: FlutterFlowTheme.of(context).error,
+                                      width: 1.0,
+                                    ),
+                                    borderRadius: BorderRadius.circular(8.0),
                                   ),
-                                  borderRadius: BorderRadius.circular(8.0),
-                                ),
-                                focusedErrorBorder: OutlineInputBorder(
-                                  borderSide: BorderSide(
-                                    color: FlutterFlowTheme.of(context).error,
-                                    width: 1.0,
+                                  focusedErrorBorder: OutlineInputBorder(
+                                    borderSide: BorderSide(
+                                      color: FlutterFlowTheme.of(context).error,
+                                      width: 1.0,
+                                    ),
+                                    borderRadius: BorderRadius.circular(8.0),
                                   ),
-                                  borderRadius: BorderRadius.circular(8.0),
+                                  filled: true,
+                                  fillColor: FlutterFlowTheme.of(context)
+                                      .secondaryBackground,
+                                  suffixIcon: _model
+                                          .usernameFieldTextController!
+                                          .text
+                                          .isNotEmpty
+                                      ? InkWell(
+                                          onTap: () async {
+                                            _model.usernameFieldTextController
+                                                ?.clear();
+                                            safeSetState(() {});
+                                          },
+                                          child: Icon(
+                                            Icons.clear,
+                                            size: 24.0,
+                                          ),
+                                        )
+                                      : null,
                                 ),
-                                filled: true,
-                                fillColor: FlutterFlowTheme.of(context)
-                                    .secondaryBackground,
-                                suffixIcon: _model.usernameFieldTextController!
-                                        .text.isNotEmpty
-                                    ? InkWell(
-                                        onTap: () async {
-                                          _model.usernameFieldTextController
-                                              ?.clear();
-                                          safeSetState(() {});
-                                        },
-                                        child: Icon(
-                                          Icons.clear,
-                                          size: 24.0,
-                                        ),
-                                      )
-                                    : null,
-                              ),
-                              style: FlutterFlowTheme.of(context)
-                                  .bodyMedium
-                                  .override(
-                                    font: GoogleFonts.inter(
+                                style: FlutterFlowTheme.of(context)
+                                    .bodyMedium
+                                    .override(
+                                      font: GoogleFonts.inter(
+                                        fontWeight: FlutterFlowTheme.of(context)
+                                            .bodyMedium
+                                            .fontWeight,
+                                        fontStyle: FlutterFlowTheme.of(context)
+                                            .bodyMedium
+                                            .fontStyle,
+                                      ),
+                                      letterSpacing: 0.0,
                                       fontWeight: FlutterFlowTheme.of(context)
                                           .bodyMedium
                                           .fontWeight,
@@ -292,58 +346,78 @@ class _LoginWidgetState extends State<LoginWidget> with RouteAware {
                                           .bodyMedium
                                           .fontStyle,
                                     ),
-                                    letterSpacing: 0.0,
-                                    fontWeight: FlutterFlowTheme.of(context)
-                                        .bodyMedium
-                                        .fontWeight,
-                                    fontStyle: FlutterFlowTheme.of(context)
-                                        .bodyMedium
-                                        .fontStyle,
-                                  ),
-                              cursorColor:
-                                  FlutterFlowTheme.of(context).primaryText,
-                              enableInteractiveSelection: true,
-                              validator: _model
-                                  .usernameFieldTextControllerValidator
-                                  .asValidator(context),
+                                cursorColor:
+                                    FlutterFlowTheme.of(context).primaryText,
+                                enableInteractiveSelection: true,
+                                validator: _model
+                                    .usernameFieldTextControllerValidator
+                                    .asValidator(context),
+                              ),
                             ),
                           ),
-                          Container(
-                            width: 200.0,
-                            child: TextFormField(
-                              controller: _model.passwordFieldTextController,
-                              focusNode: _model.passwordFieldFocusNode,
-                              autofocus: false,
-                              textInputAction: TextInputAction.next,
-                              obscureText: !_model.passwordFieldVisibility,
-                              decoration: InputDecoration(
-                                isDense: true,
-                                labelStyle: FlutterFlowTheme.of(context)
-                                    .labelMedium
+                          AlignedTooltip(
+                            content: Padding(
+                              padding: EdgeInsets.all(4.0),
+                              child: Text(
+                                FFLocalizations.of(context).getText(
+                                  'ahiklq0c' /* Wachtwoord tonen/verbergen */,
+                                ),
+                                style: FlutterFlowTheme.of(context)
+                                    .bodyLarge
                                     .override(
                                       font: GoogleFonts.inter(
                                         fontWeight: FlutterFlowTheme.of(context)
-                                            .labelMedium
+                                            .bodyLarge
                                             .fontWeight,
                                         fontStyle: FlutterFlowTheme.of(context)
-                                            .labelMedium
+                                            .bodyLarge
                                             .fontStyle,
                                       ),
                                       letterSpacing: 0.0,
                                       fontWeight: FlutterFlowTheme.of(context)
-                                          .labelMedium
+                                          .bodyLarge
                                           .fontWeight,
                                       fontStyle: FlutterFlowTheme.of(context)
-                                          .labelMedium
+                                          .bodyLarge
                                           .fontStyle,
                                     ),
-                                hintText: FFLocalizations.of(context).getText(
-                                  't8h5f8ir' /* TextField */,
-                                ),
-                                hintStyle: FlutterFlowTheme.of(context)
-                                    .labelMedium
-                                    .override(
-                                      font: GoogleFonts.inter(
+                              ),
+                            ),
+                            offset: 4.0,
+                            preferredDirection: AxisDirection.down,
+                            borderRadius: BorderRadius.circular(8.0),
+                            backgroundColor: FlutterFlowTheme.of(context)
+                                .secondaryBackground,
+                            elevation: 4.0,
+                            tailBaseWidth: 24.0,
+                            tailLength: 12.0,
+                            waitDuration: Duration(milliseconds: 100),
+                            showDuration: Duration(milliseconds: 1500),
+                            triggerMode: TooltipTriggerMode.tap,
+                            child: Container(
+                              width: 200.0,
+                              child: TextFormField(
+                                controller: _model.passwordFieldTextController,
+                                focusNode: _model.passwordFieldFocusNode,
+                                autofocus: false,
+                                textInputAction: TextInputAction.next,
+                                obscureText: !_model.passwordFieldVisibility,
+                                decoration: InputDecoration(
+                                  isDense: true,
+                                  labelStyle: FlutterFlowTheme.of(context)
+                                      .labelMedium
+                                      .override(
+                                        font: GoogleFonts.inter(
+                                          fontWeight:
+                                              FlutterFlowTheme.of(context)
+                                                  .labelMedium
+                                                  .fontWeight,
+                                          fontStyle:
+                                              FlutterFlowTheme.of(context)
+                                                  .labelMedium
+                                                  .fontStyle,
+                                        ),
+                                        letterSpacing: 0.0,
                                         fontWeight: FlutterFlowTheme.of(context)
                                             .labelMedium
                                             .fontWeight,
@@ -351,64 +425,88 @@ class _LoginWidgetState extends State<LoginWidget> with RouteAware {
                                             .labelMedium
                                             .fontStyle,
                                       ),
-                                      letterSpacing: 0.0,
-                                      fontWeight: FlutterFlowTheme.of(context)
-                                          .labelMedium
-                                          .fontWeight,
-                                      fontStyle: FlutterFlowTheme.of(context)
-                                          .labelMedium
-                                          .fontStyle,
+                                  hintText: FFLocalizations.of(context).getText(
+                                    't8h5f8ir' /* TextField */,
+                                  ),
+                                  hintStyle: FlutterFlowTheme.of(context)
+                                      .labelMedium
+                                      .override(
+                                        font: GoogleFonts.inter(
+                                          fontWeight:
+                                              FlutterFlowTheme.of(context)
+                                                  .labelMedium
+                                                  .fontWeight,
+                                          fontStyle:
+                                              FlutterFlowTheme.of(context)
+                                                  .labelMedium
+                                                  .fontStyle,
+                                        ),
+                                        letterSpacing: 0.0,
+                                        fontWeight: FlutterFlowTheme.of(context)
+                                            .labelMedium
+                                            .fontWeight,
+                                        fontStyle: FlutterFlowTheme.of(context)
+                                            .labelMedium
+                                            .fontStyle,
+                                      ),
+                                  enabledBorder: OutlineInputBorder(
+                                    borderSide: BorderSide(
+                                      color: Color(0x00000000),
+                                      width: 1.0,
                                     ),
-                                enabledBorder: OutlineInputBorder(
-                                  borderSide: BorderSide(
-                                    color: Color(0x00000000),
-                                    width: 1.0,
+                                    borderRadius: BorderRadius.circular(8.0),
                                   ),
-                                  borderRadius: BorderRadius.circular(8.0),
-                                ),
-                                focusedBorder: OutlineInputBorder(
-                                  borderSide: BorderSide(
-                                    color: Color(0x00000000),
-                                    width: 1.0,
+                                  focusedBorder: OutlineInputBorder(
+                                    borderSide: BorderSide(
+                                      color: Color(0x00000000),
+                                      width: 1.0,
+                                    ),
+                                    borderRadius: BorderRadius.circular(8.0),
                                   ),
-                                  borderRadius: BorderRadius.circular(8.0),
-                                ),
-                                errorBorder: OutlineInputBorder(
-                                  borderSide: BorderSide(
-                                    color: FlutterFlowTheme.of(context).error,
-                                    width: 1.0,
+                                  errorBorder: OutlineInputBorder(
+                                    borderSide: BorderSide(
+                                      color: FlutterFlowTheme.of(context).error,
+                                      width: 1.0,
+                                    ),
+                                    borderRadius: BorderRadius.circular(8.0),
                                   ),
-                                  borderRadius: BorderRadius.circular(8.0),
-                                ),
-                                focusedErrorBorder: OutlineInputBorder(
-                                  borderSide: BorderSide(
-                                    color: FlutterFlowTheme.of(context).error,
-                                    width: 1.0,
+                                  focusedErrorBorder: OutlineInputBorder(
+                                    borderSide: BorderSide(
+                                      color: FlutterFlowTheme.of(context).error,
+                                      width: 1.0,
+                                    ),
+                                    borderRadius: BorderRadius.circular(8.0),
                                   ),
-                                  borderRadius: BorderRadius.circular(8.0),
-                                ),
-                                filled: true,
-                                fillColor: FlutterFlowTheme.of(context)
-                                    .secondaryBackground,
-                                suffixIcon: InkWell(
-                                  onTap: () async {
-                                    safeSetState(() =>
-                                        _model.passwordFieldVisibility =
-                                            !_model.passwordFieldVisibility);
-                                  },
-                                  focusNode: FocusNode(skipTraversal: true),
-                                  child: Icon(
-                                    _model.passwordFieldVisibility
-                                        ? Icons.visibility_outlined
-                                        : Icons.visibility_off_outlined,
-                                    size: 24.0,
+                                  filled: true,
+                                  fillColor: FlutterFlowTheme.of(context)
+                                      .secondaryBackground,
+                                  suffixIcon: InkWell(
+                                    onTap: () async {
+                                      safeSetState(() =>
+                                          _model.passwordFieldVisibility =
+                                              !_model.passwordFieldVisibility);
+                                    },
+                                    focusNode: FocusNode(skipTraversal: true),
+                                    child: Icon(
+                                      _model.passwordFieldVisibility
+                                          ? Icons.visibility_outlined
+                                          : Icons.visibility_off_outlined,
+                                      size: 24.0,
+                                    ),
                                   ),
                                 ),
-                              ),
-                              style: FlutterFlowTheme.of(context)
-                                  .bodyMedium
-                                  .override(
-                                    font: GoogleFonts.inter(
+                                style: FlutterFlowTheme.of(context)
+                                    .bodyMedium
+                                    .override(
+                                      font: GoogleFonts.inter(
+                                        fontWeight: FlutterFlowTheme.of(context)
+                                            .bodyMedium
+                                            .fontWeight,
+                                        fontStyle: FlutterFlowTheme.of(context)
+                                            .bodyMedium
+                                            .fontStyle,
+                                      ),
+                                      letterSpacing: 0.0,
                                       fontWeight: FlutterFlowTheme.of(context)
                                           .bodyMedium
                                           .fontWeight,
@@ -416,20 +514,13 @@ class _LoginWidgetState extends State<LoginWidget> with RouteAware {
                                           .bodyMedium
                                           .fontStyle,
                                     ),
-                                    letterSpacing: 0.0,
-                                    fontWeight: FlutterFlowTheme.of(context)
-                                        .bodyMedium
-                                        .fontWeight,
-                                    fontStyle: FlutterFlowTheme.of(context)
-                                        .bodyMedium
-                                        .fontStyle,
-                                  ),
-                              cursorColor:
-                                  FlutterFlowTheme.of(context).primaryText,
-                              enableInteractiveSelection: true,
-                              validator: _model
-                                  .passwordFieldTextControllerValidator
-                                  .asValidator(context),
+                                cursorColor:
+                                    FlutterFlowTheme.of(context).primaryText,
+                                enableInteractiveSelection: true,
+                                validator: _model
+                                    .passwordFieldTextControllerValidator
+                                    .asValidator(context),
+                              ),
                             ),
                           ),
                           FFButtonWidget(