marcgabe15 / allotment

A React component for resizable split views

Home Page:https://allotment-storybook.netlify.app/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

CI status GitHub license NPM Netlify Status

Logo

Allotment

React split-pane component.

  • React-based: Integrate effortlessly into your existing React-based application.
  • Industry standard look and feel: Like VS Code's split view implementation? You're in luck! This component is derived from the same codebase.
  • Dynamic: Want to declaratively add and remove panes? We've got you covered.

Examples

You can find examples of using the library here.

Getting Started

Allotment is available from npm.

Prerequisites

Allotment has react and react-dom as peer dependencies.

yarn add react react-dom

Installation

yarn add allotment

Usage

import React from "react";
import { Allotment } from "allotment";
import "allotment/dist/style.css";

export const App = () => (
  <Allotment>
    <ComponentA>
    <ComponentB>
  </Allotment>
);

If you want more control over the behaviour of the individual panes you can use the Allotment.Pane component. This includes setting the minimum and maximum size of a pane, as well as whether to enable snapping behaviour.

<Allotment>
  <Allotment.Pane minSize={200}>
    <ComponentA>
  </Allotment.Pane>
  <Allotment.Pane snap>
    <ComponentB>
  </Allotment.Pane>
</Allotment>

Allotment props

All properties are optional.

defaultSizes

An array of initial sizes of the panes. If the sum of the sizes differs from the size of the container then the panes' sizes will be scaled proportionally.

<Allotment defaultSizes={[100, 200]}>
  <div />
  <div />
</Allotment>

maxSize (default: Infinity)

Maximum size of any pane.

minSize (default: 30)

Minimum size of any pane.

snap (default: false)

Enable snap to zero for all panes.

vertical (default: false)

Direction to split. If true then the panes will be stacked vertically, otherwise they will be stacked horizontally.

onChange

Callback that is fired when the pane sizes change (usually on drag). Recommended to add a debounce function to rate limit the callback. Passed an array of numbers.

Allotment.Pane props

maxSize

Maximum size of this pane. Overrides maxSize set on parent component.

minSize

Minimum size of this pane. Overrides minSize set on parent component.

snap

Enable snap to zero for this pane. Overrides snap set on parent component.

Styling

Allotment uses CSS variables for styling. You can customize the following default variables.

:root {
  --focus-border: #007fd4;
  --separator-border: #838383;
}

To control the feedback area size of the dragging area between panes you can call the exported setSashSize function with desired size in pixels. Set it to a larger value if you feel it's hard to resize the panes using the mouse. On touch devices the feedback area is always set to 20 pixels

Programmatic control

You can use a ref to get access to the Allotment component instance and call its reset method manually:

const ref = React.useRef(ref);

return (
  <div>
    <button
      onClick={() => {
        ref.current.reset();
      }}
    >
      Reset
    </button>
    <Allotment ref={ref}>
      <div />
      <div />
    </Allotment>
  </div>
);

Frequently asked questions

It's not working/I don't see anything

The Allotment component takes its width and height from the element which contains it. It does not come with an explicit width or height out of the box. It's easy to end up with a div of height zero by accident. For example, adding allotment to a brand new Create React App project without setting a height on a containing div won't work because the default root div itself has no height.

You should also check that the css has been imported/included, for example at the root of your application:

import "allotment/dist/style.css";

My content is larger than the containing pane. How can I let the user scroll?

The simplest approach is place your content inside a new div with width and height 100% and overflow auto. This div will have the same dimensions as the pane it's inside and if its content overflows the browser will provide scrolling behaviour.

Next.js

If you get an error when importing allotment in a Next.js project consider not including the module server-side. Allotment currently only works in a browser. It might be possible to produce sensible results server-side in the future so create an issue requesting this if interested.

See these issues for more discussion: Example usage with Next.js and SyntaxError: Cannot use import statement outside a module.

About

A React component for resizable split views

https://allotment-storybook.netlify.app/

License:MIT License


Languages

Language:TypeScript 88.5%Language:CSS 5.8%Language:JavaScript 5.6%Language:Shell 0.1%