Browse Source

Merge branch 'v3-dev' into feature/load-grunt-config

# Conflicts:
#	Gruntfile.js -> Resolve
#	package.json -> Resolve
Arno Roldao Junior 8 years ago
parent
commit
c58d1d48c5
100 changed files with 6175 additions and 11238 deletions
  1. 15 7
      Gruntfile.js
  2. 0 6800
      bootstrap/css/bootstrap.css
  3. 0 1
      bootstrap/css/bootstrap.css.map
  4. 0 5
      bootstrap/css/bootstrap.min.css
  5. BIN
      bootstrap/fonts/glyphicons-halflings-regular.eot
  6. 0 288
      bootstrap/fonts/glyphicons-halflings-regular.svg
  7. BIN
      bootstrap/fonts/glyphicons-halflings-regular.ttf
  8. BIN
      bootstrap/fonts/glyphicons-halflings-regular.woff
  9. BIN
      bootstrap/fonts/glyphicons-halflings-regular.woff2
  10. 0 2317
      bootstrap/js/bootstrap.js
  11. 0 7
      bootstrap/js/bootstrap.min.js
  12. 0 13
      bootstrap/js/npm.js
  13. 2 1
      bower.json
  14. 5 5
      bower_components/bootstrap/.bower.json
  15. 5 4
      bower_components/bootstrap/Gemfile
  16. 27 53
      bower_components/bootstrap/Gemfile.lock
  17. 90 82
      bower_components/bootstrap/Gruntfile.js
  18. 8 8
      bower_components/bootstrap/README.md
  19. 869 959
      bower_components/bootstrap/dist/css/bootstrap.css
  20. 1 1
      bower_components/bootstrap/dist/css/bootstrap.css.map
  21. 3 3
      bower_components/bootstrap/dist/css/bootstrap.min.css
  22. 1 1
      bower_components/bootstrap/dist/css/bootstrap.min.css.map
  23. 100 59
      bower_components/bootstrap/dist/js/bootstrap.js
  24. 3 3
      bower_components/bootstrap/dist/js/bootstrap.min.js
  25. 2 2
      bower_components/bootstrap/dist/js/umd/alert.js
  26. 2 2
      bower_components/bootstrap/dist/js/umd/button.js
  27. 15 4
      bower_components/bootstrap/dist/js/umd/carousel.js
  28. 5 2
      bower_components/bootstrap/dist/js/umd/collapse.js
  29. 5 2
      bower_components/bootstrap/dist/js/umd/dropdown.js
  30. 7 4
      bower_components/bootstrap/dist/js/umd/modal.js
  31. 11 14
      bower_components/bootstrap/dist/js/umd/popover.js
  32. 5 2
      bower_components/bootstrap/dist/js/umd/scrollspy.js
  33. 5 2
      bower_components/bootstrap/dist/js/umd/tab.js
  34. 38 20
      bower_components/bootstrap/dist/js/umd/tooltip.js
  35. 2 2
      bower_components/bootstrap/dist/js/umd/util.js
  36. 0 7
      bower_components/bootstrap/grunt/.jshintrc
  37. 1 1
      bower_components/bootstrap/grunt/bs-commonjs-generator.js
  38. 105 0
      bower_components/bootstrap/grunt/change-version.js
  39. 2 30
      bower_components/bootstrap/grunt/configBridge.json
  40. 4168 0
      bower_components/bootstrap/grunt/npm-shrinkwrap.json
  41. 5 1
      bower_components/bootstrap/grunt/sauce_browsers.yml
  42. 25 21
      bower_components/bootstrap/js/.eslintrc
  43. 2 1
      bower_components/bootstrap/js/.jscsrc
  44. 2 2
      bower_components/bootstrap/js/dist/alert.js
  45. 1 1
      bower_components/bootstrap/js/dist/alert.js.map
  46. 2 2
      bower_components/bootstrap/js/dist/button.js
  47. 1 1
      bower_components/bootstrap/js/dist/button.js.map
  48. 15 4
      bower_components/bootstrap/js/dist/carousel.js
  49. 1 1
      bower_components/bootstrap/js/dist/carousel.js.map
  50. 5 2
      bower_components/bootstrap/js/dist/collapse.js
  51. 1 1
      bower_components/bootstrap/js/dist/collapse.js.map
  52. 5 2
      bower_components/bootstrap/js/dist/dropdown.js
  53. 1 1
      bower_components/bootstrap/js/dist/dropdown.js.map
  54. 7 4
      bower_components/bootstrap/js/dist/modal.js
  55. 1 1
      bower_components/bootstrap/js/dist/modal.js.map
  56. 11 14
      bower_components/bootstrap/js/dist/popover.js
  57. 1 1
      bower_components/bootstrap/js/dist/popover.js.map
  58. 5 2
      bower_components/bootstrap/js/dist/scrollspy.js
  59. 1 1
      bower_components/bootstrap/js/dist/scrollspy.js.map
  60. 5 2
      bower_components/bootstrap/js/dist/tab.js
  61. 1 1
      bower_components/bootstrap/js/dist/tab.js.map
  62. 38 20
      bower_components/bootstrap/js/dist/tooltip.js
  63. 1 1
      bower_components/bootstrap/js/dist/tooltip.js.map
  64. 2 2
      bower_components/bootstrap/js/dist/util.js
  65. 1 1
      bower_components/bootstrap/js/dist/util.js.map
  66. 2 2
      bower_components/bootstrap/js/src/alert.js
  67. 2 2
      bower_components/bootstrap/js/src/button.js
  68. 14 6
      bower_components/bootstrap/js/src/carousel.js
  69. 5 2
      bower_components/bootstrap/js/src/collapse.js
  70. 10 7
      bower_components/bootstrap/js/src/dropdown.js
  71. 11 9
      bower_components/bootstrap/js/src/modal.js
  72. 10 18
      bower_components/bootstrap/js/src/popover.js
  73. 5 2
      bower_components/bootstrap/js/src/scrollspy.js
  74. 8 5
      bower_components/bootstrap/js/src/tab.js
  75. 42 26
      bower_components/bootstrap/js/src/tooltip.js
  76. 2 2
      bower_components/bootstrap/js/src/util.js
  77. 8 0
      bower_components/bootstrap/nuget/MyGet.ps1
  78. 27 0
      bower_components/bootstrap/nuget/bootstrap.nuspec
  79. 27 0
      bower_components/bootstrap/nuget/bootstrap.sass.nuspec
  80. 1 9
      bower_components/bootstrap/package.js
  81. 39 35
      bower_components/bootstrap/package.json
  82. 13 5
      bower_components/bootstrap/scss/.scsslint.yml
  83. 2 3
      bower_components/bootstrap/scss/_alert.scss
  84. 4 4
      bower_components/bootstrap/scss/_breadcrumb.scss
  85. 2 2
      bower_components/bootstrap/scss/_button-group.scss
  86. 5 9
      bower_components/bootstrap/scss/_buttons.scss
  87. 108 110
      bower_components/bootstrap/scss/_card.scss
  88. 6 6
      bower_components/bootstrap/scss/_carousel.scss
  89. 1 1
      bower_components/bootstrap/scss/_code.scss
  90. 24 24
      bower_components/bootstrap/scss/_custom-forms.scss
  91. 23 12
      bower_components/bootstrap/scss/_dropdown.scss
  92. 26 31
      bower_components/bootstrap/scss/_forms.scss
  93. 26 75
      bower_components/bootstrap/scss/_grid.scss
  94. 29 4
      bower_components/bootstrap/scss/_images.scss
  95. 15 7
      bower_components/bootstrap/scss/_input-group.scss
  96. 4 6
      bower_components/bootstrap/scss/_jumbotron.scss
  97. 10 9
      bower_components/bootstrap/scss/_labels.scss
  98. 16 4
      bower_components/bootstrap/scss/_list-group.scss
  99. 6 0
      bower_components/bootstrap/scss/_media.scss
  100. 0 0
      bower_components/bootstrap/scss/_mixins.scss

+ 15 - 7
Gruntfile.js

@@ -3,19 +3,27 @@
 module.exports = function (grunt) {
 
   'use strict';
-  // Load all grunt tasks
+  //loading the configurations and grunt tasks
   var configs = require('load-grunt-config')(grunt,{
     configPath: __dirname +  '/grunt-tasks',
     data:{
-      pkg: grunt.file.readJSON("package.json")
+      // Metadata.
+      pkg: grunt.file.readJSON('package.json'),
+      banner: '/*!\n' +
+      ' * AdminLTE v<%= pkg.version %> (<%= pkg.homepage %>)\n' +
+      ' * Copyright 2014-<%= grunt.template.today("yyyy") %> <%= pkg.author %>\n' +
+      ' * Project website Almsaeed Studio (https://almsaeedstudio.com)\n' +
+      ' * Licensed under MIT (https://github.com/almasaeed2010/AdminLTE/blob/master/LICENSE)\n' +
+      ' */\n'
     }
   });
 
   grunt.initConfig(configs);
 
   // Linting task
-  grunt.registerTask('lint', ['jshint', 'csslint', 'bootlint']);
-
-  // The default task (running "grunt" in console) is "watch"
-  grunt.registerTask('default', ['watch']);
-};
+  grunt.registerTask('lint', ['jscs', 'eslint', 'csslint', 'bootlint'])
+  // JS Build Task
+  grunt.registerTask('build-js', ['babel', 'concat', 'uglify'])
+  // The default task (running 'grunt' in console) is 'watch'
+  grunt.registerTask('default', ['watch'])
+}

File diff suppressed because it is too large
+ 0 - 6800
bootstrap/css/bootstrap.css


File diff suppressed because it is too large
+ 0 - 1
bootstrap/css/bootstrap.css.map


File diff suppressed because it is too large
+ 0 - 5
bootstrap/css/bootstrap.min.css


BIN
bootstrap/fonts/glyphicons-halflings-regular.eot


File diff suppressed because it is too large
+ 0 - 288
bootstrap/fonts/glyphicons-halflings-regular.svg


BIN
bootstrap/fonts/glyphicons-halflings-regular.ttf


BIN
bootstrap/fonts/glyphicons-halflings-regular.woff


BIN
bootstrap/fonts/glyphicons-halflings-regular.woff2


File diff suppressed because it is too large
+ 0 - 2317
bootstrap/js/bootstrap.js


File diff suppressed because it is too large
+ 0 - 7
bootstrap/js/bootstrap.min.js


+ 0 - 13
bootstrap/js/npm.js

@@ -1,13 +0,0 @@
-// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment.
-require('../../js/transition.js')
-require('../../js/alert.js')
-require('../../js/button.js')
-require('../../js/carousel.js')
-require('../../js/collapse.js')
-require('../../js/dropdown.js')
-require('../../js/modal.js')
-require('../../js/tooltip.js')
-require('../../js/popover.js')
-require('../../js/scrollspy.js')
-require('../../js/tab.js')
-require('../../js/affix.js')

+ 2 - 1
bower.json

@@ -12,7 +12,8 @@
   ],
   "dependencies": {
     "jquery": "1.9.1 - 2",
-    "bootstrap": "https://github.com/twbs/bootstrap.git#v4.0.0-alpha"
+    "bootstrap": "https://github.com/twbs/bootstrap.git#v4.0.0-alpha.2",
+    "font-awesome": "^4"
   },
   "keywords": [
     "css",

+ 5 - 5
bower_components/bootstrap/.bower.json

@@ -31,14 +31,14 @@
   "dependencies": {
     "jquery": "1.9.1 - 2"
   },
-  "version": "4.0.0-alpha",
-  "_release": "4.0.0-alpha",
+  "version": "4.0.0-alpha.2",
+  "_release": "4.0.0-alpha.2",
   "_resolution": {
     "type": "version",
-    "tag": "v4.0.0-alpha",
-    "commit": "980d8ea2d828fe1796a423f80d84d526b0252a89"
+    "tag": "v4.0.0-alpha.2",
+    "commit": "48938155eb24b4ccdde09426066869504c6dab3c"
   },
   "_source": "https://github.com/twbs/bootstrap.git",
-  "_target": "v4.0.0-alpha",
+  "_target": "v4.0.0-alpha.2",
   "_originalSource": "https://github.com/twbs/bootstrap.git"
 }

+ 5 - 4
bower_components/bootstrap/Gemfile

@@ -4,8 +4,9 @@
 source 'https://rubygems.org'
 
 group :development, :test do
-  gem 'jekyll', '~> 2.5.2'
-  gem 'rouge', '~> 1.7.4'
-  gem 'sass', '~> 3.4.9'
-  gem 'scss-lint', '~> 0.31'
+  gem 'jekyll', '~> 3.0.1'
+  gem 'jekyll-redirect-from', '~> 0.9.0'
+  gem 'jekyll-sitemap', '~> 0.9.0'
+  gem 'sass', '~> 3.4.19'
+  gem 'scss_lint', '~> 0.43'
 end

+ 27 - 53
bower_components/bootstrap/Gemfile.lock

@@ -1,78 +1,52 @@
 GEM
   remote: https://rubygems.org/
   specs:
-    blankslate (2.1.2.4)
-    celluloid (0.16.0)
-      timers (~> 4.0.0)
-    classifier-reborn (2.0.2)
-      fast-stemmer (~> 1.0)
-    coffee-script (2.3.0)
-      coffee-script-source
-      execjs
-    coffee-script-source (1.8.0)
     colorator (0.1)
-    execjs (2.2.2)
-    fast-stemmer (1.0.2)
-    ffi (1.9.6)
-    hitimes (1.2.2)
-    jekyll (2.5.2)
-      classifier-reborn (~> 2.0)
+    ffi (1.9.10)
+    ffi (1.9.10-x64-mingw32)
+    jekyll (3.0.1)
       colorator (~> 0.1)
-      jekyll-coffeescript (~> 1.0)
-      jekyll-gist (~> 1.0)
-      jekyll-paginate (~> 1.0)
       jekyll-sass-converter (~> 1.0)
       jekyll-watch (~> 1.1)
       kramdown (~> 1.3)
-      liquid (~> 2.6.1)
+      liquid (~> 3.0)
       mercenary (~> 0.3.3)
-      pygments.rb (~> 0.6.0)
-      redcarpet (~> 3.1)
+      rouge (~> 1.7)
       safe_yaml (~> 1.0)
-      toml (~> 0.1.0)
-    jekyll-coffeescript (1.0.1)
-      coffee-script (~> 2.2)
-    jekyll-gist (1.1.0)
-    jekyll-paginate (1.1.0)
+    jekyll-redirect-from (0.9.0)
+      jekyll (>= 2.0)
     jekyll-sass-converter (1.3.0)
       sass (~> 3.2)
-    jekyll-watch (1.2.0)
-      listen (~> 2.7)
-    kramdown (1.5.0)
-    liquid (2.6.1)
-    listen (2.8.4)
-      celluloid (>= 0.15.2)
+    jekyll-sitemap (0.9.0)
+    jekyll-watch (1.3.0)
+      listen (~> 3.0)
+    kramdown (1.9.0)
+    liquid (3.0.6)
+    listen (3.0.5)
       rb-fsevent (>= 0.9.3)
       rb-inotify (>= 0.9)
     mercenary (0.3.5)
-    parslet (1.5.0)
-      blankslate (~> 2.0)
-    posix-spawn (0.3.9)
-    pygments.rb (0.6.0)
-      posix-spawn (~> 0.3.6)
-      yajl-ruby (~> 1.1.0)
     rainbow (2.0.0)
-    rb-fsevent (0.9.4)
+    rb-fsevent (0.9.6)
     rb-inotify (0.9.5)
       ffi (>= 0.5.0)
-    redcarpet (3.2.2)
-    rouge (1.7.4)
+    rouge (1.10.1)
     safe_yaml (1.0.4)
-    sass (3.4.9)
-    scss-lint (0.31.0)
+    sass (3.4.19)
+    scss_lint (0.43.2)
       rainbow (~> 2.0)
-      sass (~> 3.4.1)
-    timers (4.0.1)
-      hitimes
-    toml (0.1.2)
-      parslet (~> 1.5.0)
-    yajl-ruby (1.1.0)
+      sass (~> 3.4.15)
 
 PLATFORMS
   ruby
+  x64-mingw32
 
 DEPENDENCIES
-  jekyll (~> 2.5.2)
-  rouge (~> 1.7.4)
-  sass (~> 3.4.9)
-  scss-lint (~> 0.31)
+  jekyll (~> 3.0.1)
+  jekyll-redirect-from (~> 0.9.0)
+  jekyll-sitemap (~> 0.9.0)
+  sass (~> 3.4.19)
+  scss_lint (~> 0.43)
+
+BUNDLED WITH
+   1.10.6

+ 90 - 82
bower_components/bootstrap/Gruntfile.js

@@ -1,7 +1,7 @@
 /*!
  * Bootstrap's Gruntfile
  * http://getbootstrap.com
- * Copyright 2013-2014 Twitter, Inc.
+ * Copyright 2013-2015 Twitter, Inc.
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
  */
 
@@ -18,8 +18,40 @@ module.exports = function (grunt) {
   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 autoprefixer = require('autoprefixer')({
+    browsers: [
+      //
+      // Official browser support policy:
+      // http://v4-alpha.getbootstrap.com/getting-started/browsers-devices/#supported-browsers
+      //
+      'Chrome >= 35', // Exact version number here is kinda arbitrary
+      // Rather than using Autoprefixer's native "Firefox ESR" version specifier string,
+      // we deliberately hardcode the number. This is to avoid unwittingly severely breaking the previous ESR in the event that:
+      // (a) we happen to ship a new Bootstrap release soon after the release of a new ESR,
+      //     such that folks haven't yet had a reasonable amount of time to upgrade; and
+      // (b) the new ESR has unprefixed CSS properties/values whose absence would severely break webpages
+      //     (e.g. `box-sizing`, as opposed to `background: linear-gradient(...)`).
+      //     Since they've been unprefixed, Autoprefixer will stop prefixing them,
+      //     thus causing them to not work in the previous ESR (where the prefixes were required).
+      'Firefox >= 31', // Current Firefox Extended Support Release (ESR)
+      // Note: Edge versions in Autoprefixer & Can I Use refer to the EdgeHTML rendering engine version,
+      // NOT the Edge app version shown in Edge's "About" screen.
+      // For example, at the time of writing, Edge 20 on an up-to-date system uses EdgeHTML 12.
+      // See also https://github.com/Fyrd/caniuse/issues/1928
+      'Edge >= 12',
+      'Explorer >= 9',
+      // Out of leniency, we prefix these 1 version further back than the official policy.
+      'iOS >= 8',
+      'Safari >= 8',
+      // The following remain NOT officially supported, but we're lenient and include their prefixes to avoid severely breaking in them.
+      'Android 2.3',
+      'Android >= 4',
+      'Opera >= 12'
+    ]
+  });
 
   var generateCommonJSModule = require('./grunt/bs-commonjs-generator.js');
   var configBridge = grunt.file.readJSON('./grunt/configBridge.json', { encoding: 'utf8' });
@@ -45,8 +77,8 @@ module.exports = function (grunt) {
                  '}\n',
     jqueryVersionCheck: '+function ($) {\n' +
                         '  var version = $.fn.jquery.split(\' \')[0].split(\'.\')\n' +
-                        '  if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1)) {\n' +
-                        '    throw new Error(\'Bootstrap\\\'s JavaScript requires jQuery version 1.9.1 or higher\')\n' +
+                        '  if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] >= 3)) {\n' +
+                        '    throw new Error(\'Bootstrap\\\'s JavaScript requires at least jQuery v1.9.1 but less than v3.0.0\')\n' +
                         '  }\n' +
                         '}(jQuery);\n\n',
 
@@ -184,16 +216,12 @@ module.exports = function (grunt) {
           warnings: false
         },
         mangle: true,
-        preserveComments: 'some'
+        preserveComments: /^!|@preserve|@license|@cc_on/i
       },
       core: {
         src: '<%= concat.bootstrap.dest %>',
         dest: 'dist/js/<%= pkg.name %>.min.js'
       },
-      customize: {
-        src: configBridge.paths.customizerJs,
-        dest: 'docs/assets/js/customize.min.js'
-      },
       docsJs: {
         src: configBridge.paths.docsJs,
         dest: 'docs/assets/js/docs.min.js'
@@ -210,45 +238,38 @@ module.exports = function (grunt) {
     // CSS build configuration
     scsslint: {
       options: {
-        config: 'scss/.scsslint.yml',
+        bundleExec: true,
+        config: 'scss/.scss-lint.yml',
         reporterOutput: null
       },
       src: ['scss/*.scss', '!scss/_normalize.scss']
     },
 
     postcss: {
-      options: {
-        map: true,
-        processors: [mq4HoverShim.postprocessorFor({ hoverSelectorPrefix: '.bs-true-hover ' })]
-      },
-      core: {
-        src: 'dist/css/*.css'
-      }
-    },
-
-    autoprefixer: {
-      options: {
-        browsers: [
-          'Android 2.3',
-          'Android >= 4',
-          'Chrome >= 35',
-          'Firefox >= 31',
-          'Explorer >= 9',
-          'iOS >= 7',
-          'Opera >= 12',
-          'Safari >= 7.1'
-        ]
-      },
       core: {
         options: {
-          map: true
+          map: true,
+          processors: [
+            mq4HoverShim.postprocessorFor({ hoverSelectorPrefix: '.bs-true-hover ' }),
+            autoprefixer
+          ]
         },
         src: 'dist/css/*.css'
       },
       docs: {
+        options: {
+          processors: [
+            autoprefixer
+          ]
+        },
         src: 'docs/assets/css/docs.min.css'
       },
       examples: {
+        options: {
+          processors: [
+            autoprefixer
+          ]
+        },
         expand: true,
         cwd: 'docs/examples/',
         src: ['**/*.css'],
@@ -260,10 +281,10 @@ module.exports = function (grunt) {
       options: {
         // TODO: disable `zeroUnits` optimization once clean-css 3.2 is released
         //    and then simplify the fix for https://github.com/twbs/bootstrap/issues/14837 accordingly
-        compatibility: 'ie8',
+        compatibility: 'ie9',
         keepSpecialComments: '*',
         sourceMap: true,
-        noAdvanced: true
+        advanced: false
       },
       core: {
         files: [
@@ -282,16 +303,6 @@ module.exports = function (grunt) {
       }
     },
 
-    usebanner: {
-      options: {
-        position: 'top',
-        banner: '<%= banner %>'
-      },
-      files: {
-        src: 'dist/css/*.css'
-      }
-    },
-
     csscomb: {
       options: {
         config: 'scss/.csscomb.json'
@@ -336,7 +347,9 @@ module.exports = function (grunt) {
 
     jekyll: {
       options: {
-        config: '_config.yml'
+        bundleExec: true,
+        config: '_config.yml',
+        incremental: false
       },
       docs: {},
       github: {
@@ -350,15 +363,14 @@ module.exports = function (grunt) {
       options: {
         ignore: [
           'Element “img” is missing required attribute “src”.',
-          'Bad value “X-UA-Compatible” for attribute “http-equiv” on element “meta”.',
-          'Attribute “autocomplete” not allowed on element “input” at this point.',
+          '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”.',
           'Attribute “autocomplete” not allowed on element “button” at this point.',
           'Element “div” not allowed as child of element “progress” in this context. (Suppressing further errors from this subtree.)',
           'Consider using the “h1” element as a top-level heading only (all “h1” elements are treated as top-level headings by many screen readers and other tools).',
           'The “datetime” input type is not supported in all browsers. Please be sure to test, and consider using a polyfill.'
         ]
       },
-      src: '_gh_pages/**/*.html'
+      src: ['_gh_pages/**/*.html', 'js/tests/visual/*.html']
     },
 
     watch: {
@@ -376,17 +388,6 @@ module.exports = function (grunt) {
       }
     },
 
-    sed: {
-      versionNumber: {
-        pattern: (function () {
-          var old = grunt.option('oldver');
-          return old ? RegExp.quote(old) : old;
-        })(),
-        replacement: grunt.option('newver'),
-        recursive: true
-      }
-    },
-
     'saucelabs-qunit': {
       all: {
         options: {
@@ -403,14 +404,6 @@ module.exports = function (grunt) {
     exec: {
       npmUpdate: {
         command: 'npm update'
-      },
-      bundleUpdate: {
-        command: function () {
-          // Update dev gems and all the test gemsets
-          return 'bundle update && ' + glob.sync('test-infra/gemfiles/*.gemfile').map(function (gemfile) {
-            return 'BUNDLE_GEMFILE=' + gemfile + ' bundle update';
-          }).join(' && ');
-        }
       }
     },
 
@@ -427,7 +420,27 @@ module.exports = function (grunt) {
           branch: 'gh-pages'
         }
       }
+    },
+
+    compress: {
+      main: {
+        options: {
+          archive: 'bootstrap-<%= pkg.version %>-dist.zip',
+          mode: 'zip',
+          level: 9,
+          pretty: true
+        },
+        files: [
+          {
+            expand: true,
+            cwd: 'dist/',
+            src: ['**'],
+            dest: 'bootstrap-<%= pkg.version %>-dist'
+          }
+        ]
+      }
     }
+
   });
 
 
@@ -438,7 +451,7 @@ module.exports = function (grunt) {
   require('time-grunt')(grunt);
 
   // Docs HTML validation task
-  grunt.registerTask('validate-html', ['jekyll:docs']);
+  grunt.registerTask('validate-html', ['jekyll:docs', 'htmllint']);
 
   var runSubset = function (subset) {
     return !process.env.TWBS_TEST || process.env.TWBS_TEST === subset;
@@ -457,7 +470,8 @@ module.exports = function (grunt) {
   }
   // Skip HTML validation if running a different subset of the test suite
   if (runSubset('validate-html') &&
-      // Skip HTML5 validator on Travis when [skip validator] is in the commit message
+      isTravis &&
+      // Skip HTML5 validator when [skip validator] is in the commit message
       isUndefOrNonZero(process.env.TWBS_DO_VALIDATOR)) {
     testSubtasks.push('validate-html');
   }
@@ -467,6 +481,7 @@ module.exports = function (grunt) {
       runSubset('sauce-js-unit') &&
       // Skip Sauce on Travis when [skip sauce] is in the commit message
       isUndefOrNonZero(process.env.TWBS_DO_SAUCE)) {
+    testSubtasks.push('babel:dev');
     testSubtasks.push('connect');
     testSubtasks.push('saucelabs-qunit');
   }
@@ -474,7 +489,7 @@ module.exports = function (grunt) {
   grunt.registerTask('test-js', ['eslint', 'jscs:core', 'jscs:test', 'jscs:grunt', 'qunit']);
 
   // JS distribution task.
-  grunt.registerTask('dist-js', ['concat', 'lineremover', 'babel:dist', 'stamp', 'uglify:core', 'commonjs']);
+  grunt.registerTask('dist-js', ['babel:dev', 'concat', 'lineremover', 'babel:dist', 'stamp', 'uglify:core', 'commonjs']);
 
   grunt.registerTask('test-scss', ['scsslint']);
 
@@ -486,7 +501,7 @@ module.exports = function (grunt) {
   // grunt.registerTask('sass-compile', ['sass:core', 'sass:extras', 'sass:docs']);
   grunt.registerTask('sass-compile', ['sass:core', 'sass:docs']);
 
-  grunt.registerTask('dist-css', ['sass-compile', 'postcss:core', 'autoprefixer:core', 'usebanner', 'csscomb:dist', 'cssmin:core', 'cssmin:docs']);
+  grunt.registerTask('dist-css', ['sass-compile', 'postcss:core', 'csscomb:dist', 'cssmin:core', 'cssmin:docs']);
 
   // Full distribution task.
   grunt.registerTask('dist', ['clean:dist', 'dist-css', 'dist-js']);
@@ -494,11 +509,6 @@ module.exports = function (grunt) {
   // Default task.
   grunt.registerTask('default', ['clean:dist', 'test']);
 
-  // Version numbering task.
-  // grunt change-version-number --oldver=A.B.C --newver=X.Y.Z
-  // This can be overzealous, so its changes should always be manually reviewed!
-  grunt.registerTask('change-version-number', 'sed');
-
   grunt.registerTask('commonjs', ['babel:umd', 'npm-js']);
 
   grunt.registerTask('npm-js', 'Generate npm-js entrypoint module in dist dir.', function () {
@@ -510,12 +520,13 @@ module.exports = function (grunt) {
   });
 
   // Docs task.
-  grunt.registerTask('docs-css', ['autoprefixer:docs', 'autoprefixer:examples', 'csscomb:docs', 'csscomb:examples', 'cssmin:docs']);
+  grunt.registerTask('docs-css', ['postcss:docs', 'postcss:examples', 'csscomb:docs', 'csscomb:examples', 'cssmin:docs']);
   grunt.registerTask('docs-js', ['uglify:docsJs']);
   grunt.registerTask('lint-docs-js', ['jscs:assets']);
   grunt.registerTask('docs', ['docs-css', 'docs-js', 'lint-docs-js', 'clean:docs', 'copy:docs']);
+  grunt.registerTask('docs-github', ['jekyll:github', 'htmlmin']);
 
-  grunt.registerTask('prep-release', ['dist', 'docs', 'jekyll:github', 'htmlmin', 'compress']);
+  grunt.registerTask('prep-release', ['dist', 'docs', 'docs-github', 'compress']);
 
   // Publish to GitHub
   grunt.registerTask('publish', ['buildcontrol:pages']);
@@ -529,13 +540,10 @@ module.exports = function (grunt) {
       if (err) {
         grunt.fail.warn(err);
       }
-      var dest = 'test-infra/npm-shrinkwrap.json';
+      var dest = 'grunt/npm-shrinkwrap.json';
       fs.renameSync('npm-shrinkwrap.json', dest);
       grunt.log.writeln('File ' + dest.cyan + ' updated.');
       done();
     });
   });
-  // Task for updating the cached RubyGem packages used by the Travis build (which are controlled by test-infra/Gemfile.lock).
-  // This task should be run and the updated file should be committed whenever Bootstrap's RubyGem dependencies change.
-  grunt.registerTask('update-gemfile-lock', ['exec:bundleUpdate']);
 };

+ 8 - 8
bower_components/bootstrap/README.md

@@ -3,9 +3,9 @@
 [![Slack](https://bootstrap-slack.herokuapp.com/badge.svg)](https://bootstrap-slack.herokuapp.com)
 ![Bower version](https://img.shields.io/bower/v/bootstrap.svg)
 [![npm version](https://img.shields.io/npm/v/bootstrap.svg)](https://www.npmjs.com/package/bootstrap)
-[![Gem version](https://img.shields.io/gem/v/bootstrap.svg)](https://rubygems.org/gems/bootstrap)
 [![Build Status](https://img.shields.io/travis/twbs/bootstrap/master.svg)](https://travis-ci.org/twbs/bootstrap)
 [![devDependency Status](https://img.shields.io/david/dev/twbs/bootstrap.svg)](https://david-dm.org/twbs/bootstrap#info=devDependencies)
+[![NuGet](https://img.shields.io/nuget/vpre/bootstrap.svg)](https://www.nuget.org/packages/bootstrap/4.0.0-alpha)
 [![Selenium Test Status](https://saucelabs.com/browser-matrix/bootstrap.svg)](https://saucelabs.com/u/bootstrap)
 
 Bootstrap is a sleek, intuitive, and powerful front-end framework for faster and easier web development, created by [Mark Otto](https://twitter.com/mdo) and [Jacob Thornton](https://twitter.com/fat), and maintained by the [core team](https://github.com/orgs/twbs/people) with the massive support and involvement of the community.
@@ -27,12 +27,13 @@ To get started, check out <http://getbootstrap.com>!
 
 Several quick start options are available:
 
-- [Download the latest release](https://github.com/twbs/bootstrap/archive/v3.3.5.zip).
+- [Download the latest release](https://github.com/twbs/bootstrap/archive/v4.0.0-alpha.2.zip).
 - Clone the repo: `git clone https://github.com/twbs/bootstrap.git`.
 - Install with [Bower](http://bower.io): `bower install bootstrap`.
 - Install with [npm](https://www.npmjs.com): `npm install bootstrap`.
 - Install with [Meteor](https://www.meteor.com): `meteor add twbs:bootstrap`.
 - Install with [Composer](https://getcomposer.org): `composer require twbs/bootstrap`.
+- Install with [NuGet](https://www.nuget.org): CSS: `Install-Package bootstrap -Pre` Sass: `Install-Package bootstrap.sass -Pre` (`-Pre` is only required until Bootstrap v4 has a stable release).
 
 Read the [Getting started page](http://getbootstrap.com/getting-started/) for information on the framework contents, templates and examples, and more.
 
@@ -66,11 +67,9 @@ Bootstrap's documentation, included in this repo in the root directory, is built
 
 ### Running documentation locally
 
-1. If necessary, [install Jekyll](http://jekyllrb.com/docs/installation) (requires v2.5.x).
-  - **Windows users:** Read [this unofficial guide](http://jekyll-windows.juthilo.com/) to get Jekyll up and running without problems.
-2. Install the Ruby-based syntax highlighter, [Rouge](https://github.com/jneen/rouge), with `gem install rouge`.
-3. From the root `/bootstrap` directory, run `jekyll serve` in the command line.
-4. Open <http://localhost:9001> in your browser, and voilà.
+1. Run through the [tooling setup](https://github.com/twbs/bootstrap/blob/v4-dev/docs/getting-started/build-tools.md#tooling-setup) to install Jekyll (the site builder) and other Ruby dependencies with `bundle install`.
+2. From the root `/bootstrap` directory, run `bundle exec jekyll serve` in the command line.
+3. Open <http://localhost:9001> in your browser, and voilà.
 
 Learn more about using Jekyll by reading its [documentation](http://jekyllrb.com/docs/home/).
 
@@ -100,7 +99,7 @@ Get updates on Bootstrap's development and chat with the project maintainers and
 - Read and subscribe to [The Official Bootstrap Blog](http://blog.getbootstrap.com).
 - 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.
-- Implementation help may be found at Stack Overflow (tagged [`twitter-bootstrap-3`](https://stackoverflow.com/questions/tagged/twitter-bootstrap-3)).
+- Implementation help may be found at Stack Overflow (tagged [`bootstrap-4`](https://stackoverflow.com/questions/tagged/bootstrap-4)).
 - Developers should use the keyword `bootstrap` on packages which modify or add to the functionality of Bootstrap when distributing through [npm](https://www.npmjs.com/browse/keyword/bootstrap) or similar delivery mechanisms for maximum discoverability.
 
 
@@ -109,6 +108,7 @@ Get updates on Bootstrap's development and chat with the project maintainers and
 
 For transparency into our release cycle and in striving to maintain backward compatibility, Bootstrap is maintained under [the Semantic Versioning guidelines](http://semver.org/). Sometimes we screw up, but we'll adhere to those rules whenever possible.
 
+See [the Releases section of our GitHub project](https://github.com/twbs/bootstrap/releases) for changelogs for each release version of Bootstrap. Release announcement posts on [the official Bootstrap blog](http://blog.getbootstrap.com) contain summaries of the most noteworthy changes made in each release.
 
 
 ## Creators

File diff suppressed because it is too large
+ 869 - 959
bower_components/bootstrap/dist/css/bootstrap.css


File diff suppressed because it is too large
+ 1 - 1
bower_components/bootstrap/dist/css/bootstrap.css.map


File diff suppressed because it is too large
+ 3 - 3
bower_components/bootstrap/dist/css/bootstrap.min.css


File diff suppressed because it is too large
+ 1 - 1
bower_components/bootstrap/dist/css/bootstrap.min.css.map


File diff suppressed because it is too large
+ 100 - 59
bower_components/bootstrap/dist/js/bootstrap.js


File diff suppressed because it is too large
+ 3 - 3
bower_components/bootstrap/dist/js/bootstrap.min.js


+ 2 - 2
bower_components/bootstrap/dist/js/umd/alert.js

@@ -23,7 +23,7 @@
 
   /**
    * --------------------------------------------------------------------------
-   * Bootstrap (v4.0.0): alert.js
+   * Bootstrap (v4.0.0-alpha.2): alert.js
    * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
    * --------------------------------------------------------------------------
    */
@@ -37,7 +37,7 @@
      */
 
     var NAME = 'alert';
-    var VERSION = '4.0.0';
+    var VERSION = '4.0.0-alpha';
     var DATA_KEY = 'bs.alert';
     var EVENT_KEY = '.' + DATA_KEY;
     var DATA_API_KEY = '.data-api';

+ 2 - 2
bower_components/bootstrap/dist/js/umd/button.js

@@ -13,7 +13,7 @@
 })(this, function (exports, module) {
   /**
    * --------------------------------------------------------------------------
-   * Bootstrap (v4.0.0): button.js
+   * Bootstrap (v4.0.0-alpha.2): button.js
    * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
    * --------------------------------------------------------------------------
    */
@@ -33,7 +33,7 @@
      */
 
     var NAME = 'button';
-    var VERSION = '4.0.0';
+    var VERSION = '4.0.0-alpha';
     var DATA_KEY = 'bs.button';
     var EVENT_KEY = '.' + DATA_KEY;
     var DATA_API_KEY = '.data-api';

+ 15 - 4
bower_components/bootstrap/dist/js/umd/carousel.js

@@ -23,7 +23,7 @@
 
   /**
    * --------------------------------------------------------------------------
-   * Bootstrap (v4.0.0): carousel.js
+   * Bootstrap (v4.0.0-alpha.2): carousel.js
    * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
    * --------------------------------------------------------------------------
    */
@@ -37,7 +37,7 @@
      */
 
     var NAME = 'carousel';
-    var VERSION = '4.0.0';
+    var VERSION = '4.0.0-alpha';
     var DATA_KEY = 'bs.carousel';
     var EVENT_KEY = '.' + DATA_KEY;
     var DATA_API_KEY = '.data-api';
@@ -137,6 +137,14 @@
           }
         }
       }, {
+        key: 'nextWhenVisible',
+        value: function nextWhenVisible() {
+          // Don't call next when the page isn't visible
+          if (!document.hidden) {
+            this.next();
+          }
+        }
+      }, {
         key: 'prev',
         value: function prev() {
           if (!this._isSliding) {
@@ -171,7 +179,7 @@
           }
 
           if (this._config.interval && !this._isPaused) {
-            this._interval = setInterval($.proxy(this.next, this), this._config.interval);
+            this._interval = setInterval($.proxy(document.visibilityState ? this.nextWhenVisible : this.next, this), this._config.interval);
           }
         }
       }, {
@@ -404,7 +412,10 @@
 
             if (typeof config === 'number') {
               data.to(config);
-            } else if (action) {
+            } else if (typeof action === 'string') {
+              if (data[action] === undefined) {
+                throw new Error('No method named "' + action + '"');
+              }
               data[action]();
             } else if (_config.interval) {
               data.pause();

+ 5 - 2
bower_components/bootstrap/dist/js/umd/collapse.js

@@ -23,7 +23,7 @@
 
   /**
    * --------------------------------------------------------------------------
-   * Bootstrap (v4.0.0): collapse.js
+   * Bootstrap (v4.0.0-alpha.2): collapse.js
    * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
    * --------------------------------------------------------------------------
    */
@@ -37,7 +37,7 @@
      */
 
     var NAME = 'collapse';
-    var VERSION = '4.0.0';
+    var VERSION = '4.0.0-alpha';
     var DATA_KEY = 'bs.collapse';
     var EVENT_KEY = '.' + DATA_KEY;
     var DATA_API_KEY = '.data-api';
@@ -331,6 +331,9 @@
             }
 
             if (typeof config === 'string') {
+              if (data[config] === undefined) {
+                throw new Error('No method named "' + config + '"');
+              }
               data[config]();
             }
           });

+ 5 - 2
bower_components/bootstrap/dist/js/umd/dropdown.js

@@ -23,7 +23,7 @@
 
   /**
    * --------------------------------------------------------------------------
-   * Bootstrap (v4.0.0): dropdown.js
+   * Bootstrap (v4.0.0-alpha.2): dropdown.js
    * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
    * --------------------------------------------------------------------------
    */
@@ -37,7 +37,7 @@
      */
 
     var NAME = 'dropdown';
-    var VERSION = '4.0.0';
+    var VERSION = '4.0.0-alpha';
     var DATA_KEY = 'bs.dropdown';
     var EVENT_KEY = '.' + DATA_KEY;
     var DATA_API_KEY = '.data-api';
@@ -166,6 +166,9 @@
             }
 
             if (typeof config === 'string') {
+              if (data[config] === undefined) {
+                throw new Error('No method named "' + config + '"');
+              }
               data[config].call(this);
             }
           });

+ 7 - 4
bower_components/bootstrap/dist/js/umd/modal.js

@@ -23,7 +23,7 @@
 
   /**
    * --------------------------------------------------------------------------
-   * Bootstrap (v4.0.0): modal.js
+   * Bootstrap (v4.0.0-alpha.2): modal.js
    * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
    * --------------------------------------------------------------------------
    */
@@ -37,7 +37,7 @@
      */
 
     var NAME = 'modal';
-    var VERSION = '4.0.0';
+    var VERSION = '4.0.0-alpha';
     var DATA_KEY = 'bs.modal';
     var EVENT_KEY = '.' + DATA_KEY;
     var DATA_API_KEY = '.data-api';
@@ -155,7 +155,7 @@
           $(this._dialog).on(Event.MOUSEDOWN_DISMISS, function () {
             $(_this._element).one(Event.MOUSEUP_DISMISS, function (event) {
               if ($(event.target).is(_this._element)) {
-                that._ignoreBackdropClick = true;
+                _this._ignoreBackdropClick = true;
               }
             });
           });
@@ -444,7 +444,7 @@
           this._originalBodyPadding = document.body.style.paddingRight || '';
 
           if (this._isBodyOverflowing) {
-            document.body.style.paddingRight = bodyPadding + (this._scrollbarWidth + 'px');
+            document.body.style.paddingRight = bodyPadding + this._scrollbarWidth + 'px';
           }
         }
       }, {
@@ -479,6 +479,9 @@
             }
 
             if (typeof config === 'string') {
+              if (data[config] === undefined) {
+                throw new Error('No method named "' + config + '"');
+              }
               data[config](relatedTarget);
             } else if (_config.show) {
               data.show(relatedTarget);

File diff suppressed because it is too large
+ 11 - 14
bower_components/bootstrap/dist/js/umd/popover.js


+ 5 - 2
bower_components/bootstrap/dist/js/umd/scrollspy.js

@@ -23,7 +23,7 @@
 
   /**
    * --------------------------------------------------------------------------
-   * Bootstrap (v4.0.0): scrollspy.js
+   * Bootstrap (v4.0.0-alpha.2): scrollspy.js
    * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
    * --------------------------------------------------------------------------
    */
@@ -37,7 +37,7 @@
      */
 
     var NAME = 'scrollspy';
-    var VERSION = '4.0.0';
+    var VERSION = '4.0.0-alpha';
     var DATA_KEY = 'bs.scrollspy';
     var EVENT_KEY = '.' + DATA_KEY;
     var DATA_API_KEY = '.data-api';
@@ -288,6 +288,9 @@
             }
 
             if (typeof config === 'string') {
+              if (data[config] === undefined) {
+                throw new Error('No method named "' + config + '"');
+              }
               data[config]();
             }
           });

+ 5 - 2
bower_components/bootstrap/dist/js/umd/tab.js

@@ -23,7 +23,7 @@
 
   /**
    * --------------------------------------------------------------------------
-   * Bootstrap (v4.0.0): tab.js
+   * Bootstrap (v4.0.0-alpha.2): tab.js
    * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
    * --------------------------------------------------------------------------
    */
@@ -37,7 +37,7 @@
      */
 
     var NAME = 'tab';
-    var VERSION = '4.0.0';
+    var VERSION = '4.0.0-alpha';
     var DATA_KEY = 'bs.tab';
     var EVENT_KEY = '.' + DATA_KEY;
     var DATA_API_KEY = '.data-api';
@@ -240,6 +240,9 @@
             }
 
             if (typeof config === 'string') {
+              if (data[config] === undefined) {
+                throw new Error('No method named "' + config + '"');
+              }
               data[config]();
             }
           });

File diff suppressed because it is too large
+ 38 - 20
bower_components/bootstrap/dist/js/umd/tooltip.js


+ 2 - 2
bower_components/bootstrap/dist/js/umd/util.js

@@ -13,7 +13,7 @@
 })(this, function (exports, module) {
   /**
    * --------------------------------------------------------------------------
-   * Bootstrap (v4.0.0): util.js
+   * Bootstrap (v4.0.0-alpha.2): util.js
    * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
    * --------------------------------------------------------------------------
    */
@@ -114,7 +114,7 @@
 
       getUID: function getUID(prefix) {
         do {
-          prefix += ~ ~(Math.random() * 1000000);
+          prefix += ~ ~(Math.random() * 1000000); // "~~" acts like a faster Math.floor() here
         } while (document.getElementById(prefix));
         return prefix;
       },

+ 0 - 7
bower_components/bootstrap/grunt/.jshintrc

@@ -1,7 +0,0 @@
-{
-  "extends" : "../js/.jshintrc",
-  "asi"     : false,
-  "browser" : false,
-  "es3"     : false,
-  "node"    : true
-}

+ 1 - 1
bower_components/bootstrap/grunt/bs-commonjs-generator.js

@@ -16,7 +16,7 @@ module.exports = function generateCommonJSModule(grunt, srcFiles, destFilepath)
   var destDir = path.dirname(destFilepath);
 
   function srcPathToDestRequire(srcFilepath) {
-    return 'require(\'' + srcFilepath + '\')';
+    return 'require(\'' + srcFilepath.replace(/\\/g, '/') + '\')';
   }
 
   var moduleOutputJs = COMMONJS_BANNER + srcFiles.map(srcPathToDestRequire).join('\n');

+ 105 - 0
bower_components/bootstrap/grunt/change-version.js

@@ -0,0 +1,105 @@
+#!/usr/bin/env node
+'use strict';
+
+/*!
+ * Script to update version number references in the project.
+ * Copyright 2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+var fs = require('fs');
+var path = require('path');
+var sh = require('shelljs');
+sh.config.fatal = true;
+var sed = sh.sed;
+
+// Blame TC39... https://github.com/benjamingr/RegExp.escape/issues/37
+RegExp.quote = function (string) {
+  return string.replace(/[-\\^$*+?.()|[\]{}]/g, '\\$&');
+};
+RegExp.quoteReplacement = function (string) {
+  return string.replace(/[$]/g, '$$');
+};
+
+var DRY_RUN = false;
+
+function walkAsync(directory, excludedDirectories, fileCallback, errback) {
+  if (excludedDirectories.has(path.parse(directory).base)) {
+    return;
+  }
+  fs.readdir(directory, function (err, names) {
+    if (err) {
+      errback(err);
+      return;
+    }
+    names.forEach(function (name) {
+      var filepath = path.join(directory, name);
+      fs.lstat(filepath, function (err, stats) {
+        if (err) {
+          process.nextTick(errback, err);
+          return;
+        }
+        if (stats.isSymbolicLink()) {
+          return;
+        }
+        else if (stats.isDirectory()) {
+          process.nextTick(walkAsync, filepath, excludedDirectories, fileCallback, errback);
+        }
+        else if (stats.isFile()) {
+          process.nextTick(fileCallback, filepath);
+        }
+      });
+    });
+  });
+}
+
+function replaceRecursively(directory, excludedDirectories, allowedExtensions, original, replacement) {
+  original = new RegExp(RegExp.quote(original), 'g');
+  replacement = RegExp.quoteReplacement(replacement);
+  var updateFile = !DRY_RUN ? (function (filepath) {
+      if (allowedExtensions.has(path.parse(filepath).ext)) {
+        sed('-i', original, replacement, filepath);
+      }
+    }) : (function (filepath) {
+      if (allowedExtensions.has(path.parse(filepath).ext)) {
+        console.log('FILE: ' + filepath);
+      }
+      else {
+        console.log('EXCLUDED:' + filepath);
+      }
+    });
+  walkAsync('.', excludedDirectories, updateFile, function (err) {
+    console.error('ERROR while traversing directory!:')
+    console.error(err);
+    process.exit(1);
+  });
+}
+
+function main(args) {
+  if (args.length !== 2) {
+    console.error('USAGE: change-version old_version new_version');
+    console.error('Got arguments:', args);
+    process.exit(1);
+  }
+  var oldVersion = args[0];
+  var newVersion = args[1];
+  var EXCLUDED_DIRS = new Set([
+    '.git',
+    'node_modules',
+    'vendor'
+  ]);
+  var INCLUDED_EXTENSIONS = new Set([
+    // This extension whitelist is how we avoid modifying binary files
+    '',
+    '.css',
+    '.html',
+    '.js',
+    '.json',
+    '.md',
+    '.scss',
+    '.txt',
+    '.yml'
+  ]);
+  replaceRecursively('.', EXCLUDED_DIRS, INCLUDED_EXTENSIONS, oldVersion, newVersion);
+};
+
+main(process.argv.slice(2));

+ 2 - 30
bower_components/bootstrap/grunt/configBridge.json

@@ -1,38 +1,10 @@
 {
   "paths": {
     "docsJs": [
+      "../assets/js/vendor/anchor.min.js",
+      "../assets/js/vendor/clipboard.min.js",
       "../assets/js/vendor/holder.min.js",
-      "assets/js/vendor/jekyll-search.js",
-      "../assets/js/vendor/ZeroClipboard.min.js",
-      "../assets/js/vendor/anchor.js",
-      "../assets/js/vendor/tether.min.js",
       "../assets/js/src/application.js"
     ]
-  },
-  "config": {
-    "autoprefixerBrowsers": [
-      "Android 2.3",
-      "Android >= 4",
-      "Chrome >= 20",
-      "Firefox >= 24",
-      "Explorer >= 8",
-      "iOS >= 6",
-      "Opera >= 12",
-      "Safari >= 6"
-    ],
-    "jqueryCheck": [
-      "if (typeof jQuery === 'undefined') {",
-      "  throw new Error('Bootstrap\\'s JavaScript requires jQuery')",
-      "}\n"
-    ],
-    "jqueryVersionCheck": [
-      "+function ($) {",
-      "  'use strict';",
-      "  var version = $.fn.jquery.split(' ')[0].split('.')",
-      "  if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 2)) {",
-      "    throw new Error('Bootstrap\\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3')",
-      "  }",
-      "}(jQuery);\n\n"
-    ]
   }
 }

File diff suppressed because it is too large
+ 4168 - 0
bower_components/bootstrap/grunt/npm-shrinkwrap.json


+ 5 - 1
bower_components/bootstrap/grunt/sauce_browsers.yml

@@ -17,6 +17,10 @@
   # Mac Opera not currently supported by Sauce Labs
 
   {
+    browserName: "MicrosoftEdge",
+    platform: "Windows 10"
+  },
+  {
     browserName: "internet explorer",
     version: "11",
     platform: "Windows 8.1"
@@ -46,7 +50,7 @@
   {
     browserName: "iphone",
     platform: "OS X 10.10",
-    version: "8.2"
+    version: "9.1"
   },
 
   # iOS Chrome not currently supported by Sauce Labs

+ 25 - 21
bower_components/bootstrap/js/.eslintrc

@@ -1,12 +1,16 @@
 {
+    "root": true,
     "parser": "babel-eslint",
     "env": {
-        "browser": true
+        "browser": true,
+        "jquery": true
     },
     "rules": {
 
         // Possible Errors
         "comma-dangle": [2, "never"],
+        "handle-callback-err": 2,
+        "no-bitwise": 0,
         "no-cond-assign": 2,
         "no-console": 2,
         "no-constant-condition": 2,
@@ -15,8 +19,8 @@
         "no-dupe-args": 2,
         "no-dupe-keys": 2,
         "no-duplicate-case": 2,
-        "no-empty-character-class": 2,
         "no-empty": 2,
+        "no-empty-character-class": 2,
         "no-ex-assign": 2,
         "no-extra-boolean-cast": 2,
         "no-extra-parens": 0,
@@ -24,16 +28,16 @@
         "no-func-assign": 2,
         "no-inner-declarations": 2,
         "no-invalid-regexp": 2,
-        "no-irregular-whitespace": 0,
+        "no-irregular-whitespace": 2,
         "no-negated-in-lhs": 2,
         "no-obj-calls": 2,
         "no-regex-spaces": 2,
         "no-sparse-arrays": 2,
+        "no-unexpected-multiline": 2,
         "no-unreachable": 2,
         "use-isnan": 2,
         "valid-jsdoc": 0,
         "valid-typeof": 2,
-        "no-unexpected-multiline": 2,
 
         //Best Practices
         "accessor-pairs": 2,
@@ -41,8 +45,8 @@
         "consistent-return": 2,
         "curly": 2,
         "default-case": 2,
-        "dot-notation": 0,
         "dot-location": 0,
+        "dot-notation": 0,
         "eqeqeq": 2,
         "guard-for-in": 2,
         "no-alert": 2,
@@ -64,13 +68,13 @@
         "no-lone-blocks": 2,
         "no-loop-func": 2,
         "no-multi-spaces": 0,
-        "no-multi-str": 0,
+        "no-multi-str": 2,
         "no-native-reassign": 2,
+        "no-new": 2,
         "no-new-func": 0,
         "no-new-wrappers": 2,
-        "no-new": 2,
-        "no-octal-escape": 2,
         "no-octal": 2,
+        "no-octal-escape": 2,
         "no-param-reassign": 0,
         "no-process-env": 2,
         "no-proto": 2,
@@ -82,6 +86,7 @@
         "no-throw-literal": 2,
         "no-unused-expressions": 2,
         "no-useless-call": 2,
+        "no-useless-concat": 2,
         "no-void": 2,
         "no-warning-comments": 0,
         "no-with": 2,
@@ -95,11 +100,11 @@
         "no-catch-shadow": 2,
         "no-delete-var": 2,
         "no-label-var": 2,
-        "no-shadow-restricted-names": 2,
         "no-shadow": 0,
-        "no-undef-init": 2,
-        "no-undef": 0,
+        "no-shadow-restricted-names": 2,
+        "no-undef": 2,
         "no-undefined": 0,
+        "no-undef-init": 2,
         "no-unused-vars": 2,
         "no-use-before-define": 0,
 
@@ -115,13 +120,13 @@
         "eol-last": 2,
         "func-names": 0,
         "func-style": 0,
-        "indent": 0,
+        "indent": [2, 2, {"SwitchCase": 1}],
         "key-spacing": 0,
-        "lines-around-comment": 0,
         "linebreak-style": 2,
+        "lines-around-comment": 0,
         "new-cap": 0,
-        "new-parens": 2,
         "newline-after-var": 0,
+        "new-parens": 2,
         "no-array-constructor": 2,
         "no-continue": 0,
         "no-inline-comments": 0,
@@ -140,20 +145,19 @@
         "operator-assignment": 2,
         "operator-linebreak": 0,
         "padded-blocks": 0,
-        "quote-props": 0,
-        "quotes": 0,
-        "semi-spacing": 0,
+        "quote-props": [2, "as-needed"],
+        "quotes": [2, "single"],
         "semi": [2, "never"],
+        "semi-spacing": 2,
         "sort-vars": 2,
         "space-after-keywords": 2,
         "space-before-blocks": 2,
         "space-before-function-paren": 0,
-        "space-in-parens": 2,
+        "spaced-comment": 2,
         "space-infix-ops": 2,
+        "space-in-parens": 2,
         "space-return-throw-case": 2,
         "space-unary-ops": 2,
-        "spaced-comment": 2,
-        "spaced-comment": 2,
 
         // es6
         "arrow-parens": 2,
@@ -168,8 +172,8 @@
         "object-shorthand": 2,
         "prefer-arrow-callback": 2,
         "prefer-const": 0,
-        "prefer-spread": 2,
         "prefer-reflect": 0,
+        "prefer-spread": 2,
         "prefer-template": 2,
         "require-yield": 2
 

+ 2 - 1
bower_components/bootstrap/js/.jscsrc

@@ -1,5 +1,6 @@
 {
   "esnext": true,
+  "verbose": true,
   "disallowEmptyBlocks": true,
   "disallowKeywords": ["with"],
   "disallowMixedSpacesAndTabs": true,
@@ -28,7 +29,7 @@
   "requireSpaceAfterLineComment": true,
   "requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!==", ">", "<", ">=", "<="],
   "requireSpaceBetweenArguments": true,
-  "requireSpacesInAnonymousFunctionExpression": { "beforeOpeningCurlyBrace": true, "beforeOpeningRoundBrace": true },
+  "requireSpacesInAnonymousFunctionExpression": { "beforeOpeningCurlyBrace": true, "beforeOpeningRoundBrace": true, "allExcept": ["shorthand"] },
   "requireSpacesInConditionalExpression": true,
   "requireSpacesInForStatement": true,
   "requireSpacesInFunctionDeclaration": { "beforeOpeningCurlyBrace": true },

+ 2 - 2
bower_components/bootstrap/js/dist/alert.js

@@ -6,7 +6,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons
 
 /**
  * --------------------------------------------------------------------------
- * Bootstrap (v4.0.0): alert.js
+ * Bootstrap (v4.0.0-alpha.2): alert.js
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
  * --------------------------------------------------------------------------
  */
@@ -20,7 +20,7 @@ var Alert = (function ($) {
    */
 
   var NAME = 'alert';
-  var VERSION = '4.0.0';
+  var VERSION = '4.0.0-alpha';
   var DATA_KEY = 'bs.alert';
   var EVENT_KEY = '.' + DATA_KEY;
   var DATA_API_KEY = '.data-api';

File diff suppressed because it is too large
+ 1 - 1
bower_components/bootstrap/js/dist/alert.js.map


+ 2 - 2
bower_components/bootstrap/js/dist/button.js

@@ -1,6 +1,6 @@
 /**
  * --------------------------------------------------------------------------
- * Bootstrap (v4.0.0): button.js
+ * Bootstrap (v4.0.0-alpha.2): button.js
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
  * --------------------------------------------------------------------------
  */
@@ -20,7 +20,7 @@ var Button = (function ($) {
    */
 
   var NAME = 'button';
-  var VERSION = '4.0.0';
+  var VERSION = '4.0.0-alpha';
   var DATA_KEY = 'bs.button';
   var EVENT_KEY = '.' + DATA_KEY;
   var DATA_API_KEY = '.data-api';

File diff suppressed because it is too large
+ 1 - 1
bower_components/bootstrap/js/dist/button.js.map


+ 15 - 4
bower_components/bootstrap/js/dist/carousel.js

@@ -6,7 +6,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons
 
 /**
  * --------------------------------------------------------------------------
- * Bootstrap (v4.0.0): carousel.js
+ * Bootstrap (v4.0.0-alpha.2): carousel.js
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
  * --------------------------------------------------------------------------
  */
@@ -20,7 +20,7 @@ var Carousel = (function ($) {
    */
 
   var NAME = 'carousel';
-  var VERSION = '4.0.0';
+  var VERSION = '4.0.0-alpha';
   var DATA_KEY = 'bs.carousel';
   var EVENT_KEY = '.' + DATA_KEY;
   var DATA_API_KEY = '.data-api';
@@ -120,6 +120,14 @@ var Carousel = (function ($) {
         }
       }
     }, {
+      key: 'nextWhenVisible',
+      value: function nextWhenVisible() {
+        // Don't call next when the page isn't visible
+        if (!document.hidden) {
+          this.next();
+        }
+      }
+    }, {
       key: 'prev',
       value: function prev() {
         if (!this._isSliding) {
@@ -154,7 +162,7 @@ var Carousel = (function ($) {
         }
 
         if (this._config.interval && !this._isPaused) {
-          this._interval = setInterval($.proxy(this.next, this), this._config.interval);
+          this._interval = setInterval($.proxy(document.visibilityState ? this.nextWhenVisible : this.next, this), this._config.interval);
         }
       }
     }, {
@@ -387,7 +395,10 @@ var Carousel = (function ($) {
 
           if (typeof config === 'number') {
             data.to(config);
-          } else if (action) {
+          } else if (typeof action === 'string') {
+            if (data[action] === undefined) {
+              throw new Error('No method named "' + action + '"');
+            }
             data[action]();
           } else if (_config.interval) {
             data.pause();

File diff suppressed because it is too large
+ 1 - 1
bower_components/bootstrap/js/dist/carousel.js.map


+ 5 - 2
bower_components/bootstrap/js/dist/collapse.js

@@ -6,7 +6,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons
 
 /**
  * --------------------------------------------------------------------------
- * Bootstrap (v4.0.0): collapse.js
+ * Bootstrap (v4.0.0-alpha.2): collapse.js
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
  * --------------------------------------------------------------------------
  */
@@ -20,7 +20,7 @@ var Collapse = (function ($) {
    */
 
   var NAME = 'collapse';
-  var VERSION = '4.0.0';
+  var VERSION = '4.0.0-alpha';
   var DATA_KEY = 'bs.collapse';
   var EVENT_KEY = '.' + DATA_KEY;
   var DATA_API_KEY = '.data-api';
@@ -314,6 +314,9 @@ var Collapse = (function ($) {
           }
 
           if (typeof config === 'string') {
+            if (data[config] === undefined) {
+              throw new Error('No method named "' + config + '"');
+            }
             data[config]();
           }
         });

File diff suppressed because it is too large
+ 1 - 1
bower_components/bootstrap/js/dist/collapse.js.map


+ 5 - 2
bower_components/bootstrap/js/dist/dropdown.js

@@ -6,7 +6,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons
 
 /**
  * --------------------------------------------------------------------------
- * Bootstrap (v4.0.0): dropdown.js
+ * Bootstrap (v4.0.0-alpha.2): dropdown.js
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
  * --------------------------------------------------------------------------
  */
@@ -20,7 +20,7 @@ var Dropdown = (function ($) {
    */
 
   var NAME = 'dropdown';
-  var VERSION = '4.0.0';
+  var VERSION = '4.0.0-alpha';
   var DATA_KEY = 'bs.dropdown';
   var EVENT_KEY = '.' + DATA_KEY;
   var DATA_API_KEY = '.data-api';
@@ -149,6 +149,9 @@ var Dropdown = (function ($) {
           }
 
           if (typeof config === 'string') {
+            if (data[config] === undefined) {
+              throw new Error('No method named "' + config + '"');
+            }
             data[config].call(this);
           }
         });

File diff suppressed because it is too large
+ 1 - 1
bower_components/bootstrap/js/dist/dropdown.js.map


+ 7 - 4
bower_components/bootstrap/js/dist/modal.js

@@ -6,7 +6,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons
 
 /**
  * --------------------------------------------------------------------------
- * Bootstrap (v4.0.0): modal.js
+ * Bootstrap (v4.0.0-alpha.2): modal.js
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
  * --------------------------------------------------------------------------
  */
@@ -20,7 +20,7 @@ var Modal = (function ($) {
    */
 
   var NAME = 'modal';
-  var VERSION = '4.0.0';
+  var VERSION = '4.0.0-alpha';
   var DATA_KEY = 'bs.modal';
   var EVENT_KEY = '.' + DATA_KEY;
   var DATA_API_KEY = '.data-api';
@@ -138,7 +138,7 @@ var Modal = (function ($) {
         $(this._dialog).on(Event.MOUSEDOWN_DISMISS, function () {
           $(_this._element).one(Event.MOUSEUP_DISMISS, function (event) {
             if ($(event.target).is(_this._element)) {
-              that._ignoreBackdropClick = true;
+              _this._ignoreBackdropClick = true;
             }
           });
         });
@@ -427,7 +427,7 @@ var Modal = (function ($) {
         this._originalBodyPadding = document.body.style.paddingRight || '';
 
         if (this._isBodyOverflowing) {
-          document.body.style.paddingRight = bodyPadding + (this._scrollbarWidth + 'px');
+          document.body.style.paddingRight = bodyPadding + this._scrollbarWidth + 'px';
         }
       }
     }, {
@@ -462,6 +462,9 @@ var Modal = (function ($) {
           }
 
           if (typeof config === 'string') {
+            if (data[config] === undefined) {
+              throw new Error('No method named "' + config + '"');
+            }
             data[config](relatedTarget);
           } else if (_config.show) {
             data.show(relatedTarget);

File diff suppressed because it is too large
+ 1 - 1
bower_components/bootstrap/js/dist/modal.js.map


File diff suppressed because it is too large
+ 11 - 14
bower_components/bootstrap/js/dist/popover.js


File diff suppressed because it is too large
+ 1 - 1
bower_components/bootstrap/js/dist/popover.js.map


+ 5 - 2
bower_components/bootstrap/js/dist/scrollspy.js

@@ -6,7 +6,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons
 
 /**
  * --------------------------------------------------------------------------
- * Bootstrap (v4.0.0): scrollspy.js
+ * Bootstrap (v4.0.0-alpha.2): scrollspy.js
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
  * --------------------------------------------------------------------------
  */
@@ -20,7 +20,7 @@ var ScrollSpy = (function ($) {
    */
 
   var NAME = 'scrollspy';
-  var VERSION = '4.0.0';
+  var VERSION = '4.0.0-alpha';
   var DATA_KEY = 'bs.scrollspy';
   var EVENT_KEY = '.' + DATA_KEY;
   var DATA_API_KEY = '.data-api';
@@ -271,6 +271,9 @@ var ScrollSpy = (function ($) {
           }
 
           if (typeof config === 'string') {
+            if (data[config] === undefined) {
+              throw new Error('No method named "' + config + '"');
+            }
             data[config]();
           }
         });

File diff suppressed because it is too large
+ 1 - 1
bower_components/bootstrap/js/dist/scrollspy.js.map


+ 5 - 2
bower_components/bootstrap/js/dist/tab.js

@@ -6,7 +6,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons
 
 /**
  * --------------------------------------------------------------------------
- * Bootstrap (v4.0.0): tab.js
+ * Bootstrap (v4.0.0-alpha.2): tab.js
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
  * --------------------------------------------------------------------------
  */
@@ -20,7 +20,7 @@ var Tab = (function ($) {
    */
 
   var NAME = 'tab';
-  var VERSION = '4.0.0';
+  var VERSION = '4.0.0-alpha';
   var DATA_KEY = 'bs.tab';
   var EVENT_KEY = '.' + DATA_KEY;
   var DATA_API_KEY = '.data-api';
@@ -223,6 +223,9 @@ var Tab = (function ($) {
           }
 
           if (typeof config === 'string') {
+            if (data[config] === undefined) {
+              throw new Error('No method named "' + config + '"');
+            }
             data[config]();
           }
         });

File diff suppressed because it is too large
+ 1 - 1
bower_components/bootstrap/js/dist/tab.js.map


File diff suppressed because it is too large
+ 38 - 20
bower_components/bootstrap/js/dist/tooltip.js


File diff suppressed because it is too large
+ 1 - 1
bower_components/bootstrap/js/dist/tooltip.js.map


+ 2 - 2
bower_components/bootstrap/js/dist/util.js

@@ -1,6 +1,6 @@
 /**
  * --------------------------------------------------------------------------
- * Bootstrap (v4.0.0): util.js
+ * Bootstrap (v4.0.0-alpha.2): util.js
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
  * --------------------------------------------------------------------------
  */
@@ -101,7 +101,7 @@ var Util = (function ($) {
 
     getUID: function getUID(prefix) {
       do {
-        prefix += ~ ~(Math.random() * 1000000);
+        prefix += ~ ~(Math.random() * 1000000); // "~~" acts like a faster Math.floor() here
       } while (document.getElementById(prefix));
       return prefix;
     },

File diff suppressed because it is too large
+ 1 - 1
bower_components/bootstrap/js/dist/util.js.map


+ 2 - 2
bower_components/bootstrap/js/src/alert.js

@@ -3,7 +3,7 @@ import Util from './util'
 
 /**
  * --------------------------------------------------------------------------
- * Bootstrap (v4.0.0): alert.js
+ * Bootstrap (v4.0.0-alpha.2): alert.js
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
  * --------------------------------------------------------------------------
  */
@@ -18,7 +18,7 @@ const Alert = (($) => {
    */
 
   const NAME                = 'alert'
-  const VERSION             = '4.0.0'
+  const VERSION             = '4.0.0-alpha'
   const DATA_KEY            = 'bs.alert'
   const EVENT_KEY           = `.${DATA_KEY}`
   const DATA_API_KEY        = '.data-api'

+ 2 - 2
bower_components/bootstrap/js/src/button.js

@@ -1,6 +1,6 @@
 /**
  * --------------------------------------------------------------------------
- * Bootstrap (v4.0.0): button.js
+ * Bootstrap (v4.0.0-alpha.2): button.js
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
  * --------------------------------------------------------------------------
  */
@@ -15,7 +15,7 @@ const Button = (($) => {
    */
 
   const NAME                = 'button'
-  const VERSION             = '4.0.0'
+  const VERSION             = '4.0.0-alpha'
   const DATA_KEY            = 'bs.button'
   const EVENT_KEY           = `.${DATA_KEY}`
   const DATA_API_KEY        = '.data-api'

+ 14 - 6
bower_components/bootstrap/js/src/carousel.js

@@ -3,7 +3,7 @@ import Util from './util'
 
 /**
  * --------------------------------------------------------------------------
- * Bootstrap (v4.0.0): carousel.js
+ * Bootstrap (v4.0.0-alpha.2): carousel.js
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
  * --------------------------------------------------------------------------
  */
@@ -18,7 +18,7 @@ const Carousel = (($) => {
    */
 
   const NAME                = 'carousel'
-  const VERSION             = '4.0.0'
+  const VERSION             = '4.0.0-alpha'
   const DATA_KEY            = 'bs.carousel'
   const EVENT_KEY           = `.${DATA_KEY}`
   const DATA_API_KEY        = '.data-api'
@@ -119,6 +119,13 @@ const Carousel = (($) => {
       }
     }
 
+    nextWhenVisible() {
+      // Don't call next when the page isn't visible
+      if (!document.hidden) {
+        this.next()
+      }
+    }
+
     prev() {
       if (!this._isSliding) {
         this._slide(Direction.PREVIOUS)
@@ -152,7 +159,7 @@ const Carousel = (($) => {
 
       if (this._config.interval && !this._isPaused) {
         this._interval = setInterval(
-          $.proxy(this.next, this), this._config.interval
+          $.proxy(document.visibilityState ? this.nextWhenVisible : this.next, this), this._config.interval
         )
       }
     }
@@ -390,10 +397,11 @@ const Carousel = (($) => {
 
         if (typeof config === 'number') {
           data.to(config)
-
-        } else if (action) {
+        } else if (typeof action === 'string') {
+          if (data[action] === undefined) {
+            throw new Error(`No method named "${action}"`)
+          }
           data[action]()
-
         } else if (_config.interval) {
           data.pause()
           data.cycle()

+ 5 - 2
bower_components/bootstrap/js/src/collapse.js

@@ -3,7 +3,7 @@ import Util from './util'
 
 /**
  * --------------------------------------------------------------------------
- * Bootstrap (v4.0.0): collapse.js
+ * Bootstrap (v4.0.0-alpha.2): collapse.js
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
  * --------------------------------------------------------------------------
  */
@@ -18,7 +18,7 @@ const Collapse = (($) => {
    */
 
   const NAME                = 'collapse'
-  const VERSION             = '4.0.0'
+  const VERSION             = '4.0.0-alpha'
   const DATA_KEY            = 'bs.collapse'
   const EVENT_KEY           = `.${DATA_KEY}`
   const DATA_API_KEY        = '.data-api'
@@ -333,6 +333,9 @@ const Collapse = (($) => {
         }
 
         if (typeof config === 'string') {
+          if (data[config] === undefined) {
+            throw new Error(`No method named "${config}"`)
+          }
           data[config]()
         }
       })

+ 10 - 7
bower_components/bootstrap/js/src/dropdown.js

@@ -3,7 +3,7 @@ import Util from './util'
 
 /**
  * --------------------------------------------------------------------------
- * Bootstrap (v4.0.0): dropdown.js
+ * Bootstrap (v4.0.0-alpha.2): dropdown.js
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
  * --------------------------------------------------------------------------
  */
@@ -18,18 +18,18 @@ const Dropdown = (($) => {
    */
 
   const NAME                = 'dropdown'
-  const VERSION             = '4.0.0'
+  const VERSION             = '4.0.0-alpha'
   const DATA_KEY            = 'bs.dropdown'
   const EVENT_KEY           = `.${DATA_KEY}`
   const DATA_API_KEY        = '.data-api'
   const JQUERY_NO_CONFLICT  = $.fn[NAME]
 
   const Event = {
-    HIDE             : `hide${EVENT_KEY}`,
-    HIDDEN           : `hidden${EVENT_KEY}`,
-    SHOW             : `show${EVENT_KEY}`,
-    SHOWN            : `shown${EVENT_KEY}`,
-    CLICK            : `click${EVENT_KEY}`,
+    HIDE             : `hide${EVENT_KEY}`,
+    HIDDEN           : `hidden${EVENT_KEY}`,
+    SHOW             : `show${EVENT_KEY}`,
+    SHOWN            : `shown${EVENT_KEY}`,
+    CLICK            : `click${EVENT_KEY}`,
     CLICK_DATA_API   : `click${EVENT_KEY}${DATA_API_KEY}`,
     KEYDOWN_DATA_API : `keydown${EVENT_KEY}${DATA_API_KEY}`
   }
@@ -143,6 +143,9 @@ const Dropdown = (($) => {
         }
 
         if (typeof config === 'string') {
+          if (data[config] === undefined) {
+            throw new Error(`No method named "${config}"`)
+          }
           data[config].call(this)
         }
       })

+ 11 - 9
bower_components/bootstrap/js/src/modal.js

@@ -3,7 +3,7 @@ import Util from './util'
 
 /**
  * --------------------------------------------------------------------------
- * Bootstrap (v4.0.0): modal.js
+ * Bootstrap (v4.0.0-alpha.2): modal.js
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
  * --------------------------------------------------------------------------
  */
@@ -18,7 +18,7 @@ const Modal = (($) => {
    */
 
   const NAME                         = 'modal'
-  const VERSION                      = '4.0.0'
+  const VERSION                      = '4.0.0-alpha'
   const DATA_KEY                     = 'bs.modal'
   const EVENT_KEY                    = `.${DATA_KEY}`
   const DATA_API_KEY                 = '.data-api'
@@ -41,10 +41,10 @@ const Modal = (($) => {
   }
 
   const Event = {
-    HIDE              : `hide${EVENT_KEY}`,
-    HIDDEN            : `hidden${EVENT_KEY}`,
-    SHOW              : `show${EVENT_KEY}`,
-    SHOWN             : `shown${EVENT_KEY}`,
+    HIDE              : `hide${EVENT_KEY}`,
+    HIDDEN            : `hidden${EVENT_KEY}`,
+    SHOW              : `show${EVENT_KEY}`,
+    SHOWN             : `shown${EVENT_KEY}`,
     FOCUSIN           : `focusin${EVENT_KEY}`,
     RESIZE            : `resize${EVENT_KEY}`,
     CLICK_DISMISS     : `click.dismiss${EVENT_KEY}`,
@@ -138,7 +138,7 @@ const Modal = (($) => {
       $(this._dialog).on(Event.MOUSEDOWN_DISMISS, () => {
         $(this._element).one(Event.MOUSEUP_DISMISS, (event) => {
           if ($(event.target).is(this._element)) {
-            that._ignoreBackdropClick = true
+            this._ignoreBackdropClick = true
           }
         })
       })
@@ -427,7 +427,7 @@ const Modal = (($) => {
 
       if (this._isBodyOverflowing) {
         document.body.style.paddingRight =
-          bodyPadding + `${this._scrollbarWidth}px`
+          `${bodyPadding + this._scrollbarWidth}px`
       }
     }
 
@@ -463,8 +463,10 @@ const Modal = (($) => {
         }
 
         if (typeof config === 'string') {
+          if (data[config] === undefined) {
+            throw new Error(`No method named "${config}"`)
+          }
           data[config](relatedTarget)
-
         } else if (_config.show) {
           data.show(relatedTarget)
         }

+ 10 - 18
bower_components/bootstrap/js/src/popover.js

@@ -3,7 +3,7 @@ import Tooltip from './tooltip'
 
 /**
  * --------------------------------------------------------------------------
- * Bootstrap (v4.0.0): popover.js
+ * Bootstrap (v4.0.0-alpha.2): popover.js
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
  * --------------------------------------------------------------------------
  */
@@ -18,7 +18,7 @@ const Popover = (($) => {
    */
 
   const NAME                = 'popover'
-  const VERSION             = '4.0.0'
+  const VERSION             = '4.0.0-alpha'
   const DATA_KEY            = 'bs.popover'
   const EVENT_KEY           = `.${DATA_KEY}`
   const JQUERY_NO_CONFLICT  = $.fn[NAME]
@@ -34,7 +34,7 @@ const Popover = (($) => {
   })
 
   const DefaultType = $.extend({}, Tooltip.DefaultType, {
-    content : '(string|function)'
+    content : '(string|element|function)'
   })
 
   const ClassName = {
@@ -113,24 +113,13 @@ const Popover = (($) => {
     }
 
     setContent() {
-      let tip          = this.getTipElement()
-      let title        = this.getTitle()
-      let content      = this._getContent()
-      let titleElement = $(tip).find(Selector.TITLE)[0]
-
-      if (titleElement) {
-        titleElement[
-          this.config.html ? 'innerHTML' : 'innerText'
-        ] = title
-      }
+      let $tip = $(this.getTipElement())
 
       // we use append for html objects to maintain js events
-      $(tip).find(Selector.CONTENT).children().detach().end()[
-        this.config.html ?
-          (typeof content === 'string' ? 'html' : 'append') : 'text'
-      ](content)
+      this.setElementContent($tip.find(Selector.TITLE), this.getTitle())
+      this.setElementContent($tip.find(Selector.CONTENT), this._getContent())
 
-      $(tip)
+      $tip
         .removeClass(ClassName.FADE)
         .removeClass(ClassName.IN)
 
@@ -164,6 +153,9 @@ const Popover = (($) => {
         }
 
         if (typeof config === 'string') {
+          if (data[config] === undefined) {
+            throw new Error(`No method named "${config}"`)
+          }
           data[config]()
         }
       })

+ 5 - 2
bower_components/bootstrap/js/src/scrollspy.js

@@ -3,7 +3,7 @@ import Util from './util'
 
 /**
  * --------------------------------------------------------------------------
- * Bootstrap (v4.0.0): scrollspy.js
+ * Bootstrap (v4.0.0-alpha.2): scrollspy.js
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
  * --------------------------------------------------------------------------
  */
@@ -18,7 +18,7 @@ const ScrollSpy = (($) => {
    */
 
   const NAME               = 'scrollspy'
-  const VERSION            = '4.0.0'
+  const VERSION            = '4.0.0-alpha'
   const DATA_KEY           = 'bs.scrollspy'
   const EVENT_KEY          = `.${DATA_KEY}`
   const DATA_API_KEY       = '.data-api'
@@ -277,6 +277,9 @@ const ScrollSpy = (($) => {
         }
 
         if (typeof config === 'string') {
+          if (data[config] === undefined) {
+            throw new Error(`No method named "${config}"`)
+          }
           data[config]()
         }
       })

+ 8 - 5
bower_components/bootstrap/js/src/tab.js

@@ -3,7 +3,7 @@ import Util from './util'
 
 /**
  * --------------------------------------------------------------------------
- * Bootstrap (v4.0.0): tab.js
+ * Bootstrap (v4.0.0-alpha.2): tab.js
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
  * --------------------------------------------------------------------------
  */
@@ -18,7 +18,7 @@ const Tab = (($) => {
    */
 
   const NAME                = 'tab'
-  const VERSION             = '4.0.0'
+  const VERSION             = '4.0.0-alpha'
   const DATA_KEY            = 'bs.tab'
   const EVENT_KEY           = `.${DATA_KEY}`
   const DATA_API_KEY        = '.data-api'
@@ -234,6 +234,9 @@ const Tab = (($) => {
         }
 
         if (typeof config === 'string') {
+          if (data[config] === undefined) {
+            throw new Error(`No method named "${config}"`)
+          }
           data[config]()
         }
       })
@@ -250,9 +253,9 @@ const Tab = (($) => {
 
   $(document)
     .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
-    event.preventDefault()
-    Tab._jQueryInterface.call($(this), 'show')
-  })
+      event.preventDefault()
+      Tab._jQueryInterface.call($(this), 'show')
+    })
 
 
   /**

+ 42 - 26
bower_components/bootstrap/js/src/tooltip.js

@@ -1,15 +1,25 @@
+/* global Tether */
+
 import Util from './util'
 
 
 /**
  * --------------------------------------------------------------------------
- * Bootstrap (v4.0.0): tooltip.js
+ * Bootstrap (v4.0.0-alpha.2): tooltip.js
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
  * --------------------------------------------------------------------------
  */
 
 const Tooltip = (($) => {
 
+  /**
+   * Check for Tether dependency
+   * Tether - http://github.hubspot.com/tether/
+   */
+  if (window.Tether === undefined) {
+    throw new Error('Bootstrap tooltips require Tether (http://github.hubspot.com/tether/)')
+  }
+
 
   /**
    * ------------------------------------------------------------------------
@@ -18,7 +28,7 @@ const Tooltip = (($) => {
    */
 
   const NAME                = 'tooltip'
-  const VERSION             = '4.0.0'
+  const VERSION             = '4.0.0-alpha'
   const DATA_KEY            = 'bs.tooltip'
   const EVENT_KEY           = `.${DATA_KEY}`
   const JQUERY_NO_CONFLICT  = $.fn[NAME]
@@ -43,7 +53,7 @@ const Tooltip = (($) => {
   const DefaultType = {
     animation   : 'boolean',
     template    : 'string',
-    title       : '(string|function)',
+    title       : '(string|element|function)',
     trigger     : 'string',
     delay       : '(number|object)',
     html        : 'boolean',
@@ -270,12 +280,13 @@ const Tooltip = (($) => {
 
         this._tether = new Tether({
           attachment,
-          element     : tip,
-          target      : this.element,
-          classes     : TetherClass,
-          classPrefix : CLASS_PREFIX,
-          offset      : this.config.offset,
-          constraints : this.config.constraints
+          element         : tip,
+          target          : this.element,
+          classes         : TetherClass,
+          classPrefix     : CLASS_PREFIX,
+          offset          : this.config.offset,
+          constraints     : this.config.constraints,
+          addTargetClasses: false
         })
 
         Util.reflow(tip)
@@ -356,19 +367,33 @@ const Tooltip = (($) => {
     }
 
     setContent() {
-      let tip    = this.getTipElement()
-      let title  = this.getTitle()
-      let method = this.config.html ? 'innerHTML' : 'innerText'
+      let $tip = $(this.getTipElement())
 
-      $(tip).find(Selector.TOOLTIP_INNER)[0][method] = title
+      this.setElementContent($tip.find(Selector.TOOLTIP_INNER), this.getTitle())
 
-      $(tip)
+      $tip
         .removeClass(ClassName.FADE)
         .removeClass(ClassName.IN)
 
       this.cleanupTether()
     }
 
+    setElementContent($element, content) {
+      let html = this.config.html
+      if (typeof content === 'object' && (content.nodeType || content.jquery)) {
+        // content is a DOM node or a jQuery
+        if (html) {
+          if (!$(content).parent().is($element)) {
+            $element.empty().append(content)
+          }
+        } else {
+          $element.text($(content).text())
+        }
+      } else {
+        $element[html ? 'html' : 'text'](content)
+      }
+    }
+
     getTitle() {
       let title = this.element.getAttribute('data-original-title')
 
@@ -384,12 +409,6 @@ const Tooltip = (($) => {
     cleanupTether() {
       if (this._tether) {
         this._tether.destroy()
-
-        // clean up after tether's junk classes
-        // remove after they fix issue
-        // (https://github.com/HubSpot/tether/issues/36)
-        $(this.element).removeClass(this._removeTetherClasses)
-        $(this.tip).removeClass(this._removeTetherClasses)
       }
     }
 
@@ -443,12 +462,6 @@ const Tooltip = (($) => {
       }
     }
 
-    _removeTetherClasses(i, css) {
-      return ((css.baseVal || css).match(
-        new RegExp(`(^|\\s)${CLASS_PREFIX}-\\S+`, 'g')) || []
-      ).join(' ')
-    }
-
     _fixTitle() {
       let titleType = typeof this.element.getAttribute('data-original-title')
       if (this.element.getAttribute('title') ||
@@ -608,6 +621,9 @@ const Tooltip = (($) => {
         }
 
         if (typeof config === 'string') {
+          if (data[config] === undefined) {
+            throw new Error(`No method named "${config}"`)
+          }
           data[config]()
         }
       })

+ 2 - 2
bower_components/bootstrap/js/src/util.js

@@ -1,6 +1,6 @@
 /**
  * --------------------------------------------------------------------------
- * Bootstrap (v4.0.0): util.js
+ * Bootstrap (v4.0.0-alpha.2): util.js
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
  * --------------------------------------------------------------------------
  */
@@ -99,7 +99,7 @@ const Util = (($) => {
 
     getUID(prefix) {
       do {
-        prefix += ~~(Math.random() * 1000000)
+        prefix += ~~(Math.random() * 1000000) // "~~" acts like a faster Math.floor() here
       } while (document.getElementById(prefix))
       return prefix
     },

+ 8 - 0
bower_components/bootstrap/nuget/MyGet.ps1

@@ -0,0 +1,8 @@
+$nuget = $env:NuGet
+
+#parse the version number out of package.json
+$bsversion = ((Get-Content $env:SourcesPath\package.json) -join "`n" | ConvertFrom-Json).version
+
+#create packages
+& $nuget pack "nuget\bootstrap.nuspec" -Verbosity detailed -NonInteractive -NoPackageAnalysis -BasePath $env:SourcesPath -Version $bsversion
+& $nuget pack "nuget\bootstrap.less.nuspec" -Verbosity detailed -NonInteractive -NoPackageAnalysis -BasePath $env:SourcesPath -Version $bsversion

+ 27 - 0
bower_components/bootstrap/nuget/bootstrap.nuspec

@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
+  <metadata>
+    <id>bootstrap</id>
+    <version>4.0.0-alpha</version>
+    <title>Bootstrap CSS</title>
+    <authors>Twitter, Inc.</authors>
+    <owners>bootstrap</owners>
+	<description>The most popular front-end framework for developing responsive, mobile first projects on the web.</description>
+	<releaseNotes>http://blog.getbootstrap.com</releaseNotes>
+	<summary>Bootstrap framework in CSS. Includes fonts and JavaScript</summary>
+	<language>en-us</language>
+	<projectUrl>http://getbootstrap.com</projectUrl>
+    <iconUrl>http://getbootstrap.com/apple-touch-icon.png</iconUrl>
+	<licenseUrl>https://github.com/twbs/bootstrap/blob/master/LICENSE</licenseUrl>
+    <copyright>Copyright 2015</copyright>
+    <requireLicenseAcceptance>false</requireLicenseAcceptance>
+    <dependencies>
+      <dependency id="jQuery" version="2.0.0" />
+    </dependencies>
+	<tags>css js less mobile-first responsive front-end framework web</tags>
+  </metadata>
+  <files>
+    <file src="dist\css\*.*" target="content\Content" />
+    <file src="dist\js\bootstrap*.js" target="content\Scripts" />
+  </files>
+</package>

+ 27 - 0
bower_components/bootstrap/nuget/bootstrap.sass.nuspec

@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
+  <metadata>
+    <id>bootstrap.sass</id>
+    <version>4.0.0-alpha</version>
+    <title>Bootstrap Sass</title>
+    <authors>Twitter, Inc.</authors>
+    <owners>bootstrap</owners>
+	<description>The most popular front-end framework for developing responsive, mobile first projects on the web.</description>
+    <releaseNotes>http://blog.getbootstrap.com</releaseNotes>
+	<summary>Bootstrap framework in Sass. Includes fonts and JavaScript</summary>
+	<language>en-us</language>
+	<projectUrl>http://getbootstrap.com</projectUrl>
+    <iconUrl>http://getbootstrap.com/apple-touch-icon.png</iconUrl>
+	<licenseUrl>https://github.com/twbs/bootstrap/blob/master/LICENSE</licenseUrl>
+    <copyright>Copyright 2015</copyright>
+    <requireLicenseAcceptance>false</requireLicenseAcceptance>
+    <dependencies>
+      <dependency id="jQuery" version="2.0.0" />
+    </dependencies>
+	<tags>css js less mobile-first responsive front-end framework web</tags>
+  </metadata>
+  <files>
+    <file src="scss\**\*.scss" target="content\Content\bootstrap" />
+    <file src="dist\js\bootstrap*.js" target="content\Scripts" />
+  </files>
+</package>

+ 1 - 9
bower_components/bootstrap/package.js

@@ -1,12 +1,11 @@
 // package metadata file for Meteor.js
 
-/* jshint strict:false */
 /* global Package:true */
 
 Package.describe({
   name: 'twbs:bootstrap',  // http://atmospherejs.com/twbs/bootstrap
   summary: 'The most popular front-end framework for developing responsive, mobile first projects on the web.',
-  version: '3.3.5',
+  version: '4.0.0-alpha',
   git: 'https://github.com/twbs/bootstrap.git'
 });
 
@@ -14,13 +13,6 @@ Package.onUse(function (api) {
   api.versionsFrom('METEOR@1.0');
   api.use('jquery', 'client');
   api.addFiles([
-    'dist/fonts/glyphicons-halflings-regular.eot',
-    'dist/fonts/glyphicons-halflings-regular.svg',
-    'dist/fonts/glyphicons-halflings-regular.ttf',
-    'dist/fonts/glyphicons-halflings-regular.woff',
-    'dist/fonts/glyphicons-halflings-regular.woff2'
-  ], 'client', { isAsset: true });
-  api.addFiles([
     'dist/css/bootstrap.css',
     'dist/js/bootstrap.js'
   ], 'client');

+ 39 - 35
bower_components/bootstrap/package.json

@@ -1,7 +1,7 @@
 {
   "name": "bootstrap",
   "description": "The most popular front-end framework for developing responsive, mobile first projects on the web.",
-  "version": "4.0.0-alpha",
+  "version": "4.0.0-alpha.2",
   "keywords": [
     "css",
     "sass",
@@ -14,6 +14,7 @@
   "homepage": "http://getbootstrap.com",
   "author": "Twitter, Inc.",
   "scripts": {
+    "change-version": "node grunt/change-version.js",
     "test": "grunt test"
   },
   "style": "dist/css/bootstrap.css",
@@ -28,45 +29,42 @@
   },
   "license": "MIT",
   "devDependencies": {
-    "babel-eslint": "^4.0.10",
+    "autoprefixer": "^6.0.3",
+    "babel-eslint": "^4.1.3",
     "btoa": "~1.1.2",
-    "glob": "~5.0.3",
+    "glob": "~6.0.1",
     "grunt": "~0.4.5",
-    "grunt-autoprefixer": "~2.2.0",
-    "grunt-babel": "^5.0.0",
-    "grunt-banner": "~0.3.1",
-    "grunt-build-control": "~0.2.0",
-    "grunt-contrib-clean": "~0.6.0",
-    "grunt-contrib-compress": "~0.13.0",
+    "grunt-babel": "^5.0.3",
+    "grunt-build-control": "~0.6.0",
+    "grunt-contrib-clean": "~0.7.0",
+    "grunt-contrib-compress": "~0.14.0",
     "grunt-contrib-concat": "~0.5.1",
-    "grunt-contrib-connect": "~0.9.0",
-    "grunt-contrib-copy": "~0.8.0",
-    "grunt-contrib-csslint": "~0.4.0",
-    "grunt-contrib-cssmin": "~0.12.2",
-    "grunt-contrib-jade": "~0.14.1",
-    "grunt-contrib-jshint": "~0.11.0",
-    "grunt-contrib-qunit": "~0.5.2",
-    "grunt-contrib-sass": "^0.8.1",
-    "grunt-contrib-uglify": "~0.8.0",
+    "grunt-contrib-connect": "~0.11.2",
+    "grunt-contrib-copy": "~0.8.1",
+    "grunt-contrib-cssmin": "~0.14.0",
+    "grunt-contrib-qunit": "~0.7.0",
+    "grunt-contrib-sass": "^0.9.2",
+    "grunt-contrib-uglify": "~0.11.0",
     "grunt-contrib-watch": "~0.6.1",
-    "grunt-csscomb": "~3.0.0",
+    "grunt-csscomb": "~3.1.0",
     "grunt-eslint": "^17.1.0",
     "grunt-exec": "~0.4.6",
-    "grunt-html": "~4.0.1",
+    "grunt-html": "~5.0.0",
     "grunt-jekyll": "~0.4.2",
-    "grunt-jscs": "~1.8.0",
+    "grunt-jscs": "~2.4.0",
     "grunt-line-remover": "0.0.2",
-    "grunt-postcss": "^0.3.0",
+    "grunt-postcss": "^0.7.0",
     "grunt-sass": "^1.0.0",
-    "grunt-saucelabs": "~8.6.0",
-    "grunt-scss-lint": "^0.3.4",
-    "grunt-sed": "~0.1.1",
+    "grunt-saucelabs": "~8.6.1",
+    "grunt-scss-lint": "^0.3.8",
     "grunt-stamp": "^0.1.0",
-    "load-grunt-tasks": "~3.1.0",
-    "markdown-it": "^4.0.1",
-    "mq4-hover-shim": "^0.2.0",
+    "is-travis": "^1.0.0",
+    "load-grunt-tasks": "~3.3.0",
+    "markdown-it": "^5.0.0",
+    "mq4-hover-shim": "^0.3.0",
     "npm-shrinkwrap": "^200.1.0",
-    "time-grunt": "^1.1.0"
+    "shelljs": "^0.5.3",
+    "time-grunt": "^1.2.1"
   },
   "engines": {
     "node": ">=0.10.1"
@@ -82,16 +80,22 @@
   ],
   "jspm": {
     "main": "js/bootstrap",
+    "ignore": [
+      "dist/js/npm"
+    ],
+    "directories": {
+      "lib": "dist"
+    },
     "shim": {
       "js/bootstrap": {
-        "deps": "jquery",
+        "deps": [
+          "jquery"
+        ],
         "exports": "$"
       }
     },
-    "files": [
-      "css",
-      "fonts",
-      "js"
-    ]
+    "dependencies": {
+      "jquery": "*"
+    }
   }
 }

+ 13 - 5
bower_components/bootstrap/scss/.scsslint.yml

@@ -12,6 +12,9 @@ linters:
   ColorKeyword:
     enabled: true
 
+  ColorVariable:
+    enabled: false
+
   Comment:
     enabled: true
     exclude: ['_normalize.scss', 'bootstrap.scss']
@@ -24,7 +27,7 @@ linters:
 
   DuplicateProperty:
     enabled: true
-    exclude: ['mixins/_tab-focus.scss']
+    exclude: ['mixins/_tab-focus.scss', '_reboot.scss']
 
   ElsePlacement:
     enabled: true
@@ -55,6 +58,9 @@ linters:
   IdSelector:
     enabled: true
 
+  ImportantRule:
+    enabled: false
+
   ImportPath:
     enabled: true
     leading_underscore: false
@@ -96,6 +102,9 @@ linters:
       "bottom",
       "left",
       "z-index",
+      "-webkit-box-sizing",
+      "-moz-box-sizing",
+      "box-sizing",
       "display",
       "float",
       "width",
@@ -104,10 +113,6 @@ linters:
       "height",
       "min-height",
       "max-height",
-      "-webkit-box-sizing",
-      "-moz-box-sizing",
-      "box-sizing",
-      "-webkit-appearance",
       "flex",
       "flex-direction",
       "flex-flow",
@@ -376,6 +381,9 @@ linters:
     enabled: true
     extra_properties: []
 
+  PseudoElement:
+    enabled: true
+
   QualifyingElement:
     enabled: false
     allow_element_with_attribute: false

+ 2 - 3
bower_components/bootstrap/scss/_alert.scss

@@ -5,7 +5,7 @@
 .alert {
   padding: $alert-padding;
   margin-bottom: $spacer-y;
-  border: 1px solid transparent;
+  border: $alert-border-width solid transparent;
   @include border-radius($alert-border-radius);
 
   // Improve alignment and spacing of inner content
@@ -20,7 +20,6 @@
 
 // Headings for larger alerts
 .alert-heading {
-  margin-top: 0;
   // Specified to prevent conflicts of changing $headings-color
   color: inherit;
 }
@@ -62,5 +61,5 @@
   @include alert-variant($alert-warning-bg, $alert-warning-border, $alert-warning-text);
 }
 .alert-danger {
-  @include alert-variant($alert-danger-bg, $alert-danger-border,$alert-danger-text);
+  @include alert-variant($alert-danger-bg, $alert-danger-border, $alert-danger-text);
 }

+ 4 - 4
bower_components/bootstrap/scss/_breadcrumb.scss

@@ -4,16 +4,16 @@
   list-style: none;
   background-color: $breadcrumb-bg;
   @include border-radius($border-radius);
+  @include clearfix;
 
   > li {
-    display: inline-block;
+    float: left;
 
-    + li:before {
-      $nbsp: "\00a0";
+    + li::before {
       padding-right: .5rem;
       padding-left: .5rem;
       color: $breadcrumb-divider-color;
-      content: "#{$breadcrumb-divider}#{$nbsp}"; // Unicode space added since inline-block means non-collapsing white-space
+      content: "#{$breadcrumb-divider}";
     }
   }
 

+ 2 - 2
bower_components/bootstrap/scss/_button-group.scss

@@ -27,7 +27,7 @@
   .btn + .btn-group,
   .btn-group + .btn,
   .btn-group + .btn-group {
-    margin-left: -1px;
+    margin-left: -$input-btn-border-width;
   }
 }
 
@@ -167,7 +167,7 @@
   > .btn + .btn-group,
   > .btn-group + .btn,
   > .btn-group + .btn-group {
-    margin-top: -1px;
+    margin-top: -$input-btn-border-width;
     margin-left: 0;
   }
 }

+ 5 - 9
bower_components/bootstrap/scss/_buttons.scss

@@ -8,10 +8,9 @@
   text-align: center;
   white-space: nowrap;
   vertical-align: middle;
-  touch-action: manipulation;
   cursor: pointer;
   user-select: none;
-  border: $border-width solid transparent;
+  border: $input-btn-border-width solid transparent;
   @include button-size($btn-padding-y, $btn-padding-x, $font-size-base, $line-height, $btn-border-radius);
   @include transition(all .2s ease-in-out);
 
@@ -39,8 +38,7 @@
   }
 
   &.disabled,
-  &:disabled,
-  fieldset[disabled] & {
+  &:disabled {
     cursor: $cursor-disabled;
     opacity: .65;
     @include box-shadow(none);
@@ -48,7 +46,7 @@
 }
 
 // Future-proof disabling of clicks on `<a>` elements
-a.btn.disaabled,
+a.btn.disabled,
 fieldset[disabled] a.btn {
   pointer-events: none;
 }
@@ -111,8 +109,7 @@ fieldset[disabled] a.btn {
   &,
   &:active,
   &.active,
-  &:disabled,
-  fieldset[disabled] & {
+  &:disabled {
     background-color: transparent;
     @include box-shadow(none);
   }
@@ -129,8 +126,7 @@ fieldset[disabled] a.btn {
     text-decoration: $link-hover-decoration;
     background-color: transparent;
   }
-  &:disabled,
-  fieldset[disabled] & {
+  &:disabled {
     @include hover-focus {
       color: $btn-link-disabled-color;
       text-decoration: none;

+ 108 - 110
bower_components/bootstrap/scss/_card.scss

@@ -2,18 +2,11 @@
 // Base styles
 //
 
-$card-spacer-x:            1.25rem;
-$card-spacer-y:            .75rem;
-$card-border-width:        .0625rem;
-$card-border-radius:       .25rem;
-$card-border-color:        #e5e5e5;
-$card-border-radius-inner: ($card-border-radius - $card-border-width);
-
-$card-cap-bg: #f5f5f5;
-
 .card {
   position: relative;
+  display: block;
   margin-bottom: $card-spacer-y;
+  background-color: $card-bg;
   border: $card-border-width solid $card-border-color;
   @include border-radius($card-border-radius);
 }
@@ -23,7 +16,6 @@ $card-cap-bg: #f5f5f5;
 }
 
 .card-title {
-  margin-top: 0;
   margin-bottom: $card-spacer-y;
 }
 
@@ -101,55 +93,49 @@ $card-cap-bg: #f5f5f5;
 //
 
 .card-primary {
-  background-color: $brand-primary;
-  border-color: $brand-primary;
+  @include card-variant($brand-primary, $brand-primary);
 }
 .card-success {
-  background-color: $brand-success;
-  border-color: $brand-success;
+  @include card-variant($brand-success, $brand-success);
 }
 .card-info {
-  background-color: $brand-info;
-  border-color: $brand-info;
+  @include card-variant($brand-info, $brand-info);
 }
 .card-warning {
-  background-color: $brand-warning;
-  border-color: $brand-warning;
+  @include card-variant($brand-warning, $brand-warning);
 }
 .card-danger {
-  background-color: $brand-danger;
-  border-color: $brand-danger;
+  @include card-variant($brand-danger, $brand-danger);
 }
 
+// Remove all backgrounds
+.card-primary-outline {
+  @include card-outline-variant($btn-primary-bg);
+}
+.card-secondary-outline {
+  @include card-outline-variant($btn-secondary-border);
+}
+.card-info-outline {
+  @include card-outline-variant($btn-info-bg);
+}
+.card-success-outline {
+  @include card-outline-variant($btn-success-bg);
+}
+.card-warning-outline {
+  @include card-outline-variant($btn-warning-bg);
+}
+.card-danger-outline {
+  @include card-outline-variant($btn-danger-bg);
+}
 
 //
 // Inverse text within a card for use with dark backgrounds
 //
 
 .card-inverse {
-  .card-header,
-  .card-footer {
-    border-bottom: .075rem solid rgba(255,255,255,.2);
-  }
-  .card-header,
-  .card-footer,
-  .card-title,
-  .card-blockquote {
-    color: #fff;
-  }
-  .card-link,
-  .card-text,
-  .card-blockquote > footer {
-    color: rgba(255,255,255,.65);
-  }
-  .card-link {
-    @include hover-focus {
-      color: #fff;
-    }
-  }
+  @include card-inverse;
 }
 
-
 //
 // Blockquote
 //
@@ -178,10 +164,10 @@ $card-cap-bg: #f5f5f5;
 
 // Card image caps
 .card-img-top {
-  @include border-radius(.25rem .25rem 0 0);
+  @include border-radius($card-border-radius-inner $card-border-radius-inner 0 0);
 }
 .card-img-bottom {
-  @include border-radius(0 0 .25rem .25rem);
+  @include border-radius(0 0 $card-border-radius-inner $card-border-radius-inner);
 }
 
 
@@ -190,33 +176,37 @@ $card-cap-bg: #f5f5f5;
 //
 
 @if $enable-flex {
-  .card-deck {
-    display: flex;
-    flex-flow: row wrap;
-    margin-right: -.625rem;
-    margin-left: -.625rem;
-
-    .card {
-      flex: 1 0 0;
-      margin-right: .625rem;
-      margin-left: .625rem;
+  @include media-breakpoint-up(sm) {
+    .card-deck {
+      display: flex;
+      flex-flow: row wrap;
+      margin-right: -.625rem;
+      margin-left: -.625rem;
+
+      .card {
+        flex: 1 0 0;
+        margin-right: .625rem;
+        margin-left: .625rem;
+      }
     }
   }
 } @else {
-  .card-deck {
-    display: table;
-    table-layout: fixed;
-    border-spacing: 1.25rem 0;
-
-    .card {
-      display: table-cell;
-      width: 1%;
-      vertical-align: top;
+  @include media-breakpoint-up(sm) {
+    .card-deck {
+      display: table;
+      table-layout: fixed;
+      border-spacing: 1.25rem 0;
+
+      .card {
+        display: table-cell;
+        width: 1%;
+        vertical-align: top;
+      }
+    }
+    .card-deck-wrapper {
+      margin-right: -1.25rem;
+      margin-left: -1.25rem;
     }
-  }
-  .card-deck-wrapper {
-    margin-right: -1.25rem;
-    margin-left: -1.25rem;
   }
 }
 
@@ -224,54 +214,60 @@ $card-cap-bg: #f5f5f5;
 // Card groups
 //
 
-.card-group {
-  @if $enable-flex {
-    display: flex;
-    flex-flow: row wrap;
-  } @else {
-    display: table;
-    width: 100%;
-    table-layout: fixed;
-  }
-
-  .card {
+@include media-breakpoint-up(sm) {
+  .card-group {
     @if $enable-flex {
-      flex: 1 0 0;
+      display: flex;
+      flex-flow: row wrap;
     } @else {
-      display: table-cell;
-      vertical-align: top;
+      display: table;
+      width: 100%;
+      table-layout: fixed;
     }
 
-    + .card {
-      margin-left: 0;
-      border-left: 0;
-    }
+    .card {
+      @if $enable-flex {
+        flex: 1 0 0;
+      } @else {
+        display: table-cell;
+        vertical-align: top;
+      }
 
-    // Handle rounded corners
-    @if $enable-rounded {
-      &:first-child {
-        .card-img-top {
-          border-top-right-radius: 0;
-        }
-        .card-img-bottom {
-          border-bottom-right-radius: 0;
-        }
+      + .card {
+        margin-left: 0;
+        border-left: 0;
       }
-      &:last-child {
-        .card-img-top {
-          border-top-left-radius: 0;
+
+      // Handle rounded corners
+      @if $enable-rounded {
+        &:first-child {
+          @include border-right-radius(0);
+
+          .card-img-top {
+            border-top-right-radius: 0;
+          }
+          .card-img-bottom {
+            border-bottom-right-radius: 0;
+          }
         }
-        .card-img-bottom {
-          border-bottom-left-radius: 0;
+        &:last-child {
+          @include border-left-radius(0);
+
+          .card-img-top {
+            border-top-left-radius: 0;
+          }
+          .card-img-bottom {
+            border-bottom-left-radius: 0;
+          }
         }
-      }
-
-      &:not(:first-child):not(:last-child) {
-        border-radius: 0;
 
-        .card-img-top,
-        .card-img-bottom {
+        &:not(:first-child):not(:last-child) {
           border-radius: 0;
+
+          .card-img-top,
+          .card-img-bottom {
+            border-radius: 0;
+          }
         }
       }
     }
@@ -283,12 +279,14 @@ $card-cap-bg: #f5f5f5;
 // Card
 //
 
-.card-columns {
-  column-count: 3;
-  column-gap: 1.25rem;
+@include media-breakpoint-up(sm) {
+  .card-columns {
+    column-count: 3;
+    column-gap: 1.25rem;
 
-  .card {
-    display: inline-block;
-    width: 100%; // Don't let them exceed the column width
+    .card {
+      display: inline-block;
+      width: 100%; // Don't let them exceed the column width
+    }
   }
 }

+ 6 - 6
bower_components/bootstrap/scss/_carousel.scss

@@ -16,7 +16,7 @@
     // Account for jankitude on images
     > img,
     > a > img {
-      @extend .img-responsive;
+      @extend .img-fluid;
       line-height: 1;
     }
 
@@ -141,12 +141,12 @@
   }
 
   .icon-prev {
-    &:before {
+    &::before {
       content: "\2039";// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)
     }
   }
   .icon-next {
-    &:before {
+    &::before {
       content: "\203a";// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)
     }
   }
@@ -178,9 +178,9 @@
     cursor: pointer;
     // IE9 hack for event handling
     //
-    // Internet Explorer 9 does not support clicks on elements without a set
-    // `background-color`. We cannot use `filter` since that's not viewed as a
-    // background color by the browser. Thus, a hack is needed.
+    // Internet Explorer 9 does not properly handle clicks on elements with a `background-color` of `transparent`,
+    // so we use `rgba(0,0,0,0)` instead since it's a non-buggy equivalent.
+    // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer
     background-color: rgba(0,0,0,0); // IE9
     border: 1px solid $carousel-indicator-border-color;
     border-radius: 10px;

+ 1 - 1
bower_components/bootstrap/scss/_code.scss

@@ -27,7 +27,7 @@ kbd {
   kbd {
     padding: 0;
     font-size: 100%;
-    font-weight: bold;
+    font-weight: $nested-kbd-font-weight;
     @include box-shadow(none);
   }
 }

+ 24 - 24
bower_components/bootstrap/scss/_custom-forms.scss

@@ -19,16 +19,17 @@
     z-index: -1; // Put the input behind the label so it doesn't overlay text
     opacity: 0;
 
-    &:focus ~ .c-indicator {
-      @include box-shadow(0 0 0 .075rem #fff, 0 0 0 .2rem #0074d9);
-    }
-
     &:checked ~ .c-indicator {
       color: #fff;
       background-color: #0074d9;
       @include box-shadow(none);
     }
 
+    &:focus ~ .c-indicator {
+      // the mixin is not used here to make sure there is feedback
+      box-shadow: 0 0 0 .075rem #fff, 0 0 0 .2rem #0074d9;
+    }
+
     &:active ~ .c-indicator {
       color: #fff;
       background-color: #84c6ff;
@@ -108,7 +109,7 @@
   .c-input {
     display: inline;
 
-    &:after {
+    &::after {
       display: block;
       margin-bottom: .25rem;
       content: "";
@@ -125,29 +126,28 @@
 //
 // Replaces the browser default select with a custom one, mostly pulled from
 // http://primercss.io.
+//
+// Includes IE9-specific hacks (noted by ` \9`).
 
 .c-select {
   display: inline-block;
   max-width: 100%;
   padding: .375rem 1.75rem .375rem .75rem;
+  padding-right: .75rem \9;
+  color: $input-color;
   vertical-align: middle;
-	background: #fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAUCAMAAACzvE1FAAAADFBMVEUzMzMzMzMzMzMzMzMKAG/3AAAAA3RSTlMAf4C/aSLHAAAAPElEQVR42q3NMQ4AIAgEQTn//2cLdRKppSGzBYwzVXvznNWs8C58CiussPJj8h6NwgorrKRdTvuV9v16Afn0AYFOB7aYAAAAAElFTkSuQmCC) no-repeat right .75rem center;
+  background: #fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAUCAMAAACzvE1FAAAADFBMVEUzMzMzMzMzMzMzMzMKAG/3AAAAA3RSTlMAf4C/aSLHAAAAPElEQVR42q3NMQ4AIAgEQTn//2cLdRKppSGzBYwzVXvznNWs8C58CiussPJj8h6NwgorrKRdTvuV9v16Afn0AYFOB7aYAAAAAElFTkSuQmCC) no-repeat right .75rem center;
+  background-image: none \9;
   background-size: 8px 10px;
-  border: 1px solid $input-border;
-
-  // Have to include vendor prefixes as the `appearance` property isn't part of the CSS spec.
-  -webkit-appearance: none;
+  border: $input-btn-border-width solid $input-border-color;
+  // Use vendor prefixes as `appearance` isn't part of the CSS spec.
   -moz-appearance: none;
-  appearance: none;
-
-  // IE9 hacks to hide the background-image and reduce padding
-  padding-right: .75rem \9;
-  background-image: none \9;
+  -webkit-appearance: none;
 
   &:focus {
-    outline: none;
     border-color: #51a7e8;
-    box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075), 0 0 5px rgba(81, 167, 232, 0.5);
+    outline: none;
+    @include box-shadow(inset 0 1px 2px rgba(0, 0, 0, 0.075), 0 0 5px rgba(81, 167, 232, 0.5));
   }
 
   // Hides the default caret in IE11
@@ -181,7 +181,7 @@
 .file input {
   min-width: 14rem;
   margin: 0;
-  filter: alpha(opacity=0);
+  filter: alpha(opacity = 0);
   opacity: 0;
 }
 .file-custom {
@@ -196,14 +196,14 @@
   color: #555;
   user-select: none;
   background-color: #fff;
-  border: .075rem solid #ddd;
+  border: $input-btn-border-width solid #ddd;
   border-radius: .25rem;
-  box-shadow: inset 0 .2rem .4rem rgba(0,0,0,.05);
+  @include box-shadow(inset 0 .2rem .4rem rgba(0,0,0,.05));
 }
-.file-custom:after {
+.file-custom::after {
   content: "Choose file...";
 }
-.file-custom:before {
+.file-custom::before {
   position: absolute;
   top: -.075rem;
   right: -.075rem;
@@ -216,11 +216,11 @@
   color: #555;
   content: "Browse";
   background-color: #eee;
-  border: .075rem solid #ddd;
+  border: $input-btn-border-width solid #ddd;
   border-radius: 0 .25rem .25rem 0;
 }
 
 // Focus state
 .file input:focus ~ .file-custom {
-  box-shadow: 0 0 0 .075rem #fff, 0 0 0 .2rem #0074d9;
+  @include box-shadow(0 0 0 .075rem #fff, 0 0 0 .2rem #0074d9);
 }

+ 23 - 12
bower_components/bootstrap/scss/_dropdown.scss

@@ -1,4 +1,4 @@
-// The dropdown wrapper (div)
+// The dropdown wrapper (`<div>`)
 .dropup,
 .dropdown {
   position: relative;
@@ -6,10 +6,11 @@
 
 .dropdown-toggle {
   // Generate the caret automatically
-  &:after {
+  &::after {
     display: inline-block;
     width: 0;
     height: 0;
+    margin-right: .25rem;
     margin-left: .25rem;
     vertical-align: middle;
     content: "";
@@ -24,7 +25,16 @@
   }
 }
 
-// The dropdown menu (ul)
+.dropup {
+  .dropdown-toggle {
+    &::after {
+      border-top: 0;
+      border-bottom: $caret-width solid;
+    }
+  }
+}
+
+// The dropdown menu
 .dropdown-menu {
   position: absolute;
   top: 100%;
@@ -36,35 +46,36 @@
   padding: 5px 0;
   margin: 2px 0 0; // override default ul
   font-size: $font-size-base;
+  color: $body-color;
   text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)
   list-style: none;
   background-color: $dropdown-bg;
   background-clip: padding-box;
-  border: 1px solid $dropdown-border;
+  border: $dropdown-border-width solid $dropdown-border-color;
   @include border-radius($border-radius);
   @include box-shadow(0 6px 12px rgba(0,0,0,.175));
 }
 
-// Dividers (basically an hr) within the dropdown
+// Dividers (basically an `<hr>`) within the dropdown
 .dropdown-divider {
   @include nav-divider($dropdown-divider-bg);
 }
 
 // Links, buttons, and more within the dropdown menu
+//
+// `<button>`-specific styles are denoted with `// For <button>s`
 .dropdown-item {
   display: block;
+  width: 100%; // For `<button>`s
   padding: 3px 20px;
   clear: both;
   font-weight: normal;
   line-height: $line-height;
   color: $dropdown-link-color;
+  text-align: inherit; // For `<button>`s
   white-space: nowrap; // prevent links from randomly breaking onto new lines
-
-  // For `<button>`s
-  text-align: inherit;
-  width: 100%;
-  background: none;
-  border: 0;
+  background: none; // For `<button>`s
+  border: 0; // For `<button>`s
 
   @include hover-focus {
     color: $dropdown-link-hover-color;
@@ -161,7 +172,7 @@
 
 // Allow for dropdowns to go bottom up (aka, dropup-menu)
 //
-// Just add .dropup after the standard .dropdown class and you're set, bro.
+// Just add .dropup after the standard .dropdown class and you're set.
 // TODO: abstract this so that the navbar fixed styles are not placed here?
 
 .dropup,

+ 26 - 31
bower_components/bootstrap/scss/_forms.scss

@@ -14,14 +14,14 @@
   background-color: $input-bg;
   // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214.
   background-image: none;
-  border: $border-width solid $input-border;
-   // Note: This has no effect on <select>s in some browsers, due to the limited stylability of `<select>`s in CSS.
+  border: $input-btn-border-width solid $input-border-color;
+  // Note: This has no effect on <select>s in some browsers, due to the limited stylability of `<select>`s in CSS.
   @include border-radius($input-border-radius);
   @include box-shadow($input-box-shadow);
   @include transition(border-color ease-in-out .15s, box-shadow ease-in-out .15s);
 
   // Make inputs at least the height of their button counterpart (base line-height + padding + border).
-  // Only apply the height to textual inputs and some selcts.
+  // Only apply the height to textual inputs and some selects.
   // &:not(textarea),
   // &:not(select[size]),
   // &:not(select[multiple]) {
@@ -50,15 +50,13 @@
   // disabled if the fieldset is disabled. Due to implementation difficulty, we
   // don't honor that edge case; we style them as disabled anyway.
   &:disabled,
-  &[readonly],
-  fieldset[disabled] & {
+  &[readonly] {
     background-color: $input-bg-disabled;
     // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655.
     opacity: 1;
   }
 
-  &[disabled],
-  fieldset[disabled] & {
+  &:disabled {
     cursor: $cursor-disabled;
   }
 }
@@ -78,7 +76,7 @@
 // For use with horizontal and inline forms, when you need the label text to
 // align with the form controls.
 .form-control-label {
-  padding: ($input-padding-y + $border-width) $input-padding-x;
+  padding: $input-padding-y $input-padding-x;
   margin-bottom: 0; // Override the `<label>` default
 }
 
@@ -91,6 +89,8 @@
 // text within the input to become vertically misaligned. As a workaround, we
 // set a pixel line-height that matches the given height of the input, but only
 // for Safari. See https://bugs.webkit.org/show_bug.cgi?id=139848
+//
+// Note that as of 8.3, iOS doesn't support `datetime` or `week`.
 
 @media screen and (-webkit-min-device-pixel-ratio: 0) {
   input[type="date"],
@@ -122,8 +122,8 @@
 .form-control-static {
   min-height: $input-height;
   // Size it appropriately next to real form controls
-  padding-top: ($input-padding-y + $border-width);
-  padding-bottom: ($input-padding-y + $border-width);
+  padding-top: $input-padding-y;
+  padding-bottom: $input-padding-y;
   // Remove default margin from `p`
   margin-bottom: 0;
 
@@ -148,7 +148,7 @@
   padding: $input-padding-y-sm $input-padding-x-sm;
   font-size: $font-size-sm;
   line-height: $line-height-sm;
-  border-radius: $input-border-radius-sm;
+  @include border-radius($input-border-radius-sm);
 }
 
 .form-control-lg {
@@ -156,7 +156,7 @@
   padding: $input-padding-y-lg $input-padding-x-lg;
   font-size: $font-size-lg;
   line-height: $line-height-lg;
-  border-radius: $input-border-radius-lg;
+  @include border-radius($input-border-radius-lg);
 }
 
 
@@ -233,24 +233,21 @@
 input[type="radio"],
 input[type="checkbox"] {
   &:disabled,
-  &.disabled,
-  fieldset[disabled] & {
+  &.disabled {
     cursor: $cursor-disabled;
   }
 }
 // These classes are used directly on <label>s
 .radio-inline,
 .checkbox-inline {
-  &.disabled,
-  fieldset[disabled] & {
+  &.disabled {
     cursor: $cursor-disabled;
   }
 }
 // These classes are used on elements with <label> descendants
 .radio,
 .checkbox {
-  &.disabled,
-  fieldset[disabled] & {
+  &.disabled {
     label {
       cursor: $cursor-disabled;
     }
@@ -264,16 +261,16 @@ input[type="checkbox"] {
 
 .form-control-success,
 .form-control-warning,
-.form-control-error {
+.form-control-danger {
   padding-right: ($input-padding-x * 3);
+  background-repeat: no-repeat;
   background-position: center right ($input-height * .25);
   background-size: ($input-height * .65) ($input-height * .65);
-  background-repeat: no-repeat;
 }
 
 // Form validation states
 .has-success {
-  @include form-control-validation(success, $brand-success);
+  @include form-control-validation($brand-success);
 
   .form-control-success {
     background-image: url($form-icon-success);
@@ -281,18 +278,18 @@ input[type="checkbox"] {
 }
 
 .has-warning {
-  @include form-control-validation(warning, $brand-warning);
+  @include form-control-validation($brand-warning);
 
   .form-control-warning {
     background-image: url($form-icon-warning);
   }
 }
 
-.has-error {
-  @include form-control-validation(error, $brand-danger);
+.has-danger {
+  @include form-control-validation($brand-danger);
 
-  .form-control-error {
-    background-image: url($form-icon-error);
+  .form-control-danger {
+    background-image: url($form-icon-danger);
   }
 }
 
@@ -357,7 +354,7 @@ input[type="checkbox"] {
 // .has-warning {
 //   @include form-control-validation($state-warning-text, $state-warning-text, $state-warning-bg);
 // }
-// .has-error {
+// .has-danger {
 //   @include form-control-validation($state-danger-text, $state-danger-text, $state-danger-bg);
 // }
 //
@@ -383,8 +380,6 @@ input[type="checkbox"] {
 //
 // Requires wrapping inputs and labels with `.form-group` for proper display of
 // default HTML form controls and our custom form controls (e.g., input groups).
-//
-// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.
 
 .form-inline {
 
@@ -397,7 +392,7 @@ input[type="checkbox"] {
       vertical-align: middle;
     }
 
-    // In navbar-form, allow folks to *not* use `.form-group`
+    // Allow folks to *not* use `.form-group`
     .form-control {
       display: inline-block;
       width: auto; // Prevent labels from stacking above inputs in `.form-group`
@@ -425,7 +420,7 @@ input[type="checkbox"] {
       width: 100%;
     }
 
-    .control-label {
+    .form-control-label {
       margin-bottom: 0;
       vertical-align: middle;
     }

+ 26 - 75
bower_components/bootstrap/scss/_grid.scss

@@ -4,13 +4,8 @@
 
 .container {
   @include make-container();
+  @include make-container-max-widths();
 
-  // For each breakpoint, define the maximum width of the container in a media query
-  @each $breakpoint, $container-max-width in $container-max-widths {
-    @include media-breakpoint-up($breakpoint) {
-      max-width: $container-max-width;
-    }
-  }
 }
 
 
@@ -28,8 +23,10 @@
 //
 // Rows contain and clear the floats of your columns.
 
-.row {
-  @include make-row();
+@if $enable-grid-classes {
+  .row {
+    @include make-row();
+  }
 }
 
 
@@ -37,89 +34,43 @@
 //
 // Common styles for small and large grid columns
 
-@include make-grid-columns();
+@if $enable-grid-classes {
+  @include make-grid-columns();
+}
 
 
 // Flex variation
 //
 // Custom styles for additional flex alignment options.
 
-@if $enable-flex {
+@if $enable-flex and $enable-grid-classes {
 
   // Flex column reordering
 
-  .col-xs-first { order: -1; }
-  .col-xs-last { order: 1; }
-
-  @include media-breakpoint-up(sm) {
-    .col-sm-first { order: -1; }
-    .col-sm-last { order: 1; }
-  }
-  @include media-breakpoint-up(md) {
-    .col-md-first { order: -1; }
-    .col-md-last { order: 1; }
-  }
-  @include media-breakpoint-up(lg) {
-    .col-lg-first { order: -1; }
-    .col-lg-last { order: 1; }
-  }
-  @include media-breakpoint-up(xl) {
-    .col-xl-first { order: -1; }
-    .col-xl-last { order: 1; }
+  @each $breakpoint in map-keys($grid-breakpoints) {
+    @include media-breakpoint-up($breakpoint) {
+      .col-#{$breakpoint}-first { order: -1; }
+      .col-#{$breakpoint}-last  { order: 1; }
+    }
   }
 
   // Alignment for every column in row
 
-  .row-xs-top    { align-items: flex-start; }
-  .row-xs-center { align-items: center; }
-  .row-xs-bottom { align-items: flex-end; }
-
-  @include media-breakpoint-up(sm) {
-    .row-sm-top    { align-items: flex-start; }
-    .row-sm-center { align-items: center; }
-    .row-sm-bottom { align-items: flex-end; }
-  }
-  @include media-breakpoint-up(md) {
-    .row-md-top    { align-items: flex-start; }
-    .row-md-center { align-items: center; }
-    .row-md-bottom { align-items: flex-end; }
-  }
-  @include media-breakpoint-up(lg) {
-    .row-lg-top    { align-items: flex-start; }
-    .row-lg-center { align-items: center; }
-    .row-lg-bottom { align-items: flex-end; }
-  }
-  @include media-breakpoint-up(xl) {
-    .row-xl-top    { align-items: flex-start; }
-    .row-xl-center { align-items: center; }
-    .row-xl-bottom { align-items: flex-end; }
+  @each $breakpoint in map-keys($grid-breakpoints) {
+    @include media-breakpoint-up($breakpoint) {
+      .row-#{$breakpoint}-top    { align-items: flex-start; }
+      .row-#{$breakpoint}-center { align-items: center; }
+      .row-#{$breakpoint}-bottom { align-items: flex-end; }
+    }
   }
 
   // Alignment per column
 
-  .col-xs-top    { align-self: flex-start; }
-  .col-xs-center { align-self: center; }
-  .col-xs-bottom { align-self: flex-end; }
-
-  @include media-breakpoint-up(sm) {
-    .col-sm-top    { align-self: flex-start; }
-    .col-sm-center { align-self: center; }
-    .col-sm-bottom { align-self: flex-end; }
-  }
-  @include media-breakpoint-up(md) {
-    .col-md-top    { align-self: flex-start; }
-    .col-md-center { align-self: center; }
-    .col-md-bottom { align-self: flex-end; }
-  }
-  @include media-breakpoint-up(lg) {
-    .col-lg-top    { align-self: flex-start; }
-    .col-lg-center { align-self: center; }
-    .col-lg-bottom { align-self: flex-end; }
-  }
-  @include media-breakpoint-up(xl) {
-    .col-xl-top    { align-self: flex-start; }
-    .col-xl-center { align-self: center; }
-    .col-xl-bottom { align-self: flex-end; }
+  @each $breakpoint in map-keys($grid-breakpoints) {
+    @include media-breakpoint-up($breakpoint) {
+      .col-#{$breakpoint}-top    { align-self: flex-start; }
+      .col-#{$breakpoint}-center { align-self: center; }
+      .col-#{$breakpoint}-bottom { align-self: flex-end; }
+    }
   }
-
 }

+ 29 - 4
bower_components/bootstrap/scss/_images.scss

@@ -1,6 +1,12 @@
 // Responsive images (ensure images don't scale beyond their parents)
-.img-responsive {
-  @include img-responsive();
+//
+// This is purposefully opt-in via an explicit class rather than being the default for all `<img>`s.
+// We previously tried the "images are responsive by default" approach in Bootstrap v2,
+// and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps)
+// which weren't expecting the images within themselves to be involuntarily resized.
+// See also https://github.com/twbs/bootstrap/issues/18178
+.img-fluid {
+  @include img-fluid();
 }
 
 // Rounded corners
@@ -13,16 +19,35 @@
   padding: $thumbnail-padding;
   line-height: $line-height;
   background-color: $thumbnail-bg;
-  border: 1px solid $thumbnail-border;
+  border: $thumbnail-border-width solid $thumbnail-border-color;
   border-radius: $thumbnail-border-radius;
   transition: all .2s ease-in-out;
   @include box-shadow(0 1px 2px rgba(0,0,0,.075));
 
   // Keep them at most 100% wide
-  @include img-responsive(inline-block);
+  @include img-fluid(inline-block);
 }
 
 // Perfect circle
 .img-circle {
   border-radius: 50%;
 }
+
+//
+// Figures
+//
+
+.figure {
+  // Ensures the caption's text aligns with the image.
+  display: inline-block;
+}
+
+.figure-img {
+  margin-bottom: ($spacer-y / 2);
+  line-height: 1;
+}
+
+.figure-caption {
+  font-size: 90%;
+  color: $gray-light;
+}

+ 15 - 7
bower_components/bootstrap/scss/_input-group.scss

@@ -19,6 +19,10 @@
     // proper border colors.
     position: relative;
     z-index: 2;
+    // Bring the "active" form control to the front
+    @include hover-focus-active {
+      z-index: 3;
+    }
     @if $enable-flex {
       flex: 1;
     } @else {
@@ -87,7 +91,7 @@
   color: $input-color;
   text-align: center;
   background-color: $input-group-addon-bg;
-  border: 1px solid $input-group-addon-border-color;
+  border: $input-btn-border-width solid $input-group-addon-border-color;
   @include border-radius($border-radius);
 
   // Sizing
@@ -97,7 +101,7 @@
     @include border-radius($border-radius-sm);
   }
   &.form-control-lg {
-    padding: $input-padding-x-lg $input-padding-x-lg;
+    padding: $input-padding-y-lg $input-padding-x-lg;
     font-size: $font-size-lg;
     @include border-radius($border-radius-lg);
   }
@@ -156,26 +160,30 @@
   > .btn {
     position: relative;
     + .btn {
-      margin-left: -1px;
+      margin-left: (-$input-btn-border-width);
     }
     // Bring the "active" button to the front
     @include hover-focus-active {
-      z-index: 2;
+      z-index: 3;
     }
   }
 
-  // Negative margin to only have a 1px border between the two
+  // Negative margin to only have a single, shared border between the two
   &:first-child {
     > .btn,
     > .btn-group {
-      margin-right: -1px;
+      margin-right: (-$input-btn-border-width);
     }
   }
   &:last-child {
     > .btn,
     > .btn-group {
       z-index: 2;
-      margin-left: -1px;
+      margin-left: (-$input-btn-border-width);
+      // Because specificity
+      @include hover-focus-active {
+        z-index: 3;
+      }
     }
   }
 }

+ 4 - 6
bower_components/bootstrap/scss/_jumbotron.scss

@@ -3,18 +3,16 @@
   margin-bottom: $jumbotron-padding;
   background-color: $jumbotron-bg;
   @include border-radius($border-radius-lg);
+
+  @include media-breakpoint-up(sm) {
+    padding: ($jumbotron-padding * 2) $jumbotron-padding;
+  }
 }
 
 .jumbotron-hr {
   border-top-color: darken($jumbotron-bg, 10%);
 }
 
-@include media-breakpoint-up(sm) {
-  .jumbotron {
-    padding: ($jumbotron-padding * 2) $jumbotron-padding;
-  }
-}
-
 .jumbotron-fluid {
   padding-right: 0;
   padding-left: 0;

+ 10 - 9
bower_components/bootstrap/scss/_labels.scss

@@ -7,7 +7,7 @@
   display: inline-block;
   padding: .25em .4em;
   font-size: 75%;
-  font-weight: bold;
+  font-weight: $label-font-weight;
   line-height: 1;
   color: $label-color;
   text-align: center;
@@ -19,12 +19,12 @@
   &:empty {
     display: none;
   }
+}
 
-  // Quick fix for labels in buttons
-  .btn & {
-    position: relative;
-    top: -1px;
-  }
+// Quick fix for labels in buttons
+.btn .label {
+  position: relative;
+  top: -1px;
 }
 
 // Add hover effects, but only for links
@@ -41,12 +41,13 @@ a.label {
 // Make them extra rounded with a modifier to replace v3's badges.
 
 .label-pill {
-  padding-left: .6em;
   padding-right: .6em;
-  border-radius: 1rem;
+  padding-left: .6em;
+  // Use a higher than normal value to ensure completely rounded edges when
+  // customizing padding or font-size on labels.
+  @include border-radius(10rem);
 }
 
-
 // Colors
 //
 // Contextual variations (linked labels get darker on :hover).

+ 16 - 4
bower_components/bootstrap/scss/_list-group.scss

@@ -18,9 +18,9 @@
   display: block;
   padding: .75rem 1.25rem;
   // Place the border on the list items and negative margin up for better styling
-  margin-bottom: -.0625rem;
+  margin-bottom: -$list-group-border-width;
   background-color: $list-group-bg;
-  border: .0625rem solid $list-group-border;
+  border: $list-group-border-width solid $list-group-border-color;
 
   // Round the first and last items
   &:first-child {
@@ -34,9 +34,21 @@
 
 .list-group-flush {
   .list-group-item {
-    border-width: .0625rem 0;
+    border-width: $list-group-border-width 0;
     border-radius: 0;
   }
+
+  &:first-child {
+    .list-group-item:first-child {
+      border-top: 0;
+    }
+  }
+
+  &:last-child {
+    .list-group-item:last-child {
+      border-bottom: 0;
+    }
+  }
 }
 
 
@@ -48,8 +60,8 @@
 a.list-group-item,
 button.list-group-item {
   width: 100%;
-  text-align: inherit;
   color: $list-group-link-color;
+  text-align: inherit;
 
   .list-group-item-heading {
     color: $list-group-link-heading-color;

+ 6 - 0
bower_components/bootstrap/scss/_media.scss

@@ -6,6 +6,12 @@
   .media-body {
     flex: 1;
   }
+  .media-middle {
+    align-self: center;
+  }
+  .media-bottom {
+    align-self: flex-end;
+  }
 } @else {
   .media {
     margin-top: 15px;

+ 0 - 0
bower_components/bootstrap/scss/_mixins.scss


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