Star on GitHub
npm install react-driftkit
Panes
Orientation
Draggable
on
Sizes
25% / 50% / 25%
Pane 0Drag handles to resize. Double-click to reset.
0
Pane 1Pane 1 content
1
Pane 2Pane 2 content
Prop Type Default
children
Two or more child elements to render in the split panes.
ReactNode[]
orientation
Split direction. 'horizontal' puts panes side-by-side; 'vertical' stacks them.
'horizontal' | 'vertical' 'horizontal'
defaultSizes
Uncontrolled initial sizes as ratios summing to 1 (e.g. [0.25, 0.5, 0.25]).
number[] equal split
sizes
Controlled sizes. When set, parent drives all pane sizes.
number[]
onSizesChange
Fires after a drag release with the committed sizes array.
(sizes: number[]) => void
onDrag
Fires continuously while dragging with the live sizes array.
(sizes: number[]) => void
minSize
Minimum size in pixels for any pane.
number 50
maxSize
Maximum size in pixels for any pane. No limit when omitted.
number
handleSize
Thickness of each drag handle in pixels.
number 8
handle
Render prop called once per boundary. Receives { index, isDragging, orientation }. Default empty div when omitted.
(info: HandleInfo) => ReactNode
persistKey
localStorage key to persist sizes across sessions. Omit to disable.
string
draggable
Whether the user can drag the handles.
boolean true
doubleClickReset
Double-click a handle to reset to defaultSizes (or equal split).
boolean true
style
Additional inline styles for the container.
CSSProperties {}
className
Additional CSS class for the container.
string ''

The container exposes data-orientation and data-dragging attributes. Panes expose data-pane={index}. Handles expose data-handle={index} and data-dragging when active.

tsx
import { ResizableSplitPane } from 'react-driftkit';

function App() {
  return (
    <ResizableSplitPane style={{ height: 400 }}>
      <div>Left pane</div>
      <div>Right pane</div>
    </ResizableSplitPane>
  );
}
typescript
type SplitOrientation = 'horizontal' | 'vertical';

interface HandleInfo {
  index: number;
  isDragging: boolean;
  orientation: SplitOrientation;
}

interface ResizableSplitPaneProps {
  children: ReactNode[];
  orientation?: SplitOrientation;
  defaultSizes?: number[];
  sizes?: number[];
  onSizesChange?: (sizes: number[]) => void;
  onDrag?: (sizes: number[]) => void;
  minSize?: number;
  maxSize?: number;
  handleSize?: number;
  handle?: (info: HandleInfo) => ReactNode;
  persistKey?: string;
  draggable?: boolean;
  doubleClickReset?: boolean;
  style?: CSSProperties;
  className?: string;
}

Enjoying react-driftkit?

Star the repo on GitHub to help more devs discover it.

Star on GitHub