bootstrap-sass 3.3.5 → 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.
Files changed (114) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +1 -0
  3. data/.travis.yml +8 -12
  4. data/CHANGELOG.md +20 -0
  5. data/Gemfile +1 -4
  6. data/LICENSE +2 -1
  7. data/README.md +79 -74
  8. data/Rakefile +46 -11
  9. data/assets/javascripts/bootstrap/affix.js +7 -5
  10. data/assets/javascripts/bootstrap/alert.js +6 -5
  11. data/assets/javascripts/bootstrap/button.js +14 -9
  12. data/assets/javascripts/bootstrap/carousel.js +16 -7
  13. data/assets/javascripts/bootstrap/collapse.js +7 -6
  14. data/assets/javascripts/bootstrap/dropdown.js +7 -7
  15. data/assets/javascripts/bootstrap/modal.js +44 -23
  16. data/assets/javascripts/bootstrap/popover.js +25 -10
  17. data/assets/javascripts/bootstrap/scrollspy.js +4 -4
  18. data/assets/javascripts/bootstrap/tab.js +10 -10
  19. data/assets/javascripts/bootstrap/tooltip.js +177 -14
  20. data/assets/javascripts/bootstrap/transition.js +5 -5
  21. data/assets/javascripts/bootstrap-sprockets.js +2 -2
  22. data/assets/javascripts/bootstrap.js +326 -109
  23. data/assets/javascripts/bootstrap.min.js +3 -4
  24. data/assets/stylesheets/_bootstrap-mincer.scss +2 -2
  25. data/assets/stylesheets/_bootstrap.scss +2 -2
  26. data/assets/stylesheets/bootstrap/_alerts.scss +3 -3
  27. data/assets/stylesheets/bootstrap/_badges.scss +3 -3
  28. data/assets/stylesheets/bootstrap/_breadcrumbs.scss +3 -1
  29. data/assets/stylesheets/bootstrap/_button-groups.scss +8 -8
  30. data/assets/stylesheets/bootstrap/_buttons.scss +4 -4
  31. data/assets/stylesheets/bootstrap/_carousel.scss +33 -31
  32. data/assets/stylesheets/bootstrap/_close.scss +1 -0
  33. data/assets/stylesheets/bootstrap/_code.scss +3 -3
  34. data/assets/stylesheets/bootstrap/_component-animations.scss +1 -0
  35. data/assets/stylesheets/bootstrap/_dropdowns.scss +20 -23
  36. data/assets/stylesheets/bootstrap/_forms.scss +56 -60
  37. data/assets/stylesheets/bootstrap/_glyphicons.scss +11 -11
  38. data/assets/stylesheets/bootstrap/_grid.scss +10 -0
  39. data/assets/stylesheets/bootstrap/_input-groups.scss +9 -5
  40. data/assets/stylesheets/bootstrap/_jumbotron.scss +5 -3
  41. data/assets/stylesheets/bootstrap/_labels.scss +1 -1
  42. data/assets/stylesheets/bootstrap/_list-group.scss +30 -32
  43. data/assets/stylesheets/bootstrap/_media.scss +1 -1
  44. data/assets/stylesheets/bootstrap/_modals.scss +8 -8
  45. data/assets/stylesheets/bootstrap/_navbar.scss +75 -81
  46. data/assets/stylesheets/bootstrap/_navs.scss +4 -4
  47. data/assets/stylesheets/bootstrap/_normalize.scss +5 -2
  48. data/assets/stylesheets/bootstrap/_pager.scss +2 -2
  49. data/assets/stylesheets/bootstrap/_pagination.scss +13 -16
  50. data/assets/stylesheets/bootstrap/_panels.scss +5 -5
  51. data/assets/stylesheets/bootstrap/_popovers.scss +47 -52
  52. data/assets/stylesheets/bootstrap/_print.scss +90 -92
  53. data/assets/stylesheets/bootstrap/_progress-bars.scss +3 -3
  54. data/assets/stylesheets/bootstrap/_responsive-embed.scss +2 -2
  55. data/assets/stylesheets/bootstrap/_responsive-utilities.scss +3 -3
  56. data/assets/stylesheets/bootstrap/_scaffolding.scss +7 -7
  57. data/assets/stylesheets/bootstrap/_tables.scss +23 -23
  58. data/assets/stylesheets/bootstrap/_theme.scss +21 -17
  59. data/assets/stylesheets/bootstrap/_thumbnails.scss +1 -1
  60. data/assets/stylesheets/bootstrap/_tooltip.scss +38 -27
  61. data/assets/stylesheets/bootstrap/_type.scss +11 -11
  62. data/assets/stylesheets/bootstrap/_variables.scss +9 -7
  63. data/assets/stylesheets/bootstrap/_wells.scss +2 -2
  64. data/assets/stylesheets/bootstrap/mixins/_alerts.scss +2 -1
  65. data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +4 -4
  66. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +7 -14
  67. data/assets/stylesheets/bootstrap/mixins/_center-block.scss +1 -1
  68. data/assets/stylesheets/bootstrap/mixins/_clearfix.scss +1 -1
  69. data/assets/stylesheets/bootstrap/mixins/_forms.scss +4 -4
  70. data/assets/stylesheets/bootstrap/mixins/_gradients.scss +6 -8
  71. data/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +1 -1
  72. data/assets/stylesheets/bootstrap/mixins/_grid.scss +7 -7
  73. data/assets/stylesheets/bootstrap/mixins/_hide-text.scss +1 -1
  74. data/assets/stylesheets/bootstrap/mixins/_image.scss +5 -10
  75. data/assets/stylesheets/bootstrap/mixins/_opacity.scss +2 -3
  76. data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +4 -4
  77. data/assets/stylesheets/bootstrap/mixins/_resize.scss +1 -1
  78. data/assets/stylesheets/bootstrap/mixins/_responsive-visibility.scss +0 -4
  79. data/assets/stylesheets/bootstrap/mixins/_tab-focus.scss +3 -3
  80. data/assets/stylesheets/bootstrap/mixins/_vendor-prefixes.scss +3 -3
  81. data/bootstrap-sass.gemspec +10 -9
  82. data/bower.json +4 -3
  83. data/composer.json +2 -2
  84. data/eyeglass-exports.js +7 -0
  85. data/lib/bootstrap-sass/engine.rb +6 -1
  86. data/lib/bootstrap-sass/version.rb +2 -2
  87. data/lib/bootstrap-sass.rb +17 -10
  88. data/package-lock.json +1611 -0
  89. data/package.json +20 -6
  90. data/sache.json +1 -1
  91. data/tasks/converter/less_conversion.rb +12 -8
  92. data/tasks/converter/network.rb +2 -2
  93. data/templates/project/_bootstrap-variables.sass +10 -8
  94. data/test/compilation_test.rb +24 -12
  95. data/test/dummy_rails/config/application.rb +2 -1
  96. data/test/dummy_rails/config/boot.rb +1 -1
  97. data/test/dummy_sass_only/Gemfile +1 -1
  98. data/test/dummy_sass_only/compile.rb +14 -7
  99. data/test/dummy_sass_only/import_all.scss +2 -0
  100. data/test/gemfiles/default.gemfile +3 -0
  101. data/test/node_mincer_test.rb +2 -3
  102. data/test/node_sass_compile_test.sh +4 -3
  103. data/test/sass_test.rb +10 -7
  104. data/test/sprockets_rails_test.rb +12 -8
  105. data/test/support/dummy_rails_integration.rb +1 -1
  106. data/test/support/reporting.rb +10 -0
  107. data/test/test_helper.rb +3 -2
  108. metadata +37 -28
  109. data/test/compass_test.rb +0 -9
  110. data/test/dummy_sass_only/import_all.sass +0 -2
  111. data/test/gemfiles/sass_3_2.gemfile +0 -6
  112. data/test/gemfiles/sass_3_3.gemfile +0 -6
  113. data/test/gemfiles/sass_3_4.gemfile +0 -7
  114. data/test/gemfiles/sass_head.gemfile +0 -6
@@ -1,6 +1,6 @@
1
1
  /*!
2
- * Bootstrap v3.3.5 (http://getbootstrap.com)
3
- * Copyright 2011-2015 Twitter, Inc.
2
+ * Bootstrap v3.4.1 (https://getbootstrap.com/)
3
+ * Copyright 2011-2019 Twitter, Inc.
4
4
  * Licensed under the MIT license
5
5
  */
6
6
 
@@ -11,16 +11,16 @@ if (typeof jQuery === 'undefined') {
11
11
  +function ($) {
12
12
  'use strict';
13
13
  var version = $.fn.jquery.split(' ')[0].split('.')
14
- if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1)) {
15
- throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher')
14
+ if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 3)) {
15
+ throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4')
16
16
  }
17
17
  }(jQuery);
18
18
 
19
19
  /* ========================================================================
20
- * Bootstrap: transition.js v3.3.5
21
- * http://getbootstrap.com/javascript/#transitions
20
+ * Bootstrap: transition.js v3.4.1
21
+ * https://getbootstrap.com/docs/3.4/javascript/#transitions
22
22
  * ========================================================================
23
- * Copyright 2011-2015 Twitter, Inc.
23
+ * Copyright 2011-2019 Twitter, Inc.
24
24
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
25
25
  * ======================================================================== */
26
26
 
@@ -28,7 +28,7 @@ if (typeof jQuery === 'undefined') {
28
28
  +function ($) {
29
29
  'use strict';
30
30
 
31
- // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
31
+ // CSS TRANSITION SUPPORT (Shoutout: https://modernizr.com/)
32
32
  // ============================================================
33
33
 
34
34
  function transitionEnd() {
@@ -50,7 +50,7 @@ if (typeof jQuery === 'undefined') {
50
50
  return false // explicit for ie8 ( ._.)
51
51
  }
52
52
 
53
- // http://blog.alexmaccaw.com/css-transitions
53
+ // https://blog.alexmaccaw.com/css-transitions
54
54
  $.fn.emulateTransitionEnd = function (duration) {
55
55
  var called = false
56
56
  var $el = this
@@ -77,10 +77,10 @@ if (typeof jQuery === 'undefined') {
77
77
  }(jQuery);
78
78
 
79
79
  /* ========================================================================
80
- * Bootstrap: alert.js v3.3.5
81
- * http://getbootstrap.com/javascript/#alerts
80
+ * Bootstrap: alert.js v3.4.1
81
+ * https://getbootstrap.com/docs/3.4/javascript/#alerts
82
82
  * ========================================================================
83
- * Copyright 2011-2015 Twitter, Inc.
83
+ * Copyright 2011-2019 Twitter, Inc.
84
84
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
85
85
  * ======================================================================== */
86
86
 
@@ -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.5'
99
+ Alert.VERSION = '3.4.1'
100
100
 
101
101
  Alert.TRANSITION_DURATION = 150
102
102
 
@@ -109,7 +109,8 @@ if (typeof jQuery === 'undefined') {
109
109
  selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
110
110
  }
111
111
 
112
- var $parent = $(selector)
112
+ selector = selector === '#' ? [] : selector
113
+ var $parent = $(document).find(selector)
113
114
 
114
115
  if (e) e.preventDefault()
115
116
 
@@ -172,10 +173,10 @@ if (typeof jQuery === 'undefined') {
172
173
  }(jQuery);
173
174
 
174
175
  /* ========================================================================
175
- * Bootstrap: button.js v3.3.5
176
- * http://getbootstrap.com/javascript/#buttons
176
+ * Bootstrap: button.js v3.4.1
177
+ * https://getbootstrap.com/docs/3.4/javascript/#buttons
177
178
  * ========================================================================
178
- * Copyright 2011-2015 Twitter, Inc.
179
+ * Copyright 2011-2019 Twitter, Inc.
179
180
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
180
181
  * ======================================================================== */
181
182
 
@@ -192,7 +193,7 @@ if (typeof jQuery === 'undefined') {
192
193
  this.isLoading = false
193
194
  }
194
195
 
195
- Button.VERSION = '3.3.5'
196
+ Button.VERSION = '3.4.1'
196
197
 
197
198
  Button.DEFAULTS = {
198
199
  loadingText: 'loading...'
@@ -214,10 +215,10 @@ if (typeof jQuery === 'undefined') {
214
215
 
215
216
  if (state == 'loadingText') {
216
217
  this.isLoading = true
217
- $el.addClass(d).attr(d, d)
218
+ $el.addClass(d).attr(d, d).prop(d, true)
218
219
  } else if (this.isLoading) {
219
220
  this.isLoading = false
220
- $el.removeClass(d).removeAttr(d)
221
+ $el.removeClass(d).removeAttr(d).prop(d, false)
221
222
  }
222
223
  }, this), 0)
223
224
  }
@@ -281,10 +282,15 @@ if (typeof jQuery === 'undefined') {
281
282
 
282
283
  $(document)
283
284
  .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
284
- var $btn = $(e.target)
285
- if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
285
+ var $btn = $(e.target).closest('.btn')
286
286
  Plugin.call($btn, 'toggle')
287
- if (!($(e.target).is('input[type="radio"]') || $(e.target).is('input[type="checkbox"]'))) e.preventDefault()
287
+ if (!($(e.target).is('input[type="radio"], input[type="checkbox"]'))) {
288
+ // Prevent double click on radios, and the double selections (so cancellation) on checkboxes
289
+ e.preventDefault()
290
+ // The target component still receive the focus
291
+ if ($btn.is('input,button')) $btn.trigger('focus')
292
+ else $btn.find('input:visible,button:visible').first().trigger('focus')
293
+ }
288
294
  })
289
295
  .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
290
296
  $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
@@ -293,10 +299,10 @@ if (typeof jQuery === 'undefined') {
293
299
  }(jQuery);
294
300
 
295
301
  /* ========================================================================
296
- * Bootstrap: carousel.js v3.3.5
297
- * http://getbootstrap.com/javascript/#carousel
302
+ * Bootstrap: carousel.js v3.4.1
303
+ * https://getbootstrap.com/docs/3.4/javascript/#carousel
298
304
  * ========================================================================
299
- * Copyright 2011-2015 Twitter, Inc.
305
+ * Copyright 2011-2019 Twitter, Inc.
300
306
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
301
307
  * ======================================================================== */
302
308
 
@@ -324,7 +330,7 @@ if (typeof jQuery === 'undefined') {
324
330
  .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
325
331
  }
326
332
 
327
- Carousel.VERSION = '3.3.5'
333
+ Carousel.VERSION = '3.4.1'
328
334
 
329
335
  Carousel.TRANSITION_DURATION = 600
330
336
 
@@ -438,7 +444,9 @@ if (typeof jQuery === 'undefined') {
438
444
  var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
439
445
  if ($.support.transition && this.$element.hasClass('slide')) {
440
446
  $next.addClass(type)
441
- $next[0].offsetWidth // force reflow
447
+ if (typeof $next === 'object' && $next.length) {
448
+ $next[0].offsetWidth // force reflow
449
+ }
442
450
  $active.addClass(direction)
443
451
  $next.addClass(direction)
444
452
  $active
@@ -500,10 +508,17 @@ if (typeof jQuery === 'undefined') {
500
508
  // =================
501
509
 
502
510
  var clickHandler = function (e) {
503
- var href
504
511
  var $this = $(this)
505
- var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
512
+ var href = $this.attr('href')
513
+ if (href) {
514
+ href = href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
515
+ }
516
+
517
+ var target = $this.attr('data-target') || href
518
+ var $target = $(document).find(target)
519
+
506
520
  if (!$target.hasClass('carousel')) return
521
+
507
522
  var options = $.extend({}, $target.data(), $this.data())
508
523
  var slideIndex = $this.attr('data-slide-to')
509
524
  if (slideIndex) options.interval = false
@@ -531,13 +546,14 @@ if (typeof jQuery === 'undefined') {
531
546
  }(jQuery);
532
547
 
533
548
  /* ========================================================================
534
- * Bootstrap: collapse.js v3.3.5
535
- * http://getbootstrap.com/javascript/#collapse
549
+ * Bootstrap: collapse.js v3.4.1
550
+ * https://getbootstrap.com/docs/3.4/javascript/#collapse
536
551
  * ========================================================================
537
- * Copyright 2011-2015 Twitter, Inc.
552
+ * Copyright 2011-2019 Twitter, Inc.
538
553
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
539
554
  * ======================================================================== */
540
555
 
556
+ /* jshint latedef: false */
541
557
 
542
558
  +function ($) {
543
559
  'use strict';
@@ -561,7 +577,7 @@ if (typeof jQuery === 'undefined') {
561
577
  if (this.options.toggle) this.toggle()
562
578
  }
563
579
 
564
- Collapse.VERSION = '3.3.5'
580
+ Collapse.VERSION = '3.4.1'
565
581
 
566
582
  Collapse.TRANSITION_DURATION = 350
567
583
 
@@ -668,7 +684,7 @@ if (typeof jQuery === 'undefined') {
668
684
  }
669
685
 
670
686
  Collapse.prototype.getParent = function () {
671
- return $(this.options.parent)
687
+ return $(document).find(this.options.parent)
672
688
  .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
673
689
  .each($.proxy(function (i, element) {
674
690
  var $element = $(element)
@@ -691,7 +707,7 @@ if (typeof jQuery === 'undefined') {
691
707
  var target = $trigger.attr('data-target')
692
708
  || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
693
709
 
694
- return $(target)
710
+ return $(document).find(target)
695
711
  }
696
712
 
697
713
 
@@ -743,10 +759,10 @@ if (typeof jQuery === 'undefined') {
743
759
  }(jQuery);
744
760
 
745
761
  /* ========================================================================
746
- * Bootstrap: dropdown.js v3.3.5
747
- * http://getbootstrap.com/javascript/#dropdowns
762
+ * Bootstrap: dropdown.js v3.4.1
763
+ * https://getbootstrap.com/docs/3.4/javascript/#dropdowns
748
764
  * ========================================================================
749
- * Copyright 2011-2015 Twitter, Inc.
765
+ * Copyright 2011-2019 Twitter, Inc.
750
766
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
751
767
  * ======================================================================== */
752
768
 
@@ -763,7 +779,7 @@ if (typeof jQuery === 'undefined') {
763
779
  $(element).on('click.bs.dropdown', this.toggle)
764
780
  }
765
781
 
766
- Dropdown.VERSION = '3.3.5'
782
+ Dropdown.VERSION = '3.4.1'
767
783
 
768
784
  function getParent($this) {
769
785
  var selector = $this.attr('data-target')
@@ -773,7 +789,7 @@ if (typeof jQuery === 'undefined') {
773
789
  selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
774
790
  }
775
791
 
776
- var $parent = selector && $(selector)
792
+ var $parent = selector !== '#' ? $(document).find(selector) : null
777
793
 
778
794
  return $parent && $parent.length ? $parent : $this.parent()
779
795
  }
@@ -795,7 +811,7 @@ if (typeof jQuery === 'undefined') {
795
811
  if (e.isDefaultPrevented()) return
796
812
 
797
813
  $this.attr('aria-expanded', 'false')
798
- $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)
814
+ $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))
799
815
  })
800
816
  }
801
817
 
@@ -829,7 +845,7 @@ if (typeof jQuery === 'undefined') {
829
845
 
830
846
  $parent
831
847
  .toggleClass('open')
832
- .trigger('shown.bs.dropdown', relatedTarget)
848
+ .trigger($.Event('shown.bs.dropdown', relatedTarget))
833
849
  }
834
850
 
835
851
  return false
@@ -909,10 +925,10 @@ if (typeof jQuery === 'undefined') {
909
925
  }(jQuery);
910
926
 
911
927
  /* ========================================================================
912
- * Bootstrap: modal.js v3.3.5
913
- * http://getbootstrap.com/javascript/#modals
928
+ * Bootstrap: modal.js v3.4.1
929
+ * https://getbootstrap.com/docs/3.4/javascript/#modals
914
930
  * ========================================================================
915
- * Copyright 2011-2015 Twitter, Inc.
931
+ * Copyright 2011-2019 Twitter, Inc.
916
932
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
917
933
  * ======================================================================== */
918
934
 
@@ -924,15 +940,16 @@ if (typeof jQuery === 'undefined') {
924
940
  // ======================
925
941
 
926
942
  var Modal = function (element, options) {
927
- this.options = options
928
- this.$body = $(document.body)
929
- this.$element = $(element)
930
- this.$dialog = this.$element.find('.modal-dialog')
931
- this.$backdrop = null
932
- this.isShown = null
933
- this.originalBodyPad = null
934
- this.scrollbarWidth = 0
943
+ this.options = options
944
+ this.$body = $(document.body)
945
+ this.$element = $(element)
946
+ this.$dialog = this.$element.find('.modal-dialog')
947
+ this.$backdrop = null
948
+ this.isShown = null
949
+ this.originalBodyPad = null
950
+ this.scrollbarWidth = 0
935
951
  this.ignoreBackdropClick = false
952
+ this.fixedContent = '.navbar-fixed-top, .navbar-fixed-bottom'
936
953
 
937
954
  if (this.options.remote) {
938
955
  this.$element
@@ -943,7 +960,7 @@ if (typeof jQuery === 'undefined') {
943
960
  }
944
961
  }
945
962
 
946
- Modal.VERSION = '3.3.5'
963
+ Modal.VERSION = '3.4.1'
947
964
 
948
965
  Modal.TRANSITION_DURATION = 300
949
966
  Modal.BACKDROP_TRANSITION_DURATION = 150
@@ -960,7 +977,7 @@ if (typeof jQuery === 'undefined') {
960
977
 
961
978
  Modal.prototype.show = function (_relatedTarget) {
962
979
  var that = this
963
- var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
980
+ var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
964
981
 
965
982
  this.$element.trigger(e)
966
983
 
@@ -1050,7 +1067,9 @@ if (typeof jQuery === 'undefined') {
1050
1067
  $(document)
1051
1068
  .off('focusin.bs.modal') // guard against infinite focus loop
1052
1069
  .on('focusin.bs.modal', $.proxy(function (e) {
1053
- if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
1070
+ if (document !== e.target &&
1071
+ this.$element[0] !== e.target &&
1072
+ !this.$element.has(e.target).length) {
1054
1073
  this.$element.trigger('focus')
1055
1074
  }
1056
1075
  }, this))
@@ -1152,7 +1171,7 @@ if (typeof jQuery === 'undefined') {
1152
1171
  var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
1153
1172
 
1154
1173
  this.$element.css({
1155
- paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
1174
+ paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
1156
1175
  paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
1157
1176
  })
1158
1177
  }
@@ -1177,11 +1196,26 @@ if (typeof jQuery === 'undefined') {
1177
1196
  Modal.prototype.setScrollbar = function () {
1178
1197
  var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
1179
1198
  this.originalBodyPad = document.body.style.paddingRight || ''
1180
- if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
1199
+ var scrollbarWidth = this.scrollbarWidth
1200
+ if (this.bodyIsOverflowing) {
1201
+ this.$body.css('padding-right', bodyPad + scrollbarWidth)
1202
+ $(this.fixedContent).each(function (index, element) {
1203
+ var actualPadding = element.style.paddingRight
1204
+ var calculatedPadding = $(element).css('padding-right')
1205
+ $(element)
1206
+ .data('padding-right', actualPadding)
1207
+ .css('padding-right', parseFloat(calculatedPadding) + scrollbarWidth + 'px')
1208
+ })
1209
+ }
1181
1210
  }
1182
1211
 
1183
1212
  Modal.prototype.resetScrollbar = function () {
1184
1213
  this.$body.css('padding-right', this.originalBodyPad)
1214
+ $(this.fixedContent).each(function (index, element) {
1215
+ var padding = $(element).data('padding-right')
1216
+ $(element).removeData('padding-right')
1217
+ element.style.paddingRight = padding ? padding : ''
1218
+ })
1185
1219
  }
1186
1220
 
1187
1221
  Modal.prototype.measureScrollbar = function () { // thx walsh
@@ -1199,8 +1233,8 @@ if (typeof jQuery === 'undefined') {
1199
1233
 
1200
1234
  function Plugin(option, _relatedTarget) {
1201
1235
  return this.each(function () {
1202
- var $this = $(this)
1203
- var data = $this.data('bs.modal')
1236
+ var $this = $(this)
1237
+ var data = $this.data('bs.modal')
1204
1238
  var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
1205
1239
 
1206
1240
  if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
@@ -1211,7 +1245,7 @@ if (typeof jQuery === 'undefined') {
1211
1245
 
1212
1246
  var old = $.fn.modal
1213
1247
 
1214
- $.fn.modal = Plugin
1248
+ $.fn.modal = Plugin
1215
1249
  $.fn.modal.Constructor = Modal
1216
1250
 
1217
1251
 
@@ -1228,10 +1262,13 @@ if (typeof jQuery === 'undefined') {
1228
1262
  // ==============
1229
1263
 
1230
1264
  $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
1231
- var $this = $(this)
1232
- var href = $this.attr('href')
1233
- var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
1234
- var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
1265
+ var $this = $(this)
1266
+ var href = $this.attr('href')
1267
+ var target = $this.attr('data-target') ||
1268
+ (href && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
1269
+
1270
+ var $target = $(document).find(target)
1271
+ var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
1235
1272
 
1236
1273
  if ($this.is('a')) e.preventDefault()
1237
1274
 
@@ -1247,18 +1284,148 @@ if (typeof jQuery === 'undefined') {
1247
1284
  }(jQuery);
1248
1285
 
1249
1286
  /* ========================================================================
1250
- * Bootstrap: tooltip.js v3.3.5
1251
- * http://getbootstrap.com/javascript/#tooltip
1287
+ * Bootstrap: tooltip.js v3.4.1
1288
+ * https://getbootstrap.com/docs/3.4/javascript/#tooltip
1252
1289
  * Inspired by the original jQuery.tipsy by Jason Frame
1253
1290
  * ========================================================================
1254
- * Copyright 2011-2015 Twitter, Inc.
1291
+ * Copyright 2011-2019 Twitter, Inc.
1255
1292
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1256
1293
  * ======================================================================== */
1257
1294
 
1258
-
1259
1295
  +function ($) {
1260
1296
  'use strict';
1261
1297
 
1298
+ var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']
1299
+
1300
+ var uriAttrs = [
1301
+ 'background',
1302
+ 'cite',
1303
+ 'href',
1304
+ 'itemtype',
1305
+ 'longdesc',
1306
+ 'poster',
1307
+ 'src',
1308
+ 'xlink:href'
1309
+ ]
1310
+
1311
+ var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i
1312
+
1313
+ var DefaultWhitelist = {
1314
+ // Global attributes allowed on any supplied element below.
1315
+ '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],
1316
+ a: ['target', 'href', 'title', 'rel'],
1317
+ area: [],
1318
+ b: [],
1319
+ br: [],
1320
+ col: [],
1321
+ code: [],
1322
+ div: [],
1323
+ em: [],
1324
+ hr: [],
1325
+ h1: [],
1326
+ h2: [],
1327
+ h3: [],
1328
+ h4: [],
1329
+ h5: [],
1330
+ h6: [],
1331
+ i: [],
1332
+ img: ['src', 'alt', 'title', 'width', 'height'],
1333
+ li: [],
1334
+ ol: [],
1335
+ p: [],
1336
+ pre: [],
1337
+ s: [],
1338
+ small: [],
1339
+ span: [],
1340
+ sub: [],
1341
+ sup: [],
1342
+ strong: [],
1343
+ u: [],
1344
+ ul: []
1345
+ }
1346
+
1347
+ /**
1348
+ * A pattern that recognizes a commonly useful subset of URLs that are safe.
1349
+ *
1350
+ * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
1351
+ */
1352
+ var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi
1353
+
1354
+ /**
1355
+ * A pattern that matches safe data URLs. Only matches image, video and audio types.
1356
+ *
1357
+ * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
1358
+ */
1359
+ var DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i
1360
+
1361
+ function allowedAttribute(attr, allowedAttributeList) {
1362
+ var attrName = attr.nodeName.toLowerCase()
1363
+
1364
+ if ($.inArray(attrName, allowedAttributeList) !== -1) {
1365
+ if ($.inArray(attrName, uriAttrs) !== -1) {
1366
+ return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN))
1367
+ }
1368
+
1369
+ return true
1370
+ }
1371
+
1372
+ var regExp = $(allowedAttributeList).filter(function (index, value) {
1373
+ return value instanceof RegExp
1374
+ })
1375
+
1376
+ // Check if a regular expression validates the attribute.
1377
+ for (var i = 0, l = regExp.length; i < l; i++) {
1378
+ if (attrName.match(regExp[i])) {
1379
+ return true
1380
+ }
1381
+ }
1382
+
1383
+ return false
1384
+ }
1385
+
1386
+ function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {
1387
+ if (unsafeHtml.length === 0) {
1388
+ return unsafeHtml
1389
+ }
1390
+
1391
+ if (sanitizeFn && typeof sanitizeFn === 'function') {
1392
+ return sanitizeFn(unsafeHtml)
1393
+ }
1394
+
1395
+ // IE 8 and below don't support createHTMLDocument
1396
+ if (!document.implementation || !document.implementation.createHTMLDocument) {
1397
+ return unsafeHtml
1398
+ }
1399
+
1400
+ var createdDocument = document.implementation.createHTMLDocument('sanitization')
1401
+ createdDocument.body.innerHTML = unsafeHtml
1402
+
1403
+ var whitelistKeys = $.map(whiteList, function (el, i) { return i })
1404
+ var elements = $(createdDocument.body).find('*')
1405
+
1406
+ for (var i = 0, len = elements.length; i < len; i++) {
1407
+ var el = elements[i]
1408
+ var elName = el.nodeName.toLowerCase()
1409
+
1410
+ if ($.inArray(elName, whitelistKeys) === -1) {
1411
+ el.parentNode.removeChild(el)
1412
+
1413
+ continue
1414
+ }
1415
+
1416
+ var attributeList = $.map(el.attributes, function (el) { return el })
1417
+ var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || [])
1418
+
1419
+ for (var j = 0, len2 = attributeList.length; j < len2; j++) {
1420
+ if (!allowedAttribute(attributeList[j], whitelistedAttributes)) {
1421
+ el.removeAttribute(attributeList[j].nodeName)
1422
+ }
1423
+ }
1424
+ }
1425
+
1426
+ return createdDocument.body.innerHTML
1427
+ }
1428
+
1262
1429
  // TOOLTIP PUBLIC CLASS DEFINITION
1263
1430
  // ===============================
1264
1431
 
@@ -1274,7 +1441,7 @@ if (typeof jQuery === 'undefined') {
1274
1441
  this.init('tooltip', element, options)
1275
1442
  }
1276
1443
 
1277
- Tooltip.VERSION = '3.3.5'
1444
+ Tooltip.VERSION = '3.4.1'
1278
1445
 
1279
1446
  Tooltip.TRANSITION_DURATION = 150
1280
1447
 
@@ -1291,7 +1458,10 @@ if (typeof jQuery === 'undefined') {
1291
1458
  viewport: {
1292
1459
  selector: 'body',
1293
1460
  padding: 0
1294
- }
1461
+ },
1462
+ sanitize : true,
1463
+ sanitizeFn : null,
1464
+ whiteList : DefaultWhitelist
1295
1465
  }
1296
1466
 
1297
1467
  Tooltip.prototype.init = function (type, element, options) {
@@ -1299,7 +1469,7 @@ if (typeof jQuery === 'undefined') {
1299
1469
  this.type = type
1300
1470
  this.$element = $(element)
1301
1471
  this.options = this.getOptions(options)
1302
- this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))
1472
+ this.$viewport = this.options.viewport && $(document).find($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))
1303
1473
  this.inState = { click: false, hover: false, focus: false }
1304
1474
 
1305
1475
  if (this.$element[0] instanceof document.constructor && !this.options.selector) {
@@ -1332,7 +1502,15 @@ if (typeof jQuery === 'undefined') {
1332
1502
  }
1333
1503
 
1334
1504
  Tooltip.prototype.getOptions = function (options) {
1335
- options = $.extend({}, this.getDefaults(), this.$element.data(), options)
1505
+ var dataAttributes = this.$element.data()
1506
+
1507
+ for (var dataAttr in dataAttributes) {
1508
+ if (dataAttributes.hasOwnProperty(dataAttr) && $.inArray(dataAttr, DISALLOWED_ATTRIBUTES) !== -1) {
1509
+ delete dataAttributes[dataAttr]
1510
+ }
1511
+ }
1512
+
1513
+ options = $.extend({}, this.getDefaults(), dataAttributes, options)
1336
1514
 
1337
1515
  if (options.delay && typeof options.delay == 'number') {
1338
1516
  options.delay = {
@@ -1341,6 +1519,10 @@ if (typeof jQuery === 'undefined') {
1341
1519
  }
1342
1520
  }
1343
1521
 
1522
+ if (options.sanitize) {
1523
+ options.template = sanitizeHtml(options.template, options.whiteList, options.sanitizeFn)
1524
+ }
1525
+
1344
1526
  return options
1345
1527
  }
1346
1528
 
@@ -1452,7 +1634,7 @@ if (typeof jQuery === 'undefined') {
1452
1634
  .addClass(placement)
1453
1635
  .data('bs.' + this.type, this)
1454
1636
 
1455
- this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
1637
+ this.options.container ? $tip.appendTo($(document).find(this.options.container)) : $tip.insertAfter(this.$element)
1456
1638
  this.$element.trigger('inserted.bs.' + this.type)
1457
1639
 
1458
1640
  var pos = this.getPosition()
@@ -1554,7 +1736,16 @@ if (typeof jQuery === 'undefined') {
1554
1736
  var $tip = this.tip()
1555
1737
  var title = this.getTitle()
1556
1738
 
1557
- $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
1739
+ if (this.options.html) {
1740
+ if (this.options.sanitize) {
1741
+ title = sanitizeHtml(title, this.options.whiteList, this.options.sanitizeFn)
1742
+ }
1743
+
1744
+ $tip.find('.tooltip-inner').html(title)
1745
+ } else {
1746
+ $tip.find('.tooltip-inner').text(title)
1747
+ }
1748
+
1558
1749
  $tip.removeClass('fade in top bottom left right')
1559
1750
  }
1560
1751
 
@@ -1565,9 +1756,11 @@ if (typeof jQuery === 'undefined') {
1565
1756
 
1566
1757
  function complete() {
1567
1758
  if (that.hoverState != 'in') $tip.detach()
1568
- that.$element
1569
- .removeAttr('aria-describedby')
1570
- .trigger('hidden.bs.' + that.type)
1759
+ if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary.
1760
+ that.$element
1761
+ .removeAttr('aria-describedby')
1762
+ .trigger('hidden.bs.' + that.type)
1763
+ }
1571
1764
  callback && callback()
1572
1765
  }
1573
1766
 
@@ -1610,7 +1803,10 @@ if (typeof jQuery === 'undefined') {
1610
1803
  // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
1611
1804
  elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
1612
1805
  }
1613
- var elOffset = isBody ? { top: 0, left: 0 } : $element.offset()
1806
+ var isSvg = window.SVGElement && el instanceof window.SVGElement
1807
+ // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3.
1808
+ // See https://github.com/twbs/bootstrap/issues/20280
1809
+ var elOffset = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset())
1614
1810
  var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
1615
1811
  var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
1616
1812
 
@@ -1726,9 +1922,13 @@ if (typeof jQuery === 'undefined') {
1726
1922
  that.$tip = null
1727
1923
  that.$arrow = null
1728
1924
  that.$viewport = null
1925
+ that.$element = null
1729
1926
  })
1730
1927
  }
1731
1928
 
1929
+ Tooltip.prototype.sanitizeHtml = function (unsafeHtml) {
1930
+ return sanitizeHtml(unsafeHtml, this.options.whiteList, this.options.sanitizeFn)
1931
+ }
1732
1932
 
1733
1933
  // TOOLTIP PLUGIN DEFINITION
1734
1934
  // =========================
@@ -1762,10 +1962,10 @@ if (typeof jQuery === 'undefined') {
1762
1962
  }(jQuery);
1763
1963
 
1764
1964
  /* ========================================================================
1765
- * Bootstrap: popover.js v3.3.5
1766
- * http://getbootstrap.com/javascript/#popovers
1965
+ * Bootstrap: popover.js v3.4.1
1966
+ * https://getbootstrap.com/docs/3.4/javascript/#popovers
1767
1967
  * ========================================================================
1768
- * Copyright 2011-2015 Twitter, Inc.
1968
+ * Copyright 2011-2019 Twitter, Inc.
1769
1969
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1770
1970
  * ======================================================================== */
1771
1971
 
@@ -1782,7 +1982,7 @@ if (typeof jQuery === 'undefined') {
1782
1982
 
1783
1983
  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
1784
1984
 
1785
- Popover.VERSION = '3.3.5'
1985
+ Popover.VERSION = '3.4.1'
1786
1986
 
1787
1987
  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
1788
1988
  placement: 'right',
@@ -1808,10 +2008,25 @@ if (typeof jQuery === 'undefined') {
1808
2008
  var title = this.getTitle()
1809
2009
  var content = this.getContent()
1810
2010
 
1811
- $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
1812
- $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events
1813
- this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
1814
- ](content)
2011
+ if (this.options.html) {
2012
+ var typeContent = typeof content
2013
+
2014
+ if (this.options.sanitize) {
2015
+ title = this.sanitizeHtml(title)
2016
+
2017
+ if (typeContent === 'string') {
2018
+ content = this.sanitizeHtml(content)
2019
+ }
2020
+ }
2021
+
2022
+ $tip.find('.popover-title').html(title)
2023
+ $tip.find('.popover-content').children().detach().end()[
2024
+ typeContent === 'string' ? 'html' : 'append'
2025
+ ](content)
2026
+ } else {
2027
+ $tip.find('.popover-title').text(title)
2028
+ $tip.find('.popover-content').children().detach().end().text(content)
2029
+ }
1815
2030
 
1816
2031
  $tip.removeClass('fade top bottom left right in')
1817
2032
 
@@ -1830,8 +2045,8 @@ if (typeof jQuery === 'undefined') {
1830
2045
 
1831
2046
  return $e.attr('data-content')
1832
2047
  || (typeof o.content == 'function' ?
1833
- o.content.call($e[0]) :
1834
- o.content)
2048
+ o.content.call($e[0]) :
2049
+ o.content)
1835
2050
  }
1836
2051
 
1837
2052
  Popover.prototype.arrow = function () {
@@ -1871,10 +2086,10 @@ if (typeof jQuery === 'undefined') {
1871
2086
  }(jQuery);
1872
2087
 
1873
2088
  /* ========================================================================
1874
- * Bootstrap: scrollspy.js v3.3.5
1875
- * http://getbootstrap.com/javascript/#scrollspy
2089
+ * Bootstrap: scrollspy.js v3.4.1
2090
+ * https://getbootstrap.com/docs/3.4/javascript/#scrollspy
1876
2091
  * ========================================================================
1877
- * Copyright 2011-2015 Twitter, Inc.
2092
+ * Copyright 2011-2019 Twitter, Inc.
1878
2093
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1879
2094
  * ======================================================================== */
1880
2095
 
@@ -1900,7 +2115,7 @@ if (typeof jQuery === 'undefined') {
1900
2115
  this.process()
1901
2116
  }
1902
2117
 
1903
- ScrollSpy.VERSION = '3.3.5'
2118
+ ScrollSpy.VERSION = '3.4.1'
1904
2119
 
1905
2120
  ScrollSpy.DEFAULTS = {
1906
2121
  offset: 10
@@ -2044,10 +2259,10 @@ if (typeof jQuery === 'undefined') {
2044
2259
  }(jQuery);
2045
2260
 
2046
2261
  /* ========================================================================
2047
- * Bootstrap: tab.js v3.3.5
2048
- * http://getbootstrap.com/javascript/#tabs
2262
+ * Bootstrap: tab.js v3.4.1
2263
+ * https://getbootstrap.com/docs/3.4/javascript/#tabs
2049
2264
  * ========================================================================
2050
- * Copyright 2011-2015 Twitter, Inc.
2265
+ * Copyright 2011-2019 Twitter, Inc.
2051
2266
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
2052
2267
  * ======================================================================== */
2053
2268
 
@@ -2064,7 +2279,7 @@ if (typeof jQuery === 'undefined') {
2064
2279
  // jscs:enable requireDollarBeforejQueryAssignment
2065
2280
  }
2066
2281
 
2067
- Tab.VERSION = '3.3.5'
2282
+ Tab.VERSION = '3.4.1'
2068
2283
 
2069
2284
  Tab.TRANSITION_DURATION = 150
2070
2285
 
@@ -2093,7 +2308,7 @@ if (typeof jQuery === 'undefined') {
2093
2308
 
2094
2309
  if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
2095
2310
 
2096
- var $target = $(selector)
2311
+ var $target = $(document).find(selector)
2097
2312
 
2098
2313
  this.activate($this.closest('li'), $ul)
2099
2314
  this.activate($target, $target.parent(), function () {
@@ -2118,15 +2333,15 @@ if (typeof jQuery === 'undefined') {
2118
2333
  $active
2119
2334
  .removeClass('active')
2120
2335
  .find('> .dropdown-menu > .active')
2121
- .removeClass('active')
2336
+ .removeClass('active')
2122
2337
  .end()
2123
2338
  .find('[data-toggle="tab"]')
2124
- .attr('aria-expanded', false)
2339
+ .attr('aria-expanded', false)
2125
2340
 
2126
2341
  element
2127
2342
  .addClass('active')
2128
2343
  .find('[data-toggle="tab"]')
2129
- .attr('aria-expanded', true)
2344
+ .attr('aria-expanded', true)
2130
2345
 
2131
2346
  if (transition) {
2132
2347
  element[0].offsetWidth // reflow for transition
@@ -2138,10 +2353,10 @@ if (typeof jQuery === 'undefined') {
2138
2353
  if (element.parent('.dropdown-menu').length) {
2139
2354
  element
2140
2355
  .closest('li.dropdown')
2141
- .addClass('active')
2356
+ .addClass('active')
2142
2357
  .end()
2143
2358
  .find('[data-toggle="tab"]')
2144
- .attr('aria-expanded', true)
2359
+ .attr('aria-expanded', true)
2145
2360
  }
2146
2361
 
2147
2362
  callback && callback()
@@ -2200,10 +2415,10 @@ if (typeof jQuery === 'undefined') {
2200
2415
  }(jQuery);
2201
2416
 
2202
2417
  /* ========================================================================
2203
- * Bootstrap: affix.js v3.3.5
2204
- * http://getbootstrap.com/javascript/#affix
2418
+ * Bootstrap: affix.js v3.4.1
2419
+ * https://getbootstrap.com/docs/3.4/javascript/#affix
2205
2420
  * ========================================================================
2206
- * Copyright 2011-2015 Twitter, Inc.
2421
+ * Copyright 2011-2019 Twitter, Inc.
2207
2422
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
2208
2423
  * ======================================================================== */
2209
2424
 
@@ -2217,7 +2432,9 @@ if (typeof jQuery === 'undefined') {
2217
2432
  var Affix = function (element, options) {
2218
2433
  this.options = $.extend({}, Affix.DEFAULTS, options)
2219
2434
 
2220
- this.$target = $(this.options.target)
2435
+ var target = this.options.target === Affix.DEFAULTS.target ? $(this.options.target) : $(document).find(this.options.target)
2436
+
2437
+ this.$target = target
2221
2438
  .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
2222
2439
  .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))
2223
2440
 
@@ -2229,7 +2446,7 @@ if (typeof jQuery === 'undefined') {
2229
2446
  this.checkPosition()
2230
2447
  }
2231
2448
 
2232
- Affix.VERSION = '3.3.5'
2449
+ Affix.VERSION = '3.4.1'
2233
2450
 
2234
2451
  Affix.RESET = 'affix affix-top affix-bottom'
2235
2452