Skip to component content

A window overlaid on the page, built from Bootstrap's own Modal plugin and auto-initialized through its data attribute API.

Usage

Use .modal for focused work that must temporarily sit above the page, such as editing details, confirming a choice, or collecting a short form. Open it from a clear trigger with Bootstrap modal data attributes, point that trigger at the dialog id, and label the modal from its visible title.

Keep the body focused on one task. Connect supporting copy with aria-describedby, place primary and secondary actions in the footer, and keep a visible dismiss path unless the workflow intentionally requires an explicit decision.

Bootstrap modals are positioned over the document and only support one modal window at a time. Use a static backdrop only when accidental dismissal would be harmful, avoid nesting dialogs, and make sure the user returns to a sensible place after the dialog closes.

Basic

Use a Button trigger, concise copy, and a focused form inside Bootstrap's modal structure.

Dialog
<button class="btn btn-outline-secondary" type="button" data-bs-toggle="modal" data-bs-target="#dialog-basic">Open dialog</button>
<div
    class="modal fade"
    id="dialog-basic"
    tabindex="-1"
      aria-labelledby="dialog-basic-title"
aria-describedby="dialog-basic-description"    aria-hidden="true"
  >
  <div class="modal-dialog modal-dialog-centered">
    <div class="modal-content">
      <div class="modal-header">
        <h1 class="modal-title" id="dialog-basic-title">Edit project details</h1>
        <button type="button" class="btn-close" aria-label="Close" data-bs-dismiss="modal"></button>
      </div>
      <div class="modal-body">
        <p class="text-body-secondary mb-3" id="dialog-basic-description">Update the public project label and a short note shown to team members.</p>
        <div class="field-group">
          <div class="field">
            <label class="form-label" for="dialog-basic-name">Project name</label>
            <input class="form-control" id="dialog-basic-name" type="text" value="Spring launch">
          </div>
          <div class="field">
            <label class="form-label" for="dialog-basic-summary">Summary</label>
            <textarea class="form-control" id="dialog-basic-summary" rows="3">Prepare the launch checklist before the Friday review.</textarea>
          </div>
        </div>
      </div>
      <div class="modal-footer">
        <button class="btn btn-outline-secondary" type="button" data-bs-dismiss="modal">Cancel</button>
        <button class="btn btn-primary" type="button" data-bs-dismiss="modal">Save project</button>
      </div>
    </div>
  </div>
</div>

Custom close action

Keep Bootstrap's header close button available, then add task-specific actions in the footer.

Dialog
<button class="btn btn-outline-secondary" type="button" data-bs-toggle="modal" data-bs-target="#dialog-custom-close">Share report</button>
<div
    class="modal fade"
    id="dialog-custom-close"
    tabindex="-1"
      aria-labelledby="dialog-custom-close-title"
aria-describedby="dialog-custom-close-description"    aria-hidden="true"
  >
  <div class="modal-dialog modal-dialog-centered">
    <div class="modal-content">
      <div class="modal-header">
        <h1 class="modal-title" id="dialog-custom-close-title">Share weekly report</h1>
        <button type="button" class="btn-close" aria-label="Close" data-bs-dismiss="modal"></button>
      </div>
      <div class="modal-body">
        <p class="text-body-secondary mb-3" id="dialog-custom-close-description">Send a view-only link to the finance channel for review.</p>
        <div class="rounded border bg-body-tertiary px-3 py-2 small text-body-secondary">https://app.example/reports/weekly-margin</div>
      </div>
      <div class="modal-footer">
        <button class="btn btn-outline-secondary" type="button" data-bs-dismiss="modal">Copy link</button>
        <button class="btn btn-primary" type="button" data-bs-dismiss="modal">Send to channel</button>
      </div>
    </div>
  </div>
</div>

Explicit dismissal

Use a static backdrop when a dialog should close only through visible actions.

Dialog
<button class="btn btn-outline-secondary" type="button" data-bs-toggle="modal" data-bs-target="#dialog-no-close">Review lock</button>
<div
    class="modal fade"
    id="dialog-no-close"
    tabindex="-1"
      aria-labelledby="dialog-no-close-title"
aria-describedby="dialog-no-close-description"    aria-hidden="true"
data-bs-backdrop="static" data-bs-keyboard="false"  >
  <div class="modal-dialog modal-dialog-centered">
    <div class="modal-content">
      <div class="modal-header">
        <h1 class="modal-title" id="dialog-no-close-title">Record locked for review</h1>
        <button type="button" class="btn-close" aria-label="Close" data-bs-dismiss="modal"></button>
      </div>
      <div class="modal-body">
        <p class="mb-0 text-body-secondary" id="dialog-no-close-description">A reviewer is editing this record. Choose an explicit action to keep the workflow predictable.</p>
      </div>
      <div class="modal-footer">
        <button class="btn btn-outline-secondary" type="button" data-bs-dismiss="modal">Return later</button>
        <button class="btn btn-primary" type="button" data-bs-dismiss="modal">Request access</button>
      </div>
    </div>
  </div>
</div>

Sizes

Set size to sm, lg, xl, or fullscreen; the default matches the basic example above.

Dialog
<div class="d-flex flex-wrap gap-2">
  <button class="btn btn-outline-secondary" type="button" data-bs-toggle="modal" data-bs-target="#dialog-sm">Small</button>
  <button class="btn btn-outline-secondary" type="button" data-bs-toggle="modal" data-bs-target="#dialog-lg">Large</button>
  <button class="btn btn-outline-secondary" type="button" data-bs-toggle="modal" data-bs-target="#dialog-xl">Extra large</button>
</div>
<div
    class="modal fade"
    id="dialog-sm"
    tabindex="-1"
      aria-labelledby="dialog-sm-title"
    aria-hidden="true"
  >
  <div class="modal-dialog modal-sm modal-dialog-centered">
    <div class="modal-content">
      <div class="modal-header">
        <h1 class="modal-title" id="dialog-sm-title">Quick note</h1>
        <button type="button" class="btn-close" aria-label="Close" data-bs-dismiss="modal"></button>
      </div>
      <div class="modal-body">
        <p class="mb-0 text-body-secondary">A compact surface for a short message or tiny form.</p>
      </div>
    </div>
  </div>
</div>
<div
    class="modal fade"
    id="dialog-lg"
    tabindex="-1"
      aria-labelledby="dialog-lg-title"
    aria-hidden="true"
  >
  <div class="modal-dialog modal-lg modal-dialog-centered">
    <div class="modal-content">
      <div class="modal-header">
        <h1 class="modal-title" id="dialog-lg-title">Schedule review</h1>
        <button type="button" class="btn-close" aria-label="Close" data-bs-dismiss="modal"></button>
      </div>
      <div class="modal-body">
        <p class="mb-0 text-body-secondary">A wider surface for a few related fields without feeling full screen.</p>
      </div>
    </div>
  </div>
</div>
<div
    class="modal fade"
    id="dialog-xl"
    tabindex="-1"
      aria-labelledby="dialog-xl-title"
    aria-hidden="true"
  >
  <div class="modal-dialog modal-xl modal-dialog-centered">
    <div class="modal-content">
      <div class="modal-header">
        <h1 class="modal-title" id="dialog-xl-title">Compare allocations</h1>
        <button type="button" class="btn-close" aria-label="Close" data-bs-dismiss="modal"></button>
      </div>
      <div class="modal-body">
        <p class="mb-0 text-body-secondary">A roomy surface for dense previews that still need modal focus.</p>
      </div>
    </div>
  </div>
</div>

Scrollable content

Add .modal-dialog-scrollable so the dialog body scrolls internally instead of the whole page.

Dialog
<button class="btn btn-outline-secondary" type="button" data-bs-toggle="modal" data-bs-target="#dialog-scrollable">Open scrollable dialog</button>
<div
    class="modal fade"
    id="dialog-scrollable"
    tabindex="-1"
      aria-labelledby="dialog-scrollable-title"
    aria-hidden="true"
  >
  <div class="modal-dialog modal-dialog-centered modal-dialog-scrollable">
    <div class="modal-content">
      <div class="modal-header">
        <h1 class="modal-title" id="dialog-scrollable-title">Release checklist</h1>
        <button type="button" class="btn-close" aria-label="Close" data-bs-dismiss="modal"></button>
      </div>
      <div class="modal-body">
        <p>Step 1. Confirm owner, status, and dependency notes before moving this item into the release queue.</p>
        <p>Step 2. Confirm owner, status, and dependency notes before moving this item into the release queue.</p>
        <p>Step 3. Confirm owner, status, and dependency notes before moving this item into the release queue.</p>
        <p>Step 4. Confirm owner, status, and dependency notes before moving this item into the release queue.</p>
        <p>Step 5. Confirm owner, status, and dependency notes before moving this item into the release queue.</p>
        <p>Step 6. Confirm owner, status, and dependency notes before moving this item into the release queue.</p>
        <p>Step 7. Confirm owner, status, and dependency notes before moving this item into the release queue.</p>
        <p class="mb-0">Step 8. Confirm owner, status, and dependency notes before moving this item into the release queue.</p>
      </div>
      <div class="modal-footer">
        <button class="btn btn-outline-secondary" type="button" data-bs-dismiss="modal">Close</button>
      </div>
    </div>
  </div>
</div>

Static backdrop

Set static=true to disable backdrop-click and Escape dismissal for unsaved-state confirmations.

Dialog
<button class="btn btn-outline-secondary" type="button" data-bs-toggle="modal" data-bs-target="#dialog-static">Open static dialog</button>
<div
    class="modal fade"
    id="dialog-static"
    tabindex="-1"
      aria-labelledby="dialog-static-title"
    aria-hidden="true"
data-bs-backdrop="static" data-bs-keyboard="false"  >
  <div class="modal-dialog modal-dialog-centered">
    <div class="modal-content">
      <div class="modal-header">
        <h1 class="modal-title" id="dialog-static-title">Unsaved routing change</h1>
        <button type="button" class="btn-close" aria-label="Close" data-bs-dismiss="modal"></button>
      </div>
      <div class="modal-body">
        <p class="mb-0 text-body-secondary">Backdrop clicks and Escape are ignored until the user chooses how to handle the pending routing update.</p>
      </div>
      <div class="modal-footer">
        <button class="btn btn-outline-secondary" type="button" data-bs-dismiss="modal">Keep editing</button>
        <button class="btn btn-primary" type="button" data-bs-dismiss="modal">Save route</button>
      </div>
    </div>
  </div>
</div>

RTL

Compare Arabic, Hebrew, and English dialog flows used in operational workflows.

<div class="d-inline-flex align-items-center gap-2" dir="rtl">
  <button class="btn btn-outline-secondary" type="button" data-bs-toggle="modal" data-bs-target="#dialog-rtl-arabic">فتح الحوار</button>
  <div
      class="modal fade"
      id="dialog-rtl-arabic"
      tabindex="-1"
        aria-labelledby="dialog-rtl-arabic-title"
      aria-hidden="true"
  dir="rtl"  >
    <div class="modal-dialog modal-dialog-centered">
      <div class="modal-content">
        <div class="modal-header">
          <h1 class="modal-title" id="dialog-rtl-arabic-title">مراجعة التصعيد</h1>
          <button type="button" class="btn-close" aria-label="Close" data-bs-dismiss="modal"></button>
        </div>
        <div class="modal-body">
          <p>وافق على تصعيد التذكرة فقط بعد اعتماد الدعم.</p>
        </div>
        <div class="modal-footer">
          <button class="btn btn-outline-secondary" type="button" data-bs-dismiss="modal">إغلاق</button>
          <button class="btn btn-primary" type="button" data-bs-dismiss="modal">موافقة</button>
        </div>
      </div>
    </div>
  </div>
</div>
<div class="d-inline-flex align-items-center gap-2" dir="rtl">
  <button class="btn btn-outline-secondary" type="button" data-bs-toggle="modal" data-bs-target="#dialog-rtl-hebrew">פתח דיאלוג</button>
  <div
      class="modal fade"
      id="dialog-rtl-hebrew"
      tabindex="-1"
        aria-labelledby="dialog-rtl-hebrew-title"
      aria-hidden="true"
  dir="rtl"  >
    <div class="modal-dialog modal-dialog-centered">
      <div class="modal-content">
        <div class="modal-header">
          <h1 class="modal-title" id="dialog-rtl-hebrew-title">סקירת הסלמה</h1>
          <button type="button" class="btn-close" aria-label="Close" data-bs-dismiss="modal"></button>
        </div>
        <div class="modal-body">
          <p>אשר את הסלמת הכרטיס רק לאחר אישור התמיכה.</p>
        </div>
        <div class="modal-footer">
          <button class="btn btn-outline-secondary" type="button" data-bs-dismiss="modal">סגור</button>
          <button class="btn btn-primary" type="button" data-bs-dismiss="modal">אשר</button>
        </div>
      </div>
    </div>
  </div>
</div>
<div class="d-inline-flex align-items-center gap-2" dir="ltr">
  <button class="btn btn-outline-secondary" type="button" data-bs-toggle="modal" data-bs-target="#dialog-rtl-english">Open dialog</button>
  <div
      class="modal fade"
      id="dialog-rtl-english"
      tabindex="-1"
        aria-labelledby="dialog-rtl-english-title"
      aria-hidden="true"
  dir="ltr"  >
    <div class="modal-dialog modal-dialog-centered">
      <div class="modal-content">
        <div class="modal-header">
          <h1 class="modal-title" id="dialog-rtl-english-title">Escalation review</h1>
          <button type="button" class="btn-close" aria-label="Close" data-bs-dismiss="modal"></button>
        </div>
        <div class="modal-body">
          <p>Approve ticket escalation only after support sign-off.</p>
        </div>
        <div class="modal-footer">
          <button class="btn btn-outline-secondary" type="button" data-bs-dismiss="modal">Close</button>
          <button class="btn btn-primary" type="button" data-bs-dismiss="modal">Approve</button>
        </div>
      </div>
    </div>
  </div>
</div>

Component reference

Status
Accepted
Runtime
Bootstrap plugin
Markup
Bootstrap/native HTML
Reference

For Bootstrap's Modal plugin options, focus management, and accessibility notes, see the Bootstrap Modal documentation.

Settings

Theme
Choose how Moo UI looks on this device.
Sidebar
Choose how the sidebar sits on the page.
Theme Builder
Tune catalog tokens and chart colors for this browser.
Base color
Theme color
Chart color
Heading font
Body font
Radius
Direction
Choose the reading direction. RTL flips the layout live.
Reset

Restore the default appearance.