Upgrade to 1.5
Move a project from Tabler 1.4 to 1.5. Every breaking change is listed with a before and after example for markup, JavaScript and Sass.
Most projects only use the compiled CSS and JavaScript from dist/. If that is you, the upgrade is short: update the package, remove Bootstrap, and check the color mode default and the visual changes. Projects that compile Tabler from the Sass sources have more work to do - see Sass changes.
Overview
Use this table to find the changes that affect you.
| If you… | You need to… |
|---|---|
Load dist/css and dist/js |
Remove Bootstrap's CSS and JS - Tabler now ships them |
Load bootstrap.bundle.min.js |
Remove it, or components will start twice |
Use window.bootstrap.Modal |
Use window.tabler.Modal |
Compile scss/tabler.scss yourself |
Switch to @use … with () and add the PostCSS prefix step |
| Override Sass variables | Check the list of removed variables |
Use .badges-list or .tags-list |
Rename to .badge-list and .tag-list (old names still work) |
| Use ApexCharts | Update to ApexCharts 7 |
| Use Turbo with Tabler | The built-in integration is gone - see Turbo |
Load tabler-theme.js |
Pages follow the OS color scheme now - see Color mode |
| Use payment provider icons | Check the removed providers |
Link files inside dist/libs |
Check the moved paths |
Load tabler.rtl.css |
You can drop it - plain tabler.css now handles RTL |
Have .text-gray-* classes in your markup |
They color the text now - see Gray text utilities |
Update the package
Install the new version:
npm install --save @tabler/[email protected]
Or update the CDN links:
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/@tabler/[email protected]/dist/css/tabler.min.css"
/>
<script src="https://cdn.jsdelivr.net/npm/@tabler/[email protected]/dist/js/tabler.min.js"></script>
Bootstrap is now part of Tabler
Bootstrap is no longer a dependency. Its JavaScript and Sass sources live inside @tabler/core, based on Bootstrap 5.3.8.
Remove Bootstrap from your project:
npm uninstall bootstrap
Then remove the separate Bootstrap files from your pages:
- <link rel="stylesheet" href="/vendor/bootstrap/bootstrap.min.css" />
<link rel="stylesheet" href="/vendor/tabler/tabler.min.css" />
- <script src="/vendor/bootstrap/bootstrap.bundle.min.js"></script>
<script src="/vendor/tabler/tabler.min.js"></script>
If you leave bootstrap.bundle.min.js on the page, every component starts twice. You will see modals that close at once, or dropdowns that never open.
JavaScript imports
Bootstrap components are exported from @tabler/core:
- import { Modal, Tooltip } from 'bootstrap'
+ import { Modal, Tooltip } from '@tabler/core'
The sources under js/ are TypeScript now: js/tabler.js became js/tabler.ts and js/src/*.js became js/src/*.ts. Import from the package root or from dist/js/, not from the source files.
Global variable
The UMD build puts everything under tabler:
- const modal = new bootstrap.Modal(element)
+ const modal = new tabler.Modal(element)
tabler.bootstrap.Modal also works. You can replace bootstrap. with tabler.bootstrap. across your project as a quick fix.
Data attributes
Every component now reads data-tblr-* as well as data-bs-*. Both prefixes work, so you do not need to change your markup:
<button data-bs-toggle="modal" data-bs-target="#modal">Works</button>
<button data-tblr-toggle="modal" data-tblr-target="#modal">Also works</button>
Dark mode still uses data-bs-theme="dark".
Turbo integration removed
The built-in @hotwired/turbo integration is gone, together with the .turbo-progress-bar styles. You can keep using Turbo, but install it yourself and style the progress bar in your own CSS:
.turbo-progress-bar {
height: 3px;
background-color: var(--tblr-primary);
}
Color mode defaults to auto
tabler-theme.js used light as its default color mode. It now defaults to auto: with no stored choice, the script reads prefers-color-scheme and sets data-bs-theme on <html> to light or dark. Visitors whose operating system is set to dark will see your pages in dark mode after the upgrade.
To keep light as the starting point, render the attribute on the server; the script only replaces it with a stored choice or a URL parameter:
<html data-bs-theme="light">
A visitor can still pick a mode with ?theme=light or ?theme=dark in the URL, and the choice is stored in localStorage. See Color modes for all theme settings.
Removed payment providers
The payment icons now come from the Tabler Payments set, which adds 74 providers and drops 12 that no longer operate. Their .payment-provider-* classes and dist/img/payments/*.svg files are gone:
clickandbuy, dotpay, laser, ogone, okpay, paymill, payza, sage, solo, switch, ukash, verisign
If you still show one of them, copy its SVG from the 1.4 package into your project.
Smaller dist/libs folder
dist/libs now holds only the runtime files each library needs, instead of a full copy of every package. If you link straight to a file inside dist/libs, check that the path still exists after the upgrade. These are the paths most likely to break:
| Removed | Use instead |
|---|---|
tom-select/dist/js/tom-select.complete.min.js |
tom-select/dist/js/tom-select.base.min.js |
tom-select/dist/css/tom-select.min.css |
tom-select/dist/css/tom-select.bootstrap5.min.css |
countup.js/dist/countUp.min.js |
countup.js/dist/countUp.umd.js |
signature_pad/dist/signature_pad.min.js |
signature_pad/dist/signature_pad.umd.min.js |
star-rating.js/dist/star-rating.esm.min.js |
star-rating.js/dist/star-rating.min.js |
plyr/dist/plyr.polyfilled.min.js |
plyr/dist/plyr.min.js |
litepicker/dist/bundle.js |
litepicker/dist/litepicker.js |
jsvectormap/dist/jsvectormap.min.css |
jsvectormap/dist/jsvectormap.css |
@hotwired/turbo/ |
Install @hotwired/turbo yourself, see Turbo |
The base build of Tom Select ships without plugins, so load any plugin you use from npm. The unminified builds are gone as well, such as apexcharts/dist/apexcharts.js or clipboard/dist/clipboard.js: link the .min.js file next to them. Anything else that is no longer shipped can be loaded from your own node_modules or from a CDN. The list of shipped files is in libs.json.
Sass changes
Skip this section if you use the compiled CSS from dist/css.
Sass module system
The Sass sources now use the module system (@use and @forward). Setting variables before an @import no longer changes them. Use @use … with () instead:
- $primary: #f11d46;
- $font-family-sans-serif: 'Inter', sans-serif;
- @import '@tabler/core/scss/tabler';
+ @use '@tabler/core/scss/tabler' with (
+ $primary: #f11d46,
+ $font-family-sans-serif: ('Inter', sans-serif)
+ );
Custom property prefix moved to PostCSS
The $prefix Sass variable was removed. Custom properties are written without a prefix in the sources, such as --card-bg, and the public --tblr- prefix is added at build time by PostCSS.
This means plain sass output no longer holds --tblr-* names:
/* sass scss/tabler.scss → tabler.css */
:root {
--primary: #066fd1; /* not --tblr-primary */
}
Add postcss-prefix-custom-properties to your CSS pipeline, after Sass:
import postcss from 'postcss'
import prefixCustomProperties from 'postcss-prefix-custom-properties'
const result = await postcss([
prefixCustomProperties({
prefix: 'tblr-',
// Vendor stylesheets read their own variable names - never prefix these
ignore: [/^--tblr-/, /^--bs-/, /^--fc-/, /^--gl-/, /^--litepicker-/, /^--plyr-/, /^--ts-/, '--section-bg'],
}),
]).process(css, { from: undefined })
If you do not want a PostCSS step, use the compiled dist/css/tabler.css and override the CSS variables. See Customize Tabler.
Custom properties instead of Sass variables
Some Sass variables only fed a CSS variable, so they were dropped in favor of that variable. Surface colors are the most common case:
- @use '@tabler/core/scss/tabler' with ($bg-surface: #fff);
+ :root {
+ --tblr-bg-surface: #fff;
+ }
Removed Sass variables
Unused !default variables were removed. Passing one to @use … with () now raises a Sass error instead of being ignored:
Error: This variable was not declared with !default in the @used module.
These variables are gone:
$accordion-bg, $accordion-border-color, $accordion-button-active-bg, $accordion-button-focus-border-color, $accordion-color, $accordion-icon-width, $avatar-box-shadow, $badge-line-height, $bg-surface, $bg-surface-dark, $bg-surface-secondary, $bg-surface-tertiary, $card-bg-hover, $card-hover-box-shadow, $code-line-height, $enable-social-colors, $font-local, $font-size-75, $font-size-100, $font-size-200, $font-size-300, $font-size-400, $font-size-500, $font-size-600, $font-size-700, $font-weight-black, $form-check-input-checked-color, $form-switch-bg-size, $line-height-100, $line-height-200, $line-height-300, $line-height-400, $line-height-500, $line-height-600, $line-height-700, $nav-link-active-color, $nav-tabs-bg, $navbar-brand-margin-right, $navbar-dark-active-bg, $prefix, $spacer-0, $steps-margin, $table-bg-scale-dark, $table-th-border-color, $table-th-color, $text-muted, $text-secondary-dark-opacity, $text-secondary-light-opacity
Most of them have a CSS variable you can use instead. For example, $font-size-300 is now --tblr-font-size-h3, and $text-muted is --tblr-secondary-color.
Removed Sass files
Bootstrap compiles from scss/bootstrap/ now, so the partials that used to bridge it are gone: _bootstrap-config.scss, _bootstrap-components.scss and _bootstrap-override.scss. _debug.scss, _variables-marketing.scss and vendor/_turbo.scss were removed too; the marketing variables now live next to their components in marketing/. Import the entry points rather than the partials:
@use '@tabler/core/scss/tabler';
@use '@tabler/core/scss/tabler-marketing';
Google Fonts variables
$font-google and $font-google-monospaced still add the Google Fonts @import, but they no longer put the font at the front of $font-family-sans-serif and $font-family-monospace. $font-local is gone. Set the font stack yourself:
@use "@tabler/core/scss/tabler" with (
$font-google: "Inter",
+ $font-family-sans-serif: ("Inter", -apple-system, BlinkMacSystemFont, sans-serif)
);
Tabler no longer ships a web font. The default stack uses the system font of the device, so nothing is downloaded. To use your own font, override --tblr-font-sans-serif.
Renamed classes
The old names still work, so you can rename at your own pace.
| Old | New | Status |
|---|---|---|
.badges-list |
.badge-list |
Deprecated alias |
.tags-list |
.tag-list |
Deprecated alias |
.markdown |
.prose |
Both supported |
- <div class="badges-list">
+ <div class="badge-list">
Visual changes
These changes are not breaking, but they change how a page looks. Check your screens after the upgrade.
- Fonts: the defaults are now the system fonts of the device, instead of Inter. To keep your old stack, set
--tblr-font-sans-serif. - Shadows: the
--tblr-shadow-*tokens use a newxsto2xlscale, plusoverlay, with softer defaults. - Colors: body text is lighter, dark mode borders and disabled inputs are easier to see, and
--tblr-gray-*-fgtokens now map straight to--tblr-gray-*. - Links: in dark mode, links use a lighter tint of the primary color, so they meet the 4.5:1 contrast ratio on dark surfaces. Override
--tblr-link-colorto change it. - Sizes:
.form-control,.btnand.input-groupnow agree onsmandlgsizes,.btn-iconis square, and.icon-smuses a1.5stroke width. - Cards:
--tblr-card-header-bgand--tblr-card-footer-bgcan be set on their own, and the card status bar is3px. - Layout: the
margin-inline-start: calc(100vw - 100%)hack on the root element is gone, so there is no white gap on the left when a scrollbar is present. - Trending: the component uses the
arrow-upandarrow-downicons instead oftrending-upandtrending-down.
Gray text utilities
Tabler 1.4 had no .text-gray-* classes, only .text-gray-*-fg. A class like .text-gray-200 in your markup did nothing, and the text kept the color of its parent. Tabler 1.5 adds .text-gray-50 to .text-gray-950, so the same class now sets the color. On .text-gray-200 that is a very light gray, which is hard to read on a white page.
Pick the shade you want to see, or remove the class:
- <p class="text-gray-200">Last updated 3 hours ago</p>
+ <p class="text-gray-600">Last updated 3 hours ago</p>
For muted text, .text-secondary follows the theme and keeps enough contrast in dark mode.
RTL
The Sass sources use logical properties and a --tblr-dir multiplier, so plain tabler.css works in both directions. Set dir on the document and drop the RTL stylesheet:
<html dir="rtl">
- <link rel="stylesheet" href="/dist/css/tabler.rtl.min.css" />
+ <link rel="stylesheet" href="/dist/css/tabler.min.css" />
The *.rtl.css files are still published, so nothing breaks if you keep them. See the RTL support page for the full list of RTL builds and which utilities flip automatically.
Third party libraries
-
ApexCharts moved from 3.54 to 7.0. If you install ApexCharts yourself, update it too and read the ApexCharts changelog - the major versions renamed several options. Charts also read
--chart-{id}-color-{index}variables now. -
Tabler Icons moved to 3.46, and Tabler Illustrations to 1.16.
-
Tom Select cannot be compiled from its Sass sources against Tabler anymore. Its
tom-select.bootstrap5.scssreads Bootstrap variables such as$border-colorand passes them tocolor.adjust(), but in Tabler these are now CSS variables likevar(--gray-200), which is not a color to Sass. Use the compiledtom-select.bootstrap5.cssinstead, or set the two variables Tom Select adjusts to plain colors before importing it:// `as *` keeps Tabler's variables visible to the @import below @use '@tabler/core/scss/tabler' as *; $select-color-text: #182433; $select-color-item-border: #e6e7e9; @import 'tom-select/dist/scss/tom-select.bootstrap5';
Browser support
Tabler 1.5 relies on light-dark(), color-mix(), @property and :has() with no fallback. This raises the minimum browser versions:
| Browser | Minimum version |
|---|---|
| Chrome | 123 |
| Edge | 123 |
| Firefox | 128 |
| Safari | 17.5 |
| iOS Safari | 17.5 |
Older browsers still render the layout, but colors fall back to unstyled values. See Browser support for the full list.
What is new in 1.5
Besides the changes above, 1.5 adds:
- New components:
.btn-ghost,.card-gradient, progress steps, progress background,.progress-lgand.progress-xl, background pattern utilities,.text-gray-*utilities, and a.bg-blurutility. - A folded sidebar (
navbar-folded,navbar-folded-hover) withnav-section-titlelabels and anavbar-footerzone. - An
autocolor mode that follows the systemprefers-color-schemesetting. - Print styles:
d-print-*utilities and amedia-printmixin, see Printing. - A language selector in the navbar and a new structure for the
navbar-sidecomponent. - New preview pages: CRM dashboard, crypto dashboard, task list, onboarding, pay, card gradients, all elements, and several new modals.
- Framework integration guides for Laravel, React, Next.js, Vue, Angular, Nuxt, Symfony, Django, Rails, SvelteKit and Astro.
The full list is in the changelog.

