React Modal component offers a lightweight, multi-purpose popup to add dialogs to yours. Learn how to customize CoreUI React modal components easily. Multiple examples and tutorial.
Available in Other JavaScript Frameworks
CoreUI React Modal Component is also available for Angular, Bootstrap, and Vue. Explore framework-specific implementations below:
Introduction to Modal Component
A modal component is a fundamental part of modern UI design, providing a focused dialog that appears above the main content to capture user attention. In React applications, modal components are used to display important information, collect user input through form elements, or prompt users to take specific actions. When a modal is active, it typically prevents interaction with the rest of the page, ensuring users complete or dismiss the modal dialog before returning to the main UI. This approach helps manage user focus and streamlines workflows, making modal dialogs an essential tool for improving user experience. Modal components can display a variety of elements, such as text, forms, or notifications, and their appearance and behavior can be customized through React props to fit the needs of your application.
How to use React Modal Component?
Static modal component example
Below is a static react modal component example (meaning its position and display have been overridden). Included are the modal header, modal body (required for padding), and modal footer (optional). We ask that you include react modal headers with dismiss actions whenever possible, or provide another explicit dismiss action.
<CModal>
<CModalHeader>
<CModalTitle>React Modal title</CModalTitle>
</CModalHeader>
<CModalBody>
<p>React Modal body text goes here.</p>
</CModalBody>
<CModalFooter>
<CButton color="secondary">Close</CButton>
<CButton color="primary">Save changes</CButton>
</CModalFooter>
</CModal>You can also create a custom modal component in React, allowing you to pass props such as visible and onClose for greater flexibility and reusability.
Live demo
Toggle a working React modal component demo by clicking the button below. It will slide down and fade in from the top of the page. Integrating modal components is a common practice in modern web apps to improve user interaction and workflow.
import React, { useState } from 'react'
import { CButton, CModal, CModalBody, CModalFooter, CModalHeader, CModalTitle } from '@coreui/react'
export const ModalLiveDemoExample = () => {
const [visible, setVisible] = useState(false)
return (
<>
<CButton color="primary" onClick={() => setVisible(!visible)}>
Launch demo modal
</CButton>
<CModal
visible={visible}
onClose={() => setVisible(false)}
aria-labelledby="LiveDemoExampleLabel"
>
<CModalHeader>
<CModalTitle id="LiveDemoExampleLabel">Modal title</CModalTitle>
</CModalHeader>
<CModalBody>Woohoo, you're reading this text in a modal!</CModalBody>
<CModalFooter>
<CButton color="secondary" onClick={() => setVisible(false)}>
Close
</CButton>
<CButton color="primary">Save changes</CButton>
</CModalFooter>
</CModal>
</>
)
} import React, { useState } from 'react'
import { CButton, CModal, CModalBody, CModalFooter, CModalHeader, CModalTitle } from '@coreui/react'
export const ModalLiveDemoExample = () => {
const [visible, setVisible] = useState(false)
return (
<>
<CButton color="primary" onClick={() => setVisible(!visible)}>
Launch demo modal
</CButton>
<CModal
visible={visible}
onClose={() => setVisible(false)}
aria-labelledby="LiveDemoExampleLabel"
>
<CModalHeader>
<CModalTitle id="LiveDemoExampleLabel">Modal title</CModalTitle>
</CModalHeader>
<CModalBody>Woohoo, you're reading this text in a modal!</CModalBody>
<CModalFooter>
<CButton color="secondary" onClick={() => setVisible(false)}>
Close
</CButton>
<CButton color="primary">Save changes</CButton>
</CModalFooter>
</CModal>
</>
)
} Static backdrop
If you set a backdrop to static, your React modal component will behave as though the backdrop is static, meaning it will not close when clicking outside it. Click the button below to try it.
import React, { useState } from 'react'
import { CButton, CModal, CModalBody, CModalFooter, CModalHeader, CModalTitle } from '@coreui/react'
export const ModalStaticBackdropExample = () => {
const [visible, setVisible] = useState(false)
return (
<>
<CButton color="primary" onClick={() => setVisible(!visible)}>
Launch static backdrop modal
</CButton>
<CModal
backdrop="static"
visible={visible}
onClose={() => setVisible(false)}
aria-labelledby="StaticBackdropExampleLabel"
>
<CModalHeader>
<CModalTitle id="StaticBackdropExampleLabel">Modal title</CModalTitle>
</CModalHeader>
<CModalBody>
I will not close if you click outside me. Don't even try to press escape key.
</CModalBody>
<CModalFooter>
<CButton color="secondary" onClick={() => setVisible(false)}>
Close
</CButton>
<CButton color="primary">Save changes</CButton>
</CModalFooter>
</CModal>
</>
)
} import React, { useState } from 'react'
import { CButton, CModal, CModalBody, CModalFooter, CModalHeader, CModalTitle } from '@coreui/react'
export const ModalStaticBackdropExample = () => {
const [visible, setVisible] = useState(false)
return (
<>
<CButton color="primary" onClick={() => setVisible(!visible)}>
Launch static backdrop modal
</CButton>
<CModal
backdrop="static"
visible={visible}
onClose={() => setVisible(false)}
aria-labelledby="StaticBackdropExampleLabel"
>
<CModalHeader>
<CModalTitle id="StaticBackdropExampleLabel">Modal title</CModalTitle>
</CModalHeader>
<CModalBody>
I will not close if you click outside me. Don't even try to press escape key.
</CModalBody>
<CModalFooter>
<CButton color="secondary" onClick={() => setVisible(false)}>
Close
</CButton>
<CButton color="primary">Save changes</CButton>
</CModalFooter>
</CModal>
</>
)
} Scrolling long content
When modals become too long for the user’s viewport or device, they scroll independent of the page itself. Try the demo below to see what we mean.
import React, { useState } from 'react'
import { CButton, CModal, CModalBody, CModalFooter, CModalHeader, CModalTitle } from '@coreui/react'
export const ModalScrollingLongContentExample = () => {
const [visible, setVisible] = useState(false)
return (
<>
<CButton color="primary" onClick={() => setVisible(!visible)}>
Launch demo modal
</CButton>
<CModal
visible={visible}
onClose={() => setVisible(false)}
aria-labelledby="ScrollingLongContentExampleLabel"
>
<CModalHeader>
<CModalTitle id="ScrollingLongContentExampleLabel">Modal title</CModalTitle>
</CModalHeader>
<CModalBody>
<p>
Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis
in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
</p>
<p>
Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
lacus vel augue laoreet rutrum faucibus dolor auctor.
</p>
<p>
Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel
scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus
auctor fringilla.
</p>
<p>
Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis
in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
</p>
<p>
Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
lacus vel augue laoreet rutrum faucibus dolor auctor.
</p>
<p>
Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel
scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus
auctor fringilla.
</p>
<p>
Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis
in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
</p>
<p>
Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
lacus vel augue laoreet rutrum faucibus dolor auctor.
</p>
<p>
Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel
scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus
auctor fringilla.
</p>
<p>
Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis
in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
</p>
<p>
Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
lacus vel augue laoreet rutrum faucibus dolor auctor.
</p>
<p>
Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel
scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus
auctor fringilla.
</p>
<p>
Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis
in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
</p>
<p>
Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
lacus vel augue laoreet rutrum faucibus dolor auctor.
</p>
<p>
Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel
scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus
auctor fringilla.
</p>
<p>
Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis
in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
</p>
<p>
Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
lacus vel augue laoreet rutrum faucibus dolor auctor.
</p>
<p>
Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel
scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus
auctor fringilla.
</p>
</CModalBody>
<CModalFooter>
<CButton color="secondary" onClick={() => setVisible(false)}>
Close
</CButton>
<CButton color="primary">Save changes</CButton>
</CModalFooter>
</CModal>
</>
)
} import React, { useState } from 'react'
import { CButton, CModal, CModalBody, CModalFooter, CModalHeader, CModalTitle } from '@coreui/react'
export const ModalScrollingLongContentExample = () => {
const [visible, setVisible] = useState(false)
return (
<>
<CButton color="primary" onClick={() => setVisible(!visible)}>
Launch demo modal
</CButton>
<CModal
visible={visible}
onClose={() => setVisible(false)}
aria-labelledby="ScrollingLongContentExampleLabel"
>
<CModalHeader>
<CModalTitle id="ScrollingLongContentExampleLabel">Modal title</CModalTitle>
</CModalHeader>
<CModalBody>
<p>
Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis
in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
</p>
<p>
Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
lacus vel augue laoreet rutrum faucibus dolor auctor.
</p>
<p>
Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel
scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus
auctor fringilla.
</p>
<p>
Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis
in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
</p>
<p>
Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
lacus vel augue laoreet rutrum faucibus dolor auctor.
</p>
<p>
Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel
scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus
auctor fringilla.
</p>
<p>
Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis
in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
</p>
<p>
Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
lacus vel augue laoreet rutrum faucibus dolor auctor.
</p>
<p>
Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel
scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus
auctor fringilla.
</p>
<p>
Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis
in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
</p>
<p>
Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
lacus vel augue laoreet rutrum faucibus dolor auctor.
</p>
<p>
Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel
scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus
auctor fringilla.
</p>
<p>
Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis
in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
</p>
<p>
Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
lacus vel augue laoreet rutrum faucibus dolor auctor.
</p>
<p>
Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel
scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus
auctor fringilla.
</p>
<p>
Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis
in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
</p>
<p>
Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
lacus vel augue laoreet rutrum faucibus dolor auctor.
</p>
<p>
Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel
scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus
auctor fringilla.
</p>
</CModalBody>
<CModalFooter>
<CButton color="secondary" onClick={() => setVisible(false)}>
Close
</CButton>
<CButton color="primary">Save changes</CButton>
</CModalFooter>
</CModal>
</>
)
} You can also create a scrollable react modal component that allows scroll the modal body by adding scrollable prop.
import React, { useState } from 'react'
import { CButton, CModal, CModalBody, CModalFooter, CModalHeader, CModalTitle } from '@coreui/react'
export const ModalScrollingLongContent2Example = () => {
const [visible, setVisible] = useState(false)
return (
<>
<CButton color="primary" onClick={() => setVisible(!visible)}>
Vertically centered scrollable modal
</CButton>
<CModal
alignment="center"
scrollable
visible={visible}
onClose={() => setVisible(false)}
aria-labelledby="VerticallyCenteredScrollableExample2"
>
<CModalHeader>
<CModalTitle id="VerticallyCenteredScrollableExample2">Modal title</CModalTitle>
</CModalHeader>
<CModalBody>
<p>
Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis
in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
</p>
<p>
Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
lacus vel augue laoreet rutrum faucibus dolor auctor.
</p>
<p>
Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel
scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus
auctor fringilla.
</p>
<p>
Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis
in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
</p>
<p>
Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
lacus vel augue laoreet rutrum faucibus dolor auctor.
</p>
</CModalBody>
<CModalFooter>
<CButton color="secondary" onClick={() => setVisible(false)}>
Close
</CButton>
<CButton color="primary">Save changes</CButton>
</CModalFooter>
</CModal>
</>
)
} import React, { useState } from 'react'
import { CButton, CModal, CModalBody, CModalFooter, CModalHeader, CModalTitle } from '@coreui/react'
export const ModalScrollingLongContent2Example = () => {
const [visible, setVisible] = useState(false)
return (
<>
<CButton color="primary" onClick={() => setVisible(!visible)}>
Vertically centered scrollable modal
</CButton>
<CModal
alignment="center"
scrollable
visible={visible}
onClose={() => setVisible(false)}
aria-labelledby="VerticallyCenteredScrollableExample2"
>
<CModalHeader>
<CModalTitle id="VerticallyCenteredScrollableExample2">Modal title</CModalTitle>
</CModalHeader>
<CModalBody>
<p>
Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis
in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
</p>
<p>
Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
lacus vel augue laoreet rutrum faucibus dolor auctor.
</p>
<p>
Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel
scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus
auctor fringilla.
</p>
<p>
Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis
in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
</p>
<p>
Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
lacus vel augue laoreet rutrum faucibus dolor auctor.
</p>
</CModalBody>
<CModalFooter>
<CButton color="secondary" onClick={() => setVisible(false)}>
Close
</CButton>
<CButton color="primary">Save changes</CButton>
</CModalFooter>
</CModal>
</>
)
} Vertically centered
Add alignment="center to <CModal> to vertically center the React modal.
import React, { useState } from 'react'
import { CButton, CModal, CModalBody, CModalFooter, CModalHeader, CModalTitle } from '@coreui/react'
export const ModalVerticallyCenteredExample = () => {
const [visible, setVisible] = useState(false)
return (
<>
<CButton color="primary" onClick={() => setVisible(!visible)}>
Vertically centered modal
</CButton>
<CModal
alignment="center"
visible={visible}
onClose={() => setVisible(false)}
aria-labelledby="VerticallyCenteredExample"
>
<CModalHeader>
<CModalTitle id="VerticallyCenteredExample">Modal title</CModalTitle>
</CModalHeader>
<CModalBody>
Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis
in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
</CModalBody>
<CModalFooter>
<CButton color="secondary" onClick={() => setVisible(false)}>
Close
</CButton>
<CButton color="primary">Save changes</CButton>
</CModalFooter>
</CModal>
</>
)
} import React, { useState } from 'react'
import { CButton, CModal, CModalBody, CModalFooter, CModalHeader, CModalTitle } from '@coreui/react'
export const ModalVerticallyCenteredExample = () => {
const [visible, setVisible] = useState(false)
return (
<>
<CButton color="primary" onClick={() => setVisible(!visible)}>
Vertically centered modal
</CButton>
<CModal
alignment="center"
visible={visible}
onClose={() => setVisible(false)}
aria-labelledby="VerticallyCenteredExample"
>
<CModalHeader>
<CModalTitle id="VerticallyCenteredExample">Modal title</CModalTitle>
</CModalHeader>
<CModalBody>
Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis
in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
</CModalBody>
<CModalFooter>
<CButton color="secondary" onClick={() => setVisible(false)}>
Close
</CButton>
<CButton color="primary">Save changes</CButton>
</CModalFooter>
</CModal>
</>
)
} import React, { useState } from 'react'
import { CButton, CModal, CModalBody, CModalFooter, CModalHeader, CModalTitle } from '@coreui/react'
export const ModalVerticallyCenteredScrollableExample = () => {
const [visible, setVisible] = useState(false)
return (
<>
<CButton color="primary" onClick={() => setVisible(!visible)}>
Vertically centered scrollable modal
</CButton>
<CModal
alignment="center"
scrollable
visible={visible}
onClose={() => setVisible(false)}
aria-labelledby="VerticallyCenteredScrollableExample2"
>
<CModalHeader>
<CModalTitle id="VerticallyCenteredScrollableExample2">Modal title</CModalTitle>
</CModalHeader>
<CModalBody>
<p>
Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis
in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
</p>
<p>
Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
lacus vel augue laoreet rutrum faucibus dolor auctor.
</p>
<p>
Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel
scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus
auctor fringilla.
</p>
<p>
Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis
in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
</p>
<p>
Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
lacus vel augue laoreet rutrum faucibus dolor auctor.
</p>
</CModalBody>
<CModalFooter>
<CButton color="secondary" onClick={() => setVisible(false)}>
Close
</CButton>
<CButton color="primary">Save changes</CButton>
</CModalFooter>
</CModal>
</>
)
} import React, { useState } from 'react'
import { CButton, CModal, CModalBody, CModalFooter, CModalHeader, CModalTitle } from '@coreui/react'
export const ModalVerticallyCenteredScrollableExample = () => {
const [visible, setVisible] = useState(false)
return (
<>
<CButton color="primary" onClick={() => setVisible(!visible)}>
Vertically centered scrollable modal
</CButton>
<CModal
alignment="center"
scrollable
visible={visible}
onClose={() => setVisible(false)}
aria-labelledby="VerticallyCenteredScrollableExample2"
>
<CModalHeader>
<CModalTitle id="VerticallyCenteredScrollableExample2">Modal title</CModalTitle>
</CModalHeader>
<CModalBody>
<p>
Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis
in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
</p>
<p>
Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
lacus vel augue laoreet rutrum faucibus dolor auctor.
</p>
<p>
Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel
scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus
auctor fringilla.
</p>
<p>
Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis
in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
</p>
<p>
Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis
lacus vel augue laoreet rutrum faucibus dolor auctor.
</p>
</CModalBody>
<CModalFooter>
<CButton color="secondary" onClick={() => setVisible(false)}>
Close
</CButton>
<CButton color="primary">Save changes</CButton>
</CModalFooter>
</CModal>
</>
)
} Tooltips and popovers
<CTooltips> and <CPopovers> can be placed within react modals as needed. When modal components are closed, any tooltips and popovers within are also automatically dismissed.
import React, { useState } from 'react'
import {
CButton,
CModal,
CModalBody,
CModalFooter,
CModalHeader,
CModalTitle,
CLink,
CPopover,
CTooltip,
} from '@coreui/react'
export const ModalTooltipsAndPopoversExample = () => {
const [visible, setVisible] = useState(false)
return (
<>
<CButton color="primary" onClick={() => setVisible(!visible)}>
Launch demo modal
</CButton>
<CModal
alignment="center"
visible={visible}
onClose={() => setVisible(false)}
aria-labelledby="TooltipsAndPopoverExample"
>
<CModalHeader>
<CModalTitle id="TooltipsAndPopoverExample">Modal title</CModalTitle>
</CModalHeader>
<CModalBody>
<h5>Popover in a modal</h5>
<p>
This
<CPopover title="Popover title" content="Popover body content is set in this property.">
<CButton color="primary">button</CButton>
</CPopover>{' '}
triggers a popover on click.
</p>
<hr />
<h5>Tooltips in a modal</h5>
<p>
<CTooltip content="Tooltip">
<CLink>This link</CLink>
</CTooltip>{' '}
and
<CTooltip content="Tooltip">
<CLink>that link</CLink>
</CTooltip>{' '}
have tooltips on hover.
</p>
</CModalBody>
<CModalFooter>
<CButton color="secondary" onClick={() => setVisible(false)}>
Close
</CButton>
<CButton color="primary">Save changes</CButton>
</CModalFooter>
</CModal>
</>
)
} import React, { useState } from 'react'
import {
CButton,
CModal,
CModalBody,
CModalFooter,
CModalHeader,
CModalTitle,
CLink,
CPopover,
CTooltip,
} from '@coreui/react'
export const ModalTooltipsAndPopoversExample = () => {
const [visible, setVisible] = useState(false)
return (
<>
<CButton color="primary" onClick={() => setVisible(!visible)}>
Launch demo modal
</CButton>
<CModal
alignment="center"
visible={visible}
onClose={() => setVisible(false)}
aria-labelledby="TooltipsAndPopoverExample"
>
<CModalHeader>
<CModalTitle id="TooltipsAndPopoverExample">Modal title</CModalTitle>
</CModalHeader>
<CModalBody>
<h5>Popover in a modal</h5>
<p>
This
<CPopover title="Popover title" content="Popover body content is set in this property.">
<CButton color="primary">button</CButton>
</CPopover>{' '}
triggers a popover on click.
</p>
<hr />
<h5>Tooltips in a modal</h5>
<p>
<CTooltip content="Tooltip">
<CLink>This link</CLink>
</CTooltip>{' '}
and
<CTooltip content="Tooltip">
<CLink>that link</CLink>
</CTooltip>{' '}
have tooltips on hover.
</p>
</CModalBody>
<CModalFooter>
<CButton color="secondary" onClick={() => setVisible(false)}>
Close
</CButton>
<CButton color="primary">Save changes</CButton>
</CModalFooter>
</CModal>
</>
)
} Toggle between modals
Toggle between multiple modals with some clever placement of the visible props. Please note multiple modals cannot be opened at the same time — this method simply toggles between two separate modals.
import React, { useState } from 'react'
import { CButton, CModal, CModalBody, CModalFooter, CModalHeader, CModalTitle } from '@coreui/react'
export const ModalToggleBetweenModalsExample = () => {
const [visible, setVisible] = useState(false)
const [visible2, setVisible2] = useState(false)
return (
<>
<CButton color="primary" onClick={() => setVisible(!visible)}>
Open first modal
</CButton>
<CModal
visible={visible}
onClose={() => setVisible(false)}
aria-labelledby="ToggleBetweenModalsExample1"
>
<CModalHeader>
<CModalTitle id="ToggleBetweenModalsExample1">Modal 1 title</CModalTitle>
</CModalHeader>
<CModalBody>
<p>Show a second modal and hide this one with the button below.</p>
</CModalBody>
<CModalFooter>
<CButton
color="primary"
onClick={() => {
setVisible(false)
setVisible2(true)
}}
>
Open second modal
</CButton>
</CModalFooter>
</CModal>
<CModal
visible={visible2}
onClick={() => {
setVisible(true)
setVisible2(false)
}}
aria-labelledby="ToggleBetweenModalsExample2"
>
<CModalHeader>
<CModalTitle id="ToggleBetweenModalsExample2">Modal 2 title</CModalTitle>
</CModalHeader>
<CModalBody>
<p>Hide this modal and show the first with the button below.</p>
</CModalBody>
<CModalFooter>
<CButton
color="primary"
onClick={() => {
setVisible(true)
setVisible2(false)
}}
>
Back to first
</CButton>
</CModalFooter>
</CModal>
</>
)
} import React, { useState } from 'react'
import { CButton, CModal, CModalBody, CModalFooter, CModalHeader, CModalTitle } from '@coreui/react'
export const ModalToggleBetweenModalsExample = () => {
const [visible, setVisible] = useState(false)
const [visible2, setVisible2] = useState(false)
return (
<>
<CButton color="primary" onClick={() => setVisible(!visible)}>
Open first modal
</CButton>
<CModal
visible={visible}
onClose={() => setVisible(false)}
aria-labelledby="ToggleBetweenModalsExample1"
>
<CModalHeader>
<CModalTitle id="ToggleBetweenModalsExample1">Modal 1 title</CModalTitle>
</CModalHeader>
<CModalBody>
<p>Show a second modal and hide this one with the button below.</p>
</CModalBody>
<CModalFooter>
<CButton
color="primary"
onClick={() => {
setVisible(false)
setVisible2(true)
}}
>
Open second modal
</CButton>
</CModalFooter>
</CModal>
<CModal
visible={visible2}
onClick={() => {
setVisible(true)
setVisible2(false)
}}
aria-labelledby="ToggleBetweenModalsExample2"
>
<CModalHeader>
<CModalTitle id="ToggleBetweenModalsExample2">Modal 2 title</CModalTitle>
</CModalHeader>
<CModalBody>
<p>Hide this modal and show the first with the button below.</p>
</CModalBody>
<CModalFooter>
<CButton
color="primary"
onClick={() => {
setVisible(true)
setVisible2(false)
}}
>
Back to first
</CButton>
</CModalFooter>
</CModal>
</>
)
} Change animation
The variable $modal-fade-transform determines the transform state of React Modal component before the modal fade-in animation, whereas the variable $modal-show-transform determines the transform state of Modal component after the modal fade-in animation.
If you want a zoom-in animation, for example, set $modal-fade-transform: scale(.8).
Remove animation
For modals that simply appear rather than fade into view, set transition to false.
<CModal transition={false}>...</CModal>Accessibility
Be sure to add aria-labelledby="...", referencing the modal title, to <CModal /> Additionally, you may give a description of your modal dialog with aria-describedby on <CModal>. Note that you don’t need to add role="dialog, aria-hidden="true", and aria-modal="true" since we already add it.
Optional sizes
Modals have three optional sizes, available via modifier classes to be placed on a <CModal>. These sizes kick in at certain breakpoints to avoid horizontal scrollbars on narrower viewports.
| Size | Property size | Modal max-width |
|---|---|---|
| Small | 'sm' | 300px |
| Default | None | 500px |
| Large | 'lg' | 800px |
| Extra large | 'xl' | 1140px |
import React, { useState } from 'react'
import { CButton, CModal, CModalBody, CModalHeader, CModalTitle } from '@coreui/react'
export const ModalOptionalSizesExample = () => {
const [visibleXL, setVisibleXL] = useState(false)
const [visibleLg, setVisibleLg] = useState(false)
const [visibleSm, setVisibleSm] = useState(false)
return (
<>
<CButton color="primary" onClick={() => setVisibleXL(!visibleXL)}>
Extra large modal
</CButton>
<CButton color="primary" onClick={() => setVisibleLg(!visibleLg)}>
Large modal
</CButton>
<CButton color="primary" onClick={() => setVisibleSm(!visibleSm)}>
Small modal
</CButton>
<CModal
size="xl"
visible={visibleXL}
onClose={() => setVisibleXL(false)}
aria-labelledby="OptionalSizesExample1"
>
<CModalHeader>
<CModalTitle id="OptionalSizesExample1">Extra large modal</CModalTitle>
</CModalHeader>
<CModalBody>...</CModalBody>
</CModal>
<CModal
size="lg"
visible={visibleLg}
onClose={() => setVisibleLg(false)}
aria-labelledby="OptionalSizesExample2"
>
<CModalHeader>
<CModalTitle id="OptionalSizesExample2">Large modal</CModalTitle>
</CModalHeader>
<CModalBody>...</CModalBody>
</CModal>
<CModal
size="sm"
visible={visibleSm}
onClose={() => setVisibleSm(false)}
aria-labelledby="OptionalSizesExample3"
>
<CModalHeader>
<CModalTitle id="OptionalSizesExample3">Small modal</CModalTitle>
</CModalHeader>
<CModalBody>...</CModalBody>
</CModal>
</>
)
} import React, { useState } from 'react'
import { CButton, CModal, CModalBody, CModalHeader, CModalTitle } from '@coreui/react'
export const ModalOptionalSizesExample = () => {
const [visibleXL, setVisibleXL] = useState(false)
const [visibleLg, setVisibleLg] = useState(false)
const [visibleSm, setVisibleSm] = useState(false)
return (
<>
<CButton color="primary" onClick={() => setVisibleXL(!visibleXL)}>
Extra large modal
</CButton>
<CButton color="primary" onClick={() => setVisibleLg(!visibleLg)}>
Large modal
</CButton>
<CButton color="primary" onClick={() => setVisibleSm(!visibleSm)}>
Small modal
</CButton>
<CModal
size="xl"
visible={visibleXL}
onClose={() => setVisibleXL(false)}
aria-labelledby="OptionalSizesExample1"
>
<CModalHeader>
<CModalTitle id="OptionalSizesExample1">Extra large modal</CModalTitle>
</CModalHeader>
<CModalBody>...</CModalBody>
</CModal>
<CModal
size="lg"
visible={visibleLg}
onClose={() => setVisibleLg(false)}
aria-labelledby="OptionalSizesExample2"
>
<CModalHeader>
<CModalTitle id="OptionalSizesExample2">Large modal</CModalTitle>
</CModalHeader>
<CModalBody>...</CModalBody>
</CModal>
<CModal
size="sm"
visible={visibleSm}
onClose={() => setVisibleSm(false)}
aria-labelledby="OptionalSizesExample3"
>
<CModalHeader>
<CModalTitle id="OptionalSizesExample3">Small modal</CModalTitle>
</CModalHeader>
<CModalBody>...</CModalBody>
</CModal>
</>
)
} Fullscreen Modal
Another override is the option to pop up a React modal component that covers the user viewport, available via property fullscreen.
| Fullscreen | Availability |
|---|---|
true | Always |
'sm' | Below 576px |
'md' | Below 768px |
'lg' | Below 992px |
'xl' | Below 1200px |
'xxl' | Below 1400px |
import React, { useState } from 'react'
import { CButton, CModal, CModalBody, CModalHeader, CModalTitle } from '@coreui/react'
export const ModalFullscreenExample = () => {
const [visible, setVisible] = useState(false)
const [visibleSm, setVisibleSm] = useState(false)
const [visibleMd, setVisibleMd] = useState(false)
const [visibleLg, setVisibleLg] = useState(false)
const [visibleXL, setVisibleXL] = useState(false)
const [visibleXXL, setVisibleXXL] = useState(false)
return (
<>
<CButton color="primary" onClick={() => setVisible(!visible)}>
Full screen
</CButton>
<CButton color="primary" onClick={() => setVisibleSm(!visibleSm)}>
Full screen below sm
</CButton>
<CButton color="primary" onClick={() => setVisibleMd(!visibleMd)}>
Full screen below md
</CButton>
<CButton color="primary" onClick={() => setVisibleLg(!visibleLg)}>
Full screen below lg
</CButton>
<CButton color="primary" onClick={() => setVisibleXL(!visibleXL)}>
Full screen below xl
</CButton>
<CButton color="primary" onClick={() => setVisibleXXL(!visibleXXL)}>
Full screen below xxl
</CButton>
<CModal
fullscreen
visible={visible}
onClose={() => setVisible(false)}
aria-labelledby="FullscreenExample1"
>
<CModalHeader>
<CModalTitle id="FullscreenExample1">Full screen</CModalTitle>
</CModalHeader>
<CModalBody>...</CModalBody>
</CModal>
<CModal
fullscreen="sm"
visible={visibleSm}
onClose={() => setVisibleSm(false)}
aria-labelledby="FullscreenExample2"
>
<CModalHeader>
<CModalTitle id="FullscreenExample2">Full screen below sm</CModalTitle>
</CModalHeader>
<CModalBody>...</CModalBody>
</CModal>
<CModal
fullscreen="md"
visible={visibleMd}
onClose={() => setVisibleMd(false)}
aria-labelledby="FullscreenExample3"
>
<CModalHeader>
<CModalTitle id="FullscreenExample3">Full screen below md</CModalTitle>
</CModalHeader>
<CModalBody>...</CModalBody>
</CModal>
<CModal
fullscreen="lg"
visible={visibleLg}
onClose={() => setVisibleLg(false)}
aria-labelledby="FullscreenExample4"
>
<CModalHeader>
<CModalTitle id="FullscreenExample4">Full screen below lg</CModalTitle>
</CModalHeader>
<CModalBody>...</CModalBody>
</CModal>
<CModal
fullscreen="xl"
visible={visibleXL}
onClose={() => setVisibleXL(false)}
aria-labelledby="FullscreenExample5"
>
<CModalHeader>
<CModalTitle id="FullscreenExample5">Full screen below xl</CModalTitle>
</CModalHeader>
<CModalBody>...</CModalBody>
</CModal>
<CModal
fullscreen="xxl"
visible={visibleXXL}
onClose={() => setVisibleXXL(false)}
aria-labelledby="FullscreenExample6"
>
<CModalHeader>
<CModalTitle id="FullscreenExample6">Full screen below xxl</CModalTitle>
</CModalHeader>
<CModalBody>...</CModalBody>
</CModal>
</>
)
} import React, { useState } from 'react'
import { CButton, CModal, CModalBody, CModalHeader, CModalTitle } from '@coreui/react'
export const ModalFullscreenExample = () => {
const [visible, setVisible] = useState(false)
const [visibleSm, setVisibleSm] = useState(false)
const [visibleMd, setVisibleMd] = useState(false)
const [visibleLg, setVisibleLg] = useState(false)
const [visibleXL, setVisibleXL] = useState(false)
const [visibleXXL, setVisibleXXL] = useState(false)
return (
<>
<CButton color="primary" onClick={() => setVisible(!visible)}>
Full screen
</CButton>
<CButton color="primary" onClick={() => setVisibleSm(!visibleSm)}>
Full screen below sm
</CButton>
<CButton color="primary" onClick={() => setVisibleMd(!visibleMd)}>
Full screen below md
</CButton>
<CButton color="primary" onClick={() => setVisibleLg(!visibleLg)}>
Full screen below lg
</CButton>
<CButton color="primary" onClick={() => setVisibleXL(!visibleXL)}>
Full screen below xl
</CButton>
<CButton color="primary" onClick={() => setVisibleXXL(!visibleXXL)}>
Full screen below xxl
</CButton>
<CModal
fullscreen
visible={visible}
onClose={() => setVisible(false)}
aria-labelledby="FullscreenExample1"
>
<CModalHeader>
<CModalTitle id="FullscreenExample1">Full screen</CModalTitle>
</CModalHeader>
<CModalBody>...</CModalBody>
</CModal>
<CModal
fullscreen="sm"
visible={visibleSm}
onClose={() => setVisibleSm(false)}
aria-labelledby="FullscreenExample2"
>
<CModalHeader>
<CModalTitle id="FullscreenExample2">Full screen below sm</CModalTitle>
</CModalHeader>
<CModalBody>...</CModalBody>
</CModal>
<CModal
fullscreen="md"
visible={visibleMd}
onClose={() => setVisibleMd(false)}
aria-labelledby="FullscreenExample3"
>
<CModalHeader>
<CModalTitle id="FullscreenExample3">Full screen below md</CModalTitle>
</CModalHeader>
<CModalBody>...</CModalBody>
</CModal>
<CModal
fullscreen="lg"
visible={visibleLg}
onClose={() => setVisibleLg(false)}
aria-labelledby="FullscreenExample4"
>
<CModalHeader>
<CModalTitle id="FullscreenExample4">Full screen below lg</CModalTitle>
</CModalHeader>
<CModalBody>...</CModalBody>
</CModal>
<CModal
fullscreen="xl"
visible={visibleXL}
onClose={() => setVisibleXL(false)}
aria-labelledby="FullscreenExample5"
>
<CModalHeader>
<CModalTitle id="FullscreenExample5">Full screen below xl</CModalTitle>
</CModalHeader>
<CModalBody>...</CModalBody>
</CModal>
<CModal
fullscreen="xxl"
visible={visibleXXL}
onClose={() => setVisibleXXL(false)}
aria-labelledby="FullscreenExample6"
>
<CModalHeader>
<CModalTitle id="FullscreenExample6">Full screen below xxl</CModalTitle>
</CModalHeader>
<CModalBody>...</CModalBody>
</CModal>
</>
)
} API
Check out the documentation below for a comprehensive guide to all the props you can use with the components mentioned here.