bootstrap 4.0.0.alpha1

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 (145) hide show
  1. checksums.yaml +7 -0
  2. data/.gitattributes +14 -0
  3. data/.gitignore +19 -0
  4. data/.travis.yml +16 -0
  5. data/CHANGELOG.md +7 -0
  6. data/Gemfile +13 -0
  7. data/LICENSE +21 -0
  8. data/README.md +143 -0
  9. data/Rakefile +75 -0
  10. data/assets/javascripts/bootstrap-sprockets.js +11 -0
  11. data/assets/javascripts/bootstrap.js +3560 -0
  12. data/assets/javascripts/bootstrap.min.js +220 -0
  13. data/assets/javascripts/bootstrap/alert.js +192 -0
  14. data/assets/javascripts/bootstrap/button.js +172 -0
  15. data/assets/javascripts/bootstrap/carousel.js +478 -0
  16. data/assets/javascripts/bootstrap/collapse.js +364 -0
  17. data/assets/javascripts/bootstrap/dropdown.js +293 -0
  18. data/assets/javascripts/bootstrap/modal.js +536 -0
  19. data/assets/javascripts/bootstrap/popover.js +201 -0
  20. data/assets/javascripts/bootstrap/scrollspy.js +320 -0
  21. data/assets/javascripts/bootstrap/tab.js +263 -0
  22. data/assets/javascripts/bootstrap/tooltip.js +619 -0
  23. data/assets/javascripts/bootstrap/util.js +157 -0
  24. data/assets/stylesheets/_bootstrap-flex.scss +8 -0
  25. data/assets/stylesheets/_bootstrap-grid.scss +62 -0
  26. data/assets/stylesheets/_bootstrap-reboot.scss +10 -0
  27. data/assets/stylesheets/_bootstrap.scss +55 -0
  28. data/assets/stylesheets/bootstrap/_alert.scss +65 -0
  29. data/assets/stylesheets/bootstrap/_animation.scss +27 -0
  30. data/assets/stylesheets/bootstrap/_breadcrumb.scss +23 -0
  31. data/assets/stylesheets/bootstrap/_button-group.scss +224 -0
  32. data/assets/stylesheets/bootstrap/_buttons.scss +174 -0
  33. data/assets/stylesheets/bootstrap/_card.scss +293 -0
  34. data/assets/stylesheets/bootstrap/_carousel.scss +252 -0
  35. data/assets/stylesheets/bootstrap/_close.scss +28 -0
  36. data/assets/stylesheets/bootstrap/_code.scss +58 -0
  37. data/assets/stylesheets/bootstrap/_custom-forms.scss +225 -0
  38. data/assets/stylesheets/bootstrap/_dropdown.scss +191 -0
  39. data/assets/stylesheets/bootstrap/_forms.scss +454 -0
  40. data/assets/stylesheets/bootstrap/_grid.scss +76 -0
  41. data/assets/stylesheets/bootstrap/_images.scss +28 -0
  42. data/assets/stylesheets/bootstrap/_input-group.scss +181 -0
  43. data/assets/stylesheets/bootstrap/_jumbotron.scss +22 -0
  44. data/assets/stylesheets/bootstrap/_labels.scss +75 -0
  45. data/assets/stylesheets/bootstrap/_list-group.scss +128 -0
  46. data/assets/stylesheets/bootstrap/_media.scss +90 -0
  47. data/assets/stylesheets/bootstrap/_mixins.scss +54 -0
  48. data/assets/stylesheets/bootstrap/_modal.scss +146 -0
  49. data/assets/stylesheets/bootstrap/_nav.scss +155 -0
  50. data/assets/stylesheets/bootstrap/_navbar.scss +230 -0
  51. data/assets/stylesheets/bootstrap/_normalize.scss +428 -0
  52. data/assets/stylesheets/bootstrap/_pager.scss +57 -0
  53. data/assets/stylesheets/bootstrap/_pagination.scss +82 -0
  54. data/assets/stylesheets/bootstrap/_popover.scss +140 -0
  55. data/assets/stylesheets/bootstrap/_print.scss +88 -0
  56. data/assets/stylesheets/bootstrap/_progress.scss +156 -0
  57. data/assets/stylesheets/bootstrap/_reboot.scss +298 -0
  58. data/assets/stylesheets/bootstrap/_responsive-embed.scss +38 -0
  59. data/assets/stylesheets/bootstrap/_tables.scss +193 -0
  60. data/assets/stylesheets/bootstrap/_tooltip.scss +85 -0
  61. data/assets/stylesheets/bootstrap/_type.scss +192 -0
  62. data/assets/stylesheets/bootstrap/_utilities-responsive.scss +49 -0
  63. data/assets/stylesheets/bootstrap/_utilities-spacing.scss +78 -0
  64. data/assets/stylesheets/bootstrap/_utilities.scss +117 -0
  65. data/assets/stylesheets/bootstrap/_variables.scss +632 -0
  66. data/assets/stylesheets/bootstrap/mixins/_alert.scss +14 -0
  67. data/assets/stylesheets/bootstrap/mixins/_background-variant.scss +13 -0
  68. data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +35 -0
  69. data/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +76 -0
  70. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +100 -0
  71. data/assets/stylesheets/bootstrap/mixins/_center-block.scss +7 -0
  72. data/assets/stylesheets/bootstrap/mixins/_clearfix.scss +7 -0
  73. data/assets/stylesheets/bootstrap/mixins/_forms.scss +89 -0
  74. data/assets/stylesheets/bootstrap/mixins/_gradients.scss +43 -0
  75. data/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +44 -0
  76. data/assets/stylesheets/bootstrap/mixins/_grid.scss +75 -0
  77. data/assets/stylesheets/bootstrap/mixins/_hover.scss +59 -0
  78. data/assets/stylesheets/bootstrap/mixins/_image.scss +33 -0
  79. data/assets/stylesheets/bootstrap/mixins/_label.scss +11 -0
  80. data/assets/stylesheets/bootstrap/mixins/_list-group.scss +30 -0
  81. data/assets/stylesheets/bootstrap/mixins/_lists.scss +7 -0
  82. data/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +10 -0
  83. data/assets/stylesheets/bootstrap/mixins/_navbar-align.scss +9 -0
  84. data/assets/stylesheets/bootstrap/mixins/_pagination.scss +24 -0
  85. data/assets/stylesheets/bootstrap/mixins/_progress.scss +18 -0
  86. data/assets/stylesheets/bootstrap/mixins/_pulls.scss +6 -0
  87. data/assets/stylesheets/bootstrap/mixins/_reset-filter.scss +8 -0
  88. data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +18 -0
  89. data/assets/stylesheets/bootstrap/mixins/_resize.scss +6 -0
  90. data/assets/stylesheets/bootstrap/mixins/_screen-reader.scss +32 -0
  91. data/assets/stylesheets/bootstrap/mixins/_size.scss +6 -0
  92. data/assets/stylesheets/bootstrap/mixins/_tab-focus.scss +9 -0
  93. data/assets/stylesheets/bootstrap/mixins/_table-row.scss +30 -0
  94. data/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +12 -0
  95. data/assets/stylesheets/bootstrap/mixins/_text-hide.scss +8 -0
  96. data/assets/stylesheets/bootstrap/mixins/_text-truncate.scss +8 -0
  97. data/bootstrap.gemspec +36 -0
  98. data/lib/bootstrap.rb +76 -0
  99. data/lib/bootstrap/engine.rb +11 -0
  100. data/lib/bootstrap/version.rb +4 -0
  101. data/tasks/updater.rb +67 -0
  102. data/tasks/updater/js.rb +37 -0
  103. data/tasks/updater/logger.rb +57 -0
  104. data/tasks/updater/network.rb +101 -0
  105. data/tasks/updater/scss.rb +34 -0
  106. data/templates/project/_bootstrap-variables.scss +633 -0
  107. data/templates/project/manifest.rb +18 -0
  108. data/templates/project/styles.scss +10 -0
  109. data/test/compass_test.rb +9 -0
  110. data/test/dummy_rails/README.rdoc +3 -0
  111. data/test/dummy_rails/Rakefile +6 -0
  112. data/test/dummy_rails/app/assets/images/.keep +0 -0
  113. data/test/dummy_rails/app/assets/javascripts/application.js +7 -0
  114. data/test/dummy_rails/app/assets/stylesheets/application.sass +1 -0
  115. data/test/dummy_rails/app/controllers/application_controller.rb +5 -0
  116. data/test/dummy_rails/app/controllers/pages_controller.rb +4 -0
  117. data/test/dummy_rails/app/helpers/application_helper.rb +2 -0
  118. data/test/dummy_rails/app/views/layouts/application.html.erb +14 -0
  119. data/test/dummy_rails/app/views/pages/root.html.slim +58 -0
  120. data/test/dummy_rails/config.ru +4 -0
  121. data/test/dummy_rails/config/application.rb +34 -0
  122. data/test/dummy_rails/config/boot.rb +5 -0
  123. data/test/dummy_rails/config/environment.rb +5 -0
  124. data/test/dummy_rails/config/environments/development.rb +23 -0
  125. data/test/dummy_rails/config/environments/production.rb +82 -0
  126. data/test/dummy_rails/config/environments/test.rb +38 -0
  127. data/test/dummy_rails/config/initializers/backtrace_silencers.rb +7 -0
  128. data/test/dummy_rails/config/initializers/filter_parameter_logging.rb +4 -0
  129. data/test/dummy_rails/config/initializers/inflections.rb +16 -0
  130. data/test/dummy_rails/config/initializers/mime_types.rb +5 -0
  131. data/test/dummy_rails/config/initializers/secret_token.rb +18 -0
  132. data/test/dummy_rails/config/initializers/session_store.rb +3 -0
  133. data/test/dummy_rails/config/initializers/wrap_parameters.rb +14 -0
  134. data/test/dummy_rails/config/locales/en.yml +3 -0
  135. data/test/dummy_rails/config/locales/es.yml +3 -0
  136. data/test/dummy_rails/config/routes.rb +3 -0
  137. data/test/dummy_rails/log/.keep +0 -0
  138. data/test/gemfiles/rails_4_2.gemfile +11 -0
  139. data/test/gemfiles/rails_head.gemfile +19 -0
  140. data/test/rails_test.rb +19 -0
  141. data/test/support/dummy_rails_integration.rb +22 -0
  142. data/test/support/reporting.rb +27 -0
  143. data/test/test_helper.rb +35 -0
  144. data/test/test_helper_rails.rb +6 -0
  145. metadata +433 -0
@@ -0,0 +1,364 @@
1
+ 'use strict';
2
+
3
+ var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
4
+
5
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
6
+
7
+ /**
8
+ * --------------------------------------------------------------------------
9
+ * Bootstrap (v4.0.0): collapse.js
10
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
11
+ * --------------------------------------------------------------------------
12
+ */
13
+
14
+ var Collapse = (function ($) {
15
+
16
+ /**
17
+ * ------------------------------------------------------------------------
18
+ * Constants
19
+ * ------------------------------------------------------------------------
20
+ */
21
+
22
+ var NAME = 'collapse';
23
+ var VERSION = '4.0.0';
24
+ var DATA_KEY = 'bs.collapse';
25
+ var EVENT_KEY = '.' + DATA_KEY;
26
+ var DATA_API_KEY = '.data-api';
27
+ var JQUERY_NO_CONFLICT = $.fn[NAME];
28
+ var TRANSITION_DURATION = 600;
29
+
30
+ var Default = {
31
+ toggle: true,
32
+ parent: ''
33
+ };
34
+
35
+ var DefaultType = {
36
+ toggle: 'boolean',
37
+ parent: 'string'
38
+ };
39
+
40
+ var Event = {
41
+ SHOW: 'show' + EVENT_KEY,
42
+ SHOWN: 'shown' + EVENT_KEY,
43
+ HIDE: 'hide' + EVENT_KEY,
44
+ HIDDEN: 'hidden' + EVENT_KEY,
45
+ CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY
46
+ };
47
+
48
+ var ClassName = {
49
+ IN: 'in',
50
+ COLLAPSE: 'collapse',
51
+ COLLAPSING: 'collapsing',
52
+ COLLAPSED: 'collapsed'
53
+ };
54
+
55
+ var Dimension = {
56
+ WIDTH: 'width',
57
+ HEIGHT: 'height'
58
+ };
59
+
60
+ var Selector = {
61
+ ACTIVES: '.panel > .in, .panel > .collapsing',
62
+ DATA_TOGGLE: '[data-toggle="collapse"]'
63
+ };
64
+
65
+ /**
66
+ * ------------------------------------------------------------------------
67
+ * Class Definition
68
+ * ------------------------------------------------------------------------
69
+ */
70
+
71
+ var Collapse = (function () {
72
+ function Collapse(element, config) {
73
+ _classCallCheck(this, Collapse);
74
+
75
+ this._isTransitioning = false;
76
+ this._element = element;
77
+ this._config = this._getConfig(config);
78
+ this._triggerArray = $.makeArray($('[data-toggle="collapse"][href="#' + element.id + '"],' + ('[data-toggle="collapse"][data-target="#' + element.id + '"]')));
79
+
80
+ this._parent = this._config.parent ? this._getParent() : null;
81
+
82
+ if (!this._config.parent) {
83
+ this._addAriaAndCollapsedClass(this._element, this._triggerArray);
84
+ }
85
+
86
+ if (this._config.toggle) {
87
+ this.toggle();
88
+ }
89
+ }
90
+
91
+ /**
92
+ * ------------------------------------------------------------------------
93
+ * Data Api implementation
94
+ * ------------------------------------------------------------------------
95
+ */
96
+
97
+ // getters
98
+
99
+ _createClass(Collapse, [{
100
+ key: 'toggle',
101
+
102
+ // public
103
+
104
+ value: function toggle() {
105
+ if ($(this._element).hasClass(ClassName.IN)) {
106
+ this.hide();
107
+ } else {
108
+ this.show();
109
+ }
110
+ }
111
+ }, {
112
+ key: 'show',
113
+ value: function show() {
114
+ var _this = this;
115
+
116
+ if (this._isTransitioning || $(this._element).hasClass(ClassName.IN)) {
117
+ return;
118
+ }
119
+
120
+ var actives = undefined;
121
+ var activesData = undefined;
122
+
123
+ if (this._parent) {
124
+ actives = $.makeArray($(Selector.ACTIVES));
125
+ if (!actives.length) {
126
+ actives = null;
127
+ }
128
+ }
129
+
130
+ if (actives) {
131
+ activesData = $(actives).data(DATA_KEY);
132
+ if (activesData && activesData._isTransitioning) {
133
+ return;
134
+ }
135
+ }
136
+
137
+ var startEvent = $.Event(Event.SHOW);
138
+ $(this._element).trigger(startEvent);
139
+ if (startEvent.isDefaultPrevented()) {
140
+ return;
141
+ }
142
+
143
+ if (actives) {
144
+ Collapse._jQueryInterface.call($(actives), 'hide');
145
+ if (!activesData) {
146
+ $(actives).data(DATA_KEY, null);
147
+ }
148
+ }
149
+
150
+ var dimension = this._getDimension();
151
+
152
+ $(this._element).removeClass(ClassName.COLLAPSE).addClass(ClassName.COLLAPSING);
153
+
154
+ this._element.style[dimension] = 0;
155
+ this._element.setAttribute('aria-expanded', true);
156
+
157
+ if (this._triggerArray.length) {
158
+ $(this._triggerArray).removeClass(ClassName.COLLAPSED).attr('aria-expanded', true);
159
+ }
160
+
161
+ this.setTransitioning(true);
162
+
163
+ var complete = function complete() {
164
+ $(_this._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.IN);
165
+
166
+ _this._element.style[dimension] = '';
167
+
168
+ _this.setTransitioning(false);
169
+
170
+ $(_this._element).trigger(Event.SHOWN);
171
+ };
172
+
173
+ if (!Util.supportsTransitionEnd()) {
174
+ complete();
175
+ return;
176
+ }
177
+
178
+ var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
179
+ var scrollSize = 'scroll' + capitalizedDimension;
180
+
181
+ $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
182
+
183
+ this._element.style[dimension] = this._element[scrollSize] + 'px';
184
+ }
185
+ }, {
186
+ key: 'hide',
187
+ value: function hide() {
188
+ var _this2 = this;
189
+
190
+ if (this._isTransitioning || !$(this._element).hasClass(ClassName.IN)) {
191
+ return;
192
+ }
193
+
194
+ var startEvent = $.Event(Event.HIDE);
195
+ $(this._element).trigger(startEvent);
196
+ if (startEvent.isDefaultPrevented()) {
197
+ return;
198
+ }
199
+
200
+ var dimension = this._getDimension();
201
+ var offsetDimension = dimension === Dimension.WIDTH ? 'offsetWidth' : 'offsetHeight';
202
+
203
+ this._element.style[dimension] = this._element[offsetDimension] + 'px';
204
+
205
+ Util.reflow(this._element);
206
+
207
+ $(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.IN);
208
+
209
+ this._element.setAttribute('aria-expanded', false);
210
+
211
+ if (this._triggerArray.length) {
212
+ $(this._triggerArray).addClass(ClassName.COLLAPSED).attr('aria-expanded', false);
213
+ }
214
+
215
+ this.setTransitioning(true);
216
+
217
+ var complete = function complete() {
218
+ _this2.setTransitioning(false);
219
+ $(_this2._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).trigger(Event.HIDDEN);
220
+ };
221
+
222
+ this._element.style[dimension] = 0;
223
+
224
+ if (!Util.supportsTransitionEnd()) {
225
+ complete();
226
+ return;
227
+ }
228
+
229
+ $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
230
+ }
231
+ }, {
232
+ key: 'setTransitioning',
233
+ value: function setTransitioning(isTransitioning) {
234
+ this._isTransitioning = isTransitioning;
235
+ }
236
+ }, {
237
+ key: 'dispose',
238
+ value: function dispose() {
239
+ $.removeData(this._element, DATA_KEY);
240
+
241
+ this._config = null;
242
+ this._parent = null;
243
+ this._element = null;
244
+ this._triggerArray = null;
245
+ this._isTransitioning = null;
246
+ }
247
+
248
+ // private
249
+
250
+ }, {
251
+ key: '_getConfig',
252
+ value: function _getConfig(config) {
253
+ config = $.extend({}, Default, config);
254
+ config.toggle = Boolean(config.toggle); // coerce string values
255
+ Util.typeCheckConfig(NAME, config, DefaultType);
256
+ return config;
257
+ }
258
+ }, {
259
+ key: '_getDimension',
260
+ value: function _getDimension() {
261
+ var hasWidth = $(this._element).hasClass(Dimension.WIDTH);
262
+ return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;
263
+ }
264
+ }, {
265
+ key: '_getParent',
266
+ value: function _getParent() {
267
+ var _this3 = this;
268
+
269
+ var parent = $(this._config.parent)[0];
270
+ var selector = '[data-toggle="collapse"][data-parent="' + this._config.parent + '"]';
271
+
272
+ $(parent).find(selector).each(function (i, element) {
273
+ _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);
274
+ });
275
+
276
+ return parent;
277
+ }
278
+ }, {
279
+ key: '_addAriaAndCollapsedClass',
280
+ value: function _addAriaAndCollapsedClass(element, triggerArray) {
281
+ if (element) {
282
+ var isOpen = $(element).hasClass(ClassName.IN);
283
+ element.setAttribute('aria-expanded', isOpen);
284
+
285
+ if (triggerArray.length) {
286
+ $(triggerArray).toggleClass(ClassName.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);
287
+ }
288
+ }
289
+ }
290
+
291
+ // static
292
+
293
+ }], [{
294
+ key: '_getTargetFromElement',
295
+ value: function _getTargetFromElement(element) {
296
+ var selector = Util.getSelectorFromElement(element);
297
+ return selector ? $(selector)[0] : null;
298
+ }
299
+ }, {
300
+ key: '_jQueryInterface',
301
+ value: function _jQueryInterface(config) {
302
+ return this.each(function () {
303
+ var $this = $(this);
304
+ var data = $this.data(DATA_KEY);
305
+ var _config = $.extend({}, Default, $this.data(), typeof config === 'object' && config);
306
+
307
+ if (!data && _config.toggle && /show|hide/.test(config)) {
308
+ _config.toggle = false;
309
+ }
310
+
311
+ if (!data) {
312
+ data = new Collapse(this, _config);
313
+ $this.data(DATA_KEY, data);
314
+ }
315
+
316
+ if (typeof config === 'string') {
317
+ if (data[config] === undefined) {
318
+ throw new Error('No method named "' + config + '"');
319
+ }
320
+ data[config]();
321
+ }
322
+ });
323
+ }
324
+ }, {
325
+ key: 'VERSION',
326
+ get: function get() {
327
+ return VERSION;
328
+ }
329
+ }, {
330
+ key: 'Default',
331
+ get: function get() {
332
+ return Default;
333
+ }
334
+ }]);
335
+
336
+ return Collapse;
337
+ })();
338
+
339
+ $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
340
+ event.preventDefault();
341
+
342
+ var target = Collapse._getTargetFromElement(this);
343
+ var data = $(target).data(DATA_KEY);
344
+ var config = data ? 'toggle' : $(this).data();
345
+
346
+ Collapse._jQueryInterface.call($(target), config);
347
+ });
348
+
349
+ /**
350
+ * ------------------------------------------------------------------------
351
+ * jQuery
352
+ * ------------------------------------------------------------------------
353
+ */
354
+
355
+ $.fn[NAME] = Collapse._jQueryInterface;
356
+ $.fn[NAME].Constructor = Collapse;
357
+ $.fn[NAME].noConflict = function () {
358
+ $.fn[NAME] = JQUERY_NO_CONFLICT;
359
+ return Collapse._jQueryInterface;
360
+ };
361
+
362
+ return Collapse;
363
+ })(jQuery);
364
+ //# sourceMappingURL=collapse.js.map
@@ -0,0 +1,293 @@
1
+ 'use strict';
2
+
3
+ var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
4
+
5
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
6
+
7
+ /**
8
+ * --------------------------------------------------------------------------
9
+ * Bootstrap (v4.0.0): dropdown.js
10
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
11
+ * --------------------------------------------------------------------------
12
+ */
13
+
14
+ var Dropdown = (function ($) {
15
+
16
+ /**
17
+ * ------------------------------------------------------------------------
18
+ * Constants
19
+ * ------------------------------------------------------------------------
20
+ */
21
+
22
+ var NAME = 'dropdown';
23
+ var VERSION = '4.0.0';
24
+ var DATA_KEY = 'bs.dropdown';
25
+ var EVENT_KEY = '.' + DATA_KEY;
26
+ var DATA_API_KEY = '.data-api';
27
+ var JQUERY_NO_CONFLICT = $.fn[NAME];
28
+
29
+ var Event = {
30
+ HIDE: 'hide' + EVENT_KEY,
31
+ HIDDEN: 'hidden' + EVENT_KEY,
32
+ SHOW: 'show' + EVENT_KEY,
33
+ SHOWN: 'shown' + EVENT_KEY,
34
+ CLICK: 'click' + EVENT_KEY,
35
+ CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY,
36
+ KEYDOWN_DATA_API: 'keydown' + EVENT_KEY + DATA_API_KEY
37
+ };
38
+
39
+ var ClassName = {
40
+ BACKDROP: 'dropdown-backdrop',
41
+ DISABLED: 'disabled',
42
+ OPEN: 'open'
43
+ };
44
+
45
+ var Selector = {
46
+ BACKDROP: '.dropdown-backdrop',
47
+ DATA_TOGGLE: '[data-toggle="dropdown"]',
48
+ FORM_CHILD: '.dropdown form',
49
+ ROLE_MENU: '[role="menu"]',
50
+ ROLE_LISTBOX: '[role="listbox"]',
51
+ NAVBAR_NAV: '.navbar-nav',
52
+ VISIBLE_ITEMS: '[role="menu"] li:not(.disabled) a, ' + '[role="listbox"] li:not(.disabled) a'
53
+ };
54
+
55
+ /**
56
+ * ------------------------------------------------------------------------
57
+ * Class Definition
58
+ * ------------------------------------------------------------------------
59
+ */
60
+
61
+ var Dropdown = (function () {
62
+ function Dropdown(element) {
63
+ _classCallCheck(this, Dropdown);
64
+
65
+ this._element = element;
66
+
67
+ this._addEventListeners();
68
+ }
69
+
70
+ /**
71
+ * ------------------------------------------------------------------------
72
+ * Data Api implementation
73
+ * ------------------------------------------------------------------------
74
+ */
75
+
76
+ // getters
77
+
78
+ _createClass(Dropdown, [{
79
+ key: 'toggle',
80
+
81
+ // public
82
+
83
+ value: function toggle() {
84
+ if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {
85
+ return false;
86
+ }
87
+
88
+ var parent = Dropdown._getParentFromElement(this);
89
+ var isActive = $(parent).hasClass(ClassName.OPEN);
90
+
91
+ Dropdown._clearMenus();
92
+
93
+ if (isActive) {
94
+ return false;
95
+ }
96
+
97
+ if ('ontouchstart' in document.documentElement && !$(parent).closest(Selector.NAVBAR_NAV).length) {
98
+
99
+ // if mobile we use a backdrop because click events don't delegate
100
+ var dropdown = document.createElement('div');
101
+ dropdown.className = ClassName.BACKDROP;
102
+ $(dropdown).insertBefore(this);
103
+ $(dropdown).on('click', Dropdown._clearMenus);
104
+ }
105
+
106
+ var relatedTarget = { relatedTarget: this };
107
+ var showEvent = $.Event(Event.SHOW, relatedTarget);
108
+
109
+ $(parent).trigger(showEvent);
110
+
111
+ if (showEvent.isDefaultPrevented()) {
112
+ return false;
113
+ }
114
+
115
+ this.focus();
116
+ this.setAttribute('aria-expanded', 'true');
117
+
118
+ $(parent).toggleClass(ClassName.OPEN);
119
+ $(parent).trigger($.Event(Event.SHOWN, relatedTarget));
120
+
121
+ return false;
122
+ }
123
+ }, {
124
+ key: 'dispose',
125
+ value: function dispose() {
126
+ $.removeData(this._element, DATA_KEY);
127
+ $(this._element).off(EVENT_KEY);
128
+ this._element = null;
129
+ }
130
+
131
+ // private
132
+
133
+ }, {
134
+ key: '_addEventListeners',
135
+ value: function _addEventListeners() {
136
+ $(this._element).on(Event.CLICK, this.toggle);
137
+ }
138
+
139
+ // static
140
+
141
+ }], [{
142
+ key: '_jQueryInterface',
143
+ value: function _jQueryInterface(config) {
144
+ return this.each(function () {
145
+ var data = $(this).data(DATA_KEY);
146
+
147
+ if (!data) {
148
+ $(this).data(DATA_KEY, data = new Dropdown(this));
149
+ }
150
+
151
+ if (typeof config === 'string') {
152
+ if (data[config] === undefined) {
153
+ throw new Error('No method named "' + config + '"');
154
+ }
155
+ data[config].call(this);
156
+ }
157
+ });
158
+ }
159
+ }, {
160
+ key: '_clearMenus',
161
+ value: function _clearMenus(event) {
162
+ if (event && event.which === 3) {
163
+ return;
164
+ }
165
+
166
+ var backdrop = $(Selector.BACKDROP)[0];
167
+ if (backdrop) {
168
+ backdrop.parentNode.removeChild(backdrop);
169
+ }
170
+
171
+ var toggles = $.makeArray($(Selector.DATA_TOGGLE));
172
+
173
+ for (var i = 0; i < toggles.length; i++) {
174
+ var _parent = Dropdown._getParentFromElement(toggles[i]);
175
+ var relatedTarget = { relatedTarget: toggles[i] };
176
+
177
+ if (!$(_parent).hasClass(ClassName.OPEN)) {
178
+ continue;
179
+ }
180
+
181
+ if (event && event.type === 'click' && /input|textarea/i.test(event.target.tagName) && $.contains(_parent, event.target)) {
182
+ continue;
183
+ }
184
+
185
+ var hideEvent = $.Event(Event.HIDE, relatedTarget);
186
+ $(_parent).trigger(hideEvent);
187
+ if (hideEvent.isDefaultPrevented()) {
188
+ continue;
189
+ }
190
+
191
+ toggles[i].setAttribute('aria-expanded', 'false');
192
+
193
+ $(_parent).removeClass(ClassName.OPEN).trigger($.Event(Event.HIDDEN, relatedTarget));
194
+ }
195
+ }
196
+ }, {
197
+ key: '_getParentFromElement',
198
+ value: function _getParentFromElement(element) {
199
+ var parent = undefined;
200
+ var selector = Util.getSelectorFromElement(element);
201
+
202
+ if (selector) {
203
+ parent = $(selector)[0];
204
+ }
205
+
206
+ return parent || element.parentNode;
207
+ }
208
+ }, {
209
+ key: '_dataApiKeydownHandler',
210
+ value: function _dataApiKeydownHandler(event) {
211
+ if (!/(38|40|27|32)/.test(event.which) || /input|textarea/i.test(event.target.tagName)) {
212
+ return;
213
+ }
214
+
215
+ event.preventDefault();
216
+ event.stopPropagation();
217
+
218
+ if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {
219
+ return;
220
+ }
221
+
222
+ var parent = Dropdown._getParentFromElement(this);
223
+ var isActive = $(parent).hasClass(ClassName.OPEN);
224
+
225
+ if (!isActive && event.which !== 27 || isActive && event.which === 27) {
226
+
227
+ if (event.which === 27) {
228
+ var toggle = $(parent).find(Selector.DATA_TOGGLE)[0];
229
+ $(toggle).trigger('focus');
230
+ }
231
+
232
+ $(this).trigger('click');
233
+ return;
234
+ }
235
+
236
+ var items = $.makeArray($(Selector.VISIBLE_ITEMS));
237
+
238
+ items = items.filter(function (item) {
239
+ return item.offsetWidth || item.offsetHeight;
240
+ });
241
+
242
+ if (!items.length) {
243
+ return;
244
+ }
245
+
246
+ var index = items.indexOf(event.target);
247
+
248
+ if (event.which === 38 && index > 0) {
249
+ // up
250
+ index--;
251
+ }
252
+
253
+ if (event.which === 40 && index < items.length - 1) {
254
+ // down
255
+ index++;
256
+ }
257
+
258
+ if (! ~index) {
259
+ index = 0;
260
+ }
261
+
262
+ items[index].focus();
263
+ }
264
+ }, {
265
+ key: 'VERSION',
266
+ get: function get() {
267
+ return VERSION;
268
+ }
269
+ }]);
270
+
271
+ return Dropdown;
272
+ })();
273
+
274
+ $(document).on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.ROLE_MENU, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.ROLE_LISTBOX, Dropdown._dataApiKeydownHandler).on(Event.CLICK_DATA_API, Dropdown._clearMenus).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, Dropdown.prototype.toggle).on(Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) {
275
+ e.stopPropagation();
276
+ });
277
+
278
+ /**
279
+ * ------------------------------------------------------------------------
280
+ * jQuery
281
+ * ------------------------------------------------------------------------
282
+ */
283
+
284
+ $.fn[NAME] = Dropdown._jQueryInterface;
285
+ $.fn[NAME].Constructor = Dropdown;
286
+ $.fn[NAME].noConflict = function () {
287
+ $.fn[NAME] = JQUERY_NO_CONFLICT;
288
+ return Dropdown._jQueryInterface;
289
+ };
290
+
291
+ return Dropdown;
292
+ })(jQuery);
293
+ //# sourceMappingURL=dropdown.js.map