react-native-ease-refactor

appandflow/react-native-ease · updated Apr 8, 2026

MDX-style export adds YAML metadata + attribution linking explainx.ai and this canonical listing URL.

$npx skills add https://github.com/appandflow/react-native-ease --skill react-native-ease-refactor
0 commentsdiscussion
summary

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.

skill.md

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
  2. Use Grep to find all files importing from react-native-reanimated:

    • Pattern: from ['"]react-native-reanimated['"]
    • Search in **/*.{ts,tsx,js,jsx}
  3. 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
  4. Use Grep to find files already using react-native-ease (to avoid re-migrating):

    • Pattern: from ['"]react-native-ease['"]
  5. 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"
  6. Uses complex interpolate()? (more than 2 input/output values) → NOT migratable — "Complex interpolation"
  7. Uses layout={...} prop? → NOT migratable — "Layout animation"
  8. Animates unsupported properties? (anything besides: opacity, translateX, translateY, scale, scaleX, scaleY, rotate, rotateX, rotateY, borderRadius, backgroundColor) → NOT migratable — "Animates unsupported property: <prop>"
  9. 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, default)
  10. Not driven by state? (animation triggered by gesture/scroll value, not React state) → NOT migratable — "Not state-driven"
  11. 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 }}
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]
Animated.Value + Animated.timing Same animate + transition pattern — convert to state-driven
Animated.Value + Animated.spring animate + transition={{ type: 'spring' }} — convert to state-driven
withDelay(ms, withTiming(...)) or withDelay(ms, withSpring(...)) transition={{ ..., delay: ms }} — add delay to the transition config
entering={FadeIn.delay(ms)} / any entering preset with .delay() initialAnimate + animate + transition={{ ..., delay: ms }}
Different withTiming/withSpring per property in useAnimatedStyle transition={{ opacity: { type: 'timing', ... }, transform: { type: 'spring', ... } }} (per-property map)

Default Value Mapping

CRITICAL: Reanimated and EaseView have different defaults. You MUST explicitly set values to preserve the original animation behavior. Do not rely on EaseView defaults matching Reanimated defaults.

withSpring → EaseView spring

Parameter Reanimated default EaseView default Action
damping 10 15 Must set damping: 10
stiffness 100 120 Must set stiffness: 100
mass 1 1 Same — omit

If the source code explicitly sets any of these values, carry them over as-is. If the source relies on Reanimated defaults (no explicit value), set the Reanimated default explicitly on the EaseView transition.

Example — bare withSpring(1) with no config:

// Before (Reanimated)
scale.value = withSpring(1);

// After (EaseView) — must set damping: 10, stiffness: 100 to match
transition={{ type: 'spring', damping: 10, stiffness: 100 }}

Note: Reanimated v3+ uses duration-based spring by default (duration: 550, dampingRatio: 1) when no physics params are set. If migrating code that uses withSpring without any config, use damping: 10, stiffness: 100 which matches the physics-based fallback. If the code explicitly sets dampingRatio/duration, convert using: damping = dampingRatio * 2 * sqrt(stiffness * mass).

withTiming → EaseView timing

Parameter Reanimated default EaseView default Action
duration 300 300 Same — omit
easing Easing.inOut(Easing.quad) 'easeInOut' (cubic) Must set easing: [0.455, 0.03, 0.515, 0.955]

The easing curves are different! Reanimated's default is quadratic ease-in-out, EaseView's is cubic. Always set the easing explicitly when the source doesn't specify one.

Example — bare withTiming(1) with no config:

// Before (Reanimated)
opacity.value = withTiming(1);

// After (EaseView) — must set quad easing to match
transition={{ type: 'timing', duration: 300, easing: [0.455, 0.03, 0.515, 0.955] }}

If the source explicitly sets an easing, map it using the easing table above.

Animated.timing (old RN API) → EaseView timing

Parameter RN Animated default EaseView default Action
duration 500 300 Must set duration: 500
easing Easing.inOut(Easing.ease) 'easeInOut' Same curve — omit

Animated.spring (old RN API) → EaseView spring

RN Animated uses friction/tension by default: friction: 7, tension: 40. These map to: stiffness = tension, damping = friction.

Parameter RN Animated default EaseView default Action
stiffness (tension) 40 120 Must set stiffness: 40
damping (friction) 7 15 Must set damping: 7
mass 1 1 Same — omit

Unit Conversions

  • Rotation: Reanimated uses '45deg' strings in transforms → EaseView uses 45 (number, degrees). Strip the 'deg' suffix and parse to number.
  • Translation: Both use DIPs (density-independent pixels). No conversion needed.
  • Scale: Both use unitless multipliers. No conversion needed.

Phase 3: Dry-Run Report

ALWAYS print this report before asking the user to select components. This report must be visible to the user before Phase 4.

Print a structured report. Do NOT apply any changes yet.

Format:

## Migration Report

### Summary
- Files scanned: X
- Components with animations: Y
- Migratable: Z  |  Not migratable: W

### Migratable Components

#### `path/to/file.tsx` — ComponentName
**Current:** Brief description of what the animation does and which API it uses
**Proposed:** What the EaseView equivalent looks like (include exact transition values with mapped defaults)
**Changes:** What will be added/removed/modified
**Note:** (only if applicable) "Requires state changes for exit animation" or other caveats

### Not Migratable (will be skipped)

#### `path/to/file.tsx` — ComponentName
**Reason:** Why it can't be migrated (from decision tree)

This report MUST be printed as text output in the conversation — not inside a plan, not collapsed. The user needs to read it before selecting components in Phase 4.


Phase 4: User Confirmation

CRITICAL: You MUST use the AskUserQuestion tool here. Do NOT use plan mode, do NOT use text prompts, do NOT ask inline. Call the AskUserQuestion tool directly.

Call AskUserQuestion with these exact parameters:

  • multiSelect: true
  • questions: a single question object with:
    • header: "Migrate"
    • question: "Which components should be migrated to EaseView? All are selected — deselect any to skip."
    • multiSelect: true
    • options: one entry per migratable component, each with:
      • label: the component name (e.g., "AnimatedButton")
      • description: file path and brief animation description (e.g., "src/components/animated-button.tsx — spring scale on press")

Example tool call for 2 migratable components:

{
  "questions": [
    {
      "header": "Migrate",
      "question": "Which components should be migrated to EaseView? All are selected — deselect any to skip.",
      "multiSelect": true,
      "options": [
        {
          "label": "AnimatedButton",
          "description": "src/components/simple/animated-button.tsx — spring scale on press"
        },
        {
          "label": "Collapsible",
          "description": "src/components/ui/collapsible.tsx — fade-in entering animation"
        }
      ]
    }
  ]
}

Wait for the user's response before proceeding. Do not enter plan mode. Do not apply any changes without the user selecting components.

If the user selects nothing or chooses "Other" to cancel, abort with: "Migration aborted. No changes were made."

Only proceed to Phase 5 with the components the user confirmed.


Phase 5: Apply Migrations

For each confirmed component, apply the migration:

Migration Steps (per component)

  1. Add EaseView import if not already present:

    import { EaseView } from 'react-native-ease';
    

1b. If usesNativeWind is true, check if import 'react-native-ease/nativewind' already exists in the project (search all files). If not, add it to the app's root entry point (e.g., _layout.tsx, App.tsx, or index.tsx — whichever is the earliest entry). This only needs to be done once across all migrations, not per component.

  1. Replace the animated view:

    • Animated.ViewEaseView
    • <Animated.View style={[styles.box, animatedStyle]}><EaseView style={styles.box} animate={{ ... }} transition={{ ... }}>
  2. Convert animation hooks to props:

    • Remove useSharedValue, useAnimatedStyle, withTiming, withSpring, withRepeat calls
    • Convert their values into animate, initialAnimate, and transition props
  3. Convert entering/exiting animations:

    • entering={FadeIn}initialAnimate={{ opacity: 0 }} on the EaseView + animate={{ opacity: 1 }}

    • For exiting: introduce a state variable and onTransitionEnd callback:

      const [visible, setVisible] = useState(true);
      const [mounted, setMounted] = useState
how to use react-native-ease-refactor

How to use react-native-ease-refactor on Cursor

AI-first code editor with Composer

1

Prerequisites

Before installing skills in Cursor, ensure your development environment meets these requirements:

  • Cursor installed and configured on your development machine
  • Node.js version 16.0+ with npm package manager (verify with node --version)
  • Active project directory or workspace where you want to add react-native-ease-refactor
2

Execute installation command

Execute the skills CLI command in your project's root directory to begin installation:

$npx skills add https://github.com/appandflow/react-native-ease --skill react-native-ease-refactor

The skills CLI fetches react-native-ease-refactor from GitHub repository appandflow/react-native-ease and configures it for Cursor.

3

Select Cursor when prompted

The CLI will show a list of available agents. Use arrow keys to navigate and space to select Cursor:

◆ Which agents do you want to install to?
│ ── Universal (.agents/skills) ── always included ────
│ • Amp
│ • Antigravity
│ • Cline
│ • Codex
│ ●Cursor(selected)
│ • Cursor
│ • Windsurf
4

Verify installation

Confirm successful installation by checking the skill directory location:

.cursor/skills/react-native-ease-refactor

Reload or restart Cursor to activate react-native-ease-refactor. Access the skill through slash commands (e.g., /react-native-ease-refactor) or your agent's skill management interface.

Security & Verification Notice

We perform automated surface-level scans (Gen AI Scanner, Socket, Snyk) during installation. These checks detect common vulnerabilities but do not guarantee complete security. Always review skill source code and verify the publisher's reputation before production use.

Skills execute code in your development environment. Always verify the publisher's identity, review recent commits, and test in isolated environments before production deployment.

List & Monetize Your Skill

Submit your Claude Code skill and start earning

GET_STARTED →

Use Cases

Task Automation & Efficiency

Automate repetitive workflows and reduce manual effort

Example

Generate reports, summarize documents, draft communications

Save 3-5 hours per week on routine tasks

Knowledge Enhancement

Learn new skills, understand complex topics, get expert guidance

Example

Explain concepts, provide examples, suggest learning resources

Accelerate learning and skill development by 2x

Quality Improvement

Enhance output quality through reviews, suggestions, and refinements

Example

Review drafts, suggest improvements, catch errors

Improve work quality by 30-40% with less effort

Implementation Guide

Prerequisites

  • Claude Desktop or compatible AI client with skill support
  • Clear understanding of task or problem to solve
  • Willingness to iterate and refine outputs

Time Estimate

15-45 minutes depending on use case complexity

Installation Steps

  1. 1.Install skill using provided installation command
  2. 2.Test with simple use case relevant to your work
  3. 3.Evaluate output quality and relevance
  4. 4.Iterate on prompts to improve results
  5. 5.Integrate into regular workflow if valuable

Common Pitfalls

  • Expecting perfect results without iteration
  • Not providing enough context in prompts
  • Using skill for tasks outside its intended scope
  • Accepting outputs without review and validation

Best Practices

✓ Do

  • +Start with clear, specific prompts
  • +Provide relevant context and constraints
  • +Review and refine all outputs before using
  • +Iterate to improve output quality
  • +Document successful prompt patterns

✗ Don't

  • Don't use without understanding skill limitations
  • Don't skip validation of outputs
  • Don't share sensitive information in prompts
  • Don't expect skill to replace human judgment

💡 Pro Tips

  • Be specific about desired format and style
  • Ask for multiple options to choose from
  • Request explanations to understand reasoning
  • Combine AI efficiency with human expertise

When to Use This

✓ Use When

Use when skill capabilities match your task, clear ROI on time saved, and you can validate outputs. Best for repetitive tasks, learning, and quality improvement.

✗ Avoid When

Avoid when task requires deep expertise you can't validate, involves sensitive decisions, or when learning process is more valuable than speed of completion.

Learning Path

  1. 1Familiarize yourself with skill capabilities and limitations
  2. 2Start with low-risk, non-critical tasks
  3. 3Progress to more complex and valuable use cases
  4. 4Build expertise through regular use and experimentation

Discussion

Product Hunt–style comments (not star reviews)
  • No comments yet — start the thread.
general reviews

Ratings

4.741 reviews
  • Sakura Thomas· Dec 20, 2024

    react-native-ease-refactor fits our agent workflows well — practical, well scoped, and easy to wire into existing repos.

  • Ira Chawla· Dec 12, 2024

    Keeps context tight: react-native-ease-refactor is the kind of skill you can hand to a new teammate without a long onboarding doc.

  • Rahul Santra· Nov 27, 2024

    Useful defaults in react-native-ease-refactor — fewer surprises than typical one-off scripts, and it plays nicely with `npx skills` flows.

  • Arya Lopez· Nov 11, 2024

    I recommend react-native-ease-refactor for anyone iterating fast on agent tooling; clear intent and a small, reviewable surface area.

  • Benjamin Menon· Nov 3, 2024

    react-native-ease-refactor is among the better-maintained entries we tried; worth keeping pinned for repeat workflows.

  • Benjamin Verma· Oct 22, 2024

    react-native-ease-refactor reduced setup friction for our internal harness; good balance of opinion and flexibility.

  • Pratham Ware· Oct 18, 2024

    Registry listing for react-native-ease-refactor matched our evaluation — installs cleanly and behaves as described in the markdown.

  • Dev Liu· Oct 2, 2024

    Solid pick for teams standardizing on skills: react-native-ease-refactor is focused, and the summary matches what you get after install.

  • Sakshi Patil· Sep 21, 2024

    Solid pick for teams standardizing on skills: react-native-ease-refactor is focused, and the summary matches what you get after install.

  • Ren Kapoor· Sep 9, 2024

    react-native-ease-refactor is among the better-maintained entries we tried; worth keeping pinned for repeat workflows.

showing 1-10 of 41

1 / 5