Mini cast page
One small, cohesive person preview for every person tap inside a sheet or a card, in place of the bare slide-up sheets. It reads as the person page in small: the same header, the same section names, text links with ↗, glass only on floating chrome.
Round 1. From #442 (the weak slide-up sheets, alignment pass) and the sprint review. Builds on NathanLaneSheet (WelcomeSheets.tsx:393).
Today
iPhone 17 Pro Max simulator (iOS 26.5), ios/review at 25717998, staging, the smoke account. Jamie Lee Curtis → Film lineage → Janet Leigh; then Psycho's Awards sheet; Spotlight; Swipe's card back.
The person pageWhat the mini page has to echo: centered photo, name, department, Born and birthplace rows, the awards line, the section strip (Biography, Milestones, Family, Awards, Credits).
Film lineage → Janet LeighFamilyMemberSheet.tsx:36. About 674 pt of the 956 pt screen, for one rail and one marriage.
Awards sheet → a nomineeAwardsSection.tsx:221. Tapping Janet Leigh closes the sheet and pushes her whole page.
Swipe card back → castCardBack.tsx:303. A cast tap leaves Swipe for the full page. Season guest stars (season/[season].tsx:400) do the same.
Spotlight → a personSpotlight.tsx:95. Opens the full page over the results. You searched for them, so the page is the answer; I'd keep this.The shape: how the mini page appears and grows
The same mini page in three containers. Tap Janet Leigh in each phone (or use the buttons). Timings come from @/lib/motion; springs are drawn as their nearest curve.
Inside the mini page: states
The content every option shares, at rest in A's sheet. Order follows the person page; the one change is that Credits moves up to second, because a preview's first job is "who is this, and what were they in".
Where it opens
Every person tap from inside a sheet or a card. Taps on a showcase page (a title page's cast, the cast wall) and in Spotlight keep opening the full page.
| Where | Today | With the mini page | Its context line |
|---|---|---|---|
| Film lineage tree | FamilyMemberSheet (FamilyTree.tsx:250) | The mini page. Family gains a "See their family" row, hidden when they're already in the middle. Replaces FamilyMemberSheet. | Mother · Actor |
| Awards sheet, a nominee | Closes the sheet, pushes the page (AwardsSection.tsx:221) | The mini page takes the Awards sheet's place (one sheet on screen at a time); closing it returns to the title page. | Won · Best Supporting Actress, Golden Globes 1961 |
| Swipe card back, cast | Leaves Swipe for the page (CardBack.tsx:303) | The mini page over the deck; you stay on the card. | Marion Crane · 33 in Psycho |
| Season page, guest stars | Pushes the page (season/[season].tsx:400) | The mini page over the season. | Guest star · Episode 4 |
| Spotlight, a person | Pushes the page (Spotlight.tsx:95) | No change: searching for someone means you want their page. | n/a |
A, B and C compared
| A · Miniature sheet | B · Grows from the avatar | C · Peek and pop | |
|---|---|---|---|
| Content | Everything above: header, Biography (2 lines, ↗ links), Credits rail, Milestones, Family, Awards, See full page. | The same, in a floating card that scrolls inside. | Header and Credits only: a preview can't scroll or take taps. The rest is the menu (See full page, See their family, Share). |
| Sizes | Two detents: medium about 62% of the screen (520 of 844 pt here), large to just under the status bar. On a Pro Max about 590 pt at rest, against today's 674. | A 346 × 520 pt card floating over the dimmed, blurred page, then the whole screen. | A 326 × 392 pt preview with a 236 pt menu under it. |
| Into the full page | Tap the header (as today) or See full page at the end: the sheet goes down as the page pushes. usePerson is already loaded, so the page opens with no spinner. | Pull up, or tap the header: the card grows to fill the screen and the photo grows from 72 to 128 pt into the page's header. Back goes to where you tapped. | Tap the preview: it pops into the page. Or a plain tap on the person goes straight there. |
| Motion | 280 ms CHISEL up and down, SPRING.sheet between detents, pull to dismiss as every sheet. Reduce Motion: 120 ms fades. | 340 ms from the avatar, FOLD 460 ms into the page, 280 ms back into the face. Reduce Motion: crossfades. | 500 ms hold, carve(1) haptic, SPRING.snappy, 350 ms pop. Reduce Motion: fades. |
| VoiceOver | Modal; focus lands on the name ("Janet Leigh, Mother, Actor. See full page", a link). The grabber is adjustable: swipe up or down to change size, like native sheets. Scrub to close. | The same once open; the flight is decorative and skipped. | Holding isn't a VoiceOver gesture: each person needs a "Preview" custom action, which then reads like A. Two paths to keep in step. |
| Web | The same sheet. On wide screens it opens straight at large height, centered; Esc closes, focus is trapped, the wheel scrolls it. | A View Transition where the browser has it, a fade where it doesn't. | No hold on phone browsers (the browser's own image menu wins). Desktop could show it on hover. Otherwise taps open the page. |
| Android | The same drawn-glass sheet; back closes it, rows ripple. | Hand-built with Reanimated; untested on Android. | Long-press is natural, but the native preview is iOS only: a second, drawn version or none. |
| Cost | OTA, JS only. Sheet gets a detents prop. One new PersonPreview (about 220 lines) built from Page.Header, PosterRow, Milestones and AwardsLine, opened through one host; delete FamilyMemberSheet (181 lines). No new endpoint and no new rows: the same usePerson request the page makes. Risk: handing the scroll from medium to large; fall back to the grabber if it fights. | OTA if hand-built (measure the avatar, draw an overlay, animate it); Reanimated's shared transitions are still experimental. The step into the page needs a custom route transition. High native risk, about 2 to 3 times A. | expo-router's Link.Preview draws the native preview on iOS (check that it's in builds 3 and 4 before promising OTA). The tree still needs a tap that keeps you there, so it keeps a sheet as well: two ways to do one job. |
| Drops | The two stacked buttons; "Known for" and "Marriages" as headings (Marriages and Partners stay, dated, inside Family). | A sheet's familiar pull-to-dismiss (it's a card); some web and Android polish. | Discoverability: nobody holds a face by default. On web and Android it's mostly not there. |
| Fixes | T1, T2, T3, T4, T5 | T1, T2, T3, T4, T5 | T2, T4; T5 only for people who hold |
My recommendation
A, the miniature sheet. It reads as the person page in small (the same header, the same section names, the same ↗ links), it's the one sheet people already know how to pull and dismiss, and it works the same on iPhone, web and Android. It ships over the air as one component that replaces FamilyMemberSheet and costs no new rows. B is the prettiest moment, but its step into the page is a custom native transition with real risk, and the face-to-card move can come later on top of A. C hides behind a hold, isn't on web or Android, and still needs a sheet in the tree.
The build, if you pick A:
Sheetgainsdetents(medium, large) with SPRING.sheet and an adjustable grabber for VoiceOver.PersonPreviewmounted once and opened with the tapped person plus a context line; opened from a sheet, it takes that sheet's place.- Wire Film lineage, Awards nominees, Swipe's card-back cast and season guest stars; delete
FamilyMemberSheet; update design.md's tree paragraph and ui-patterns' sheet list.
Which one: A, B, C, a mix (A now, B's lift from the avatar later), or another round?

Psycho
Touch of Evil
The Manchurian Candidate
The Fog
Bye Bye Birdie
Halloween H20


