U.S. flagA digital services project by Flexion

Modal

feedbackUSWDS-derivedinteractive

Dialog overlay with focus trapping, backdrop, and keyboard management.

Reference: USWDS documentation ↗

Variants

Default Modal

Forced Action Modal

Large Modal

Contract

Class mapping

USWDSFlexNotes
usa-modal-wrapper / usa-modal-overlay<flex-modal> (custom element) + .flex-modal__overlayModal wrapper and overlay backdrop
usa-modal.flex-modal__content[role="dialog"]Dialog content container
usa-modal__content.flex-modal__contentContent wrapper with column-reverse layout
usa-modal__main.flex-modal__mainMain content area with heading, body, footer
usa-modal__heading.flex-modal__headingModal heading
usa-modal__footer.flex-modal__footerModal footer with action buttons
usa-modal__close.flex-modal__close[data-close-modal]Close button with X icon
usa-modal--lgflex-modal[data-size="large"]Large modal variant with wider max-width
data-force-actiondata-forced-actionForced action prevents overlay click, escape, hides close button

Verified properties

displaypositionmax-widthborder-radiusbackground-color

Intentional differences

visibility: ours = hidden (via hidden attr), USWDS = controlled via is-hidden/is-visible classes

We use the native hidden attribute; USWDS uses JS class toggling with visibility transitions

Behavior promises

  • ✓ Trigger button opens modal and sets aria-expanded
  • ✓ Close button closes modal and restores focus to trigger
  • ✓ Escape key closes modal (unless forced action)
  • ✓ Overlay click closes modal (unless forced action)
  • ✓ Focus is trapped within modal using Tab/Shift+Tab
  • ✓ First focusable element receives focus on open
  • ✓ Scroll lock applied to body when modal is open
  • ✓ Forced action prevents escape, overlay click, and hides close button

Source CSS