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.