docs: update status and fix stale frontend docs (#446)

STATUS.md:
- add theme system (PR #441): CSS custom properties, dark/light/system toggle
- add mobile UX improvements (PR #443): ProfileMenu, /upload page, portal overhaul
- add player scroll timing fix (PR #445): faster animations, "view track" link
- add CI optimization (PR #444): path-based hook skipping
- add issue #440 to new features list (unified search)
- update last modified date

docs/frontend/toast-notifications.md:
- document action links feature (was listed as "not implemented")

docs/frontend/state-management.md:
- update preferences to include theme and hidden tags
- mention ProfileMenu component for mobile
- fix upload flow to reference /upload page instead of portal

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude <noreply@anthropic.com>

authored by zzstoatzz.io Claude and committed by GitHub a54bcf6f f0a5bb6f

Changed files
+51 -6
docs
+29 -1
STATUS.md
··· 47 47 48 48 ### December 2025 49 49 50 + #### light/dark theme and mobile UX overhaul (Dec 2-3) 51 + 52 + **theme system** (PR #441): 53 + - replaced hardcoded colors across 35 files with CSS custom properties 54 + - semantic tokens: `--bg-primary`, `--text-secondary`, `--accent`, etc. 55 + - theme switcher in settings: dark / light / system (follows OS preference) 56 + - removed zen mode feature (superseded by proper theme support) 57 + 58 + **mobile UX improvements** (PR #443): 59 + - new `ProfileMenu` component — collapses profile, upload, settings, logout into touch-optimized menu (44px tap targets) 60 + - dedicated `/upload` page — extracted from portal for cleaner mobile flow 61 + - portal overhaul — tighter forms, track detail links under artwork, fixed icon alignment 62 + - standardized section headers across home and liked tracks pages 63 + 64 + **player scroll timing fix** (PR #445): 65 + - reduced title scroll cycle from 10s → 8s, artist/album from 15s → 10s 66 + - eliminated 1.5s invisible pause at end of scroll animation 67 + - fixed duplicate upload toast (was firing twice on success) 68 + - upload success toast now includes "view track" link 69 + 70 + **CI optimization** (PR #444): 71 + - pre-commit hooks now skip based on changed paths 72 + - result: ~10s for most PRs instead of ~1m20s 73 + - only installs tooling (uv, bun) needed for changed directories 74 + 75 + --- 76 + 50 77 #### tag filtering system and SDK tag support (Dec 2) 51 78 52 79 **tag filtering** (PRs #431-434): ··· 230 257 - no AIFF/AIF transcoding support (#153) 231 258 232 259 ### new features 260 + - issue #440: unified search across tracks, artists, albums, and tags 233 261 - issue #146: content-addressable storage (hash-based deduplication) 234 262 - issue #155: add track metadata (genres, tags, descriptions) 235 263 - issue #334: add 'share to bluesky' option for tracks ··· 425 453 426 454 --- 427 455 428 - this is a living document. last updated 2025-12-02. 456 + this is a living document. last updated 2025-12-03.
+6 -4
docs/frontend/state-management.md
··· 142 142 - integrates with main tracks cache for like status 143 143 144 144 ### preferences 145 - - user preferences managed through `SettingsMenu.svelte` 145 + - user preferences managed through `ProfileMenu.svelte` (mobile) and `SettingsMenu.svelte` (desktop) 146 + - theme selection: dark / light / system (follows OS preference) 146 147 - accent color customization 147 148 - auto-play next track setting 149 + - hidden tags for discovery feed filtering 148 150 - persisted to backend via `/preferences/` API 149 151 - localStorage fallback for offline access 150 - - no dedicated state file - integrated into settings component 152 + - no dedicated state file - integrated into settings components 151 153 152 154 ### toast (`frontend/src/lib/toast.svelte.ts`) 153 155 - global notification system ··· 182 184 183 185 ### upload flow 184 186 185 - 1. user clicks upload on portal page 187 + 1. user clicks upload on dedicated `/upload` page (linked from portal or ProfileMenu) 186 188 2. `uploader.upload()` called - returns immediately 187 189 3. user navigates to homepage 188 190 4. homepage renders cached tracks instantly (no blocking) 189 191 5. upload completes in background 190 - 6. success toast appears 192 + 6. success toast appears with "view track" link 191 193 7. cache refreshes, homepage updates with new track 192 194 193 195 this avoids HTTP/1.1 connection pooling issues by using cached data instead of blocking on fresh fetches during long-running uploads.
+16 -1
docs/frontend/toast-notifications.md
··· 125 125 - **type-safe**: full TypeScript support with exported types 126 126 - **consistent patterns**: matches other Svelte 5 rune-based state managers 127 127 128 + ### action links 129 + 130 + toasts can include an optional action link: 131 + 132 + ```typescript 133 + export interface ToastAction { 134 + label: string; 135 + href: string; 136 + } 137 + 138 + // usage 139 + toast.success('track uploaded!', 3000, { label: 'view track', href: `/track/${trackId}` }); 140 + ``` 141 + 142 + action links render as styled anchor tags. internal links stay in the same tab; external links open in new tabs. 143 + 128 144 ## future enhancements 129 145 130 146 potential additions (not currently implemented): 131 147 - pause on hover to prevent auto-dismiss 132 148 - manual dismiss buttons 133 149 - progress bars for visual timing 134 - - action buttons (e.g., "undo" for reversible operations) 135 150 - toast queue limiting to prevent spam