Saga Found It
Saga · Prototype · Round 1 · 2026-10-10 · Sprint review #442

Found it, grown from the throw

Tonight's last swipe: the card flies off hard right, comes back from the left and slowly grows into a glass Found it. Three ways to do it, side by side. Throw the card (drag it right, or tap Throw), try to swipe the result away, and switch on slow motion or Reduce Motion.

Rounds · 1 (this): Today from the iOS simulator, three directions, the beat table.

Today

iPhone 17 Pro simulator (iOS 26.5), the ios/review dev client against staging, Tonight mode, one hard right swipe. Frames from a screen recording.

The card leaving to the right with the Found it stamp
0 ms · the throwThe card flies off right with its Found it stamp; carve(3) fires here.
Found it sliding in from the left as the deck slides right
70–520 ms · the page turnsThe deck and tab bar slide right; an opaque page slides in from the left (tabBarAway, 448 ms CHISEL).
Found it arriving with an empty poster frame and the next card still visible
~450 ms · arrivingThe poster frame is empty for a beat (a fresh w500 load), and the next card is still sliding off behind.
Found it at rest with Keep swiping and Done
~800 ms · at restThe buttons fade up last (280 ms). No haptic marks the landing.

The moment, side by side

Timings are the app's own: the throw DURATION.slow 280 ms CHISEL, the return GROW 580 ms, the deck stepping back FOLD 460 ms, glass rising on SPRING.sheet (damping 26, stiffness 280, mass 0.9). The dot track under each phone marks the haptics: a light cut at the throw and a success notification at the land. Glass is drawn in this page. In the app it's native Liquid Glass on iOS 26 and the drawn Glass on web and Android.

ALoop and rise
The thrown card loops around and settles center while a native glass panel grows up from the bottom, holding the title, where to watch and the buttons.
BThe ticket
The card returns from the left, then the glass grows out of it into a full-screen ticket. One sheen passes across it as it lands.
CDock
The card comes back small and docks into a glass sheet rising from the bottom. The sheet has two detents and can't be pulled away.

Try to swipe each result away: in A and B nothing moves. In C only the sheet moves, between its two detents, and a pull down springs back. Keep swiping or Done takes you back to the deck.

Beat by beat

A · Loop and rise (recommended)B · The ticketC · Dock
Motion
  1. 0 The card flies off right as thrown (280 ms CHISEL). The deck steps back and fades (FOLD), the tab bar drops away, and the title's still fades in behind.
  2. 350 The same card re-enters from the left edge, small and tilted, and grows to center over GROW 580 ms.
  3. 520 The glass panel rises from the bottom on SPRING.sheet, materializing as it comes (glassEffectStyle animate).
  4. 930 The card lands and the heading carves in (180 ms). The buttons work from here.
  1. 0 Throw, the deck steps back, the still fades in, as in A.
  2. 350 The card returns from the left and grows into its place on the ticket (GROW).
  3. 930 The glass grows outward from the card's edges to fill the screen (FOLD 460 ms). The words rise in, 40 ms apart.
  4. 1390 The ticket is whole: one sheen crosses it (700 ms). The buttons work.
  1. 0 Throw, the deck steps back, the still fades in sharp, as a hero.
  2. 350 The sheet rises to its middle detent on SPRING.sheet.
  3. 350 The card returns from the left at thumbnail size and arcs down into the sheet's corner (GROW).
  4. 930 It docks. The heading appears over the still. The buttons work.
Haptics cut() when the drag crosses the threshold (as today), carve(1) on release instead of carve(3), and one success notification when the card lands. A new found() in haptics.ts, the same on all three. The same, with the success when the sheen starts. Nothing else, so the sheen and the haptic read as one beat. The same, with the success as the card docks. Snapping to a detent ticks (tick()), like any sheet.
Can't be swiped away The card on Found it is a picture, not a SwipeCard, and the layer has no pan gesture. A touch shield covers the deck from the release until the land, so a second flick can't hit the next card. Dismiss only with Keep swiping or Done (Escape and Android back act as Keep swiping, as today). Same as A. The ticket fills the screen, so nothing behind it can be touched at all. The sheet moves only between its detents. A pull below the middle one rubber-bands back. That breaks the rule that every sheet pulls down to close, so it's a second sheet behavior to maintain.
Where to watch In the panel under the title: the provider's logo, "Streaming on Paramount+", "Included with your services" with its check, then the JustWatch credit. Same words as today. On the ticket's stub, below the perforation, then the credit. The stub gives it a clear home. In the sheet beside the docked poster. The large detent adds the overview, which Found it doesn't show today.
VoiceOver When the card lands, focus moves to the heading, read as "You found something to watch, Interstellar". The layer is accessibilityViewIsModal, so the deck behind can't be reached. The escape gesture (two-finger Z) is Keep swiping. With VoiceOver on, the motion runs in the Reduce Motion form. Same as A. The decorative sheen is hidden from VoiceOver. Same as A. The sheet's detents add an "Expand" action instead of making the user drag.
Reduce Motion All three: no flight and no loop. The card fades out where it was, and Found it cross-fades in whole (180 ms) with its glass already there. The success haptic still fires. Turn on the toggle above to see each.
Web and Android The same motion on Reanimated. The panel uses the drawn Glass (expo-blur on Android with blurMethod, backdrop blur on web), button hover on web and ripples on Android. Web has no haptics; the land is the cue. Escape is Keep swiping, focus stays in the dialog, and Android back is Keep swiping. Same. A screen-sized blur that grows while it animates is the costliest frame on mid-range Android: fall back to a fade there if it drops frames. Same. The detent drag works with a pointer on web, and keyboard users get the expanded view from a button.
Cost Low to medium, ships over the air. A FoundIt layout change, new choreography in onFound, the existing LiquidLayer with materialize (Spotlight already uses it), and one haptic helper. expo-glass-effect and expo-haptics are already in the build. Medium to high, ships over the air. A card-to-ticket morph, a perforated mask, and the sheen. The riskiest of the three for dropped frames. Medium, ships over the air. It needs Sheet to learn non-dismissible detents, a second way for sheets to behave.
What it drops The page turn, so the deck no longer slides right. The card itself is the thing that comes back. The tab-bar-free calm of A. It's the loudest option, and it gets louder on every find. The big centered poster. The title shrinks to a thumbnail at the moment it should be biggest.

Fixes in every option

My recommendation

A, Loop and rise. It's what you described: the card you threw comes back from the left and grows up into a glass overlay. The glass is the same native material as the tab bar, it reuses LiquidLayer's materialize from Spotlight, and it's the cheapest of the three. Nothing on it can be swiped, and the only ways out are the two buttons.

Two things are worth borrowing. From B, a single sheen across the panel as the card lands, if A feels too plain on the phone. From C, the overview, if you ever want Found it to say more. I'd skip C's sheet: one that can't be pulled away would be the only sheet in Saga that behaves that way.