/react-splitter

A resizable splitter for React that the grid templates in CSS rather than complex JavasScript resizing logic.

Primary LanguageTypeScriptMIT LicenseMIT

@geoffcox/react-splitter

A resizable splitter for React that leverages CSS display:grid

Live Demo

Features

  • Vertical (left|right) and Horizontal (top/bottom) splitting
  • Set initial split size
  • Reset to initial split with double-click
  • Minimum pane sizes
  • Sizes can be any CSS unit (e.g. px, %, fr, em, pt, cm, mm)
  • Nested splits with correct resizing
  • Customize the splitter size, colors, or render it yourself.

Technology

  • This splitter is built using React and Typescript.
  • CSS grid combined with a simple percentage split system provides accurate and responsive resizing.
  • Styled components provide high performance using dynamic styles.

Installation and Usage

See package/Readme.md

Known limitations

These are several limitations of the current release.

  • No keyboard control of splitter. The splitter can only be controlled with the mouse.
  • Resizing is immediate as the user drags the splitter. The resize may need to be debounced to correct visual update performance problems.
  • No callbacks for monitoring the split or pane resizing. For now, a workaround is to use something like react-measure to wrap children and observe sizing changes.

If you overcome these limitations in your own code, pull requests are appreciated. :-)

Change History

1.0.0 - First project publication

1.0.1 - Bug fixes

  • CSS was incorrect on the splitter preventing hover state
  • Peer dependencies should not have included styled-components nor react-measure as npm no longer auto-installs peer dependencies.

1.0.2 - Bug fixes

  • Rollup config was incorrect causing 1.0.1 to not be published correctly.

1.0.3 - Measurement reaction bug fix

  • Resize of split was not reacting to overall area decreasing where the splitter gets hidden

1.0.4 - Custom splitter rendering

  • Added optional splitterWidth/splitterHeight to props to allow caller to control splitter size
  • Added option renderSplitter function to allow caller to render a custom splitter
  • Updated default splitter to be thin line with same 5px hit area
  • Updated demo to optionally show custom rendered splitter
  • Fixed bug with cursor on top/bottom splitter

2.0.0 - Overhauled

  • Collapsed LeftRightSplit and TopBottomSplit into a single Split component
  • Leveraged minmax to remove the need for any complex math
  • Changed mouse events to pointer events for improved responsiveness
  • Fixed issues with dragging when browser is zoomed in
  • Added support for rest on double-click
  • Added support for default splitter colors
  • Passed key properties to splitter render props
  • Improved default splitter layout
  • Added customization control to the demo
  • Moved default splitter to separate module

2.0.1 - Reduced size

  • Removed map files from distribution

2.0.2 - Provided events

  • Added onSplitChanged to provide the primarySize as the splitter changes.
  • Added onMeasuredSizesChanged to provide content, left pane, splitter, and right pane pixels sizes as the splitter changes.

2.0.3 - Bug fixes

  • Export RenderSplitterProps from package
  • Export DefaultSplitter from package

2.1.0 - Remove styled-components dependency

  • Updated the Split and DefaultSplitter React components to use CSS variables rather than take a dependency on styled-components
  • Switched from rollup to webpack to support CSS-in-JS without requiring styled-components
  • Updated all HTML elements in Split with semantic class names.

2.1.1 - Fix issue with horizontal prop changes

  • Thanks to Quang Ngo for finding this issue and following up with me to get it fixed!
  • Updated Split to track dimensions and properly update if the horizontal prop changes.
  • Removed debounce. Since moving to CSS and CSS vars, it is no longer neccessary.