Skip to content

Bootstrap Migration Guide

Quick translation guide for Bootstrap users. Same components, cleaner markup, modern CSS.

BootstrapAirframeNotes
btnaf-btnBase button
btn btn-primaryaf-btnPrimary button (now default)
btn btn-secondaryaf-btn af-is-secondarySecondary button
btn btn-successaf-btn af-is-successSuccess variant
btn btn-dangeraf-btn af-is-dangerDanger variant
btn btn-warningaf-btn af-is-warningWarning variant
btn btn-infoaf-btn af-is-infoInfo variant
btn btn-smaf-btn af-is-smSmall size
btn btn-lgaf-btn af-is-lgLarge size

Use component tokens to tweak sizing without new classes:

<style>
  :root { --af-control-min-height: 3rem; --af-btn-gap: 0.75rem; --af-input-placeholder-color: rgba(0, 0, 0, 0.45); }
</style>
<button class="af-btn">
  Primary
</button>
<input class="af-input" placeholder="Custom input" />
BootstrapAirframeNotes
cardaf-cardBase card
card-bodyaf-card__bodyCard body
card-headeraf-card__headerCard header
card-footeraf-card__footerCard footer
card-titleaf-card__titleCard title
BootstrapAirframeNotes
alertaf-alertBase alert
alert alert-primaryaf-alert af-is-primaryPrimary alert
alert alert-successaf-alert af-is-successSuccess alert
alert alert-dangeraf-alert af-is-dangerDanger alert
alert alert-warningaf-alert af-is-warningWarning alert
alert alert-infoaf-alert af-is-infoInfo alert
BootstrapAirframeNotes
badgeaf-badgeBase badge
badge badge-primaryaf-badge af-is-primaryPrimary badge
badge badge-successaf-badge af-is-successSuccess badge
badge badge-dangeraf-badge af-is-dangerDanger badge
badge badge-warningaf-badge af-is-warningWarning badge
badge badge-infoaf-badge af-is-infoInfo badge
BootstrapAirframeNotes
form-controlaf-inputText inputs, email, password, etc.
form-control (select)af-select or form.af-form selectSelect dropdown (requires class or wrapper)
form-control (textarea)af-textareaTextarea
form-labelaf-label or af-field__labelForm label
form-checkaf-checkboxCheckbox input
form-check-inputaf-checkboxCheckbox input class
form-check-label(label element)Checkbox label
form-selectaf-select or form.af-form selectSelect dropdown (requires class or wrapper)

Note: For classless forms, wrap in form.af-form. Select elements require either .af-select class or .af-form wrapper.

Section titled “Simple Grid (Recommended for Equal Columns)”

For equal-width columns, prefer the simple grid system. By default: af-grid adjusts to the number of children.

BootstrapAirframeNotes
row with 2 equal col-6af-gridAuto-adjusts to 2 columns
row with 3 equal col-4af-gridAuto-adjusts to 3 columns
row with 4 equal col-3af-gridAuto-adjusts to 4 columns
row with 2 equal col-6 (explicit)af-grid-2Explicit 2 columns
row with 3 equal col-4 (explicit)af-grid-3Explicit 3 columns
row with 4 equal col-3 (explicit)af-grid-4Explicit 4 columns
row with 5 equal columnsaf-grid-55 columns
row with 6 equal columnsaf-grid-66 columns
row col-12 col-md-6 (2 equal)af-grid af-grid-1@sm af-grid-2@mdResponsive equal columns

Example:

<!-- Bootstrap -->
<div class="row">
  <div class="col-6">
    Item 1
  </div>
  <div class="col-6">
    Item 2
  </div>
</div>
<!-- Airframe (auto-adjusting - simplest!) -->
<div class="af-grid">
  <div>
    Item 1
  </div>
  <div>
    Item 2
  </div>
</div>
<!-- Airframe (explicit - also works) -->
<div class="af-grid-2">
  <div>
    Item 1
  </div>
  <div>
    Item 2
  </div>
</div>

12-Column Grid (For Bootstrap Migration & Asymmetric Layouts)

Section titled “12-Column Grid (For Bootstrap Migration & Asymmetric Layouts)”

Use the 12-column system when migrating Bootstrap code or when you need asymmetric layouts:

BootstrapAirframeNotes
containeraf-containerContainer
container-fluidaf-containerFluid container
rowaf-gridGrid container (auto-detects 12-column when children have af-col-span-* classes)
col(no class needed)Full width is default
col-6af-col-span-6Half width (or use af-grid-2 for new code)
col-4af-col-span-4One third (or use af-grid-3 for new code)
col-3af-col-span-3One quarter (or use af-grid-4 for new code)
col-8af-col-span-8Two thirds (asymmetric - use 12-col)
col-12(no class needed)Full width is default

Note: Use af-grid with af-col-span-* classes for Bootstrap migration. The grid automatically detects span classes and applies a 12-column layout. For equal-width columns, use af-grid (auto-adjusts) or af-grid-2 through af-grid-6 for explicit column counts.

BootstrapAirframeNotes
col-12 col-md-6 (equal)af-grid af-grid-1@sm af-grid-2@mdPrefer simple grid
col-12 col-md-6 (keep 12-col)af-col-span-6@mdDirect migration (full width is default)
col-12 col-lg-8af-col-span-8@lgAsymmetric layout (full width is default)
col-12 col-lg-4af-col-span-4@lgAsymmetric layout (full width is default)
col-sm-6 col-md-4 (equal)af-grid af-grid-2@sm af-grid-3@mdPrefer simple grid
col-lg-6af-col-span-6@lgLarge breakpoint only
BootstrapAirframeNotes
row g-0af-grid af-gap-0No gap (override default)
row g-1af-grid af-gap-xsSmall gap (override default)
row g-2af-grid af-gap-smSmall gap (override default)
row g-3af-gridMedium gap (default, no override needed)
row g-4af-grid af-gap-lgLarge gap (override default)
BootstrapAirframeNotes
d-flexaf-inlineFlex display (recipe-first)
d-flex flex-columnaf-stackVertical stack
d-flex flex-rowaf-inlineHorizontal inline
d-flex flex-wrapaf-inlineWrapping inline
d-gridaf-gridGrid display
d-noneaf-hiddenHidden
d-blockaf-blockBlock display
BootstrapAirframeNotes
d-flex flex-wrap align-items-centeraf-clusterDefault semantic cluster
d-flex flex-wrap align-items-center (explicit)af-inline af-items-centerExplicit utilities
d-flex align-items-center justify-content-betweenaf-spreadDefault semantic spread
d-flex align-items-center justify-content-between (explicit)af-inline af-items-center af-justify-betweenExplicit utilities
d-flex align-items-center justify-content-centeraf-centerDefault semantic center
d-flex align-items-center justify-content-center (explicit)af-inline af-items-center af-justify-centerExplicit utilities
BootstrapAirframeNotes
text-centeraf-text-centerCenter text
text-leftaf-text-startStart-aligned text (LTR/RTL safe)
text-rightaf-text-endEnd-aligned text (LTR/RTL safe)
BootstrapAirframeNotes
tabular-numsaf-numericTabular numbers
BootstrapAirframeNotes
w-100af-w-fullFull width
BootstrapAirframeNotes
m-0af-m-0No margin
m-1af-m-xsSmall margin
m-2af-m-smMedium margin
m-3af-m-mdLarge margin
m-4af-m-lgExtra large margin
m-5af-m-xlXXL margin
BootstrapAirframeNotes
p-0af-p-0No padding
p-1af-p-xsExtra small padding
p-2af-p-smSmall padding
p-3af-p-mdMedium padding
p-4af-p-lgLarge padding
p-5af-p-xlExtra large padding
<!-- Bootstrap -->
<div class="card">
  <div class="card-header">
    Header
  </div>
  <div class="card-body">
    <h5 class="card-title">
      Title
    </h5>
    <p class="card-text">
      Content
    </p>
  </div>
  <div class="card-footer">
    Footer
  </div>
</div>
<!-- Airframe -->
<div class="af-card">
  <div class="af-card__header">
    Header
  </div>
  <div class="af-card__body">
    <h5 class="af-card__title">
      Title
    </h5>
    <p class="af-card__body">
      Content
    </p>
  </div>
  <div class="af-card__footer">
    Footer
  </div>
</div>
<!-- Bootstrap -->
<div class="container">
  <div class="row g-3">
    <div class="col-12 col-lg-8">
      Main Content
    </div>
    <div class="col-12 col-lg-4">
      Sidebar
    </div>
  </div>
</div>
<!-- Airframe -->
<div class="af-container">
  <div class="af-grid">
    <div class="af-col-span-8@lg">
      Main Content
    </div>
    <div class="af-col-span-4@lg">
      Sidebar
    </div>
  </div>
</div>
<!-- Bootstrap -->
<div class="d-flex gap-2">
  <button class="btn btn-primary">
    Save
  </button>
  <button class="btn btn-secondary">
    Cancel
  </button>
</div>
<!-- Airframe -->
<div class="af-inline af-gap-sm">
  <button class="af-btn">
    Save
  </button>
  <button class="af-btn af-is-secondary">
    Cancel
  </button>
</div>
<!-- Bootstrap -->
<div class="alert alert-warning d-flex justify-content-between align-items-center">
  <span>
    Warning message
  </span>
  <button class="btn btn-sm btn-warning">
    Action
  </button>
</div>
<!-- Airframe -->
<div class="af-alert af-is-warning af-inline af-justify-between af-items-center">
  <span>
    Warning message
  </span>
  <button class="af-btn af-is-sm af-is-warning">
    Action
  </button>
</div>
<!-- Bootstrap -->
<div class="container">
  <div class="row">
    <div class="col-12 col-md-6">
      <div class="card">
        <div class="card-body">
          <h5 class="card-title">
            Form Title
          </h5>
          <form>
            <div class="mb-3">
              <label class="form-label" for="name">
                Name
              </label>
              <input type="text" id="name" class="form-control">
            </div>
            <div class="mb-3">
              <label class="form-label" for="country">
                Country
              </label>
              <select id="country" class="form-select">
                <option>
                  Choose...
                </option>
              </select>
            </div>
            <button type="submit" class="btn btn-primary">
              Submit
            </button>
          </form>
        </div>
      </div>
    </div>
  </div>
</div>
<!-- Airframe -->
<div class="af-container">
  <div class="af-grid">
    <div class="af-col-span-6@md">
      <div class="af-card">
        <div class="af-card__body">
          <h5 class="af-card__title">
            Form Title
          </h5>
          <form class="af-form">
            <div class="af-field">
              <label class="af-field__label" for="name">
                Name
              </label>
              <input type="text" id="name" class="af-input">
            </div>
            <div class="af-field">
              <label class="af-field__label" for="country">
                Country
              </label>
              <select id="country" class="af-select">
                <option>
                  Choose...
                </option>
              </select>
            </div>
            <button type="submit" class="af-btn">
              Submit
            </button>
          </form>
        </div>
      </div>
    </div>
  </div>
</div>

See also: Tailwind Cheat Sheet | Why Airframe?