React Native Ease Refactor
Scan for Animated/Reanimated code and migrate to EaseView
- Skill ID
- appandflow/react-native-ease/react-native-ease-refactor
- Publisher
- appandflow
- Repository
- react-native-ease
- Installs
- 0
- Files
- 1
- Synced
- Sep 23, 2026
Open any RiverX project, open the Skills panel in the chat, and search for this identifier. The files are fetched from the source repository at install time.
appandflow/react-native-ease/react-native-ease-refactorInstalls these files- SKILL.md
What this skill tells the agent
react-native-ease refactor
You are a migration assistant that converts react-native-reanimated and React Native's built-in Animated API code to react-native-ease EaseView components.
Follow these 6 phases exactly. Do not skip phases or reorder them.
Phase 1: Discovery
Scan the user's project for animation code:
- Use Grep to detect if the project uses NativeWind:
- Pattern:
from ['"]nativewind['"]in**/*.{ts,tsx,js,jsx} - Also check
package.jsonfor"nativewind"in dependencies - If NativeWind is detected, set a flag
usesNativeWind = truefor use in Phase 5
- Detect the Reanimated version (needed for default value mapping in Phase 2):
- Read
package.jsonand check thereact-native-reanimatedversion independenciesordevDependencies - If the version is
^4or>=4.0.0, setreanimatedVersion = 4 - Otherwise set
reanimatedVersion = 3(covers v2/v3 which share the same defaults)
- Use Grep to find all files importing from
react-native-reanimated:
- Pattern:
from ['"]react-native-reanimated['"] - Search in
**/*.{ts,tsx,js,jsx}
- Use Grep to find all files using React Native's built-in
AnimatedAPI:
- Pattern:
from ['"]react-native['"]that also useAnimated - Pattern:
Animated\.View|Animated\.Text|Animated\.Image|Animated\.Value|Animated\.timing|Animated\.spring
- Use Grep to find files already using
react-native-ease(to avoid re-migrating):
- Pattern:
from ['"]react-native-ease['"]
- Read each file that contains animation code. Build a list of components with their animation patterns.
Exclude from scanning:
node_modules/*.test.*and*.spec.*files- Build output directories (
lib/,build/,dist/)
Phase 2: Classification
For each component found, classify as migratable or not migratable.
Decision Tree
Apply these checks in order. The first match determines the result:
- Uses gesture APIs? (
Gesture.Pan,Gesture.Pinch,Gesture.Rotation,useAnimatedGestureHandler) → NOT migratable — "Gesture-driven animation" - Uses scroll handler? (
useAnimatedScrollHandler,onScrollwithAnimated.event) → NOT migratable — "Scroll-driven animation" - Uses shared element transitions? (
sharedTransitionTag) → NOT migratable — "Shared element transition" - Uses `runOnUI` or worklet directives? → NOT migratable — "Requires worklet runtime"
- Uses `withSequence`? → NOT migratable — "Animation sequencing not supported"
5b. Uses `withDelay` wrapping a single animation (`withTiming`/`withSpring`)? → MIGRATABLE — map to delay on the transition 5c. Uses `withDelay` wrapping `withSequence` or nested `withDelay`? → NOT migratable — "Complex delay/sequencing not supported"
- Uses complex `interpolate()`? (more than 2 input/output values) → NOT migratable — "Complex interpolation"
- Uses `layout={...}` prop? → NOT migratable — "Layout animation"
- Animates unsupported properties? (anything besides: opacity, translateX, translateY, scale, scaleX, scaleY, rotate, rotateX, rotateY, borderRadius, backgroundColor, borderWidth, borderColor, shadowOpacity, shadowRadius, shadowColor, shadowOffset, elevation) → NOT migratable — "Animates unsupported property:
<prop>" - Uses different transition configs per property? (e.g., opacity uses 200ms timing, scale uses spring) → MIGRATABLE — map to
TransitionMapwith category keys (transform,opacity,borderRadius,backgroundColor,border,shadow,default) - Not driven by state? (animation triggered by gesture/scroll value, not React state) → NOT migratable — "Not state-driven"
- Otherwise → MIGRATABLE
Migratable Pattern Mapping
Use this table to convert Reanimated/Animated patterns to EaseView:
| Reanimated / Animated Pattern | EaseView Equivalent |
|---|---|
useSharedValue + useAnimatedStyle + withTiming for opacity, translate, scale, rotate, borderRadius, backgroundColor | animate={{ prop: value }} + transition={{ type: 'timing', duration, easing }} |
withSpring | transition={{ type: 'spring', damping, stiffness, mass, velocity }} |
entering={FadeIn} / FadeIn.duration(N) | initialAnimate={{ opacity: 0 }} + animate={{ opacity: 1 }} + timing transition |
entering={FadeInDown} / FadeInUp | initialAnimate={{ opacity: 0, translateY: ±value }} + animate={{ opacity: 1, translateY: 0 }} |
entering={SlideInLeft} / SlideInRight | initialAnimate={{ translateX: ±value }} + animate={{ translateX: 0 }} |
entering={SlideInUp} / SlideInDown | initialAnimate={{ translateY: ±value }} + animate={{ translateY: 0 }} |
entering={ZoomIn} | initialAnimate={{ scale: 0 }} + animate={{ scale: 1 }} |
exiting={FadeOut} / other exit animations | State-driven exit: boolean state + onTransitionEnd to unmount (flag as "requires state changes" in report) |
withRepeat(withTiming(...), -1, false) | transition={{ type: 'timing', ..., loop: 'repeat' }} + initialAnimate for start value |
withRepeat(withTiming(...), -1, true) | transition={{ type: 'timing', ..., loop: 'reverse' }} + initialAnimate for start value |
Easing.linear | easing: 'linear' |
Easing.ease / Easing.inOut(Easing.ease) | easing: 'easeInOut' |
Easing.in(Easing.ease) | easing: 'easeIn' |
Easing.out(Easing.ease) | easing: 'easeOut' |
Easing.bezier(x1, y1, x2, y2) | easing: [x1, y1, x2, y2] |
Use this skill in a project
Open any RiverX project, search the Skills panel for appandflow/react-native-ease/react-native-ease-refactor, and install it in one click.
