- ArtworkCard: add w-full to nova-card-media, use absolute inset-0 on img so
object-cover fills the max-height capped box instead of collapsing the width
- MasonryGallery.css: add width:100% to media container, position img
absolutely so top/bottom is cropped rather than leaving dark gaps
- Add React MasonryGallery + ArtworkCard components and entry point
- Add recommendation system: UserRecoProfile model/DTO/migration,
SuggestedCreatorsController, SuggestedTagsController, Recommendation
services, config/recommendations.php
- SimilarArtworksController, DiscoverController, HomepageService updates
- Update routes (api + web) and discover/for-you views
- Refresh favicon assets, update vite.config.js
- ArtworkDownloadController: fix resolveDownloadUrl() to use correct CDN
path: original/{h1}/{h2}/{hash}.{file_ext} (was wrong originals/h1/h2/h3/orig.webp)
Wrap incrementDownloads() in try/catch so Redis failure can't break the response
- ArtworkPage: move ArtworkAuthor from left column to right sidebar
Sidebar now stacks: Author → Actions → Awards (sticky top-24)
Mobile block follows same order above main content
- ArtworkActions: replace four stacked text buttons with a compact 4-col icon grid
Like (heart, rose when active), Save (star, amber when active),
Share (network icon), Report (flag icon, red on hover)
Download remains full-width orange CTA
- ArtworkAuthor: add icons to Profile (person) and Follow buttons
Follow shows circle-check icon; Following state shows user-plus icon