From 0fdbaaf8853b266f75777cf84295b1bfdedd8a8a Mon Sep 17 00:00:00 2001 From: Herst Date: Fri, 25 Aug 2017 14:01:34 +0200 Subject: [PATCH 01/79] Remove speculations about jQuery 3 --- docs/4.0/content/reboot.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/4.0/content/reboot.md b/docs/4.0/content/reboot.md index 63a576c6f..6fa38a381 100644 --- a/docs/4.0/content/reboot.md +++ b/docs/4.0/content/reboot.md @@ -339,7 +339,7 @@ HTML5 adds [a new global attribute named `[hidden]`](https://developer.mozilla.o {% callout warning %} #### jQuery incompatibility -`[hidden]` is not compatible with jQuery's `$(...).hide()` and `$(...).show()` methods. This could potentially change in jQuery 3, but we're not holding our breath. Therefore, we don't currently especially endorse `[hidden]` over other techniques for managing the `display` of elements. +`[hidden]` is not compatible with jQuery's `$(...).hide()` and `$(...).show()` methods. Therefore, we don't currently especially endorse `[hidden]` over other techniques for managing the `display` of elements. {% endcallout %} To merely toggle the visibility of an element, meaning its `display` is not modified and the element can still affect the flow of the document, use [the `.invisible` class]({{ site.baseurl }}/docs/{{ site.docs_version }}/utilities/visibility/) instead. From bcad4bcb5f5a9ef079b2883a48a698b35261e083 Mon Sep 17 00:00:00 2001 From: Johann-S Date: Fri, 25 Aug 2017 21:54:49 +0200 Subject: [PATCH 02/79] Fix XSS in data-target --- js/src/util.js | 2 +- js/tests/visual/modal.html | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/js/src/util.js b/js/src/util.js index 69fb8283c..cd3f1fb6a 100644 --- a/js/src/util.js +++ b/js/src/util.js @@ -117,7 +117,7 @@ const Util = (($) => { } try { - const $selector = $(selector) + const $selector = $(document).find(selector) return $selector.length > 0 ? selector : null } catch (error) { return null diff --git a/js/tests/visual/modal.html b/js/tests/visual/modal.html index c9a950b8c..da9bbf93a 100644 --- a/js/tests/visual/modal.html +++ b/js/tests/visual/modal.html @@ -167,6 +167,10 @@ + + From 9612830701211d757ff95ceccbb494fd2e7ee17e Mon Sep 17 00:00:00 2001 From: meeque Date: Fri, 25 Aug 2017 22:53:15 +0200 Subject: [PATCH 03/79] Add unit test for xss in data target attribute --- js/tests/unit/modal.js | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/js/tests/unit/modal.js b/js/tests/unit/modal.js index 3b028dc10..5b265df15 100644 --- a/js/tests/unit/modal.js +++ b/js/tests/unit/modal.js @@ -597,4 +597,40 @@ $(function () { }) .trigger('click') }) + + QUnit.test('should not parse target as html', function (assert) { + assert.expect(1) + var done = assert.async() + + var $toggleBtn = $(' +

From 6cd67779434501eed6aea4ae62f2e4499e37702e Mon Sep 17 00:00:00 2001 From: Chris Rebert Date: Wed, 30 Aug 2017 14:19:08 -0700 Subject: [PATCH 17/79] Wall of Browser Bugs: Update table-cell border Chrome bug ref https://crbug.com/568691 has been succeeded by https://crbug.com/749848 --- _data/browser-bugs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_data/browser-bugs.yml b/_data/browser-bugs.yml index d3f133354..9756758dd 100644 --- a/_data/browser-bugs.yml +++ b/_data/browser-bugs.yml @@ -204,7 +204,7 @@ summary: > `table-cell` borders not overlapping despite `margin-right: -1px` upstream_bug: > - Chromium#568691 + Chromium#749848 origin: > Bootstrap#17438, Bootstrap#14237 From 0165a620ec5826289dd56c0683c413e7a5b47fcb Mon Sep 17 00:00:00 2001 From: Herst Date: Thu, 31 Aug 2017 16:03:41 +0200 Subject: [PATCH 18/79] Adapt UglifyJS config for IE10 See mishoo/UglifyJS2#2198 --- build/uglifyjs.config.json | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/build/uglifyjs.config.json b/build/uglifyjs.config.json index 2b53a56d9..5085f4186 100644 --- a/build/uglifyjs.config.json +++ b/build/uglifyjs.config.json @@ -1,5 +1,8 @@ { - "output" : { + "output": { "comments": "/^!/" - } + }, + "compress": { + "typeofs": false + } } From 9936bf59444c402b653f28449529eab83794e911 Mon Sep 17 00:00:00 2001 From: Johann-S Date: Tue, 29 Aug 2017 21:16:00 +0200 Subject: [PATCH 19/79] Create a bundled release of Bootstrap with Popper.js inside --- .babelrc | 4 +-- build/rollup.config.js | 43 ++++++++++++++++++++++++ build/stamp.js | 44 +++++++------------------ js/src/alert.js | 3 +- js/src/button.js | 3 +- js/src/carousel.js | 3 +- js/src/collapse.js | 3 +- js/src/dropdown.js | 8 ++--- js/src/index.js | 46 ++++++++++++++++++++++++++ js/src/modal.js | 3 +- js/src/popover.js | 3 +- js/src/scrollspy.js | 3 +- js/src/tab.js | 3 +- js/src/tooltip.js | 8 ++--- js/src/util.js | 4 ++- js/tests/.eslintrc.json | 1 + package-lock.json | 73 +++++++++++++++++++++++++++++++++++++++++ package.json | 15 +++++++-- 18 files changed, 214 insertions(+), 56 deletions(-) create mode 100644 build/rollup.config.js create mode 100644 js/src/index.js diff --git a/.babelrc b/.babelrc index eb52c30ac..bd9c86c1e 100644 --- a/.babelrc +++ b/.babelrc @@ -8,7 +8,5 @@ } ] ], - "plugins": [ - "transform-es2015-modules-strip" - ] + "plugins": ["external-helpers"] } diff --git a/build/rollup.config.js b/build/rollup.config.js new file mode 100644 index 000000000..7cec6ef1c --- /dev/null +++ b/build/rollup.config.js @@ -0,0 +1,43 @@ +const path = require('path') +const babel = require('rollup-plugin-babel') +const resolve = require('rollup-plugin-node-resolve') +const BUNDLE = process.env.BUNDLE === 'true' + +var fileDest = 'bootstrap.js' +var external = ['jquery', 'popper.js'] +const plugins = [ + babel({ + exclude: 'node_modules/**', // only transpile our source code + externalHelpersWhitelist: [ // include only required helpers + 'typeof', + 'classCallCheck', + 'createClass', + 'inherits', + 'possibleConstructorReturn' + ] + }) +] +const globals = { + jquery: '$', + 'popper.js': 'Popper' +} + +if (BUNDLE) { + fileDest = 'bootstrap.bundle.js' + // remove last entry in external array to bundle Popper + external.pop() + delete globals['popper.js'] + plugins.push(resolve()) +} + +module.exports = { + input: path.resolve(__dirname, '../js/src/index.js'), + output: { + file: path.resolve(__dirname, `../dist/js/${fileDest}`), + format: 'iife' + }, + name: 'bootstrap', + external: external, + globals: globals, + plugins: plugins +} diff --git a/build/stamp.js b/build/stamp.js index 8cde189d7..2135c60a3 100644 --- a/build/stamp.js +++ b/build/stamp.js @@ -1,41 +1,19 @@ -const fs = require('fs') +const fs = require('fs') +const path = require('path') +const pkg = require(path.resolve(__dirname, '../package.json')) +const year = new Date().getFullYear() -fs.readFile('package.json', (err, data) => { - if (err) { - throw err - } +const pathBoostrap = path.resolve(__dirname, '../dist/js/bootstrap.js') +const pathBootstrapBundle = path.resolve(__dirname, '../dist/js/bootstrap.bundle.js') +const contentFile = fs.readFileSync(pathBoostrap, { encoding: 'UTF8' }) +const contentBundleFile = fs.readFileSync(pathBootstrapBundle, { encoding: 'UTF8' }) - const pkg = JSON.parse(data) - const year = new Date().getFullYear() - - const stampTop = +const stamp = `/*! * Bootstrap v${pkg.version} (${pkg.homepage}) * Copyright 2011-${year} ${pkg.author} * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ - -if (typeof jQuery === 'undefined') { - throw new Error('Bootstrap\\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\\'s JavaScript.') -} - -(function ($) { - var version = $.fn.jquery.split(' ')[0].split('.') - if ((version[0] < 3) || (version[0] >= 4)) { - throw new Error('Bootstrap\\'s JavaScript requires at least jQuery v3.0.0 but less than v4.0.0') - } -})(jQuery); - -(function () { ` - const stampEnd = ` -})();` - - process.stdout.write(stampTop) - - process.stdin.on('end', () => { - process.stdout.write(stampEnd) - }) - - process.stdin.pipe(process.stdout) -}) +fs.writeFileSync(pathBoostrap, `${stamp}${contentFile}`, { encoding: 'UTF8' }) +fs.writeFileSync(pathBootstrapBundle, `${stamp}${contentBundleFile}`, { encoding: 'UTF8' }) diff --git a/js/src/alert.js b/js/src/alert.js index b6b9336af..9fcf088b1 100644 --- a/js/src/alert.js +++ b/js/src/alert.js @@ -1,3 +1,4 @@ +import $ from 'jquery' import Util from './util' @@ -8,7 +9,7 @@ import Util from './util' * -------------------------------------------------------------------------- */ -const Alert = (($) => { +const Alert = (() => { /** diff --git a/js/src/button.js b/js/src/button.js index a8a72ef56..a121b8e13 100644 --- a/js/src/button.js +++ b/js/src/button.js @@ -1,3 +1,4 @@ +import $ from 'jquery' /** * -------------------------------------------------------------------------- * Bootstrap (v4.0.0-beta): button.js @@ -5,7 +6,7 @@ * -------------------------------------------------------------------------- */ -const Button = (($) => { +const Button = (() => { /** diff --git a/js/src/carousel.js b/js/src/carousel.js index 873660519..a5ad02541 100644 --- a/js/src/carousel.js +++ b/js/src/carousel.js @@ -1,3 +1,4 @@ +import $ from 'jquery' import Util from './util' @@ -8,7 +9,7 @@ import Util from './util' * -------------------------------------------------------------------------- */ -const Carousel = (($) => { +const Carousel = (() => { /** diff --git a/js/src/collapse.js b/js/src/collapse.js index 7d1ba4c54..acc959d40 100644 --- a/js/src/collapse.js +++ b/js/src/collapse.js @@ -1,3 +1,4 @@ +import $ from 'jquery' import Util from './util' @@ -8,7 +9,7 @@ import Util from './util' * -------------------------------------------------------------------------- */ -const Collapse = (($) => { +const Collapse = (() => { /** diff --git a/js/src/dropdown.js b/js/src/dropdown.js index e1c48ac6e..adb54f0f2 100644 --- a/js/src/dropdown.js +++ b/js/src/dropdown.js @@ -1,5 +1,5 @@ -/* global Popper */ - +import $ from 'jquery' +import Popper from 'popper.js' import Util from './util' @@ -10,7 +10,7 @@ import Util from './util' * -------------------------------------------------------------------------- */ -const Dropdown = (($) => { +const Dropdown = (() => { /** * Check for Popper dependency @@ -445,6 +445,6 @@ const Dropdown = (($) => { return Dropdown -})(jQuery) +})(jQuery, Popper) export default Dropdown diff --git a/js/src/index.js b/js/src/index.js new file mode 100644 index 000000000..a3858dd24 --- /dev/null +++ b/js/src/index.js @@ -0,0 +1,46 @@ +import $ from 'jquery' +import Alert from './alert' +import Button from './button' +import Carousel from './carousel' +import Collapse from './collapse' +import Dropdown from './dropdown' +import Modal from './modal' +import Popover from './popover' +import Scrollspy from './scrollspy' +import Tab from './tab' +import Tooltip from './tooltip' +import Util from './util' + +/** + * -------------------------------------------------------------------------- + * Bootstrap (v4.0.0-alpha.6): index.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * -------------------------------------------------------------------------- + */ + +if (typeof jQuery === 'undefined') { + throw new Error('Bootstrap\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\'s JavaScript.') +} + +(() => { + const version = $.fn.jquery.split(' ')[0].split('.') + const min = 3 + const max = 4 + if (version[0] < min || version[0] >= max) { + throw new Error('Bootstrap\'s JavaScript requires at least jQuery v3.0.0 but less than v4.0.0') + } +})(jQuery) + +export { + Util, + Alert, + Button, + Carousel, + Collapse, + Dropdown, + Modal, + Popover, + Scrollspy, + Tab, + Tooltip +} diff --git a/js/src/modal.js b/js/src/modal.js index ab73230c8..2ff93342d 100644 --- a/js/src/modal.js +++ b/js/src/modal.js @@ -1,3 +1,4 @@ +import $ from 'jquery' import Util from './util' @@ -8,7 +9,7 @@ import Util from './util' * -------------------------------------------------------------------------- */ -const Modal = (($) => { +const Modal = (() => { /** diff --git a/js/src/popover.js b/js/src/popover.js index f5820ecbe..aeccdf750 100644 --- a/js/src/popover.js +++ b/js/src/popover.js @@ -1,3 +1,4 @@ +import $ from 'jquery' import Tooltip from './tooltip' @@ -8,7 +9,7 @@ import Tooltip from './tooltip' * -------------------------------------------------------------------------- */ -const Popover = (($) => { +const Popover = (() => { /** diff --git a/js/src/scrollspy.js b/js/src/scrollspy.js index 588f65298..70067c0b3 100644 --- a/js/src/scrollspy.js +++ b/js/src/scrollspy.js @@ -1,3 +1,4 @@ +import $ from 'jquery' import Util from './util' @@ -8,7 +9,7 @@ import Util from './util' * -------------------------------------------------------------------------- */ -const ScrollSpy = (($) => { +const ScrollSpy = (() => { /** diff --git a/js/src/tab.js b/js/src/tab.js index c32cd3776..18af4e7e2 100644 --- a/js/src/tab.js +++ b/js/src/tab.js @@ -1,3 +1,4 @@ +import $ from 'jquery' import Util from './util' @@ -8,7 +9,7 @@ import Util from './util' * -------------------------------------------------------------------------- */ -const Tab = (($) => { +const Tab = (() => { /** diff --git a/js/src/tooltip.js b/js/src/tooltip.js index 37573cf49..5dc28ab7e 100644 --- a/js/src/tooltip.js +++ b/js/src/tooltip.js @@ -1,5 +1,5 @@ -/* global Popper */ - +import $ from 'jquery' +import Popper from 'popper.js' import Util from './util' @@ -10,7 +10,7 @@ import Util from './util' * -------------------------------------------------------------------------- */ -const Tooltip = (($) => { +const Tooltip = (() => { /** * Check for Popper dependency @@ -728,6 +728,6 @@ const Tooltip = (($) => { return Tooltip -})(jQuery) +})(jQuery, Popper) export default Tooltip diff --git a/js/src/util.js b/js/src/util.js index cd3f1fb6a..b18d0f776 100644 --- a/js/src/util.js +++ b/js/src/util.js @@ -1,3 +1,5 @@ +import $ from 'jquery' + /** * -------------------------------------------------------------------------- * Bootstrap (v4.0.0-beta): util.js @@ -5,7 +7,7 @@ * -------------------------------------------------------------------------- */ -const Util = (($) => { +const Util = (() => { /** diff --git a/js/tests/.eslintrc.json b/js/tests/.eslintrc.json index a05a3a390..b03980144 100644 --- a/js/tests/.eslintrc.json +++ b/js/tests/.eslintrc.json @@ -28,6 +28,7 @@ "global-require": "off", "no-process-env": "off", "no-process-exit": "off", + "no-sync": "off", // Stylistic Issues "brace-style": "off", diff --git a/package-lock.json b/package-lock.json index 87ecfd220..ce5b579a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -513,6 +513,15 @@ "babel-runtime": "6.26.0" } }, + "babel-plugin-external-helpers": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-external-helpers/-/babel-plugin-external-helpers-6.22.0.tgz", + "integrity": "sha1-IoX0iwK9Xe3oUXXK+MYuhq3M76E=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, "babel-plugin-transform-es2015-arrow-functions": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", @@ -963,6 +972,15 @@ "repeat-element": "1.1.2" } }, + "browser-resolve": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", + "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", + "dev": true, + "requires": { + "resolve": "1.1.7" + } + }, "browserslist": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.3.3.tgz", @@ -1714,6 +1732,12 @@ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", "dev": true }, + "estree-walker": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.2.1.tgz", + "integrity": "sha1-va/oCVOD2EFNXcLs9MkXO225QS4=", + "dev": true + }, "esutils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", @@ -2987,6 +3011,12 @@ "is-extglob": "1.0.0" } }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", + "dev": true + }, "is-npm": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", @@ -4429,6 +4459,12 @@ "integrity": "sha1-WbcIwcAZCi9pLxx2GMRGsFL9F2I=", "dev": true }, + "popper.js": { + "version": "1.12.5", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.12.5.tgz", + "integrity": "sha512-6R2eXIy1xYukMNutoD+y/Gj0IpjEQhivyZonm5Vz0Fp8jdc7kvheKCvpM/t+PxqKb7VbLVnvPVEdTyslEb7f6w==", + "dev": true + }, "postcss": { "version": "6.0.9", "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.9.tgz", @@ -5238,6 +5274,43 @@ "glob": "7.1.2" } }, + "rollup": { + "version": "0.49.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.49.2.tgz", + "integrity": "sha512-9mySqItSwq5/dXYQyFGrrzqV282EZfz4kSCU2m4e6OjgqLmIsp9zK6qNQ6wbBWR4EhASEqQMBQ/IF45jaNPAtw==", + "dev": true + }, + "rollup-plugin-babel": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-3.0.2.tgz", + "integrity": "sha512-ALGPBFtwJZcYHsNPM6RGJlEncTzAARPvZOGjNPZgDe5hS5t6sJGjiOWibEFVEz5LQN7S7spvCBILaS4N1Cql2w==", + "dev": true, + "requires": { + "rollup-pluginutils": "1.5.2" + } + }, + "rollup-plugin-node-resolve": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.0.0.tgz", + "integrity": "sha1-i4l8TDAw1QASd7BRSyXSygloPuA=", + "dev": true, + "requires": { + "browser-resolve": "1.11.2", + "builtin-modules": "1.1.1", + "is-module": "1.0.0", + "resolve": "1.1.7" + } + }, + "rollup-pluginutils": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz", + "integrity": "sha1-HhVud4+UtyVb+hs9AXi+j1xVJAg=", + "dev": true, + "requires": { + "estree-walker": "0.2.1", + "minimatch": "3.0.4" + } + }, "run-async": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", diff --git a/package.json b/package.json index 640099946..6ae3476d1 100644 --- a/package.json +++ b/package.json @@ -33,9 +33,13 @@ "js-lint": "eslint js/ && eslint --config js/tests/.eslintrc.json --env node build/ Gruntfile.js", "js-lint-docs": "eslint --config js/tests/.eslintrc.json assets/js/ sw.js", "js-compile": "npm-run-all --parallel js-compile-*", - "js-compile-bundle": "shx cat js/src/util.js js/src/alert.js js/src/button.js js/src/carousel.js js/src/collapse.js js/src/dropdown.js js/src/modal.js js/src/scrollspy.js js/src/tab.js js/src/tooltip.js js/src/popover.js | shx sed \"s/^(import|export).*//\" | babel --filename js/src/bootstrap.js | node build/stamp.js > dist/js/bootstrap.js", - "js-compile-plugins": "babel js/src/ --out-dir js/dist/ --source-maps", - "js-minify": "uglifyjs --config-file build/uglifyjs.config.json --output dist/js/bootstrap.min.js dist/js/bootstrap.js", + "js-compile-standalone": "rollup --environment BUNDLE:false --config build/rollup.config.js", + "js-compile-bundle": "rollup --environment BUNDLE:true --config build/rollup.config.js", + "js-compile-plugins": "babel --no-babelrc js/src/ --out-dir js/dist/ --source-maps --presets=es2015 --plugins=transform-es2015-modules-strip", + "postjs-compile": "node build/stamp.js", + "js-minify": "npm-run-all --parallel js-minify-*", + "js-minify-standalone": "uglifyjs --config-file build/uglifyjs.config.json --output dist/js/bootstrap.min.js dist/js/bootstrap.js", + "js-minify-bundle": "uglifyjs --config-file build/uglifyjs.config.json --output dist/js/bootstrap.bundle.min.js dist/js/bootstrap.bundle.js", "js-minify-docs": "uglifyjs --config-file build/uglifyjs.config.json --output assets/js/docs.min.js assets/js/vendor/anchor.min.js assets/js/vendor/clipboard.min.js assets/js/vendor/holder.min.js assets/js/src/application.js assets/js/src/pwa.js", "js-test": "phantomjs ./node_modules/qunit-phantomjs-runner/runner.js js/tests/index.html 60", "js-test-cloud": "ruby -r webrick -e \"s = WEBrick::HTTPServer.new(:Port => 3000, :DocumentRoot => Dir.pwd, :Logger => WEBrick::Log.new('/dev/null'), :AccessLog => []); trap('INT') { s.shutdown }; s.start\" & grunt saucelabs-qunit", @@ -74,6 +78,7 @@ "autoprefixer": "^7.1.2", "babel-cli": "^6.24.1", "babel-eslint": "^7.2.3", + "babel-plugin-external-helpers": "^6.22.0", "babel-plugin-transform-es2015-modules-strip": "^0.1.1", "babel-preset-es2015": "^6.24.1", "clean-css-cli": "^4.1.6", @@ -86,9 +91,13 @@ "nodemon": "^1.11.0", "npm-run-all": "^4.0.2", "phantomjs-prebuilt": "^2.1.14", + "popper.js": "^1.12.5", "postcss-cli": "^4.1.0", "qunit-phantomjs-runner": "^2.3.0", "qunitjs": "^2.4.0", + "rollup": "^0.49.2", + "rollup-plugin-babel": "^3.0.2", + "rollup-plugin-node-resolve": "^3.0.0", "shelljs": "^0.7.8", "shx": "^0.2.2", "uglify-js": "^3.0.24" From c3fe53cd42d8055b596f287e37497bc65d52eecf Mon Sep 17 00:00:00 2001 From: Johann-S Date: Thu, 31 Aug 2017 19:00:51 +0200 Subject: [PATCH 20/79] Use rollup to add our copyright instead of a custom script --- build/rollup.config.js | 10 +++++++++- build/stamp.js | 19 ------------------- package.json | 1 - 3 files changed, 9 insertions(+), 21 deletions(-) delete mode 100644 build/stamp.js diff --git a/build/rollup.config.js b/build/rollup.config.js index 7cec6ef1c..d6eb0cf5d 100644 --- a/build/rollup.config.js +++ b/build/rollup.config.js @@ -1,7 +1,9 @@ const path = require('path') const babel = require('rollup-plugin-babel') const resolve = require('rollup-plugin-node-resolve') +const pkg = require(path.resolve(__dirname, '../package.json')) const BUNDLE = process.env.BUNDLE === 'true' +const year = new Date().getFullYear() var fileDest = 'bootstrap.js' var external = ['jquery', 'popper.js'] @@ -39,5 +41,11 @@ module.exports = { name: 'bootstrap', external: external, globals: globals, - plugins: plugins + plugins: plugins, + banner: `/*! + * Bootstrap v${pkg.version} (${pkg.homepage}) + * Copyright 2011-${year} ${pkg.author} + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + ` } diff --git a/build/stamp.js b/build/stamp.js deleted file mode 100644 index 2135c60a3..000000000 --- a/build/stamp.js +++ /dev/null @@ -1,19 +0,0 @@ -const fs = require('fs') -const path = require('path') -const pkg = require(path.resolve(__dirname, '../package.json')) -const year = new Date().getFullYear() - -const pathBoostrap = path.resolve(__dirname, '../dist/js/bootstrap.js') -const pathBootstrapBundle = path.resolve(__dirname, '../dist/js/bootstrap.bundle.js') -const contentFile = fs.readFileSync(pathBoostrap, { encoding: 'UTF8' }) -const contentBundleFile = fs.readFileSync(pathBootstrapBundle, { encoding: 'UTF8' }) - -const stamp = -`/*! - * Bootstrap v${pkg.version} (${pkg.homepage}) - * Copyright 2011-${year} ${pkg.author} - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ -` -fs.writeFileSync(pathBoostrap, `${stamp}${contentFile}`, { encoding: 'UTF8' }) -fs.writeFileSync(pathBootstrapBundle, `${stamp}${contentBundleFile}`, { encoding: 'UTF8' }) diff --git a/package.json b/package.json index 6ae3476d1..73ddb6906 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,6 @@ "js-compile-standalone": "rollup --environment BUNDLE:false --config build/rollup.config.js", "js-compile-bundle": "rollup --environment BUNDLE:true --config build/rollup.config.js", "js-compile-plugins": "babel --no-babelrc js/src/ --out-dir js/dist/ --source-maps --presets=es2015 --plugins=transform-es2015-modules-strip", - "postjs-compile": "node build/stamp.js", "js-minify": "npm-run-all --parallel js-minify-*", "js-minify-standalone": "uglifyjs --config-file build/uglifyjs.config.json --output dist/js/bootstrap.min.js dist/js/bootstrap.js", "js-minify-bundle": "uglifyjs --config-file build/uglifyjs.config.json --output dist/js/bootstrap.bundle.min.js dist/js/bootstrap.bundle.js", From a4667be152a3a4fed4e42f2a9efbf831bb5946b6 Mon Sep 17 00:00:00 2001 From: Johann-S Date: Thu, 31 Aug 2017 19:19:10 +0200 Subject: [PATCH 21/79] Regroup our jQuery check in the same IIFE --- js/src/index.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/js/src/index.js b/js/src/index.js index a3858dd24..84a27880e 100644 --- a/js/src/index.js +++ b/js/src/index.js @@ -18,11 +18,11 @@ import Util from './util' * -------------------------------------------------------------------------- */ -if (typeof jQuery === 'undefined') { - throw new Error('Bootstrap\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\'s JavaScript.') -} - (() => { + if (typeof jQuery === 'undefined') { + throw new Error('Bootstrap\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\'s JavaScript.') + } + const version = $.fn.jquery.split(' ')[0].split('.') const min = 3 const max = 4 From 346f60cbd99f8e7964024e7bd3bb96a576a53f47 Mon Sep 17 00:00:00 2001 From: Andres Galante Date: Fri, 25 Aug 2017 23:39:13 -0300 Subject: [PATCH 22/79] adds accecibility notes to breadcrumbs --- docs/4.0/components/breadcrumb.md | 45 +++++++++++++++++-------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/docs/4.0/components/breadcrumb.md b/docs/4.0/components/breadcrumb.md index eb286d847..7a4b5f44e 100644 --- a/docs/4.0/components/breadcrumb.md +++ b/docs/4.0/components/breadcrumb.md @@ -4,31 +4,36 @@ title: Breadcrumb description: Indicate the current page's location within a navigational hierarchy that automatically adds separators via CSS. group: components --- +## Overview Separators are automatically added in CSS through [`::before`](https://developer.mozilla.org/en-US/docs/Web/CSS/::before) and [`content`](https://developer.mozilla.org/en-US/docs/Web/CSS/content). {% example html %} - - - -{% endexample %} -Similar to our navigation components, breadcrumbs work fine with or without the usage of list markup. + -{% example html %} -
-
-
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip"},l={SHOW:"show",OUT:"out"},c={HIDE:"hide"+n,HIDDEN:"hidden"+n,SHOW:"show"+n,SHOWN:"shown"+n,INSERTED:"inserted"+n,CLICK:"click"+n,FOCUSIN:"focusin"+n,FOCUSOUT:"focusout"+n,MOUSEENTER:"mouseenter"+n,MOUSELEAVE:"mouseleave"+n},f={FADE:"fade",SHOW:"show"},h={TOOLTIP:".tooltip",TOOLTIP_INNER:".tooltip-inner",ARROW:".arrow"},u={HOVER:"hover",FOCUS:"focus",CLICK:"click",MANUAL:"manual"},d=function(){function i(t,e){q(this,i),this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}return i.prototype.enable=function(){this._isEnabled=!0},i.prototype.disable=function(){this._isEnabled=!1},i.prototype.toggleEnabled=function(){this._isEnabled=!this._isEnabled},i.prototype.toggle=function(t){if(this._isEnabled)if(t){var n=this.constructor.DATA_KEY,i=e(t.currentTarget).data(n);i||(i=new this.constructor(t.currentTarget,this._getDelegateConfig()),e(t.currentTarget).data(n,i)),i._activeTrigger.click=!i._activeTrigger.click,i._isWithActiveTrigger()?i._enter(null,i):i._leave(null,i)}else{if(e(this.getTipElement()).hasClass(f.SHOW))return void this._leave(null,this);this._enter(null,this)}},i.prototype.dispose=function(){clearTimeout(this._timeout),e.removeData(this.element,this.constructor.DATA_KEY),e(this.element).off(this.constructor.EVENT_KEY),e(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&e(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,null!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},i.prototype.show=function(){var t=this;if("none"===e(this.element).css("display"))throw new Error("Please use show on visible elements");var n=e.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){e(this.element).trigger(n);var o=e.contains(this.element.ownerDocument.documentElement,this.element);if(n.isDefaultPrevented()||!o)return;var r=this.getTipElement(),s=Y.getUID(this.constructor.NAME);r.setAttribute("id",s),this.element.setAttribute("aria-describedby",s),this.setContent(),this.config.animation&&e(r).addClass(f.FADE);var a="function"==typeof this.config.placement?this.config.placement.call(this,r,this.element):this.config.placement,c=this._getAttachment(a);this.addAttachmentClass(c);var u=!1===this.config.container?document.body:e(this.config.container);e(r).data(this.constructor.DATA_KEY,this),e.contains(this.element.ownerDocument.documentElement,this.tip)||e(r).appendTo(u),e(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new Et(this.element,r,{placement:c,modifiers:{offset:{offset:this.config.offset},flip:{behavior:this.config.fallbackPlacement},arrow:{element:h.ARROW}},onCreate:function(e){e.originalPlacement!==e.placement&&t._handlePopperPlacementChange(e)},onUpdate:function(e){t._handlePopperPlacementChange(e)}}),e(r).addClass(f.SHOW),"ontouchstart"in document.documentElement&&e("body").children().on("mouseover",null,e.noop);var d=function(){t.config.animation&&t._fixTransition();var n=t._hoverState;t._hoverState=null,e(t.element).trigger(t.constructor.Event.SHOWN),n===l.OUT&&t._leave(null,t)};Y.supportsTransitionEnd()&&e(this.tip).hasClass(f.FADE)?e(this.tip).one(Y.TRANSITION_END,d).emulateTransitionEnd(i._TRANSITION_DURATION):d()}},i.prototype.hide=function(t){var n=this,i=this.getTipElement(),o=e.Event(this.constructor.Event.HIDE),r=function(){n._hoverState!==l.SHOW&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),e(n.element).trigger(n.constructor.Event.HIDDEN),null!==n._popper&&n._popper.destroy(),t&&t()};e(this.element).trigger(o),o.isDefaultPrevented()||(e(i).removeClass(f.SHOW),"ontouchstart"in document.documentElement&&e("body").children().off("mouseover",null,e.noop),this._activeTrigger[u.CLICK]=!1,this._activeTrigger[u.FOCUS]=!1,this._activeTrigger[u.HOVER]=!1,Y.supportsTransitionEnd()&&e(this.tip).hasClass(f.FADE)?e(i).one(Y.TRANSITION_END,r).emulateTransitionEnd(150):r(),this._hoverState="")},i.prototype.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},i.prototype.isWithContent=function(){return Boolean(this.getTitle())},i.prototype.addAttachmentClass=function(t){e(this.getTipElement()).addClass("bs-tooltip-"+t)},i.prototype.getTipElement=function(){return this.tip=this.tip||e(this.config.template)[0],this.tip},i.prototype.setContent=function(){var t=e(this.getTipElement());this.setElementContent(t.find(h.TOOLTIP_INNER),this.getTitle()),t.removeClass(f.FADE+" "+f.SHOW)},i.prototype.setElementContent=function(t,n){var i=this.config.html;"object"===("undefined"==typeof n?"undefined":X(n))&&(n.nodeType||n.jquery)?i?e(n).parent().is(t)||t.empty().append(n):t.text(e(n).text()):t[i?"html":"text"](n)},i.prototype.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},i.prototype._getAttachment=function(t){return s[t.toUpperCase()]},i.prototype._setListeners=function(){var t=this;this.config.trigger.split(" ").forEach(function(n){if("click"===n)e(t.element).on(t.constructor.Event.CLICK,t.config.selector,function(e){return t.toggle(e)});else if(n!==u.MANUAL){var i=n===u.HOVER?t.constructor.Event.MOUSEENTER:t.constructor.Event.FOCUSIN,o=n===u.HOVER?t.constructor.Event.MOUSELEAVE:t.constructor.Event.FOCUSOUT;e(t.element).on(i,t.config.selector,function(e){return t._enter(e)}).on(o,t.config.selector,function(e){return t._leave(e)})}e(t.element).closest(".modal").on("hide.bs.modal",function(){return t.hide()})}),this.config.selector?this.config=e.extend({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},i.prototype._fixTitle=function(){var t=X(this.element.getAttribute("data-original-title"));(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},i.prototype._enter=function(t,n){var i=this.constructor.DATA_KEY;(n=n||e(t.currentTarget).data(i))||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),e(t.currentTarget).data(i,n)),t&&(n._activeTrigger["focusin"===t.type?u.FOCUS:u.HOVER]=!0),e(n.getTipElement()).hasClass(f.SHOW)||n._hoverState===l.SHOW?n._hoverState=l.SHOW:(clearTimeout(n._timeout),n._hoverState=l.SHOW,n.config.delay&&n.config.delay.show?n._timeout=setTimeout(function(){n._hoverState===l.SHOW&&n.show()},n.config.delay.show):n.show())},i.prototype._leave=function(t,n){var i=this.constructor.DATA_KEY;(n=n||e(t.currentTarget).data(i))||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),e(t.currentTarget).data(i,n)),t&&(n._activeTrigger["focusout"===t.type?u.FOCUS:u.HOVER]=!1),n._isWithActiveTrigger()||(clearTimeout(n._timeout),n._hoverState=l.OUT,n.config.delay&&n.config.delay.hide?n._timeout=setTimeout(function(){n._hoverState===l.OUT&&n.hide()},n.config.delay.hide):n.hide())},i.prototype._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},i.prototype._getConfig=function(n){return(n=e.extend({},this.constructor.Default,e(this.element).data(),n)).delay&&"number"==typeof n.delay&&(n.delay={show:n.delay,hide:n.delay}),n.title&&"number"==typeof n.title&&(n.title=n.title.toString()),n.content&&"number"==typeof n.content&&(n.content=n.content.toString()),Y.typeCheckConfig(t,n,this.constructor.DefaultType),n},i.prototype._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},i.prototype._cleanTipClass=function(){var t=e(this.getTipElement()),n=t.attr("class").match(o);null!==n&&n.length>0&&t.removeClass(n.join(""))},i.prototype._handlePopperPlacementChange=function(t){this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},i.prototype._fixTransition=function(){var t=this.getTipElement(),n=this.config.animation;null===t.getAttribute("x-placement")&&(e(t).removeClass(f.FADE),this.config.animation=!1,this.hide(),this.show(),this.config.animation=n)},i._jQueryInterface=function(t){return this.each(function(){var n=e(this).data("bs.tooltip"),o="object"===("undefined"==typeof t?"undefined":X(t))&&t;if((n||!/dispose|hide/.test(t))&&(n||(n=new i(this,o),e(this).data("bs.tooltip",n)),"string"==typeof t)){if("undefined"==typeof n[t])throw new Error('No method named "'+t+'"');n[t]()}})},z(i,null,[{key:"VERSION",get:function(){return"4.0.0-beta"}},{key:"Default",get:function(){return a}},{key:"NAME",get:function(){return t}},{key:"DATA_KEY",get:function(){return"bs.tooltip"}},{key:"Event",get:function(){return c}},{key:"EVENT_KEY",get:function(){return n}},{key:"DefaultType",get:function(){return r}}]),i}();return e.fn[t]=d._jQueryInterface,e.fn[t].Constructor=d,e.fn[t].noConflict=function(){return e.fn[t]=i,d._jQueryInterface},d}(jQuery),Ct=function(){var t="popover",n=".bs.popover",i=e.fn[t],o=new RegExp("(^|\\s)bs-popover\\S+","g"),r=e.extend({},bt.Default,{placement:"right",trigger:"click",content:"",template:''}),s=e.extend({},bt.DefaultType,{content:"(string|element|function)"}),a={FADE:"fade",SHOW:"show"},l={TITLE:".popover-header",CONTENT:".popover-body"},c={HIDE:"hide"+n,HIDDEN:"hidden"+n,SHOW:"show"+n,SHOWN:"shown"+n,INSERTED:"inserted"+n,CLICK:"click"+n,FOCUSIN:"focusin"+n,FOCUSOUT:"focusout"+n,MOUSEENTER:"mouseenter"+n,MOUSELEAVE:"mouseleave"+n},f=function(i){function f(){return q(this,f),J(this,i.apply(this,arguments))}return Z(f,i),f.prototype.isWithContent=function(){return this.getTitle()||this._getContent()},f.prototype.addAttachmentClass=function(t){e(this.getTipElement()).addClass("bs-popover-"+t)},f.prototype.getTipElement=function(){return this.tip=this.tip||e(this.config.template)[0],this.tip},f.prototype.setContent=function(){var t=e(this.getTipElement());this.setElementContent(t.find(l.TITLE),this.getTitle()),this.setElementContent(t.find(l.CONTENT),this._getContent()),t.removeClass(a.FADE+" "+a.SHOW)},f.prototype._getContent=function(){return this.element.getAttribute("data-content")||("function"==typeof this.config.content?this.config.content.call(this.element):this.config.content)},f.prototype._cleanTipClass=function(){var t=e(this.getTipElement()),n=t.attr("class").match(o);null!==n&&n.length>0&&t.removeClass(n.join(""))},f._jQueryInterface=function(t){return this.each(function(){var n=e(this).data("bs.popover"),i="object"===("undefined"==typeof t?"undefined":X(t))?t:null;if((n||!/destroy|hide/.test(t))&&(n||(n=new f(this,i),e(this).data("bs.popover",n)),"string"==typeof t)){if("undefined"==typeof n[t])throw new Error('No method named "'+t+'"');n[t]()}})},z(f,null,[{key:"VERSION",get:function(){return"4.0.0-beta"}},{key:"Default",get:function(){return r}},{key:"NAME",get:function(){return t}},{key:"DATA_KEY",get:function(){return"bs.popover"}},{key:"Event",get:function(){return c}},{key:"EVENT_KEY",get:function(){return n}},{key:"DefaultType",get:function(){return s}}]),f}(bt);return e.fn[t]=f._jQueryInterface,e.fn[t].Constructor=f,e.fn[t].noConflict=function(){return e.fn[t]=i,f._jQueryInterface},f}(jQuery),At=function(){var t="scrollspy",n=e.fn[t],i={offset:10,method:"auto",target:""},o={offset:"number",method:"string",target:"(string|element)"},r={ACTIVATE:"activate.bs.scrollspy",SCROLL:"scroll.bs.scrollspy",LOAD_DATA_API:"load.bs.scrollspy.data-api"},s={DROPDOWN_ITEM:"dropdown-item",DROPDOWN_MENU:"dropdown-menu",ACTIVE:"active"},a={DATA_SPY:'[data-spy="scroll"]',ACTIVE:".active",NAV_LIST_GROUP:".nav, .list-group",NAV_LINKS:".nav-link",LIST_ITEMS:".list-group-item",DROPDOWN:".dropdown",DROPDOWN_ITEMS:".dropdown-item",DROPDOWN_TOGGLE:".dropdown-toggle"},l={OFFSET:"offset",POSITION:"position"},c=function(){function n(t,i){var o=this;q(this,n),this._element=t,this._scrollElement="BODY"===t.tagName?window:t,this._config=this._getConfig(i),this._selector=this._config.target+" "+a.NAV_LINKS+","+this._config.target+" "+a.LIST_ITEMS+","+this._config.target+" "+a.DROPDOWN_ITEMS,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,e(this._scrollElement).on(r.SCROLL,function(t){return o._process(t)}),this.refresh(),this._process()}return n.prototype.refresh=function(){var t=this,n=this._scrollElement!==this._scrollElement.window?l.POSITION:l.OFFSET,i="auto"===this._config.method?n:this._config.method,o=i===l.POSITION?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),e.makeArray(e(this._selector)).map(function(t){var n=void 0,r=Y.getSelectorFromElement(t);if(r&&(n=e(r)[0]),n){var s=n.getBoundingClientRect();if(s.width||s.height)return[e(n)[i]().top+o,r]}return null}).filter(function(t){return t}).sort(function(t,e){return t[0]-e[0]}).forEach(function(e){t._offsets.push(e[0]),t._targets.push(e[1])})},n.prototype.dispose=function(){e.removeData(this._element,"bs.scrollspy"),e(this._scrollElement).off(".bs.scrollspy"),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},n.prototype._getConfig=function(n){if("string"!=typeof(n=e.extend({},i,n)).target){var r=e(n.target).attr("id");r||(r=Y.getUID(t),e(n.target).attr("id",r)),n.target="#"+r}return Y.typeCheckConfig(t,n,o),n},n.prototype._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},n.prototype._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},n.prototype._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},n.prototype._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;)this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||t li > .active",DATA_TOGGLE:'[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',DROPDOWN_TOGGLE:".dropdown-toggle",DROPDOWN_ACTIVE_CHILD:"> .dropdown-menu .active"},r=function(){function t(e){q(this,t),this._element=e}return t.prototype.show=function(){var t=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&e(this._element).hasClass(i.ACTIVE)||e(this._element).hasClass(i.DISABLED))){var r=void 0,s=void 0,a=e(this._element).closest(o.NAV_LIST_GROUP)[0],l=Y.getSelectorFromElement(this._element);if(a){var c="UL"===a.nodeName?o.ACTIVE_UL:o.ACTIVE;s=e.makeArray(e(a).find(c)),s=s[s.length-1]}var f=e.Event(n.HIDE,{relatedTarget:this._element}),h=e.Event(n.SHOW,{relatedTarget:s});if(s&&e(s).trigger(f),e(this._element).trigger(h),!h.isDefaultPrevented()&&!f.isDefaultPrevented()){l&&(r=e(l)[0]),this._activate(this._element,a);var u=function(){var i=e.Event(n.HIDDEN,{relatedTarget:t._element}),o=e.Event(n.SHOWN,{relatedTarget:s});e(s).trigger(i),e(t._element).trigger(o)};r?this._activate(r,r.parentNode,u):u()}}},t.prototype.dispose=function(){e.removeData(this._element,"bs.tab"),this._element=null},t.prototype._activate=function(t,n,r){var s=this,a=void 0,l=(a="UL"===n.nodeName?e(n).find(o.ACTIVE_UL):e(n).children(o.ACTIVE))[0],c=r&&Y.supportsTransitionEnd()&&l&&e(l).hasClass(i.FADE),f=function(){return s._transitionComplete(t,l,c,r)};l&&c?e(l).one(Y.TRANSITION_END,f).emulateTransitionEnd(150):f(),l&&e(l).removeClass(i.SHOW)},t.prototype._transitionComplete=function(t,n,r,s){if(n){e(n).removeClass(i.ACTIVE);var a=e(n.parentNode).find(o.DROPDOWN_ACTIVE_CHILD)[0];a&&e(a).removeClass(i.ACTIVE),n.setAttribute("aria-expanded",!1)}if(e(t).addClass(i.ACTIVE),t.setAttribute("aria-expanded",!0),r?(Y.reflow(t),e(t).addClass(i.SHOW)):e(t).removeClass(i.FADE),t.parentNode&&e(t.parentNode).hasClass(i.DROPDOWN_MENU)){var l=e(t).closest(o.DROPDOWN)[0];l&&e(l).find(o.DROPDOWN_TOGGLE).addClass(i.ACTIVE),t.setAttribute("aria-expanded",!0)}s&&s()},t._jQueryInterface=function(n){return this.each(function(){var i=e(this),o=i.data("bs.tab");if(o||(o=new t(this),i.data("bs.tab",o)),"string"==typeof n){if("undefined"==typeof o[n])throw new Error('No method named "'+n+'"');o[n]()}})},z(t,null,[{key:"VERSION",get:function(){return"4.0.0-beta"}}]),t}();return e(document).on(n.CLICK_DATA_API,o.DATA_TOGGLE,function(t){t.preventDefault(),r._jQueryInterface.call(e(this),"show")}),e.fn.tab=r._jQueryInterface,e.fn.tab.Constructor=r,e.fn.tab.noConflict=function(){return e.fn.tab=t,r._jQueryInterface},r}(jQuery);return function(){if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.");var t=e.fn.jquery.split(" ")[0].split(".");if(t[0]<3||t[0]>=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v3.0.0 but less than v4.0.0")}(jQuery),t.Util=Y,t.Alert=$,t.Button=tt,t.Carousel=et,t.Collapse=nt,t.Dropdown=Tt,t.Modal=yt,t.Popover=Ct,t.Scrollspy=At,t.Tab=Ot,t.Tooltip=bt,t}({},$); \ No newline at end of file diff --git a/dist/js/bootstrap.js b/dist/js/bootstrap.js index c2fbb790c..fe7ce857f 100644 --- a/dist/js/bootstrap.js +++ b/dist/js/bootstrap.js @@ -1,30 +1,14 @@ /*! - * Bootstrap v4.0.0-beta (https://getbootstrap.com) - * Copyright 2011-2017 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ + * Bootstrap v4.0.0-beta (https://getbootstrap.com) + * Copyright 2011-2017 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +var bootstrap = (function (exports,$,Popper) { +'use strict'; -if (typeof jQuery === 'undefined') { - throw new Error('Bootstrap\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\'s JavaScript.') -} - -(function ($) { - 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] >= 4)) { - throw new Error('Bootstrap\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0') - } -})(jQuery); - -(function () { -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +$ = $ && $.hasOwnProperty('default') ? $['default'] : $; +Popper = Popper && Popper.hasOwnProperty('default') ? Popper['default'] : Popper; /** * -------------------------------------------------------------------------- @@ -33,7 +17,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons * -------------------------------------------------------------------------- */ -var Util = function ($) { +var Util = function () { /** * ------------------------------------------------------------------------ @@ -68,7 +52,7 @@ var Util = function ($) { if ($(event.target).is(this)) { return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params } - return undefined; + return undefined; // eslint-disable-line no-undefined } }; } @@ -81,7 +65,7 @@ var Util = function ($) { var el = document.createElement('bootstrap'); for (var name in TransitionEndEvent) { - if (el.style[name] !== undefined) { + if (typeof el.style[name] !== 'undefined') { return { end: TransitionEndEvent[name] }; @@ -143,7 +127,7 @@ var Util = function ($) { } try { - var $selector = $(selector); + var $selector = $(document).find(selector); return $selector.length > 0 ? selector : null; } catch (error) { return null; @@ -160,7 +144,7 @@ var Util = function ($) { }, typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) { for (var property in configTypes) { - if (configTypes.hasOwnProperty(property)) { + if (Object.prototype.hasOwnProperty.call(configTypes, property)) { var expectedTypes = configTypes[property]; var value = config[property]; var valueType = value && isElement(value) ? 'element' : toType(value); @@ -178,6 +162,63 @@ var Util = function ($) { return Util; }(jQuery); +var babelHelpers = {}; +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { + return typeof obj; +} : function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; +}; + +var classCallCheck = function (instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +}; + +var createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; +}(); + +var inherits = function (subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + enumerable: false, + writable: true, + configurable: true + } + }); + if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; +}; + +var possibleConstructorReturn = function (self, call) { + if (!self) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return call && (typeof call === "object" || typeof call === "function") ? call : self; +}; + +babelHelpers; + /** * -------------------------------------------------------------------------- * Bootstrap (v4.0.0-beta): alert.js @@ -185,7 +226,7 @@ var Util = function ($) { * -------------------------------------------------------------------------- */ -var Alert = function ($) { +var Alert = function () { /** * ------------------------------------------------------------------------ @@ -225,7 +266,7 @@ var Alert = function ($) { }; var Alert = function () { function Alert(element) { - _classCallCheck(this, Alert); + classCallCheck(this, Alert); this._element = element; } @@ -277,7 +318,7 @@ var Alert = function ($) { }; Alert.prototype._removeElement = function _removeElement(element) { - var _this2 = this; + var _this = this; $(element).removeClass(ClassName.SHOW); @@ -287,7 +328,7 @@ var Alert = function ($) { } $(element).one(Util.TRANSITION_END, function (event) { - return _this2._destroyElement(element, event); + return _this._destroyElement(element, event); }).emulateTransitionEnd(TRANSITION_DURATION); }; @@ -323,13 +364,12 @@ var Alert = function ($) { }; }; - _createClass(Alert, null, [{ + createClass(Alert, null, [{ key: 'VERSION', get: function get() { return VERSION; } }]); - return Alert; }(); @@ -364,7 +404,7 @@ var Alert = function ($) { * -------------------------------------------------------------------------- */ -var Button = function ($) { +var Button = function () { /** * ------------------------------------------------------------------------ @@ -406,7 +446,7 @@ var Button = function ($) { }; var Button = function () { function Button(element) { - _classCallCheck(this, Button); + classCallCheck(this, Button); this._element = element; } @@ -480,13 +520,12 @@ var Button = function ($) { }); }; - _createClass(Button, null, [{ + createClass(Button, null, [{ key: 'VERSION', get: function get() { return VERSION; } }]); - return Button; }(); @@ -534,7 +573,7 @@ var Button = function ($) { * -------------------------------------------------------------------------- */ -var Carousel = function ($) { +var Carousel = function () { /** * ------------------------------------------------------------------------ @@ -616,7 +655,7 @@ var Carousel = function ($) { }; var Carousel = function () { function Carousel(element, config) { - _classCallCheck(this, Carousel); + classCallCheck(this, Carousel); this._items = null; this._interval = null; @@ -688,7 +727,7 @@ var Carousel = function ($) { }; Carousel.prototype.to = function to(index) { - var _this3 = this; + var _this = this; this._activeElement = $(this._element).find(Selector.ACTIVE_ITEM)[0]; @@ -700,7 +739,7 @@ var Carousel = function ($) { if (this._isSliding) { $(this._element).one(Event.SLID, function () { - return _this3.to(index); + return _this.to(index); }); return; } @@ -739,19 +778,19 @@ var Carousel = function ($) { }; Carousel.prototype._addEventListeners = function _addEventListeners() { - var _this4 = this; + var _this2 = this; if (this._config.keyboard) { $(this._element).on(Event.KEYDOWN, function (event) { - return _this4._keydown(event); + return _this2._keydown(event); }); } if (this._config.pause === 'hover') { $(this._element).on(Event.MOUSEENTER, function (event) { - return _this4.pause(event); + return _this2.pause(event); }).on(Event.MOUSELEAVE, function (event) { - return _this4.cycle(event); + return _this2.cycle(event); }); if ('ontouchstart' in document.documentElement) { // if it's a touch-enabled device, mouseenter/leave are fired as @@ -762,13 +801,13 @@ var Carousel = function ($) { // is NOT fired) and after a timeout (to allow for mouse compatibility // events to fire) we explicitly restart cycling $(this._element).on(Event.TOUCHEND, function () { - _this4.pause(); - if (_this4.touchTimeout) { - clearTimeout(_this4.touchTimeout); + _this2.pause(); + if (_this2.touchTimeout) { + clearTimeout(_this2.touchTimeout); } - _this4.touchTimeout = setTimeout(function (event) { - return _this4.cycle(event); - }, TOUCHEVENT_COMPAT_WAIT + _this4._config.interval); + _this2.touchTimeout = setTimeout(function (event) { + return _this2.cycle(event); + }, TOUCHEVENT_COMPAT_WAIT + _this2._config.interval); }); } } @@ -843,7 +882,7 @@ var Carousel = function ($) { }; Carousel.prototype._slide = function _slide(direction, element) { - var _this5 = this; + var _this3 = this; var activeElement = $(this._element).find(Selector.ACTIVE_ITEM)[0]; var activeElementIndex = this._getItemIndex(activeElement); @@ -909,10 +948,10 @@ var Carousel = function ($) { $(activeElement).removeClass(ClassName.ACTIVE + ' ' + orderClassName + ' ' + directionalClassName); - _this5._isSliding = false; + _this3._isSliding = false; setTimeout(function () { - return $(_this5._element).trigger(slidEvent); + return $(_this3._element).trigger(slidEvent); }, 0); }).emulateTransitionEnd(TRANSITION_DURATION); } else { @@ -949,7 +988,7 @@ var Carousel = function ($) { if (typeof config === 'number') { data.to(config); } else if (typeof action === 'string') { - if (data[action] === undefined) { + if (typeof data[action] === 'undefined') { throw new Error('No method named "' + action + '"'); } data[action](); @@ -989,7 +1028,7 @@ var Carousel = function ($) { event.preventDefault(); }; - _createClass(Carousel, null, [{ + createClass(Carousel, null, [{ key: 'VERSION', get: function get() { return VERSION; @@ -1000,7 +1039,6 @@ var Carousel = function ($) { return Default; } }]); - return Carousel; }(); @@ -1042,7 +1080,7 @@ var Carousel = function ($) { * -------------------------------------------------------------------------- */ -var Collapse = function ($) { +var Collapse = function () { /** * ------------------------------------------------------------------------ @@ -1101,7 +1139,7 @@ var Collapse = function ($) { }; var Collapse = function () { function Collapse(element, config) { - _classCallCheck(this, Collapse); + classCallCheck(this, Collapse); this._isTransitioning = false; this._element = element; @@ -1140,7 +1178,7 @@ var Collapse = function ($) { }; Collapse.prototype.show = function show() { - var _this6 = this; + var _this = this; if (this._isTransitioning || $(this._element).hasClass(ClassName.SHOW)) { return; @@ -1189,13 +1227,13 @@ var Collapse = function ($) { this.setTransitioning(true); var complete = function complete() { - $(_this6._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.SHOW); + $(_this._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.SHOW); - _this6._element.style[dimension] = ''; + _this._element.style[dimension] = ''; - _this6.setTransitioning(false); + _this.setTransitioning(false); - $(_this6._element).trigger(Event.SHOWN); + $(_this._element).trigger(Event.SHOWN); }; if (!Util.supportsTransitionEnd()) { @@ -1212,7 +1250,7 @@ var Collapse = function ($) { }; Collapse.prototype.hide = function hide() { - var _this7 = this; + var _this2 = this; if (this._isTransitioning || !$(this._element).hasClass(ClassName.SHOW)) { return; @@ -1248,8 +1286,8 @@ var Collapse = function ($) { this.setTransitioning(true); var complete = function complete() { - _this7.setTransitioning(false); - $(_this7._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).trigger(Event.HIDDEN); + _this2.setTransitioning(false); + $(_this2._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).trigger(Event.HIDDEN); }; this._element.style[dimension] = ''; @@ -1291,13 +1329,13 @@ var Collapse = function ($) { }; Collapse.prototype._getParent = function _getParent() { - var _this8 = this; + var _this3 = this; var parent = $(this._config.parent)[0]; var selector = '[data-toggle="collapse"][data-parent="' + this._config.parent + '"]'; $(parent).find(selector).each(function (i, element) { - _this8._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]); + _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]); }); return parent; @@ -1336,7 +1374,7 @@ var Collapse = function ($) { } if (typeof config === 'string') { - if (data[config] === undefined) { + if (typeof data[config] === 'undefined') { throw new Error('No method named "' + config + '"'); } data[config](); @@ -1344,7 +1382,7 @@ var Collapse = function ($) { }); }; - _createClass(Collapse, null, [{ + createClass(Collapse, null, [{ key: 'VERSION', get: function get() { return VERSION; @@ -1355,7 +1393,6 @@ var Collapse = function ($) { return Default; } }]); - return Collapse; }(); @@ -1366,7 +1403,8 @@ var Collapse = function ($) { */ $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) { - if (!/input|textarea/i.test(event.target.tagName)) { + // preventDefault only for elements (which change the URL) not inside the collapsible element + if (event.target.tagName === 'A' && !$.contains(this, event.target)) { event.preventDefault(); } @@ -1396,8 +1434,6 @@ var Collapse = function ($) { return Collapse; }(jQuery); -/* global Popper */ - /** * -------------------------------------------------------------------------- * Bootstrap (v4.0.0-beta): dropdown.js @@ -1405,7 +1441,7 @@ var Collapse = function ($) { * -------------------------------------------------------------------------- */ -var Dropdown = function ($) { +var Dropdown = function () { /** * Check for Popper dependency @@ -1489,7 +1525,7 @@ var Dropdown = function ($) { }; var Dropdown = function () { function Dropdown(element, config) { - _classCallCheck(this, Dropdown); + classCallCheck(this, Dropdown); this._element = element; this._popper = null; @@ -1574,18 +1610,18 @@ var Dropdown = function ($) { // private Dropdown.prototype._addEventListeners = function _addEventListeners() { - var _this9 = this; + var _this = this; $(this._element).on(Event.CLICK, function (event) { event.preventDefault(); event.stopPropagation(); - _this9.toggle(); + _this.toggle(); }); }; Dropdown.prototype._getConfig = function _getConfig(config) { var elementData = $(this._element).data(); - if (elementData.placement !== undefined) { + if (typeof elementData.placement !== 'undefined') { elementData.placement = AttachmentMap[elementData.placement.toUpperCase()]; } @@ -1658,7 +1694,7 @@ var Dropdown = function ($) { } if (typeof config === 'string') { - if (data[config] === undefined) { + if (typeof data[config] === 'undefined') { throw new Error('No method named "' + config + '"'); } data[config](); @@ -1773,7 +1809,7 @@ var Dropdown = function ($) { items[index].focus(); }; - _createClass(Dropdown, null, [{ + createClass(Dropdown, null, [{ key: 'VERSION', get: function get() { return VERSION; @@ -1789,7 +1825,6 @@ var Dropdown = function ($) { return DefaultType; } }]); - return Dropdown; }(); @@ -1821,7 +1856,7 @@ var Dropdown = function ($) { }; return Dropdown; -}(jQuery); +}(jQuery, Popper); /** * -------------------------------------------------------------------------- @@ -1830,7 +1865,7 @@ var Dropdown = function ($) { * -------------------------------------------------------------------------- */ -var Modal = function ($) { +var Modal = function () { /** * ------------------------------------------------------------------------ @@ -1889,6 +1924,7 @@ var Modal = function ($) { DATA_TOGGLE: '[data-toggle="modal"]', DATA_DISMISS: '[data-dismiss="modal"]', FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top', + STICKY_CONTENT: '.sticky-top', NAVBAR_TOGGLER: '.navbar-toggler' /** @@ -1900,7 +1936,7 @@ var Modal = function ($) { }; var Modal = function () { function Modal(element, config) { - _classCallCheck(this, Modal); + classCallCheck(this, Modal); this._config = this._getConfig(config); this._element = element; @@ -1922,7 +1958,7 @@ var Modal = function ($) { }; Modal.prototype.show = function show(relatedTarget) { - var _this10 = this; + var _this = this; if (this._isTransitioning) { return; @@ -1947,30 +1983,32 @@ var Modal = function ($) { this._checkScrollbar(); this._setScrollbar(); + this._adjustDialog(); + $(document.body).addClass(ClassName.OPEN); this._setEscapeEvent(); this._setResizeEvent(); $(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, function (event) { - return _this10.hide(event); + return _this.hide(event); }); $(this._dialog).on(Event.MOUSEDOWN_DISMISS, function () { - $(_this10._element).one(Event.MOUSEUP_DISMISS, function (event) { - if ($(event.target).is(_this10._element)) { - _this10._ignoreBackdropClick = true; + $(_this._element).one(Event.MOUSEUP_DISMISS, function (event) { + if ($(event.target).is(_this._element)) { + _this._ignoreBackdropClick = true; } }); }); this._showBackdrop(function () { - return _this10._showElement(relatedTarget); + return _this._showElement(relatedTarget); }); }; Modal.prototype.hide = function hide(event) { - var _this11 = this; + var _this2 = this; if (event) { event.preventDefault(); @@ -2009,7 +2047,7 @@ var Modal = function ($) { if (transition) { $(this._element).one(Util.TRANSITION_END, function (event) { - return _this11._hideModal(event); + return _this2._hideModal(event); }).emulateTransitionEnd(TRANSITION_DURATION); } else { this._hideModal(); @@ -2044,7 +2082,7 @@ var Modal = function ($) { }; Modal.prototype._showElement = function _showElement(relatedTarget) { - var _this12 = this; + var _this3 = this; var transition = Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE); @@ -2072,11 +2110,11 @@ var Modal = function ($) { }); var transitionComplete = function transitionComplete() { - if (_this12._config.focus) { - _this12._element.focus(); + if (_this3._config.focus) { + _this3._element.focus(); } - _this12._isTransitioning = false; - $(_this12._element).trigger(shownEvent); + _this3._isTransitioning = false; + $(_this3._element).trigger(shownEvent); }; if (transition) { @@ -2087,24 +2125,24 @@ var Modal = function ($) { }; Modal.prototype._enforceFocus = function _enforceFocus() { - var _this13 = this; + var _this4 = this; $(document).off(Event.FOCUSIN) // guard against infinite focus loop .on(Event.FOCUSIN, function (event) { - if (document !== event.target && _this13._element !== event.target && !$(_this13._element).has(event.target).length) { - _this13._element.focus(); + if (document !== event.target && _this4._element !== event.target && !$(_this4._element).has(event.target).length) { + _this4._element.focus(); } }); }; Modal.prototype._setEscapeEvent = function _setEscapeEvent() { - var _this14 = this; + var _this5 = this; if (this._isShown && this._config.keyboard) { $(this._element).on(Event.KEYDOWN_DISMISS, function (event) { if (event.which === ESCAPE_KEYCODE) { event.preventDefault(); - _this14.hide(); + _this5.hide(); } }); } else if (!this._isShown) { @@ -2113,11 +2151,11 @@ var Modal = function ($) { }; Modal.prototype._setResizeEvent = function _setResizeEvent() { - var _this15 = this; + var _this6 = this; if (this._isShown) { $(window).on(Event.RESIZE, function (event) { - return _this15.handleUpdate(event); + return _this6.handleUpdate(event); }); } else { $(window).off(Event.RESIZE); @@ -2125,16 +2163,16 @@ var Modal = function ($) { }; Modal.prototype._hideModal = function _hideModal() { - var _this16 = this; + var _this7 = this; this._element.style.display = 'none'; this._element.setAttribute('aria-hidden', true); this._isTransitioning = false; this._showBackdrop(function () { $(document.body).removeClass(ClassName.OPEN); - _this16._resetAdjustments(); - _this16._resetScrollbar(); - $(_this16._element).trigger(Event.HIDDEN); + _this7._resetAdjustments(); + _this7._resetScrollbar(); + $(_this7._element).trigger(Event.HIDDEN); }); }; @@ -2146,7 +2184,7 @@ var Modal = function ($) { }; Modal.prototype._showBackdrop = function _showBackdrop(callback) { - var _this17 = this; + var _this8 = this; var animate = $(this._element).hasClass(ClassName.FADE) ? ClassName.FADE : ''; @@ -2163,17 +2201,17 @@ var Modal = function ($) { $(this._backdrop).appendTo(document.body); $(this._element).on(Event.CLICK_DISMISS, function (event) { - if (_this17._ignoreBackdropClick) { - _this17._ignoreBackdropClick = false; + if (_this8._ignoreBackdropClick) { + _this8._ignoreBackdropClick = false; return; } if (event.target !== event.currentTarget) { return; } - if (_this17._config.backdrop === 'static') { - _this17._element.focus(); + if (_this8._config.backdrop === 'static') { + _this8._element.focus(); } else { - _this17.hide(); + _this8.hide(); } }); @@ -2197,7 +2235,7 @@ var Modal = function ($) { $(this._backdrop).removeClass(ClassName.SHOW); var callbackRemove = function callbackRemove() { - _this17._removeBackdrop(); + _this8._removeBackdrop(); if (callback) { callback(); } @@ -2236,12 +2274,13 @@ var Modal = function ($) { }; Modal.prototype._checkScrollbar = function _checkScrollbar() { - this._isBodyOverflowing = document.body.clientWidth < window.innerWidth; + var rect = document.body.getBoundingClientRect(); + this._isBodyOverflowing = rect.left + rect.right < window.innerWidth; this._scrollbarWidth = this._getScrollbarWidth(); }; Modal.prototype._setScrollbar = function _setScrollbar() { - var _this18 = this; + var _this9 = this; if (this._isBodyOverflowing) { // Note: DOMNode.style.paddingRight returns the actual value or '' if not set @@ -2251,14 +2290,21 @@ var Modal = function ($) { $(Selector.FIXED_CONTENT).each(function (index, element) { var actualPadding = $(element)[0].style.paddingRight; var calculatedPadding = $(element).css('padding-right'); - $(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this18._scrollbarWidth + 'px'); + $(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this9._scrollbarWidth + 'px'); + }); + + // Adjust sticky content margin + $(Selector.STICKY_CONTENT).each(function (index, element) { + var actualMargin = $(element)[0].style.marginRight; + var calculatedMargin = $(element).css('margin-right'); + $(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this9._scrollbarWidth + 'px'); }); // Adjust navbar-toggler margin $(Selector.NAVBAR_TOGGLER).each(function (index, element) { var actualMargin = $(element)[0].style.marginRight; var calculatedMargin = $(element).css('margin-right'); - $(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) + _this18._scrollbarWidth + 'px'); + $(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) + _this9._scrollbarWidth + 'px'); }); // Adjust body padding @@ -2277,8 +2323,8 @@ var Modal = function ($) { } }); - // Restore navbar-toggler margin - $(Selector.NAVBAR_TOGGLER).each(function (index, element) { + // Restore sticky content and navbar-toggler margin + $(Selector.STICKY_CONTENT + ', ' + Selector.NAVBAR_TOGGLER).each(function (index, element) { var margin = $(element).data('margin-right'); if (typeof margin !== 'undefined') { $(element).css('margin-right', margin).removeData('margin-right'); @@ -2315,7 +2361,7 @@ var Modal = function ($) { } if (typeof config === 'string') { - if (data[config] === undefined) { + if (typeof data[config] === 'undefined') { throw new Error('No method named "' + config + '"'); } data[config](relatedTarget); @@ -2325,7 +2371,7 @@ var Modal = function ($) { }); }; - _createClass(Modal, null, [{ + createClass(Modal, null, [{ key: 'VERSION', get: function get() { return VERSION; @@ -2336,7 +2382,6 @@ var Modal = function ($) { return Default; } }]); - return Modal; }(); @@ -2347,7 +2392,7 @@ var Modal = function ($) { */ $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) { - var _this19 = this; + var _this10 = this; var target = void 0; var selector = Util.getSelectorFromElement(this); @@ -2369,8 +2414,8 @@ var Modal = function ($) { } $target.one(Event.HIDDEN, function () { - if ($(_this19).is(':visible')) { - _this19.focus(); + if ($(_this10).is(':visible')) { + _this10.focus(); } }); }); @@ -2394,581 +2439,6 @@ var Modal = function ($) { return Modal; }(jQuery); -/** - * -------------------------------------------------------------------------- - * Bootstrap (v4.0.0-beta): scrollspy.js - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * -------------------------------------------------------------------------- - */ - -var ScrollSpy = function ($) { - - /** - * ------------------------------------------------------------------------ - * Constants - * ------------------------------------------------------------------------ - */ - - var NAME = 'scrollspy'; - var VERSION = '4.0.0-beta'; - var DATA_KEY = 'bs.scrollspy'; - var EVENT_KEY = '.' + DATA_KEY; - var DATA_API_KEY = '.data-api'; - var JQUERY_NO_CONFLICT = $.fn[NAME]; - - var Default = { - offset: 10, - method: 'auto', - target: '' - }; - - var DefaultType = { - offset: 'number', - method: 'string', - target: '(string|element)' - }; - - var Event = { - ACTIVATE: 'activate' + EVENT_KEY, - SCROLL: 'scroll' + EVENT_KEY, - LOAD_DATA_API: 'load' + EVENT_KEY + DATA_API_KEY - }; - - var ClassName = { - DROPDOWN_ITEM: 'dropdown-item', - DROPDOWN_MENU: 'dropdown-menu', - ACTIVE: 'active' - }; - - var Selector = { - DATA_SPY: '[data-spy="scroll"]', - ACTIVE: '.active', - NAV_LIST_GROUP: '.nav, .list-group', - NAV_LINKS: '.nav-link', - LIST_ITEMS: '.list-group-item', - DROPDOWN: '.dropdown', - DROPDOWN_ITEMS: '.dropdown-item', - DROPDOWN_TOGGLE: '.dropdown-toggle' - }; - - var OffsetMethod = { - OFFSET: 'offset', - POSITION: 'position' - - /** - * ------------------------------------------------------------------------ - * Class Definition - * ------------------------------------------------------------------------ - */ - - }; - var ScrollSpy = function () { - function ScrollSpy(element, config) { - var _this20 = this; - - _classCallCheck(this, ScrollSpy); - - this._element = element; - this._scrollElement = element.tagName === 'BODY' ? window : element; - this._config = this._getConfig(config); - this._selector = this._config.target + ' ' + Selector.NAV_LINKS + ',' + (this._config.target + ' ' + Selector.LIST_ITEMS + ',') + (this._config.target + ' ' + Selector.DROPDOWN_ITEMS); - this._offsets = []; - this._targets = []; - this._activeTarget = null; - this._scrollHeight = 0; - - $(this._scrollElement).on(Event.SCROLL, function (event) { - return _this20._process(event); - }); - - this.refresh(); - this._process(); - } - - // getters - - // public - - ScrollSpy.prototype.refresh = function refresh() { - var _this21 = this; - - var autoMethod = this._scrollElement !== this._scrollElement.window ? OffsetMethod.POSITION : OffsetMethod.OFFSET; - - var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method; - - var offsetBase = offsetMethod === OffsetMethod.POSITION ? this._getScrollTop() : 0; - - this._offsets = []; - this._targets = []; - - this._scrollHeight = this._getScrollHeight(); - - var targets = $.makeArray($(this._selector)); - - targets.map(function (element) { - var target = void 0; - var targetSelector = Util.getSelectorFromElement(element); - - if (targetSelector) { - target = $(targetSelector)[0]; - } - - if (target) { - var targetBCR = target.getBoundingClientRect(); - if (targetBCR.width || targetBCR.height) { - // todo (fat): remove sketch reliance on jQuery position/offset - return [$(target)[offsetMethod]().top + offsetBase, targetSelector]; - } - } - return null; - }).filter(function (item) { - return item; - }).sort(function (a, b) { - return a[0] - b[0]; - }).forEach(function (item) { - _this21._offsets.push(item[0]); - _this21._targets.push(item[1]); - }); - }; - - ScrollSpy.prototype.dispose = function dispose() { - $.removeData(this._element, DATA_KEY); - $(this._scrollElement).off(EVENT_KEY); - - this._element = null; - this._scrollElement = null; - this._config = null; - this._selector = null; - this._offsets = null; - this._targets = null; - this._activeTarget = null; - this._scrollHeight = null; - }; - - // private - - ScrollSpy.prototype._getConfig = function _getConfig(config) { - config = $.extend({}, Default, config); - - if (typeof config.target !== 'string') { - var id = $(config.target).attr('id'); - if (!id) { - id = Util.getUID(NAME); - $(config.target).attr('id', id); - } - config.target = '#' + id; - } - - Util.typeCheckConfig(NAME, config, DefaultType); - - return config; - }; - - ScrollSpy.prototype._getScrollTop = function _getScrollTop() { - return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop; - }; - - ScrollSpy.prototype._getScrollHeight = function _getScrollHeight() { - return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight); - }; - - ScrollSpy.prototype._getOffsetHeight = function _getOffsetHeight() { - return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height; - }; - - ScrollSpy.prototype._process = function _process() { - var scrollTop = this._getScrollTop() + this._config.offset; - var scrollHeight = this._getScrollHeight(); - var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight(); - - if (this._scrollHeight !== scrollHeight) { - this.refresh(); - } - - if (scrollTop >= maxScroll) { - var target = this._targets[this._targets.length - 1]; - - if (this._activeTarget !== target) { - this._activate(target); - } - return; - } - - if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) { - this._activeTarget = null; - this._clear(); - return; - } - - for (var i = this._offsets.length; i--;) { - var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (this._offsets[i + 1] === undefined || scrollTop < this._offsets[i + 1]); - - if (isActiveTarget) { - this._activate(this._targets[i]); - } - } - }; - - ScrollSpy.prototype._activate = function _activate(target) { - this._activeTarget = target; - - this._clear(); - - var queries = this._selector.split(','); - queries = queries.map(function (selector) { - return selector + '[data-target="' + target + '"],' + (selector + '[href="' + target + '"]'); - }); - - var $link = $(queries.join(',')); - - if ($link.hasClass(ClassName.DROPDOWN_ITEM)) { - $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE); - $link.addClass(ClassName.ACTIVE); - } else { - // Set triggered link as active - $link.addClass(ClassName.ACTIVE); - // Set triggered links parents as active - // With both