feat(portal): Fortify auth + Login/2FA/Dashboard + component kit
Backend (Fortify):
- laravel/fortify with TOTP two-factor + recovery codes; User uses
TwoFactorAuthenticatable; 2FA credentials hidden from serialization.
- Views off — pages are full-page class-based Livewire components (R1/R2);
Fortify handles POST actions. Home redirect -> /dashboard. v1 scope: login +
2FA only (no public register/reset/passkeys). Seeder gated to local/testing.
Component kit (Blade, token-based, a11y):
- button, input, checkbox, alert, card, badge, stat-tile, otp-input (Alpine,
auto-advance/paste, -safe submit), progress-stepper, nav-item, icon
(Lucide), plus layouts/portal-app app-shell (sidebar drawer + topbar + menu).
Screens (localized DE/EN, R16):
- Login (form -> login.store), Two-factor challenge (OTP + recovery fallback),
Dashboard (KPI stat tiles, instance card, provisioning stepper fixtures,
activity). Routes English (R13).
Tests + verification:
- Pest: 14 green (login ok/invalid/throttle, dashboard guard, component render).
- R12 browser (Puppeteer, prod assets): /, /login, /two-factor-challenge and
the authenticated /dashboard all HTTP 200 with ZERO console errors; login
flow verified end-to-end.
- Test isolation fixed (force test env over injected .env).
- Reviewed with Codex (R15): 4 rounds, all findings fixed, final pass clean.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>