Find the cast and crew shared by two movies or TV shows crosscredit.haltcase.dev

Explore shared people's credits in a drawer #7

Merged haltcase.dev
targeting main from feat/person-credits-drawer
Merged opened by and assigned to haltcase.dev
targeting main from feat/person-credits-drawer

Selecting a shared person opens a modal drawer with their comparison roles and on-demand movie/TV filmography. Credits merge acting roles and crew jobs by title type and ID, retain guest appearances, and include posters, years, search, and movie/TV filters. Each title can replace either comparison side using the normal shareable URL. A separate TMDB person link remains available.

Includes native modal focus containment, Escape/Close, opener focus restoration, results focus after replacement, and a mobile layout. Loading, empty, filtered-empty, and retry states are provided. Server functions validate inputs and TMDB responses; TanStack Query and the existing bounded server cache handle filmography reads.

Implements https://tangled.org/haltcase.dev/crosscredit/issues/6

Validation: pnpm check, pnpm typecheck, pnpm test (106 tests), and pnpm build passed. Regression tests cover role/job merging, movie/TV ID collisions, guest credits, malformed responses, cache reuse, and retry after invalid data. Build emits the existing CSS sourcemap warning.

Verified interactively in Brave: expanded, midpoint, and collapsed drawer states; full-width sticky background; readable TMDB link; complete person name at 390px and 320px widths; Escape closes and returns focus to the opener. The same photo and name morph into the bar, with the portrait becoming circular. A direct scroll handler updates one CSS progress variable without React re-renders; this avoids first-open text painting problems observed with native scroll timelines in Brave. Replacement actions show the current title names as stacked, non-underlined text buttons.

Commits 0