- Add .vd-ambient hero layer using poster as blurred backdrop with warm
orange radial glow, fading to page color
- Wrap player in .vd-player-wrap with gradient border + soft top halo +
deep shadow to make it the visual focal point
- Replace dotted meta list with .vd-meta__chip pills (drive-tone colors
for source, accent for HD) plus a .vd-author chip with initial avatar
- Toolbar becomes a floating glass card; like/dislike pill shows accent
ring on focus, hide button reveals danger color on hover only
- Merge description and tags into a single .vd-info card with section
headers; tag editor becomes inline popover
- Recommended rail header gets glowing gradient bar + subtitle with
count; items lift and zoom slightly on hover
- Mobile: player edge-to-edge, like/dislike split main row, hide
collapses to 44x44 icon button, ambient height/blur scaled down
- Sync rewrite notes to plan section 14.5
- Restructure layout: title + inline meta first, YouTube-style action pills,
collapsible description card, simplified tag editor.
- Replace Recommended rail !important overrides with a dedicated component
that reuses previewController/previewIntent so cards still play teasers
on hover (desktop) and tap-to-preview (mobile).
- Add proper mobile responsive breakpoints (768px / 480px): fix player
edge-bleed margin, raise touch targets to 44px, redesign actions row,
switch recommended rail to compact 128px-thumb horizontal cards on phone.
- Show dislike count alongside like count for visual symmetry (still
client-side only; backend dislike API not yet implemented).
When 115 '影视' directory videos are excluded by the scanner and removed
via DeleteVideo, the per-folder collection tags (e.g. 'Better Call Saul
S02', 'Season 1') used to remain in the tags table with zero references,
showing up in the tag cloud and admin UI as count=0 entries.
DeleteVideo now collects the affected tag_ids inside its transaction
and prunes those that are source='collection' and no longer referenced.
A migrate-time DELETE also self-heals databases that already accumulated
such orphans before this change.
Other tag sources (system / user / auto / legacy) are intentionally
preserved to avoid wiping curated labels.
Tests: TestDeleteVideoPrunesOrphanCollectionTag,
TestMigratePrunesPreexistingOrphanCollectionTags
Plan: 15.13