RTL Support
AdminLTE ships an RTL (right-to-left) stylesheet alongside the standard LTR one, generated from the same source via rtlcss. Use it for Arabic, Hebrew, Persian, Urdu, and any other right-to-left scripts.
The pre-built RTL stylesheet
Every release publishes RTL variants of every CSS file:
dist/css/adminlte.css ← LTR (default)
dist/css/adminlte.rtl.css ← RTL
dist/css/adminlte.min.css
dist/css/adminlte.rtl.min.css
Optional stylesheets get the same treatment — the Select2 compatibility theme, for instance, ships as adminlte-select2.rtl.css / .rtl.min.css alongside its LTR build.
To switch a page to RTL, swap the stylesheet and set dir="rtl" on the <html> element:
<html lang="ar" dir="rtl">
<head>
<link rel="stylesheet" href="dist/css/adminlte.rtl.min.css" />
</head>
<body class="layout-fixed sidebar-expand-lg bg-body-tertiary">
<!-- ...same markup as LTR -->
</body>
</html>
That’s it — the sidebar now docks to the right, scroll bars flip, padding/margin utilities mirror, and Bootstrap Icons stay LTR-safe (most icons aren’t directional). For a live example, see layout/layout-rtl.html.
Bootstrap’s dir="rtl" attribute
Setting dir="rtl" triggers Bootstrap 5.3’s logical property pathway as well — .ms-* becomes right-margin instead of left, .float-start floats right, etc. You don’t need separate Bootstrap classes for RTL; the same utility names work in both directions.
When you have a mixed-language UI
If your app shows RTL content on an otherwise-LTR page (eg. an Arabic text block inside an English admin panel), you can scope dir="rtl" to a single element:
<body>
<!-- LTR app shell -->
<main dir="rtl" lang="ar">
<!-- this block only is RTL -->
</main>
</body>
Bootstrap and AdminLTE handle nested direction switches correctly — the inner element’s direction is what counts.
Building RTL yourself
If you’re building AdminLTE from source and you’ve modified the SCSS, regenerate the RTL CSS:
npm run css-compile # builds LTR
npm run css-prefix # adds autoprefixer
npm run css-rtl # generates *.rtl.css from the LTR output
npm run css-minify
The full pipeline is wired into npm run css, so most of the time you just run that.
The conversion is handled by postcss running rtlcss — both are already in devDependencies. If you need to opt-out a specific rule from the LTR-to-RTL flip, use rtlcss control directives in your SCSS:
.brand-link {
/*rtl:ignore*/
margin-left: .5rem; // stays left-margin in both LTR and RTL
}
What flips automatically
| Direction-aware property | Behaviour in RTL |
|---|---|
margin-left / padding-left | Swapped to right |
left, right positioning | Swapped |
text-align: left / right | Swapped |
Bootstrap .ms-*, .me-*, .float-start, .float-end | Mirror via Bootstrap’s logical properties |
transform: translateX() | Sign inverted |
| Sidebar position | Docks to the right |
| Dropdown menu open direction | Flips automatically (Bootstrap handles this) |
What doesn’t flip
- Bootstrap Icons (SVG glyphs) — most icons are direction-neutral; arrows that do indicate direction (
bi-arrow-right,bi-chevron-right, etc.) need to be manually swapped to their-leftsiblings. - Inline images, charts, and third-party widgets — their internal layout doesn’t react to
dir. Check each integration (Chart.js, FullCalendar, Tabulator) for an RTL option. The demo’s Chart.js preset setsrtl: trueon legends and tooltips when<html dir="rtl">. - Numbers — digits stay LTR even in RTL contexts (this is standard Unicode bidi behaviour, not a bug).
Common gotchas
- The
.min.cssminified RTL build is.rtl.min.css, not.min.rtl.css. Filename order matters; the build script emits the former. - Don’t mix LTR and RTL stylesheets on the same page — pick one. If you need a mixed-direction app, use
dir="rtl"on the relevant subtree, not a separate stylesheet. - Icon mirroring: when you swap an icon for RTL, also update its
aria-labelif it indicates direction (eg. “Next page” should still say “Next page” — only the glyph rotates).