Migrating from Bootstrap to Fluid
This guide maps common Bootstrap patterns to their Fluid equivalents. The key difference: Fluid uses data attributes and semantic HTML instead of utility classes.
Layout
| Bootstrap | Fluid |
|---|---|
<div class="container"> |
<div class="container"> (same) |
<div class="row"><div class="col-md-6"> |
<div data-grid="2"> |
<div class="row"><div class="col-md-4"> |
<div data-grid="3"> |
<div class="d-flex justify-content-between"> |
<div data-flex="row" data-justify="between"> |
<div class="d-flex align-items-center"> |
<div data-flex="row" data-items="center"> |
<div class="d-none d-md-block"> |
<div data-hide="mobile"> |
Before (Bootstrap grid)
<div class="container">
<div class="row">
<div class="col-md-4">Sidebar</div>
<div class="col-md-8">Main content</div>
</div>
</div>
After (Fluid grid)
<div class="container">
<div data-grid="3">
<div>Sidebar</div>
<div style="grid-column: span 2;">Main content</div>
</div>
</div>
Components
| Bootstrap | Fluid |
|---|---|
<button class="btn btn-primary"> |
<button class="button" data-variant="primary"> |
<div class="card"><div class="card-body"> |
<div class="card"><div class="card__content"> |
<div class="modal"> |
<dialog class="modal"> (native!) |
<div class="accordion"> |
<details class="accordion__item"> (native!) |
<div class="alert alert-danger"> |
<div class="alert" data-status="error"> |
<table class="table table-striped"> |
<table class="table" data-variant="striped"> |
<div class="tooltip"> |
<span data-tooltip="text" data-tooltip-pos="top"> |
<span class="badge bg-primary"> |
<span class="badge" data-variant="primary"> |
<div class="spinner-border"> |
<div class="spinner"> |
Modal: Before and After
<!-- Bootstrap: requires JS initialization -->
<div class="modal fade" id="myModal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Title</h5>
<button class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">Content here</div>
</div>
</div>
</div>
<!-- Fluid: native HTML dialog, no JS library needed -->
<dialog class="modal" id="myModal">
<h2>Title</h2>
<p>Content here</p>
<button onclick="this.closest('dialog').close()">Close</button>
</dialog>
Accordion: Before and After
<!-- Bootstrap: requires JS -->
<div class="accordion" id="myAccordion">
<div class="accordion-item">
<h2 class="accordion-header">
<button class="accordion-button" data-bs-toggle="collapse"
data-bs-target="#collapseOne">Section 1</button>
</h2>
<div id="collapseOne" class="accordion-collapse collapse show">
<div class="accordion-body">Content</div>
</div>
</div>
</div>
<!-- Fluid: native HTML details, zero JS -->
<details class="accordion__item" open>
<summary>Section 1</summary>
<p>Content</p>
</details>
Spacing
| Bootstrap | Fluid |
|---|---|
class="p-3 m-2" |
data-padding="md" or use CSS custom properties |
class="mt-4" |
Use --space-* tokens in custom CSS |
class="gap-3" |
data-gap="md" |
For one-off spacing adjustments, use Fluid's design tokens directly:
.my-element {
margin-block-start: var(--space-8);
padding-inline: var(--space-4);
}
Typography
| Bootstrap | Fluid |
|---|---|
class="text-center" |
data-align="center" |
class="fw-bold" |
Semantic elements; or font-weight: var(--weight-bold) |
class="fs-1" |
Use semantic headings (h1-h6); Fluid handles sizing |
class="text-muted" |
<small> or color: var(--text-muted) |
Key Differences
- No JavaScript required -- Fluid uses native HTML elements (
dialog,details,popover) instead of jQuery or Bootstrap JS plugins. - No build step -- Link one CSS file and start building. No Sass compilation needed.
- Runtime theming -- Change
data-presetordata-themeattributes and the entire look transforms instantly. - Data attributes replace most utility classes -- Instead of memorizing dozens of class names, use descriptive data attributes.
- Fewer utility classes by design -- Use semantic HTML and CSS custom properties instead of piling on single-purpose classes.
Migration Strategy
Start with layout. Replace Bootstrap's row/col grid with
data-grid. This is the most mechanical change and gives immediate results.Migrate components one at a time. Cards, alerts, and badges are straightforward class swaps. Modals and accordions gain native HTML behavior.
Replace spacing utilities. Swap
p-*,m-*, andgap-*classes with data attributes or CSS custom properties.Remove Bootstrap JS last. Once all modals use
<dialog>and all accordions use<details>, you no longer need Bootstrap's JavaScript bundle.Run both frameworks during migration. Fluid uses
@layerfor CSS cascade management, so it won't conflict badly with Bootstrap during a gradual transition. Add Fluid's stylesheet alongside Bootstrap and migrate section by section.
<!-- During migration: both stylesheets -->
<link rel="stylesheet" href="bootstrap.min.css">
<link rel="stylesheet" href="fluid.css">
<!-- Fluid's @layer system prevents most conflicts -->
Once migration is complete, remove the Bootstrap stylesheet and its JS bundle entirely.