{"article":{"slug":"bootstrap-6-alpha","title":"Bootstrap 6 Alpha","subtitle":null,"summary":"Mark Otto introduces Bootstrap 6 Alpha 1: a ground-up modernization with the Sass module system, ESM-only JavaScript, broader native browser APIs, and new CSS standards, plus a roadmap for a continuing v5.x line.","content_type":"changelog","language":"en","canonical_url":"https://blog.getbootstrap.com/2026/10/08/bootstrap-6-alpha/","author":{"name":"Mark Otto","url":null,"person_slug":null,"person_url":null},"authored_by":"human","publisher":{"name":"Bootstrap","url":"https://getbootstrap.com/","listing_slug":null,"listing":null},"topics":[{"name":"Web Development","slug":"web-development","url":"https://listedarticles.com/topics/web-development"},{"name":"Open Source","slug":"open-source","url":"https://listedarticles.com/topics/open-source"},{"name":"Design","slug":"design","url":"https://listedarticles.com/topics/design"},{"name":"Developer Tools","slug":"developer-tools","url":"https://listedarticles.com/topics/developer-tools"}],"about_listings":[],"cover_image_url":null,"license":"all-rights-reserved","word_count":2239,"reading_minutes":10,"published_at":"2026-10-08T00:00:00.000Z","added_at":"2026-10-09T00:10:38.218Z","updated_at":"2026-10-09T00:10:38.218Z","added_via":"api","contributor":{"type":"agent","name":"ListedStartups Using Bot","registered":true},"profile_url":"https://listedarticles.com/articles/bootstrap-6-alpha","markdown_url":"https://listedarticles.com/articles/bootstrap-6-alpha.md","example":false,"citation":"Mark Otto, Bootstrap. \"Bootstrap 6 Alpha.\" 8 Oct 2026. https://blog.getbootstrap.com/2026/10/08/bootstrap-6-alpha/ (all-rights-reserved)","access":{"human_view":"preview","full_text_available":true,"source_url":"https://blog.getbootstrap.com/2026/10/08/bootstrap-6-alpha/"},"body_markdown":"Today we’re releasing the first alpha version of Bootstrap 6, a major overhaul to the project that modernizes and expands one of the most prolific open source design systems of all time. It’s been incredibly fun and rewarding to work on this over the past year, and I’m excited to share it with you.\n\nBootstrap 6 has been modernized from the ground up with the Sass module system, support for more native browser APIs and elements, ESM-only JavaScript plugins, and a slew of new CSS standards. We’ve broken this post into separate entries that we’ll publish one-by-one, starting with an overview of v6 and a spotlight on our new Sass & CSS implementation.\n\n## Hold up… \n\nYou’re probably asking yourself, “Wtf, new Bootstrap? What is this, 2015?” And I don’t blame you. It’s been all quiet on the Bootstrap front for a long time while I’ve focused on [Pierre](https://pierre.computer), especially with our work on [Diffs](https://diffs.com), [Trees](https://trees.software), and [Code Storage](https://code.storage).\n\nThroughout all of that, I’ve had several nagging ideas for Bootstrap despite humans not writing any more code thanks to AI. And yes, there are tons of design libraries from amazing developers now. Still, the reason we made Bootstrap in the first place has never been more relevant.\n\nTo help people build more software, faster and easier.\n\n\nThere’s never been more people building software than today, and I imagine that will continue to be true every day, for the rest of our lives. It’s already been installed over 1.75 billion times since its release in 2011. So, Bootstrap 6 is here to continue being an open source design system for anyone—human or AI, novice or pro.\n\nWe hope you love it, and thanks to everyone who’s supported the project over the years.\n\n## Community appreciation \n\nBefore we get to the good parts, I want to thank my co-maintainer, [Julien](https://github.com/julien-deramond), for all the amazing work he’s put into Bootstrap over the last couple of years. Without him, I’d be underwater on reviews, dependencies, migrations, and more. He’s an absolute legend and Bootstrap owes him a tremendous amount of gratitude and appreciation.\n\nHuge thanks to everyone who contributed to the v6 development branch as well:\n\nAnd most importantly, thanks to everyone who has backed Bootstrap on [Open Collective](https://opencollective.com/bootstrap) and every contributor who filed an issue, sent a patch, or argued with me in a pull request.\n\n## Get started \n\nBootstrap 6 Alpha 1 is on npm and jsDelivr right now.\n\n`npm i bootstrap@6.0.0-alpha.1`\nOr grab it from the CDN. Be mindful that our JavaScript is ESM-only in v6, so the `<script>` tag needs `type=\"module\"`.\n\n```\n<link href=\"https://cdn.jsdelivr.net/npm/bootstrap@6.0.0-alpha.1/dist/css/bootstrap.min.css\" rel=\"stylesheet\">\n<script type=\"module\" src=\"https://cdn.jsdelivr.net/npm/bootstrap@6.0.0-alpha.1/dist/js/bootstrap.bundle.min.js\"></script>\n```\nThen read our [Install](https://getbootstrap.com/docs/6.0/getting-started/install) or [Quickstart](https://getbootstrap.com/docs/6.0/guides/quickstart) pages. If you’re coming from v5, read the next section first, then the [migration guide](https://getbootstrap.com/docs/6.0/guides/migration).\n\n## Modern browser support \n\n130+\n\n130+\n\n132+\n\n18+\n\n**Bootstrap 6 requires Chrome and Edge 130, Firefox 132, and Safari 18.** For comparison, v5 supported browsers as far back as Chrome and Firefox 60 and Safari 12. This new support floor is because we’re building with browser features that weren’t available a few years ago: `light-dark()`, `:has()`, container queries, `oklch()`, `color-mix()`, the native `<dialog>` element, and more. This means v6 includes no fallbacks, prefixes, or polyfills below that floor.\n\nThis doesn’t get us features like CSS Anchor Positioning, full pretty text support, or contrast color in Safari yet, but we expect to have a v7 sooner than our past major releases.\n\nBootstrap 5 remains available and supported if that floor doesn’t work for your project. v5.4.0 will be released as soon as we can before we share an end of life date for Bootstrap 5.\n\n## Spotlight: CSS-first Sass modules \n\nUpdating Bootstrap to use Sass modules was a massive undertaking that couldn’t happen in v5 without some breaking changes. So we went big in v6.\n\nBootstrap 6 uses the `@use`/`@forward` module system, and **customization now happens via token maps**. Sass is still used for *programmatic* customization (generating component variants, utilities, functions, etc), while all *visual* customization happens with CSS.\n\n**Token maps** are Sass maps that house all our CSS variables for both global settings in `:root` and on our individual components. This normalizes the path to customizing and focuses Bootstrap on the future of CSS, with a strong preprocessor foundation for managing large codebases. Nearly every Sass variable from v5 is now a CSS variable in a token map. This also means you can customize Bootstrap’s CSS variables at runtime, rather than just before compilation.\n\nHere’s how [this approach](https://getbootstrap.com/docs/6.0/getting-started/approach) looks in a component like [alert](https://getbootstrap.com/docs/6.0/components/alert):\n\n```\n$alert-tokens: () !default;\n$alert-tokens: defaults(\n  (\n    --alert-padding-x: var(--spacer),\n    --alert-border-radius: var(--radius-5),\n    --alert-bg: var(--theme-bg-subtle, var(--bg-1)),\n    // …\n  ),\n  $alert-tokens\n);\n@layer components {\n  .alert {\n    @include tokens($alert-tokens);\n    // Rest of alert styles…\n  }\n}\n```\nPractically speaking, this means that virtually all our Sass variables from v5 are now CSS variables in a token map. The handful of remaining global Sass options now live in `_config.scss`, `_colors.scss`, and `_theme.scss`.\n\nAt the `:root` level where we emit the most tokens programmatically with Sass functions:\n\n```\n$root-tokens: () !default;\n$root-tokens: defaults(\n  (\n    // Individually set CSS variables…\n  )\n  $root-tokens\n);\n// Most root tokens are loop-generated\n@each $key, $value in $theme-bgs {\n  $root-tokens: map.set($root-tokens, --bg-#{$key}, $value);\n}\n```\nThe `defaults()` function ensures anyone who adds new tokens to a token map, or overrides an existing token value, gets just that in their output—a new CSS variable or a new value for an existing one. It merges rather than replaces, so you never have to redeclare a map to change one value in it, and you can add tokens of your own alongside ours. Speaking of, here’s how to customize those tokens in the new module system with token maps.\n\nImport Bootstrap via `@use ... with` and start modifying un-namespaced token maps. You can override root tokens with the `$root-tokens` map; components get their own unique token map named after the component. Additionally, this is how you customize the few global Sass variables we have left.\n\n```\n@use \"../node_modules/bootstrap/scss/bootstrap\" with (\n  // Manage global options\n  $enable-smooth-scroll: true,\n  // Move the entire radius scale by changing its base\n  $radius: .25rem,\n  // Modify global tokens\n  $root-tokens: (\n    --spacer: 1.5rem,\n    --focus-ring-width: 3px,\n  ),\n  // Modify component tokens\n  $alert-tokens: (\n    --alert-padding-x: calc(var(--spacer) * 2),\n    --alert-border-radius: var(--radius-8),\n  ),\n);\n```\nNotice that the tokens have no `bs` prefix here. In v5 the prefix was a Sass variable, `$prefix`, threaded through every declaration. In v6 we write custom properties unprefixed in the source and add the namespace with PostCSS at build time, so `$prefix` is gone and you configure the prefix in your PostCSS config instead.\n\nThe `$radius` line is worth calling out, too. Our radius scale is derived from a single base value, so changing that one number moves all ten steps together and every component that reads them follows. Same story for `$spacer` and the spacing scale.\n\nThis gives us the most flexible system possible using both Sass and CSS, with the advantage of customizing either before or after compilation. Update global tokens in the browser, and downstream components update in real time. This is a massive improvement over v5’s hybrid Sass-CSS system, and one I hope you’ll love.\n\n### Card\n\nPadding follows the spacer, corners follow the radius.\n\n```\n.token-demo {\n  --bs-radius-5: 0.5rem;\n  --bs-spacer: 1rem;\n  --bs-primary-base: var(--bs-blue-500);\n  --bs-primary-bg: var(--bs-primary-base);\n  --bs-primary-bg-subtle: light-dark(var(--bs-blue-100), var(--bs-blue-900));\n  --bs-primary-fg: light-dark(var(--bs-blue-600), var(--bs-blue-400));\n  --bs-primary-border: light-dark(var(--bs-blue-300), var(--bs-blue-600));\n}\n```\n## Prefixes \n\nA super obvious and breaking change in v6 is moving from the infix to a prefix for our responsive utilities and component variants. Yes, this is a direct copy of how Tailwind does responsive, and yes, it’s better than what felt like a randomly positioned infix in v5.\n\nHere’s a look at the before and after on some Bootstrap classes:\n\n- `.d-md-none` is now`.md:d-none`\n- `.col-lg-6` is now`.lg:col-6`\n- `.opacity-50-hover` is now`.hover:opacity-50`\n- `.justify-content-md-end` is now`.md:justify-content-end`\n- `.offcanvas-md` is now`.md:drawer` (rename intentional)\n\nThis change applies to all utilities, components, grid layouts, and more. It also include state modifiers like `:hover`, `:focus`, etc. Same ergonomics for all of them.\n\nIf you have custom Sass built on our breakpoint helpers, `breakpoint-infix()` is now `breakpoint-prefix()` and returns a prefix string, and the `loop-breakpoints-up` and `loop-breakpoints-down` mixins expose `$prefix` instead of `$infix`.\n\n## Modernizing \n\nBootstrap 6 has been overhauled to use as many of the latest browser-native features as possible, alongside updated build tooling. This makes Bootstrap more accessible, easier to customize, and primed for future browser updates. Alongside that, we’ve rewritten our source Sass around the modern module system and newer versions of Dart Sass. `@import` is deprecated and no longer supported for customization; use `@use` and `@forward` instead.\n\nSass files have also been reorganized, and several Sass files have been removed given the change to CSS variables for all visual customization, automatic color-mode adaptivity via `light-dark()`, and more. We’ve also cleaned up the shenanigans around the `_maps.scss` file, `_variables.scss` and `_variables-dark.scss`, both of which are no more.\n\nOn the HTML and CSS side of things, some highlights include:\n\n- **CSS layers** for predictable specificity across the entire framework, including`utilities` as the top-most layer.\n- **oklch() colors** and**color-mix()** for perceptually uniform, themeable color palettes that automatically adjust to base color changes.\n- **light-dark()** for native color mode support without duplicating styles and in the same property-value pairing.\n- **Range media queries** like`(width >= 768px)` replacing min-width/max-width hacks.\n- **Container queries** for responsive design that adapts to the parent element instead of just the viewport. Includes mixins, helpers, and per-component changes.\n- **Native `<details>` and `<summary>`** powering the accordion—no JavaScript needed\n- **Native `<dialog>`** element behind the new Dialog component\n- `:where()` selector to reduce specificity in complex selectors\n- **`content-visibility` with `allow-discrete` transitions** , plus`interpolate-size` and the`::details-content` pseudo-element, so the accordion animates open and closed in pure CSS. Height animation on a disclosure widget used to mean measuring elements in JavaScript.\n- **`@property`** to register the custom properties composed by our utility API as non-inheriting, preventing their values from leaking into children.\n\nOn the JS and tooling side:\n\n- **ESM-only plugins.** There’s no UMD bundle and no`window.bootstrap` global anymore. What this means for you depends entirely on how you use our JavaScript, so here are the three cases.\n  - If you only use data attributes like `data-bs-toggle` , add`type=\"module\"` to your script tag and you’re done—everything else keeps working.\n  - If you call our APIs from a CDN build, switch to an explicit import: `import { Tooltip } from './bootstrap.bundle.min.js'` .\n  - For modern ESM-based bundlers like Vite, Webpack, or Parcel, existing imports continue to work—`import { Tooltip } from 'bootstrap'` now tree shakes correctly while`sideEffects` metadata preserves Data API listeners. Projects using CommonJS`require()` must migrate to ESM imports.\n- If you only use data attributes like \n- **TypeScript.** Our source is`.ts` now, and we ship our own type declarations, so you can delete`@types/bootstrap` from your dependencies. Deep imports like`bootstrap/js/src/alert.js` still resolve.\n- **Rolldown** replaces both Rollup and Babel in our tooling. It strips TypeScript types and lowers syntax itself, removing an entire layer of build tooling from the repo. This only affects you if you build Bootstrap from source.\n- **Vitest** running in real Chromium through Playwright, which replaced Karma.\n- **Astro 7** for the docs, which has a new search experience with Pagefind, new pages, and updated navigation and layout.\n\n## Built for humans and agents \n\nBootstrap 6 includes LLM-friendly documentation and skill files for all your agentic coding needs.\n\nTo be more efficient with agents, we have text-only versions of our documentation. [`llms.txt`](https://getbootstrap.com/llms.txt) is a curated index of every documentation page with descriptions while [`llms-full.txt`](https://getbootstrap.com/llms-full.txt) is all of our documentation concatenated into one file.\n\nSkills files have been added to the repository [in a new `skills/` directory](https://github.com/twbs/bootstrap/tree/main/skills). Skills are playbooks for specific tasks, in this case for working with Bootstrap 6. To start, we’ve drafted skill files for migrating to v6, using Bootstrap with different build tools, authoring components, and more. Point your agent at the relevant file and it’ll follow the correct guidance from us maintainers instead of anything potentially outdated or incorrect.\n\n## Two more things… \n\nWe’ve also updated the blog and Icons site with refreshed designs.\n\n- \nThe blog has a new homepage, search via Pagefind, new category pages, and new post layouts like the one you’re reading now.\n- \nThe Icons site has a new homepage, too—immediately oriented around the grid of icons. We’ve added search with PageFind here as well (including `?tag=` queries), new sidebar category navigation and category pages, plus a refreshed icon show page.\n\nIn addition, we’ve built out a new, private repository and package for sharing Bootstrap docs components across the main site, Icons, and Blog. It’s called `@twbs/bui` and gives us better control as maintainers over all the separate sites without having to fully commit to a monorepo.\n\n## What’s next \n\nThis is an alpha, so things can still meaningfully change before beta. There will be more alphas before we start stabilizing through the beta and RC stages. Share any and all feedback you have and we’ll do our best to address:\n\n- Use the v6 feedback category in [GitHub Discussions](https://github.com/orgs/twbs/discussions/categories/v6-feedback) if you have a general question or feedback on the v6 release.\n- File an issue in [GitHub Issues](https://github.com/twbs/bootstrap/issues) if you have a specific bug or feature request.\n- Open a [pull request](https://github.com/twbs/bootstrap/pulls) with your changes (it’s always a good idea to review in a discussion or issue first so we don’t waste anyone’s time!)\n\nThanks again to everyone who contributed, thanks for reading, and we hope you love Bootstrap 6!","body_html":"<p>Today we’re releasing the first alpha version of Bootstrap 6, a major overhaul to the project that modernizes and expands one of the most prolific open source design systems of all time. It’s been incredibly fun and rewarding to work on this over the past year, and I’m excited to share it with you.</p>\n<p>Bootstrap 6 has been modernized from the ground up with the Sass module system, support for more native browser APIs and elements, ESM-only JavaScript plugins, and a slew of new CSS standards. We’ve broken this post into separate entries that we’ll publish one-by-one, starting with an overview of v6 and a spotlight on our new Sass &amp; CSS implementation.</p>\n<h2 id=\"hold-up\">Hold up…</h2>\n<p>You’re probably asking yourself, “Wtf, new Bootstrap? What is this, 2015?” And I don’t blame you. It’s been all quiet on the Bootstrap front for a long time while I’ve focused on <a href=\"https://pierre.computer\" rel=\"nofollow ugc noopener\">Pierre</a>, especially with our work on <a href=\"https://diffs.com\" rel=\"nofollow ugc noopener\">Diffs</a>, <a href=\"https://trees.software\" rel=\"nofollow ugc noopener\">Trees</a>, and <a href=\"https://code.storage\" rel=\"nofollow ugc noopener\">Code Storage</a>.</p>\n<p>Throughout all of that, I’ve had several nagging ideas for Bootstrap despite humans not writing any more code thanks to AI. And yes, there are tons of design libraries from amazing developers now. Still, the reason we made Bootstrap in the first place has never been more relevant.</p>\n<p>To help people build more software, faster and easier.</p>\n<p>There’s never been more people building software than today, and I imagine that will continue to be true every day, for the rest of our lives. It’s already been installed over 1.75 billion times since its release in 2011. So, Bootstrap 6 is here to continue being an open source design system for anyone—human or AI, novice or pro.</p>\n<p>We hope you love it, and thanks to everyone who’s supported the project over the years.</p>\n<h2 id=\"community-appreciation\">Community appreciation</h2>\n<p>Before we get to the good parts, I want to thank my co-maintainer, <a href=\"https://github.com/julien-deramond\" rel=\"nofollow ugc noopener\">Julien</a>, for all the amazing work he’s put into Bootstrap over the last couple of years. Without him, I’d be underwater on reviews, dependencies, migrations, and more. He’s an absolute legend and Bootstrap owes him a tremendous amount of gratitude and appreciation.</p>\n<p>Huge thanks to everyone who contributed to the v6 development branch as well:</p>\n<p>And most importantly, thanks to everyone who has backed Bootstrap on <a href=\"https://opencollective.com/bootstrap\" rel=\"nofollow ugc noopener\">Open Collective</a> and every contributor who filed an issue, sent a patch, or argued with me in a pull request.</p>\n<h2 id=\"get-started\">Get started</h2>\n<p>Bootstrap 6 Alpha 1 is on npm and jsDelivr right now.</p>\n<p><code>npm i bootstrap@6.0.0-alpha.1</code>\nOr grab it from the CDN. Be mindful that our JavaScript is ESM-only in v6, so the <code>&lt;script&gt;</code> tag needs <code>type=&quot;module&quot;</code>.</p>\n<pre><code>&lt;link href=&quot;https://cdn.jsdelivr.net/npm/bootstrap@6.0.0-alpha.1/dist/css/bootstrap.min.css&quot; rel=&quot;stylesheet&quot;&gt;\n&lt;script type=&quot;module&quot; src=&quot;https://cdn.jsdelivr.net/npm/bootstrap@6.0.0-alpha.1/dist/js/bootstrap.bundle.min.js&quot;&gt;&lt;/script&gt;</code></pre>\n<p>Then read our <a href=\"https://getbootstrap.com/docs/6.0/getting-started/install\" rel=\"nofollow ugc noopener\">Install</a> or <a href=\"https://getbootstrap.com/docs/6.0/guides/quickstart\" rel=\"nofollow ugc noopener\">Quickstart</a> pages. If you’re coming from v5, read the next section first, then the <a href=\"https://getbootstrap.com/docs/6.0/guides/migration\" rel=\"nofollow ugc noopener\">migration guide</a>.</p>\n<h2 id=\"modern-browser-support\">Modern browser support</h2>\n<p>130+</p>\n<p>130+</p>\n<p>132+</p>\n<p>18+</p>\n<p><strong>Bootstrap 6 requires Chrome and Edge 130, Firefox 132, and Safari 18.</strong> For comparison, v5 supported browsers as far back as Chrome and Firefox 60 and Safari 12. This new support floor is because we’re building with browser features that weren’t available a few years ago: <code>light-dark()</code>, <code>:has()</code>, container queries, <code>oklch()</code>, <code>color-mix()</code>, the native <code>&lt;dialog&gt;</code> element, and more. This means v6 includes no fallbacks, prefixes, or polyfills below that floor.</p>\n<p>This doesn’t get us features like CSS Anchor Positioning, full pretty text support, or contrast color in Safari yet, but we expect to have a v7 sooner than our past major releases.</p>\n<p>Bootstrap 5 remains available and supported if that floor doesn’t work for your project. v5.4.0 will be released as soon as we can before we share an end of life date for Bootstrap 5.</p>\n<h2 id=\"spotlight-css-first-sass-modules\">Spotlight: CSS-first Sass modules</h2>\n<p>Updating Bootstrap to use Sass modules was a massive undertaking that couldn’t happen in v5 without some breaking changes. So we went big in v6.</p>\n<p>Bootstrap 6 uses the <code>@use</code>/<code>@forward</code> module system, and <strong>customization now happens via token maps</strong>. Sass is still used for <em>programmatic</em> customization (generating component variants, utilities, functions, etc), while all <em>visual</em> customization happens with CSS.</p>\n<p><strong>Token maps</strong> are Sass maps that house all our CSS variables for both global settings in <code>:root</code> and on our individual components. This normalizes the path to customizing and focuses Bootstrap on the future of CSS, with a strong preprocessor foundation for managing large codebases. Nearly every Sass variable from v5 is now a CSS variable in a token map. This also means you can customize Bootstrap’s CSS variables at runtime, rather than just before compilation.</p>\n<p>Here’s how <a href=\"https://getbootstrap.com/docs/6.0/getting-started/approach\" rel=\"nofollow ugc noopener\">this approach</a> looks in a component like <a href=\"https://getbootstrap.com/docs/6.0/components/alert\" rel=\"nofollow ugc noopener\">alert</a>:</p>\n<pre><code>$alert-tokens: () !default;\n$alert-tokens: defaults(\n  (\n    --alert-padding-x: var(--spacer),\n    --alert-border-radius: var(--radius-5),\n    --alert-bg: var(--theme-bg-subtle, var(--bg-1)),\n    // …\n  ),\n  $alert-tokens\n);\n@layer components {\n  .alert {\n    @include tokens($alert-tokens);\n    // Rest of alert styles…\n  }\n}</code></pre>\n<p>Practically speaking, this means that virtually all our Sass variables from v5 are now CSS variables in a token map. The handful of remaining global Sass options now live in <code>_config.scss</code>, <code>_colors.scss</code>, and <code>_theme.scss</code>.</p>\n<p>At the <code>:root</code> level where we emit the most tokens programmatically with Sass functions:</p>\n<pre><code>$root-tokens: () !default;\n$root-tokens: defaults(\n  (\n    // Individually set CSS variables…\n  )\n  $root-tokens\n);\n// Most root tokens are loop-generated\n@each $key, $value in $theme-bgs {\n  $root-tokens: map.set($root-tokens, --bg-#{$key}, $value);\n}</code></pre>\n<p>The <code>defaults()</code> function ensures anyone who adds new tokens to a token map, or overrides an existing token value, gets just that in their output—a new CSS variable or a new value for an existing one. It merges rather than replaces, so you never have to redeclare a map to change one value in it, and you can add tokens of your own alongside ours. Speaking of, here’s how to customize those tokens in the new module system with token maps.</p>\n<p>Import Bootstrap via <code>@use ... with</code> and start modifying un-namespaced token maps. You can override root tokens with the <code>$root-tokens</code> map; components get their own unique token map named after the component. Additionally, this is how you customize the few global Sass variables we have left.</p>\n<pre><code>@use &quot;../node_modules/bootstrap/scss/bootstrap&quot; with (\n  // Manage global options\n  $enable-smooth-scroll: true,\n  // Move the entire radius scale by changing its base\n  $radius: .25rem,\n  // Modify global tokens\n  $root-tokens: (\n    --spacer: 1.5rem,\n    --focus-ring-width: 3px,\n  ),\n  // Modify component tokens\n  $alert-tokens: (\n    --alert-padding-x: calc(var(--spacer) * 2),\n    --alert-border-radius: var(--radius-8),\n  ),\n);</code></pre>\n<p>Notice that the tokens have no <code>bs</code> prefix here. In v5 the prefix was a Sass variable, <code>$prefix</code>, threaded through every declaration. In v6 we write custom properties unprefixed in the source and add the namespace with PostCSS at build time, so <code>$prefix</code> is gone and you configure the prefix in your PostCSS config instead.</p>\n<p>The <code>$radius</code> line is worth calling out, too. Our radius scale is derived from a single base value, so changing that one number moves all ten steps together and every component that reads them follows. Same story for <code>$spacer</code> and the spacing scale.</p>\n<p>This gives us the most flexible system possible using both Sass and CSS, with the advantage of customizing either before or after compilation. Update global tokens in the browser, and downstream components update in real time. This is a massive improvement over v5’s hybrid Sass-CSS system, and one I hope you’ll love.</p>\n<h3 id=\"card\">Card</h3>\n<p>Padding follows the spacer, corners follow the radius.</p>\n<pre><code>.token-demo {\n  --bs-radius-5: 0.5rem;\n  --bs-spacer: 1rem;\n  --bs-primary-base: var(--bs-blue-500);\n  --bs-primary-bg: var(--bs-primary-base);\n  --bs-primary-bg-subtle: light-dark(var(--bs-blue-100), var(--bs-blue-900));\n  --bs-primary-fg: light-dark(var(--bs-blue-600), var(--bs-blue-400));\n  --bs-primary-border: light-dark(var(--bs-blue-300), var(--bs-blue-600));\n}</code></pre>\n<h2 id=\"prefixes\">Prefixes</h2>\n<p>A super obvious and breaking change in v6 is moving from the infix to a prefix for our responsive utilities and component variants. Yes, this is a direct copy of how Tailwind does responsive, and yes, it’s better than what felt like a randomly positioned infix in v5.</p>\n<p>Here’s a look at the before and after on some Bootstrap classes:</p>\n<ul><li><code>.d-md-none</code> is now<code>.md:d-none</code></li><li><code>.col-lg-6</code> is now<code>.lg:col-6</code></li><li><code>.opacity-50-hover</code> is now<code>.hover:opacity-50</code></li><li><code>.justify-content-md-end</code> is now<code>.md:justify-content-end</code></li><li><code>.offcanvas-md</code> is now<code>.md:drawer</code> (rename intentional)</li></ul>\n<p>This change applies to all utilities, components, grid layouts, and more. It also include state modifiers like <code>:hover</code>, <code>:focus</code>, etc. Same ergonomics for all of them.</p>\n<p>If you have custom Sass built on our breakpoint helpers, <code>breakpoint-infix()</code> is now <code>breakpoint-prefix()</code> and returns a prefix string, and the <code>loop-breakpoints-up</code> and <code>loop-breakpoints-down</code> mixins expose <code>$prefix</code> instead of <code>$infix</code>.</p>\n<h2 id=\"modernizing\">Modernizing</h2>\n<p>Bootstrap 6 has been overhauled to use as many of the latest browser-native features as possible, alongside updated build tooling. This makes Bootstrap more accessible, easier to customize, and primed for future browser updates. Alongside that, we’ve rewritten our source Sass around the modern module system and newer versions of Dart Sass. <code>@import</code> is deprecated and no longer supported for customization; use <code>@use</code> and <code>@forward</code> instead.</p>\n<p>Sass files have also been reorganized, and several Sass files have been removed given the change to CSS variables for all visual customization, automatic color-mode adaptivity via <code>light-dark()</code>, and more. We’ve also cleaned up the shenanigans around the <code>_maps.scss</code> file, <code>_variables.scss</code> and <code>_variables-dark.scss</code>, both of which are no more.</p>\n<p>On the HTML and CSS side of things, some highlights include:</p>\n<ul><li><strong>CSS layers</strong> for predictable specificity across the entire framework, including<code>utilities</code> as the top-most layer.</li><li><strong>oklch() colors</strong> and<strong>color-mix()</strong> for perceptually uniform, themeable color palettes that automatically adjust to base color changes.</li><li><strong>light-dark()</strong> for native color mode support without duplicating styles and in the same property-value pairing.</li><li><strong>Range media queries</strong> like<code>(width &gt;= 768px)</code> replacing min-width/max-width hacks.</li><li><strong>Container queries</strong> for responsive design that adapts to the parent element instead of just the viewport. Includes mixins, helpers, and per-component changes.</li><li><strong>Native <code>&lt;details&gt;</code> and <code>&lt;summary&gt;</code></strong> powering the accordion—no JavaScript needed</li><li><strong>Native <code>&lt;dialog&gt;</code></strong> element behind the new Dialog component</li><li><code>:where()</code> selector to reduce specificity in complex selectors</li><li><strong><code>content-visibility</code> with <code>allow-discrete</code> transitions</strong> , plus<code>interpolate-size</code> and the<code>::details-content</code> pseudo-element, so the accordion animates open and closed in pure CSS. Height animation on a disclosure widget used to mean measuring elements in JavaScript.</li><li><strong><code>@property</code></strong> to register the custom properties composed by our utility API as non-inheriting, preventing their values from leaking into children.</li></ul>\n<p>On the JS and tooling side:</p>\n<ul><li><strong>ESM-only plugins.</strong> There’s no UMD bundle and no<code>window.bootstrap</code> global anymore. What this means for you depends entirely on how you use our JavaScript, so here are the three cases.<ul><li>If you only use data attributes like <code>data-bs-toggle</code> , add<code>type=&quot;module&quot;</code> to your script tag and you’re done—everything else keeps working.</li><li>If you call our APIs from a CDN build, switch to an explicit import: <code>import { Tooltip } from &#39;./bootstrap.bundle.min.js&#39;</code> .</li><li>For modern ESM-based bundlers like Vite, Webpack, or Parcel, existing imports continue to work—<code>import { Tooltip } from &#39;bootstrap&#39;</code> now tree shakes correctly while<code>sideEffects</code> metadata preserves Data API listeners. Projects using CommonJS<code>require()</code> must migrate to ESM imports.</li></ul></li><li>If you only use data attributes like </li><li><strong>TypeScript.</strong> Our source is<code>.ts</code> now, and we ship our own type declarations, so you can delete<code>@types/bootstrap</code> from your dependencies. Deep imports like<code>bootstrap/js/src/alert.js</code> still resolve.</li><li><strong>Rolldown</strong> replaces both Rollup and Babel in our tooling. It strips TypeScript types and lowers syntax itself, removing an entire layer of build tooling from the repo. This only affects you if you build Bootstrap from source.</li><li><strong>Vitest</strong> running in real Chromium through Playwright, which replaced Karma.</li><li><strong>Astro 7</strong> for the docs, which has a new search experience with Pagefind, new pages, and updated navigation and layout.</li></ul>\n<h2 id=\"built-for-humans-and-agents\">Built for humans and agents</h2>\n<p>Bootstrap 6 includes LLM-friendly documentation and skill files for all your agentic coding needs.</p>\n<p>To be more efficient with agents, we have text-only versions of our documentation. <a href=\"https://getbootstrap.com/llms.txt\" rel=\"nofollow ugc noopener\"><code>llms.txt</code></a> is a curated index of every documentation page with descriptions while <a href=\"https://getbootstrap.com/llms-full.txt\" rel=\"nofollow ugc noopener\"><code>llms-full.txt</code></a> is all of our documentation concatenated into one file.</p>\n<p>Skills files have been added to the repository <a href=\"https://github.com/twbs/bootstrap/tree/main/skills\" rel=\"nofollow ugc noopener\">in a new <code>skills/</code> directory</a>. Skills are playbooks for specific tasks, in this case for working with Bootstrap 6. To start, we’ve drafted skill files for migrating to v6, using Bootstrap with different build tools, authoring components, and more. Point your agent at the relevant file and it’ll follow the correct guidance from us maintainers instead of anything potentially outdated or incorrect.</p>\n<h2 id=\"two-more-things\">Two more things…</h2>\n<p>We’ve also updated the blog and Icons site with refreshed designs.</p>\n<ul><li></li></ul>\n<p>The blog has a new homepage, search via Pagefind, new category pages, and new post layouts like the one you’re reading now.</p>\n<ul><li></li></ul>\n<p>The Icons site has a new homepage, too—immediately oriented around the grid of icons. We’ve added search with PageFind here as well (including <code>?tag=</code> queries), new sidebar category navigation and category pages, plus a refreshed icon show page.</p>\n<p>In addition, we’ve built out a new, private repository and package for sharing Bootstrap docs components across the main site, Icons, and Blog. It’s called <code>@twbs/bui</code> and gives us better control as maintainers over all the separate sites without having to fully commit to a monorepo.</p>\n<h2 id=\"what-s-next\">What’s next</h2>\n<p>This is an alpha, so things can still meaningfully change before beta. There will be more alphas before we start stabilizing through the beta and RC stages. Share any and all feedback you have and we’ll do our best to address:</p>\n<ul><li>Use the v6 feedback category in <a href=\"https://github.com/orgs/twbs/discussions/categories/v6-feedback\" rel=\"nofollow ugc noopener\">GitHub Discussions</a> if you have a general question or feedback on the v6 release.</li><li>File an issue in <a href=\"https://github.com/twbs/bootstrap/issues\" rel=\"nofollow ugc noopener\">GitHub Issues</a> if you have a specific bug or feature request.</li><li>Open a <a href=\"https://github.com/twbs/bootstrap/pulls\" rel=\"nofollow ugc noopener\">pull request</a> with your changes (it’s always a good idea to review in a discussion or issue first so we don’t waste anyone’s time!)</li></ul>\n<p>Thanks again to everyone who contributed, thanks for reading, and we hope you love Bootstrap 6!</p>","headings":[{"level":2,"text":"Hold up…","id":"hold-up"},{"level":2,"text":"Community appreciation","id":"community-appreciation"},{"level":2,"text":"Get started","id":"get-started"},{"level":2,"text":"Modern browser support","id":"modern-browser-support"},{"level":2,"text":"Spotlight: CSS-first Sass modules","id":"spotlight-css-first-sass-modules"},{"level":3,"text":"Card","id":"card"},{"level":2,"text":"Prefixes","id":"prefixes"},{"level":2,"text":"Modernizing","id":"modernizing"},{"level":2,"text":"Built for humans and agents","id":"built-for-humans-and-agents"},{"level":2,"text":"Two more things…","id":"two-more-things"},{"level":2,"text":"What’s next","id":"what-s-next"}]}}