About this drop
The shell is a single rounded rect whose width, height, top inset and corner radius are Reanimated shared values, so every state, idle pill, listening orb, thinking loader and answer card, is the same object on a different spring rather than four views crossfading. Springs were fitted to 120fps screen recordings: the island to card morph travels in about 135ms and settles by 250ms, which is roughly a 0.55 damping ratio at 3.6Hz, and the measurements live in one metrics.ts file. Phase scheduling runs in a useFrameCallback on the UI runtime, so timers, the shader clock and the geometry never touch the JS thread; when nothing is animating the callback returns immediately and invalidates no canvas. The orb prism, the glass bevel and the six orbiting loader dots are Skia RuntimeEffect shaders driven by that same clock. Gesture.Pan drives an expand value directly while a second spring adds a small sideways swell, and release commits open. On iOS 26 the lens sits on expo-glass-effect and the shaders finish it optically; elsewhere it falls back to expo-blur, and useReducedMotion stops the breathing. Tested on Expo SDK 56 with React Native 0.85 and Reanimated 4.3 in a development build, Skia and glass rule out Expo Go.