✨ Features
- Profile avatar upload: Users can now upload a profile photo from their profile page via Breezy 2FA. Includes image editor (crop 1:1, resize 200×200). Managed from Settings > General > Profile & 2FA.
- Settings toggle: New
enable_avatar_uploadtoggle in Settings to show/hide the avatar field on the profile page. Reads fromconfig('blogr.enable_avatar_upload')so Breezy respects it without editing PHP. - avatar_url column: New
avatar_urlcolumn on theuserstable for Breezy avatar storage.getFilamentAvatarUrl()prioritisesavatar_url>avatar> Gravatar. - Frontend fallback: All author avatar views now check
avatar_urlfirst, thenavatar, then Gravatar, then initials. - InstallBreezyCommand repair: The command now detects and fixes misplaced
avatarUploadComponent()calls (from previous buggy versions), upgrades them with image editor, and addsavatar_urlto the User model's$fillable.
🐛 Bug Fixes
- Avatar disappearing on reload: Breezy stores avatar in
avatar_urlcolumn via$user->update(['avatar_url' => '...']). Ifavatar_urlwas not in$fillable, mass assignment was silently ignored. The command now adds it automatically. - Parenthesis insertion: Fixed parentheses-balancing in
findMatchingParen()helper — the command now correctly inserts method chains aftermyProfile()even when arguments contain nested parentheses.
✅ Tests
- 1107 tests passing (3297 assertions) — AvatarPersistenceTest (5), AvatarSettingsTest (4), UserAvatarTest (7), InstallBreezyCommandTest (6).
⚠️ Upgrade Note
If you already have Breezy 2FA installed, re-run php artisan blogr:install-breezy after updating to add avatar_url to your User model's $fillable and update the Breezy config with the avatar upload component.