apps/docs/extend/plugins/feedback.mdx
The Feedback plugin manages the visual appearance of elements during drag operations. It promotes dragged elements to the browser's top layer using the Popover API, and injects CSS rules to handle positioning and to reset browser default popover styles.
This plugin is included by default when creating a new DragDropManager.
Use Feedback.configure() to customize the drop animation or other options:
const manager = new DragDropManager({ plugins: (defaults) => [ ...defaults, Feedback.configure({ dropAnimation: null }), ], });
```tsx React
import {DragDropProvider} from '@dnd-kit/react';
import {Feedback} from '@dnd-kit/dom';
function App() {
return (
<DragDropProvider
plugins={(defaults) => [
...defaults,
Feedback.configure({ dropAnimation: null }),
]}
>
</DragDropProvider>
);
}
<script setup>
import {DragDropProvider} from '@dnd-kit/vue';
import {Feedback} from '@dnd-kit/dom';
</script>
<template>
<DragDropProvider
:plugins="(defaults) => [...defaults, Feedback.configure({ dropAnimation: null })]"
>
<!-- ... -->
</DragDropProvider>
</template>
<script>
import {DragDropProvider} from '@dnd-kit/svelte';
import {Feedback} from '@dnd-kit/dom';
</script>
<DragDropProvider
plugins={(defaults) => [...defaults, Feedback.configure({ dropAnimation: null })]}
>
<!-- ... -->
</DragDropProvider>
import {DragDropProvider} from '@dnd-kit/solid';
import {Feedback} from '@dnd-kit/dom';
function App() {
return (
<DragDropProvider
plugins={(defaults) => [
...defaults,
Feedback.configure({ dropAnimation: null }),
]}
>
</DragDropProvider>
);
}
In addition to global configuration on the DragDropManager, you can configure the Feedback plugin on individual draggable or sortable entities using Feedback.configure() in the entity's plugins array. Per-entity options override the global configuration for that entity.
function Draggable({id}) { const {ref} = useDraggable({ id, plugins: [ Feedback.configure({ feedback: 'clone', dropAnimation: null, }), ], });
return <button ref={ref}>Draggable</button>; }
```ts Vanilla
import {Draggable, Feedback} from '@dnd-kit/dom';
const draggable = new Draggable({
id: 'draggable-1',
element,
plugins: [
Feedback.configure({
feedback: 'clone',
dropAnimation: null,
}),
],
}, manager);
'default' — the original element moves with the drag'clone' — a copy of the element stays in place while the original moves'move' — the element moves without a placeholder'none' — no visual feedback (useful for custom drag overlays)
</ParamField>
undefined (default) — use the built-in drop animationnull — disable the drop animation entirelyDropAnimationOptions — customize the duration and easing of the built-in animationDropAnimationFunction — provide a fully custom animation function
</ParamField>
By default, keyboard-driven moves animate with 250ms cubic-bezier(0.25, 1, 0.5, 1). This transition is automatically disabled when the user prefers reduced motion.
undefined (default) — use the built-in keyboard transitionnull — disable the transition (moves are instant, like pointer operations){ duration, easing } — customize the transition duration (in ms) and CSS easing function
</ParamField>
The Feedback plugin uses a CSS cascade layer named dnd-kit to reset user-agent popover styles (such as background, border, margin, and padding) that browsers apply to elements promoted to the top layer.
By default, this layer is injected at the beginning of the document's <head>, giving it the lowest cascade priority. This means your styles will take precedence without needing !important.
If you use a CSS framework that defines its own cascade layers (such as Tailwind CSS v4), you can explicitly declare the dnd-kit layer first to ensure it has the lowest priority:
@layer dnd-kit, base, components, utilities;