Modal

Basic usage#

const Example = () => {
  const [isOpened, setIsOpened] = useState(false);
 
  return (
    <>
      <Button onClick={() => setIsOpened(true)}>Open modal</Button>
 
      <Modal onCloseRequested={() => setIsOpened(false)} opened={isOpened}>
        <Modal.Backdrop />
        <Modal.Content>
          <Modal.CloseButton />
          <Modal.Header>
            <Modal.Title>Modal Title</Modal.Title>
          </Modal.Header>
          <Modal.Body>
            <p>Modal content</p>
          </Modal.Body>
          <Modal.Footer>
            <Button onClick={() => setIsOpened(false)}>Close</Button>
          </Modal.Footer>
        </Modal.Content>
      </Modal.CloseButton>
    </>
  );
};

Positions#

const Example = () => {
  const [modalInfo, setModalInfo] = useState({
    isOpened: false,
    justify: '',
    align: '',
  });
 
  return (
    <>
      <Button onClick={() => setModalInfo({ isOpened: true, justify: 'center', align: 'start' })}>Top center</Button>
      <Button onClick={() => setModalInfo({ isOpened: true, justify: 'center', align: 'center' })}>Center</Button>
      <Button onClick={() => setModalInfo({ isOpened: true, justify: 'center', align: 'end' })}>Bottom center</Button>
      <Button onClick={() => setModalInfo({ isOpened: true, justify: 'start', align: 'start' })}>Top left</Button>
      <Button onClick={() => setModalInfo({ isOpened: true, justify: 'end', align: 'start' })}>Top right</Button>
      <Button onClick={() => setModalInfo({ isOpened: true, justify: 'start', align: 'center' })}>Center left</Button>
      <Button onClick={() => setModalInfo({ isOpened: true, justify: 'end', align: 'center' })}>Center right</Button>
      <Button onClick={() => setModalInfo({ isOpened: true, justify: 'start', align: 'end' })}>Bottom left</Button>
      <Button onClick={() => setModalInfo({ isOpened: true, justify: 'end', align: 'end' })}>Bottom right</Button>
 
      <Modal
        align={modalInfo.align}
        justify={modalInfo.justify}
        onCloseRequested={() => setModalInfo(prev => ({ ...prev, isOpened: false }))}
        opened={modalInfo.isOpened}
      >
        <Modal.Backdrop />
        <Modal.Content>
          <Modal.CloseButton />
          <Modal.Header>
            <Modal.Title>Modal Title</Modal.Title>
          </Modal.Header>
          <Modal.Body>
            <p>Modal content</p>
          </Modal.Body>
          <Modal.Footer>
            <Button onClick={() => setModalInfo(prev => ({ ...prev, isOpened: false }))}>Close</Button>
          </Modal.Footer>
        </Modal.Content>
      </Modal>
    </>
  );
};

Nested modals#

const Example = () => {
  const [isOpenedModal1, setIsOpenedModal1] = useState(false);
  const [isOpenedModal2, setIsOpenedModal2] = useState(false);
  const [isOpenedModal3, setIsOpenedModal3] = useState(false);
  const [isOpenedModal4, setIsOpenedModal4] = useState(false);
  const [isOpenedModal5, setIsOpenedModal5] = useState(false);
 
  return (
    <>
      <Button onClick={() => setIsOpenedModal1(true)}>Open modal</Button>
 
      <Modal onCloseRequested={() => setIsOpenedModal1(false)} opened={isOpenedModal1}>
        <Modal.Backdrop />
        <Modal.Content>
          <Modal.CloseButton />
          <Modal.Header>
            <Modal.Title>Modal 1</Modal.Title>
          </Modal.Header>
          <Modal.Body>
            <p>Modal 1 content</p>
          </Modal.Body>
          <Modal.Footer>
            <Button onClick={() => setIsOpenedModal1(false)}>Close</Button>
            <Button onClick={() => setIsOpenedModal2(true)}>Open nested modal</Button>
          </Modal.Footer>
 
          <Modal
            align="start"
            justify="end"
            onCloseRequested={() => setIsOpenedModal2(false)}
            opened={isOpenedModal2}
          >
            <Modal.Backdrop />
            <Modal.Content>
              <Modal.CloseButton />
              <Modal.Header>
                <Modal.Title>Modal 2</Modal.Title>
              </Modal.Header>
              <Modal.Body>
                <p>Modal 2 content</p>
              </Modal.Body>
              <Modal.Footer>
                <Button onClick={() => setIsOpenedModal2(false)}>Close</Button>
                <Button onClick={() => setIsOpenedModal3(true)}>Open nested modal</Button>
              </Modal.Footer>
 
              <Modal
                align="start"
                justify="start"
                onCloseRequested={() => setIsOpenedModal3(false)}
                opened={isOpenedModal3}
              >
                <Modal.Backdrop />
                <Modal.Content>
                  <Modal.CloseButton />
                  <Modal.Header>
                    <Modal.Title>Modal 3</Modal.Title>
                  </Modal.Header>
                  <Modal.Body>
                    <p>Modal 3 content</p>
                  </Modal.Body>
                  <Modal.Footer>
                    <Button onClick={() => setIsOpenedModal3(false)}>Close</Button>
                    <Button onClick={() => setIsOpenedModal4(true)}>Open nested modal</Button>
                  </Modal.Footer>
 
                  <Modal
                    align="end"
                    justify="end"
                    onCloseRequested={() => setIsOpenedModal4(false)}
                    opened={isOpenedModal4}
                  >
                    <Modal.Backdrop />
                    <Modal.Content>
                      <Modal.CloseButton />
                      <Modal.Header>
                        <Modal.Title>Modal 4</Modal.Title>
                      </Modal.Header>
                      <Modal.Body>
                        <p>Modal 4 content</p>
                      </Modal.Body>
                      <Modal.Footer>
                        <Button onClick={() => setIsOpenedModal4(false)}>Close</Button>
                        <Button onClick={() => setIsOpenedModal5(true)}>Open nested modal</Button>
                      </Modal.Footer>
 
                      <Modal
                        align="end"
                        justify="start"
                        onCloseRequested={() => setIsOpenedModal5(false)}
                        opened={isOpenedModal5}
                      >
                        <Modal.Backdrop />
                        <Modal.Content>
                          <Modal.CloseButton />
                          <Modal.Header>
                            <Modal.Title>Modal 5</Modal.Title>
                          </Modal.Header>
                          <Modal.Body>
                            <p>Modal 5 content</p>
                          </Modal.Body>
                          <Modal.Footer>
                            <Button onClick={() => setIsOpenedModal5(false)}>Close</Button>
                          </Modal.Footer>
                        </Modal.Content>
                      </Modal>
                    </Modal.Content>
                  </Modal>
                </Modal.Content>
              </Modal>
            </Modal.Content>
          </Modal>
        </Modal.Content>
      </Modal>
    </>
  );
};