Appearance
UI, UX and loading review
Reviewed September 20–24, 2026.
Scope and checks
All 60 application page routes were inspected in the browser at 1280px desktop and 390px mobile widths using a temporary local fixture API. Checked headings, content layout, document overflow, navigation, and representative menu/dialog states. Individual dynamic pages used representative fixture IDs; this is route coverage, not exhaustive data/state coverage. The internal /ui/* component examples and /__tokens are excluded from the application route count.
The production API was not running. Real email delivery, payment processing, signed-link success states, uploads, and backend mutations were not verified. Public signed-link error states were reviewed. The temporary fixture server is not part of the application and was stopped after testing.
Changes
- Shared responsive workspace shell for administrator, member, and umbrella areas; coherent typography, gutters, cards, tables, and restrained status colors.
- Mobile navigation drawer with focus management; accessible account and column menus; keyboard sorting and skip navigation; labelled inputs and reduced-motion support.
- Clearer page titles, creation-page back links, empty/loading states, responsive action bars, and modal sizing.
- Existing brand and care photograph retained. Login, registration, activation, and password reset refined to match the workspace.
- Fixed untranslated organisation labels, missing English payment labels, stale browser titles, accidental form submission from action buttons, and inconsistent invoice currency formatting. Backend resources were checked to confirm that invoice totals are integer cents.
Loading changes
- Existing login photograph converted from 10,407,495 bytes to 130,848 bytes (98.7% reduction). Mobile uses a lightweight fallback instead of downloading the desktop photograph.
- Page transition reduced from a 400ms blur transition to a 120ms opacity transition.
- Sidebar route prefetch runs on interaction instead of eagerly loading every visible destination.
- Member timeline and three record requests deferred until needed; member edit drawer loaded on opening.
- No-cookie public SSR requests skip unnecessary session calls; initial guest hydration avoids repeating the server session check.
- Member filtering and invoice member search debounce reduced to 350ms.
These are asset/request/interaction improvements, not a measured production Core Web Vitals score. Server response times depend on the deployed API.
Automated validation
- 110 test files, 740 tests passed.
- ESLint and token-color validation passed.
- Nuxt TypeScript check passed.
- Production Nuxt build passed.
- Git whitespace validation passed.
Application page inventory
aanmelding/[member]/keuze.vueactivate.vueadmin/accounting/sync-failures.vueadmin/accounting/unmatched-entries.vueadmin/collectives/[id]/edit.vueadmin/collectives/[id]/index.vueadmin/collectives/create.vueadmin/collectives/index.vueadmin/complaints/index.vueadmin/dashboard/index.vueadmin/documents/index.vueadmin/invoices/[id].vueadmin/invoices/create.vueadmin/invoices/index.vueadmin/invoices/outstanding.vueadmin/member-changes/index.vueadmin/members/[id]/edit.vueadmin/members/[id]/index.vueadmin/members/create.vueadmin/members/index.vueadmin/newsletter-campaigns/[id].vueadmin/newsletter-campaigns/create.vueadmin/newsletter-campaigns/index.vueadmin/notification-templates/[key]/edit.vueadmin/notification-templates/index.vueadmin/payments/failed-direct-debits.vueadmin/price-tiers/index.vueadmin/registrations/[id].vueadmin/registrations/index.vueadmin/reports/index.vueadmin/settings/index.vueadmin/umbrella/[id].vueadmin/umbrella/create.vueadmin/umbrella/index.vueadmin/users/[id]/edit.vueadmin/users/create.vueadmin/users/index.vuebetalen/[invoiceId].vuecertificaten/[id].vueindex.vuepayments/redirect.vueportal/certificates/index.vueportal/contact-persons/[contactPersonId]/edit.vueportal/contact-persons/create.vueportal/contact-persons/index.vueportal/dashboard/index.vueportal/documents/index.vueportal/invoices/index.vueportal/organisation/edit.vueportal/organisation/index.vueportal/settings/payments.vueportal/umbrella-invitations/[token].vueregister.vueregistration/information-request.vuereset-password.vueumbrella/complaints/index.vueumbrella/confirmations/index.vueumbrella/dashboard/index.vueumbrella/invitations/index.vueumbrella/members/index.vue
Follow-up: collectives and application errors
The collectives list assumed a top-level pricingMode, while the backend returns nullable nested pricing. Populated records could therefore pass undefined to the translator and throw during rendering. The list now reads the nested mode safely, and the detail/edit screens handle missing pricing terms. Regression tests cover nested, null, absent, and unknown pricing modes. This gap was not caught by the earlier fixture-backed page review.
Added a branded, responsive Nuxt error page with English/Dutch messages for 404/410, 401, 403, 429, 5xx, and other failures. Recovery uses a fresh request so failed startup plugins can recover. Error copy does not depend on the translation plugin, and raw exception details are not rendered by the component.
Validation: 751 tests across 112 files passed; lint, typecheck, production build, and whitespace checks passed. Direct HTTP checks against a separate production preview confirmed that both a real 404 and an induced backend-startup 500 returned the correct status, custom screen, recovery link, and noindex metadata. No further browser inspection was performed after the request to avoid browser use. The authenticated live collectives session was unavailable; the pricing fix is verified against backend resource structure and regression tests.