pcln-modal

React component for modal

Usage no npm install needed!

<script type="module">
  import pclnModal from 'https://cdn.skypack.dev/pcln-modal';
</script>

README

pcln-modal

React modal component

npm i pcln-modal
import Modal from 'pcln-modal'

Modal Component

import { Modal } from 'pcln-modal'
;<Modal
  ariaLabel='This is an example Modal' //sets the aria-label of the DialogContent
  isOpen={true} //boolean for control this status of modal
  onClose={someFunc} //func function for handle close the modal while click on the overlay
  bg='white' //modal background color
  zIndex={5} //zIndex
  imgMode={false} //default false, will add padding to the modal, if true, then there will be no padding
  width={['100px', '200px']} //responsive width the modal
  header={<SomeHeaderComponent />} //Component for header, could import predefined ones too
  disableCloseButton={true} //there will be a floating close button, when enabledOverflow = true, it's there by default
  enableOverflow={false} //when enabled, the modal will extend over the screen based on content, otherwise it will follow height
  height={['100px', '200px']} //responsive height, when enableOverflow={true}, it's not in use
  verticalAlignment='middle' // Aligns dialog body vertically - options = ['middle', 'top', 'bottom']
  overlayAnimation={null} // Accepts a function which overwrites default animation
  dialogAnimation={null} // Accepts a function which overwrites default animation
  timeout={500} // Accepts a number which overwrites the default delay for the open animation to begin, default is 500ms
>
  <SomeChildComponent />
</Modal>

Note: <Modal> relies on values from theme, so it must be a descendent of <ThemeProvider> in order to work properly. Otherwise, you might experience errors like this:

Uncaught TypeError: Cannot read property '3' of undefined

ScrollLock helper

This helper class will prevent background scroll when modal is open. However, there can be only one instance of this helper is working in a page since it messes with body style

import { ScrollLock } from 'pcln-modal'

class SomeWrapper extends React.component {
  constructor(props) {
    super(props)
    this.scrollLock = new ScrollLock()
  }

  openModalFunc() {
    this.scrollLock.on()
    this.setState({
      modalOpen: true,
    })
  }

  closeModalFunc() {
    this.scrollLock.off()
    this.setState({
      modalOpen: false,
    })
  }
}

Overwriting Animations

For its animations, this Modal currently uses react-transition-group. This means that the following hooks are exposed during the animation life cycle: [ entering, entered, exiting, exited]

We can then use these states to write custom animations, like so:

const MY_ANIMATION = (transitionState) => `
  transform: scale(0.5);
  transition: transform .5s cubic-bezier(0.50, 0.00, 0.25, 1.00);
  ${transitionState === 'entering' ? `transform: scale(0.5);` : ''}
  ${transitionState === 'entered' ? `transform: scale(1);` : ''}
  ${transitionState === 'exiting' ? `transform: scale(0.5);` : ''}
  ${transitionState === 'exited' ? `transform: scale(0.5);` : ''}
`