Compare commits

...
Sign in to create a new pull request.

146 commits

Author SHA1 Message Date
XhmikosR
1d8bc95c92
Update zip-examples.js (#32799)
Remove previously created zip files before creating a new one
2021-01-14 13:28:39 +02:00
dependabot[bot]
63880e0e8c
Bump karma from 5.2.3 to 6.0.0 (#32797)
Bumps [karma](https://github.com/karma-runner/karma) from 5.2.3 to 6.0.0.
- [Release notes](https://github.com/karma-runner/karma/releases)
- [Changelog](https://github.com/karma-runner/karma/blob/master/CHANGELOG.md)
- [Commits](https://github.com/karma-runner/karma/compare/v5.2.3...v6.0.0)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2021-01-14 13:00:17 +02:00
XhmikosR
8c1444f00a
CI: change Node.js to 14 (#32796)
This is so that it's consistent with the JS workflow thus the cache should match.
2021-01-14 12:51:14 +02:00
Patrick H. Lauke
949fa30152
Remove role="button" from CTA links in carousel examples (#32788)
They're links, acting as links. Just because they're styled as buttons visually doesn't mean they need/get `role="button"`
2021-01-14 01:54:25 +02:00
voltaek
f7d3870567
Docs v5: Fix Sass rounding precision and state Sass implementation (#32512)
* Add Sass section to Getting Started > Build Tools, mention Sass implementation used, mention current precision of 10 due to Dart Sass, and mention recommended minimum precision (value of 6 used in BS v4). Remove outdated Sass precision from Customize > Sass docs page.

* Remove more mentions of deprecated Sass implementations. Add links to Sass compiler mentions so we can keep all pertinent Sass compiler information in just one location instead of spread through the docs, which makes it hard to find the details and/or keep them up-to-date.

Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2021-01-14 00:41:42 +02:00
XhmikosR
157a27d43d
build-plugins: build Base component too (#32313) 2021-01-14 00:35:57 +02:00
dependabot[bot]
1b46601ce8
Bump eslint-plugin-unicorn from 25.0.1 to 26.0.1 (#32784)
* Bump eslint-plugin-unicorn from 25.0.1 to 26.0.1

Bumps [eslint-plugin-unicorn](https://github.com/sindresorhus/eslint-plugin-unicorn) from 25.0.1 to 26.0.1.
- [Release notes](https://github.com/sindresorhus/eslint-plugin-unicorn/releases)
- [Commits](https://github.com/sindresorhus/eslint-plugin-unicorn/compare/v25.0.1...v26.0.1)

Signed-off-by: dependabot[bot] <support@github.com>

* Updates for `eslint-plugin-unicorn@26.0.1`

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2021-01-14 00:29:26 +02:00
Mark Otto
80c0d4deab
Add mention of CSPs and SVGs (#32759)
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2021-01-14 00:15:18 +02:00
XhmikosR
f95004f654
Revert "docs: Fix popover example showing above navbar (#32445)" (#32533)
This reverts commit 517446069a.
2021-01-13 22:51:39 +02:00
Rohit Sharma
c9cd741aff
Throw a TypeError instead of the generic Error (#32585)
* Change from Error to TypeError

* Convert the `NAME` to upper case to make the consistency in the error message

* Update the remaining tests to be stricter

Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2021-01-13 22:13:30 +02:00
Rohit Sharma
e34481b6eb
Fix toggling modal when clicking on data-bs-toggle="modal" (#32691)
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2021-01-13 21:59:47 +02:00
Mark Otto
d21fb9b627
Document some basic code conventions for us (#32778)
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2021-01-13 21:06:07 +02:00
Gaël Poupard
20a9d491a2
Improve docs regarding RTL migration (#32771)
* docs(migrations): add a note regarding migration from v4 used for RTL layouts

* docs(RTL): LTR & RTL at the same time

* docs(utilities): how-to use the API to rename utilities

* docs(RTL): mention issue when nesting styles with .ltr / .rtl
2021-01-13 21:01:36 +02:00
Onycss
041de9d5ed
Add word-break to .toast-body (#32670)
* Update _toasts.scss

* Update scss/_toasts.scss

Co-authored-by: Mark Otto <otto@github.com>
2021-01-13 09:21:57 -08:00
XhmikosR
1cdbf532af
Improve zip-examples.js (#32469)
Only include the needed dist files: ~1.27 MB -> ~410 KB
2021-01-13 19:21:31 +02:00
ghost_32
82e5fe2d8c
Migration: mention the removal of .rounded-sm/lg utilities (#32758)
* Changes made in migration.md file of documentation

Added information about the removal of `.rounded-sm` and `.rounded-lg`.
And addition of `.rounded-0` to `.rounded-3`

* Moved the edited line

Added `rounded-0` to `rounded-3` under  v5.0.0-alpha3

* Moved correctly

* Added link

Added link to issue #31687

* docs(migration): last typo thinggies

* Update migration.md

Co-authored-by: Gaël Poupard <ffoodd@users.noreply.github.com>
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2021-01-13 09:18:56 -08:00
XhmikosR
cad88abdb0
JS: update karma config (#32769)
* rename constants
* enforce the constants to be Boolean
* fix karma `logLevel`
2021-01-13 19:16:51 +02:00
Mark Otto
05249c8c04
Document size and multiple aren't supported on floating label selects (#32744)
* Document size and multiple aren't supported on floating label selects

Closes #32660

* Update floating-labels.md
2021-01-13 09:15:05 -08:00
Marcin Kasperski
408b2558dc
Update toasts.md (#32782)
* dropped mention of `backdrop-filter`
* changed mention of `.text-white` to `.btn-close-white` on close button
2021-01-13 19:05:25 +02:00
XhmikosR
f43133ac41
.gitignore: remove Ruby/Jekyll entries (#32770)
Our currently supported branches, v4-dev and main, use Hugo.
2021-01-13 13:20:49 +02:00
XhmikosR
ed5ddca5ba
Stylelint: disallow some property values (#32756)
* `border: none`
* `outline: none`
2021-01-13 10:52:41 +02:00
Mark Otto
69afafe811
Mention stretched-link constraints with table elements (#32761)
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2021-01-12 15:33:58 +02:00
dependabot[bot]
bf1e913f05
Bump sass from 1.32.2 to 1.32.4 (#32766)
Bumps [sass](https://github.com/sass/dart-sass) from 1.32.2 to 1.32.4.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/master/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.32.2...1.32.4)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-01-12 14:53:12 +02:00
XhmikosR
0bcaa068f2
GitHub Actions cleanup (#32755)
* lowercase `runner.os`
* remove `CI` environment variable since it's already set by the runner
2021-01-11 13:05:05 +02:00
Patrick H. Lauke
78c5b503f9
Darken dropdown item hover style (#32754)
Closes https://github.com/twbs/bootstrap/issues/23329
2021-01-11 01:24:03 +00:00
Patrick H. Lauke
d62d18f172
Consistently use outline:0 rather than outline:none (#32751)
just for code consistency, no actual effect on styling per se
2021-01-10 16:13:08 +00:00
Patrick H. Lauke
a2ae2c364f
Suppress focus outline for buttons when it shouldn't be visible in Chromium (#32689)
Follow-up to https://github.com/twbs/bootstrap/pull/32631

Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2021-01-10 10:42:26 +00:00
XhmikosR
7e6d7b8f81
package.json: move version_short variable under the config object (#32737)
This is so that it works on npm 7.x too.
2021-01-10 08:03:49 +02:00
Brian Thompson
ee8546da18
Fix typo (#32740)
* Fix typo

* Rewrite description to avoid awkward phrasing

Co-authored-by: Mark Otto <otto@github.com>
2021-01-09 13:06:41 -08:00
XhmikosR
3b773e4265
Update devDependencies (#32738)
* autoprefixer  ^10.2.0  →  ^10.2.1
* postcss        ^8.2.2  →   ^8.2.4
2021-01-09 12:57:00 -08:00
Théophile Helleboid - chtitux
80557b3ac0
Move "active" class from .nav-item to .nav-link (#32730) 2021-01-08 20:53:04 +02:00
Gaël Poupard
70175db429 docs(sidebar): active link 2021-01-08 09:49:18 +02:00
XhmikosR
d9adaae5b0 Move migration sidebar entry to sidebar.yml 2021-01-08 09:49:18 +02:00
dependabot[bot]
480e7e61b6
Bump autoprefixer from 10.1.0 to 10.2.0 (#32711)
Bumps [autoprefixer](https://github.com/postcss/autoprefixer) from 10.1.0 to 10.2.0.
- [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.1.0...10.2.0)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-01-07 16:52:31 +02:00
XhmikosR
f2c504397e
Bump copyright year to 2021 (#32713) 2021-01-07 12:12:53 +02:00
Mark Otto
cefdcf6954
Clarify the $enable-shadows option in our docs (#32685)
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2021-01-07 10:16:21 +02:00
dependabot[bot]
417372677f
Bump rollup from 2.36.0 to 2.36.1 (#32712)
Bumps [rollup](https://github.com/rollup/rollup) from 2.36.0 to 2.36.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/v2.36.0...v2.36.1)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2021-01-07 10:11:16 +02:00
dependabot[bot]
fee72a1dbc
Bump sass from 1.32.0 to 1.32.2 (#32709)
Bumps [sass](https://github.com/sass/dart-sass) from 1.32.0 to 1.32.2.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/master/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.32.0...1.32.2)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2021-01-07 10:08:07 +02:00
dependabot[bot]
dbd53b8475
Bump nodemon from 2.0.6 to 2.0.7 (#32710)
Bumps [nodemon](https://github.com/remy/nodemon) from 2.0.6 to 2.0.7.
- [Release notes](https://github.com/remy/nodemon/releases)
- [Commits](https://github.com/remy/nodemon/compare/v2.0.6...v2.0.7)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-01-07 10:03:00 +02:00
Rohit Sharma
3c934ddcef
Scrollspy - Remove unnecessary event argument (#32603)
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2021-01-07 09:34:08 +02:00
Florian Lacreuse
e635a49536
Fix navbar docs - active nav-link (#32589)
* Fix navbar docs - active nav-link

* Update navbar.md

Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2021-01-07 09:24:57 +02:00
Gaël Poupard
acec356c81
fix(ratio): missing variable prefix (#32501)
This is the only unprefixed custom property, and its name is very common so I think we'd better prefix it too.
2021-01-06 08:14:54 +02:00
Patrick H. Lauke
d1a62b47c3
Tweak wording for no-touch carousel (#32688)
based on changes made in the backport https://github.com/twbs/bootstrap/pull/32639
2021-01-06 00:59:44 +00:00
Jonathan
88d35b725b
Hyphen to dash for ranges (#32488)
* Hyphen to dash for ranges

* Hyphen to dash for ranges

* Hyphen to dash for ranges

* Hyphen to dash for ranges

* Hyphen to dash for ranges
2021-01-05 13:56:44 -08:00
Patrick H. Lauke
eb45005047
Remove old/unnecessary reboot bug fix (#32631)
From initial testing, this bug doesn't seem to manifest itself anywhere in Bootstrap (since we don't just set transparent background anywhere on buttons, and when we do set explicit button styles in the more specific stylings, we already do create a custom `:focus` style anyway)

Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2021-01-05 22:20:35 +02:00
Théophile Helleboid - chtitux
265605bba0
carousel example: Move "active" class on .nav-link element (#32647) (#32647)
The "active" CSS class must be on "nav-link" element, see `_navbar.scss`:

```css
.nav-link.active {
  color: $navbar-dark-active-color;
}
```

Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2021-01-05 22:15:59 +02:00
Mark Otto
dfe1b156d1
Fixes #32557: Add functions and variables to the utilities API docs imports (#32684)
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2021-01-05 22:11:56 +02:00
Patrick H. Lauke
fd48a8732f
Remove incorrect mention of dropdowns for dynamic tab behavior (#32634)
While technically it still works, we're already saying authors shouldn't do it later on, and we removed any examples of this. This was a straggler.

Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2021-01-05 22:04:06 +02:00
XhmikosR
97a3ef357d
CI: update to actions/setup-node@v2 (#32635) 2021-01-05 21:56:31 +02:00
XhmikosR
baa8d3702f
Regenerate package-lock.json (#32680) 2021-01-05 21:55:57 +02:00
Patrick H. Lauke
e1e6f5684e
Tweak the wording for collapse to indicate button is preferred/more semantic (#32632)
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2021-01-05 21:53:50 +02:00
XhmikosR
d5b6971814
Update dependabot.yml 2021-01-05 21:52:48 +02:00
XhmikosR
8f33f7865d
dependabot: Add Actions updates (#32681) 2021-01-05 21:30:29 +02:00
dependabot[bot]
1bfe4780d4
Bump rollup from 2.35.1 to 2.36.0 (#32683)
Bumps [rollup](https://github.com/rollup/rollup) from 2.35.1 to 2.36.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/v2.35.1...v2.36.0)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2021-01-05 16:08:04 +02:00
dependabot[bot]
e27bd176bf
Bump find-unused-sass-variables from 3.0.0 to 3.1.0 (#32682)
Bumps [find-unused-sass-variables](https://github.com/XhmikosR/find-unused-sass-variables) from 3.0.0 to 3.1.0.
- [Release notes](https://github.com/XhmikosR/find-unused-sass-variables/releases)
- [Commits](https://github.com/XhmikosR/find-unused-sass-variables/compare/v3.0.0...v3.1.0)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-01-05 15:51:47 +02:00
dependabot[bot]
fdd76d6d0c
Bump eslint-config-xo from 0.33.1 to 0.34.0 (#32679)
Bumps [eslint-config-xo](https://github.com/xojs/eslint-config-xo) from 0.33.1 to 0.34.0.
- [Release notes](https://github.com/xojs/eslint-config-xo/releases)
- [Commits](https://github.com/xojs/eslint-config-xo/compare/v0.33.1...v0.34.0)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-01-05 15:24:56 +02:00
dependabot[bot]
c6240401f5
Bump sass from 1.30.0 to 1.32.0 (#32677)
Bumps [sass](https://github.com/sass/dart-sass) from 1.30.0 to 1.32.0.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/master/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.30.0...1.32.0)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2021-01-05 14:59:33 +02:00
dependabot[bot]
ae3fa0e679
Bump postcss from 8.2.1 to 8.2.2 (#32676)
Bumps [postcss](https://github.com/postcss/postcss) from 8.2.1 to 8.2.2.
- [Release notes](https://github.com/postcss/postcss/releases)
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/postcss/postcss/compare/8.2.1...8.2.2)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2021-01-05 14:54:21 +02:00
dependabot[bot]
5672401b15
Bump eslint-plugin-unicorn from 25.0.0 to 25.0.1 (#32675)
Bumps [eslint-plugin-unicorn](https://github.com/sindresorhus/eslint-plugin-unicorn) from 25.0.0 to 25.0.1.
- [Release notes](https://github.com/sindresorhus/eslint-plugin-unicorn/releases)
- [Commits](https://github.com/sindresorhus/eslint-plugin-unicorn/compare/v25.0.0...v25.0.1)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2021-01-05 14:49:06 +02:00
dependabot[bot]
9d95e11eda
Bump hugo-bin from 0.67.1 to 0.68.0 (#32674)
Bumps [hugo-bin](https://github.com/fenneclab/hugo-bin) from 0.67.1 to 0.68.0.
- [Release notes](https://github.com/fenneclab/hugo-bin/releases)
- [Commits](https://github.com/fenneclab/hugo-bin/compare/v0.67.1...v0.68.0)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2021-01-05 12:48:54 +02:00
dependabot[bot]
99b3470e82
Bump eslint from 7.16.0 to 7.17.0 (#32673)
Bumps [eslint](https://github.com/eslint/eslint) from 7.16.0 to 7.17.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v7.16.0...v7.17.0)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-01-05 12:36:44 +02:00
Patrick H. Lauke
b05145c951
Add an actual data-bs-touch="false" example in the carousel docs (#32638)
* Add an actual `data-touch="false"` example in the carousel docs

this can also make it easier to actually check/debug any issues we may have with this data attribute

* Correct attribute table explanation and remove slide class from example
2020-12-29 15:40:42 +02:00
dependabot[bot]
122b2bdd48
Bump eslint-plugin-unicorn from 24.0.0 to 25.0.0 (#32644)
* Bump eslint-plugin-unicorn from 24.0.0 to 25.0.0

Bumps [eslint-plugin-unicorn](https://github.com/sindresorhus/eslint-plugin-unicorn) from 24.0.0 to 25.0.0.
- [Release notes](https://github.com/sindresorhus/eslint-plugin-unicorn/releases)
- [Commits](https://github.com/sindresorhus/eslint-plugin-unicorn/compare/v24.0.0...v25.0.0)

Signed-off-by: dependabot[bot] <support@github.com>

* Fix renamed eslint-plugin-unicorn options

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-12-29 12:52:32 +02:00
dependabot[bot]
0fc072649e
Bump linkinator from 2.8.2 to 2.11.2 (#32645)
Bumps [linkinator](https://github.com/JustinBeckwith/linkinator) from 2.8.2 to 2.11.2.
- [Release notes](https://github.com/JustinBeckwith/linkinator/releases)
- [Commits](https://github.com/JustinBeckwith/linkinator/compare/v2.8.2...v2.11.2)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-12-29 12:35:20 +02:00
dependabot[bot]
93a4c0fbf7
Bump rollup-plugin-istanbul from 2.0.1 to 3.0.0 (#32646)
Bumps [rollup-plugin-istanbul](https://github.com/artberri/rollup-plugin-istanbul) from 2.0.1 to 3.0.0.
- [Release notes](https://github.com/artberri/rollup-plugin-istanbul/releases)
- [Changelog](https://github.com/artberri/rollup-plugin-istanbul/blob/main/CHANGELOG.md)
- [Commits](https://github.com/artberri/rollup-plugin-istanbul/compare/v2.0.1...v3.0.0)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-12-29 12:31:04 +02:00
Mark Otto
a48a29a7a5
Tweak .form-select padding (#32419)
* Tweak .form-select padding

* Simplify the padding entirely

Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-12-28 08:27:03 +02:00
XhmikosR
bcf69163cd
Lock karma-browserstack-launcher and regenerate package-lock.json (#32593) 2020-12-22 15:45:01 +02:00
dependabot[bot]
8e426a32bc
Bump linkinator from 2.8.0 to 2.8.2 (#32592)
Bumps [linkinator](https://github.com/JustinBeckwith/linkinator) from 2.8.0 to 2.8.2.
- [Release notes](https://github.com/JustinBeckwith/linkinator/releases)
- [Commits](https://github.com/JustinBeckwith/linkinator/compare/v2.8.0...v2.8.2)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-12-22 12:34:38 +02:00
dependabot[bot]
f50b867be8
Bump eslint from 7.15.0 to 7.16.0 (#32591)
Bumps [eslint](https://github.com/eslint/eslint) from 7.15.0 to 7.16.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v7.15.0...v7.16.0)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-12-22 12:28:47 +02:00
dependabot[bot]
c1197ad37f
Bump hugo-bin from 0.67.0 to 0.67.1 (#32590)
Bumps [hugo-bin](https://github.com/fenneclab/hugo-bin) from 0.67.0 to 0.67.1.
- [Release notes](https://github.com/fenneclab/hugo-bin/releases)
- [Commits](https://github.com/fenneclab/hugo-bin/compare/v0.67.0...v0.67.1)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-12-22 12:23:30 +02:00
XhmikosR
9b7bb7b568
docs(sidebar): invalid CSS value (#32575)
Co-authored-by: Gaël Poupard <gael.poupard@orange.com>
2020-12-21 18:54:03 +02:00
Daniele Faraglia
59cd71631e
collapse: prevent url change if A nested tag is clicked (#32438)
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-12-21 14:37:35 +02:00
Nils K
2d46e47464
Support Popper virtual elements (#32376)
Adds the ability to use objects implementing the virtual element interface as the value for the reference option of a dropdown config.

Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-12-21 14:32:11 +02:00
XhmikosR
44667d89fa
API docs: add missing comma (#32543) 2020-12-21 11:12:28 +02:00
Florian Lacreuse
86802f701c
Add keyboard-focusable elements for popover on disabled button (#32490) 2020-12-20 20:28:58 +02:00
XhmikosR
e468917731
Revert "Update karma-browserstack-launcher to v1.6.0 (#32409)" (#32494)
This reverts commit e2324731de.
2020-12-20 17:38:11 +02:00
XhmikosR
d140f50b35
Tooltips: add missing space (#32529) 2020-12-20 17:12:22 +02:00
joe
561c0d8cde
added class selector "." to "dropend" (#32534)
It was missing the `.` before `dropend`.
2020-12-19 08:23:50 +02:00
Gaël Poupard
58ab1c2cd5
test(carousel): french word in the wild (#32528) 2020-12-18 17:22:16 +02:00
dependabot[bot]
66f323af70
Bump eslint-plugin-unicorn from 23.0.0 to 24.0.0 (#32516)
* Bump eslint-plugin-unicorn from 23.0.0 to 24.0.0

Bumps [eslint-plugin-unicorn](https://github.com/sindresorhus/eslint-plugin-unicorn) from 23.0.0 to 24.0.0.
- [Release notes](https://github.com/sindresorhus/eslint-plugin-unicorn/releases)
- [Commits](https://github.com/sindresorhus/eslint-plugin-unicorn/compare/v23.0.0...v24.0.0)

Signed-off-by: dependabot[bot] <support@github.com>

* Update karma.conf.js

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-12-18 15:11:07 +02:00
Siju Samson
517446069a
docs: Fix popover example showing above navbar (#32445)
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-12-18 10:19:30 +02:00
Marc Jansing
f07106e604
Add helpers to utilities bundle (#32324)
Adds currently missing utilities classes which are located in scss/helpers to
boostrap-utilities dist files.

Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-12-18 07:39:39 +02:00
dependabot[bot]
ef0bc661cf
Bump @babel/preset-env from 7.12.10 to 7.12.11 (#32515)
* Bump @babel/preset-env from 7.12.10 to 7.12.11

Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.12.10 to 7.12.11.
- [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.12.11/packages/babel-preset-env)

Signed-off-by: dependabot[bot] <support@github.com>

* Update package-lock.json

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-12-17 15:01:11 +02:00
Dylan Anderson
df763d6457
Add variables for modifying button state colours. (#32317)
Add some variables to allow users to modify how much a button gets
lighter or darker on :hover and :active.

Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-12-17 07:16:54 +02:00
Dmytro Yaremenko
8984255158
Extended form validation states customization capabilities (#31757)
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-12-17 07:07:48 +02:00
Rafi
b424650ab5
Fix: variables collide with globals (#32492)
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-12-17 07:02:20 +02:00
Rohit Sharma
f12657b39f
tests: replace deprecated jQuery method (#32309)
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-12-16 17:21:43 +02:00
XhmikosR
29e4eb91c1
BrowserStack: test on macOS Catalina instead of High Sierra (#32486) 2020-12-16 12:45:48 +02:00
dependabot[bot]
269efc8dc9
Bump @popperjs/core from 2.5.4 to 2.6.0 (#32487)
* Bump @popperjs/core from 2.5.4 to 2.6.0

Bumps [@popperjs/core](https://github.com/popperjs/popper-core) from 2.5.4 to 2.6.0.
- [Release notes](https://github.com/popperjs/popper-core/releases)
- [Commits](https://github.com/popperjs/popper-core/compare/v2.5.4...v2.6.0)

Signed-off-by: dependabot[bot] <support@github.com>

* Update config.yml

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-12-16 11:41:15 +02:00
Florian Lacreuse
4e7c9e56fc
Fix popover docs example (#32489) 2020-12-15 17:27:06 +02:00
XhmikosR
cc3a5cf79a
Update package-lock.json 2020-12-15 09:46:22 +02:00
Patrick H. Lauke
65f1bf027a
Docs: style clipboard button on :focus, not just :hover (#32461)
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-12-15 09:43:12 +02:00
XhmikosR
479043f255
Update Release Drafter configuration (#32417)
* add "Breaking Changes" section
* add "Performance Improvements" section
* add "Utility API" section
* add "CI" label in "Misc" category
2020-12-15 09:36:25 +02:00
dependabot[bot]
0c195f690a
Bump rollup from 2.34.2 to 2.35.1 (#32475)
Bumps [rollup](https://github.com/rollup/rollup) from 2.34.2 to 2.35.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/v2.34.2...v2.35.1)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-12-15 09:34:02 +02:00
Gaël Poupard
c2f67d72e8 docs(skip links): new powers for .visually-hidden-focusable 2020-12-15 09:22:14 +02:00
Patrick H. Lauke
eae52b1cb0 Expand visually-hidden-focusable so it can be used on a container, so the container becomes visible when focus is inside it / on one of its child elements. 2020-12-15 09:22:14 +02:00
Kyle Tsang
9b6c815148
docs: Remove unneeded .form-group class (#32483) 2020-12-15 09:21:25 +02:00
Florian Lacreuse
e8d14b302e
Remove redundant pointer-events: none override for tooltip and popover disabled buttons (#32478)
Co-authored-by: Patrick H. Lauke <redux@splintered.co.uk>
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-12-15 09:17:58 +02:00
XhmikosR
c3e8a0ef2a
Update CodeQL Action (#32452) 2020-12-15 09:14:03 +02:00
Alan Orth
e1f561b53c
docs: Add system-ui to native font stack documentation (#32455)
system-ui was added to the native font stack in #30561 but the docs were not updated.
2020-12-15 09:10:09 +02:00
XhmikosR
e2324731de
Update karma-browserstack-launcher to v1.6.0 (#32409) 2020-12-15 09:04:50 +02:00
XhmikosR
a3ead0786a
Flatten package-lock.json (#32477) 2020-12-15 09:00:15 +02:00
Rohit Sharma
042a4a255f
Tooltip/popover - change the default value for fallbackPlacements (#32437)
The default Popper `fallbackPlacements` value is `[oppositePlacement]`.

- The default value was previously (in v4) `'flip'` that can be achieved by passing the single value in the array, like — `[oppositePlacement]`. Keeping `null` also sets the `fallbackPlacements` to `[oppositePlacement]` (Default value in Popper)
- It's better to have **clockwise** (`['top', 'right', 'bottom', 'left']`) fallback options so that tooltip/popover can be placed to another side even if the opposite placement doesn't fit.

Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-12-14 20:51:14 +02:00
Florian Lacreuse
793c79d14b
Clean up lorem ipsum text in popover examples (#32479) 2020-12-14 20:26:16 +02:00
dependabot[bot]
25326a0114
Bump @rollup/plugin-node-resolve from 11.0.0 to 11.0.1 (#32476)
Bumps [@rollup/plugin-node-resolve](https://github.com/rollup/plugins) from 11.0.0 to 11.0.1.
- [Release notes](https://github.com/rollup/plugins/releases)
- [Commits](https://github.com/rollup/plugins/compare/commonjs-v11.0.0...commonjs-v11.0.1)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-12-14 17:26:22 +02:00
dependabot[bot]
a60d8c0d58
Bump postcss-cli from 8.3.0 to 8.3.1 (#32471)
Bumps [postcss-cli](https://github.com/postcss/postcss-cli) from 8.3.0 to 8.3.1.
- [Release notes](https://github.com/postcss/postcss-cli/releases)
- [Changelog](https://github.com/postcss/postcss-cli/blob/master/CHANGELOG.md)
- [Commits](https://github.com/postcss/postcss-cli/compare/8.3.0...8.3.1)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-12-14 16:41:34 +02:00
Mark Otto
071f914fa1
Add two new variables for pagination border-radius values (#32423)
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-12-14 15:34:01 +02:00
Jesse Mandel
a31ea592d6
Few updates for v5.0.0-beta1 NuGet support (#32453)
PopperJS 2.0 isn't on Nuget so dropped as a dependency
2020-12-14 14:34:31 +02:00
Florian Lacreuse
fe3658672c
Add missing has-validation in checkout examples (#32464) 2020-12-14 14:33:20 +02:00
Rohit Sharma
ebce95dc60
Tooltip - Add missing callback in async spec (#32465) 2020-12-14 13:02:34 +02:00
Gaël Poupard
b85ca045e0 fix(carousel): switch prev/next directions in RTL 2020-12-14 11:11:47 +02:00
Gaël Poupard
e967ecf900 docs(cheatsheet): fix RTL sidenav arrows 2020-12-14 11:11:47 +02:00
Alan Orth
f2b39d620c
examples: Update font utility classes to new v5 versions (#32449)
* site: Fix .font-italic to .fst-italic in blog example

The font utility class was renamed from .font-italic to .fst-italic
but a few references didn't get updated.

* site: Fix .font-weight-* to .fw-* in RTL examples

These font utility classes were renamed from .font-weight-* to .fw-*
but a few references didn't get updated.

Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-12-14 10:51:21 +02:00
dependabot[bot]
78389b2acf
Bump rtlcss from 2.6.2 to 3.0.0 (#32431)
Bumps [rtlcss](https://github.com/MohammadYounes/rtlcss) from 2.6.2 to 3.0.0.
- [Release notes](https://github.com/MohammadYounes/rtlcss/releases)
- [Changelog](https://github.com/MohammadYounes/rtlcss/blob/master/CHANGELOG.md)
- [Commits](https://github.com/MohammadYounes/rtlcss/compare/2.6.2...3.0.0)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-12-14 10:44:22 +02:00
Patrick H. Lauke
b2477cc70c
Straggler lorem ipsum text (#32463) 2020-12-14 09:38:59 +02:00
Patrick H. Lauke
764e5298de
Replace Lorem Ipsum placeholder text with more representative (or at least english language) text (#32246)
Replaces shorter examples with more sensible/representative/inforrmative text. For longer passages, resorted to using SFW extracts from http://katyperryipsum.com/
2020-12-11 20:05:33 +00:00
XhmikosR
93ab072027
carousel: switch to string constants (#32393) 2020-12-11 16:12:13 +02:00
Martijn Cuppens
62eb5a3232
Use box shadows instead of linear gradients to colorize tables (#32348)
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-12-11 15:49:22 +02:00
XhmikosR
81042ff467
terser: use 2 passes instead of the default 1. (#32185)
Saves us a few bytes.
2020-12-11 15:48:21 +02:00
XhmikosR
d154f0df7f
Use the ternary operator in a few more places (#32303) 2020-12-11 15:47:34 +02:00
dependabot[bot]
d28d74f58c
Bump @babel/preset-env from 7.12.7 to 7.12.10 (#32430)
Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.12.7 to 7.12.10.
- [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.12.10/packages/babel-preset-env)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-12-11 10:12:55 +02:00
dependabot[bot]
e534aa2b9f
Bump @babel/core from 7.12.9 to 7.12.10 (#32429)
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.12.9 to 7.12.10.
- [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.12.10/packages/babel-core)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-12-11 10:08:10 +02:00
dependabot[bot]
f2169e6dc3
Bump @babel/cli from 7.12.8 to 7.12.10 (#32428)
Bumps [@babel/cli](https://github.com/babel/babel/tree/HEAD/packages/babel-cli) from 7.12.8 to 7.12.10.
- [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.12.10/packages/babel-cli)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-12-11 10:02:17 +02:00
Rohit Sharma
4535b09c46
Tooltip - check if tip and its parent node exist in dispose method (#32420) 2020-12-10 21:06:41 +02:00
XhmikosR
1edec546cb
Remove TRANSITION_END from utils (#32394) 2020-12-10 16:54:50 +02:00
Gaël Poupard
7e47b7ecc9
Reset Popper position in RTL (#32415)
The RTL cheatsheet's dropdowns aren't positioned correctly because of RTLCSS transforming `right: auto` to `left:auto` (which conflicts with Popper positioning).
2020-12-10 16:38:42 +02:00
XhmikosR
c34385eb01
CI: add a 30-min timeout for BrowserStack (#32238) 2020-12-10 11:52:22 +02:00
XhmikosR
4341c34261
docs: SVG consistency changes (#32259)
* Move inlined SVG to a partial.

Also, add `fill="currentColor"` in the SVGs.

* docs: reorder attributes
2020-12-10 11:48:14 +02:00
AlexKoala
ecb38f6ac2
docs: Add Korean translation (#32284)
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-12-10 11:24:02 +02:00
Thomas Güttler
6f0545b61b
Typo: show on xxl, if only xl should be hidden. (#32287)
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-12-10 11:22:40 +02:00
XhmikosR
c75a56d550
CONTRIBUTING: mention dist files (#32314)
* CONTRIBUTING: mention dist files

* Update CONTRIBUTING.md

Co-authored-by: Mark Otto <markd.otto@gmail.com>
2020-12-10 10:55:11 +02:00
XhmikosR
9651ebf3c7
Update devDependencies and regenerate package-lock.json (#32410) 2020-12-10 00:38:49 +02:00
XhmikosR
6f9c38f65e
carousel: switch to if/else (#32395)
There are only two conditions, so `if/else` is shorter and has the same effect.
2020-12-10 00:38:24 +02:00
Martijn Cuppens
8fed098ef9
Utility API, RFS option: Only generate responsive classes when needed (#32397)
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-12-09 23:49:21 +02:00
Christian Oliff
aa2df26b55
Remove duplicated 'follow Bootstrap on Twitter' link in Community section (#32399)
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-12-09 23:45:27 +02:00
Martijn Cuppens
f132400865 Add fallback behaviour 2020-12-09 13:34:51 -08:00
Gaël Poupard
0f12f58711
cheatsheet: Drop redundant (current) text (#32401)
Useless since we're using `aria-current` (see #31891).
2020-12-09 17:54:47 +02:00
XhmikosR
0ca5addea4
alert: rename variables for consistency (#32392) 2020-12-09 15:09:41 +02:00
XhmikosR
41bc0e26d2
SelectorEngine: drop variable used once (#32391) 2020-12-09 15:05:52 +02:00
kyletsang
77771cdf00 Remove offset in Popover docs
Fix fallbackPlacements in Popover and Tooltip docs
2020-12-09 15:02:46 +02:00
kyletsang
290b295173 docs: Update Popper 2 doc links 2020-12-09 15:02:46 +02:00
Gaël Poupard
d29680b3cb
Fix missed occurrencies of "Popper.js" (#32398) 2020-12-09 14:53:43 +02:00
XhmikosR
b1290ff189
Regenerate package-lock.json (#32378) 2020-12-08 12:41:41 +02:00
dependabot[bot]
a4d9bc0431
Bump postcss from 8.1.14 to 8.2.0 (#32375)
Bumps [postcss](https://github.com/postcss/postcss) from 8.1.14 to 8.2.0.
- [Release notes](https://github.com/postcss/postcss/releases)
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/postcss/postcss/compare/8.1.14...8.2.0)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: XhmikosR <xhmikosr@gmail.com>
2020-12-08 12:26:40 +02:00
dependabot[bot]
f8b5faff45
Bump autoprefixer from 10.0.4 to 10.1.0 (#32374)
Bumps [autoprefixer](https://github.com/postcss/autoprefixer) from 10.0.4 to 10.1.0.
- [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.0.4...10.1.0)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-12-08 12:21:42 +02:00
XhmikosR
d3946e7646
Update devDependencies (#32355)
* eslint      ^7.14.0  →  ^7.15.0
* linkinator   ^2.5.1  →   ^2.8.0
* postcss     ^8.1.10  →  ^8.1.14
* rollup      ^2.34.0  →  ^2.34.2
* sass        ^1.29.0  →  ^1.30.0
2020-12-08 10:57:36 +02:00
157 changed files with 2177 additions and 2605 deletions

View file

@ -18,11 +18,11 @@
}, },
{ {
"path": "./dist/css/bootstrap-utilities.css", "path": "./dist/css/bootstrap-utilities.css",
"maxSize": "7 kB" "maxSize": "7.5 kB"
}, },
{ {
"path": "./dist/css/bootstrap-utilities.min.css", "path": "./dist/css/bootstrap-utilities.min.css",
"maxSize": "6.25 kB" "maxSize": "6.75 kB"
}, },
{ {
"path": "./dist/css/bootstrap.css", "path": "./dist/css/bootstrap.css",

View file

@ -43,15 +43,14 @@
], ],
"unicorn/consistent-function-scoping": "off", "unicorn/consistent-function-scoping": "off",
"unicorn/explicit-length-check": "off", "unicorn/explicit-length-check": "off",
"unicorn/import-index": "off", "unicorn/no-array-callback-reference": "off",
"unicorn/no-fn-reference-in-iterator": "off",
"unicorn/no-for-loop": "off", "unicorn/no-for-loop": "off",
"unicorn/no-null": "off", "unicorn/no-null": "off",
"unicorn/no-unused-properties": "error", "unicorn/no-unused-properties": "error",
"unicorn/no-useless-undefined": "off", "unicorn/no-useless-undefined": "off",
"unicorn/prefer-dataset": "off", "unicorn/prefer-dom-node-append": "off",
"unicorn/prefer-node-append": "off", "unicorn/prefer-dom-node-dataset": "off",
"unicorn/prefer-node-remove": "off", "unicorn/prefer-dom-node-remove": "off",
"unicorn/prefer-optional-catch-binding": "off", "unicorn/prefer-optional-catch-binding": "off",
"unicorn/prefer-query-selector": "off", "unicorn/prefer-query-selector": "off",
"unicorn/prevent-abbreviations": "off" "unicorn/prevent-abbreviations": "off"

View file

@ -101,12 +101,12 @@ Example:
Sometimes bugs reported to us are actually caused by bugs in the browser(s) themselves, not bugs in Bootstrap per se. Sometimes bugs reported to us are actually caused by bugs in the browser(s) themselves, not bugs in Bootstrap per se.
| Vendor(s) | Browser(s) | Rendering engine | Bug reporting website(s) | Notes | | Vendor(s) | Browser(s) | Rendering engine | Bug reporting website(s) | Notes |
| ------------- | ---------------------------- | ---------------- | --------------------------------------------------------------------- | -------------------------------------------------------- | | ------------- | ---------------------------- | ---------------- | ------------------------------------------------------ | -------------------------------------------------------- |
| Mozilla | Firefox | Gecko | https://bugzilla.mozilla.org/enter_bug.cgi | "Core" is normally the right product option to choose. | | Mozilla | Firefox | Gecko | https://bugzilla.mozilla.org/enter_bug.cgi | "Core" is normally the right product option to choose. |
| Apple | Safari | WebKit | https://bugs.webkit.org/enter_bug.cgi?product=WebKit | In Apple's bug reporter, choose "Safari" as the product. | | Apple | Safari | WebKit | https://bugs.webkit.org/enter_bug.cgi?product=WebKit | In Apple's bug reporter, choose "Safari" as the product. |
| Google, Opera | Chrome, Chromium, Opera v15+ | Blink | https://bugs.chromium.org/p/chromium/issues/list | Click the "New issue" button. | | Google, Opera | Chrome, Chromium, Opera v15+ | Blink | https://bugs.chromium.org/p/chromium/issues/list | Click the "New issue" button. |
| Microsoft | Edge | Blink | https://developer.microsoft.com/en-us/microsoft-edge/ | Go to "Help > Send Feedback" from the browser | | Microsoft | Edge | Blink | https://developer.microsoft.com/en-us/microsoft-edge/ | Go to "Help > Send Feedback" from the browser |
## Feature requests ## Feature requests
@ -134,9 +134,9 @@ Please adhere to the [coding guidelines](#code-guidelines) used throughout the
project (indentation, accurate comments, etc.) and any other requirements project (indentation, accurate comments, etc.) and any other requirements
(such as test coverage). (such as test coverage).
**Do not edit `bootstrap.css`, or `bootstrap.js` **Do not edit `bootstrap.css` or `bootstrap.js`, and do not commit
directly!** Those files are automatically generated. You should edit the any dist files (`dist/` or `js/dist`).** Those files are automatically generated by our build tools. You should
source files in [`/bootstrap/scss/`](https://github.com/twbs/bootstrap/tree/main/scss) edit the source files in [`/bootstrap/scss/`](https://github.com/twbs/bootstrap/tree/main/scss)
and/or [`/bootstrap/js/src/`](https://github.com/twbs/bootstrap/tree/main/js/src) instead. and/or [`/bootstrap/js/src/`](https://github.com/twbs/bootstrap/tree/main/js/src) instead.
Similarly, when contributing to Bootstrap's documentation, you should edit the Similarly, when contributing to Bootstrap's documentation, you should edit the

View file

@ -15,3 +15,10 @@ updates:
- v5 - v5
versioning-strategy: increase versioning-strategy: increase
rebase-strategy: disabled rebase-strategy: disabled
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: weekly
day: tuesday
time: "12:00"
timezone: Europe/Athens

View file

@ -4,6 +4,9 @@ prerelease: true
exclude-labels: exclude-labels:
- 'skip-changelog' - 'skip-changelog'
categories: categories:
- title: '❗ Breaking Changes'
labels:
- 'breaking-change'
- title: '🚀 Features' - title: '🚀 Features'
labels: labels:
- 'new-feature' - 'new-feature'
@ -14,6 +17,9 @@ categories:
- 'fix' - 'fix'
- 'bugfix' - 'bugfix'
- 'bug' - 'bug'
- title: '⚡ Performance Improvements'
labels:
- 'performance'
- title: '🎨 CSS' - title: '🎨 CSS'
labels: labels:
- 'css' - 'css'
@ -26,11 +32,19 @@ categories:
- title: '🌎 Accessibility' - title: '🌎 Accessibility'
labels: labels:
- 'accessibility' - 'accessibility'
- title: '🔧 Utility API'
labels:
- 'utility API'
- 'utilities'
- title: '🏭 Tests'
labels:
- 'tests'
- title: '🧰 Misc' - title: '🧰 Misc'
labels: labels:
- 'build' - 'build'
- 'meta' - 'meta'
- 'chore' - 'chore'
- 'CI'
- title: '📦 Dependencies' - title: '📦 Dependencies'
labels: labels:
- 'dependencies' - 'dependencies'

View file

@ -4,21 +4,21 @@ on:
push: push:
env: env:
CI: true
FORCE_COLOR: 2 FORCE_COLOR: 2
NODE: 14.x NODE: 14
jobs: jobs:
browserstack: browserstack:
runs-on: ubuntu-latest runs-on: ubuntu-latest
if: github.repository == 'twbs/bootstrap' && (!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')) if: github.repository == 'twbs/bootstrap' && (!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]'))
timeout-minutes: 30
steps: steps:
- name: Clone repository - name: Clone repository
uses: actions/checkout@v2 uses: actions/checkout@v2
- name: Set up Node.js - name: Set up Node.js
uses: actions/setup-node@v1 uses: actions/setup-node@v2
with: with:
node-version: "${{ env.NODE }}" node-version: "${{ env.NODE }}"
@ -28,8 +28,8 @@ jobs:
path: ~/.npm path: ~/.npm
key: ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }} key: ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
restore-keys: | restore-keys: |
${{ runner.OS }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }} ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
${{ runner.OS }}-node-v${{ env.NODE }}- ${{ runner.os }}-node-v${{ env.NODE }}-
- name: Install npm dependencies - name: Install npm dependencies
run: npm ci run: npm ci

View file

@ -7,9 +7,8 @@ on:
pull_request: pull_request:
env: env:
CI: true
FORCE_COLOR: 2 FORCE_COLOR: 2
NODE: 14.x NODE: 14
jobs: jobs:
bundlewatch: bundlewatch:
@ -20,7 +19,7 @@ jobs:
uses: actions/checkout@v2 uses: actions/checkout@v2
- name: Set up Node.js - name: Set up Node.js
uses: actions/setup-node@v1 uses: actions/setup-node@v2
with: with:
node-version: "${{ env.NODE }}" node-version: "${{ env.NODE }}"
@ -30,8 +29,8 @@ jobs:
path: ~/.npm path: ~/.npm
key: ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }} key: ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
restore-keys: | restore-keys: |
${{ runner.OS }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }} ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
${{ runner.OS }}-node-v${{ env.NODE }}- ${{ runner.os }}-node-v${{ env.NODE }}-
- name: Install npm dependencies - name: Install npm dependencies
run: npm ci run: npm ci

View file

@ -22,15 +22,6 @@ jobs:
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v2 uses: actions/checkout@v2
with:
# We must fetch at least the immediate parents so that if this is
# a pull request then we can checkout the head.
fetch-depth: 2
# If this run was triggered by a pull request event, then checkout
# the head of the pull request instead of the merge commit.
- run: git checkout HEAD^2
if: ${{ github.event_name == 'pull_request' }}
# Initializes the CodeQL tools for scanning. # Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL - name: Initialize CodeQL

View file

@ -7,9 +7,8 @@ on:
pull_request: pull_request:
env: env:
CI: true
FORCE_COLOR: 2 FORCE_COLOR: 2
NODE: 14.x NODE: 14
jobs: jobs:
css: css:
@ -20,7 +19,7 @@ jobs:
uses: actions/checkout@v2 uses: actions/checkout@v2
- name: Set up Node.js - name: Set up Node.js
uses: actions/setup-node@v1 uses: actions/setup-node@v2
with: with:
node-version: "${{ env.NODE }}" node-version: "${{ env.NODE }}"
@ -30,8 +29,8 @@ jobs:
path: ~/.npm path: ~/.npm
key: ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }} key: ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
restore-keys: | restore-keys: |
${{ runner.OS }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }} ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
${{ runner.OS }}-node-v${{ env.NODE }}- ${{ runner.os }}-node-v${{ env.NODE }}-
- name: Install npm dependencies - name: Install npm dependencies
run: npm ci run: npm ci

View file

@ -7,9 +7,8 @@ on:
pull_request: pull_request:
env: env:
CI: true
FORCE_COLOR: 2 FORCE_COLOR: 2
NODE: 14.x NODE: 14
jobs: jobs:
docs: docs:
@ -20,7 +19,7 @@ jobs:
uses: actions/checkout@v2 uses: actions/checkout@v2
- name: Set up Node.js - name: Set up Node.js
uses: actions/setup-node@v1 uses: actions/setup-node@v2
with: with:
node-version: "${{ env.NODE }}" node-version: "${{ env.NODE }}"
@ -32,8 +31,8 @@ jobs:
path: ~/.npm path: ~/.npm
key: ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }} key: ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
restore-keys: | restore-keys: |
${{ runner.OS }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }} ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
${{ runner.OS }}-node-v${{ env.NODE }}- ${{ runner.os }}-node-v${{ env.NODE }}-
- name: Install npm dependencies - name: Install npm dependencies
run: npm ci run: npm ci

View file

@ -7,7 +7,6 @@ on:
pull_request: pull_request:
env: env:
CI: true
FORCE_COLOR: 2 FORCE_COLOR: 2
jobs: jobs:
@ -25,7 +24,7 @@ jobs:
uses: actions/checkout@v2 uses: actions/checkout@v2
- name: Set up Node.js - name: Set up Node.js
uses: actions/setup-node@v1 uses: actions/setup-node@v2
with: with:
node-version: ${{ matrix.node }} node-version: ${{ matrix.node }}
@ -35,8 +34,8 @@ jobs:
path: ~/.npm path: ~/.npm
key: ${{ runner.os }}-node-v${{ matrix.node }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}} key: ${{ runner.os }}-node-v${{ matrix.node }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}}
restore-keys: | restore-keys: |
${{ runner.OS }}-node-v${{ matrix.node }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }} ${{ runner.os }}-node-v${{ matrix.node }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
${{ runner.OS }}-node-v${{ matrix.node }}- ${{ runner.os }}-node-v${{ matrix.node }}-
- name: Install npm dependencies - name: Install npm dependencies
run: npm ci run: npm ci

View file

@ -7,9 +7,8 @@ on:
pull_request: pull_request:
env: env:
CI: true
FORCE_COLOR: 2 FORCE_COLOR: 2
NODE: 14.x NODE: 14
jobs: jobs:
lint: lint:
@ -20,7 +19,7 @@ jobs:
uses: actions/checkout@v2 uses: actions/checkout@v2
- name: Set up Node.js - name: Set up Node.js
uses: actions/setup-node@v1 uses: actions/setup-node@v2
with: with:
node-version: "${{ env.NODE }}" node-version: "${{ env.NODE }}"
@ -30,8 +29,8 @@ jobs:
path: ~/.npm path: ~/.npm
key: ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }} key: ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
restore-keys: | restore-keys: |
${{ runner.OS }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }} ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
${{ runner.OS }}-node-v${{ env.NODE }}- ${{ runner.os }}-node-v${{ env.NODE }}-
- name: Install npm dependencies - name: Install npm dependencies
run: npm ci run: npm ci

View file

@ -7,9 +7,8 @@ on:
pull_request: pull_request:
env: env:
CI: true
FORCE_COLOR: 2 FORCE_COLOR: 2
NODE: 14.x NODE: 14
jobs: jobs:
css: css:
@ -20,7 +19,7 @@ jobs:
uses: actions/checkout@v2 uses: actions/checkout@v2
- name: Set up Node.js - name: Set up Node.js
uses: actions/setup-node@v1 uses: actions/setup-node@v2
with: with:
node-version: "${{ env.NODE }}" node-version: "${{ env.NODE }}"

11
.gitignore vendored
View file

@ -1,19 +1,8 @@
# Ignore docs files # Ignore docs files
/_gh_pages/ /_gh_pages/
# This is the old Jekyll docs dist folder;
# keeping it here so that when we switch branches it doesn't show up
/site/docs/**/dist/
# Jekyll's cache folder; keeping it for the same reason as above
/site/.jekyll-cache/
# Hugo resources folder # Hugo resources folder
/resources/ /resources/
# Ignore ruby/bundler files;
# keeping them here so that when we switch branches they don't show up
/.bundle/
/vendor/
/.ruby-version
# Numerous always-ignore extensions # Numerous always-ignore extensions
*.diff *.diff
*.err *.err

View file

@ -3,6 +3,10 @@
"stylelint-config-twbs-bootstrap/scss" "stylelint-config-twbs-bootstrap/scss"
], ],
"rules": { "rules": {
"declaration-property-value-disallowed-list": {
"border": "none",
"outline": "none"
},
"function-disallowed-list": [ "function-disallowed-list": [
"calc", "calc",
"lighten", "lighten",

View file

@ -1,7 +1,7 @@
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2011-2020 Twitter, Inc. Copyright (c) 2011-2021 Twitter, Inc.
Copyright (c) 2011-2020 The Bootstrap Authors Copyright (c) 2011-2021 The Bootstrap Authors
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View file

@ -236,4 +236,4 @@ Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com
## Copyright and license ## Copyright and license
Code and documentation copyright 20112020 the [Bootstrap Authors](https://github.com/twbs/bootstrap/graphs/contributors) and [Twitter, Inc.](https://twitter.com) Code released under the [MIT License](https://github.com/twbs/bootstrap/blob/main/LICENSE). Docs released under [Creative Commons](https://creativecommons.org/licenses/by/3.0/). Code and documentation copyright 20112021 the [Bootstrap Authors](https://github.com/twbs/bootstrap/graphs/contributors) and [Twitter, Inc.](https://twitter.com) Code released under the [MIT License](https://github.com/twbs/bootstrap/blob/main/LICENSE). Docs released under [Creative Commons](https://creativecommons.org/licenses/by/3.0/).

View file

@ -2,8 +2,8 @@
/*! /*!
* Script to build our plugins to use them separately. * Script to build our plugins to use them separately.
* Copyright 2020 The Bootstrap Authors * Copyright 2020-2021 The Bootstrap Authors
* Copyright 2020 Twitter, Inc. * Copyright 2020-2021 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/ */
@ -29,6 +29,7 @@ const bsPlugins = {
Manipulator: path.resolve(__dirname, '../js/src/dom/manipulator.js'), Manipulator: path.resolve(__dirname, '../js/src/dom/manipulator.js'),
SelectorEngine: path.resolve(__dirname, '../js/src/dom/selector-engine.js'), SelectorEngine: path.resolve(__dirname, '../js/src/dom/selector-engine.js'),
Alert: path.resolve(__dirname, '../js/src/alert.js'), Alert: path.resolve(__dirname, '../js/src/alert.js'),
Base: path.resolve(__dirname, '../js/src/base-component.js'),
Button: path.resolve(__dirname, '../js/src/button.js'), Button: path.resolve(__dirname, '../js/src/button.js'),
Carousel: path.resolve(__dirname, '../js/src/carousel.js'), Carousel: path.resolve(__dirname, '../js/src/carousel.js'),
Collapse: path.resolve(__dirname, '../js/src/collapse.js'), Collapse: path.resolve(__dirname, '../js/src/collapse.js'),
@ -44,11 +45,13 @@ const bsPlugins = {
const defaultPluginConfig = { const defaultPluginConfig = {
external: [ external: [
bsPlugins.Data, bsPlugins.Data,
bsPlugins.Base,
bsPlugins.EventHandler, bsPlugins.EventHandler,
bsPlugins.SelectorEngine bsPlugins.SelectorEngine
], ],
globals: { globals: {
[bsPlugins.Data]: 'Data', [bsPlugins.Data]: 'Data',
[bsPlugins.Base]: 'Base',
[bsPlugins.EventHandler]: 'EventHandler', [bsPlugins.EventHandler]: 'EventHandler',
[bsPlugins.SelectorEngine]: 'SelectorEngine' [bsPlugins.SelectorEngine]: 'SelectorEngine'
} }
@ -73,6 +76,7 @@ const getConfigByPluginKey = pluginKey => {
} }
if ( if (
pluginKey === 'Base' ||
pluginKey === 'Button' || pluginKey === 'Button' ||
pluginKey === 'Carousel' || pluginKey === 'Carousel' ||
pluginKey === 'Collapse' || pluginKey === 'Collapse' ||
@ -112,11 +116,13 @@ const getConfigByPluginKey = pluginKey => {
return { return {
external: [ external: [
bsPlugins.Data, bsPlugins.Data,
bsPlugins.Base,
bsPlugins.EventHandler, bsPlugins.EventHandler,
bsPlugins.Manipulator bsPlugins.Manipulator
], ],
globals: { globals: {
[bsPlugins.Data]: 'Data', [bsPlugins.Data]: 'Data',
[bsPlugins.Base]: 'Base',
[bsPlugins.EventHandler]: 'EventHandler', [bsPlugins.EventHandler]: 'EventHandler',
[bsPlugins.Manipulator]: 'Manipulator' [bsPlugins.Manipulator]: 'Manipulator'
} }

View file

@ -2,8 +2,8 @@
/*! /*!
* Script to update version number references in the project. * Script to update version number references in the project.
* Copyright 2017-2020 The Bootstrap Authors * Copyright 2017-2021 The Bootstrap Authors
* Copyright 2017-2020 Twitter, Inc. * Copyright 2017-2021 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/ */

View file

@ -5,8 +5,8 @@
* Remember to use the same vendor files as the CDN ones, * Remember to use the same vendor files as the CDN ones,
* otherwise the hashes won't match! * otherwise the hashes won't match!
* *
* Copyright 2017-2020 The Bootstrap Authors * Copyright 2017-2021 The Bootstrap Authors
* Copyright 2017-2020 Twitter, Inc. * Copyright 2017-2021 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/ */

View file

@ -2,8 +2,8 @@
/*! /*!
* Script to run vnu-jar if Java is available. * Script to run vnu-jar if Java is available.
* Copyright 2017-2020 The Bootstrap Authors * Copyright 2017-2021 The Bootstrap Authors
* Copyright 2017-2020 Twitter, Inc. * Copyright 2017-2021 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/ */

View file

@ -3,7 +3,7 @@
/*! /*!
* Script to create the built examples zip archive; * Script to create the built examples zip archive;
* requires the `zip` command to be present! * requires the `zip` command to be present!
* Copyright 2020 The Bootstrap Authors * Copyright 2020-2021 The Bootstrap Authors
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/ */
@ -12,36 +12,67 @@
const path = require('path') const path = require('path')
const sh = require('shelljs') const sh = require('shelljs')
const { version, version_short: versionShort } = require('../package.json') const pkg = require('../package.json')
const folderName = `bootstrap-${version}-examples` const versionShort = pkg.config.version_short
const distFolder = `bootstrap-${pkg.version}-examples`
const rootDocsDir = '_gh_pages'
const docsDir = `${rootDocsDir}/docs/${versionShort}/`
// these are the files we need in the examples
const cssFiles = [
'bootstrap.min.css',
'bootstrap.min.css.map',
'bootstrap.rtl.min.css',
'bootstrap.rtl.min.css.map'
]
const jsFiles = [
'bootstrap.bundle.min.js',
'bootstrap.bundle.min.js.map'
]
const imgFiles = [
'bootstrap-logo.svg',
'bootstrap-logo-white.svg'
]
sh.config.fatal = true sh.config.fatal = true
if (!sh.test('-d', '_gh_pages')) { if (!sh.test('-d', rootDocsDir)) {
throw new Error('The "_gh_pages" folder does not exist, did you forget building the docs?') throw new Error(`The "${rootDocsDir}" folder does not exist, did you forget building the docs?`)
} }
// switch to the root dir // switch to the root dir
sh.cd(path.join(__dirname, '..')) sh.cd(path.join(__dirname, '..'))
// remove any previously created folder with the same name // remove any previously created folder/zip with the same name
sh.rm('-rf', folderName) sh.rm('-rf', [distFolder, `${distFolder}.zip`])
// create any folders so that `cp` works
sh.mkdir('-p', folderName)
sh.mkdir('-p', `${folderName}/assets/brand/`)
sh.cp('-Rf', `_gh_pages/docs/${versionShort}/examples/*`, folderName) // create any folders so that `cp` works
sh.cp('-Rf', `_gh_pages/docs/${versionShort}/dist/`, `${folderName}/assets/`) sh.mkdir('-p', [
// also copy the two brand images we use in the examples distFolder,
sh.cp('-f', [ `${distFolder}/assets/brand/`,
`_gh_pages/docs/${versionShort}/assets/brand/bootstrap-logo.svg`, `${distFolder}/assets/dist/css/`,
`_gh_pages/docs/${versionShort}/assets/brand/bootstrap-logo-white.svg` `${distFolder}/assets/dist/js/`
], `${folderName}/assets/brand/`) ])
sh.rm(`${folderName}/index.html`)
sh.cp('-Rf', `${docsDir}/examples/*`, distFolder)
cssFiles.forEach(file => {
sh.cp('-f', `${docsDir}/dist/css/${file}`, `${distFolder}/assets/dist/css/`)
})
jsFiles.forEach(file => {
sh.cp('-f', `${docsDir}/dist/js/${file}`, `${distFolder}/assets/dist/js/`)
})
imgFiles.forEach(file => {
sh.cp('-f', `${docsDir}/assets/brand/${file}`, `${distFolder}/assets/brand/`)
})
sh.rm(`${distFolder}/index.html`)
// get all examples' HTML files // get all examples' HTML files
sh.find(`${folderName}/**/*.html`).forEach(file => { sh.find(`${distFolder}/**/*.html`).forEach(file => {
const fileContents = sh.cat(file) const fileContents = sh.cat(file)
.toString() .toString()
.replace(new RegExp(`"/docs/${versionShort}/`, 'g'), '"../') .replace(new RegExp(`"/docs/${versionShort}/`, 'g'), '"../')
@ -53,7 +84,7 @@ sh.find(`${folderName}/**/*.html`).forEach(file => {
}) })
// create the zip file // create the zip file
sh.exec(`zip -r9 "${folderName}.zip" "${folderName}"`, { fatal: true }) sh.exec(`zip -r9 "${distFolder}.zip" "${distFolder}"`)
// remove the folder we created // remove the folder we created
sh.rm('-rf', folderName) sh.rm('-rf', distFolder)

View file

@ -75,5 +75,5 @@ params:
js_hash: "sha384-pQQkAEnwaBkjpqZ8RU1fF1AKtTcHJwFl3pblpTlHXybJjHpMYo79HY3hIi4NKxyj" js_hash: "sha384-pQQkAEnwaBkjpqZ8RU1fF1AKtTcHJwFl3pblpTlHXybJjHpMYo79HY3hIi4NKxyj"
js_bundle: "https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.bundle.min.js" js_bundle: "https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.bundle.min.js"
js_bundle_hash: "sha384-ygbV9kiqUc6oa4msXn9868pTtWMgiQaeYH7/t7LECLbyPA2x65Kgf80OJFdroafW" js_bundle_hash: "sha384-ygbV9kiqUc6oa4msXn9868pTtWMgiQaeYH7/t7LECLbyPA2x65Kgf80OJFdroafW"
popper: "https://cdn.jsdelivr.net/npm/@popperjs/core@2.5.4/dist/umd/popper.min.js" popper: "https://cdn.jsdelivr.net/npm/@popperjs/core@2.6.0/dist/umd/popper.min.js"
popper_hash: "sha384-q2kxQ16AaE6UbzuKqyBE9/u/KzioAlnx2maXQHiDX9d4/zp8Ok3f+M7DPm+Ib6IU" popper_hash: "sha384-KsvD1yqQ1/1+IA7gi3P0tyJcT3vR+NdBTt13hSJ2lnve8agRGXTTyNaBYmCR/Nwi"

View file

@ -7,7 +7,6 @@
import { import {
defineJQueryPlugin, defineJQueryPlugin,
TRANSITION_END,
emulateTransitionEnd, emulateTransitionEnd,
getElementFromSelector, getElementFromSelector,
getTransitionDurationFromElement getTransitionDurationFromElement
@ -33,9 +32,9 @@ const EVENT_CLOSE = `close${EVENT_KEY}`
const EVENT_CLOSED = `closed${EVENT_KEY}` const EVENT_CLOSED = `closed${EVENT_KEY}`
const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}` const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
const CLASSNAME_ALERT = 'alert' const CLASS_NAME_ALERT = 'alert'
const CLASSNAME_FADE = 'fade' const CLASS_NAME_FADE = 'fade'
const CLASSNAME_SHOW = 'show' const CLASS_NAME_SHOW = 'show'
/** /**
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
@ -66,7 +65,7 @@ class Alert extends BaseComponent {
// Private // Private
_getRootElement(element) { _getRootElement(element) {
return getElementFromSelector(element) || element.closest(`.${CLASSNAME_ALERT}`) return getElementFromSelector(element) || element.closest(`.${CLASS_NAME_ALERT}`)
} }
_triggerCloseEvent(element) { _triggerCloseEvent(element) {
@ -74,16 +73,16 @@ class Alert extends BaseComponent {
} }
_removeElement(element) { _removeElement(element) {
element.classList.remove(CLASSNAME_SHOW) element.classList.remove(CLASS_NAME_SHOW)
if (!element.classList.contains(CLASSNAME_FADE)) { if (!element.classList.contains(CLASS_NAME_FADE)) {
this._destroyElement(element) this._destroyElement(element)
return return
} }
const transitionDuration = getTransitionDurationFromElement(element) const transitionDuration = getTransitionDurationFromElement(element)
EventHandler.one(element, TRANSITION_END, () => this._destroyElement(element)) EventHandler.one(element, 'transitionend', () => this._destroyElement(element))
emulateTransitionEnd(element, transitionDuration) emulateTransitionEnd(element, transitionDuration)
} }

View file

@ -7,11 +7,11 @@
import { import {
defineJQueryPlugin, defineJQueryPlugin,
TRANSITION_END,
emulateTransitionEnd, emulateTransitionEnd,
getElementFromSelector, getElementFromSelector,
getTransitionDurationFromElement, getTransitionDurationFromElement,
isVisible, isVisible,
isRTL,
reflow, reflow,
triggerTransitionEnd, triggerTransitionEnd,
typeCheckConfig typeCheckConfig
@ -93,10 +93,8 @@ const SELECTOR_INDICATORS = '.carousel-indicators'
const SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]' const SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]'
const SELECTOR_DATA_RIDE = '[data-bs-ride="carousel"]' const SELECTOR_DATA_RIDE = '[data-bs-ride="carousel"]'
const PointerType = { const POINTER_TYPE_TOUCH = 'touch'
TOUCH: 'touch', const POINTER_TYPE_PEN = 'pen'
PEN: 'pen'
}
/** /**
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
@ -253,12 +251,20 @@ class Carousel extends BaseComponent {
// swipe left // swipe left
if (direction > 0) { if (direction > 0) {
this.prev() if (isRTL) {
this.next()
} else {
this.prev()
}
} }
// swipe right // swipe right
if (direction < 0) { if (direction < 0) {
this.next() if (isRTL) {
this.prev()
} else {
this.next()
}
} }
} }
@ -279,7 +285,7 @@ class Carousel extends BaseComponent {
_addTouchEventListeners() { _addTouchEventListeners() {
const start = event => { const start = event => {
if (this._pointerEvent && PointerType[event.pointerType.toUpperCase()]) { if (this._pointerEvent && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)) {
this.touchStartX = event.clientX this.touchStartX = event.clientX
} else if (!this._pointerEvent) { } else if (!this._pointerEvent) {
this.touchStartX = event.touches[0].clientX this.touchStartX = event.touches[0].clientX
@ -296,7 +302,7 @@ class Carousel extends BaseComponent {
} }
const end = event => { const end = event => {
if (this._pointerEvent && PointerType[event.pointerType.toUpperCase()]) { if (this._pointerEvent && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)) {
this.touchDeltaX = event.clientX - this.touchStartX this.touchDeltaX = event.clientX - this.touchStartX
} }
@ -340,16 +346,20 @@ class Carousel extends BaseComponent {
return return
} }
switch (event.key) { if (event.key === ARROW_LEFT_KEY) {
case ARROW_LEFT_KEY: event.preventDefault()
event.preventDefault() if (isRTL) {
this.prev()
break
case ARROW_RIGHT_KEY:
event.preventDefault()
this.next() this.next()
break } else {
default: this.prev()
}
} else if (event.key === ARROW_RIGHT_KEY) {
event.preventDefault()
if (isRTL) {
this.prev()
} else {
this.next()
}
} }
} }
@ -436,19 +446,9 @@ class Carousel extends BaseComponent {
const nextElementIndex = this._getItemIndex(nextElement) const nextElementIndex = this._getItemIndex(nextElement)
const isCycling = Boolean(this._interval) const isCycling = Boolean(this._interval)
let directionalClassName const directionalClassName = direction === DIRECTION_NEXT ? CLASS_NAME_START : CLASS_NAME_END
let orderClassName const orderClassName = direction === DIRECTION_NEXT ? CLASS_NAME_NEXT : CLASS_NAME_PREV
let eventDirectionName const eventDirectionName = direction === DIRECTION_NEXT ? DIRECTION_LEFT : DIRECTION_RIGHT
if (direction === DIRECTION_NEXT) {
directionalClassName = CLASS_NAME_START
orderClassName = CLASS_NAME_NEXT
eventDirectionName = DIRECTION_LEFT
} else {
directionalClassName = CLASS_NAME_END
orderClassName = CLASS_NAME_PREV
eventDirectionName = DIRECTION_RIGHT
}
if (nextElement && nextElement.classList.contains(CLASS_NAME_ACTIVE)) { if (nextElement && nextElement.classList.contains(CLASS_NAME_ACTIVE)) {
this._isSliding = false this._isSliding = false
@ -484,7 +484,7 @@ class Carousel extends BaseComponent {
const transitionDuration = getTransitionDurationFromElement(activeElement) const transitionDuration = getTransitionDurationFromElement(activeElement)
EventHandler.one(activeElement, TRANSITION_END, () => { EventHandler.one(activeElement, 'transitionend', () => {
nextElement.classList.remove(directionalClassName, orderClassName) nextElement.classList.remove(directionalClassName, orderClassName)
nextElement.classList.add(CLASS_NAME_ACTIVE) nextElement.classList.add(CLASS_NAME_ACTIVE)

View file

@ -7,7 +7,6 @@
import { import {
defineJQueryPlugin, defineJQueryPlugin,
TRANSITION_END,
emulateTransitionEnd, emulateTransitionEnd,
getSelectorFromElement, getSelectorFromElement,
getElementFromSelector, getElementFromSelector,
@ -203,7 +202,7 @@ class Collapse extends BaseComponent {
const scrollSize = `scroll${capitalizedDimension}` const scrollSize = `scroll${capitalizedDimension}`
const transitionDuration = getTransitionDurationFromElement(this._element) const transitionDuration = getTransitionDurationFromElement(this._element)
EventHandler.one(this._element, TRANSITION_END, complete) EventHandler.one(this._element, 'transitionend', complete)
emulateTransitionEnd(this._element, transitionDuration) emulateTransitionEnd(this._element, transitionDuration)
this._element.style[dimension] = `${this._element[scrollSize]}px` this._element.style[dimension] = `${this._element[scrollSize]}px`
@ -253,7 +252,7 @@ class Collapse extends BaseComponent {
this._element.style[dimension] = '' this._element.style[dimension] = ''
const transitionDuration = getTransitionDurationFromElement(this._element) const transitionDuration = getTransitionDurationFromElement(this._element)
EventHandler.one(this._element, TRANSITION_END, complete) EventHandler.one(this._element, 'transitionend', complete)
emulateTransitionEnd(this._element, transitionDuration) emulateTransitionEnd(this._element, transitionDuration)
} }
@ -372,7 +371,7 @@ class Collapse extends BaseComponent {
EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) { EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
// preventDefault only for <a> elements (which change the URL) not inside the collapsible element // preventDefault only for <a> elements (which change the URL) not inside the collapsible element
if (event.target.tagName === 'A') { if (event.target.tagName === 'A' || (event.delegateTarget && event.delegateTarget.tagName === 'A')) {
event.preventDefault() event.preventDefault()
} }

View file

@ -112,6 +112,7 @@ function bootstrapDelegationHandler(element, selector, fn) {
event.delegateTarget = target event.delegateTarget = target
if (handler.oneOff) { if (handler.oneOff) {
// eslint-disable-next-line unicorn/consistent-destructuring
EventHandler.off(element, event.type, fn) EventHandler.off(element, event.type, fn)
} }

View file

@ -23,9 +23,8 @@ const SelectorEngine = {
}, },
children(element, selector) { children(element, selector) {
const children = [].concat(...element.children) return [].concat(...element.children)
.filter(child => child.matches(selector))
return children.filter(child => child.matches(selector))
}, },
parents(element, selector) { parents(element, selector) {

View file

@ -84,7 +84,7 @@ const DefaultType = {
offset: '(number|string|function)', offset: '(number|string|function)',
flip: 'boolean', flip: 'boolean',
boundary: '(string|element)', boundary: '(string|element)',
reference: '(string|element)', reference: '(string|element|object)',
display: 'string', display: 'string',
popperConfig: '(null|object)' popperConfig: '(null|object)'
} }
@ -172,6 +172,8 @@ class Dropdown extends BaseComponent {
if (typeof this._config.reference.jquery !== 'undefined') { if (typeof this._config.reference.jquery !== 'undefined') {
referenceElement = this._config.reference[0] referenceElement = this._config.reference[0]
} }
} else if (typeof this._config.reference === 'object') {
referenceElement = this._config.reference
} }
this._popper = Popper.createPopper(referenceElement, this._menu, this._getPopperConfig()) this._popper = Popper.createPopper(referenceElement, this._menu, this._getPopperConfig())
@ -257,6 +259,13 @@ class Dropdown extends BaseComponent {
typeCheckConfig(NAME, config, this.constructor.DefaultType) typeCheckConfig(NAME, config, this.constructor.DefaultType)
if (typeof config.reference === 'object' && !isElement(config.reference) &&
typeof config.reference.getBoundingClientRect !== 'function'
) {
// Popper virtual elements require a getBoundingClientRect method
throw new TypeError(`${NAME.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`)
}
return config return config
} }
@ -298,6 +307,12 @@ class Dropdown extends BaseComponent {
altBoundary: this._config.flip, altBoundary: this._config.flip,
rootBoundary: this._config.boundary rootBoundary: this._config.boundary
} }
},
{
name: 'flip',
options: {
fallbackPlacements: ['top', 'right', 'bottom', 'left']
}
}] }]
} }

View file

@ -7,7 +7,6 @@
import { import {
defineJQueryPlugin, defineJQueryPlugin,
TRANSITION_END,
emulateTransitionEnd, emulateTransitionEnd,
getElementFromSelector, getElementFromSelector,
getTransitionDurationFromElement, getTransitionDurationFromElement,
@ -184,7 +183,7 @@ class Modal extends BaseComponent {
if (transition) { if (transition) {
const transitionDuration = getTransitionDurationFromElement(this._element) const transitionDuration = getTransitionDurationFromElement(this._element)
EventHandler.one(this._element, TRANSITION_END, event => this._hideModal(event)) EventHandler.one(this._element, 'transitionend', event => this._hideModal(event))
emulateTransitionEnd(this._element, transitionDuration) emulateTransitionEnd(this._element, transitionDuration)
} else { } else {
this._hideModal() this._hideModal()
@ -272,7 +271,7 @@ class Modal extends BaseComponent {
if (transition) { if (transition) {
const transitionDuration = getTransitionDurationFromElement(this._dialog) const transitionDuration = getTransitionDurationFromElement(this._dialog)
EventHandler.one(this._dialog, TRANSITION_END, transitionComplete) EventHandler.one(this._dialog, 'transitionend', transitionComplete)
emulateTransitionEnd(this._dialog, transitionDuration) emulateTransitionEnd(this._dialog, transitionDuration)
} else { } else {
transitionComplete() transitionComplete()
@ -377,7 +376,7 @@ class Modal extends BaseComponent {
const backdropTransitionDuration = getTransitionDurationFromElement(this._backdrop) const backdropTransitionDuration = getTransitionDurationFromElement(this._backdrop)
EventHandler.one(this._backdrop, TRANSITION_END, callback) EventHandler.one(this._backdrop, 'transitionend', callback)
emulateTransitionEnd(this._backdrop, backdropTransitionDuration) emulateTransitionEnd(this._backdrop, backdropTransitionDuration)
} else if (!this._isShown && this._backdrop) { } else if (!this._isShown && this._backdrop) {
this._backdrop.classList.remove(CLASS_NAME_SHOW) this._backdrop.classList.remove(CLASS_NAME_SHOW)
@ -389,7 +388,7 @@ class Modal extends BaseComponent {
if (this._element.classList.contains(CLASS_NAME_FADE)) { if (this._element.classList.contains(CLASS_NAME_FADE)) {
const backdropTransitionDuration = getTransitionDurationFromElement(this._backdrop) const backdropTransitionDuration = getTransitionDurationFromElement(this._backdrop)
EventHandler.one(this._backdrop, TRANSITION_END, callbackRemove) EventHandler.one(this._backdrop, 'transitionend', callbackRemove)
emulateTransitionEnd(this._backdrop, backdropTransitionDuration) emulateTransitionEnd(this._backdrop, backdropTransitionDuration)
} else { } else {
callbackRemove() callbackRemove()
@ -413,11 +412,11 @@ class Modal extends BaseComponent {
this._element.classList.add(CLASS_NAME_STATIC) this._element.classList.add(CLASS_NAME_STATIC)
const modalTransitionDuration = getTransitionDurationFromElement(this._dialog) const modalTransitionDuration = getTransitionDurationFromElement(this._dialog)
EventHandler.off(this._element, TRANSITION_END) EventHandler.off(this._element, 'transitionend')
EventHandler.one(this._element, TRANSITION_END, () => { EventHandler.one(this._element, 'transitionend', () => {
this._element.classList.remove(CLASS_NAME_STATIC) this._element.classList.remove(CLASS_NAME_STATIC)
if (!isModalOverflowing) { if (!isModalOverflowing) {
EventHandler.one(this._element, TRANSITION_END, () => { EventHandler.one(this._element, 'transitionend', () => {
this._element.style.overflowY = '' this._element.style.overflowY = ''
}) })
emulateTransitionEnd(this._element, modalTransitionDuration) emulateTransitionEnd(this._element, modalTransitionDuration)
@ -591,7 +590,7 @@ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (
data = new Modal(target, config) data = new Modal(target, config)
} }
data.show(this) data.toggle(this)
}) })
/** /**

View file

@ -76,7 +76,7 @@ class ScrollSpy extends BaseComponent {
this._activeTarget = null this._activeTarget = null
this._scrollHeight = 0 this._scrollHeight = 0
EventHandler.on(this._scrollElement, EVENT_SCROLL, event => this._process(event)) EventHandler.on(this._scrollElement, EVENT_SCROLL, () => this._process())
this.refresh() this.refresh()
this._process() this._process()

View file

@ -7,7 +7,6 @@
import { import {
defineJQueryPlugin, defineJQueryPlugin,
TRANSITION_END,
emulateTransitionEnd, emulateTransitionEnd,
getElementFromSelector, getElementFromSelector,
getTransitionDurationFromElement, getTransitionDurationFromElement,
@ -82,13 +81,11 @@ class Tab extends BaseComponent {
previous = previous[previous.length - 1] previous = previous[previous.length - 1]
} }
let hideEvent = null const hideEvent = previous ?
EventHandler.trigger(previous, EVENT_HIDE, {
if (previous) {
hideEvent = EventHandler.trigger(previous, EVENT_HIDE, {
relatedTarget: this._element relatedTarget: this._element
}) }) :
} null
const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, { const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {
relatedTarget: previous relatedTarget: previous
@ -132,7 +129,7 @@ class Tab extends BaseComponent {
const transitionDuration = getTransitionDurationFromElement(active) const transitionDuration = getTransitionDurationFromElement(active)
active.classList.remove(CLASS_NAME_SHOW) active.classList.remove(CLASS_NAME_SHOW)
EventHandler.one(active, TRANSITION_END, complete) EventHandler.one(active, 'transitionend', complete)
emulateTransitionEnd(active, transitionDuration) emulateTransitionEnd(active, transitionDuration)
} else { } else {
complete() complete()

View file

@ -7,7 +7,6 @@
import { import {
defineJQueryPlugin, defineJQueryPlugin,
TRANSITION_END,
emulateTransitionEnd, emulateTransitionEnd,
getTransitionDurationFromElement, getTransitionDurationFromElement,
reflow, reflow,
@ -116,7 +115,7 @@ class Toast extends BaseComponent {
if (this._config.animation) { if (this._config.animation) {
const transitionDuration = getTransitionDurationFromElement(this._element) const transitionDuration = getTransitionDurationFromElement(this._element)
EventHandler.one(this._element, TRANSITION_END, complete) EventHandler.one(this._element, 'transitionend', complete)
emulateTransitionEnd(this._element, transitionDuration) emulateTransitionEnd(this._element, transitionDuration)
} else { } else {
complete() complete()
@ -143,7 +142,7 @@ class Toast extends BaseComponent {
if (this._config.animation) { if (this._config.animation) {
const transitionDuration = getTransitionDurationFromElement(this._element) const transitionDuration = getTransitionDurationFromElement(this._element)
EventHandler.one(this._element, TRANSITION_END, complete) EventHandler.one(this._element, 'transitionend', complete)
emulateTransitionEnd(this._element, transitionDuration) emulateTransitionEnd(this._element, transitionDuration)
} else { } else {
complete() complete()

View file

@ -9,7 +9,6 @@ import * as Popper from '@popperjs/core'
import { import {
defineJQueryPlugin, defineJQueryPlugin,
TRANSITION_END,
emulateTransitionEnd, emulateTransitionEnd,
findShadowRoot, findShadowRoot,
getTransitionDurationFromElement, getTransitionDurationFromElement,
@ -52,7 +51,7 @@ const DefaultType = {
selector: '(string|boolean)', selector: '(string|boolean)',
placement: '(string|function)', placement: '(string|function)',
container: '(string|element|boolean)', container: '(string|element|boolean)',
fallbackPlacements: '(null|array)', fallbackPlacements: 'array',
boundary: '(string|element)', boundary: '(string|element)',
customClass: '(string|function)', customClass: '(string|function)',
sanitize: 'boolean', sanitize: 'boolean',
@ -82,7 +81,7 @@ const Default = {
selector: false, selector: false,
placement: 'top', placement: 'top',
container: false, container: false,
fallbackPlacements: null, fallbackPlacements: ['top', 'right', 'bottom', 'left'],
boundary: 'clippingParents', boundary: 'clippingParents',
customClass: '', customClass: '',
sanitize: true, sanitize: true,
@ -223,7 +222,7 @@ class Tooltip extends BaseComponent {
EventHandler.off(this._element, this.constructor.EVENT_KEY) EventHandler.off(this._element, this.constructor.EVENT_KEY)
EventHandler.off(this._element.closest(`.${CLASS_NAME_MODAL}`), 'hide.bs.modal', this._hideModalHandler) EventHandler.off(this._element.closest(`.${CLASS_NAME_MODAL}`), 'hide.bs.modal', this._hideModalHandler)
if (this.tip) { if (this.tip && this.tip.parentNode) {
this.tip.parentNode.removeChild(this.tip) this.tip.parentNode.removeChild(this.tip)
} }
@ -317,7 +316,7 @@ class Tooltip extends BaseComponent {
if (this.tip.classList.contains(CLASS_NAME_FADE)) { if (this.tip.classList.contains(CLASS_NAME_FADE)) {
const transitionDuration = getTransitionDurationFromElement(this.tip) const transitionDuration = getTransitionDurationFromElement(this.tip)
EventHandler.one(this.tip, TRANSITION_END, complete) EventHandler.one(this.tip, 'transitionend', complete)
emulateTransitionEnd(this.tip, transitionDuration) emulateTransitionEnd(this.tip, transitionDuration)
} else { } else {
complete() complete()
@ -367,7 +366,7 @@ class Tooltip extends BaseComponent {
if (this.tip.classList.contains(CLASS_NAME_FADE)) { if (this.tip.classList.contains(CLASS_NAME_FADE)) {
const transitionDuration = getTransitionDurationFromElement(tip) const transitionDuration = getTransitionDurationFromElement(tip)
EventHandler.one(tip, TRANSITION_END, complete) EventHandler.one(tip, 'transitionend', complete)
emulateTransitionEnd(tip, transitionDuration) emulateTransitionEnd(tip, transitionDuration)
} else { } else {
complete() complete()
@ -467,21 +466,16 @@ class Tooltip extends BaseComponent {
// Private // Private
_getPopperConfig(attachment) { _getPopperConfig(attachment) {
const flipModifier = {
name: 'flip',
options: {
altBoundary: true
}
}
if (this.config.fallbackPlacements) {
flipModifier.options.fallbackPlacements = this.config.fallbackPlacements
}
const defaultBsConfig = { const defaultBsConfig = {
placement: attachment, placement: attachment,
modifiers: [ modifiers: [
flipModifier, {
name: 'flip',
options: {
altBoundary: true,
fallbackPlacements: this.config.fallbackPlacements
}
},
{ {
name: 'preventOverflow', name: 'preventOverflow',
options: { options: {

View file

@ -111,15 +111,14 @@ const typeCheckConfig = (componentName, config, configTypes) => {
Object.keys(configTypes).forEach(property => { Object.keys(configTypes).forEach(property => {
const expectedTypes = configTypes[property] const expectedTypes = configTypes[property]
const value = config[property] const value = config[property]
const valueType = value && isElement(value) ? const valueType = value && isElement(value) ? 'element' : toType(value)
'element' :
toType(value)
if (!new RegExp(expectedTypes).test(valueType)) { if (!new RegExp(expectedTypes).test(valueType)) {
throw new Error( throw new TypeError(
`${componentName.toUpperCase()}: ` + `${componentName.toUpperCase()}: ` +
`Option "${property}" provided type "${valueType}" ` + `Option "${property}" provided type "${valueType}" ` +
`but expected type "${expectedTypes}".`) `but expected type "${expectedTypes}".`
)
} }
}) })
} }
@ -205,7 +204,6 @@ const defineJQueryPlugin = (name, plugin) => {
} }
export { export {
TRANSITION_END,
getUID, getUID,
getSelectorFromElement, getSelectorFromElement,
getElementFromSelector, getElementFromSelector,

View file

@ -37,7 +37,7 @@ const allowedAttribute = (attr, allowedAttributeList) => {
if (allowedAttributeList.includes(attrName)) { if (allowedAttributeList.includes(attrName)) {
if (uriAttrs.has(attrName)) { if (uriAttrs.has(attrName)) {
return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN)) return Boolean(SAFE_URL_PATTERN.test(attr.nodeValue) || DATA_URL_PATTERN.test(attr.nodeValue))
} }
return true return true
@ -47,7 +47,7 @@ const allowedAttribute = (attr, allowedAttributeList) => {
// Check if a regular expression validates the attribute. // Check if a regular expression validates the attribute.
for (let i = 0, len = regExp.length; i < len; i++) { for (let i = 0, len = regExp.length; i < len; i++) {
if (attrName.match(regExp[i])) { if (regExp[i].test(attrName)) {
return true return true
} }
} }

View file

@ -5,21 +5,21 @@ const browsers = {
safariMac: { safariMac: {
base: 'BrowserStack', base: 'BrowserStack',
os: 'OS X', os: 'OS X',
os_version: 'High Sierra', os_version: 'Catalina',
browser: 'Safari', browser: 'Safari',
browser_version: 'latest' browser_version: 'latest'
}, },
chromeMac: { chromeMac: {
base: 'BrowserStack', base: 'BrowserStack',
os: 'OS X', os: 'OS X',
os_version: 'High Sierra', os_version: 'Catalina',
browser: 'Chrome', browser: 'Chrome',
browser_version: 'latest' browser_version: 'latest'
}, },
firefoxMac: { firefoxMac: {
base: 'BrowserStack', base: 'BrowserStack',
os: 'OS X', os: 'OS X',
os_version: 'High Sierra', os_version: 'Catalina',
browser: 'Firefox', browser: 'Firefox',
browser_version: 'latest' browser_version: 'latest'
}, },

View file

@ -1,5 +1,7 @@
/* eslint-env node */ /* eslint-env node */
'use strict'
const path = require('path') const path = require('path')
const ip = require('ip') const ip = require('ip')
const { babel } = require('@rollup/plugin-babel') const { babel } = require('@rollup/plugin-babel')
@ -12,10 +14,11 @@ const {
browsersKeys browsersKeys
} = require('./browsers') } = require('./browsers')
const { env } = process const ENV = process.env
const browserStack = env.BROWSER === 'true' const BROWSERSTACK = Boolean(ENV.BROWSERSTACK)
const debug = env.DEBUG === 'true' const DEBUG = Boolean(ENV.DEBUG)
const jQueryTest = env.JQUERY === 'true' const JQUERY_TEST = Boolean(ENV.JQUERY)
const frameworks = [ const frameworks = [
'jasmine' 'jasmine'
] ]
@ -30,16 +33,16 @@ const reporters = ['dots']
const detectBrowsers = { const detectBrowsers = {
usePhantomJS: false, usePhantomJS: false,
postDetection(availableBrowser) { postDetection(availableBrowser) {
if (env.CI === true || availableBrowser.includes('Chrome')) { if (ENV.CI === true || availableBrowser.includes('Chrome')) {
return debug ? ['Chrome'] : ['ChromeHeadless'] return DEBUG ? ['Chrome'] : ['ChromeHeadless']
} }
if (availableBrowser.includes('Chromium')) { if (availableBrowser.includes('Chromium')) {
return debug ? ['Chromium'] : ['ChromiumHeadless'] return DEBUG ? ['Chromium'] : ['ChromiumHeadless']
} }
if (availableBrowser.includes('Firefox')) { if (availableBrowser.includes('Firefox')) {
return debug ? ['Firefox'] : ['FirefoxHeadless'] return DEBUG ? ['Firefox'] : ['FirefoxHeadless']
} }
throw new Error('Please install Chrome, Chromium or Firefox') throw new Error('Please install Chrome, Chromium or Firefox')
@ -59,7 +62,7 @@ const conf = {
colors: true, colors: true,
autoWatch: false, autoWatch: false,
singleRun: true, singleRun: true,
concurrency: Infinity, concurrency: Number.POSITIVE_INFINITY,
client: { client: {
clearContext: false clearContext: false
}, },
@ -67,7 +70,7 @@ const conf = {
'node_modules/hammer-simulator/index.js', 'node_modules/hammer-simulator/index.js',
{ {
pattern: 'js/tests/unit/**/!(jquery).spec.js', pattern: 'js/tests/unit/**/!(jquery).spec.js',
watched: !browserStack watched: !BROWSERSTACK
} }
], ],
preprocessors: { preprocessors: {
@ -101,11 +104,11 @@ const conf = {
} }
} }
if (browserStack) { if (BROWSERSTACK) {
conf.hostname = ip.address() conf.hostname = ip.address()
conf.browserStack = { conf.browserStack = {
username: env.BROWSER_STACK_USERNAME, username: ENV.BROWSER_STACK_USERNAME,
accessKey: env.BROWSER_STACK_ACCESS_KEY, accessKey: ENV.BROWSER_STACK_ACCESS_KEY,
build: `bootstrap-${new Date().toISOString()}`, build: `bootstrap-${new Date().toISOString()}`,
project: 'Bootstrap', project: 'Bootstrap',
retryLimit: 2 retryLimit: 2
@ -114,7 +117,7 @@ if (browserStack) {
conf.customLaunchers = browsers conf.customLaunchers = browsers
conf.browsers = browsersKeys conf.browsers = browsersKeys
reporters.push('BrowserStack', 'kjhtml') reporters.push('BrowserStack', 'kjhtml')
} else if (jQueryTest) { } else if (JQUERY_TEST) {
frameworks.push('detectBrowsers') frameworks.push('detectBrowsers')
plugins.push( plugins.push(
'karma-chrome-launcher', 'karma-chrome-launcher',
@ -155,7 +158,7 @@ if (browserStack) {
} }
} }
if (debug) { if (DEBUG) {
conf.hostname = ip.address() conf.hostname = ip.address()
plugins.push('karma-jasmine-html-reporter') plugins.push('karma-jasmine-html-reporter')
reporters.push('kjhtml') reporters.push('kjhtml')
@ -169,7 +172,6 @@ conf.plugins = plugins
conf.reporters = reporters conf.reporters = reporters
module.exports = karmaConfig => { module.exports = karmaConfig => {
// possible values: karmaConfig.LOG_DISABLE || karmaConfig.LOG_ERROR || karmaConfig.LOG_WARN || karmaConfig.LOG_INFO || karmaConfig.LOG_DEBUG conf.logLevel = karmaConfig.LOG_ERROR
conf.logLevel = karmaConfig.LOG_ERROR || karmaConfig.LOG_WARN
karmaConfig.set(conf) karmaConfig.set(conf)
} }

View file

@ -905,7 +905,7 @@ describe('Carousel', () => {
}) })
describe('to', () => { describe('to', () => {
it('should go directement to the provided index', done => { it('should go directly to the provided index', done => {
fixtureEl.innerHTML = [ fixtureEl.innerHTML = [
'<div id="myCarousel" class="carousel slide">', '<div id="myCarousel" class="carousel slide">',
' <div class="carousel-inner">', ' <div class="carousel-inner">',
@ -1136,11 +1136,9 @@ describe('Carousel', () => {
jQueryMock.fn.carousel = Carousel.jQueryInterface jQueryMock.fn.carousel = Carousel.jQueryInterface
jQueryMock.elements = [div] jQueryMock.elements = [div]
try { expect(() => {
jQueryMock.fn.carousel.call(jQueryMock, action) jQueryMock.fn.carousel.call(jQueryMock, action)
} catch (error) { }).toThrowError(TypeError, `No method named "${action}"`)
expect(error.message).toEqual(`No method named "${action}"`)
}
}) })
}) })

View file

@ -374,6 +374,29 @@ describe('Collapse', () => {
}) })
describe('data-api', () => { describe('data-api', () => {
it('should prevent url change if click on nested elements', done => {
fixtureEl.innerHTML = [
'<a role="button" data-bs-toggle="collapse" class="collapsed" href="#collapse">',
' <span id="nested"></span>',
'</a>',
'<div id="collapse" class="collapse"></div>'
].join('')
const triggerEl = fixtureEl.querySelector('a')
const nestedTriggerEl = fixtureEl.querySelector('#nested')
spyOn(Event.prototype, 'preventDefault').and.callThrough()
triggerEl.addEventListener('click', event => {
expect(event.target.isEqualNode(nestedTriggerEl)).toEqual(true)
expect(event.delegateTarget.isEqualNode(triggerEl)).toEqual(true)
expect(Event.prototype.preventDefault).toHaveBeenCalled()
done()
})
nestedTriggerEl.click()
})
it('should show multiple collapsed elements', done => { it('should show multiple collapsed elements', done => {
fixtureEl.innerHTML = [ fixtureEl.innerHTML = [
'<a role="button" data-bs-toggle="collapse" class="collapsed" href=".multi"></a>', '<a role="button" data-bs-toggle="collapse" class="collapsed" href=".multi"></a>',
@ -796,11 +819,9 @@ describe('Collapse', () => {
jQueryMock.fn.collapse = Collapse.jQueryInterface jQueryMock.fn.collapse = Collapse.jQueryInterface
jQueryMock.elements = [div] jQueryMock.elements = [div]
try { expect(() => {
jQueryMock.fn.collapse.call(jQueryMock, action) jQueryMock.fn.collapse.call(jQueryMock, action)
} catch (error) { }).toThrowError(TypeError, `No method named "${action}"`)
expect(error.message).toEqual(`No method named "${action}"`)
}
}) })
}) })

View file

@ -367,6 +367,58 @@ describe('Dropdown', () => {
dropdown.toggle() dropdown.toggle()
}) })
it('should toggle a dropdown with a valid virtual element reference', done => {
fixtureEl.innerHTML = [
'<div class="dropdown">',
' <button class="btn dropdown-toggle visually-hidden" data-bs-toggle="dropdown" aria-expanded="false">Dropdown</button>',
' <div class="dropdown-menu">',
' <a class="dropdown-item" href="#">Secondary link</a>',
' </div>',
'</div>'
].join('')
const btnDropdown = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')
const virtualElement = {
getBoundingClientRect() {
return {
width: 0,
height: 0,
top: 0,
right: 0,
bottom: 0,
left: 0
}
}
}
expect(() => new Dropdown(btnDropdown, {
reference: {}
})).toThrowError(TypeError, 'DROPDOWN: Option "reference" provided type "object" without a required "getBoundingClientRect" method.')
expect(() => new Dropdown(btnDropdown, {
reference: {
getBoundingClientRect: 'not-a-function'
}
})).toThrowError(TypeError, 'DROPDOWN: Option "reference" provided type "object" without a required "getBoundingClientRect" method.')
// use onFirstUpdate as Poppers internal update is executed async
const dropdown = new Dropdown(btnDropdown, {
reference: virtualElement,
popperConfig: {
onFirstUpdate() {
expect(virtualElement.getBoundingClientRect).toHaveBeenCalled()
expect(btnDropdown.classList.contains('show')).toEqual(true)
expect(btnDropdown.getAttribute('aria-expanded')).toEqual('true')
done()
}
}
})
spyOn(virtualElement, 'getBoundingClientRect').and.callThrough()
dropdown.toggle()
})
it('should not toggle a dropdown if the element is disabled', done => { it('should not toggle a dropdown if the element is disabled', done => {
fixtureEl.innerHTML = [ fixtureEl.innerHTML = [
'<div class="dropdown">', '<div class="dropdown">',
@ -1505,11 +1557,9 @@ describe('Dropdown', () => {
jQueryMock.fn.dropdown = Dropdown.jQueryInterface jQueryMock.fn.dropdown = Dropdown.jQueryInterface
jQueryMock.elements = [div] jQueryMock.elements = [div]
try { expect(() => {
jQueryMock.fn.dropdown.call(jQueryMock, action) jQueryMock.fn.dropdown.call(jQueryMock, action)
} catch (error) { }).toThrowError(TypeError, `No method named "${action}"`)
expect(error.message).toEqual(`No method named "${action}"`)
}
}) })
}) })

View file

@ -52,6 +52,6 @@ describe('jQuery', () => {
done() done()
}) })
$(fixtureEl).find('button').click() $(fixtureEl).find('button').trigger('click')
}) })
}) })

View file

@ -870,7 +870,7 @@ describe('Modal', () => {
}) })
describe('data-api', () => { describe('data-api', () => {
it('should open modal', done => { it('should toggle modal', done => {
fixtureEl.innerHTML = [ fixtureEl.innerHTML = [
'<button type="button" data-bs-toggle="modal" data-bs-target="#exampleModal"></button>', '<button type="button" data-bs-toggle="modal" data-bs-target="#exampleModal"></button>',
'<div id="exampleModal" class="modal"><div class="modal-dialog"></div></div>' '<div id="exampleModal" class="modal"><div class="modal-dialog"></div></div>'
@ -885,6 +885,15 @@ describe('Modal', () => {
expect(modalEl.getAttribute('aria-hidden')).toEqual(null) expect(modalEl.getAttribute('aria-hidden')).toEqual(null)
expect(modalEl.style.display).toEqual('block') expect(modalEl.style.display).toEqual('block')
expect(document.querySelector('.modal-backdrop')).toBeDefined() expect(document.querySelector('.modal-backdrop')).toBeDefined()
setTimeout(() => trigger.click(), 10)
})
modalEl.addEventListener('hidden.bs.modal', () => {
expect(modalEl.getAttribute('aria-modal')).toEqual(null)
expect(modalEl.getAttribute('role')).toEqual(null)
expect(modalEl.getAttribute('aria-hidden')).toEqual('true')
expect(modalEl.style.display).toEqual('none')
expect(document.querySelector('.modal-backdrop')).toEqual(null)
done() done()
}) })
@ -1061,11 +1070,9 @@ describe('Modal', () => {
jQueryMock.fn.modal = Modal.jQueryInterface jQueryMock.fn.modal = Modal.jQueryInterface
jQueryMock.elements = [div] jQueryMock.elements = [div]
try { expect(() => {
jQueryMock.fn.modal.call(jQueryMock, action) jQueryMock.fn.modal.call(jQueryMock, action)
} catch (error) { }).toThrowError(TypeError, `No method named "${action}"`)
expect(error.message).toEqual(`No method named "${action}"`)
}
}) })
it('should call show method', () => { it('should call show method', () => {

View file

@ -206,11 +206,9 @@ describe('Popover', () => {
jQueryMock.fn.popover = Popover.jQueryInterface jQueryMock.fn.popover = Popover.jQueryInterface
jQueryMock.elements = [popoverEl] jQueryMock.elements = [popoverEl]
try { expect(() => {
jQueryMock.fn.popover.call(jQueryMock, action) jQueryMock.fn.popover.call(jQueryMock, action)
} catch (error) { }).toThrowError(TypeError, `No method named "${action}"`)
expect(error.message).toEqual(`No method named "${action}"`)
}
}) })
it('should should call show method', () => { it('should should call show method', () => {

View file

@ -68,7 +68,7 @@ describe('ScrollSpy', () => {
fixtureEl.innerHTML = [ fixtureEl.innerHTML = [
'<nav id="navigation" class="navbar">', '<nav id="navigation" class="navbar">',
' <ul class="navbar-nav">', ' <ul class="navbar-nav">',
' <li class="nav-item active"><a class="nav-link" id="one-link" href="#">One</a></li>', ' <li class="nav-item"><a class="nav-link active" id="one-link" href="#">One</a></li>',
' <li class="nav-item"><a class="nav-link" id="two-link" href="#two">Two</a></li>', ' <li class="nav-item"><a class="nav-link" id="two-link" href="#two">Two</a></li>',
' <li class="nav-item"><a class="nav-link" id="three-link" href="#three">Three</a></li>', ' <li class="nav-item"><a class="nav-link" id="three-link" href="#three">Three</a></li>',
' </ul>', ' </ul>',
@ -177,7 +177,7 @@ describe('ScrollSpy', () => {
'<div id="header" style="height: 500px;"></div>', '<div id="header" style="height: 500px;"></div>',
'<nav id="navigation" class="navbar">', '<nav id="navigation" class="navbar">',
' <ul class="navbar-nav">', ' <ul class="navbar-nav">',
' <li class="nav-item active"><a class="nav-link" id="one-link" href="#one">One</a></li>', ' <li class="nav-item"><a class="nav-link active" id="one-link" href="#one">One</a></li>',
' <li class="nav-item"><a class="nav-link" id="two-link" href="#two">Two</a></li>', ' <li class="nav-item"><a class="nav-link" id="two-link" href="#two">Two</a></li>',
' <li class="nav-item"><a class="nav-link" id="three-link" href="#three">Three</a></li>', ' <li class="nav-item"><a class="nav-link" id="three-link" href="#three">Three</a></li>',
' </ul>', ' </ul>',
@ -625,11 +625,9 @@ describe('ScrollSpy', () => {
jQueryMock.fn.scrollspy = ScrollSpy.jQueryInterface jQueryMock.fn.scrollspy = ScrollSpy.jQueryInterface
jQueryMock.elements = [div] jQueryMock.elements = [div]
try { expect(() => {
jQueryMock.fn.scrollspy.call(jQueryMock, action) jQueryMock.fn.scrollspy.call(jQueryMock, action)
} catch (error) { }).toThrowError(TypeError, `No method named "${action}"`)
expect(error.message).toEqual(`No method named "${action}"`)
}
}) })
}) })

View file

@ -397,11 +397,9 @@ describe('Tab', () => {
jQueryMock.fn.tab = Tab.jQueryInterface jQueryMock.fn.tab = Tab.jQueryInterface
jQueryMock.elements = [div] jQueryMock.elements = [div]
try { expect(() => {
jQueryMock.fn.tab.call(jQueryMock, action) jQueryMock.fn.tab.call(jQueryMock, action)
} catch (error) { }).toThrowError(TypeError, `No method named "${action}"`)
expect(error.message).toEqual(`No method named "${action}"`)
}
}) })
}) })

View file

@ -368,11 +368,9 @@ describe('Toast', () => {
jQueryMock.fn.toast = Toast.jQueryInterface jQueryMock.fn.toast = Toast.jQueryInterface
jQueryMock.elements = [div] jQueryMock.elements = [div]
try { expect(() => {
jQueryMock.fn.toast.call(jQueryMock, action) jQueryMock.fn.toast.call(jQueryMock, action)
} catch (error) { }).toThrowError(TypeError, `No method named "${action}"`)
expect(error.message).toEqual(`No method named "${action}"`)
}
}) })
}) })

View file

@ -286,6 +286,25 @@ describe('Tooltip', () => {
expect(Tooltip.getInstance(tooltipEl)).toEqual(null) expect(Tooltip.getInstance(tooltipEl)).toEqual(null)
}) })
it('should destroy a tooltip after it is shown and hidden', done => {
fixtureEl.innerHTML = '<a href="#" rel="tooltip" title="Another tooltip">'
const tooltipEl = fixtureEl.querySelector('a')
const tooltip = new Tooltip(tooltipEl)
tooltipEl.addEventListener('shown.bs.tooltip', () => {
tooltip.hide()
})
tooltipEl.addEventListener('hidden.bs.tooltip', () => {
tooltip.dispose()
expect(tooltip.tip).toEqual(null)
expect(Tooltip.getInstance(tooltipEl)).toEqual(null)
done()
})
tooltip.show()
})
it('should destroy a tooltip and remove it from the dom', done => { it('should destroy a tooltip and remove it from the dom', done => {
fixtureEl.innerHTML = '<a href="#" rel="tooltip" title="Another tooltip">' fixtureEl.innerHTML = '<a href="#" rel="tooltip" title="Another tooltip">'
@ -1188,11 +1207,9 @@ describe('Tooltip', () => {
jQueryMock.fn.tooltip = Tooltip.jQueryInterface jQueryMock.fn.tooltip = Tooltip.jQueryInterface
jQueryMock.elements = [div] jQueryMock.elements = [div]
try { expect(() => {
jQueryMock.fn.tooltip.call(jQueryMock, action) jQueryMock.fn.tooltip.call(jQueryMock, action)
} catch (error) { }).toThrowError(TypeError, `No method named "${action}"`)
expect(error.message).toEqual(`No method named "${action}"`)
}
}) })
}) })
}) })

View file

@ -212,7 +212,7 @@ describe('Util', () => {
expect(() => { expect(() => {
Util.typeCheckConfig(namePlugin, config, defaultType) Util.typeCheckConfig(namePlugin, config, defaultType)
}).toThrow(new Error('COLLAPSE: Option "parent" provided type "number" but expected type "(string|element)".')) }).toThrowError(TypeError, 'COLLAPSE: Option "parent" provided type "number" but expected type "(string|element)".')
}) })
it('should return null stringified when null is passed', () => { it('should return null stringified when null is passed', () => {

View file

@ -18,8 +18,8 @@
<div class="collapse navbar-collapse" id="navbarResponsive"> <div class="collapse navbar-collapse" id="navbarResponsive">
<ul class="navbar-nav"> <ul class="navbar-nav">
<li class="nav-item active"> <li class="nav-item">
<a class="nav-link" href="#" aria-current="page">Home</a> <a class="nav-link active" href="#" aria-current="page">Home</a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="#">Link</a> <a class="nav-link" href="#">Link</a>

View file

@ -18,8 +18,8 @@
<div class="collapse navbar-expand-md" id="navbarResponsive"> <div class="collapse navbar-expand-md" id="navbarResponsive">
<a class="navbar-brand" href="#">This shouldn't jump!</a> <a class="navbar-brand" href="#">This shouldn't jump!</a>
<ul class="navbar-nav"> <ul class="navbar-nav">
<li class="nav-item active"> <li class="nav-item">
<a class="nav-link" href="#" aria-current="page">Home</a> <a class="nav-link active" href="#" aria-current="page">Home</a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="#">Link</a> <a class="nav-link" href="#">Link</a>

View file

@ -3,7 +3,7 @@
<metadata> <metadata>
<id>bootstrap</id> <id>bootstrap</id>
<!-- pulled from package.json --> <!-- pulled from package.json -->
<version>4</version> <version>5</version>
<title>Bootstrap CSS</title> <title>Bootstrap CSS</title>
<authors>The Bootstrap Authors, Twitter Inc.</authors> <authors>The Bootstrap Authors, Twitter Inc.</authors>
<owners>bootstrap</owners> <owners>bootstrap</owners>
@ -14,11 +14,8 @@
<projectUrl>https://getbootstrap.com/</projectUrl> <projectUrl>https://getbootstrap.com/</projectUrl>
<icon>bootstrap.png</icon> <icon>bootstrap.png</icon>
<license type="file">LICENSE.txt</license> <license type="file">LICENSE.txt</license>
<copyright>Copyright 2017-2020</copyright> <copyright>Copyright 2017-2021</copyright>
<requireLicenseAcceptance>false</requireLicenseAcceptance> <requireLicenseAcceptance>false</requireLicenseAcceptance>
<dependencies>
<dependency id="@popperjs/core" version="[2.5.4,3)" />
</dependencies>
<tags>css mobile-first responsive front-end framework web</tags> <tags>css mobile-first responsive front-end framework web</tags>
<contentFiles> <contentFiles>
<files include="**/*" buildAction="Content" /> <files include="**/*" buildAction="Content" />

View file

@ -3,7 +3,7 @@
<metadata> <metadata>
<id>bootstrap.sass</id> <id>bootstrap.sass</id>
<!-- pulled from package.json --> <!-- pulled from package.json -->
<version>4</version> <version>5</version>
<title>Bootstrap Sass</title> <title>Bootstrap Sass</title>
<authors>The Bootstrap Authors, Twitter Inc.</authors> <authors>The Bootstrap Authors, Twitter Inc.</authors>
<owners>bootstrap</owners> <owners>bootstrap</owners>
@ -14,11 +14,8 @@
<projectUrl>https://getbootstrap.com/</projectUrl> <projectUrl>https://getbootstrap.com/</projectUrl>
<icon>bootstrap.png</icon> <icon>bootstrap.png</icon>
<license type="file">LICENSE.txt</license> <license type="file">LICENSE.txt</license>
<copyright>Copyright 2017-2020</copyright> <copyright>Copyright 2017-2021</copyright>
<requireLicenseAcceptance>false</requireLicenseAcceptance> <requireLicenseAcceptance>false</requireLicenseAcceptance>
<dependencies>
<dependency id="@popperjs/core" version="[2.5.4,3)" />
</dependencies>
<tags>css sass mobile-first responsive front-end framework web</tags> <tags>css sass mobile-first responsive front-end framework web</tags>
<contentFiles> <contentFiles>
<files include="**/*" buildAction="Content" /> <files include="**/*" buildAction="Content" />

2571
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -2,7 +2,9 @@
"name": "bootstrap", "name": "bootstrap",
"description": "The most popular front-end framework for developing responsive, mobile first projects on the web.", "description": "The most popular front-end framework for developing responsive, mobile first projects on the web.",
"version": "5.0.0-beta1", "version": "5.0.0-beta1",
"version_short": "5.0", "config": {
"version_short": "5.0"
},
"keywords": [ "keywords": [
"css", "css",
"sass", "sass",
@ -32,7 +34,7 @@
"css-prefix": "npm-run-all --parallel css-prefix-*", "css-prefix": "npm-run-all --parallel css-prefix-*",
"css-prefix-main": "postcss --config build/postcss.config.js --replace \"dist/css/*.css\" \"!dist/css/*.rtl*.css\" \"!dist/css/*.min.css\"", "css-prefix-main": "postcss --config build/postcss.config.js --replace \"dist/css/*.css\" \"!dist/css/*.rtl*.css\" \"!dist/css/*.min.css\"",
"css-prefix-examples": "postcss --config build/postcss.config.js --replace \"site/content/**/*.css\"", "css-prefix-examples": "postcss --config build/postcss.config.js --replace \"site/content/**/*.css\"",
"css-prefix-examples-rtl": "cross-env-shell NODE_ENV=RTL postcss --config build/postcss.config.js --dir \"site/content/docs/$npm_package_version_short/examples/\" --ext \".rtl.css\" --base \"site/content/docs/$npm_package_version_short/examples/\" \"site/content/docs/$npm_package_version_short/examples/{blog,carousel,dashboard,cheatsheet}/*.css\" \"!site/content/docs/$npm_package_version_short/examples/{blog,carousel,dashboard,cheatsheet}/*.rtl.css\"", "css-prefix-examples-rtl": "cross-env-shell NODE_ENV=RTL postcss --config build/postcss.config.js --dir \"site/content/docs/$npm_package_config_version_short/examples/\" --ext \".rtl.css\" --base \"site/content/docs/$npm_package_config_version_short/examples/\" \"site/content/docs/$npm_package_config_version_short/examples/{blog,carousel,dashboard,cheatsheet}/*.css\" \"!site/content/docs/$npm_package_config_version_short/examples/{blog,carousel,dashboard,cheatsheet}/*.rtl.css\"",
"js": "npm-run-all js-compile js-minify", "js": "npm-run-all js-compile js-minify",
"js-compile": "npm-run-all --parallel js-compile-*", "js-compile": "npm-run-all --parallel js-compile-*",
"js-compile-standalone": "rollup --environment BUNDLE:false --config build/rollup.config.js --sourcemap", "js-compile-standalone": "rollup --environment BUNDLE:false --config build/rollup.config.js --sourcemap",
@ -41,15 +43,15 @@
"js-compile-plugins": "node build/build-plugins.js", "js-compile-plugins": "node build/build-plugins.js",
"js-lint": "eslint --cache --cache-location .cache/.eslintcache --report-unused-disable-directives .", "js-lint": "eslint --cache --cache-location .cache/.eslintcache --report-unused-disable-directives .",
"js-minify": "npm-run-all --parallel js-minify-*", "js-minify": "npm-run-all --parallel js-minify-*",
"js-minify-standalone": "terser --compress --mangle --comments \"/^!/\" --source-map \"content=dist/js/bootstrap.js.map,includeSources,url=bootstrap.min.js.map\" --output dist/js/bootstrap.min.js dist/js/bootstrap.js", "js-minify-standalone": "terser --compress passes=2 --mangle --comments \"/^!/\" --source-map \"content=dist/js/bootstrap.js.map,includeSources,url=bootstrap.min.js.map\" --output dist/js/bootstrap.min.js dist/js/bootstrap.js",
"js-minify-standalone-esm": "terser --compress --mangle --comments \"/^!/\" --source-map \"content=dist/js/bootstrap.esm.js.map,includeSources,url=bootstrap.esm.min.js.map\" --output dist/js/bootstrap.esm.min.js dist/js/bootstrap.esm.js", "js-minify-standalone-esm": "terser --compress passes=2 --mangle --comments \"/^!/\" --source-map \"content=dist/js/bootstrap.esm.js.map,includeSources,url=bootstrap.esm.min.js.map\" --output dist/js/bootstrap.esm.min.js dist/js/bootstrap.esm.js",
"js-minify-bundle": "terser --compress --mangle --comments \"/^!/\" --source-map \"content=dist/js/bootstrap.bundle.js.map,includeSources,url=bootstrap.bundle.min.js.map\" --output dist/js/bootstrap.bundle.min.js dist/js/bootstrap.bundle.js", "js-minify-bundle": "terser --compress passes=2 --mangle --comments \"/^!/\" --source-map \"content=dist/js/bootstrap.bundle.js.map,includeSources,url=bootstrap.bundle.min.js.map\" --output dist/js/bootstrap.bundle.min.js dist/js/bootstrap.bundle.js",
"js-test": "npm-run-all --parallel js-test-karma js-test-jquery js-test-integration-*", "js-test": "npm-run-all --parallel js-test-karma js-test-jquery js-test-integration-*",
"js-debug": "cross-env DEBUG=true npm run js-test-karma", "js-debug": "cross-env DEBUG=true npm run js-test-karma",
"js-test-karma": "karma start js/tests/karma.conf.js", "js-test-karma": "karma start js/tests/karma.conf.js",
"js-test-integration-bundle": "rollup --config js/tests/integration/rollup.bundle.js", "js-test-integration-bundle": "rollup --config js/tests/integration/rollup.bundle.js",
"js-test-integration-modularity": "rollup --config js/tests/integration/rollup.bundle-modularity.js", "js-test-integration-modularity": "rollup --config js/tests/integration/rollup.bundle-modularity.js",
"js-test-cloud": "cross-env BROWSER=true npm run js-test-karma", "js-test-cloud": "cross-env BROWSERSTACK=true npm run js-test-karma",
"js-test-jquery": "cross-env JQUERY=true npm run js-test-karma", "js-test-jquery": "cross-env JQUERY=true npm run js-test-karma",
"lint": "npm-run-all --parallel js-lint css-lint lockfile-lint", "lint": "npm-run-all --parallel js-lint css-lint lockfile-lint",
"docs": "npm-run-all docs-build docs-lint", "docs": "npm-run-all docs-build docs-lint",
@ -95,32 +97,32 @@
}, },
"dependencies": {}, "dependencies": {},
"peerDependencies": { "peerDependencies": {
"@popperjs/core": "^2.5.4" "@popperjs/core": "^2.6.0"
}, },
"devDependencies": { "devDependencies": {
"@babel/cli": "^7.12.8", "@babel/cli": "^7.12.10",
"@babel/core": "^7.12.9", "@babel/core": "^7.12.10",
"@babel/preset-env": "^7.12.7", "@babel/preset-env": "^7.12.11",
"@popperjs/core": "^2.5.4", "@popperjs/core": "^2.6.0",
"@rollup/plugin-babel": "^5.2.2", "@rollup/plugin-babel": "^5.2.2",
"@rollup/plugin-commonjs": "^17.0.0", "@rollup/plugin-commonjs": "^17.0.0",
"@rollup/plugin-node-resolve": "^11.0.0", "@rollup/plugin-node-resolve": "^11.0.1",
"@rollup/plugin-replace": "^2.3.4", "@rollup/plugin-replace": "^2.3.4",
"autoprefixer": "^10.0.4", "autoprefixer": "^10.2.1",
"bundlewatch": "^0.3.1", "bundlewatch": "^0.3.1",
"clean-css-cli": "^4.3.0", "clean-css-cli": "^4.3.0",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"eslint": "^7.14.0", "eslint": "^7.17.0",
"eslint-config-xo": "^0.33.1", "eslint-config-xo": "^0.34.0",
"eslint-plugin-import": "^2.22.1", "eslint-plugin-import": "^2.22.1",
"eslint-plugin-unicorn": "^23.0.0", "eslint-plugin-unicorn": "^26.0.1",
"find-unused-sass-variables": "^3.0.0", "find-unused-sass-variables": "^3.1.0",
"glob": "^7.1.6", "glob": "^7.1.6",
"hammer-simulator": "0.0.1", "hammer-simulator": "0.0.1",
"hugo-bin": "^0.67.0", "hugo-bin": "^0.68.0",
"ip": "^1.1.5", "ip": "^1.1.5",
"jquery": "^3.5.1", "jquery": "^3.5.1",
"karma": "^5.2.3", "karma": "^6.0.0",
"karma-browserstack-launcher": "1.4.0", "karma-browserstack-launcher": "1.4.0",
"karma-chrome-launcher": "^3.1.0", "karma-chrome-launcher": "^3.1.0",
"karma-coverage-istanbul-reporter": "^3.0.3", "karma-coverage-istanbul-reporter": "^3.0.3",
@ -129,16 +131,16 @@
"karma-jasmine": "^4.0.1", "karma-jasmine": "^4.0.1",
"karma-jasmine-html-reporter": "^1.5.4", "karma-jasmine-html-reporter": "^1.5.4",
"karma-rollup-preprocessor": "^7.0.5", "karma-rollup-preprocessor": "^7.0.5",
"linkinator": "^2.5.1", "linkinator": "^2.11.2",
"lockfile-lint": "^4.3.7", "lockfile-lint": "^4.3.7",
"nodemon": "^2.0.6", "nodemon": "^2.0.7",
"npm-run-all": "^4.1.5", "npm-run-all": "^4.1.5",
"postcss": "^8.1.10", "postcss": "^8.2.4",
"postcss-cli": "^8.3.0", "postcss-cli": "^8.3.1",
"rollup": "^2.34.0", "rollup": "^2.36.1",
"rollup-plugin-istanbul": "^2.0.1", "rollup-plugin-istanbul": "^3.0.0",
"rtlcss": "^2.6.2", "rtlcss": "^3.0.0",
"sass": "^1.29.0", "sass": "^1.32.4",
"shelljs": "^0.8.4", "shelljs": "^0.8.4",
"stylelint": "^13.8.0", "stylelint": "^13.8.0",
"stylelint-config-twbs-bootstrap": "^2.1.0", "stylelint-config-twbs-bootstrap": "^2.1.0",
@ -168,7 +170,7 @@
}, },
"dependencies": {}, "dependencies": {},
"peerDependencies": { "peerDependencies": {
"@popperjs/core": "^2.5.4" "@popperjs/core": "^2.6.0"
} }
} }
} }

View file

@ -44,14 +44,14 @@
// Generate contextual modifier classes for colorizing the alert. // Generate contextual modifier classes for colorizing the alert.
@each $state, $value in $theme-colors { @each $state, $value in $theme-colors {
$background: shift-color($value, $alert-bg-scale); $alert-background: shift-color($value, $alert-bg-scale);
$border: shift-color($value, $alert-border-scale); $alert-border: shift-color($value, $alert-border-scale);
$color: shift-color($value, $alert-color-scale); $alert-color: shift-color($value, $alert-color-scale);
@if (contrast-ratio($background, $color) < $min-contrast-ratio) { @if (contrast-ratio($alert-background, $alert-color) < $min-contrast-ratio) {
$color: mix($value, color-contrast($background), abs($alert-color-scale)); $alert-color: mix($value, color-contrast($alert-background), abs($alert-color-scale));
} }
.alert-#{$state} { .alert-#{$state} {
@include alert-variant($background, $border, $color); @include alert-variant($alert-background, $alert-border, $alert-color);
} }
} }
// scss-docs-end alert-modifiers // scss-docs-end alert-modifiers

View file

@ -22,7 +22,7 @@
} }
&:focus { &:focus {
outline: none; outline: 0;
box-shadow: $btn-close-focus-shadow; box-shadow: $btn-close-focus-shadow;
opacity: $btn-close-focus-opacity; opacity: $btn-close-focus-opacity;
} }

View file

@ -35,7 +35,7 @@
// Reset positioning when positioned with Popper // Reset positioning when positioned with Popper
&[style] { &[style] {
right: auto !important; // stylelint-disable-line declaration-no-important right: auto#{"/* rtl:ignore */"} !important; // stylelint-disable-line declaration-no-important
} }
} }

View file

@ -152,12 +152,12 @@
// Organizationally, this must come after the `:hover` states. // Organizationally, this must come after the `:hover` states.
@each $state, $value in $theme-colors { @each $state, $value in $theme-colors {
$background: shift-color($value, $list-group-item-bg-scale); $list-group-background: shift-color($value, $list-group-item-bg-scale);
$color: shift-color($value, $list-group-item-color-scale); $list-group-color: shift-color($value, $list-group-item-color-scale);
@if (contrast-ratio($background, $color) < $min-contrast-ratio) { @if (contrast-ratio($list-group-background, $list-group-color) < $min-contrast-ratio) {
$color: mix($value, color-contrast($background), abs($alert-color-scale)); $list-group-color: mix($value, color-contrast($list-group-background), abs($alert-color-scale));
} }
@include list-group-item-variant($state, $background, $color); @include list-group-item-variant($state, $list-group-background, $list-group-color);
} }
// scss-docs-end list-group-modifiers // scss-docs-end list-group-modifiers

View file

@ -56,9 +56,9 @@
@include pagination-size($pagination-padding-y, $pagination-padding-x, null, $pagination-border-radius); @include pagination-size($pagination-padding-y, $pagination-padding-x, null, $pagination-border-radius);
.pagination-lg { .pagination-lg {
@include pagination-size($pagination-padding-y-lg, $pagination-padding-x-lg, $font-size-lg, $border-radius-lg); @include pagination-size($pagination-padding-y-lg, $pagination-padding-x-lg, $font-size-lg, $pagination-border-radius-lg);
} }
.pagination-sm { .pagination-sm {
@include pagination-size($pagination-padding-y-sm, $pagination-padding-x-sm, $font-size-sm, $border-radius-sm); @include pagination-size($pagination-padding-y-sm, $pagination-padding-x-sm, $font-size-sm, $pagination-border-radius-sm);
} }

View file

@ -411,13 +411,13 @@ button {
border-radius: 0; border-radius: 0;
} }
// Work around a Firefox bug where the transparent `button` background // Explicitly remove focus outline in Chromium when it shouldn't be
// results in a loss of the default `button` focus styles. // visible (e.g. as result of mouse click or touch tap). It already
// Credit https://github.com/suitcss/base/ // should be doing this automatically, but seems to currently be
// confused and applies its very visible two-tone outline anyway.
button:focus { button:focus:not(:focus-visible) {
outline: dotted 1px; outline: 0;
outline: -webkit-focus-ring-color auto 5px;
} }
// 1. Remove the margin in Firefox and Safari // 1. Remove the margin in Firefox and Safari

View file

@ -25,8 +25,8 @@
> :not(caption) > * > * { > :not(caption) > * > * {
padding: $table-cell-padding-y $table-cell-padding-x; padding: $table-cell-padding-y $table-cell-padding-x;
background-color: var(--#{$variable-prefix}table-bg); background-color: var(--#{$variable-prefix}table-bg);
background-image: linear-gradient(var(--#{$variable-prefix}table-accent-bg), var(--#{$variable-prefix}table-accent-bg));
border-bottom-width: $table-border-width; border-bottom-width: $table-border-width;
box-shadow: inset 0 0 0 9999px var(--#{$variable-prefix}table-accent-bg);
} }
> tbody { > tbody {

View file

@ -47,4 +47,5 @@
.toast-body { .toast-body {
padding: $toast-padding-x; // apply to both vertical and horizontal padding: $toast-padding-x; // apply to both vertical and horizontal
word-wrap: break-word;
} }

View file

@ -612,6 +612,15 @@ $btn-border-radius-lg: $border-radius-lg !default;
$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default; $btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;
$btn-hover-bg-shade-amount: 15% !default;
$btn-hover-bg-tint-amount: 15% !default;
$btn-hover-border-shade-amount: 20% !default;
$btn-hover-border-tint-amount: 10% !default;
$btn-active-bg-shade-amount: 20% !default;
$btn-active-bg-tint-amount: 20% !default;
$btn-active-border-shade-amount: 25% !default;
$btn-active-border-tint-amount: 10% !default;
// Forms // Forms
@ -735,7 +744,7 @@ $form-select-padding-y: $input-padding-y !default;
$form-select-padding-x: $input-padding-x !default; $form-select-padding-x: $input-padding-x !default;
$form-select-font-family: $input-font-family !default; $form-select-font-family: $input-font-family !default;
$form-select-font-size: $input-font-size !default; $form-select-font-size: $input-font-size !default;
$form-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator $form-select-indicator-padding: $form-select-padding-x * 3 !default; // Extra padding for background-image
$form-select-font-weight: $input-font-weight !default; $form-select-font-weight: $input-font-weight !default;
$form-select-line-height: $input-line-height !default; $form-select-line-height: $input-line-height !default;
$form-select-color: $input-color !default; $form-select-color: $input-color !default;
@ -748,8 +757,8 @@ $form-select-bg-size: 16px 12px !default; // In pixels because ima
$form-select-indicator-color: $gray-800 !default; $form-select-indicator-color: $gray-800 !default;
$form-select-indicator: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><path fill='none' stroke='#{$form-select-indicator-color}' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/></svg>") !default; $form-select-indicator: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><path fill='none' stroke='#{$form-select-indicator-color}' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/></svg>") !default;
$form-select-feedback-icon-padding-end: add(1em * .75, (2 * $form-select-padding-y * .75) + $form-select-padding-x + $form-select-indicator-padding) !default; $form-select-feedback-icon-padding-end: $form-select-padding-x * 2.5 + $form-select-indicator-padding !default;
$form-select-feedback-icon-position: center right ($form-select-padding-x + $form-select-indicator-padding) !default; $form-select-feedback-icon-position: center right $form-select-indicator-padding !default;
$form-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default; $form-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;
$form-select-border-width: $input-border-width !default; $form-select-border-width: $input-border-width !default;
@ -929,7 +938,7 @@ $dropdown-box-shadow: $box-shadow !default;
$dropdown-link-color: $gray-900 !default; $dropdown-link-color: $gray-900 !default;
$dropdown-link-hover-color: shade-color($gray-900, 10%) !default; $dropdown-link-hover-color: shade-color($gray-900, 10%) !default;
$dropdown-link-hover-bg: $gray-100 !default; $dropdown-link-hover-bg: $gray-200 !default;
$dropdown-link-active-color: $component-active-color !default; $dropdown-link-active-color: $component-active-color !default;
$dropdown-link-active-bg: $component-active-bg !default; $dropdown-link-active-bg: $component-active-bg !default;
@ -991,6 +1000,9 @@ $pagination-disabled-border-color: $gray-300 !default;
$pagination-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default; $pagination-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;
$pagination-border-radius-sm: $border-radius-sm !default;
$pagination-border-radius-lg: $border-radius-lg !default;
// Cards // Cards
$card-spacer-y: $spacer !default; $card-spacer-y: $spacer !default;

View file

@ -1,7 +1,7 @@
/*! /*!
* Bootstrap Grid v5.0.0-beta1 (https://getbootstrap.com/) * Bootstrap Grid v5.0.0-beta1 (https://getbootstrap.com/)
* Copyright 2011-2020 The Bootstrap Authors * Copyright 2011-2021 The Bootstrap Authors
* Copyright 2011-2020 Twitter, Inc. * Copyright 2011-2021 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/ */

View file

@ -1,7 +1,7 @@
/*! /*!
* Bootstrap Reboot v5.0.0-beta1 (https://getbootstrap.com/) * Bootstrap Reboot v5.0.0-beta1 (https://getbootstrap.com/)
* Copyright 2011-2020 The Bootstrap Authors * Copyright 2011-2021 The Bootstrap Authors
* Copyright 2011-2020 Twitter, Inc. * Copyright 2011-2021 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
*/ */

View file

@ -1,18 +1,18 @@
/*! /*!
* Bootstrap Utilities v5.0.0-beta1 (https://getbootstrap.com/) * Bootstrap Utilities v5.0.0-beta1 (https://getbootstrap.com/)
* Copyright 2011-2020 The Bootstrap Authors * Copyright 2011-2021 The Bootstrap Authors
* Copyright 2011-2020 Twitter, Inc. * Copyright 2011-2021 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/ */
// Configuration // Configuration
@import "functions"; @import "functions";
@import "variables"; @import "variables";
@import "mixins"; @import "mixins";
@import "utilities"; @import "utilities";
// Helpers
@import "helpers";
// Utilities // Utilities
@import "utilities/api"; @import "utilities/api";

4
scss/bootstrap.scss vendored
View file

@ -1,7 +1,7 @@
/*! /*!
* Bootstrap v5.0.0-beta1 (https://getbootstrap.com/) * Bootstrap v5.0.0-beta1 (https://getbootstrap.com/)
* Copyright 2011-2020 The Bootstrap Authors * Copyright 2011-2021 The Bootstrap Authors
* Copyright 2011-2020 Twitter, Inc. * Copyright 2011-2021 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/ */

View file

@ -12,7 +12,7 @@
appearance: none; appearance: none;
&:focus { &:focus {
outline: none; outline: 0;
// Pseudo-elements must be split across multiple rulesets to have an effect. // Pseudo-elements must be split across multiple rulesets to have an effect.
// No box-shadow() mixin for focus accessibility. // No box-shadow() mixin for focus accessibility.

View file

@ -6,7 +6,7 @@
.form-select { .form-select {
display: block; display: block;
width: 100%; width: 100%;
padding: $form-select-padding-y ($form-select-padding-x + $form-select-indicator-padding) $form-select-padding-y $form-select-padding-x; padding: $form-select-padding-y $form-select-indicator-padding $form-select-padding-y $form-select-padding-x;
font-family: $form-select-font-family; font-family: $form-select-font-family;
@include font-size($form-select-font-size); @include font-size($form-select-font-size);
font-weight: $form-select-font-weight; font-weight: $form-select-font-weight;

View file

@ -7,6 +7,6 @@
// scss-docs-start form-validation-states-loop // scss-docs-start form-validation-states-loop
@each $state, $data in $form-validation-states { @each $state, $data in $form-validation-states {
@include form-validation-state($state, map-get($data, color), map-get($data, icon)); @include form-validation-state($state, $data...);
} }
// scss-docs-end form-validation-states-loop // scss-docs-end form-validation-states-loop

View file

@ -6,7 +6,7 @@
&::before { &::before {
display: block; display: block;
padding-top: var(--aspect-ratio); padding-top: var(--#{$variable-prefix}aspect-ratio);
content: ""; content: "";
} }
@ -21,6 +21,6 @@
@each $key, $ratio in $aspect-ratios { @each $key, $ratio in $aspect-ratios {
.ratio-#{$key} { .ratio-#{$key} {
--aspect-ratio: #{$ratio}; --#{$variable-prefix}aspect-ratio: #{$ratio};
} }
} }

View file

@ -3,6 +3,6 @@
// //
.visually-hidden, .visually-hidden,
.visually-hidden-focusable:not(:focus) { .visually-hidden-focusable:not(:focus):not(:focus-within) {
@include visually-hidden(); @include visually-hidden();
} }

View file

@ -7,11 +7,11 @@
$background, $background,
$border, $border,
$color: color-contrast($background), $color: color-contrast($background),
$hover-background: if($color == $color-contrast-light, shade-color($background, 15%), tint-color($background, 15%)), $hover-background: if($color == $color-contrast-light, shade-color($background, $btn-hover-bg-shade-amount), tint-color($background, $btn-hover-bg-tint-amount)),
$hover-border: if($color == $color-contrast-light, shade-color($border, 20%), tint-color($border, 10%)), $hover-border: if($color == $color-contrast-light, shade-color($border, $btn-hover-border-shade-amount), tint-color($border, $btn-hover-border-tint-amount)),
$hover-color: color-contrast($hover-background), $hover-color: color-contrast($hover-background),
$active-background: if($color == $color-contrast-light, shade-color($background, 20%), tint-color($background, 20%)), $active-background: if($color == $color-contrast-light, shade-color($background,$btn-active-bg-shade-amount), tint-color($background, $btn-active-bg-tint-amount)),
$active-border: if($color == $color-contrast-light, shade-color($border, 25%), tint-color($border, 10%)), $active-border: if($color == $color-contrast-light, shade-color($border, $btn-active-border-shade-amount), tint-color($border, $btn-active-border-tint-amount)),
$active-color: color-contrast($active-background), $active-color: color-contrast($active-background),
$disabled-background: $background, $disabled-background: $background,
$disabled-border: $border, $disabled-border: $border,

View file

@ -13,7 +13,14 @@
} }
} }
@mixin form-validation-state($state, $color, $icon) { @mixin form-validation-state(
$state,
$color,
$icon,
$tooltip-color: color-contrast($color),
$tooltip-bg-color: rgba($color, $form-feedback-tooltip-opacity),
$focus-box-shadow: 0 0 0 $input-focus-width rgba($color, $input-btn-focus-color-opacity)
) {
.#{$state}-feedback { .#{$state}-feedback {
display: none; display: none;
width: 100%; width: 100%;
@ -33,8 +40,8 @@
margin-top: .1rem; margin-top: .1rem;
@include font-size($form-feedback-tooltip-font-size); @include font-size($form-feedback-tooltip-font-size);
line-height: $form-feedback-tooltip-line-height; line-height: $form-feedback-tooltip-line-height;
color: color-contrast($color); color: $tooltip-color;
background-color: rgba($color, $form-feedback-tooltip-opacity); background-color: $tooltip-bg-color;
@include border-radius($form-feedback-tooltip-border-radius); @include border-radius($form-feedback-tooltip-border-radius);
} }
@ -59,7 +66,7 @@
&:focus { &:focus {
border-color: $color; border-color: $color;
box-shadow: 0 0 0 $input-focus-width rgba($color, $input-btn-focus-color-opacity); box-shadow: $focus-box-shadow;
} }
} }
} }
@ -87,7 +94,7 @@
&:focus { &:focus {
border-color: $color; border-color: $color;
box-shadow: 0 0 0 $input-focus-width rgba($color, .25); box-shadow: $focus-box-shadow;
} }
} }
} }
@ -101,7 +108,7 @@
} }
&:focus { &:focus {
box-shadow: 0 0 0 $input-focus-width rgba($color, .25); box-shadow: $focus-box-shadow;
} }
~ .form-check-label { ~ .form-check-label {

View file

@ -17,12 +17,13 @@
border: 0 !important; border: 0 !important;
} }
// Use to only display content when it's focused. // Use to only display content when it's focused, or one of its child elements is focused
// (i.e. when focus is within the element/container that the class was applied to)
// //
// Useful for "Skip to main content" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 // Useful for "Skip to main content" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
@mixin visually-hidden-focusable() { @mixin visually-hidden-focusable() {
&:not(:focus) { &:not(:focus):not(:focus-within) {
@include visually-hidden(); @include visually-hidden();
} }
} }

View file

@ -26,7 +26,7 @@
@each $key, $utility in $utilities { @each $key, $utility in $utilities {
// The utility can be disabled with `false`, thus check if the utility is a map first // The utility can be disabled with `false`, thus check if the utility is a map first
// Only proceed if responsive media queries are enabled or if it's the base media query // Only proceed if responsive media queries are enabled or if it's the base media query
@if type-of($utility) == "map" and map-get($utility, rfs) { @if type-of($utility) == "map" and map-get($utility, rfs) and (map-get($utility, responsive) or $infix == "") {
@include generate-utility($utility, $infix, true); @include generate-utility($utility, $infix, true);
} }
} }

View file

@ -35,8 +35,8 @@
"strict": "error", "strict": "error",
"unicorn/no-for-loop": "off", "unicorn/no-for-loop": "off",
"unicorn/no-null": "off", "unicorn/no-null": "off",
"unicorn/prefer-dataset": "off", "unicorn/prefer-dom-node-append": "off",
"unicorn/prefer-node-append": "off", "unicorn/prefer-dom-node-dataset": "off",
"unicorn/prefer-query-selector": "off", "unicorn/prefer-query-selector": "off",
"unicorn/prevent-abbreviations": "off" "unicorn/prevent-abbreviations": "off"
} }

View file

@ -4,8 +4,8 @@
/*! /*!
* JavaScript for Bootstrap's docs (https://getbootstrap.com/) * JavaScript for Bootstrap's docs (https://getbootstrap.com/)
* Copyright 2011-2020 The Bootstrap Authors * Copyright 2011-2021 The Bootstrap Authors
* Copyright 2011-2020 Twitter, Inc. * Copyright 2011-2021 Twitter, Inc.
* Licensed under the Creative Commons Attribution 3.0 Unported License. * Licensed under the Creative Commons Attribution 3.0 Unported License.
* For details, see https://creativecommons.org/licenses/by/3.0/. * For details, see https://creativecommons.org/licenses/by/3.0/.
*/ */

View file

@ -29,7 +29,8 @@
border: 1px solid; border: 1px solid;
@include border-radius(); @include border-radius();
&:hover { &:hover,
&:focus {
color: $white; color: $white;
background-color: $primary; background-color: $primary;
} }

View file

@ -187,7 +187,7 @@
width: 16rem; width: 16rem;
@include media-breakpoint-up(md) { @include media-breakpoint-up(md) {
--aspect-ratio: 50%; // 2x1 --bs-aspect-ratio: 50%; // 2x1
} }
} }
} }

View file

@ -5,11 +5,6 @@
.navbar-toggler { .navbar-toggler {
padding: 0; padding: 0;
border: 0; border: 0;
.bi {
width: 2rem;
fill: currentColor;
}
} }
.navbar-nav { .navbar-nav {

View file

@ -49,7 +49,7 @@
padding: .25rem .5rem; padding: .25rem .5rem;
font-weight: 600; font-weight: 600;
color: rgba($black, .65); color: rgba($black, .65);
background-color: none; background-color: transparent;
border: 0; border: 0;
&:hover, &:hover,

View file

@ -1,20 +1,7 @@
// stylelint-disable declaration-no-important
.skippy { .skippy {
background-color: $bd-purple; background-color: $bd-purple;
a { a {
color: $white; color: $white;
} }
&:focus-within a {
position: static !important;
width: auto !important;
height: auto !important;
padding: $spacer / 2 !important;
margin: $spacer / 4 !important;
overflow: visible !important;
clip: auto !important;
white-space: normal !important;
}
} }

View file

@ -70,10 +70,6 @@
box-shadow: 0 0 0 3px rgba($bd-purple-bright, .25); box-shadow: 0 0 0 3px rgba($bd-purple-bright, .25);
} }
.bi {
fill: currentColor;
}
.bi-collapse { display: none; } .bi-collapse { display: none; }
&:not(.collapsed) { &:not(.collapsed) {

View file

@ -1,7 +1,7 @@
/*! /*!
* Bootstrap Docs (https://getbootstrap.com/) * Bootstrap Docs (https://getbootstrap.com/)
* Copyright 2011-2020 The Bootstrap Authors * Copyright 2011-2021 The Bootstrap Authors
* Copyright 2011-2020 Twitter, Inc. * Copyright 2011-2021 Twitter, Inc.
* Licensed under the Creative Commons Attribution 3.0 Unported License. * Licensed under the Creative Commons Attribution 3.0 Unported License.
* For details, see https://creativecommons.org/licenses/by/3.0/. * For details, see https://creativecommons.org/licenses/by/3.0/.
*/ */

View file

@ -75,7 +75,7 @@ Add `.accordion-flush` to remove the default `background-color`, some borders, a
</button> </button>
</h2> </h2>
<div id="flush-collapseOne" class="accordion-collapse collapse" aria-labelledby="flush-headingOne" data-bs-parent="#accordionFlushExample"> <div id="flush-collapseOne" class="accordion-collapse collapse" aria-labelledby="flush-headingOne" data-bs-parent="#accordionFlushExample">
<div class="accordion-body">Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.</div> <div class="accordion-body">Placeholder content for this accordion, which is intended to demonstrate the <code>.accordion-flush</code> class. This is the first item's accordion body.</div>
</div> </div>
</div> </div>
<div class="accordion-item"> <div class="accordion-item">
@ -85,7 +85,7 @@ Add `.accordion-flush` to remove the default `background-color`, some borders, a
</button> </button>
</h2> </h2>
<div id="flush-collapseTwo" class="accordion-collapse collapse" aria-labelledby="flush-headingTwo" data-bs-parent="#accordionFlushExample"> <div id="flush-collapseTwo" class="accordion-collapse collapse" aria-labelledby="flush-headingTwo" data-bs-parent="#accordionFlushExample">
<div class="accordion-body">Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.</div> <div class="accordion-body">Placeholder content for this accordion, which is intended to demonstrate the <code>.accordion-flush</code> class. This is the second item's accordion body. Let's imagine this being filled with some actual content.</div>
</div> </div>
</div> </div>
<div class="accordion-item"> <div class="accordion-item">
@ -95,7 +95,7 @@ Add `.accordion-flush` to remove the default `background-color`, some borders, a
</button> </button>
</h2> </h2>
<div id="flush-collapseThree" class="accordion-collapse collapse" aria-labelledby="flush-headingThree" data-bs-parent="#accordionFlushExample"> <div id="flush-collapseThree" class="accordion-collapse collapse" aria-labelledby="flush-headingThree" data-bs-parent="#accordionFlushExample">
<div class="accordion-body">Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.</div> <div class="accordion-body">Placeholder content for this accordion, which is intended to demonstrate the <code>.accordion-flush</code> class. This is the third item's accordion body. Nothing more exciting happening here in terms of content, but just filling up the space to make it look, at least at first glance, a bit more representative of how this would look in a real-world application.</div>
</div> </div>
</div> </div>
</div> </div>

View file

@ -81,9 +81,9 @@ Create lists of content in a card with a flush list group.
{{< example >}} {{< example >}}
<div class="card" style="width: 18rem;"> <div class="card" style="width: 18rem;">
<ul class="list-group list-group-flush"> <ul class="list-group list-group-flush">
<li class="list-group-item">Cras justo odio</li> <li class="list-group-item">An item</li>
<li class="list-group-item">Dapibus ac facilisis in</li> <li class="list-group-item">A second item</li>
<li class="list-group-item">Vestibulum at eros</li> <li class="list-group-item">A third item</li>
</ul> </ul>
</div> </div>
{{< /example >}} {{< /example >}}
@ -94,9 +94,9 @@ Create lists of content in a card with a flush list group.
Featured Featured
</div> </div>
<ul class="list-group list-group-flush"> <ul class="list-group list-group-flush">
<li class="list-group-item">Cras justo odio</li> <li class="list-group-item">An item</li>
<li class="list-group-item">Dapibus ac facilisis in</li> <li class="list-group-item">A second item</li>
<li class="list-group-item">Vestibulum at eros</li> <li class="list-group-item">A third item</li>
</ul> </ul>
</div> </div>
{{< /example >}} {{< /example >}}
@ -104,9 +104,9 @@ Create lists of content in a card with a flush list group.
{{< example >}} {{< example >}}
<div class="card" style="width: 18rem;"> <div class="card" style="width: 18rem;">
<ul class="list-group list-group-flush"> <ul class="list-group list-group-flush">
<li class="list-group-item">Cras justo odio</li> <li class="list-group-item">An item</li>
<li class="list-group-item">Dapibus ac facilisis in</li> <li class="list-group-item">A second item</li>
<li class="list-group-item">Vestibulum at eros</li> <li class="list-group-item">A third item</li>
</ul> </ul>
<div class="card-footer"> <div class="card-footer">
Card footer Card footer
@ -126,9 +126,9 @@ Mix and match multiple content types to create the card you need, or throw every
<p class="card-text">Some quick example text to build on the card title and make up the bulk of the card's content.</p> <p class="card-text">Some quick example text to build on the card title and make up the bulk of the card's content.</p>
</div> </div>
<ul class="list-group list-group-flush"> <ul class="list-group list-group-flush">
<li class="list-group-item">Cras justo odio</li> <li class="list-group-item">An item</li>
<li class="list-group-item">Dapibus ac facilisis in</li> <li class="list-group-item">A second item</li>
<li class="list-group-item">Vestibulum at eros</li> <li class="list-group-item">A third item</li>
</ul> </ul>
<div class="card-body"> <div class="card-body">
<a href="#" class="card-link">Card link</a> <a href="#" class="card-link">Card link</a>
@ -174,7 +174,7 @@ Card headers can be styled by adding `.card-header` to `<h*>` elements.
</div> </div>
<div class="card-body"> <div class="card-body">
<blockquote class="blockquote mb-0"> <blockquote class="blockquote mb-0">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante.</p> <p>A well-known quote, contained in a blockquote element.</p>
<footer class="blockquote-footer">Someone famous in <cite title="Source Title">Source Title</cite></footer> <footer class="blockquote-footer">Someone famous in <cite title="Source Title">Source Title</cite></footer>
</blockquote> </blockquote>
</div> </div>

View file

@ -121,21 +121,21 @@ Add captions to your slides easily with the `.carousel-caption` element within a
{{< placeholder width="800" height="400" class="bd-placeholder-img-lg d-block w-100" color="#555" background="#777" text="First slide" >}} {{< placeholder width="800" height="400" class="bd-placeholder-img-lg d-block w-100" color="#555" background="#777" text="First slide" >}}
<div class="carousel-caption d-none d-md-block"> <div class="carousel-caption d-none d-md-block">
<h5>First slide label</h5> <h5>First slide label</h5>
<p>Nulla vitae elit libero, a pharetra augue mollis interdum.</p> <p>Some representative placeholder content for the first slide.</p>
</div> </div>
</div> </div>
<div class="carousel-item"> <div class="carousel-item">
{{< placeholder width="800" height="400" class="bd-placeholder-img-lg d-block w-100" color="#444" background="#666" text="Second slide" >}} {{< placeholder width="800" height="400" class="bd-placeholder-img-lg d-block w-100" color="#444" background="#666" text="Second slide" >}}
<div class="carousel-caption d-none d-md-block"> <div class="carousel-caption d-none d-md-block">
<h5>Second slide label</h5> <h5>Second slide label</h5>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> <p>Some representative placeholder content for the second slide.</p>
</div> </div>
</div> </div>
<div class="carousel-item"> <div class="carousel-item">
{{< placeholder width="800" height="400" class="bd-placeholder-img-lg d-block w-100" color="#333" background="#555" text="Third slide" >}} {{< placeholder width="800" height="400" class="bd-placeholder-img-lg d-block w-100" color="#333" background="#555" text="Third slide" >}}
<div class="carousel-caption d-none d-md-block"> <div class="carousel-caption d-none d-md-block">
<h5>Third slide label</h5> <h5>Third slide label</h5>
<p>Praesent commodo cursus magna, vel scelerisque nisl consectetur.</p> <p>Some representative placeholder content for the third slide.</p>
</div> </div>
</div> </div>
</div> </div>
@ -206,6 +206,34 @@ Add `data-bs-interval=""` to a `.carousel-item` to change the amount of time to
</div> </div>
{{< /example >}} {{< /example >}}
### Disable touch swiping
Carousels support swiping left/right on touchscreen devices to move between slides. This can be disabled using the `data-bs-touch` attribute. The example below also does not include the `data-bs-ride` attribute and has `data-bs-interval="false"` so it doesn't autoplay.
{{< example >}}
<div id="carouselExampleControlsNoTouching" class="carousel slide" data-bs-touch="false" data-bs-interval="false">
<div class="carousel-inner">
<div class="carousel-item active">
{{< placeholder width="800" height="400" class="bd-placeholder-img-lg d-block w-100" color="#555" background="#777" text="First slide" >}}
</div>
<div class="carousel-item">
{{< placeholder width="800" height="400" class="bd-placeholder-img-lg d-block w-100" color="#444" background="#666" text="Second slide" >}}
</div>
<div class="carousel-item">
{{< placeholder width="800" height="400" class="bd-placeholder-img-lg d-block w-100" color="#333" background="#555" text="Third slide" >}}
</div>
</div>
<a class="carousel-control-prev" href="#carouselExampleControlsNoTouching" role="button" data-bs-slide="prev">
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
<span class="visually-hidden">Previous</span>
</a>
<a class="carousel-control-next" href="#carouselExampleControlsNoTouching" role="button" data-bs-slide="next">
<span class="carousel-control-next-icon" aria-hidden="true"></span>
<span class="visually-hidden">Next</span>
</a>
</div>
{{< /example >}}
## Dark variant ## Dark variant
Add `.carousel-dark` to the `.carousel` for darker controls, indicators, and captions. Controls have been inverted from their default white fill with the `filter` CSS property. Captions and controls have additional Sass variables that customize the `color` and `background-color`. Add `.carousel-dark` to the `.carousel` for darker controls, indicators, and captions. Controls have been inverted from their default white fill with the `filter` CSS property. Captions and controls have additional Sass variables that customize the `color` and `background-color`.
@ -222,21 +250,21 @@ Add `.carousel-dark` to the `.carousel` for darker controls, indicators, and cap
{{< placeholder width="800" height="400" class="bd-placeholder-img-lg d-block w-100" color="#aaa" background="#f5f5f5" text="First slide" >}} {{< placeholder width="800" height="400" class="bd-placeholder-img-lg d-block w-100" color="#aaa" background="#f5f5f5" text="First slide" >}}
<div class="carousel-caption d-none d-md-block"> <div class="carousel-caption d-none d-md-block">
<h5>First slide label</h5> <h5>First slide label</h5>
<p>Nulla vitae elit libero, a pharetra augue mollis interdum.</p> <p>Some representative placeholder content for the first slide.</p>
</div> </div>
</div> </div>
<div class="carousel-item" data-bs-interval="2000"> <div class="carousel-item" data-bs-interval="2000">
{{< placeholder width="800" height="400" class="bd-placeholder-img-lg d-block w-100" color="#bbb" background="#eee" text="Second slide" >}} {{< placeholder width="800" height="400" class="bd-placeholder-img-lg d-block w-100" color="#bbb" background="#eee" text="Second slide" >}}
<div class="carousel-caption d-none d-md-block"> <div class="carousel-caption d-none d-md-block">
<h5>Second slide label</h5> <h5>Second slide label</h5>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p> <p>Some representative placeholder content for the second slide.</p>
</div> </div>
</div> </div>
<div class="carousel-item"> <div class="carousel-item">
{{< placeholder width="800" height="400" class="bd-placeholder-img-lg d-block w-100" color="#999" background="#e5e5e5" text="Third slide" >}} {{< placeholder width="800" height="400" class="bd-placeholder-img-lg d-block w-100" color="#999" background="#e5e5e5" text="Third slide" >}}
<div class="carousel-caption d-none d-md-block"> <div class="carousel-caption d-none d-md-block">
<h5>Third slide label</h5> <h5>Third slide label</h5>
<p>Praesent commodo cursus magna, vel scelerisque nisl consectetur.</p> <p>Some representative placeholder content for the third slide.</p>
</div> </div>
</div> </div>
</div> </div>
@ -286,7 +314,7 @@ Options can be passed via data attributes or JavaScript. For data attributes, ap
<td><code>interval</code></td> <td><code>interval</code></td>
<td>number</td> <td>number</td>
<td><code>5000</code></td> <td><code>5000</code></td>
<td>The amount of time to delay between automatically cycling an item. If false, carousel will not automatically cycle.</td> <td>The amount of time to delay between automatically cycling an item. If <code>false</code>, carousel will not automatically cycle.</td>
</tr> </tr>
<tr> <tr>
<td><code>keyboard</code></td> <td><code>keyboard</code></td>
@ -297,15 +325,15 @@ Options can be passed via data attributes or JavaScript. For data attributes, ap
<tr> <tr>
<td><code>pause</code></td> <td><code>pause</code></td>
<td>string | boolean</td> <td>string | boolean</td>
<td><code>"hover"</code></td> <td><code>'hover'</code></td>
<td><p>If set to <code>"hover"</code>, pauses the cycling of the carousel on <code>mouseenter</code> and resumes the cycling of the carousel on <code>mouseleave</code>. If set to <code>false</code>, hovering over the carousel won't pause it.</p> <td><p>If set to <code>'hover'</code>, pauses the cycling of the carousel on <code>mouseenter</code> and resumes the cycling of the carousel on <code>mouseleave</code>. If set to <code>false</code>, hovering over the carousel won't pause it.</p>
<p>On touch-enabled devices, when set to <code>"hover"</code>, cycling will pause on <code>touchend</code> (once the user finished interacting with the carousel) for two intervals, before automatically resuming. Note that this is in addition to the above mouse behavior.</p></td> <p>On touch-enabled devices, when set to <code>'hover'</code>, cycling will pause on <code>touchend</code> (once the user finished interacting with the carousel) for two intervals, before automatically resuming. Note that this is in addition to the above mouse behavior.</p></td>
</tr> </tr>
<tr> <tr>
<td><code>slide</code></td> <td><code>ride</code></td>
<td>string | boolean</td> <td>string | boolean</td>
<td><code>false</code></td> <td><code>false</code></td>
<td>Autoplays the carousel after the user manually cycles the first item. If "carousel", autoplays the carousel on load.</td> <td>Autoplays the carousel after the user manually cycles the first item. If set to <code>'carousel'</code>, autoplays the carousel on load.</td>
</tr> </tr>
<tr> <tr>
<td><code>wrap</code></td> <td><code>wrap</code></td>

View file

@ -22,7 +22,7 @@ Click the buttons below to show and hide another element via class changes:
- `.collapsing` is applied during transitions - `.collapsing` is applied during transitions
- `.collapse.show` shows content - `.collapse.show` shows content
You can use a link with the `href` attribute, or a button with the `data-bs-target` attribute. In both cases, the `data-bs-toggle="collapse"` is required. Generally, we recommend using a button with the `data-bs-target` attribute. While not recommended from a semantic point of view, you can also use a link with the `href` attribute (and a `role="button"`). In both cases, the `data-bs-toggle="collapse"` is required.
{{< example >}} {{< example >}}
<p> <p>
@ -35,7 +35,7 @@ You can use a link with the `href` attribute, or a button with the `data-bs-targ
</p> </p>
<div class="collapse" id="collapseExample"> <div class="collapse" id="collapseExample">
<div class="card card-body"> <div class="card card-body">
Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Some placeholder content for the collapse component. This panel is hidden by default but revealed when the user activates the relevant trigger.
</div> </div>
</div> </div>
{{< /example >}} {{< /example >}}
@ -55,14 +55,14 @@ Multiple `<button>` or `<a>` can show and hide an element if they each reference
<div class="col"> <div class="col">
<div class="collapse multi-collapse" id="multiCollapseExample1"> <div class="collapse multi-collapse" id="multiCollapseExample1">
<div class="card card-body"> <div class="card card-body">
Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Some placeholder content for the first collapse component of this multi-collapse example. This panel is hidden by default but revealed when the user activates the relevant trigger.
</div> </div>
</div> </div>
</div> </div>
<div class="col"> <div class="col">
<div class="collapse multi-collapse" id="multiCollapseExample2"> <div class="collapse multi-collapse" id="multiCollapseExample2">
<div class="card card-body"> <div class="card card-body">
Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Some placeholder content for the second collapse component of this multi-collapse example. This panel is hidden by default but revealed when the user activates the relevant trigger.
</div> </div>
</div> </div>
</div> </div>

View file

@ -886,9 +886,9 @@ Options can be passed via data attributes or JavaScript. For data attributes, ap
</tr> </tr>
<tr> <tr>
<td><code>reference</code></td> <td><code>reference</code></td>
<td>string | element</td> <td>string | element | object</td>
<td><code>'toggle'</code></td> <td><code>'toggle'</code></td>
<td>Reference element of the dropdown menu. Accepts the values of <code>'toggle'</code>, <code>'parent'</code>, or an HTMLElement reference. For more information refer to Popper's <a href="https://popper.js.org/docs/v2/constructors/#createpopper">constructor docs</a>.</td> <td>Reference element of the dropdown menu. Accepts the values of <code>'toggle'</code>, <code>'parent'</code>, an HTMLElement reference or an object providing <code>getBoundingClientRect</code>. For more information refer to Popper's <a href="https://popper.js.org/docs/v2/constructors/#createpopper">constructor docs</a> and <a href="https://popper.js.org/docs/v2/virtual-elements/">virtual element docs</a>.</td>
</tr> </tr>
<tr> <tr>
<td><code>display</code></td> <td><code>display</code></td>
@ -900,7 +900,7 @@ Options can be passed via data attributes or JavaScript. For data attributes, ap
<td><code>popperConfig</code></td> <td><code>popperConfig</code></td>
<td>null | object</td> <td>null | object</td>
<td><code>null</code></td> <td><code>null</code></td>
<td>To change Bootstrap's default Popper config, see <a href="https://popper.js.org/docs/v1/#Popper.Defaults">Popper's configuration</a></td> <td>To change Bootstrap's default Popper config, see <a href="https://popper.js.org/docs/v2/constructors/#options">Popper's configuration</a></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View file

@ -12,11 +12,11 @@ The most basic list group is an unordered list with list items and the proper cl
{{< example >}} {{< example >}}
<ul class="list-group"> <ul class="list-group">
<li class="list-group-item">Cras justo odio</li> <li class="list-group-item">An item</li>
<li class="list-group-item">Dapibus ac facilisis in</li> <li class="list-group-item">A second item</li>
<li class="list-group-item">Morbi leo risus</li> <li class="list-group-item">A third item</li>
<li class="list-group-item">Porta ac consectetur ac</li> <li class="list-group-item">A fourth item</li>
<li class="list-group-item">Vestibulum at eros</li> <li class="list-group-item">And a fifth one</li>
</ul> </ul>
{{< /example >}} {{< /example >}}
@ -26,11 +26,11 @@ Add `.active` to a `.list-group-item` to indicate the current active selection.
{{< example >}} {{< example >}}
<ul class="list-group"> <ul class="list-group">
<li class="list-group-item active" aria-current="true">Cras justo odio</li> <li class="list-group-item active" aria-current="true">An active item</li>
<li class="list-group-item">Dapibus ac facilisis in</li> <li class="list-group-item">A second item</li>
<li class="list-group-item">Morbi leo risus</li> <li class="list-group-item">A third item</li>
<li class="list-group-item">Porta ac consectetur ac</li> <li class="list-group-item">A fourth item</li>
<li class="list-group-item">Vestibulum at eros</li> <li class="list-group-item">And a fifth one</li>
</ul> </ul>
{{< /example >}} {{< /example >}}
@ -40,11 +40,11 @@ Add `.disabled` to a `.list-group-item` to make it _appear_ disabled. Note that
{{< example >}} {{< example >}}
<ul class="list-group"> <ul class="list-group">
<li class="list-group-item disabled" aria-disabled="true">Cras justo odio</li> <li class="list-group-item disabled" aria-disabled="true">A disabled item</li>
<li class="list-group-item">Dapibus ac facilisis in</li> <li class="list-group-item">A second item</li>
<li class="list-group-item">Morbi leo risus</li> <li class="list-group-item">A third item</li>
<li class="list-group-item">Porta ac consectetur ac</li> <li class="list-group-item">A fourth item</li>
<li class="list-group-item">Vestibulum at eros</li> <li class="list-group-item">And a fifth one</li>
</ul> </ul>
{{< /example >}} {{< /example >}}
@ -57,12 +57,12 @@ Be sure to **not use the standard `.btn` classes here**.
{{< example >}} {{< example >}}
<div class="list-group"> <div class="list-group">
<a href="#" class="list-group-item list-group-item-action active" aria-current="true"> <a href="#" class="list-group-item list-group-item-action active" aria-current="true">
Cras justo odio The current link item
</a> </a>
<a href="#" class="list-group-item list-group-item-action">Dapibus ac facilisis in</a> <a href="#" class="list-group-item list-group-item-action">A second link item</a>
<a href="#" class="list-group-item list-group-item-action">Morbi leo risus</a> <a href="#" class="list-group-item list-group-item-action">A third link item</a>
<a href="#" class="list-group-item list-group-item-action">Porta ac consectetur ac</a> <a href="#" class="list-group-item list-group-item-action">A fourth link item</a>
<a href="#" class="list-group-item list-group-item-action disabled" tabindex="-1" aria-disabled="true">Vestibulum at eros</a> <a href="#" class="list-group-item list-group-item-action disabled" tabindex="-1" aria-disabled="true">A disabled link item</a>
</div> </div>
{{< /example >}} {{< /example >}}
@ -71,12 +71,12 @@ With `<button>`s, you can also make use of the `disabled` attribute instead of t
{{< example >}} {{< example >}}
<div class="list-group"> <div class="list-group">
<button type="button" class="list-group-item list-group-item-action active" aria-current="true"> <button type="button" class="list-group-item list-group-item-action active" aria-current="true">
Cras justo odio The current button
</button> </button>
<button type="button" class="list-group-item list-group-item-action">Dapibus ac facilisis in</button> <button type="button" class="list-group-item list-group-item-action">A second item</button>
<button type="button" class="list-group-item list-group-item-action">Morbi leo risus</button> <button type="button" class="list-group-item list-group-item-action">A third button item</button>
<button type="button" class="list-group-item list-group-item-action">Porta ac consectetur ac</button> <button type="button" class="list-group-item list-group-item-action">A fourth button item</button>
<button type="button" class="list-group-item list-group-item-action" disabled>Vestibulum at eros</button> <button type="button" class="list-group-item list-group-item-action" disabled>A disabled button item</button>
</div> </div>
{{< /example >}} {{< /example >}}
@ -86,11 +86,11 @@ Add `.list-group-flush` to remove some borders and rounded corners to render lis
{{< example >}} {{< example >}}
<ul class="list-group list-group-flush"> <ul class="list-group list-group-flush">
<li class="list-group-item">Cras justo odio</li> <li class="list-group-item">An item</li>
<li class="list-group-item">Dapibus ac facilisis in</li> <li class="list-group-item">A second item</li>
<li class="list-group-item">Morbi leo risus</li> <li class="list-group-item">A third item</li>
<li class="list-group-item">Porta ac consectetur ac</li> <li class="list-group-item">A fourth item</li>
<li class="list-group-item">Vestibulum at eros</li> <li class="list-group-item">And a fifth one</li>
</ul> </ul>
{{< /example >}} {{< /example >}}
@ -104,9 +104,9 @@ Add `.list-group-horizontal` to change the layout of list group items from verti
{{< list-group.inline >}} {{< list-group.inline >}}
{{- range $.Site.Data.breakpoints }} {{- range $.Site.Data.breakpoints }}
<ul class="list-group list-group-horizontal{{ .abbr }}"> <ul class="list-group list-group-horizontal{{ .abbr }}">
<li class="list-group-item">Cras justo odio</li> <li class="list-group-item">An item</li>
<li class="list-group-item">Dapibus ac facilisis in</li> <li class="list-group-item">A second item</li>
<li class="list-group-item">Morbi leo risus</li> <li class="list-group-item">A third item</li>
</ul> </ul>
{{- end -}} {{- end -}}
{{< /list-group.inline >}} {{< /list-group.inline >}}
@ -118,7 +118,7 @@ Use contextual classes to style list items with a stateful background and color.
{{< example >}} {{< example >}}
<ul class="list-group"> <ul class="list-group">
<li class="list-group-item">Dapibus ac facilisis in</li> <li class="list-group-item">A simple default list group item</li>
{{< list.inline >}} {{< list.inline >}}
{{- range (index $.Site.Data "theme-colors") }} {{- range (index $.Site.Data "theme-colors") }}
<li class="list-group-item list-group-item-{{ .name }}">A simple {{ .name }} list group item</li> <li class="list-group-item list-group-item-{{ .name }}">A simple {{ .name }} list group item</li>
@ -131,7 +131,7 @@ Contextual classes also work with `.list-group-item-action`. Note the addition o
{{< example >}} {{< example >}}
<div class="list-group"> <div class="list-group">
<a href="#" class="list-group-item list-group-item-action">Dapibus ac facilisis in</a> <a href="#" class="list-group-item list-group-item-action">A simple default list group item</a>
{{< list.inline >}} {{< list.inline >}}
{{- range (index $.Site.Data "theme-colors") }} {{- range (index $.Site.Data "theme-colors") }}
<a href="#" class="list-group-item list-group-item-action list-group-item-{{ .name }}">A simple {{ .name }} list group item</a> <a href="#" class="list-group-item list-group-item-action list-group-item-{{ .name }}">A simple {{ .name }} list group item</a>
@ -151,15 +151,15 @@ Add badges to any list group item to show unread counts, activity, and more with
{{< example >}} {{< example >}}
<ul class="list-group"> <ul class="list-group">
<li class="list-group-item d-flex justify-content-between align-items-center"> <li class="list-group-item d-flex justify-content-between align-items-center">
Cras justo odio A list item
<span class="badge bg-primary rounded-pill">14</span> <span class="badge bg-primary rounded-pill">14</span>
</li> </li>
<li class="list-group-item d-flex justify-content-between align-items-center"> <li class="list-group-item d-flex justify-content-between align-items-center">
Dapibus ac facilisis in A second list item
<span class="badge bg-primary rounded-pill">2</span> <span class="badge bg-primary rounded-pill">2</span>
</li> </li>
<li class="list-group-item d-flex justify-content-between align-items-center"> <li class="list-group-item d-flex justify-content-between align-items-center">
Morbi leo risus A third list item
<span class="badge bg-primary rounded-pill">1</span> <span class="badge bg-primary rounded-pill">1</span>
</li> </li>
</ul> </ul>
@ -176,24 +176,24 @@ Add nearly any HTML within, even for linked list groups like the one below, with
<h5 class="mb-1">List group item heading</h5> <h5 class="mb-1">List group item heading</h5>
<small>3 days ago</small> <small>3 days ago</small>
</div> </div>
<p class="mb-1">Donec id elit non mi porta gravida at eget metus. Maecenas sed diam eget risus varius blandit.</p> <p class="mb-1">Some placeholder content in a paragraph.</p>
<small>Donec id elit non mi porta.</small> <small>And some small print.</small>
</a> </a>
<a href="#" class="list-group-item list-group-item-action"> <a href="#" class="list-group-item list-group-item-action">
<div class="d-flex w-100 justify-content-between"> <div class="d-flex w-100 justify-content-between">
<h5 class="mb-1">List group item heading</h5> <h5 class="mb-1">List group item heading</h5>
<small class="text-muted">3 days ago</small> <small class="text-muted">3 days ago</small>
</div> </div>
<p class="mb-1">Donec id elit non mi porta gravida at eget metus. Maecenas sed diam eget risus varius blandit.</p> <p class="mb-1">Some placeholder content in a paragraph.</p>
<small class="text-muted">Donec id elit non mi porta.</small> <small class="text-muted">And some muted small print.</small>
</a> </a>
<a href="#" class="list-group-item list-group-item-action"> <a href="#" class="list-group-item list-group-item-action">
<div class="d-flex w-100 justify-content-between"> <div class="d-flex w-100 justify-content-between">
<h5 class="mb-1">List group item heading</h5> <h5 class="mb-1">List group item heading</h5>
<small class="text-muted">3 days ago</small> <small class="text-muted">3 days ago</small>
</div> </div>
<p class="mb-1">Donec id elit non mi porta gravida at eget metus. Maecenas sed diam eget risus varius blandit.</p> <p class="mb-1">Some placeholder content in a paragraph.</p>
<small class="text-muted">Donec id elit non mi porta.</small> <small class="text-muted">And some muted small print.</small>
</a> </a>
</div> </div>
{{< /example >}} {{< /example >}}
@ -206,23 +206,23 @@ Place Bootstrap's checkboxes and radios within list group items and customize as
<ul class="list-group"> <ul class="list-group">
<li class="list-group-item"> <li class="list-group-item">
<input class="form-check-input me-1" type="checkbox" value="" aria-label="..."> <input class="form-check-input me-1" type="checkbox" value="" aria-label="...">
Cras justo odio First checkbox
</li> </li>
<li class="list-group-item"> <li class="list-group-item">
<input class="form-check-input me-1" type="checkbox" value="" aria-label="..."> <input class="form-check-input me-1" type="checkbox" value="" aria-label="...">
Dapibus ac facilisis in Second checkbox
</li> </li>
<li class="list-group-item"> <li class="list-group-item">
<input class="form-check-input me-1" type="checkbox" value="" aria-label="..."> <input class="form-check-input me-1" type="checkbox" value="" aria-label="...">
Morbi leo risus Third checkbox
</li> </li>
<li class="list-group-item"> <li class="list-group-item">
<input class="form-check-input me-1" type="checkbox" value="" aria-label="..."> <input class="form-check-input me-1" type="checkbox" value="" aria-label="...">
Porta ac consectetur ac Fourth checkbox
</li> </li>
<li class="list-group-item"> <li class="list-group-item">
<input class="form-check-input me-1" type="checkbox" value="" aria-label="..."> <input class="form-check-input me-1" type="checkbox" value="" aria-label="...">
Vestibulum at eros Fifth checkbox
</li> </li>
</ul> </ul>
{{< /example >}} {{< /example >}}
@ -233,23 +233,23 @@ And if you want `<label>`s as the `.list-group-item` for large hit areas, you ca
<div class="list-group"> <div class="list-group">
<label class="list-group-item"> <label class="list-group-item">
<input class="form-check-input me-1" type="checkbox" value=""> <input class="form-check-input me-1" type="checkbox" value="">
Cras justo odio First checkbox
</label> </label>
<label class="list-group-item"> <label class="list-group-item">
<input class="form-check-input me-1" type="checkbox" value=""> <input class="form-check-input me-1" type="checkbox" value="">
Dapibus ac facilisis in Second checkbox
</label> </label>
<label class="list-group-item"> <label class="list-group-item">
<input class="form-check-input me-1" type="checkbox" value=""> <input class="form-check-input me-1" type="checkbox" value="">
Morbi leo risus Third checkbox
</label> </label>
<label class="list-group-item"> <label class="list-group-item">
<input class="form-check-input me-1" type="checkbox" value=""> <input class="form-check-input me-1" type="checkbox" value="">
Porta ac consectetur ac Fourth checkbox
</label> </label>
<label class="list-group-item"> <label class="list-group-item">
<input class="form-check-input me-1" type="checkbox" value=""> <input class="form-check-input me-1" type="checkbox" value="">
Vestibulum at eros Fifth checkbox
</label> </label>
</div> </div>
{{< /example >}} {{< /example >}}
@ -272,16 +272,16 @@ Use the tab JavaScript plugin—include it individually or through the compiled
<div class="col-8"> <div class="col-8">
<div class="tab-content" id="nav-tabContent"> <div class="tab-content" id="nav-tabContent">
<div class="tab-pane fade show active" id="list-home" role="tabpanel" aria-labelledby="list-home-list"> <div class="tab-pane fade show active" id="list-home" role="tabpanel" aria-labelledby="list-home-list">
<p>Velit aute mollit ipsum ad dolor consectetur nulla officia culpa adipisicing exercitation fugiat tempor. Voluptate deserunt sit sunt nisi aliqua fugiat proident ea ut. Mollit voluptate reprehenderit occaecat nisi ad non minim tempor sunt voluptate consectetur exercitation id ut nulla. Ea et fugiat aliquip nostrud sunt incididunt consectetur culpa aliquip eiusmod dolor. Anim ad Lorem aliqua in cupidatat nisi enim eu nostrud do aliquip veniam minim.</p> <p>Some placeholder content in a paragraph relating to "Home". And some more content, used here just to pad out and fill this tab panel. In production, you would obviously have more real content here. And not just text. It could be anything, really. Text, images, forms.</p>
</div> </div>
<div class="tab-pane fade" id="list-profile" role="tabpanel" aria-labelledby="list-profile-list"> <div class="tab-pane fade" id="list-profile" role="tabpanel" aria-labelledby="list-profile-list">
<p>Cupidatat quis ad sint excepteur laborum in esse qui. Et excepteur consectetur ex nisi eu do cillum ad laborum. Mollit et eu officia dolore sunt Lorem culpa qui commodo velit ex amet id ex. Officia anim incididunt laboris deserunt anim aute dolor incididunt veniam aute dolore do exercitation. Dolor nisi culpa ex ad irure in elit eu dolore. Ad laboris ipsum reprehenderit irure non commodo enim culpa commodo veniam incididunt veniam ad.</p> <p>Some placeholder content in a paragraph relating to "Profile". And some more content, used here just to pad out and fill this tab panel. In production, you would obviously have more real content here. And not just text. It could be anything, really. Text, images, forms.</p>
</div> </div>
<div class="tab-pane fade" id="list-messages" role="tabpanel" aria-labelledby="list-messages-list"> <div class="tab-pane fade" id="list-messages" role="tabpanel" aria-labelledby="list-messages-list">
<p>Ut ut do pariatur aliquip aliqua aliquip exercitation do nostrud commodo reprehenderit aute ipsum voluptate. Irure Lorem et laboris nostrud amet cupidatat cupidatat anim do ut velit mollit consequat enim tempor. Consectetur est minim nostrud nostrud consectetur irure labore voluptate irure. Ipsum id Lorem sit sint voluptate est pariatur eu ad cupidatat et deserunt culpa sit eiusmod deserunt. Consectetur et fugiat anim do eiusmod aliquip nulla laborum elit adipisicing pariatur cillum.</p> <p>Some placeholder content in a paragraph relating to "Messages". And some more content, used here just to pad out and fill this tab panel. In production, you would obviously have more real content here. And not just text. It could be anything, really. Text, images, forms.</p>
</div> </div>
<div class="tab-pane fade" id="list-settings" role="tabpanel" aria-labelledby="list-settings-list"> <div class="tab-pane fade" id="list-settings" role="tabpanel" aria-labelledby="list-settings-list">
<p>Irure enim occaecat labore sit qui aliquip reprehenderit amet velit. Deserunt ullamco ex elit nostrud ut dolore nisi officia magna sit occaecat laboris sunt dolor. Nisi eu minim cillum occaecat aute est cupidatat aliqua labore aute occaecat ea aliquip sunt amet. Aute mollit dolor ut exercitation irure commodo non amet consectetur quis amet culpa. Quis ullamco nisi amet qui aute irure eu. Magna labore dolor quis ex labore id nostrud deserunt dolor eiusmod eu pariatur culpa mollit in irure.</p> <p>Some placeholder content in a paragraph relating to "Settings". And some more content, used here just to pad out and fill this tab panel. In production, you would obviously have more real content here. And not just text. It could be anything, really. Text, images, forms.</p>
</div> </div>
</div> </div>
</div> </div>

View file

@ -186,7 +186,6 @@ When backdrop is set to static, the modal will not close when clicking outside i
</div> </div>
``` ```
### Scrolling long content ### Scrolling long content
When modals become too long for the user's viewport or device, they scroll independent of the page itself. Try the demo below to see what we mean. When modals become too long for the user's viewport or device, they scroll independent of the page itself. Try the demo below to see what we mean.
@ -199,24 +198,14 @@ When modals become too long for the user's viewport or device, they scroll indep
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p> <p>What follows is just some placeholder text for this modal dialog. Sipping on Rosé, Silver Lake sun, coming up all lazy. Its in the palm of your hand now baby. So we hit the boulevard. So make a wish, I'll make it like your birthday everyday. Do you ever feel already buried deep six feet under? It's time to bring out the big balloons. You could've been the greatest. Passport stamps, she's cosmopolitan. Your kiss is cosmic, every move is magic.</p>
<p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p> <p>We're living the life. We're doing it right. Open up your heart. I was tryna hit it and quit it. Her love is like a drug. Always leaves a trail of stardust. The girl's a freak, she drive a jeep in Laguna Beach. Fine, fresh, fierce, we got it on lock. All my girls vintage Chanel baby.</p>
<p>Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.</p> <p>Before you met me I was alright but things were kinda heavy. Peach-pink lips, yeah, everybody stares. This is no big deal. Calling out my name. I could have rewrite your addiction. She's got that, je ne sais quoi, you know it. Heavy is the head that wears the crown. 'Cause, baby, you're a firework. Like thunder gonna shake the ground.</p>
<p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p> <p>Just own the night like the 4th of July! Im gon put her in a coma. What you're waiting for, it's time for you to show it off. Can't replace you with a million rings. You open my eyes and I'm ready to go, lead me into the light. And here you are. Im gon put her in a coma. Come on, let your colours burst. So cover your eyes, I have a surprise. As I march alone to a different beat. Glitter all over the room pink flamingos in the pool.</p>
<p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p> <p>You just gotta ignite the light and let it shine! Come just as you are to me. Just own the night like the 4th of July. Infect me with your love and fill me with your poison. Come just as you are to me. End of the rainbow looking treasure.</p>
<p>Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.</p> <p>I can't sleep let's run away and don't ever look back, don't ever look back. I can't sleep let's run away and don't ever look back, don't ever look back. Yes, we make angels cry, raining down on earth from up above. I'm walking on air (tonight). Let you put your hands on me in my skin-tight jeans. Stinging like a bee I earned my stripes. I went from zero, to my own hero. Even brighter than the moon, moon, moon. Make 'em go, 'Aah, aah, aah' as you shoot across the sky-y-y! Why don't you let me stop by?</p>
<p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p> <p>Boom, boom, boom. Never made me blink one time. Yeah, you're lucky if you're on her plane. Talk about our future like we had a clue. Oh my God no exaggeration. You're original, cannot be replaced. The girl's a freak, she drive a jeep in Laguna Beach. It's no big deal, it's no big deal, it's no big deal. In another life I would make you stay. I'm ma get your heart racing in my skin-tight jeans. I wanna walk on your wave length and be there when you vibrate Never made me blink one time.</p>
<p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p> <p>We'd keep all our promises be us against the world. If you get the chance you better keep her. It's time to bring out the big, big, big, big, big, big balloons. I hope you got a healthy appetite. Don't let the greatness get you down, oh, oh yeah. Yeah, she's footloose and so fancy free. I want the jaw droppin', eye poppin', head turnin', body shockin'. End of the rainbow looking treasure.</p>
<p>Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.</p>
<p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p>
<p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p>
<p>Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.</p>
<p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p>
<p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p>
<p>Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.</p>
<p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p>
<p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p>
<p>Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.</p>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
@ -242,24 +231,14 @@ You can also create a scrollable modal that allows scroll the modal body by addi
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p> <p>What follows is just some placeholder text for this modal dialog. You just gotta ignite the light and let it shine! Come just as you are to me. Just own the night like the 4th of July. Infect me with your love and fill me with your poison. Come just as you are to me. End of the rainbow looking treasure.</p>
<p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p> <p>I can't sleep let's run away and don't ever look back, don't ever look back. I can't sleep let's run away and don't ever look back, don't ever look back. Yes, we make angels cry, raining down on earth from up above. I'm walking on air (tonight). Let you put your hands on me in my skin-tight jeans. Stinging like a bee I earned my stripes. I went from zero, to my own hero. Even brighter than the moon, moon, moon. Make 'em go, 'Aah, aah, aah' as you shoot across the sky-y-y! Why don't you let me stop by?</p>
<p>Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.</p> <p>Boom, boom, boom. Never made me blink one time. Yeah, you're lucky if you're on her plane. Talk about our future like we had a clue. Oh my God no exaggeration. You're original, cannot be replaced. The girl's a freak, she drive a jeep in Laguna Beach. It's no big deal, it's no big deal, it's no big deal. In another life I would make you stay. I'm ma get your heart racing in my skin-tight jeans. I wanna walk on your wave length and be there when you vibrate Never made me blink one time.</p>
<p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p> <p>We'd keep all our promises be us against the world. In another life I would be your girl. We can dance, until we die, you and I, will be young forever. And on my 18th Birthday we got matching tattoos. So open up your heart and just let it begin. 'Cause she's the muse and the artist. She eats your heart out. Like Jeffrey Dahmer (woo). Pop your confetti. (This is how we do) I know one spark will shock the world, yeah yeah. If you only knew what the future holds.</p>
<p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p> <p>Sipping on Rosé, Silver Lake sun, coming up all lazy. Its in the palm of your hand now baby. So we hit the boulevard. So make a wish, I'll make it like your birthday everyday. Do you ever feel already buried deep six feet under? It's time to bring out the big balloons. You could've been the greatest. Passport stamps, she's cosmopolitan. Your kiss is cosmic, every move is magic.</p>
<p>Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.</p> <p>We're living the life. We're doing it right. Open up your heart. I was tryna hit it and quit it. Her love is like a drug. Always leaves a trail of stardust. The girl's a freak, she drive a jeep in Laguna Beach. Fine, fresh, fierce, we got it on lock. All my girls vintage Chanel baby.</p>
<p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p> <p>Before you met me I was alright but things were kinda heavy. Peach-pink lips, yeah, everybody stares. This is no big deal. Calling out my name. I could have rewrite your addiction. She's got that, je ne sais quoi, you know it. Heavy is the head that wears the crown. 'Cause, baby, you're a firework. Like thunder gonna shake the ground.</p>
<p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p> <p>Just own the night like the 4th of July! Im gon put her in a coma. What you're waiting for, it's time for you to show it off. Can't replace you with a million rings. You open my eyes and I'm ready to go, lead me into the light. And here you are. Im gon put her in a coma. Come on, let your colours burst. So cover your eyes, I have a surprise. As I march alone to a different beat. Glitter all over the room pink flamingos in the pool.</p>
<p>Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.</p>
<p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p>
<p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p>
<p>Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.</p>
<p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p>
<p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p>
<p>Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.</p>
<p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p>
<p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p>
<p>Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.</p>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
@ -294,7 +273,7 @@ Add `.modal-dialog-centered` to `.modal-dialog` to vertically center the modal.
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p> <p>Placeholder text for this demonstration of a vertically centered modal dialog.</p>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
@ -312,11 +291,10 @@ Add `.modal-dialog-centered` to `.modal-dialog` to vertically center the modal.
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p> <p>Placeholder text for this demonstration of a vertically centered modal dialog.</p>
<p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p> <p>In this case, the dialog has a bit more content, just to show how vertical centering can be added to a scrollable modal.</p>
<p>Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.</p> <p>What follows is just some placeholder text for this modal dialog. Sipping on Rosé, Silver Lake sun, coming up all lazy. Its in the palm of your hand now baby. So we hit the boulevard. So make a wish, I'll make it like your birthday everyday. Do you ever feel already buried deep six feet under? It's time to bring out the big balloons. You could've been the greatest. Passport stamps, she's cosmopolitan. Your kiss is cosmic, every move is magic.</p>
<p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p> <p>We're living the life. We're doing it right. Open up your heart. I was tryna hit it and quit it. Her love is like a drug. Always leaves a trail of stardust. The girl's a freak, she drive a jeep in Laguna Beach. Fine, fresh, fierce, we got it on lock. All my girls vintage Chanel baby.</p>
<p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
@ -714,24 +692,14 @@ Another override is the option to pop up a modal that covers the user viewport,
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p> <p>What follows is just some placeholder text for this modal dialog. I feel like I'm already there. Im gon put her in a coma. Boom, boom, boom. You're reading me like erotica, boy, you make me feel exotic, yeah. Happy birthday. From Tokyo to Mexico, to Rio. I knew you were.</p>
<p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p> <p>Last Friday night. Calling out my name. Kiss her, touch her, squeeze her buns. Heavy is the head that wears the crown. So open up your heart and just let it begin. Boy all this time was worth the waiting. You know that I'm the girl that you should call. End of the rainbow looking treasure. You're reading me like erotica, boy, you make me feel exotic, yeah. Do you know that there's still a chance for you 'Cause there's a spark in you? So I sat quietly, agreed politely. From Tokyo to Mexico, to Rio.</p>
<p>Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.</p> <p>Don't be a shy kinda guy I'll bet it's beautiful. You fall asleep during foreplay, 'Cause the pills you take, are more your forte. Open up your heart. You're never gonna be unsatisfied. Know that you are worthy. This one goes out to the ladies at breakfast in last night's dress. You think you've seen her in a magazine. I should've told you what you meant to me 'Cause now I pay the price. Takes you miles high, so high, 'cause shes got that one international smile.</p>
<p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p> <p>Yo, shout out to all you kids, buying bottle service, with your rent money. So I sat quietly, agreed politely. They say, be afraid you're not like the others, futuristic lover. Boom, boom, boom. Don't need apologies. We can dance, until we die, you and I, will be young forever. If you choose to walk away, dont walk away. You know that I'm the girl that you should call. This Friday night, do it all again.</p>
<p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p> <p>I'm walking on air. But lil' mama so dope. It's time to bring out the big balloons. Are you ready for, ready for. The boys break their necks try'na to creep a little sneak peek. Summer after high school when we first met. If you want it all. (This is how we do) You open my eyes and I'm ready to go, lead me into the light.</p>
<p>Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.</p> <p>Growing fast into a bolt of lightning. We freak in my jeep, Snoop Doggy Dogg on the stereo. Baby do you dare to do this? Open up your heart and just let it begin. Peach-pink lips, yeah, everybody stares. Be your teenage dream tonight. Are you brave enough to let me see your peacock? You think I'm funny when I tell the punchline wrong. Woo! I knew you were. All this money can't buy me a time machine. I can't sleep let's run away and don't ever look back, don't ever look back.</p>
<p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p> <p>Make it like your birthday everyday. I'm not sticking around to watch you go down. Uh-huh, I see you. For you I'll risk it all, all. Im gon put her in a coma. She ride me like a roller coaster. You hear my voice, you hear that sound. 'Cause I will love you unconditionally (oh yeah). They say, be afraid you're not like the others, futuristic lover. There is no fear now, let go and just be free, I will love you unconditionally.</p>
<p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p> <p>We can dance, until we die, you and I, will be young forever. Pop your Pérignon. Last Friday night, yeah I think we broke the law, always say we're gonna stop. Don't need apologies. Give you something good to celebrate. But dont make me your enemy, your enemy, your enemy. Flowers in her hair, she don't care. Tone, tan fit and ready, turn it up cause its gettin' heavy.</p>
<p>Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.</p>
<p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p>
<p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p>
<p>Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.</p>
<p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p>
<p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p>
<p>Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.</p>
<p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p>
<p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p>
<p>Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.</p>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>

View file

@ -124,9 +124,9 @@ Adding images to the `.navbar-brand` will likely always require custom styles or
Navbar navigation links build on our `.nav` options with their own modifier class and require the use of [toggler classes](#toggler) for proper responsive styling. **Navigation in navbars will also grow to occupy as much horizontal space as possible** to keep your navbar contents securely aligned. Navbar navigation links build on our `.nav` options with their own modifier class and require the use of [toggler classes](#toggler) for proper responsive styling. **Navigation in navbars will also grow to occupy as much horizontal space as possible** to keep your navbar contents securely aligned.
Active states—with `.active`—to indicate the current page can be applied directly to `.nav-link`s or their immediate parent `.nav-item`s. Add the `.active` class on `.nav-link` to indicate the current page.
Please note that you should also add the `aria-current` attribute on the `.nav-link` itself. Please note that you should also add the `aria-current` attribute on the active `.nav-link`.
{{< example >}} {{< example >}}
<nav class="navbar navbar-expand-lg navbar-light bg-light"> <nav class="navbar navbar-expand-lg navbar-light bg-light">

View file

@ -306,7 +306,7 @@ Add dropdown menus with a little extra HTML and the [dropdowns JavaScript plugin
## JavaScript behavior ## JavaScript behavior
Use the tab JavaScript plugin—include it individually or through the compiled `bootstrap.js` file—to extend our navigational tabs and pills to create tabbable panes of local content, even via dropdown menus. Use the tab JavaScript plugin—include it individually or through the compiled `bootstrap.js` file—to extend our navigational tabs and pills to create tabbable panes of local content.
Dynamic tabbed interfaces, as described in the [<abbr title="Web Accessibility Initiative">WAI</abbr> <abbr title="Accessible Rich Internet Applications">ARIA</abbr> Authoring Practices](https://www.w3.org/TR/wai-aria-practices/#tabpanel), require `role="tablist"`, `role="tab"`, `role="tabpanel"`, and additional `aria-` attributes in order to convey their structure, functionality and current state to users of assistive technologies (such as screen readers). Dynamic tabbed interfaces, as described in the [<abbr title="Web Accessibility Initiative">WAI</abbr> <abbr title="Accessible Rich Internet Applications">ARIA</abbr> Authoring Practices](https://www.w3.org/TR/wai-aria-practices/#tabpanel), require `role="tablist"`, `role="tab"`, `role="tabpanel"`, and additional `aria-` attributes in order to convey their structure, functionality and current state to users of assistive technologies (such as screen readers).
@ -326,13 +326,13 @@ Note that dynamic tabbed interfaces should <em>not</em> contain dropdown menus,
</ul> </ul>
<div class="tab-content" id="myTabContent"> <div class="tab-content" id="myTabContent">
<div class="tab-pane fade show active" id="home" role="tabpanel" aria-labelledby="home-tab"> <div class="tab-pane fade show active" id="home" role="tabpanel" aria-labelledby="home-tab">
<p>Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth. Cosby sweater eu banh mi, qui irure terry richardson ex squid. Aliquip placeat salvia cillum iphone. Seitan aliquip quis cardigan american apparel, butcher voluptate nisi qui.</p> <p>Placeholder content for the tab panel. This one relates to the home tab. Takes you miles high, so high, 'cause shes got that one international smile. There's a stranger in my bed, there's a pounding in my head. Oh, no. In another life I would make you stay. Cause I, Im capable of anything. Suiting up for my crowning battle. Used to steal your parents' liquor and climb to the roof. Tone, tan fit and ready, turn it up cause its gettin' heavy. Her love is like a drug. I guess that I forgot I had a choice.</p>
</div> </div>
<div class="tab-pane fade" id="profile" role="tabpanel" aria-labelledby="profile-tab"> <div class="tab-pane fade" id="profile" role="tabpanel" aria-labelledby="profile-tab">
<p>Food truck fixie locavore, accusamus mcsweeney's marfa nulla single-origin coffee squid. Exercitation +1 labore velit, blog sartorial PBR leggings next level wes anderson artisan four loko farm-to-table craft beer twee. Qui photo booth letterpress, commodo enim craft beer mlkshk aliquip jean shorts ullamco ad vinyl cillum PBR. Homo nostrud organic, assumenda labore aesthetic magna delectus mollit. Keytar helvetica VHS salvia yr, vero magna velit sapiente labore stumptown. Vegan fanny pack odio cillum wes anderson 8-bit, sustainable jean shorts beard ut DIY ethical culpa terry richardson biodiesel. Art party scenester stumptown, tumblr butcher vero sint qui sapiente accusamus tattooed echo park.</p> <p>Placeholder content for the tab panel. This one relates to the profile tab. You got the finest architecture. Passport stamps, she's cosmopolitan. Fine, fresh, fierce, we got it on lock. Never planned that one day I'd be losing you. She eats your heart out. Your kiss is cosmic, every move is magic. I mean the ones, I mean like she's the one. Greetings loved ones let's take a journey. Just own the night like the 4th of July! But you'd rather get wasted.</p>
</div> </div>
<div class="tab-pane fade" id="contact" role="tabpanel" aria-labelledby="contact-tab"> <div class="tab-pane fade" id="contact" role="tabpanel" aria-labelledby="contact-tab">
<p>Etsy mixtape wayfarers, ethical wes anderson tofu before they sold out mcsweeney's organic lomo retro fanny pack lo-fi farm-to-table readymade. Messenger bag gentrify pitchfork tattooed craft beer, iphone skateboard locavore carles etsy salvia banksy hoodie helvetica. DIY synth PBR banksy irony. Leggings gentrify squid 8-bit cred pitchfork. Williamsburg banh mi whatever gluten-free, carles pitchfork biodiesel fixie etsy retro mlkshk vice blog. Scenester cred you probably haven't heard of them, vinyl craft beer blog stumptown. Pitchfork sustainable tofu synth chambray yr.</p> <p>Placeholder content for the tab panel. This one relates to the contact tab. Her love is like a drug. All my girls vintage Chanel baby. Got a motel and built a fort out of sheets. 'Cause she's the muse and the artist. (This is how we do) So you wanna play with magic. So just be sure before you give it all to me. I'm walking, I'm walking on air (tonight). Skip the talk, heard it all, time to walk the walk. Catch her if you can. Stinging like a bee I earned my stripes.</p>
</div> </div>
</div> </div>
</div> </div>
@ -368,13 +368,13 @@ To help fit your needs, this works with `<ul>`-based markup, as shown above, or
</nav> </nav>
<div class="tab-content" id="nav-tabContent"> <div class="tab-content" id="nav-tabContent">
<div class="tab-pane fade show active" id="nav-home" role="tabpanel" aria-labelledby="nav-home-tab"> <div class="tab-pane fade show active" id="nav-home" role="tabpanel" aria-labelledby="nav-home-tab">
<p>Et et consectetur ipsum labore excepteur est proident excepteur ad velit occaecat qui minim occaecat veniam. Fugiat veniam incididunt anim aliqua enim pariatur veniam sunt est aute sit dolor anim. Velit non irure adipisicing aliqua ullamco irure incididunt irure non esse consectetur nostrud minim non minim occaecat. Amet duis do nisi duis veniam non est eiusmod tempor incididunt tempor dolor ipsum in qui sit. Exercitation mollit sit culpa nisi culpa non adipisicing reprehenderit do dolore. Duis reprehenderit occaecat anim ullamco ad duis occaecat ex.</p> <p>Placeholder content for the tab panel. This one relates to the home tab. Takes you miles high, so high, 'cause shes got that one international smile. There's a stranger in my bed, there's a pounding in my head. Oh, no. In another life I would make you stay. Cause I, Im capable of anything. Suiting up for my crowning battle. Used to steal your parents' liquor and climb to the roof. Tone, tan fit and ready, turn it up cause its gettin' heavy. Her love is like a drug. I guess that I forgot I had a choice.</p>
</div> </div>
<div class="tab-pane fade" id="nav-profile" role="tabpanel" aria-labelledby="nav-profile-tab"> <div class="tab-pane fade" id="nav-profile" role="tabpanel" aria-labelledby="nav-profile-tab">
<p>Nulla est ullamco ut irure incididunt nulla Lorem Lorem minim irure officia enim reprehenderit. Magna duis labore cillum sint adipisicing exercitation ipsum. Nostrud ut anim non exercitation velit laboris fugiat cupidatat. Commodo esse dolore fugiat sint velit ullamco magna consequat voluptate minim amet aliquip ipsum aute laboris nisi. Labore labore veniam irure irure ipsum pariatur mollit magna in cupidatat dolore magna irure esse tempor ad mollit. Dolore commodo nulla minim amet ipsum officia consectetur amet ullamco voluptate nisi commodo ea sit eu.</p> <p>Placeholder content for the tab panel. This one relates to the profile tab. You got the finest architecture. Passport stamps, she's cosmopolitan. Fine, fresh, fierce, we got it on lock. Never planned that one day I'd be losing you. She eats your heart out. Your kiss is cosmic, every move is magic. I mean the ones, I mean like she's the one. Greetings loved ones let's take a journey. Just own the night like the 4th of July! But you'd rather get wasted.</p>
</div> </div>
<div class="tab-pane fade" id="nav-contact" role="tabpanel" aria-labelledby="nav-contact-tab"> <div class="tab-pane fade" id="nav-contact" role="tabpanel" aria-labelledby="nav-contact-tab">
<p>Sint sit mollit irure quis est nostrud cillum consequat Lorem esse do quis dolor esse fugiat sunt do. Eu ex commodo veniam Lorem aliquip laborum occaecat qui Lorem esse mollit dolore anim cupidatat. Deserunt officia id Lorem nostrud aute id commodo elit eiusmod enim irure amet eiusmod qui reprehenderit nostrud tempor. Fugiat ipsum excepteur in aliqua non et quis aliquip ad irure in labore cillum elit enim. Consequat aliquip incididunt ipsum et minim laborum laborum laborum et cillum labore. Deserunt adipisicing cillum id nulla minim nostrud labore eiusmod et amet. Laboris consequat consequat commodo non ut non aliquip reprehenderit nulla anim occaecat. Sunt sit ullamco reprehenderit irure ea ullamco Lorem aute nostrud magna.</p> <p>Placeholder content for the tab panel. This one relates to the contact tab. Her love is like a drug. All my girls vintage Chanel baby. Got a motel and built a fort out of sheets. 'Cause she's the muse and the artist. (This is how we do) So you wanna play with magic. So just be sure before you give it all to me. I'm walking, I'm walking on air (tonight). Skip the talk, heard it all, time to walk the walk. Catch her if you can. Stinging like a bee I earned my stripes.</p>
</div> </div>
</div> </div>
</div> </div>
@ -410,13 +410,13 @@ The tabs plugin also works with pills.
</ul> </ul>
<div class="tab-content" id="pills-tabContent"> <div class="tab-content" id="pills-tabContent">
<div class="tab-pane fade show active" id="pills-home" role="tabpanel" aria-labelledby="pills-home-tab"> <div class="tab-pane fade show active" id="pills-home" role="tabpanel" aria-labelledby="pills-home-tab">
<p>Consequat occaecat ullamco amet non eiusmod nostrud dolore irure incididunt est duis anim sunt officia. Fugiat velit proident aliquip nisi incididunt nostrud exercitation proident est nisi. Irure magna elit commodo anim ex veniam culpa eiusmod id nostrud sit cupidatat in veniam ad. Eiusmod consequat eu adipisicing minim anim aliquip cupidatat culpa excepteur quis. Occaecat sit eu exercitation irure Lorem incididunt nostrud.</p> <p>Placeholder content for the tab panel. This one relates to the home tab. Takes you miles high, so high, 'cause shes got that one international smile. There's a stranger in my bed, there's a pounding in my head. Oh, no. In another life I would make you stay. Cause I, Im capable of anything. Suiting up for my crowning battle. Used to steal your parents' liquor and climb to the roof. Tone, tan fit and ready, turn it up cause its gettin' heavy. Her love is like a drug. I guess that I forgot I had a choice.</p>
</div> </div>
<div class="tab-pane fade" id="pills-profile" role="tabpanel" aria-labelledby="pills-profile-tab"> <div class="tab-pane fade" id="pills-profile" role="tabpanel" aria-labelledby="pills-profile-tab">
<p>Ad pariatur nostrud pariatur exercitation ipsum ipsum culpa mollit commodo mollit ex. Aute sunt incididunt amet commodo est sint nisi deserunt pariatur do. Aliquip ex eiusmod voluptate exercitation cillum id incididunt elit sunt. Qui minim sit magna Lorem id et dolore velit Lorem amet exercitation duis deserunt. Anim id labore elit adipisicing ut in id occaecat pariatur ut ullamco ea tempor duis.</p> <p>Placeholder content for the tab panel. This one relates to the profile tab. You got the finest architecture. Passport stamps, she's cosmopolitan. Fine, fresh, fierce, we got it on lock. Never planned that one day I'd be losing you. She eats your heart out. Your kiss is cosmic, every move is magic. I mean the ones, I mean like she's the one. Greetings loved ones let's take a journey. Just own the night like the 4th of July! But you'd rather get wasted.</p>
</div> </div>
<div class="tab-pane fade" id="pills-contact" role="tabpanel" aria-labelledby="pills-contact-tab"> <div class="tab-pane fade" id="pills-contact" role="tabpanel" aria-labelledby="pills-contact-tab">
<p>Est quis nulla laborum officia ad nisi ex nostrud culpa Lorem excepteur aliquip dolor aliqua irure ex. Nulla ut duis ipsum nisi elit fugiat commodo sunt reprehenderit laborum veniam eu veniam. Eiusmod minim exercitation fugiat irure ex labore incididunt do fugiat commodo aliquip sit id deserunt reprehenderit aliquip nostrud. Amet ex cupidatat excepteur aute veniam incididunt mollit cupidatat esse irure officia elit do ipsum ullamco Lorem. Ullamco ut ad minim do mollit labore ipsum laboris ipsum commodo sunt tempor enim incididunt. Commodo quis sunt dolore aliquip aute tempor irure magna enim minim reprehenderit. Ullamco consectetur culpa veniam sint cillum aliqua incididunt velit ullamco sunt ullamco quis quis commodo voluptate. Mollit nulla nostrud adipisicing aliqua cupidatat aliqua pariatur mollit voluptate voluptate consequat non.</p> <p>Placeholder content for the tab panel. This one relates to the contact tab. Her love is like a drug. All my girls vintage Chanel baby. Got a motel and built a fort out of sheets. 'Cause she's the muse and the artist. (This is how we do) So you wanna play with magic. So just be sure before you give it all to me. I'm walking, I'm walking on air (tonight). Skip the talk, heard it all, time to walk the walk. Catch her if you can. Stinging like a bee I earned my stripes.</p>
</div> </div>
</div> </div>
</div> </div>
@ -452,16 +452,16 @@ And with vertical pills.
</div> </div>
<div class="tab-content" id="v-pills-tabContent"> <div class="tab-content" id="v-pills-tabContent">
<div class="tab-pane fade show active" id="v-pills-home" role="tabpanel" aria-labelledby="v-pills-home-tab"> <div class="tab-pane fade show active" id="v-pills-home" role="tabpanel" aria-labelledby="v-pills-home-tab">
<p>Cillum ad ut irure tempor velit nostrud occaecat ullamco aliqua anim Lorem sint. Veniam sint duis incididunt do esse magna mollit excepteur laborum qui. Id id reprehenderit sit est eu aliqua occaecat quis et velit excepteur laborum mollit dolore eiusmod. Ipsum dolor in occaecat commodo et voluptate minim reprehenderit mollit pariatur. Deserunt non laborum enim et cillum eu deserunt excepteur ea incididunt minim occaecat.</p> <p>Placeholder content for the tab panel. This one relates to the home tab. Saw you downtown singing the Blues. Watch you circle the drain. Why don't you let me stop by? Heavy is the head that wears the crown. Yes, we make angels cry, raining down on earth from up above. Wanna see the show in 3D, a movie. Do you ever feel, feel so paper thin. Its a yes or no, no maybe.</p>
</div> </div>
<div class="tab-pane fade" id="v-pills-profile" role="tabpanel" aria-labelledby="v-pills-profile-tab"> <div class="tab-pane fade" id="v-pills-profile" role="tabpanel" aria-labelledby="v-pills-profile-tab">
<p>Culpa dolor voluptate do laboris laboris irure reprehenderit id incididunt duis pariatur mollit aute magna pariatur consectetur. Eu veniam duis non ut dolor deserunt commodo et minim in quis laboris ipsum velit id veniam. Quis ut consectetur adipisicing officia excepteur non sit. Ut et elit aliquip labore Lorem enim eu. Ullamco mollit occaecat dolore ipsum id officia mollit qui esse anim eiusmod do sint minim consectetur qui.</p> <p>Placeholder content for the tab panel. This one relates to the profile tab. Takes you miles high, so high, 'cause shes got that one international smile. There's a stranger in my bed, there's a pounding in my head. Oh, no. In another life I would make you stay. Cause I, Im capable of anything. Suiting up for my crowning battle. Used to steal your parents' liquor and climb to the roof. Tone, tan fit and ready, turn it up cause its gettin' heavy. Her love is like a drug. I guess that I forgot I had a choice.</p>
</div> </div>
<div class="tab-pane fade" id="v-pills-messages" role="tabpanel" aria-labelledby="v-pills-messages-tab"> <div class="tab-pane fade" id="v-pills-messages" role="tabpanel" aria-labelledby="v-pills-messages-tab">
<p>Fugiat id quis dolor culpa eiusmod anim velit excepteur proident dolor aute qui magna. Ad proident laboris ullamco esse anim Lorem Lorem veniam quis Lorem irure occaecat velit nostrud magna nulla. Velit et et proident Lorem do ea tempor officia dolor. Reprehenderit Lorem aliquip labore est magna commodo est ea veniam consectetur.</p> <p>Placeholder content for the tab panel. This one relates to the messages tab. You got the finest architecture. Passport stamps, she's cosmopolitan. Fine, fresh, fierce, we got it on lock. Never planned that one day I'd be losing you. She eats your heart out. Your kiss is cosmic, every move is magic. I mean the ones, I mean like she's the one. Greetings loved ones let's take a journey. Just own the night like the 4th of July! But you'd rather get wasted.</p>
</div> </div>
<div class="tab-pane fade" id="v-pills-settings" role="tabpanel" aria-labelledby="v-pills-settings-tab"> <div class="tab-pane fade" id="v-pills-settings" role="tabpanel" aria-labelledby="v-pills-settings-tab">
<p>Eu dolore ea ullamco dolore Lorem id cupidatat excepteur reprehenderit consectetur elit id dolor proident in cupidatat officia. Voluptate excepteur commodo labore nisi cillum duis aliqua do. Aliqua amet qui mollit consectetur nulla mollit velit aliqua veniam nisi id do Lorem deserunt amet. Culpa ullamco sit adipisicing labore officia magna elit nisi in aute tempor commodo eiusmod.</p> <p>Placeholder content for the tab panel. This one relates to the settings tab. Her love is like a drug. All my girls vintage Chanel baby. Got a motel and built a fort out of sheets. 'Cause she's the muse and the artist. (This is how we do) So you wanna play with magic. So just be sure before you give it all to me. I'm walking, I'm walking on air (tonight). Skip the talk, heard it all, time to walk the walk. Catch her if you can. Stinging like a bee I earned my stripes.</p>
</div> </div>
</div> </div>
</div> </div>

View file

@ -62,40 +62,20 @@ var popover = new bootstrap.Popover(document.querySelector('.example-popover'),
Four options are available: top, right, bottom, and left aligned. Directions are mirrored when using Bootstrap in RTL. Four options are available: top, right, bottom, and left aligned. Directions are mirrored when using Bootstrap in RTL.
<div class="bd-example popover-demo"> {{< example >}}
<div class="bd-example-popovers"> <button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="top" data-bs-content="Top popover">
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="top" data-bs-content="Vivamus sagittis lacus vel augue laoreet rutrum faucibus.">
Popover on top
</button>
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="right" data-bs-content="Vivamus sagittis lacus vel augue laoreet rutrum faucibus.">
Popover on right
</button>
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="bottom" data-bs-content="Vivamus sagittis lacus vel augue laoreet rutrum faucibus.">
Popover on bottom
</button>
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="left" data-bs-content="Vivamus sagittis lacus vel augue laoreet rutrum faucibus.">
Popover on left
</button>
</div>
</div>
```html
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="top" data-bs-content="Vivamus sagittis lacus vel augue laoreet rutrum faucibus.">
Popover on top Popover on top
</button> </button>
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="right" data-bs-content="Right popover">
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="right" data-bs-content="Vivamus sagittis lacus vel augue laoreet rutrum faucibus.">
Popover on right Popover on right
</button> </button>
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="bottom" data-bs-content="Bottom popover">
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="bottom" data-bs-content="Vivamus sagittis lacus vel augue laoreet rutrum faucibus.">
Popover on bottom Popover on bottom
</button> </button>
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="left" data-bs-content="Left popover">
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="left" data-bs-content="Vivamus sagittis lacus vel augue laoreet rutrum faucibus.">
Popover on left Popover on left
</button> </button>
``` {{< /example >}}
### Dismiss on next click ### Dismiss on next click
@ -119,13 +99,13 @@ var popover = new bootstrap.Popover(document.querySelector('.popover-dismiss'),
### Disabled elements ### Disabled elements
Elements with the `disabled` attribute aren't interactive, meaning users cannot hover or click them to trigger a popover (or tooltip). As a workaround, you'll want to trigger the popover from a wrapper `<div>` or `<span>` and override the `pointer-events` on the disabled element. Elements with the `disabled` attribute aren't interactive, meaning users cannot hover or click them to trigger a popover (or tooltip). As a workaround, you'll want to trigger the popover from a wrapper `<div>` or `<span>`, ideally made keyboard-focusable using `tabindex="0"`.
For disabled popover triggers, you may also prefer `data-bs-trigger="hover"` so that the popover appears as immediate visual feedback to your users as they may not expect to _click_ on a disabled element. For disabled popover triggers, you may also prefer `data-bs-trigger="hover focus"` so that the popover appears as immediate visual feedback to your users as they may not expect to _click_ on a disabled element.
{{< example >}} {{< example >}}
<span class="d-inline-block" data-bs-toggle="popover" data-bs-content="Disabled popover"> <span class="d-inline-block" tabindex="0" data-bs-toggle="popover" data-bs-trigger="hover focus" data-bs-content="Disabled popover">
<button class="btn btn-primary" style="pointer-events: none;" type="button" disabled>Disabled button</button> <button class="btn btn-primary" type="button" disabled>Disabled button</button>
</span> </span>
{{< /example >}} {{< /example >}}
@ -248,23 +228,17 @@ Note that for security reasons the `sanitize`, `sanitizeFn`, and `allowList` opt
<td>How popover is triggered - click | hover | focus | manual. You may pass multiple triggers; separate them with a space. <code>manual</code> cannot be combined with any other trigger.</td> <td>How popover is triggered - click | hover | focus | manual. You may pass multiple triggers; separate them with a space. <code>manual</code> cannot be combined with any other trigger.</td>
</tr> </tr>
<tr> <tr>
<td><code>offset</code></td> <td><code>fallbackPlacements</code></td>
<td>number | string</td> <td>array</td>
<td><code>0</code></td> <td><code>['top', 'right', 'bottom', 'left']</code></td>
<td>Offset of the popover relative to its target. For more information refer to Popper's <a href="https://popper.js.org/docs/v1/#modifiers..offset.offset">offset docs</a>.</td> <td>Define fallback placements by providing a list of placements in array (in order of preference). For more information refer to
</tr> Popper's <a href="https://popper.js.org/docs/v2/modifiers/flip/#fallbackplacements">behavior docs</a></td>
<tr>
<td><code>fallbackPlacement</code></td>
<td>string | array</td>
<td><code>'flip'</code></td>
<td>Allow to specify which position Popper will use on fallback. For more information refer to
Popper's <a href="https://popper.js.org/docs/v1/#modifiers..flip.behavior">behavior docs</a></td>
</tr> </tr>
<tr> <tr>
<td><code>boundary</code></td> <td><code>boundary</code></td>
<td>string | element</td> <td>string | element</td>
<td><code>'scrollParent'</code></td> <td><code>'scrollParent'</code></td>
<td>Overflow constraint boundary of the popover. Accepts the values of <code>'viewport'</code>, <code>'window'</code>, <code>'scrollParent'</code>, or an HTMLElement reference (JavaScript only). For more information refer to Popper's <a href="https://popper.js.org/docs/v1/#modifiers..preventOverflow.boundariesElement">preventOverflow docs</a>.</td> <td>Overflow constraint boundary of the popover. Accepts the values of <code>'viewport'</code>, <code>'window'</code>, <code>'scrollParent'</code>, or an HTMLElement reference (JavaScript only). For more information refer to Popper's <a href="https://popper.js.org/docs/v2/utils/detect-overflow/#boundary">preventOverflow docs</a>.</td>
</tr> </tr>
<tr> <tr>
<td><code>customClass</code></td> <td><code>customClass</code></td>
@ -297,7 +271,7 @@ Note that for security reasons the `sanitize`, `sanitizeFn`, and `allowList` opt
<td><code>popperConfig</code></td> <td><code>popperConfig</code></td>
<td>null | object</td> <td>null | object</td>
<td><code>null</code></td> <td><code>null</code></td>
<td>To change Bootstrap's default Popper config, see <a href="https://popper.js.org/docs/v1/#Popper.Defaults">Popper's configuration</a></td> <td>To change Bootstrap's default Popper config, see <a href="https://popper.js.org/docs/v2/constructors/#options">Popper's configuration</a></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View file

@ -49,17 +49,16 @@ Scroll the area below the navbar and watch the active class change. The dropdown
</nav> </nav>
<div data-bs-spy="scroll" data-bs-target="#navbar-example2" data-bs-offset="0" class="scrollspy-example" tabindex="0"> <div data-bs-spy="scroll" data-bs-target="#navbar-example2" data-bs-offset="0" class="scrollspy-example" tabindex="0">
<h4 id="fat">@fat</h4> <h4 id="fat">@fat</h4>
<p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p> <p>Placeholder content for the scrollspy example. You got the finest architecture. Passport stamps, she's cosmopolitan. Fine, fresh, fierce, we got it on lock. Never planned that one day I'd be losing you. She eats your heart out. Your kiss is cosmic, every move is magic. I mean the ones, I mean like she's the one. Greetings loved ones let's take a journey. Just own the night like the 4th of July! But you'd rather get wasted.</p>
<h4 id="mdo">@mdo</h4> <h4 id="mdo">@mdo</h4>
<p>Veniam marfa mustache skateboard, adipisicing fugiat velit pitchfork beard. Freegan beard aliqua cupidatat mcsweeney's vero. Cupidatat four loko nisi, ea helvetica nulla carles. Tattooed cosby sweater food truck, mcsweeney's quis non freegan vinyl. Lo-fi wes anderson +1 sartorial. Carles non aesthetic exercitation quis gentrify. Brooklyn adipisicing craft beer vice keytar deserunt.</p> <p>Placeholder content for the scrollspy example. 'Cause she's the muse and the artist. (This is how we do) So you wanna play with magic. So just be sure before you give it all to me. I'm walking, I'm walking on air (tonight). Skip the talk, heard it all, time to walk the walk.</p>
<h4 id="one">one</h4> <h4 id="one">one</h4>
<p>Occaecat commodo aliqua delectus. Fap craft beer deserunt skateboard ea. Lomo bicycle rights adipisicing banh mi, velit ea sunt next level locavore single-origin coffee in magna veniam. High life id vinyl, echo park consequat quis aliquip banh mi pitchfork. Vero VHS est adipisicing. Consectetur nisi DIY minim messenger bag. Cred ex in, sustainable delectus consectetur fanny pack iphone.</p> <p>Placeholder content for the scrollspy example. Takes you miles high, so high, 'cause shes got that one international smile. There's a stranger in my bed, there's a pounding in my head. Oh, no. In another life I would make you stay. Cause I, Im capable of anything. Suiting up for my crowning battle. Used to steal your parents' liquor and climb to the roof. Tone, tan fit and ready, turn it up cause its gettin' heavy. Her love is like a drug. I guess that I forgot I had a choice.</p>
<h4 id="two">two</h4> <h4 id="two">two</h4>
<p>In incididunt echo park, officia deserunt mcsweeney's proident master cleanse thundercats sapiente veniam. Excepteur VHS elit, proident shoreditch +1 biodiesel laborum craft beer. Single-origin coffee wayfarers irure four loko, cupidatat terry richardson master cleanse. Assumenda you probably haven't heard of them art party fanny pack, tattooed nulla cardigan tempor ad. Proident wolf nesciunt sartorial keffiyeh eu banh mi sustainable. Elit wolf voluptate, lo-fi ea portland before they sold out four loko. Locavore enim nostrud mlkshk brooklyn nesciunt.</p> <p>Placeholder content for the scrollspy example. It's time to bring out the big balloons. I'm walking, I'm walking on air (tonight). Yeah, we maxed our credit cards and got kicked out of the bar. Yo, shout out to all you kids, buying bottle service, with your rent money. I'm ma get your heart racing in my skin-tight jeans. If you get the chance you better keep her. Yo, shout out to all you kids, buying bottle service, with your rent money.</p>
<h4 id="three">three</h4> <h4 id="three">three</h4>
<p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p> <p>Placeholder content for the scrollspy example. If you wanna dance, if you want it all, you know that I'm the girl that you should call. Walk through the storm I would. So let me get you in your birthday suit. The one that got away. Last Friday night, yeah I think we broke the law, always say we're gonna stop. 'Cause she's a little bit of Yoko, And she's a little bit of 'Oh no'. I want the jaw droppin', eye poppin', head turnin', body shockin'. Yeah, we maxed our credit cards and got kicked out of the bar.</p>
<p>Keytar twee blog, culpa messenger bag marfa whatever delectus food truck. Sapiente synth id assumenda. Locavore sed helvetica cliche irony, thundercats you probably haven't heard of them consequat hoodie gluten-free lo-fi fap aliquip. Labore elit placeat before they sold out, terry richardson proident brunch nesciunt quis cosby sweater pariatur keffiyeh ut helvetica artisan. Cardigan craft beer seitan readymade velit. VHS chambray laboris tempor veniam. Anim mollit minim commodo ullamco thundercats. <p>And some more placeholder content, for good measure.</p>
</p>
</div> </div>
</div> </div>
@ -125,19 +124,19 @@ Scrollspy also works with nested `.nav`s. If a nested `.nav` is `.active`, its p
<div class="col-8"> <div class="col-8">
<div data-bs-spy="scroll" data-bs-target="#navbar-example3" data-bs-offset="0" class="scrollspy-example-2" tabindex="0"> <div data-bs-spy="scroll" data-bs-target="#navbar-example3" data-bs-offset="0" class="scrollspy-example-2" tabindex="0">
<h4 id="item-1">Item 1</h4> <h4 id="item-1">Item 1</h4>
<p>Ex consequat commodo adipisicing exercitation aute excepteur occaecat ullamco duis aliqua id magna ullamco eu. Do aute ipsum ipsum ullamco cillum consectetur ut et aute consectetur labore. Fugiat laborum incididunt tempor eu consequat enim dolore proident. Qui laborum do non excepteur nulla magna eiusmod consectetur in. Aliqua et aliqua officia quis et incididunt voluptate non anim reprehenderit adipisicing dolore ut consequat deserunt mollit dolore. Aliquip nulla enim veniam non fugiat id cupidatat nulla elit cupidatat commodo velit ut eiusmod cupidatat elit dolore.</p> <p>Placeholder content for the scrollspy example. This one relates to item 1. Takes you miles high, so high, 'cause shes got that one international smile. There's a stranger in my bed, there's a pounding in my head. Oh, no. In another life I would make you stay. Cause I, Im capable of anything. Suiting up for my crowning battle. Used to steal your parents' liquor and climb to the roof. Tone, tan fit and ready, turn it up cause its gettin' heavy. Her love is like a drug. I guess that I forgot I had a choice.</p>
<h5 id="item-1-1">Item 1-1</h5> <h5 id="item-1-1">Item 1-1</h5>
<p>Amet tempor mollit aliquip pariatur excepteur commodo do ea cillum commodo Lorem et occaecat elit qui et. Aliquip labore ex ex esse voluptate occaecat Lorem ullamco deserunt. Aliqua cillum excepteur irure consequat id quis ea. Sit proident ullamco aute magna pariatur nostrud labore. Reprehenderit aliqua commodo eiusmod aliquip est do duis amet proident magna consectetur consequat eu commodo fugiat non quis. Enim aliquip exercitation ullamco adipisicing voluptate excepteur minim exercitation minim minim commodo adipisicing exercitation officia nisi adipisicing. Anim id duis qui consequat labore adipisicing sint dolor elit cillum anim et fugiat.</p> <p>Placeholder content for the scrollspy example. This one relates to the item 1-1. You got the finest architecture. Passport stamps, she's cosmopolitan. Fine, fresh, fierce, we got it on lock. Never planned that one day I'd be losing you. She eats your heart out. Your kiss is cosmic, every move is magic. I mean the ones, I mean like she's the one. Greetings loved ones let's take a journey. Just own the night like the 4th of July! But you'd rather get wasted.</p>
<h5 id="item-1-2">Item 1-2</h5> <h5 id="item-1-2">Item 1-2</h5>
<p>Cillum nisi deserunt magna eiusmod qui eiusmod velit voluptate pariatur laborum sunt enim. Irure laboris mollit consequat incididunt sint et culpa culpa incididunt adipisicing magna magna occaecat. Nulla ipsum cillum eiusmod sint elit excepteur ea labore enim consectetur in labore anim. Proident ullamco ipsum esse elit ut Lorem eiusmod dolor et eiusmod. Anim occaecat nulla in non consequat eiusmod velit incididunt.</p> <p>Placeholder content for the scrollspy example. This one relates to the item 1-2. Her love is like a drug. All my girls vintage Chanel baby. Got a motel and built a fort out of sheets. 'Cause she's the muse and the artist. (This is how we do) So you wanna play with magic. So just be sure before you give it all to me. I'm walking, I'm walking on air (tonight). Skip the talk, heard it all, time to walk the walk. Catch her if you can. Stinging like a bee I earned my stripes.</p>
<h4 id="item-2">Item 2</h4> <h4 id="item-2">Item 2</h4>
<p>Quis magna Lorem anim amet ipsum do mollit sit cillum voluptate ex nulla tempor. Laborum consequat non elit enim exercitation cillum aliqua consequat id aliqua. Esse ex consectetur mollit voluptate est in duis laboris ad sit ipsum anim Lorem. Incididunt veniam velit elit elit veniam Lorem aliqua quis ullamco deserunt sit enim elit aliqua esse irure. Laborum nisi sit est tempor laborum mollit labore officia laborum excepteur commodo non commodo dolor excepteur commodo. Ipsum fugiat ex est consectetur ipsum commodo tempor sunt in proident.</p> <p>Placeholder content for the scrollspy example. This one relates to item 2. Don't need apologies. There is no fear now, let go and just be free, I will love you unconditionally. Last Friday night. Don't be a shy kinda guy I'll bet it's beautiful. Summer after high school when we first met. 'Cause she's the muse and the artist. What? Wait. No, no, no, no. Thought that I was the exception.</p>
<h4 id="item-3">Item 3</h4> <h4 id="item-3">Item 3</h4>
<p>Quis anim sit do amet fugiat dolor velit sit ea ea do reprehenderit culpa duis. Nostrud aliqua ipsum fugiat minim proident occaecat excepteur aliquip culpa aute tempor reprehenderit. Deserunt tempor mollit elit ex pariatur dolore velit fugiat mollit culpa irure ullamco est ex ullamco excepteur.</p> <p>Placeholder content for the scrollspy example. This one relates to item 3. Word on the street, you got somethin' to show me, me. All this money can't buy me a time machine. Make it like your birthday everyday. So we hit the boulevard. You make me feel like I'm livin' a teenage dream, the way you turn me on Skip the talk, heard it all, time to walk the walk. Word on the street, you got somethin' to show me, me. It's no big deal, it's no big deal, it's no big deal.</p>
<h5 id="item-3-1">Item 3-1</h5> <h5 id="item-3-1">Item 3-1</h5>
<p>Deserunt quis elit Lorem eiusmod amet enim enim amet minim Lorem proident nostrud. Ea id dolore anim exercitation aute fugiat labore voluptate cillum do laboris labore. Ex velit exercitation nisi enim labore reprehenderit labore nostrud ut ut. Esse officia sunt duis aliquip ullamco tempor eiusmod deserunt irure nostrud irure. Ullamco proident veniam laboris ea consectetur magna sunt ex exercitation aliquip minim enim culpa occaecat exercitation. Est tempor excepteur aliquip laborum consequat do deserunt laborum esse eiusmod irure proident ipsum esse qui.</p> <p>Placeholder content for the scrollspy example. This one relates to item 3-1. Baby do you dare to do this? This is no big deal. Yeah, you're lucky if you're on her plane. Just own the night like the 4th of July! Standing on the frontline when the bombs start to fall. So just be sure before you give it all to me.</p>
<h5 id="item-3-2">Item 3-2</h5> <h5 id="item-3-2">Item 3-2</h5>
<p>Labore sit culpa commodo elit adipisicing sit aliquip elit proident voluptate minim mollit nostrud aute reprehenderit do. Mollit excepteur eu Lorem ipsum anim commodo sint labore Lorem in exercitation velit incididunt. Occaecat consectetur nisi in occaecat proident minim enim sunt reprehenderit exercitation cupidatat et do officia. Aliquip consequat ad labore labore mollit ut amet. Sit pariatur tempor proident in veniam culpa aliqua excepteur elit magna fugiat eiusmod amet officia.</p> <p>Placeholder content for the scrollspy example. This one relates to item 3-2. You're original, cannot be replaced. All night they're playing, your song. California girls we're undeniable. Like a bird without a cage. There is no fear now, let go and just be free, I will love you unconditionally. I can see the writing on the wall. You could travel the world but nothing comes close to the golden coast.</p>
</div> </div>
</div> </div>
</div> </div>
@ -196,13 +195,13 @@ Scrollspy also works with `.list-group`s. Scroll the area next to the list group
<div class="col-8"> <div class="col-8">
<div data-bs-spy="scroll" data-bs-target="#list-example" data-bs-offset="0" class="scrollspy-example" tabindex="0"> <div data-bs-spy="scroll" data-bs-target="#list-example" data-bs-offset="0" class="scrollspy-example" tabindex="0">
<h4 id="list-item-1">Item 1</h4> <h4 id="list-item-1">Item 1</h4>
<p>Ex consequat commodo adipisicing exercitation aute excepteur occaecat ullamco duis aliqua id magna ullamco eu. Do aute ipsum ipsum ullamco cillum consectetur ut et aute consectetur labore. Fugiat laborum incididunt tempor eu consequat enim dolore proident. Qui laborum do non excepteur nulla magna eiusmod consectetur in. Aliqua et aliqua officia quis et incididunt voluptate non anim reprehenderit adipisicing dolore ut consequat deserunt mollit dolore. Aliquip nulla enim veniam non fugiat id cupidatat nulla elit cupidatat commodo velit ut eiusmod cupidatat elit dolore.</p> <p>Placeholder content for the scrollspy list-group example. This one relates to item 1. Don't need apologies. There is no fear now, let go and just be free, I will love you unconditionally. Last Friday night. Don't be a shy kinda guy I'll bet it's beautiful. Summer after high school when we first met. 'Cause she's the muse and the artist. What? Wait. Thought that I was the exception.</p>
<h4 id="list-item-2">Item 2</h4> <h4 id="list-item-2">Item 2</h4>
<p>Quis magna Lorem anim amet ipsum do mollit sit cillum voluptate ex nulla tempor. Laborum consequat non elit enim exercitation cillum aliqua consequat id aliqua. Esse ex consectetur mollit voluptate est in duis laboris ad sit ipsum anim Lorem. Incididunt veniam velit elit elit veniam Lorem aliqua quis ullamco deserunt sit enim elit aliqua esse irure. Laborum nisi sit est tempor laborum mollit labore officia laborum excepteur commodo non commodo dolor excepteur commodo. Ipsum fugiat ex est consectetur ipsum commodo tempor sunt in proident.</p> <p>Placeholder content for the scrollspy list-group example. This one relates to item 2. Yeah, she dances to her own beat. Oh, no. You could've been the greatest. 'Cause, baby, you're a firework. Maybe a reason why all the doors are closed. Open up your heart and just let it begin. So très chic, yeah, she's a classic.</p>
<h4 id="list-item-3">Item 3</h4> <h4 id="list-item-3">Item 3</h4>
<p>Quis anim sit do amet fugiat dolor velit sit ea ea do reprehenderit culpa duis. Nostrud aliqua ipsum fugiat minim proident occaecat excepteur aliquip culpa aute tempor reprehenderit. Deserunt tempor mollit elit ex pariatur dolore velit fugiat mollit culpa irure ullamco est ex ullamco excepteur.</p> <p>Placeholder content for the scrollspy list-group example. This one relates to item 3. We go higher and higher. Never one without the other, we made a pact. I'm walking on air. Someone said you had your tattoo removed. Now Im floating like a butterfly. Tone, tan fit and ready, turn it up cause its gettin' heavy. Cause once youre mine, once youre mine. You just gotta ignite the light and let it shine! So we hit the boulevard. Do you ever feel, feel so paper thin. I see it all, I see it now.</p>
<h4 id="list-item-4">Item 4</h4> <h4 id="list-item-4">Item 4</h4>
<p>Quis anim sit do amet fugiat dolor velit sit ea ea do reprehenderit culpa duis. Nostrud aliqua ipsum fugiat minim proident occaecat excepteur aliquip culpa aute tempor reprehenderit. Deserunt tempor mollit elit ex pariatur dolore velit fugiat mollit culpa irure ullamco est ex ullamco excepteur.</p> <p>Placeholder content for the scrollspy list-group example. This one relates to item 4. Summer after high school when we first met. There is no fear now, let go and just be free, I will love you unconditionally. Sun-kissed skin so hot we'll melt your popsicle. This love will make you levitate.</p>
</div> </div>
</div> </div>
</div> </div>
@ -227,7 +226,6 @@ Scrollspy also works with `.list-group`s. Scroll the area next to the list group
</div> </div>
``` ```
## Usage ## Usage
### Via data attributes ### Via data attributes

View file

@ -43,7 +43,7 @@ Toasts are as flexible as you need and have very little required markup. At a mi
### Translucent ### Translucent
Toasts are slightly translucent, too, so they blend over whatever they might appear over. For browsers that support the `backdrop-filter` CSS property, we'll also attempt to blur the elements under a toast. Toasts are slightly translucent, too, so they blend over whatever they might appear over.
{{< example class="bg-dark" >}} {{< example class="bg-dark" >}}
<div class="toast" role="alert" aria-live="assertive" aria-atomic="true"> <div class="toast" role="alert" aria-live="assertive" aria-atomic="true">
@ -120,7 +120,7 @@ Alternatively, you can also add additional controls and components to toasts.
### Color schemes ### Color schemes
Building on the above example, you can create different toast color schemes with our [color utilities]({{< docsref "/utilities/colors" >}}). Here we've added `.bg-primary` and `.text-white` to the `.toast`, and then added `.text-white` to our close button. For a crisp edge, we remove the default border with `.border-0`. Building on the above example, you can create different toast color schemes with our [color utilities]({{< docsref "/utilities/colors" >}}). Here we've added `.bg-primary` and `.text-white` to the `.toast`, and then added `.btn-close-white` to our close button. For a crisp edge, we remove the default border with `.border-0`.
{{< example class="bg-light" >}} {{< example class="bg-light" >}}
<div class="toast d-flex align-items-center text-white bg-primary border-0" role="alert" aria-live="assertive" aria-atomic="true"> <div class="toast d-flex align-items-center text-white bg-primary border-0" role="alert" aria-live="assertive" aria-atomic="true">
@ -137,7 +137,7 @@ Place toasts with custom CSS as you need them. The top right is often used for n
{{< example >}} {{< example >}}
<form> <form>
<div class="form-group mb-3"> <div class="mb-3">
<label for="selectToastPlacement">Toast placement</label> <label for="selectToastPlacement">Toast placement</label>
<select class="form-select mt-2" id="selectToastPlacement"> <select class="form-select mt-2" id="selectToastPlacement">
<option value="" selected>Select a position...</option> <option value="" selected>Select a position...</option>

View file

@ -46,7 +46,7 @@ var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
Hover over the links below to see tooltips: Hover over the links below to see tooltips:
<div class="bd-example tooltip-demo"> <div class="bd-example tooltip-demo">
<p class="muted">Tight pants next level keffiyeh <a href="#" data-bs-toggle="tooltip" title="Default tooltip">you probably</a> haven't heard of them. Photo booth beard raw denim letterpress vegan messenger bag stumptown. Farm-to-table seitan, mcsweeney's fixie sustainable quinoa 8-bit american apparel <a href="#" data-bs-toggle="tooltip" title="Another tooltip">have a</a> terry richardson vinyl chambray. Beard stumptown, cardigans banh mi lomo thundercats. Tofu biodiesel williamsburg marfa, four loko mcsweeney's cleanse vegan chambray. A really ironic artisan <a href="#" data-bs-toggle="tooltip" title="Another one here too">whatever keytar</a>, scenester farm-to-table banksy Austin <a href="#" data-bs-toggle="tooltip" title="The last tip!">twitter handle</a> freegan cred raw denim single-origin coffee viral. <p class="muted">Placeholder text to demonstrate some <a href="#" data-bs-toggle="tooltip" title="Default tooltip">inline links</a> with tooltips. This is now just filler, no killer. Content placed here just to mimic the presence of <a href="#" data-bs-toggle="tooltip" title="Another tooltip">real text</a>. And all that just to give you an idea of how tooltips would look when used in real-world situations. So hopefully you've now seen how <a href="#" data-bs-toggle="tooltip" title="Another one here too">these tooltips on links</a> can work in practice, once you use them on <a href="#" data-bs-toggle="tooltip" title="The last tip!">your own</a> site or project.
</p> </p>
</div> </div>
@ -145,12 +145,12 @@ You should only add tooltips to HTML elements that are traditionally keyboard-fo
### Disabled elements ### Disabled elements
Elements with the `disabled` attribute aren't interactive, meaning users cannot focus, hover, or click them to trigger a tooltip (or popover). As a workaround, you'll want to trigger the tooltip from a wrapper `<div>` or `<span>`, ideally made keyboard-focusable using `tabindex="0"`, and override the `pointer-events` on the disabled element. Elements with the `disabled` attribute aren't interactive, meaning users cannot focus, hover, or click them to trigger a tooltip (or popover). As a workaround, you'll want to trigger the tooltip from a wrapper `<div>` or `<span>`, ideally made keyboard-focusable using `tabindex="0"`.
<div class="tooltip-demo"> <div class="tooltip-demo">
{{< example >}} {{< example >}}
<span class="d-inline-block" tabindex="0" data-bs-toggle="tooltip" title="Disabled tooltip"> <span class="d-inline-block" tabindex="0" data-bs-toggle="tooltip" title="Disabled tooltip">
<button class="btn btn-primary" style="pointer-events: none;" type="button" disabled>Disabled button</button> <button class="btn btn-primary" type="button" disabled>Disabled button</button>
</span> </span>
{{< /example >}} {{< /example >}}
</div> </div>
@ -253,10 +253,10 @@ Note that for security reasons the `sanitize`, `sanitizeFn`, and `allowList` opt
</td> </td>
</tr> </tr>
<tr> <tr>
<td><code>fallbackPlacement</code></td> <td><code>fallbackPlacements</code></td>
<td>null | array</td> <td>array</td>
<td><code>null</code></td> <td><code>['top', 'right', 'bottom', 'left']</code></td>
<td>Allow to specify which position Popper will use on fallback. For more information refer to <td>Define fallback placements by providing a list of placements in array (in order of preference). For more information refer to
Popper's <a href="https://popper.js.org/docs/v2/modifiers/flip/#fallbackplacements">behavior docs</a></td> Popper's <a href="https://popper.js.org/docs/v2/modifiers/flip/#fallbackplacements">behavior docs</a></td>
</tr> </tr>
<tr> <tr>
@ -296,7 +296,7 @@ Note that for security reasons the `sanitize`, `sanitizeFn`, and `allowList` opt
<td><code>popperConfig</code></td> <td><code>popperConfig</code></td>
<td>null | object</td> <td>null | object</td>
<td><code>null</code></td> <td><code>null</code></td>
<td>To change Bootstrap's default Popper config, see <a href="https://popper.js.org/docs/v1/#Popper.Defaults">Popper's configuration</a></td> <td>To change Bootstrap's default Popper config, see <a href="https://popper.js.org/docs/v2/constructors/#options">Popper's configuration</a></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View file

@ -33,6 +33,8 @@ Bootstrap utilizes a "native font stack" or "system font stack" for optimum text
```scss ```scss
$font-family-sans-serif: $font-family-sans-serif:
// Cross-platform generic font family (default user interface font)
system-ui,
// Safari for macOS and iOS (San Francisco) // Safari for macOS and iOS (San Francisco)
-apple-system, -apple-system,
// Chrome < 56 for macOS (San Francisco) // Chrome < 56 for macOS (San Francisco)
@ -113,27 +115,17 @@ All lists—`<ul>`, `<ol>`, and `<dl>`—have their `margin-top` removed and a `
<div class="bd-example"> <div class="bd-example">
{{< markdown >}} {{< markdown >}}
* Lorem ipsum dolor sit amet * All lists have their top margin removed
* Consectetur adipiscing elit * And their bottom margin normalized
* Integer molestie lorem at massa * Nested lists have no bottom margin
* Facilisis in pretium nisl aliquet * This way they have a more even appearance
* Nulla volutpat aliquam velit * Particularly when followed by more list items
* Phasellus iaculis neque * The left padding has also been reset
* Purus sodales ultricies
* Vestibulum laoreet porttitor sem
* Ac tristique libero volutpat at
* Faucibus porta lacus fringilla vel
* Aenean sit amet erat nunc
* Eget porttitor lorem
1. Lorem ipsum dolor sit amet 1. Here's an ordered list
2. Consectetur adipiscing elit 2. With a few list items
3. Integer molestie lorem at massa 3. It has the same overall look
4. Facilisis in pretium nisl aliquet 4. As the previous unordered list
5. Nulla volutpat aliquam velit
6. Faucibus porta lacus fringilla vel
7. Aenean sit amet erat nunc
8. Eget porttitor lorem
{{< /markdown >}} {{< /markdown >}}
</div> </div>
@ -143,11 +135,11 @@ For simpler styling, clear hierarchy, and better spacing, description lists have
<dl> <dl>
<dt>Description lists</dt> <dt>Description lists</dt>
<dd>A description list is perfect for defining terms.</dd> <dd>A description list is perfect for defining terms.</dd>
<dt>Euismod</dt> <dt>Term</dt>
<dd>Vestibulum id ligula porta felis euismod semper eget lacinia odio sem.</dd> <dd>Definition for the term.</dd>
<dd>Donec id elit non mi porta gravida at eget metus.</dd> <dd>A second definition for the same term.</dd>
<dt>Malesuada porta</dt> <dt>Another term</dt>
<dd>Etiam porta sem malesuada magna mollis euismod.</dd> <dd>Definition for this other term.</dd>
</dl> </dl>
</div> </div>
@ -256,7 +248,7 @@ These changes, and more, are demonstrated below.
</p> </p>
<p> <p>
<label for="email">Example email</label> <label for="email">Example email</label>
<input type="email" id="email" placeholder="lorem@ipsum.com"> <input type="email" id="email" placeholder="test@example.com">
</p> </p>
<p> <p>
<label for="tel">Example telephone</label> <label for="tel">Example telephone</label>
@ -407,7 +399,7 @@ The default `margin` on blockquotes is `1em 40px`, so we reset that to `0 0 1rem
<div class="bd-example"> <div class="bd-example">
<blockquote class="blockquote"> <blockquote class="blockquote">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante.</p> <p>A well-known quote, contained in a blockquote element.</p>
</blockquote> </blockquote>
<p>Someone famous in <cite title="Source Title">Source Title</cite></p> <p>Someone famous in <cite title="Source Title">Source Title</cite></p>
</div> </div>

Some files were not shown because too many files have changed in this diff Show more