Replaces the Vuetify VForm + AppTextField + VBtn stack with the F3 form pattern: @primevue/forms' <Form> with a Zod resolver, the project-owned <FormField> wrapper from B5, and PrimeVue InputText / Password / Checkbox / Button at the input layer. Surrounding chrome (VRow / VCol illustration column, VCard, VAlert reset-success banner, auth-logo link, MfaChallengeCard) stays Vuetify until F4b migrates the auth surface in full. Zod schema: - email: required, valid email format - password: required Both messages are Dutch (per F3 sprint plan convention). 422 error handling routes through useFormError() from B5. The Laravel response shape (errors.<field>: string[]) feeds applyApiErrors directly. rate_limited and other reason-only failures are synthesized into the email field's error map so they surface visually under the email input, preserving the existing UX. The remember-me checkbox is rendered with PrimeVue Checkbox (no schema coverage — it's UI state, not validated input). The password visibility toggle is delegated to PrimeVue's Password component's built-in toggle-mask prop (replaces the previous manual isPasswordVisible ref and append-inner-icon plumbing). Verification: - pnpm typecheck — clean. - pnpm test — 402 tests pass unchanged. - pnpm build — succeeds; login chunk grew from ~21 KB to ~84 KB raw due to @primevue/forms + Password/Checkbox component code (gzip 22 KB). Will normalize during F4 as more pages share these modules. - Manual browser test deferred to Phase C brand-review screenshot capture. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Crewli — Organizer SPA
Main product UI for organisation and event staff (Vue 3 + Vuexy + Vuetify). Lives in this repo; only re-copy from Vuexy when upgrading the template.
Setup
- Install dependencies:
pnpm install
- Create
.env.local:
VITE_API_URL=http://localhost:8000/api/v1
VITE_APP_NAME="Crewli Organizer"
- Dev server uses port 5174 (see
vite.config.tsor run from repo root:make app).
pnpm dev --port 5174
Port
Runs on http://localhost:5174
Production: e.g. VITE_API_URL=https://api.crewli.app/api/v1 and host the SPA at https://crewli.app (see api/.env.example for FRONTEND_APP_URL and SANCTUM_STATEFUL_DOMAINS).