bootstrap-sass 3.3.3 → 3.3.4.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of bootstrap-sass might be problematic. Click here for more details.

Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -0
  3. data/Gemfile +1 -1
  4. data/README.md +36 -14
  5. data/Rakefile +12 -1
  6. data/assets/javascripts/bootstrap-sprockets.js +2 -2
  7. data/assets/javascripts/bootstrap.js +108 -97
  8. data/assets/javascripts/bootstrap.min.js +3 -3
  9. data/assets/javascripts/bootstrap/affix.js +5 -5
  10. data/assets/javascripts/bootstrap/alert.js +2 -2
  11. data/assets/javascripts/bootstrap/button.js +2 -2
  12. data/assets/javascripts/bootstrap/carousel.js +6 -6
  13. data/assets/javascripts/bootstrap/collapse.js +7 -7
  14. data/assets/javascripts/bootstrap/dropdown.js +3 -3
  15. data/assets/javascripts/bootstrap/modal.js +41 -26
  16. data/assets/javascripts/bootstrap/popover.js +3 -8
  17. data/assets/javascripts/bootstrap/scrollspy.js +17 -20
  18. data/assets/javascripts/bootstrap/tab.js +3 -3
  19. data/assets/javascripts/bootstrap/tooltip.js +17 -13
  20. data/assets/javascripts/bootstrap/transition.js +1 -1
  21. data/assets/stylesheets/bootstrap/_alerts.scss +2 -2
  22. data/assets/stylesheets/bootstrap/_badges.scss +6 -5
  23. data/assets/stylesheets/bootstrap/_component-animations.scss +1 -2
  24. data/assets/stylesheets/bootstrap/_dropdowns.scss +1 -1
  25. data/assets/stylesheets/bootstrap/_forms.scss +10 -2
  26. data/assets/stylesheets/bootstrap/_glyphicons.scss +4 -0
  27. data/assets/stylesheets/bootstrap/_jumbotron.scss +1 -1
  28. data/assets/stylesheets/bootstrap/_modals.scss +3 -1
  29. data/assets/stylesheets/bootstrap/_navbar.scss +0 -1
  30. data/assets/stylesheets/bootstrap/_navs.scss +0 -2
  31. data/assets/stylesheets/bootstrap/_responsive-embed.scss +8 -8
  32. data/assets/stylesheets/bootstrap/_scaffolding.scss +12 -0
  33. data/assets/stylesheets/bootstrap/_tooltip.scss +0 -1
  34. data/assets/stylesheets/bootstrap/_type.scss +1 -1
  35. data/assets/stylesheets/bootstrap/_utilities.scss +0 -1
  36. data/assets/stylesheets/bootstrap/_variables.scss +5 -1
  37. data/bower.json +1 -1
  38. data/lib/bootstrap-sass/version.rb +2 -2
  39. data/package.json +3 -3
  40. data/tasks/converter/js_conversion.rb +1 -1
  41. data/tasks/converter/less_conversion.rb +11 -12
  42. data/tasks/converter/network.rb +10 -5
  43. data/templates/project/_bootstrap-variables.sass +6 -2
  44. data/test/dummy_rails/app/assets/stylesheets/{application.css.sass → application.sass} +0 -0
  45. data/test/dummy_rails/app/views/pages/root.html.slim +43 -0
  46. data/test/dummy_rails/config/environments/development.rb +0 -3
  47. data/test/dummy_rails/config/environments/production.rb +7 -1
  48. data/test/dummy_rails/config/environments/test.rb +7 -1
  49. metadata +6 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 263e0218b9dd30ad62e1aa97fbe18182b80f0025
4
- data.tar.gz: bf7a1018dec7f2521db0ddcdc89d7e2bb7702b2b
3
+ metadata.gz: c548004d45f09e256dafbc81d58751358225ff42
4
+ data.tar.gz: 8fabdcd1bd2e52d97ea9843cee2305d04b3aee9d
5
5
  SHA512:
6
- metadata.gz: 7c02a333ee26d8c510f0b48ca8ea0d6cd4485b3c9eb1b5d84b82199165736cf83084e487b2b3ef0af87417f5bf1649bb3eb3073e231f599385a3a7d7091e5cc2
7
- data.tar.gz: f3c79cfe0623868506c6c095210e223a2bbcc0973a711bba6d89281d6a15b56fe8fbdf52dc1180707b2edcbcf7533a22a471ccdf19af409a55f5497c4fed3b57
6
+ metadata.gz: 751906d2d101bb9702de434aa46fd8ce677f3a32eb3f8e15d48d682703de10daa89da77b496421ded670391f3c29ded93da092985440c8ac5228c399dfb14e2f
7
+ data.tar.gz: 40ac7bb1e47dd7bf9101c75b5eff29f15ed83f5c57384e677b7079c3cbac0b594ed5b2e5cdebfce4fd76156a7dc0745afa9ccd5bb4cd471fa27466ce26bdb763
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.3.4
4
+
5
+ No Sass-specific changes.
6
+
7
+ Framework version: Bootstrap **v3.3.4**
8
+
3
9
  ## 3.3.3
4
10
 
5
11
  This is a re-packaged release of 3.3.2.1 (v3.3.2+1).
data/Gemfile CHANGED
@@ -6,5 +6,5 @@ gemspec
6
6
  gem 'compass', require: false
7
7
 
8
8
  group :development do
9
- gem 'byebug', platform: :mri_21, require: false
9
+ gem 'byebug', platforms: [:mri_21, :mri_22], require: false
10
10
  end
data/README.md CHANGED
@@ -1,4 +1,8 @@
1
- # Bootstrap for Sass [![Gem Version](https://badge.fury.io/rb/bootstrap-sass.svg)](http://badge.fury.io/rb/bootstrap-sass) [![Bower Version](https://badge.fury.io/bo/bootstrap-sass.svg)](http://badge.fury.io/bo/bootstrap-sass) [![Build Status](http://img.shields.io/travis/twbs/bootstrap-sass.svg)](http://travis-ci.org/twbs/bootstrap-sass)
1
+ # Bootstrap for Sass
2
+ [![Gem Version](https://badge.fury.io/rb/bootstrap-sass.svg)](http://badge.fury.io/rb/bootstrap-sass)
3
+ [![npm version](https://img.shields.io/npm/v/bootstrap-sass.svg?style=flat)](https://www.npmjs.com/package/bootstrap-sass)
4
+ [![Bower Version](https://badge.fury.io/bo/bootstrap-sass.svg)](http://badge.fury.io/bo/bootstrap-sass)
5
+ [![Build Status](http://img.shields.io/travis/twbs/bootstrap-sass.svg)](http://travis-ci.org/twbs/bootstrap-sass)
2
6
 
3
7
  `bootstrap-sass` is a Sass-powered version of [Bootstrap](http://github.com/twbs/bootstrap), ready to drop right into your Sass powered applications.
4
8
 
@@ -17,13 +21,13 @@ Please see the appropriate guide for your environment of choice:
17
21
  In your Gemfile you need to add the `bootstrap-sass` gem, and ensure that the `sass-rails` gem is present - it is added to new Rails applications by default.
18
22
 
19
23
  ```ruby
20
- gem 'bootstrap-sass', '~> 3.3.3'
24
+ gem 'bootstrap-sass', '~> 3.3.4'
21
25
  gem 'sass-rails', '>= 3.2'
22
26
  ```
23
27
 
24
28
  `bundle install` and restart your server to make the files available through the pipeline.
25
29
 
26
- Import Bootstrap styles in `app/assets/stylesheets/application.css.scss`:
30
+ Import Bootstrap styles in `app/assets/stylesheets/application.scss`:
27
31
 
28
32
  ```scss
29
33
  // "bootstrap-sprockets" must be imported before "bootstrap" and "bootstrap/variables"
@@ -33,11 +37,11 @@ Import Bootstrap styles in `app/assets/stylesheets/application.css.scss`:
33
37
 
34
38
  `bootstrap-sprockets` must be imported before `bootstrap` for the icon fonts to work.
35
39
 
36
- Make sure the file has `.css.scss` extension (or `.css.sass` for Sass syntax). If you have just generated a new Rails app,
40
+ Make sure the file has `.scss` extension (or `.sass` for Sass syntax). If you have just generated a new Rails app,
37
41
  it may come with a `.css` file instead. If this file exists, it will be served instead of Sass, so rename it:
38
42
 
39
43
  ```console
40
- $ mv app/assets/stylesheets/application.css app/assets/stylesheets/application.css.scss
44
+ $ mv app/assets/stylesheets/application.css app/assets/stylesheets/application.scss
41
45
  ```
42
46
 
43
47
  Then, remove all the `//= require` and `//= require_tree` statements from the file. Instead, use `@import` to import Sass files.
@@ -51,6 +55,11 @@ Require Bootstrap Javascripts in `app/assets/javascripts/application.js`:
51
55
  //= require bootstrap-sprockets
52
56
  ```
53
57
 
58
+ `bootstrap-sprockets` and `bootstrap` [should not both be included](https://github.com/twbs/bootstrap-sass/issues/829#issuecomment-75153827) in `application.js`.
59
+
60
+ `bootstrap-sprockets` provides individual Bootstrap Javascript files (`alert.js` or `dropdown.js`, for example), while
61
+ `bootstrap` provides a concatenated file containing all Bootstrap Javascripts.
62
+
54
63
  #### Bower with Rails
55
64
 
56
65
  When using [bootstrap-sass Bower package](#c-bower) instead of the gem in Rails, configure assets in `config/application.rb`:
@@ -64,10 +73,10 @@ end
64
73
  # Precompile Bootstrap fonts
65
74
  config.assets.precompile << %r(bootstrap-sass/assets/fonts/bootstrap/[\w-]+\.(?:eot|svg|ttf|woff2?)$)
66
75
  # Minimum Sass number precision required by bootstrap-sass
67
- ::Sass::Script::Number.precision = [8, ::Sass::Script::Number.precision].max
76
+ ::Sass::Script::Value::Number.precision = [8, ::Sass::Script::Value::Number.precision].max
68
77
  ```
69
78
 
70
- Replace Bootstrap `@import` statements in `application.css.scss` with:
79
+ Replace Bootstrap `@import` statements in `application.scss` with:
71
80
 
72
81
  ```scss
73
82
  $icon-font-path: "bootstrap-sass/assets/fonts/bootstrap/";
@@ -188,7 +197,7 @@ Precision is set for Rails and Compass automatically.
188
197
  When using ruby Sass compiler standalone or with the Bower version you can set it with:
189
198
 
190
199
  ```ruby
191
- ::Sass::Script::Number.precision = [8, ::Sass::Script::Number.precision].max
200
+ ::Sass::Script::Value::Number.precision = [8, ::Sass::Script::Value::Number.precision].max
192
201
  ```
193
202
 
194
203
  #### Sass: Autoprefixer
@@ -241,7 +250,7 @@ When using bootstrap-sass with Compass, Sprockets, or Mincer, you **must** impor
241
250
 
242
251
  ### Sass
243
252
 
244
- Import Bootstrap into a Sass file (for example, application.css.scss) to get all of Bootstrap's styles, mixins and variables!
253
+ Import Bootstrap into a Sass file (for example, application.scss) to get all of Bootstrap's styles, mixins and variables!
245
254
 
246
255
  ```scss
247
256
  @import "bootstrap";
@@ -265,7 +274,20 @@ $navbar-default-color: $light-orange;
265
274
 
266
275
  ## Version
267
276
 
268
- `bootstrap-sass` version reflects the upstream version, with an additional number for Sass-specific changes.
277
+ Bootstrap for Sass version may differ from the upstream version in the last number, known as
278
+ [MINOR](http://semver.org/spec/v2.0.0.html). The minor version may be ahead of the corresponding upstream minor.
279
+ This happens when we need to release Sass-specific changes.
280
+
281
+ Before v3.3.2, Bootstrap for Sass version used to reflect the upstream version, with an additional number for
282
+ Sass-specific changes. This was changed due to Bower and npm compatibility issues.
283
+
284
+ The upstream versions vs the Bootstrap for Sass versions are:
285
+
286
+ | Upstream | Sass |
287
+ |---------:|--------:|
288
+ | 3.3.4 | 3.3.4 |
289
+ | 3.3.2 | 3.3.3 |
290
+ | <= 3.3.1 | 3.3.1.x |
269
291
 
270
292
  Always refer to [CHANGELOG.md](/CHANGELOG.md) when upgrading.
271
293
 
@@ -295,7 +317,7 @@ To convert a specific branch or version, pass the branch name or the commit hash
295
317
  The latest converter script is located [here][converter] and does the following:
296
318
 
297
319
  * Converts upstream bootstrap LESS files to its matching SCSS file.
298
- * Copies all upstream JavaScript into `assets/javascripts/bootstrap`, an Sprockets manifest at `assets/javascripts/bootstrap-sprockets.js`, and a concatenation at `assets/javascripts/bootstrap.js`.
320
+ * Copies all upstream JavaScript into `assets/javascripts/bootstrap`, a Sprockets manifest at `assets/javascripts/bootstrap-sprockets.js`, and a concatenation at `assets/javascripts/bootstrap.js`.
299
321
  * Copies all upstream font files into `assets/fonts/bootstrap`.
300
322
  * Sets `Bootstrap::BOOTSTRAP_SHA` in [version.rb][version] to the branch sha.
301
323
 
@@ -316,15 +338,15 @@ and a [significant number of other contributors][contrib].
316
338
 
317
339
  ## You're in good company
318
340
  bootstrap-sass is used to build some awesome projects all over the web, including
319
- [Diaspora](http://diasporaproject.org/), [rails_admin](https://github.com/sferik/rails_admin),
341
+ [Diaspora](https://diasporafoundation.org/), [rails_admin](https://github.com/sferik/rails_admin),
320
342
  Michael Hartl's [Rails Tutorial](http://railstutorial.org/), [gitlabhq](http://gitlabhq.com/) and
321
- [kandan](http://kandanapp.com/).
343
+ [kandan](http://kandan.io/).
322
344
 
323
345
  [converter]: https://github.com/twbs/bootstrap-sass/blob/master/tasks/converter/less_conversion.rb
324
346
  [version]: https://github.com/twbs/bootstrap-sass/blob/master/lib/bootstrap-sass/version.rb
325
347
  [contrib]: https://github.com/twbs/bootstrap-sass/graphs/contributors
326
348
  [antirequire]: https://github.com/twbs/bootstrap-sass/issues/79#issuecomment-4428595
327
349
  [jsdocs]: http://getbootstrap.com/javascript/#transitions
328
- [sass-precision]: http://sass-lang.com/documentation/Sass/Script/Number.html#precision-class_method
350
+ [sass-precision]: http://sass-lang.com/documentation/Sass/Script/Value/Number.html#precision%3D-class_method
329
351
  [mincer]: https://github.com/nodeca/mincer
330
352
  [autoprefixer]: https://github.com/ai/autoprefixer
data/Rakefile CHANGED
@@ -40,7 +40,7 @@ task :compile, :css_path do |t, args|
40
40
  css_path = args.with_defaults(css_path: 'tmp')[:css_path]
41
41
  puts Term::ANSIColor.bold "Compiling SCSS in #{path}"
42
42
  Dir.mkdir(css_path) unless File.directory?(css_path)
43
- %w(bootstrap bootstrap/_theme).each do |file|
43
+ %w(_bootstrap bootstrap/_theme).each do |file|
44
44
  save_path = "#{css_path}/#{file.sub(/(^|\/)?_+/, '\1').sub('/', '-')}.css"
45
45
  puts Term::ANSIColor.cyan(" #{save_path}") + '...'
46
46
  engine = Sass::Engine.for_file("#{path}/#{file}.scss", syntax: :scss, load_paths: [path])
@@ -49,4 +49,15 @@ task :compile, :css_path do |t, args|
49
49
  end
50
50
  end
51
51
 
52
+ desc 'Start a dummy (test) Rails app server'
53
+ task :dummy_rails do
54
+ require 'rack'
55
+ require 'term/ansicolor'
56
+ port = ENV['PORT'] || 9292
57
+ puts %Q(Starting on #{Term::ANSIColor.cyan "http://localhost:#{port}"})
58
+ Rack::Server.start(
59
+ config: 'test/dummy_rails/config.ru',
60
+ Port: port)
61
+ end
62
+
52
63
  task default: :test
@@ -4,9 +4,9 @@
4
4
  //= require ./bootstrap/carousel
5
5
  //= require ./bootstrap/collapse
6
6
  //= require ./bootstrap/dropdown
7
+ //= require ./bootstrap/modal
8
+ //= require ./bootstrap/scrollspy
7
9
  //= require ./bootstrap/tab
8
10
  //= require ./bootstrap/transition
9
- //= require ./bootstrap/scrollspy
10
- //= require ./bootstrap/modal
11
11
  //= require ./bootstrap/tooltip
12
12
  //= require ./bootstrap/popover
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Bootstrap v3.3.2 (http://getbootstrap.com)
2
+ * Bootstrap v3.3.4 (http://getbootstrap.com)
3
3
  * Copyright 2011-2015 Twitter, Inc.
4
4
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
5
  */
@@ -17,7 +17,7 @@ if (typeof jQuery === 'undefined') {
17
17
  }(jQuery);
18
18
 
19
19
  /* ========================================================================
20
- * Bootstrap: transition.js v3.3.2
20
+ * Bootstrap: transition.js v3.3.4
21
21
  * http://getbootstrap.com/javascript/#transitions
22
22
  * ========================================================================
23
23
  * Copyright 2011-2015 Twitter, Inc.
@@ -77,7 +77,7 @@ if (typeof jQuery === 'undefined') {
77
77
  }(jQuery);
78
78
 
79
79
  /* ========================================================================
80
- * Bootstrap: alert.js v3.3.2
80
+ * Bootstrap: alert.js v3.3.4
81
81
  * http://getbootstrap.com/javascript/#alerts
82
82
  * ========================================================================
83
83
  * Copyright 2011-2015 Twitter, Inc.
@@ -96,7 +96,7 @@ if (typeof jQuery === 'undefined') {
96
96
  $(el).on('click', dismiss, this.close)
97
97
  }
98
98
 
99
- Alert.VERSION = '3.3.2'
99
+ Alert.VERSION = '3.3.4'
100
100
 
101
101
  Alert.TRANSITION_DURATION = 150
102
102
 
@@ -172,7 +172,7 @@ if (typeof jQuery === 'undefined') {
172
172
  }(jQuery);
173
173
 
174
174
  /* ========================================================================
175
- * Bootstrap: button.js v3.3.2
175
+ * Bootstrap: button.js v3.3.4
176
176
  * http://getbootstrap.com/javascript/#buttons
177
177
  * ========================================================================
178
178
  * Copyright 2011-2015 Twitter, Inc.
@@ -192,7 +192,7 @@ if (typeof jQuery === 'undefined') {
192
192
  this.isLoading = false
193
193
  }
194
194
 
195
- Button.VERSION = '3.3.2'
195
+ Button.VERSION = '3.3.4'
196
196
 
197
197
  Button.DEFAULTS = {
198
198
  loadingText: 'loading...'
@@ -289,7 +289,7 @@ if (typeof jQuery === 'undefined') {
289
289
  }(jQuery);
290
290
 
291
291
  /* ========================================================================
292
- * Bootstrap: carousel.js v3.3.2
292
+ * Bootstrap: carousel.js v3.3.4
293
293
  * http://getbootstrap.com/javascript/#carousel
294
294
  * ========================================================================
295
295
  * Copyright 2011-2015 Twitter, Inc.
@@ -307,10 +307,10 @@ if (typeof jQuery === 'undefined') {
307
307
  this.$element = $(element)
308
308
  this.$indicators = this.$element.find('.carousel-indicators')
309
309
  this.options = options
310
- this.paused =
311
- this.sliding =
312
- this.interval =
313
- this.$active =
310
+ this.paused = null
311
+ this.sliding = null
312
+ this.interval = null
313
+ this.$active = null
314
314
  this.$items = null
315
315
 
316
316
  this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))
@@ -320,7 +320,7 @@ if (typeof jQuery === 'undefined') {
320
320
  .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
321
321
  }
322
322
 
323
- Carousel.VERSION = '3.3.2'
323
+ Carousel.VERSION = '3.3.4'
324
324
 
325
325
  Carousel.TRANSITION_DURATION = 600
326
326
 
@@ -527,7 +527,7 @@ if (typeof jQuery === 'undefined') {
527
527
  }(jQuery);
528
528
 
529
529
  /* ========================================================================
530
- * Bootstrap: collapse.js v3.3.2
530
+ * Bootstrap: collapse.js v3.3.4
531
531
  * http://getbootstrap.com/javascript/#collapse
532
532
  * ========================================================================
533
533
  * Copyright 2011-2015 Twitter, Inc.
@@ -544,7 +544,8 @@ if (typeof jQuery === 'undefined') {
544
544
  var Collapse = function (element, options) {
545
545
  this.$element = $(element)
546
546
  this.options = $.extend({}, Collapse.DEFAULTS, options)
547
- this.$trigger = $(this.options.trigger).filter('[href="#' + element.id + '"], [data-target="#' + element.id + '"]')
547
+ this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' +
548
+ '[data-toggle="collapse"][data-target="#' + element.id + '"]')
548
549
  this.transitioning = null
549
550
 
550
551
  if (this.options.parent) {
@@ -556,13 +557,12 @@ if (typeof jQuery === 'undefined') {
556
557
  if (this.options.toggle) this.toggle()
557
558
  }
558
559
 
559
- Collapse.VERSION = '3.3.2'
560
+ Collapse.VERSION = '3.3.4'
560
561
 
561
562
  Collapse.TRANSITION_DURATION = 350
562
563
 
563
564
  Collapse.DEFAULTS = {
564
- toggle: true,
565
- trigger: '[data-toggle="collapse"]'
565
+ toggle: true
566
566
  }
567
567
 
568
568
  Collapse.prototype.dimension = function () {
@@ -700,7 +700,7 @@ if (typeof jQuery === 'undefined') {
700
700
  var data = $this.data('bs.collapse')
701
701
  var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
702
702
 
703
- if (!data && options.toggle && option == 'show') options.toggle = false
703
+ if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false
704
704
  if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
705
705
  if (typeof option == 'string') data[option]()
706
706
  })
@@ -731,7 +731,7 @@ if (typeof jQuery === 'undefined') {
731
731
 
732
732
  var $target = getTargetFromTrigger($this)
733
733
  var data = $target.data('bs.collapse')
734
- var option = data ? 'toggle' : $.extend({}, $this.data(), { trigger: this })
734
+ var option = data ? 'toggle' : $this.data()
735
735
 
736
736
  Plugin.call($target, option)
737
737
  })
@@ -739,7 +739,7 @@ if (typeof jQuery === 'undefined') {
739
739
  }(jQuery);
740
740
 
741
741
  /* ========================================================================
742
- * Bootstrap: dropdown.js v3.3.2
742
+ * Bootstrap: dropdown.js v3.3.4
743
743
  * http://getbootstrap.com/javascript/#dropdowns
744
744
  * ========================================================================
745
745
  * Copyright 2011-2015 Twitter, Inc.
@@ -759,7 +759,7 @@ if (typeof jQuery === 'undefined') {
759
759
  $(element).on('click.bs.dropdown', this.toggle)
760
760
  }
761
761
 
762
- Dropdown.VERSION = '3.3.2'
762
+ Dropdown.VERSION = '3.3.4'
763
763
 
764
764
  Dropdown.prototype.toggle = function (e) {
765
765
  var $this = $(this)
@@ -812,7 +812,7 @@ if (typeof jQuery === 'undefined') {
812
812
  return $this.trigger('click')
813
813
  }
814
814
 
815
- var desc = ' li:not(.divider):visible a'
815
+ var desc = ' li:not(.disabled):visible a'
816
816
  var $items = $parent.find('[role="menu"]' + desc + ', [role="listbox"]' + desc)
817
817
 
818
818
  if (!$items.length) return
@@ -901,7 +901,7 @@ if (typeof jQuery === 'undefined') {
901
901
  }(jQuery);
902
902
 
903
903
  /* ========================================================================
904
- * Bootstrap: modal.js v3.3.2
904
+ * Bootstrap: modal.js v3.3.4
905
905
  * http://getbootstrap.com/javascript/#modals
906
906
  * ========================================================================
907
907
  * Copyright 2011-2015 Twitter, Inc.
@@ -916,12 +916,15 @@ if (typeof jQuery === 'undefined') {
916
916
  // ======================
917
917
 
918
918
  var Modal = function (element, options) {
919
- this.options = options
920
- this.$body = $(document.body)
921
- this.$element = $(element)
922
- this.$backdrop =
923
- this.isShown = null
924
- this.scrollbarWidth = 0
919
+ this.options = options
920
+ this.$body = $(document.body)
921
+ this.$element = $(element)
922
+ this.$dialog = this.$element.find('.modal-dialog')
923
+ this.$backdrop = null
924
+ this.isShown = null
925
+ this.originalBodyPad = null
926
+ this.scrollbarWidth = 0
927
+ this.ignoreBackdropClick = false
925
928
 
926
929
  if (this.options.remote) {
927
930
  this.$element
@@ -932,7 +935,7 @@ if (typeof jQuery === 'undefined') {
932
935
  }
933
936
  }
934
937
 
935
- Modal.VERSION = '3.3.2'
938
+ Modal.VERSION = '3.3.4'
936
939
 
937
940
  Modal.TRANSITION_DURATION = 300
938
941
  Modal.BACKDROP_TRANSITION_DURATION = 150
@@ -966,6 +969,12 @@ if (typeof jQuery === 'undefined') {
966
969
 
967
970
  this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
968
971
 
972
+ this.$dialog.on('mousedown.dismiss.bs.modal', function () {
973
+ that.$element.one('mouseup.dismiss.bs.modal', function (e) {
974
+ if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true
975
+ })
976
+ })
977
+
969
978
  this.backdrop(function () {
970
979
  var transition = $.support.transition && that.$element.hasClass('fade')
971
980
 
@@ -977,7 +986,6 @@ if (typeof jQuery === 'undefined') {
977
986
  .show()
978
987
  .scrollTop(0)
979
988
 
980
- if (that.options.backdrop) that.adjustBackdrop()
981
989
  that.adjustDialog()
982
990
 
983
991
  if (transition) {
@@ -993,7 +1001,7 @@ if (typeof jQuery === 'undefined') {
993
1001
  var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
994
1002
 
995
1003
  transition ?
996
- that.$element.find('.modal-dialog') // wait for modal to slide in
1004
+ that.$dialog // wait for modal to slide in
997
1005
  .one('bsTransitionEnd', function () {
998
1006
  that.$element.trigger('focus').trigger(e)
999
1007
  })
@@ -1022,6 +1030,9 @@ if (typeof jQuery === 'undefined') {
1022
1030
  .removeClass('in')
1023
1031
  .attr('aria-hidden', true)
1024
1032
  .off('click.dismiss.bs.modal')
1033
+ .off('mouseup.dismiss.bs.modal')
1034
+
1035
+ this.$dialog.off('mousedown.dismiss.bs.modal')
1025
1036
 
1026
1037
  $.support.transition && this.$element.hasClass('fade') ?
1027
1038
  this.$element
@@ -1082,13 +1093,18 @@ if (typeof jQuery === 'undefined') {
1082
1093
  var doAnimate = $.support.transition && animate
1083
1094
 
1084
1095
  this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
1085
- .prependTo(this.$element)
1086
- .on('click.dismiss.bs.modal', $.proxy(function (e) {
1087
- if (e.target !== e.currentTarget) return
1088
- this.options.backdrop == 'static'
1089
- ? this.$element[0].focus.call(this.$element[0])
1090
- : this.hide.call(this)
1091
- }, this))
1096
+ .appendTo(this.$body)
1097
+
1098
+ this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
1099
+ if (this.ignoreBackdropClick) {
1100
+ this.ignoreBackdropClick = false
1101
+ return
1102
+ }
1103
+ if (e.target !== e.currentTarget) return
1104
+ this.options.backdrop == 'static'
1105
+ ? this.$element[0].focus()
1106
+ : this.hide()
1107
+ }, this))
1092
1108
 
1093
1109
  if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
1094
1110
 
@@ -1123,16 +1139,9 @@ if (typeof jQuery === 'undefined') {
1123
1139
  // these following methods are used to handle overflowing modals
1124
1140
 
1125
1141
  Modal.prototype.handleUpdate = function () {
1126
- if (this.options.backdrop) this.adjustBackdrop()
1127
1142
  this.adjustDialog()
1128
1143
  }
1129
1144
 
1130
- Modal.prototype.adjustBackdrop = function () {
1131
- this.$backdrop
1132
- .css('height', 0)
1133
- .css('height', this.$element[0].scrollHeight)
1134
- }
1135
-
1136
1145
  Modal.prototype.adjustDialog = function () {
1137
1146
  var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
1138
1147
 
@@ -1150,17 +1159,23 @@ if (typeof jQuery === 'undefined') {
1150
1159
  }
1151
1160
 
1152
1161
  Modal.prototype.checkScrollbar = function () {
1153
- this.bodyIsOverflowing = document.body.scrollHeight > document.documentElement.clientHeight
1162
+ var fullWindowWidth = window.innerWidth
1163
+ if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
1164
+ var documentElementRect = document.documentElement.getBoundingClientRect()
1165
+ fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
1166
+ }
1167
+ this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
1154
1168
  this.scrollbarWidth = this.measureScrollbar()
1155
1169
  }
1156
1170
 
1157
1171
  Modal.prototype.setScrollbar = function () {
1158
1172
  var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
1173
+ this.originalBodyPad = document.body.style.paddingRight || ''
1159
1174
  if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
1160
1175
  }
1161
1176
 
1162
1177
  Modal.prototype.resetScrollbar = function () {
1163
- this.$body.css('padding-right', '')
1178
+ this.$body.css('padding-right', this.originalBodyPad)
1164
1179
  }
1165
1180
 
1166
1181
  Modal.prototype.measureScrollbar = function () { // thx walsh
@@ -1226,7 +1241,7 @@ if (typeof jQuery === 'undefined') {
1226
1241
  }(jQuery);
1227
1242
 
1228
1243
  /* ========================================================================
1229
- * Bootstrap: tooltip.js v3.3.2
1244
+ * Bootstrap: tooltip.js v3.3.4
1230
1245
  * http://getbootstrap.com/javascript/#tooltip
1231
1246
  * Inspired by the original jQuery.tipsy by Jason Frame
1232
1247
  * ========================================================================
@@ -1242,17 +1257,17 @@ if (typeof jQuery === 'undefined') {
1242
1257
  // ===============================
1243
1258
 
1244
1259
  var Tooltip = function (element, options) {
1245
- this.type =
1246
- this.options =
1247
- this.enabled =
1248
- this.timeout =
1249
- this.hoverState =
1260
+ this.type = null
1261
+ this.options = null
1262
+ this.enabled = null
1263
+ this.timeout = null
1264
+ this.hoverState = null
1250
1265
  this.$element = null
1251
1266
 
1252
1267
  this.init('tooltip', element, options)
1253
1268
  }
1254
1269
 
1255
- Tooltip.VERSION = '3.3.2'
1270
+ Tooltip.VERSION = '3.3.4'
1256
1271
 
1257
1272
  Tooltip.TRANSITION_DURATION = 150
1258
1273
 
@@ -1279,6 +1294,10 @@ if (typeof jQuery === 'undefined') {
1279
1294
  this.options = this.getOptions(options)
1280
1295
  this.$viewport = this.options.viewport && $(this.options.viewport.selector || this.options.viewport)
1281
1296
 
1297
+ if (this.$element[0] instanceof document.constructor && !this.options.selector) {
1298
+ throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')
1299
+ }
1300
+
1282
1301
  var triggers = this.options.trigger.split(' ')
1283
1302
 
1284
1303
  for (var i = triggers.length; i--;) {
@@ -1499,10 +1518,10 @@ if (typeof jQuery === 'undefined') {
1499
1518
  this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
1500
1519
  }
1501
1520
 
1502
- Tooltip.prototype.replaceArrow = function (delta, dimension, isHorizontal) {
1521
+ Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
1503
1522
  this.arrow()
1504
- .css(isHorizontal ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
1505
- .css(isHorizontal ? 'top' : 'left', '')
1523
+ .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
1524
+ .css(isVertical ? 'top' : 'left', '')
1506
1525
  }
1507
1526
 
1508
1527
  Tooltip.prototype.setContent = function () {
@@ -1515,7 +1534,7 @@ if (typeof jQuery === 'undefined') {
1515
1534
 
1516
1535
  Tooltip.prototype.hide = function (callback) {
1517
1536
  var that = this
1518
- var $tip = this.tip()
1537
+ var $tip = $(this.$tip)
1519
1538
  var e = $.Event('hide.bs.' + this.type)
1520
1539
 
1521
1540
  function complete() {
@@ -1532,7 +1551,7 @@ if (typeof jQuery === 'undefined') {
1532
1551
 
1533
1552
  $tip.removeClass('in')
1534
1553
 
1535
- $.support.transition && this.$tip.hasClass('fade') ?
1554
+ $.support.transition && $tip.hasClass('fade') ?
1536
1555
  $tip
1537
1556
  .one('bsTransitionEnd', complete)
1538
1557
  .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
@@ -1676,7 +1695,7 @@ if (typeof jQuery === 'undefined') {
1676
1695
  var data = $this.data('bs.tooltip')
1677
1696
  var options = typeof option == 'object' && option
1678
1697
 
1679
- if (!data && option == 'destroy') return
1698
+ if (!data && /destroy|hide/.test(option)) return
1680
1699
  if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
1681
1700
  if (typeof option == 'string') data[option]()
1682
1701
  })
@@ -1699,7 +1718,7 @@ if (typeof jQuery === 'undefined') {
1699
1718
  }(jQuery);
1700
1719
 
1701
1720
  /* ========================================================================
1702
- * Bootstrap: popover.js v3.3.2
1721
+ * Bootstrap: popover.js v3.3.4
1703
1722
  * http://getbootstrap.com/javascript/#popovers
1704
1723
  * ========================================================================
1705
1724
  * Copyright 2011-2015 Twitter, Inc.
@@ -1719,7 +1738,7 @@ if (typeof jQuery === 'undefined') {
1719
1738
 
1720
1739
  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
1721
1740
 
1722
- Popover.VERSION = '3.3.2'
1741
+ Popover.VERSION = '3.3.4'
1723
1742
 
1724
1743
  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
1725
1744
  placement: 'right',
@@ -1775,11 +1794,6 @@ if (typeof jQuery === 'undefined') {
1775
1794
  return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
1776
1795
  }
1777
1796
 
1778
- Popover.prototype.tip = function () {
1779
- if (!this.$tip) this.$tip = $(this.options.template)
1780
- return this.$tip
1781
- }
1782
-
1783
1797
 
1784
1798
  // POPOVER PLUGIN DEFINITION
1785
1799
  // =========================
@@ -1790,7 +1804,7 @@ if (typeof jQuery === 'undefined') {
1790
1804
  var data = $this.data('bs.popover')
1791
1805
  var options = typeof option == 'object' && option
1792
1806
 
1793
- if (!data && option == 'destroy') return
1807
+ if (!data && /destroy|hide/.test(option)) return
1794
1808
  if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
1795
1809
  if (typeof option == 'string') data[option]()
1796
1810
  })
@@ -1813,7 +1827,7 @@ if (typeof jQuery === 'undefined') {
1813
1827
  }(jQuery);
1814
1828
 
1815
1829
  /* ========================================================================
1816
- * Bootstrap: scrollspy.js v3.3.2
1830
+ * Bootstrap: scrollspy.js v3.3.4
1817
1831
  * http://getbootstrap.com/javascript/#scrollspy
1818
1832
  * ========================================================================
1819
1833
  * Copyright 2011-2015 Twitter, Inc.
@@ -1828,10 +1842,8 @@ if (typeof jQuery === 'undefined') {
1828
1842
  // ==========================
1829
1843
 
1830
1844
  function ScrollSpy(element, options) {
1831
- var process = $.proxy(this.process, this)
1832
-
1833
- this.$body = $('body')
1834
- this.$scrollElement = $(element).is('body') ? $(window) : $(element)
1845
+ this.$body = $(document.body)
1846
+ this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
1835
1847
  this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
1836
1848
  this.selector = (this.options.target || '') + ' .nav li > a'
1837
1849
  this.offsets = []
@@ -1839,12 +1851,12 @@ if (typeof jQuery === 'undefined') {
1839
1851
  this.activeTarget = null
1840
1852
  this.scrollHeight = 0
1841
1853
 
1842
- this.$scrollElement.on('scroll.bs.scrollspy', process)
1854
+ this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
1843
1855
  this.refresh()
1844
1856
  this.process()
1845
1857
  }
1846
1858
 
1847
- ScrollSpy.VERSION = '3.3.2'
1859
+ ScrollSpy.VERSION = '3.3.4'
1848
1860
 
1849
1861
  ScrollSpy.DEFAULTS = {
1850
1862
  offset: 10
@@ -1855,20 +1867,19 @@ if (typeof jQuery === 'undefined') {
1855
1867
  }
1856
1868
 
1857
1869
  ScrollSpy.prototype.refresh = function () {
1858
- var offsetMethod = 'offset'
1859
- var offsetBase = 0
1870
+ var that = this
1871
+ var offsetMethod = 'offset'
1872
+ var offsetBase = 0
1873
+
1874
+ this.offsets = []
1875
+ this.targets = []
1876
+ this.scrollHeight = this.getScrollHeight()
1860
1877
 
1861
1878
  if (!$.isWindow(this.$scrollElement[0])) {
1862
1879
  offsetMethod = 'position'
1863
1880
  offsetBase = this.$scrollElement.scrollTop()
1864
1881
  }
1865
1882
 
1866
- this.offsets = []
1867
- this.targets = []
1868
- this.scrollHeight = this.getScrollHeight()
1869
-
1870
- var self = this
1871
-
1872
1883
  this.$body
1873
1884
  .find(this.selector)
1874
1885
  .map(function () {
@@ -1883,8 +1894,8 @@ if (typeof jQuery === 'undefined') {
1883
1894
  })
1884
1895
  .sort(function (a, b) { return a[0] - b[0] })
1885
1896
  .each(function () {
1886
- self.offsets.push(this[0])
1887
- self.targets.push(this[1])
1897
+ that.offsets.push(this[0])
1898
+ that.targets.push(this[1])
1888
1899
  })
1889
1900
  }
1890
1901
 
@@ -1913,7 +1924,7 @@ if (typeof jQuery === 'undefined') {
1913
1924
  for (i = offsets.length; i--;) {
1914
1925
  activeTarget != targets[i]
1915
1926
  && scrollTop >= offsets[i]
1916
- && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
1927
+ && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])
1917
1928
  && this.activate(targets[i])
1918
1929
  }
1919
1930
  }
@@ -1924,8 +1935,8 @@ if (typeof jQuery === 'undefined') {
1924
1935
  this.clear()
1925
1936
 
1926
1937
  var selector = this.selector +
1927
- '[data-target="' + target + '"],' +
1928
- this.selector + '[href="' + target + '"]'
1938
+ '[data-target="' + target + '"],' +
1939
+ this.selector + '[href="' + target + '"]'
1929
1940
 
1930
1941
  var active = $(selector)
1931
1942
  .parents('li')
@@ -1989,7 +2000,7 @@ if (typeof jQuery === 'undefined') {
1989
2000
  }(jQuery);
1990
2001
 
1991
2002
  /* ========================================================================
1992
- * Bootstrap: tab.js v3.3.2
2003
+ * Bootstrap: tab.js v3.3.4
1993
2004
  * http://getbootstrap.com/javascript/#tabs
1994
2005
  * ========================================================================
1995
2006
  * Copyright 2011-2015 Twitter, Inc.
@@ -2007,7 +2018,7 @@ if (typeof jQuery === 'undefined') {
2007
2018
  this.element = $(element)
2008
2019
  }
2009
2020
 
2010
- Tab.VERSION = '3.3.2'
2021
+ Tab.VERSION = '3.3.4'
2011
2022
 
2012
2023
  Tab.TRANSITION_DURATION = 150
2013
2024
 
@@ -2078,7 +2089,7 @@ if (typeof jQuery === 'undefined') {
2078
2089
  element.removeClass('fade')
2079
2090
  }
2080
2091
 
2081
- if (element.parent('.dropdown-menu')) {
2092
+ if (element.parent('.dropdown-menu').length) {
2082
2093
  element
2083
2094
  .closest('li.dropdown')
2084
2095
  .addClass('active')
@@ -2143,7 +2154,7 @@ if (typeof jQuery === 'undefined') {
2143
2154
  }(jQuery);
2144
2155
 
2145
2156
  /* ========================================================================
2146
- * Bootstrap: affix.js v3.3.2
2157
+ * Bootstrap: affix.js v3.3.4
2147
2158
  * http://getbootstrap.com/javascript/#affix
2148
2159
  * ========================================================================
2149
2160
  * Copyright 2011-2015 Twitter, Inc.
@@ -2165,14 +2176,14 @@ if (typeof jQuery === 'undefined') {
2165
2176
  .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))
2166
2177
 
2167
2178
  this.$element = $(element)
2168
- this.affixed =
2169
- this.unpin =
2179
+ this.affixed = null
2180
+ this.unpin = null
2170
2181
  this.pinnedOffset = null
2171
2182
 
2172
2183
  this.checkPosition()
2173
2184
  }
2174
2185
 
2175
- Affix.VERSION = '3.3.2'
2186
+ Affix.VERSION = '3.3.4'
2176
2187
 
2177
2188
  Affix.RESET = 'affix affix-top affix-bottom'
2178
2189
 
@@ -2222,7 +2233,7 @@ if (typeof jQuery === 'undefined') {
2222
2233
  var offset = this.options.offset
2223
2234
  var offsetTop = offset.top
2224
2235
  var offsetBottom = offset.bottom
2225
- var scrollHeight = $('body').height()
2236
+ var scrollHeight = $(document.body).height()
2226
2237
 
2227
2238
  if (typeof offset != 'object') offsetBottom = offsetTop = offset
2228
2239
  if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element)