senke
9987b392ad
feat(queue): add collaborative queue UI (share link, session mode, polling sync)
2026-02-20 18:45:42 +01:00
senke
32b4a48c81
feat(player): add PiP button when supported (C3)
2026-02-20 17:52:46 +01:00
senke
8071fd2b16
feat(player): add gapless playback via preload (C2)
2026-02-20 17:05:41 +01:00
senke
4fcc1d4049
feat(player): implement crossfade from settings (C1)
2026-02-20 17:04:54 +01:00
senke
0cf68964a0
feat(player): Lot F - PlaybackSpeedControl, useMediaSession, waveform
...
- Add playbackSpeed to playerStore with setPlaybackSpeed action
- Add setPlaybackRate to AudioPlayerService
- Create PlaybackSpeedControl (0.5x–2x) and integrate in GlobalPlayer
- Create useMediaSession hook for OS controls (title, artwork, play/pause/next/prev)
- Add waveform preview in PlayerBarProgress (placeholder bars client-side)
- Update types, tests, and mocks
2026-02-20 00:40:53 +01:00
senke
753322b8ed
feat(queue): sync playerStore with backend API, migrate QueueView to usePlayerStore
...
- Add useQueueSync hook: restore queue on login, sync add/remove/reorder/clear
- Extend queueApi.getQueue to return queueItemIds for backend sync
- Migrate QueueView from useAudio to usePlayerStore + usePlayer
- Add ConfirmationDialog for Clear Queue button
- Add MSW handlers for GET/PUT/POST/DELETE queue endpoints
- Wire useQueueSync in DashboardLayout
2026-02-20 00:13:33 +01:00
senke
caa23312fe
chore: enable noUncheckedIndexedAccess, isolate ghost MSW handlers, document go-clamd tech debt
...
- Enable TypeScript noUncheckedIndexedAccess and fix 133 resulting errors
across 46 files with proper null guards, optional chaining, and fallbacks
- Extract education/gamification ghost feature MSW handlers into handlers-ghost.ts
- Add Storybook test plugin documentation in vitest.config.ts
- Document abandoned go-clamd dependency (2017) as tech debt in upload_validator.go
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-12 23:12:35 +01:00
senke
13476dda6e
feat(ui): Sidebar refactor, premium skeletons, ContentFadeIn transitions
...
- Sidebar: useSidebarNavigation hook, ARIA, token-based layout
- Layout: lg:ml-main-expanded/collapsed (replace arbitrary ml-64)
- TrackCardSkeleton + PlaylistCardSkeleton: KŌDŌ tokens, min-heights for CLS
- ContentFadeIn: 200ms fade-in with --ease-out
- TrackGrid, PlaylistList, LibraryPage: integrate skeletons + fade-in
- Player: player-bar subcomponents, useAudioAnalyser
- Tests: TrackGrid wrapper (QueryClient, ToastProvider)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-10 22:51:51 +01:00
senke
e67b861da4
fix(web): reduce developer portal console errors
...
- CSRF: hint uses VITE_BACKEND_PORT instead of hardcoded 8080
- Proxy: add /swagger to Vite dev server for Swagger doc.json (fixes YAMLException)
- playerService: validate media URL before load to avoid Invalid URI errors
- usePlayer: log invalid URL/network audio errors at DEBUG level
- SwaggerUI: log HTML-instead-of-JSON parse errors at DEBUG
- webhookService: log 5xx backend errors at DEBUG
- api client: log 5xx /webhooks errors at DEBUG (reduces duplicate noise)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-10 19:38:13 +01:00
senke
39f7967e1e
incus deployement fully implemented, Makefile updated and make fmt ran
2026-01-13 19:47:57 +01:00
senke
0eacac84b1
chore: resolve property mismatches and type conflicts for snake_case alignment
2026-01-07 11:15:48 +01:00
senke
ae1c9c2795
stabilizing apps/web: FIRST BATCH
2025-12-17 08:07:35 -05:00
senke
3f7bf2e2d3
stabilizing apps/web: SITUATION AWARENESS
2025-12-16 14:40:16 -05:00
senke
d33c351ac6
refonte: backend-api go first; phase 1
2025-12-12 21:34:34 -05:00
okinrev
8d6ce72bb2
report generation and future tasks selection
2025-12-08 19:57:54 +01:00
okinrev
f88d4740f3
BASE: completing the initial repo state
2025-12-03 22:56:50 +01:00