Skip to component content

Build complete Bootstrap forms from native form and fieldset markup, visible labels, descriptions, validation feedback, and documented Field components.

Account profile
Update the details teammates see in shared project tools.

Usage

Use a real <form> to submit a complete set of related fields through native HTML semantics. Compose each row with the Field pattern, group related controls with fieldsets and legends, and keep every editable control paired with a visible label or accessible name.

Use Bootstrap .form-control, .form-select, and .form-check contracts for the inputs themselves; see Input, Native Select, and Checkbox for the control-level markup. Keep descriptions, constraints, and validation feedback close to the field they affect. For validation, add submitted-state classes to the form, connect messages with aria-describedby, and let native attributes such as required, disabled, and readonly describe the browser behavior.

Keep submit and reset actions outside individual fields so they read as form-level commands. Preserve predictable tab order, avoid nested forms, and only split a long form into sections when the grouping helps users understand what will be saved together.

Field composition

Compose a native <form> from Field, Fieldset, and Bootstrap form-control contracts.

Form
Account profile
Update the details teammates see in shared project tools.
Enter a display name.
Shown next to your avatar in handoff notes.
Preferences
Choose how this workspace should notify you.
<form class="field-form needs-validation" novalidate>
  <fieldset class="field-fieldset">
    <legend class="field-legend">Account profile</legend>
    <div class="field-description form-text">Update the details teammates see in shared project tools.</div>
    <div class="field-group">
      <div class="field">
        <label class="form-label" for="form-profile-name">
          Display name
          <span class="text-danger">*</span>
        </label>
        <input class="form-control" id="form-profile-name" type="text" placeholder="Ada Lovelace" required aria-describedby="form-profile-name-error">
        <div class="field-error invalid-feedback" id="form-profile-name-error">Enter a display name.</div>
      </div>
      <div class="field">
        <label class="form-label" for="form-profile-role">Role</label>
        <input class="form-control" id="form-profile-role" type="text" placeholder="Release coordinator" aria-describedby="form-profile-role-help">
        <div class="field-description form-text" id="form-profile-role-help">Shown next to your avatar in handoff notes.</div>
      </div>
    </div>
  </fieldset>
  <fieldset class="field-fieldset">
    <legend class="field-legend">Preferences</legend>
    <div class="field-description form-text">Choose how this workspace should notify you.</div>
    <div class="field-group">
      <div class="field">
        <label class="form-label" for="form-profile-queue">Default queue</label>
        <select class="form-select" id="form-profile-queue" data-selected="ops">
          <option value="" disabled>Choose queue</option>
          <option value="ops" selected>Operations</option>
          <option value="support">Support</option>
          <option value="finance">Finance</option>
        </select>
      </div>
      <div class="field">
        <div class="form-check form-switch">
          <input class="form-check-input" type="checkbox" role="switch" id="form-profile-digest" checked>
          <label class="form-check-label" for="form-profile-digest">Send a daily digest</label>
        </div>
      </div>
    </div>
  </fieldset>
  <div class="d-flex flex-wrap gap-2">
    <button class="btn btn-primary" type="submit">Save changes</button>
    <button class="btn btn-outline-secondary" type="reset">Reset</button>
  </div>
</form>

Validation feedback

Keep required inputs, helper text, and invalid feedback close to the field they describe.

Form
Deploy request
Capture the minimum context needed before a release moves forward.
Release name is required.
Visible in the approval queue.
Approval policy
Pick the checks this deploy must pass.
<form class="field-form needs-validation" novalidate>
  <fieldset class="field-fieldset">
    <legend class="field-legend">Deploy request</legend>
    <div class="field-description form-text">Capture the minimum context needed before a release moves forward.</div>
    <div class="field-group">
      <div class="field">
        <label class="form-label" for="form-deploy-name">
          Release name
          <span class="text-danger">*</span>
        </label>
        <input class="form-control" id="form-deploy-name" type="text" placeholder="billing-dashboard-v2" required aria-describedby="form-deploy-name-error">
        <div class="field-error invalid-feedback" id="form-deploy-name-error">Release name is required.</div>
      </div>
      <div class="field">
        <label class="form-label" for="form-deploy-notes">Reviewer notes</label>
        <textarea class="form-control" id="form-deploy-notes" rows="3" placeholder="Call out database changes or rollback concerns." aria-describedby="form-deploy-notes-help"></textarea>
        <div class="field-description form-text" id="form-deploy-notes-help">Visible in the approval queue.</div>
      </div>
    </div>
  </fieldset>
  <fieldset class="field-fieldset">
    <legend class="field-legend">Approval policy</legend>
    <div class="field-description form-text">Pick the checks this deploy must pass.</div>
    <div class="field-group">
      <div class="field">
        <div class="form-check">
          <input class="form-check-input" type="checkbox" id="form-deploy-security" checked>
          <label class="form-check-label" for="form-deploy-security">Security review</label>
        </div>
      </div>
      <div class="field">
        <div class="form-check">
          <input class="form-check-input" type="checkbox" id="form-deploy-backup" checked>
          <label class="form-check-label" for="form-deploy-backup">Backup verified</label>
        </div>
      </div>
      <div class="field">
        <div class="form-check">
          <input class="form-check-input" type="checkbox" id="form-deploy-window">
          <label class="form-check-label" for="form-deploy-window">Maintenance window scheduled</label>
        </div>
      </div>
    </div>
  </fieldset>
  <div class="d-flex flex-wrap gap-2">
    <button class="btn btn-primary" type="submit">Request deploy</button>
    <button class="btn btn-outline-secondary" type="button">Save draft</button>
  </div>
</form>

Grouped controls

Use Fieldset for related choices even when the child controls already own their labels.

Form
Workspace access
Set the default access level for new collaborators.
Default access
<form class="field-form">
  <fieldset class="field-fieldset">
    <legend class="field-legend">Workspace access</legend>
    <div class="field-description form-text">Set the default access level for new collaborators.</div>
    <fieldset class="radio-group">
      <legend class="form-label">Default access</legend>
      <div class="form-check">
        <input class="form-check-input" type="radio" name="form-access-policy" id="form-access-viewer" value="viewer" checked>
        <label class="form-check-label" for="form-access-viewer">Viewer</label>
      </div>
      <div class="form-check">
        <input class="form-check-input" type="radio" name="form-access-policy" id="form-access-editor" value="editor">
        <label class="form-check-label" for="form-access-editor">Editor</label>
      </div>
      <div class="form-check">
        <input class="form-check-input" type="radio" name="form-access-policy" id="form-access-admin" value="admin">
        <label class="form-check-label" for="form-access-admin">Administrator</label>
      </div>
    </fieldset>
    <div class="field-group">
      <div class="field">
        <div class="form-check form-switch">
          <input class="form-check-input" type="checkbox" role="switch" id="form-access-expire" checked>
          <label class="form-check-label" for="form-access-expire">Expire guest access after 30 days</label>
        </div>
      </div>
      <div class="field">
        <div class="form-check form-switch">
          <input class="form-check-input" type="checkbox" role="switch" id="form-access-alert">
          <label class="form-check-label" for="form-access-alert">Notify owners when access changes</label>
        </div>
      </div>
    </div>
  </fieldset>
</form>

RTL

Compare the same account profile form across Arabic and Hebrew RTL examples, with English as the LTR comparison.

ملف الحساب
حدّث التفاصيل التي يراها الفريق في أدوات المشروع المشتركة.
<div dir="rtl">
  <form class="field-form needs-validation" novalidate>
    <fieldset class="field-fieldset">
      <legend class="field-legend">ملف الحساب</legend>
      <div class="field-description form-text">حدّث التفاصيل التي يراها الفريق في أدوات المشروع المشتركة.</div>
      <div class="field-group">
        <div class="field">
          <label class="form-label" for="form-rtl-arabic-name">
            اسم العرض
            <span class="text-danger">*</span>
          </label>
          <input class="form-control" id="form-rtl-arabic-name" type="text" placeholder="سارة علي" required>
        </div>
        <div class="field">
          <label class="form-label" for="form-rtl-arabic-queue">قائمة العمل الافتراضية</label>
          <select class="form-select" id="form-rtl-arabic-queue" data-selected="ops" dir="rtl">
            <option value="" disabled>اختر القائمة</option>
            <option value="ops" selected>العمليات</option>
            <option value="support">الدعم</option>
            <option value="finance">المالية</option>
          </select>
        </div>
      </div>
    </fieldset>
    <div class="d-flex flex-wrap gap-2">
      <button class="btn btn-primary" type="submit">حفظ التغييرات</button>
      <button class="btn btn-outline-secondary" type="reset">إعادة ضبط</button>
    </div>
  </form>
</div>
פרופיל חשבון
עדכן את הפרטים שהצוות רואה בכלי הפרויקט המשותפים.
<div dir="rtl">
  <form class="field-form needs-validation" novalidate>
    <fieldset class="field-fieldset">
      <legend class="field-legend">פרופיל חשבון</legend>
      <div class="field-description form-text">עדכן את הפרטים שהצוות רואה בכלי הפרויקט המשותפים.</div>
      <div class="field-group">
        <div class="field">
          <label class="form-label" for="form-rtl-hebrew-name">
            שם תצוגה
            <span class="text-danger">*</span>
          </label>
          <input class="form-control" id="form-rtl-hebrew-name" type="text" placeholder="נועה לוי" required>
        </div>
        <div class="field">
          <label class="form-label" for="form-rtl-hebrew-queue">תור ברירת מחדל</label>
          <select class="form-select" id="form-rtl-hebrew-queue" data-selected="ops" dir="rtl">
            <option value="" disabled>בחר תור</option>
            <option value="ops" selected>תפעול</option>
            <option value="support">תמיכה</option>
            <option value="finance">כספים</option>
          </select>
        </div>
      </div>
    </fieldset>
    <div class="d-flex flex-wrap gap-2">
      <button class="btn btn-primary" type="submit">שמור שינויים</button>
      <button class="btn btn-outline-secondary" type="reset">איפוס</button>
    </div>
  </form>
</div>
Account profile
Update the details teammates see in shared project tools.
<div dir="ltr">
  <form class="field-form needs-validation" novalidate>
    <fieldset class="field-fieldset">
      <legend class="field-legend">Account profile</legend>
      <div class="field-description form-text">Update the details teammates see in shared project tools.</div>
      <div class="field-group">
        <div class="field">
          <label class="form-label" for="form-rtl-english-name">
            Display name
            <span class="text-danger">*</span>
          </label>
          <input class="form-control" id="form-rtl-english-name" type="text" placeholder="Ada Lovelace" required>
        </div>
        <div class="field">
          <label class="form-label" for="form-rtl-english-queue">Default queue</label>
          <select class="form-select" id="form-rtl-english-queue" data-selected="ops" dir="ltr">
            <option value="" disabled>Choose queue</option>
            <option value="ops" selected>Operations</option>
            <option value="support">Support</option>
            <option value="finance">Finance</option>
          </select>
        </div>
      </div>
    </fieldset>
    <div class="d-flex flex-wrap gap-2">
      <button class="btn btn-primary" type="submit">Save changes</button>
      <button class="btn btn-outline-secondary" type="reset">Reset</button>
    </div>
  </form>
</div>

Component reference

Status
Accepted
Runtime
native HTML/CSS
Markup
Moo UI documented extension
Reference

For Bootstrap's underlying form controls, layout, validation, and accessibility model, see the Bootstrap Forms 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.