appandflow/react-native-ease1 file

React Native Ease Refactor

Scan for Animated/Reanimated code and migrate to EaseView

Specification
Skill ID
appandflow/react-native-ease/react-native-ease-refactor
Publisher
appandflow
Repository
react-native-ease
Installs
0
Files
1
Synced
Sep 23, 2026
How to use it

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:

  1. Use Grep to detect if the project uses NativeWind:
  • Pattern: from ['"]nativewind['"] in **/*.{ts,tsx,js,jsx}
  • Also check package.json for "nativewind" in dependencies
  • If NativeWind is detected, set a flag usesNativeWind = true for use in Phase 5
  1. Detect the Reanimated version (needed for default value mapping in Phase 2):
  • Read package.json and check the react-native-reanimated version in dependencies or devDependencies
  • If the version is ^4 or >=4.0.0, set reanimatedVersion = 4
  • Otherwise set reanimatedVersion = 3 (covers v2/v3 which share the same defaults)
  1. Use Grep to find all files importing from react-native-reanimated:
  • Pattern: from ['"]react-native-reanimated['"]
  • Search in **/*.{ts,tsx,js,jsx}
  1. Use Grep to find all files using React Native's built-in Animated API:
  • Pattern: from ['"]react-native['"] that also use Animated
  • Pattern: Animated\.View|Animated\.Text|Animated\.Image|Animated\.Value|Animated\.timing|Animated\.spring
  1. Use Grep to find files already using react-native-ease (to avoid re-migrating):
  • Pattern: from ['"]react-native-ease['"]
  1. 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:

  1. Uses gesture APIs? (Gesture.Pan, Gesture.Pinch, Gesture.Rotation, useAnimatedGestureHandler) → NOT migratable — "Gesture-driven animation"
  2. Uses scroll handler? (useAnimatedScrollHandler, onScroll with Animated.event) → NOT migratable — "Scroll-driven animation"
  3. Uses shared element transitions? (sharedTransitionTag) → NOT migratable — "Shared element transition"
  4. Uses `runOnUI` or worklet directives? → NOT migratable — "Requires worklet runtime"
  5. 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"

  1. Uses complex `interpolate()`? (more than 2 input/output values) → NOT migratable — "Complex interpolation"
  2. Uses `layout={...}` prop? → NOT migratable — "Layout animation"
  3. 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>"
  4. Uses different transition configs per property? (e.g., opacity uses 200ms timing, scale uses spring) → MIGRATABLE — map to TransitionMap with category keys (transform, opacity, borderRadius, backgroundColor, border, shadow, default)
  5. Not driven by state? (animation triggered by gesture/scroll value, not React state) → NOT migratable — "Not state-driven"
  6. Otherwise → MIGRATABLE

Migratable Pattern Mapping

Use this table to convert Reanimated/Animated patterns to EaseView:

Reanimated / Animated PatternEaseView Equivalent
useSharedValue + useAnimatedStyle + withTiming for opacity, translate, scale, rotate, borderRadius, backgroundColoranimate={{ prop: value }} + transition={{ type: 'timing', duration, easing }}
withSpringtransition={{ type: 'spring', damping, stiffness, mass, velocity }}
entering={FadeIn} / FadeIn.duration(N)initialAnimate={{ opacity: 0 }} + animate={{ opacity: 1 }} + timing transition
entering={FadeInDown} / FadeInUpinitialAnimate={{ opacity: 0, translateY: ±value }} + animate={{ opacity: 1, translateY: 0 }}
entering={SlideInLeft} / SlideInRightinitialAnimate={{ translateX: ±value }} + animate={{ translateX: 0 }}
entering={SlideInUp} / SlideInDowninitialAnimate={{ translateY: ±value }} + animate={{ translateY: 0 }}
entering={ZoomIn}initialAnimate={{ scale: 0 }} + animate={{ scale: 1 }}
exiting={FadeOut} / other exit animationsState-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.lineareasing: '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.

Use this skill