twbs_sass_rails 0.9.2 → 1.0.0

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 (57) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/README.md +1 -1
  4. data/app/assets/fonts/glyphicons-halflings-regular.svg +1 -1
  5. data/lib/twbs_sass_rails/version.rb +1 -1
  6. data/twbs_sass_rails.gemspec +6 -6
  7. data/vendor/assets/javascripts/twbs/bootstrap/affix.js +43 -23
  8. data/vendor/assets/javascripts/twbs/bootstrap/alert.js +6 -4
  9. data/vendor/assets/javascripts/twbs/bootstrap/button.js +16 -10
  10. data/vendor/assets/javascripts/twbs/bootstrap/carousel.js +26 -10
  11. data/vendor/assets/javascripts/twbs/bootstrap/collapse.js +69 -28
  12. data/vendor/assets/javascripts/twbs/bootstrap/dropdown.js +20 -10
  13. data/vendor/assets/javascripts/twbs/bootstrap/modal.js +22 -21
  14. data/vendor/assets/javascripts/twbs/bootstrap/popover.js +13 -7
  15. data/vendor/assets/javascripts/twbs/bootstrap/scrollspy.js +12 -7
  16. data/vendor/assets/javascripts/twbs/bootstrap/tab.js +41 -16
  17. data/vendor/assets/javascripts/twbs/bootstrap/tooltip.js +60 -39
  18. data/vendor/assets/javascripts/twbs/bootstrap/transition.js +1 -1
  19. data/vendor/assets/stylesheets/twbs/bootstrap/_button-groups.scss +18 -11
  20. data/vendor/assets/stylesheets/twbs/bootstrap/_buttons.scss +8 -5
  21. data/vendor/assets/stylesheets/twbs/bootstrap/_carousel.scss +25 -1
  22. data/vendor/assets/stylesheets/twbs/bootstrap/_code.scss +1 -0
  23. data/vendor/assets/stylesheets/twbs/bootstrap/_component-animations.scss +5 -2
  24. data/vendor/assets/stylesheets/twbs/bootstrap/_dropdowns.scss +4 -6
  25. data/vendor/assets/stylesheets/twbs/bootstrap/_forms.scss +51 -28
  26. data/vendor/assets/stylesheets/twbs/bootstrap/_glyphicons.scss +2 -1
  27. data/vendor/assets/stylesheets/twbs/bootstrap/_grid.scss +4 -4
  28. data/vendor/assets/stylesheets/twbs/bootstrap/_jumbotron.scss +4 -4
  29. data/vendor/assets/stylesheets/twbs/bootstrap/_list-group.scss +1 -0
  30. data/vendor/assets/stylesheets/twbs/bootstrap/_media.scss +27 -36
  31. data/vendor/assets/stylesheets/twbs/bootstrap/_modals.scss +3 -4
  32. data/vendor/assets/stylesheets/twbs/bootstrap/_navbar.scss +35 -33
  33. data/vendor/assets/stylesheets/twbs/bootstrap/_navs.scss +5 -3
  34. data/vendor/assets/stylesheets/twbs/bootstrap/_normalize.scss +5 -3
  35. data/vendor/assets/stylesheets/twbs/bootstrap/_pager.scss +2 -3
  36. data/vendor/assets/stylesheets/twbs/bootstrap/_pagination.scss +1 -1
  37. data/vendor/assets/stylesheets/twbs/bootstrap/_panels.scss +22 -4
  38. data/vendor/assets/stylesheets/twbs/bootstrap/_popovers.scss +5 -4
  39. data/vendor/assets/stylesheets/twbs/bootstrap/_print.scss +102 -96
  40. data/vendor/assets/stylesheets/twbs/bootstrap/_progress-bars.scss +2 -20
  41. data/vendor/assets/stylesheets/twbs/bootstrap/_responsive-embed.scss +2 -1
  42. data/vendor/assets/stylesheets/twbs/bootstrap/_scaffolding.scss +3 -3
  43. data/vendor/assets/stylesheets/twbs/bootstrap/_tables.scss +11 -10
  44. data/vendor/assets/stylesheets/twbs/bootstrap/_theme.scss +16 -14
  45. data/vendor/assets/stylesheets/twbs/bootstrap/_thumbnails.scss +2 -2
  46. data/vendor/assets/stylesheets/twbs/bootstrap/_type.scss +10 -16
  47. data/vendor/assets/stylesheets/twbs/bootstrap/_utilities.scss +3 -4
  48. data/vendor/assets/stylesheets/twbs/bootstrap/_variables.scss +29 -19
  49. data/vendor/assets/stylesheets/twbs/bootstrap/mixins/_buttons.scss +2 -0
  50. data/vendor/assets/stylesheets/twbs/bootstrap/mixins/_forms.scss +5 -1
  51. data/vendor/assets/stylesheets/twbs/bootstrap/mixins/_grid.scss +2 -2
  52. data/vendor/assets/stylesheets/twbs/bootstrap/mixins/_hide-text.scss +1 -1
  53. data/vendor/assets/stylesheets/twbs/bootstrap/mixins/_image.scss +0 -1
  54. data/vendor/assets/stylesheets/twbs/bootstrap/mixins/_labels.scss +1 -1
  55. data/vendor/assets/stylesheets/twbs/bootstrap/mixins/_progress-bar.scss +1 -1
  56. data/vendor/assets/stylesheets/twbs/bootstrap/mixins/_vendor-prefixes.scss +6 -3
  57. metadata +24 -30
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 027eb51584c44a6a1ce25d16ed30f04a54a87dfe
4
- data.tar.gz: 02ab8f522b03bcbd9d90ca1052ba7683261a8349
3
+ metadata.gz: 417cd7eedf222d4959563b2ba9c97672bbe8a7a7
4
+ data.tar.gz: ec46dcf3cec8c8849c07d06be19d9942975e61f2
5
5
  SHA512:
6
- metadata.gz: 62e6a75dc62682fe6a8be1269c6aaaf4ddfae80c591a472635d96ebd258a3d3affc12f4075b2323042f3a202e5903d384b11ae7ce57d47128cd7e63a821a7713
7
- data.tar.gz: 8c78c9af7c5acb8a14a4bc9a323faf546aba36c831236d8d6fa2f879d2e362f31f5948f34457808e89719d57f48a0fe87bf63d4f083ba0ea82476daa571a520b
6
+ metadata.gz: ddc7e2b757e95ae424f5a8e4a4e543e0b310c11689fc2924150aaa468d6b681d173569361c36e0f7305a17a59ca02f299fbe7151c32f606087cd9c9b0fc5be99
7
+ data.tar.gz: 1f96ded1b9c9b5e53141133be11dd43e7fcc2f1755dfe0729f6e9340fce8c870329e3429715387596e5cce8fae1b37fe6f9a9b9c2dff7acc7813c841dd0a29f7
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.0.0
4
+
5
+ * bootstrap-sass 3.3.0
6
+ * Open-ended dependencies on development gems
7
+
3
8
  ## 0.9.2
4
9
 
5
10
  * Tested against Ruby 2.1.3
data/README.md CHANGED
@@ -119,7 +119,7 @@ Take a look at [the whole list of Javascript components](/vendor/assets/javascri
119
119
 
120
120
  Twbs Sass Rails uses [Appraisal](https://github.com/thoughtbot/appraisal) for testing against multiple gem dependency versions.
121
121
  ```bash
122
- $ appraisal install # or `update`, if you ran `install` before
122
+ $ appraisal install && appraisal update # Make sure your appraisals are installed and up to date
123
123
  $ appraisal rake
124
124
  ```
125
125
 
@@ -226,4 +226,4 @@
226
226
  <glyph unicode="&#xe199;" d="M100 200h400v-155l-75 -45h350l-75 45v155h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170z" />
227
227
  <glyph unicode="&#xe200;" d="M121 700q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350l-75 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5 t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -11.5t1 -11.5q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5z" />
228
228
  </font>
229
- </defs></svg>
229
+ </defs></svg>
@@ -1,3 +1,3 @@
1
1
  module TwbsSassRails
2
- VERSION = "0.9.2"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -22,10 +22,10 @@ Gem::Specification.new do |s|
22
22
  s.add_runtime_dependency 'rails', '>= 3.2.19', '< 5.0.0'
23
23
  s.add_runtime_dependency 'sass-rails', '~> 4'
24
24
 
25
- s.add_development_dependency 'appraisal', '~> 1'
26
- s.add_development_dependency 'capybara', '~> 2'
27
- s.add_development_dependency 'coveralls', '~> 0.7'
28
- s.add_development_dependency 'minitest', '>= 4', '< 6'
29
- s.add_development_dependency 'rake', '~> 10'
30
- s.add_development_dependency 'simplecov', '~> 0.9'
25
+ s.add_development_dependency 'appraisal'
26
+ s.add_development_dependency 'capybara'
27
+ s.add_development_dependency 'coveralls'
28
+ s.add_development_dependency 'minitest'
29
+ s.add_development_dependency 'rake'
30
+ s.add_development_dependency 'simplecov'
31
31
  end
@@ -1,5 +1,5 @@
1
1
  /* ========================================================================
2
- * Bootstrap: affix.js v3.2.0
2
+ * Bootstrap: affix.js v3.3.0
3
3
  * http://getbootstrap.com/javascript/#affix
4
4
  * ========================================================================
5
5
  * Copyright 2011-2014 Twitter, Inc.
@@ -28,7 +28,7 @@
28
28
  this.checkPosition()
29
29
  }
30
30
 
31
- Affix.VERSION = '3.2.0'
31
+ Affix.VERSION = '3.3.0'
32
32
 
33
33
  Affix.RESET = 'affix affix-top affix-bottom'
34
34
 
@@ -37,6 +37,28 @@
37
37
  target: window
38
38
  }
39
39
 
40
+ Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
41
+ var scrollTop = this.$target.scrollTop()
42
+ var position = this.$element.offset()
43
+ var targetHeight = this.$target.height()
44
+
45
+ if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false
46
+
47
+ if (this.affixed == 'bottom') {
48
+ if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
49
+ return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
50
+ }
51
+
52
+ var initializing = this.affixed == null
53
+ var colliderTop = initializing ? scrollTop : position.top
54
+ var colliderHeight = initializing ? targetHeight : height
55
+
56
+ if (offsetTop != null && colliderTop <= offsetTop) return 'top'
57
+ if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'
58
+
59
+ return false
60
+ }
61
+
40
62
  Affix.prototype.getPinnedOffset = function () {
41
63
  if (this.pinnedOffset) return this.pinnedOffset
42
64
  this.$element.removeClass(Affix.RESET).addClass('affix')
@@ -52,42 +74,40 @@
52
74
  Affix.prototype.checkPosition = function () {
53
75
  if (!this.$element.is(':visible')) return
54
76
 
55
- var scrollHeight = $(document).height()
56
- var scrollTop = this.$target.scrollTop()
57
- var position = this.$element.offset()
77
+ var height = this.$element.height()
58
78
  var offset = this.options.offset
59
79
  var offsetTop = offset.top
60
80
  var offsetBottom = offset.bottom
81
+ var scrollHeight = $('body').height()
61
82
 
62
83
  if (typeof offset != 'object') offsetBottom = offsetTop = offset
63
84
  if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element)
64
85
  if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
65
86
 
66
- var affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ? false :
67
- offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :
68
- offsetTop != null && (scrollTop <= offsetTop) ? 'top' : false
87
+ var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
69
88
 
70
- if (this.affixed === affix) return
71
- if (this.unpin != null) this.$element.css('top', '')
89
+ if (this.affixed != affix) {
90
+ if (this.unpin != null) this.$element.css('top', '')
72
91
 
73
- var affixType = 'affix' + (affix ? '-' + affix : '')
74
- var e = $.Event(affixType + '.bs.affix')
92
+ var affixType = 'affix' + (affix ? '-' + affix : '')
93
+ var e = $.Event(affixType + '.bs.affix')
75
94
 
76
- this.$element.trigger(e)
95
+ this.$element.trigger(e)
77
96
 
78
- if (e.isDefaultPrevented()) return
97
+ if (e.isDefaultPrevented()) return
79
98
 
80
- this.affixed = affix
81
- this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
99
+ this.affixed = affix
100
+ this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
82
101
 
83
- this.$element
84
- .removeClass(Affix.RESET)
85
- .addClass(affixType)
86
- .trigger($.Event(affixType.replace('affix', 'affixed')))
102
+ this.$element
103
+ .removeClass(Affix.RESET)
104
+ .addClass(affixType)
105
+ .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
106
+ }
87
107
 
88
108
  if (affix == 'bottom') {
89
109
  this.$element.offset({
90
- top: scrollHeight - this.$element.height() - offsetBottom
110
+ top: scrollHeight - height - offsetBottom
91
111
  })
92
112
  }
93
113
  }
@@ -132,8 +152,8 @@
132
152
 
133
153
  data.offset = data.offset || {}
134
154
 
135
- if (data.offsetBottom) data.offset.bottom = data.offsetBottom
136
- if (data.offsetTop) data.offset.top = data.offsetTop
155
+ if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
156
+ if (data.offsetTop != null) data.offset.top = data.offsetTop
137
157
 
138
158
  Plugin.call($spy, data)
139
159
  })
@@ -1,5 +1,5 @@
1
1
  /* ========================================================================
2
- * Bootstrap: alert.js v3.2.0
2
+ * Bootstrap: alert.js v3.3.0
3
3
  * http://getbootstrap.com/javascript/#alerts
4
4
  * ========================================================================
5
5
  * Copyright 2011-2014 Twitter, Inc.
@@ -18,7 +18,9 @@
18
18
  $(el).on('click', dismiss, this.close)
19
19
  }
20
20
 
21
- Alert.VERSION = '3.2.0'
21
+ Alert.VERSION = '3.3.0'
22
+
23
+ Alert.TRANSITION_DURATION = 150
22
24
 
23
25
  Alert.prototype.close = function (e) {
24
26
  var $this = $(this)
@@ -34,7 +36,7 @@
34
36
  if (e) e.preventDefault()
35
37
 
36
38
  if (!$parent.length) {
37
- $parent = $this.hasClass('alert') ? $this : $this.parent()
39
+ $parent = $this.closest('.alert')
38
40
  }
39
41
 
40
42
  $parent.trigger(e = $.Event('close.bs.alert'))
@@ -51,7 +53,7 @@
51
53
  $.support.transition && $parent.hasClass('fade') ?
52
54
  $parent
53
55
  .one('bsTransitionEnd', removeElement)
54
- .emulateTransitionEnd(150) :
56
+ .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
55
57
  removeElement()
56
58
  }
57
59
 
@@ -1,5 +1,5 @@
1
1
  /* ========================================================================
2
- * Bootstrap: button.js v3.2.0
2
+ * Bootstrap: button.js v3.3.0
3
3
  * http://getbootstrap.com/javascript/#buttons
4
4
  * ========================================================================
5
5
  * Copyright 2011-2014 Twitter, Inc.
@@ -19,7 +19,7 @@
19
19
  this.isLoading = false
20
20
  }
21
21
 
22
- Button.VERSION = '3.2.0'
22
+ Button.VERSION = '3.3.0'
23
23
 
24
24
  Button.DEFAULTS = {
25
25
  loadingText: 'loading...'
@@ -35,10 +35,10 @@
35
35
 
36
36
  if (data.resetText == null) $el.data('resetText', $el[val]())
37
37
 
38
- $el[val](data[state] == null ? this.options[state] : data[state])
39
-
40
38
  // push to event loop to allow forms to submit
41
39
  setTimeout($.proxy(function () {
40
+ $el[val](data[state] == null ? this.options[state] : data[state])
41
+
42
42
  if (state == 'loadingText') {
43
43
  this.isLoading = true
44
44
  $el.addClass(d).attr(d, d)
@@ -60,6 +60,8 @@
60
60
  else $parent.find('.active').removeClass('active')
61
61
  }
62
62
  if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change')
63
+ } else {
64
+ this.$element.attr('aria-pressed', !this.$element.hasClass('active'))
63
65
  }
64
66
 
65
67
  if (changed) this.$element.toggleClass('active')
@@ -100,11 +102,15 @@
100
102
  // BUTTON DATA-API
101
103
  // ===============
102
104
 
103
- $(document).on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
104
- var $btn = $(e.target)
105
- if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
106
- Plugin.call($btn, 'toggle')
107
- e.preventDefault()
108
- })
105
+ $(document)
106
+ .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
107
+ var $btn = $(e.target)
108
+ if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
109
+ Plugin.call($btn, 'toggle')
110
+ e.preventDefault()
111
+ })
112
+ .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
113
+ $(e.target).closest('.btn').toggleClass('focus', e.type == 'focus')
114
+ })
109
115
 
110
116
  }(jQuery);
@@ -1,5 +1,5 @@
1
1
  /* ========================================================================
2
- * Bootstrap: carousel.js v3.2.0
2
+ * Bootstrap: carousel.js v3.3.0
3
3
  * http://getbootstrap.com/javascript/#carousel
4
4
  * ========================================================================
5
5
  * Copyright 2011-2014 Twitter, Inc.
@@ -14,7 +14,7 @@
14
14
  // =========================
15
15
 
16
16
  var Carousel = function (element, options) {
17
- this.$element = $(element).on('keydown.bs.carousel', $.proxy(this.keydown, this))
17
+ this.$element = $(element)
18
18
  this.$indicators = this.$element.find('.carousel-indicators')
19
19
  this.options = options
20
20
  this.paused =
@@ -23,17 +23,22 @@
23
23
  this.$active =
24
24
  this.$items = null
25
25
 
26
- this.options.pause == 'hover' && this.$element
26
+ this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))
27
+
28
+ this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element
27
29
  .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
28
30
  .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
29
31
  }
30
32
 
31
- Carousel.VERSION = '3.2.0'
33
+ Carousel.VERSION = '3.3.0'
34
+
35
+ Carousel.TRANSITION_DURATION = 600
32
36
 
33
37
  Carousel.DEFAULTS = {
34
38
  interval: 5000,
35
39
  pause: 'hover',
36
- wrap: true
40
+ wrap: true,
41
+ keyboard: true
37
42
  }
38
43
 
39
44
  Carousel.prototype.keydown = function (e) {
@@ -63,6 +68,13 @@
63
68
  return this.$items.index(item || this.$active)
64
69
  }
65
70
 
71
+ Carousel.prototype.getItemForDirection = function (direction, active) {
72
+ var delta = direction == 'prev' ? -1 : 1
73
+ var activeIndex = this.getItemIndex(active)
74
+ var itemIndex = (activeIndex + delta) % this.$items.length
75
+ return this.$items.eq(itemIndex)
76
+ }
77
+
66
78
  Carousel.prototype.to = function (pos) {
67
79
  var that = this
68
80
  var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
@@ -72,7 +84,7 @@
72
84
  if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
73
85
  if (activeIndex == pos) return this.pause().cycle()
74
86
 
75
- return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))
87
+ return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))
76
88
  }
77
89
 
78
90
  Carousel.prototype.pause = function (e) {
@@ -100,7 +112,7 @@
100
112
 
101
113
  Carousel.prototype.slide = function (type, next) {
102
114
  var $active = this.$element.find('.item.active')
103
- var $next = next || $active[type]()
115
+ var $next = next || this.getItemForDirection(type, $active)
104
116
  var isCycling = this.interval
105
117
  var direction = type == 'next' ? 'left' : 'right'
106
118
  var fallback = type == 'next' ? 'first' : 'last'
@@ -146,7 +158,7 @@
146
158
  that.$element.trigger(slidEvent)
147
159
  }, 0)
148
160
  })
149
- .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000)
161
+ .emulateTransitionEnd(Carousel.TRANSITION_DURATION)
150
162
  } else {
151
163
  $active.removeClass('active')
152
164
  $next.addClass('active')
@@ -195,7 +207,7 @@
195
207
  // CAROUSEL DATA-API
196
208
  // =================
197
209
 
198
- $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
210
+ var clickHandler = function (e) {
199
211
  var href
200
212
  var $this = $(this)
201
213
  var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
@@ -211,7 +223,11 @@
211
223
  }
212
224
 
213
225
  e.preventDefault()
214
- })
226
+ }
227
+
228
+ $(document)
229
+ .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
230
+ .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)
215
231
 
216
232
  $(window).on('load', function () {
217
233
  $('[data-ride="carousel"]').each(function () {
@@ -1,5 +1,5 @@
1
1
  /* ========================================================================
2
- * Bootstrap: collapse.js v3.2.0
2
+ * Bootstrap: collapse.js v3.3.0
3
3
  * http://getbootstrap.com/javascript/#collapse
4
4
  * ========================================================================
5
5
  * Copyright 2011-2014 Twitter, Inc.
@@ -16,16 +16,25 @@
16
16
  var Collapse = function (element, options) {
17
17
  this.$element = $(element)
18
18
  this.options = $.extend({}, Collapse.DEFAULTS, options)
19
+ this.$trigger = $(this.options.trigger).filter('[href="#' + element.id + '"], [data-target="#' + element.id + '"]')
19
20
  this.transitioning = null
20
21
 
21
- if (this.options.parent) this.$parent = $(this.options.parent)
22
+ if (this.options.parent) {
23
+ this.$parent = this.getParent()
24
+ } else {
25
+ this.addAriaAndCollapsedClass(this.$element, this.$trigger)
26
+ }
27
+
22
28
  if (this.options.toggle) this.toggle()
23
29
  }
24
30
 
25
- Collapse.VERSION = '3.2.0'
31
+ Collapse.VERSION = '3.3.0'
32
+
33
+ Collapse.TRANSITION_DURATION = 350
26
34
 
27
35
  Collapse.DEFAULTS = {
28
- toggle: true
36
+ toggle: true,
37
+ trigger: '[data-toggle="collapse"]'
29
38
  }
30
39
 
31
40
  Collapse.prototype.dimension = function () {
@@ -36,17 +45,21 @@
36
45
  Collapse.prototype.show = function () {
37
46
  if (this.transitioning || this.$element.hasClass('in')) return
38
47
 
48
+ var activesData
49
+ var actives = this.$parent && this.$parent.find('> .panel').children('.in, .collapsing')
50
+
51
+ if (actives && actives.length) {
52
+ activesData = actives.data('bs.collapse')
53
+ if (activesData && activesData.transitioning) return
54
+ }
55
+
39
56
  var startEvent = $.Event('show.bs.collapse')
40
57
  this.$element.trigger(startEvent)
41
58
  if (startEvent.isDefaultPrevented()) return
42
59
 
43
- var actives = this.$parent && this.$parent.find('> .panel > .in')
44
-
45
60
  if (actives && actives.length) {
46
- var hasData = actives.data('bs.collapse')
47
- if (hasData && hasData.transitioning) return
48
61
  Plugin.call(actives, 'hide')
49
- hasData || actives.data('bs.collapse', null)
62
+ activesData || actives.data('bs.collapse', null)
50
63
  }
51
64
 
52
65
  var dimension = this.dimension()
@@ -54,6 +67,11 @@
54
67
  this.$element
55
68
  .removeClass('collapse')
56
69
  .addClass('collapsing')[dimension](0)
70
+ .attr('aria-expanded', true)
71
+
72
+ this.$trigger
73
+ .removeClass('collapsed')
74
+ .attr('aria-expanded', true)
57
75
 
58
76
  this.transitioning = 1
59
77
 
@@ -72,7 +90,7 @@
72
90
 
73
91
  this.$element
74
92
  .one('bsTransitionEnd', $.proxy(complete, this))
75
- .emulateTransitionEnd(350)[dimension](this.$element[0][scrollSize])
93
+ .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
76
94
  }
77
95
 
78
96
  Collapse.prototype.hide = function () {
@@ -88,17 +106,21 @@
88
106
 
89
107
  this.$element
90
108
  .addClass('collapsing')
91
- .removeClass('collapse')
92
- .removeClass('in')
109
+ .removeClass('collapse in')
110
+ .attr('aria-expanded', false)
111
+
112
+ this.$trigger
113
+ .addClass('collapsed')
114
+ .attr('aria-expanded', false)
93
115
 
94
116
  this.transitioning = 1
95
117
 
96
118
  var complete = function () {
97
119
  this.transitioning = 0
98
120
  this.$element
99
- .trigger('hidden.bs.collapse')
100
121
  .removeClass('collapsing')
101
122
  .addClass('collapse')
123
+ .trigger('hidden.bs.collapse')
102
124
  }
103
125
 
104
126
  if (!$.support.transition) return complete.call(this)
@@ -106,13 +128,40 @@
106
128
  this.$element
107
129
  [dimension](0)
108
130
  .one('bsTransitionEnd', $.proxy(complete, this))
109
- .emulateTransitionEnd(350)
131
+ .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
110
132
  }
111
133
 
112
134
  Collapse.prototype.toggle = function () {
113
135
  this[this.$element.hasClass('in') ? 'hide' : 'show']()
114
136
  }
115
137
 
138
+ Collapse.prototype.getParent = function () {
139
+ return $(this.options.parent)
140
+ .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
141
+ .each($.proxy(function (i, element) {
142
+ var $element = $(element)
143
+ this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
144
+ }, this))
145
+ .end()
146
+ }
147
+
148
+ Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
149
+ var isOpen = $element.hasClass('in')
150
+
151
+ $element.attr('aria-expanded', isOpen)
152
+ $trigger
153
+ .toggleClass('collapsed', !isOpen)
154
+ .attr('aria-expanded', isOpen)
155
+ }
156
+
157
+ function getTargetFromTrigger($trigger) {
158
+ var href
159
+ var target = $trigger.attr('data-target')
160
+ || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
161
+
162
+ return $(target)
163
+ }
164
+
116
165
 
117
166
  // COLLAPSE PLUGIN DEFINITION
118
167
  // ==========================
@@ -123,7 +172,7 @@
123
172
  var data = $this.data('bs.collapse')
124
173
  var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
125
174
 
126
- if (!data && options.toggle && option == 'show') option = !option
175
+ if (!data && options.toggle && option == 'show') options.toggle = false
127
176
  if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
128
177
  if (typeof option == 'string') data[option]()
129
178
  })
@@ -148,21 +197,13 @@
148
197
  // =================
149
198
 
150
199
  $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
151
- var href
152
200
  var $this = $(this)
153
- var target = $this.attr('data-target')
154
- || e.preventDefault()
155
- || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
156
- var $target = $(target)
157
- var data = $target.data('bs.collapse')
158
- var option = data ? 'toggle' : $this.data()
159
- var parent = $this.attr('data-parent')
160
- var $parent = parent && $(parent)
161
201
 
162
- if (!data || !data.transitioning) {
163
- if ($parent) $parent.find('[data-toggle="collapse"][data-parent="' + parent + '"]').not($this).addClass('collapsed')
164
- $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
165
- }
202
+ if (!$this.attr('data-target')) e.preventDefault()
203
+
204
+ var $target = getTargetFromTrigger($this)
205
+ var data = $target.data('bs.collapse')
206
+ var option = data ? 'toggle' : $.extend({}, $this.data(), { trigger: this })
166
207
 
167
208
  Plugin.call($target, option)
168
209
  })
@@ -1,5 +1,5 @@
1
1
  /* ========================================================================
2
- * Bootstrap: dropdown.js v3.2.0
2
+ * Bootstrap: dropdown.js v3.3.0
3
3
  * http://getbootstrap.com/javascript/#dropdowns
4
4
  * ========================================================================
5
5
  * Copyright 2011-2014 Twitter, Inc.
@@ -19,7 +19,7 @@
19
19
  $(element).on('click.bs.dropdown', this.toggle)
20
20
  }
21
21
 
22
- Dropdown.VERSION = '3.2.0'
22
+ Dropdown.VERSION = '3.3.0'
23
23
 
24
24
  Dropdown.prototype.toggle = function (e) {
25
25
  var $this = $(this)
@@ -42,7 +42,9 @@
42
42
 
43
43
  if (e.isDefaultPrevented()) return
44
44
 
45
- $this.trigger('focus')
45
+ $this
46
+ .trigger('focus')
47
+ .attr('aria-expanded', 'true')
46
48
 
47
49
  $parent
48
50
  .toggleClass('open')
@@ -53,7 +55,7 @@
53
55
  }
54
56
 
55
57
  Dropdown.prototype.keydown = function (e) {
56
- if (!/(38|40|27)/.test(e.keyCode)) return
58
+ if (!/(38|40|27|32)/.test(e.which)) return
57
59
 
58
60
  var $this = $(this)
59
61
 
@@ -65,7 +67,7 @@
65
67
  var $parent = getParent($this)
66
68
  var isActive = $parent.hasClass('open')
67
69
 
68
- if (!isActive || (isActive && e.keyCode == 27)) {
70
+ if ((!isActive && e.which != 27) || (isActive && e.which == 27)) {
69
71
  if (e.which == 27) $parent.find(toggle).trigger('focus')
70
72
  return $this.trigger('click')
71
73
  }
@@ -75,10 +77,10 @@
75
77
 
76
78
  if (!$items.length) return
77
79
 
78
- var index = $items.index($items.filter(':focus'))
80
+ var index = $items.index(e.target)
79
81
 
80
- if (e.keyCode == 38 && index > 0) index-- // up
81
- if (e.keyCode == 40 && index < $items.length - 1) index++ // down
82
+ if (e.which == 38 && index > 0) index-- // up
83
+ if (e.which == 40 && index < $items.length - 1) index++ // down
82
84
  if (!~index) index = 0
83
85
 
84
86
  $items.eq(index).trigger('focus')
@@ -88,11 +90,17 @@
88
90
  if (e && e.which === 3) return
89
91
  $(backdrop).remove()
90
92
  $(toggle).each(function () {
91
- var $parent = getParent($(this))
93
+ var $this = $(this)
94
+ var $parent = getParent($this)
92
95
  var relatedTarget = { relatedTarget: this }
96
+
93
97
  if (!$parent.hasClass('open')) return
98
+
94
99
  $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
100
+
95
101
  if (e.isDefaultPrevented()) return
102
+
103
+ $this.attr('aria-expanded', 'false')
96
104
  $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)
97
105
  })
98
106
  }
@@ -146,6 +154,8 @@
146
154
  .on('click.bs.dropdown.data-api', clearMenus)
147
155
  .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
148
156
  .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
149
- .on('keydown.bs.dropdown.data-api', toggle + ', [role="menu"], [role="listbox"]', Dropdown.prototype.keydown)
157
+ .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
158
+ .on('keydown.bs.dropdown.data-api', '[role="menu"]', Dropdown.prototype.keydown)
159
+ .on('keydown.bs.dropdown.data-api', '[role="listbox"]', Dropdown.prototype.keydown)
150
160
 
151
161
  }(jQuery);