@react-forked/dnd (rfd)
Core characteristics
- Beautiful and natural movement of items
๐ -
Accessible: powerful keyboard and screen reader support
โฟ๏ธ -
Extremely performant
๐ - Clean and powerful api which is simple to get started with
- Plays extremely well with standard browser interactions
- Unopinionated styling
- No creation of additional wrapper dom nodes - flexbox and focus management friendly!
๐ฉโ๐ซ
Get started Alex Reardon has created a free course on egghead.io
@react-forked/dnd
as quickly as possible.
โ
Currently supported feature set - Vertical lists
โ - Horizontal lists
โ - Movement between lists (โค
โ โค) -
Virtual list support
๐พ - unlocking 10,000 items @ 60fps - Combining items
- Mouse
๐ญ , keyboard๐น โฟ๏ธ and touch๐ ๐ฑ (mobile, tablet and so on) support - Multi drag support
- Incredible screen reader support
โฟ๏ธ - we provide an amazing experience for english screen readers out of the box๐ฆ . We also provide complete customisation control and internationalisation support for those who need it๐ - Conditional dragging and conditional dropping
- Multiple independent lists on the one page
- Flexible item sizes - the draggable items can have different heights (vertical lists) or widths (horizontal lists)
- Add and remove items during a drag
- Compatible with semantic
<table>
reordering - table pattern -
Auto scrolling - automatically scroll containers and the window as required during a drag (even with keyboard
๐ฅ ) - Custom drag handles - you can drag a whole item by just a part of it
- Able to move the dragging item to another element while dragging (clone, portal) - Reparenting your
<Draggable />
- Create scripted drag and drop experiences
๐ฎ - Allows extensions to support for any input type you like
๐น ๐ฒ Tree support through the@atlaskit/tree
package- A
<Droppable />
list can be a scroll container (without a scrollable parent) or be the child of a scroll container (that also does not have a scrollable parent) - Independent nested lists - a list can be a child of another list, but you cannot drag items from the parent list into a child list
- Server side rendering (SSR) compatible - see resetServerContext()
- Plays well with nested interactive elements by default
๐ค
Motivation @react-forked/dnd
exists to create beautiful drag and drop for lists that anyone can use - even people who cannot see. For a good overview of the history and motivations of the project you can take a look at these external resources:
โ๏ธ
Not for everyone There are a lot of libraries out there that allow for drag and drop interactions within React. Most notable of these is the amazing react-dnd
. It does an incredible job at providing a great set of drag and drop primitives which work especially well with the wildly inconsistent html5 drag and drop feature. @react-forked/dnd
is a higher level abstraction specifically built for lists (vertical, horizontal, movement between lists, nested lists and so on). Within that subset of functionality @react-forked/dnd
offers a powerful, natural and beautiful drag and drop experience. However, it does not provide the breadth of functionality offered by react-dnd
. So @react-forked/dnd
might not be for you depending on what your use case is.
๐
Documentation ๐
About - Installation
- Examples and samples
- Get started (This is using react-beautiful-dnd)
- Design principles
- Animations
- Accessibility
- Browser support
๐
Sensors The ways in which somebody can start and control a drag
- Mouse dragging
๐ญ - Touch dragging
๐ ๐ฑ - Keyboard dragging
๐น โฟ๏ธ - Create your own sensor (allows for any input type as well as scripted experiences)
๐ ๏ธโ
API
-
<DragDropContext />
- Wraps the part of your application you want to have drag and drop enabled for -
<Droppable />
- An area that can be dropped into. Contains<Draggable />
s -
<Draggable />
- What can be dragged around -
resetServerContext()
- Utility for server side rendering (SSR)
๐บ
Guides -
<DragDropContext />
responders -onDragStart
,onDragUpdate
,onDragEnd
andonBeforeDragStart
- Combining
<Draggable />
s - Common setup issues
- Using
innerRef
- Setup problem detection and error recovery
- Rules for
draggableId
anddroppableId
s - Browser focus retention
- Customising or skipping the drop animation
- Auto scrolling
- Controlling the screen reader
- Use the html5
doctype
TypeScript
: type information- Dragging
<svg>
s - Avoiding image flickering
- Non-visible preset styles
- How we detect scroll containers
-
How we use dom events - Useful if you need to build on top of
@react-forked/dnd
-
Adding
<Draggable />
s during a drag (11.x behaviour) -โ ๏ธ Advanced - Setting up Content Security Policy
Patterns ๐ทโ
- Virtual lists
๐พ - Multi drag
- Tables
-
Reparenting a
<Draggable />
- Using our cloning API or your own portal
๐ฉโโ๏ธ
Support
๐
Read this in other languages โ๏ธ
Creator Alex Reardon @alexandereardon
Alex is no longer personally maintaning this project. The other wonderful maintainers are carrying this project forward.
๐ ๏ธ
Maintainer - Gabriel Santerre @100terres
- Many other @Atlassian's!
๐ค
Collaborators - Bogdan Chadkin @IAmTrySound