JSPM

  • Created
  • Published
  • Downloads 25490
  • Score
    100M100P100Q154734F
  • License MIT

Collapse library based on css transition for React

Package Exports

  • @kunukn/react-collapse

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (@kunukn/react-collapse) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

react-collapse

Collapse component with CSS transition for elements with variable and dynamic height.

npm version npm downloads

Demo

CSS required

⚠️ ️You need to specify the transition property or add a class selector with style (transition) in your own stylesheet to add animation. Here is an example.

.collapse-css-transition {
  transition: height 300ms cubic-bezier(0.4, 0, 0.2, 1);
  overflow: hidden;
}

Installation for React 16.3+

(about 6kb)

npm i -S @kunukn/react-collapse@^1

or

yarn add @kunukn/react-collapse@^1

Installation for React 16.8+

(about 4kb)

npm i -S @kunukn/react-collapse

or

yarn add @kunukn/react-collapse

import Collapse from '@kunukn/react-collapse';
// or with require syntax
const Collapse = require('@kunukn/react-collapse');

<Collapse isOpen={true || false}>
  <div>Random content</div>
</Collapse>;

Properties

isOpen: PropTypes.boolean

Expands or collapses content.

children: PropTypes.node or render: PropTypes.func

One or multiple children with static, variable or dynamic height.

<Collapse isOpen={false || true}>
  <p>Paragraph of text</p>
  <p>Another paragraph is also OK</p>
  <p>Images and any other content are ok too</p>
  <img src="cutecat.gif" />
</Collapse>

or

<Collapse
  isOpen={ false || true }
  render={collapseState => (
    <div className="using-collapse-state-to-add-css-class " + collapseState>
      <p>I know the collapse state: {collapseState}</p>
      <p>Another paragraph is also OK</p>
      <p>Images and any other content are ok too</p>
      <img src="cutecat.gif" />
    </div>
  )}
/>

className: PropType.string

You can specify a className with your desired style and animation. By default collapse-css-transition will be added to the component.

transition: PropType.string

You can also specify a CSS transition in line by using the transition prop.

<Collapse transition="height 300ms cubic-bezier(.4, 0, .2, 1)">
  <p>Paragraph of text</p>
</Collapse>

elementType: PropType.string

You can specify the HTML element type for the collapse component. By default the element type is a div element.

<Collapse elementType="article">
  <p>Paragraph of text inside an article element</p>
</Collapse>

collapseHeight: PropType.string

You can specify the collapse height in CSS unit to partially show some content.

<Collapse collapseHeight="50px">
  <p>A long paragraph of text inside an article element</p>
</Collapse>

onChange = ({ collapseState, isMoving, hasReversed, collapseStyle }) => { /* your implementation */ }: PropTypes.func

Callback function for when your transition on height (specified in className) is started or finished. It can be used to trigger any function after transition is done.

onInit = ({ collapseState, collapseStyle }) => { /* your implementation */ }: PropTypes.func

Callback function for when the component has mounted.

ARIA and data attributes

Collapse transfers aria- and data- attributes to the component's rendered DOM element. For example this can be used to set the aria-hidden attribute:

<Collapse isOpen={isOpenState} aria-hidden={isOpenState ? 'false' : 'true'}>
  <p>Paragraph of text</p>
</Collapse>

Development and testing

To run development

npm start or yarn start

git clone [repo]
cd [repo]
npm i
npm start
open http://localhost:6007

or with yarn

git clone [repo]
cd [repo]
yarn
yarn start
open http://localhost:6007

To run example covering all features, use npm run storybook or yarn storybook.

CDN

https://unpkg.com/@kunukn/react-collapse/

<link rel="stylesheet" href="https://unpkg.com/@kunukn/react-collapse/dist/Collapse.css" />
<script src="https://unpkg.com/@kunukn/react-collapse/dist/Collapse.js"></script>

<script>
  var Collapse = window.Collapse;
</script>

Supported browsers

IE11 + Modern browsers

Supported React versions

  • React version 16.3+ : use Collapse version 1
  • React version 16.8+ : use Collapse version 2+

Used React 16.3 life-cycles

  • render // uses the style states to invoke CSS transition
  • componentDidMount // initial expanded or collapsed state
  • getDerivedStateFromProps // detect if isOpen props has changed and apply a new collapse state
  • componentDidUpdate // update style states from the four possible collapse states

Used React 16.8 life-cycles

  • render
  • useState
  • useEffect

Design goals

  • let the browser handle the animation using CSS transition
  • minimalistic - only have a Collapse component which updates on isOpen props
  • flexible - provide your own markup, styling and easing
  • interruptible - can be reversed during movement
  • simple api with onChange event hook
  • inert - when collapsed you should tab over the collapsed component
  • minimal in file size
  • availability - from cdn or npm install

This was created with heavily inspiration from

https://github.com/SparebankenVest/react-css-collapse 🎆