Subscribe
21 August, 2026 7 min read Aigars Silkalns

AdminLTE RTL: How to Build Right-to-Left Admin Dashboards

AdminLTE ships a right-to-left stylesheet in every release, and switching a dashboard to RTL takes two lines. Not a fork, not a plugin, not a separate download — the RTL build is generated from the same source as the default one and published alongside it. This guide covers the switch, what mirrors automatically, what does not, and how to regenerate the RTL build if you have customised the SCSS.

AdminLTE 4 running in right-to-left mode with the sidebar docked to the right, mirrored breadcrumb and footer, and the Layout RTL option selected in the sidebar menu

Everything below applies to Arabic, Hebrew, Persian, Urdu and any other right-to-left script. It is about layout direction, not translation — your interface copy stays in whatever language you wrote it.

The two-line switch

Every AdminLTE release publishes an RTL variant of every stylesheet, generated from the LTR source with rtlcss:

dist/css/adminlte.css          ← LTR (default)
dist/css/adminlte.rtl.css      ← RTL
dist/css/adminlte.min.css
dist/css/adminlte.rtl.min.css

To switch a page, swap the stylesheet and set dir="rtl" on the <html> element. The body markup does not change at all:

<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 is the whole change. The sidebar docks to the right, scrollbars flip, padding and margin utilities mirror, and the layout reads correctly from the right. Optional stylesheets get the same treatment — the Select2 compatibility theme ships as adminlte-select2.rtl.css alongside its LTR build.

There is a live example in the distribution at layout/layout-rtl.html, which is the screenshot above.

You do not need different Bootstrap classes

This is the part that surprises people coming from older frameworks. Setting dir="rtl" also triggers Bootstrap 5.3’s logical-property pathway, so the same utility class names work in both directions. .ms-3 becomes a right margin instead of a left one. .float-start floats right. .text-start aligns right.

You do not maintain two sets of markup, and you do not swap ms-* for me-* by hand. If you are migrating from Bootstrap 3 or 4, where RTL meant a separate stylesheet and a lot of manual class flipping, this is the thing that has changed.

What flips automatically

Property Behaviour in RTL
margin-left / padding-left Swapped to the right
left / right positioning Swapped
text-align: left / right Swapped
Bootstrap .ms-*, .me-*, .float-start, .float-end Mirror via logical properties
transform: translateX() Sign inverted
Sidebar position Docks to the right
Dropdown open direction Flips (Bootstrap handles it)

What does not flip, and why

Three things stay put, and only one of them is a bug you need to fix.

  • Directional icons. Most Bootstrap Icons are direction-neutral, but arrows and chevrons are not. bi-arrow-right still points right in an RTL layout, which is now backwards. Swap those for their -left siblings yourself — and when you do, leave the aria-label alone. A “Next page” control is still “Next page”; only the glyph rotates.
  • Charts and third-party widgets. Their internal layout does not react to dir. ApexCharts, FullCalendar and Tabulator each have their own RTL option — check the integration rather than assuming the stylesheet covered it.
  • Numbers. Digits stay left-to-right even inside RTL text. That is standard Unicode bidirectional behaviour, not a rendering fault, and you should not try to “fix” it. It is why the charts in the screenshots below still read left-to-right while everything around them mirrors.

Mixed-direction interfaces

If you need an RTL block inside an otherwise LTR admin panel — an Arabic content field in an English CMS, say — scope the attribute to that element rather than loading a second stylesheet:

<body>
  <!-- LTR app shell -->
  <main dir="rtl" lang="ar">
    <!-- this block only is RTL -->
  </main>
</body>

Bootstrap and AdminLTE both handle nested direction changes correctly; the innermost element’s direction is what applies.

Rebuilding RTL from source

If you have modified the SCSS, the shipped RTL file no longer matches your build and you need to regenerate it:

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 whole pipeline is wired into npm run css, so in practice that single command is all you need. The conversion runs through postcss and rtlcss, both already in devDependencies — there is nothing extra to install.

Occasionally a rule should not flip. Use an rtlcss control directive in your SCSS to opt it out:

.brand-link {
  /*rtl:ignore*/
  margin-left: .5rem;   /* stays a left margin in both directions */
}

Three gotchas worth knowing first

  • The filename order is .rtl.min.css, not .min.rtl.css. The build script emits the former, and guessing the other way produces a 404 that looks like the RTL build is missing.
  • Never load both stylesheets on one page. Pick one. For a mixed-direction interface, scope dir="rtl" to a subtree as shown above rather than loading a second sheet.
  • Direction is not translation. Switching to RTL mirrors your layout; it does not localise your strings, your dates or your number formats. Those are separate jobs, and a mirrored interface full of untranslated English is a common half-finished result.

RTL in our premium dashboard templates

Disclosure: the five below are our own commercial products. They are not AdminLTE builds — they are Next.js 16 applications with React 19 and Tailwind CSS v4 — but they solve the same problem differently, and it is worth seeing because the mechanism is not the one described above.

Instead of swapping a stylesheet at build time, each ships a direction toggle in its theme customiser. Flipping it sets dir="rtl" on the document, applies a dir-rtl class, and persists the choice to local storage so it survives a reload. Tailwind’s ltr: and rtl: variants then do the mirroring. Every screenshot below is a live demo with that toggle switched on — nothing was mocked up.

Apex Dashboard

Apex Dashboard in right-to-left mode showing page views, orders, active users and revenue cards with the navigation sidebar docked to the right

The general-purpose one, with the widest page set of the five — commerce, CRM, HR, finance and SaaS dashboards in a single install. Its RTL handling is the most thoroughly worked through of the group, including a documented caveat that the map component does not mirror.

Zenith Dashboard

Zenith Dashboard in right-to-left mode with mirrored stat cards, a traffic sources donut chart and monthly goals panel

The same feature set as Apex in a warmer, higher-contrast design. If you are choosing between the two, it comes down to which interface you would rather look at all day rather than to any capability gap.

Flux Dashboard

Flux Dashboard in right-to-left mode showing a gradient hero panel with uptime, deployments, active users and MRR, above sprint progress and team activity

Aimed at product and engineering teams — uptime, deployments, sprint progress and MRR rather than orders and invoices. The gradient hero panel is the most visually distinctive thing in the range, and it mirrors cleanly.

Vault Dashboard

Vault Dashboard in right-to-left mode showing an investment portfolio view with holdings, allocation and performance panels

An investment and portfolio template — holdings, allocation, dividends, earnings and a screener. A good stress test for RTL, because financial figures stay left-to-right by design while the surrounding layout mirrors, which is exactly the Unicode behaviour described earlier.

Fortress Dashboard

Fortress Dashboard in right-to-left mode showing a treasury yield curve, profit and loss by desk, asset allocation and risk-return analysis

The institutional finance one: yield curves, P&L by desk, risk and compliance, counterparty exposure. The densest layout of the five, which makes it the most useful of the group for judging whether a mirrored interface stays readable when there is a lot on screen.

AdminLTE RTL FAQ

Does AdminLTE support RTL?

Yes. Every release publishes an RTL variant of every stylesheet — adminlte.rtl.css and adminlte.rtl.min.css — generated from the same source with rtlcss. You switch by loading the RTL file and setting dir="rtl" on the <html> element. There is a working example in the distribution at layout/layout-rtl.html.

How do I enable RTL in AdminLTE?

Two changes. Point your stylesheet link at dist/css/adminlte.rtl.min.css instead of adminlte.min.css, and add dir="rtl" to the <html> tag along with the appropriate lang attribute. Your body markup stays exactly the same — no class changes are needed.

Do I need different Bootstrap classes for RTL?

No. Setting dir="rtl" activates Bootstrap 5.3’s logical properties, so the same utility names mirror automatically — .ms-* becomes a right margin, .float-start floats right, .text-start aligns right. This is the main practical difference from Bootstrap 3 and 4, where RTL meant maintaining a second set of classes.

Why do my icons still point the wrong way in RTL?

Because most icons are direction-neutral and are deliberately left alone. Directional glyphs such as bi-arrow-right and bi-chevron-right need swapping to their left-facing equivalents by hand. When you do, leave the aria-label unchanged — a “Next page” button is still labelled “Next page”; only the arrow rotates.

Why are numbers still left-to-right in my RTL dashboard?

That is correct behaviour, not a bug. The Unicode bidirectional algorithm keeps digits in left-to-right order even inside right-to-left text, which is how Arabic, Hebrew and Persian are actually written. Charts and numeric tables will keep reading left-to-right while the layout around them mirrors, and you should not override it.

Do I need to rebuild the CSS after customising the SCSS?

Yes — the shipped RTL file is generated from the stock LTR build, so it will not include your changes. Run npm run css, which compiles, prefixes, generates the RTL variant and minifies in one pass. If a specific rule should not be flipped, mark it with an /*rtl:ignore*/ control directive in your SCSS.

Next steps: the AdminLTE 4 live preview to see the dashboard itself, or our free admin panel templates roundup if you are still choosing a base.

Aigars Silkalns
Aigars Silkalns

Frontend web developer and founder of AdminLTE, the most popular open-source admin dashboard template on GitHub with 45,000+ stars. Over 10 years of experience building web applications with Bootstrap, React, Vue, Angular, Tailwind CSS, and WordPress. Creator of Colorlib and DashboardPack.