feat(shorts): /shorts/{id} deep-link + URL sync + persistent mute + wheel nav
- New route /shorts/{video} opens the feed scrolled to that short.
Controller aborts 404 when the id doesn't resolve to a short or
isn't viewable by the current viewer, so bad links land on the
branded 404 (added in the next commit) rather than loading an
empty feed.
- The IntersectionObserver that detects the active short now
history.replaceState()s the URL to /shorts/{id} so copy-paste of
the address bar works, without pushing a navigation entry — the
back button still exits the feed in one step.
- Mute state is persisted in localStorage (shortsMuted = '0' | '1')
so unmuting once sticks across sessions. Default remains muted
to satisfy autoplay policies on first load.
- Mouse-wheel navigation moves one short per gesture with a 450 ms
debounce. Trackpad flicks no longer skip five shorts at once.
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
This commit is contained in:
1 parent
646d3e9d2a
commit
9e613c05d2
3 files changed
+67
-6
No files matched your search
@@ -34,6 +34,10 @@ Route::get('/videos/search', function (\Illuminate\Http\Request $request) {
|
||||
})->name('videos.search');
|
||||
Route::get('/trending', [VideoController::class, 'trending'])->name('videos.trending');
|
||||
Route::get('/shorts', [VideoController::class, 'shorts'])->name('videos.shorts');
|
||||
// Deep-link form: /shorts/{encoded-id} loads the feed scrolled to that short.
|
||||
// The resolveRouteBinding on Video decodes the id; if it's gone, 404 lands
|
||||
// on the branded errors/404 page.
|
||||
Route::get('/shorts/{video}', [VideoController::class, 'shortsFocused'])->name('videos.shorts.focused');
|
||||
Route::get('/videos/create', [VideoController::class, 'create'])->name('videos.create');
|
||||
// Redirect legacy numeric video IDs to encoded URLs (backward compatibility)
|
||||
Route::get('/videos/{numericId}', function ($numericId) {
|
||||
|
||||
Reference in new issue
Block a user