The most popular HTML, CSS, and JavaScript framework for developing responsive, mobile first projects on the web.


47 Versions


Highlights 🎨 CSS
  • #34679: Fix font size variable name
  • #34699: Add check to rgba-css-var function for body or bg
  • #34773: Include root.scss in all dist builds
  • #34779: Fix $dropdown-link-hover-color variable color value in _variable.scss file
☕️ JavaScript
  • #34621: carousel: move common checks to a function
  • #34701: Fix modal when is triggered by bs-toggle, to hide other open instances
  • #34835: Collapse on toggle, should not hide descendant tabpanels
  • #34842: Fix tooltip data-bs-original-title issue
📖 Docs
  • #32781: docs: shortcodes tweaks and consistency changes
  • #34686: docs: Fix placeholders typo
  • #34752: Fix typo in placeholder docs
  • #34769: Enhance Alerts > Live Example section
  • #34781: docs: fix typos in approach and placeholders
  • #34787: Progress page: remove toggle animation button
  • #34840: clarify importing all vs specific plugins
  • #34842: Fix tooltip data-bs-original-title issue
  • #34877: docs: add $enable-smooth-scroll to Sass options page
  • #34886: Disabled link cleanup
  • #34892: Fix a11y issues in .hstack example and placeholder 'How it works' example
  • #34910: Docs: Add Callout to Stacks Helper page about limited flexbox gap support
  • #34913: docs: make use of the .Site.Params.docs_version variable
  • #34914: Typo/US locale fixes
🛠 Examples
  • #34766: dashboard-rtl: use the same scripts as the dashboard example
🌎 Accessibility
  • #34886: Disabled link cleanup
🏭 Tests
  • #34077: Add GitHub SHA in BrowserStack build ID.
  • #34912: BrowserStack: add Firefox 60 and Chrome 60
📦 Dependencies


  • Added experimental, opt-in CSS Grid support
  • Added support for responsive offcanvas components in navbars
  • Added new placeholders component for skeleton loading screens
  • Added support for horizontal collapsing in the collapse component
  • Added new stack and vertical rule helpers
  • Added tons of new CSS variables for body styles, colors, RGB colors, and more
  • Updated .bg-* and .text-* utilities to use CSS variables and new RGB CSS variables for real-time customization
  • Added four new component examples for dropdowns, footers, list groups, and modals
  • Updated modal and offcanvas backdrops to make them unique to each component
  • Reverted ability for .col-* classes to override .row-cols-* classes for now until we can fix some critical bugs
🚀 Features
  • #31813: Add optional CSS grid
  • #31859: Add a "skeletons" component
  • #32319: Add maps for all colors, document how to extend color utilities
  • #33403: modal: change data-dismiss so that it can be outside of a modal using bs-target
  • #33781: Add utility classes for opacity
  • #33986: New helpers: .hstack, .vstack, and .vr
  • #34253: Add horizontal collapse support
  • #34273: Offcanvas navbar
  • #34333: Accept argument of different types in the getInstance method
  • #31813: Add optional CSS grid
  • #32319: Add maps for all colors, document how to extend color utilities
  • #33781: Add utility classes for opacity
  • #33986: New helpers: .hstack, .vstack, and .vr
  • #34100: Updated utility API (css-vars utils and new bg/color utils), plus new root CSS variables
  • #34253: Add horizontal collapse support
  • #34273: Offcanvas navbar
  • #34432: More concise improvements for add() and subtract()
  • #34440: Add null $card-box-shadow variable
  • #34445: fix(forms): prevent color control from shrinking
  • #34475: Make text decoration consistent with other anchors
  • #34481: Make the $accordion-icon-color default value consistent with the $accordion-button-color
  • #34572: Clean up a couple CSS Grid issues
  • #34612: Revert "Allow individual grid classes to override .row-cols"
  • #34651: Update $input-bg to use $body-bg
☕️ JavaScript
  • #33402: Changes to Alert component to match the others
  • #33403: modal: change data-dismiss so that it can be outside of a modal using bs-target
  • #33603: Fix Manipulator.offset()
  • #33610: Toasts: Change showing timings and classes to keep toast display:none by default
  • #33865: Add shift-tab keyboard support for dialogs (modal & Offcanvas components)
  • #33866: Add dynamic, live alerts example to docs
  • #34170: Use a streamlined way to trigger component dismiss
  • #34205: Cleanup tooltip & popover components
  • #34207: Make proper use of the SelectorEngine in ScrollSpy
  • #34215: Use the switch statement instead of if
  • #34220: Do a major cleanup in Collapse.js
  • #34333: Accept argument of different types in the getInstance method
  • #34441: util.js: remove Selector.findOne() dependency
  • #34458: Dropdown cleanups
  • #34543: Fix Util.reflow function and add documentation
  • #34619: tooltip: move repeated strings to constants
  • #34620: Enable a few eslint-config-xo rules
  • #34628: Regression on tooltip template creation process.
📖 Docs
  • #32319: Add maps for all colors, document how to extend color utilities
  • #33866: Add dynamic, live alerts example to docs
  • #34100: Updated utility API (css-vars utils and new bg/color utils), plus new root CSS variables
  • #34406: Fix site params variable on themes section
  • #34472: Added new Offcanvas file to import example
  • #34517: Update
  • #34526: Add: GitHub Octicons to the list
  • #34557: docs: minor image compression improvements
  • #34573: Update the custom Sass import docs
  • #34574: Document change to hr in v5
  • #34577: Make note of _root.scss being required
  • #34578: Rename Build Tools page to Contribute
  • #34605: Collapse page: add a link to the accordion page
  • #34637: Improved docs describing media-breakpoint-down breakpoints
🛠 Examples
  • #33882: Add four new snippet examples
  • #34273: Offcanvas navbar
  • #34336: Remove unneeded .text-white-50 CSS rule from Offcanvas Example
🌎 Accessibility
  • #33865: Add shift-tab keyboard support for dialogs (modal & Offcanvas components)
🔧 Utility API
  • #34100: Updated utility API (css-vars utils and new bg/color utils), plus new root CSS variables
🧰 Misc
  • #32907: npm scripts: add aggregate-output
  • #34389: fix broken link to
  • #34453: CI: make use of the actions/setup-node's cache option
📦 Dependencies


🚀 Features
  • #34052: Automatically select an item in the dropdown when using arrow keys
  • #33621: Allow individual grid classes to override .row-cols
  • #34008: Fix x-paddings for select (with floating label, and in Firefox)
  • #34026: Set the correct color for popover header bottom border
  • #34034: Add missing transition to .form-select
  • #34044: Fix wrong comment text for tooltip
  • #34047: Handle complex expressions in add() & subtract()
  • #34048: Decouple --bs-table-bg and --bs-table-accent-bg
  • #34062: Document how to make utilities responsive using the API
  • #34124: fix(dropdowns): RTL for .dropdown-menu-*
  • #34161: fix(forms): unitless line-height for floating labels
  • #34223: docs(style): fix display of nested <ul><li>
  • #34245: Replace / division with multiplication and custom divide() function
  • #34255: Don't set auto margin on offcanvas close
  • #34281: Fix lingering Sass math
  • #34283: Update the divide() function and RFS
  • #34332: Fix another Sass division
☕️ JavaScript
  • #33276: Add getOrCreateInstance method in base-component
  • #33371: Popover & Tooltip: Allow dispose/hide methods usage through jQueryIntreface
  • #33608: Utils: add getNextActiveElement helper function
  • #33845: Fix handling of transitionend events dispatched by nested elements
  • #33928: Reset inside a Dialog does not work if data-dismiss="modal" is set
  • #33947: Refactor scrollbar.js to be used as a Class
  • #33948: Add tests for scrollbar.js & better handling if a style property doesn't exist
  • #33960: fix isVisible false positives from deep nesting or alternate means
  • #33982: Don't add empty content holder when there is no content available
  • #34014: Fix backdrop "Cannot read property 'removeChild' of null" when removed from body
  • #34052: Automatically select an item in the dropdown when using arrow keys
  • #34070: Fix test of #34014
  • #34071: Change element.parentNode.removeChild(element) to element.remove()
  • #34085: Fix prevented show event disables modals with fade class from being displayed again
  • #34092: Backdrop: Fix stale body by removing unnecessary default
  • #34158: Register only one DOMContentLoaded event listener in onDOMContentLoaded
  • #34266: Fix carousel buttons
  • #34307: fix(carousel): arrow keys break animation if carousel sliding
📖 Docs
  • #33724: Nav-tabs documentation example: Adjust example to querySelectorAll
  • #33749: add Bootstrap 5 Simplified Chinese translation
  • #34009: Drop BlinkMacSystemFont in docs
  • #34018: Adjusted z-index to cover "copy" buttons
  • #34040: Placeholder changes to input value in readonly input.
  • #34044: Fix wrong comment text for tooltip
  • #34050: Replace Freenode with Libera IRC server
  • #34062: Document how to make utilities responsive using the API
  • #34074: Update Hugo config and sitemap.xml
  • #34090: Change HTTP to HTTPS
  • #34143: Add positioned badges example to docs
  • #34160: img in horizontal card
  • #34175: Fix typo in ("theses"→ "these")
  • #34179: Missed explanations for variables override
  • #34180: docs: update to reflect the correct version
  • #34183: docs: update to fix a typo
  • #34199: docs: update to fix typo
  • #34223: docs(style): fix display of nested <ul><li>
  • #34239: fix(docs): update docs to match the newest modal-open removal
  • #34251: Document the change to breakpoint mixins
  • #34256: Add important to utilities, mention it's usage and global variable
  • #34263: Fix error in JavaScript doc example
  • #34280: Remove a leftover sass:math module call
🛠 Examples
  • #34007: Dashboard example improvements
  • #34011: Cheatsheet: fix JS errors in setActiveItem()
  • #34214: fix accessibility issue on sidebars example
🌎 Accessibility
  • #34052: Automatically select an item in the dropdown when using arrow keys
  • #34214: fix accessibility issue on sidebars example
🔧 Utility API
  • #34062: Document how to make utilities responsive using the API
  • #34256: Add important to utilities, mention it's usage and global variable
🏭 Tests
  • #33948: Add tests for scrollbar.js & better handling if a style property doesn't exist
🧰 Misc
  • #34075: Improve vnu-jar.js
  • #34250: Replace Freenode with Libera.Chat in the remaining files
  • #34279: build/vnu-jar.js: clean up ignores
📦 Dependencies


  • #33551: Modals no longer use .modal-open to affect the <body> scroll
  • #33644: Validated inputs in .input-group shouldn't be behind sibling element
  • #33825: Prevent accent-bg from leaking in nested table
  • #33870: Don't redefine $list-group-color in loop
  • #33961: Revert :read-only selector back to [readonly]
☕️ JavaScript
  • #33221: Prevent toast autohiding if focusing or hovering
  • #33288: Remove potential false positive assertions
  • #33327: Move get element functionality to a helper
  • #33381: Popover/Tooltip: streamline config property to start with underscore
  • #33609: Merge js-components transitionend listener callbacks into one method
  • #33635: Extract static DATA_KEY & EVENT_KEY to base-component
  • #33740: Refactor: move disposing properties into the base class
  • #33853: Fix backdrop rootElement not initialized in Modal
  • #33920: Fix: Click on input outside of dropdown-menu prevents dropdown from closing
  • #33938: Fix dropdown test warning "without expectations"
📖 Docs
  • #33709: Add Arabic translation
  • #33837: update About text now that Bootstrap 5 is live
  • #33841: Fix typo in scrollspy docs
  • #33842: Fix browser support versions in migration doc
  • #33843: Fix typo in
  • #33855: Remove extra t in Close button heading in Migration guide
  • #33868: Fix value
  • #33879: Fix "no long require" to "no longer require" typo
  • #33893: Add accessible names to SVG icons in alerts
  • #33896: Fix accordion link
  • #33901: docs: make tooltip anchor properly wrap the svg
  • #33904: Add Fathom Analytics to v5 docs
  • #33915: docs: fix rtlcss stringmap configuration
  • #33916: Remove unneeded "Edge Legacy" mention in Range docs
  • #33924: Fix "directoinal" typo in v5 migration docs
🛠 Examples
  • #33850: Fix unnecessary classes
  • #33859: Update Sidebars example to fix dividers and rendering on Chrome
  • #33926: Fix offcanvas example, using a custom trigger selector
🌎 Accessibility
  • #33893: Add accessible names to SVG icons in alerts
🏭 Tests
  • #33288: Remove potential false positive assertions
  • #33635: Extract static DATA_KEY & EVENT_KEY to base-component
  • #33927: Fix offcanvas test to expect the initial body overflow value
  • #33938: Fix dropdown test warning "without expectations"
🧰 Misc
  • #33923: CI: remove Node.js 10
📦 Dependencies



#32155: Updated make-col() mixin to generate equal columns when no size is specified #32763: Added new color-scheme() mixin #33389: Dropdown menus now have option become clickable #33453: Added new docs footer #33548: Offcanvas header components are now vertically aligned #33549: Added offcanvas-top modifier #33634: Added support for .dropdown-items wrapped in <li>s #33626: Fix v5 regressions in tab dropdown functionality

🚀 Features
  • #32763: Add color-scheme mixin
  • #33389: Dropdown — Add option to make the dropdown menu clickable
  • #33549: Add offcanvas-top modifier
  • #32155: Add equal column mixin
  • #32763: Add color-scheme mixin
  • #33292: Make accordion icon rotation more natural
  • #33411: Fix validation feedback icon in select multiple
  • #33478: Make .nav-link color consistent when using buttons
  • #33482: Dropdown — Apply positioning only when Popper is not used
  • #33548: Vertically align offcanvas header components
  • #33549: Add offcanvas-top modifier
  • #33550: Spinner alignment changes
  • #33598: Hide validation icons from multiple selects
  • #33600: Have $form-check-input-border's default derive from $black
  • #33607: Reduce color-scheme complexity
  • #33642: use :read-only css selector instead [readonly] for consistency
  • #33658: fix: use list-group variable instead of alert
  • #33736: accordion: fix border-top on Firefox
☕️ JavaScript
  • #32439: Decouple BackDrop from modal
  • #33245: Decouple Modal's scrollbar functionality
  • #33249: Simplify Modal Config
  • #33250: Simplify ScrollSpy config
  • #33310: fix: make EventHandler better handle mouseenter/mouseleave events
  • #33389: Dropdown — Add option to make the dropdown menu clickable
  • #33429: Remove element event listeners through base component
  • #33451: Add missing things in hide method of dropdown
  • #33456: Use our isDisabled util on dropdown
  • #33466: Refactor dropdown's hide functionality
  • #33479: Fix dropdown escape propagation
  • #33496: Use cached noop function
  • #33497: Use template literals instead of concatenation
  • #33499: Fix wrong carousel transformation, direction to order
  • #33545: Use the backdrop util in offcanvas, enforcing consistency
  • #33586: Tab.js: Fixes on click handling
  • #33589: refactor: make static selectMenuItem method private
  • #33612: tests: fix random BrowserStack failures in scrollbar
  • #33626: Fix v5 regressions in tab dropdown functionality
  • #33634: Dropdown: support .dropdown-item wrapped in <li> tags
  • #33638: Fix toggle between modals example
  • #33643: fix: clicking an item in navbar dropdown should not collapse the dropdown in firefox
  • #33666: Modal.js: fix test for scrollbar
  • #33677: Offcanvas.js: If scroll is allowed, should allow focus on other elements
  • #33684: Don't change the value for altBoundary option
  • #33706: Scrollbar: respect the initial body overflow value
📖 Docs
  • #33446: Make offcanvas example fully static
  • #33453: Add new docs footer
  • #33521: The spacing margin side identifiers 's' and 'e' may be intuitive for …
  • #33522: Clarify docs accordion example
  • #33543: Update
  • #33553: Add example: Panels stay open
  • #33567: Fixed wrong method name _getInstance
  • #33571: footer: fix rel=noopener attribute
  • #33583: docs: update clipboard.js to v2.0.8
  • #33597: Docs: Fix wrong dark attribute in Table - Vertical Alignment
  • #33632: Correct the heading for the States section
  • #33638: Fix toggle between modals example
  • #33664: Docs: fix W3C validation errors in list-group example
  • #33668: Update anchor.js to v4.3.1.
  • #33669: Change from preventOverflow to detectOverflow in boundary option
  • #33675: Fix typo
  • #33676: Fix Grid System docs
  • #33685: docs: fix the default value of Popper's boundary option
  • #33687: Fixes #33686 typo in RTL docs
  • #33690: Add Bootstrap Icons to alerts docs
  • #33726: Replace modal and scrollspy placeholder content
  • #33733: Tooltip/Popover — Minor doc updates
  • #33735: Clarify boundary option description
  • #33772: Improve overall new examples' accessibility
  • #33782: Add new team members to the Teams page
  • #33786: Docs: adding intro about web accessibility
  • #33797: Update links to CCA, MQ5 prefers-reduced-motion, evergreen WCAG urls
  • #33810: Tweak toast docs
  • #33829: Update migration guide for some v5 changes
  • #33832: Fix doc typo and Bootstrap Icons link
  • #33833: refactor(docs): Added form file input variables
  • #33834: Rewrite migration guide
  • #33097: Update RTL examples
  • #33759: fix: change margin breakpoints for bootstrap logo on double header
  • #33681: Fixes signup form in Heroes example
  • #33569: Improve responsiveness of Features examples
🌎 Accessibility
  • #33772: Improve overall new examples' accessibility
  • #33810: Tweak toast docs
🏭 Tests
  • #33578: Remove unnecessary data-bs-backdrop="static" from modal tests
  • #33612: tests: fix random BrowserStack failures in scrollbar
  • #33666: Modal.js: fix test for scrollbar
  • #33734: Add missing test for clicking select option in a dropdown
🧰 Misc
  • #33720: JS tests: add Node.js 16
📦 Dependencies


  • Added new offcanvas component for left, right, and bottom-aligned hidden content
  • Added four new snippet-based examples: headers, heroes, features, and sidebars
  • Updated the starter template example and a few other examples
  • Added new Sass docs section to nearly every page to show variables, mixins, loops, and keyframes from our source code
  • Added new .list-group-numbered variation to list groups that uses pseudo-elements for numbering list group items.
  • Removed explicit focus state suppression in Reboot
  • Improved carousel swipe behaviors for RTL
  • Updated accordions to improve transitions and borders when animating
  • Updated Sass customization docs to show how to properly override default variables
  • Fixed tooltips not appearing after rapid focus in and out
  • Fixed dropdown events not bubbling and forms inside dropdowns not propagating
  • Removed flip option from dropdowns
  • Disabled select now render consistently in Chrome
  • Button elements now grow in .nav-fill and .nav-justified
  • JavaScript plugin constructors now accept CSS selectors
  • De-duped the .border-0 utility
  • Fixed event handler removal in dropdown/carousel dispose
  • Added new Parcel guide to the docs
  • Added input focus blur Sass variable
  • Updated .browserslistrc to drop Android and add Safari/iOS 12 as the new minimum version (completing our two latest major releases guideline for supported browsers).
🚀 Features
  • #29017: Offcanvas as component
  • #32245: Allow constructors to accept a CSS selector
  • #33068: Add ol.list-group with pseudo-element numbers
  • #32747: Add Sass docs (variables, mixins, and loops) to most pages
  • #32925: Clear duplicated class border-0
  • #33029: Remove explicit suppression of focus outline
  • #33031: Add input focus blur variable
  • #33068: Add ol.list-group with pseudo-element numbers
  • #33127: Reset select:disabled opacity for Chrome
  • #33149: Revamp accordion borders to fix pixel jumping
  • #33154: Fix sibling card links in RTL
  • #33210: Properly set .list-group-item color
  • #33211: Validated controls border in input-group
  • #33213: Buttons should grow in nav-fill & nav-justified
  • #33325: Remove duplicate text-decoration style for abbr[title]
  • #33426: Fix flush accordion styles
☕️ JavaScript
  • #30621: modal: don't add margin & padding when sticky is not full width
  • #32180: refactor: use a Map instead of an Object in dom/data
  • #32245: Allow constructors to accept a CSS selector
  • #32446: util: change isRTL to a function
  • #32913: Fix carousel RTL and refactor code, fix rtl swipe issues
  • #33000: Fix event handler removal in dropdown/carousel dispose
  • #33056: modal: move common code to a new isAnimated method
  • #33120: Remove the default positioning from .dropup
  • #33136: Adjust SAFE_URL_PATTERN regex for use with test method of regexes.
  • #33198: Dropdown — Drop flip option
  • #33248: Accept data-bs-body option in the configuration object as well
  • #33257: Dynamic tab should not show when triggered on disabled element
  • #33261: Change the name of the Offcanvas constructor
  • #33289: fix tooltips disappearing after trying to interact during their fade out animation
  • #33382: Allow offcanvas to be initialized in open state
  • #33385: Use more safe check for 'isDisabled' helper
  • #33442: Allow data-toggle="dropdown" and form click events to bubble
📖 Docs
  • #30909: Add Parcel Bundler doc
  • #32747: Add Sass docs (variables, mixins, and loops) to most pages
  • #33006: docs: add bootstrap5 zh-tw in translations
  • #33049: Docs improvements after beta2
  • #33081: Fix typo in nav-tabs docs
  • #33123: Clarify docs around .navbar-brand
  • #33207: Add an example of v4's media component in the flex utils docs
  • #33246: Update the "Nonblocking files" section in the docs
  • #33267: Grammatically update the doc
  • #33300: Update modal's show method to accept relatedTarget as an argument
  • #33301: Add example: toggle modal dialogs
  • #33322: Fix Flex utilities documentation to add vertical space in example
  • #33332: Mention .no-gutters removal in migration guide
  • #33333: Fixes some copy around inline forms
  • #33380: Utilities to Utilities API (Borders doc page)
  • #33386: Update Customize > Sass docs to properly place default variable overrides
  • #33430: Add link to new Parcel guide in starter template
  • #33443: offcanvas-navbar: add missing redirect
🏭 Tests
  • #32662: Unit tests for Popper V2
  • #33045: Simplify karma.conf.js
  • #33060: Add the missing expectations for touch events
  • #33090: Add tests for DATA_KEY
  • #33167: visual tests: add missing base-component dist file
  • #33398: BrowserStack: test on iPhone 12
🧰 Misc
  • #33067: CI: skip release drafter if we are not on our repo
  • #33100: linkinator: replace --silent with --verbosity
  • #33129: Rename _gh_pages to _site.
  • #33130: CodeQL: skip dependabot PRs too
  • #33148: Improve change-version script
  • #33192: Bundlewatch: stop ignoring dependabot branches
  • #33326: Delete the unused build/
  • #33329: @rollup/plugin-replace: specify preventAssignment: true
  • #33397: .browserslistrc: remove the Edge workaround.
  • #33399: .browserslistrc: remove Android and make Safari/iOS 12 the minimum
  • #33401: use for the tests badge too
📦 Dependencies

Updated numerous devDependencies


  • Dropdowns:
    • Updated dropdown plugin to add data-bs-popper="static" via JS to the .dropdown-menu when the trigger has add data-bs-display="static" and data-bs-popper="none" when in navbars.
    • Modified several selectors to separate our positioning styles from the Popper.js styles.
  • Navbars:
    • Added a new .navbar-nav-scroll class to enable vertical scrolling when a collapsed navbar is opened. It's customizable via Sass and a CSS variable. Read more in the docs.
    • We've re-added flex-grow to the .navbar-collapse to restore the flexbox behaviors from v4 and prevent some content from being inadvertently squished.
  • Forms:
    • Removed vertical-align from .form-select
    • Form validation mixin updated with additional parameters
    • Fixed validation icon placement in .form-select
    • Checkboxes and radio buttons are aligned better in input groups
  • Buttons:
    • Added variables for tinting and shading button state colors
    • Suppressed the default focus outline for buttons in Chromium
  • Toasts:
    • Added word-break to .toast-body
    • Added a live example to the docs to trigger a real toast
  • Carousels:
    • Updated docs examples to use <button>s wherever possible instead of <a> elements.
    • CSS selectors changed for using <button>s as indicators (from .carousel-indicators li to .carousel-indicators [data-bs-target]).
  • Bundles:
    • Added our helpers to the utilities CSS bundle
  • JavaScript:
    • Dropdown now emits events on the .dropdown-toggle instead of the .dropdown.
    • Restored the offset option for dropdowns.
    • Fixed modal toggling when clicking on data-bs-toggle="modal".
    • We now build our base component as a separate .js file.
    • We now prevent getSelector from returning URLs as selector which caused errors in dropdown and scrollspy plugins.
    • Refactored components to use a utility function to define jQuery plugins
🚀 Features
  • #32037: Add .navbar-nav-scroll for vertical scrolling of navbar content
  • #32317: Add variables for modifying button state colours.
  • #32376: Support Popper virtual elements
⚡ Performance Improvements
  • #32348: Use box shadows instead of linear gradients to colorize tables
  • #31757: Extended Form validation states capabilities
  • #32037: Add .navbar-nav-scroll for vertical scrolling of navbar content
  • #32317: Add variables for modifying button state colours.
  • #32318: Remove vertical-align from .form-select
  • #32324: Add helpers to utilities bundle
  • #32348: Use box shadows instead of linear gradients to colorize tables
  • #32397: Utility API, RFS option: Only generate responsive classes when needed
  • #32415: Reset Popper position in RTL
  • #32419: Tweak .form-select padding
  • #32423: Add two new variables for pagination border-radius values
  • #32436: RTL improvements
  • #32440: Expand visually-hidden-focusable so it can be used on a container, …
  • #32492: Fix: variables collide with globals
  • #32501: .ratio missing variable prefix
  • #32524: Remove the initial margin from dropdown/popover in favor of Popper
  • #32575: docs(sidebar): invalid CSS value
  • #32627: Carousel: use buttons, not links, for prev/next controls
  • #32630: Dynamic tabs: use buttons rather than links
  • #32631: Remove old/unnecessary reboot bug fix
  • #32661: Make carousel indicators actual buttons
  • #32670: Add word-break to .toast-body
  • #32689: Suppress focus outline for buttons when it shouldn't be visible in Chromium
  • #32751: Consistently use outline:0 rather than outline:none
  • #32754: Darken dropdown item hover style
  • #32761: Mention stretched-link constraints with table elements
  • #32785: Lighten disabled dropdown text to $gray-500
  • #32787: Remove popover-arrow margin to fix alignment of the arrow
  • #32793: Change .form-check background to $input-bg and change transitions
  • #32819: Color utils docs
  • #32899: Re-add flex-grow to .navbar-collapse
  • #32912: Update checks and radios in input groups
  • #32930: Fix hardcoded custom prop. in .navbar-nav-scroll
  • #32951: fix(accordion): ensure .accordion-button stays left-aligned
  • #32986: Dropdown menu alignment fixes
  • #33003: Dropdown - Change the selector to check the use of Popper
  • #33022: Ensure .navbar-collapse behaves as intended
☕️ JavaScript
  • #32285: Refactor components to use a utility function to define jQuery plugins
  • #32303: Use the ternary operator in a few more places
  • #32309: tests: replace deprecated jQuery method
  • #32313: build-plugins: build Base component too
  • #32339: Remove SelectorEngine.matches().
  • #32376: Support Popper virtual elements
  • #32391: SelectorEngine: drop variable used once
  • #32392: alert: rename variables for consistency
  • #32393: carousel: switch to string constants
  • #32394: Remove TRANSITION_END from utils
  • #32395: carousel: switch to if/else
  • #32405: Add Popper fallback behaviour
  • #32420: Tooltip - check if tip and its parent node exist in dispose method
  • #32436: RTL improvements
  • #32437: Tooltip/popover - change the default value for fallbackPlacements
  • #32438: collapse: prevent url change if A nested tag is clicked
  • #32443: Restore offset option for dropdown component
  • #32465: Tooltip - Add missing callback in async spec
  • #32511: modal: move common code to reusable functions
  • #32523: Tooltip refactoring
  • #32524: Remove the initial margin from dropdown/popover in favor of Popper
  • #32585: Throw a TypeError instead of the generic Error
  • #32586: Prevent getSelector from returning URLs as selector
  • #32603: Scrollspy - Remove unnecessary event argument
  • #32625: Dropdown - Emit events on the .dropdown-toggle button
  • #32661: Make carousel indicators actual buttons
  • #32691: Fix toggling modal when clicking on data-bs-toggle="modal"
  • #32750: Fix dropdown keys to open menu
  • #32843: Remove custom fallbackPlacements from the dropdown
  • #32845: Fix Popper preventOverflow boundary config
  • #32882: Add function type for popperConfig option
  • #32986: Dropdown menu alignment fixes
📖 Docs
  • #32246: Replace Lorem Ipsum placeholder text with more representative (or at least english language) text
  • #32259: docs: SVG consistency changes
  • #32272: Add a callout for the sanitizer in popovers and tooltips
  • #32284: docs: Add Korean translation
  • #32287: Typo: show on xxl, if only xl should be hidden.
  • #32316: fix $carousel-transition-duration reference
  • #32332: Move migration sidebar entry to sidebar.yml
  • #32390: docs: Fix Popper-related docs
  • #32398: Fix missed occurrencies of "Popper.js"
  • #32399: Remove duplicated 'follow Bootstrap on Twitter' link in Getting Started
  • #32401: cheatsheet: Drop redundant (current) text
  • #32437: Tooltip/popover - change the default value for fallbackPlacements
  • #32449: examples: Update font utility classes to new v5 versions
  • #32455: docs: Add system-ui to the native font stack documentation
  • #32461: Docs: style clipboard button on :focus, not just :hover
  • #32463: Straggler lorem ipsum text
  • #32464: Add missing has-validation in checkout examples
  • #32478: Remove redundant pointer-events: none override for tooltip and popover disabled buttons
  • #32479: Clean up lorem ipsum text in popover examples
  • #32483: docs: Remove unneeded .form-group class
  • #32489: Fix popover docs example
  • #32490: Add keyboard-focusable elements for popover on disabled button
  • #32512: Docs v5: Fix Sass rounding precision and state Sass implementation
  • #32529: Tooltips: add missing space
  • #32534: Documentation: added class selector "." to "dropend"
  • #32543: API docs: add missing comma
  • #32575: docs(sidebar): invalid CSS value
  • #32589: Fix navbar docs - active nav-link
  • #32620: docs: work around Toast CSS conflict with utils
  • #32627: Carousel: use buttons, not links, for prev/next controls
  • #32630: Dynamic tabs: use buttons rather than links
  • #32632: Docs: Tweak the wording for collapse to indicate button is preferred/more semantic
  • #32634: Docs: Remove incorrect mention of dropdowns for dynamic tab behavior
  • #32638: Add an actual data-bs-touch="false" example in the carousel docs
  • #32661: Make carousel indicators actual buttons
  • #32684: Add functions and variables to the utilities API docs imports
  • #32685: Clarify the $enable-shadows option in our docs
  • #32688: Tweak wording for no-touch carousel
  • #32740: Fix typo
  • #32744: Document size and multiple aren't supported on floating label selects
  • #32745: Add a link to v4.x from the v5 homepage
  • #32758: Migration: mention the removal of .rounded-sm/lg utilities
  • #32759: Add mention of CSPs and SVGs
  • #32760: Add a live toast example to the docs
  • #32761: Mention stretched-link constraints with table elements
  • #32771: Improve docs regarding RTL migration
  • #32778: Document some basic code conventions for us
  • #32782: [docs] Update
  • #32788: Remove role="button" from CTA links in carousel examples
  • #32795: Clarifies Sass variable defaults, adds bootstrap-npm-starter callout
  • #32819: Color utils docs
  • #32842: Docs: add v4.6.0
  • #32846: docs: Fix navbar-nav-scroll description
  • #32911: migration: mention .form-text changes
  • #32912: Update checks and radios in input groups
  • #32940: Fix default value for $enable-deprecation-messages
  • #32979: Fix boundary config description for dropdown and popover
  • #32995: Add a note to change the case type of option name
  • #33017: Docs on enforcing HTTPS and avoiding mixed content
  • #33027: Revamp sticky header offset to improve a11y
🌎 Accessibility
  • #32401: cheatsheet: Drop redundant (current) text
  • #32661: Make carousel indicators actual buttons
  • #33027: Revamp sticky header offset to improve a11y
🏭 Tests
  • #32309: tests: replace deprecated jQuery method
  • #32465: Tooltip - Add missing callback in async spec
  • #32486: BrowserStack: test on macOS Catalina instead of High Sierra
  • #32730: Move "active" class from .nav-item to .nav-link
  • #32769: JS: update karma config
  • #32904: Minor ESLint rules cleanup
🧰 Misc
  • #32185: terser: use 2 passes instead of the default 1.
  • #32238: CI: add a 30-min timeout for BrowserStack
  • #32312: build-plugins: switch to "bundled" for babel helpers
  • #32313: build-plugins: build Base component too
  • #32314: CONTRIBUTING: mention dist files
  • #32417: Update Release Drafter configuration
  • #32452: Update CodeQL Action
  • #32453: Few updates for v5.0.0-beta1 NuGet support
  • #32469: Improve zip-examples.js
  • #32635: CI: update to actions/setup-node@v2
  • #32737: package.json: move version_short variable under the config object
  • #32755: GitHub Actions cleanup
  • #32756: Stylelint: disallow some property values
  • #32770: .gitignore: remove Ruby/Jekyll entries
  • #32796: CI: change Node.js to 14
  • #32799: Update zip-examples.js
  • #32917: change-version: remove vendor, add resources
  • #32919: CI: switch to the coverallsapp/github-action tag
  • #33012: CI: remove the cache fallback and shorten cache key
  • #33016: vnu-jar.js: quote vnu path
📦 Dependencies


  • Tooltips and popovers can have custom clases via customClass option.
  • Added new .navbar-nav-scroll class for scrolling expanded navbar contents on mobile devices.
  • For improved accessibiliy, spinners now slow down when prefers-reduced-motion is enabled.
  • v4.x docs are now built on Hugo for easier maintenance and backports from v5.x.
  • Darkened background-color of .dropdown-item for improved hover state contrast, and ligthened the disabled .dropdown-item color.
  • Improved alignment of form validation tooltips.
  • File inputs no longer extend beyond their containers.
  • #31557: Fix form validation tooltip alignment
  • #31657: Handle the Ubuntu sans-serif case
  • #31700: Suppress flexbox side effects in breadcrumb
  • #31882: Slow down spinners when prefers-reduced-motion
  • #31886: Fixed: Undefined mixin "deprecate" when importing "bootstrap-grid-scss"
  • #32141: Use correct value order
  • #32145: Avoid invisible real file input "spilling" out of container
  • #32160: Add overflow suppression to custom file label
  • #32211: Move negative margin-bottom from .nav-item to .nav-link
  • #32212: Remove needless Stylelint disables
  • #32833: Add .navbar-nav-scroll for vertical scrolling of navbar content
  • Add two new variables for pagination border-radius values; backport of #32423
  • Remove old/unnecessary reboot bug fix; backport of #32631
  • Suppress focus outline for buttons when it shouldn't be visible in Chromium; backport of #32689
  • Consistently use outline:0 rather than outline:none; backport of #32751
  • Darken dropdown item hover style; backport of #32754
  • Lighten disabled dropdown text to $gray-500
  • #31820: Check for data-interval on the first slide of carousel
  • #31834/#32225: tooltip/popover: add a customClass option
  • #32001: Move js/src/index.js one folder up
  • #32045: tests: fix sanitizer test
  • #32220: Don't hide modal when config.keyboard is false
  • #32312: build-plugins: switch to "bundled" for babel helpers
  • #31861: Split up dropdown sizing docs to improve rendering
  • #31892: Remove redundant visually hidden "(current)" from pagination controls
  • #31893: manifest.json: Switch to relative URLs so that we don't need to change the path with every major/minor release
  • #31898: switch to suggesting jsDelivr as a CDN
  • #31904:
    • docs(forms): use a legend for fieldset instead of aria-label
    • docs(forms): fix incorrect legend nesting in fieldset
  • #31936: forms: change inline custom radio name
  • #31951: Update anchor-js to v4.3.0
  • #31960: Explicitly mention emoji fonts, tweak sentence in typography
  • #31981: fix snippet
  • #32005: Remove since it doesn't work
  • #32015: Fix redirects
  • #32050: Make docs anchorjs links darker on keyboard focus
  • #32054: Add callouts about using light colors ideally on a dark background
  • #32077: Switch to Hugo
  • #32083: mention "Liberation Sans"
  • #32087: link to JS files comparison too
  • #32094: Changes to navbar documentation/explanation
  • #32106: Clarify JS bundle docs once more for v4
  • #32137: fix wrong class .visually-hidden
  • #32138: remove loading=lazy from snippets
  • #32147: Fix redirects
  • #32151: Mention user-select-all support in docs
  • #32196: homepage: split snippets and show copy buttons
  • #32203: Switch to jsDelivr for the remaining docs assets
  • #32223: introduction: split comments
  • #32247: Fix typos in tooltip/popover docs
  • #32253: Add Russian translation
  • #32363: Remove useless .text-left in Layout / Overview
  • #32399: Remove duplicated "follow Bootstrap on Twitter" link in Community section
  • #32457: Add mention of the bs-custom-file-input plugin needed for the custom file input
  • #32461: style clipboard button on :focus, not just :hover
  • #32462: Replace Lorem Ipsum placeholder text with more representative (or at least english language) text
  • #32634: Remove incorrect mention of dropdowns for dynamic tab behavior
  • #32639: v4: Add an actual data-touch="false" example in the carousel docs
  • #32728: add v5.0 in versions
  • #32761: Mention stretched-link constraints with table elements
  • #32789: Remove role="button" from CTA links in carousel example
  • #32791: Docs v4: Sass implementation and rounding precision
  • #32809:
    • Clarify Sass import and customize docs for how to modify variable defaults
    • Add an npm starter project callout to a few pages
  • #32827: Add a live toast example to the docs
  • #32759: Mention CSP and embedded SVGs in v4 docs
  • docs(dropdowns): clarify where is .show applied
  • Require .has-validation for input groups with validation
  • Fix mobile menu jump & double border
  • Remove double spaces from homepage SVGs
  • browserconfig.xml: switch to relative image path
  • Tweak the wording for collapse to indicate button is preferred/more semantic; backport of #32632
  • Clarify the $enable-shadows option in our docs; backport of #32685
  • #31979: v4 Examples/Floating-labels: fix bad behavior with autofill
  • #32198: examples: add the version number in title
  • #29753: Improve build/generate-sri.js regex
  • #32003: CI: switch to Node.js 14
  • #32008: Update Edge's Rendering Engine on
  • #32486: BrowserStack: test on macOS Catalina instead of High Sierra
  • #32756: Stylelint: disallow some property values
  • Fix for npm 7.x package.json: move version_short variable under the config object; backport of #32737
  • Update build-examples script so that the resulting examples zip file includes only the needed files
  • Various CI tweaks
  • Updated devDependencies


⚠ Please check our migration guide for more info!

🚀 Features
  • #32280: Add toast positioning
  • #30980: Add RTL support
  • #32217: Ability to add custom class in tooltip/popover
  • #31643: Add a state field to create utility pseudo-classes
  • #31178: Update Popper to v2.x
  • #31303: Keep rounded corners for the first .btn in vertical button group
  • #31643: Add a state field to create utility pseudo-classes
  • #31735: Simplify make-container()
  • #32149: Rename scale-color() function to shift-color()
  • #32201: fix(container): use $variable-prefix
  • #32213: _reboot.scss: remove needless Stylelint disable
  • #32249: breadcrumb: simplify appearance, improve extensibility
  • #32277: Remove default linear gradient
  • #32280: Add toast positioning
☕️ JavaScript
  • #28849: Accessibility: add aria-label for tooltips
  • #29370: create a base component
  • #31178: Update Popper to v2.x
  • #31827: Add namespace "bs" in the data attributes
  • #32095: JS: use more "modern" APIs
  • #32124: tooltip.js: deduplicate _fixTitle()
  • #32152: Fix .close instances
  • #32154: BrowserStack: test both on iPhone 7 and iPhone X
  • #32173: Make the attribute methods bs specific
  • #32178: Handle Chromium to run Karma
  • #32179: Don't hide modal when config.keyboard is false
  • #32217: Ability to add custom class in tooltip/popover
  • #32221: Add missing tags in unit tests
  • #32224: Be consistent with Popper's name.
  • #32233: Update bundle.js in tests/integration
  • #32279: Remove the show config option from the modal plugin
  • #32310: Remove Polyfill leftovers
📖 Docs
  • #31098: Docs: change sidebar collapse controls to actual button elements
  • #31608: Add baseof.html layout to docs
  • #32117: Update _syntax.scss
  • #32131: application.js: remove non-existent selector
  • #32134: Add hyphen between Sass and based
  • #32135: Fix URLs to prevent redirects
  • #32139: fix grammar error
  • #32143: example.html: remove extra whitespace
  • #32153: unbreak line
  • #32158: Switch to jsDelivr for the remaining docs assets
  • #32162: docs: Add missing .has-validation class for input group example
  • #32163: docs: update selector CodePen example
  • #32174: Position Utilities Docs: Fix the marker SVG color to match the button
  • #32175: skippy.html: reduce whitespace output
  • #32176: docs: use expanded Sass output style for development
  • #32177: examples: fix .btn-block instances
  • #32187: Manually optimize SVGs
  • #32189: docs(dropdowns): clarify where is .show applied
  • #32191: Correct block button breakpoint docs typo
  • #32194: Docs: fix homepage npm install version
  • #32198: examples: add the version number in title
  • #32204: Fix a few typos
  • #32223: introduction: split comments
  • #32224: Be consistent with Popper's name.
  • #32226: docs: use event instead of e
  • #32258: homepage: fix wrong alt attribute
  • #32281: Add mention of link underline change to migration and typography
  • #32335: cheatsheet.js: use event instead of e
🌎 Accessibility
  • #28849: Accessibility: add aria-label for tooltips
🧰 Misc
  • #29753: Improve build/generate-sri.js regex
  • #30986: Revisit our browserslist config
  • #32125: Update codeql.yml
  • #32154: BrowserStack: test both on iPhone 7 and iPhone X
  • #32222: CI: specify FORCE_COLOR:2
  • #32232: npm scripts: run integration tests in parallel
  • #32257: README: fix path to search.js
  • #32310: Remove Polyfill leftovers
  • #32326: Fix css-prefix-examples-rtl script
📦 Dependencies


  • #31728: Switch to dart-sass
  • #31972: Drop Legacy Edge support.
  • #32012: Remove obsolete prefixes
🚀 Features
  • #30449: v5: Floating labels
  • #30571: v5: Add .fs-* utilities for font-size and rename font-weight/-style utilities
  • #31343: Adding overflow visible and scroll as utilities
  • #31995: Replace .btn-block with utilities
  • #32013: Add dedicated accordion component
  • #32066: Add .d-grid to our display utilities
  • #32074: Add .gap utilities
  • #30449: v5: Floating labels
  • #30571: v5: Add .fs-* utilities for font-size and rename font-weight/-style utilities
  • #30622: Colors rewrite
  • #31343: Adding overflow visible and scroll as utilities
  • #31651: Fix disabled checkbox toggle buttons
  • #31657: Handle the Ubuntu sans-serif case
  • #31684: Add Sass variable for CSS variable prefix
  • #31687: Updated .rounded utilities
  • #31700: Suppress flexbox side effects in breadcrumb
  • #31826: Alert: Add z-index for close button
  • #31839: docs: fix contrast color against .bg-info
  • #31877: Apply smooth-scroll when prefers-reduced-motion: no-preference
  • #31882: Slow down spinners when prefers-reduced-motion: reduce
  • #31953: Fix input group border radii
  • #31955: Drop custom file upload plugin in favor of CSS solution
  • #31964: Remove background-clip from .btn-close
  • #31993: Remove explicit heights on form elements
  • #31995: Replace .btn-block with utilities
  • #32013: Add dedicated accordion component
  • #32020: Add cursor:pointer to color inputs
  • #32023: Fix color input heights
  • #32031: Fix .fw utilities
  • #32064: Remove firefox workaround for ::file-selector-button margin
  • #32066: Add .d-grid to our display utilities
  • #32074: Add .gap utilities
  • #32085: Add checks to fix color contrast issues
  • #32121: Use correct value order
☕️ JavaScript
  • #30740: karma: stop excluding polyfill.js from istanbul
  • #31818: Check for data-interval on the first slide of carousel
  • #31842: Remove Manipulator.toggleClass
  • #31951: Update anchor-js to v4.3.0.
  • #32011: polyfill.js minor tweaks
  • #32016: Streamline jQuery comment.
  • #32021: Lint: stop ignoring package.js
  • #32024: Fix TypeError when Bootstrap is included in head
  • #32026: toast.spec.js: fix typo
  • #32036: ESLint: enable new-cap rule but ignore properties
  • #32043: tests: switch to using toContain() to check for substring presence
  • #32045: tests: fix sanitizer test.
  • #32046: tests: tweak Jasmine usage
  • #32055: dropdown.js: simplify code
  • #32093: karma.conf.js: break lines
  • #32100: search.js: check for search-input element early
  • #32101: modal.html: use textContent
📖 Docs
  • #30044: Contrast colors added to theme-colors
  • #30838: Explain the "dispose" method appropriately
  • #31111: Update docs example on how to optimize JavaScript bundle
  • #31583: docs(Modal): Add xxl fullscreen example
  • #31679: Don't wrap the code snippets in our docs
  • #31686: v5: Add disabled examples for .form-control, .form-select, and .form-range
  • #31702: Add keyboard shortcut to focus search field
  • #31775: Update social.html: use article og:type when it's a page
  • #31791: docs: remove pixels from SVGs
  • #31794: Replace "both of them" with "it"
  • #31795: fix _validation.scss file reference
  • #31796: Update .btn-close-white docs to filter (not backdrop-filter)
  • #31802: Improve callout shortcode.
  • #31803: Update bs-table shortcode
  • #31806: docs: switch to fenced codeblocks
  • #31809: carousel: add missing to description and fix nextwhenvisible description
  • #31828: docs: Add Russian translation
  • #31835: Move href attribute first
  • #31839: docs: fix contrast color against .bg-info
  • #31861: Split up dropdown sizing docs to improve rendering
  • #31871: Revert "Improve callout shortcode."
  • #31892: Remove redundant visually hidden "(current)" from pagination controls
  • #31893: Update manifest.json
  • #31894: docs: switch to suggesting jsDelivr as a CDN
  • #31904: Drop useless text faking a label in horizontal forms example
  • #31929: Mention spinners slow down in migration guide
  • #31932: Small typo - remove the unnecessary "the"
  • #31951: Update anchor-js to v4.3.0.
  • #31960: Docs: Explicitly mention emoji fonts, tweak sentence in typography
  • #31965: Rename Navs to Navs and Tabs
  • #31981: Update
  • #31982: Fix git conflicts after #30571
  • #31984: Add example with input group between two inputs
  • #32009: Minor Markdown fixes
  • #32015: Fix redirects
  • #32031: Fix .fw utilities
  • #32040: Add callouts about using light colors ideally on a dark background
  • #32049: Update utilities API docs
  • #32050: Make docs anchorjs links darker on keyboard focus
  • #32058: Form file docs and overrides
  • #32076: Partially revert "Move this to a partial to work around the stray p
  • #32084: mention "Liberation Sans"
  • #32086: config.yml: remove the unused "expo" parameter
  • #32087: link to JS files comparison too
  • #32090: [Docs] Changes to navbar documentation/explanation
  • #32099: search.js: use the current URL
  • #32100: search.js: check for search-input element early
  • #32102: docs.html: replace backslashes with forward slashes
  • #32105: Clarify JS bundle docs one more time
  • #32116: browsers-devices: add chomp
  • #32126: Minor improvements to the Alpha 3 changelog
  • #32129: masthead: add newlines in the snippets and reindent
🌎 Accessibility
  • #30550: Bump $dark to $gray-900
  • #31839: docs: fix contrast color against .bg-info
  • #31877: Apply smooth-scroll when prefers-reduced-motion: no-preference
  • #31882: Slow down spinners when prefers-reduced-motion: reduce
  • #31892: Remove redundant visually hidden "(current)" from pagination controls
  • #31904: Drop useless text faking a label in horizontal forms example
  • #32058: Form file docs and overrides
  • #32090: [Docs] Changes to navbar documentation/explanation
🧰 Misc
  • #30740: karma: stop excluding polyfill.js from istanbul
  • #31728: Switch to dart-sass
  • #31783: Update .gitignore
  • #31878: CI: Allow skipping BrowserStack
  • #31930: Update CodeQL action
  • #32003: CI: switch to Node.js 14.
  • #32005: Remove url
  • #32006: CI: Skip dependabot PR branches.
  • #32008: Update Edge's Rendering Engine on
  • #32027: Clarify PRs section
  • #32033: fix redirect
  • #32036: ESLint: enable new-cap rule but ignore properties
  • #32056: deps: move sirv-cli to npx
  • #32063: stylelint: pass the --rd flag
  • #32097: package.json: fix clean-css level switch
📦 Dependencies


  • #31653: Add a comment to our escape-svg function to note that data URIs must be quoted.
  • #31693: Use the custom-control shadow variable instead of the generic input-focus-box-shadow.
  • #31793: Backport some v5 changes (improved th styling in Reboot, custom form field styling when printing, and improvements to .text-break).
    • #29714: Keep custom check, radio, and switch theme when printing.
    • #30781: Reboot's th updates: Inherit font-weight: bold that comes from user agent stylesheets.
    • #30932: .text-break changes to drop overflow-wrap and use word-wrap once again
    • #31754: Improve versions page rendering (also reversed the order while I was here)
  • #31846: Backports the z-index change to .close buttons in dismissible .alerts.
  • #31000: Avoid multiple change event trigger in buttons plugin. Not applicable to v5 since our button JS plugin has been mostly replaced with pure CSS.
  • #31673: Fix dropdown variable always evaluating to true.
  • #31696: Ensure can be prevented.
  • #31718: Backports new $dropdown-padding-x variable from v5.
  • #30811: Mention GPU acceleration fix in docs callout for popovers. Doesn't apply to v5 since we're updating to Popper v2.
  • #30838: Explain the dispose method more appropriately.
  • #31706: Backports updated margins for code snippets for improved readability.
  • #31769: Backports JS bundle guidance from v5.
  • #31851: Backports mention of missing to and nextwhenvisible methods.
  • #31297: Switch to xo ESLint config
  • Updated devDependencies versions


  • #30966: Floating labels improvements
  • #31774: Replace ellipsis Unicode symbol with three dots.
🚀 Features
  • #30171: Add .dropdown-menu-dark
  • #31280: Extra position utilities
  • #31484: Add border width utility
  • #31650: Carousel enhancements, including .carousel-dark
  • #30171: Add .dropdown-menu-dark
  • #30394: box-shadow() mixin: allow 'null' and drop support 'none' with multiple args
  • #30572: Add new toasts examples
  • #30639: Easier disabled state customization for button variants
  • #30781: reboot: table th
  • #31035: Add null variables for nav-link
  • #31120: Add missing comma in utils
  • #31131: Darken dropdown divider
  • #31132: Add padding to badges
  • #31139: Rename sr-only/sr-only-focusable to visually-hidden/visually-hidden-focusable
  • #31151: Fix scrollable modal
  • #31162: Fix table separator typo
  • #31276: v5: Tweak some colors
  • #31280: Extra position utilities
  • #31338: Removed a broken reference
  • #31346: Turn off scroll anchoring for accordions
  • #31359: Cleanup/fix after the sr-only to visually-hidden renaming
  • #31381: Remove overflow: hidden from toasts
  • #31382: Update copy around breakpoint sizing
  • #31383: Adjust sizing of checks and radios
  • #31396: Add transition to Pagination buttons just like other Bootstrap buttons
  • #31424: Mention that Edge Legacy also supports 'filling' their track
  • #31439: Remove flex: 1 0 100% from rows
  • #31473: Give more priority to .d-none
  • #31484: Add border width utility
  • #31500: Use next breakpoint when targetting xs only
  • #31571: Add default parameters to each border radius mixin
  • #31641: Revamp close button component
  • #31649: Match container gutters with row gutters
  • #31650: Carousel enhancements, including .carousel-dark
  • #31653: Add a comment for escape-svg function
  • #31659: Update Stylelint rules
  • #31717: Updates responsive embeds with new class names and CSS variables
  • #31718: Add new variable for $dropdown-padding-x
  • #31729: Input group addon sass customization options
  • #31746: Restore rem unit
  • #31772: _variables: change $btn-close-bg's attribute order
☕️ JavaScript
  • #30326: Prevent overflowing static backdrop modal animation
  • #30928: Fix tooltip when hovering a child element (delegateTarget)
  • #31066: Change "whitelist" to "allowlist"
  • #31067: data: reword storage key in DOM
  • #31073: Minor JS tweaks
  • #31109: toasts: make default duration 5s
  • #31115: fix tooltip hide method when already hidden
  • #31125: BrowserStack: stop testing on latest Edge.
  • #31155: Clear timeout before showing the toast
  • #31212: Minor JS consistency changes
  • #31358: Docs: Add accessibility note about dismissible alerts and focus
📖 Docs
  • #30572: Add new toasts examples
  • #30897: Prevent skip links from overlapping header
  • #31036: Docs: Add top/bottom margin to highlighted code samples
  • #31058: Update links to bug and feature request issue templates
  • #31062: Fix Stack Overflow tag
  • #31070: Docs: fix old/broken example capture and typo
  • #31071: Docs: clarify rationale for button group on links
  • #31075: Updated the command to install using yarn
  • #31076: Typo fix: ocassions to occasions
  • #31077: Several typo fixes
  • #31078: Typo fix: individiual to individual
  • #31079: Typo fix: depedending to depending
  • #31081: Docs: add Gaël Poupard to the core team page
  • #31082: Docs: tweak accessibility section
  • #31090: Docs: rename form checks page to "Checks / radios"
  • #31093: Docs: improve/expand button documentation
  • #31102: Docs: Fix typo
  • #31106: Docs: fix typo
  • #31107: Correctly document how to add to Sass maps
  • #31114: Docs: forms accessibility cleanup
  • #31116: Fix links to gutters page
  • #31119: v5: Adjust docs sidebar and navbar
  • #31122: Update
  • #31130: Add code to method/property tables
  • #31133: Docs: screen reader helper/visibility utility tweaks
  • #31134: Docs: clarify that pointer events classes don't affect keyboard interaction
  • #31135: Docs: move color utility callouts to start of page
  • #31137: Docs: (subjectively) nicer looking accordion example
  • #31165: Remove backdrop-filter from docs subnav and toasts
  • #31190: Fix spelling mistake
  • #31192: Docs: Fix vertical align link
  • #31194: Minor doc tweaks
  • #31196: Fixed typo in docs v5 (Utilities/API) page
  • #31201: Docs: separate button group out of checks/radios, expand button groups page
  • #31211: homepage: Fix wrong indentation
  • #31213: Fix generated example code for RFS
  • #31232: Fix sidebar jump
  • #31240: Single line example for inline forms
  • #31248: v5: Updated About and Brand pages
  • #31254: Fix some hexa in colors docs.
  • #31268: Fix docs sass importing example.
  • #31277: v5: Versions cleanup
  • #31278: Migration update
  • #31300: docs: mention our bundle file clearly.
  • #31339: Add view on GitHub links for easier content editing from the docs
  • #31344: Add toasts to the components requiring JavaScript
  • #31358: Docs: Add accessibility note about dismissible alerts and focus
  • #31382: Update copy around breakpoint sizing
  • #31387: Update migration guide
  • #31424: Mention that Edge Legacy also supports 'filling' their track
  • #31434: make breakpoints specifications consistent with layout/
  • #31441: docs: Fix issue number typo in migration
  • #31455: Update current_ruby_version to 5.0.0.alpha1
  • #31471: Remove 'both' as its no longer just 2 breakpoints
  • #31505: docs(typography): missing punctuation
  • #31516: Update icons.yml
  • #31556: docs: Fix typo on Customize -> Color page
  • #31572: Fix docs incorrect green and cyan hex codes
  • #31575: SVG placeholders accessibility
  • #31576: Drop h4 color customization in callouts
  • #31578: Scrollspy keyboard access in docs
  • #31579: Ensure examples content sits in landmarks
  • #31580: Wrap home content in & use
  • #31590: Build tools: mention how to get the sources
  • #31610: Docs layout: ensure content sits in main
  • #31636: Add getInstance method in the docs for tooltip
  • #31648: Typo in About / Overview
  • #31668: Webpack page: add postcssOptions key
  • #31689: docs: fix a few redirects
  • #31738: docs: link to the Asynchronous functions section
  • #31750: brand: minor consistency changes
  • #31752: v5 alpha 2 migration guide updates
  • #31754: Tweak versions page columns
  • #31767: Convert SVGs in navbar and subnav to pixels
  • #31773: Add new Bootstrap Icons homepage images
  • #31785: v5: Vertical pills fix on mobile
🌎 Accessibility
  • #30897: Prevent skip links from overlapping header
  • #30989: Ensure to increase contrasts on buttons & colored links hover/active states
  • #31114: Docs: forms accessibility cleanup
  • #31131: Darken dropdown divider
  • #31276: v5: Tweak some colors
  • #31575: SVG placeholders accessibility
  • #31576: Drop h4 color customization in callouts
  • #31578: Scrollspy keyboard access in docs
  • #31579: Ensure examples content sits in landmarks
  • #31580: Wrap home content in & use
  • #31610: Docs layout: ensure content sits in main
🧰 Misc
  • #31011: Update Babel config
  • #31047: README: remove .svg from badges
  • #31062: Fix Stack Overflow tag
  • #31063: Update bundlewatch.yml
  • #31124: Update .browserslistrc
  • #31259: show brotli size too
  • #31588: Download link in README
  • #31742: Fix bundlewatch size
📦 Dependencies


This release addresses the following two issues:

  • #31438 restores the make-container-max-widths mixin. We won't be using the mixin ourselves, but it will remain in the codebase for the rest of v4 with today's release. We've added a deprecation notice as well.
  • #31439 removes flex: 1 0 100% from .rows. This was added to address shrinking rows inside the navbar component after our responsive containers were added in v4.4.0. Removing this rolls us back to the expected grid and flex behavior—your row will shrink unfortunately without further changes. We could add extra custom CSS to address this, but it seems shortsighted to rush into that. Instead, apply .flex-fill to the .row and your row will behave as usual.


  • #30808: Simplify list-group borders in cards
  • #30810: Add z-index to .custom-check to fix their rendering in CSS columns
  • #30817: Add border-radius to .card-img-overlay
  • #30830: Prevent conflicts with components with classes
  • #30922: Fix color on disabled checked state for custom controls
  • #30932: Restore word-break: break-word; on .text-break utility.
  • #30940: Prevent .row from shrinking in flex containers
  • #30957: Nullify custom form states' box-shadow
  • #30959: Toasts in IE11
  • #30960: Fix IE11 validation tooltip alignment in input groups
  • #30965: Improve floating labels example in IE
  • #30966: Improve floating labels with Edge and a general refactor
  • #30969: Remove duplicated container breakpoints in compiled CSS
  • #30999: Revert min-width: 0 on .col due to unforeseen side effects
  • #31148: Remove duplicate properties on custom controls
  • #31165: Remove backdrop-filter from docs subnav and toasts
  • #31339: Add link to view docs pages on GitHub
  • #31347: Turn off scroll anchoring for accordions
  • #31381: Remove overflow: hidden from toasts
  • #30326: Prevent overflowing static backdrop modal animation
  • #30936: Add role="dialog" in modals via JavaScript
  • #30992: Avoid preventing input event onclick
  • #31155: Clear timeout before showing the toast
  • #30797: Fix release script docs
  • #31011: Updated Babel config
  • #31296: Update to Ruby 2.7 and Bundler 2.x
  • #30809: Update docs callout for responsive SVG images
  • #30813: Mention Bootstrap Icons in extend/ page
  • #30896: Improve wording on Downloads page
  • #30897: Prevent skip links from overlapping header in docs
  • #30973: Update some nav examples by removing .nav-item from .nav-link to be more consistent
  • #31070: Fix some broken examples and typos
  • #31135: Move color utility callouts to start of page
  • #31234: Clean up docs forms for accessibility
  • #31344: Mention toasts in the components requiring JavaScript page


🎉 The first Bootstrap 5 alpha has landed!


  • New interaction utilities. Quickly set user-select with the new utilities and Sass map.
  • New Reboot style for pointer cursors. We now include a role="button" selector in Reboot to set cursor: pointer on non-<button> element buttons.
  • Examples are now downloadable. We've added a script to zip up and offer all our Examples as their own download from the docs.
  • Saved ~5% from the compressed minified JS builds.
  • Added guidance to our docs for how to work around our longstanding input group rounded corner bug.
  • Redesigned docs homepage and navbar to increment us towards v5's new docs design.
  • Deprecated bg-gradient-variant mixin as it's being removed in v5.
  • Updated to jQuery v3.5.1, Jekyll v4, and dropped Node.js < 10 for development.
  • #29413: Prevent vertical offset on progress bar in IE11
  • #29745: Add display: flex on .breadcrumb-item
  • #29819: Allow percentages in container widths
  • #29857: Escape brackets
  • #29946: Added new variable for padding on dropdown header
  • #30004: Fixes disabled .btn cursor
  • #30036: Added focus state to .btn-link
  • #30043: Fix IE auto-size input-group to column
  • #30049: Prevent grid with default cols from breaking when large pre is present by setting min-width: 0
  • #30074: Use word-wrap in .text-break for IE and Edge compatibility
  • #30166: Avoid border-radius functions returning negative values
  • #30183: Remove unnecessary reduce motion when $enable-transition: false
  • #30244: Fix centered modal scrolling issue
  • #30262: Prevent link underline change from affecting some components
  • #30361: Remove appearance from date inputs
  • #30391: Prevent redundant transition: none in transition()` mixin
  • #30497: Fix card list group borders & radii
  • #30504: Fix spinner-grow animation in Safari
  • #30515: Add .card-footer color
  • #30555, #30512, #30480: Use box-shadow mixin for .form-select, .btn, and other form controls
  • #30562: Added new interaction utilities for user-select and a new - role="button" in Reboot to set cursor: pointer.
  • #30582: Delete unnecessary appearance: none from button.close
  • #30594: Deprecate bg-gradient-variant mixin
  • #30605, #30606: Grid now checks for for $grid-columns > 0
  • #30609: Checks for an empty $grid-breakpoints map list to remove all breakpoints
  • #30660: Prevent list group style leaks
  • #30685: Disable auto-hiding scrollbar in IE and legacy Edge
  • #29986: Close modal with keyboard=true & backdrop=static
  • #29968: sanitizer.js: Add srcset in the allowed attributes
  • #30381: Updated tab.js to address accessibility issue when using ul/li semantic
  • #30383: ensure totype always return stringified null when null passed
  • #30388: enable button toggle on label when checkbox is inside
  • #30490: Switch to string constants to save ~5% on compressed file size
  • #30510, #30511: Fix event propagation from inactive and disabled dropdowns
  • #30744: ensure build plugins can exit in error
  • #30772: Prevent scrollbar replacement on non-integer width
  • 22f75c: scrollspy: only accept valid Elements as input for target
  • Redesigned docs homepage
  • Improved tap target sizing in our navigation
  • Added examples for our input group border-radius workaround
  • Added warning to browser bugs page that it's no longer maintained
  • Added loading="lazy" for images
  • #29782: Improve wrapping and hit area of accordion example titles
  • #29820: move width after make-container() mixin
  • #29937: Add missing Noto Sans font to font stack
  • #29956: Add Microsoft Edge for macOS to supported browsers
  • #30130: Added ability to zip and download our Examples
  • #30175: Add version number in page titles
  • #30180: Changed input group validation examples to reflect issues with input group
  • #30207: Headings hierarchy in
  • #30325: Updated modal docs to simplify data-target usage and more
  • #30416: Clarify card group behavior
  • #30469: Remove holder.js leftovers
  • #30505: Use existing position utility in navbar example
  • #30695: make the check for URL stricter in our docs search
  • #30755: Removed role="document" from the modal dialog
  • #29886: Fix checkout page forms
  • #30573: Improve the responsiveness of our Dashboard example
  • Updated jQuery to v3.5.1
  • Replaced bundlesize with bundlewatch
  • Updated to Jekyll v4
  • Drop Node.js < 10
  • Misc devDependencies updates


  • Fix Dart Sass compatibility (#29755, #29763)
  • Add :disabled for disabled fieldset (#29762)



Here's what you need to know about v4.4.0. Remember that with every minor and major release of Bootstrap, we ship a new URL for our hosted docs to ensure URLs continue to work.- New responsive containers! Over a year in the making, fluid up to a particular breakpoint, available for all responsive tiers.

  • New responsive .row-cols classes for quickly specifying the number of columns across breakpoints. This one is huge for those of you who have asked for responsive card decks.
  • New escape-svg() function for simplifying our embedded background-image SVGs for forms and more.
  • New add() and subtract() functions for avoiding errors and zero values from CSS's built in calc feature.
  • New make-col-auto() mixin to make our .col-auto class available with custom HTML.
  • Fixed an issue with Microsoft Edge not picking up :disabled styles by moving selectors to [disabled].
  • Deprecated: bg-variant(), nav-divider(), and form-control-focus() mixins are now deprecated as they're going away in v5.
  • Updated our spacing and alignment for modal footer elements like buttons to automatically wrap when space is constrained.
  • More flexible form control validation styles thanks to fewer chained selectors. Also updated the :invalid validation icon to be an alert instead of an &times; to avoid confusion with browser functionality for clearing the form field value.
  • Fixed a couple dozen CSS and JS bugs.
  • Moved to GitHub Actions for CI/CD! Expect more updates to our CI setup over time here while Actions evolves.
  • Updated documentation to fix links and typos, improved landmarks for secondary navigation, and a new security doc for guidelines on reporting potential vulnerabilities.


  • Security: Fixed an XSS vulnerability (CVE-2019-8331) in our tooltip and popover plugins by implementing a new HTML sanitizer
  • Fixed a small issue with our RFS (responsive font sizes) mixins


  • Security: Fixed an XSS vulnerability (CVE-2019-8331) in our tooltip and popover plugins by implementing a new HTML sanitizer
  • Handle bad selectors (#) in data-target for Dropdowns
  • Clarified tooltip selector documentation
  • Added support for NuGet contentFiles


  • New: Added .stretched-link utility to make any anchor the size of it's nearest position: relative parent, perfect for entirely clickable cards!
  • New: Added .text-break utility for applying word-break: break-word
  • New: Added .rounded-sm and .rounded-lg for small and large border-radius.
  • New: Added .modal-dialog-scrollable modifier class for scrolling content within a modal.
  • New: Added responsive .list-group-horizontal modifier classes for displaying list groups as a horizontal row.
  • Improved: Reduced our compiled CSS by using null for variables that by default inherit their values from other elements (e.g., $headings-color was inherit and is now null until you modifier it in your custom CSS).
  • Improved: Badge focus styles now match their background-color like our buttons.
  • Fixed: Silenced bad selectors in our JS plugins for the href HTML attribute to avoid JavaScript errors. Please try to use valid selectors or the data-target HTML attribute/target option where available.
  • Fixed: Reverted v4.2.1's change to the breakpoint and grid container Sass maps that blocked folks from upgrading when modifying those default variables.
  • Fixed: Restored white-space: nowrap to .dropdown-toggle (before v4.2.1 it was on all .btns) so carets don't wrap to new lines.
  • Deprecated: img-retina, invisible, float, and size mixins are now deprecated and will be removed in v5.


Bump to v4.2.1 to republish package on npm. See v4.2.0 release notes for changes introduced in v4.2.


  • New: Added a .row-no-gutters class.
  • New: Added docs searching via Algolia.
  • Fixed: Resolved an XSS issue in Alert, Carousel, Collapse, Dropdown, Modal, and Tab components. See for details.
  • Fixed: Added padding to .navbar-fixed-* on modal open
  • Fixed: Removed the double border on <abbr> elements.
  • Removed Gist creation in web-based Customizer since anonymous gists were disabled long ago by GitHub.
  • Removed drag and drop support from Customizer since it didn't work anymore.
  • Added a dropdown to the docs nav for newer and previous versions.
  • Update the docs to use a new baseurl, /docs/3.4/, to version the v3.x documentation like we do with v4.
  • Reorganized the v3 docs CSS to use Less.
  • Switched to BrowserStack for tests.
  • Updated links to always use https and fix broken URLs.
  • Replaced ZeroClipboard with clipboard.js


  • Fixed: Removed the :not(:root) selector from our svg Reboot styles, resolving an issue that caused all inline SVGs ignore vertical-align styles via single class due to higher specificity.
  • Fixed: Moved the browserslist config from our package.json to a separate file to avoid unintended inherited browser settings across npm projects.
  • Fixed: Buttons in custom file inputs are once again clickable when focused.
  • Improved: Bootstrap's plugins can now be imported separately in any contexts because they are now UMD ready.
  • Improved: .form-controls now have a fixed height to compensate for differences in computed height across different types. This also fixes some IE alignment issues.
  • Improved: Added Noto Color Emoji to our system font stack for better rendering in Linux OSes.


  • Fixed an XSS vulnerability in tooltip, collapse, and scrollspy plugins
  • Improved how we query elements in our JavaScript plugins
  • Inline SVGs now have the same vertical alignment as images
  • Fixed issues with double transitions on carousels
  • Added Edge and IE10-11 fallbacks to our floating labels example
  • Various improvements to form controls, including disabled states on file inputs and unified focus styles for selects

Checkout the v4.1.2 ship list and GitHub project for the full details.


Our first patch release for Bootstrap 4! Here's a quick rundown of some of the changes:

  • Added validation styles for file inputs
  • Improved printing of dark tables
  • Suppressed that text-hide deprecation notice by default
  • Cleaned up some JS globals and improve coverage
  • Bumped dependencies, namely Jekyll
  • Fixed docs issue with incorrect name for our monospace font utility

Checkout the v4.1.1 ship list and GitHub project for the full details.


  • Added new custom range form control.
  • Added new .carousel-fade modifier to switch carousel from horizontal sliding to crossfade.
  • Added new .dropdown-item-text for plaintext dropdown items.
  • Added new .flex-fill, .flex-grow-*, and .flex-shrink-* utilities.
  • Added new .table-borderless variant for tables.
  • Added new .text-monospace utility.
  • Added new .text-body (default body color), .text-black-50 (50% opacity black), and .text-white-50 (50% opacity white) utilities.
  • Added new .shadow-* utilities for quickly adding box-shadows.
  • Added ability to disable Popper's positioning in dropdowns.
  • Fixed longstanding issue with Chrome incorrectly rendering cards across CSS columns.
  • Deprecated .text-hide—you'll see a warning during compilation—as it's a dated and undocumented feature.
  • Fixed up Dashboard and Offcanvas examples across Firefox and IE.
  • Breadcrumbs can now use non-string values as dividers.
  • Updated our Theming docs to confirm you cannot use CSS variables in media queries (sorry folks!).

Be sure to look at the ship list and project board for more details on all our fixes.


Our first stable v4 release! 🎉

  • Brand new examples and overhauls for existing ones.
  • Additional border utilities have been added and the default border-color for them darkened from $gray-200 to $gray-300.
  • Pagination focus styles now match button and input focus state.
  • Added responsive .order-0 classes to reset column order.
  • Improved examples of form validation documentation by adding tooltip examples and more.
  • New documentation added for using our CSS variables to the Theming page.
  • Improved consistent across browsers when printing.
  • Sass map extends and docs
  • New and improved print display utilities
Project board

For more details, visit


Breaking changes

As mentioned in our Beta 2 release, we needed to make a few more breaking changes in Beta 3. We've summarized them here and in our migration docs—be sure to read them!

  • Rewrote native and custom check controls. Both browser default and custom checkboxes and radios now have simpler markup after removing the <input> from the <label>. Now, all checkboxes and radios have a parent <div> and sibling <input> and <label> pair. This is essential for form validation and disabled inputs because we can use the input's state to style the label.

    In addition, custom checkbox and radio elements no longer have a .custom-control-indicator. This is generated from the new .custom-control-label.

  • Input groups were rewritten with specific .input-group-{prepend|append} classes. The new approach allows us to support validation styles and messages within input groups, while also adding support for custom selects, custom file inputs, and multiple .form-controls.

  • Responsive tables are once again parent classes to avoid accessiblity issues with changing a <table>'s display.

  • Deleted the .col-form-legend class, consolidating it's styles into the .col-form-label class.

Read the Migration page for further details.

More highlights

In addition to the breaking changes, we've addressed a few more general issues that may impact your project.

  • Restored cursor: pointer to non-disabled links, buttons, .close, navbar toggler, and pagination links.

  • Added a new vertically centered modal option with .modal-dialog-centered.

  • Added new dropleft and dropright variants for dropdowns in #23860.

  • Our npm package no longer includes any files other than our source and dist JavaScript and CSS files. If you previously relied on our running our scripts via the node_modules folder, you'll need to update your build tools.

  • Print styles have moved to bottom of the import stack to properly override styles.

For more details on this release's changes, take a look at the Beta 3 ship list issue, as well as the Beta 3 project.


Beta 2 is here! Read the full ship list for details on what issues were closed and PRs merged.

  • Improved Sass map customization with #23260. With this change, it's now possible to override specific key value pairs instead of resetting the entire map, ideal for color scheme customization.
  • Restored grid .offset- modifiers in #23445. Originally our intent was to supplement this with our margin utilities, but we underestimated the appeal of fixed number column offsets.
  • Remove unnecessary color from .badge, and it's associated $badge-color variable, in #23529.
  • Rename grayscale function to gray to avoid breaking CSS native grayscale filter in #23579.
  • Renamed .table-inverse, .thead-inverse, and .thead-default to .*-dark and .*-light, matching our color schemes used elsewhere in #23560.
  • Responsive tables now generate classes for each grid breakpoint, meaning we've added .table-responsive-{sm,md,lg,xl} to the already present .table-responsive. You might need to adjust your usage depending on when you want a table to resize. See #22804.
  • Include two new dist files which contain Popper.js inside bootstrap.bundle.js and bootstrap.bundle.min.js. See #23735.
  • Dropped support for Bower as they've deprecated the package manager. See #23568.
  • Switched breadcrumbs from float to flexbox in #23683.
  • Added new CSS variables in #23761.
  • Switched to Stylelint in #23572.
  • New Theming page in the docs from #23611
  • #23943: Changed the color-yiq from a mixin that included the color property to a function that returns a value, allowing you to use it for any CSS property. For example, instead of color-yiq(#000), you'd write color: color-yiq(#000);.
  • New and improved theming in #24429.


It's a beta! Holy crap this took forever. Thanks for sticking with me on this one—means a lot, y'all <3.

  • Dropped Normalize.css as a dependency, forking some of it and remixing it with our own Reboot for a more stable normalization approach.
  • Update navbar responsive behaviors to be mobile first, use a new class name .navbar-expand instead of .navbar-toggleable, remove toggler position modifiers (relies on flex utils now), and fix a handful of bugs.
  • Stabilize some grid behaviors and update the docs.
  • Updated the grid to drop push, pull, and offset in favor of new .order- modifiers and margin utilities.
  • Renamed tons of variables (see #22414 and #22092) for a more consistent naming scheme.
  • Removed remaining cursor: pointers to restore browser defaults and better indicate actions vs hyperlinks.
  • Renamed flexbox order utilities to better match utility naming scheme of .property-value.
  • Restored Alpha 5's placement of _custom.scss in our import order.
  • Rewrote display and responsive utilities to de-dupe a bunch of functionality.
  • Removed Gruntfile and docs from package manager builds.
  • Overhauled our color system with new Sass maps, variables, classes, and component variants.
  • Updated browser support to bring ranges up to more recent versions.
  • Added a bash script for linting unused variables.
  • Moved jQuery and Popper to peerDependencies as they're not requirements for every part of Bootstrap.

Be sure to read the full ship list.


Happy New Year! It's our final alpha for Bootstrap 4.

Details Highlights
  • Flexbox is now on by default, with no fallback! This means we've dropped IE9 support, but with significant savings to our code base, simpler components, and improved customization thanks to the power of flexbox.
  • Rebuilt the navbar with flexbox in mind, leading to some structural changes, but including more flexibility and customization. Includes updated docs, code snippets, more responsive options. All navbars in our examples are also using the latest markup and styles now. Also solves around 10 bugs in the process!
  • Overhauled flexbox utilities and documented them. Replaced all the previous flexbox utilities with new ones that are named after property: value pairs (instead of creating new names for things). For example, .flex-items-between is now .justify-content-between to apply justify-content: between;. This also adds tons of new flexbox utilities for display, order, wrap, and more.
  • Revamped navs Sass with flexbox and updated docs. All the floats and clearfixs have been removed, .nav-inline removed (on account of display: flex inlining for us on .nav), added fill and justify options, and more.
  • Building on the grid improvements from Alpha 5, you can now customize container padding across grid breakpoints and optionally remove grid gutters with .no-gutters.
  • Similarly, our flexbox grid system has new classes for automatically sizing columns to the size of their content across viewports (e.g., you can now apply col-xs-6, col-md-auto, and col-xl-4 to a single element).
  • Grid, display, float, margin, padding, and text utility classes have been significantly overhauled. In addition to all classes now being responsive, the xs tier no longer requires a breakpoint abbreviation, making for shorter and more descriptive classes and an easier migration from v3. For example, instead of .d-xs-none, it's back to .d-none while it remains .d-{sm,md,lg,xl}-none for those breakpoints.
  • Renamed some .active, all .in, and all .open classes for our JavaScript powered components for more consistent naming. For example, instead it's now instead of and .show > .dropdown-menu instead of .open > .dropdown-menu to better communicate the visibility of elements.
  • Refactored carousel with new, simpler styles, better documentation, and less specific selectors.
  • Rewrote progress component without the <progress> element due to lack of animations, no support for multiple bars, and no support for labels on the progress bars.
  • Fixed some unescaped #s in our SVG data URLs that are used to add vector background-images.
  • Renamed .tag back to .badge, like v3, to avoid conflicts with common WordPress styles.
  • A number of custom form enhancements and bugfixes were made. Label-less custom radios and cehckboxes, fixed SVG URLs in background-images, and more.
  • Updated Normalize.css to v5.0.0.
  • .form-check and .form-check-inline now share the same markup. Switch between the two by adding or removing .form-check-inline as a modifier.
  • Added support for justified navigation when in flexbox mode.
  • Renamed _animation.scss to _transitions.scss for clarity.
  • Added new color variables (e.g., $blue) for additional customization.


Fifth alpha! View the milestone for details:


Fourth alpha release!

See the closed milestone for details.


Third alpha release!

See the closed milestone for details.


Release announcement blog post:

  • #19192 Fix keyboard navigation for toggle buttons (checkbox, radio, single toggle) following a mouse click
  • #19659: Clear tooltip's $element to prevent leaking memory
  • #20019: Avoid calling jQuery('#') since it's a syntax error in jQuery 3
  • #20259: Backport jQuery-related JS unit test fixes from v4
  • #20278: button.js: Set disabled property in addition to disabled attribute, for jQuery 3 compatibility
  • #20313: Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3
  • #20338: Update jQuery version check and jQuery dependency version range to allow jQuery 3

No significant changes.

  • #19704: Add aria-label and callout about labeling pagination components
  • #19263 Bump html5shiv to v3.7.3
  • #19273 Port v4 browser support table format to v3
  • #19893: Update jQuery to v1.12.4
  • Numerous Wall of Browser Bugs updates


Second alpha release!

See the closed milestone or the blog post for more details.


  • #16492: Use @input-border-radius variables on input groups.
  • #16529: Un-style the caret on <select>s in IE10+.
  • #16562, #16563: Create and implement a new @dl-horizontal-breakpoint variable to replace the @grid-float-breakpoint on .dl-horizontal.
  • #16646, #16651: Fix hover border covering active links in pagination.
  • #16684: Fix border-radius not being set on two corners of vertical btn group.
  • #16718: Full 4-digit Unicode escape sequences in CSS for asterisk and plus Glyphicons.
  • #16769: Remove the min-height on modal headers and replace with a clearfix to avoid collapsing when no title exists.
  • #16779: Adjust the padding on jumbotrons within containers.
  • #16785: Round the padding on containers to match the new rounding of negative margins on rows.
  • #16796: Ensure carousel controls are clickable in IE9.
  • #16804: Indicate which buttons in a button group are selected, even when disabled.
  • #16824: Correct a math error in the padding-top of .control-labels in large and small horizontal forms.
  • #16975: Use @carousel-control-font-size for in specific pixel values.
  • #17001: Fix borders on focused inputs in input groups.
  • #16865: Fix triggering of & events so that relatedTarget property gets set properly.
  • #16896: Note jQuery v3 incompatibility.
  • #16630, #16632: Update mention of not-allowed cursor in disabled checkboxes, radios, and fieldsets docs section.
  • #16744: Mention in the README where Bootstrap's changelogs can be found.
  • #16745: Add file that points to GitHub Releases and our blog.
  • #16747: Document that Collapse and Tab methods are asynchronous.
  • #16793: Add example with visible <label> and input group addon.
  • #16888: Add a local jQuery fallback.
  • #16902: Fix grid in modal example by removing .container-fluid.
  • #16965: Call out .icon-next, .icon-prev alternative classes for carousel.
  • #17003: Add .col-offset-0 example addition to docs.
  • #17726: Clarify the purpose of adding .in to the .fade of the initially-open Tab.
  • #17729: Add Subresource Integrity (SRI) hashes to BootstrapCDN links
  • #17742: Add CSS portion of IE10 viewport bug workaround to docs & examples
  • #17809: Note that container: 'body' should be used for tooltips/popovers on tabular elements
  • #17910: Document that .panel-title overrides the font size of <h1><h6> tags
  • #18080: Document conflict between strict Content Security Policy and inline style attributes of .progress bars, and available workarounds
  • #16710: Add official NuGet package
  • #16877, #17693: Add support for Meteor 1.2.
Build tools
  • #16589: Enable source maps for bootstrap.min.css.
  • #17769: Setup Hound for JSHint linting in pull requests
  • #16897: Clarify that Collapse requires Component animations
Browser bugs
  • #16689: Add Wall of Browser Bugs entry for #16671.
  • #16691: Add Wall of Browser Bugs entry for #15968.
  • #16813/#16839: Reported WebKit bug ( for #16809, which WebKit then fixed.
  • #16840: Remove entry from Wall of Browser Bugs because has been fixed.
  • #16841: Remove entry from Wall of Browser Bugs because has been fixed.
  • #16842: Remove entry from Wall of Browser Bugs because has been fixed.
  • #16881: Add Wall of Browser Bugs entry for #16814.
  • #16908: Remove entry from Wall of Browser Bugs because is most likely invalid.
  • #16994: Add Wall of Browser Bugs entry for #16988.
  • #17438 / #14237: Add Wall of Browser Bugs entry for
  • #17712: Mention Chrome meta-bug on Wall of Browser Bugs
  • #17753: Remove entry from Wall of Browser Bugs because was closed as WONTFIX.
  • #17820: Add Wall of Browser Bugs entry for
  • #17902: Remove entry from Wall of Browser Bugs because has been fixed.
  • #17906: Add Wall of Browser Bugs entry for #14975
  • #18111: Add Wall of Browser Bugs entry for


  • #15074, #16159: Manually handle .input-group-* sizing instead of using mixins, which causes a bug in our compiled code due to nesting
  • #15944, #15945: Add z-index to avoid border overlapping in input groups
  • #15956: Properly position .form-control-feedback across within input groups
  • #15976, #15978: Fix overlapped border on pagination links on hover
  • #16047: Make .text-emphasis-variant adjust a:focus color in addition to a:hover color
  • #16086: Reset text/font properties more thoroughly for tooltips+popovers
  • #16089: Add @jumbotron-heading-font-size variable
  • #16092: Only disable pointer-events on disabled <a> .btns
  • #16120, #16350: Add max-width: none to .media > .img-thumbnail to prevent malformed images
  • #16160: Make .bg-variant mixin adjust :focus color in addition to :hover color
  • #16166, #16174: Update .visible* mixin to use !important on <table> elements
  • #16175: Fix border-radius on list group items in collapsible panels
  • #16176: Account for static form controls in form group size variations
  • #16204, #16215: Add <button> support to .list-group-items.
  • #16224: Fix .btn[disabled] styles in the theme.
  • #16234: Update to Normalize v3.0.3
  • #16256: Add px unit to perspective property value
  • #16258: Fix regression that made .caret not display in IE8
  • #16259: Remove workaround for OS X <select> printing bug that's been fixed in recent Chrome
  • #16271, #16373: Add @btn-border-radius variables based on global variables for better customization.
  • #16279: Fix floating of .btns that are direct children of .btn-toolbar
  • #16281, #16351: Round grid column gutter operations to prevent inaccurate padding and margin
  • #16333: Ensure proper sizing of .form-control-feedback in .form-group-* size variations.
  • #16346, #16472: Update iOS temporal input overrides to be limited to .form-control uses.
  • #16371, #16405: Vertically center carousel controls in small viewports.
  • #16374, #16477: Redo jumbotron padding to prevent double negative spacing and overflowing containers.
  • #16457, #16447: Add the license banner to the top of bootstrap.less.
  • #16460: Fix inaccurate .pagination-sm height by specifying line-height.
  • #16482, #16485: Add border-radius variable to theme's inverse navbar.
  • #16614: Fix asymmetry between dropup and dropdown carets.
  • #16154: Darker style .focus and :focus:hover on .active buttons
  • #16226, #16404: Fix radio and checkbox keyboard handling in .btn-group (plus removal of obsolete unit test)
  • #16571: Generalize dropdowns / droprole="menu"
  • #15694: Fix incorrect Affix positioning when webpage uses sticky footer layout
  • #16014: Fix tooltip/popover behavior when multiple triggers are specified
  • #16024: Avoid some unnecessary HTML string building+parsing
  • #16039: Avoid leaking memory in tooltip/popover plugins
  • #16073: Clicking into an input field within an open dropdown no longer closes the dropdown
  • #16142: Fix horizontal viewport bounds check in tooltip/popover placement logic
  • #16147: Add new event fired after tooltip/popover DOM is inserted into the document
  • #16151: Tooltip/popover: Allow viewport option to be a function
  • #16152: Fix auto placement to use viewport on tooltips and popovers
  • #16158: Modals: Remove aria-hidden usage that's redundant to display: none
  • #16263: Use .dropdown-menu instead of ARIA roles for Dropdown keydown event handler
  • #16324: Throw error when tooltip/popover template has multiple top-level elements
  • #15987: Add role="button" to a[data-toggle="collapse"]
  • #16107: Add .alert change to v2 -> v3 migration guide
  • #16113, #16114: Document how to install Bootstrap via Composer
  • #16117: Increment quick start options count in
  • #16136: Callout for tooltips and keyboard/AT accessibility
  • #16140: Add aria-expanded to navbar toggles
  • #16156: Properly document the $(...).tab('show') method
  • #16157: Document how to disable transitions in Bootstrap's jQuery plugins
  • #16167: Remove wrong role="tabpanel" from docs
  • #16194: Remove stray spaces from modal/using-grid-system sample code
  • #16208: Eliminate extraneous padding in .bs-docs-header that would sometimes cause horizontal scrolling
  • #16222: fix dead link: reduced test cases
  • #16257: Upgrade to Holder v2.5.2 for placeholder images
  • #16270, #16280: Change vertical-align on badges from baseline to middle for improvement alignment across more elements
  • #16282: Document that Affix doesn't work on pushed/pulled grid columns in Safari
  • #16301: Hide the "Copy" buttons in the docs when Flash is not available
  • #16367: Ensure that .form-inline in non-responsive example doesn't stack
  • #16369: Separate the docs for .dropdown and .dropup for more accurate examples
  • #16398: Remove role="button" from download links
  • #16409: Document Affix plugin's checkPosition method
  • #16411: Document that 'manual' trigger is mutually exclusive of other tooltip/popover triggers
  • #16417: Added #panels-footer to components nav in docs
  • #16430: Mark stateful button feature as deprecated, and document that $(...).button('reset') is async
  • #16484: ScrollSpy requires non-body elements to have height and overflow.
  • #16488: Update AnchorJS to 1.0.1
  • #16524: Firefox file download bug affecting the Customizer seems to have been fixed
  • #16561: Ensure divider list items have role="separator"
  • #16623: Add role="document" to modal dialog content
Browser bugs
  • #16262: Added Wall of Browser Bugs entries for #16180
  • #16372: Added Wall of Browser Bugs entry for table-related Chrome bug
  • #16101: Update jspm configuration
  • #16359: Update bower.json to comply with Bower's new spec for the main field
  • #16378: Set "moduleType": "globals" in bower.json
  • #16379: Remove moot version field from and add license field to bower.json
  • #16408: Include entire /grunt/ folder in npm package so that grunt dist works
  • #15294: Add grunt-contrib-htmlmin for docs
  • #16254: Upgrade iOS to v8.2 in Sauce Labs JS tests


  • #15561, #15628: Properly resize .badges inside .btn-group-xs
  • #15620: Add .glyphicon-* aliases for other ISO 4217-ish currency codes:
    • .glyphicon-btc and .glyphicon-xbt for .glyphicon-bitcoin
    • .glyphicon-jpy for .glyphicon-yen
    • .glyphicon-rub for .glyphicon-ruble
  • #15656: Improve positioning of inline checkboxes and radio buttons by setting position: relative
  • #15682, #15697: Ensure .caret is the same size in Firefox
  • #15699: Ensure .form-control-static doesn't change height when it's empty
  • #15719, #15728: Add a variable for .form-group's margin-bottom
  • #15726: Remove unnecessary nesting of .embed-responsive-* classes
  • #15755: Removed unnecessary visibility: hidden !important from .hidden class per upstream H5BP change
  • #15825: Use a utility mixing for .initialism text transformation
  • #15947, #15974: iOS fix for role="button" elements
  • #16021: Remove visibility properties where they are redundant to existing display properties
  • #15378: Modal: Work around IE scrollbars not taking up page width
  • #15496: Make $(document).tooltip({...}) without the selector option throw an error
  • #15520: Dropdown: Properly ignore .disabled elements when using keyboard navigation
  • #15557: Tooltip: Avoid creating an unnecessary tooltip when Tooltip#hide is called
  • #15593: Fix Scrollspy's handling of multiple target elements with offsets of zero
  • #15630: Fix erroneous tautological conditional in Tab plugin
  • #15681: Rename Tooltip.replaceArrow()'s isHorizontal parameter to isVertical for accuracy
  • #15693: Remove duplicate implementation of tip() method in popover.js
  • #15930: Modal: Apply any preexisting inline body padding again after closing
  • #15941: Update the .collapsed class and aria-expanded attribute of all of a Collapse's trigger elements when showing/hiding the Collapse
  • #15881: Modal: Fix backdrop not readjusting when height changes
  • #15988: $(...).tooltip('hide') on an uninitialized tooltip/popover no longer unnecessarily initializes it
  • #16011: $(...).collapse('hide') on a hidden uninitialized collapsible no longer shows it
  • #16043: Use half-closed interval for ScrollSpy bounds condition to avoid selecting wrong nav element when user scrolls upwards
  • #15491: Add AnchorJS for docs anchors (hover over headings for a permalink to that section)
  • #15621: Document sticky :hover on mobile browsers
  • #15648: Improve image layout in the Carousel example and document image alignment via .center-block
  • #15662: Mention dropup variation in dropdown docs
  • #15683, #15703: Clarify usage and effects of readonly and disabled inputs
  • #15710: License FAQ clarification
  • #15714: Skip link workarounds for Chrome and IE
  • #15725: Add example of how to use the grid system within a modal
  • #15739: Clarify target of modal events
  • #15740: Clarify target of carousel events
  • #15742: Document how destroy works for delegated tooltips/popovers
  • #15882, #15900: Use an ID as the example for Scrollspy
  • #15884, #15885, #15886, #15887, #15888, #15889, #15890, #15891, #15914: Accessibility changes to improve heading hierarchy within pages
  • #15898: Change CC link in footer to HTTPS
  • #15903: Add rel="license" and update the target of footer license links
  • #15906, #15916: Add source code documentation of justified navbar for the single-line text requirement
  • #15910: Document how to properly handle modals with dynamic content height
  • #15915: Javascript docs: Accessibility and cosmetic changes to headings.
  • #15929: Encourage use of icons with form validation states for colorblind users
  • #15946: Accessibility and headings hierarchy for the "Getting started" page
  • #15948: Accessibility and headings hierarchy for the CSS page.
  • #15999: Document JS test suite basics
  • #16004: Add link to Vietnamese docs translation
  • #16042: Increment quick start options in README to five
  • #16058: Document that striped progress bars aren't striped on IE9
  • #15291: Prevent collapsed navbar in non-responsive example
  • #15911: Update the header in the jumbotron narrow example for a more durable layout
Browser bugs
  • #15846: Add Wall of Browser Bugs entries for #15832
  • #16036: Add Wall of Browser Bugs entry for #16022
  • #15651: Add WOFF2 font file to bower.json's main field
  • #15716: Integrate with Meteor's package manager
  • #15809: Specify the files to install via npm
  • #15611: Use local HTML validator to improve performance
  • #15778: Upgrade Travis to Node.js v0.12


  • #14937: Fix carousel partially not using vendor-prefix mixins.
  • #14990, #15391: Full width form control elements inside media/flag object
  • #15074: Fix the nesting problem with form control size variants.
  • #15124: Restore missing .media-object that was removed in #14801.
  • #15140: Restore .media and .media-body styles that were removed in #14801.
  • #15142: Add position: relative; to .dropup for proper menu placement.
  • #15148, #15307: Use same value for margins on default .dropdown-menu as .dropup .dropdown-menus.
  • #15244: Vertically center .icon-prev and .icon-next in carousel controls with line-height: 1.
  • #15278: Fix border-radius on nested button groups with only one child.
  • #15413, #15422: Fixes .input-group-sm and .input-group-lg for temporal date inputs.
  • #15428: Update browser bug references in Less comments.
  • #15482: Add .disabled class to the .btn-styles mixin in the theme.
  • #15497: Increase decimals on @line-height-large from 1.33 to 1.3333333 to fix button sizing in Chrome for Windows 8.1.
  • #15536, #15559: Apply form group size variations to .form-control-static.
  • #15551: Fix .table-striped to work with tooltips on rows by using nth-of-type instead of nth-child.
  • #15565, #15567: Use @link-hover-decoration for .btn-link to match default a:hover styles.
  • #15594: Reset the color on <small> and .small elements within .panel-titles.
Icon font
  • bcb90ef3a0affa6540d141733a073593011af064 / #15213: Update to Glyphicons v1.9
  • #15464: Exclude 2 problematic icons that were added in Glyphicons v1.9
JS Collapse
  • #15131: Use $.fn.children instead of > in selector.
  • #15241: Add basic collapse plugin example for toggling another element.
  • #15152: Make wrap: false work again (fixes regression)
  • #15154: Fix bug where .affix-top was not getting applied due to padding
  • #15425: Belatedly add regression test for #14244.
  • #15466: Revert #14189 (and thus remove the recently-added "multiple delegated tooltips on a single element" feature) since it caused some nasty regressions.
  • #15535: Use strict mode in jQuery version check function
  • #15094: Add Options, Methods, and Events subsections for each plugin to the JavaScript docs nav sidebar.
  • #15120, #15137: Fix .form-inline example in CSS docs.
  • #15125: Clean up ARIA role usage.
  • #15129: Specify img alternative text.
  • #15133: Fix up use of scope and th/td elements inside tables.
  • #15194: Improve recommended media component markup.
  • #15238, #15306: Add more information about CSS source maps.
  • #15277: Remove dummy href="#" from dismiss-on-next-click popover example
  • #15334: Fix/merge advice on low percentage progress bars.
  • #15337: Add @patrickhlauke to Core Team list on the About page.
  • #15340: Document that the border-radius of <select>s can't be styled in all browsers
  • #15363: Make skip link look less "bare bones" and expand related accessibility advice.
  • #15426: Remove holder.js references from syntax-highlighted example HTML.
  • #15465: Document that calling tooltip/popover show/hide method qualifies as manual triggering.
  • #15470: Document the VERSION property of the jQuery plugins.
  • #15472: Document that responsive tables use overflow-y: hidden.
  • #15473: Document that Autoprefixer is required.
  • #15498: Add examples of using feedback icons with .input-group.
  • #15524: Add pointer to Masonry (& similar) in the Thumbnail docs.
  • #15560: Document that .form-inline & .form-horizontal work fine on non-<form>s too,
  • #15569: Document usage of npm package.
  • #15581: Add example of using .form-inline with visible <label>s.
  • #15096: Fix navbar forms in the non-responsive example.
Browser bugs
  • 0445f23b728da63dab41e82c9f4aaf084e48bd98: The Chrome bug related to #14972 has been fixed on Linux. On Windows, it's still broken due to a different Chrome bug currently slated for Chrome 41.
  • #15407: Add Wall of Browser Bugs entry for #15205.
  • #15415: Add Wall of Browser Bugs entry for #11266 / #13098.
  • #15576: Add Wall of Browser Bugs entry for #15298.
  • #15320: Expanded advice on labels for inline forms, use of title and explanation for <abbr>, replaced use of sr-only text with aria-label for close buttons, wrapped sidebar navigation in a <nav>.
  • #15327: Expanded advice for optional icons with hidden labels, replaced use of sr-only text with aria-label for pagination "previous"/"next" links, callout and examples for various labelling methods for input groups, made main button in segmented buttons in input groups keyboard-focusable, split out/clarified multiple attribute on <select> elements.
  • #15309: Catch and properly report compile errors that Less.js's toCSS() can throw.
  • #15330: Tie help block to input with aria-describedby.
  • #15395: Add warning message about intermittent Firefox-related bug.
Build tools / Packaging
  • #15149: Upgraded OS X JS browser tests to OS X Yosemite
  • #15150: Upgraded iOS JS browser tests to iOS 8.1
  • #15269: Make HTML validator Grunt task ignore spurious errors about <li role="separator">...</li>
  • #15355, #15356, #15357, #15451, #15452, #15453, #15454, #15455, #15462: Update to latest versions of various libraries & Grunt tasks.


Follow up patch release for bug fixes and documentation improvements.

CSS Forms
  • #14234: Drop the IE specific hacks for temporal inputs and replace with a Safari media query hack to avoid the IE problems altogether.
Button groups
  • #15086: Don't remove focus outline from buttons in button groups.
  • #14915: Properly color badges in .active item of <ul>-based list groups.
  • #15052: Fix active styles when in non-anchor .list-group-item.
  • #14979: Override .jumbotron padding within .container-fluid to match .container.
  • #14965: Reset border-radius on top corners on dropdown menus in fixed bottom navbars.
Popovers and tooltips
  • #14936, #15019: Fix some bugs in and deprecate diagonal placement classes for tooltips.
  • #15046: Add full font overrides for popovers and tooltips.
  • #14381: Correctly override active dropdown items in collapsed navbars in the theme.
  • #15018: Correctly override active dropdown items in collapsed navbars.
  • #14925: Make button plugin's focus shim recognize focusin event in addition to focus event.
  • #14931: Add workaround for seemingly spurious tooltip viewport unit test failures on iOS 8.
  • #14927: Fix modal backdrop overlaying the modal's scrollbar.
  • #14933: Center modal at all times.
  • #14993: Have Carousel ignore keyboard events emited by <input>s or <textarea>s.
  • #15088: Dropdown: Ignore keydown events coming from inputs and textareas.
Docs Browser bugs
  • #14920: Add Wall of Browser Bugs entry for #14868.
  • #14922: Add Wall of Browser Bugs entry for #14708.
  • #14958: Add Wall of Browser Bugs entry for #14409.
  • #14985: Add Wall of Browser Bugs entry for #14972.
  • #14951: Assorted accessibility (and some consistency) fixes.
  • #15009, #15085: Glyphicon accessibility improvements.
  • #15087: Wash-up of some stray dropdown examples' ARIA roles.
Contributing guidelines
  • #14949: Explain issue bots & PR bots in
  • #14959: Mention common contributor mistakes in
Components, examples, etc
  • #14917: Use HTML5 <footer> tag in examples.
  • #14945: Replace deprecated uses of .pull-left & .pull-right in .media docs.
  • #14986: Mention Safari font size issues with fixed-width .containers in Printing docs.
  • #14989: Add event.relatedTarget + data-* example of how to vary modal content based on which button activated the modal.
  • #15015: Add initialization examples to tooltip and popover "Opt-in functionality" callouts.
  • #15077: Document required .active class on one carousel slide.
  • #14954: Fix config.json file upload widget event listener.
  • #14980: Integrate Autoprefixer into the Customizer.
  • #15031: Remove file type check from config import.
Build tools / Packaging
  • #15072: HTML validation: X-UA-Compatible now validates, so remove it from the list of ignored errors.
  • Update devDependencies


Be sure to read the blog post for more details!

CSS Variables and mixins
  • #13923: Add @gray-base variable to make @gray-* variables work better together.
  • #14440: Remove unused @nav-open-link-hover-color variable.
  • #14511: Add missing border-radius variables for small and large inputs.
  • #14592: Add @progress-border-radius variable for progress bar.
  • #14786: Add @link-hover-decoration variable.
  • #14891: Add @cursor-disabled variable.
  • #14168: Make nested kbd elements bold so you can better identify combinators.
  • #13967: Don't reset the <cite> element's font-style.
  • #14682: Remove the content: ""; reset on <blockquote> elements as it can cause rendering bugs.
  • #13996: Revert the IE backslash hack for .img-responsive on SVG images from #10073 as it stretches all image types unnecessarily in IE<11.
  • #13202: Always use overflow: auto; on .table-responsive to prevent content breaking out of containers.
  • #13920: Assign background-color to <tr> elements instead of <th>/<td> within the .table-striped to avoid broken backgrounds on responsive tables.
  • #14095: Add basic styling for <caption>s.
  • #14251: Remove the -webkit-overflow-scrolling on .table-responsive to prevent Safari from screwing up <body> width.
  • #14838: Fix IE9 bug when .table-responsive is used with .table-hover
  • #12669 (again): Redeclare the line-heights on date inputs in IE8+ to avoid cut off content.
  • #13989: Don't extend the input sizes in small and large form groups. Instead, manually chain the selectors.
  • #13997: Move min-height for radio/checkbox to their inner <label> given move from float to position: absolute; in v3.2.0.
  • #14005: Only adjust the .has-feedback icons when needed.
  • #14104: Remove pointer events on feedback icons.
  • #14107: Lighten placeholder text back to #999.
  • #14221: Make .form-control-static work in inline forms as well.
  • #14234: Reset the IE8-10 temporal input line-height bug with another hack just for IE11.
  • #14029: Add touch-action: manipulation to buttons to remove the 300ms delay in IE10+.
  • #14030: Remove superfluous cursor: pointer; on .btn-link since we already set it on .btn.
  • #14310: Remove the box-shadow on to match the existing :active override.
Button groups
  • #14053: Don't show radio/checkbox in justified button groups.
  • #14559: Properly hide checkbox and radio inputs in button groups.
  • #14443: Only transition what needs transitioning for thumbnails to avoid Safari/Chrome render bug.
  • #12738: Using landscape orientation media query for setting max-height on the .navbar-collapse content requires use of max-device-width, not max-width.
  • #13325, #13464: Changed :last-child overrides in navbars to :first-child to prevent elements from overriding one another.
  • #13943: Lighten the navbar inverse link and text color more since our text contrast change in v3.2.0.
  • #14051: Improve margins on .navbar-right to further fix #13325 and #13464.
  • #14557: Remove the margin-bottom on .form-group:last-child in xs .navbar-form.
  • #14667: Remove translate3d from .navbar and switch to translate to prevent iOS dropdown rendering bugs and make the CSS more predictable.
  • #14337: Round .jumbotron corners within .container and .container-fluid.
  • #14563: Prevent jumbotron reflow by changing the padding of .jumbotron so it doesn't interfere with the .container side padding.
List groups
  • #13931: Set not-allowed cursor on disabled .list-group-items.
  • #14711: Account for list groups in collapsing panels—just replace the .panel-body with a .list-group.
Progress bars
  • #13953, #14736: Remove the progress bar min-width styles for low percentages to avoid jumping progress.
Media object
  • #14801: Add vertical alignment of image in media component. Also deprecated the use of .pull-left and .pull-right in .media. They are replaced by the new .media-left and .media-right classes.
  • #14142: Adding horizontal padding to captions in .tables in panels.
  • #14253: Add borders for tables that follow panel bodies.
  • #14329: Fix alignment, spacing, and borders for list groups nested within collapsing panels.
  • #14437: Round the corners of table rows in panels as well as the cells.
Responsive embed
  • #14687: Include <video> element support in responsive embed.
  • #14386: Reset font, text, and line-height properties in popovers. Moves the font-weight and line-height resets from .popover-title to the .popover, and adds font-size.
  • #14465: Make @popover-arrow-color variable use the @popover-bg variable instead of regular #fff.
  • #13974, #14123: Remove translate3d repaint performance enhancement for text rendering and position wonkiness.
  • #14363: Make affix accept 0 as offsetTop or offsetBottom
  • #13074: Add WebKit CSS3 carousel transforms for supported devices.
  • #14074: Make open dropdown nav links in navbars use gradients to match active links.
  • #14814: Use @navbar-*-link-active-bg variables in background gradients on active/open navbar items.
  • #14806: Reset the text-shadow on badges in the themed buttons.
  • #14869: Added .glyphicon-eur alias for .glyphicon-euro.
  • #14452: Update print.less from its H5BP source to consolidate styles and update source URL.
  • #14790: Update to the latest H5BP.
  • #14743: Updated normalize.css to v3.0.2.
  • #12815: Make zero-value offsets work on affix plugin via data attributes.
  • #13814, #13815: Allow tabs to fade in if there are no initially active panes present.
  • #13853: Major unit tests cleanup.
  • #13907: Add .focus to focused radio and checkbox buttons with the button plugin.
  • #13998: Namespace the affixed event
  • #14000: When a modal is open, pressing the Esc key to close a native browser dialog or menu no longer also closes the modal
  • #14015: Fix positioning of tooltips on SVG elements
  • #14034: Deprecated the remote option of modals
  • #14069: Carousel now skip over non-items when its next or prev methods are called
  • #14090, #14091: Fix IE8 JS unit test problems
  • #14244: Remove popover content with .children().detach() instead of .empty().
  • #14273: Fix hover-triggered popover/tooltip flickering when mouse re-enters trigger element.
  • #14282: Already visible collapse content no longer closes when .collapse('show') is called.
  • #14316: Use closest .alert for alert dismissal.
  • #14357: Recalculate scrollbar width for modal every time in case user resizes the window.
  • #13928: Ensure that hidden event is sent when content is really hidden (collapsing class is removed).
  • #14573: Make inDom check of tooltip cross document compatible.
  • #14492: Handle lack of .width and .height from getBoundingClientRect() in IE8.
  • #14353: Collapse: count .collapsing elements as actives.
  • #14571: Properly fire hidden event when tooltip is destroyed.
  • #13718: Correctly selects arrow placement for a tooltip.
  • #14610: Remove unused (and undocumented) Tooltip#validate method.
  • #14581: Fix tooltip misplacement with "auto top".
  • #14570: Remove .modal-open class after backdrop is hidden.
  • #14599: Tooltip: Rely on getBoundingClientRect for width and height.
  • #14623: Use container instead of parent for tooltip/popover auto-placement calculations.
  • #14626: Carousel: Only enable pause: hover for non-touch browsers.
  • #14722: Escape key should only close Dropdown.
  • #14723: Use translate instead of translate3d on modals to fix bug where sometimes modal wouldn't reappear in Safari.
  • #14590: Add keyboard option to carousel.
  • #14724: Modal no longer closes when dragging and releasing the mouse button outside the dialog.
  • #14845: Collapse: Don't fire show event if show is prevented because other element is transitioning.
  • #14767: Fixes tooltip misplacements in scrollable viewports with auto positioning.
  • #14772: Implement hide and hidden events for tabs.
  • #14852: Bump minimum required jQuery version to 1.9.1 and throw an error when Bootstrap's JS is used with outdated versions of jQuery.
  • #13563: Clear scrollspy selection above first section.
  • #14189: Handle multiple delegated selectors on tooltip and popover nodes.
  • #14519: Fix tooltip occasionally not hiding when using a hide delay.
  • #14457: Change value of stateful button after event loop.
  • #14686: Handle collapsed class on triggers even when manually invoked.
  • #14463: Independently delegate data-api selectors.
  • #14070: Add role="tablist" to .nav-pills in examples to improve accessibility.
  • #14071: Add role="listbox" to .carousel-inner to improve accessibility of Carousels.
  • #14072: Add screenreader text to previous/next carousel buttons in examples to improve accessibility.
  • #14085: Add role="presentation" to tab <li>s to improve accessibility.
  • #14086: Add role="tabpanel" to .tab-pane <div>s to improve accessibility.
  • #14088: Add role="tabpanel" to .panel-collapse to improve accessibility.
  • #14089: Add role="tablist" & aria-multiselectable="true" to accordion .panel-group.
  • #14208: Add ARIA attributes to dropdown plugin.
  • #14242: Remove aria-describedby attribute from tootips later
  • #14147: ARIA / screenreader support for collapse
  • #14577: Wrap .pagination & .pager in <nav> so that AT can know they're for navigation
  • #14578: add aria-labelledby to accordion example to improve accessibility
  • #14579: add role="tab" to .panel-headings in accordion example to improve accessibility
  • #14673: Add visibility styles to navbar and component animations (fade and collapse) for more screenreader friendly components.
  • #14841: Add role="button" to a couple more non-link <a> buttons
  • #14819: Add aria-pressed to single toggle buttons.
  • #14154: Add aria-expanded toggling to tabs plugin. Also adds aria-labelledBy, aria-controls, and aria-expanded to the tabs docs.
  • Moved from Pygments to Rouge for syntax highlighting in the docs. (For folks developing the docs locally, be sure to run gem install rouge before building.)
  • #13746: Add docs section for swapping .navbar-brand for an image.
  • #13835: More explicitly document mobile dropdown menu dismissing behavior.
  • #13937: Fix broken live demos for popovers.
  • #13940, #13954: Save "Preview theme" state with local storage.
  • #13942: Fix link to Less compilation section of docs.
  • #13968: Add missing input group code to inline form example.
  • #13986: Use valid JSON in compound option value examples in tooltip & popover docs so that they can be safely copy-pasted for data-api usage too.
  • #14011: Document radio and checkbox validation states.
  • #14021: Add .collapsed default class to .navbar-collapse for consistency.
  • #14036: Have Jekyll use non-minified assets for local, non-hosted docs, for easier testing/debugging.
  • #14037: Add new Wall of Browser Bugs entry for Chrome regarding input[type="password"] and width of floated elements.
  • #14047: Add missing example code code for kbd after #13351.
  • #14111: Update JS Bin template in
  • #14116: Use <button> elements over empty <a>s in dropdown docs.
  • #14143: Add note about JS plugins and users who have JavaScript disabled.
  • #14156: Fix dismiss-on-next-click popover example.
  • #14192: Use HTTPS for CDN URLs.
  • #14203: Document that form field feedback icons only work with <input class="form-control">.
  • #14211: Add new Wall of Browser Bugs entry for IE regarding :hover and scrolling.
  • #14256: Correctly document arguments passed to title & content options of tooltips & popovers when the option values are functions.
  • #14257: Document that empty tooltips & popovers do not get displayed.
  • #14258: Move Windows Phone 8 IE10 viewport bug workaround script from <head> to end of <body>.
  • #14264: Document arguments passed to placement function option of tooltip/popover.
  • #14332: Clarify that closing an Alert removes it from the DOM.
  • #14406: Consistently use <nav> instead of <div> for .navbar in the docs.
  • #14439: Add static tooltip example to docs.
  • #14451: Bootstrap's IRC channel is now named ##bootstrap.
  • #14516: Document that fieldset[disabled] is somewhat broken in IE11.
  • #14527: Add Wall of Browser Bugs entry for #793.
  • #14531: Add Wall of Browser Bugs entry for IE11 <select> cursor bug.
  • #14709: Add default .collapsed class to accordion examples.
  • #14745: Use https for Twitter links.
  • #14858: Document .alert-dismissible .close button usage restrictions
  • #14901: Add Wall of Browser Bugs entry for iOS Safari transform: translate3d(0, 0, 0) bug
  • #13964: Fix markup of "Remember me" checkbox in Sign In example for accurate horizontal alignment.
  • #14500: Replace nonexistent .col-6 classes in offcanvas example with .col-xs-6.
Build tools / Packaging
  • #14050: Ensure that Bower installs include useful dotfiles (.jshintrc, .csscomb.json, etc.)
  • #14290: Fix watch task to also watch files in subdirectories of /less/.
  • #14336: Have watch task regenerate bootstrap.js when JS source files are modified.
  • #14394: Adjust Gruntfile so that grunt dist works when Bootstrap has been downloaded via Bower.
  • #14488: Simplify copy task.
  • #14497: Set Travis's git clone depth to 10 to make it faster.
  • #14852: Bump required minimum jQuery version to 1.9.1 in bower.json
  • #13824: Added dist/js/npm.js so the npm module can be properly required.
  • #13790: Add feature to import customization config.json files via drag-and-drop.
  • #14411: Fix Gist creation API call.


Be sure to read the blog post for the highlights.

New features
  • #12042: Responsive embeds, as seen in SUIT CSS.
  • #12204: Visibility and hidden classes for block, inline-block, and inline elements.
  • #12690: Added ZeroClipboard to provide a Flash-based copy button on all examples to quickly copy snippets of code.
CSS Misc
  • #12679: Add .sr-only-focusable class to provide a focus state for skip nav links.
  • #13194: Update Normalize to v3.0.1.
  • #13649: Add translate3d in a few instances to reduce repainting when scrolling.
  • #13737: Reset the html font-size using pixels instead of percentages.
  • #12459: Refactor scale mixins to ensure both .scale(x) and .scale(x, y) work.
  • #12855: Add .animation-fill-mode() mixin.
  • #12993: Add a table of contents to mixins.less and reorganize things.
  • #12998: Modularized the mixins into separate files. We now have a mixins directory in our less folder that @imports all the mixins into mixins.less (for backward compatibility).
  • #13859: Update the .skew() mixin to use skewX(...) skewY(...) instead of old and deprecated skew(x,y) syntax.
Grid system
  • #12854, #12863: Properly reset left values to auto instead of 0 in .col-*-push-0 and .col-*-pull-0 grid reset classes.
  • #13616: Add custom grid gutter support to .container-fixed(). .make-row and .make-*-col mixins already had this ability, so this simply completes the package.
  • #10073: Add width: 100% \9; to .img-responsive to prevent IE10 and below from distorting<svg> elements.
  • #12753, #12756: Ensure the .clearfix is applied on .dl-horizontal dd by moving it out of the media query (Less doesn't respect :extend() within media queries).
  • #13449: Increase .lead font-weight for better readability on mobile.
  • #13671: Add text-transform utility classes.
  • #13854: Darken @gray-light and .lead to meet accessibility guidelines.
  • #13860: Add a new variable for .dl-horizontal's offset.
  • #12824: Remove white-space: nowrap from <code> elements in favor of default pre-wrap value for better rendering on narrow viewports.
  • #13351: Add support for nested kbd elements.
  • #12722: Scope .table-responsive styles to screen devices only so they're not cut off when printing from Chrome (Safari is fine, unknown for IE and FF).
  • #12742: Make .table-responsive more mixin-friendly.
  • #13013: Ensure table cells with contextual states preserve their styles when used within a hover table.
  • #13375: Remove bottom margin on tables within collapsible panels.
  • #13670: Use overflow-x: auto; in responsive tables to hide the scrollbar when it's not needed.
  • #13707: Remove unnecessary max-width: 100%; on <table>s and place it on .tables.
  • #12669: Properly reset line-height on all date inputs to ensure Mobile Safari and IE8+ display them correctly.
  • #12759: Make input groups in inline forms use display: table-cell so they are sized properly and appear on the same line as intended.
  • #12794: Fix placement of browser-based form validation popovers for required attribute. Applies to Firefox and Chrome.
  • #12801: Add padding to the bottom of .form-control-static to match height of standard form controls.
  • #12843: Scope label styles for horizontal forms to a media query so their narrow viewport display looks just like a normal form.
  • #12868: Vertically center form feedback icons for large and small inputs. Also reorders our bootstrap.less file to place glyphicons.less closer to the top of our imports to avoid specificity issues.
  • #13003: Move padding on .radios and .checkboxs to their immediate <label>s to avoid the no-click deadzone caused by negative margin.
  • #13066: Add z-index to the form control feedback icons so input groups don't render on top of them.
  • #13099: Fix vertical alignment for all time-based inputs on iOS.
  • #13141: Add a max-width: 100%; to <label> elements so IE8 wraps text properly.
  • #13320: Fix .form-control-feedback position when labels have the .sr-only class applied. This makes it super easy to use optional feedback icons with no visible label.
  • #13548: Use position: absolute; and an IE8-9 hack to fix checkbox and radio line-height problems (and the vertical alignment) that were introduced after #13003.
  • #13651: Update explanatory comment about iOS date/time inputs bug.
  • #13745: Add optional .disabled class to set not-allowed cursor on disabled radio and checkbox labels.
  • #13856: Add .form-group-sm and .form-group-lg.
  • #13872: Always apply padding to .form-control-static for proper vertical alignment.
  • #12937: Darken active button background colors just a bit.
  • #13079: Scope .open button state in .button-variant() mixin to immediate children.
  • #13549: Use .opacity() mixin on button group inputs for IE8 support.
  • #13903: Restore side padding on .btn-block.
  • #12683: Remove the overflow: hidden; from .panel-group > .panel because it apparently serves no purpose and cuts off nested dropdown menus.
  • #12745: Add @panel-heading-padding and @panel-footer-padding variables for panels.
  • #12822: Scope panel collapse styles to immediate .panel-bodys only.
  • #13689: Fix double border in panel when a list group is followed by panel footer.
  • #13735: Fix bug where a panel recieve extra top border when placed within a collapsible panel.
List groups
  • #12490: Add support for disabled list items in list groups.
  • #12739: Add @list-group-link-hover-color variable to customize the text color when hovering on linked list items.
  • #13857: Properly color <small>/.small within active list group headings.
Progress bars
  • #12848: Improve progress bars to better handle low to zero percentage values.
  • #13861: Refactor striped and animated striped progress bars to deprecate the required parent class and add new modifier classes.
  • #12969: Improve badge mixinability with better nesting.
  • #13687: Colorize badges in panel headings.
  • #12738: Revamps navbar collapse functionality. Instead of setting a max-height on all .navbar-collapse elements, we only apply it to fixed top and bottom navbars. Also adds a shorter max-height for landscape views to ensure scrolling still works.
  • #12694, #12813: Correctly reset .btn-link colors in a navbars.
  • #13037: Add text-align: left; to .dropdown-menu to avoid inheritance from any parent that might reset that property (e.g., our .modal-footer).
  • #13369: Fix dropdown menu alignment in justified button groups in Firefox.
  • #13851: Add white-space: nowrap; to .dropdown-header to match dropdown links.
Tooltips and popovers
  • #12934, #12952: Base rounded corners on popover titles on the @border-radius-large variable.
  • #13216, #13217: Increase z-index values on tooltips and popovers to always be in front of modals.
  • #12803: Removed unnecessary top margin from .modal-footer. All spacing is addressed by padding on the .modal-body, and the .modal-header never had any margin on it.
  • 7e551ecaf7: Update padding on modals to be 15px all around. Previously was 15px in the header and 20px everywhere else.
  • #13609: Update modal CSS to prevent shifting before animation.
  • #12593: Add support to Collapse plugin for trs and tbodys.
  • #13242: Fix horizontal alignment of carousel controls by using appropriate margin for each side.
  • #13093: Reset the background-color and background-image on disabled theme buttons.
  • #13542: Fixes #13478 by reverting #10941. This undoes the hardcoded some URL escaping around our icon paths as a way to fix broken assets when Bootstrap was included via Bower. Instead, folks implementing Bootstrap via Bower should use the relative URLs feature of Less.
JavaScript Misc
  • #11464: Improve the JavaScript noConflict() mode not working in 3.0.x.
  • #11966: Fix .noConflict() mode.
  • #12948: Use quotes around all element attribute values in selectors.
  • #11281: When opening a dropdown, focus the toggle before (instead of after) triggering the shown event.
  • #13296, #13354: Don't let dropdown menus disappear with right-click in Firefox.
  • #13511: Fix button plugin to allow empty string as reset state.
  • #11453: Fix scrollspy for targets within tabs.
  • #11937: Correctly determine scrollheight of <body> in IE10 and lower.
  • #12337: Correct some internal event names in scrollspy plugin.
  • #13220: Correct scrollspy offsets when scrollheight changes.
  • #13589: Adjust for Scrollspy offset when calculating maxScroll.
  • #13702: Minor scrollspy refactoring.
  • #11958: Move Modal removeBackdrop() call from hideModal() into backdrop().
  • #12761: Remove .focus() event aliases from modal and dropdown plugins.
  • #12850: Stop passing argument of incorrect type to Modal.hide()
  • #13103: Stop modals from shifting <body> content to the left.
  • #13615: Add missing event namespacing in modal.js.
  • #13627: Fix restoration of focus to the triggering element upon dismissal of a modal.
  • #13406: Fire event after (instead of before) alert has been detached from the DOM.
  • #9342, #12982: Properly reset affix position when scrolling back to top.
  • #12862: Improve flickering and simplify calculations in affix plugin.
  • #13342: Add a target option to the Affix plugin.
  • #13541: Improve affix plugin's affix-bottom positioning.
Tooltips and popovers
  • #12328: Add tooltip viewport option, respect bounds of the viewport.
  • #12377: Stop using document.body.scrollTop, because it's deprecated.
  • #13060, #13481: Add role="tooltip" to tooltips & popovers by default to improve accessibility.
  • #13165: Fix popover when using append.
  • #13557: Add aria-describedby attribute to tooltips and popovers to improve accessibility
  • #13593: Add reference to triggering element to tooltip/popover element's data.
  • #13752: Avoid error when trying to show an auto-placed tooltip that gets removed from the DOM.
  • #9461, #13173: Make carousel ignore content that's not an .item.
  • #12592: Change carousel indicators behavior to immediately move active classes from one indicator to the next.
  • #13396: Add direction & relatedTarget properties to event.
  • #13787: Add left and right keyboard support to the carousel.
  • #9836, #12983: Prevent collapse animation from jumping when an input holds focus.
  • #11099: Prevent $.collapse() from overriding original dimensions of the collapsed element when uncollapsing.
  • #13157, #13176: Fix issues with transition end event bubbling in the collapse plugin.
  • #13306: Don't override the original height/width of a collapsed element when uncollapsing it.
  • #13330: Wait for the transition of the expected target to complete during a collapse.
  • #12487: Document required use of position: relative; for Scrollspy plugin.
  • #12697: Document support for input[readonly].
  • #12744: Document ability to remove animation on modals.
  • #12790: Add link to unofficial Italian translation (
  • #12808: Correct grid column values listed in Grid Options.
  • #12810: Document .container-fluid in the CSS overview docs.
  • #12818: Small table tweak to browser support table.
  • #12866: Add sitemap.xml and robots.txt files.
  • #12748, #12956: Document missing examples for common inline typography tags.
  • #12688: Document ability to dismiss popover via focus and next click.
  • #13024: Add role="alert" to alert examples to improve accessibility.
  • #13026: Document more Bootstrap components in the Theme and RTL examples.
  • #13095: Generate translations list from YAML _data file.
  • #13167: Use underscore prefix to ignore certain directories.
  • #13184: Document the template option of tooltip & popover plugins.
  • #13190: Document that a function for Popover's content parameter is called with the element as an argument.
  • #13222: Explicitly document how to change the mobile navbar breakpoint.
  • #13332: Document specificity collisions of well backgrounds and contextual background classes.
  • #13337: Mention removal of .progress-* contextual classes in the migration guide.
  • #13340: Document default assumption about icon font's location (and how to change it).
  • #13362: Document that you shouldn't show() tooltips and popovers on hidden elements.
  • #13367: Update gradient mixin docs to use percentage values instead of decimals for color stops.
  • #13396: Document direction & relatedTarget properties of Carousel events.
  • #13397: Document that invisible (non-jQuery-:visible) scrollspy targets are ignored.
  • #13422: Warn about browsing the docs in IE when using an emulation mode to simulate older IE versions; these emulation modes can behave significantly differently than actual older IE versions.
  • #13434: Explicitly document grid column wrapping behavior better.
  • #13463: Add optional theme preview toggle to the docs sidebar on certain pages.
  • #13493: Improve accessibility of .close buttons in docs examples.
  • #13495: Mark Android Firefox (Fennec) as an officially supported OS+browser combination.
  • #13700: Add missing role="menu" attrs to .dropdown-menus.
  • #13768: Simpler and updated docs copy for icon font file paths given escaped path reversion.
  • #9951, #12865, #13205: Add Gist and Customizer URLs to customized files and config.json.
  • #10632: Show an alert with links when customizer config is successfully saved as Gist
  • #12617, #12666: Show proper browser support errors for the Customizer.
  • #12773: Add feature detection to block Safari, since it doesn't fully support the necessary Blob API.
  • #12719, #12875: Update to Less 1.7.x.
  • #12966: Ensure icon font vars are loaded into Customizer.
  • #13373: Make variable deprecation notices visible in the Customizer.
  • #13151: Update the Customizer to use to UglifyJS 2.
  • #13472: Disabled the v2.x customizer.
  • #13543: Customizer: make utilities.less inclusion mandatory
  • #13626: Show proper error message when viewing the Customizer in IE8
  • #12735: Fix sidebar hover state in Dashboard example.
  • #12894: Remove margin-bottom from last <p> of .blog-footer in the Blog example.
  • #12897: Remove border-bottom from navbar in Dashboard example for easier customization of navbar content.
  • #13390: Add IE10 viewport bug workaround to examples.
  • #13905: Update the Cover example to move the box-shadow from the <body> to the .site-wrapper so it surrounds content of all lengths.
Build system
  • #12670: Drop use of vendor prefix mixins and use autoprefixer as part of our Gruntfile. Mixins are still available and supported.
  • #12672: Add logging to build-raw-files Grunt task.
  • #12760: Misc Grunt improvements.
  • #12798: Updated QUnit test reporting so Sauce Labs can report exact failing tests.
  • #12949: Switch to grunt-css-flip Grunt plugin for RTL CSS generation.
  • #12829: package.json cleanup.
  • #12834: Update Sauce Labs config to use new name for Chrome browser for tests.
  • #12853: Switch to JSCS to prepare for removal of style changes coming in JSHint 3.
  • #12861: Add docs.css to the CSSComb task.
  • #12989: Don't ignore every dot file in Bower installs, only the ones in the root directory.
  • #13064: Add description field to bower.json
  • #13065: Exclude /test-infra/ from Bower installs.
  • #13328: Include a reference to bootstrap.less in Bower for easier installs.
  • #13587: Switch to Kramdown for Jekyll.
  • #13740: Add replace entry to composer.json.
  • #13877: Switch to uber/npm-shrinkwrap for npm-shrinkwrap.json generation
Browser bugs

We've started tracking unresolved browser bugs that currently impact Bootstrap's development in some way. We call it the Wall of browser bugs. We've also documented a few new bugs with this release:

  • #10690: Reported a bug in Firefox for responsive images (those with max-width: 100%) in table cells. No other browsers are affected. See Until a fix is shipped, add width: 100%; to your responsive images in table cells.
  • #12548: Reported a bug in Chrome where date inputs stop resizing when appearing with display: table-cell;. See
  • #12476: Document IE8's limitation of borders on buttons in a justified button group. Currently the only way to get borders on those buttons is to wrap each button in an additional .btn-group, just like the button groups using <button> elements.


General bug fix and documentation release.

  • #11659, #12349, #12698: Always show the input above appended buttons in input groups for proper focus and disabled state borders.
  • #12025: Ensure responsive utility classes can be combined with one another.
  • #12195: Apply .btn:focused styles to for improved accessibility.
  • #12412: Refactored and renamed our internal grid mixins for generating custom number of grid columns.
  • #12433: Use negative margin on .list-inlines so we don't override the padding-left on the first list item.
  • #12448: Use @navbar-height instead on .navbar-brand to prevent element from being shorter than navbar height. Corrects a change introduced in v3.1.0.
  • #12462: Add border-radius to tables when in panels for proper rounding with all background settings.
  • #12470: Scope large modal styles to minimum viewport width.
  • #12486: Restore full width inputs for input groups in inline forms and navbars.
  • #12502: Remove long deprecated :-moz-placeholder styles.
  • #12532: Scope popover arrow styles to immediate children.
  • #12552: Fixes two typos in carousel.less for the Glyphicon classes.
  • #12620, #12621: Use :extend(.img-responsive) instead of mixin in thumbnail and carousel.
  • #12625: Only remove top and bottom borders on list groups in panels if the list group is the first or last element.
  • #12629: Override the default rounded corners in iOS's search input with -webkit-appearance: none;.
  • #12633: Properly reset borders on table cells in panels.
  • #12639: Drop the unsupported by Opera -o-user-select.
  • #12659: Add @blockquote-font-size variable for calculated text size.
  • #12673: Use @popover-arrow-width for popover offsets.
  • #12674: Update popover border colors to use computed values rather than static ones.
  • #523: Rails 3.2 compatibility
  • #518: scale mixin Sass compatibility issue
  • Updated Bower docs
  • #12436: Update docs, examples, and tests to use jQuery v1.11.0.
  • #12437: Note specific versions of IE where progress bar animation is supported.
  • #12439: Correct docs error about available grid resets.
  • #12477: Clarify supported versions of Internet Explorer (we do v8-11) in browser support docs.
  • #12494: Update docs to reflect modal remote change from #11933.
  • #12497: Remove manual full-width container callout now that there's .container-fluid.
  • #12512: Improve alignment of the Dashboard example placeholder images.
  • #12519: Add Bower badge to README.
  • #12527: Clarify that dropdowns always require data-toggle="dropdown".
  • #12543, #12544, #12545, #12546: Various fixes to the migration docs.
  • #12555: Rearrange variables to place grids and containers closer together in Customizer.
  • #12564: Distribution zip folder renamed to be more descriptive.
  • #12589: Add "Back to top" link to bottom of sidenav.
  • #12590: Add link to Korean translation.
  • #12610: Better and more consistent prefixing of docs CSS with .bs-docs-.
  • #12611: Mention limitation of one JavaScript plugin's data attributes per element.
  • #12614: Add progress bar example with visible label.
  • #12645: Omit semicolons consistently in JS examples.
  • #12655: Upgrade holder.js to v2.3.1 so docs images are rendered properly in Internet Explorer >=9.
  • #12455: Fix typo in Dashboard example's CSS.
  • #12512: Improve alignment of the Dashboard example's placeholder images.
  • #12526: Add scrollbars when necessary to the Dashboard example's sidebar.
  • #12579: Improve sticky footer examples to avoid any wrappers and improve rendering in IE8.
  • #12695: Fixed transitions on offcanvas example by adding initial left and right values.
Build tools
  • #12466: Add the examples' CSS to the csslint task.
  • #12531: Add /docs/dist/ to the clean task.
  • #12534: Allow the bootstrap package in npm to directly expose CSS and Less files.
  • #12568: Add the examples' CSS to the csscomb task.
  • #12581, #12583: Reorganize all Grunt tasks into one directory so that grunt runs properly in Bower installations.
  • #12605: Use license object instead of licenses array in Grunt.