diff --git a/.babelrc.js b/.babelrc.js
index 51399697f..a4ef8cb6d 100644
--- a/.babelrc.js
+++ b/.babelrc.js
@@ -1,12 +1,21 @@
module.exports = {
presets: [
[
- '@babel/preset-env',
+ '@babel/env',
{
loose: true,
- bugfixes: true,
- modules: false
+ modules: false,
+ exclude: ['transform-typeof-symbol']
}
]
- ]
+ ],
+ 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
deleted file mode 100644
index b8e384bc9..000000000
--- a/.browserslistrc
+++ /dev/null
@@ -1,15 +0,0 @@
-# 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
deleted file mode 100644
index da47da480..000000000
--- a/.bundlewatch.config.json
+++ /dev/null
@@ -1,66 +0,0 @@
-{
- "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 f29d257cc..9d5248e86 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -9,3 +9,6 @@ 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 ae6baae7e..e1d5490ee 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -2,5 +2,4 @@
**/dist/
**/vendor/
/_gh_pages/
-/js/coverage/
-/site/static/sw.js
+/package.js
diff --git a/.eslintrc.json b/.eslintrc.json
index d5a54d46b..8cfaeea15 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -1,58 +1,235 @@
{
"root": true,
- "extends": [
- "plugin:import/errors",
- "plugin:import/warnings",
- "plugin:unicorn/recommended",
- "xo/esnext",
- "xo/browser"
- ],
+ "parser": "babel-eslint",
+ "env": {
+ "browser": true,
+ "es6": true
+ },
+ "extends": "eslint:recommended",
+ "plugins": ["compat"],
"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",
- "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"
+ "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"
}
}
diff --git a/.gitattributes b/.gitattributes
index 40b1c3742..21b6fd140 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,8 +1,16 @@
# Enforce Unix newlines
-* text=auto eol=lf
-
+*.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
# 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
deleted file mode 100644
index 7d3fa9904..000000000
--- a/.github/CODEOWNERS
+++ /dev/null
@@ -1,3 +0,0 @@
-*.js @twbs/js-review
-*.css @twbs/css-review
-*.scss @twbs/css-review
diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index 32b30cdb3..cbdd81082 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -19,8 +19,7 @@ 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-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.
+ 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.
* Please **do not** derail or troll issues. Keep the discussion on topic and
respect the opinions of others.
@@ -58,14 +57,15 @@ Good bug reports are extremely helpful, so thanks!
Guidelines for bug reports:
-0. **[Validate your HTML](https://html5.validator.nu/)** to ensure your
+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
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 `main` (or `v4-dev` branch if the issue is about v4) in the repository.
+ latest `master` or development branch 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,13 +100,18 @@ 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 | 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 |
+| 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.
## Feature requests
@@ -123,25 +128,23 @@ 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. For trivial
-things, or things that don't require a lot of your time, you can go ahead and
-make a PR.
+project's developers might not want to merge into the project.
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`, 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.
+**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.
Similarly, when contributing to Bootstrap's documentation, you should edit the
documentation source files in
-[the `/bootstrap/site/content/docs/` directory of the `main` branch](https://github.com/twbs/bootstrap/tree/main/site/content/docs).
+[the `/bootstrap/docs/` directory of the `master` branch](https://github.com/twbs/bootstrap/tree/master/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.
@@ -163,8 +166,8 @@ included in the project:
2. If you cloned a while ago, get the latest changes from upstream:
```bash
- git checkout main
- git pull upstream main
+ git checkout master
+ git pull upstream master
```
3. Create a new topic branch (off the main project development branch) to
@@ -183,7 +186,7 @@ included in the project:
5. Locally merge (or rebase) the upstream development branch into your topic branch:
```bash
- git pull [--rebase] upstream main
+ git pull [--rebase] upstream master
```
6. Push your topic branch up to your fork:
@@ -193,20 +196,29 @@ 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 `main` branch.
+ with a clear title and description against the `master` 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](https://creativecommons.org/licenses/by/3.0/)
+[Creative Commons Attribution 3.0 Unported License](docs/LICENSE)
(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.](https://codeguide.co/#html)
+[Adhere to the Code Guide.](http://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://`.
@@ -214,10 +226,10 @@ includes code changes) and under the terms of the
### CSS
-[Adhere to the Code Guide.](https://codeguide.co/#css)
+[Adhere to the Code Guide.](http://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://www.a11yproject.com/posts/2013-01-25-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://a11yproject.com/posts/never-remove-css-outlines/) for more details.
### JS
@@ -225,6 +237,7 @@ 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
@@ -233,7 +246,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](https://creativecommons.org/licenses/by/3.0/).
+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).
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
deleted file mode 100644
index 43ea984ba..000000000
--- a/.github/FUNDING.yml
+++ /dev/null
@@ -1,3 +0,0 @@
-# These are supported funding model platforms
-
-open_collective: bootstrap
diff --git a/.github/ISSUE_TEMPLATE/bug.md b/.github/ISSUE_TEMPLATE/bug.md
new file mode 100644
index 000000000..c1f910964
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug.md
@@ -0,0 +1,11 @@
+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
deleted file mode 100644
index 70dcfd532..000000000
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ /dev/null
@@ -1,20 +0,0 @@
----
-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
deleted file mode 100644
index 2913b45f0..000000000
--- a/.github/ISSUE_TEMPLATE/config.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-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_request.md b/.github/ISSUE_TEMPLATE/feature.md
similarity index 69%
rename from .github/ISSUE_TEMPLATE/feature_request.md
rename to .github/ISSUE_TEMPLATE/feature.md
index 422fa2bb4..4f866e214 100644
--- a/.github/ISSUE_TEMPLATE/feature_request.md
+++ b/.github/ISSUE_TEMPLATE/feature.md
@@ -1,16 +1,7 @@
----
-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/main/.github/CONTRIBUTING.md)
+- Read the [contributing guidelines](https://github.com/twbs/bootstrap/blob/master/CONTRIBUTING.md)
Feature requests must include:
diff --git a/.github/SUPPORT.md b/.github/SUPPORT.md
index c30bed3b4..de3c4b552 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-5`](https://stackoverflow.com/questions/tagged/bootstrap-5) tag.
+- Ask and explore Stack Overflow with the [`bootstrap-4`](https://stackoverflow.com/questions/tagged/bootstrap-4) tag.
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
deleted file mode 100644
index 29135b400..000000000
--- a/.github/dependabot.yml
+++ /dev/null
@@ -1,24 +0,0 @@
-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
deleted file mode 100644
index e2b70e03e..000000000
--- a/.github/release-drafter.yml
+++ /dev/null
@@ -1,54 +0,0 @@
-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
deleted file mode 100644
index a12bffcf7..000000000
--- a/.github/workflows/browserstack.yml
+++ /dev/null
@@ -1,44 +0,0 @@
-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
deleted file mode 100644
index b2bd5eed5..000000000
--- a/.github/workflows/bundlewatch.yml
+++ /dev/null
@@ -1,45 +0,0 @@
-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
deleted file mode 100644
index 469a5a4fc..000000000
--- a/.github/workflows/codeql.yml
+++ /dev/null
@@ -1,36 +0,0 @@
-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
deleted file mode 100644
index a28059d79..000000000
--- a/.github/workflows/css.yml
+++ /dev/null
@@ -1,39 +0,0 @@
-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
deleted file mode 100644
index 150e4d16c..000000000
--- a/.github/workflows/docs.yml
+++ /dev/null
@@ -1,41 +0,0 @@
-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
deleted file mode 100644
index c56a2dfdd..000000000
--- a/.github/workflows/js.yml
+++ /dev/null
@@ -1,54 +0,0 @@
-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
deleted file mode 100644
index 369aaced3..000000000
--- a/.github/workflows/lint.yml
+++ /dev/null
@@ -1,39 +0,0 @@
-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
deleted file mode 100644
index ee64b2152..000000000
--- a/.github/workflows/node-sass.yml
+++ /dev/null
@@ -1,30 +0,0 @@
-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
deleted file mode 100644
index 1c4f4be9b..000000000
--- a/.github/workflows/release-notes.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-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 0a0f88d15..7534de261 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,12 @@
# Ignore docs files
-/_gh_pages/
-# Hugo resources folder
-/resources/
+_gh_pages
+_site
+
+# Ignore ruby files
+.ruby-version
+.bundle
+vendor/cache
+vendor/bundle
# Numerous always-ignore extensions
*.diff
@@ -28,14 +33,15 @@
*.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
-/js/coverage/
-/node_modules/
+node_modules
+js/coverage
diff --git a/.stylelintignore b/.stylelintignore
index e42e88938..7bc488e5f 100644
--- a/.stylelintignore
+++ b/.stylelintignore
@@ -2,4 +2,3 @@
**/dist/
**/vendor/
/_gh_pages/
-/js/coverage/
diff --git a/.stylelintrc b/.stylelintrc
index c068d30b5..c65940be2 100644
--- a/.stylelintrc
+++ b/.stylelintrc
@@ -1,31 +1,276 @@
{
- "extends": [
- "stylelint-config-twbs-bootstrap/scss"
+ "extends": ["stylelint-config-standard", "stylelint-config-recommended-scss"],
+ "plugins": [
+ "stylelint-order"
],
"rules": {
- "declaration-property-value-disallowed-list": {
- "border": "none",
- "outline": "none"
- },
- "function-disallowed-list": [
- "calc",
- "lighten",
- "darken"
- ],
- "property-disallowed-list": [
+ "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",
"border-radius",
"border-top-left-radius",
"border-top-right-radius",
"border-bottom-right-radius",
"border-bottom-left-radius",
- "transition"
+ "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"
],
- "scss/dollar-variable-default": [
- true,
- {
- "ignore": "local"
- }
- ],
- "scss/selector-no-union-class-name": true
+ "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
}
}
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 000000000..bc1694516
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,34 @@
+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/site/static/CNAME b/CNAME
similarity index 100%
rename from site/static/CNAME
rename to CNAME
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
index 5c6a4e727..9d9922f25 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,4 +40,7 @@ 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](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
-