feat(web): player bar, playable track lists and Collection (M3)
ci / ts / ts (packages + web) (push) Successful in 53s
release / release (версия и заметки) (push) Successful in 6s
release / android (APK в релиз) (push) Successful in 2m33s

- player bar with cover, like and dislike, previous / play / next,
  shuffle, repeat, seek bar and volume; PlayerProvider lives with the
  signed-in shell and restores the last track and position paused
- clicking a row (or Enter) plays the list from that track with its
  context (album, search, history, collection); the current track is
  highlighted and rows have a like button; a reaction refreshes lists
- Collection: history grouped by day with clearing, likes with "play
  all" and dislikes, all with paging; sidebar section
- events and playback state are flushed when the page is hidden;
  player timers survive StrictMode remounts

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
mrleo1nidandClaude Opus 5.5 committed 2026-10-20 12:11:12 +03:00
1 parent ec3c2810c8
commit 976ffb574b
15 files changed
+803 -49

No files matched your search

+22
View File
@@ -15,6 +15,7 @@ import { SourcesPage } from '../pages/admin/SourcesPage';
import { UsersPage } from '../pages/admin/UsersPage';
import { AlbumPage } from '../pages/AlbumPage';
import { ArtistPage } from '../pages/ArtistPage';
import { CollectionPage } from '../pages/CollectionPage';
import { HomePage } from '../pages/HomePage';
import { LoginPage } from '../pages/LoginPage';
import { SearchPage, type SearchType } from '../pages/SearchPage';
@@ -126,6 +127,24 @@ const auditRoute = createRoute({
component: AuditPage,
});
const historyRoute = createRoute({
getParentRoute: () => appRoute,
path: '/collection/history',
component: () => <CollectionPage tab="history" />,
});
const likesRoute = createRoute({
getParentRoute: () => appRoute,
path: '/collection/likes',
component: () => <CollectionPage tab="likes" />,
});
const dislikesRoute = createRoute({
getParentRoute: () => appRoute,
path: '/collection/dislikes',
component: () => <CollectionPage tab="dislikes" />,
});
const searchRoute = createRoute({
getParentRoute: () => appRoute,
path: '/search',
@@ -194,6 +213,9 @@ const routeTree = rootRoute.addChildren([
homeRoute,
settingsRoute,
searchRoute,
historyRoute,
likesRoute,
dislikesRoute,
artistRoute,
albumRoute,
usersRoute,