Reorderable List
wise-ui/reorderable-listFreeComponent
A drag-and-drop sortable list with smooth animations.
Live preview
live · rendered by the registry
Rendered by wise-ui on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://wise-ui.com/r/reorderable-list.jsonSource
1"use client"23import * as React from "react"4import {5 DndContext,6 closestCenter,7 KeyboardSensor,8 PointerSensor,9 useSensor,10 useSensors,11 DragOverlay,12 type DragStartEvent,13 type DragEndEvent,14} from "@dnd-kit/core"15import {16 arrayMove,17 SortableContext,18 sortableKeyboardCoordinates,19 useSortable,20 verticalListSortingStrategy,21} from "@dnd-kit/sortable"22import { CSS } from "@dnd-kit/utilities"23import { motion } from "motion/react"24import { cn } from "@/lib/utils"2526const EASE_OUT_QUART: [number, number, number, number] = [0.25, 1, 0.5, 1]2728interface ReorderableListProps<T extends { id: string | number }> {29 items: T[]30 onReorder: (items: T[]) => void31 renderItem: (item: T, index: number) => React.ReactNode32 className?: string33 itemClassName?: string34 gap?: number35 dragTarget?: "card" | "handle"36}3738interface SortableItemProps {39 id: string | number40 children: React.ReactNode41 className?: string42 isDragOverlay?: boolean43 activeId: string | number | null44 dragTarget: "card" | "handle"45}4647function SortableItem({48 id,49 children,50 className,51 isDragOverlay,52 activeId,53 dragTarget,54}: SortableItemProps) {55 const {56 attributes,57 listeners,58 setNodeRef,59 transform,60 transition,61 isDragging,62 } = useSortable({ id })6364 const style: React.CSSProperties = {65 transform: CSS.Transform.toString(transform),66 transition,67 }6869 const overlayStyle: React.CSSProperties = isDragOverlay70 ? {71 boxShadow: "0 8px 32px rgba(0,0,0,0.18)",72 transform: "scale(1.02)",73 }74 : {}7576 const dragProps = dragTarget === "card" ? { ...attributes, ...listeners } : {}7778 return (79 <motion.div80 ref={isDragOverlay ? undefined : setNodeRef}81 style={{ ...style, ...overlayStyle }}82 className={cn(83 "touch-none",84 dragTarget === "card" && "cursor-grab active:cursor-grabbing",85 isDragOverlay && "cursor-grabbing",86 isDragging && "opacity-40",87 className88 )}89 layout={!isDragOverlay}90 transition={{ duration: 0.3, ease: EASE_OUT_QUART }}91 {...dragProps}92 >93 {dragTarget === "handle" ? (94 <ReorderableListHandleContext.Provider95 value={{ attributes, listeners }}96 >97 {children}98 </ReorderableListHandleContext.Provider>99 ) : (100 children101 )}102 </motion.div>103 )104}105106// Context for drag handle107// eslint-disable-next-line @typescript-eslint/no-explicit-any108// … truncated
What it pulls in
npm packages
Files it writes
More from wise-ui
All 20 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Animated Tabsanimated-tabs | wise-ui | Components | Free | 3 deps | |
| Border Beamborder-beam | wise-ui | Components | Free | 3 deps | |
| Data Tabledata-table | wise-ui | Components | Free | 3 deps | |
| Dockdock | wise-ui | Components | Free | 3 deps | |
| Dot Matrixdot-matrix | wise-ui | Components | Free | 2 deps | |
| Editable Texteditable-text | wise-ui | Components | Free | 4 deps | |
| Gradient Sidebargradient-sidebar | wise-ui | Components | Free | 3 deps | |
| Kanban Boardkanban-board | wise-ui | Components | Free | 6 deps |
