Customization & Theming
AdminLTE inherits Bootstrap 5.3’s CSS-custom-properties theming model and adds its own layer of SCSS variables on top. You can customize the look two ways:
- CSS custom properties — quick, no build step, works on prebuilt CSS.
- SCSS variables — slower (requires a build), but lets you change anything including grid breakpoints and sidebar width.
Quick wins with CSS variables
Bootstrap and AdminLTE expose dozens of CSS custom properties on
:root. Override them in your own stylesheet to retheme without
rebuilding:
:root,
[data-bs-theme="light"] {
--bs-primary: #6610f2; /* swap Bootstrap's blue for purple */
--bs-primary-rgb: 102, 16, 242;
--bs-body-bg: #f3f4f6;
}
[data-bs-theme="dark"] {
--bs-body-bg: #14171c; /* darker than Bootstrap's default */
--bs-body-color: #e9ecef;
}
Components built on var(--bs-primary) (most of AdminLTE’s chrome)
pick this up automatically.
Common variables worth knowing
| Variable | Default | What it controls |
|---|---|---|
--bs-primary |
#0d6efd |
Brand colour, used in active sidebar items, primary buttons |
--bs-body-bg |
#fff (light) / #212529 (dark) |
Page background |
--bs-body-color |
#212529 |
Default text colour |
--bs-border-color |
#dee2e6 |
All hairline borders |
--bs-border-radius |
.375rem |
Default radius for cards, buttons, inputs |
--bs-border-radius-lg |
.5rem |
Larger radius, used for modals |
--bs-font-sans-serif |
system-ui, ... |
Default font stack |
For the full list, see Bootstrap CSS variables.
SCSS variables
If you’re building from source (cloned the repo or installed via npm + your
own bundler), edit
src/scss/_variables.scss
and recompile.
The most-overridden variables, with their defaults:
// Sidebar
$lte-sidebar-width: 250px; // collapse to mini at ~70px
$lte-sidebar-breakpoint: lg; // breakpoint at which sidebar starts off-canvas
$lte-sidebar-padding-x: .5rem;
$lte-sidebar-padding-y: .5rem;
// Sidebar colours (light theme)
$lte-sidebar-color: $gray-800;
$lte-sidebar-hover-bg: rgba($black, .1);
$lte-sidebar-active-color: $black;
$lte-sidebar-menu-active-bg: rgba($black, .1);
// Header
$lte-app-header-height: $nav-link-height + ($lte-app-header-link-padding-y * 2);
$lte-app-header-bottom-border-color: var(--#{$prefix}border-color);
// Transitions
$lte-transition-speed: .3s;
$lte-transition-fn: ease-in-out;
Bootstrap’s own variables (button colours, font sizes, spacing scale,
breakpoints) live in
src/scss/_bootstrap-variables.scss. All values use !default, so override them in your own SCSS
file before the import:
// my-theme.scss
// 1. Your overrides FIRST
$primary: #6610f2;
$lte-sidebar-width: 280px;
$border-radius: .25rem;
// 2. Then import AdminLTE (which imports Bootstrap)
@import "node_modules/admin-lte/src/scss/adminlte";
Recompiling SCSS
If you cloned the repo, the build pipeline is already wired:
npm install
npm run css # one-off build → dist/css/
npm run watch-css-main # rebuild on save during development
For a project that uses AdminLTE as a dependency, point your bundler at
node_modules/admin-lte/src/scss/adminlte.scss. Examples:
// Vite / Rollup / Webpack
import "admin-lte/src/scss/adminlte.scss"
Custom sidebar branding
The .sidebar-brand element accepts text, an image, or both.
Markup:
<div class="sidebar-brand">
<a href="/" class="brand-link">
<img src="/assets/logo.svg" alt="Logo" class="brand-image opacity-75 shadow" />
<span class="brand-text fw-light">My Dashboard</span>
</a>
</div>
To swap the logo when the sidebar collapses to its mini state, AdminLTE provides a built-in pattern — see the Logo Switch layout demo for the markup.
Dark mode customization
AdminLTE follows Bootstrap 5.3’s data-bs-theme attribute system.
To customize dark-mode colours, scope your variables under
[data-bs-theme="dark"]:
[data-bs-theme="dark"] {
--bs-primary: #4dabf7; /* lighter primary for dark backgrounds */
--lte-sidebar-color: #e9ecef;
--lte-sidebar-active-color: #fff;
}
The Color Mode page covers the toggle markup and JavaScript that switches the attribute.
Custom sidebar colour scheme
AdminLTE ships its sidebar styled for light mode, but the demos apply
data-bs-theme="dark" on .app-sidebar to
get the dark sidebar variant against a light page. You can mix and match:
<!-- Light page, dark sidebar (the demo pattern) -->
<body class="bg-body-tertiary">
<aside class="app-sidebar bg-body-secondary shadow" data-bs-theme="dark">
...
</aside>
</body>
<!-- Light page, light sidebar -->
<body class="bg-body-tertiary">
<aside class="app-sidebar bg-body shadow border-end">
...
</aside>
</body>
Compact mode
Add .compact-mode to .app-wrapper (or anywhere up
the tree) to reduce padding throughout the layout — handy for data-dense
dashboards. The dimensions for compact mode come from the
*-compact variables in _variables.scss.
<div class="app-wrapper compact-mode">
<!-- header, sidebar, main content with tighter spacing -->
</div>
When to recompile vs. override at runtime
| Customization | CSS variables | SCSS rebuild |
|---|---|---|
| Brand colours | ✅ | ✅ |
| Body / text colours | ✅ | ✅ |
| Border radius | ✅ | ✅ |
| Sidebar width | ❌ (not a CSS var) | ✅ |
| Breakpoint changes | ❌ | ✅ |
| Spacing scale | ❌ | ✅ |
| Font sizes | partial | ✅ (full control) |
Use CSS variables for everything you can — it survives AdminLTE upgrades without merge conflicts. Reserve SCSS overrides for structural changes (sidebar width, breakpoints) that CSS variables don’t cover.