Examples
Basic modals
Basic modals give users the option to either confirm or cancel an action. To flag an open modal, use the isOpen
property. To execute a callback when a modal is closed, use the onClose
property.
Scrollable modals
To enable keyboard-accessible scrolling of a modal’s content, pass tabIndex={0}
to the <Modal>
.
With a static description
To provide additional information about a modal, use the description
property. Descriptions are static and do not scroll with other modal content.
Top aligned
To override a modal's default center alignment, use the position
property. In this example, position
is set to "top", which moves the modal to the top of the screen.
Small modal
To adjust the size of a modal, use the variant
property. Modal variants include "small", "medium", "large", and "default".
The following example displays a "small" modal by passing in variant={ModalVariant.small}
.
Medium modal
The following example displays a "medium" modal by passing in variant={ModalVariant.medium}
.
Large modal
The following example displays a "large" modal by passing in variant={ModalVariant.large}
.
Custom width
To choose a specific width for a modal, use the width
property. The following example has a width
of "50%".
Custom header and footer
To add a custom header and footer to a modal, set the header
and footer
properties to a custom implementation. The following example passes title components into both the header and the footer and also passes an icon to the footer.
Title icon
To add an icon before a modal’s title, use the titleIconVariant
, which can be set to one of the predefined variants -- "success", "danger", "warning", "info", and "default" -- or to an imported custom icon. The following example uses a "warning" variant.
Custom title icon
To add a custom icon before a modal’s title, set titleIconVariant
to an imported custom icon. The following example imports and uses a bullhorn icon.
With wizard
To guide users through a series of steps in a modal, you can add a wizard to a modal. To configure the <Wizard>
, pass an array that contains a “name” and “component” value for each step into the steps
property.
With dropdown
To present a menu of actions or links to a user, you can add a dropdown to a modal. To allow the dropdown to visually break out of the modal container, set the menuAppendTo
property to “parent”. Handle the modal’s closing behavior by listening to the onEscapePress
callback on the <Modal>
component. This allows the "escape" key to collapse the dropdown without closing the entire modal.
With help
To help simplify and explain complex models, add a help popover. Only place a help icon at the modal level if its information applies to all content in the modal. If the help popover is specific to a particular modal section, place the help icon beside that section instead.
With form
To collect user input within a modal, you can add a form.
To submit the form from a button in the modal's footer (outside of the <Form>
), set the button's form
property equal to the form's id.
Props
Modal
Name | Type | Default | Description |
---|---|---|---|
childrenrequired | React.ReactNode | Content rendered inside the modal. | |
actions | any | [] | Action buttons to add to the standard modal footer. Ignored if the footer property is passed in. |
appendTo | HTMLElement | (() => HTMLElement) | () => document.body | The parent container to append the modal to. Defaults to "document.body". |
aria-describedby | string | '' | Id to use for the modal box descriptor. |
aria-label | string | '' | Accessible descriptor of the modal. |
aria-labelledby | string | '' | Id to use for the modal box label. |
bodyAriaLabel | string | Accessible label applied to the modal box body. This should be used to communicate important information about the modal box body div element if needed, such as that it is scrollable. | |
bodyAriaRole | string | Accessible role applied to the modal box body. This will default to "region" if the bodyAriaLabel property is passed in. Set to a more appropriate role as applicable based on the modal content and context. | |
className | string | '' | Additional classes added to the modal. |
description | React.ReactNode | Description of the modal. | |
disableFocusTrap | boolean | Flag to disable focus trap. | |
footer | React.ReactNode | Custom footer. | |
hasNoBodyWrapper | boolean | false | Flag indicating if modal content should be placed in a modal box body wrapper. |
header | React.ReactNode | Complex header (more than just text), supersedes the title property for header content. | |
help | React.ReactNode | Optional help section for the modal header. | |
id | string | undefined | An id to use for the modal box container. |
isOpen | boolean | false | Flag to show the modal. |
onClose | () => void | () => undefined as any | A callback for when the close button is clicked. |
onEscapePress | (event: KeyboardEvent) => void | Modal handles pressing of the escape key and closes the modal. If you want to handle this yourself you can use this callback function. | |
ouiaId | number | string | Value to overwrite the randomly generated data-ouia-component-id. | |
ouiaSafe | boolean | true | Set the value of data-ouia-safe. Only set to true when the component is in a static state, i.e. no animations are occurring. At all other times, this value must be false. |
position | literal | Alternate position of the modal. | |
positionOffset | string | Offset from alternate position. Can be any valid CSS length/percentage. | |
showClose | boolean | true | Flag to show the close button in the header area of the modal. |
title | string | '' | Simple text content of the modal header. Also used for the aria-label on the body. |
titleIconVariant | 'success' | 'danger' | 'warning' | 'info' | 'default' | React.ComponentType<any> | null | Optional alert icon (or other) to show before the title of the modal header. When the predefined alert types are used the default styling will be automatically applied. |
titleLabel | string | '' | Optional title label text for screen readers. |
variant | 'small' | 'medium' | 'large' | 'default' | 'default' | Variant of the modal. |
width | number | string | Default width of the modal. |
CSS variables
.pf-c-modal-box | --pf-c-modal-box--BackgroundColor | #fff | ||
.pf-c-modal-box | --pf-c-modal-box--BoxShadow | 0 1rem 2rem 0 rgba(3, 3, 3, 0.16), 0 0 0.5rem 0 rgba(3, 3, 3, 0.1) | ||
.pf-c-modal-box | --pf-c-modal-box--ZIndex | 500 | ||
.pf-c-modal-box | --pf-c-modal-box--Width | 100% | ||
.pf-c-modal-box | --pf-c-modal-box--MaxWidth | calc(100% - 2rem) | ||
.pf-c-modal-box | --pf-c-modal-box--m-sm--sm--MaxWidth | 35rem | ||
.pf-c-modal-box | --pf-c-modal-box--m-md--Width | 52.5rem | ||
.pf-c-modal-box | --pf-c-modal-box--m-lg--lg--MaxWidth | 70rem | ||
.pf-c-modal-box | --pf-c-modal-box--MaxHeight | calc(100% - 3rem) | ||
.pf-c-modal-box | --pf-c-modal-box--m-align-top--spacer | 0.5rem | ||
.pf-c-modal-box | --pf-c-modal-box--m-align-top--xl--spacer | 2rem | ||
.pf-c-modal-box | --pf-c-modal-box--m-align-top--MarginTop | 0.5rem | ||
.pf-c-modal-box | --pf-c-modal-box--m-align-top--MaxHeight | calc(100% - min(0.5rem, 3rem) - 0.5rem) | ||
.pf-c-modal-box | --pf-c-modal-box--m-align-top--MaxWidth | calc(100% - min(0.5rem * 2, 2rem)) | ||
.pf-c-modal-box | --pf-c-modal-box--m-danger__title-icon--Color | #c9190b | ||
.pf-c-modal-box | --pf-c-modal-box--m-warning__title-icon--Color | #f0ab00 | ||
.pf-c-modal-box | --pf-c-modal-box--m-success__title-icon--Color | #3e8635 | ||
.pf-c-modal-box | --pf-c-modal-box--m-info__title-icon--Color | #2b9af3 | ||
.pf-c-modal-box | --pf-c-modal-box--m-default__title-icon--Color | #009596 | ||
.pf-c-modal-box | --pf-c-modal-box__header--PaddingTop | 1.5rem | ||
.pf-c-modal-box | --pf-c-modal-box__header--PaddingRight | 1.5rem | ||
.pf-c-modal-box | --pf-c-modal-box__header--PaddingLeft | 1.5rem | ||
.pf-c-modal-box | --pf-c-modal-box__header--last-child--PaddingBottom | 1.5rem | ||
.pf-c-modal-box | --pf-c-modal-box__title--LineHeight | 1.3 | ||
.pf-c-modal-box | --pf-c-modal-box__title--FontFamily | '"RedHatDisplay", "Overpass", overpass, helvetica, arial, sans-serif' | ||
.pf-c-modal-box | --pf-c-modal-box__title--FontSize | 1.5rem | ||
.pf-c-modal-box | --pf-c-modal-box__title-icon--MarginRight | 0.5rem | ||
.pf-c-modal-box | --pf-c-modal-box__title-icon--Color | #151515 | ||
.pf-c-modal-box | --pf-c-modal-box__description--PaddingTop | 0.25rem | ||
.pf-c-modal-box | --pf-c-modal-box__body--MinHeight | calc(1rem * 1.5) | ||
.pf-c-modal-box | --pf-c-modal-box__body--PaddingTop | 1.5rem | ||
.pf-c-modal-box | --pf-c-modal-box__body--PaddingRight | 1.5rem | ||
.pf-c-modal-box | --pf-c-modal-box__body--PaddingLeft | 1.5rem | ||
.pf-c-modal-box | --pf-c-modal-box__body--last-child--PaddingBottom | 1.5rem | ||
.pf-c-modal-box | --pf-c-modal-box__header--body--PaddingTop | 1rem | ||
.pf-c-modal-box | --pf-c-modal-box--c-button--Top | calc(1.5rem) | ||
.pf-c-modal-box | --pf-c-modal-box--c-button--Right | 1rem | ||
.pf-c-modal-box | --pf-c-modal-box--c-button--sibling--MarginRight | calc(2rem + 0.5rem) | ||
.pf-c-modal-box | --pf-c-modal-box__footer--PaddingTop | 1.5rem | ||
.pf-c-modal-box | --pf-c-modal-box__footer--PaddingRight | 1.5rem | ||
.pf-c-modal-box | --pf-c-modal-box__footer--PaddingBottom | 1.5rem | ||
.pf-c-modal-box | --pf-c-modal-box__footer--PaddingLeft | 1.5rem | ||
.pf-c-modal-box | --pf-c-modal-box__footer--c-button--MarginRight | 1rem | ||
.pf-c-modal-box | --pf-c-modal-box__footer--c-button--sm--MarginRight | calc(1rem / 2) | ||
.pf-c-modal-box.pf-m-sm | --pf-c-modal-box--Width | 35rem | ||
.pf-c-modal-box.pf-m-md | --pf-c-modal-box--Width | 52.5rem | ||
.pf-c-modal-box.pf-m-lg | --pf-c-modal-box--Width | 70rem | ||
.pf-c-modal-box.pf-m-danger | --pf-c-modal-box__title-icon--Color | #c9190b | ||
.pf-c-modal-box.pf-m-warning | --pf-c-modal-box__title-icon--Color | #f0ab00 | ||
.pf-c-modal-box.pf-m-success | --pf-c-modal-box__title-icon--Color | #3e8635 | ||
.pf-c-modal-box.pf-m-default | --pf-c-modal-box__title-icon--Color | #009596 | ||
.pf-c-modal-box.pf-m-info | --pf-c-modal-box__title-icon--Color | #2b9af3 | ||
.pf-c-modal-box__header + .pf-c-modal-box__body | --pf-c-modal-box__body--PaddingTop | 1rem | ||
View source on GitHub