Skip to content
dnd-grid

AI agents: fetch the documentation index at llms.txt. Markdown versions are available by appending .md to any page URL, including this page's markdown.

Grid items

Working with grid items.

Basic items

Each child of DndGrid is a grid item. The child's key must match the layout id.

<DndGrid layout={layout}>
  <div key="a">Content A</div>
  <div key="b">Content B</div>
  <div key="c">Content C</div>
</DndGrid>

Styling items

Grid items are absolutely positioned with transforms. Style your content directly.

<DndGrid layout={layout}>
  <div key="widget" className="my-widget">
    <h2>Dashboard Widget</h2>
    <p>Widget content goes here</p>
  </div>
</DndGrid>
.my-widget {
  background: white;
  border-radius: 8px;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
  padding: 16px;
  height: 100%;
  overflow: auto;
}

Item behaviour

Use per-item fields to lock items, constrain size, or override grid settings.

const layout: Layout = [
  { id: "header", x: 0, y: 0, w: 12, h: 1, static: true },
  { id: "content", x: 0, y: 1, w: 8, h: 4, minW: 4, maxW: 10 },
  {
    id: "custom",
    x: 8,
    y: 1,
    w: 4,
    h: 4,
    draggable: false,
    resizable: true,
    bounded: true,
    resizeHandles: ["s", "e"],
  },
];

Resize handles support edges (n, e, s, w) and corners (ne, nw, se, sw).

Custom components

Custom components must forward ref, style, className, and event handlers.

import { forwardRef } from "react";

interface WidgetProps {
  title: string;
  children: React.ReactNode;
}

const Widget = forwardRef<HTMLDivElement, WidgetProps>(
  ({ title, children, ...props }, ref) => {
    return (
      <div ref={ref} {...props} className="widget">
        <h3>{title}</h3>
        {children}
      </div>
    );
  }
);

<DndGrid layout={layout}>
  <Widget key="a" title="Sales">
    <Chart data={salesData} />
  </Widget>
</DndGrid>

Drag regions

Limit dragging to a handle or exclude specific elements:

<DndGrid
  dragHandle=".drag-handle"
  dragCancel=".no-drag"
  layout={layout}
>
  <div key="a">
    <div className="drag-handle">Drag here</div>
    <button className="no-drag">Click me</button>
    <div>Content</div>
  </div>
</DndGrid>