entropyconquers/react-native-reanimated-dnd/reanimated-dnd
Claude Code and agent skill by entropyconquers/react-native-reanimated-dnd
- community
Checking that the SKILL.md file is still in the repository.
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.
Install
npx vskill@latest install entropyconquers/react-native-reanimated-dnd/reanimated-dndSKILL.md
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
Peer dependencies (must be installed separately)
Required setup
Wrap your app root with GestureHandlerRootView:
Core Architecture
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.
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 draggable area to a specific handle region using Draggable.Handle:
The same pattern works for sortable items with SortableItem.Handle.
Pattern 3: Vertical Sortable List
Use the Sortable component for a reorderable list:
Sortable Props
| Prop | Type | Default | Description | |||
|---|---|---|---|---|---|---|
data | TData[] | required | Items (each must have id: string) | |||
renderItem | (props) => ReactNode | required | Item renderer | |||
direction | `"vertical" \ | "horizontal"` | "vertical" | List direction | ||
itemHeight | `number \ | number[] \ | (item, i) => number` | - | Item height (required for vertical) | |
itemWidth | number | - | Item width (required for horizontal) | |||
gap | number | 0 | Gap between items (horizontal only) | |||
paddingHorizontal | number | 0 | Container padding (horizontal only) | |||
enableDynamicHeights | boolean | false | Auto-measure item heights | |||
estimatedItemHeight | number | 60 | Fallback height for unmeasured items | |||
onHeightsMeasured | (heights) => void | - | Called with measured heights | |||
useFlatList | boolean | true | Use FlatList for virtualization | |||
itemKeyExtractor | (item, index) => string | item.id | Custom key extraction function | |||
style | StyleProp<ViewStyle> | - | ScrollView/FlatList style | |||
contentContainerStyle | StyleProp<ViewStyle> | - | Content container style |
SortableItem Props
| Prop | Type | Description | |
|---|---|---|---|
id | string | Unique item identifier | |
data | T | Item data | |
onMove | (id, from, to) => void | Called on position change | |
onDragStart | (id, position) => void | Drag started | |
onDrop | (id, position, allPositions?) => void | Item dropped | |
onDragging | (id, overItemId, yPosition) => void | Real-time drag position | |
style | StyleProp<ViewStyle> | Container style | |
animatedStyle | StyleProp<ViewStyle> | Animated style |
Pattern 4: Horizontal Sortable List
Pattern 5: Sortable Grid
SortableGrid Props
| Prop | Type | Default | Description | ||
|---|---|---|---|---|---|
data | TData[] | required | Grid items (each must have id: string) | ||
renderItem | (props) => ReactNode | required | Item renderer | ||
dimensions | GridDimensions | required | Grid configuration (see below) | ||
orientation | `"vertical" \ | "horizontal"` | "vertical" | Grid orientation | |
strategy | `"insert" \ | "swap"` | "insert" | How items reorder: insert shifts others, swap exchanges two | |
scrollEnabled | boolean | true | Enable scrolling | ||
itemKeyExtractor | (item, index) => string | item.id | Custom key extraction | ||
style | StyleProp<ViewStyle> | - | ScrollView style | ||
contentContainerStyle | StyleProp<ViewStyle> | - | Content style |
GridDimensions
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 95 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/reanimated-dnd/SKILL.md
Popularity
- Repository stars
- 964
- Repository forks
- 38
- Repository npm downloads, 7 days
- 27,257
- 7-day trend score
- 58
Stars and forks are for the whole GitHub repository, not this skill alone. Downloads are for the repository's npm package. Refreshed 18 Mar 2026, 7 months ago.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/entropyconquers/react-native-reanimated-dnd/reanimated-dnd)