]> git.ipfire.org Git - thirdparty/bootstrap.git/log
thirdparty/bootstrap.git
2 weeks agoDocs: format ResizableExample.astro with Prettier v6-css-grid-container 42598/head
Mark Otto [Tue, 30 Jun 2026 23:14:00 +0000 (16:14 -0700)] 
Docs: format ResizableExample.astro with Prettier

2 weeks agoMerge remote-tracking branch 'origin/v6-dev' into v6-css-grid-container
Mark Otto [Tue, 30 Jun 2026 23:13:44 +0000 (16:13 -0700)] 
Merge remote-tracking branch 'origin/v6-dev' into v6-css-grid-container

2 weeks agov6 docs: various fixes (#42600)
Christian Oliff [Tue, 30 Jun 2026 23:12:35 +0000 (08:12 +0900)] 
v6 docs: various fixes (#42600)

2 weeks agoDocs: change remaining `.link-body-emphasis` usages (#42573)
Julien Déramond [Tue, 30 Jun 2026 19:41:10 +0000 (21:41 +0200)] 
Docs: change remaining `.link-body-emphasis` usages (#42573)

2 weeks agoDocs: replace deprecated `.lead` with `.fs-lg .fw-light` in homepage and examples...
Julien Déramond [Tue, 30 Jun 2026 19:37:50 +0000 (21:37 +0200)] 
Docs: replace deprecated `.lead` with `.fs-lg .fw-light` in homepage and examples (#42574)

2 weeks agoBump dependencies with 2 updates (#42606)
dependabot[bot] [Tue, 30 Jun 2026 19:27:52 +0000 (21:27 +0200)] 
Bump dependencies with 2 updates (#42606)

Bumps the development-dependencies group with 2 updates in the / directory: [autoprefixer](https://github.com/postcss/autoprefixer) and [rollup](https://github.com/rollup/rollup).

Updates `autoprefixer` from 10.5.0 to 10.5.1
- [Release notes](https://github.com/postcss/autoprefixer/releases)
- [Changelog](https://github.com/postcss/autoprefixer/blob/main/CHANGELOG.md)
- [Commits](https://github.com/postcss/autoprefixer/compare/10.5.0...10.5.1)

Updates `rollup` from 4.62.0 to 4.62.2
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.62.0...v4.62.2)

---
updated-dependencies:
- dependency-name: autoprefixer
  dependency-version: 10.5.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: development-dependencies
- dependency-name: rollup
  dependency-version: 4.62.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: development-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2 weeks agoBump js-yaml from 5.1.0 to 5.2.0 (#42603)
dependabot[bot] [Tue, 30 Jun 2026 19:20:58 +0000 (21:20 +0200)] 
Bump js-yaml from 5.1.0 to 5.2.0 (#42603)

Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 5.1.0 to 5.2.0.
- [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nodeca/js-yaml/compare/5.1.0...5.2.0)

---
updated-dependencies:
- dependency-name: js-yaml
  dependency-version: 5.2.0
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2 weeks agoMore MD linting (#42601)
Mark Otto [Mon, 29 Jun 2026 23:06:53 +0000 (16:06 -0700)] 
More MD linting (#42601)

* lint more

* fix the linter issues

2 weeks agoNew container queries for CSS grid, add new fullscreen demo maybe
Mark Otto [Mon, 29 Jun 2026 03:35:26 +0000 (20:35 -0700)] 
New container queries for CSS grid, add new fullscreen demo maybe

2 weeks agoAdd `CLAUDE.md` (#42160)
Mark Otto [Sun, 28 Jun 2026 20:59:52 +0000 (13:59 -0700)] 
Add `CLAUDE.md` (#42160)

* Add a claude file

* Docs: route CLAUDE.md to a tool-agnostic AGENTS.md

Rename the agent guide to AGENTS.md (the emerging cross-tool convention
used by Copilot, Cursor, Codex, etc.) and leave CLAUDE.md as a one-line
`@AGENTS.md` pointer so Claude Code keeps working without duplicating
content. Heading made tool-agnostic.

2 weeks agoAdd a skill for v5 for v6 migration (#42349)
Mark Otto [Sun, 28 Jun 2026 20:59:31 +0000 (13:59 -0700)] 
Add a skill for v5 for v6 migration (#42349)

* wip

* Skill: correct v5→v6 migration guide and add new-component coverage

- Close button: keep the empty .btn-close (CSS-mask icon over currentcolor);
  drop the wrong 'add a child SVG' instruction that double-rendered the icon,
  and note .btn-close-white is gone (set text color instead)
- Border radius: remove the fabricated $border-radius-2xl rename; document the
  real $radius base + $radii map (0-9) + --radius-* tokens
- Font sizes: note lg+ are fluid clamp() values (not exact rems) and list the
  full xs-6xl scale
- Add a 'Rebuilt behavior & new components' section: carousel→scroll-snap with
  opt-in autoplay, scrollspy→IntersectionObserver, the new components
  (combobox, chips, datepicker, range, strength, otp-input, nav-overflow,
  toggler), util/backdrop.js removal, CSS @layer, and --bs-*-rgb removal
- Extend the Phase 6 grep checklist for all of the above

* Skill: align migration guide with migration.mdx changelog

- Remove the 'ScrollSpy → IntersectionObserver' note: v5 (5.2+) already used
  IntersectionObserver, so it's not a v5→v6 change (the docs changelog omits it)
- Expand carousel coverage to match the changelog: ride→autoplay, wrap→ends,
  removed control/caption/dark/stacked classes, .carousel-overlay requirement,
  control-icon renames
- Add the remaining new components (submenu, stepper, avatar, form-adorn, prose)
- Note the .rounded-* remap + --radius-pill, and link-*→underline-* utilities
- Extend the Phase 6 grep list accordingly

* Docs: fix self-contradictory border-radius migration note

The Sass deprecation list said to use `$border-radius-2xl`, but the
Utilities section (and the source) removed the whole `$border-radius-*`
family in favor of the `$radii` map / `--radius-*` tokens. Point the
note there instead.

* Docs: note removal of focustrap and scrollbar utilities

#42595 removed util/focustrap.js and util/scrollbar.js (dead code after
the native <dialog> Dialog/Drawer rewrite). Record them alongside the
existing util/backdrop removal in both the migration skill and the
migration guide changelog.

* Fix CI on migration docs: lint, spelling

- Split the v5/v6 namespace-vs-import example into two code fences so the
  duplicate `const tooltip` no longer trips eslint's no-redeclare, and add
  the blank line after the import
- Add currentcolor, Datepicker, focustrap, oklab, oklch to the cspell
  dictionary; reword 'inerting' and 'Unlayered' to avoid coined words

2 weeks agoPrevent `.DS_Store` in our zip files (#42123)
Mark Otto [Sun, 28 Jun 2026 20:59:04 +0000 (13:59 -0700)] 
Prevent `.DS_Store` in our zip files (#42123)

* Remove .DS_Store from dist building

* fix

* Build: exclude .DS_Store via zip -x instead of deleting files

Use zip's own `-x "*.DS_Store"` exclude in both the examples zip and the
release-zip script, rather than finding and removing files first. Cleaner
(doesn't mutate dist), and fixes the eslint error from filtering inside a
for…of loop header.

2 weeks agov6: Remove extra bottom border on card navigation nav-tabs (#42571)
Claudio B. [Sun, 28 Jun 2026 15:42:28 +0000 (17:42 +0200)] 
v6: Remove extra bottom border on card navigation nav-tabs (#42571)

* v6: Remove extra bottom border on card navigation nav-tabs

Adding navigation to a card’s header with the current v6 adds an extra border which is visible in the documentation, see https://v6-dev--twbs-bootstrap.netlify.app/docs/6.0/components/card/#navigation

<img width="1834" height="766" alt="Image" src="https://github.com/user-attachments/assets/2b87d10f-1cf5-4a74-a2df-047a55ae0fb9" />

This commit removes the extra border.

* Update scss/_card.scss

Co-authored-by: Mark Otto <markdotto@gmail.com>
---------

Co-authored-by: Mark Otto <markdotto@gmail.com>
2 weeks agoRemove unused FocusTrap and ScrollBarHelper utilities (#42595)
Mark Otto [Sun, 28 Jun 2026 15:37:02 +0000 (08:37 -0700)] 
Remove unused FocusTrap and ScrollBarHelper utilities (#42595)

Both became dead code with the Modal->Dialog / Offcanvas->Drawer rewrite:
the native <dialog> element provides the focus trap and top-layer
inerting, and the scroll lock is now :root.dialog-open in CSS. Nothing in
js/src imports either utility and neither is part of the public bundle
export — only their own unit specs referenced them.

Removes the source modules, their committed dist builds, and their specs.

2 weeks agoMove `postcss-prefix-custom-properties` from `peerDependencies` to `devDependencies...
Julien Déramond [Sun, 28 Jun 2026 15:33:52 +0000 (17:33 +0200)] 
Move `postcss-prefix-custom-properties` from `peerDependencies` to `devDependencies` (#42592)

2 weeks agoDocs: fix and restore live code snippet updates in interactive playgrounds (#42593)
Julien Déramond [Sun, 28 Jun 2026 15:33:33 +0000 (17:33 +0200)] 
Docs: fix and restore live code snippet updates in interactive playgrounds (#42593)

2 weeks agoDocs: fix Shiki dark mode rendering (#42591)
Julien Déramond [Sun, 28 Jun 2026 08:44:06 +0000 (10:44 +0200)] 
Docs: fix Shiki dark mode rendering (#42591)

2 weeks agoSanitizer: block data:/vbscript: URLs (XSS hardening) (#42549)
Mark Otto [Sun, 28 Jun 2026 02:29:41 +0000 (19:29 -0700)] 
Sanitizer: block data:/vbscript: URLs (XSS hardening) (#42549)

* Sanitizer: block data:/vbscript: URLs in allowed attributes

The sanitizer's SAFE_URL_PATTERN only rejected javascript:, so a
data:text/html (or vbscript:) URL in an href/src passed the allowList —
an XSS vector via data-bs-title/data-bs-content. Reject data: and
vbscript: in SAFE_URL_PATTERN and re-allow only safe base64 image/video/
audio data URLs via a restored DATA_URL_PATTERN. Fixes #42443.

* Bump bundlewatch size thresholds

* Sanitizer: drop redundant 0-9 from base64 data-URI char class

\d already matches 0-9, so the explicit 0-9 in the same class was dead
weight. Functionally identical; clears the CodeQL overly-permissive-range
alert on the overlap.

* Build: bump bundle.js bundlewatch threshold for sanitizer additions

2 weeks agoBump ESLint-related dependencies (#42578)
Julien Déramond [Sat, 27 Jun 2026 06:11:22 +0000 (08:11 +0200)] 
Bump ESLint-related dependencies (#42578)

- eslint: 10.4.1 → 10.5.0
- eslint-config-xo: 0.52.0 → 0.53.2
- eslint-plugin-unicorn: 64.0.0 → 68.0.0

2 weeks agoBump markdownlint-cli from 0.48.0 to 0.49.0
Julien Déramond [Sat, 27 Jun 2026 05:37:26 +0000 (07:37 +0200)] 
Bump markdownlint-cli from 0.48.0 to 0.49.0

2 weeks agoBump sharp from 0.34.5 to 0.35.2
Julien Déramond [Sat, 27 Jun 2026 05:36:26 +0000 (07:36 +0200)] 
Bump sharp from 0.34.5 to 0.35.2

2 weeks agoBump sass from 1.100.0 to 1.101.0
Julien Déramond [Sat, 27 Jun 2026 05:35:19 +0000 (07:35 +0200)] 
Bump sass from 1.100.0 to 1.101.0

2 weeks agoBump playwright from 1.60.0 to 1.61.0
Julien Déramond [Sat, 27 Jun 2026 05:34:23 +0000 (07:34 +0200)] 
Bump playwright from 1.60.0 to 1.61.0

2 weeks agoBump html-validate from 11.4.0 to 11.5.3
Julien Déramond [Sat, 27 Jun 2026 05:32:21 +0000 (07:32 +0200)] 
Bump html-validate from 11.4.0 to 11.5.3

2 weeks agoBump cspell from 10.0.0 to 10.0.1
Julien Déramond [Sat, 27 Jun 2026 05:30:58 +0000 (07:30 +0200)] 
Bump cspell from 10.0.0 to 10.0.1

2 weeks agoUpgrade to Astro v7 and remove `astro-auto-import` (#42576)
Julien Déramond [Sat, 27 Jun 2026 05:26:53 +0000 (07:26 +0200)] 
Upgrade to Astro v7 and remove `astro-auto-import` (#42576)

2 weeks agoAdd missing `hammer-simulator` to `.ncurc.json`
Julien Déramond [Sat, 27 Jun 2026 04:20:57 +0000 (06:20 +0200)] 
Add missing `hammer-simulator` to `.ncurc.json`

2 weeks agoMenu/Popover: setContent show gate + forms-in-menu auto-close (#42551)
Mark Otto [Sat, 27 Jun 2026 03:27:24 +0000 (20:27 -0700)] 
Menu/Popover: setContent show gate + forms-in-menu auto-close (#42551)

* Popover/Tooltip: allow showing content set only via setContent()

show() gated on _isWithContent(), which read config title/content and
ignored content supplied through setContent(). A popover whose content
was set only via setContent() could therefore never be shown. Count
setContent() content in the gate via a shared _hasNewContent() helper.
Fixes #40525.

* Menu: keep open when clicking inside a form within the menu

clearMenus only skipped auto-close for input/select/option/textarea/form
tag names, so clicking a form's label/button/etc. inside a menu closed it
— breaking the documented forms-in-menu example. Skip auto-close for any
click inside a form contained in the menu. Fixes #41803.

* Bump bundlewatch size thresholds

2 weeks agoTests: fix dialog/drawer dispose-while-open scroll-lock assertions (#42575)
Mark Otto [Sat, 27 Jun 2026 03:24:43 +0000 (20:24 -0700)] 
Tests: fix dialog/drawer dispose-while-open scroll-lock assertions (#42575)

* Tests: assert dialog-open on documentElement in dispose-while-open specs

The dispose-while-open specs added in #42544 asserted the scroll-lock
class on document.body, but #42545 moved the lock to the root element
(documentElement). The two changes were each green in isolation but
broke once both landed on v6-dev. Align these specs with the rest of
the suite, which already asserts on documentElement.

* Build: bump bundlewatch thresholds for cumulative JS growth on v6-dev

bootstrap.bundle.js (83.15KB) and bootstrap.js (54.39KB) now exceed the
prior thresholds after the dialog/drawer/tooltip/popover/menu fixes
landed; each PR bumped only relative to its own base.

2 weeks agoDocs: navbar menu buttons, menu JS toggle, delegated tooltips (#42552)
Mark Otto [Sat, 27 Jun 2026 03:16:06 +0000 (20:16 -0700)] 
Docs: navbar menu buttons, menu JS toggle, delegated tooltips (#42552)

* Docs: use <button> for navbar menu toggles instead of <a href="#">

A menu toggle is a button, not a link. Replace the navbar dropdown
toggles' `<a href="#" role="button">` with semantic `<button>`
(.nav-link already resets button styling). Fixes #40995.

* Docs: show how to open/close/toggle a menu via the JS API

The Via JavaScript section only showed instantiation. Add an example
using getOrCreateInstance().show()/hide()/toggle(). Fixes #37042.

* Docs: document delegated tooltips via the selector option

Add an example initializing one Tooltip on a parent with the selector
option to cover many (and dynamically-added) triggers. Fixes #41020.

2 weeks agoTooltip/Popover: fix prevented-show lockout and boolean title/content (#42548)
Mark Otto [Sat, 27 Jun 2026 03:15:56 +0000 (20:15 -0700)] 
Tooltip/Popover: fix prevented-show lockout and boolean title/content (#42548)

* Tooltip/Popover: reset hover state when show is prevented

A prevented (or not-in-DOM) show() returned early without clearing
_isHovered, leaving it stuck true. For click-triggered tips that made
every later click hit the _enter() early-return, so the tip never
reopened after one preventDefault(). Reset _isHovered on the early
return. Fixes #39861.

* Tooltip/Popover: coerce boolean title/content to strings

data-bs-title="true" / data-bs-content="false" are auto-converted to
booleans by the data-API, which failed the (null|string|element|function)
type check and threw. Extend the existing number-to-string coercion in
_configAfterMerge to booleans. Fixes #41925.

* Bump bundlewatch size thresholds

2 weeks agoTab: ignore modifier+arrow shortcuts; docs: menu Escape behavior (#42553)
Mark Otto [Sat, 27 Jun 2026 03:15:34 +0000 (20:15 -0700)] 
Tab: ignore modifier+arrow shortcuts; docs: menu Escape behavior (#42553)

* Tab: don't hijack modifier+arrow keyboard shortcuts

_keydown preventDefault'd arrow keys regardless of modifiers, so
Alt+Left/Right (browser history nav) and similar shortcuts were
swallowed inside a tablist. Ignore the event when alt/ctrl/meta is
held. Fixes #38565.

* Docs: clarify Escape behavior in menu auto-close section

Esc closes the menu while focus is within it (regardless of autoClose)
and returns focus to the toggle. Fixes #38035.

* Bump bundlewatch size thresholds

2 weeks agoTooltip/Popover/Menu: small fixes (contenteditable, arrow color, docs) (#42550)
Mark Otto [Sat, 27 Jun 2026 03:15:31 +0000 (20:15 -0700)] 
Tooltip/Popover/Menu: small fixes (contenteditable, arrow color, docs) (#42550)

* Menu: don't hijack arrow keys inside contenteditable elements

The keydown handler only exempted <input>/<textarea>, so arrow keys were
captured (and preventDefault'd) inside contenteditable hosts like rich-text
editors. Treat contenteditable targets like inputs. Fixes #41021.

* Popover: match bottom arrow fill to header background

A bottom-placed popover with a header had its arrow filled with
--popover-bg, so it didn't match the header it points into. Use
--popover-header-bg for the arrow when a header follows. Fixes #40993.

* Docs: clarify tooltip/popover title/content function arguments

The function receives the attached element as its first argument (and as
its this reference), not just this. Fixes #40571.

* Bump bundlewatch size thresholds

2 weeks agoDialog/Drawer: lock scroll on the root element to prevent layout shift (#42545)
Mark Otto [Sat, 27 Jun 2026 03:15:07 +0000 (20:15 -0700)] 
Dialog/Drawer: lock scroll on the root element to prevent layout shift (#42545)

* Dialog/Drawer: lock scroll on the root element to prevent layout shift

Apply the dialog-open scroll-lock (overflow: hidden) to the root <html>
element instead of <body>, so it sits on the same element as
scrollbar-gutter: stable. Co-locating them keeps the gutter reserved
while the scrollbar is hidden, so the page no longer shifts (and the
::backdrop covers the gutter instead of leaving a white strip) when a
dialog or drawer opens. Fixes #39221, #39972, #40908, #40659.

* Bump bundlewatch size thresholds

2 weeks agoDialog/Drawer: fix focus-restore scroll and dispose-while-open cleanup (#42544)
Mark Otto [Sat, 27 Jun 2026 03:14:40 +0000 (20:14 -0700)] 
Dialog/Drawer: fix focus-restore scroll and dispose-while-open cleanup (#42544)

* Dialog/Drawer: don't scroll the page when restoring focus on close

Pass { preventScroll: true } when returning focus to the trigger after
close, so the page no longer jumps to the trigger (or to the top when
scroll-padding-top is set). Fixes #38070, #41615, #35391.

* Dialog/Drawer: restore body scroll when disposed while open

dispose() now closes the native <dialog> and removes the dialog-open
body class if the instance is torn down while still open (e.g. an SPA
route change), instead of leaving overflow: hidden stuck on the body.
Fixes #35934, #39910.

* Bump bundlewatch size thresholds

2 weeks agoDocs: modify remaining `.link-offset-*` to `.underline-offset-*` usage (#42572)
Julien Déramond [Fri, 26 Jun 2026 18:07:39 +0000 (20:07 +0200)] 
Docs: modify remaining `.link-offset-*` to `.underline-offset-*` usage (#42572)

2 weeks agodocs: clarify form-adorn usage and input type (#42547)
Christian Oliff [Fri, 26 Jun 2026 16:02:18 +0000 (01:02 +0900)] 
docs: clarify form-adorn usage and input type (#42547)

2 weeks agoExamples: use `<code>` instead of backticks for Jumbotron example
Julien Déramond [Fri, 26 Jun 2026 04:55:21 +0000 (06:55 +0200)] 
Examples: use `<code>` instead of backticks for Jumbotron example

2 weeks agoExamples: remove unused `.text-small` and replace deprecated utilities (#42455)
Christian Oliff [Fri, 26 Jun 2026 04:40:10 +0000 (13:40 +0900)] 
Examples: remove unused `.text-small` and replace deprecated utilities (#42455)

Update multiple example pages to new utility naming and tokens for consistency. Replaced legacy text-*/display-*/bg-* classes with fg-*/fs-* and bg-subtle-* variants, adjusted spacing and radii (p-5 → p-9, rounded-3 → rounded-5), removed redundant text-small classes, and applied small/fg-white tweaks where appropriate. Files changed: checkout, headers, jumbotron, pricing, product, and sidebars examples to align markup with the updated design system.

---------

Co-authored-by: Julien Déramond <juderamond@gmail.com>
2 weeks agoDocs: modify remaining `.bg-{color}-subtle` to `.bg-subtle-{color}` usage (#42564)
Julien Déramond [Fri, 26 Jun 2026 04:10:45 +0000 (06:10 +0200)] 
Docs: modify remaining `.bg-{color}-subtle` to `.bg-subtle-{color}` usage (#42564)

2 weeks agoDocs: remove unused CalloutDeprecatedDarkVariants and DeprecatedIn shortcodes (#42563)
Julien Déramond [Fri, 26 Jun 2026 03:52:00 +0000 (05:52 +0200)] 
Docs: remove unused CalloutDeprecatedDarkVariants and DeprecatedIn shortcodes (#42563)

2 weeks agoFix JavaScript visual tests using `bootstrap` instance (#42562)
Julien Déramond [Thu, 25 Jun 2026 20:11:43 +0000 (22:11 +0200)] 
Fix JavaScript visual tests using `bootstrap` instance (#42562)

2 weeks agoBump actions/checkout from 6.0.3 to 7.0.0 (#42561)
dependabot[bot] [Thu, 25 Jun 2026 19:30:17 +0000 (21:30 +0200)] 
Bump actions/checkout from 6.0.3 to 7.0.0 (#42561)

Bumps the github-actions group with 1 update: [actions/checkout](https://github.com/actions/checkout).

Updates `actions/checkout` from 6.0.3 to 7.0.0
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/df4cb1c069e1874edd31b4311f1884172cec0e10...9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 7.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2 weeks agoPin `@babel/*` dependencies to 7.29.7 (#42560)
Julien Déramond [Thu, 25 Jun 2026 19:15:50 +0000 (21:15 +0200)] 
Pin `@babel/*` dependencies to 7.29.7 (#42560)

2 weeks agoBump npm-rul-all2 from 9.0.1 to 9.0.2
Julien Déramond [Thu, 25 Jun 2026 18:55:46 +0000 (20:55 +0200)] 
Bump npm-rul-all2 from 9.0.1 to 9.0.2

2 weeks agoBump rollup from 4.61.1 to 4.62.0 (#42558)
Julien Déramond [Thu, 25 Jun 2026 18:53:58 +0000 (20:53 +0200)] 
Bump rollup from 4.61.1 to 4.62.0 (#42558)

2 weeks agoBump js-yaml from 4.2.0 to 5.1.0 (#42555)
Julien Déramond [Thu, 25 Jun 2026 18:12:03 +0000 (20:12 +0200)] 
Bump js-yaml from 4.2.0 to 5.1.0 (#42555)

2 weeks agoBump Node in `.nvmrc` from 24.17.0 to 24.18.0
Julien Déramond [Thu, 25 Jun 2026 17:54:51 +0000 (19:54 +0200)] 
Bump Node in `.nvmrc` from 24.17.0 to 24.18.0

2 weeks agodist
Mark Otto [Wed, 24 Jun 2026 22:55:52 +0000 (15:55 -0700)] 
dist

3 weeks agoFloating labels: place label before control for screen readers (#42539)
Mark Otto [Tue, 23 Jun 2026 17:27:23 +0000 (10:27 -0700)] 
Floating labels: place label before control for screen readers (#42539)

Floating labels required the control to precede the `<label>` in the DOM
so the floating animation could use a sibling (`~`) selector. That order
made screen readers (e.g. NVDA) announce the label after the field's
value instead of before it.

Switch the SCSS to look forward with `:has()` so the `<label>` can come
first in the DOM while the CSS still reacts to the control's state
(focus, value, disabled, autofill). Reorder all examples, docs, and the
visual test to label-first markup to match.

Also give `.form-control-plaintext` its own copy of the control tokens so
its `var(--control-*)` references resolve, fixing phantom borders and
label misalignment.

Fixes #41362

3 weeks agoBump release-drafter/release-drafter from 7.3.1 to 7.4.0 (#42542)
dependabot[bot] [Tue, 23 Jun 2026 11:47:32 +0000 (13:47 +0200)] 
Bump release-drafter/release-drafter from 7.3.1 to 7.4.0 (#42542)

Bumps the github-actions group with 1 update: [release-drafter/release-drafter](https://github.com/release-drafter/release-drafter).

Updates `release-drafter/release-drafter` from 7.3.1 to 7.4.0
- [Release notes](https://github.com/release-drafter/release-drafter/releases)
- [Commits](https://github.com/release-drafter/release-drafter/compare/693d20e7c1ce1a81d3a41962f85914253b518449...ed4bc48ec97379be2258e7b7ac2624a3e26ab809)

---
updated-dependencies:
- dependency-name: release-drafter/release-drafter
  dependency-version: 7.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
3 weeks agoAdd Range plugin for track fill, value bubble, and tick marks (#42525)
Mark Otto [Mon, 22 Jun 2026 17:51:31 +0000 (10:51 -0700)] 
Add Range plugin for track fill, value bubble, and tick marks (#42525)

* Add Range plugin for track fill, value bubble, and tick marks

Adds an opt-in JavaScript plugin (`data-bs-range`) that enhances
`<input type="range">`. A consistent cross-browser fill can't be done
with pseudo-elements alone (only Firefox has `::-moz-range-progress`),
so the plugin publishes the current value as a `--bs-range-value`
custom property that the track gradient consumes.

- Fill: colored track up to the thumb, themeable via `--range-fill-bg`
- Value bubble (`data-bs-bubble`): floating value that tracks the thumb
- Tick marks (`data-bs-ticks`): generated from a linked `<datalist>`

The bubble and ticks are siblings of the input, so they don't inherit
the input's `--range-fill-bg`; the plugin copies the resolved value onto
them and the CSS falls back to `--primary-base` so they're never blank.

Plain `.form-range` inputs are untouched. Includes unit tests and docs.

* Range: anchor positioning on .form-range and rename track fill token

- Make `.form-range` the positioning context (`position: relative`) and
  drop the JS-added `.range-anchored` class; the bubble and ticks are
  siblings of the input, so they already share its offset parent.
- Rename `--range-fill-bg` to `--range-track-fill-bg` for accuracy.
- Keep SCSS custom properties unprefixed (the build adds `--bs-`) and
  have the plugin read/write the prefixed names, matching the codebase.
- Trim obvious comments.

* Bump bundlewatch JS size limits for the Range plugin

* Range: make it a JS component with a wrapper, consolidate the CSS

Restructure range as an always-JS component so the fill, value bubble,
and tick marks are driven by a single `--bs-range-fill` ratio in CSS.

- `.form-range` is now a wrapper that owns the tokens; the input takes
  `.form-range-input`. Children inherit the tokens, so the old JS color
  copying and px positioning are gone.
- The plugin only sets `--bs-range-fill` (0–1) and the bubble text; the
  track gradient, bubble position, and tick positions are pure CSS calc.
  Drops `_thumbWidth`, `_inheritFillColor`, the resize listener, and the
  `.range-anchored` class.
- Value bubble reuses the tooltip markup/styles instead of duplicating a
  pill and arrow. Tick marks are generated from the linked `<datalist>`
  and positioned per-value (handles uneven values); tick coloring dropped.
- Auto-inits every `.form-range`; rename fill token to
  `--range-track-fill-bg`.
- Validation moves to `.form-range-input` with a `:has()` feedback toggle.
- Add the "New" badge to the Range sidebar item and document the breaking
  changes in the migration guide.

* Range: lay out tick marks with CSS grid instead of absolute positioning

Build `grid-template-columns` from the gaps between the datalist values
so each tick lands on a grid line — this handles unevenly-spaced values
just like the old per-tick calc did, but keeps the ticks and their labels
in normal flow (the container sizes to fit the labels instead of them
overflowing an absolutely-positioned box). Inset by half the thumb so the
end ticks align with the thumb travel.

Also wraps the token map in the `custom-property-no-missing-var-function`
stylelint disable (matching _strength.scss). Includes the disabled-track
fill styling.

* Nudge bundlewatch JS limits after rebasing onto v6-dev

* fix bubble, grid, ticks, and more

* comment

3 weeks agoMenus: support nested toggles and fix submenu position flash (#42533)
Mark Otto [Sun, 21 Jun 2026 04:59:54 +0000 (21:59 -0700)] 
Menus: support nested toggles and fix submenu position flash (#42533)

* fix that

* update

3 weeks agofeat(a11y): use list-style-type "" instead of list-style none (#42526)
Mark Otto [Sun, 21 Jun 2026 04:52:17 +0000 (21:52 -0700)] 
feat(a11y): use list-style-type "" instead of list-style none (#42526)

In Safari, "list-style: none" removes the list semantic role, so lists are
no longer announced by screen readers. Using "list-style-type: \"\"" keeps the
same visual result while preserving the list role.

Ports twbs/bootstrap#41778 to v6, plus the new v6 list containers (stepper,
menu, docs search results). Summary marker removals (accordion header,
details summary) are intentionally left as "list-style: none".

3 weeks agoDrop deprecated `.card-link` remaining usage (#42529)
Julien Déramond [Sat, 20 Jun 2026 20:58:05 +0000 (22:58 +0200)] 
Drop deprecated `.card-link` remaining usage (#42529)

3 weeks agoDocs: remove mentions of deprecated `.btn-primary` and `.btn-success` (#42535)
Julien Déramond [Sat, 20 Jun 2026 20:57:46 +0000 (22:57 +0200)] 
Docs: remove mentions of deprecated `.btn-primary` and `.btn-success` (#42535)

3 weeks agoDrop deprecated `.modal-backdrop` class, and unused `util/backdrop.js` (#42538)
Julien Déramond [Sat, 20 Jun 2026 20:57:31 +0000 (22:57 +0200)] 
Drop deprecated `.modal-backdrop` class, and unused `util/backdrop.js` (#42538)

3 weeks agoDrop deprecated `.table-primary` and `.table-dark` remaining usage (#42537)
Julien Déramond [Sat, 20 Jun 2026 18:40:37 +0000 (20:40 +0200)] 
Drop deprecated `.table-primary` and `.table-dark` remaining usage (#42537)

3 weeks agoDrop deprecated `.m-{breakpoint}` remaining usage (#42536)
Julien Déramond [Sat, 20 Jun 2026 18:18:42 +0000 (20:18 +0200)] 
Drop deprecated `.m-{breakpoint}` remaining usage (#42536)

3 weeks agoBump Node in `.nvmrc` from 24.16.0 to 24.17.0
Julien Déramond [Sat, 20 Jun 2026 18:10:21 +0000 (20:10 +0200)] 
Bump Node in `.nvmrc` from 24.16.0 to 24.17.0

3 weeks agoDrop deprecated `.col-{breakpoint}` remaining usage (#42534)
Julien Déramond [Sat, 20 Jun 2026 17:52:20 +0000 (19:52 +0200)] 
Drop deprecated `.col-{breakpoint}` remaining usage (#42534)

3 weeks agoDrop deprecated `.dropup` remaining usage (#42532)
Julien Déramond [Sat, 20 Jun 2026 07:24:33 +0000 (09:24 +0200)] 
Drop deprecated `.dropup` remaining usage (#42532)

3 weeks agoFix visual JavaScript tests to load `bootstrap.bundle.js` as a module (#42531)
Julien Déramond [Sat, 20 Jun 2026 06:58:27 +0000 (08:58 +0200)] 
Fix visual JavaScript tests to load `bootstrap.bundle.js` as a module (#42531)

3 weeks agoDrop deprecated `.navbar-dark` remaining usage (#42530)
Julien Déramond [Sat, 20 Jun 2026 06:42:17 +0000 (08:42 +0200)] 
Drop deprecated `.navbar-dark` remaining usage (#42530)

3 weeks agoV6 more form fixes (#42523)
Mark Otto [Thu, 18 Jun 2026 03:54:48 +0000 (20:54 -0700)] 
V6 more form fixes (#42523)

* fix switch disabled checked

* fix selector for select bg

* fix radio disabled

* match disabled demos

* autocomplete off for date inputs

* fix floating label custom height

* fix disabled

3 weeks agoDrop deprecated `.alert-dismissible` remaining usage (#42520)
Julien Déramond [Thu, 18 Jun 2026 02:31:36 +0000 (04:31 +0200)] 
Drop deprecated `.alert-dismissible` remaining usage (#42520)

3 weeks agoConvert list group and card group to container queries (#42512)
Mark Otto [Thu, 18 Jun 2026 02:31:20 +0000 (19:31 -0700)] 
Convert list group and card group to container queries (#42512)

* Convert list group and card group to container queries

Replace viewport media queries with container queries for the responsive
.*:list-group-horizontal variants and the .card-group row layout, using the
existing container-breakpoint-up mixins. Both now respond to the width of a
parent query container (e.g., .contains-inline) rather than the viewport.

Update the docs to reflect the new behavior, flip css_media to container, and
list both components under the container queries guide.

* Document container query migration for card group and list group

* Fix doubled card-group borders by overlapping adjacent cards

The v6 border model moved borders off the outer .card onto the inner
segments (.card-header, .card-body, .card-list, .card-footer) and the card
images use outlines. The card-group seam code still removed border-inline-start
from .card, which no longer has a border, so adjacent cards rendered doubled
borders at every seam (body, header, and footer).

Pull each subsequent card back by one border width with a negative inline
margin so its leading edges overlap the previous card's trailing edge,
collapsing every seam into a single line.

* Fix doubled border between card body and footer

A middle .card-body/.card-list draws a bottom border to divide itself from the
next segment, but .card-footer draws a full border including its top edge, so
the shared seam rendered as a doubled border whenever a footer followed a body
that wasn't the first child (e.g. image + body + footer, or header + body +
footer). Drop the body/list bottom border when a footer immediately follows so
the footer owns that divider.

* Add icon, fix some copy

* fix

3 weeks agoDispose existing instance when a component is re-instantiated on an element (#42509)
Mark Otto [Thu, 18 Jun 2026 02:25:44 +0000 (19:25 -0700)] 
Dispose existing instance when a component is re-instantiated on an element (#42509)

Re-creating a component on an element that already has one (e.g. `new
Toast(el)` twice) silently overwrote the instances registry, orphaning the
previous instance with its event listeners and timers still attached. Dispose
the existing instance before registering the new one so it is cleaned up
instead of leaking, while keeping `getInstance()` returning the latest instance.

Also guard `_queueCallback` so a transition completion callback is skipped once
the instance has been disposed, preventing the `this._element is null` error
when `dispose()` is called mid-transition.

Closes #37245
Closes #41473

3 weeks agoCarousel: fix Safari zoom scroll overshoot with a JS-driven slide animation (#42506)
Mark Otto [Thu, 18 Jun 2026 02:20:58 +0000 (19:20 -0700)] 
Carousel: fix Safari zoom scroll overshoot with a JS-driven slide animation (#42506)

Under Safari page zoom, programmatic smooth scrolls (scrollBy/scrollTo with
behavior smooth) mis-scale and overshoot the target: a one-slide jump sails
well past it and the restored scroll-snap visibly yanks the slide back. This
happens whether or not snapping is suspended during the scroll, so no
snap-configuration tweak avoids it - native smooth scrolling driven by user
gestures is fine, but any programmatic smooth scroll is affected.

Replace the native smooth scroll + settle-watcher with a JS-driven rAF
animation (_animateScroll): step scrollLeft to the target over SCROLL_DURATION
(300ms) with an ease-in-out cubic, using instant scrolls per frame. This
sidesteps Safari's bug entirely and gives every programmatic jump (prev/next,
indicators, wrap, and the seamless loop) a consistent duration. Reduced motion
and the no-requestAnimationFrame path jump straight to target.

Removes the now-unneeded _restoreSnapWhenSettled/_afterScrollSettles
overshoot-detection machinery. Reworks the unit tests to the new seam and adds
coverage for the animator: eased stepping, frame cancellation, reduced motion,
and the no-rAF fallback.

3 weeks agoUse min/max width to prevent Close button collapsing in flex containers (#42518)
Julien Déramond [Wed, 17 Jun 2026 23:53:10 +0000 (01:53 +0200)] 
Use min/max width to prevent Close button collapsing in flex containers (#42518)

4 weeks agoBuild(deps-dev): Bump form-data from 4.0.5 to 4.0.6 (#42516)
dependabot[bot] [Tue, 16 Jun 2026 13:22:53 +0000 (15:22 +0200)] 
Build(deps-dev): Bump form-data from 4.0.5 to 4.0.6 (#42516)

Bumps [form-data](https://github.com/form-data/form-data) from 4.0.5 to 4.0.6.
- [Release notes](https://github.com/form-data/form-data/releases)
- [Changelog](https://github.com/form-data/form-data/blob/master/CHANGELOG.md)
- [Commits](https://github.com/form-data/form-data/compare/v4.0.5...v4.0.6)

---
updated-dependencies:
- dependency-name: form-data
  dependency-version: 4.0.6
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
4 weeks agoBuild(deps-dev): Bump dependencies with 3 updates (#42517)
dependabot[bot] [Tue, 16 Jun 2026 13:15:32 +0000 (15:15 +0200)] 
Build(deps-dev): Bump dependencies with 3 updates (#42517)

Bumps the development-dependencies group with 3 updates in the / directory: [jasmine](https://github.com/jasmine/jasmine-npm), [prettier](https://github.com/prettier/prettier) and [rollup](https://github.com/rollup/rollup).

Updates `jasmine` from 6.2.0 to 6.3.0
- [Release notes](https://github.com/jasmine/jasmine-npm/releases)
- [Changelog](https://github.com/jasmine/jasmine-npm/blob/main/RELEASE.md)
- [Commits](https://github.com/jasmine/jasmine-npm/compare/v6.2.0...v6.3.0)

Updates `prettier` from 3.8.3 to 3.8.4
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/3.8.3...3.8.4)

Updates `rollup` from 4.61.0 to 4.61.1
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.61.0...v4.61.1)

---
updated-dependencies:
- dependency-name: jasmine
  dependency-version: 6.3.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: development-dependencies
- dependency-name: prettier
  dependency-version: 3.8.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: development-dependencies
- dependency-name: rollup
  dependency-version: 4.61.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: development-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
4 weeks agoBuild(deps): Bump github/codeql-action from 4.36.1 to 4.36.2 (#42515)
dependabot[bot] [Tue, 16 Jun 2026 13:00:44 +0000 (15:00 +0200)] 
Build(deps): Bump github/codeql-action from 4.36.1 to 4.36.2 (#42515)

Bumps the github-actions group with 1 update: [github/codeql-action](https://github.com/github/codeql-action).

Updates `github/codeql-action` from 4.36.1 to 4.36.2
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/87557b9c84dde89fdd9b10e88954ac2f4248e463...8aad20d150bbac5944a9f9d289da16a4b0d87c1e)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.36.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
4 weeks agoRe-run dist with latest browser support, plus some fixes (#42505)
Mark Otto [Fri, 12 Jun 2026 04:24:29 +0000 (21:24 -0700)] 
Re-run dist with latest browser support, plus some fixes (#42505)

* Rebuild dist with latest changes

* Remove unused carousel items utils

* Prevent duplicate mask properties with webkit prefix that is unnecessary

* Remove unused stacked submenu code

* Clean up some incomplete sizing

* Remove more redundant shit

4 weeks agoAllow dismissing tooltips and popovers with the Escape key (#42472)
Mark Otto [Thu, 11 Jun 2026 18:57:03 +0000 (11:57 -0700)] 
Allow dismissing tooltips and popovers with the Escape key (#42472)

* Allow dismissing tooltips and popovers with the Escape key

* update

4 weeks agoRework OTP input as a single accessible input with rendered slots (#42500)
Mark Otto [Thu, 11 Jun 2026 16:56:38 +0000 (09:56 -0700)] 
Rework OTP input as a single accessible input with rendered slots (#42500)

* Rework OTP input as a single accessible input with rendered slots

Rebuild the OTP component around one real <input> rendered as separate
digit slots (the input-otp/shadcn model) so assistive tech, password
managers, and SMS autofill treat it as a single field — addressing the
accessibility feedback in twbs/discussions#42486.

- Replace the six-input markup and per-digit aria-labels with one labelled input
- Add a type option (numeric/alphanumeric/alpha) and glyph-based masking
- Make length a real option (falls back to maxlength); add groups/separator
- Standardize naming on bs.otpInput; events complete.bs.otpInput /
  input.bs.otpInput now expose event.value
- Move validation styling onto the rendered .otp-slot elements
- Rewrite docs and unit tests for the single-input model

* Fix bundlewatch sizes and cspell dictionary for OTP input

- Bump bundlewatch maxSize thresholds to account for the OTP component
- Add "autofilled" to the cspell dictionary used in the OTP docs

* bump bundle

4 weeks agoFix dark mode on built site by bumping browserslist (#42471)
Mark Otto [Thu, 11 Jun 2026 16:48:28 +0000 (09:48 -0700)] 
Fix dark mode on built site by bumping browserslist (#42471)

* Fix dark mode on built site by avoiding Lightning CSS light-dark() polyfill

Lightning CSS was lowering native light-dark() to a --lightningcss-light/dark
custom-property toggle because our browserslist floors predated native support.
That polyfill breaks data-bs-theme dark mode on the minified (production) CSS,
so dark examples rendered light on Netlify while working in dev.

- Bump browserslist floors to the first versions with native light-dark()
  (Chrome/Edge 123, Safari/iOS 17.5; Firefox 121 already covered)
- Exclude Features.LightDark in css-minify as a guard against regressions

* Update .browserslistrc for browser support and comments

Removed comment about CSS light-dark polyfill and updated browser support.

* Bump browserslist floors to Chrome/Edge 130, Firefox 132, Safari/iOS 18

Raises support floors as far as possible while keeping ~90.8% global
coverage, staying on versions with native light-dark() so Lightning CSS
does no polyfilling.

4 weeks agoCarousel: scroll-snap rebuild, opt-in autoplay, play/pause, and UI redesign (#42484)
Mark Otto [Thu, 11 Jun 2026 16:46:59 +0000 (09:46 -0700)] 
Carousel: scroll-snap rebuild, opt-in autoplay, play/pause, and UI redesign (#42484)

* Make carousel autoplay opt-in via boolean `autoplay` option

Replace the `ride` option with a boolean `autoplay` option (default
`false`), so carousels are static by default and only autoplay when
explicitly opted in with `data-bs-autoplay="true"`.

This removes the confusing `ride="true"` behavior that started
autoplaying only after the first user interaction, and the cryptic
`ride="carousel"` string value. Addresses the first two points of #32649.

* Stop carousel autoplay on interaction and add play/pause control

Address the WCAG 2.2.2 (Pause, Stop, Hide) concern in #32649.

Behavior: once a user takes control of an autoplaying carousel — clicking
a control or indicator, using the keyboard, or swiping — autoplay stops
for good instead of resuming, respecting their intent. A new runtime
`_playing` flag tracks autoplay intent and gates `_maybeEnableCycle()`.

Control: add a `.carousel-control-play-pause` button as the discoverable
pause/stop mechanism WCAG actually requires (a hover-only pause does not
qualify). It toggles autoplay, reflects state by swapping its icon (via
pause-fill/play-fill CSS mask icons) and `aria-label`, and can also start
autoplay on an otherwise static carousel.

Includes unit tests, SCSS tokens/styles with dark-mode support, docs, and
a migration note.

* Rebuild carousel on CSS scroll snap

Replace the float/translateX engine and custom swipe handler with a native
horizontal scroll-snap container. Sliding, touch dragging, momentum, and
keyboard scrolling now come from the browser; JavaScript only layers on
autoplay, the prev/next/indicator controls, and active-slide syncing via an
IntersectionObserver.

This unlocks features the old engine couldn't do, all via CSS custom
properties on `.carousel`:

- Multiple slides per view (`--carousel-items`) with responsive
  `.carousel-items-*` utilities
- Peek of adjacent slides (`--carousel-peek`) and gaps (`--carousel-gap`)
- Variable-width slides (`.carousel-auto`) and center mode (`.carousel-center`)

`.carousel-fade` becomes a stacked-opacity mode that upgrades to a View
Transition where supported. `touch: false` now applies `touch-action: pan-y`.
The markup, public JS API, and slide/slid events are preserved; the
transitional `.carousel-item-{start,end,next,prev}` classes and the
`.carousel.pointer-event` helper are removed.

Includes a full unit-test rewrite, SCSS engine, docs with multi-item/peek/
variable-width examples, and a migration entry.

* Add carousel stacked layout and dot indicator variants

Rename the per-slide layout tokens for clarity and add new layout options:

- `--carousel-peek` -> `--carousel-items-peek`, `--carousel-gap` ->
  `--carousel-items-gap` (both now carry a length unit so they're safe inside
  the flex-basis `calc()`)
- New `--carousel-gap` for spacing the stacked layout's rows
- New `.carousel-stacked` layout (controls outside the inner viewport, above or
  below) and `.carousel-indicators-dots` round indicator style
- Fix the `.carousel-item` flex-basis so the peek isn't subtracted twice (the
  `padding-inline` already insets the content box)

* Add carousel `ends` option (stop/wrap/loop) and robust scroll navigation

Replace the `wrap` boolean with an `ends` option taking `stop`, `wrap`
(default), or `loop`:

- `stop` disables the prev/next controls at each end (moving focus to the
  opposite control first, so focus is never lost)
- `wrap` jumps from the last slide back to the first (and vice versa)
- `loop` continues seamlessly into a transient clone of the destination slide,
  then teleports to the real one with no visible backward jump (single-slide
  scroll layouts only; otherwise falls back to `wrap`)

Rework programmatic navigation to scroll the viewport directly with `scrollBy`
instead of `scrollIntoView`, suspending scroll-snap for the duration and
restoring it once the scroll settles. This fixes multi-slide jumps (indicator
clicks, reaching the last slide) that `scroll-snap-stop: always` previously
clamped to one slide, avoids yanking the page to an off-screen carousel, and
works in RTL. Navigation steps are now measured from the live scroll position
so a stale active index can't make a control silently no-op.

Includes unit tests covering the ends modes, the loop transition, end-control
disabling, and the scroll-settle behavior.

* Document carousel end behavior, stacked layout, and indicator variants

Add docs and examples for the new stacked carousels (top, bottom, and with
dot indicators), the `ends` option (wrap/stop/loop) under a new "End behavior"
section, and refresh the options table and intro for the scroll-snap model.

* Redesign carousel controls, indicators, and layout

- `.carousel` is now a flex column by default (controls/indicators sit in the
  flow above or below the slides); overlaying them on top of the slides moves
  to a new `.carousel-overlay` modifier.
- Rename the control-icon classes to `.carousel-icon-{prev,next,pause,play}`,
  painted with `currentcolor` so they inherit the surrounding text/button color
  and work inside `.btn-*`. `.carousel-control-play-pause` is now just a
  behavior hook that shows the matching glyph via `.paused`.
- Redesign indicators as pills: the active one widens, and while autoplaying it
  fills like a progress bar over the slide's interval
  (`carousel-indicator-progress` keyframes driven by `--carousel-interval`).
- Remove `.carousel-caption` and its `--carousel-caption-*` tokens.

* Add carousel autoplay progress, drop `touch` option and View Transitions

- While cycling, toggle a `.carousel-playing` class and expose the wait as
  `--carousel-interval` so CSS can animate the active indicator's progress
  fill. Schedule each tick from the slide being navigated *to*, so per-item
  `data-bs-interval`s don't lag a slide behind.
- Remove the `touch` option: horizontal dragging is part of the native
  scroll-snap container, so there's nothing left for JavaScript to toggle.
- Fade is now a plain CSS opacity crossfade; drop the View Transition path,
  which double-animated against the CSS transition and visibly stuttered.

* Update carousel docs, examples, and fixtures for the redesign

Switch the docs examples, homepage/cheatsheet examples, and test fixtures to
`.carousel-overlay` + `.carousel-icon-*` and drop `.carousel-caption`. Document
the stacked-by-default layout, the `.carousel-overlay` modifier, the renamed
control-icon classes, the autoplay progress indicator, and the removed `touch`
option and captions in the migration guide.

* fix bundlewatch

* Fix MDX emphasis-style lint error in migration guide

* Default carousel `ends` to `loop`

Change the default end behavior from `wrap` to `loop`, so carousels scroll
seamlessly past the ends by default (falling back to `wrap` where seamless
looping doesn't apply). Tests that exercise the wrap jump now request it
explicitly.

* Clean up carousel styles and refresh docs

- Remove the legacy `--carousel-control-*` tokens and the entire
  `carousel-dark-*` token map / `.carousel-dark` block and dark color-mode
  rule; dark styling now rides on `light-dark()` in `.carousel-overlay`.
- Flip RTL prev/next icons with `transform: scaleX(-1)` instead of swapping
  mask images, and drop the dead commented-out overlay rules.
- Drop the now-unused `colors` and `color-mode` Sass imports.
- Docs: lead the end-behavior section with `loop` (the new default), rework
  the dark example onto `.carousel-overlay-controls` + `.btn-*` controls, and
  round the slide corners.

* Remove unused `$enable-dark-mode` Sass flag

Its last consumer was the carousel's dark color-mode block, now removed in
favor of `light-dark()`, so the flag is no longer referenced anywhere.

* Clean up carousel autoplay timer and listeners on dispose

Clear the pending autoplay timer in `dispose()` so a queued tick can't fire
after teardown and throw on the now-null `_element`, and remove the
`pointerdown` listener bound to the viewport (`.carousel-inner`)—which
`super.dispose()` doesn't cover, since it only drops listeners on `_element`.
Adds tests for both.

* Simplify carousel active indicator tokens

Drop the `--carousel-indicator-active-width` and `--carousel-indicator-active-bg`
tokens, which only carried `null` fallbacks, and inline their values directly on
the active indicator.

* Use button controls in carousel examples, fixtures, and docs

Replace the removed `.carousel-control-prev`/`.carousel-control-next` classes
with `.btn-icon btn-sm` buttons across the docs examples, homepage and cheatsheet
examples, and JS test fixtures. Also drop the leftover `.carousel-indicators-dots`
class and the obsolete "Custom transition" docs section, and correct the
peek/gap token names (`--carousel-items-peek`/`-gap`) in the migration guide.

* Remove `$enable-dark-mode` from the customization docs

Follow-up to removing the now-unused flag: drop its row from the global options
table and the sentence about disabling dark mode via Sass.

* Bump JS bundlewatch size limits for the carousel rewrite

* Harden carousel navigation, looping, and autoplay edge cases

Audit fixes:
- Measure the "current" slide in `to()` from the live scroll position
  (`_navIndex()`) rather than the async `_activeIndex`, so an indicator/control
  used mid-scroll compares against where the viewport actually rests.
- Validate the `ends` option in `_configAfterMerge`, falling back to the
  default (`loop`) for unknown values so navigation and end-control logic agree.
- Strip ids from the entire cloned subtree during a loop transition, not just
  the clone root, to avoid duplicate ids while the clone is on screen.
- Sync the active slide and fire `slid` after a programmatic scroll settles
  when no IntersectionObserver is available.
- Stop autoplay at the last slide under `ends: 'stop'` instead of re-arming a
  timer that can never advance.

Adds tests for each, plus hover-pause and dispose-mid-loop coverage.

* Remove unused `--carousel-indicator-opacity` token

The redesigned pill indicators no longer fade via opacity, so the token has no
remaining consumers.

* Expand carousel docs, examples, and migration notes

- Document the `ends` option, the removed `.carousel-control-*` / `.carousel-dark`
  classes and v5 tokens, and the removed `$enable-dark-mode` flag in the
  migration guide.
- Clarify the `.active` starting-slide and indicator notes, theme the overlay
  example controls (`.btn-subtle .theme-secondary`), rework the per-item
  interval example with a play/pause control, and sharpen the `slid` event
  description.
- Add a play/pause control to the integration fixture, and fix a corrupted
  custom-property reference in the homepage carousel example CSS.

* Bump JS bundlewatch limits for carousel audit fixes

4 weeks agoAdd `.fg-reset` text utility (#42495)
Julien Déramond [Thu, 11 Jun 2026 05:21:38 +0000 (07:21 +0200)] 
Add `.fg-reset` text utility (#42495)

4 weeks agoDocs: fix 'Icon link > Sass utilities API' example (#42498)
Julien Déramond [Wed, 10 Jun 2026 19:04:26 +0000 (21:04 +0200)] 
Docs: fix 'Icon link > Sass utilities API' example (#42498)

4 weeks agoReplaced deprecated `.text-light` remaining usage by `.fg-body`
Julien Déramond [Wed, 10 Jun 2026 18:48:13 +0000 (20:48 +0200)] 
Replaced deprecated `.text-light` remaining usage by `.fg-body`

4 weeks agoDrop deprecated `.text-muted` remaining usage (#42496)
Julien Déramond [Wed, 10 Jun 2026 18:21:22 +0000 (20:21 +0200)] 
Drop deprecated `.text-muted` remaining usage (#42496)

4 weeks agoDrop deprecated `.has-validation` remaining usage (#42494)
Julien Déramond [Wed, 10 Jun 2026 17:43:31 +0000 (19:43 +0200)] 
Drop deprecated `.has-validation` remaining usage (#42494)

5 weeks agoBuild(deps-dev): Bump shell-quote from 1.8.3 to 1.8.4 (#42493)
dependabot[bot] [Tue, 9 Jun 2026 20:11:51 +0000 (22:11 +0200)] 
Build(deps-dev): Bump shell-quote from 1.8.3 to 1.8.4 (#42493)

Bumps [shell-quote](https://github.com/ljharb/shell-quote) from 1.8.3 to 1.8.4.
- [Changelog](https://github.com/ljharb/shell-quote/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ljharb/shell-quote/compare/v1.8.3...v1.8.4)

---
updated-dependencies:
- dependency-name: shell-quote
  dependency-version: 1.8.4
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
5 weeks agoBuild(deps-dev): Bump dependencies with 2 updates (#42491)
dependabot[bot] [Tue, 9 Jun 2026 20:02:10 +0000 (22:02 +0200)] 
Build(deps-dev): Bump dependencies with 2 updates (#42491)

Bumps the development-dependencies group with 2 updates in the / directory: [js-yaml](https://github.com/nodeca/js-yaml) and [rollup](https://github.com/rollup/rollup).

Updates `js-yaml` from 4.1.1 to 4.2.0
- [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nodeca/js-yaml/commits)

Updates `rollup` from 4.60.4 to 4.61.0
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.60.4...v4.61.0)

---
updated-dependencies:
- dependency-name: js-yaml
  dependency-version: 4.2.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: development-dependencies
- dependency-name: rollup
  dependency-version: 4.61.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: development-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
5 weeks agoBuild(deps): Bump the github-actions group with 2 updates (#42492)
dependabot[bot] [Tue, 9 Jun 2026 19:44:32 +0000 (21:44 +0200)] 
Build(deps): Bump the github-actions group with 2 updates (#42492)

Bumps the github-actions group with 2 updates: [actions/checkout](https://github.com/actions/checkout) and [github/codeql-action](https://github.com/github/codeql-action).

Updates `actions/checkout` from 6.0.2 to 6.0.3
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/de0fac2e4500dabe0009e67214ff5f5447ce83dd...df4cb1c069e1874edd31b4311f1884172cec0e10)

Updates `github/codeql-action` from 4.36.0 to 4.36.1
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/7211b7c8077ea37d8641b6271f6a365a22a5fbfa...87557b9c84dde89fdd9b10e88954ac2f4248e463)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 6.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: github/codeql-action
  dependency-version: 4.36.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
5 weeks agoReplaced deprecated `.bg-opacity-*` remaining usage by `.bg-*` (#42490)
Julien Déramond [Mon, 8 Jun 2026 19:17:08 +0000 (21:17 +0200)] 
Replaced deprecated `.bg-opacity-*` remaining usage by `.bg-*` (#42490)

5 weeks agoDrop deprecated `.accordion-collapse` remaining usage (#42489)
Julien Déramond [Mon, 8 Jun 2026 18:18:27 +0000 (20:18 +0200)] 
Drop deprecated `.accordion-collapse` remaining usage (#42489)

5 weeks agoDrop deprecated `.accordion-button` remaining usage (#42488)
Julien Déramond [Mon, 8 Jun 2026 18:11:59 +0000 (20:11 +0200)] 
Drop deprecated `.accordion-button` remaining usage (#42488)

5 weeks agoImprove Security Policy score (#42481)
Julien Déramond [Mon, 8 Jun 2026 04:33:04 +0000 (06:33 +0200)] 
Improve Security Policy score (#42481)

5 weeks agoDocs: add missing `role='button'` to `<a>` menus (#42483)
Julien Déramond [Sun, 7 Jun 2026 20:00:38 +0000 (22:00 +0200)] 
Docs: add missing `role='button'` to `<a>` menus (#42483)

5 weeks agoFix `falsie` → `falsely` typo in `js/src/util/index.js` comment (#42478)
ANDI FAUZAN HEDIANTORO [Sun, 7 Jun 2026 17:53:20 +0000 (00:53 +0700)] 
Fix `falsie` → `falsely` typo in `js/src/util/index.js` comment (#42478)

5 weeks agoDocs: fix Incident Response link to `SECURITY.md` (#42468)
ifer47 [Sun, 7 Jun 2026 09:15:44 +0000 (17:15 +0800)] 
Docs: fix Incident Response link to `SECURITY.md` (#42468)

Co-authored-by: yangkangkang <yangkangkang@wps.cn>
Co-authored-by: Julien Déramond <juderamond@gmail.com>
5 weeks agoUse `node-version-file` in GitHub workflows (#42416)
Rishikesh183 [Sun, 7 Jun 2026 08:45:43 +0000 (14:15 +0530)] 
Use `node-version-file` in GitHub workflows (#42416)

Co-authored-by: Julien Déramond <juderamond@gmail.com>
5 weeks agoBump dependencies (#42475)
Julien Déramond [Sat, 6 Jun 2026 15:19:38 +0000 (17:19 +0200)] 
Bump dependencies (#42475)

- `@astrojs/mdx`: 5.0.6 → 6.0.1
- `@shikijs/transformers`: 4.0.2 → 4.1.0
- `astro`: 6.3.7 → 6.4.3
- `eslint`: 10.2.1 → 10.4.1
- `eslint-config-xo`: 0.51.0 → 0.52.0
- `globals`: 17.5.0 → 17.6.0
- `html-validate`: 10.13.1 → 11.4.0
- `pagefind`: 1.5.0 → 1.5.2
- `playwright`: 1.59.1 → 1.60.0
- `sass`: 1.99.0 → 1.100.0
- `yaml`: 2.8.3 → 2.9.0

5 weeks agoBuild(deps-dev): Bump dependencies with 9 updates (#42474)
dependabot[bot] [Sat, 6 Jun 2026 14:43:25 +0000 (16:43 +0200)] 
Build(deps-dev): Bump dependencies with 9 updates (#42474)

Bumps the development-dependencies group with 9 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [@astrojs/markdown-remark](https://github.com/withastro/astro/tree/HEAD/packages/markdown/remark) | `7.1.2` | `7.2.0` |
| [@astrojs/sitemap](https://github.com/withastro/astro/tree/HEAD/packages/integrations/sitemap) | `3.7.2` | `3.7.3` |
| [@babel/cli](https://github.com/babel/babel/tree/HEAD/packages/babel-cli) | `7.28.6` | `7.29.7` |
| [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) | `7.29.0` | `7.29.7` |
| [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) | `7.29.5` | `7.29.7` |
| [@rollup/plugin-babel](https://github.com/rollup/plugins/tree/HEAD/packages/babel) | `7.0.0` | `7.1.0` |
| [find-unused-sass-variables](https://github.com/XhmikosR/find-unused-sass-variables) | `6.2.0` | `6.2.1` |
| [npm-run-all2](https://github.com/bcomnes/npm-run-all2) | `9.0.0` | `9.0.1` |
| [terser](https://github.com/terser/terser) | `5.47.1` | `5.48.0` |

Updates `@astrojs/markdown-remark` from 7.1.2 to 7.2.0
- [Release notes](https://github.com/withastro/astro/releases)
- [Changelog](https://github.com/withastro/astro/blob/main/packages/markdown/remark/CHANGELOG.md)
- [Commits](https://github.com/withastro/astro/commits/@astrojs/markdown-remark@7.2.0/packages/markdown/remark)

Updates `@astrojs/sitemap` from 3.7.2 to 3.7.3
- [Release notes](https://github.com/withastro/astro/releases)
- [Changelog](https://github.com/withastro/astro/blob/main/packages/integrations/sitemap/CHANGELOG.md)
- [Commits](https://github.com/withastro/astro/commits/@astrojs/sitemap@3.7.3/packages/integrations/sitemap)

Updates `@babel/cli` from 7.28.6 to 7.29.7
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.29.7/packages/babel-cli)

Updates `@babel/core` from 7.29.0 to 7.29.7
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.29.7/packages/babel-core)

Updates `@babel/preset-env` from 7.29.5 to 7.29.7
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.29.7/packages/babel-preset-env)

Updates `@rollup/plugin-babel` from 7.0.0 to 7.1.0
- [Changelog](https://github.com/rollup/plugins/blob/master/packages/babel/CHANGELOG.md)
- [Commits](https://github.com/rollup/plugins/commits/babel-v7.1.0/packages/babel)

Updates `find-unused-sass-variables` from 6.2.0 to 6.2.1
- [Release notes](https://github.com/XhmikosR/find-unused-sass-variables/releases)
- [Commits](https://github.com/XhmikosR/find-unused-sass-variables/compare/v6.2.0...v6.2.1)

Updates `npm-run-all2` from 9.0.0 to 9.0.1
- [Release notes](https://github.com/bcomnes/npm-run-all2/releases)
- [Changelog](https://github.com/bcomnes/npm-run-all2/blob/master/CHANGELOG.md)
- [Commits](https://github.com/bcomnes/npm-run-all2/compare/v9.0.0...v9.0.1)

Updates `terser` from 5.47.1 to 5.48.0
- [Changelog](https://github.com/terser/terser/blob/master/CHANGELOG.md)
- [Commits](https://github.com/terser/terser/compare/v5.47.1...v5.48.0)

---
updated-dependencies:
- dependency-name: "@astrojs/markdown-remark"
  dependency-version: 7.2.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: development-dependencies
- dependency-name: "@astrojs/sitemap"
  dependency-version: 3.7.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: development-dependencies
- dependency-name: "@babel/cli"
  dependency-version: 7.29.7
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: development-dependencies
- dependency-name: "@babel/core"
  dependency-version: 7.29.7
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: development-dependencies
- dependency-name: "@babel/preset-env"
  dependency-version: 7.29.7
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: development-dependencies
- dependency-name: "@rollup/plugin-babel"
  dependency-version: 7.1.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: development-dependencies
- dependency-name: find-unused-sass-variables
  dependency-version: 6.2.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: development-dependencies
- dependency-name: npm-run-all2
  dependency-version: 9.0.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: development-dependencies
- dependency-name: terser
  dependency-version: 5.48.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: development-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
5 weeks agoBuild(deps): Bump the github-actions group with 2 updates (#42464)
dependabot[bot] [Sat, 6 Jun 2026 14:33:29 +0000 (16:33 +0200)] 
Build(deps): Bump the github-actions group with 2 updates (#42464)

Bumps the github-actions group with 2 updates: [github/codeql-action](https://github.com/github/codeql-action) and [release-drafter/release-drafter](https://github.com/release-drafter/release-drafter).

Updates `github/codeql-action` from 4.35.5 to 4.36.0
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/9e0d7b8d25671d64c341c19c0152d693099fb5ba...7211b7c8077ea37d8641b6271f6a365a22a5fbfa)

Updates `release-drafter/release-drafter` from 7.3.0 to 7.3.1
- [Release notes](https://github.com/release-drafter/release-drafter/releases)
- [Commits](https://github.com/release-drafter/release-drafter/compare/c2e2804cc59f45f57076a99af580d0fedb697927...693d20e7c1ce1a81d3a41962f85914253b518449)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.36.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: release-drafter/release-drafter
  dependency-version: 7.3.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
5 weeks agoMove SVGs to CSS masks (#42465)
Mark Otto [Fri, 5 Jun 2026 03:09:03 +0000 (20:09 -0700)] 
Move SVGs to CSS masks (#42465)

* Move SVGs to CSS masks

* update migration, remove unused, fix a couple things

* Format

* Bump bundlewatch

* Properly size btn-close with mask

* Apply .check class directly to checkbox input, drop wrapper

The .check wrapper existed only to host the checkmark pseudo-element.
Since appearance: none controls render pseudo-elements (as .radio already
relies on), move .check onto the <input> itself and draw the checked/
indeterminate mark via a masked ::before. Removes the grid/:has machinery
and makes checkbox and radio markup symmetric.

* Use .form-field for list group radio example, matching checkboxes

5 weeks agodocs: fix menu clipping in resizable examples + configurable dev port (#42470)
Mark Otto [Thu, 4 Jun 2026 23:19:56 +0000 (16:19 -0700)] 
docs: fix menu clipping in resizable examples + configurable dev port (#42470)

* docs: prevent menus from being clipped in resizable examples

The resizable container needs overflow: hidden for the CSS resize handle to
work, which clips menus/dropdowns when they open. Render them with a fixed
positioning strategy in the live preview only so they can spill outside the
container, leaving the displayed markup untouched.

* docs: make the Astro dev server port configurable via PORT

Default to 9001 but allow PORT to override the dev/preview server port so
multiple worktrees can run side by side without colliding.

5 weeks agodocs: fix wording and responsive utility examples (#42458)
Christian Oliff [Wed, 3 Jun 2026 21:14:37 +0000 (06:14 +0900)] 
docs: fix wording and responsive utility examples (#42458)

Copy edits across several docs pages: clarify .btn usage and theme classes (button.mdx); correct repeated/awkward 'drawer' phrasing and update responsive breakpoint syntax to the colon form (drawer.mdx); remove duplicated 'drawer' wording and clean navbar responsive copy (navbar.mdx); update Sass guidance from @import to @use/@forward terminology (customize/optimize.mdx); clarify 'modal' → 'modal dialog' and update form validation guidance to use data-bs-validate and :user-invalid (getting-started/approach.mdx); and revise display utility docs to show the new .{breakpoint}:d-{value} syntax with example adjustments (utilities/display.mdx).