Docs/Components/Reorder

Reorder

Reorder is made of two components. <Reorder.Group> owns the ordered value array, and <Reorder.Item> renders each draggable row. When the user drags an item, onReorder receives the new array order.

Reorder
  • Rose
  • Violet
  • Mint
  • Amber
drag-reorder.tsxOpen ↗
import { Reorder } from 'motion-solidjs'
import { For, createSignal } from 'solid-js'

export const meta = {
  slug: 'drag-reorder',
  title: 'Reorder list',
  category: 'drag',
  description: 'Drag the rows to reorder them — values stay in sync.',
  tag: 'Reorder',
} as const

const initial = [
  { id: 'rose', label: 'Rose', color: 'bg-grad-rose' },
  { id: 'violet', label: 'Violet', color: 'bg-grad-violet' },
  { id: 'mint', label: 'Mint', color: 'bg-grad-mint' },
  { id: 'amber', label: 'Amber', color: 'bg-grad-amber' },
]

export default function DragReorder() {
  const [items, setItems] = createSignal(initial)

  return (
    <Reorder.Group axis="y" values={items()} onReorder={setItems} class="flex w-56 flex-col gap-2">
      <For each={items()}>
        {(it) => (
          <Reorder.Item
            value={it}
            class="flex cursor-grab items-center gap-3 rounded-2xl border border-border bg-card px-3 py-2 text-xs active:cursor-grabbing"
            whileTap={{ scale: 1.04 }}
          >
            <span class={`h-6 w-6 rounded-lg ${it.color}`} />
            <span class="font-medium">{it.label}</span>
            <span class="ml-auto text-fg-dim">⇅</span>
          </Reorder.Item>
        )}
      </For>
    </Reorder.Group>
  )
}

Group props

  • axis - 'x' or 'y'
  • values - current array, used to map drag distance to an index
  • onReorder - called with the new array order
  • as - tag name (default 'ul')

Item props

  • value - identifier used to look up this row in values
  • drag - true | 'x' | 'y', defaults to the group's axis
  • as - tag name (default 'li')