Theme

PlaygroundBeta

npm_versionnpm Paragon package page

ModalDialog

A set of components for making all kinds of modal dialogs. Remember to supply the required title prop to ModalDialog in order ensure there is an accessible label for the dialog element.

Basic Usage

Any Paragon component or export may be added to the code example.

() => {
const [isOpen, open, close] = useToggle(false);
const sizes = ['sm', 'md', 'lg', 'xl', 'fullscreen'];
const variants = ['default', 'warning', 'danger', 'success', 'dark'];
const [modalSize, setModalSize] = useState('md');
const [modalVariant, setModalVariant] = useState('default');
return (
<>
<div className="d-flex">
<Button variant="outline-primary" onClick={open}>Open standard modal dialog</Button>
</div>
<ModalDialog
title="My dialog"
isOpen={isOpen}
onClose={close}
size={modalSize}
variant={modalVariant}
hasCloseButton
isFullscreenOnMobile
>
<ModalDialog.Header>
<ModalDialog.Title>
I'm a dialog box
</ModalDialog.Title>
</ModalDialog.Header>
<ModalDialog.Body>
<Form.Group>
<Form.Label>Size</Form.Label>
<Form.RadioSet
name="size"
value={modalSize}
onChange={(e) => setModalSize(e.target.value)}
>
{sizes.map(s => <Form.Radio key={s} value={s}>{s}</Form.Radio>)}
</Form.RadioSet>
</Form.Group>
<Form.Group>
<Form.Label>Variant</Form.Label>
<Form.RadioSet
name="variant"
value={modalVariant}
onChange={(e) => setModalVariant(e.target.value)}
>
{variants.map(v => <Form.Radio key={v} value={v}>{v}</Form.Radio>)}
</Form.RadioSet>
</Form.Group>
<p>
I'm baby palo santo ugh celiac fashion axe. La croix lo-fi venmo whatever. Beard man braid migas single-origin coffee forage ramps. Tumeric messenger bag bicycle rights wayfarers, try-hard cronut blue bottle health goth. Sriracha tumblr cardigan, cloud bread succulents tumeric copper mug marfa semiotics woke next level organic roof party +1 try-hard.
</p>
</ModalDialog.Body>
<ModalDialog.Footer>
<ActionRow>
<ModalDialog.CloseButton variant="tertiary">
Cancel
</ModalDialog.CloseButton>
<Button variant="primary">
A button
</Button>
</ActionRow>
</ModalDialog.Footer>
</ModalDialog>
</>
)
}

With header content

Any Paragon component or export may be added to the code example.

() => {
const [isOpen, open, close] = useToggle(false);
const sizes = ['sm', 'md', 'lg', 'xl', 'fullscreen'];
const variants = ['default', 'warning', 'danger', 'success', 'dark'];
const [modalSize, setModalSize] = useState('md');
const [modalVariant, setModalVariant] = useState('dark');
return (
<>
<div className="d-flex">
<Button variant="outline-primary" onClick={open}>Open marketing modal dialog</Button>
</div>
<ModalDialog
title="My dialog"
isOpen={isOpen}
onClose={close}
size={modalSize}
variant={modalVariant}
hasCloseButton
>
<ModalDialog.Hero>
<ModalDialog.Hero.Background
backgroundSrc="https://picsum.photos/1600/800/"
/>
<ModalDialog.Hero.Content style={{ maxWidth: '15rem' }}>
<ModalDialog.Title as="h1">
I'm a dialog box
</ModalDialog.Title>
</ModalDialog.Hero.Content>
</ModalDialog.Hero>
<ModalDialog.Body>
<Form.Group>
<Form.Label>Size</Form.Label>
<Form.RadioSet name="size" value={modalSize} onChange={(e) => setModalSize(e.target.value)}>
{sizes.map(size => (
<Form.Radio key={size} value={size}>{size}</Form.Radio>
))}
</Form.RadioSet>
</Form.Group>
<Form.Group>
<Form.Label>Variant</Form.Label>
<Form.RadioSet name="variant" value={modalVariant} onChange={(e) => setModalVariant(e.target.value)}>
{['default', 'dark'].map(variant => (
<Form.Radio key={variant} value={variant}>{variant}</Form.Radio>
))}
</Form.RadioSet>
</Form.Group>
<p>
I'm baby palo santo ugh celiac fashion axe. La croix lo-fi venmo whatever. Beard man braid migas single-origin coffee forage ramps. Tumeric messenger bag bicycle rights wayfarers, try-hard cronut blue bottle health goth. Sriracha tumblr cardigan, cloud bread succulents tumeric copper mug marfa semiotics woke next level organic roof party +1 try-hard.
</p>
</ModalDialog.Body>
<ModalDialog.Footer>
<ActionRow isStacked>
<ModalDialog.CloseButton variant="tertiary">
Cancel
</ModalDialog.CloseButton>
<Button variant="primary">
A button
</Button>
</ActionRow>
</ModalDialog.Footer>
</ModalDialog>
</>
)
}

Theme Variables (SCSS)#

$modal-inner-padding: 1.5rem !default;
$modal-inner-padding-bottom: .7rem !default;
$modal-footer-margin-between: .5rem !default;
$modal-dialog-margin: 1.5rem !default;
$modal-dialog-margin-y-sm-up: 1.75rem !default;
$modal-title-line-height: $line-height-base !default;
$modal-content-color: null !default;
$modal-content-bg: $white !default;
$modal-content-border-color: rgba($black, .2) !default;
$modal-content-border-width: 0 !default;
$modal-content-border-radius: $border-radius-lg !default;
$modal-content-inner-border-radius: subtract($modal-content-border-radius, $modal-content-border-width) !default;
$modal-content-box-shadow-xs: 0 .25rem .5rem rgba($black, .5) !default;
$modal-content-box-shadow-sm-up: 0 10px 20px rgba($black, .15), 0 8px 20px rgba($black, .15) !default;
$modal-backdrop-bg: $black !default;
$modal-backdrop-opacity: .5 !default;
$modal-header-border-color: $border-color !default;
$modal-footer-border-color: $modal-header-border-color !default;
$modal-header-border-width: $modal-content-border-width !default;
$modal-footer-border-width: $modal-header-border-width !default;
$modal-header-padding-y: 1rem !default;
$modal-header-padding-x: 1.5rem !default;
$modal-close-container-top: .625rem !default;
$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default;
$modal-footer-padding-y: 1rem !default;
$modal-footer-padding-x: 1.5rem !default;
$modal-footer-padding: $modal-footer-padding-y $modal-footer-padding-x !default;
$modal-xl: 1140px !default;
$modal-lg: 800px !default;
$modal-md: 500px !default;
$modal-sm: 400px !default;
$modal-fade-transform: translate(0, -50px) !default;
$modal-show-transform: none !default;
$modal-transition: transform .3s ease-out !default;
$modal-scale-transform: scale(1.02) !default;

Props API#

ModalDialog Props API
  • children node Required

    Specifies the content of the dialog

  • title string Required

    The aria-label of the dialog

  • onClose func Required

    A callback to close the modal dialog

  • isOpen bool

    Is the modal dialog open or closed

    Defaultfalse
  • hasCloseButton bool

    The close 'x' icon button in the top right of the dialog box

    Defaulttrue
  • size enum'sm' | 'md' | 'lg' | 'xl' | 'fullscreen'

    Sizes determine the maximum width of the dialog box

    Default'md'
  • variant enum'default' | 'warning' | 'danger' | 'success' | 'dark'

    The visual style of the dialog box

    Default'default'
  • closeLabel string

    The label supplied to the close icon button if one is rendered

    Default'Close'
  • className string

    Specifies class name to append to the base element

  • isFullscreenScroll bool

    Determines where a scrollbar should appear if a modal is too large for the viewport. When false, the ModalDialog. Body receives a scrollbar, when true the browser window itself receives the scrollbar.

    Defaultfalse
  • isFullscreenOnMobile bool

    To show full screen view on mobile screens

    Defaultfalse
  • isBlocking bool

    Prevent clicking on the backdrop to close the modal

    Defaultfalse
  • zIndex number
ModalDialogTitle Props API
  • as elementType

    Specifies the base element

    Default'h2'
  • children node Required

    Specifies the contents of the header

  • className string

    Specifies class name to append to the base element

ModalDialogHeader Props API
  • as elementType

    Specifies the base element

    Default'div'
  • children node Required

    Specifies the contents of the header

  • className string

    Specifies class name to append to the base element

ModalDialogHero Props API
  • as elementType
    Default'div'
  • children node Required
  • className string
ModalDialogBody Props API
  • as elementType

    Specifies the base element

    Default'div'
  • children node Required

    Specifies the contents of the header

  • className string

    Specifies class name to append to the base element

ModalDialogFooter Props API
  • as elementType

    Specifies the base element

    Default'div'
  • children node Required

    Specifies the contents of the header

  • className string

    Specifies class name to append to the base element

Usage Insights#

ModalDialog

Project NameParagon VersionInstance Count
frontend-app-account20.36.04
frontend-app-admin-portal20.26.312
frontend-app-authn20.36.22
frontend-app-course-authoring20.32.03
frontend-app-discussions20.15.02
frontend-app-enterprise-public-catalog20.29.02
frontend-app-gradebook19.25.41
frontend-app-learner-dashboard20.32.05
frontend-app-learner-portal-enterprise20.36.01
frontend-app-learner-record20.32.01
frontend-app-learning20.28.41
frontend-app-library-authoring20.30.13
frontend-app-payment20.30.11
frontend-app-profile20.32.01
frontend-app-publisher20.28.51
frontend-app-support-tools20.26.014
frontend-lib-content-components20.34.02
frontend-lib-special-exams20.22.41
prospectus20.32.33

ModalDialogBody

Project NameParagon VersionInstance Count
frontend-app-account20.36.04
frontend-app-admin-portal20.26.312
frontend-app-authn20.36.22
frontend-app-course-authoring20.32.03
frontend-app-discussions20.15.02
frontend-app-enterprise-public-catalog20.29.02
frontend-app-gradebook19.25.41
frontend-app-learner-dashboard20.32.01
frontend-app-learner-portal-enterprise20.36.01
frontend-app-learner-record20.32.01
frontend-app-learning20.28.41
frontend-app-library-authoring20.30.13
frontend-app-payment20.30.11
frontend-app-profile20.32.01
frontend-app-publisher20.28.51
frontend-app-support-tools20.26.014
frontend-lib-content-components20.34.04
frontend-lib-special-exams20.22.41
prospectus20.32.33

ModalDialogCloseButton

Project NameParagon VersionInstance Count
frontend-app-account20.36.04
frontend-app-admin-portal20.26.35
frontend-app-authn20.36.21
frontend-app-course-authoring20.32.03
frontend-app-discussions20.15.02
frontend-app-gradebook19.25.41
frontend-app-learner-record20.32.01
frontend-app-learning20.28.43
frontend-app-library-authoring20.30.13
frontend-app-publisher20.28.51
frontend-app-support-tools20.26.014
frontend-lib-content-components20.34.02
prospectus20.32.32

ModalDialogFooter

Project NameParagon VersionInstance Count
frontend-app-account20.36.04
frontend-app-admin-portal20.26.312
frontend-app-authn20.36.22
frontend-app-course-authoring20.32.03
frontend-app-discussions20.15.02
frontend-app-enterprise-public-catalog20.29.02
frontend-app-gradebook19.25.41
frontend-app-learner-portal-enterprise20.36.01
frontend-app-learner-record20.32.01
frontend-app-learning20.28.41
frontend-app-library-authoring20.30.13
frontend-app-payment20.30.11
frontend-app-profile20.32.01
frontend-app-publisher20.28.51
frontend-app-support-tools20.26.014
frontend-lib-content-components20.34.04
frontend-lib-special-exams20.22.41
prospectus20.32.32

ModalDialogHeader

Project NameParagon VersionInstance Count
frontend-app-account20.36.04
frontend-app-admin-portal20.26.311
frontend-app-authn20.36.22
frontend-app-course-authoring20.32.03
frontend-app-discussions20.15.02
frontend-app-learner-dashboard20.32.02
frontend-app-learner-record20.32.01
frontend-app-learning20.28.41
frontend-app-library-authoring20.30.13
frontend-app-payment20.30.11
frontend-app-publisher20.28.51
frontend-app-support-tools20.26.014
frontend-lib-content-components20.34.04
frontend-lib-special-exams20.22.41
prospectus20.32.32

ModalDialogHero

Project NameParagon VersionInstance Count
frontend-app-enterprise-public-catalog20.29.02
frontend-app-learner-dashboard20.32.01
frontend-app-learner-portal-enterprise20.36.02
frontend-app-learning20.28.41
frontend-app-profile20.32.01
prospectus20.32.31

ModalDialogTitle

Project NameParagon VersionInstance Count
frontend-app-account20.36.04
frontend-app-admin-portal20.26.311
frontend-app-authn20.36.22
frontend-app-course-authoring20.32.03
frontend-app-discussions20.15.02
frontend-app-enterprise-public-catalog20.29.04
frontend-app-learner-portal-enterprise20.36.01
frontend-app-learner-record20.32.01
frontend-app-learning20.28.42
frontend-app-library-authoring20.30.13
frontend-app-payment20.30.11
frontend-app-publisher20.28.51
frontend-app-support-tools20.26.014
frontend-lib-content-components20.34.03
frontend-lib-special-exams20.22.41
prospectus20.32.33