Skip to content

SplitPane

Give two working regions the space they need, with a real resizable boundary.

Live — this one is real

Source

Drag the divider or focus it and use the arrow keys.

Preview

This panel receives 55% of the available space.

Usage

import { useState } from "react";
import { SplitPane } from "mizu-ui";

export function Example() {
  const [value, setValue] = useState(45);
  return (
    <SplitPane
      value={value}
      onValueChange={setValue}
      first={
        <div>
          <h3>Source</h3>
          <p className="mizu-field-hint">
            Drag the divider or focus it and use the arrow keys.
          </p>
        </div>
      }
      second={
        <div>
          <h3>Preview</h3>
          <p className="mizu-field-hint">
            This panel receives {100 - value}% of the available space.
          </p>
        </div>
      }
    />
  );
}

Source & setup

Import mizu-ui/styles.css once. Fonts are optional via mizu-ui/fonts.css. Override --mizu-* tokens or use className for local styling. Uses native React and CSS; install the package peers for root imports.

Inspect layout/SplitPane.tsx

Source is included in the npm package under src/layout/SplitPane.tsx.

Open full source ↗

Props

PropTypeDefaultDescription
first / secondReactNode—Two independent panels.
value / onValueChangenumber / function—Controlled percentage given to the first panel.
min / max / labelnumber / number / string15 / 85Bounds and separator name.

Accessibility

Focusable separator with orientation, controls and current/min/max values. Arrow keys move 1%, Shift moves 10%; Home/End reach bounds. Pointer capture supports touch.

Motion

Direct manipulation, no spring lag.

Works alongside