diff --git a/.hound.yml b/.hound.yml index 66bc1ae7cb..8a21bdf445 100644 --- a/.hound.yml +++ b/.hound.yml @@ -1,3 +1,5 @@ +fail_on_violations: true + scss: config_file: scss/.scss-lint.yml enabled: true @@ -6,5 +8,13 @@ scss: javascript: enabled: false +eslint: + enabled: true + config_file: js/.eslintrc + +jscs: + enabled: true + config_file: js/.jscsrc + ruby: enabled: false diff --git a/.travis.yml b/.travis.yml index f87759abda..058a26aa4e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,7 +11,6 @@ before_install: - export PATH=$(python -c 'from sys import argv;from collections import OrderedDict as od;print(":".join(od((p,None) for p in argv[1].split(":") if p.startswith("/")).keys()))' "$PATH") - rvm install 2.2 - rvm use 2.2 --fuzzy - - export GEMDIR=$(rvm gemdir) - npm install -g npm@3 - "export TRAVIS_COMMIT_MSG=\"$(git log --format=%B --no-merges -n 1)\"" - echo "$TRAVIS_COMMIT_MSG" | grep '\[skip validator\]'; export TWBS_DO_VALIDATOR=$?; true diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ab7b624c0e..956e572e41 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -24,10 +24,16 @@ restrictions: * Please **do not** derail or troll issues. Keep the discussion on topic and respect the opinions of others. +* Please **do not** post comments consisting solely of "+1" or ":thumbsup:". + Use [GitHub's "reactions" feature](https://github.com/blog/2119-add-reactions-to-pull-requests-issues-and-comments) + instead. We reserve the right to delete comments which violate this rule. + * Please **do not** open issues or pull requests regarding the code in [`Normalize`](https://github.com/necolas/normalize.css) (open them in its repository). -* Please **do not** open issues regarding the official themes offered on . Instead, please email any questions or feedback regarding those themes to `themes AT getbootstrap DOT com`. + +* Please **do not** open issues regarding the official themes offered on . + Instead, please email any questions or feedback regarding those themes to `themes AT getbootstrap DOT com`. ## Issues and labels diff --git a/Gemfile b/Gemfile index 99ecd9331a..081111b382 100644 --- a/Gemfile +++ b/Gemfile @@ -1,9 +1,8 @@ source 'https://rubygems.org' group :development, :test do - gem 'jekyll', '~> 3.1.1' - gem 'jekyll-redirect-from', '~> 0.9.1' + gem 'jekyll', '~> 3.1.2' + gem 'jekyll-redirect-from', '~> 0.10.0' gem 'jekyll-sitemap', '~> 0.10.0' - gem 'sass', '~> 3.4.21' - gem 'scss_lint', '~> 0.44.0' + gem 'scss_lint', '~> 0.47.1' end diff --git a/Gemfile.lock b/Gemfile.lock index 3391e7f48b..6ea5c72615 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -4,7 +4,7 @@ GEM colorator (0.1) ffi (1.9.10) ffi (1.9.10-x64-mingw32) - jekyll (3.1.1) + jekyll (3.1.2) colorator (~> 0.1) jekyll-sass-converter (~> 1.0) jekyll-watch (~> 1.1) @@ -13,18 +13,18 @@ GEM mercenary (~> 0.3.3) rouge (~> 1.7) safe_yaml (~> 1.0) - jekyll-redirect-from (0.9.1) + jekyll-redirect-from (0.10.0) jekyll (>= 2.0) jekyll-sass-converter (1.4.0) sass (~> 3.4) jekyll-sitemap (0.10.0) jekyll-watch (1.3.1) listen (~> 3.0) - kramdown (1.9.0) + kramdown (1.10.0) liquid (3.0.6) - listen (3.0.5) + listen (3.0.6) rb-fsevent (>= 0.9.3) - rb-inotify (>= 0.9) + rb-inotify (>= 0.9.7) mercenary (0.3.5) rake (10.5.0) rb-fsevent (0.9.7) @@ -33,8 +33,8 @@ GEM rouge (1.10.1) safe_yaml (1.0.4) sass (3.4.21) - scss_lint (0.44.0) - rake (~> 10.0) + scss_lint (0.47.1) + rake (>= 0.9, < 11) sass (~> 3.4.15) PLATFORMS @@ -42,11 +42,10 @@ PLATFORMS x64-mingw32 DEPENDENCIES - jekyll (~> 3.1.1) - jekyll-redirect-from (~> 0.9.1) + jekyll (~> 3.1.2) + jekyll-redirect-from (~> 0.10.0) jekyll-sitemap (~> 0.10.0) - sass (~> 3.4.21) - scss_lint (~> 0.44.0) + scss_lint (~> 0.47.1) BUNDLED WITH 1.11.2 diff --git a/Gruntfile.js b/Gruntfile.js index 9f48bd2033..37c3dfb5d1 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -22,9 +22,7 @@ module.exports = function (grunt) { /* end mod */ var fs = require('fs'); var path = require('path'); - var glob = require('glob'); var isTravis = require('is-travis'); - var npmShrinkwrap = require('npm-shrinkwrap'); var mq4HoverShim = require('mq4-hover-shim'); var autoprefixerSettings = require('./grunt/autoprefixer-settings.js'); var autoprefixer = require('autoprefixer')(autoprefixerSettings); @@ -34,7 +32,9 @@ module.exports = function (grunt) { Object.keys(configBridge.paths).forEach(function (key) { configBridge.paths[key].forEach(function (val, i, arr) { + /* boosted mod */ arr[i] = path.join('./.tmpdocs/assets', val); + /* end mod */ }); }); @@ -62,7 +62,9 @@ module.exports = function (grunt) { clean: { dist: 'dist', docs: 'docs/dist', + /* Boosted mod */ tmp: '.tmpdocs' + /* end mod */ }, // JS build configuration @@ -94,8 +96,10 @@ module.exports = function (grunt) { 'js/dist/scrollspy.js' : 'js/src/scrollspy.js', 'js/dist/tab.js' : 'js/src/tab.js', 'js/dist/tooltip.js' : 'js/src/tooltip.js', - 'js/dist/navbar.js' : 'js/src/navbar.js', + /* Boosted mod */ + 'js/dist/navbar.js' : 'js/src/navbar.js', 'js/dist/megamenu.js' : 'js/src/megamenu.js', + /* end mod */ 'js/dist/popover.js' : 'js/src/popover.js' } }, @@ -122,8 +126,10 @@ module.exports = function (grunt) { 'dist/js/umd/scrollspy.js' : 'js/src/scrollspy.js', 'dist/js/umd/tab.js' : 'js/src/tab.js', 'dist/js/umd/tooltip.js' : 'js/src/tooltip.js', - 'dist/js/umd/navbar.js' : 'js/src/navbar.js', + /* Boosted mod */ + 'dist/js/umd/navbar.js' : 'js/src/navbar.js', 'dist/js/umd/megamenu.js' : 'js/src/megamenu.js', + /* end mod */ 'dist/js/umd/popover.js' : 'js/src/popover.js' } } @@ -153,7 +159,9 @@ module.exports = function (grunt) { options: { requireCamelCaseOrUpperCaseIdentifiers: null }, + /* Boosted mod */ src: ['.tmpdocs/assets/js/src/*.js', '.tmpdocs/assets/js/*.js', '!.tmpdocs/assets/js/*.min.js'] + /* end mod */ } }, @@ -185,8 +193,10 @@ module.exports = function (grunt) { 'js/src/scrollspy.js', 'js/src/tab.js', 'js/src/tooltip.js', + /* Boosted mod */ 'js/src/navbar.js', 'js/src/megamenu.js', + /* end mod */ 'js/src/popover.js' ], dest: 'dist/js/<%= pkg.name %>.js' @@ -198,8 +208,8 @@ module.exports = function (grunt) { '.tmpdocs/assets/js/src/application-orange.js' ], dest: '.tmpdocs/assets/js/src/application.js' + /* end mod */ } - /* end mod */ }, uglify: { @@ -216,7 +226,9 @@ module.exports = function (grunt) { }, docsJs: { src: configBridge.paths.docsJs, + /* Boosted mod */ dest: '.tmpdocs/assets/js/docs.min.js' + /* end mod */ } }, @@ -235,7 +247,9 @@ module.exports = function (grunt) { reporterOutput: null }, core: { + /* Boosted mod */ src: ['scss/{,**/}*.scss', '!scss/_normalize.scss'] + /* end mod */ }, docs: { src: ['docs/assets/scss/*.scss', '!docs/assets/scss/docs.scss'] @@ -295,8 +309,10 @@ module.exports = function (grunt) { ] }, docs: { + /* Boosted mod */ src: '.tmpdocs/assets/css/docs.min.css', dest: '.tmpdocs/assets/css/docs.min.css' + /* end mod */ } }, @@ -307,9 +323,9 @@ module.exports = function (grunt) { src: [ '**/*' ], + /* boosted mod */ dest: '.tmpdocs/dist/' }, - /* boosted mod */ tmpdocs: { files: [ { @@ -343,12 +359,12 @@ module.exports = function (grunt) { cwd: 'bower_components/jquery.tablesorter/dist/js/', src: ['*'], dest: 'dist/js/vendors/' + /* end mod */ } - /* end mod */ }, - /* boosted mod */ connect: { + /* boosted mod */ // server: { // options: { // port: 3000, @@ -365,10 +381,10 @@ module.exports = function (grunt) { serveStatic('_gh_pages') ]; } + /* end mod */ } } }, - /* end mod */ jekyll: { options: { @@ -488,7 +504,7 @@ module.exports = function (grunt) { 'Element “form” does not need a “role” attribute.', 'The “contentinfo” role is unnecessary for element “footer”.', 'Bad value “search” for attribute “role” on element “form”.', - 'Attribute “aria-required” not allowed on element “input” at this point.', + 'Attribute “aria-required” not allowed on element “input” at this point.', 'Element “input” is missing one or more of the following attributes: “aria-expanded”, “aria-valuemax”, “aria-valuemin”, “aria-valuenow”, “role”.', /* end mod */ 'Attribute “autocomplete” is only allowed when the input type is “color”, “date”, “datetime”, “datetime-local”, “email”, “month”, “number”, “password”, “range”, “search”, “tel”, “text”, “time”, “url”, or “week”.', @@ -640,10 +656,10 @@ module.exports = function (grunt) { // grunt.registerTask('sass-compile', ['sass:core', 'sass:extras', 'sass:docs']); grunt.registerTask('sass-compile', ['sass:core', 'sass:docs']); - /* boosted mod */ grunt.registerTask('dist-css', ['sass-compile', 'postcss:core', 'cssmin:core', 'cssmin:docs']); // Full distribution task. + /* boosted mod */ grunt.registerTask('dist', ['clean:dist', 'clean:tmp', 'dist-css', 'dist-js', 'copy:fonts','copy:img','copy:vendorsjs']); /* end mod */ // Default task. @@ -662,35 +678,22 @@ module.exports = function (grunt) { // Docs task. /* boosted mod */ grunt.registerTask('docs-css', ['sass:docs','postcss:docs', 'postcss:examples', 'cssmin:docs']); - grunt.registerTask('docs-js', ['concat:docsJs', 'uglify:docsJs']); /* end mod */ grunt.registerTask('lint-docs-css', ['scsslint:docs']); + /* boosted mod */ + grunt.registerTask('docs-js', ['concat:docsJs', 'uglify:docsJs']); + /* end mod */ grunt.registerTask('lint-docs-js', ['jscs:assets']); /* boosted mod */ grunt.registerTask('docs', ['copy:tmpdocs','lint-docs-css','docs-css', 'docs-js', 'lint-docs-js', 'clean:docs', 'copy:docs', 'jekyll:docs', 'replace']); /* end mod */ grunt.registerTask('docs-github', ['jekyll:github']); + grunt.registerTask('prep-release', ['dist', 'docs', 'docs-github', 'compress']); // Publish to GitHub grunt.registerTask('publish', ['buildcontrol:pages']); - // Task for updating the cached npm packages used by the Travis build (which are controlled by test-infra/npm-shrinkwrap.json). - // This task should be run and the updated file should be committed whenever Bootstrap's dependencies change. - grunt.registerTask('update-shrinkwrap', ['exec:npmUpdate', '_update-shrinkwrap']); - grunt.registerTask('_update-shrinkwrap', function () { - var done = this.async(); - npmShrinkwrap({ dev: true, dirname: __dirname }, function (err) { - if (err) { - grunt.fail.warn(err); - } - var dest = 'grunt/npm-shrinkwrap.json'; - fs.renameSync('npm-shrinkwrap.json', dest); - grunt.log.writeln('File ' + dest.cyan + ' updated.'); - done(); - }); - }); - /* boosted mod */ grunt.registerTask('serve', 'Compile then start a connect web server', function (target) { grunt.task.run([ diff --git a/_config.yml b/_config.yml index 0180dbe91b..404e24025d 100644 --- a/_config.yml +++ b/_config.yml @@ -84,7 +84,7 @@ cdn: css_hash: "sha384-y3tfxAZXuh4HwSYylfB+J125MxIs6mR5FOHamPBG064zB+AFeWH94NdvaCBm8qnd" js: https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.2/js/bootstrap.min.js js_hash: "sha384-vZ2WRJMwsjRMW/8U7i6PWi6AlO1L79snBrmgiDpgIWJ82z8eA5lenwvxbMV1PAh7" - jquery: https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js - jquery_hash: "sha384-8gBf6Y4YYq7Jx97PIqmTwLPin4hxIzQw5aDmUg/DDhul9fFpbbLcLh3nTIIDJKhx" - tether: https://cdnjs.cloudflare.com/ajax/libs/tether/1.1.1/js/tether.min.js - tether_hash: "sha384-MWq1Lnqj72tmjGdOKuNBn3E0gj3vWfy/1EmR5TVL8d8nGvwgy32YkCpKpTUhwBVv" + jquery: https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js + jquery_hash: "sha384-mXQoED/lFIuocc//nss8aJOIrz7X7XruhR6bO+sGceiSyMELoVdZkN7F0oYwcFH+" + tether: https://cdnjs.cloudflare.com/ajax/libs/tether/1.2.0/js/tether.min.js + tether_hash: "sha384-Plbmg8JY28KFelvJVai01l8WyZzrYWG825m+cZ0eDDS1f7d/js6ikvy1+X+guPIB" diff --git a/docs-orange/_data/nav.yml b/docs-orange/_data/nav.yml index e385514b4a..c525cd225e 100644 --- a/docs-orange/_data/nav.yml +++ b/docs-orange/_data/nav.yml @@ -40,7 +40,7 @@ - title: Input group - title: Dropdowns - title: Jumbotron - - title: Label + - title: Tag - title: Alerts - title: Card - title: Navs diff --git a/docs-orange/_includes/footer.html b/docs-orange/_includes/footer.html index 43fad4a268..07c9269265 100644 --- a/docs-orange/_includes/footer.html +++ b/docs-orange/_includes/footer.html @@ -74,8 +74,8 @@

footer - site map & informations

+ - + + - + diff --git a/docs/examples/carousel/index.html b/docs/examples/carousel/index.html index 986c4e8a51..f0144bf3ea 100644 --- a/docs/examples/carousel/index.html +++ b/docs/examples/carousel/index.html @@ -174,9 +174,9 @@

And lastly, this one. Ch - + - + diff --git a/docs/examples/cover/index.html b/docs/examples/cover/index.html index f97adf61ee..60833e2129 100644 --- a/docs/examples/cover/index.html +++ b/docs/examples/cover/index.html @@ -60,9 +60,9 @@

Cover your page.

- + - + diff --git a/docs/examples/dashboard/dashboard.css b/docs/examples/dashboard/dashboard.css index e0e3632b89..e7c6a21dfd 100644 --- a/docs/examples/dashboard/dashboard.css +++ b/docs/examples/dashboard/dashboard.css @@ -80,9 +80,6 @@ body { padding-left: 40px; } } -.main .page-header { - margin-top: 0; -} /* diff --git a/docs/examples/dashboard/index.html b/docs/examples/dashboard/index.html index 65cc380cbc..3b39ea216e 100644 --- a/docs/examples/dashboard/index.html +++ b/docs/examples/dashboard/index.html @@ -64,7 +64,7 @@
-

Dashboard

+

Dashboard

@@ -224,9 +224,9 @@

Section title

- + - + diff --git a/docs/examples/grid/index.html b/docs/examples/grid/index.html index 9e831115b4..4723f0e8d9 100644 --- a/docs/examples/grid/index.html +++ b/docs/examples/grid/index.html @@ -21,10 +21,8 @@
- +

Bootstrap grid examples

+

Basic grid layouts to get you familiar with building within the Bootstrap grid system.

Five grid tiers

There are five tiers to the Bootstrap grid system, one for each range of devices we support. Each tier starts at a minimum viewport size and automatically applies to the larger devices unless overridden.

diff --git a/docs/examples/jumbotron/index.html b/docs/examples/jumbotron/index.html index 3e362fb46a..a9330b1c3a 100644 --- a/docs/examples/jumbotron/index.html +++ b/docs/examples/jumbotron/index.html @@ -75,9 +75,9 @@

Heading

- + - + diff --git a/docs/examples/navbar-top-fixed/index.html b/docs/examples/navbar-top-fixed/index.html index c6adfae215..85db5e03d9 100644 --- a/docs/examples/navbar-top-fixed/index.html +++ b/docs/examples/navbar-top-fixed/index.html @@ -45,9 +45,9 @@

Navbar example

- + - + diff --git a/docs/examples/navbar-top/index.html b/docs/examples/navbar-top/index.html index d6c5b0a9ed..6e77ec0925 100644 --- a/docs/examples/navbar-top/index.html +++ b/docs/examples/navbar-top/index.html @@ -43,9 +43,9 @@

Navbar example

- + - + diff --git a/docs/examples/navbar/index.html b/docs/examples/navbar/index.html index f17722a85c..01c5f60c42 100644 --- a/docs/examples/navbar/index.html +++ b/docs/examples/navbar/index.html @@ -64,9 +64,9 @@

Navbar example

- + - + diff --git a/docs/examples/offcanvas/index.html b/docs/examples/offcanvas/index.html index 16a70b3799..927b07f5b1 100644 --- a/docs/examples/offcanvas/index.html +++ b/docs/examples/offcanvas/index.html @@ -104,9 +104,9 @@

Heading

- + - + diff --git a/docs/examples/starter-template/index.html b/docs/examples/starter-template/index.html index b736ae161c..70f05e0598 100644 --- a/docs/examples/starter-template/index.html +++ b/docs/examples/starter-template/index.html @@ -48,9 +48,9 @@

Bootstrap starter template

- + - + diff --git a/docs/examples/sticky-footer-navbar/index.html b/docs/examples/sticky-footer-navbar/index.html index c1555759b8..a804602600 100644 --- a/docs/examples/sticky-footer-navbar/index.html +++ b/docs/examples/sticky-footer-navbar/index.html @@ -56,7 +56,7 @@

Collapsed content

-