fix(gallery): fill tall portrait cards to full block width with object-cover crop

- 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
This commit is contained in:
2026-02-27 13:34:08 +01:00
parent 09eadf9003
commit 67ef79766c
37 changed files with 3096 additions and 58 deletions

View File

@@ -292,6 +292,20 @@ Route::middleware(['web', 'auth', 'normalize.username', 'throttle:60,1'])->group
->name('api.comments.reactions.toggle');
});
// ── Personalised suggestions (auth required) ────────────────────────────────
// GET /api/user/suggestions/creators → up to 12 suggested creators to follow
// GET /api/user/suggestions/tags → up to 20 suggested tags (foundation)
Route::middleware(['web', 'auth', 'normalize.username', 'throttle:30,1'])
->prefix('user/suggestions')
->name('api.user.suggestions.')
->group(function () {
Route::get('creators', \App\Http\Controllers\Api\SuggestedCreatorsController::class)
->name('creators');
Route::get('tags', \App\Http\Controllers\Api\SuggestedTagsController::class)
->name('tags');
});
// ── Follow system ─────────────────────────────────────────────────────────────
// POST /api/user/{username}/follow → follow a user
// DELETE /api/user/{username}/follow → unfollow a user