DnD Kit

Vendor

Drag-and-drop primitives for sortable lists and Kanban boards.

Installation

pnpm add @dnd-kit/core @dnd-kit/sortable @dnd-kit/utilities

Usage

import {
  DndContext,
  SortableContext,
  SortableItem,
  arrayMove,
  verticalListSortingStrategy,
} from "@/components/vendor/dnd-kit"

function MyList() {
  const [items, setItems] = useState([...])

  function handleDragEnd(event) {
    const { active, over } = event
    if (over && active.id !== over.id) {
      setItems((items) => {
        const oldIndex = items.findIndex((i) => i.id === active.id)
        const newIndex = items.findIndex((i) => i.id === over.id)
        return arrayMove(items, oldIndex, newIndex)
      })
    }
  }

  return (
    <DndContext onDragEnd={handleDragEnd}>
      <SortableContext items={items.map(i => i.id)}>
        {items.map((item) => (
          <SortableItem key={item.id} id={item.id}>
            {item.name}
          </SortableItem>
        ))}
      </SortableContext>
    </DndContext>
  )
}

Examples

Components

DndContext

Wraps your draggable area. Provides sensors for pointer and keyboard interaction.

onDragEnd — Required. Called when item is dropped.
onDragStart — Optional. Called when dragging starts.
onDragOver — Optional. Called during drag over drop zones.
collisionDetection — Algorithm for detecting drops. Default: closestCorners.
SortableContext

Defines a sortable list. Wrap your sortable items in this.

items — Array of unique identifiers.
strategy — Sorting strategy (vertical, horizontal, or rect).
SortableItem

Individual draggable item with built-in drag styles.

id — Unique identifier for this item.
disabled — Disable dragging for this item.
as — Render as a different element (default: div).

Resources