✨ Features
- Artist portfolio blocks: add Hero Carousel (Alpine.js slider), advanced Gallery (horizontal/filtered modes), Pricing Commissions, and Artist Bio CMS blocks
- Gallery: add
display_modeoption (grid, masonry, bento, horizontal, filtered) with black & white hover effect and category filtering - Reusable
<x-blogr::social-links>component, extracted from footer - Workflow: add batch grouping, bug workflow rules, merge step in git-changelog, pre-flight check in release-manager
- Quality harness: add Pint (code style), PHPStan level 5, Lefthook pre-commit hooks
🐛 Bug Fixes
- Carousel/Team/Pricing/Artist Bio: fix "Array to string conversion" when Filament stores image paths as arrays inside Repeaters
- Carousel: fix "A non-numeric value encountered" (cast
$indexto int) - Carousel: show first slide before Alpine.js initialization (was invisible)
- Carousel: normalize UUID keys from Filament Repeater (
array_values) - All blocks: prevent
Storage::url('')404 when image path is empty - File persistence: persist Livewire
TemporaryUploadedFilebefore JSON serialization (was losing file paths in Repeaters) - AutoSave: fix
serialize()crash onTemporaryUploadedFileobjects
🧪 Tests
- 1200 tests, 0 failures