Socket
Socket
Sign inDemoInstall

@accessible/modal

Package Overview
Dependencies
Maintainers
1
Versions
21
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@accessible/modal

An accessible and versatile modal component for React


Version published
Weekly downloads
33
increased by200%
Maintainers
1
Weekly downloads
 
Created
Source

<Modal>

Bundlephobia Types Code coverage Build status NPM Version MIT License

npm i @accessible/modal

An accessible and versatile modal component for React

Features

  • Style-agnostic You can use this component with the styling library of your choice. It works with CSS-in-JS, SASS, plain CSS, plain style objects, anything!
  • Portal-friendly The modal target will render into React portals of your choice when configured to do so.
  • a11y/aria-compliant This component works with screen readers out of the box and manages focus for you.

Quick Start

Check out the example on CodeSandbox

import {Modal, Target, Trigger, Close} from '@accessible/modal'

const Component = () => (
  <Modal>
    <Target>
      <div className="my-modal">
        <Close>
          <button>Close me</button>
        </Close>
      </div>
    </Target>

    <Trigger>
      <button>Open me</button>
    </Trigger>
  </Modal>
)

API

Components

ComponentDescription
<Modal>This component creates the context for your modal box and trigger and contains some configuration options.
<Target>This component wraps any React element and turns it into a modal box.
<Trigger>This component wraps any React element and turns it into a modal trigger.
<Close>This is a convenience component that wraps any React element and adds an onClick handler to close the modal.

Hooks

HookDescription
useModal()This hook provides the value of the modal's ModalContextValue object.
useControls()This hook provides access to the modal's open, close, and toggle functions.
useIsOpen()This hook provides access to the modal's isOpen value.

<Modal>

This component creates the context for your modal box and trigger and contains some configuration options.

Props
PropTypeDefaultRequired?Description
defaultOpenbooleanfalseNoThis sets the default open state of the modal. By default the modal is closed.
openbooleanundefinedNoYou can control the open/closed state of the modal with this prop. When it isn't undefined, this value will take precedence over any calls to open(), close(), or toggle().
idstringundefinedNoBy default this component creates a unique id for you, as it is required for certain aria attributes. Supplying an id here overrides the auto id feature.
childrenReact.ReactNode | React.ReactNode[] | JSX.Element | ((context: ModalContextValue) => React.ReactNode)undefinedNoYour modal contents and any other children.

<Target>

This component wraps any React element and turns it into a modal target.

Props
PropTypeDefaultRequired?Description
portalboolean | string falseNoWhen true this will render the modal into a React portal with the id #portals. You can render it into any portal by providing its query selector here, e.g. #foobar, [data-portal=true], or .foobar.
closeOnEscapebooleantrueNoBy default the modal will close when the Escape key is pressed. You can turn this off by providing false here.
closedClassstringundefinedNoThis class name will be applied to the child element when the modal is closed.
openClassstringundefinedNoThis class name will be applied to the child element when the modal is open.
closedStyleReact.CSSPropertiesundefinedNoThese styles will be applied to the child element when the modal is closed in addition to the default styles that set the box's visibility.
openStyleReact.CSSPropertiesundefinedNoThese styles name will be applied to the child element when the modal is open in addition to the default styles that set the box's visibility.
childrenReact.ReactElementundefinedYesThe child is cloned by this component and has aria attributes injected into its props as well as the events defined above.
Example
<Target>
  <div className="alert">Alert</div>
</Target>

// <div
//   class="alert"
//   aria-hidden="true"
//   aria-modal="false"
//   id="modal--12"
//   role="dialog"
//   style="visibility: hidden; position: fixed; margin: auto; left: 0px; right: 0px; top: 50%; transform: translateY(-50%); z-index: 1;"
// >
//   Alert
// </div>

<Trigger>

This component wraps any React element and adds an onClick handler which toggles the open state of the modal target.

Props
PropTypeDefaultRequired?Description
closedClassstringundefinedNoThis class name will be applied to the child element when the modal is closed.
openClassstringundefinedNoThis class name will be applied to the child element when the modal is open.
closedStyleReact.CSSPropertiesundefinedNoThese styles will be applied to the child element when the modal is closed.
openStyleReact.CSSPropertiesundefinedNoThese styles name will be applied to the child element when the modal is open.
childrenReact.ReactElementundefinedYesThe child is cloned by this component and has aria attributes injected into its props as well as the events defined above.
<Trigger on="click">
  <button className="my-button">Open me!</button>
</Trigger>

// <button
//   class="my-button"
//   aria-controls="modal--12"
//   aria-haspopup="dialog"
//   aria-expanded="false"
// >
//   Open me!
// </button>

<Close>

This is a convenience component that wraps any React element and adds an onClick handler which closes the modal.

Props
PropTypeDefaultRequired?Description
childrenReact.ReactElementundefinedYesThe child is cloned by this component and has aria attributes injected into its props as well as the events defined above.
<Close>
  <button className="my-button">Close me</button>
</Close>

// <button
//   class="my-button"
//   aria-controls="modal--12"
//   aria-expanded="false"
// >
//   Close me
// </button>

useModal()

This hook provides the value of the modal's ModalContextValue object

Example
const Component = () => {
  const {open, close, toggle, isOpen} = useModal()
  return <button onClick={toggle}>Toggle the modal</button>
}

ModalContextValue

interface ModalContextValue {
  isOpen: boolean
  open: () => void
  close: () => void
  toggle: () => void
  id: string
}

useControls()

This hook provides access to the modal's open, close, and toggle functions

Example
const Component = () => {
  const {open, close, toggle} = useControls()
  return (
    <Target>
      <div className="my-modal">
        <button onClick={close}>Close me</button>
      </div>
    </Target>
  )
}

useIsOpen()

This hook provides access to the modal's isOpen value

Example
const Component = () => {
  const isOpen = useIsOpen()
  return (
    <Target>
      <div className="my-modal">Am I open? {isOpen ? 'Yes' : 'No'}</div>
    </Target>
  )
}

LICENSE

MIT

Keywords

FAQs

Package last updated on 25 Dec 2019

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc