bootstrap-sass 3.3.3 → 3.3.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

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)