Skip to content
Development
Skill

/reanimated-dnd

Integrate react-native-reanimated-dnd for drag-and-drop, sortable lists, sortable grids, and drop zones in React Native apps. Covers components, hooks, and all configuration options.

From plugin
react-native-reanimated-dnd
1.1k2 skills10 hooks
Install
$ npx -y skills add entropyconquers/react-native-reanimated-dnd --skill reanimated-dnd --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/reanimated-dnd

Context preview

The summary Claude sees to decide when to auto-load this skill.

Integrate react-native-reanimated-dnd for drag-and-drop, sortable lists, sortable grids, and drop zones in React Native apps. Covers components, hooks, and all configuration options.

SKILL.md

reanimated-dnd.SKILL.md
name: reanimated-dnd
description: "Integrate react-native-reanimated-dnd for drag-and-drop, sortable lists, sortable grids, and drop zones in React Native apps. Covers components, hooks, and all configuration options."
autoInvoke: true
priority: high
triggers:
  - "drag and drop"
  - "drag drop"
  - "dnd"
  - "sortable"
  - "sortable list"
  - "sortable grid"
  - "reorder"
  - "reorderable"
  - "draggable"
  - "droppable"
  - "drop zone"
  - "react-native-reanimated-dnd"
  - "reanimated dnd"
  - "drag handle"
  - "sortable items"
  - "grid reorder"
allowed-tools: Read, Grep, Glob, Edit, Write, Bash
model: sonnet

react-native-reanimated-dnd Integration Skill

**Version:** 2.0.0 **Category:** UI / Drag and Drop **Platform:** React Native (requires react-native-reanimated >=4.2.0, react-native-gesture-handler >=2.28.0, react-native-worklets >=0.7.0)

---

Overview

`react-native-reanimated-dnd` provides performant drag-and-drop primitives for React Native. It offers both high-level components and low-level hooks for:

  • **Drag & Drop**: Move items between drop zones
  • **Sortable Lists**: Vertical and horizontal reorderable lists
  • **Sortable Grids**: 2D grids with insert or swap reordering
  • **Constraints**: Axis locking, bounded dragging, collision detection
  • **Dynamic Heights**: Auto-measuring variable-height items in lists

All animations run on the UI thread via Reanimated worklets.

---

Installation

npm install react-native-reanimated-dnd
# or
yarn add react-native-reanimated-dnd

Peer dependencies (must be installed separately)

npm install react-native-reanimated react-native-gesture-handler react-native-worklets

Required setup

Wrap your app root with `GestureHandlerRootView`:

import { GestureHandlerRootView } from 'react-native-gesture-handler';

export default function App() {
  return (
    <GestureHandlerRootView style={{ flex: 1 }}>
      {/* Your app content */}
    </GestureHandlerRootView>
  );
}

---

Core Architecture

DropProvider (context - required for Draggable/Droppable)
├── Draggable (items that can be picked up)
│   └── Draggable.Handle (optional restricted drag area)
└── Droppable (zones that accept drops)

Sortable (self-contained vertical/horizontal list)
├── SortableItem (individual reorderable item)
│   └── SortableItem.Handle (optional restricted drag area)

SortableGrid (self-contained 2D grid)
├── SortableGridItem (individual grid cell)
│   └── SortableGridItem.Handle (optional restricted drag area)

**Key rule**: All data items MUST have an `id: string` property for tracking.

---

Pattern 1: Basic Drag & Drop

Use `DropProvider` + `Draggable` + `Droppable` to move items into drop zones.

import {
  DropProvider,
  Draggable,
  Droppable,
} from 'react-native-reanimated-dnd';

function DragDropExample() {
  const [droppedItem, setDroppedItem] = useState<string | null>(null);

  return (
    <DropProvider>
      <View style={styles.items}>
        <Draggable data={{ id: '1', label: 'Item A' }}>
          <View style={styles.item}>
            <Text>Item A</Text>
          </View>
        </Draggable>

        <Draggable data={{ id: '2', label: 'Item B' }}>
          <View style={styles.item}>
            <Text>Item B</Text>
          </View>
        </Draggable>
      </View>

      <Droppable onDrop={(data) => setDroppedItem(data.label)}>
        <View style={styles.dropZone}>
          <Text>{droppedItem ?? 'Drop here'}</Text>
        </View>
      </Droppable>
    </DropProvider>
  );
}

Draggable Props

| Prop | Type | Default | Description | |------|------|---------|-------------| | `data` | `TData` | required | Payload passed to drop handlers | | `draggableId` | `string` | auto | Unique identifier | | `dragDisabled` | `boolean` | `false` | Disable dragging | | `preDragDelay` | `number` | `0` | Delay in ms before drag starts | | `dragAxis` | `"x" \| "y" \| "both"` | `"both"` | Constrain movement axis | | `dragBoundsRef` | `RefObject<View>` | - | Constrain within a view | | `collisionAlgorithm` | `"center" \| "intersect" \| "contain"` | `"intersect"` | How to detect overlap with droppables | | `animationFunction` | `(toValue: number) => number` | - | Custom return animation | | `onDragStart` | `(data: TData) => void` | - | Called when drag begins | | `onDragEnd` | `(data: TData) => void` | - | Called when drag ends | | `onDragging` | `({ x, y, tx, ty, itemData }) => void` | - | Real-time position updates | | `onStateChange` | `(state: DraggableState) => void` | - | State transition callback |

Droppable Props

| Prop | Type | Default | Description | |------|------|---------|-------------| | `onDrop` | `(data: TData) => void` | required | Handle dropped items | | `dropDisabled` | `boolean` | `false` | Disable dropping | | `capacity` | `number` | `1` | Max items allowed | | `dropAlignment` | `DropAlignment` | `"center"` | Position alignment for dropped items | | `dropOffset` | `{ x: number, y: number }` | - | Fine-tune position after alignment | | `activeStyle` | `StyleProp<ViewStyle>` | - | Style applied when item hovers over | | `onActiveChange` | `(isActive: boolean) => void` | - | Called when hover state changes | | `droppableId` | `string` | auto | Unique identifier for the drop zone |

DropProvider Props

| Prop | Type | Description | |------|------|-------------| | `onDroppedItemsUpdate` | `(items: DroppedItemsMap) => void` | Track items across all zones | | `onDragging` | `({ x, y, tx, ty, itemData }) => void` | Global drag position tracking | | `onDragStart` | `(data) => void` | Any drag begins | | `onDragEnd` | `(data) => void` | Any drag ends | | `onLayoutUpdateComplete` | `() => void` | Called when layout updates finish |

DropAlignment values

`"center"` | `"top-left"` | `"top-center"` | `"top-right"` | `"center-left"` | `"center-right"` | `"bottom-left"` | `"bottom-center"` | `"bottom-right"`

---

Pattern 2: Drag Handles

Restrict the

Read more
Ships withreact-native-reanimated-dnd

A drag-and-drop library that finally works on React Native ✨ Powerful, performant, and built for the modern React Native developer

Get the whole plugin
Stats
1,054
Stars
43
Forks
Active
Maintenance
TypeScript
Language
MIT
License
11d ago
Last commit
1y ago
Created

Repo: entropyconquers/react-native-reanimated-dnd