About this animation
A pull-to-refresh wrapper with a Skia Bézier sheet that stretches before releasing.
How it works
- A UI-thread pan value drives the content offset and Bézier control points.
- Crossing the threshold retains the elastic sheet while
onRefreshis pending. - A rotating bright marker and spring settle provide the completion flourish.
Install
npx expo install @shopify/react-native-skia react-native-gesture-handler react-native-reanimated react-native-workletsUsage
<ElasticPullRefresh onRefresh={() => reload()}><ScrollView>{content}</ScrollView></ElasticPullRefresh>Props
| Prop | Type | Default | Description |
|---|---|---|---|
children | ReactNode | — | Scroll content. |
onRefresh | () => Promise<void> | — | Refresh operation. |
threshold | number | 104 | Trigger distance. |
accentColor | string | '#675CFF' | Sheet color. |
Compatibility
Expo SDK 57, React Native 0.86, Reanimated 4.5, and Skia 2.6. iOS, Android, and web are supported but await device verification.
Accessibility
The wrapper announces a busy progress state while refreshing. Reduced Motion disables spinner rotation and uses a firm settle.




