diff --git a/.babelrc.js b/.babelrc.js
index a4ef8cb6d..51399697f 100644
--- a/.babelrc.js
+++ b/.babelrc.js
@@ -1,21 +1,12 @@
module.exports = {
presets: [
[
- '@babel/env',
+ '@babel/preset-env',
{
loose: true,
- modules: false,
- exclude: ['transform-typeof-symbol']
+ bugfixes: true,
+ modules: false
}
]
- ],
- plugins: [
- process.env.PLUGINS && 'transform-es2015-modules-strip',
- '@babel/proposal-object-rest-spread'
- ].filter(Boolean),
- env: {
- test: {
- plugins: [ 'istanbul' ]
- }
- }
+ ]
};
diff --git a/.browserslistrc b/.browserslistrc
new file mode 100644
index 000000000..b8e384bc9
--- /dev/null
+++ b/.browserslistrc
@@ -0,0 +1,15 @@
+# https://github.com/browserslist/browserslist#readme
+
+>= 0.5%
+last 2 major versions
+not dead
+Chrome >= 60
+Firefox >= 60
+# needed since Legacy Edge still has usage; 79 was the first Chromium Edge version
+# should be removed in the future when its usage drops or when it's moved to dead browsers
+not Edge < 79
+Firefox ESR
+iOS >= 10
+Safari >= 10
+Android >= 6
+not Explorer <= 11
diff --git a/.bundlewatch.config.json b/.bundlewatch.config.json
new file mode 100644
index 000000000..da47da480
--- /dev/null
+++ b/.bundlewatch.config.json
@@ -0,0 +1,66 @@
+{
+ "files": [
+ {
+ "path": "./dist/css/bootstrap-grid.css",
+ "maxSize": "7 kB"
+ },
+ {
+ "path": "./dist/css/bootstrap-grid.min.css",
+ "maxSize": "6 kB"
+ },
+ {
+ "path": "./dist/css/bootstrap-reboot.css",
+ "maxSize": "2.25 kB"
+ },
+ {
+ "path": "./dist/css/bootstrap-reboot.min.css",
+ "maxSize": "2 kB"
+ },
+ {
+ "path": "./dist/css/bootstrap-utilities.css",
+ "maxSize": "7.5 kB"
+ },
+ {
+ "path": "./dist/css/bootstrap-utilities.min.css",
+ "maxSize": "6.75 kB"
+ },
+ {
+ "path": "./dist/css/bootstrap.css",
+ "maxSize": "24 kB"
+ },
+ {
+ "path": "./dist/css/bootstrap.min.css",
+ "maxSize": "22 kB"
+ },
+ {
+ "path": "./dist/js/bootstrap.bundle.js",
+ "maxSize": "41 kB"
+ },
+ {
+ "path": "./dist/js/bootstrap.bundle.min.js",
+ "maxSize": "21.5 kB"
+ },
+ {
+ "path": "./dist/js/bootstrap.esm.js",
+ "maxSize": "27 kB"
+ },
+ {
+ "path": "./dist/js/bootstrap.esm.min.js",
+ "maxSize": "18 kB"
+ },
+ {
+ "path": "./dist/js/bootstrap.js",
+ "maxSize": "28 kB"
+ },
+ {
+ "path": "./dist/js/bootstrap.min.js",
+ "maxSize": "15.5 kB"
+ }
+ ],
+ "ci": {
+ "trackBranches": [
+ "main",
+ "v4-dev"
+ ]
+ }
+}
diff --git a/.editorconfig b/.editorconfig
index 9d5248e86..f29d257cc 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -9,6 +9,3 @@ indent_size = 2
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true
-
-[*.md]
-trim_trailing_whitespace = false
diff --git a/.eslintignore b/.eslintignore
index e1d5490ee..ae6baae7e 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -2,4 +2,5 @@
**/dist/
**/vendor/
/_gh_pages/
-/package.js
+/js/coverage/
+/site/static/sw.js
diff --git a/.eslintrc.json b/.eslintrc.json
index 8cfaeea15..d5a54d46b 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -1,235 +1,58 @@
{
"root": true,
- "parser": "babel-eslint",
- "env": {
- "browser": true,
- "es6": true
- },
- "extends": "eslint:recommended",
- "plugins": ["compat"],
+ "extends": [
+ "plugin:import/errors",
+ "plugin:import/warnings",
+ "plugin:unicorn/recommended",
+ "xo/esnext",
+ "xo/browser"
+ ],
"rules": {
- // Possible Errors
- "no-await-in-loop": "error",
- "no-extra-parens": "error",
- "no-prototype-builtins": "error",
- "no-template-curly-in-string": "error",
- "compat/compat": "error",
- "valid-jsdoc": "error",
-
- // Best Practices
- "accessor-pairs": "error",
- "array-callback-return": "error",
- "block-scoped-var": "error",
- "class-methods-use-this": "off",
- "complexity": "error",
- "consistent-return": "error",
- "curly": "error",
- "default-case": "error",
- "dot-location": ["error", "property"],
- "dot-notation": "error",
- "eqeqeq": "error",
- "guard-for-in": "error",
- "no-alert": "error",
- "no-caller": "error",
- "no-div-regex": "error",
- "no-else-return": "error",
- "no-empty-function": "error",
- "no-eq-null": "error",
- "no-eval": "error",
- "no-extend-native": "error",
- "no-extra-bind": "error",
- "no-extra-label": "error",
- "no-floating-decimal": "error",
- "no-implicit-coercion": "error",
- "no-implicit-globals": "error",
- "no-implied-eval": "error",
- "no-invalid-this": "off",
- "no-iterator": "error",
- "no-labels": "error",
- "no-lone-blocks": "error",
- "no-loop-func": "error",
- "no-magic-numbers": ["error", {
- "ignore": [-1, 0, 1],
- "ignoreArrayIndexes": true
- }
- ],
- "no-multi-spaces": ["error", {
- "ignoreEOLComments": true,
- "exceptions": {
- "AssignmentExpression": true,
- "ArrowFunctionExpression": true,
- "CallExpression": true,
- "VariableDeclarator": true
- }
- }
- ],
- "no-multi-str": "error",
- "no-new": "error",
- "no-new-func": "error",
- "no-new-wrappers": "error",
- "no-octal-escape": "error",
- "no-param-reassign": "off",
- "no-proto": "error",
- "no-restricted-properties": "error",
- "no-return-assign": "error",
- "no-return-await": "error",
- "no-script-url": "error",
- "no-self-compare": "error",
- "no-sequences": "error",
- "no-throw-literal": "error",
- "no-unmodified-loop-condition": "error",
- "no-unused-expressions": "error",
- "no-useless-call": "error",
- "no-useless-concat": "error",
- "no-useless-return": "error",
- "no-void": "error",
- "no-warning-comments": "off",
- "no-with": "error",
- "prefer-promise-reject-errors": "error",
- "radix": "error",
- "require-await": "error",
- "vars-on-top": "error",
- "wrap-iife": "error",
- "yoda": "error",
-
- // Strict Mode
- "strict": "error",
-
- // Variables
- "init-declarations": "off",
- "no-catch-shadow": "error",
- "no-label-var": "error",
- "no-restricted-globals": "error",
- "no-shadow": "off",
- "no-shadow-restricted-names": "error",
- "no-undef-init": "error",
- "no-undefined": "error",
- "no-use-before-define": "off",
-
- // Node.js and CommonJS
- "callback-return": "off",
- "global-require": "error",
- "handle-callback-err": "error",
- "no-mixed-requires": "error",
- "no-new-require": "error",
- "no-path-concat": "error",
- "no-process-env": "error",
- "no-process-exit": "error",
- "no-restricted-modules": "error",
- "no-sync": "error",
-
- // Stylistic Issues
- "array-bracket-spacing": "error",
- "block-spacing": "error",
- "brace-style": "error",
- "camelcase": "error",
"capitalized-comments": "off",
- "comma-dangle": "error",
- "comma-spacing": "error",
- "comma-style": "error",
- "computed-property-spacing": "error",
- "consistent-this": "error",
- "eol-last": "error",
- "func-call-spacing": "error",
- "func-name-matching": "error",
- "func-names": "off",
- "func-style": ["error", "declaration"],
- "id-blacklist": "error",
- "id-length": "off",
- "id-match": "error",
- "indent": ["error", 2, { "SwitchCase": 1 }],
- "jsx-quotes": "error",
- "key-spacing": "off",
- "keyword-spacing": "error",
- "linebreak-style": ["error", "unix"],
- "line-comment-position": "off",
- "lines-around-comment": "off",
- "lines-around-directive": "error",
- "max-depth": ["error", 10],
- "max-len": "off",
- "max-lines": "off",
- "max-nested-callbacks": "error",
- "max-params": "off",
- "max-statements": "off",
- "max-statements-per-line": "error",
- "multiline-ternary": "off",
- "new-cap": ["error", { "capIsNewExceptionPattern": "$.*" }],
- "newline-after-var": "off",
- "newline-per-chained-call": ["error", { "ignoreChainWithDepth": 5 }],
- "new-parens": "error",
- "no-array-constructor": "error",
- "no-bitwise": "error",
- "no-continue": "off",
- "no-inline-comments": "off",
- "no-lonely-if": "error",
- "no-mixed-operators": "off",
- "no-multi-assign": "error",
- "no-multiple-empty-lines": "error",
- "nonblock-statement-body-position": "error",
- "no-negated-condition": "off",
- "no-nested-ternary": "error",
- "no-new-object": "error",
- "no-plusplus": "off",
- "no-restricted-syntax": "error",
- "no-tabs": "error",
- "no-ternary": "off",
- "no-trailing-spaces": "error",
- "no-underscore-dangle": "off",
- "no-unneeded-ternary": "error",
- "no-whitespace-before-property": "error",
- "object-curly-newline": ["error", { "minProperties": 1 }],
- "object-curly-spacing": ["error", "always"],
- "object-property-newline": "error",
- "one-var": ["error", "never"],
- "one-var-declaration-per-line": "error",
- "operator-assignment": "error",
- "operator-linebreak": "error",
- "padded-blocks": ["error", "never"],
- "padding-line-between-statements": "off",
- "quote-props": ["error", "as-needed"],
- "quotes": ["error", "single"],
- "require-jsdoc": "off",
- "semi": ["error", "never"],
- "semi-spacing": "error",
- "sort-keys": "off",
- "sort-vars": "error",
- "space-before-blocks": "error",
- "space-before-function-paren": ["error", {
- "anonymous": "always",
- "named": "never"
- }],
- "space-in-parens": "error",
- "space-infix-ops": "error",
- "space-unary-ops": "error",
- "spaced-comment": "error",
- "template-tag-spacing": "error",
- "unicode-bom": "error",
- "wrap-regex": "off",
-
- // ECMAScript 6
- "arrow-body-style": ["error", "as-needed"],
- "arrow-parens": "error",
- "arrow-spacing": "error",
- "generator-star-spacing": "error",
- "no-confusing-arrow": "error",
- "no-duplicate-imports": "error",
- "no-restricted-imports": "error",
- "no-useless-computed-key": "error",
- "no-useless-constructor": "error",
- "no-useless-rename": "error",
- "no-var": "error",
- "object-shorthand": "error",
- "prefer-arrow-callback": "error",
- "prefer-const": "error",
- "prefer-destructuring": "off",
- "prefer-numeric-literals": "error",
- "prefer-rest-params": "error",
- "prefer-spread": "error",
- "prefer-template": "error",
- "rest-spread-spacing": "error",
- "sort-imports": "error",
- "symbol-description": "error",
- "template-curly-spacing": "error",
- "yield-star-spacing": "error"
+ "indent": [
+ "error",
+ 2,
+ {
+ "MemberExpression": "off",
+ "SwitchCase": 1
+ }
+ ],
+ "max-params": [
+ "warn",
+ 5
+ ],
+ "multiline-ternary": [
+ "error",
+ "always-multiline"
+ ],
+ "new-cap": [
+ "error",
+ {
+ "properties": false
+ }
+ ],
+ "no-console": "error",
+ "object-curly-spacing": [
+ "error",
+ "always"
+ ],
+ "prefer-named-capture-group": "off",
+ "semi": [
+ "error",
+ "never"
+ ],
+ "unicorn/consistent-function-scoping": "off",
+ "unicorn/explicit-length-check": "off",
+ "unicorn/no-array-callback-reference": "off",
+ "unicorn/no-for-loop": "off",
+ "unicorn/no-null": "off",
+ "unicorn/no-unused-properties": "error",
+ "unicorn/no-useless-undefined": "off",
+ "unicorn/prefer-dom-node-append": "off",
+ "unicorn/prefer-dom-node-dataset": "off",
+ "unicorn/prefer-dom-node-remove": "off",
+ "unicorn/prefer-optional-catch-binding": "off",
+ "unicorn/prefer-query-selector": "off",
+ "unicorn/prevent-abbreviations": "off"
}
}
diff --git a/.gitattributes b/.gitattributes
index 21b6fd140..40b1c3742 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,16 +1,8 @@
# Enforce Unix newlines
-*.css text eol=lf
-*.html text eol=lf
-*.js text eol=lf
-*.json text eol=lf
-*.md text eol=lf
-*.rb text eol=lf
-*.scss text eol=lf
-*.svg text eol=lf
-*.txt text eol=lf
-*.yml text eol=lf
+* text=auto eol=lf
+
# Don't diff or textually merge source maps
-*.map binary
+*.map binary
bootstrap.css linguist-vendored=false
bootstrap.js linguist-vendored=false
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
new file mode 100644
index 000000000..7d3fa9904
--- /dev/null
+++ b/.github/CODEOWNERS
@@ -0,0 +1,3 @@
+*.js @twbs/js-review
+*.css @twbs/css-review
+*.scss @twbs/css-review
diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index cbdd81082..32b30cdb3 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -19,7 +19,8 @@ and [submitting pull requests](#pull-requests), but please respect the following
restrictions:
* Please **do not** use the issue tracker for personal support requests. Stack
- Overflow ([`bootstrap-4`](https://stackoverflow.com/questions/tagged/bootstrap-4) tag), [Slack](https://bootstrap-slack.herokuapp.com/) or [IRC](README.md#community) are better places to get help.
+ Overflow ([`bootstrap-5`](https://stackoverflow.com/questions/tagged/bootstrap-5) tag),
+ [Slack](https://bootstrap-slack.herokuapp.com/) or [IRC](README.md#community) are better places to get help.
* Please **do not** derail or troll issues. Keep the discussion on topic and
respect the opinions of others.
@@ -57,15 +58,14 @@ Good bug reports are extremely helpful, so thanks!
Guidelines for bug reports:
-0. **Validate and lint your code** — [validate your HTML](https://html5.validator.nu/)
- and [lint your HTML](https://github.com/twbs/bootlint) to ensure your
+0. **[Validate your HTML](https://html5.validator.nu/)** to ensure your
problem isn't caused by a simple error in your own code.
1. **Use the GitHub issue search** — check if the issue has already been
reported.
2. **Check if the issue has been fixed** — try to reproduce it using the
- latest `master` or development branch in the repository.
+ latest `main` (or `v4-dev` branch if the issue is about v4) in the repository.
3. **Isolate the problem** — ideally create a [reduced test
case](https://css-tricks.com/reduced-test-cases/) and a live example.
@@ -100,18 +100,13 @@ Example:
### Reporting upstream browser bugs
Sometimes bugs reported to us are actually caused by bugs in the browser(s) themselves, not bugs in Bootstrap per se.
-When feasible, we aim to report such upstream bugs to the relevant browser vendor(s), and then list them on our [Wall of Browser Bugs](https://getbootstrap.com/browser-bugs/) and [document them in MDN](https://developer.mozilla.org/en-US/docs/Web).
-| 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. |
-| Apple | Safari | WebKit | https://bugs.webkit.org/enter_bug.cgi?product=WebKit
https://bugreport.apple.com/ | 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. |
-| Microsoft | Edge | EdgeHTML | https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/ | |
-
-### Issues bots
-
-[@twbs-lmvtfy](https://github.com/twbs-lmvtfy) is a Bootstrap bot that hangs out in our GitHub issue tracker and automatically checks for HTML validation errors in live examples (e.g. jsFiddles, JS Bins, Bootplys, Plunks, CodePens, etc.) posted in issue comments. If it finds any errors, it will post a follow-up comment on the issue and point out the errors. If this happens with an example you've posted, please fix the errors and post an updated live example. If you opened a bug report, please check whether the bug still occurs with your revised, valid live example. If the bug no longer occurs, it was probably due to your invalid HTML rather than something in Bootstrap and we'd appreciate it if you could close out the GitHub issue.
+| 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. |
+| 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. |
+| Microsoft | Edge | Blink | https://developer.microsoft.com/en-us/microsoft-edge/ | Go to "Help > Send Feedback" from the browser |
## Feature requests
@@ -128,23 +123,25 @@ Good pull requests—patches, improvements, new features—are a fantastic
help. They should remain focused in scope and avoid containing unrelated
commits.
-**Please ask first** before embarking on any significant pull request (e.g.
+**Please ask first** before embarking on any **significant** pull request (e.g.
implementing features, refactoring code, porting to a different language),
otherwise you risk spending a lot of time working on something that the
-project's developers might not want to merge into the project.
+project's developers might not want to merge into the project. For trivial
+things, or things that don't require a lot of your time, you can go ahead and
+make a PR.
Please adhere to the [coding guidelines](#code-guidelines) used throughout the
project (indentation, accurate comments, etc.) and any other requirements
(such as test coverage).
-**Do not edit `bootstrap.css`, or `bootstrap.js`
-directly!** Those files are automatically generated. You should edit the
-source files in [`/bootstrap/scss/`](https://github.com/twbs/bootstrap/tree/master/scss)
-and/or [`/bootstrap/js/`](https://github.com/twbs/bootstrap/tree/master/js) instead.
+**Do not edit `bootstrap.css` or `bootstrap.js`, and do not commit
+any dist files (`dist/` or `js/dist`).** Those files are automatically generated by our build tools. You should
+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.
Similarly, when contributing to Bootstrap's documentation, you should edit the
documentation source files in
-[the `/bootstrap/docs/` directory of the `master` branch](https://github.com/twbs/bootstrap/tree/master/docs).
+[the `/bootstrap/site/content/docs/` directory of the `main` branch](https://github.com/twbs/bootstrap/tree/main/site/content/docs).
**Do not edit the `gh-pages` branch.** That branch is generated from the
documentation source files and is managed separately by the Bootstrap Core Team.
@@ -166,8 +163,8 @@ included in the project:
2. If you cloned a while ago, get the latest changes from upstream:
```bash
- git checkout master
- git pull upstream master
+ git checkout main
+ git pull upstream main
```
3. Create a new topic branch (off the main project development branch) to
@@ -186,7 +183,7 @@ included in the project:
5. Locally merge (or rebase) the upstream development branch into your topic branch:
```bash
- git pull [--rebase] upstream master
+ git pull [--rebase] upstream main
```
6. Push your topic branch up to your fork:
@@ -196,29 +193,20 @@ included in the project:
```
7. [Open a Pull Request](https://help.github.com/articles/about-pull-requests/)
- with a clear title and description against the `master` branch.
+ with a clear title and description against the `main` branch.
**IMPORTANT**: By submitting a patch, you agree to allow the project owners to
-license your work under the terms of the [MIT License](LICENSE) (if it
+license your work under the terms of the [MIT License](../LICENSE) (if it
includes code changes) and under the terms of the
-[Creative Commons Attribution 3.0 Unported License](docs/LICENSE)
+[Creative Commons Attribution 3.0 Unported License](https://creativecommons.org/licenses/by/3.0/)
(if it includes documentation changes).
-### Pull request bots
-
-[@twbs-rorschach](https://github.com/twbs-rorschach) is a Bootstrap bot that hangs out in our GitHub issue tracker and automatically checks all pull requests for a few simple common mistakes. It's possible that Rorschach might leave a comment on your pull request and then close it. If that happens, simply fix the problem(s) mentioned in the comment (there should be link(s) in the comment explaining the problem(s) in detail) and then either:
-
-* Push the revised version to your pull request's branch and post a comment on the pull request saying that you've fixed the problem(s). One of the Bootstrap Core Team members will then come along and reopen your pull request.
-* Or you can just open a new pull request for your revised version.
-
-[@twbs-savage](https://github.com/twbs-savage) is a Bootstrap bot that automatically runs cross-browser tests (via [Sauce](https://saucelabs.com/) and Travis CI) on JavaScript pull requests. Savage will leave a comment on pull requests stating whether cross-browser JS tests passed or failed, with a link to the full Travis build details. If your pull request fails, check the Travis log to see which browser + OS combinations failed. Each browser test in the Travis log includes a link to a Sauce page with details about the test. On those details pages, you can watch a screencast of the test run to see exactly which unit tests failed.
-
## Code guidelines
### HTML
-[Adhere to the Code Guide.](http://codeguide.co/#html)
+[Adhere to the Code Guide.](https://codeguide.co/#html)
- Use tags and elements appropriate for an HTML5 doctype (e.g., self-closing tags).
- Use CDNs and HTTPS for third-party JS when possible. We don't use protocol-relative URLs in this case because they break when viewing the page locally via `file://`.
@@ -226,10 +214,10 @@ includes code changes) and under the terms of the
### CSS
-[Adhere to the Code Guide.](http://codeguide.co/#css)
+[Adhere to the Code Guide.](https://codeguide.co/#css)
- When feasible, default color palettes should comply with [WCAG color contrast guidelines](https://www.w3.org/TR/WCAG20/#visual-audio-contrast).
-- Except in rare cases, don't remove default `:focus` styles (via e.g. `outline: none;`) without providing alternative styles. See [this A11Y Project post](https://a11yproject.com/posts/never-remove-css-outlines/) for more details.
+- Except in rare cases, don't remove default `:focus` styles (via e.g. `outline: none;`) without providing alternative styles. See [this A11Y Project post](https://www.a11yproject.com/posts/2013-01-25-never-remove-css-outlines/) for more details.
### JS
@@ -237,7 +225,6 @@ includes code changes) and under the terms of the
- 2 spaces (no tabs)
- strict mode
- "Attractive"
-- Don't use [jQuery event alias convenience methods](https://github.com/jquery/jquery/blob/master/src/event/alias.js) (such as `$().focus()`). Instead, use [`$().trigger(eventType, ...)`](https://api.jquery.com/trigger/) or [`$().on(eventType, ...)`](https://api.jquery.com/on/), depending on whether you're firing an event or listening for an event. (For example, `$().trigger('focus')` or `$().on('focus', function (event) { /* handle focus event */ })`) We do this to be compatible with custom builds of jQuery where the event aliases module has been excluded.
### Checking coding style
@@ -246,7 +233,7 @@ Run `npm run test` before committing to ensure your changes follow our coding st
## License
-By contributing your code, you agree to license your contribution under the [MIT License](LICENSE).
-By contributing to the documentation, you agree to license your contribution under the [Creative Commons Attribution 3.0 Unported License](docs/LICENSE).
+By contributing your code, you agree to license your contribution under the [MIT License](../LICENSE).
+By contributing to the documentation, you agree to license your contribution under the [Creative Commons Attribution 3.0 Unported License](https://creativecommons.org/licenses/by/3.0/).
Prior to v3.1.0, Bootstrap's code was released under the Apache License v2.0.
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 000000000..43ea984ba
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1,3 @@
+# These are supported funding model platforms
+
+open_collective: bootstrap
diff --git a/.github/ISSUE_TEMPLATE/bug.md b/.github/ISSUE_TEMPLATE/bug.md
deleted file mode 100644
index c1f910964..000000000
--- a/.github/ISSUE_TEMPLATE/bug.md
+++ /dev/null
@@ -1,11 +0,0 @@
-Before opening:
-
-- [Search for duplicate or closed issues](https://github.com/twbs/bootstrap/issues?utf8=%E2%9C%93&q=is%3Aissue)
-- [Validate](https://html5.validator.nu/) and [lint](https://github.com/twbs/bootlint#in-the-browser) any HTML to avoid common problems
-- Read the [contributing guidelines](https://github.com/twbs/bootstrap/blob/master/CONTRIBUTING.md)
-
-Bug reports must include:
-
-- Operating system and version (Windows, Mac OS X, Android, iOS, Win10 Mobile)
-- Browser and version (Chrome, Firefox, Safari, IE, MS Edge, Opera 15+, Android Browser)
-- [Reduced test case](https://css-tricks.com/reduced-test-cases/) and suggested fix using [CodePen](https://codepen.io/) or [JS Bin](https://jsbin.com/)
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 000000000..70dcfd532
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,20 @@
+---
+name: Bug report
+about: Tell us about a bug you may have identified in Bootstrap.
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+Before opening:
+
+- [Search for duplicate or closed issues](https://github.com/twbs/bootstrap/issues?utf8=%E2%9C%93&q=is%3Aissue)
+- [Validate](https://html5.validator.nu/) any HTML to avoid common problems
+- Read the [contributing guidelines](https://github.com/twbs/bootstrap/blob/main/.github/CONTRIBUTING.md)
+
+Bug reports must include:
+
+- Operating system and version (Windows, macOS, Android, iOS)
+- Browser and version (Chrome, Firefox, Safari, Microsoft Edge, Opera, Android Browser)
+- A [reduced test case](https://css-tricks.com/reduced-test-cases/) or suggested fix using [CodePen](https://codepen.io/) or [JS Bin](https://jsbin.com/)
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 000000000..2913b45f0
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1,4 @@
+contact_links:
+ - name: Ask a question
+ url: https://github.com/twbs/bootstrap/discussions/new
+ about: Ask and discuss questions with other Bootstrap community members
diff --git a/.github/ISSUE_TEMPLATE/feature.md b/.github/ISSUE_TEMPLATE/feature_request.md
similarity index 69%
rename from .github/ISSUE_TEMPLATE/feature.md
rename to .github/ISSUE_TEMPLATE/feature_request.md
index 4f866e214..422fa2bb4 100644
--- a/.github/ISSUE_TEMPLATE/feature.md
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -1,7 +1,16 @@
+---
+name: Feature request
+about: Suggest an idea for a new feature in Bootstrap.
+title: ''
+labels: feature
+assignees: ''
+
+---
+
Before opening:
- [Search for duplicate or closed issues](https://github.com/twbs/bootstrap/issues?utf8=%E2%9C%93&q=is%3Aissue)
-- Read the [contributing guidelines](https://github.com/twbs/bootstrap/blob/master/CONTRIBUTING.md)
+- Read the [contributing guidelines](https://github.com/twbs/bootstrap/blob/main/.github/CONTRIBUTING.md)
Feature requests must include:
diff --git a/.github/SUPPORT.md b/.github/SUPPORT.md
index de3c4b552..c30bed3b4 100644
--- a/.github/SUPPORT.md
+++ b/.github/SUPPORT.md
@@ -8,4 +8,4 @@ For general troubleshooting or help getting started:
- Join [the official Slack room](https://bootstrap-slack.herokuapp.com/).
- Chat with fellow Bootstrappers in IRC. On the `irc.freenode.net` server, in the `##bootstrap` channel.
-- Ask and explore Stack Overflow with the [`bootstrap-4`](https://stackoverflow.com/questions/tagged/bootstrap-4) tag.
+- Ask and explore Stack Overflow with the [`bootstrap-5`](https://stackoverflow.com/questions/tagged/bootstrap-5) tag.
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 000000000..29135b400
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,24 @@
+version: 2
+updates:
+ - package-ecosystem: npm
+ directory: "/"
+ schedule:
+ interval: weekly
+ day: tuesday
+ time: "12:00"
+ timezone: Europe/Athens
+ open-pull-requests-limit: 10
+ reviewers:
+ - XhmikosR
+ labels:
+ - dependencies
+ - v5
+ versioning-strategy: increase
+ rebase-strategy: disabled
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ schedule:
+ interval: weekly
+ day: tuesday
+ time: "12:00"
+ timezone: Europe/Athens
diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml
new file mode 100644
index 000000000..e2b70e03e
--- /dev/null
+++ b/.github/release-drafter.yml
@@ -0,0 +1,54 @@
+name-template: 'v$NEXT_MAJOR_VERSION'
+tag-template: 'v$NEXT_MAJOR_VERSION'
+prerelease: true
+exclude-labels:
+ - 'skip-changelog'
+categories:
+ - title: '❗ Breaking Changes'
+ labels:
+ - 'breaking-change'
+ - title: '🚀 Features'
+ labels:
+ - 'new-feature'
+ - 'feature'
+ - 'enhancement'
+ - title: '🐛 Bug fixes'
+ labels:
+ - 'fix'
+ - 'bugfix'
+ - 'bug'
+ - title: '⚡ Performance Improvements'
+ labels:
+ - 'performance'
+ - title: '🎨 CSS'
+ labels:
+ - 'css'
+ - title: '☕️ JavaScript'
+ labels:
+ - 'js'
+ - title: '📖 Docs'
+ labels:
+ - 'docs'
+ - title: '🌎 Accessibility'
+ labels:
+ - 'accessibility'
+ - title: '🔧 Utility API'
+ labels:
+ - 'utility API'
+ - 'utilities'
+ - title: '🏭 Tests'
+ labels:
+ - 'tests'
+ - title: '🧰 Misc'
+ labels:
+ - 'build'
+ - 'meta'
+ - 'chore'
+ - 'CI'
+ - title: '📦 Dependencies'
+ labels:
+ - 'dependencies'
+change-template: '- #$NUMBER: $TITLE'
+template: |
+ ## Changes
+ $CHANGES
diff --git a/.github/workflows/browserstack.yml b/.github/workflows/browserstack.yml
new file mode 100644
index 000000000..a12bffcf7
--- /dev/null
+++ b/.github/workflows/browserstack.yml
@@ -0,0 +1,44 @@
+name: BrowserStack
+
+on:
+ push:
+
+env:
+ FORCE_COLOR: 2
+ NODE: 14
+
+jobs:
+ browserstack:
+ 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]'))
+ timeout-minutes: 30
+
+ steps:
+ - name: Clone repository
+ uses: actions/checkout@v2
+
+ - name: Set up Node.js
+ uses: actions/setup-node@v2
+ with:
+ node-version: "${{ env.NODE }}"
+
+ - name: Set up npm cache
+ uses: actions/cache@v2
+ with:
+ path: ~/.npm
+ key: ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
+ restore-keys: |
+ ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
+ ${{ runner.os }}-node-v${{ env.NODE }}-
+
+ - name: Install npm dependencies
+ run: npm ci
+
+ - name: Run dist
+ run: npm run dist
+
+ - name: Run BrowserStack tests
+ run: npm run js-test-cloud
+ env:
+ BROWSER_STACK_ACCESS_KEY: "${{ secrets.BROWSER_STACK_ACCESS_KEY }}"
+ BROWSER_STACK_USERNAME: "${{ secrets.BROWSER_STACK_USERNAME }}"
diff --git a/.github/workflows/bundlewatch.yml b/.github/workflows/bundlewatch.yml
new file mode 100644
index 000000000..b2bd5eed5
--- /dev/null
+++ b/.github/workflows/bundlewatch.yml
@@ -0,0 +1,45 @@
+name: Bundlewatch
+
+on:
+ push:
+ branches-ignore:
+ - "dependabot/**"
+ pull_request:
+
+env:
+ FORCE_COLOR: 2
+ NODE: 14
+
+jobs:
+ bundlewatch:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Clone repository
+ uses: actions/checkout@v2
+
+ - name: Set up Node.js
+ uses: actions/setup-node@v2
+ with:
+ node-version: "${{ env.NODE }}"
+
+ - name: Set up npm cache
+ uses: actions/cache@v2
+ with:
+ path: ~/.npm
+ key: ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
+ restore-keys: |
+ ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
+ ${{ runner.os }}-node-v${{ env.NODE }}-
+
+ - name: Install npm dependencies
+ run: npm ci
+
+ - name: Run dist
+ run: npm run dist
+
+ - name: Run bundlewatch
+ run: npm run bundlewatch
+ env:
+ BUNDLEWATCH_GITHUB_TOKEN: "${{ secrets.BUNDLEWATCH_GITHUB_TOKEN }}"
+ CI_BRANCH_BASE: main
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
new file mode 100644
index 000000000..469a5a4fc
--- /dev/null
+++ b/.github/workflows/codeql.yml
@@ -0,0 +1,36 @@
+name: "CodeQL"
+
+on:
+ push:
+ branches:
+ - main
+ - v4-dev
+ - "!dependabot/**"
+ pull_request:
+ # The branches below must be a subset of the branches above
+ branches:
+ - main
+ - v4-dev
+ schedule:
+ - cron: "0 2 * * 5"
+
+jobs:
+ analyze:
+ name: Analyze
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v2
+
+ # Initializes the CodeQL tools for scanning.
+ - name: Initialize CodeQL
+ uses: github/codeql-action/init@v1
+ with:
+ languages: "javascript"
+
+ - name: Autobuild
+ uses: github/codeql-action/autobuild@v1
+
+ - name: Perform CodeQL Analysis
+ uses: github/codeql-action/analyze@v1
diff --git a/.github/workflows/css.yml b/.github/workflows/css.yml
new file mode 100644
index 000000000..a28059d79
--- /dev/null
+++ b/.github/workflows/css.yml
@@ -0,0 +1,39 @@
+name: CSS
+
+on:
+ push:
+ branches-ignore:
+ - "dependabot/**"
+ pull_request:
+
+env:
+ FORCE_COLOR: 2
+ NODE: 14
+
+jobs:
+ css:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Clone repository
+ uses: actions/checkout@v2
+
+ - name: Set up Node.js
+ uses: actions/setup-node@v2
+ with:
+ node-version: "${{ env.NODE }}"
+
+ - name: Set up npm cache
+ uses: actions/cache@v2
+ with:
+ path: ~/.npm
+ key: ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
+ restore-keys: |
+ ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
+ ${{ runner.os }}-node-v${{ env.NODE }}-
+
+ - name: Install npm dependencies
+ run: npm ci
+
+ - name: Build CSS
+ run: npm run css
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
new file mode 100644
index 000000000..150e4d16c
--- /dev/null
+++ b/.github/workflows/docs.yml
@@ -0,0 +1,41 @@
+name: Docs
+
+on:
+ push:
+ branches-ignore:
+ - "dependabot/**"
+ pull_request:
+
+env:
+ FORCE_COLOR: 2
+ NODE: 14
+
+jobs:
+ docs:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Clone repository
+ uses: actions/checkout@v2
+
+ - name: Set up Node.js
+ uses: actions/setup-node@v2
+ with:
+ node-version: "${{ env.NODE }}"
+
+ - run: java -version
+
+ - name: Set up npm cache
+ uses: actions/cache@v2
+ with:
+ path: ~/.npm
+ key: ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
+ restore-keys: |
+ ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
+ ${{ runner.os }}-node-v${{ env.NODE }}-
+
+ - name: Install npm dependencies
+ run: npm ci
+
+ - name: Test docs
+ run: npm run docs
diff --git a/.github/workflows/js.yml b/.github/workflows/js.yml
new file mode 100644
index 000000000..c56a2dfdd
--- /dev/null
+++ b/.github/workflows/js.yml
@@ -0,0 +1,54 @@
+name: JS Tests
+
+on:
+ push:
+ branches-ignore:
+ - "dependabot/**"
+ pull_request:
+
+env:
+ FORCE_COLOR: 2
+
+jobs:
+ run:
+ name: Node ${{ matrix.node }}
+ runs-on: ubuntu-latest
+
+ strategy:
+ fail-fast: false
+ matrix:
+ node: [10, 12, 14]
+
+ steps:
+ - name: Clone repository
+ uses: actions/checkout@v2
+
+ - name: Set up Node.js
+ uses: actions/setup-node@v2
+ with:
+ node-version: ${{ matrix.node }}
+
+ - name: Set up npm cache
+ uses: actions/cache@v2
+ with:
+ path: ~/.npm
+ key: ${{ runner.os }}-node-v${{ matrix.node }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}}
+ restore-keys: |
+ ${{ runner.os }}-node-v${{ matrix.node }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
+ ${{ runner.os }}-node-v${{ matrix.node }}-
+
+ - name: Install npm dependencies
+ run: npm ci
+
+ - name: Run dist
+ run: npm run js
+
+ - name: Run JS tests
+ run: npm run js-test
+
+ - name: Run Coveralls
+ uses: coverallsapp/github-action@master
+ if: matrix.node == 14
+ with:
+ github-token: "${{ secrets.GITHUB_TOKEN }}"
+ path-to-lcov: "./js/coverage/lcov.info"
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
new file mode 100644
index 000000000..369aaced3
--- /dev/null
+++ b/.github/workflows/lint.yml
@@ -0,0 +1,39 @@
+name: Lint
+
+on:
+ push:
+ branches-ignore:
+ - "dependabot/**"
+ pull_request:
+
+env:
+ FORCE_COLOR: 2
+ NODE: 14
+
+jobs:
+ lint:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Clone repository
+ uses: actions/checkout@v2
+
+ - name: Set up Node.js
+ uses: actions/setup-node@v2
+ with:
+ node-version: "${{ env.NODE }}"
+
+ - name: Set up npm cache
+ uses: actions/cache@v2
+ with:
+ path: ~/.npm
+ key: ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
+ restore-keys: |
+ ${{ runner.os }}-node-v${{ env.NODE }}-${{ hashFiles('package.json') }}-${{ hashFiles('package-lock.json') }}
+ ${{ runner.os }}-node-v${{ env.NODE }}-
+
+ - name: Install npm dependencies
+ run: npm ci
+
+ - name: Lint
+ run: npm run lint
diff --git a/.github/workflows/node-sass.yml b/.github/workflows/node-sass.yml
new file mode 100644
index 000000000..ee64b2152
--- /dev/null
+++ b/.github/workflows/node-sass.yml
@@ -0,0 +1,30 @@
+name: CSS (node-sass)
+
+on:
+ push:
+ branches-ignore:
+ - "dependabot/**"
+ pull_request:
+
+env:
+ FORCE_COLOR: 2
+ NODE: 14
+
+jobs:
+ css:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Clone repository
+ uses: actions/checkout@v2
+
+ - name: Set up Node.js
+ uses: actions/setup-node@v2
+ with:
+ node-version: "${{ env.NODE }}"
+
+ - name: Build CSS with node-sass
+ run: |
+ npx --package node-sass@latest node-sass --version
+ npx --package node-sass@latest node-sass --output-style expanded --source-map true --source-map-contents true --precision 6 scss/ -o dist-sass/css/
+ ls -Al dist-sass/css
diff --git a/.github/workflows/release-notes.yml b/.github/workflows/release-notes.yml
new file mode 100644
index 000000000..1c4f4be9b
--- /dev/null
+++ b/.github/workflows/release-notes.yml
@@ -0,0 +1,14 @@
+name: Release notes
+
+on:
+ push:
+ branches:
+ - main
+
+jobs:
+ update_release_draft:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: release-drafter/release-drafter@v5
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.gitignore b/.gitignore
index 7534de261..0a0f88d15 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,12 +1,7 @@
# Ignore docs files
-_gh_pages
-_site
-
-# Ignore ruby files
-.ruby-version
-.bundle
-vendor/cache
-vendor/bundle
+/_gh_pages/
+# Hugo resources folder
+/resources/
# Numerous always-ignore extensions
*.diff
@@ -33,15 +28,14 @@ vendor/bundle
*.sublime-workspace
nbproject
Thumbs.db
+/.vscode/
+# Local Netlify folder
+.netlify
# Komodo
.komodotools
*.komodoproject
-# Jekyll metadata and extra config file for `github` script
-docs/.jekyll-metadata
-twbsconfig.yml
-
# Folders to ignore
-node_modules
-js/coverage
+/js/coverage/
+/node_modules/
diff --git a/.stylelintignore b/.stylelintignore
index 7bc488e5f..e42e88938 100644
--- a/.stylelintignore
+++ b/.stylelintignore
@@ -2,3 +2,4 @@
**/dist/
**/vendor/
/_gh_pages/
+/js/coverage/
diff --git a/.stylelintrc b/.stylelintrc
index c65940be2..c068d30b5 100644
--- a/.stylelintrc
+++ b/.stylelintrc
@@ -1,276 +1,31 @@
{
- "extends": ["stylelint-config-standard", "stylelint-config-recommended-scss"],
- "plugins": [
- "stylelint-order"
+ "extends": [
+ "stylelint-config-twbs-bootstrap/scss"
],
"rules": {
- "at-rule-empty-line-before": [null, {
- "except": ["first-nested"]
- }],
- "at-rule-name-space-after": "always",
- "at-rule-no-vendor-prefix": true,
- "at-rule-semicolon-space-before": "never",
- "block-closing-brace-empty-line-before": null,
- "block-closing-brace-newline-after": null,
- "block-opening-brace-space-before": null,
- "color-named": "never",
- "declaration-block-semicolon-newline-after": "always-multi-line",
- "declaration-block-semicolon-newline-before": "never-multi-line",
- "declaration-block-semicolon-space-after": "always-single-line",
- "declaration-empty-line-before": null,
- "declaration-no-important": true,
- "font-family-name-quotes": "always-where-recommended",
- "font-weight-notation": "numeric",
- "function-url-no-scheme-relative": true,
- "function-url-quotes": "always",
- "length-zero-no-unit": true,
- "max-empty-lines": 2,
- "max-line-length": null,
- "media-feature-name-no-vendor-prefix": true,
- "media-feature-parentheses-space-inside": "never",
- "media-feature-range-operator-space-after": "always",
- "media-feature-range-operator-space-before": "never",
- "no-descending-specificity": null,
- "no-duplicate-selectors": true,
- "number-leading-zero": "never",
- "media-feature-name-no-unknown": [true, {
- "ignoreMediaFeatureNames": ["prefers-reduced-motion"]
- }],
- "order/properties-order": [
- "position",
- "top",
- "right",
- "bottom",
- "left",
- "z-index",
- "box-sizing",
- "display",
- "flex",
- "flex-align",
- "flex-basis",
- "flex-direction",
- "flex-wrap",
- "flex-flow",
- "flex-shrink",
- "flex-grow",
- "flex-order",
- "flex-pack",
- "align-content",
- "align-items",
- "align-self",
- "justify-content",
- "order",
- "float",
- "width",
- "min-width",
- "max-width",
- "height",
- "min-height",
- "max-height",
- "padding",
- "padding-top",
- "padding-right",
- "padding-bottom",
- "padding-left",
- "margin",
- "margin-top",
- "margin-right",
- "margin-bottom",
- "margin-left",
- "overflow",
- "overflow-x",
- "overflow-y",
- "-webkit-overflow-scrolling",
- "-ms-overflow-x",
- "-ms-overflow-y",
- "-ms-overflow-style",
- "columns",
- "column-count",
- "column-fill",
- "column-gap",
- "column-rule",
- "column-rule-width",
- "column-rule-style",
- "column-rule-color",
- "column-span",
- "column-width",
- "orphans",
- "widows",
- "clip",
- "clear",
- "font",
- "font-family",
- "font-size",
- "font-style",
- "font-weight",
- "font-variant",
- "font-size-adjust",
- "font-stretch",
- "font-effect",
- "font-emphasize",
- "font-emphasize-position",
- "font-emphasize-style",
- "font-smooth",
- "src",
- "hyphens",
- "line-height",
- "color",
- "text-align",
- "text-align-last",
- "text-emphasis",
- "text-emphasis-color",
- "text-emphasis-style",
- "text-emphasis-position",
- "text-decoration",
- "text-indent",
- "text-justify",
- "text-outline",
- "-ms-text-overflow",
- "text-overflow",
- "text-overflow-ellipsis",
- "text-overflow-mode",
- "text-shadow",
- "text-transform",
- "text-wrap",
- "-webkit-text-size-adjust",
- "-ms-text-size-adjust",
- "letter-spacing",
- "-ms-word-break",
- "word-break",
- "word-spacing",
- "-ms-word-wrap",
- "word-wrap",
- "overflow-wrap",
- "tab-size",
- "white-space",
- "vertical-align",
- "direction",
- "unicode-bidi",
- "list-style",
- "list-style-position",
- "list-style-type",
- "list-style-image",
- "pointer-events",
- "-ms-touch-action",
- "touch-action",
- "cursor",
- "visibility",
- "zoom",
- "table-layout",
- "empty-cells",
- "caption-side",
- "border-spacing",
- "border-collapse",
- "content",
- "quotes",
- "counter-reset",
- "counter-increment",
- "resize",
- "user-select",
- "nav-index",
- "nav-up",
- "nav-right",
- "nav-down",
- "nav-left",
- "background",
- "background-color",
- "background-image",
- "filter",
- "background-repeat",
- "background-attachment",
- "background-position",
- "background-position-x",
- "background-position-y",
- "background-clip",
- "background-origin",
- "background-size",
- "border",
- "border-color",
- "border-style",
- "border-width",
- "border-top",
- "border-top-color",
- "border-top-style",
- "border-top-width",
- "border-right",
- "border-right-color",
- "border-right-style",
- "border-right-width",
- "border-bottom",
- "border-bottom-color",
- "border-bottom-style",
- "border-bottom-width",
- "border-left",
- "border-left-color",
- "border-left-style",
- "border-left-width",
+ "declaration-property-value-disallowed-list": {
+ "border": "none",
+ "outline": "none"
+ },
+ "function-disallowed-list": [
+ "calc",
+ "lighten",
+ "darken"
+ ],
+ "property-disallowed-list": [
"border-radius",
"border-top-left-radius",
"border-top-right-radius",
"border-bottom-right-radius",
"border-bottom-left-radius",
- "border-image",
- "border-image-source",
- "border-image-slice",
- "border-image-width",
- "border-image-outset",
- "border-image-repeat",
- "outline",
- "outline-width",
- "outline-style",
- "outline-color",
- "outline-offset",
- "box-shadow",
- "opacity",
- "-ms-interpolation-mode",
- "page-break-after",
- "page-break-before",
- "page-break-inside",
- "transition",
- "transition-delay",
- "transition-timing-function",
- "transition-duration",
- "transition-property",
- "transform",
- "transform-origin",
- "perspective",
- "appearance",
- "animation",
- "animation-name",
- "animation-duration",
- "animation-play-state",
- "animation-timing-function",
- "animation-delay",
- "animation-iteration-count",
- "animation-direction",
- "animation-fill-mode",
- "fill",
- "stroke"
+ "transition"
],
- "property-no-vendor-prefix": true,
- "rule-empty-line-before": null,
- "scss/dollar-variable-default": [true, { "ignore": "local" }],
- "selector-attribute-quotes": "always",
- "selector-list-comma-newline-after": "always",
- "selector-list-comma-newline-before": "never-multi-line",
- "selector-list-comma-space-after": "always-single-line",
- "selector-list-comma-space-before": "never-single-line",
- "selector-max-attribute": 2,
- "selector-max-class": 4,
- "selector-max-combinators": 4,
- "selector-max-compound-selectors": 4,
- "selector-max-empty-lines": 1,
- "selector-max-id": 0,
- "selector-max-specificity": null,
- "selector-max-type": 2,
- "selector-max-universal": 1,
- "selector-no-qualifying-type": true,
- "selector-no-vendor-prefix": true,
- "string-quotes": "double",
- "value-keyword-case": "lower",
- "value-list-comma-newline-after": "never-multi-line",
- "value-list-comma-newline-before": "never-multi-line",
- "value-list-comma-space-after": "always",
- "value-no-vendor-prefix": true
+ "scss/dollar-variable-default": [
+ true,
+ {
+ "ignore": "local"
+ }
+ ],
+ "scss/selector-no-union-class-name": true
}
}
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index bc1694516..000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,34 +0,0 @@
-sudo: required
-dist: trusty
-addons:
- chrome: stable
-language: node_js
-git:
- depth: 3
-node_js:
- - "6"
- - "8"
-before_install:
- - if [[ `npm -v` != 5* ]]; then npm install -g npm@5; fi
-install:
- - bundle install --deployment --jobs=3 --retry=3
- - npm install
-after_success:
- - if [ "$TRAVIS_REPO_SLUG" = twbs-savage/bootstrap ]; then npm run docs-upload-preview; fi
-stages:
- - test
- - name: browser
- if: type = push
-jobs:
- include:
- - stage: browser
- node_js: 8
- script: if ! git log --format=%B --no-merges -n 1 | grep '\[skip browser\]'; then npm test && npm run js-test-cloud; fi
-cache:
- directories:
- - node_modules
- - vendor/bundle
-notifications:
- slack: heybb:iz4wwosL0N0EdaX1gvgkU0NH
- webhooks:
- - http://savage.twbsapps.com/savage/travis
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
index 9d9922f25..5c6a4e727 100644
--- a/CODE_OF_CONDUCT.md
+++ b/CODE_OF_CONDUCT.md
@@ -8,19 +8,19 @@ In the interest of fostering an open and welcoming environment, we as contributo
Examples of behavior that contributes to creating a positive environment include:
-* Using welcoming and inclusive language
-* Being respectful of differing viewpoints and experiences
-* Gracefully accepting constructive criticism
-* Focusing on what is best for the community
-* Showing empathy towards other community members
+- Using welcoming and inclusive language
+- Being respectful of differing viewpoints and experiences
+- Gracefully accepting constructive criticism
+- Focusing on what is best for the community
+- Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
-* The use of sexualized language or imagery and unwelcome sexual attention or advances
-* Trolling, insulting/derogatory comments, and personal or political attacks
-* Public or private harassment
-* Publishing others' private information, such as a physical or electronic address, without explicit permission
-* Other conduct which could reasonably be considered inappropriate in a professional setting
+- The use of sexualized language or imagery and unwelcome sexual attention or advances
+- Trolling, insulting/derogatory comments, and personal or political attacks
+- Public or private harassment
+- Publishing others' private information, such as a physical or electronic address, without explicit permission
+- Other conduct which could reasonably be considered inappropriate in a professional setting
## Our Responsibilities
@@ -40,7 +40,4 @@ Project maintainers who do not follow or enforce the Code of Conduct in good fai
## Attribution
-This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [https://www.contributor-covenant.org/version/1/4/code-of-conduct.html][version]
-
-[homepage]: https://www.contributor-covenant.org/
-[version]: https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
+This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org/), version 1.4, available at
-
+
-
-
- Sleek, intuitive, and powerful front-end framework for faster and easier web development.
-
- Explore Bootstrap docs »
-
-
- Report bug
- ·
- Request feature
- ·
- Themes
- ·
- Jobs
- ·
- Blog
-
+ Sleek, intuitive, and powerful front-end framework for faster and easier web development.
+
+ Explore Bootstrap docs »
+
+
+ Report bug
+ ·
+ Request feature
+ ·
+ Themes
+ ·
+ Blog
+