twitter/bootstrap
Bootstrap is a sleek, intuitive, and powerful front-end framework for building responsive, mobile-first websites fast. Includes CSS, Sass, and JavaScript components with extensive documentation and examples. Install via npm, yarn, Bun, Composer, or NuGet.
## Getting Started
### Minimal Setup in Laravel (Updated for v5.3.8)
1. **Install via npm** (unchanged):
```bash
npm install bootstrap@5.3.8 @popperjs/core
Add to resources/js/app.js (or your entry file):
import 'bootstrap';
Compile Assets (unchanged):
npm run dev
First Use Case (updated for WCAG 2.1 compliance):
<!-- WCAG 2.1 compliant color contrast (new in v5.3.8) -->
<button class="btn btn-primary" style="--bs-btn-padding-x: 0.5rem; --bs-btn-padding-y: 0.5rem">
Click Me
</button>
<div class="alert alert-success">Success message!</div>
Documentation:
Responsive Layouts (unchanged):
<div class="container">
<div class="row">
<div class="col-md-6">Left Column</div>
<div class="col-md-6">Right Column</div>
</div>
</div>
Forms with WCAG Compliance (new):
<!-- Leverage new CSS variables for better contrast -->
<form>
<div class="mb-3">
<label class="form-label" for="email" style="--bs-form-text-opacity: 1;">
Email
</label>
<input type="email" class="form-control" id="email" required>
</div>
<button class="btn btn-primary" type="submit">Submit</button>
</form>
Modals/Dropdowns (updated for focus behavior):
<!-- Fixed focus behavior in v5.3.8 (reverted PR #41668) -->
<button class="btn btn-secondary" data-bs-toggle="modal" data-bs-target="#exampleModal">
Open Modal
</button>
Component-Based Integration (unchanged):
@props(['type' => 'info'])
<div class="alert alert-{{ $type }}" role="alert">
{{ $slot }}
</div>
Dynamic Classes with CSS Variables (new):
<!-- Use Bootstrap's CSS variables for dynamic theming -->
<div class="p-3"
style="--bs-bg: {{ $isDark ? '#212529' : '#ffffff' }};">
Dynamic content
</div>
JavaScript Integration (updated for spinner fixes):
// Fixed spinner distortion in flex containers (PR #41654)
document.addEventListener('DOMContentLoaded', () => {
const spinner = new bootstrap.Spinner(document.getElementById('spinner'));
document.getElementById('load-btn').addEventListener('click', () => {
spinner.start();
// Simulate async task
setTimeout(() => spinner.stop(), 2000);
});
});
Asset Optimization (unchanged):
// vite.config.js
import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
import purgecss from 'vite-plugin-purgecss';
export default defineConfig({
plugins: [
laravel({ input: ['resources/css/app.css', 'resources/js/app.js'], refresh: true }),
purgecss({
content: ['./resources/**/*.blade.php'],
safelist: {
standard: ['btn', 'btn-primary', /^bg-/],
},
}),
],
});
WCAG 2.1 Compliance (new):
color-contrast() function (fixed in PR #41585):
// resources/scss/app.scss
@import "bootstrap/scss/bootstrap";
.my-text {
color: #333;
@include color-contrast(); // Ensures WCAG compliance
}
Custom Theming with CSS Variables (updated):
// resources/scss/custom.scss
:root {
--bs-body-bg: #f8f9fa;
--bs-body-color: #212529;
--bs-border-color: #dee2e6;
}
@import "bootstrap/scss/bootstrap";
Laravel Collective Integration (unchanged):
{!! Form::open(['class' => 'needs-validation', 'novalidate']) !!}
{!! Form::email('email', null, ['class' => 'form-control is-valid', 'required']) !!}
{!! Form::submit('Submit', ['class' => 'btn btn-primary']) !!}
{!! Form::close !!}
Search Input Fix (new):
<!-- Fixed cursor pointer on search cancel button (PR #41639) -->
<div class="input-group">
<input type="text" class="form-control" placeholder="Search">
<button class="btn btn-outline-secondary" type="button">
<svg class="bi bi-x" width="16" height="16"></svg>
</button>
</div>
CSS Specificity Conflicts (unchanged):
!important sparingly or increase specificity.JavaScript Initialization (updated):
.spinner-container {
display: flex;
align-items: center;
}
Asset Loading Order (unchanged):
Laravel Mix/Vite Quirks (updated):
bootstrap is imported in your entry file:
// resources/js/app.js
import '../css/app.css';
import 'bootstrap@5.3.8';
color-contrast() utilities.Form Validation (updated):
<div class="invalid-feedback" style="--bs-feedback-text-opacity: 1;">
{{ $message }}
</div>
Dynamic Content (new):
const observer = new MutationObserver(() => {
bootstrap.Tooltip.getOrCreateInstance(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
});
observer.observe(document.body, { childList: true, subtree: true });
Inspect Elements (unchanged):
Disable Cache (unchanged):
npm run dev -- --no-cache
Check Console Errors (updated):
Uncaught TypeError: bootstrap.Spinner is not a constructor → Ensure bootstrap.bundle.min.js is loaded.color-contrast() function not working → Verify SCSS compilation includes the fix (PR #41585).WCAG Validation (new):
npm install -g axe-core
axe "http://your-laravel-app.test"
Spinner Debugging (new):
.spinner-border, .spinner-grow {
flex-shrink: 0;
}
// resources/scss/custom.scss
$primary: #4e73df;
$
How can I help you explore Laravel packages today?