Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/twbs/bootstrap-rubygem.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/assets
diff options
context:
space:
mode:
authorBlake Gentry <blakesgentry@gmail.com>2017-01-06 21:10:24 +0300
committerBlake Gentry <blakesgentry@gmail.com>2017-01-06 21:10:24 +0300
commitf82164992580fca0c3e3dde7d6d097784a514e5b (patch)
treebb3ff36c326d696623203563a53cab5982970ad8 /assets
parent023043a2da9098e7b8521a2ac62b7b5a470c40d9 (diff)
rake update[v4.0.0-alpha.6]
Diffstat (limited to 'assets')
-rw-r--r--assets/javascripts/bootstrap.js519
-rw-r--r--assets/javascripts/bootstrap.min.js8
-rw-r--r--assets/javascripts/bootstrap/alert.js14
-rw-r--r--assets/javascripts/bootstrap/button.js10
-rw-r--r--assets/javascripts/bootstrap/carousel.js80
-rw-r--r--assets/javascripts/bootstrap/collapse.js30
-rw-r--r--assets/javascripts/bootstrap/dropdown.js40
-rw-r--r--assets/javascripts/bootstrap/modal.js112
-rw-r--r--assets/javascripts/bootstrap/popover.js8
-rw-r--r--assets/javascripts/bootstrap/scrollspy.js31
-rw-r--r--assets/javascripts/bootstrap/tab.js33
-rw-r--r--assets/javascripts/bootstrap/tooltip.js76
-rw-r--r--assets/javascripts/bootstrap/util.js19
-rw-r--r--assets/stylesheets/_bootstrap-flex.scss8
-rw-r--r--assets/stylesheets/_bootstrap-grid.scss26
-rw-r--r--assets/stylesheets/_bootstrap-reboot.scss5
-rw-r--r--assets/stylesheets/_bootstrap.scss12
-rw-r--r--assets/stylesheets/bootstrap/_alert.scss7
-rw-r--r--assets/stylesheets/bootstrap/_badge.scss77
-rw-r--r--assets/stylesheets/bootstrap/_button-group.scss69
-rw-r--r--assets/stylesheets/bootstrap/_buttons.scss34
-rw-r--r--assets/stylesheets/bootstrap/_card.scss106
-rw-r--r--assets/stylesheets/bootstrap/_carousel.scss267
-rw-r--r--assets/stylesheets/bootstrap/_close.scss6
-rw-r--r--assets/stylesheets/bootstrap/_code.scss7
-rw-r--r--assets/stylesheets/bootstrap/_custom-forms.scss25
-rw-r--r--assets/stylesheets/bootstrap/_dropdown.scss53
-rw-r--r--assets/stylesheets/bootstrap/_forms.scss108
-rw-r--r--assets/stylesheets/bootstrap/_grid.scss13
-rw-r--r--assets/stylesheets/bootstrap/_images.scss4
-rw-r--r--assets/stylesheets/bootstrap/_input-group.scss44
-rw-r--r--assets/stylesheets/bootstrap/_list-group.scss142
-rw-r--r--assets/stylesheets/bootstrap/_media.scss83
-rw-r--r--assets/stylesheets/bootstrap/_mixins.scss13
-rw-r--r--assets/stylesheets/bootstrap/_modal.scss34
-rw-r--r--assets/stylesheets/bootstrap/_nav.scss98
-rw-r--r--assets/stylesheets/bootstrap/_navbar.scss309
-rw-r--r--assets/stylesheets/bootstrap/_normalize.scss227
-rw-r--r--assets/stylesheets/bootstrap/_pagination.scss38
-rw-r--r--assets/stylesheets/bootstrap/_popover.scss6
-rw-r--r--assets/stylesheets/bootstrap/_print.scss13
-rw-r--r--assets/stylesheets/bootstrap/_progress.scss141
-rw-r--r--assets/stylesheets/bootstrap/_reboot.scss31
-rw-r--r--assets/stylesheets/bootstrap/_responsive-embed.scss23
-rw-r--r--assets/stylesheets/bootstrap/_tables.scss69
-rw-r--r--assets/stylesheets/bootstrap/_tags.scss77
-rw-r--r--assets/stylesheets/bootstrap/_tooltip.scss2
-rw-r--r--assets/stylesheets/bootstrap/_transitions.scss (renamed from assets/stylesheets/bootstrap/_animation.scss)14
-rw-r--r--assets/stylesheets/bootstrap/_type.scss17
-rw-r--r--assets/stylesheets/bootstrap/_utilities.scss2
-rw-r--r--assets/stylesheets/bootstrap/_variables.scss536
-rw-r--r--assets/stylesheets/bootstrap/mixins/_badge.scss (renamed from assets/stylesheets/bootstrap/mixins/_tag.scss)4
-rw-r--r--assets/stylesheets/bootstrap/mixins/_breakpoints.scss41
-rw-r--r--assets/stylesheets/bootstrap/mixins/_buttons.scss89
-rw-r--r--assets/stylesheets/bootstrap/mixins/_cards.scss3
-rw-r--r--assets/stylesheets/bootstrap/mixins/_clearfix.scss2
-rw-r--r--assets/stylesheets/bootstrap/mixins/_float.scss3
-rw-r--r--assets/stylesheets/bootstrap/mixins/_forms.scss8
-rw-r--r--assets/stylesheets/bootstrap/mixins/_gradients.scss8
-rw-r--r--assets/stylesheets/bootstrap/mixins/_grid-framework.scss42
-rw-r--r--assets/stylesheets/bootstrap/mixins/_grid.scss45
-rw-r--r--assets/stylesheets/bootstrap/mixins/_list-group.scss8
-rw-r--r--assets/stylesheets/bootstrap/mixins/_progress.scss23
-rw-r--r--assets/stylesheets/bootstrap/mixins/_reset-filter.scss8
-rw-r--r--assets/stylesheets/bootstrap/mixins/_reset-text.scss2
-rw-r--r--assets/stylesheets/bootstrap/mixins/_tab-focus.scss9
-rw-r--r--assets/stylesheets/bootstrap/mixins/_transforms.scss14
-rw-r--r--assets/stylesheets/bootstrap/mixins/_visibility.scss5
-rw-r--r--assets/stylesheets/bootstrap/utilities/_align.scss10
-rw-r--r--assets/stylesheets/bootstrap/utilities/_background.scss2
-rw-r--r--assets/stylesheets/bootstrap/utilities/_borders.scss13
-rw-r--r--assets/stylesheets/bootstrap/utilities/_display.scss21
-rw-r--r--assets/stylesheets/bootstrap/utilities/_flex.scss73
-rw-r--r--assets/stylesheets/bootstrap/utilities/_float.scss14
-rw-r--r--assets/stylesheets/bootstrap/utilities/_position.scss23
-rw-r--r--assets/stylesheets/bootstrap/utilities/_sizing.scss10
-rw-r--r--assets/stylesheets/bootstrap/utilities/_spacing.scss73
-rw-r--r--assets/stylesheets/bootstrap/utilities/_text.scss26
-rw-r--r--assets/stylesheets/bootstrap/utilities/_visibility.scss2
79 files changed, 2113 insertions, 2194 deletions
diff --git a/assets/javascripts/bootstrap.js b/assets/javascripts/bootstrap.js
index 063bb7a..2568773 100644
--- a/assets/javascripts/bootstrap.js
+++ b/assets/javascripts/bootstrap.js
@@ -1,11 +1,11 @@
/*!
- * Bootstrap v4.0.0-alpha.5 (https://getbootstrap.com)
- * Copyright 2011-2016 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
+ * Bootstrap v4.0.0-alpha.6 (https://getbootstrap.com)
+ * Copyright 2011-2017 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/
if (typeof jQuery === 'undefined') {
- throw new Error('Bootstrap\'s JavaScript requires jQuery')
+ throw new Error('Bootstrap\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\'s JavaScript.')
}
+function ($) {
@@ -30,7 +30,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons
/**
* --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-alpha.5): util.js
+ * Bootstrap (v4.0.0-alpha.6): util.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -85,7 +85,9 @@ var Util = function ($) {
for (var name in TransitionEndEvent) {
if (el.style[name] !== undefined) {
- return { end: TransitionEndEvent[name] };
+ return {
+ end: TransitionEndEvent[name]
+ };
}
}
@@ -132,9 +134,8 @@ var Util = function ($) {
getUID: function getUID(prefix) {
do {
- /* eslint-disable no-bitwise */
+ // eslint-disable-next-line no-bitwise
prefix += ~~(Math.random() * MAX_UID); // "~~" acts like a faster Math.floor() here
- /* eslint-enable no-bitwise */
} while (document.getElementById(prefix));
return prefix;
},
@@ -149,7 +150,7 @@ var Util = function ($) {
return selector;
},
reflow: function reflow(element) {
- new Function('bs', 'return bs')(element.offsetHeight);
+ return element.offsetHeight;
},
triggerTransitionEnd: function triggerTransitionEnd(element) {
$(element).trigger(transition.end);
@@ -162,13 +163,7 @@ var Util = function ($) {
if (configTypes.hasOwnProperty(property)) {
var expectedTypes = configTypes[property];
var value = config[property];
- var valueType = void 0;
-
- if (value && isElement(value)) {
- valueType = 'element';
- } else {
- valueType = toType(value);
- }
+ var valueType = value && isElement(value) ? 'element' : toType(value);
if (!new RegExp(expectedTypes).test(valueType)) {
throw new Error(componentName.toUpperCase() + ': ' + ('Option "' + property + '" provided type "' + valueType + '" ') + ('but expected type "' + expectedTypes + '".'));
@@ -185,7 +180,7 @@ var Util = function ($) {
/**
* --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-alpha.5): alert.js
+ * Bootstrap (v4.0.0-alpha.6): alert.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -199,7 +194,7 @@ var Alert = function ($) {
*/
var NAME = 'alert';
- var VERSION = '4.0.0-alpha.5';
+ var VERSION = '4.0.0-alpha.6';
var DATA_KEY = 'bs.alert';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -219,7 +214,7 @@ var Alert = function ($) {
var ClassName = {
ALERT: 'alert',
FADE: 'fade',
- IN: 'in'
+ SHOW: 'show'
};
/**
@@ -282,14 +277,18 @@ var Alert = function ($) {
};
Alert.prototype._removeElement = function _removeElement(element) {
- $(element).removeClass(ClassName.IN);
+ var _this2 = this;
+
+ $(element).removeClass(ClassName.SHOW);
if (!Util.supportsTransitionEnd() || !$(element).hasClass(ClassName.FADE)) {
this._destroyElement(element);
return;
}
- $(element).one(Util.TRANSITION_END, $.proxy(this._destroyElement, this, element)).emulateTransitionEnd(TRANSITION_DURATION);
+ $(element).one(Util.TRANSITION_END, function (event) {
+ return _this2._destroyElement(element, event);
+ }).emulateTransitionEnd(TRANSITION_DURATION);
};
Alert.prototype._destroyElement = function _destroyElement(element) {
@@ -360,7 +359,7 @@ var Alert = function ($) {
/**
* --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-alpha.5): button.js
+ * Bootstrap (v4.0.0-alpha.6): button.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -374,7 +373,7 @@ var Button = function ($) {
*/
var NAME = 'button';
- var VERSION = '4.0.0-alpha.5';
+ var VERSION = '4.0.0-alpha.6';
var DATA_KEY = 'bs.button';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -438,15 +437,15 @@ var Button = function ($) {
if (triggerChangeEvent) {
input.checked = !$(this._element).hasClass(ClassName.ACTIVE);
- $(this._element).trigger('change');
+ $(input).trigger('change');
}
input.focus();
}
- } else {
- this._element.setAttribute('aria-pressed', !$(this._element).hasClass(ClassName.ACTIVE));
}
+ this._element.setAttribute('aria-pressed', !$(this._element).hasClass(ClassName.ACTIVE));
+
if (triggerChangeEvent) {
$(this._element).toggleClass(ClassName.ACTIVE);
}
@@ -523,7 +522,7 @@ var Button = function ($) {
/**
* --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-alpha.5): carousel.js
+ * Bootstrap (v4.0.0-alpha.6): carousel.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -537,7 +536,7 @@ var Carousel = function ($) {
*/
var NAME = 'carousel';
- var VERSION = '4.0.0-alpha.5';
+ var VERSION = '4.0.0-alpha.6';
var DATA_KEY = 'bs.carousel';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -564,7 +563,9 @@ var Carousel = function ($) {
var Direction = {
NEXT: 'next',
- PREVIOUS: 'prev'
+ PREV: 'prev',
+ LEFT: 'left',
+ RIGHT: 'right'
};
var Event = {
@@ -581,8 +582,10 @@ var Carousel = function ($) {
CAROUSEL: 'carousel',
ACTIVE: 'active',
SLIDE: 'slide',
- RIGHT: 'right',
- LEFT: 'left',
+ RIGHT: 'carousel-item-right',
+ LEFT: 'carousel-item-left',
+ NEXT: 'carousel-item-next',
+ PREV: 'carousel-item-prev',
ITEM: 'carousel-item'
};
@@ -590,7 +593,7 @@ var Carousel = function ($) {
ACTIVE: '.active',
ACTIVE_ITEM: '.active.carousel-item',
ITEM: '.carousel-item',
- NEXT_PREV: '.next, .prev',
+ NEXT_PREV: '.carousel-item-next, .carousel-item-prev',
INDICATORS: '.carousel-indicators',
DATA_SLIDE: '[data-slide], [data-slide-to]',
DATA_RIDE: '[data-ride="carousel"]'
@@ -625,9 +628,10 @@ var Carousel = function ($) {
// public
Carousel.prototype.next = function next() {
- if (!this._isSliding) {
- this._slide(Direction.NEXT);
+ if (this._isSliding) {
+ throw new Error('Carousel is sliding');
}
+ this._slide(Direction.NEXT);
};
Carousel.prototype.nextWhenVisible = function nextWhenVisible() {
@@ -638,9 +642,10 @@ var Carousel = function ($) {
};
Carousel.prototype.prev = function prev() {
- if (!this._isSliding) {
- this._slide(Direction.PREVIOUS);
+ if (this._isSliding) {
+ throw new Error('Carousel is sliding');
}
+ this._slide(Direction.PREVIOUS);
};
Carousel.prototype.pause = function pause(event) {
@@ -668,12 +673,12 @@ var Carousel = function ($) {
}
if (this._config.interval && !this._isPaused) {
- this._interval = setInterval($.proxy(document.visibilityState ? this.nextWhenVisible : this.next, this), this._config.interval);
+ this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);
}
};
Carousel.prototype.to = function to(index) {
- var _this2 = this;
+ var _this3 = this;
this._activeElement = $(this._element).find(Selector.ACTIVE_ITEM)[0];
@@ -685,7 +690,7 @@ var Carousel = function ($) {
if (this._isSliding) {
$(this._element).one(Event.SLID, function () {
- return _this2.to(index);
+ return _this3.to(index);
});
return;
}
@@ -724,27 +729,35 @@ var Carousel = function ($) {
};
Carousel.prototype._addEventListeners = function _addEventListeners() {
+ var _this4 = this;
+
if (this._config.keyboard) {
- $(this._element).on(Event.KEYDOWN, $.proxy(this._keydown, this));
+ $(this._element).on(Event.KEYDOWN, function (event) {
+ return _this4._keydown(event);
+ });
}
if (this._config.pause === 'hover' && !('ontouchstart' in document.documentElement)) {
- $(this._element).on(Event.MOUSEENTER, $.proxy(this.pause, this)).on(Event.MOUSELEAVE, $.proxy(this.cycle, this));
+ $(this._element).on(Event.MOUSEENTER, function (event) {
+ return _this4.pause(event);
+ }).on(Event.MOUSELEAVE, function (event) {
+ return _this4.cycle(event);
+ });
}
};
Carousel.prototype._keydown = function _keydown(event) {
- event.preventDefault();
-
if (/input|textarea/i.test(event.target.tagName)) {
return;
}
switch (event.which) {
case ARROW_LEFT_KEYCODE:
+ event.preventDefault();
this.prev();
break;
case ARROW_RIGHT_KEYCODE:
+ event.preventDefault();
this.next();
break;
default:
@@ -774,10 +787,10 @@ var Carousel = function ($) {
return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];
};
- Carousel.prototype._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, directionalClassname) {
+ Carousel.prototype._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) {
var slideEvent = $.Event(Event.SLIDE, {
relatedTarget: relatedTarget,
- direction: directionalClassname
+ direction: eventDirectionName
});
$(this._element).trigger(slideEvent);
@@ -798,21 +811,33 @@ var Carousel = function ($) {
};
Carousel.prototype._slide = function _slide(direction, element) {
- var _this3 = this;
+ var _this5 = this;
var activeElement = $(this._element).find(Selector.ACTIVE_ITEM)[0];
var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement);
var isCycling = Boolean(this._interval);
- var directionalClassName = direction === Direction.NEXT ? ClassName.LEFT : ClassName.RIGHT;
+ var directionalClassName = void 0;
+ var orderClassName = void 0;
+ var eventDirectionName = void 0;
+
+ if (direction === Direction.NEXT) {
+ directionalClassName = ClassName.LEFT;
+ orderClassName = ClassName.NEXT;
+ eventDirectionName = Direction.LEFT;
+ } else {
+ directionalClassName = ClassName.RIGHT;
+ orderClassName = ClassName.PREV;
+ eventDirectionName = Direction.RIGHT;
+ }
if (nextElement && $(nextElement).hasClass(ClassName.ACTIVE)) {
this._isSliding = false;
return;
}
- var slideEvent = this._triggerSlideEvent(nextElement, directionalClassName);
+ var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);
if (slideEvent.isDefaultPrevented()) {
return;
}
@@ -832,12 +857,12 @@ var Carousel = function ($) {
var slidEvent = $.Event(Event.SLID, {
relatedTarget: nextElement,
- direction: directionalClassName
+ direction: eventDirectionName
});
if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.SLIDE)) {
- $(nextElement).addClass(direction);
+ $(nextElement).addClass(orderClassName);
Util.reflow(nextElement);
@@ -845,16 +870,14 @@ var Carousel = function ($) {
$(nextElement).addClass(directionalClassName);
$(activeElement).one(Util.TRANSITION_END, function () {
- $(nextElement).removeClass(directionalClassName).removeClass(direction);
+ $(nextElement).removeClass(directionalClassName + ' ' + orderClassName).addClass(ClassName.ACTIVE);
- $(nextElement).addClass(ClassName.ACTIVE);
+ $(activeElement).removeClass(ClassName.ACTIVE + ' ' + orderClassName + ' ' + directionalClassName);
- $(activeElement).removeClass(ClassName.ACTIVE).removeClass(direction).removeClass(directionalClassName);
-
- _this3._isSliding = false;
+ _this5._isSliding = false;
setTimeout(function () {
- return $(_this3._element).trigger(slidEvent);
+ return $(_this5._element).trigger(slidEvent);
}, 0);
}).emulateTransitionEnd(TRANSITION_DURATION);
} else {
@@ -979,7 +1002,7 @@ var Carousel = function ($) {
/**
* --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-alpha.5): collapse.js
+ * Bootstrap (v4.0.0-alpha.6): collapse.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -993,7 +1016,7 @@ var Collapse = function ($) {
*/
var NAME = 'collapse';
- var VERSION = '4.0.0-alpha.5';
+ var VERSION = '4.0.0-alpha.6';
var DATA_KEY = 'bs.collapse';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -1019,7 +1042,7 @@ var Collapse = function ($) {
};
var ClassName = {
- IN: 'in',
+ SHOW: 'show',
COLLAPSE: 'collapse',
COLLAPSING: 'collapsing',
COLLAPSED: 'collapsed'
@@ -1031,7 +1054,7 @@ var Collapse = function ($) {
};
var Selector = {
- ACTIVES: '.card > .in, .card > .collapsing',
+ ACTIVES: '.card > .show, .card > .collapsing',
DATA_TOGGLE: '[data-toggle="collapse"]'
};
@@ -1066,7 +1089,7 @@ var Collapse = function ($) {
// public
Collapse.prototype.toggle = function toggle() {
- if ($(this._element).hasClass(ClassName.IN)) {
+ if ($(this._element).hasClass(ClassName.SHOW)) {
this.hide();
} else {
this.show();
@@ -1074,9 +1097,13 @@ var Collapse = function ($) {
};
Collapse.prototype.show = function show() {
- var _this4 = this;
+ var _this6 = this;
- if (this._isTransitioning || $(this._element).hasClass(ClassName.IN)) {
+ if (this._isTransitioning) {
+ throw new Error('Collapse is transitioning');
+ }
+
+ if ($(this._element).hasClass(ClassName.SHOW)) {
return;
}
@@ -1084,7 +1111,7 @@ var Collapse = function ($) {
var activesData = void 0;
if (this._parent) {
- actives = $.makeArray($(Selector.ACTIVES));
+ actives = $.makeArray($(this._parent).find(Selector.ACTIVES));
if (!actives.length) {
actives = null;
}
@@ -1124,13 +1151,13 @@ var Collapse = function ($) {
this.setTransitioning(true);
var complete = function complete() {
- $(_this4._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.IN);
+ $(_this6._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.SHOW);
- _this4._element.style[dimension] = '';
+ _this6._element.style[dimension] = '';
- _this4.setTransitioning(false);
+ _this6.setTransitioning(false);
- $(_this4._element).trigger(Event.SHOWN);
+ $(_this6._element).trigger(Event.SHOWN);
};
if (!Util.supportsTransitionEnd()) {
@@ -1147,9 +1174,13 @@ var Collapse = function ($) {
};
Collapse.prototype.hide = function hide() {
- var _this5 = this;
+ var _this7 = this;
- if (this._isTransitioning || !$(this._element).hasClass(ClassName.IN)) {
+ if (this._isTransitioning) {
+ throw new Error('Collapse is transitioning');
+ }
+
+ if (!$(this._element).hasClass(ClassName.SHOW)) {
return;
}
@@ -1166,7 +1197,7 @@ var Collapse = function ($) {
Util.reflow(this._element);
- $(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.IN);
+ $(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.SHOW);
this._element.setAttribute('aria-expanded', false);
@@ -1177,8 +1208,8 @@ var Collapse = function ($) {
this.setTransitioning(true);
var complete = function complete() {
- _this5.setTransitioning(false);
- $(_this5._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).trigger(Event.HIDDEN);
+ _this7.setTransitioning(false);
+ $(_this7._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).trigger(Event.HIDDEN);
};
this._element.style[dimension] = '';
@@ -1220,13 +1251,13 @@ var Collapse = function ($) {
};
Collapse.prototype._getParent = function _getParent() {
- var _this6 = this;
+ var _this8 = this;
var parent = $(this._config.parent)[0];
var selector = '[data-toggle="collapse"][data-parent="' + this._config.parent + '"]';
$(parent).find(selector).each(function (i, element) {
- _this6._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);
+ _this8._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);
});
return parent;
@@ -1234,7 +1265,7 @@ var Collapse = function ($) {
Collapse.prototype._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {
if (element) {
- var isOpen = $(element).hasClass(ClassName.IN);
+ var isOpen = $(element).hasClass(ClassName.SHOW);
element.setAttribute('aria-expanded', isOpen);
if (triggerArray.length) {
@@ -1323,7 +1354,7 @@ var Collapse = function ($) {
/**
* --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-alpha.5): dropdown.js
+ * Bootstrap (v4.0.0-alpha.6): dropdown.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -1337,7 +1368,7 @@ var Dropdown = function ($) {
*/
var NAME = 'dropdown';
- var VERSION = '4.0.0-alpha.5';
+ var VERSION = '4.0.0-alpha.6';
var DATA_KEY = 'bs.dropdown';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -1354,13 +1385,14 @@ var Dropdown = function ($) {
SHOWN: 'shown' + EVENT_KEY,
CLICK: 'click' + EVENT_KEY,
CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY,
+ FOCUSIN_DATA_API: 'focusin' + EVENT_KEY + DATA_API_KEY,
KEYDOWN_DATA_API: 'keydown' + EVENT_KEY + DATA_API_KEY
};
var ClassName = {
BACKDROP: 'dropdown-backdrop',
DISABLED: 'disabled',
- OPEN: 'open'
+ SHOW: 'show'
};
var Selector = {
@@ -1398,7 +1430,7 @@ var Dropdown = function ($) {
}
var parent = Dropdown._getParentFromElement(this);
- var isActive = $(parent).hasClass(ClassName.OPEN);
+ var isActive = $(parent).hasClass(ClassName.SHOW);
Dropdown._clearMenus();
@@ -1415,7 +1447,9 @@ var Dropdown = function ($) {
$(dropdown).on('click', Dropdown._clearMenus);
}
- var relatedTarget = { relatedTarget: this };
+ var relatedTarget = {
+ relatedTarget: this
+ };
var showEvent = $.Event(Event.SHOW, relatedTarget);
$(parent).trigger(showEvent);
@@ -1425,9 +1459,9 @@ var Dropdown = function ($) {
}
this.focus();
- this.setAttribute('aria-expanded', 'true');
+ this.setAttribute('aria-expanded', true);
- $(parent).toggleClass(ClassName.OPEN);
+ $(parent).toggleClass(ClassName.SHOW);
$(parent).trigger($.Event(Event.SHOWN, relatedTarget));
return false;
@@ -1452,7 +1486,8 @@ var Dropdown = function ($) {
var data = $(this).data(DATA_KEY);
if (!data) {
- $(this).data(DATA_KEY, data = new Dropdown(this));
+ data = new Dropdown(this);
+ $(this).data(DATA_KEY, data);
}
if (typeof config === 'string') {
@@ -1478,13 +1513,15 @@ var Dropdown = function ($) {
for (var i = 0; i < toggles.length; i++) {
var parent = Dropdown._getParentFromElement(toggles[i]);
- var relatedTarget = { relatedTarget: toggles[i] };
+ var relatedTarget = {
+ relatedTarget: toggles[i]
+ };
- if (!$(parent).hasClass(ClassName.OPEN)) {
+ if (!$(parent).hasClass(ClassName.SHOW)) {
continue;
}
- if (event && event.type === 'click' && /input|textarea/i.test(event.target.tagName) && $.contains(parent, event.target)) {
+ if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'focusin') && $.contains(parent, event.target)) {
continue;
}
@@ -1496,7 +1533,7 @@ var Dropdown = function ($) {
toggles[i].setAttribute('aria-expanded', 'false');
- $(parent).removeClass(ClassName.OPEN).trigger($.Event(Event.HIDDEN, relatedTarget));
+ $(parent).removeClass(ClassName.SHOW).trigger($.Event(Event.HIDDEN, relatedTarget));
}
};
@@ -1524,7 +1561,7 @@ var Dropdown = function ($) {
}
var parent = Dropdown._getParentFromElement(this);
- var isActive = $(parent).hasClass(ClassName.OPEN);
+ var isActive = $(parent).hasClass(ClassName.SHOW);
if (!isActive && event.which !== ESCAPE_KEYCODE || isActive && event.which === ESCAPE_KEYCODE) {
@@ -1537,11 +1574,7 @@ var Dropdown = function ($) {
return;
}
- var items = $.makeArray($(Selector.VISIBLE_ITEMS));
-
- items = items.filter(function (item) {
- return item.offsetWidth || item.offsetHeight;
- });
+ var items = $(parent).find(Selector.VISIBLE_ITEMS).get();
if (!items.length) {
return;
@@ -1582,7 +1615,7 @@ var Dropdown = function ($) {
* ------------------------------------------------------------------------
*/
- $(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) {
+ $(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 + ' ' + Event.FOCUSIN_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) {
e.stopPropagation();
});
@@ -1604,7 +1637,7 @@ var Dropdown = function ($) {
/**
* --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-alpha.5): modal.js
+ * Bootstrap (v4.0.0-alpha.6): modal.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -1618,7 +1651,7 @@ var Modal = function ($) {
*/
var NAME = 'modal';
- var VERSION = '4.0.0-alpha.5';
+ var VERSION = '4.0.0-alpha.6';
var DATA_KEY = 'bs.modal';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -1660,14 +1693,14 @@ var Modal = function ($) {
BACKDROP: 'modal-backdrop',
OPEN: 'modal-open',
FADE: 'fade',
- IN: 'in'
+ SHOW: 'show'
};
var Selector = {
DIALOG: '.modal-dialog',
DATA_TOGGLE: '[data-toggle="modal"]',
DATA_DISMISS: '[data-dismiss="modal"]',
- FIXED_CONTENT: '.navbar-fixed-top, .navbar-fixed-bottom, .is-fixed'
+ FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'
};
/**
@@ -1687,6 +1720,7 @@ var Modal = function ($) {
this._isShown = false;
this._isBodyOverflowing = false;
this._ignoreBackdropClick = false;
+ this._isTransitioning = false;
this._originalBodyPadding = 0;
this._scrollbarWidth = 0;
}
@@ -1700,8 +1734,15 @@ var Modal = function ($) {
};
Modal.prototype.show = function show(relatedTarget) {
- var _this7 = this;
+ var _this9 = this;
+ if (this._isTransitioning) {
+ throw new Error('Modal is transitioning');
+ }
+
+ if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE)) {
+ this._isTransitioning = true;
+ }
var showEvent = $.Event(Event.SHOW, {
relatedTarget: relatedTarget
});
@@ -1722,26 +1763,40 @@ var Modal = function ($) {
this._setEscapeEvent();
this._setResizeEvent();
- $(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, $.proxy(this.hide, this));
+ $(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, function (event) {
+ return _this9.hide(event);
+ });
$(this._dialog).on(Event.MOUSEDOWN_DISMISS, function () {
- $(_this7._element).one(Event.MOUSEUP_DISMISS, function (event) {
- if ($(event.target).is(_this7._element)) {
- _this7._ignoreBackdropClick = true;
+ $(_this9._element).one(Event.MOUSEUP_DISMISS, function (event) {
+ if ($(event.target).is(_this9._element)) {
+ _this9._ignoreBackdropClick = true;
}
});
});
- this._showBackdrop($.proxy(this._showElement, this, relatedTarget));
+ this._showBackdrop(function () {
+ return _this9._showElement(relatedTarget);
+ });
};
Modal.prototype.hide = function hide(event) {
+ var _this10 = this;
+
if (event) {
event.preventDefault();
}
- var hideEvent = $.Event(Event.HIDE);
+ if (this._isTransitioning) {
+ throw new Error('Modal is transitioning');
+ }
+
+ var transition = Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE);
+ if (transition) {
+ this._isTransitioning = true;
+ }
+ var hideEvent = $.Event(Event.HIDE);
$(this._element).trigger(hideEvent);
if (!this._isShown || hideEvent.isDefaultPrevented()) {
@@ -1755,14 +1810,15 @@ var Modal = function ($) {
$(document).off(Event.FOCUSIN);
- $(this._element).removeClass(ClassName.IN);
+ $(this._element).removeClass(ClassName.SHOW);
$(this._element).off(Event.CLICK_DISMISS);
$(this._dialog).off(Event.MOUSEDOWN_DISMISS);
- if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE)) {
-
- $(this._element).one(Util.TRANSITION_END, $.proxy(this._hideModal, this)).emulateTransitionEnd(TRANSITION_DURATION);
+ if (transition) {
+ $(this._element).one(Util.TRANSITION_END, function (event) {
+ return _this10._hideModal(event);
+ }).emulateTransitionEnd(TRANSITION_DURATION);
} else {
this._hideModal();
}
@@ -1771,10 +1827,7 @@ var Modal = function ($) {
Modal.prototype.dispose = function dispose() {
$.removeData(this._element, DATA_KEY);
- $(window).off(EVENT_KEY);
- $(document).off(EVENT_KEY);
- $(this._element).off(EVENT_KEY);
- $(this._backdrop).off(EVENT_KEY);
+ $(window, document, this._element, this._backdrop).off(EVENT_KEY);
this._config = null;
this._element = null;
@@ -1796,7 +1849,7 @@ var Modal = function ($) {
};
Modal.prototype._showElement = function _showElement(relatedTarget) {
- var _this8 = this;
+ var _this11 = this;
var transition = Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE);
@@ -1813,7 +1866,7 @@ var Modal = function ($) {
Util.reflow(this._element);
}
- $(this._element).addClass(ClassName.IN);
+ $(this._element).addClass(ClassName.SHOW);
if (this._config.focus) {
this._enforceFocus();
@@ -1824,10 +1877,11 @@ var Modal = function ($) {
});
var transitionComplete = function transitionComplete() {
- if (_this8._config.focus) {
- _this8._element.focus();
+ if (_this11._config.focus) {
+ _this11._element.focus();
}
- $(_this8._element).trigger(shownEvent);
+ _this11._isTransitioning = false;
+ $(_this11._element).trigger(shownEvent);
};
if (transition) {
@@ -1838,23 +1892,23 @@ var Modal = function ($) {
};
Modal.prototype._enforceFocus = function _enforceFocus() {
- var _this9 = this;
+ var _this12 = this;
$(document).off(Event.FOCUSIN) // guard against infinite focus loop
.on(Event.FOCUSIN, function (event) {
- if (document !== event.target && _this9._element !== event.target && !$(_this9._element).has(event.target).length) {
- _this9._element.focus();
+ if (document !== event.target && _this12._element !== event.target && !$(_this12._element).has(event.target).length) {
+ _this12._element.focus();
}
});
};
Modal.prototype._setEscapeEvent = function _setEscapeEvent() {
- var _this10 = this;
+ var _this13 = this;
if (this._isShown && this._config.keyboard) {
$(this._element).on(Event.KEYDOWN_DISMISS, function (event) {
if (event.which === ESCAPE_KEYCODE) {
- _this10.hide();
+ _this13.hide();
}
});
} else if (!this._isShown) {
@@ -1863,23 +1917,28 @@ var Modal = function ($) {
};
Modal.prototype._setResizeEvent = function _setResizeEvent() {
+ var _this14 = this;
+
if (this._isShown) {
- $(window).on(Event.RESIZE, $.proxy(this._handleUpdate, this));
+ $(window).on(Event.RESIZE, function (event) {
+ return _this14._handleUpdate(event);
+ });
} else {
$(window).off(Event.RESIZE);
}
};
Modal.prototype._hideModal = function _hideModal() {
- var _this11 = this;
+ var _this15 = this;
this._element.style.display = 'none';
this._element.setAttribute('aria-hidden', 'true');
+ this._isTransitioning = false;
this._showBackdrop(function () {
$(document.body).removeClass(ClassName.OPEN);
- _this11._resetAdjustments();
- _this11._resetScrollbar();
- $(_this11._element).trigger(Event.HIDDEN);
+ _this15._resetAdjustments();
+ _this15._resetScrollbar();
+ $(_this15._element).trigger(Event.HIDDEN);
});
};
@@ -1891,7 +1950,7 @@ var Modal = function ($) {
};
Modal.prototype._showBackdrop = function _showBackdrop(callback) {
- var _this12 = this;
+ var _this16 = this;
var animate = $(this._element).hasClass(ClassName.FADE) ? ClassName.FADE : '';
@@ -1908,17 +1967,17 @@ var Modal = function ($) {
$(this._backdrop).appendTo(document.body);
$(this._element).on(Event.CLICK_DISMISS, function (event) {
- if (_this12._ignoreBackdropClick) {
- _this12._ignoreBackdropClick = false;
+ if (_this16._ignoreBackdropClick) {
+ _this16._ignoreBackdropClick = false;
return;
}
if (event.target !== event.currentTarget) {
return;
}
- if (_this12._config.backdrop === 'static') {
- _this12._element.focus();
+ if (_this16._config.backdrop === 'static') {
+ _this16._element.focus();
} else {
- _this12.hide();
+ _this16.hide();
}
});
@@ -1926,7 +1985,7 @@ var Modal = function ($) {
Util.reflow(this._backdrop);
}
- $(this._backdrop).addClass(ClassName.IN);
+ $(this._backdrop).addClass(ClassName.SHOW);
if (!callback) {
return;
@@ -1939,10 +1998,10 @@ var Modal = function ($) {
$(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(BACKDROP_TRANSITION_DURATION);
} else if (!this._isShown && this._backdrop) {
- $(this._backdrop).removeClass(ClassName.IN);
+ $(this._backdrop).removeClass(ClassName.SHOW);
var callbackRemove = function callbackRemove() {
- _this12._removeBackdrop();
+ _this16._removeBackdrop();
if (callback) {
callback();
}
@@ -2058,7 +2117,7 @@ var Modal = function ($) {
*/
$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
- var _this13 = this;
+ var _this17 = this;
var target = void 0;
var selector = Util.getSelectorFromElement(this);
@@ -2069,7 +2128,7 @@ var Modal = function ($) {
var config = $(target).data(DATA_KEY) ? 'toggle' : $.extend({}, $(target).data(), $(this).data());
- if (this.tagName === 'A') {
+ if (this.tagName === 'A' || this.tagName === 'AREA') {
event.preventDefault();
}
@@ -2080,8 +2139,8 @@ var Modal = function ($) {
}
$target.one(Event.HIDDEN, function () {
- if ($(_this13).is(':visible')) {
- _this13.focus();
+ if ($(_this17).is(':visible')) {
+ _this17.focus();
}
});
});
@@ -2107,7 +2166,7 @@ var Modal = function ($) {
/**
* --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-alpha.5): scrollspy.js
+ * Bootstrap (v4.0.0-alpha.6): scrollspy.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -2121,7 +2180,7 @@ var ScrollSpy = function ($) {
*/
var NAME = 'scrollspy';
- var VERSION = '4.0.0-alpha.5';
+ var VERSION = '4.0.0-alpha.6';
var DATA_KEY = 'bs.scrollspy';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -2178,6 +2237,8 @@ var ScrollSpy = function ($) {
var ScrollSpy = function () {
function ScrollSpy(element, config) {
+ var _this18 = this;
+
_classCallCheck(this, ScrollSpy);
this._element = element;
@@ -2189,7 +2250,9 @@ var ScrollSpy = function ($) {
this._activeTarget = null;
this._scrollHeight = 0;
- $(this._scrollElement).on(Event.SCROLL, $.proxy(this._process, this));
+ $(this._scrollElement).on(Event.SCROLL, function (event) {
+ return _this18._process(event);
+ });
this.refresh();
this._process();
@@ -2200,7 +2263,7 @@ var ScrollSpy = function ($) {
// public
ScrollSpy.prototype.refresh = function refresh() {
- var _this14 = this;
+ var _this19 = this;
var autoMethod = this._scrollElement !== this._scrollElement.window ? OffsetMethod.POSITION : OffsetMethod.OFFSET;
@@ -2233,8 +2296,8 @@ var ScrollSpy = function ($) {
}).sort(function (a, b) {
return a[0] - b[0];
}).forEach(function (item) {
- _this14._offsets.push(item[0]);
- _this14._targets.push(item[1]);
+ _this19._offsets.push(item[0]);
+ _this19._targets.push(item[1]);
});
};
@@ -2272,17 +2335,21 @@ var ScrollSpy = function ($) {
};
ScrollSpy.prototype._getScrollTop = function _getScrollTop() {
- return this._scrollElement === window ? this._scrollElement.scrollY : this._scrollElement.scrollTop;
+ return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;
};
ScrollSpy.prototype._getScrollHeight = function _getScrollHeight() {
return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);
};
+ ScrollSpy.prototype._getOffsetHeight = function _getOffsetHeight() {
+ return this._scrollElement === window ? window.innerHeight : this._scrollElement.offsetHeight;
+ };
+
ScrollSpy.prototype._process = function _process() {
var scrollTop = this._getScrollTop() + this._config.offset;
var scrollHeight = this._getScrollHeight();
- var maxScroll = this._config.offset + scrollHeight - this._scrollElement.offsetHeight;
+ var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();
if (this._scrollHeight !== scrollHeight) {
this.refresh();
@@ -2294,9 +2361,10 @@ var ScrollSpy = function ($) {
if (this._activeTarget !== target) {
this._activate(target);
}
+ return;
}
- if (this._activeTarget && scrollTop < this._offsets[0]) {
+ if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {
this._activeTarget = null;
this._clear();
return;
@@ -2329,7 +2397,7 @@ var ScrollSpy = function ($) {
} else {
// todo (fat) this is kinda sus...
// recursively add actives to tested nav-links
- $link.parents(Selector.LI).find(Selector.NAV_LINKS).addClass(ClassName.ACTIVE);
+ $link.parents(Selector.LI).find('> ' + Selector.NAV_LINKS).addClass(ClassName.ACTIVE);
}
$(this._scrollElement).trigger(Event.ACTIVATE, {
@@ -2346,7 +2414,7 @@ var ScrollSpy = function ($) {
ScrollSpy._jQueryInterface = function _jQueryInterface(config) {
return this.each(function () {
var data = $(this).data(DATA_KEY);
- var _config = (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' && config || null;
+ var _config = (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' && config;
if (!data) {
data = new ScrollSpy(this, _config);
@@ -2410,7 +2478,7 @@ var ScrollSpy = function ($) {
/**
* --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-alpha.5): tab.js
+ * Bootstrap (v4.0.0-alpha.6): tab.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -2424,7 +2492,7 @@ var Tab = function ($) {
*/
var NAME = 'tab';
- var VERSION = '4.0.0-alpha.5';
+ var VERSION = '4.0.0-alpha.6';
var DATA_KEY = 'bs.tab';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -2442,15 +2510,16 @@ var Tab = function ($) {
var ClassName = {
DROPDOWN_MENU: 'dropdown-menu',
ACTIVE: 'active',
+ DISABLED: 'disabled',
FADE: 'fade',
- IN: 'in'
+ SHOW: 'show'
};
var Selector = {
A: 'a',
LI: 'li',
DROPDOWN: '.dropdown',
- UL: 'ul:not(.dropdown-menu)',
+ LIST: 'ul:not(.dropdown-menu), ol:not(.dropdown-menu), nav:not(.dropdown-menu)',
FADE_CHILD: '> .nav-item .fade, > .fade',
ACTIVE: '.active',
ACTIVE_CHILD: '> .nav-item > .active, > .active',
@@ -2477,19 +2546,19 @@ var Tab = function ($) {
// public
Tab.prototype.show = function show() {
- var _this15 = this;
+ var _this20 = this;
- if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $(this._element).hasClass(ClassName.ACTIVE)) {
+ if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $(this._element).hasClass(ClassName.ACTIVE) || $(this._element).hasClass(ClassName.DISABLED)) {
return;
}
var target = void 0;
var previous = void 0;
- var ulElement = $(this._element).closest(Selector.UL)[0];
+ var listElement = $(this._element).closest(Selector.LIST)[0];
var selector = Util.getSelectorFromElement(this._element);
- if (ulElement) {
- previous = $.makeArray($(ulElement).find(Selector.ACTIVE));
+ if (listElement) {
+ previous = $.makeArray($(listElement).find(Selector.ACTIVE));
previous = previous[previous.length - 1];
}
@@ -2515,11 +2584,11 @@ var Tab = function ($) {
target = $(selector)[0];
}
- this._activate(this._element, ulElement);
+ this._activate(this._element, listElement);
var complete = function complete() {
var hiddenEvent = $.Event(Event.HIDDEN, {
- relatedTarget: _this15._element
+ relatedTarget: _this20._element
});
var shownEvent = $.Event(Event.SHOWN, {
@@ -2527,7 +2596,7 @@ var Tab = function ($) {
});
$(previous).trigger(hiddenEvent);
- $(_this15._element).trigger(shownEvent);
+ $(_this20._element).trigger(shownEvent);
};
if (target) {
@@ -2545,10 +2614,14 @@ var Tab = function ($) {
// private
Tab.prototype._activate = function _activate(element, container, callback) {
+ var _this21 = this;
+
var active = $(container).find(Selector.ACTIVE_CHILD)[0];
var isTransitioning = callback && Util.supportsTransitionEnd() && (active && $(active).hasClass(ClassName.FADE) || Boolean($(container).find(Selector.FADE_CHILD)[0]));
- var complete = $.proxy(this._transitionComplete, this, element, active, isTransitioning, callback);
+ var complete = function complete() {
+ return _this21._transitionComplete(element, active, isTransitioning, callback);
+ };
if (active && isTransitioning) {
$(active).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
@@ -2557,7 +2630,7 @@ var Tab = function ($) {
}
if (active) {
- $(active).removeClass(ClassName.IN);
+ $(active).removeClass(ClassName.SHOW);
}
};
@@ -2565,7 +2638,7 @@ var Tab = function ($) {
if (active) {
$(active).removeClass(ClassName.ACTIVE);
- var dropdownChild = $(active).find(Selector.DROPDOWN_ACTIVE_CHILD)[0];
+ var dropdownChild = $(active.parentNode).find(Selector.DROPDOWN_ACTIVE_CHILD)[0];
if (dropdownChild) {
$(dropdownChild).removeClass(ClassName.ACTIVE);
@@ -2579,7 +2652,7 @@ var Tab = function ($) {
if (isTransitioning) {
Util.reflow(element);
- $(element).addClass(ClassName.IN);
+ $(element).addClass(ClassName.SHOW);
} else {
$(element).removeClass(ClassName.FADE);
}
@@ -2607,7 +2680,7 @@ var Tab = function ($) {
var data = $this.data(DATA_KEY);
if (!data) {
- data = data = new Tab(this);
+ data = new Tab(this);
$this.data(DATA_KEY, data);
}
@@ -2661,7 +2734,7 @@ var Tab = function ($) {
/**
* --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-alpha.5): tooltip.js
+ * Bootstrap (v4.0.0-alpha.6): tooltip.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -2672,7 +2745,7 @@ var Tooltip = function ($) {
* Check for Tether dependency
* Tether - http://tether.io/
*/
- if (window.Tether === undefined) {
+ if (typeof Tether === 'undefined') {
throw new Error('Bootstrap tooltips require Tether (http://tether.io/)');
}
@@ -2683,7 +2756,7 @@ var Tooltip = function ($) {
*/
var NAME = 'tooltip';
- var VERSION = '4.0.0-alpha.5';
+ var VERSION = '4.0.0-alpha.6';
var DATA_KEY = 'bs.tooltip';
var EVENT_KEY = '.' + DATA_KEY;
var JQUERY_NO_CONFLICT = $.fn[NAME];
@@ -2700,7 +2773,8 @@ var Tooltip = function ($) {
selector: false,
placement: 'top',
offset: '0 0',
- constraints: []
+ constraints: [],
+ container: false
};
var DefaultType = {
@@ -2713,7 +2787,8 @@ var Tooltip = function ($) {
selector: '(string|boolean)',
placement: '(string|function)',
offset: 'string',
- constraints: 'array'
+ constraints: 'array',
+ container: '(string|element|boolean)'
};
var AttachmentMap = {
@@ -2724,7 +2799,7 @@ var Tooltip = function ($) {
};
var HoverState = {
- IN: 'in',
+ SHOW: 'show',
OUT: 'out'
};
@@ -2743,7 +2818,7 @@ var Tooltip = function ($) {
var ClassName = {
FADE: 'fade',
- IN: 'in'
+ SHOW: 'show'
};
var Selector = {
@@ -2778,6 +2853,7 @@ var Tooltip = function ($) {
this._timeout = 0;
this._hoverState = '';
this._activeTrigger = {};
+ this._isTransitioning = false;
this._tether = null;
// protected
@@ -2823,7 +2899,7 @@ var Tooltip = function ($) {
}
} else {
- if ($(this.getTipElement()).hasClass(ClassName.IN)) {
+ if ($(this.getTipElement()).hasClass(ClassName.SHOW)) {
this._leave(null, this);
return;
}
@@ -2840,6 +2916,7 @@ var Tooltip = function ($) {
$.removeData(this.element, this.constructor.DATA_KEY);
$(this.element).off(this.constructor.EVENT_KEY);
+ $(this.element).closest('.modal').off('hide.bs.modal');
if (this.tip) {
$(this.tip).remove();
@@ -2857,11 +2934,17 @@ var Tooltip = function ($) {
};
Tooltip.prototype.show = function show() {
- var _this16 = this;
+ var _this22 = this;
- var showEvent = $.Event(this.constructor.Event.SHOW);
+ if ($(this.element).css('display') === 'none') {
+ throw new Error('Please use show on visible elements');
+ }
+ var showEvent = $.Event(this.constructor.Event.SHOW);
if (this.isWithContent() && this._isEnabled) {
+ if (this._isTransitioning) {
+ throw new Error('Tooltip is transitioning');
+ }
$(this.element).trigger(showEvent);
var isInTheDom = $.contains(this.element.ownerDocument.documentElement, this.element);
@@ -2886,7 +2969,9 @@ var Tooltip = function ($) {
var attachment = this._getAttachment(placement);
- $(tip).data(this.constructor.DATA_KEY, this).appendTo(document.body);
+ var container = this.config.container === false ? document.body : $(this.config.container);
+
+ $(tip).data(this.constructor.DATA_KEY, this).appendTo(container);
$(this.element).trigger(this.constructor.Event.INSERTED);
@@ -2904,20 +2989,22 @@ var Tooltip = function ($) {
Util.reflow(tip);
this._tether.position();
- $(tip).addClass(ClassName.IN);
+ $(tip).addClass(ClassName.SHOW);
var complete = function complete() {
- var prevHoverState = _this16._hoverState;
- _this16._hoverState = null;
+ var prevHoverState = _this22._hoverState;
+ _this22._hoverState = null;
+ _this22._isTransitioning = false;
- $(_this16.element).trigger(_this16.constructor.Event.SHOWN);
+ $(_this22.element).trigger(_this22.constructor.Event.SHOWN);
if (prevHoverState === HoverState.OUT) {
- _this16._leave(null, _this16);
+ _this22._leave(null, _this22);
}
};
if (Util.supportsTransitionEnd() && $(this.tip).hasClass(ClassName.FADE)) {
+ this._isTransitioning = true;
$(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(Tooltip._TRANSITION_DURATION);
return;
}
@@ -2927,18 +3014,22 @@ var Tooltip = function ($) {
};
Tooltip.prototype.hide = function hide(callback) {
- var _this17 = this;
+ var _this23 = this;
var tip = this.getTipElement();
var hideEvent = $.Event(this.constructor.Event.HIDE);
+ if (this._isTransitioning) {
+ throw new Error('Tooltip is transitioning');
+ }
var complete = function complete() {
- if (_this17._hoverState !== HoverState.IN && tip.parentNode) {
+ if (_this23._hoverState !== HoverState.SHOW && tip.parentNode) {
tip.parentNode.removeChild(tip);
}
- _this17.element.removeAttribute('aria-describedby');
- $(_this17.element).trigger(_this17.constructor.Event.HIDDEN);
- _this17.cleanupTether();
+ _this23.element.removeAttribute('aria-describedby');
+ $(_this23.element).trigger(_this23.constructor.Event.HIDDEN);
+ _this23._isTransitioning = false;
+ _this23.cleanupTether();
if (callback) {
callback();
@@ -2951,10 +3042,14 @@ var Tooltip = function ($) {
return;
}
- $(tip).removeClass(ClassName.IN);
+ $(tip).removeClass(ClassName.SHOW);
- if (Util.supportsTransitionEnd() && $(this.tip).hasClass(ClassName.FADE)) {
+ this._activeTrigger[Trigger.CLICK] = false;
+ this._activeTrigger[Trigger.FOCUS] = false;
+ this._activeTrigger[Trigger.HOVER] = false;
+ if (Util.supportsTransitionEnd() && $(this.tip).hasClass(ClassName.FADE)) {
+ this._isTransitioning = true;
$(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
} else {
complete();
@@ -2978,7 +3073,7 @@ var Tooltip = function ($) {
this.setElementContent($tip.find(Selector.TOOLTIP_INNER), this.getTitle());
- $tip.removeClass(ClassName.FADE).removeClass(ClassName.IN);
+ $tip.removeClass(ClassName.FADE + ' ' + ClassName.SHOW);
this.cleanupTether();
};
@@ -3022,19 +3117,29 @@ var Tooltip = function ($) {
};
Tooltip.prototype._setListeners = function _setListeners() {
- var _this18 = this;
+ var _this24 = this;
var triggers = this.config.trigger.split(' ');
triggers.forEach(function (trigger) {
if (trigger === 'click') {
- $(_this18.element).on(_this18.constructor.Event.CLICK, _this18.config.selector, $.proxy(_this18.toggle, _this18));
+ $(_this24.element).on(_this24.constructor.Event.CLICK, _this24.config.selector, function (event) {
+ return _this24.toggle(event);
+ });
} else if (trigger !== Trigger.MANUAL) {
- var eventIn = trigger === Trigger.HOVER ? _this18.constructor.Event.MOUSEENTER : _this18.constructor.Event.FOCUSIN;
- var eventOut = trigger === Trigger.HOVER ? _this18.constructor.Event.MOUSELEAVE : _this18.constructor.Event.FOCUSOUT;
+ var eventIn = trigger === Trigger.HOVER ? _this24.constructor.Event.MOUSEENTER : _this24.constructor.Event.FOCUSIN;
+ var eventOut = trigger === Trigger.HOVER ? _this24.constructor.Event.MOUSELEAVE : _this24.constructor.Event.FOCUSOUT;
- $(_this18.element).on(eventIn, _this18.config.selector, $.proxy(_this18._enter, _this18)).on(eventOut, _this18.config.selector, $.proxy(_this18._leave, _this18));
+ $(_this24.element).on(eventIn, _this24.config.selector, function (event) {
+ return _this24._enter(event);
+ }).on(eventOut, _this24.config.selector, function (event) {
+ return _this24._leave(event);
+ });
}
+
+ $(_this24.element).closest('.modal').on('hide.bs.modal', function () {
+ return _this24.hide();
+ });
});
if (this.config.selector) {
@@ -3069,14 +3174,14 @@ var Tooltip = function ($) {
context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true;
}
- if ($(context.getTipElement()).hasClass(ClassName.IN) || context._hoverState === HoverState.IN) {
- context._hoverState = HoverState.IN;
+ if ($(context.getTipElement()).hasClass(ClassName.SHOW) || context._hoverState === HoverState.SHOW) {
+ context._hoverState = HoverState.SHOW;
return;
}
clearTimeout(context._timeout);
- context._hoverState = HoverState.IN;
+ context._hoverState = HoverState.SHOW;
if (!context.config.delay || !context.config.delay.show) {
context.show();
@@ -3084,7 +3189,7 @@ var Tooltip = function ($) {
}
context._timeout = setTimeout(function () {
- if (context._hoverState === HoverState.IN) {
+ if (context._hoverState === HoverState.SHOW) {
context.show();
}
}, context.config.delay.show);
@@ -3168,7 +3273,7 @@ var Tooltip = function ($) {
Tooltip._jQueryInterface = function _jQueryInterface(config) {
return this.each(function () {
var data = $(this).data(DATA_KEY);
- var _config = (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' ? config : null;
+ var _config = (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' && config;
if (!data && /dispose|hide/.test(config)) {
return;
@@ -3246,7 +3351,7 @@ var Tooltip = function ($) {
/**
* --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-alpha.5): popover.js
+ * Bootstrap (v4.0.0-alpha.6): popover.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -3260,7 +3365,7 @@ var Popover = function ($) {
*/
var NAME = 'popover';
- var VERSION = '4.0.0-alpha.5';
+ var VERSION = '4.0.0-alpha.6';
var DATA_KEY = 'bs.popover';
var EVENT_KEY = '.' + DATA_KEY;
var JQUERY_NO_CONFLICT = $.fn[NAME];
@@ -3278,7 +3383,7 @@ var Popover = function ($) {
var ClassName = {
FADE: 'fade',
- IN: 'in'
+ SHOW: 'show'
};
var Selector = {
@@ -3331,7 +3436,7 @@ var Popover = function ($) {
this.setElementContent($tip.find(Selector.TITLE), this.getTitle());
this.setElementContent($tip.find(Selector.CONTENT), this._getContent());
- $tip.removeClass(ClassName.FADE).removeClass(ClassName.IN);
+ $tip.removeClass(ClassName.FADE + ' ' + ClassName.SHOW);
this.cleanupTether();
};
diff --git a/assets/javascripts/bootstrap.min.js b/assets/javascripts/bootstrap.min.js
index 7759140..d9c72df 100644
--- a/assets/javascripts/bootstrap.min.js
+++ b/assets/javascripts/bootstrap.min.js
@@ -1,7 +1,7 @@
/*!
- * Bootstrap v4.0.0-alpha.5 (https://getbootstrap.com)
- * Copyright 2011-2016 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
+ * Bootstrap v4.0.0-alpha.6 (https://getbootstrap.com)
+ * Copyright 2011-2017 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/
-if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(jQuery),+function(){function a(a,b){if(!a)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!b||"object"!=typeof b&&"function"!=typeof b?a:b}function b(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}function c(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}var d="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},e=function(){function a(a,b){for(var c=0;c<b.length;c++){var d=b[c];d.enumerable=d.enumerable||!1,d.configurable=!0,"value"in d&&(d.writable=!0),Object.defineProperty(a,d.key,d)}}return function(b,c,d){return c&&a(b.prototype,c),d&&a(b,d),b}}(),f=function(a){function b(a){return{}.toString.call(a).match(/\s([a-zA-Z]+)/)[1].toLowerCase()}function c(a){return(a[0]||a).nodeType}function d(){return{bindType:h.end,delegateType:h.end,handle:function(b){if(a(b.target).is(this))return b.handleObj.handler.apply(this,arguments)}}}function e(){if(window.QUnit)return!1;var a=document.createElement("bootstrap");for(var b in j)if(void 0!==a.style[b])return{end:j[b]};return!1}function f(b){var c=this,d=!1;return a(this).one(k.TRANSITION_END,function(){d=!0}),setTimeout(function(){d||k.triggerTransitionEnd(c)},b),this}function g(){h=e(),a.fn.emulateTransitionEnd=f,k.supportsTransitionEnd()&&(a.event.special[k.TRANSITION_END]=d())}var h=!1,i=1e6,j={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},k={TRANSITION_END:"bsTransitionEnd",getUID:function(a){do a+=~~(Math.random()*i);while(document.getElementById(a));return a},getSelectorFromElement:function(a){var b=a.getAttribute("data-target");return b||(b=a.getAttribute("href")||"",b=/^#[a-z]/i.test(b)?b:null),b},reflow:function(a){new Function("bs","return bs")(a.offsetHeight)},triggerTransitionEnd:function(b){a(b).trigger(h.end)},supportsTransitionEnd:function(){return Boolean(h)},typeCheckConfig:function(a,d,e){for(var f in e)if(e.hasOwnProperty(f)){var g=e[f],h=d[f],i=void 0;if(i=h&&c(h)?"element":b(h),!new RegExp(g).test(i))throw new Error(a.toUpperCase()+": "+('Option "'+f+'" provided type "'+i+'" ')+('but expected type "'+g+'".'))}}};return g(),k}(jQuery),g=(function(a){var b="alert",d="4.0.0-alpha.5",g="bs.alert",h="."+g,i=".data-api",j=a.fn[b],k=150,l={DISMISS:'[data-dismiss="alert"]'},m={CLOSE:"close"+h,CLOSED:"closed"+h,CLICK_DATA_API:"click"+h+i},n={ALERT:"alert",FADE:"fade",IN:"in"},o=function(){function b(a){c(this,b),this._element=a}return b.prototype.close=function(a){a=a||this._element;var b=this._getRootElement(a),c=this._triggerCloseEvent(b);c.isDefaultPrevented()||this._removeElement(b)},b.prototype.dispose=function(){a.removeData(this._element,g),this._element=null},b.prototype._getRootElement=function(b){var c=f.getSelectorFromElement(b),d=!1;return c&&(d=a(c)[0]),d||(d=a(b).closest("."+n.ALERT)[0]),d},b.prototype._triggerCloseEvent=function(b){var c=a.Event(m.CLOSE);return a(b).trigger(c),c},b.prototype._removeElement=function(b){return a(b).removeClass(n.IN),f.supportsTransitionEnd()&&a(b).hasClass(n.FADE)?void a(b).one(f.TRANSITION_END,a.proxy(this._destroyElement,this,b)).emulateTransitionEnd(k):void this._destroyElement(b)},b.prototype._destroyElement=function(b){a(b).detach().trigger(m.CLOSED).remove()},b._jQueryInterface=function(c){return this.each(function(){var d=a(this),e=d.data(g);e||(e=new b(this),d.data(g,e)),"close"===c&&e[c](this)})},b._handleDismiss=function(a){return function(b){b&&b.preventDefault(),a.close(this)}},e(b,null,[{key:"VERSION",get:function(){return d}}]),b}();return a(document).on(m.CLICK_DATA_API,l.DISMISS,o._handleDismiss(new o)),a.fn[b]=o._jQueryInterface,a.fn[b].Constructor=o,a.fn[b].noConflict=function(){return a.fn[b]=j,o._jQueryInterface},o}(jQuery),function(a){var b="button",d="4.0.0-alpha.5",f="bs.button",g="."+f,h=".data-api",i=a.fn[b],j={ACTIVE:"active",BUTTON:"btn",FOCUS:"focus"},k={DATA_TOGGLE_CARROT:'[data-toggle^="button"]',DATA_TOGGLE:'[data-toggle="buttons"]',INPUT:"input",ACTIVE:".active",BUTTON:".btn"},l={CLICK_DATA_API:"click"+g+h,FOCUS_BLUR_DATA_API:"focus"+g+h+" "+("blur"+g+h)},m=function(){function b(a){c(this,b),this._element=a}return b.prototype.toggle=function(){var b=!0,c=a(this._element).closest(k.DATA_TOGGLE)[0];if(c){var d=a(this._element).find(k.INPUT)[0];if(d){if("radio"===d.type)if(d.checked&&a(this._element).hasClass(j.ACTIVE))b=!1;else{var e=a(c).find(k.ACTIVE)[0];e&&a(e).removeClass(j.ACTIVE)}b&&(d.checked=!a(this._element).hasClass(j.ACTIVE),a(this._element).trigger("change")),d.focus()}}else this._element.setAttribute("aria-pressed",!a(this._element).hasClass(j.ACTIVE));b&&a(this._element).toggleClass(j.ACTIVE)},b.prototype.dispose=function(){a.removeData(this._element,f),this._element=null},b._jQueryInterface=function(c){return this.each(function(){var d=a(this).data(f);d||(d=new b(this),a(this).data(f,d)),"toggle"===c&&d[c]()})},e(b,null,[{key:"VERSION",get:function(){return d}}]),b}();return a(document).on(l.CLICK_DATA_API,k.DATA_TOGGLE_CARROT,function(b){b.preventDefault();var c=b.target;a(c).hasClass(j.BUTTON)||(c=a(c).closest(k.BUTTON)),m._jQueryInterface.call(a(c),"toggle")}).on(l.FOCUS_BLUR_DATA_API,k.DATA_TOGGLE_CARROT,function(b){var c=a(b.target).closest(k.BUTTON)[0];a(c).toggleClass(j.FOCUS,/^focus(in)?$/.test(b.type))}),a.fn[b]=m._jQueryInterface,a.fn[b].Constructor=m,a.fn[b].noConflict=function(){return a.fn[b]=i,m._jQueryInterface},m}(jQuery),function(a){var b="carousel",g="4.0.0-alpha.5",h="bs.carousel",i="."+h,j=".data-api",k=a.fn[b],l=600,m=37,n=39,o={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0},p={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean"},q={NEXT:"next",PREVIOUS:"prev"},r={SLIDE:"slide"+i,SLID:"slid"+i,KEYDOWN:"keydown"+i,MOUSEENTER:"mouseenter"+i,MOUSELEAVE:"mouseleave"+i,LOAD_DATA_API:"load"+i+j,CLICK_DATA_API:"click"+i+j},s={CAROUSEL:"carousel",ACTIVE:"active",SLIDE:"slide",RIGHT:"right",LEFT:"left",ITEM:"carousel-item"},t={ACTIVE:".active",ACTIVE_ITEM:".active.carousel-item",ITEM:".carousel-item",NEXT_PREV:".next, .prev",INDICATORS:".carousel-indicators",DATA_SLIDE:"[data-slide], [data-slide-to]",DATA_RIDE:'[data-ride="carousel"]'},u=function(){function j(b,d){c(this,j),this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this._config=this._getConfig(d),this._element=a(b)[0],this._indicatorsElement=a(this._element).find(t.INDICATORS)[0],this._addEventListeners()}return j.prototype.next=function(){this._isSliding||this._slide(q.NEXT)},j.prototype.nextWhenVisible=function(){document.hidden||this.next()},j.prototype.prev=function(){this._isSliding||this._slide(q.PREVIOUS)},j.prototype.pause=function(b){b||(this._isPaused=!0),a(this._element).find(t.NEXT_PREV)[0]&&f.supportsTransitionEnd()&&(f.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},j.prototype.cycle=function(b){b||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval(a.proxy(document.visibilityState?this.nextWhenVisible:this.next,this),this._config.interval))},j.prototype.to=function(b){var c=this;this._activeElement=a(this._element).find(t.ACTIVE_ITEM)[0];var d=this._getItemIndex(this._activeElement);if(!(b>this._items.length-1||b<0)){if(this._isSliding)return void a(this._element).one(r.SLID,function(){return c.to(b)});if(d===b)return this.pause(),void this.cycle();var e=b>d?q.NEXT:q.PREVIOUS;this._slide(e,this._items[b])}},j.prototype.dispose=function(){a(this._element).off(i),a.removeData(this._element,h),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},j.prototype._getConfig=function(c){return c=a.extend({},o,c),f.typeCheckConfig(b,c,p),c},j.prototype._addEventListeners=function(){this._config.keyboard&&a(this._element).on(r.KEYDOWN,a.proxy(this._keydown,this)),"hover"!==this._config.pause||"ontouchstart"in document.documentElement||a(this._element).on(r.MOUSEENTER,a.proxy(this.pause,this)).on(r.MOUSELEAVE,a.proxy(this.cycle,this))},j.prototype._keydown=function(a){if(a.preventDefault(),!/input|textarea/i.test(a.target.tagName))switch(a.which){case m:this.prev();break;case n:this.next();break;default:return}},j.prototype._getItemIndex=function(b){return this._items=a.makeArray(a(b).parent().find(t.ITEM)),this._items.indexOf(b)},j.prototype._getItemByDirection=function(a,b){var c=a===q.NEXT,d=a===q.PREVIOUS,e=this._getItemIndex(b),f=this._items.length-1,g=d&&0===e||c&&e===f;if(g&&!this._config.wrap)return b;var h=a===q.PREVIOUS?-1:1,i=(e+h)%this._items.length;return i===-1?this._items[this._items.length-1]:this._items[i]},j.prototype._triggerSlideEvent=function(b,c){var d=a.Event(r.SLIDE,{relatedTarget:b,direction:c});return a(this._element).trigger(d),d},j.prototype._setActiveIndicatorElement=function(b){if(this._indicatorsElement){a(this._indicatorsElement).find(t.ACTIVE).removeClass(s.ACTIVE);var c=this._indicatorsElement.children[this._getItemIndex(b)];c&&a(c).addClass(s.ACTIVE)}},j.prototype._slide=function(b,c){var d=this,e=a(this._element).find(t.ACTIVE_ITEM)[0],g=c||e&&this._getItemByDirection(b,e),h=Boolean(this._interval),i=b===q.NEXT?s.LEFT:s.RIGHT;if(g&&a(g).hasClass(s.ACTIVE))return void(this._isSliding=!1);var j=this._triggerSlideEvent(g,i);if(!j.isDefaultPrevented()&&e&&g){this._isSliding=!0,h&&this.pause(),this._setActiveIndicatorElement(g);var k=a.Event(r.SLID,{relatedTarget:g,direction:i});f.supportsTransitionEnd()&&a(this._element).hasClass(s.SLIDE)?(a(g).addClass(b),f.reflow(g),a(e).addClass(i),a(g).addClass(i),a(e).one(f.TRANSITION_END,function(){a(g).removeClass(i).removeClass(b),a(g).addClass(s.ACTIVE),a(e).removeClass(s.ACTIVE).removeClass(b).removeClass(i),d._isSliding=!1,setTimeout(function(){return a(d._element).trigger(k)},0)}).emulateTransitionEnd(l)):(a(e).removeClass(s.ACTIVE),a(g).addClass(s.ACTIVE),this._isSliding=!1,a(this._element).trigger(k)),h&&this.cycle()}},j._jQueryInterface=function(b){return this.each(function(){var c=a(this).data(h),e=a.extend({},o,a(this).data());"object"===("undefined"==typeof b?"undefined":d(b))&&a.extend(e,b);var f="string"==typeof b?b:e.slide;if(c||(c=new j(this,e),a(this).data(h,c)),"number"==typeof b)c.to(b);else if("string"==typeof f){if(void 0===c[f])throw new Error('No method named "'+f+'"');c[f]()}else e.interval&&(c.pause(),c.cycle())})},j._dataApiClickHandler=function(b){var c=f.getSelectorFromElement(this);if(c){var d=a(c)[0];if(d&&a(d).hasClass(s.CAROUSEL)){var e=a.extend({},a(d).data(),a(this).data()),g=this.getAttribute("data-slide-to");g&&(e.interval=!1),j._jQueryInterface.call(a(d),e),g&&a(d).data(h).to(g),b.preventDefault()}}},e(j,null,[{key:"VERSION",get:function(){return g}},{key:"Default",get:function(){return o}}]),j}();return a(document).on(r.CLICK_DATA_API,t.DATA_SLIDE,u._dataApiClickHandler),a(window).on(r.LOAD_DATA_API,function(){a(t.DATA_RIDE).each(function(){var b=a(this);u._jQueryInterface.call(b,b.data())})}),a.fn[b]=u._jQueryInterface,a.fn[b].Constructor=u,a.fn[b].noConflict=function(){return a.fn[b]=k,u._jQueryInterface},u}(jQuery),function(a){var b="collapse",g="4.0.0-alpha.5",h="bs.collapse",i="."+h,j=".data-api",k=a.fn[b],l=600,m={toggle:!0,parent:""},n={toggle:"boolean",parent:"string"},o={SHOW:"show"+i,SHOWN:"shown"+i,HIDE:"hide"+i,HIDDEN:"hidden"+i,CLICK_DATA_API:"click"+i+j},p={IN:"in",COLLAPSE:"collapse",COLLAPSING:"collapsing",COLLAPSED:"collapsed"},q={WIDTH:"width",HEIGHT:"height"},r={ACTIVES:".card > .in, .card > .collapsing",DATA_TOGGLE:'[data-toggle="collapse"]'},s=function(){function i(b,d){c(this,i),this._isTransitioning=!1,this._element=b,this._config=this._getConfig(d),this._triggerArray=a.makeArray(a('[data-toggle="collapse"][href="#'+b.id+'"],'+('[data-toggle="collapse"][data-target="#'+b.id+'"]'))),this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}return i.prototype.toggle=function(){a(this._element).hasClass(p.IN)?this.hide():this.show()},i.prototype.show=function(){var b=this;if(!this._isTransitioning&&!a(this._element).hasClass(p.IN)){var c=void 0,d=void 0;if(this._parent&&(c=a.makeArray(a(r.ACTIVES)),c.length||(c=null)),!(c&&(d=a(c).data(h),d&&d._isTransitioning))){var e=a.Event(o.SHOW);if(a(this._element).trigger(e),!e.isDefaultPrevented()){c&&(i._jQueryInterface.call(a(c),"hide"),d||a(c).data(h,null));var g=this._getDimension();a(this._element).removeClass(p.COLLAPSE).addClass(p.COLLAPSING),this._element.style[g]=0,this._element.setAttribute("aria-expanded",!0),this._triggerArray.length&&a(this._triggerArray).removeClass(p.COLLAPSED).attr("aria-expanded",!0),this.setTransitioning(!0);var j=function(){a(b._element).removeClass(p.COLLAPSING).addClass(p.COLLAPSE).addClass(p.IN),b._element.style[g]="",b.setTransitioning(!1),a(b._element).trigger(o.SHOWN)};if(!f.supportsTransitionEnd())return void j();var k=g[0].toUpperCase()+g.slice(1),m="scroll"+k;a(this._element).one(f.TRANSITION_END,j).emulateTransitionEnd(l),this._element.style[g]=this._element[m]+"px"}}}},i.prototype.hide=function(){var b=this;if(!this._isTransitioning&&a(this._element).hasClass(p.IN)){var c=a.Event(o.HIDE);if(a(this._element).trigger(c),!c.isDefaultPrevented()){var d=this._getDimension(),e=d===q.WIDTH?"offsetWidth":"offsetHeight";this._element.style[d]=this._element[e]+"px",f.reflow(this._element),a(this._element).addClass(p.COLLAPSING).removeClass(p.COLLAPSE).removeClass(p.IN),this._element.setAttribute("aria-expanded",!1),this._triggerArray.length&&a(this._triggerArray).addClass(p.COLLAPSED).attr("aria-expanded",!1),this.setTransitioning(!0);var g=function(){b.setTransitioning(!1),a(b._element).removeClass(p.COLLAPSING).addClass(p.COLLAPSE).trigger(o.HIDDEN)};return this._element.style[d]="",f.supportsTransitionEnd()?void a(this._element).one(f.TRANSITION_END,g).emulateTransitionEnd(l):void g()}}},i.prototype.setTransitioning=function(a){this._isTransitioning=a},i.prototype.dispose=function(){a.removeData(this._element,h),this._config=null,this._parent=null,this._element=null,this._triggerArray=null,this._isTransitioning=null},i.prototype._getConfig=function(c){return c=a.extend({},m,c),c.toggle=Boolean(c.toggle),f.typeCheckConfig(b,c,n),c},i.prototype._getDimension=function(){var b=a(this._element).hasClass(q.WIDTH);return b?q.WIDTH:q.HEIGHT},i.prototype._getParent=function(){var b=this,c=a(this._config.parent)[0],d='[data-toggle="collapse"][data-parent="'+this._config.parent+'"]';return a(c).find(d).each(function(a,c){b._addAriaAndCollapsedClass(i._getTargetFromElement(c),[c])}),c},i.prototype._addAriaAndCollapsedClass=function(b,c){if(b){var d=a(b).hasClass(p.IN);b.setAttribute("aria-expanded",d),c.length&&a(c).toggleClass(p.COLLAPSED,!d).attr("aria-expanded",d)}},i._getTargetFromElement=function(b){var c=f.getSelectorFromElement(b);return c?a(c)[0]:null},i._jQueryInterface=function(b){return this.each(function(){var c=a(this),e=c.data(h),f=a.extend({},m,c.data(),"object"===("undefined"==typeof b?"undefined":d(b))&&b);if(!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||(e=new i(this,f),c.data(h,e)),"string"==typeof b){if(void 0===e[b])throw new Error('No method named "'+b+'"');e[b]()}})},e(i,null,[{key:"VERSION",get:function(){return g}},{key:"Default",get:function(){return m}}]),i}();return a(document).on(o.CLICK_DATA_API,r.DATA_TOGGLE,function(b){b.preventDefault();var c=s._getTargetFromElement(this),d=a(c).data(h),e=d?"toggle":a(this).data();s._jQueryInterface.call(a(c),e)}),a.fn[b]=s._jQueryInterface,a.fn[b].Constructor=s,a.fn[b].noConflict=function(){return a.fn[b]=k,s._jQueryInterface},s}(jQuery),function(a){var b="dropdown",d="4.0.0-alpha.5",g="bs.dropdown",h="."+g,i=".data-api",j=a.fn[b],k=27,l=38,m=40,n=3,o={HIDE:"hide"+h,HIDDEN:"hidden"+h,SHOW:"show"+h,SHOWN:"shown"+h,CLICK:"click"+h,CLICK_DATA_API:"click"+h+i,KEYDOWN_DATA_API:"keydown"+h+i},p={BACKDROP:"dropdown-backdrop",DISABLED:"disabled",OPEN:"open"},q={BACKDROP:".dropdown-backdrop",DATA_TOGGLE:'[data-toggle="dropdown"]',FORM_CHILD:".dropdown form",ROLE_MENU:'[role="menu"]',ROLE_LISTBOX:'[role="listbox"]',NAVBAR_NAV:".navbar-nav",VISIBLE_ITEMS:'[role="menu"] li:not(.disabled) a, [role="listbox"] li:not(.disabled) a'},r=function(){function b(a){c(this,b),this._element=a,this._addEventListeners()}return b.prototype.toggle=function(){if(this.disabled||a(this).hasClass(p.DISABLED))return!1;var c=b._getParentFromElement(this),d=a(c).hasClass(p.OPEN);if(b._clearMenus(),d)return!1;if("ontouchstart"in document.documentElement&&!a(c).closest(q.NAVBAR_NAV).length){var e=document.createElement("div");e.className=p.BACKDROP,a(e).insertBefore(this),a(e).on("click",b._clearMenus)}var f={relatedTarget:this},g=a.Event(o.SHOW,f);return a(c).trigger(g),!g.isDefaultPrevented()&&(this.focus(),this.setAttribute("aria-expanded","true"),a(c).toggleClass(p.OPEN),a(c).trigger(a.Event(o.SHOWN,f)),!1)},b.prototype.dispose=function(){a.removeData(this._element,g),a(this._element).off(h),this._element=null},b.prototype._addEventListeners=function(){a(this._element).on(o.CLICK,this.toggle)},b._jQueryInterface=function(c){return this.each(function(){var d=a(this).data(g);if(d||a(this).data(g,d=new b(this)),"string"==typeof c){if(void 0===d[c])throw new Error('No method named "'+c+'"');d[c].call(this)}})},b._clearMenus=function(c){if(!c||c.which!==n){var d=a(q.BACKDROP)[0];d&&d.parentNode.removeChild(d);for(var e=a.makeArray(a(q.DATA_TOGGLE)),f=0;f<e.length;f++){var g=b._getParentFromElement(e[f]),h={relatedTarget:e[f]};if(a(g).hasClass(p.OPEN)&&!(c&&"click"===c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(g,c.target))){var i=a.Event(o.HIDE,h);a(g).trigger(i),i.isDefaultPrevented()||(e[f].setAttribute("aria-expanded","false"),a(g).removeClass(p.OPEN).trigger(a.Event(o.HIDDEN,h)))}}}},b._getParentFromElement=function(b){var c=void 0,d=f.getSelectorFromElement(b);return d&&(c=a(d)[0]),c||b.parentNode},b._dataApiKeydownHandler=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)&&(c.preventDefault(),c.stopPropagation(),!this.disabled&&!a(this).hasClass(p.DISABLED))){var d=b._getParentFromElement(this),e=a(d).hasClass(p.OPEN);if(!e&&c.which!==k||e&&c.which===k){if(c.which===k){var f=a(d).find(q.DATA_TOGGLE)[0];a(f).trigger("focus")}return void a(this).trigger("click")}var g=a.makeArray(a(q.VISIBLE_ITEMS));if(g=g.filter(function(a){return a.offsetWidth||a.offsetHeight}),g.length){var h=g.indexOf(c.target);c.which===l&&h>0&&h--,c.which===m&&h<g.length-1&&h++,h<0&&(h=0),g[h].focus()}}},e(b,null,[{key:"VERSION",get:function(){return d}}]),b}();return a(document).on(o.KEYDOWN_DATA_API,q.DATA_TOGGLE,r._dataApiKeydownHandler).on(o.KEYDOWN_DATA_API,q.ROLE_MENU,r._dataApiKeydownHandler).on(o.KEYDOWN_DATA_API,q.ROLE_LISTBOX,r._dataApiKeydownHandler).on(o.CLICK_DATA_API,r._clearMenus).on(o.CLICK_DATA_API,q.DATA_TOGGLE,r.prototype.toggle).on(o.CLICK_DATA_API,q.FORM_CHILD,function(a){a.stopPropagation()}),a.fn[b]=r._jQueryInterface,a.fn[b].Constructor=r,a.fn[b].noConflict=function(){return a.fn[b]=j,r._jQueryInterface},r}(jQuery),function(a){var b="modal",g="4.0.0-alpha.5",h="bs.modal",i="."+h,j=".data-api",k=a.fn[b],l=300,m=150,n=27,o={backdrop:!0,keyboard:!0,focus:!0,show:!0},p={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean",show:"boolean"},q={HIDE:"hide"+i,HIDDEN:"hidden"+i,SHOW:"show"+i,SHOWN:"shown"+i,FOCUSIN:"focusin"+i,RESIZE:"resize"+i,CLICK_DISMISS:"click.dismiss"+i,KEYDOWN_DISMISS:"keydown.dismiss"+i,MOUSEUP_DISMISS:"mouseup.dismiss"+i,MOUSEDOWN_DISMISS:"mousedown.dismiss"+i,CLICK_DATA_API:"click"+i+j},r={SCROLLBAR_MEASURER:"modal-scrollbar-measure",BACKDROP:"modal-backdrop",OPEN:"modal-open",FADE:"fade",IN:"in"},s={DIALOG:".modal-dialog",DATA_TOGGLE:'[data-toggle="modal"]',DATA_DISMISS:'[data-dismiss="modal"]',FIXED_CONTENT:".navbar-fixed-top, .navbar-fixed-bottom, .is-fixed"},t=function(){function j(b,d){c(this,j),this._config=this._getConfig(d),this._element=b,this._dialog=a(b).find(s.DIALOG)[0],this._backdrop=null,this._isShown=!1,this._isBodyOverflowing=!1,this._ignoreBackdropClick=!1,this._originalBodyPadding=0,this._scrollbarWidth=0}return j.prototype.toggle=function(a){return this._isShown?this.hide():this.show(a)},j.prototype.show=function(b){var c=this,d=a.Event(q.SHOW,{relatedTarget:b});a(this._element).trigger(d),this._isShown||d.isDefaultPrevented()||(this._isShown=!0,this._checkScrollbar(),this._setScrollbar(),a(document.body).addClass(r.OPEN),this._setEscapeEvent(),this._setResizeEvent(),a(this._element).on(q.CLICK_DISMISS,s.DATA_DISMISS,a.proxy(this.hide,this)),a(this._dialog).on(q.MOUSEDOWN_DISMISS,function(){a(c._element).one(q.MOUSEUP_DISMISS,function(b){a(b.target).is(c._element)&&(c._ignoreBackdropClick=!0)})}),this._showBackdrop(a.proxy(this._showElement,this,b)))},j.prototype.hide=function(b){b&&b.preventDefault();var c=a.Event(q.HIDE);a(this._element).trigger(c),this._isShown&&!c.isDefaultPrevented()&&(this._isShown=!1,this._setEscapeEvent(),this._setResizeEvent(),a(document).off(q.FOCUSIN),a(this._element).removeClass(r.IN),a(this._element).off(q.CLICK_DISMISS),a(this._dialog).off(q.MOUSEDOWN_DISMISS),f.supportsTransitionEnd()&&a(this._element).hasClass(r.FADE)?a(this._element).one(f.TRANSITION_END,a.proxy(this._hideModal,this)).emulateTransitionEnd(l):this._hideModal())},j.prototype.dispose=function(){a.removeData(this._element,h),a(window).off(i),a(document).off(i),a(this._element).off(i),a(this._backdrop).off(i),this._config=null,this._element=null,this._dialog=null,this._backdrop=null,this._isShown=null,this._isBodyOverflowing=null,this._ignoreBackdropClick=null,this._originalBodyPadding=null,this._scrollbarWidth=null},j.prototype._getConfig=function(c){return c=a.extend({},o,c),f.typeCheckConfig(b,c,p),c},j.prototype._showElement=function(b){var c=this,d=f.supportsTransitionEnd()&&a(this._element).hasClass(r.FADE);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.scrollTop=0,d&&f.reflow(this._element),a(this._element).addClass(r.IN),this._config.focus&&this._enforceFocus();var e=a.Event(q.SHOWN,{relatedTarget:b}),g=function(){c._config.focus&&c._element.focus(),a(c._element).trigger(e)};d?a(this._dialog).one(f.TRANSITION_END,g).emulateTransitionEnd(l):g()},j.prototype._enforceFocus=function(){var b=this;a(document).off(q.FOCUSIN).on(q.FOCUSIN,function(c){document===c.target||b._element===c.target||a(b._element).has(c.target).length||b._element.focus()})},j.prototype._setEscapeEvent=function(){var b=this;this._isShown&&this._config.keyboard?a(this._element).on(q.KEYDOWN_DISMISS,function(a){a.which===n&&b.hide()}):this._isShown||a(this._element).off(q.KEYDOWN_DISMISS)},j.prototype._setResizeEvent=function(){this._isShown?a(window).on(q.RESIZE,a.proxy(this._handleUpdate,this)):a(window).off(q.RESIZE)},j.prototype._hideModal=function(){var b=this;this._element.style.display="none",this._element.setAttribute("aria-hidden","true"),this._showBackdrop(function(){a(document.body).removeClass(r.OPEN),b._resetAdjustments(),b._resetScrollbar(),a(b._element).trigger(q.HIDDEN)})},j.prototype._removeBackdrop=function(){this._backdrop&&(a(this._backdrop).remove(),this._backdrop=null)},j.prototype._showBackdrop=function(b){var c=this,d=a(this._element).hasClass(r.FADE)?r.FADE:"";if(this._isShown&&this._config.backdrop){var e=f.supportsTransitionEnd()&&d;if(this._backdrop=document.createElement("div"),this._backdrop.className=r.BACKDROP,d&&a(this._backdrop).addClass(d),a(this._backdrop).appendTo(document.body),a(this._element).on(q.CLICK_DISMISS,function(a){return c._ignoreBackdropClick?void(c._ignoreBackdropClick=!1):void(a.target===a.currentTarget&&("static"===c._config.backdrop?c._element.focus():c.hide()))}),e&&f.reflow(this._backdrop),a(this._backdrop).addClass(r.IN),!b)return;if(!e)return void b();a(this._backdrop).one(f.TRANSITION_END,b).emulateTransitionEnd(m)}else if(!this._isShown&&this._backdrop){a(this._backdrop).removeClass(r.IN);var g=function(){c._removeBackdrop(),b&&b()};f.supportsTransitionEnd()&&a(this._element).hasClass(r.FADE)?a(this._backdrop).one(f.TRANSITION_END,g).emulateTransitionEnd(m):g()}else b&&b()},j.prototype._handleUpdate=function(){this._adjustDialog()},j.prototype._adjustDialog=function(){var a=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&a&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!a&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},j.prototype._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},j.prototype._checkScrollbar=function(){this._isBodyOverflowing=document.body.clientWidth<window.innerWidth,this._scrollbarWidth=this._getScrollbarWidth()},j.prototype._setScrollbar=function(){var b=parseInt(a(s.FIXED_CONTENT).css("padding-right")||0,10);this._originalBodyPadding=document.body.style.paddingRight||"",this._isBodyOverflowing&&(document.body.style.paddingRight=b+this._scrollbarWidth+"px")},j.prototype._resetScrollbar=function(){document.body.style.paddingRight=this._originalBodyPadding},j.prototype._getScrollbarWidth=function(){var a=document.createElement("div");a.className=r.SCROLLBAR_MEASURER,document.body.appendChild(a);var b=a.offsetWidth-a.clientWidth;return document.body.removeChild(a),b},j._jQueryInterface=function(b,c){return this.each(function(){var e=a(this).data(h),f=a.extend({},j.Default,a(this).data(),"object"===("undefined"==typeof b?"undefined":d(b))&&b);if(e||(e=new j(this,f),a(this).data(h,e)),"string"==typeof b){if(void 0===e[b])throw new Error('No method named "'+b+'"');e[b](c)}else f.show&&e.show(c)})},e(j,null,[{key:"VERSION",get:function(){return g}},{key:"Default",get:function(){return o}}]),j}();return a(document).on(q.CLICK_DATA_API,s.DATA_TOGGLE,function(b){var c=this,d=void 0,e=f.getSelectorFromElement(this);e&&(d=a(e)[0]);var g=a(d).data(h)?"toggle":a.extend({},a(d).data(),a(this).data());"A"===this.tagName&&b.preventDefault();var i=a(d).one(q.SHOW,function(b){b.isDefaultPrevented()||i.one(q.HIDDEN,function(){a(c).is(":visible")&&c.focus()})});t._jQueryInterface.call(a(d),g,this)}),a.fn[b]=t._jQueryInterface,a.fn[b].Constructor=t,a.fn[b].noConflict=function(){return a.fn[b]=k,t._jQueryInterface},t}(jQuery),function(a){var b="scrollspy",g="4.0.0-alpha.5",h="bs.scrollspy",i="."+h,j=".data-api",k=a.fn[b],l={offset:10,method:"auto",target:""},m={offset:"number",method:"string",target:"(string|element)"},n={ACTIVATE:"activate"+i,SCROLL:"scroll"+i,LOAD_DATA_API:"load"+i+j},o={DROPDOWN_ITEM:"dropdown-item",DROPDOWN_MENU:"dropdown-menu",NAV_LINK:"nav-link",NAV:"nav",ACTIVE:"active"},p={DATA_SPY:'[data-spy="scroll"]',ACTIVE:".active",LIST_ITEM:".list-item",LI:"li",LI_DROPDOWN:"li.dropdown",NAV_LINKS:".nav-link",DROPDOWN:".dropdown",DROPDOWN_ITEMS:".dropdown-item",DROPDOWN_TOGGLE:".dropdown-toggle"},q={OFFSET:"offset",POSITION:"position"},r=function(){function j(b,d){c(this,j),this._element=b,this._scrollElement="BODY"===b.tagName?window:b,this._config=this._getConfig(d),this._selector=this._config.target+" "+p.NAV_LINKS+","+(this._config.target+" "+p.DROPDOWN_ITEMS),this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,a(this._scrollElement).on(n.SCROLL,a.proxy(this._process,this)),this.refresh(),this._process()}return j.prototype.refresh=function(){var b=this,c=this._scrollElement!==this._scrollElement.window?q.POSITION:q.OFFSET,d="auto"===this._config.method?c:this._config.method,e=d===q.POSITION?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight();var g=a.makeArray(a(this._selector));g.map(function(b){var c=void 0,g=f.getSelectorFromElement(b);return g&&(c=a(g)[0]),c&&(c.offsetWidth||c.offsetHeight)?[a(c)[d]().top+e,g]:null}).filter(function(a){return a}).sort(function(a,b){return a[0]-b[0]}).forEach(function(a){b._offsets.push(a[0]),b._targets.push(a[1])})},j.prototype.dispose=function(){a.removeData(this._element,h),a(this._scrollElement).off(i),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},j.prototype._getConfig=function(c){if(c=a.extend({},l,c),"string"!=typeof c.target){var d=a(c.target).attr("id");d||(d=f.getUID(b),a(c.target).attr("id",d)),c.target="#"+d}return f.typeCheckConfig(b,c,m),c},j.prototype._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.scrollY:this._scrollElement.scrollTop},j.prototype._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},j.prototype._process=function(){var a=this._getScrollTop()+this._config.offset,b=this._getScrollHeight(),c=this._config.offset+b-this._scrollElement.offsetHeight;if(this._scrollHeight!==b&&this.refresh(),a>=c){var d=this._targets[this._targets.length-1];this._activeTarget!==d&&this._activate(d)}if(this._activeTarget&&a<this._offsets[0])return this._activeTarget=null,void this._clear();for(var e=this._offsets.length;e--;){var f=this._activeTarget!==this._targets[e]&&a>=this._offsets[e]&&(void 0===this._offsets[e+1]||a<this._offsets[e+1]);f&&this._activate(this._targets[e])}},j.prototype._activate=function(b){this._activeTarget=b,this._clear();var c=this._selector.split(",");c=c.map(function(a){return a+'[data-target="'+b+'"],'+(a+'[href="'+b+'"]')});var d=a(c.join(","));d.hasClass(o.DROPDOWN_ITEM)?(d.closest(p.DROPDOWN).find(p.DROPDOWN_TOGGLE).addClass(o.ACTIVE),d.addClass(o.ACTIVE)):d.parents(p.LI).find(p.NAV_LINKS).addClass(o.ACTIVE),a(this._scrollElement).trigger(n.ACTIVATE,{relatedTarget:b})},j.prototype._clear=function(){a(this._selector).filter(p.ACTIVE).removeClass(o.ACTIVE)},j._jQueryInterface=function(b){return this.each(function(){var c=a(this).data(h),e="object"===("undefined"==typeof b?"undefined":d(b))&&b||null;if(c||(c=new j(this,e),a(this).data(h,c)),"string"==typeof b){if(void 0===c[b])throw new Error('No method named "'+b+'"');c[b]()}})},e(j,null,[{key:"VERSION",get:function(){return g}},{key:"Default",get:function(){return l}}]),j}();return a(window).on(n.LOAD_DATA_API,function(){for(var b=a.makeArray(a(p.DATA_SPY)),c=b.length;c--;){var d=a(b[c]);r._jQueryInterface.call(d,d.data())}}),a.fn[b]=r._jQueryInterface,a.fn[b].Constructor=r,a.fn[b].noConflict=function(){return a.fn[b]=k,r._jQueryInterface},r}(jQuery),function(a){var b="tab",d="4.0.0-alpha.5",g="bs.tab",h="."+g,i=".data-api",j=a.fn[b],k=150,l={HIDE:"hide"+h,HIDDEN:"hidden"+h,SHOW:"show"+h,SHOWN:"shown"+h,CLICK_DATA_API:"click"+h+i},m={DROPDOWN_MENU:"dropdown-menu",ACTIVE:"active",FADE:"fade",IN:"in"},n={A:"a",LI:"li",DROPDOWN:".dropdown",UL:"ul:not(.dropdown-menu)",FADE_CHILD:"> .nav-item .fade, > .fade",ACTIVE:".active",ACTIVE_CHILD:"> .nav-item > .active, > .active",DATA_TOGGLE:'[data-toggle="tab"], [data-toggle="pill"]',
-DROPDOWN_TOGGLE:".dropdown-toggle",DROPDOWN_ACTIVE_CHILD:"> .dropdown-menu .active"},o=function(){function b(a){c(this,b),this._element=a}return b.prototype.show=function(){var b=this;if(!this._element.parentNode||this._element.parentNode.nodeType!==Node.ELEMENT_NODE||!a(this._element).hasClass(m.ACTIVE)){var c=void 0,d=void 0,e=a(this._element).closest(n.UL)[0],g=f.getSelectorFromElement(this._element);e&&(d=a.makeArray(a(e).find(n.ACTIVE)),d=d[d.length-1]);var h=a.Event(l.HIDE,{relatedTarget:this._element}),i=a.Event(l.SHOW,{relatedTarget:d});if(d&&a(d).trigger(h),a(this._element).trigger(i),!i.isDefaultPrevented()&&!h.isDefaultPrevented()){g&&(c=a(g)[0]),this._activate(this._element,e);var j=function(){var c=a.Event(l.HIDDEN,{relatedTarget:b._element}),e=a.Event(l.SHOWN,{relatedTarget:d});a(d).trigger(c),a(b._element).trigger(e)};c?this._activate(c,c.parentNode,j):j()}}},b.prototype.dispose=function(){a.removeClass(this._element,g),this._element=null},b.prototype._activate=function(b,c,d){var e=a(c).find(n.ACTIVE_CHILD)[0],g=d&&f.supportsTransitionEnd()&&(e&&a(e).hasClass(m.FADE)||Boolean(a(c).find(n.FADE_CHILD)[0])),h=a.proxy(this._transitionComplete,this,b,e,g,d);e&&g?a(e).one(f.TRANSITION_END,h).emulateTransitionEnd(k):h(),e&&a(e).removeClass(m.IN)},b.prototype._transitionComplete=function(b,c,d,e){if(c){a(c).removeClass(m.ACTIVE);var g=a(c).find(n.DROPDOWN_ACTIVE_CHILD)[0];g&&a(g).removeClass(m.ACTIVE),c.setAttribute("aria-expanded",!1)}if(a(b).addClass(m.ACTIVE),b.setAttribute("aria-expanded",!0),d?(f.reflow(b),a(b).addClass(m.IN)):a(b).removeClass(m.FADE),b.parentNode&&a(b.parentNode).hasClass(m.DROPDOWN_MENU)){var h=a(b).closest(n.DROPDOWN)[0];h&&a(h).find(n.DROPDOWN_TOGGLE).addClass(m.ACTIVE),b.setAttribute("aria-expanded",!0)}e&&e()},b._jQueryInterface=function(c){return this.each(function(){var d=a(this),e=d.data(g);if(e||(e=e=new b(this),d.data(g,e)),"string"==typeof c){if(void 0===e[c])throw new Error('No method named "'+c+'"');e[c]()}})},e(b,null,[{key:"VERSION",get:function(){return d}}]),b}();return a(document).on(l.CLICK_DATA_API,n.DATA_TOGGLE,function(b){b.preventDefault(),o._jQueryInterface.call(a(this),"show")}),a.fn[b]=o._jQueryInterface,a.fn[b].Constructor=o,a.fn[b].noConflict=function(){return a.fn[b]=j,o._jQueryInterface},o}(jQuery),function(a){if(void 0===window.Tether)throw new Error("Bootstrap tooltips require Tether (http://tether.io/)");var b="tooltip",g="4.0.0-alpha.5",h="bs.tooltip",i="."+h,j=a.fn[b],k=150,l="bs-tether",m={animation:!0,template:'<div class="tooltip" role="tooltip"><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:"0 0",constraints:[]},n={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"string",constraints:"array"},o={TOP:"bottom center",RIGHT:"middle left",BOTTOM:"top center",LEFT:"middle right"},p={IN:"in",OUT:"out"},q={HIDE:"hide"+i,HIDDEN:"hidden"+i,SHOW:"show"+i,SHOWN:"shown"+i,INSERTED:"inserted"+i,CLICK:"click"+i,FOCUSIN:"focusin"+i,FOCUSOUT:"focusout"+i,MOUSEENTER:"mouseenter"+i,MOUSELEAVE:"mouseleave"+i},r={FADE:"fade",IN:"in"},s={TOOLTIP:".tooltip",TOOLTIP_INNER:".tooltip-inner"},t={element:!1,enabled:!1},u={HOVER:"hover",FOCUS:"focus",CLICK:"click",MANUAL:"manual"},v=function(){function j(a,b){c(this,j),this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._tether=null,this.element=a,this.config=this._getConfig(b),this.tip=null,this._setListeners()}return j.prototype.enable=function(){this._isEnabled=!0},j.prototype.disable=function(){this._isEnabled=!1},j.prototype.toggleEnabled=function(){this._isEnabled=!this._isEnabled},j.prototype.toggle=function(b){if(b){var c=this.constructor.DATA_KEY,d=a(b.currentTarget).data(c);d||(d=new this.constructor(b.currentTarget,this._getDelegateConfig()),a(b.currentTarget).data(c,d)),d._activeTrigger.click=!d._activeTrigger.click,d._isWithActiveTrigger()?d._enter(null,d):d._leave(null,d)}else{if(a(this.getTipElement()).hasClass(r.IN))return void this._leave(null,this);this._enter(null,this)}},j.prototype.dispose=function(){clearTimeout(this._timeout),this.cleanupTether(),a.removeData(this.element,this.constructor.DATA_KEY),a(this.element).off(this.constructor.EVENT_KEY),this.tip&&a(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._tether=null,this.element=null,this.config=null,this.tip=null},j.prototype.show=function(){var b=this,c=a.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){a(this.element).trigger(c);var d=a.contains(this.element.ownerDocument.documentElement,this.element);if(c.isDefaultPrevented()||!d)return;var e=this.getTipElement(),g=f.getUID(this.constructor.NAME);e.setAttribute("id",g),this.element.setAttribute("aria-describedby",g),this.setContent(),this.config.animation&&a(e).addClass(r.FADE);var h="function"==typeof this.config.placement?this.config.placement.call(this,e,this.element):this.config.placement,i=this._getAttachment(h);a(e).data(this.constructor.DATA_KEY,this).appendTo(document.body),a(this.element).trigger(this.constructor.Event.INSERTED),this._tether=new Tether({attachment:i,element:e,target:this.element,classes:t,classPrefix:l,offset:this.config.offset,constraints:this.config.constraints,addTargetClasses:!1}),f.reflow(e),this._tether.position(),a(e).addClass(r.IN);var k=function(){var c=b._hoverState;b._hoverState=null,a(b.element).trigger(b.constructor.Event.SHOWN),c===p.OUT&&b._leave(null,b)};if(f.supportsTransitionEnd()&&a(this.tip).hasClass(r.FADE))return void a(this.tip).one(f.TRANSITION_END,k).emulateTransitionEnd(j._TRANSITION_DURATION);k()}},j.prototype.hide=function(b){var c=this,d=this.getTipElement(),e=a.Event(this.constructor.Event.HIDE),g=function(){c._hoverState!==p.IN&&d.parentNode&&d.parentNode.removeChild(d),c.element.removeAttribute("aria-describedby"),a(c.element).trigger(c.constructor.Event.HIDDEN),c.cleanupTether(),b&&b()};a(this.element).trigger(e),e.isDefaultPrevented()||(a(d).removeClass(r.IN),f.supportsTransitionEnd()&&a(this.tip).hasClass(r.FADE)?a(d).one(f.TRANSITION_END,g).emulateTransitionEnd(k):g(),this._hoverState="")},j.prototype.isWithContent=function(){return Boolean(this.getTitle())},j.prototype.getTipElement=function(){return this.tip=this.tip||a(this.config.template)[0]},j.prototype.setContent=function(){var b=a(this.getTipElement());this.setElementContent(b.find(s.TOOLTIP_INNER),this.getTitle()),b.removeClass(r.FADE).removeClass(r.IN),this.cleanupTether()},j.prototype.setElementContent=function(b,c){var e=this.config.html;"object"===("undefined"==typeof c?"undefined":d(c))&&(c.nodeType||c.jquery)?e?a(c).parent().is(b)||b.empty().append(c):b.text(a(c).text()):b[e?"html":"text"](c)},j.prototype.getTitle=function(){var a=this.element.getAttribute("data-original-title");return a||(a="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),a},j.prototype.cleanupTether=function(){this._tether&&this._tether.destroy()},j.prototype._getAttachment=function(a){return o[a.toUpperCase()]},j.prototype._setListeners=function(){var b=this,c=this.config.trigger.split(" ");c.forEach(function(c){if("click"===c)a(b.element).on(b.constructor.Event.CLICK,b.config.selector,a.proxy(b.toggle,b));else if(c!==u.MANUAL){var d=c===u.HOVER?b.constructor.Event.MOUSEENTER:b.constructor.Event.FOCUSIN,e=c===u.HOVER?b.constructor.Event.MOUSELEAVE:b.constructor.Event.FOCUSOUT;a(b.element).on(d,b.config.selector,a.proxy(b._enter,b)).on(e,b.config.selector,a.proxy(b._leave,b))}}),this.config.selector?this.config=a.extend({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},j.prototype._fixTitle=function(){var a=d(this.element.getAttribute("data-original-title"));(this.element.getAttribute("title")||"string"!==a)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},j.prototype._enter=function(b,c){var d=this.constructor.DATA_KEY;return c=c||a(b.currentTarget).data(d),c||(c=new this.constructor(b.currentTarget,this._getDelegateConfig()),a(b.currentTarget).data(d,c)),b&&(c._activeTrigger["focusin"===b.type?u.FOCUS:u.HOVER]=!0),a(c.getTipElement()).hasClass(r.IN)||c._hoverState===p.IN?void(c._hoverState=p.IN):(clearTimeout(c._timeout),c._hoverState=p.IN,c.config.delay&&c.config.delay.show?void(c._timeout=setTimeout(function(){c._hoverState===p.IN&&c.show()},c.config.delay.show)):void c.show())},j.prototype._leave=function(b,c){var d=this.constructor.DATA_KEY;if(c=c||a(b.currentTarget).data(d),c||(c=new this.constructor(b.currentTarget,this._getDelegateConfig()),a(b.currentTarget).data(d,c)),b&&(c._activeTrigger["focusout"===b.type?u.FOCUS:u.HOVER]=!1),!c._isWithActiveTrigger())return clearTimeout(c._timeout),c._hoverState=p.OUT,c.config.delay&&c.config.delay.hide?void(c._timeout=setTimeout(function(){c._hoverState===p.OUT&&c.hide()},c.config.delay.hide)):void c.hide()},j.prototype._isWithActiveTrigger=function(){for(var a in this._activeTrigger)if(this._activeTrigger[a])return!0;return!1},j.prototype._getConfig=function(c){return c=a.extend({},this.constructor.Default,a(this.element).data(),c),c.delay&&"number"==typeof c.delay&&(c.delay={show:c.delay,hide:c.delay}),f.typeCheckConfig(b,c,this.constructor.DefaultType),c},j.prototype._getDelegateConfig=function(){var a={};if(this.config)for(var b in this.config)this.constructor.Default[b]!==this.config[b]&&(a[b]=this.config[b]);return a},j._jQueryInterface=function(b){return this.each(function(){var c=a(this).data(h),e="object"===("undefined"==typeof b?"undefined":d(b))?b:null;if((c||!/dispose|hide/.test(b))&&(c||(c=new j(this,e),a(this).data(h,c)),"string"==typeof b)){if(void 0===c[b])throw new Error('No method named "'+b+'"');c[b]()}})},e(j,null,[{key:"VERSION",get:function(){return g}},{key:"Default",get:function(){return m}},{key:"NAME",get:function(){return b}},{key:"DATA_KEY",get:function(){return h}},{key:"Event",get:function(){return q}},{key:"EVENT_KEY",get:function(){return i}},{key:"DefaultType",get:function(){return n}}]),j}();return a.fn[b]=v._jQueryInterface,a.fn[b].Constructor=v,a.fn[b].noConflict=function(){return a.fn[b]=j,v._jQueryInterface},v}(jQuery));(function(f){var h="popover",i="4.0.0-alpha.5",j="bs.popover",k="."+j,l=f.fn[h],m=f.extend({},g.Default,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),n=f.extend({},g.DefaultType,{content:"(string|element|function)"}),o={FADE:"fade",IN:"in"},p={TITLE:".popover-title",CONTENT:".popover-content"},q={HIDE:"hide"+k,HIDDEN:"hidden"+k,SHOW:"show"+k,SHOWN:"shown"+k,INSERTED:"inserted"+k,CLICK:"click"+k,FOCUSIN:"focusin"+k,FOCUSOUT:"focusout"+k,MOUSEENTER:"mouseenter"+k,MOUSELEAVE:"mouseleave"+k},r=function(g){function l(){return c(this,l),a(this,g.apply(this,arguments))}return b(l,g),l.prototype.isWithContent=function(){return this.getTitle()||this._getContent()},l.prototype.getTipElement=function(){return this.tip=this.tip||f(this.config.template)[0]},l.prototype.setContent=function(){var a=f(this.getTipElement());this.setElementContent(a.find(p.TITLE),this.getTitle()),this.setElementContent(a.find(p.CONTENT),this._getContent()),a.removeClass(o.FADE).removeClass(o.IN),this.cleanupTether()},l.prototype._getContent=function(){return this.element.getAttribute("data-content")||("function"==typeof this.config.content?this.config.content.call(this.element):this.config.content)},l._jQueryInterface=function(a){return this.each(function(){var b=f(this).data(j),c="object"===("undefined"==typeof a?"undefined":d(a))?a:null;if((b||!/destroy|hide/.test(a))&&(b||(b=new l(this,c),f(this).data(j,b)),"string"==typeof a)){if(void 0===b[a])throw new Error('No method named "'+a+'"');b[a]()}})},e(l,null,[{key:"VERSION",get:function(){return i}},{key:"Default",get:function(){return m}},{key:"NAME",get:function(){return h}},{key:"DATA_KEY",get:function(){return j}},{key:"Event",get:function(){return q}},{key:"EVENT_KEY",get:function(){return k}},{key:"DefaultType",get:function(){return n}}]),l}(g);return f.fn[h]=r._jQueryInterface,f.fn[h].Constructor=r,f.fn[h].noConflict=function(){return f.fn[h]=l,r._jQueryInterface},r})(jQuery)}(); \ No newline at end of file
+if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.");+function(t){var e=t.fn.jquery.split(" ")[0].split(".");if(e[0]<2&&e[1]<9||1==e[0]&&9==e[1]&&e[2]<1||e[0]>=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(jQuery),+function(){function t(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function e(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},o=function(){function t(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}return function(e,n,i){return n&&t(e.prototype,n),i&&t(e,i),e}}(),r=function(t){function e(t){return{}.toString.call(t).match(/\s([a-zA-Z]+)/)[1].toLowerCase()}function n(t){return(t[0]||t).nodeType}function i(){return{bindType:a.end,delegateType:a.end,handle:function(e){if(t(e.target).is(this))return e.handleObj.handler.apply(this,arguments)}}}function o(){if(window.QUnit)return!1;var t=document.createElement("bootstrap");for(var e in h)if(void 0!==t.style[e])return{end:h[e]};return!1}function r(e){var n=this,i=!1;return t(this).one(c.TRANSITION_END,function(){i=!0}),setTimeout(function(){i||c.triggerTransitionEnd(n)},e),this}function s(){a=o(),t.fn.emulateTransitionEnd=r,c.supportsTransitionEnd()&&(t.event.special[c.TRANSITION_END]=i())}var a=!1,l=1e6,h={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},c={TRANSITION_END:"bsTransitionEnd",getUID:function(t){do t+=~~(Math.random()*l);while(document.getElementById(t));return t},getSelectorFromElement:function(t){var e=t.getAttribute("data-target");return e||(e=t.getAttribute("href")||"",e=/^#[a-z]/i.test(e)?e:null),e},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(e){t(e).trigger(a.end)},supportsTransitionEnd:function(){return Boolean(a)},typeCheckConfig:function(t,i,o){for(var r in o)if(o.hasOwnProperty(r)){var s=o[r],a=i[r],l=a&&n(a)?"element":e(a);if(!new RegExp(s).test(l))throw new Error(t.toUpperCase()+": "+('Option "'+r+'" provided type "'+l+'" ')+('but expected type "'+s+'".'))}}};return s(),c}(jQuery),s=(function(t){var e="alert",i="4.0.0-alpha.6",s="bs.alert",a="."+s,l=".data-api",h=t.fn[e],c=150,u={DISMISS:'[data-dismiss="alert"]'},d={CLOSE:"close"+a,CLOSED:"closed"+a,CLICK_DATA_API:"click"+a+l},f={ALERT:"alert",FADE:"fade",SHOW:"show"},_=function(){function e(t){n(this,e),this._element=t}return e.prototype.close=function(t){t=t||this._element;var e=this._getRootElement(t),n=this._triggerCloseEvent(e);n.isDefaultPrevented()||this._removeElement(e)},e.prototype.dispose=function(){t.removeData(this._element,s),this._element=null},e.prototype._getRootElement=function(e){var n=r.getSelectorFromElement(e),i=!1;return n&&(i=t(n)[0]),i||(i=t(e).closest("."+f.ALERT)[0]),i},e.prototype._triggerCloseEvent=function(e){var n=t.Event(d.CLOSE);return t(e).trigger(n),n},e.prototype._removeElement=function(e){var n=this;return t(e).removeClass(f.SHOW),r.supportsTransitionEnd()&&t(e).hasClass(f.FADE)?void t(e).one(r.TRANSITION_END,function(t){return n._destroyElement(e,t)}).emulateTransitionEnd(c):void this._destroyElement(e)},e.prototype._destroyElement=function(e){t(e).detach().trigger(d.CLOSED).remove()},e._jQueryInterface=function(n){return this.each(function(){var i=t(this),o=i.data(s);o||(o=new e(this),i.data(s,o)),"close"===n&&o[n](this)})},e._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},o(e,null,[{key:"VERSION",get:function(){return i}}]),e}();return t(document).on(d.CLICK_DATA_API,u.DISMISS,_._handleDismiss(new _)),t.fn[e]=_._jQueryInterface,t.fn[e].Constructor=_,t.fn[e].noConflict=function(){return t.fn[e]=h,_._jQueryInterface},_}(jQuery),function(t){var e="button",i="4.0.0-alpha.6",r="bs.button",s="."+r,a=".data-api",l=t.fn[e],h={ACTIVE:"active",BUTTON:"btn",FOCUS:"focus"},c={DATA_TOGGLE_CARROT:'[data-toggle^="button"]',DATA_TOGGLE:'[data-toggle="buttons"]',INPUT:"input",ACTIVE:".active",BUTTON:".btn"},u={CLICK_DATA_API:"click"+s+a,FOCUS_BLUR_DATA_API:"focus"+s+a+" "+("blur"+s+a)},d=function(){function e(t){n(this,e),this._element=t}return e.prototype.toggle=function(){var e=!0,n=t(this._element).closest(c.DATA_TOGGLE)[0];if(n){var i=t(this._element).find(c.INPUT)[0];if(i){if("radio"===i.type)if(i.checked&&t(this._element).hasClass(h.ACTIVE))e=!1;else{var o=t(n).find(c.ACTIVE)[0];o&&t(o).removeClass(h.ACTIVE)}e&&(i.checked=!t(this._element).hasClass(h.ACTIVE),t(i).trigger("change")),i.focus()}}this._element.setAttribute("aria-pressed",!t(this._element).hasClass(h.ACTIVE)),e&&t(this._element).toggleClass(h.ACTIVE)},e.prototype.dispose=function(){t.removeData(this._element,r),this._element=null},e._jQueryInterface=function(n){return this.each(function(){var i=t(this).data(r);i||(i=new e(this),t(this).data(r,i)),"toggle"===n&&i[n]()})},o(e,null,[{key:"VERSION",get:function(){return i}}]),e}();return t(document).on(u.CLICK_DATA_API,c.DATA_TOGGLE_CARROT,function(e){e.preventDefault();var n=e.target;t(n).hasClass(h.BUTTON)||(n=t(n).closest(c.BUTTON)),d._jQueryInterface.call(t(n),"toggle")}).on(u.FOCUS_BLUR_DATA_API,c.DATA_TOGGLE_CARROT,function(e){var n=t(e.target).closest(c.BUTTON)[0];t(n).toggleClass(h.FOCUS,/^focus(in)?$/.test(e.type))}),t.fn[e]=d._jQueryInterface,t.fn[e].Constructor=d,t.fn[e].noConflict=function(){return t.fn[e]=l,d._jQueryInterface},d}(jQuery),function(t){var e="carousel",s="4.0.0-alpha.6",a="bs.carousel",l="."+a,h=".data-api",c=t.fn[e],u=600,d=37,f=39,_={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0},g={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean"},p={NEXT:"next",PREV:"prev",LEFT:"left",RIGHT:"right"},m={SLIDE:"slide"+l,SLID:"slid"+l,KEYDOWN:"keydown"+l,MOUSEENTER:"mouseenter"+l,MOUSELEAVE:"mouseleave"+l,LOAD_DATA_API:"load"+l+h,CLICK_DATA_API:"click"+l+h},E={CAROUSEL:"carousel",ACTIVE:"active",SLIDE:"slide",RIGHT:"carousel-item-right",LEFT:"carousel-item-left",NEXT:"carousel-item-next",PREV:"carousel-item-prev",ITEM:"carousel-item"},v={ACTIVE:".active",ACTIVE_ITEM:".active.carousel-item",ITEM:".carousel-item",NEXT_PREV:".carousel-item-next, .carousel-item-prev",INDICATORS:".carousel-indicators",DATA_SLIDE:"[data-slide], [data-slide-to]",DATA_RIDE:'[data-ride="carousel"]'},T=function(){function h(e,i){n(this,h),this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this._config=this._getConfig(i),this._element=t(e)[0],this._indicatorsElement=t(this._element).find(v.INDICATORS)[0],this._addEventListeners()}return h.prototype.next=function(){if(this._isSliding)throw new Error("Carousel is sliding");this._slide(p.NEXT)},h.prototype.nextWhenVisible=function(){document.hidden||this.next()},h.prototype.prev=function(){if(this._isSliding)throw new Error("Carousel is sliding");this._slide(p.PREVIOUS)},h.prototype.pause=function(e){e||(this._isPaused=!0),t(this._element).find(v.NEXT_PREV)[0]&&r.supportsTransitionEnd()&&(r.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},h.prototype.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},h.prototype.to=function(e){var n=this;this._activeElement=t(this._element).find(v.ACTIVE_ITEM)[0];var i=this._getItemIndex(this._activeElement);if(!(e>this._items.length-1||e<0)){if(this._isSliding)return void t(this._element).one(m.SLID,function(){return n.to(e)});if(i===e)return this.pause(),void this.cycle();var o=e>i?p.NEXT:p.PREVIOUS;this._slide(o,this._items[e])}},h.prototype.dispose=function(){t(this._element).off(l),t.removeData(this._element,a),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},h.prototype._getConfig=function(n){return n=t.extend({},_,n),r.typeCheckConfig(e,n,g),n},h.prototype._addEventListeners=function(){var e=this;this._config.keyboard&&t(this._element).on(m.KEYDOWN,function(t){return e._keydown(t)}),"hover"!==this._config.pause||"ontouchstart"in document.documentElement||t(this._element).on(m.MOUSEENTER,function(t){return e.pause(t)}).on(m.MOUSELEAVE,function(t){return e.cycle(t)})},h.prototype._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case d:t.preventDefault(),this.prev();break;case f:t.preventDefault(),this.next();break;default:return}},h.prototype._getItemIndex=function(e){return this._items=t.makeArray(t(e).parent().find(v.ITEM)),this._items.indexOf(e)},h.prototype._getItemByDirection=function(t,e){var n=t===p.NEXT,i=t===p.PREVIOUS,o=this._getItemIndex(e),r=this._items.length-1,s=i&&0===o||n&&o===r;if(s&&!this._config.wrap)return e;var a=t===p.PREVIOUS?-1:1,l=(o+a)%this._items.length;return l===-1?this._items[this._items.length-1]:this._items[l]},h.prototype._triggerSlideEvent=function(e,n){var i=t.Event(m.SLIDE,{relatedTarget:e,direction:n});return t(this._element).trigger(i),i},h.prototype._setActiveIndicatorElement=function(e){if(this._indicatorsElement){t(this._indicatorsElement).find(v.ACTIVE).removeClass(E.ACTIVE);var n=this._indicatorsElement.children[this._getItemIndex(e)];n&&t(n).addClass(E.ACTIVE)}},h.prototype._slide=function(e,n){var i=this,o=t(this._element).find(v.ACTIVE_ITEM)[0],s=n||o&&this._getItemByDirection(e,o),a=Boolean(this._interval),l=void 0,h=void 0,c=void 0;if(e===p.NEXT?(l=E.LEFT,h=E.NEXT,c=p.LEFT):(l=E.RIGHT,h=E.PREV,c=p.RIGHT),s&&t(s).hasClass(E.ACTIVE))return void(this._isSliding=!1);var d=this._triggerSlideEvent(s,c);if(!d.isDefaultPrevented()&&o&&s){this._isSliding=!0,a&&this.pause(),this._setActiveIndicatorElement(s);var f=t.Event(m.SLID,{relatedTarget:s,direction:c});r.supportsTransitionEnd()&&t(this._element).hasClass(E.SLIDE)?(t(s).addClass(h),r.reflow(s),t(o).addClass(l),t(s).addClass(l),t(o).one(r.TRANSITION_END,function(){t(s).removeClass(l+" "+h).addClass(E.ACTIVE),t(o).removeClass(E.ACTIVE+" "+h+" "+l),i._isSliding=!1,setTimeout(function(){return t(i._element).trigger(f)},0)}).emulateTransitionEnd(u)):(t(o).removeClass(E.ACTIVE),t(s).addClass(E.ACTIVE),this._isSliding=!1,t(this._element).trigger(f)),a&&this.cycle()}},h._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(a),o=t.extend({},_,t(this).data());"object"===("undefined"==typeof e?"undefined":i(e))&&t.extend(o,e);var r="string"==typeof e?e:o.slide;if(n||(n=new h(this,o),t(this).data(a,n)),"number"==typeof e)n.to(e);else if("string"==typeof r){if(void 0===n[r])throw new Error('No method named "'+r+'"');n[r]()}else o.interval&&(n.pause(),n.cycle())})},h._dataApiClickHandler=function(e){var n=r.getSelectorFromElement(this);if(n){var i=t(n)[0];if(i&&t(i).hasClass(E.CAROUSEL)){var o=t.extend({},t(i).data(),t(this).data()),s=this.getAttribute("data-slide-to");s&&(o.interval=!1),h._jQueryInterface.call(t(i),o),s&&t(i).data(a).to(s),e.preventDefault()}}},o(h,null,[{key:"VERSION",get:function(){return s}},{key:"Default",get:function(){return _}}]),h}();return t(document).on(m.CLICK_DATA_API,v.DATA_SLIDE,T._dataApiClickHandler),t(window).on(m.LOAD_DATA_API,function(){t(v.DATA_RIDE).each(function(){var e=t(this);T._jQueryInterface.call(e,e.data())})}),t.fn[e]=T._jQueryInterface,t.fn[e].Constructor=T,t.fn[e].noConflict=function(){return t.fn[e]=c,T._jQueryInterface},T}(jQuery),function(t){var e="collapse",s="4.0.0-alpha.6",a="bs.collapse",l="."+a,h=".data-api",c=t.fn[e],u=600,d={toggle:!0,parent:""},f={toggle:"boolean",parent:"string"},_={SHOW:"show"+l,SHOWN:"shown"+l,HIDE:"hide"+l,HIDDEN:"hidden"+l,CLICK_DATA_API:"click"+l+h},g={SHOW:"show",COLLAPSE:"collapse",COLLAPSING:"collapsing",COLLAPSED:"collapsed"},p={WIDTH:"width",HEIGHT:"height"},m={ACTIVES:".card > .show, .card > .collapsing",DATA_TOGGLE:'[data-toggle="collapse"]'},E=function(){function l(e,i){n(this,l),this._isTransitioning=!1,this._element=e,this._config=this._getConfig(i),this._triggerArray=t.makeArray(t('[data-toggle="collapse"][href="#'+e.id+'"],'+('[data-toggle="collapse"][data-target="#'+e.id+'"]'))),this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}return l.prototype.toggle=function(){t(this._element).hasClass(g.SHOW)?this.hide():this.show()},l.prototype.show=function(){var e=this;if(this._isTransitioning)throw new Error("Collapse is transitioning");if(!t(this._element).hasClass(g.SHOW)){var n=void 0,i=void 0;if(this._parent&&(n=t.makeArray(t(this._parent).find(m.ACTIVES)),n.length||(n=null)),!(n&&(i=t(n).data(a),i&&i._isTransitioning))){var o=t.Event(_.SHOW);if(t(this._element).trigger(o),!o.isDefaultPrevented()){n&&(l._jQueryInterface.call(t(n),"hide"),i||t(n).data(a,null));var s=this._getDimension();t(this._element).removeClass(g.COLLAPSE).addClass(g.COLLAPSING),this._element.style[s]=0,this._element.setAttribute("aria-expanded",!0),this._triggerArray.length&&t(this._triggerArray).removeClass(g.COLLAPSED).attr("aria-expanded",!0),this.setTransitioning(!0);var h=function(){t(e._element).removeClass(g.COLLAPSING).addClass(g.COLLAPSE).addClass(g.SHOW),e._element.style[s]="",e.setTransitioning(!1),t(e._element).trigger(_.SHOWN)};if(!r.supportsTransitionEnd())return void h();var c=s[0].toUpperCase()+s.slice(1),d="scroll"+c;t(this._element).one(r.TRANSITION_END,h).emulateTransitionEnd(u),this._element.style[s]=this._element[d]+"px"}}}},l.prototype.hide=function(){var e=this;if(this._isTransitioning)throw new Error("Collapse is transitioning");if(t(this._element).hasClass(g.SHOW)){var n=t.Event(_.HIDE);if(t(this._element).trigger(n),!n.isDefaultPrevented()){var i=this._getDimension(),o=i===p.WIDTH?"offsetWidth":"offsetHeight";this._element.style[i]=this._element[o]+"px",r.reflow(this._element),t(this._element).addClass(g.COLLAPSING).removeClass(g.COLLAPSE).removeClass(g.SHOW),this._element.setAttribute("aria-expanded",!1),this._triggerArray.length&&t(this._triggerArray).addClass(g.COLLAPSED).attr("aria-expanded",!1),this.setTransitioning(!0);var s=function(){e.setTransitioning(!1),t(e._element).removeClass(g.COLLAPSING).addClass(g.COLLAPSE).trigger(_.HIDDEN)};return this._element.style[i]="",r.supportsTransitionEnd()?void t(this._element).one(r.TRANSITION_END,s).emulateTransitionEnd(u):void s()}}},l.prototype.setTransitioning=function(t){this._isTransitioning=t},l.prototype.dispose=function(){t.removeData(this._element,a),this._config=null,this._parent=null,this._element=null,this._triggerArray=null,this._isTransitioning=null},l.prototype._getConfig=function(n){return n=t.extend({},d,n),n.toggle=Boolean(n.toggle),r.typeCheckConfig(e,n,f),n},l.prototype._getDimension=function(){var e=t(this._element).hasClass(p.WIDTH);return e?p.WIDTH:p.HEIGHT},l.prototype._getParent=function(){var e=this,n=t(this._config.parent)[0],i='[data-toggle="collapse"][data-parent="'+this._config.parent+'"]';return t(n).find(i).each(function(t,n){e._addAriaAndCollapsedClass(l._getTargetFromElement(n),[n])}),n},l.prototype._addAriaAndCollapsedClass=function(e,n){if(e){var i=t(e).hasClass(g.SHOW);e.setAttribute("aria-expanded",i),n.length&&t(n).toggleClass(g.COLLAPSED,!i).attr("aria-expanded",i)}},l._getTargetFromElement=function(e){var n=r.getSelectorFromElement(e);return n?t(n)[0]:null},l._jQueryInterface=function(e){return this.each(function(){var n=t(this),o=n.data(a),r=t.extend({},d,n.data(),"object"===("undefined"==typeof e?"undefined":i(e))&&e);if(!o&&r.toggle&&/show|hide/.test(e)&&(r.toggle=!1),o||(o=new l(this,r),n.data(a,o)),"string"==typeof e){if(void 0===o[e])throw new Error('No method named "'+e+'"');o[e]()}})},o(l,null,[{key:"VERSION",get:function(){return s}},{key:"Default",get:function(){return d}}]),l}();return t(document).on(_.CLICK_DATA_API,m.DATA_TOGGLE,function(e){e.preventDefault();var n=E._getTargetFromElement(this),i=t(n).data(a),o=i?"toggle":t(this).data();E._jQueryInterface.call(t(n),o)}),t.fn[e]=E._jQueryInterface,t.fn[e].Constructor=E,t.fn[e].noConflict=function(){return t.fn[e]=c,E._jQueryInterface},E}(jQuery),function(t){var e="dropdown",i="4.0.0-alpha.6",s="bs.dropdown",a="."+s,l=".data-api",h=t.fn[e],c=27,u=38,d=40,f=3,_={HIDE:"hide"+a,HIDDEN:"hidden"+a,SHOW:"show"+a,SHOWN:"shown"+a,CLICK:"click"+a,CLICK_DATA_API:"click"+a+l,FOCUSIN_DATA_API:"focusin"+a+l,KEYDOWN_DATA_API:"keydown"+a+l},g={BACKDROP:"dropdown-backdrop",DISABLED:"disabled",SHOW:"show"},p={BACKDROP:".dropdown-backdrop",DATA_TOGGLE:'[data-toggle="dropdown"]',FORM_CHILD:".dropdown form",ROLE_MENU:'[role="menu"]',ROLE_LISTBOX:'[role="listbox"]',NAVBAR_NAV:".navbar-nav",VISIBLE_ITEMS:'[role="menu"] li:not(.disabled) a, [role="listbox"] li:not(.disabled) a'},m=function(){function e(t){n(this,e),this._element=t,this._addEventListeners()}return e.prototype.toggle=function(){if(this.disabled||t(this).hasClass(g.DISABLED))return!1;var n=e._getParentFromElement(this),i=t(n).hasClass(g.SHOW);if(e._clearMenus(),i)return!1;if("ontouchstart"in document.documentElement&&!t(n).closest(p.NAVBAR_NAV).length){var o=document.createElement("div");o.className=g.BACKDROP,t(o).insertBefore(this),t(o).on("click",e._clearMenus)}var r={relatedTarget:this},s=t.Event(_.SHOW,r);return t(n).trigger(s),!s.isDefaultPrevented()&&(this.focus(),this.setAttribute("aria-expanded",!0),t(n).toggleClass(g.SHOW),t(n).trigger(t.Event(_.SHOWN,r)),!1)},e.prototype.dispose=function(){t.removeData(this._element,s),t(this._element).off(a),this._element=null},e.prototype._addEventListeners=function(){t(this._element).on(_.CLICK,this.toggle)},e._jQueryInterface=function(n){return this.each(function(){var i=t(this).data(s);if(i||(i=new e(this),t(this).data(s,i)),"string"==typeof n){if(void 0===i[n])throw new Error('No method named "'+n+'"');i[n].call(this)}})},e._clearMenus=function(n){if(!n||n.which!==f){var i=t(p.BACKDROP)[0];i&&i.parentNode.removeChild(i);for(var o=t.makeArray(t(p.DATA_TOGGLE)),r=0;r<o.length;r++){var s=e._getParentFromElement(o[r]),a={relatedTarget:o[r]};if(t(s).hasClass(g.SHOW)&&!(n&&("click"===n.type&&/input|textarea/i.test(n.target.tagName)||"focusin"===n.type)&&t.contains(s,n.target))){var l=t.Event(_.HIDE,a);t(s).trigger(l),l.isDefaultPrevented()||(o[r].setAttribute("aria-expanded","false"),t(s).removeClass(g.SHOW).trigger(t.Event(_.HIDDEN,a)))}}}},e._getParentFromElement=function(e){var n=void 0,i=r.getSelectorFromElement(e);return i&&(n=t(i)[0]),n||e.parentNode},e._dataApiKeydownHandler=function(n){if(/(38|40|27|32)/.test(n.which)&&!/input|textarea/i.test(n.target.tagName)&&(n.preventDefault(),n.stopPropagation(),!this.disabled&&!t(this).hasClass(g.DISABLED))){var i=e._getParentFromElement(this),o=t(i).hasClass(g.SHOW);if(!o&&n.which!==c||o&&n.which===c){if(n.which===c){var r=t(i).find(p.DATA_TOGGLE)[0];t(r).trigger("focus")}return void t(this).trigger("click")}var s=t(i).find(p.VISIBLE_ITEMS).get();if(s.length){var a=s.indexOf(n.target);n.which===u&&a>0&&a--,n.which===d&&a<s.length-1&&a++,a<0&&(a=0),s[a].focus()}}},o(e,null,[{key:"VERSION",get:function(){return i}}]),e}();return t(document).on(_.KEYDOWN_DATA_API,p.DATA_TOGGLE,m._dataApiKeydownHandler).on(_.KEYDOWN_DATA_API,p.ROLE_MENU,m._dataApiKeydownHandler).on(_.KEYDOWN_DATA_API,p.ROLE_LISTBOX,m._dataApiKeydownHandler).on(_.CLICK_DATA_API+" "+_.FOCUSIN_DATA_API,m._clearMenus).on(_.CLICK_DATA_API,p.DATA_TOGGLE,m.prototype.toggle).on(_.CLICK_DATA_API,p.FORM_CHILD,function(t){t.stopPropagation()}),t.fn[e]=m._jQueryInterface,t.fn[e].Constructor=m,t.fn[e].noConflict=function(){return t.fn[e]=h,m._jQueryInterface},m}(jQuery),function(t){var e="modal",s="4.0.0-alpha.6",a="bs.modal",l="."+a,h=".data-api",c=t.fn[e],u=300,d=150,f=27,_={backdrop:!0,keyboard:!0,focus:!0,show:!0},g={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean",show:"boolean"},p={HIDE:"hide"+l,HIDDEN:"hidden"+l,SHOW:"show"+l,SHOWN:"shown"+l,FOCUSIN:"focusin"+l,RESIZE:"resize"+l,CLICK_DISMISS:"click.dismiss"+l,KEYDOWN_DISMISS:"keydown.dismiss"+l,MOUSEUP_DISMISS:"mouseup.dismiss"+l,MOUSEDOWN_DISMISS:"mousedown.dismiss"+l,CLICK_DATA_API:"click"+l+h},m={SCROLLBAR_MEASURER:"modal-scrollbar-measure",BACKDROP:"modal-backdrop",OPEN:"modal-open",FADE:"fade",SHOW:"show"},E={DIALOG:".modal-dialog",DATA_TOGGLE:'[data-toggle="modal"]',DATA_DISMISS:'[data-dismiss="modal"]',FIXED_CONTENT:".fixed-top, .fixed-bottom, .is-fixed, .sticky-top"},v=function(){function h(e,i){n(this,h),this._config=this._getConfig(i),this._element=e,this._dialog=t(e).find(E.DIALOG)[0],this._backdrop=null,this._isShown=!1,this._isBodyOverflowing=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._originalBodyPadding=0,this._scrollbarWidth=0}return h.prototype.toggle=function(t){return this._isShown?this.hide():this.show(t)},h.prototype.show=function(e){var n=this;if(this._isTransitioning)throw new Error("Modal is transitioning");r.supportsTransitionEnd()&&t(this._element).hasClass(m.FADE)&&(this._isTransitioning=!0);var i=t.Event(p.SHOW,{relatedTarget:e});t(this._element).trigger(i),this._isShown||i.isDefaultPrevented()||(this._isShown=!0,this._checkScrollbar(),this._setScrollbar(),t(document.body).addClass(m.OPEN),this._setEscapeEvent(),this._setResizeEvent(),t(this._element).on(p.CLICK_DISMISS,E.DATA_DISMISS,function(t){return n.hide(t)}),t(this._dialog).on(p.MOUSEDOWN_DISMISS,function(){t(n._element).one(p.MOUSEUP_DISMISS,function(e){t(e.target).is(n._element)&&(n._ignoreBackdropClick=!0)})}),this._showBackdrop(function(){return n._showElement(e)}))},h.prototype.hide=function(e){var n=this;if(e&&e.preventDefault(),this._isTransitioning)throw new Error("Modal is transitioning");var i=r.supportsTransitionEnd()&&t(this._element).hasClass(m.FADE);i&&(this._isTransitioning=!0);var o=t.Event(p.HIDE);t(this._element).trigger(o),this._isShown&&!o.isDefaultPrevented()&&(this._isShown=!1,this._setEscapeEvent(),this._setResizeEvent(),t(document).off(p.FOCUSIN),t(this._element).removeClass(m.SHOW),t(this._element).off(p.CLICK_DISMISS),t(this._dialog).off(p.MOUSEDOWN_DISMISS),i?t(this._element).one(r.TRANSITION_END,function(t){return n._hideModal(t)}).emulateTransitionEnd(u):this._hideModal())},h.prototype.dispose=function(){t.removeData(this._element,a),t(window,document,this._element,this._backdrop).off(l),this._config=null,this._element=null,this._dialog=null,this._backdrop=null,this._isShown=null,this._isBodyOverflowing=null,this._ignoreBackdropClick=null,this._originalBodyPadding=null,this._scrollbarWidth=null},h.prototype._getConfig=function(n){return n=t.extend({},_,n),r.typeCheckConfig(e,n,g),n},h.prototype._showElement=function(e){var n=this,i=r.supportsTransitionEnd()&&t(this._element).hasClass(m.FADE);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.scrollTop=0,i&&r.reflow(this._element),t(this._element).addClass(m.SHOW),this._config.focus&&this._enforceFocus();var o=t.Event(p.SHOWN,{relatedTarget:e}),s=function(){n._config.focus&&n._element.focus(),n._isTransitioning=!1,t(n._element).trigger(o)};i?t(this._dialog).one(r.TRANSITION_END,s).emulateTransitionEnd(u):s()},h.prototype._enforceFocus=function(){var e=this;t(document).off(p.FOCUSIN).on(p.FOCUSIN,function(n){document===n.target||e._element===n.target||t(e._element).has(n.target).length||e._element.focus()})},h.prototype._setEscapeEvent=function(){var e=this;this._isShown&&this._config.keyboard?t(this._element).on(p.KEYDOWN_DISMISS,function(t){t.which===f&&e.hide()}):this._isShown||t(this._element).off(p.KEYDOWN_DISMISS)},h.prototype._setResizeEvent=function(){var e=this;this._isShown?t(window).on(p.RESIZE,function(t){return e._handleUpdate(t)}):t(window).off(p.RESIZE)},h.prototype._hideModal=function(){var e=this;this._element.style.display="none",this._element.setAttribute("aria-hidden","true"),this._isTransitioning=!1,this._showBackdrop(function(){t(document.body).removeClass(m.OPEN),e._resetAdjustments(),e._resetScrollbar(),t(e._element).trigger(p.HIDDEN)})},h.prototype._removeBackdrop=function(){this._backdrop&&(t(this._backdrop).remove(),this._backdrop=null)},h.prototype._showBackdrop=function(e){var n=this,i=t(this._element).hasClass(m.FADE)?m.FADE:"";if(this._isShown&&this._config.backdrop){var o=r.supportsTransitionEnd()&&i;if(this._backdrop=document.createElement("div"),this._backdrop.className=m.BACKDROP,i&&t(this._backdrop).addClass(i),t(this._backdrop).appendTo(document.body),t(this._element).on(p.CLICK_DISMISS,function(t){return n._ignoreBackdropClick?void(n._ignoreBackdropClick=!1):void(t.target===t.currentTarget&&("static"===n._config.backdrop?n._element.focus():n.hide()))}),o&&r.reflow(this._backdrop),t(this._backdrop).addClass(m.SHOW),!e)return;if(!o)return void e();t(this._backdrop).one(r.TRANSITION_END,e).emulateTransitionEnd(d)}else if(!this._isShown&&this._backdrop){t(this._backdrop).removeClass(m.SHOW);var s=function(){n._removeBackdrop(),e&&e()};r.supportsTransitionEnd()&&t(this._element).hasClass(m.FADE)?t(this._backdrop).one(r.TRANSITION_END,s).emulateTransitionEnd(d):s()}else e&&e()},h.prototype._handleUpdate=function(){this._adjustDialog()},h.prototype._adjustDialog=function(){var t=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},h.prototype._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},h.prototype._checkScrollbar=function(){this._isBodyOverflowing=document.body.clientWidth<window.innerWidth,this._scrollbarWidth=this._getScrollbarWidth()},h.prototype._setScrollbar=function(){var e=parseInt(t(E.FIXED_CONTENT).css("padding-right")||0,10);this._originalBodyPadding=document.body.style.paddingRight||"",this._isBodyOverflowing&&(document.body.style.paddingRight=e+this._scrollbarWidth+"px")},h.prototype._resetScrollbar=function(){document.body.style.paddingRight=this._originalBodyPadding},h.prototype._getScrollbarWidth=function(){var t=document.createElement("div");t.className=m.SCROLLBAR_MEASURER,document.body.appendChild(t);var e=t.offsetWidth-t.clientWidth;return document.body.removeChild(t),e},h._jQueryInterface=function(e,n){return this.each(function(){var o=t(this).data(a),r=t.extend({},h.Default,t(this).data(),"object"===("undefined"==typeof e?"undefined":i(e))&&e);if(o||(o=new h(this,r),t(this).data(a,o)),"string"==typeof e){if(void 0===o[e])throw new Error('No method named "'+e+'"');o[e](n)}else r.show&&o.show(n)})},o(h,null,[{key:"VERSION",get:function(){return s}},{key:"Default",get:function(){return _}}]),h}();return t(document).on(p.CLICK_DATA_API,E.DATA_TOGGLE,function(e){var n=this,i=void 0,o=r.getSelectorFromElement(this);o&&(i=t(o)[0]);var s=t(i).data(a)?"toggle":t.extend({},t(i).data(),t(this).data());"A"!==this.tagName&&"AREA"!==this.tagName||e.preventDefault();var l=t(i).one(p.SHOW,function(e){e.isDefaultPrevented()||l.one(p.HIDDEN,function(){t(n).is(":visible")&&n.focus()})});v._jQueryInterface.call(t(i),s,this)}),t.fn[e]=v._jQueryInterface,t.fn[e].Constructor=v,t.fn[e].noConflict=function(){return t.fn[e]=c,v._jQueryInterface},v}(jQuery),function(t){var e="scrollspy",s="4.0.0-alpha.6",a="bs.scrollspy",l="."+a,h=".data-api",c=t.fn[e],u={offset:10,method:"auto",target:""},d={offset:"number",method:"string",target:"(string|element)"},f={ACTIVATE:"activate"+l,SCROLL:"scroll"+l,LOAD_DATA_API:"load"+l+h},_={DROPDOWN_ITEM:"dropdown-item",DROPDOWN_MENU:"dropdown-menu",NAV_LINK:"nav-link",NAV:"nav",ACTIVE:"active"},g={DATA_SPY:'[data-spy="scroll"]',ACTIVE:".active",LIST_ITEM:".list-item",LI:"li",LI_DROPDOWN:"li.dropdown",NAV_LINKS:".nav-link",DROPDOWN:".dropdown",DROPDOWN_ITEMS:".dropdown-item",DROPDOWN_TOGGLE:".dropdown-toggle"},p={OFFSET:"offset",POSITION:"position"},m=function(){function h(e,i){var o=this;n(this,h),this._element=e,this._scrollElement="BODY"===e.tagName?window:e,this._config=this._getConfig(i),this._selector=this._config.target+" "+g.NAV_LINKS+","+(this._config.target+" "+g.DROPDOWN_ITEMS),this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,t(this._scrollElement).on(f.SCROLL,function(t){return o._process(t)}),this.refresh(),this._process()}return h.prototype.refresh=function(){var e=this,n=this._scrollElement!==this._scrollElement.window?p.POSITION:p.OFFSET,i="auto"===this._config.method?n:this._config.method,o=i===p.POSITION?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight();var s=t.makeArray(t(this._selector));s.map(function(e){var n=void 0,s=r.getSelectorFromElement(e);return s&&(n=t(s)[0]),n&&(n.offsetWidth||n.offsetHeight)?[t(n)[i]().top+o,s]:null}).filter(function(t){return t}).sort(function(t,e){return t[0]-e[0]}).forEach(function(t){e._offsets.push(t[0]),e._targets.push(t[1])})},h.prototype.dispose=function(){t.removeData(this._element,a),t(this._scrollElement).off(l),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},h.prototype._getConfig=function(n){if(n=t.extend({},u,n),"string"!=typeof n.target){var i=t(n.target).attr("id");i||(i=r.getUID(e),t(n.target).attr("id",i)),n.target="#"+i}return r.typeCheckConfig(e,n,d),n},h.prototype._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},h.prototype._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},h.prototype._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.offsetHeight},h.prototype._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];return void(this._activeTarget!==i&&this._activate(i))}if(this._activeTarget&&t<this._offsets[0]&&this._offsets[0]>0)return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;){var r=this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&(void 0===this._offsets[o+1]||t<this._offsets[o+1]);r&&this._activate(this._targets[o])}},h.prototype._activate=function(e){this._activeTarget=e,this._clear();var n=this._selector.split(",");n=n.map(function(t){return t+'[data-target="'+e+'"],'+(t+'[href="'+e+'"]')});var i=t(n.join(","));i.hasClass(_.DROPDOWN_ITEM)?(i.closest(g.DROPDOWN).find(g.DROPDOWN_TOGGLE).addClass(_.ACTIVE),i.addClass(_.ACTIVE)):i.parents(g.LI).find("> "+g.NAV_LINKS).addClass(_.ACTIVE),t(this._scrollElement).trigger(f.ACTIVATE,{relatedTarget:e})},h.prototype._clear=function(){t(this._selector).filter(g.ACTIVE).removeClass(_.ACTIVE)},h._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(a),o="object"===("undefined"==typeof e?"undefined":i(e))&&e;
+if(n||(n=new h(this,o),t(this).data(a,n)),"string"==typeof e){if(void 0===n[e])throw new Error('No method named "'+e+'"');n[e]()}})},o(h,null,[{key:"VERSION",get:function(){return s}},{key:"Default",get:function(){return u}}]),h}();return t(window).on(f.LOAD_DATA_API,function(){for(var e=t.makeArray(t(g.DATA_SPY)),n=e.length;n--;){var i=t(e[n]);m._jQueryInterface.call(i,i.data())}}),t.fn[e]=m._jQueryInterface,t.fn[e].Constructor=m,t.fn[e].noConflict=function(){return t.fn[e]=c,m._jQueryInterface},m}(jQuery),function(t){var e="tab",i="4.0.0-alpha.6",s="bs.tab",a="."+s,l=".data-api",h=t.fn[e],c=150,u={HIDE:"hide"+a,HIDDEN:"hidden"+a,SHOW:"show"+a,SHOWN:"shown"+a,CLICK_DATA_API:"click"+a+l},d={DROPDOWN_MENU:"dropdown-menu",ACTIVE:"active",DISABLED:"disabled",FADE:"fade",SHOW:"show"},f={A:"a",LI:"li",DROPDOWN:".dropdown",LIST:"ul:not(.dropdown-menu), ol:not(.dropdown-menu), nav:not(.dropdown-menu)",FADE_CHILD:"> .nav-item .fade, > .fade",ACTIVE:".active",ACTIVE_CHILD:"> .nav-item > .active, > .active",DATA_TOGGLE:'[data-toggle="tab"], [data-toggle="pill"]',DROPDOWN_TOGGLE:".dropdown-toggle",DROPDOWN_ACTIVE_CHILD:"> .dropdown-menu .active"},_=function(){function e(t){n(this,e),this._element=t}return e.prototype.show=function(){var e=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&t(this._element).hasClass(d.ACTIVE)||t(this._element).hasClass(d.DISABLED))){var n=void 0,i=void 0,o=t(this._element).closest(f.LIST)[0],s=r.getSelectorFromElement(this._element);o&&(i=t.makeArray(t(o).find(f.ACTIVE)),i=i[i.length-1]);var a=t.Event(u.HIDE,{relatedTarget:this._element}),l=t.Event(u.SHOW,{relatedTarget:i});if(i&&t(i).trigger(a),t(this._element).trigger(l),!l.isDefaultPrevented()&&!a.isDefaultPrevented()){s&&(n=t(s)[0]),this._activate(this._element,o);var h=function(){var n=t.Event(u.HIDDEN,{relatedTarget:e._element}),o=t.Event(u.SHOWN,{relatedTarget:i});t(i).trigger(n),t(e._element).trigger(o)};n?this._activate(n,n.parentNode,h):h()}}},e.prototype.dispose=function(){t.removeClass(this._element,s),this._element=null},e.prototype._activate=function(e,n,i){var o=this,s=t(n).find(f.ACTIVE_CHILD)[0],a=i&&r.supportsTransitionEnd()&&(s&&t(s).hasClass(d.FADE)||Boolean(t(n).find(f.FADE_CHILD)[0])),l=function(){return o._transitionComplete(e,s,a,i)};s&&a?t(s).one(r.TRANSITION_END,l).emulateTransitionEnd(c):l(),s&&t(s).removeClass(d.SHOW)},e.prototype._transitionComplete=function(e,n,i,o){if(n){t(n).removeClass(d.ACTIVE);var s=t(n.parentNode).find(f.DROPDOWN_ACTIVE_CHILD)[0];s&&t(s).removeClass(d.ACTIVE),n.setAttribute("aria-expanded",!1)}if(t(e).addClass(d.ACTIVE),e.setAttribute("aria-expanded",!0),i?(r.reflow(e),t(e).addClass(d.SHOW)):t(e).removeClass(d.FADE),e.parentNode&&t(e.parentNode).hasClass(d.DROPDOWN_MENU)){var a=t(e).closest(f.DROPDOWN)[0];a&&t(a).find(f.DROPDOWN_TOGGLE).addClass(d.ACTIVE),e.setAttribute("aria-expanded",!0)}o&&o()},e._jQueryInterface=function(n){return this.each(function(){var i=t(this),o=i.data(s);if(o||(o=new e(this),i.data(s,o)),"string"==typeof n){if(void 0===o[n])throw new Error('No method named "'+n+'"');o[n]()}})},o(e,null,[{key:"VERSION",get:function(){return i}}]),e}();return t(document).on(u.CLICK_DATA_API,f.DATA_TOGGLE,function(e){e.preventDefault(),_._jQueryInterface.call(t(this),"show")}),t.fn[e]=_._jQueryInterface,t.fn[e].Constructor=_,t.fn[e].noConflict=function(){return t.fn[e]=h,_._jQueryInterface},_}(jQuery),function(t){if("undefined"==typeof Tether)throw new Error("Bootstrap tooltips require Tether (http://tether.io/)");var e="tooltip",s="4.0.0-alpha.6",a="bs.tooltip",l="."+a,h=t.fn[e],c=150,u="bs-tether",d={animation:!0,template:'<div class="tooltip" role="tooltip"><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:"0 0",constraints:[],container:!1},f={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"string",constraints:"array",container:"(string|element|boolean)"},_={TOP:"bottom center",RIGHT:"middle left",BOTTOM:"top center",LEFT:"middle right"},g={SHOW:"show",OUT:"out"},p={HIDE:"hide"+l,HIDDEN:"hidden"+l,SHOW:"show"+l,SHOWN:"shown"+l,INSERTED:"inserted"+l,CLICK:"click"+l,FOCUSIN:"focusin"+l,FOCUSOUT:"focusout"+l,MOUSEENTER:"mouseenter"+l,MOUSELEAVE:"mouseleave"+l},m={FADE:"fade",SHOW:"show"},E={TOOLTIP:".tooltip",TOOLTIP_INNER:".tooltip-inner"},v={element:!1,enabled:!1},T={HOVER:"hover",FOCUS:"focus",CLICK:"click",MANUAL:"manual"},I=function(){function h(t,e){n(this,h),this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._isTransitioning=!1,this._tether=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}return h.prototype.enable=function(){this._isEnabled=!0},h.prototype.disable=function(){this._isEnabled=!1},h.prototype.toggleEnabled=function(){this._isEnabled=!this._isEnabled},h.prototype.toggle=function(e){if(e){var n=this.constructor.DATA_KEY,i=t(e.currentTarget).data(n);i||(i=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(n,i)),i._activeTrigger.click=!i._activeTrigger.click,i._isWithActiveTrigger()?i._enter(null,i):i._leave(null,i)}else{if(t(this.getTipElement()).hasClass(m.SHOW))return void this._leave(null,this);this._enter(null,this)}},h.prototype.dispose=function(){clearTimeout(this._timeout),this.cleanupTether(),t.removeData(this.element,this.constructor.DATA_KEY),t(this.element).off(this.constructor.EVENT_KEY),t(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&t(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._tether=null,this.element=null,this.config=null,this.tip=null},h.prototype.show=function(){var e=this;if("none"===t(this.element).css("display"))throw new Error("Please use show on visible elements");var n=t.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){if(this._isTransitioning)throw new Error("Tooltip is transitioning");t(this.element).trigger(n);var i=t.contains(this.element.ownerDocument.documentElement,this.element);if(n.isDefaultPrevented()||!i)return;var o=this.getTipElement(),s=r.getUID(this.constructor.NAME);o.setAttribute("id",s),this.element.setAttribute("aria-describedby",s),this.setContent(),this.config.animation&&t(o).addClass(m.FADE);var a="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,l=this._getAttachment(a),c=this.config.container===!1?document.body:t(this.config.container);t(o).data(this.constructor.DATA_KEY,this).appendTo(c),t(this.element).trigger(this.constructor.Event.INSERTED),this._tether=new Tether({attachment:l,element:o,target:this.element,classes:v,classPrefix:u,offset:this.config.offset,constraints:this.config.constraints,addTargetClasses:!1}),r.reflow(o),this._tether.position(),t(o).addClass(m.SHOW);var d=function(){var n=e._hoverState;e._hoverState=null,e._isTransitioning=!1,t(e.element).trigger(e.constructor.Event.SHOWN),n===g.OUT&&e._leave(null,e)};if(r.supportsTransitionEnd()&&t(this.tip).hasClass(m.FADE))return this._isTransitioning=!0,void t(this.tip).one(r.TRANSITION_END,d).emulateTransitionEnd(h._TRANSITION_DURATION);d()}},h.prototype.hide=function(e){var n=this,i=this.getTipElement(),o=t.Event(this.constructor.Event.HIDE);if(this._isTransitioning)throw new Error("Tooltip is transitioning");var s=function(){n._hoverState!==g.SHOW&&i.parentNode&&i.parentNode.removeChild(i),n.element.removeAttribute("aria-describedby"),t(n.element).trigger(n.constructor.Event.HIDDEN),n._isTransitioning=!1,n.cleanupTether(),e&&e()};t(this.element).trigger(o),o.isDefaultPrevented()||(t(i).removeClass(m.SHOW),this._activeTrigger[T.CLICK]=!1,this._activeTrigger[T.FOCUS]=!1,this._activeTrigger[T.HOVER]=!1,r.supportsTransitionEnd()&&t(this.tip).hasClass(m.FADE)?(this._isTransitioning=!0,t(i).one(r.TRANSITION_END,s).emulateTransitionEnd(c)):s(),this._hoverState="")},h.prototype.isWithContent=function(){return Boolean(this.getTitle())},h.prototype.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0]},h.prototype.setContent=function(){var e=t(this.getTipElement());this.setElementContent(e.find(E.TOOLTIP_INNER),this.getTitle()),e.removeClass(m.FADE+" "+m.SHOW),this.cleanupTether()},h.prototype.setElementContent=function(e,n){var o=this.config.html;"object"===("undefined"==typeof n?"undefined":i(n))&&(n.nodeType||n.jquery)?o?t(n).parent().is(e)||e.empty().append(n):e.text(t(n).text()):e[o?"html":"text"](n)},h.prototype.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},h.prototype.cleanupTether=function(){this._tether&&this._tether.destroy()},h.prototype._getAttachment=function(t){return _[t.toUpperCase()]},h.prototype._setListeners=function(){var e=this,n=this.config.trigger.split(" ");n.forEach(function(n){if("click"===n)t(e.element).on(e.constructor.Event.CLICK,e.config.selector,function(t){return e.toggle(t)});else if(n!==T.MANUAL){var i=n===T.HOVER?e.constructor.Event.MOUSEENTER:e.constructor.Event.FOCUSIN,o=n===T.HOVER?e.constructor.Event.MOUSELEAVE:e.constructor.Event.FOCUSOUT;t(e.element).on(i,e.config.selector,function(t){return e._enter(t)}).on(o,e.config.selector,function(t){return e._leave(t)})}t(e.element).closest(".modal").on("hide.bs.modal",function(){return e.hide()})}),this.config.selector?this.config=t.extend({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},h.prototype._fixTitle=function(){var t=i(this.element.getAttribute("data-original-title"));(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},h.prototype._enter=function(e,n){var i=this.constructor.DATA_KEY;return n=n||t(e.currentTarget).data(i),n||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusin"===e.type?T.FOCUS:T.HOVER]=!0),t(n.getTipElement()).hasClass(m.SHOW)||n._hoverState===g.SHOW?void(n._hoverState=g.SHOW):(clearTimeout(n._timeout),n._hoverState=g.SHOW,n.config.delay&&n.config.delay.show?void(n._timeout=setTimeout(function(){n._hoverState===g.SHOW&&n.show()},n.config.delay.show)):void n.show())},h.prototype._leave=function(e,n){var i=this.constructor.DATA_KEY;if(n=n||t(e.currentTarget).data(i),n||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusout"===e.type?T.FOCUS:T.HOVER]=!1),!n._isWithActiveTrigger())return clearTimeout(n._timeout),n._hoverState=g.OUT,n.config.delay&&n.config.delay.hide?void(n._timeout=setTimeout(function(){n._hoverState===g.OUT&&n.hide()},n.config.delay.hide)):void n.hide()},h.prototype._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},h.prototype._getConfig=function(n){return n=t.extend({},this.constructor.Default,t(this.element).data(),n),n.delay&&"number"==typeof n.delay&&(n.delay={show:n.delay,hide:n.delay}),r.typeCheckConfig(e,n,this.constructor.DefaultType),n},h.prototype._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},h._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(a),o="object"===("undefined"==typeof e?"undefined":i(e))&&e;if((n||!/dispose|hide/.test(e))&&(n||(n=new h(this,o),t(this).data(a,n)),"string"==typeof e)){if(void 0===n[e])throw new Error('No method named "'+e+'"');n[e]()}})},o(h,null,[{key:"VERSION",get:function(){return s}},{key:"Default",get:function(){return d}},{key:"NAME",get:function(){return e}},{key:"DATA_KEY",get:function(){return a}},{key:"Event",get:function(){return p}},{key:"EVENT_KEY",get:function(){return l}},{key:"DefaultType",get:function(){return f}}]),h}();return t.fn[e]=I._jQueryInterface,t.fn[e].Constructor=I,t.fn[e].noConflict=function(){return t.fn[e]=h,I._jQueryInterface},I}(jQuery));(function(r){var a="popover",l="4.0.0-alpha.6",h="bs.popover",c="."+h,u=r.fn[a],d=r.extend({},s.Default,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),f=r.extend({},s.DefaultType,{content:"(string|element|function)"}),_={FADE:"fade",SHOW:"show"},g={TITLE:".popover-title",CONTENT:".popover-content"},p={HIDE:"hide"+c,HIDDEN:"hidden"+c,SHOW:"show"+c,SHOWN:"shown"+c,INSERTED:"inserted"+c,CLICK:"click"+c,FOCUSIN:"focusin"+c,FOCUSOUT:"focusout"+c,MOUSEENTER:"mouseenter"+c,MOUSELEAVE:"mouseleave"+c},m=function(s){function u(){return n(this,u),t(this,s.apply(this,arguments))}return e(u,s),u.prototype.isWithContent=function(){return this.getTitle()||this._getContent()},u.prototype.getTipElement=function(){return this.tip=this.tip||r(this.config.template)[0]},u.prototype.setContent=function(){var t=r(this.getTipElement());this.setElementContent(t.find(g.TITLE),this.getTitle()),this.setElementContent(t.find(g.CONTENT),this._getContent()),t.removeClass(_.FADE+" "+_.SHOW),this.cleanupTether()},u.prototype._getContent=function(){return this.element.getAttribute("data-content")||("function"==typeof this.config.content?this.config.content.call(this.element):this.config.content)},u._jQueryInterface=function(t){return this.each(function(){var e=r(this).data(h),n="object"===("undefined"==typeof t?"undefined":i(t))?t:null;if((e||!/destroy|hide/.test(t))&&(e||(e=new u(this,n),r(this).data(h,e)),"string"==typeof t)){if(void 0===e[t])throw new Error('No method named "'+t+'"');e[t]()}})},o(u,null,[{key:"VERSION",get:function(){return l}},{key:"Default",get:function(){return d}},{key:"NAME",get:function(){return a}},{key:"DATA_KEY",get:function(){return h}},{key:"Event",get:function(){return p}},{key:"EVENT_KEY",get:function(){return c}},{key:"DefaultType",get:function(){return f}}]),u}(s);return r.fn[a]=m._jQueryInterface,r.fn[a].Constructor=m,r.fn[a].noConflict=function(){return r.fn[a]=u,m._jQueryInterface},m})(jQuery)}(); \ No newline at end of file
diff --git a/assets/javascripts/bootstrap/alert.js b/assets/javascripts/bootstrap/alert.js
index 159afee..b332252 100644
--- a/assets/javascripts/bootstrap/alert.js
+++ b/assets/javascripts/bootstrap/alert.js
@@ -4,7 +4,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons
/**
* --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-alpha.5): alert.js
+ * Bootstrap (v4.0.0-alpha.6): alert.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -18,7 +18,7 @@ var Alert = function ($) {
*/
var NAME = 'alert';
- var VERSION = '4.0.0-alpha.5';
+ var VERSION = '4.0.0-alpha.6';
var DATA_KEY = 'bs.alert';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -38,7 +38,7 @@ var Alert = function ($) {
var ClassName = {
ALERT: 'alert',
FADE: 'fade',
- IN: 'in'
+ SHOW: 'show'
};
/**
@@ -101,14 +101,18 @@ var Alert = function ($) {
};
Alert.prototype._removeElement = function _removeElement(element) {
- $(element).removeClass(ClassName.IN);
+ var _this = this;
+
+ $(element).removeClass(ClassName.SHOW);
if (!Util.supportsTransitionEnd() || !$(element).hasClass(ClassName.FADE)) {
this._destroyElement(element);
return;
}
- $(element).one(Util.TRANSITION_END, $.proxy(this._destroyElement, this, element)).emulateTransitionEnd(TRANSITION_DURATION);
+ $(element).one(Util.TRANSITION_END, function (event) {
+ return _this._destroyElement(element, event);
+ }).emulateTransitionEnd(TRANSITION_DURATION);
};
Alert.prototype._destroyElement = function _destroyElement(element) {
diff --git a/assets/javascripts/bootstrap/button.js b/assets/javascripts/bootstrap/button.js
index 932c68f..03f787e 100644
--- a/assets/javascripts/bootstrap/button.js
+++ b/assets/javascripts/bootstrap/button.js
@@ -4,7 +4,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons
/**
* --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-alpha.5): button.js
+ * Bootstrap (v4.0.0-alpha.6): button.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -18,7 +18,7 @@ var Button = function ($) {
*/
var NAME = 'button';
- var VERSION = '4.0.0-alpha.5';
+ var VERSION = '4.0.0-alpha.6';
var DATA_KEY = 'bs.button';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -82,15 +82,15 @@ var Button = function ($) {
if (triggerChangeEvent) {
input.checked = !$(this._element).hasClass(ClassName.ACTIVE);
- $(this._element).trigger('change');
+ $(input).trigger('change');
}
input.focus();
}
- } else {
- this._element.setAttribute('aria-pressed', !$(this._element).hasClass(ClassName.ACTIVE));
}
+ this._element.setAttribute('aria-pressed', !$(this._element).hasClass(ClassName.ACTIVE));
+
if (triggerChangeEvent) {
$(this._element).toggleClass(ClassName.ACTIVE);
}
diff --git a/assets/javascripts/bootstrap/carousel.js b/assets/javascripts/bootstrap/carousel.js
index cfe5ce3..c834f67 100644
--- a/assets/javascripts/bootstrap/carousel.js
+++ b/assets/javascripts/bootstrap/carousel.js
@@ -6,7 +6,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons
/**
* --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-alpha.5): carousel.js
+ * Bootstrap (v4.0.0-alpha.6): carousel.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -20,7 +20,7 @@ var Carousel = function ($) {
*/
var NAME = 'carousel';
- var VERSION = '4.0.0-alpha.5';
+ var VERSION = '4.0.0-alpha.6';
var DATA_KEY = 'bs.carousel';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -47,7 +47,9 @@ var Carousel = function ($) {
var Direction = {
NEXT: 'next',
- PREVIOUS: 'prev'
+ PREV: 'prev',
+ LEFT: 'left',
+ RIGHT: 'right'
};
var Event = {
@@ -64,8 +66,10 @@ var Carousel = function ($) {
CAROUSEL: 'carousel',
ACTIVE: 'active',
SLIDE: 'slide',
- RIGHT: 'right',
- LEFT: 'left',
+ RIGHT: 'carousel-item-right',
+ LEFT: 'carousel-item-left',
+ NEXT: 'carousel-item-next',
+ PREV: 'carousel-item-prev',
ITEM: 'carousel-item'
};
@@ -73,7 +77,7 @@ var Carousel = function ($) {
ACTIVE: '.active',
ACTIVE_ITEM: '.active.carousel-item',
ITEM: '.carousel-item',
- NEXT_PREV: '.next, .prev',
+ NEXT_PREV: '.carousel-item-next, .carousel-item-prev',
INDICATORS: '.carousel-indicators',
DATA_SLIDE: '[data-slide], [data-slide-to]',
DATA_RIDE: '[data-ride="carousel"]'
@@ -108,9 +112,10 @@ var Carousel = function ($) {
// public
Carousel.prototype.next = function next() {
- if (!this._isSliding) {
- this._slide(Direction.NEXT);
+ if (this._isSliding) {
+ throw new Error('Carousel is sliding');
}
+ this._slide(Direction.NEXT);
};
Carousel.prototype.nextWhenVisible = function nextWhenVisible() {
@@ -121,9 +126,10 @@ var Carousel = function ($) {
};
Carousel.prototype.prev = function prev() {
- if (!this._isSliding) {
- this._slide(Direction.PREVIOUS);
+ if (this._isSliding) {
+ throw new Error('Carousel is sliding');
}
+ this._slide(Direction.PREVIOUS);
};
Carousel.prototype.pause = function pause(event) {
@@ -151,7 +157,7 @@ var Carousel = function ($) {
}
if (this._config.interval && !this._isPaused) {
- this._interval = setInterval($.proxy(document.visibilityState ? this.nextWhenVisible : this.next, this), this._config.interval);
+ this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);
}
};
@@ -207,27 +213,35 @@ var Carousel = function ($) {
};
Carousel.prototype._addEventListeners = function _addEventListeners() {
+ var _this2 = this;
+
if (this._config.keyboard) {
- $(this._element).on(Event.KEYDOWN, $.proxy(this._keydown, this));
+ $(this._element).on(Event.KEYDOWN, function (event) {
+ return _this2._keydown(event);
+ });
}
if (this._config.pause === 'hover' && !('ontouchstart' in document.documentElement)) {
- $(this._element).on(Event.MOUSEENTER, $.proxy(this.pause, this)).on(Event.MOUSELEAVE, $.proxy(this.cycle, this));
+ $(this._element).on(Event.MOUSEENTER, function (event) {
+ return _this2.pause(event);
+ }).on(Event.MOUSELEAVE, function (event) {
+ return _this2.cycle(event);
+ });
}
};
Carousel.prototype._keydown = function _keydown(event) {
- event.preventDefault();
-
if (/input|textarea/i.test(event.target.tagName)) {
return;
}
switch (event.which) {
case ARROW_LEFT_KEYCODE:
+ event.preventDefault();
this.prev();
break;
case ARROW_RIGHT_KEYCODE:
+ event.preventDefault();
this.next();
break;
default:
@@ -257,10 +271,10 @@ var Carousel = function ($) {
return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];
};
- Carousel.prototype._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, directionalClassname) {
+ Carousel.prototype._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) {
var slideEvent = $.Event(Event.SLIDE, {
relatedTarget: relatedTarget,
- direction: directionalClassname
+ direction: eventDirectionName
});
$(this._element).trigger(slideEvent);
@@ -281,21 +295,33 @@ var Carousel = function ($) {
};
Carousel.prototype._slide = function _slide(direction, element) {
- var _this2 = this;
+ var _this3 = this;
var activeElement = $(this._element).find(Selector.ACTIVE_ITEM)[0];
var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement);
var isCycling = Boolean(this._interval);
- var directionalClassName = direction === Direction.NEXT ? ClassName.LEFT : ClassName.RIGHT;
+ var directionalClassName = void 0;
+ var orderClassName = void 0;
+ var eventDirectionName = void 0;
+
+ if (direction === Direction.NEXT) {
+ directionalClassName = ClassName.LEFT;
+ orderClassName = ClassName.NEXT;
+ eventDirectionName = Direction.LEFT;
+ } else {
+ directionalClassName = ClassName.RIGHT;
+ orderClassName = ClassName.PREV;
+ eventDirectionName = Direction.RIGHT;
+ }
if (nextElement && $(nextElement).hasClass(ClassName.ACTIVE)) {
this._isSliding = false;
return;
}
- var slideEvent = this._triggerSlideEvent(nextElement, directionalClassName);
+ var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);
if (slideEvent.isDefaultPrevented()) {
return;
}
@@ -315,12 +341,12 @@ var Carousel = function ($) {
var slidEvent = $.Event(Event.SLID, {
relatedTarget: nextElement,
- direction: directionalClassName
+ direction: eventDirectionName
});
if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.SLIDE)) {
- $(nextElement).addClass(direction);
+ $(nextElement).addClass(orderClassName);
Util.reflow(nextElement);
@@ -328,16 +354,14 @@ var Carousel = function ($) {
$(nextElement).addClass(directionalClassName);
$(activeElement).one(Util.TRANSITION_END, function () {
- $(nextElement).removeClass(directionalClassName).removeClass(direction);
-
- $(nextElement).addClass(ClassName.ACTIVE);
+ $(nextElement).removeClass(directionalClassName + ' ' + orderClassName).addClass(ClassName.ACTIVE);
- $(activeElement).removeClass(ClassName.ACTIVE).removeClass(direction).removeClass(directionalClassName);
+ $(activeElement).removeClass(ClassName.ACTIVE + ' ' + orderClassName + ' ' + directionalClassName);
- _this2._isSliding = false;
+ _this3._isSliding = false;
setTimeout(function () {
- return $(_this2._element).trigger(slidEvent);
+ return $(_this3._element).trigger(slidEvent);
}, 0);
}).emulateTransitionEnd(TRANSITION_DURATION);
} else {
diff --git a/assets/javascripts/bootstrap/collapse.js b/assets/javascripts/bootstrap/collapse.js
index cd3caa7..2969a60 100644
--- a/assets/javascripts/bootstrap/collapse.js
+++ b/assets/javascripts/bootstrap/collapse.js
@@ -6,7 +6,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons
/**
* --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-alpha.5): collapse.js
+ * Bootstrap (v4.0.0-alpha.6): collapse.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -20,7 +20,7 @@ var Collapse = function ($) {
*/
var NAME = 'collapse';
- var VERSION = '4.0.0-alpha.5';
+ var VERSION = '4.0.0-alpha.6';
var DATA_KEY = 'bs.collapse';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -46,7 +46,7 @@ var Collapse = function ($) {
};
var ClassName = {
- IN: 'in',
+ SHOW: 'show',
COLLAPSE: 'collapse',
COLLAPSING: 'collapsing',
COLLAPSED: 'collapsed'
@@ -58,7 +58,7 @@ var Collapse = function ($) {
};
var Selector = {
- ACTIVES: '.card > .in, .card > .collapsing',
+ ACTIVES: '.card > .show, .card > .collapsing',
DATA_TOGGLE: '[data-toggle="collapse"]'
};
@@ -93,7 +93,7 @@ var Collapse = function ($) {
// public
Collapse.prototype.toggle = function toggle() {
- if ($(this._element).hasClass(ClassName.IN)) {
+ if ($(this._element).hasClass(ClassName.SHOW)) {
this.hide();
} else {
this.show();
@@ -103,7 +103,11 @@ var Collapse = function ($) {
Collapse.prototype.show = function show() {
var _this = this;
- if (this._isTransitioning || $(this._element).hasClass(ClassName.IN)) {
+ if (this._isTransitioning) {
+ throw new Error('Collapse is transitioning');
+ }
+
+ if ($(this._element).hasClass(ClassName.SHOW)) {
return;
}
@@ -111,7 +115,7 @@ var Collapse = function ($) {
var activesData = void 0;
if (this._parent) {
- actives = $.makeArray($(Selector.ACTIVES));
+ actives = $.makeArray($(this._parent).find(Selector.ACTIVES));
if (!actives.length) {
actives = null;
}
@@ -151,7 +155,7 @@ var Collapse = function ($) {
this.setTransitioning(true);
var complete = function complete() {
- $(_this._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.IN);
+ $(_this._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.SHOW);
_this._element.style[dimension] = '';
@@ -176,7 +180,11 @@ var Collapse = function ($) {
Collapse.prototype.hide = function hide() {
var _this2 = this;
- if (this._isTransitioning || !$(this._element).hasClass(ClassName.IN)) {
+ if (this._isTransitioning) {
+ throw new Error('Collapse is transitioning');
+ }
+
+ if (!$(this._element).hasClass(ClassName.SHOW)) {
return;
}
@@ -193,7 +201,7 @@ var Collapse = function ($) {
Util.reflow(this._element);
- $(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.IN);
+ $(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.SHOW);
this._element.setAttribute('aria-expanded', false);
@@ -261,7 +269,7 @@ var Collapse = function ($) {
Collapse.prototype._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {
if (element) {
- var isOpen = $(element).hasClass(ClassName.IN);
+ var isOpen = $(element).hasClass(ClassName.SHOW);
element.setAttribute('aria-expanded', isOpen);
if (triggerArray.length) {
diff --git a/assets/javascripts/bootstrap/dropdown.js b/assets/javascripts/bootstrap/dropdown.js
index 0f53f14..87fa677 100644
--- a/assets/javascripts/bootstrap/dropdown.js
+++ b/assets/javascripts/bootstrap/dropdown.js
@@ -4,7 +4,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons
/**
* --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-alpha.5): dropdown.js
+ * Bootstrap (v4.0.0-alpha.6): dropdown.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -18,7 +18,7 @@ var Dropdown = function ($) {
*/
var NAME = 'dropdown';
- var VERSION = '4.0.0-alpha.5';
+ var VERSION = '4.0.0-alpha.6';
var DATA_KEY = 'bs.dropdown';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -35,13 +35,14 @@ var Dropdown = function ($) {
SHOWN: 'shown' + EVENT_KEY,
CLICK: 'click' + EVENT_KEY,
CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY,
+ FOCUSIN_DATA_API: 'focusin' + EVENT_KEY + DATA_API_KEY,
KEYDOWN_DATA_API: 'keydown' + EVENT_KEY + DATA_API_KEY
};
var ClassName = {
BACKDROP: 'dropdown-backdrop',
DISABLED: 'disabled',
- OPEN: 'open'
+ SHOW: 'show'
};
var Selector = {
@@ -79,7 +80,7 @@ var Dropdown = function ($) {
}
var parent = Dropdown._getParentFromElement(this);
- var isActive = $(parent).hasClass(ClassName.OPEN);
+ var isActive = $(parent).hasClass(ClassName.SHOW);
Dropdown._clearMenus();
@@ -96,7 +97,9 @@ var Dropdown = function ($) {
$(dropdown).on('click', Dropdown._clearMenus);
}
- var relatedTarget = { relatedTarget: this };
+ var relatedTarget = {
+ relatedTarget: this
+ };
var showEvent = $.Event(Event.SHOW, relatedTarget);
$(parent).trigger(showEvent);
@@ -106,9 +109,9 @@ var Dropdown = function ($) {
}
this.focus();
- this.setAttribute('aria-expanded', 'true');
+ this.setAttribute('aria-expanded', true);
- $(parent).toggleClass(ClassName.OPEN);
+ $(parent).toggleClass(ClassName.SHOW);
$(parent).trigger($.Event(Event.SHOWN, relatedTarget));
return false;
@@ -133,7 +136,8 @@ var Dropdown = function ($) {
var data = $(this).data(DATA_KEY);
if (!data) {
- $(this).data(DATA_KEY, data = new Dropdown(this));
+ data = new Dropdown(this);
+ $(this).data(DATA_KEY, data);
}
if (typeof config === 'string') {
@@ -159,13 +163,15 @@ var Dropdown = function ($) {
for (var i = 0; i < toggles.length; i++) {
var parent = Dropdown._getParentFromElement(toggles[i]);
- var relatedTarget = { relatedTarget: toggles[i] };
+ var relatedTarget = {
+ relatedTarget: toggles[i]
+ };
- if (!$(parent).hasClass(ClassName.OPEN)) {
+ if (!$(parent).hasClass(ClassName.SHOW)) {
continue;
}
- if (event && event.type === 'click' && /input|textarea/i.test(event.target.tagName) && $.contains(parent, event.target)) {
+ if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'focusin') && $.contains(parent, event.target)) {
continue;
}
@@ -177,7 +183,7 @@ var Dropdown = function ($) {
toggles[i].setAttribute('aria-expanded', 'false');
- $(parent).removeClass(ClassName.OPEN).trigger($.Event(Event.HIDDEN, relatedTarget));
+ $(parent).removeClass(ClassName.SHOW).trigger($.Event(Event.HIDDEN, relatedTarget));
}
};
@@ -205,7 +211,7 @@ var Dropdown = function ($) {
}
var parent = Dropdown._getParentFromElement(this);
- var isActive = $(parent).hasClass(ClassName.OPEN);
+ var isActive = $(parent).hasClass(ClassName.SHOW);
if (!isActive && event.which !== ESCAPE_KEYCODE || isActive && event.which === ESCAPE_KEYCODE) {
@@ -218,11 +224,7 @@ var Dropdown = function ($) {
return;
}
- var items = $.makeArray($(Selector.VISIBLE_ITEMS));
-
- items = items.filter(function (item) {
- return item.offsetWidth || item.offsetHeight;
- });
+ var items = $(parent).find(Selector.VISIBLE_ITEMS).get();
if (!items.length) {
return;
@@ -263,7 +265,7 @@ var Dropdown = function ($) {
* ------------------------------------------------------------------------
*/
- $(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) {
+ $(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 + ' ' + Event.FOCUSIN_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) {
e.stopPropagation();
});
diff --git a/assets/javascripts/bootstrap/modal.js b/assets/javascripts/bootstrap/modal.js
index f2e2f74..c6113e9 100644
--- a/assets/javascripts/bootstrap/modal.js
+++ b/assets/javascripts/bootstrap/modal.js
@@ -6,7 +6,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons
/**
* --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-alpha.5): modal.js
+ * Bootstrap (v4.0.0-alpha.6): modal.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -20,7 +20,7 @@ var Modal = function ($) {
*/
var NAME = 'modal';
- var VERSION = '4.0.0-alpha.5';
+ var VERSION = '4.0.0-alpha.6';
var DATA_KEY = 'bs.modal';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -62,14 +62,14 @@ var Modal = function ($) {
BACKDROP: 'modal-backdrop',
OPEN: 'modal-open',
FADE: 'fade',
- IN: 'in'
+ SHOW: 'show'
};
var Selector = {
DIALOG: '.modal-dialog',
DATA_TOGGLE: '[data-toggle="modal"]',
DATA_DISMISS: '[data-dismiss="modal"]',
- FIXED_CONTENT: '.navbar-fixed-top, .navbar-fixed-bottom, .is-fixed'
+ FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'
};
/**
@@ -89,6 +89,7 @@ var Modal = function ($) {
this._isShown = false;
this._isBodyOverflowing = false;
this._ignoreBackdropClick = false;
+ this._isTransitioning = false;
this._originalBodyPadding = 0;
this._scrollbarWidth = 0;
}
@@ -104,6 +105,13 @@ var Modal = function ($) {
Modal.prototype.show = function show(relatedTarget) {
var _this = this;
+ if (this._isTransitioning) {
+ throw new Error('Modal is transitioning');
+ }
+
+ if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE)) {
+ this._isTransitioning = true;
+ }
var showEvent = $.Event(Event.SHOW, {
relatedTarget: relatedTarget
});
@@ -124,7 +132,9 @@ var Modal = function ($) {
this._setEscapeEvent();
this._setResizeEvent();
- $(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, $.proxy(this.hide, this));
+ $(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, function (event) {
+ return _this.hide(event);
+ });
$(this._dialog).on(Event.MOUSEDOWN_DISMISS, function () {
$(_this._element).one(Event.MOUSEUP_DISMISS, function (event) {
@@ -134,16 +144,28 @@ var Modal = function ($) {
});
});
- this._showBackdrop($.proxy(this._showElement, this, relatedTarget));
+ this._showBackdrop(function () {
+ return _this._showElement(relatedTarget);
+ });
};
Modal.prototype.hide = function hide(event) {
+ var _this2 = this;
+
if (event) {
event.preventDefault();
}
- var hideEvent = $.Event(Event.HIDE);
+ if (this._isTransitioning) {
+ throw new Error('Modal is transitioning');
+ }
+
+ var transition = Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE);
+ if (transition) {
+ this._isTransitioning = true;
+ }
+ var hideEvent = $.Event(Event.HIDE);
$(this._element).trigger(hideEvent);
if (!this._isShown || hideEvent.isDefaultPrevented()) {
@@ -157,14 +179,15 @@ var Modal = function ($) {
$(document).off(Event.FOCUSIN);
- $(this._element).removeClass(ClassName.IN);
+ $(this._element).removeClass(ClassName.SHOW);
$(this._element).off(Event.CLICK_DISMISS);
$(this._dialog).off(Event.MOUSEDOWN_DISMISS);
- if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE)) {
-
- $(this._element).one(Util.TRANSITION_END, $.proxy(this._hideModal, this)).emulateTransitionEnd(TRANSITION_DURATION);
+ if (transition) {
+ $(this._element).one(Util.TRANSITION_END, function (event) {
+ return _this2._hideModal(event);
+ }).emulateTransitionEnd(TRANSITION_DURATION);
} else {
this._hideModal();
}
@@ -173,10 +196,7 @@ var Modal = function ($) {
Modal.prototype.dispose = function dispose() {
$.removeData(this._element, DATA_KEY);
- $(window).off(EVENT_KEY);
- $(document).off(EVENT_KEY);
- $(this._element).off(EVENT_KEY);
- $(this._backdrop).off(EVENT_KEY);
+ $(window, document, this._element, this._backdrop).off(EVENT_KEY);
this._config = null;
this._element = null;
@@ -198,7 +218,7 @@ var Modal = function ($) {
};
Modal.prototype._showElement = function _showElement(relatedTarget) {
- var _this2 = this;
+ var _this3 = this;
var transition = Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE);
@@ -215,7 +235,7 @@ var Modal = function ($) {
Util.reflow(this._element);
}
- $(this._element).addClass(ClassName.IN);
+ $(this._element).addClass(ClassName.SHOW);
if (this._config.focus) {
this._enforceFocus();
@@ -226,10 +246,11 @@ var Modal = function ($) {
});
var transitionComplete = function transitionComplete() {
- if (_this2._config.focus) {
- _this2._element.focus();
+ if (_this3._config.focus) {
+ _this3._element.focus();
}
- $(_this2._element).trigger(shownEvent);
+ _this3._isTransitioning = false;
+ $(_this3._element).trigger(shownEvent);
};
if (transition) {
@@ -240,23 +261,23 @@ var Modal = function ($) {
};
Modal.prototype._enforceFocus = function _enforceFocus() {
- var _this3 = this;
+ var _this4 = this;
$(document).off(Event.FOCUSIN) // guard against infinite focus loop
.on(Event.FOCUSIN, function (event) {
- if (document !== event.target && _this3._element !== event.target && !$(_this3._element).has(event.target).length) {
- _this3._element.focus();
+ if (document !== event.target && _this4._element !== event.target && !$(_this4._element).has(event.target).length) {
+ _this4._element.focus();
}
});
};
Modal.prototype._setEscapeEvent = function _setEscapeEvent() {
- var _this4 = this;
+ var _this5 = this;
if (this._isShown && this._config.keyboard) {
$(this._element).on(Event.KEYDOWN_DISMISS, function (event) {
if (event.which === ESCAPE_KEYCODE) {
- _this4.hide();
+ _this5.hide();
}
});
} else if (!this._isShown) {
@@ -265,23 +286,28 @@ var Modal = function ($) {
};
Modal.prototype._setResizeEvent = function _setResizeEvent() {
+ var _this6 = this;
+
if (this._isShown) {
- $(window).on(Event.RESIZE, $.proxy(this._handleUpdate, this));
+ $(window).on(Event.RESIZE, function (event) {
+ return _this6._handleUpdate(event);
+ });
} else {
$(window).off(Event.RESIZE);
}
};
Modal.prototype._hideModal = function _hideModal() {
- var _this5 = this;
+ var _this7 = this;
this._element.style.display = 'none';
this._element.setAttribute('aria-hidden', 'true');
+ this._isTransitioning = false;
this._showBackdrop(function () {
$(document.body).removeClass(ClassName.OPEN);
- _this5._resetAdjustments();
- _this5._resetScrollbar();
- $(_this5._element).trigger(Event.HIDDEN);
+ _this7._resetAdjustments();
+ _this7._resetScrollbar();
+ $(_this7._element).trigger(Event.HIDDEN);
});
};
@@ -293,7 +319,7 @@ var Modal = function ($) {
};
Modal.prototype._showBackdrop = function _showBackdrop(callback) {
- var _this6 = this;
+ var _this8 = this;
var animate = $(this._element).hasClass(ClassName.FADE) ? ClassName.FADE : '';
@@ -310,17 +336,17 @@ var Modal = function ($) {
$(this._backdrop).appendTo(document.body);
$(this._element).on(Event.CLICK_DISMISS, function (event) {
- if (_this6._ignoreBackdropClick) {
- _this6._ignoreBackdropClick = false;
+ if (_this8._ignoreBackdropClick) {
+ _this8._ignoreBackdropClick = false;
return;
}
if (event.target !== event.currentTarget) {
return;
}
- if (_this6._config.backdrop === 'static') {
- _this6._element.focus();
+ if (_this8._config.backdrop === 'static') {
+ _this8._element.focus();
} else {
- _this6.hide();
+ _this8.hide();
}
});
@@ -328,7 +354,7 @@ var Modal = function ($) {
Util.reflow(this._backdrop);
}
- $(this._backdrop).addClass(ClassName.IN);
+ $(this._backdrop).addClass(ClassName.SHOW);
if (!callback) {
return;
@@ -341,10 +367,10 @@ var Modal = function ($) {
$(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(BACKDROP_TRANSITION_DURATION);
} else if (!this._isShown && this._backdrop) {
- $(this._backdrop).removeClass(ClassName.IN);
+ $(this._backdrop).removeClass(ClassName.SHOW);
var callbackRemove = function callbackRemove() {
- _this6._removeBackdrop();
+ _this8._removeBackdrop();
if (callback) {
callback();
}
@@ -460,7 +486,7 @@ var Modal = function ($) {
*/
$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
- var _this7 = this;
+ var _this9 = this;
var target = void 0;
var selector = Util.getSelectorFromElement(this);
@@ -471,7 +497,7 @@ var Modal = function ($) {
var config = $(target).data(DATA_KEY) ? 'toggle' : $.extend({}, $(target).data(), $(this).data());
- if (this.tagName === 'A') {
+ if (this.tagName === 'A' || this.tagName === 'AREA') {
event.preventDefault();
}
@@ -482,8 +508,8 @@ var Modal = function ($) {
}
$target.one(Event.HIDDEN, function () {
- if ($(_this7).is(':visible')) {
- _this7.focus();
+ if ($(_this9).is(':visible')) {
+ _this9.focus();
}
});
});
diff --git a/assets/javascripts/bootstrap/popover.js b/assets/javascripts/bootstrap/popover.js
index 84efc68..5ca8c0c 100644
--- a/assets/javascripts/bootstrap/popover.js
+++ b/assets/javascripts/bootstrap/popover.js
@@ -10,7 +10,7 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function"
/**
* --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-alpha.5): popover.js
+ * Bootstrap (v4.0.0-alpha.6): popover.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -24,7 +24,7 @@ var Popover = function ($) {
*/
var NAME = 'popover';
- var VERSION = '4.0.0-alpha.5';
+ var VERSION = '4.0.0-alpha.6';
var DATA_KEY = 'bs.popover';
var EVENT_KEY = '.' + DATA_KEY;
var JQUERY_NO_CONFLICT = $.fn[NAME];
@@ -42,7 +42,7 @@ var Popover = function ($) {
var ClassName = {
FADE: 'fade',
- IN: 'in'
+ SHOW: 'show'
};
var Selector = {
@@ -95,7 +95,7 @@ var Popover = function ($) {
this.setElementContent($tip.find(Selector.TITLE), this.getTitle());
this.setElementContent($tip.find(Selector.CONTENT), this._getContent());
- $tip.removeClass(ClassName.FADE).removeClass(ClassName.IN);
+ $tip.removeClass(ClassName.FADE + ' ' + ClassName.SHOW);
this.cleanupTether();
};
diff --git a/assets/javascripts/bootstrap/scrollspy.js b/assets/javascripts/bootstrap/scrollspy.js
index d5e4588..e2ee2e3 100644
--- a/assets/javascripts/bootstrap/scrollspy.js
+++ b/assets/javascripts/bootstrap/scrollspy.js
@@ -6,7 +6,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons
/**
* --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-alpha.5): scrollspy.js
+ * Bootstrap (v4.0.0-alpha.6): scrollspy.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -20,7 +20,7 @@ var ScrollSpy = function ($) {
*/
var NAME = 'scrollspy';
- var VERSION = '4.0.0-alpha.5';
+ var VERSION = '4.0.0-alpha.6';
var DATA_KEY = 'bs.scrollspy';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -77,6 +77,8 @@ var ScrollSpy = function ($) {
var ScrollSpy = function () {
function ScrollSpy(element, config) {
+ var _this = this;
+
_classCallCheck(this, ScrollSpy);
this._element = element;
@@ -88,7 +90,9 @@ var ScrollSpy = function ($) {
this._activeTarget = null;
this._scrollHeight = 0;
- $(this._scrollElement).on(Event.SCROLL, $.proxy(this._process, this));
+ $(this._scrollElement).on(Event.SCROLL, function (event) {
+ return _this._process(event);
+ });
this.refresh();
this._process();
@@ -99,7 +103,7 @@ var ScrollSpy = function ($) {
// public
ScrollSpy.prototype.refresh = function refresh() {
- var _this = this;
+ var _this2 = this;
var autoMethod = this._scrollElement !== this._scrollElement.window ? OffsetMethod.POSITION : OffsetMethod.OFFSET;
@@ -132,8 +136,8 @@ var ScrollSpy = function ($) {
}).sort(function (a, b) {
return a[0] - b[0];
}).forEach(function (item) {
- _this._offsets.push(item[0]);
- _this._targets.push(item[1]);
+ _this2._offsets.push(item[0]);
+ _this2._targets.push(item[1]);
});
};
@@ -171,17 +175,21 @@ var ScrollSpy = function ($) {
};
ScrollSpy.prototype._getScrollTop = function _getScrollTop() {
- return this._scrollElement === window ? this._scrollElement.scrollY : this._scrollElement.scrollTop;
+ return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;
};
ScrollSpy.prototype._getScrollHeight = function _getScrollHeight() {
return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);
};
+ ScrollSpy.prototype._getOffsetHeight = function _getOffsetHeight() {
+ return this._scrollElement === window ? window.innerHeight : this._scrollElement.offsetHeight;
+ };
+
ScrollSpy.prototype._process = function _process() {
var scrollTop = this._getScrollTop() + this._config.offset;
var scrollHeight = this._getScrollHeight();
- var maxScroll = this._config.offset + scrollHeight - this._scrollElement.offsetHeight;
+ var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();
if (this._scrollHeight !== scrollHeight) {
this.refresh();
@@ -193,9 +201,10 @@ var ScrollSpy = function ($) {
if (this._activeTarget !== target) {
this._activate(target);
}
+ return;
}
- if (this._activeTarget && scrollTop < this._offsets[0]) {
+ if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {
this._activeTarget = null;
this._clear();
return;
@@ -228,7 +237,7 @@ var ScrollSpy = function ($) {
} else {
// todo (fat) this is kinda sus...
// recursively add actives to tested nav-links
- $link.parents(Selector.LI).find(Selector.NAV_LINKS).addClass(ClassName.ACTIVE);
+ $link.parents(Selector.LI).find('> ' + Selector.NAV_LINKS).addClass(ClassName.ACTIVE);
}
$(this._scrollElement).trigger(Event.ACTIVATE, {
@@ -245,7 +254,7 @@ var ScrollSpy = function ($) {
ScrollSpy._jQueryInterface = function _jQueryInterface(config) {
return this.each(function () {
var data = $(this).data(DATA_KEY);
- var _config = (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' && config || null;
+ var _config = (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' && config;
if (!data) {
data = new ScrollSpy(this, _config);
diff --git a/assets/javascripts/bootstrap/tab.js b/assets/javascripts/bootstrap/tab.js
index a38f48b..ba1b9c1 100644
--- a/assets/javascripts/bootstrap/tab.js
+++ b/assets/javascripts/bootstrap/tab.js
@@ -4,7 +4,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons
/**
* --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-alpha.5): tab.js
+ * Bootstrap (v4.0.0-alpha.6): tab.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -18,7 +18,7 @@ var Tab = function ($) {
*/
var NAME = 'tab';
- var VERSION = '4.0.0-alpha.5';
+ var VERSION = '4.0.0-alpha.6';
var DATA_KEY = 'bs.tab';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -36,15 +36,16 @@ var Tab = function ($) {
var ClassName = {
DROPDOWN_MENU: 'dropdown-menu',
ACTIVE: 'active',
+ DISABLED: 'disabled',
FADE: 'fade',
- IN: 'in'
+ SHOW: 'show'
};
var Selector = {
A: 'a',
LI: 'li',
DROPDOWN: '.dropdown',
- UL: 'ul:not(.dropdown-menu)',
+ LIST: 'ul:not(.dropdown-menu), ol:not(.dropdown-menu), nav:not(.dropdown-menu)',
FADE_CHILD: '> .nav-item .fade, > .fade',
ACTIVE: '.active',
ACTIVE_CHILD: '> .nav-item > .active, > .active',
@@ -73,17 +74,17 @@ var Tab = function ($) {
Tab.prototype.show = function show() {
var _this = this;
- if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $(this._element).hasClass(ClassName.ACTIVE)) {
+ if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $(this._element).hasClass(ClassName.ACTIVE) || $(this._element).hasClass(ClassName.DISABLED)) {
return;
}
var target = void 0;
var previous = void 0;
- var ulElement = $(this._element).closest(Selector.UL)[0];
+ var listElement = $(this._element).closest(Selector.LIST)[0];
var selector = Util.getSelectorFromElement(this._element);
- if (ulElement) {
- previous = $.makeArray($(ulElement).find(Selector.ACTIVE));
+ if (listElement) {
+ previous = $.makeArray($(listElement).find(Selector.ACTIVE));
previous = previous[previous.length - 1];
}
@@ -109,7 +110,7 @@ var Tab = function ($) {
target = $(selector)[0];
}
- this._activate(this._element, ulElement);
+ this._activate(this._element, listElement);
var complete = function complete() {
var hiddenEvent = $.Event(Event.HIDDEN, {
@@ -139,10 +140,14 @@ var Tab = function ($) {
// private
Tab.prototype._activate = function _activate(element, container, callback) {
+ var _this2 = this;
+
var active = $(container).find(Selector.ACTIVE_CHILD)[0];
var isTransitioning = callback && Util.supportsTransitionEnd() && (active && $(active).hasClass(ClassName.FADE) || Boolean($(container).find(Selector.FADE_CHILD)[0]));
- var complete = $.proxy(this._transitionComplete, this, element, active, isTransitioning, callback);
+ var complete = function complete() {
+ return _this2._transitionComplete(element, active, isTransitioning, callback);
+ };
if (active && isTransitioning) {
$(active).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
@@ -151,7 +156,7 @@ var Tab = function ($) {
}
if (active) {
- $(active).removeClass(ClassName.IN);
+ $(active).removeClass(ClassName.SHOW);
}
};
@@ -159,7 +164,7 @@ var Tab = function ($) {
if (active) {
$(active).removeClass(ClassName.ACTIVE);
- var dropdownChild = $(active).find(Selector.DROPDOWN_ACTIVE_CHILD)[0];
+ var dropdownChild = $(active.parentNode).find(Selector.DROPDOWN_ACTIVE_CHILD)[0];
if (dropdownChild) {
$(dropdownChild).removeClass(ClassName.ACTIVE);
@@ -173,7 +178,7 @@ var Tab = function ($) {
if (isTransitioning) {
Util.reflow(element);
- $(element).addClass(ClassName.IN);
+ $(element).addClass(ClassName.SHOW);
} else {
$(element).removeClass(ClassName.FADE);
}
@@ -201,7 +206,7 @@ var Tab = function ($) {
var data = $this.data(DATA_KEY);
if (!data) {
- data = data = new Tab(this);
+ data = new Tab(this);
$this.data(DATA_KEY, data);
}
diff --git a/assets/javascripts/bootstrap/tooltip.js b/assets/javascripts/bootstrap/tooltip.js
index 2d3f6b4..d261eab 100644
--- a/assets/javascripts/bootstrap/tooltip.js
+++ b/assets/javascripts/bootstrap/tooltip.js
@@ -6,7 +6,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons
/**
* --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-alpha.5): tooltip.js
+ * Bootstrap (v4.0.0-alpha.6): tooltip.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -17,7 +17,7 @@ var Tooltip = function ($) {
* Check for Tether dependency
* Tether - http://tether.io/
*/
- if (window.Tether === undefined) {
+ if (typeof Tether === 'undefined') {
throw new Error('Bootstrap tooltips require Tether (http://tether.io/)');
}
@@ -28,7 +28,7 @@ var Tooltip = function ($) {
*/
var NAME = 'tooltip';
- var VERSION = '4.0.0-alpha.5';
+ var VERSION = '4.0.0-alpha.6';
var DATA_KEY = 'bs.tooltip';
var EVENT_KEY = '.' + DATA_KEY;
var JQUERY_NO_CONFLICT = $.fn[NAME];
@@ -45,7 +45,8 @@ var Tooltip = function ($) {
selector: false,
placement: 'top',
offset: '0 0',
- constraints: []
+ constraints: [],
+ container: false
};
var DefaultType = {
@@ -58,7 +59,8 @@ var Tooltip = function ($) {
selector: '(string|boolean)',
placement: '(string|function)',
offset: 'string',
- constraints: 'array'
+ constraints: 'array',
+ container: '(string|element|boolean)'
};
var AttachmentMap = {
@@ -69,7 +71,7 @@ var Tooltip = function ($) {
};
var HoverState = {
- IN: 'in',
+ SHOW: 'show',
OUT: 'out'
};
@@ -88,7 +90,7 @@ var Tooltip = function ($) {
var ClassName = {
FADE: 'fade',
- IN: 'in'
+ SHOW: 'show'
};
var Selector = {
@@ -123,6 +125,7 @@ var Tooltip = function ($) {
this._timeout = 0;
this._hoverState = '';
this._activeTrigger = {};
+ this._isTransitioning = false;
this._tether = null;
// protected
@@ -168,7 +171,7 @@ var Tooltip = function ($) {
}
} else {
- if ($(this.getTipElement()).hasClass(ClassName.IN)) {
+ if ($(this.getTipElement()).hasClass(ClassName.SHOW)) {
this._leave(null, this);
return;
}
@@ -185,6 +188,7 @@ var Tooltip = function ($) {
$.removeData(this.element, this.constructor.DATA_KEY);
$(this.element).off(this.constructor.EVENT_KEY);
+ $(this.element).closest('.modal').off('hide.bs.modal');
if (this.tip) {
$(this.tip).remove();
@@ -204,9 +208,15 @@ var Tooltip = function ($) {
Tooltip.prototype.show = function show() {
var _this = this;
- var showEvent = $.Event(this.constructor.Event.SHOW);
+ if ($(this.element).css('display') === 'none') {
+ throw new Error('Please use show on visible elements');
+ }
+ var showEvent = $.Event(this.constructor.Event.SHOW);
if (this.isWithContent() && this._isEnabled) {
+ if (this._isTransitioning) {
+ throw new Error('Tooltip is transitioning');
+ }
$(this.element).trigger(showEvent);
var isInTheDom = $.contains(this.element.ownerDocument.documentElement, this.element);
@@ -231,7 +241,9 @@ var Tooltip = function ($) {
var attachment = this._getAttachment(placement);
- $(tip).data(this.constructor.DATA_KEY, this).appendTo(document.body);
+ var container = this.config.container === false ? document.body : $(this.config.container);
+
+ $(tip).data(this.constructor.DATA_KEY, this).appendTo(container);
$(this.element).trigger(this.constructor.Event.INSERTED);
@@ -249,11 +261,12 @@ var Tooltip = function ($) {
Util.reflow(tip);
this._tether.position();
- $(tip).addClass(ClassName.IN);
+ $(tip).addClass(ClassName.SHOW);
var complete = function complete() {
var prevHoverState = _this._hoverState;
_this._hoverState = null;
+ _this._isTransitioning = false;
$(_this.element).trigger(_this.constructor.Event.SHOWN);
@@ -263,6 +276,7 @@ var Tooltip = function ($) {
};
if (Util.supportsTransitionEnd() && $(this.tip).hasClass(ClassName.FADE)) {
+ this._isTransitioning = true;
$(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(Tooltip._TRANSITION_DURATION);
return;
}
@@ -276,13 +290,17 @@ var Tooltip = function ($) {
var tip = this.getTipElement();
var hideEvent = $.Event(this.constructor.Event.HIDE);
+ if (this._isTransitioning) {
+ throw new Error('Tooltip is transitioning');
+ }
var complete = function complete() {
- if (_this2._hoverState !== HoverState.IN && tip.parentNode) {
+ if (_this2._hoverState !== HoverState.SHOW && tip.parentNode) {
tip.parentNode.removeChild(tip);
}
_this2.element.removeAttribute('aria-describedby');
$(_this2.element).trigger(_this2.constructor.Event.HIDDEN);
+ _this2._isTransitioning = false;
_this2.cleanupTether();
if (callback) {
@@ -296,10 +314,14 @@ var Tooltip = function ($) {
return;
}
- $(tip).removeClass(ClassName.IN);
+ $(tip).removeClass(ClassName.SHOW);
- if (Util.supportsTransitionEnd() && $(this.tip).hasClass(ClassName.FADE)) {
+ this._activeTrigger[Trigger.CLICK] = false;
+ this._activeTrigger[Trigger.FOCUS] = false;
+ this._activeTrigger[Trigger.HOVER] = false;
+ if (Util.supportsTransitionEnd() && $(this.tip).hasClass(ClassName.FADE)) {
+ this._isTransitioning = true;
$(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
} else {
complete();
@@ -323,7 +345,7 @@ var Tooltip = function ($) {
this.setElementContent($tip.find(Selector.TOOLTIP_INNER), this.getTitle());
- $tip.removeClass(ClassName.FADE).removeClass(ClassName.IN);
+ $tip.removeClass(ClassName.FADE + ' ' + ClassName.SHOW);
this.cleanupTether();
};
@@ -373,13 +395,23 @@ var Tooltip = function ($) {
triggers.forEach(function (trigger) {
if (trigger === 'click') {
- $(_this3.element).on(_this3.constructor.Event.CLICK, _this3.config.selector, $.proxy(_this3.toggle, _this3));
+ $(_this3.element).on(_this3.constructor.Event.CLICK, _this3.config.selector, function (event) {
+ return _this3.toggle(event);
+ });
} else if (trigger !== Trigger.MANUAL) {
var eventIn = trigger === Trigger.HOVER ? _this3.constructor.Event.MOUSEENTER : _this3.constructor.Event.FOCUSIN;
var eventOut = trigger === Trigger.HOVER ? _this3.constructor.Event.MOUSELEAVE : _this3.constructor.Event.FOCUSOUT;
- $(_this3.element).on(eventIn, _this3.config.selector, $.proxy(_this3._enter, _this3)).on(eventOut, _this3.config.selector, $.proxy(_this3._leave, _this3));
+ $(_this3.element).on(eventIn, _this3.config.selector, function (event) {
+ return _this3._enter(event);
+ }).on(eventOut, _this3.config.selector, function (event) {
+ return _this3._leave(event);
+ });
}
+
+ $(_this3.element).closest('.modal').on('hide.bs.modal', function () {
+ return _this3.hide();
+ });
});
if (this.config.selector) {
@@ -414,14 +446,14 @@ var Tooltip = function ($) {
context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true;
}
- if ($(context.getTipElement()).hasClass(ClassName.IN) || context._hoverState === HoverState.IN) {
- context._hoverState = HoverState.IN;
+ if ($(context.getTipElement()).hasClass(ClassName.SHOW) || context._hoverState === HoverState.SHOW) {
+ context._hoverState = HoverState.SHOW;
return;
}
clearTimeout(context._timeout);
- context._hoverState = HoverState.IN;
+ context._hoverState = HoverState.SHOW;
if (!context.config.delay || !context.config.delay.show) {
context.show();
@@ -429,7 +461,7 @@ var Tooltip = function ($) {
}
context._timeout = setTimeout(function () {
- if (context._hoverState === HoverState.IN) {
+ if (context._hoverState === HoverState.SHOW) {
context.show();
}
}, context.config.delay.show);
@@ -513,7 +545,7 @@ var Tooltip = function ($) {
Tooltip._jQueryInterface = function _jQueryInterface(config) {
return this.each(function () {
var data = $(this).data(DATA_KEY);
- var _config = (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' ? config : null;
+ var _config = (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' && config;
if (!data && /dispose|hide/.test(config)) {
return;
diff --git a/assets/javascripts/bootstrap/util.js b/assets/javascripts/bootstrap/util.js
index 6bb47a7..890b05d 100644
--- a/assets/javascripts/bootstrap/util.js
+++ b/assets/javascripts/bootstrap/util.js
@@ -1,6 +1,6 @@
/**
* --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-alpha.5): util.js
+ * Bootstrap (v4.0.0-alpha.6): util.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -55,7 +55,9 @@ var Util = function ($) {
for (var name in TransitionEndEvent) {
if (el.style[name] !== undefined) {
- return { end: TransitionEndEvent[name] };
+ return {
+ end: TransitionEndEvent[name]
+ };
}
}
@@ -102,9 +104,8 @@ var Util = function ($) {
getUID: function getUID(prefix) {
do {
- /* eslint-disable no-bitwise */
+ // eslint-disable-next-line no-bitwise
prefix += ~~(Math.random() * MAX_UID); // "~~" acts like a faster Math.floor() here
- /* eslint-enable no-bitwise */
} while (document.getElementById(prefix));
return prefix;
},
@@ -119,7 +120,7 @@ var Util = function ($) {
return selector;
},
reflow: function reflow(element) {
- new Function('bs', 'return bs')(element.offsetHeight);
+ return element.offsetHeight;
},
triggerTransitionEnd: function triggerTransitionEnd(element) {
$(element).trigger(transition.end);
@@ -132,13 +133,7 @@ var Util = function ($) {
if (configTypes.hasOwnProperty(property)) {
var expectedTypes = configTypes[property];
var value = config[property];
- var valueType = void 0;
-
- if (value && isElement(value)) {
- valueType = 'element';
- } else {
- valueType = toType(value);
- }
+ var valueType = value && isElement(value) ? 'element' : toType(value);
if (!new RegExp(expectedTypes).test(valueType)) {
throw new Error(componentName.toUpperCase() + ': ' + ('Option "' + property + '" provided type "' + valueType + '" ') + ('but expected type "' + expectedTypes + '".'));
diff --git a/assets/stylesheets/_bootstrap-flex.scss b/assets/stylesheets/_bootstrap-flex.scss
deleted file mode 100644
index 60dd03a..0000000
--- a/assets/stylesheets/_bootstrap-flex.scss
+++ /dev/null
@@ -1,8 +0,0 @@
-// Bootstrap with Flexbox enabled
-//
-// Includes all the imports from the standard Bootstrap project, but enables
-// the flexbox variable.
-
-$enable-flex: true;
-
-@import "bootstrap";
diff --git a/assets/stylesheets/_bootstrap-grid.scss b/assets/stylesheets/_bootstrap-grid.scss
index b132ee0..4c57cc6 100644
--- a/assets/stylesheets/_bootstrap-grid.scss
+++ b/assets/stylesheets/_bootstrap-grid.scss
@@ -1,14 +1,32 @@
// Bootstrap Grid only
//
-// Includes relevant variables and mixins for the regular (non-flexbox) grid
-// system, as well as the generated predefined classes (e.g., `.col-4-sm`).
+// Includes relevant variables and mixins for the flexbox grid
+// system, as well as the generated predefined classes (e.g., `.col-sm-4`).
+
+//
+// Box sizing, responsive, and more
+//
+
+@at-root {
+ @-ms-viewport { width: device-width; }
+}
+
+html {
+ box-sizing: border-box;
+ -ms-overflow-style: scrollbar;
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: inherit;
+}
//
// Variables
//
-@import "bootstrap/custom";
@import "bootstrap/variables";
//
@@ -20,4 +38,6 @@
@import "bootstrap/mixins/grid-framework";
@import "bootstrap/mixins/grid";
+@import "bootstrap/custom";
+
@import "bootstrap/grid";
diff --git a/assets/stylesheets/_bootstrap-reboot.scss b/assets/stylesheets/_bootstrap-reboot.scss
index cbba413..2c8a185 100644
--- a/assets/stylesheets/_bootstrap-reboot.scss
+++ b/assets/stylesheets/_bootstrap-reboot.scss
@@ -2,10 +2,9 @@
//
// Includes only Normalize and our custom Reboot reset.
-@import "bootstrap/custom";
@import "bootstrap/variables";
-@import "bootstrap/mixins/hover";
-@import "bootstrap/mixins/tab-focus";
+@import "bootstrap/mixins";
+@import "bootstrap/custom";
@import "bootstrap/normalize";
@import "bootstrap/reboot";
diff --git a/assets/stylesheets/_bootstrap.scss b/assets/stylesheets/_bootstrap.scss
index b17b05c..2abc609 100644
--- a/assets/stylesheets/_bootstrap.scss
+++ b/assets/stylesheets/_bootstrap.scss
@@ -1,14 +1,14 @@
/*!
- * Bootstrap v4.0.0-alpha.5 (https://getbootstrap.com)
- * Copyright 2011-2016 The Bootstrap Authors
- * Copyright 2011-2016 Twitter, Inc.
+ * Bootstrap v4.0.0-alpha.6 (https://getbootstrap.com)
+ * Copyright 2011-2017 The Bootstrap Authors
+ * Copyright 2011-2017 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/
// Core variables and mixins
-@import "bootstrap/custom";
@import "bootstrap/variables";
@import "bootstrap/mixins";
+@import "bootstrap/custom";
// Reset and dependencies
@import "bootstrap/normalize";
@@ -25,7 +25,7 @@
@import "bootstrap/buttons";
// Components
-@import "bootstrap/animation";
+@import "bootstrap/transitions";
@import "bootstrap/dropdown";
@import "bootstrap/button-group";
@import "bootstrap/input-group";
@@ -35,7 +35,7 @@
@import "bootstrap/card";
@import "bootstrap/breadcrumb";
@import "bootstrap/pagination";
-@import "bootstrap/tags";
+@import "bootstrap/badge";
@import "bootstrap/jumbotron";
@import "bootstrap/alert";
@import "bootstrap/progress";
diff --git a/assets/stylesheets/bootstrap/_alert.scss b/assets/stylesheets/bootstrap/_alert.scss
index 260ce20..d9b4e9b 100644
--- a/assets/stylesheets/bootstrap/_alert.scss
+++ b/assets/stylesheets/bootstrap/_alert.scss
@@ -4,7 +4,7 @@
.alert {
padding: $alert-padding-y $alert-padding-x;
- margin-bottom: $spacer-y;
+ margin-bottom: $alert-margin-bottom;
border: $alert-border-width solid transparent;
@include border-radius($alert-border-radius);
}
@@ -26,13 +26,12 @@
// Expand the right padding and account for the close button's positioning.
.alert-dismissible {
- padding-right: ($alert-padding-x * 2);
-
// Adjust close link position
.close {
position: relative;
- top: -.125rem;
+ top: -$alert-padding-y;
right: -$alert-padding-x;
+ padding: $alert-padding-y $alert-padding-x;
color: inherit;
}
}
diff --git a/assets/stylesheets/bootstrap/_badge.scss b/assets/stylesheets/bootstrap/_badge.scss
new file mode 100644
index 0000000..e5a3298
--- /dev/null
+++ b/assets/stylesheets/bootstrap/_badge.scss
@@ -0,0 +1,77 @@
+// Base class
+//
+// Requires one of the contextual, color modifier classes for `color` and
+// `background-color`.
+
+.badge {
+ display: inline-block;
+ padding: $badge-padding-y $badge-padding-x;
+ font-size: $badge-font-size;
+ font-weight: $badge-font-weight;
+ line-height: 1;
+ color: $badge-color;
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: baseline;
+ @include border-radius();
+
+ // Empty badges collapse automatically
+ &:empty {
+ display: none;
+ }
+}
+
+// Quick fix for badges in buttons
+.btn .badge {
+ position: relative;
+ top: -1px;
+}
+
+// scss-lint:disable QualifyingElement
+// Add hover effects, but only for links
+a.badge {
+ @include hover-focus {
+ color: $badge-link-hover-color;
+ text-decoration: none;
+ cursor: pointer;
+ }
+}
+// scss-lint:enable QualifyingElement
+
+// Pill badges
+//
+// Make them extra rounded with a modifier to replace v3's badges.
+
+.badge-pill {
+ padding-right: $badge-pill-padding-x;
+ padding-left: $badge-pill-padding-x;
+ @include border-radius($badge-pill-border-radius);
+}
+
+// Colors
+//
+// Contextual variations (linked badges get darker on :hover).
+
+.badge-default {
+ @include badge-variant($badge-default-bg);
+}
+
+.badge-primary {
+ @include badge-variant($badge-primary-bg);
+}
+
+.badge-success {
+ @include badge-variant($badge-success-bg);
+}
+
+.badge-info {
+ @include badge-variant($badge-info-bg);
+}
+
+.badge-warning {
+ @include badge-variant($badge-warning-bg);
+}
+
+.badge-danger {
+ @include badge-variant($badge-danger-bg);
+}
diff --git a/assets/stylesheets/bootstrap/_button-group.scss b/assets/stylesheets/bootstrap/_button-group.scss
index 0e63ecc..584ed15 100644
--- a/assets/stylesheets/bootstrap/_button-group.scss
+++ b/assets/stylesheets/bootstrap/_button-group.scss
@@ -4,28 +4,26 @@
.btn-group,
.btn-group-vertical {
position: relative;
- display: inline-block;
+ display: inline-flex;
vertical-align: middle; // match .btn alignment given font-size hack above
> .btn {
position: relative;
- float: left;
- margin-bottom: 0;
+ flex: 0 1 auto;
- // Bring the "active" button to the front
+ // Bring the hover, focused, and "active" buttons to the fron to overlay
+ // the borders properly
+ @include hover {
+ z-index: 2;
+ }
&:focus,
&:active,
&.active {
z-index: 2;
}
- @include hover {
- z-index: 2;
- }
}
-}
-// Prevent double borders when buttons are next to each other
-.btn-group {
+ // Prevent double borders when buttons are next to each other
.btn + .btn,
.btn + .btn-group,
.btn-group + .btn,
@@ -36,18 +34,11 @@
// Optional: Group multiple button groups together for a toolbar
.btn-toolbar {
- margin-left: -$btn-toolbar-margin; // Offset the first child's margin
- @include clearfix();
+ display: flex;
+ justify-content: flex-start;
- .btn-group,
.input-group {
- float: left;
- }
-
- > .btn,
- > .btn-group,
- > .input-group {
- margin-left: $btn-toolbar-margin;
+ width: auto;
}
}
@@ -137,43 +128,19 @@
}
-// Reposition the caret
-.btn .caret {
- margin-left: 0;
-}
-// Carets in other button sizes
-.btn-lg .caret {
- border-width: $caret-width-lg $caret-width-lg 0;
- border-bottom-width: 0;
-}
-// Upside down carets for .dropup
-.dropup .btn-lg .caret {
- border-width: 0 $caret-width-lg $caret-width-lg;
-}
-
-
-
//
// Vertical button groups
//
.btn-group-vertical {
- > .btn,
- > .btn-group,
- > .btn-group > .btn {
- display: block;
- float: none;
- width: 100%;
- max-width: 100%;
- }
+ display: inline-flex;
+ flex-direction: column;
+ align-items: flex-start;
+ justify-content: center;
- // Clear floats so dropdown menus can be properly placed
- > .btn-group {
- @include clearfix();
-
- > .btn {
- float: none;
- }
+ .btn,
+ .btn-group {
+ width: 100%;
}
> .btn + .btn,
diff --git a/assets/stylesheets/bootstrap/_buttons.scss b/assets/stylesheets/bootstrap/_buttons.scss
index 119cf1c..e36ff0f 100644
--- a/assets/stylesheets/bootstrap/_buttons.scss
+++ b/assets/stylesheets/bootstrap/_buttons.scss
@@ -11,41 +11,34 @@
text-align: center;
white-space: nowrap;
vertical-align: middle;
- cursor: pointer;
user-select: none;
border: $input-btn-border-width solid transparent;
@include button-size($btn-padding-y, $btn-padding-x, $font-size-base, $btn-border-radius);
- @include transition(all .2s ease-in-out);
-
- &,
- &:active,
- &.active {
- &:focus,
- &.focus {
- @include tab-focus();
- }
- }
+ @include transition($btn-transition);
+ // Share hover and focus styles
@include hover-focus {
text-decoration: none;
}
+ &:focus,
&.focus {
- text-decoration: none;
- }
-
- &:active,
- &.active {
- background-image: none;
outline: 0;
- @include box-shadow($btn-active-box-shadow);
+ box-shadow: $btn-focus-box-shadow;
}
+ // Disabled comes first so active can properly restyle
&.disabled,
&:disabled {
cursor: $cursor-disabled;
opacity: .65;
@include box-shadow(none);
}
+
+ &:active,
+ &.active {
+ background-image: none;
+ @include box-shadow($btn-focus-box-shadow, $btn-active-box-shadow);
+ }
}
// Future-proof disabling of clicks on `<a>` elements
@@ -105,7 +98,7 @@ fieldset[disabled] a.btn {
// Make a button look and behave like a link
.btn-link {
- font-weight: normal;
+ font-weight: $font-weight-normal;
color: $link-color;
border-radius: 0;
@@ -130,8 +123,9 @@ fieldset[disabled] a.btn {
background-color: transparent;
}
&:disabled {
+ color: $btn-link-disabled-color;
+
@include hover-focus {
- color: $btn-link-disabled-color;
text-decoration: none;
}
}
diff --git a/assets/stylesheets/bootstrap/_card.scss b/assets/stylesheets/bootstrap/_card.scss
index 01a5733..9fe70e8 100644
--- a/assets/stylesheets/bootstrap/_card.scss
+++ b/assets/stylesheets/bootstrap/_card.scss
@@ -4,16 +4,17 @@
.card {
position: relative;
- display: block;
- margin-bottom: $card-spacer-y;
+ display: flex;
+ flex-direction: column;
background-color: $card-bg;
- // border: $card-border-width solid $card-border-color;
- @include border-radius($card-border-radius);
border: $card-border-width solid $card-border-color;
+ @include border-radius($card-border-radius);
}
.card-block {
- @include clearfix;
+ // Enable `flex-grow: 1` for decks and groups so that card blocks take up
+ // as much space as possible, ensuring footers are aligned to the bottom.
+ flex: 1 1 auto;
padding: $card-spacer-x;
}
@@ -30,14 +31,6 @@
margin-bottom: 0;
}
-// .card-actions {
-// padding: $card-spacer-y $card-spacer-x;
-
-// .card-link + .card-link {
-// margin-left: $card-spacer-x;
-// }
-// }
-
.card-link {
@include hover {
text-decoration: none;
@@ -68,7 +61,6 @@
//
.card-header {
- @include clearfix;
padding: $card-spacer-y $card-spacer-x;
margin-bottom: 0; // Removes the default margin-bottom of <hN>
background-color: $card-cap-bg;
@@ -80,7 +72,6 @@
}
.card-footer {
- @include clearfix;
padding: $card-spacer-y $card-spacer-x;
background-color: $card-cap-bg;
border-top: $card-border-width solid $card-border-color;
@@ -191,77 +182,39 @@
}
-// Card set
-//
-// Heads up! We do some funky style resetting here for margins across our two
-// variations (one flex, one table). Individual cards have margin-bottom by
-// default, but they're ignored due to table styles. For a consistent design,
-// we've done the same to the flex variation.
-//
-// Those changes are noted by `// Margin balancing`.
+// Card deck
-@if $enable-flex {
- @include media-breakpoint-up(sm) {
- .card-deck {
+@include media-breakpoint-up(sm) {
+ .card-deck {
+ display: flex;
+ flex-flow: row wrap;
+
+ .card {
display: flex;
- flex-flow: row wrap;
- margin-right: -$card-deck-margin;
- margin-bottom: $card-spacer-y; // Margin balancing
- margin-left: -$card-deck-margin;
-
- .card {
- flex: 1 0 0;
- margin-right: $card-deck-margin;
- margin-bottom: 0; // Margin balancing
- margin-left: $card-deck-margin;
- }
- }
- }
-} @else {
- @include media-breakpoint-up(sm) {
- $space-between-cards: (2 * $card-deck-margin);
- .card-deck {
- display: table;
- width: 100%;
- margin-bottom: $card-spacer-y; // Margin balancing
- table-layout: fixed;
- border-spacing: $space-between-cards 0;
-
- .card {
- display: table-cell;
- margin-bottom: 0; // Margin balancing
- vertical-align: top;
- }
- }
- .card-deck-wrapper {
- margin-right: (-$space-between-cards);
- margin-left: (-$space-between-cards);
+ flex: 1 0 0;
+ flex-direction: column;
+
+ // Selectively apply horizontal margins to cards to avoid doing the
+ // negative margin dance like our grid. This differs from the grid
+ // due to the use of margins as gutters instead of padding.
+ &:not(:first-child) { margin-left: $card-deck-margin; }
+ &:not(:last-child) { margin-right: $card-deck-margin; }
}
}
}
+
//
// Card groups
//
@include media-breakpoint-up(sm) {
.card-group {
- @if $enable-flex {
- display: flex;
- flex-flow: row wrap;
- } @else {
- display: table;
- width: 100%;
- table-layout: fixed;
- }
+ display: flex;
+ flex-flow: row wrap;
.card {
- @if $enable-flex {
- flex: 1 0 0;
- } @else {
- display: table-cell;
- vertical-align: top;
- }
+ flex: 1 0 0;
+ .card {
margin-left: 0;
@@ -306,17 +259,18 @@
//
-// Card
+// Columns
//
@include media-breakpoint-up(sm) {
.card-columns {
- column-count: 3;
- column-gap: $card-columns-sm-up-column-gap;
+ column-count: $card-columns-count;
+ column-gap: $card-columns-gap;
.card {
display: inline-block; // Don't let them vertically span multiple columns
- width: 100%; // Don't let them exceed the column width
+ width: 100%; // Don't let their width change
+ margin-bottom: $card-columns-margin;
}
}
}
diff --git a/assets/stylesheets/bootstrap/_carousel.scss b/assets/stylesheets/bootstrap/_carousel.scss
index 9386983..54478e4 100644
--- a/assets/stylesheets/bootstrap/_carousel.scss
+++ b/assets/stylesheets/bootstrap/_carousel.scss
@@ -7,77 +7,47 @@
position: relative;
width: 100%;
overflow: hidden;
+}
- > .carousel-item {
- position: relative;
- display: none;
- transition: .6s ease-in-out left;
-
- // Account for jankitude on images
- > img,
- > a > img {
- @extend .img-fluid;
- line-height: 1;
- }
+.carousel-item {
+ position: relative;
+ display: none;
+ width: 100%;
- // WebKit CSS3 transforms for supported devices
- @media all and (transform-3d), (-webkit-transform-3d) {
- transition: transform .6s ease-in-out;
- backface-visibility: hidden;
- perspective: 1000px;
-
- &.next,
- &.active.right {
- left: 0;
- transform: translate3d(100%, 0, 0);
- }
- &.prev,
- &.active.left {
- left: 0;
- transform: translate3d(-100%, 0, 0);
- }
- &.next.left,
- &.prev.right,
- &.active {
- left: 0;
- transform: translate3d(0, 0, 0);
- }
- }
+ @include if-supports-3d-transforms() {
+ @include transition($carousel-transition);
+ backface-visibility: hidden;
+ perspective: 1000px;
}
+}
- > .active,
- > .next,
- > .prev {
- display: block;
- }
+.carousel-item.active,
+.carousel-item-next,
+.carousel-item-prev {
+ display: flex;
+}
- > .active {
- left: 0;
- }
+.carousel-item-next,
+.carousel-item-prev {
+ position: absolute;
+ top: 0;
+}
- > .next,
- > .prev {
- position: absolute;
- top: 0;
- width: 100%;
+// CSS3 transforms when supported by the browser
+@include if-supports-3d-transforms() {
+ .carousel-item-next.carousel-item-left,
+ .carousel-item-prev.carousel-item-right {
+ transform: translate3d(0, 0, 0);
}
- > .next {
- left: 100%;
- }
- > .prev {
- left: -100%;
- }
- > .next.left,
- > .prev.right {
- left: 0;
+ .carousel-item-next,
+ .active.carousel-item-right {
+ transform: translate3d(100%, 0, 0);
}
- > .active.left {
- left: -100%;
- }
- > .active.right {
- left: 100%;
+ .carousel-item-prev,
+ .active.carousel-item-left {
+ transform: translate3d(-100%, 0, 0);
}
}
@@ -86,30 +56,22 @@
// Left/right controls for nav
//
-.carousel-control {
+.carousel-control-prev,
+.carousel-control-next {
position: absolute;
top: 0;
bottom: 0;
- left: 0;
+ // Use flex for alignment (1-3)
+ display: flex; // 1. allow flex styles
+ align-items: center; // 2. vertically center contents
+ justify-content: center; // 3. horizontally center contents
width: $carousel-control-width;
- font-size: $carousel-control-font-size;
color: $carousel-control-color;
text-align: center;
- text-shadow: $carousel-text-shadow;
opacity: $carousel-control-opacity;
- // We can't have this transition here because WebKit cancels the carousel
+ // We can't have a transition here because WebKit cancels the carousel
// animation if you trip this while in the middle of another animation.
- // Set gradients for backgrounds
- &.left {
- @include gradient-x($start-color: rgba(0,0,0,.5), $end-color: rgba(0,0,0,.0001));
- }
- &.right {
- right: 0;
- left: auto;
- @include gradient-x($start-color: rgba(0,0,0,.0001), $end-color: rgba(0,0,0,.5));
- }
-
// Hover/focus state
@include hover-focus {
color: $carousel-control-color;
@@ -117,79 +79,83 @@
outline: 0;
opacity: .9;
}
+}
+.carousel-control-prev {
+ left: 0;
+}
+.carousel-control-next {
+ right: 0;
+}
- // Toggles
- .icon-prev,
- .icon-next {
- position: absolute;
- top: 50%;
- z-index: 5;
- display: inline-block;
- width: $carousel-icon-width;
- height: $carousel-icon-width;
- margin-top: -($carousel-icon-width / 2);
- font-family: serif;
- line-height: 1;
- }
- .icon-prev {
- left: 50%;
- margin-left: -($carousel-icon-width / 2);
- }
- .icon-next {
- right: 50%;
- margin-right: -($carousel-icon-width / 2);
- }
-
- .icon-prev {
- &::before {
- content: "\2039";// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)
- }
- }
- .icon-next {
- &::before {
- content: "\203a";// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)
- }
- }
+// Icons for within
+.carousel-control-prev-icon,
+.carousel-control-next-icon {
+ display: inline-block;
+ width: $carousel-control-icon-width;
+ height: $carousel-control-icon-width;
+ background: transparent no-repeat center center;
+ background-size: 100% 100%;
+}
+.carousel-control-prev-icon {
+ background-image: $carousel-control-prev-icon-bg;
+}
+.carousel-control-next-icon {
+ background-image: $carousel-control-next-icon-bg;
}
// Optional indicator pips
//
-// Add an unordered list with the following class and add a list item for each
+// Add an ordered list with the following class and add a list item for each
// slide your carousel holds.
.carousel-indicators {
position: absolute;
+ right: 0;
bottom: 10px;
- left: 50%;
+ left: 0;
z-index: 15;
- width: $carousel-indicators-width;
- padding-left: 0;
- margin-left: -($carousel-indicators-width / 2);
- text-align: center;
+ display: flex;
+ justify-content: center;
+ padding-left: 0; // override <ol> default
+ // Use the .carousel-control's width as margin so we don't overlay those
+ margin-right: $carousel-control-width;
+ margin-left: $carousel-control-width;
list-style: none;
li {
- display: inline-block;
- width: $carousel-indicator-size;
- height: $carousel-indicator-size;
- margin: 1px;
+ position: relative;
+ flex: 1 0 auto;
+ max-width: $carousel-indicator-width;
+ height: $carousel-indicator-height;
+ margin-right: $carousel-indicator-spacer;
+ margin-left: $carousel-indicator-spacer;
text-indent: -999px;
cursor: pointer;
- // IE9 hack for event handling
- //
- // Internet Explorer 9 does not properly handle clicks on elements with a `background-color` of `transparent`,
- // so we use `rgba(0,0,0,0)` instead since it's a non-buggy equivalent.
- // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer
- background-color: rgba(0,0,0,0); // IE9
- border: 1px solid $carousel-indicator-border-color;
- border-radius: $carousel-indicator-size;
+ background-color: rgba($carousel-indicator-active-bg, .5);
+
+ // Use pseudo classes to increase the hit area by 10px on top and bottom.
+ &::before {
+ position: absolute;
+ top: -10px;
+ left: 0;
+ display: inline-block;
+ width: 100%;
+ height: 10px;
+ content: "";
+ }
+ &::after {
+ position: absolute;
+ bottom: -10px;
+ left: 0;
+ display: inline-block;
+ width: 100%;
+ height: 10px;
+ content: "";
+ }
}
.active {
- width: $carousel-indicator-active-size;
- height: $carousel-indicator-active-size;
- margin: 0;
background-color: $carousel-indicator-active-bg;
}
}
@@ -197,7 +163,7 @@
// Optional captions
//
-// Hidden by default for smaller viewports.
+//
.carousel-caption {
position: absolute;
@@ -209,45 +175,4 @@
padding-bottom: 20px;
color: $carousel-caption-color;
text-align: center;
- text-shadow: $carousel-text-shadow;
-
- .btn {
- text-shadow: none; // No shadow for button elements in carousel-caption
- }
-}
-
-
-//
-// Responsive variations
-//
-
-@include media-breakpoint-up(sm) {
- // Scale up the controls a smidge
- .carousel-control {
- .icon-prev,
- .icon-next {
- width: $carousel-control-sm-up-size;
- height: $carousel-control-sm-up-size;
- margin-top: -($carousel-control-sm-up-size / 2);
- font-size: $carousel-control-sm-up-size;
- }
- .icon-prev {
- margin-left: -($carousel-control-sm-up-size / 2);
- }
- .icon-next {
- margin-right: -($carousel-control-sm-up-size / 2);
- }
- }
-
- // Show and left align the captions
- .carousel-caption {
- right: ((100% - $carousel-caption-sm-up-width) / 2);
- left: ((100% - $carousel-caption-sm-up-width) / 2);
- padding-bottom: 30px;
- }
-
- // Move up the indicators
- .carousel-indicators {
- bottom: 20px;
- }
}
diff --git a/assets/stylesheets/bootstrap/_close.scss b/assets/stylesheets/bootstrap/_close.scss
index f98d4c1..859990e 100644
--- a/assets/stylesheets/bootstrap/_close.scss
+++ b/assets/stylesheets/bootstrap/_close.scss
@@ -1,17 +1,17 @@
.close {
float: right;
- font-size: ($font-size-base * 1.5);
+ font-size: $close-font-size;
font-weight: $close-font-weight;
line-height: 1;
color: $close-color;
text-shadow: $close-text-shadow;
- opacity: .2;
+ opacity: .5;
@include hover-focus {
color: $close-color;
text-decoration: none;
cursor: pointer;
- opacity: .5;
+ opacity: .75;
}
}
diff --git a/assets/stylesheets/bootstrap/_code.scss b/assets/stylesheets/bootstrap/_code.scss
index ea660bc..759da15 100644
--- a/assets/stylesheets/bootstrap/_code.scss
+++ b/assets/stylesheets/bootstrap/_code.scss
@@ -13,6 +13,13 @@ code {
color: $code-color;
background-color: $code-bg;
@include border-radius($border-radius);
+
+ // Streamline the style when inside anchors to avoid broken underline and more
+ a > & {
+ padding: 0;
+ color: inherit;
+ background-color: inherit;
+ }
}
// User input typically entered via keyboard
diff --git a/assets/stylesheets/bootstrap/_custom-forms.scss b/assets/stylesheets/bootstrap/_custom-forms.scss
index e74f5c7..ef2aab3 100644
--- a/assets/stylesheets/bootstrap/_custom-forms.scss
+++ b/assets/stylesheets/bootstrap/_custom-forms.scss
@@ -11,13 +11,11 @@
.custom-control {
position: relative;
- display: inline-block;
+ display: inline-flex;
+ min-height: (1rem * $line-height-base);
padding-left: $custom-control-gutter;
+ margin-right: $custom-control-spacer-x;
cursor: pointer;
-
- + .custom-control {
- margin-left: $custom-control-spacer-x;
- }
}
.custom-control-input {
@@ -61,7 +59,7 @@
.custom-control-indicator {
position: absolute;
- top: .25rem;
+ top: (($line-height-base - $custom-control-indicator-size) / 2);
left: 0;
display: block;
width: $custom-control-indicator-size;
@@ -116,9 +114,11 @@
// set. Use these optional classes to tweak the layout.
.custom-controls-stacked {
+ display: flex;
+ flex-direction: column;
+
.custom-control {
- float: left;
- clear: left;
+ margin-bottom: $custom-control-spacer-y;
+ .custom-control {
margin-left: 0;
@@ -132,19 +132,17 @@
// Replaces the browser default select with a custom one, mostly pulled from
// http://primercss.io.
//
-// Includes IE9-specific hacks (noted by ` \9`).
.custom-select {
display: inline-block;
max-width: 100%;
$select-border-width: ($border-width * 2);
- height: calc(#{$input-height} - #{$select-border-width});
+ height: calc(#{$input-height} + #{$select-border-width});
padding: $custom-select-padding-y ($custom-select-padding-x + $custom-select-indicator-padding) $custom-select-padding-y $custom-select-padding-x;
- padding-right: $custom-select-padding-x \9;
+ line-height: $custom-select-line-height;
color: $custom-select-color;
vertical-align: middle;
background: $custom-select-bg $custom-select-indicator no-repeat right $custom-select-padding-x center;
- background-image: none \9;
background-size: $custom-select-bg-size;
border: $custom-select-border-width solid $custom-select-border-color;
@include border-radius($custom-select-border-radius);
@@ -201,12 +199,14 @@
display: inline-block;
max-width: 100%;
height: $custom-file-height;
+ margin-bottom: 0;
cursor: pointer;
}
.custom-file-input {
min-width: $custom-file-width;
max-width: 100%;
+ height: $custom-file-height;
margin: 0;
filter: alpha(opacity = 0);
opacity: 0;
@@ -226,6 +226,7 @@
padding: $custom-file-padding-x $custom-file-padding-y;
line-height: $custom-file-line-height;
color: $custom-file-color;
+ pointer-events: none;
user-select: none;
background-color: $custom-file-bg;
border: $custom-file-border-width solid $custom-file-border-color;
diff --git a/assets/stylesheets/bootstrap/_dropdown.scss b/assets/stylesheets/bootstrap/_dropdown.scss
index 47702e7..1c2741a 100644
--- a/assets/stylesheets/bootstrap/_dropdown.scss
+++ b/assets/stylesheets/bootstrap/_dropdown.scss
@@ -44,7 +44,7 @@
min-width: $dropdown-min-width;
padding: $dropdown-padding-y 0;
margin: $dropdown-margin-top 0 0; // override default ul
- font-size: $font-size-base;
+ font-size: $font-size-base; // Redeclare because nesting can cause inheritance issues
color: $body-color;
text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)
list-style: none;
@@ -68,7 +68,7 @@
width: 100%; // For `<button>`s
padding: 3px $dropdown-item-padding-x;
clear: both;
- font-weight: normal;
+ font-weight: $font-weight-normal;
color: $dropdown-link-color;
text-align: inherit; // For `<button>`s
white-space: nowrap; // prevent links from randomly breaking onto new lines
@@ -81,37 +81,27 @@
background-color: $dropdown-link-hover-bg;
}
- // Active state
- &.active {
- @include plain-hover-focus {
- color: $dropdown-link-active-color;
- text-decoration: none;
- background-color: $dropdown-link-active-bg;
- outline: 0;
- }
+ &.active,
+ &:active {
+ color: $dropdown-link-active-color;
+ text-decoration: none;
+ background-color: $dropdown-link-active-bg;
}
- // Disabled state
- //
- // Gray out text and ensure the hover/focus state remains gray
- &.disabled {
- @include plain-hover-focus {
- color: $dropdown-link-disabled-color;
- }
-
- // Nuke hover/focus effects
- @include hover-focus {
- text-decoration: none;
- cursor: $cursor-disabled;
- background-color: transparent;
- background-image: none; // Remove CSS gradient
- @include reset-filter();
+ &.disabled,
+ &:disabled {
+ color: $dropdown-link-disabled-color;
+ cursor: $cursor-disabled;
+ background-color: transparent;
+ // Remove CSS gradients if they're enabled
+ @if $enable-gradients {
+ background-image: none;
}
}
}
// Open state for the dropdown
-.open {
+.show {
// Show the menu
> .dropdown-menu {
display: block;
@@ -160,17 +150,8 @@
// Allow for dropdowns to go bottom up (aka, dropup-menu)
//
// Just add .dropup after the standard .dropdown class and you're set.
-// TODO: abstract this so that the navbar fixed styles are not placed here?
-
-.dropup,
-.navbar-fixed-bottom .dropdown {
- // Reverse the caret
- .caret {
- content: "";
- border-top: 0;
- border-bottom: $caret-width solid;
- }
+.dropup {
// Different positioning for bottom up menu
.dropdown-menu {
top: auto;
diff --git a/assets/stylesheets/bootstrap/_forms.scss b/assets/stylesheets/bootstrap/_forms.scss
index be19a07..7be62bd 100644
--- a/assets/stylesheets/bootstrap/_forms.scss
+++ b/assets/stylesheets/bootstrap/_forms.scss
@@ -29,7 +29,7 @@
}
@include box-shadow($input-box-shadow);
- @include transition(border-color ease-in-out .15s, box-shadow ease-in-out .15s);
+ @include transition($input-transition);
// Unstyle the caret on `<select>`s in IE10+.
&::-ms-expand {
@@ -67,7 +67,7 @@
select.form-control {
&:not([size]):not([multiple]) {
$select-border-width: ($border-width * 2);
- height: calc(#{$input-height} - #{$select-border-width});
+ height: calc(#{$input-height} + #{$select-border-width});
}
&:focus::-ms-value {
@@ -95,20 +95,20 @@ select.form-control {
// For use with horizontal and inline forms, when you need the label text to
// align with the form controls.
.col-form-label {
- padding-top: $input-padding-y;
- padding-bottom: $input-padding-y;
+ padding-top: calc(#{$input-padding-y} - #{$input-btn-border-width} * 2);
+ padding-bottom: calc(#{$input-padding-y} - #{$input-btn-border-width} * 2);
margin-bottom: 0; // Override the `<label>` default
}
.col-form-label-lg {
- padding-top: $input-padding-y-lg;
- padding-bottom: $input-padding-y-lg;
+ padding-top: calc(#{$input-padding-y-lg} - #{$input-btn-border-width} * 2);
+ padding-bottom: calc(#{$input-padding-y-lg} - #{$input-btn-border-width} * 2);
font-size: $font-size-lg;
}
.col-form-label-sm {
- padding-top: $input-padding-y-sm;
- padding-bottom: $input-padding-y-sm;
+ padding-top: calc(#{$input-padding-y-sm} - #{$input-btn-border-width} * 2);
+ padding-bottom: calc(#{$input-padding-y-sm} - #{$input-btn-border-width} * 2);
font-size: $font-size-sm;
}
@@ -135,9 +135,10 @@ select.form-control {
.form-control-static {
padding-top: $input-padding-y;
padding-bottom: $input-padding-y;
+ margin-bottom: 0; // match inputs if this class comes on inputs with default margins
line-height: $input-line-height;
border: solid transparent;
- border-width: 1px 0;
+ border-width: $input-btn-border-width 0;
&.form-control-sm,
&.form-control-lg {
@@ -191,7 +192,7 @@ select.form-control-lg {
.form-text {
display: block;
- margin-top: ($spacer * .25);
+ margin-top: $form-text-margin-top;
}
@@ -202,12 +203,7 @@ select.form-control-lg {
.form-check {
position: relative;
display: block;
- margin-bottom: ($spacer * .75);
-
- // Move up sibling radios or checkboxes for tighter spacing
- + .form-check {
- margin-top: -.25rem;
- }
+ margin-bottom: $form-check-margin-bottom;
&.disabled {
.form-check-label {
@@ -218,15 +214,15 @@ select.form-control-lg {
}
.form-check-label {
- padding-left: 1.25rem;
+ padding-left: $form-check-input-gutter;
margin-bottom: 0; // Override default `<label>` bottom margin
cursor: pointer;
}
.form-check-input {
position: absolute;
- margin-top: .25rem;
- margin-left: -1.25rem;
+ margin-top: $form-check-input-margin-y;
+ margin-left: -$form-check-input-gutter;
&:only-child {
position: static;
@@ -235,20 +231,14 @@ select.form-control-lg {
// Radios and checkboxes on same line
.form-check-inline {
- position: relative;
display: inline-block;
- padding-left: 1.25rem;
- margin-bottom: 0; // Override default `<label>` bottom margin
- vertical-align: middle;
- cursor: pointer;
- + .form-check-inline {
- margin-left: .75rem;
+ .form-check-label {
+ vertical-align: middle;
}
- &.disabled {
- color: $text-muted;
- cursor: $cursor-disabled;
+ + .form-check-inline {
+ margin-left: $form-check-inline-margin-x;
}
}
@@ -258,7 +248,7 @@ select.form-control-lg {
// Apply contextual and semantic states to individual form controls.
.form-control-feedback {
- margin-top: ($spacer * .25);
+ margin-top: $form-feedback-margin-top;
}
.form-control-success,
@@ -306,14 +296,33 @@ select.form-control-lg {
// default HTML form controls and our custom form controls (e.g., input groups).
.form-inline {
+ display: flex;
+ flex-flow: row wrap;
+ align-items: center; // Prevent shorter elements from growing to same height as others (e.g., small buttons growing to normal sized button height)
+
+ // Because we use flex, the initial sizing of checkboxes is collapsed and
+ // doesn't occupy the full-width (which is what we want for xs grid tier),
+ // so we force that here.
+ .form-check {
+ width: 100%;
+ }
// Kick in the inline
@include media-breakpoint-up(sm) {
+ label {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-bottom: 0;
+ }
+
// Inline-block all the things for "inline"
.form-group {
- display: inline-block;
+ display: flex;
+ flex: 0 0 auto;
+ flex-flow: row wrap;
+ align-items: center;
margin-bottom: 0;
- vertical-align: middle;
}
// Allow folks to *not* use `.form-group`
@@ -329,20 +338,7 @@ select.form-control-lg {
}
.input-group {
- display: inline-table;
width: auto;
- vertical-align: middle;
-
- .input-group-addon,
- .input-group-btn,
- .form-control {
- width: auto;
- }
- }
-
- // Input groups need that 100% width though
- .input-group > .form-control {
- width: 100%;
}
.form-control-label {
@@ -353,19 +349,37 @@ select.form-control-lg {
// Remove default margin on radios/checkboxes that were used for stacking, and
// then undo the floating of radios and checkboxes to match.
.form-check {
- display: inline-block;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: auto;
margin-top: 0;
margin-bottom: 0;
- vertical-align: middle;
}
.form-check-label {
padding-left: 0;
}
.form-check-input {
position: relative;
+ margin-top: 0;
+ margin-right: $form-check-input-margin-x;
margin-left: 0;
}
+ // Custom form controls
+ .custom-control {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding-left: 0;
+ }
+ .custom-control-indicator {
+ position: static;
+ display: inline-block;
+ margin-right: $form-check-input-margin-x; // Flexbox alignment means we lose our HTML space here, so we compensate.
+ vertical-align: text-bottom;
+ }
+
// Re-override the feedback icon.
.has-feedback .form-control-feedback {
top: 0;
diff --git a/assets/stylesheets/bootstrap/_grid.scss b/assets/stylesheets/bootstrap/_grid.scss
index 24cf74d..8c7a9ee 100644
--- a/assets/stylesheets/bootstrap/_grid.scss
+++ b/assets/stylesheets/bootstrap/_grid.scss
@@ -28,6 +28,19 @@
.row {
@include make-row();
}
+
+ // Remove the negative margin from default .row, then the horizontal padding
+ // from all immediate children columns (to prevent runaway style inheritance).
+ .no-gutters {
+ margin-right: 0;
+ margin-left: 0;
+
+ > .col,
+ > [class*="col-"] {
+ padding-right: 0;
+ padding-left: 0;
+ }
+ }
}
// Columns
diff --git a/assets/stylesheets/bootstrap/_images.scss b/assets/stylesheets/bootstrap/_images.scss
index 3cdedc4..a8135a6 100644
--- a/assets/stylesheets/bootstrap/_images.scss
+++ b/assets/stylesheets/bootstrap/_images.scss
@@ -16,7 +16,7 @@
background-color: $thumbnail-bg;
border: $thumbnail-border-width solid $thumbnail-border-color;
@include border-radius($thumbnail-border-radius);
- transition: all .2s ease-in-out;
+ @include transition($thumbnail-transition);
@include box-shadow($thumbnail-box-shadow);
// Keep them at most 100% wide
@@ -39,5 +39,5 @@
.figure-caption {
font-size: $figure-caption-font-size;
- color: $gray-light;
+ color: $figure-caption-color;
}
diff --git a/assets/stylesheets/bootstrap/_input-group.scss b/assets/stylesheets/bootstrap/_input-group.scss
index b447a32..ab44883 100644
--- a/assets/stylesheets/bootstrap/_input-group.scss
+++ b/assets/stylesheets/bootstrap/_input-group.scss
@@ -4,45 +4,34 @@
.input-group {
position: relative;
+ display: flex;
width: 100%;
- @if $enable-flex {
- display: flex;
- } @else {
- display: table;
- // Prevent input groups from inheriting border styles from table cells when
- // placed within a table.
- border-collapse: separate;
- }
-
.form-control {
// Ensure that the input is always above the *appended* addon button for
// proper border colors.
position: relative;
z-index: 2;
+ flex: 1 1 auto;
+ // Add width 1% and flex-basis auto to ensure that button will not wrap out
+ // the column. Applies to IE Edge+ and Firefox. Chrome does not require this.
+ width: 1%;
+ margin-bottom: 0;
+
// Bring the "active" form control to the front
@include hover-focus-active {
z-index: 3;
}
- @if $enable-flex {
- flex: 1;
- } @else {
- // IE9 fubars the placeholder attribute in text inputs and the arrows on
- // select elements in input groups. To fix it, we float the input. Details:
- // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855
- float: left;
- width: 100%;
- }
- margin-bottom: 0;
}
}
.input-group-addon,
.input-group-btn,
.input-group .form-control {
- @if not $enable-flex {
- display: table-cell;
- }
+ // Vertically centers the content of the addons within the input group
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
&:not(:first-child):not(:last-child) {
@include border-radius(0);
@@ -51,9 +40,6 @@
.input-group-addon,
.input-group-btn {
- @if not $enable-flex {
- width: 1%;
- }
white-space: nowrap;
vertical-align: middle; // Match the inputs
}
@@ -83,8 +69,8 @@
.input-group-addon {
padding: $input-padding-y $input-padding-x;
margin-bottom: 0; // Allow use of <label> elements by overriding our default margin-bottom
- font-size: $font-size-base;
- font-weight: normal;
+ font-size: $font-size-base; // Match inputs
+ font-weight: $font-weight-normal;
line-height: $input-line-height;
color: $input-color;
text-align: center;
@@ -158,9 +144,13 @@
// element above the siblings.
> .btn {
position: relative;
+ // Vertically stretch the button and center its content
+ flex: 1;
+
+ .btn {
margin-left: (-$input-btn-border-width);
}
+
// Bring the "active" button to the front
@include hover-focus-active {
z-index: 3;
diff --git a/assets/stylesheets/bootstrap/_list-group.scss b/assets/stylesheets/bootstrap/_list-group.scss
index 1e0d112..ec813c8 100644
--- a/assets/stylesheets/bootstrap/_list-group.scss
+++ b/assets/stylesheets/bootstrap/_list-group.scss
@@ -3,19 +3,52 @@
// Easily usable on <ul>, <ol>, or <div>.
.list-group {
+ display: flex;
+ flex-direction: column;
+
// No need to set list-style: none; since .list-group-item is block level
padding-left: 0; // reset padding because ul and ol
margin-bottom: 0;
}
+// Interactive list items
+//
+// Use anchor or button elements instead of `li`s or `div`s to create interactive
+// list items. Includes an extra `.active` modifier class for selected items.
+
+.list-group-item-action {
+ width: 100%; // For `<button>`s (anchors become 100% by default though)
+ color: $list-group-link-color;
+ text-align: inherit; // For `<button>`s (anchors inherit)
+
+ .list-group-item-heading {
+ color: $list-group-link-heading-color;
+ }
+
+ // Hover state
+ @include hover-focus {
+ color: $list-group-link-hover-color;
+ text-decoration: none;
+ background-color: $list-group-hover-bg;
+ }
+
+ &:active {
+ color: $list-group-link-active-color;
+ background-color: $list-group-link-active-bg;
+ }
+}
+
+
// Individual list items
//
// Use on `li`s or `div`s within the `.list-group` parent.
.list-group-item {
position: relative;
- display: block;
+ display: flex;
+ flex-flow: row wrap;
+ align-items: center;
padding: $list-group-item-padding-y $list-group-item-padding-x;
// Place the border on the list items and negative margin up for better styling
margin-bottom: -$list-group-border-width;
@@ -31,71 +64,68 @@
@include border-bottom-radius($list-group-border-radius);
}
- &.disabled {
- @include plain-hover-focus {
- color: $list-group-disabled-color;
- cursor: $cursor-disabled;
- background-color: $list-group-disabled-bg;
-
- // Force color to inherit for custom content
- .list-group-item-heading {
- color: inherit;
- }
- .list-group-item-text {
- color: $list-group-disabled-text-color;
- }
+ @include hover-focus {
+ text-decoration: none;
+ }
+
+ &.disabled,
+ &:disabled {
+ color: $list-group-disabled-color;
+ cursor: $cursor-disabled;
+ background-color: $list-group-disabled-bg;
+
+ // Force color to inherit for custom content
+ .list-group-item-heading {
+ color: inherit;
+ }
+ .list-group-item-text {
+ color: $list-group-disabled-text-color;
}
}
+ // Include both here for `<a>`s and `<button>`s
&.active {
- @include plain-hover-focus {
- z-index: 2; // Place active items above their siblings for proper border styling
- color: $list-group-active-color;
- text-decoration: none; // Repeat here because it inherits global a:hover otherwise
- background-color: $list-group-active-bg;
- border-color: $list-group-active-border;
-
- // Force color to inherit for custom content
- .list-group-item-heading,
- .list-group-item-heading > small,
- .list-group-item-heading > .small {
- color: inherit;
- }
- .list-group-item-text {
- color: $list-group-active-text-color;
- }
+ z-index: 2; // Place active items above their siblings for proper border styling
+ color: $list-group-active-color;
+ background-color: $list-group-active-bg;
+ border-color: $list-group-active-border;
+
+ // Force color to inherit for custom content
+ .list-group-item-heading,
+ .list-group-item-heading > small,
+ .list-group-item-heading > .small {
+ color: inherit;
+ }
+
+ .list-group-item-text {
+ color: $list-group-active-text-color;
}
}
}
+
+// Flush list items
+//
+// Remove borders and border-radius to keep list group items edge-to-edge. Most
+// useful within other components (e.g., cards).
+
.list-group-flush {
.list-group-item {
border-right: 0;
border-left: 0;
border-radius: 0;
}
-}
-
-// Interactive list items
-//
-// Use anchor or button elements instead of `li`s or `div`s to create interactive
-// list items. Includes an extra `.active` modifier class for selected items.
-
-.list-group-item-action {
- width: 100%; // For `<button>`s (anchors become 100% by default though)
- color: $list-group-link-color;
- text-align: inherit; // For `<button>`s (anchors inherit)
-
- .list-group-item-heading {
- color: $list-group-link-heading-color;
+ &:first-child {
+ .list-group-item:first-child {
+ border-top: 0;
+ }
}
- // Hover state
- @include hover-focus {
- color: $list-group-link-hover-color;
- text-decoration: none;
- background-color: $list-group-hover-bg;
+ &:last-child {
+ .list-group-item:last-child {
+ border-bottom: 0;
+ }
}
}
@@ -109,17 +139,3 @@
@include list-group-item-variant(info, $state-info-bg, $state-info-text);
@include list-group-item-variant(warning, $state-warning-bg, $state-warning-text);
@include list-group-item-variant(danger, $state-danger-bg, $state-danger-text);
-
-
-// Custom content options
-//
-// Extra classes for creating well-formatted content within `.list-group-item`s.
-
-.list-group-item-heading {
- margin-top: 0;
- margin-bottom: $list-group-item-heading-margin-bottom;
-}
-.list-group-item-text {
- margin-bottom: 0;
- line-height: 1.3;
-}
diff --git a/assets/stylesheets/bootstrap/_media.scss b/assets/stylesheets/bootstrap/_media.scss
index d1ebbcd..b573052 100644
--- a/assets/stylesheets/bootstrap/_media.scss
+++ b/assets/stylesheets/bootstrap/_media.scss
@@ -1,81 +1,8 @@
-@if $enable-flex {
- .media {
- display: flex;
- }
- .media-body {
- flex: 1;
- }
- .media-middle {
- align-self: center;
- }
- .media-bottom {
- align-self: flex-end;
- }
-} @else {
- .media,
- .media-body {
- overflow: hidden;
- }
- .media-body {
- width: 10000px;
- }
- .media-left,
- .media-right,
- .media-body {
- display: table-cell;
- vertical-align: top;
- }
- .media-middle {
- vertical-align: middle;
- }
- .media-bottom {
- vertical-align: bottom;
- }
+.media {
+ display: flex;
+ align-items: flex-start;
}
-
-//
-// Images/elements as the media anchor
-//
-
-.media-object {
- display: block;
-
- // Fix collapse in webkit from max-width: 100% and display: table-cell.
- &.img-thumbnail {
- max-width: none;
- }
-}
-
-
-//
-// Alignment
-//
-
-.media-right {
- padding-left: $media-alignment-padding-x;
-}
-
-.media-left {
- padding-right: $media-alignment-padding-x;
-}
-
-
-//
-// Headings
-//
-
-.media-heading {
- margin-top: 0;
- margin-bottom: $media-heading-margin-bottom;
-}
-
-
-//
-// Media list variation
-//
-
-.media-list {
- padding-left: 0;
- list-style: none;
+.media-body {
+ flex: 1;
}
diff --git a/assets/stylesheets/bootstrap/_mixins.scss b/assets/stylesheets/bootstrap/_mixins.scss
index e53ab34..da47382 100644
--- a/assets/stylesheets/bootstrap/_mixins.scss
+++ b/assets/stylesheets/bootstrap/_mixins.scss
@@ -10,7 +10,11 @@
@mixin transition($transition...) {
@if $enable-transitions {
- transition: $transition;
+ @if length($transition) == 0 {
+ transition: $transition-base;
+ } @else {
+ transition: $transition;
+ }
}
}
@@ -18,16 +22,16 @@
@import "mixins/breakpoints";
@import "mixins/hover";
@import "mixins/image";
-@import "mixins/tag";
-@import "mixins/reset-filter";
+@import "mixins/badge";
@import "mixins/resize";
@import "mixins/screen-reader";
@import "mixins/size";
-@import "mixins/tab-focus";
@import "mixins/reset-text";
@import "mixins/text-emphasis";
@import "mixins/text-hide";
@import "mixins/text-truncate";
+@import "mixins/transforms";
+@import "mixins/visibility";
// // Components
@import "mixins/alert";
@@ -38,7 +42,6 @@
@import "mixins/list-group";
@import "mixins/nav-divider";
@import "mixins/forms";
-@import "mixins/progress";
@import "mixins/table-row";
// // Skins
diff --git a/assets/stylesheets/bootstrap/_modal.scss b/assets/stylesheets/bootstrap/_modal.scss
index c326d56..9d2a867 100644
--- a/assets/stylesheets/bootstrap/_modal.scss
+++ b/assets/stylesheets/bootstrap/_modal.scss
@@ -28,10 +28,10 @@
// When fading in the modal, animate it to slide down
&.fade .modal-dialog {
- transition: transform .3s ease-out;
+ @include transition($modal-transition);
transform: translate(0, -25%);
}
- &.in .modal-dialog { transform: translate(0, 0); }
+ &.show .modal-dialog { transform: translate(0, 0); }
}
.modal-open .modal {
overflow-x: hidden;
@@ -48,6 +48,8 @@
// Actual modal
.modal-content {
position: relative;
+ display: flex;
+ flex-direction: column;
background-color: $modal-content-bg;
background-clip: padding-box;
border: $modal-content-border-width solid $modal-content-border-color;
@@ -64,29 +66,27 @@
right: 0;
bottom: 0;
left: 0;
- z-index: $zindex-modal-bg;
+ z-index: $zindex-modal-backdrop;
background-color: $modal-backdrop-bg;
// Fade for backdrop
&.fade { opacity: 0; }
- &.in { opacity: $modal-backdrop-opacity; }
+ &.show { opacity: $modal-backdrop-opacity; }
}
// Modal header
// Top section of the modal w/ title and dismiss
.modal-header {
- padding: $modal-title-padding;
+ display: flex;
+ align-items: center; // vertically center it
+ justify-content: space-between; // Put modal header elements (title and dismiss) on opposite ends
+ padding: $modal-header-padding;
border-bottom: $modal-header-border-width solid $modal-header-border-color;
- @include clearfix;
-}
-// Close icon
-.modal-header .close {
- margin-top: -2px;
}
// Title text within header
.modal-title {
- margin: 0;
+ margin-bottom: 0;
line-height: $modal-title-line-height;
}
@@ -94,15 +94,23 @@
// Where all modal content resides (sibling of .modal-header and .modal-footer)
.modal-body {
position: relative;
+ // Enable `flex-grow: 1` so that the body take up as much space as possible
+ // when should there be a fixed height on `.modal-dialog`.
+ flex: 1 1 auto;
padding: $modal-inner-padding;
}
// Footer (for actions)
.modal-footer {
+ display: flex;
+ align-items: center; // vertically center
+ justify-content: flex-end; // Right align buttons with flex property because text-align doesn't work on flex items
padding: $modal-inner-padding;
- text-align: right; // right align buttons
border-top: $modal-footer-border-width solid $modal-footer-border-color;
- @include clearfix(); // clear it in case folks use .pull-* classes on buttons
+
+ // Easily place margin between footer elements
+ > :not(:first-child) { margin-left: .25rem; }
+ > :not(:last-child) { margin-right: .25rem; }
}
// Measure scrollbar width for padding body during modal show/hide
diff --git a/assets/stylesheets/bootstrap/_nav.scss b/assets/stylesheets/bootstrap/_nav.scss
index 640956c..eb316bb 100644
--- a/assets/stylesheets/bootstrap/_nav.scss
+++ b/assets/stylesheets/bootstrap/_nav.scss
@@ -4,13 +4,15 @@
// `<nav>`s or `<ul>`s.
.nav {
+ display: flex;
padding-left: 0;
margin-bottom: 0;
list-style: none;
}
.nav-link {
- display: inline-block;
+ display: block;
+ padding: $nav-link-padding;
@include hover-focus {
text-decoration: none;
@@ -19,26 +21,7 @@
// Disabled state lightens text and removes hover/tab effects
&.disabled {
color: $nav-disabled-link-color;
-
- @include plain-hover-focus {
- color: $nav-disabled-link-hover-color;
- cursor: $cursor-disabled;
- background-color: $nav-disabled-link-hover-bg;
- }
- }
-}
-
-
-// Nav inline
-
-.nav-inline {
- .nav-item {
- display: inline-block;
- }
-
- .nav-item + .nav-item,
- .nav-link + .nav-link {
- margin-left: $nav-item-inline-spacer;
+ cursor: $cursor-disabled;
}
}
@@ -49,21 +32,12 @@
.nav-tabs {
border-bottom: $nav-tabs-border-width solid $nav-tabs-border-color;
- @include clearfix();
.nav-item {
- float: left;
- // Make the list-items overlay the bottom border
margin-bottom: -$nav-tabs-border-width;
-
- + .nav-item {
- margin-left: $nav-item-margin;
- }
}
.nav-link {
- display: block;
- padding: $nav-link-padding;
border: $nav-tabs-border-width solid transparent;
@include border-top-radius($nav-tabs-border-radius);
@@ -72,21 +46,17 @@
}
&.disabled {
- @include plain-hover-focus {
- color: $nav-disabled-link-color;
- background-color: transparent;
- border-color: transparent;
- }
+ color: $nav-disabled-link-color;
+ background-color: transparent;
+ border-color: transparent;
}
}
.nav-link.active,
- .nav-item.open .nav-link {
- @include plain-hover-focus {
- color: $nav-tabs-active-link-hover-color;
- background-color: $nav-tabs-active-link-hover-bg;
- border-color: $nav-tabs-active-link-hover-border-color $nav-tabs-active-link-hover-border-color transparent;
- }
+ .nav-item.show .nav-link {
+ color: $nav-tabs-active-link-hover-color;
+ background-color: $nav-tabs-active-link-hover-bg;
+ border-color: $nav-tabs-active-link-hover-border-color $nav-tabs-active-link-hover-border-color $nav-tabs-active-link-hover-bg;
}
.dropdown-menu {
@@ -103,50 +73,42 @@
//
.nav-pills {
- @include clearfix();
-
- .nav-item {
- float: left;
-
- + .nav-item {
- margin-left: $nav-item-margin;
- }
- }
-
.nav-link {
- display: block;
- padding: $nav-link-padding;
@include border-radius($nav-pills-border-radius);
}
.nav-link.active,
- .nav-item.open .nav-link {
- @include plain-hover-focus {
- color: $nav-pills-active-link-color;
- cursor: default;
- background-color: $nav-pills-active-link-bg;
- }
+ .nav-item.show .nav-link {
+ color: $nav-pills-active-link-color;
+ cursor: default;
+ background-color: $nav-pills-active-link-bg;
}
}
-.nav-stacked {
+
+//
+// Justified variants
+//
+
+.nav-fill {
.nav-item {
- display: block;
- float: none;
+ flex: 1 1 auto;
+ text-align: center;
+ }
+}
- + .nav-item {
- margin-top: $nav-item-margin;
- margin-left: 0;
- }
+.nav-justified {
+ .nav-item {
+ flex: 1 1 100%;
+ text-align: center;
}
}
-//
// Tabbable tabs
//
-
// Hide tabbable panes to start, show them when `.active`
+
.tab-content {
> .tab-pane {
display: none;
diff --git a/assets/stylesheets/bootstrap/_navbar.scss b/assets/stylesheets/bootstrap/_navbar.scss
index 7dc2a2b..80beec8 100644
--- a/assets/stylesheets/bootstrap/_navbar.scss
+++ b/assets/stylesheets/bootstrap/_navbar.scss
@@ -1,79 +1,40 @@
-// Wrapper and base class
+// Contents
+//
+// Navbar
+// Navbar brand
+// Navbar nav
+// Navbar text
+// Navbar divider
+// Responsive navbar
+// Navbar position
+// Navbar themes
+
+
+// Navbar
//
// Provide a static navbar from which we expand to create full-width, fixed, and
// other navbar variations.
.navbar {
position: relative;
+ display: flex;
+ flex-direction: column;
padding: $navbar-padding-y $navbar-padding-x;
- @include clearfix;
-
- @include media-breakpoint-up(sm) {
- @include border-radius($navbar-border-radius);
- }
}
-// Navbar alignment options
-//
-// Display the navbar across the entirety of the page or fixed it to the top or
-// bottom of the page.
-
-// A static, full width modifier with no rounded corners.
-.navbar-full {
- z-index: $zindex-navbar;
-
- @include media-breakpoint-up(sm) {
- @include border-radius(0);
- }
-}
-
-// Fix the top/bottom navbars when screen real estate supports it
-.navbar-fixed-top,
-.navbar-fixed-bottom {
- position: fixed;
- right: 0;
- left: 0;
- z-index: $zindex-navbar-fixed;
-
- // Undo the rounded corners
- @include media-breakpoint-up(sm) {
- @include border-radius(0);
- }
-}
-
-.navbar-fixed-top {
- top: 0;
-}
-
-.navbar-fixed-bottom {
- bottom: 0;
-}
-
-.navbar-sticky-top {
- position: sticky;
- top: 0;
- z-index: $zindex-navbar-sticky;
- width: 100%;
-
- // Undo the rounded corners
- @include media-breakpoint-up(sm) {
- @include border-radius(0);
- }
-}
-
-
-//
-// Brand/project name
+// Navbar brand
//
+// Used for brand, project, or site names.
.navbar-brand {
- float: left;
- padding-top: $navbar-brand-padding-y;
- padding-bottom: $navbar-brand-padding-y;
- margin-right: 1rem;
+ display: inline-block;
+ padding-top: .25rem;
+ padding-bottom: .25rem;
+ margin-right: $navbar-padding-x;
font-size: $font-size-lg;
line-height: inherit;
+ white-space: nowrap;
@include hover-focus {
text-decoration: none;
@@ -81,17 +42,20 @@
}
-.navbar-divider {
- float: left;
- width: $border-width;
- padding-top: $navbar-divider-padding-y;
- padding-bottom: $navbar-divider-padding-y;
- margin-right: $navbar-padding-x;
- margin-left: $navbar-padding-x;
- overflow: hidden;
+// Navbar nav
+//
+// Custom navbar navigation (doesn't require `.nav`, but does make use of `.nav-link`).
+
+.navbar-nav {
+ display: flex;
+ flex-direction: column; // cannot use `inherit` to get the `.navbar`s value
+ padding-left: 0;
+ margin-bottom: 0;
+ list-style: none;
- &::before {
- content: "\00a0";
+ .nav-link {
+ padding-right: 0;
+ padding-left: 0;
}
}
@@ -107,20 +71,19 @@
}
-// Navbar toggle
+// Responsive navbar
//
-// Custom button for toggling the `.navbar-collapse`, powered by the collapse
-// Bootstrap JavaScript plugin.
+// Custom styles for responsive collapsing and toggling of navbar contents.
+// Powered by the collapse Bootstrap JavaScript plugin.
+// Button for toggling the navbar when in its collapsed state
.navbar-toggler {
- width: 2.5em;
- height: 2em;
+ align-self: flex-start; // Prevent toggler from growing to full width when it's the only visible navbar child
padding: $navbar-toggler-padding-y $navbar-toggler-padding-x;
font-size: $navbar-toggler-font-size;
line-height: 1;
- background: transparent no-repeat center center;
- background-size: 24px 24px;
- border: $border-width solid transparent;
+ background: transparent; // remove default button style
+ border: $border-width solid transparent; // remove default button style
@include border-radius($navbar-toggler-border-radius);
@include hover-focus {
@@ -128,66 +91,92 @@
}
}
-// scss-lint:disable ImportantRule
+// Keep as a separate element so folks can easily override it with another icon
+// or image file as needed.
+.navbar-toggler-icon {
+ display: inline-block;
+ width: 1.5em;
+ height: 1.5em;
+ vertical-align: middle;
+ content: "";
+ background: no-repeat center center;
+ background-size: 100% 100%;
+}
+
+// Use `position` on the toggler to prevent it from being auto placed as a flex
+// item and allow easy placement.
+.navbar-toggler-left {
+ position: absolute;
+ left: $navbar-padding-x;
+}
+.navbar-toggler-right {
+ position: absolute;
+ right: $navbar-padding-x;
+}
+
+// Generate series of `.navbar-toggleable-*` responsive classes for configuring
+// where your navbar collapses.
.navbar-toggleable {
@each $breakpoint in map-keys($grid-breakpoints) {
$next: breakpoint-next($breakpoint, $grid-breakpoints);
+ $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
- &-#{$breakpoint} {
- @include clearfix;
-
+ &#{$infix} {
@include media-breakpoint-down($breakpoint) {
- .navbar-brand {
- display: block;
- float: none;
- margin-top: .5rem;
- margin-right: 0;
- }
-
.navbar-nav {
- margin-top: .5rem;
- margin-bottom: .5rem;
-
.dropdown-menu {
position: static;
float: none;
}
}
+
+ > .container {
+ padding-right: 0;
+ padding-left: 0;
+ }
}
@include media-breakpoint-up($next) {
- display: block;
- }
- }
- }
-}
-// scss-lint:enable ImportantRule
+ flex-direction: row;
+ flex-wrap: nowrap;
+ align-items: center;
+ .navbar-nav {
+ flex-direction: row;
-// Navigation
-//
-// Custom navbar navigation built on the base `.nav` styles.
+ .nav-link {
+ padding-right: .5rem;
+ padding-left: .5rem;
+ }
+ }
-.navbar-nav {
- .nav-item {
- float: left;
- }
+ // For nesting containers, have to redeclare for alignment purposes
+ > .container {
+ display: flex;
+ flex-wrap: nowrap;
+ align-items: center;
+ }
- .nav-link {
- display: block;
- padding-top: .425rem;
- padding-bottom: .425rem;
+ // scss-lint:disable ImportantRule
+ .navbar-collapse {
+ display: flex !important;
+ width: 100%;
+ }
+ // scss-lint:enable ImportantRule
- + .nav-link {
- margin-left: 1rem;
+ .navbar-toggler {
+ display: none;
+ }
+ }
}
}
-
- .nav-item + .nav-item {
- margin-left: 1rem;
- }
}
+
+// Navbar themes
+//
+// Styles for switching between navbars with light or dark background.
+
// Dark links against a light background
.navbar-light {
.navbar-brand,
@@ -206,45 +195,54 @@
@include hover-focus {
color: $navbar-light-hover-color;
}
+
+ &.disabled {
+ color: $navbar-light-disabled-color;
+ }
}
.open > .nav-link,
.active > .nav-link,
.nav-link.open,
.nav-link.active {
- @include plain-hover-focus {
- color: $navbar-light-active-color;
- }
+ color: $navbar-light-active-color;
}
}
.navbar-toggler {
- background-image: $navbar-light-toggler-bg;
border-color: $navbar-light-toggler-border;
}
- .navbar-divider {
- background-color: rgba(0,0,0,.075);
+ .navbar-toggler-icon {
+ background-image: $navbar-light-toggler-bg;
+ }
+
+ .navbar-text {
+ color: $navbar-light-color;
}
}
// White links against a dark background
-.navbar-dark {
+.navbar-inverse {
.navbar-brand,
.navbar-toggler {
- color: $navbar-dark-active-color;
+ color: $navbar-inverse-active-color;
@include hover-focus {
- color: $navbar-dark-active-color;
+ color: $navbar-inverse-active-color;
}
}
.navbar-nav {
.nav-link {
- color: $navbar-dark-color;
+ color: $navbar-inverse-color;
@include hover-focus {
- color: $navbar-dark-hover-color;
+ color: $navbar-inverse-hover-color;
+ }
+
+ &.disabled {
+ color: $navbar-inverse-disabled-color;
}
}
@@ -252,64 +250,19 @@
.active > .nav-link,
.nav-link.open,
.nav-link.active {
- @include plain-hover-focus {
- color: $navbar-dark-active-color;
- }
+ color: $navbar-inverse-active-color;
}
}
.navbar-toggler {
- background-image: $navbar-dark-toggler-bg;
- border-color: $navbar-dark-toggler-border;
+ border-color: $navbar-inverse-toggler-border;
}
- .navbar-divider {
- background-color: rgba(255,255,255,.075);
+ .navbar-toggler-icon {
+ background-image: $navbar-inverse-toggler-bg;
}
-}
-
-// Navbar toggleable
-//
-// Custom override for collapse plugin in navbar.
-
-.navbar-toggleable {
- &-xs {
- @include clearfix;
- @include media-breakpoint-down(xs) {
- .navbar-nav .nav-item {
- float: none;
- margin-left: 0;
- }
- }
- @include media-breakpoint-up(sm) {
- display: block !important;
- }
- }
-
- &-sm {
- @include clearfix;
- @include media-breakpoint-down(sm) {
- .navbar-nav .nav-item {
- float: none;
- margin-left: 0;
- }
- }
- @include media-breakpoint-up(md) {
- display: block !important;
- }
- }
-
- &-md {
- @include clearfix;
- @include media-breakpoint-down(md) {
- .navbar-nav .nav-item {
- float: none;
- margin-left: 0;
- }
- }
- @include media-breakpoint-up(lg) {
- display: block !important;
- }
+ .navbar-text {
+ color: $navbar-inverse-color;
}
}
diff --git a/assets/stylesheets/bootstrap/_normalize.scss b/assets/stylesheets/bootstrap/_normalize.scss
index 827b7f3..6bafd53 100644
--- a/assets/stylesheets/bootstrap/_normalize.scss
+++ b/assets/stylesheets/bootstrap/_normalize.scss
@@ -1,11 +1,15 @@
-/*! normalize.css v4.2.0 | MIT License | github.com/necolas/normalize.css */
+/*! normalize.css v5.0.0 | MIT License | github.com/necolas/normalize.css */
//
// 1. Change the default font family in all browsers (opinionated).
// 2. Correct the line height in all browsers.
-// 3. Prevent adjustments of font size after orientation changes in IE and iOS.
+// 3. Prevent adjustments of font size after orientation changes in
+// IE on Windows Phone and in iOS.
//
+// Document
+// ==========================================================================
+
html {
font-family: sans-serif; // 1
line-height: 1.15; // 2
@@ -13,6 +17,9 @@ html {
-webkit-text-size-adjust: 100%; // 3
}
+// Sections
+// ==========================================================================
+
//
// Remove the margin in all browsers (opinionated).
//
@@ -21,69 +28,73 @@ body {
margin: 0;
}
-// HTML5 display definitions
-// ==========================================================================
-
//
// Add the correct display in IE 9-.
-// 1. Add the correct display in Edge, IE, and Firefox.
-// 2. Add the correct display in IE.
//
article,
aside,
-details, // 1
-figcaption,
-figure,
footer,
header,
-main, // 2
-menu,
nav,
-section,
-summary { // 1
+section {
display: block;
}
//
+// Correct the font size and margin on `h1` elements within `section` and
+// `article` contexts in Chrome, Firefox, and Safari.
+//
+
+h1 {
+ font-size: 2em;
+ margin: 0.67em 0;
+}
+
+// Grouping content
+// ==========================================================================
+
+//
// Add the correct display in IE 9-.
+// 1. Add the correct display in IE.
//
-audio,
-canvas,
-progress,
-video {
- display: inline-block;
+figcaption,
+figure,
+main { // 1
+ display: block;
}
//
-// Add the correct display in iOS 4-7.
+// Add the correct margin in IE 8.
//
-audio:not([controls]) {
- display: none;
- height: 0;
+figure {
+ margin: 1em 40px;
}
//
-// Add the correct vertical alignment in Chrome, Firefox, and Opera.
+// 1. Add the correct box sizing in Firefox.
+// 2. Show the overflow in Edge and IE.
//
-progress {
- vertical-align: baseline;
+hr {
+ box-sizing: content-box; // 1
+ height: 0; // 1
+ overflow: visible; // 2
}
//
-// Add the correct display in IE 10-.
-// 1. Add the correct display in IE.
+// 1. Correct the inheritance and scaling of font size in all browsers.
+// 2. Correct the odd `em` font sizing in all browsers.
//
-template, // 1
-[hidden] {
- display: none;
+pre {
+ font-family: monospace, monospace; // 1
+ font-size: 1em; // 2
}
-// Links
+// Text-level semantics
// ==========================================================================
//
@@ -106,9 +117,6 @@ a:hover {
outline-width: 0;
}
-// Text-level semantics
-// ==========================================================================
-
//
// 1. Remove the bottom border in Firefox 39-.
// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
@@ -139,21 +147,23 @@ strong {
}
//
-// Add the correct font style in Android 4.3-.
+// 1. Correct the inheritance and scaling of font size in all browsers.
+// 2. Correct the odd `em` font sizing in all browsers.
//
-dfn {
- font-style: italic;
+code,
+kbd,
+samp {
+ font-family: monospace, monospace; // 1
+ font-size: 1em; // 2
}
//
-// Correct the font size and margin on `h1` elements within `section` and
-// `article` contexts in Chrome, Firefox, and Safari.
+// Add the correct font style in Android 4.3-.
//
-h1 {
- font-size: 2em;
- margin: 0.67em 0;
+dfn {
+ font-style: italic;
}
//
@@ -198,61 +208,44 @@ sup {
// ==========================================================================
//
-// Remove the border on images inside links in IE 10-.
-//
-
-img {
- border-style: none;
-}
-
-//
-// Hide the overflow in IE.
+// Add the correct display in IE 9-.
//
-svg:not(:root) {
- overflow: hidden;
+audio,
+video {
+ display: inline-block;
}
-// Grouping content
-// ==========================================================================
-
//
-// 1. Correct the inheritance and scaling of font size in all browsers.
-// 2. Correct the odd `em` font sizing in all browsers.
+// Add the correct display in iOS 4-7.
//
-code,
-kbd,
-pre,
-samp {
- font-family: monospace, monospace; // 1
- font-size: 1em; // 2
+audio:not([controls]) {
+ display: none;
+ height: 0;
}
//
-// Add the correct margin in IE 8.
+// Remove the border on images inside links in IE 10-.
//
-figure {
- margin: 1em 40px;
+img {
+ border-style: none;
}
//
-// 1. Add the correct box sizing in Firefox.
-// 2. Show the overflow in Edge and IE.
+// Hide the overflow in IE.
//
-hr {
- box-sizing: content-box; // 1
- height: 0; // 1
- overflow: visible; // 2
+svg:not(:root) {
+ overflow: hidden;
}
// Forms
// ==========================================================================
//
-// 1. Change font properties to `inherit` in all browsers (opinionated).
+// 1. Change the font styles in all browsers (opinionated).
// 2. Remove the margin in Firefox and Safari.
//
@@ -261,19 +254,13 @@ input,
optgroup,
select,
textarea {
- font: inherit; // 1
+ font-family: sans-serif; // 1
+ font-size: 100%; // 1
+ line-height: 1.15; // 1
margin: 0; // 2
}
//
-// Restore the font weight unset by the previous rule.
-//
-
-optgroup {
- font-weight: bold;
-}
-
-//
// Show the overflow in IE.
// 1. Show the overflow in Edge.
//
@@ -356,6 +343,16 @@ legend {
}
//
+// 1. Add the correct display in IE 9-.
+// 2. Add the correct vertical alignment in Chrome, Firefox, and Opera.
+//
+
+progress {
+ display: inline-block; // 1
+ vertical-align: baseline; // 2
+}
+
+//
// Remove the default vertical scrollbar in IE.
//
@@ -394,7 +391,7 @@ textarea {
}
//
-// Remove the inner padding and cancel buttons in Chrome and Safari on OS X.
+// Remove the inner padding and cancel buttons in Chrome and Safari on macOS.
//
[type="search"]::-webkit-search-cancel-button,
@@ -403,15 +400,6 @@ textarea {
}
//
-// Correct the text style of placeholders in Chrome, Edge, and Safari.
-//
-
-::-webkit-input-placeholder {
- color: inherit;
- opacity: 0.54;
-}
-
-//
// 1. Correct the inability to style clickable types in iOS and Safari.
// 2. Change font properties to `inherit` in Safari.
//
@@ -420,3 +408,54 @@ textarea {
-webkit-appearance: button; // 1
font: inherit; // 2
}
+
+// Interactive
+// ==========================================================================
+
+//
+// Add the correct display in IE 9-.
+// 1. Add the correct display in Edge, IE, and Firefox.
+//
+
+details, // 1
+menu {
+ display: block;
+}
+
+//
+// Add the correct display in all browsers.
+//
+
+summary {
+ display: list-item;
+}
+
+// Scripting
+// ==========================================================================
+
+//
+// Add the correct display in IE 9-.
+//
+
+canvas {
+ display: inline-block;
+}
+
+//
+// Add the correct display in IE.
+//
+
+template {
+ display: none;
+}
+
+// Hidden
+// ==========================================================================
+
+//
+// Add the correct display in IE 10-.
+//
+
+[hidden] {
+ display: none;
+}
diff --git a/assets/stylesheets/bootstrap/_pagination.scss b/assets/stylesheets/bootstrap/_pagination.scss
index 5f40a7f..24aa028 100644
--- a/assets/stylesheets/bootstrap/_pagination.scss
+++ b/assets/stylesheets/bootstrap/_pagination.scss
@@ -1,14 +1,12 @@
.pagination {
- display: inline-block;
- padding-left: 0;
- margin-top: $spacer-y;
- margin-bottom: $spacer-y;
+ display: flex;
+ // 1-2: Disable browser default list styles
+ padding-left: 0; // 1
+ list-style: none; // 2
@include border-radius();
}
.page-item {
- display: inline; // Remove list-style and block-level defaults
-
&:first-child {
.page-link {
margin-left: 0;
@@ -22,38 +20,34 @@
}
&.active .page-link {
- @include plain-hover-focus {
- z-index: 2;
- color: $pagination-active-color;
- cursor: default;
- background-color: $pagination-active-bg;
- border-color: $pagination-active-border;
- }
+ z-index: 2;
+ color: $pagination-active-color;
+ background-color: $pagination-active-bg;
+ border-color: $pagination-active-border;
}
&.disabled .page-link {
- @include plain-hover-focus {
- color: $pagination-disabled-color;
- pointer-events: none;
- cursor: $cursor-disabled;
- background-color: $pagination-disabled-bg;
- border-color: $pagination-disabled-border;
- }
+ color: $pagination-disabled-color;
+ pointer-events: none;
+ cursor: $cursor-disabled; // While `pointer-events: none` removes the cursor in modern browsers, we provide a disabled cursor as a fallback.
+ background-color: $pagination-disabled-bg;
+ border-color: $pagination-disabled-border;
}
}
.page-link {
position: relative;
- float: left; // Collapse white-space
+ display: block;
padding: $pagination-padding-y $pagination-padding-x;
margin-left: -1px;
+ line-height: $pagination-line-height;
color: $pagination-color;
- text-decoration: none;
background-color: $pagination-bg;
border: $pagination-border-width solid $pagination-border-color;
@include hover-focus {
color: $pagination-hover-color;
+ text-decoration: none;
background-color: $pagination-hover-bg;
border-color: $pagination-hover-border;
}
diff --git a/assets/stylesheets/bootstrap/_popover.scss b/assets/stylesheets/bootstrap/_popover.scss
index 86b489a..1b63634 100644
--- a/assets/stylesheets/bootstrap/_popover.scss
+++ b/assets/stylesheets/bootstrap/_popover.scss
@@ -130,12 +130,12 @@
// Offset the popover to account for the popover arrow
.popover-title {
padding: $popover-title-padding-y $popover-title-padding-x;
- margin: 0; // reset heading margin
+ margin-bottom: 0; // Reset the default from Reboot
font-size: $font-size-base;
background-color: $popover-title-bg;
border-bottom: $popover-border-width solid darken($popover-title-bg, 5%);
- $offset-border-width: ($border-width / $font-size-root);
- @include border-radius(($border-radius-lg - $offset-border-width) ($border-radius-lg - $offset-border-width) 0 0);
+ $offset-border-width: calc(#{$border-radius-lg} - #{$popover-border-width});
+ @include border-top-radius($offset-border-width);
&:empty {
display: none;
diff --git a/assets/stylesheets/bootstrap/_print.scss b/assets/stylesheets/bootstrap/_print.scss
index bd41328..e20219a 100644
--- a/assets/stylesheets/bootstrap/_print.scss
+++ b/assets/stylesheets/bootstrap/_print.scss
@@ -13,7 +13,10 @@
*,
*::before,
*::after,
- *::first-letter,
+ p::first-letter,
+ div::first-letter,
+ blockquote::first-letter,
+ li::first-letter,
p::first-line,
div::first-line,
blockquote::first-line,
@@ -92,13 +95,7 @@
.navbar {
display: none;
}
- .btn,
- .dropup > .btn {
- > .caret {
- border-top-color: #000 !important;
- }
- }
- .tag {
+ .badge {
border: $border-width solid #000;
}
diff --git a/assets/stylesheets/bootstrap/_progress.scss b/assets/stylesheets/bootstrap/_progress.scss
index c2364fe..02e4c3b 100644
--- a/assets/stylesheets/bootstrap/_progress.scss
+++ b/assets/stylesheets/bootstrap/_progress.scss
@@ -1,145 +1,32 @@
-//
// Progress animations
-//
-
@keyframes progress-bar-stripes {
- from { background-position: $spacer-y 0; }
+ from { background-position: $progress-height 0; }
to { background-position: 0 0; }
}
-
-//
// Basic progress bar
-//
-
.progress {
- display: block;
- width: 100%;
- height: $spacer-y; // todo: make a new var for this
- margin-bottom: $spacer-y;
-}
-.progress[value] {
- // Set overall background
- background-color: $progress-bg;
- // Remove Firefox and Opera border
- border: 0;
- // Reset the default appearance
- appearance: none;
- // Set overall border radius
- @include border-radius($progress-border-radius);
-}
-
-// Filled-in portion of the bar
-.progress[value]::-ms-fill {
- background-color: $progress-bar-color;
- // Remove right-hand border of value bar from IE10+/Edge
- border: 0;
-}
-.progress[value]::-moz-progress-bar {
- background-color: $progress-bar-color;
- @include border-left-radius($progress-border-radius);
-}
-.progress[value]::-webkit-progress-value {
- background-color: $progress-bar-color;
- @include border-left-radius($progress-border-radius);
-}
-// Tweaks for full progress bar
-.progress[value="100"]::-moz-progress-bar {
- @include border-right-radius($progress-border-radius);
-}
-.progress[value="100"]::-webkit-progress-value {
- @include border-right-radius($progress-border-radius);
-}
-
-// Unfilled portion of the bar
-.progress[value]::-webkit-progress-bar {
+ display: flex;
+ overflow: hidden; // force rounded corners by cropping it
+ font-size: $progress-font-size;
+ line-height: $progress-height;
+ text-align: center;
background-color: $progress-bg;
@include border-radius($progress-border-radius);
- @include box-shadow($progress-box-shadow);
}
-base::-moz-progress-bar, // Absurd-but-syntactically-valid selector to make these styles Firefox-only
-.progress[value] {
- background-color: $progress-bg;
- @include border-radius($progress-border-radius);
- @include box-shadow($progress-box-shadow);
-}
-
-// IE9 hacks to accompany custom markup. We don't need to scope this via media queries, but I feel better doing it anyway.
-@media screen and (min-width:0\0) {
- .progress {
- background-color: $progress-bg;
- @include border-radius($progress-border-radius);
- @include box-shadow($progress-box-shadow);
- }
- .progress-bar {
- display: inline-block;
- height: $spacer-y;
- text-indent: -999rem; // Simulate hiding of value as in native `<progress>`
- background-color: $progress-bar-color;
- @include border-left-radius($progress-border-radius);
- }
- .progress[width="100%"] {
- @include border-right-radius($progress-border-radius);
- }
+.progress-bar {
+ height: $progress-height;
+ color: $progress-bar-color;
+ background-color: $progress-bar-bg;
}
-
-//
// Striped
-//
-
-.progress-striped[value]::-webkit-progress-value {
+.progress-bar-striped {
@include gradient-striped();
- background-size: $spacer-y $spacer-y;
-}
-.progress-striped[value]::-moz-progress-bar {
- @include gradient-striped();
- background-size: $spacer-y $spacer-y;
-}
-.progress-striped[value]::-ms-fill {
- @include gradient-striped();
- background-size: $spacer-y $spacer-y;
-}
-// IE9
-@media screen and (min-width:0\0) {
- .progress-bar-striped {
- @include gradient-striped();
- background-size: $spacer-y $spacer-y;
- }
+ background-size: $progress-height $progress-height;
}
-
-//
// Animated
-//
-
-.progress-animated[value]::-webkit-progress-value {
- animation: progress-bar-stripes 2s linear infinite;
-}
-.progress-animated[value]::-moz-progress-bar {
- animation: progress-bar-stripes 2s linear infinite;
-}
-// IE9
-@media screen and (min-width:0\0) {
- .progress-animated .progress-bar-striped {
- animation: progress-bar-stripes 2s linear infinite;
- }
-}
-
-
-//
-// Variations
-//
-
-.progress-success {
- @include progress-variant($progress-bar-success-bg);
-}
-.progress-info {
- @include progress-variant($progress-bar-info-bg);
-}
-.progress-warning {
- @include progress-variant($progress-bar-warning-bg);
-}
-.progress-danger {
- @include progress-variant($progress-bar-danger-bg);
+.progress-bar-animated {
+ animation: progress-bar-stripes $progress-bar-animation-timing;
}
diff --git a/assets/stylesheets/bootstrap/_reboot.scss b/assets/stylesheets/bootstrap/_reboot.scss
index 461ca40..557829f 100644
--- a/assets/stylesheets/bootstrap/_reboot.scss
+++ b/assets/stylesheets/bootstrap/_reboot.scss
@@ -55,23 +55,27 @@ html {
//
html {
- // Sets a specific default `font-size` for user with `rem` type scales.
- font-size: $font-size-root;
+ // We assume no initial pixel `font-size` for accessibility reasons. This
+ // allows web visitors to customize their browser default font-size, making
+ // your project more inclusive and accessible to everyone.
+
// As a side-effect of setting the @viewport above,
// IE11 & Edge make the scrollbar overlap the content and automatically hide itself when not in use.
// Unfortunately, the auto-showing of the scrollbar is sometimes too sensitive,
// thus making it hard to click on stuff near the right edge of the page.
// So we add this style to force IE11 & Edge to use a "normal", non-overlapping, non-auto-hiding scrollbar.
// See https://github.com/twbs/bootstrap/issues/18543
+ // and https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/7165383/
-ms-overflow-style: scrollbar;
+
// Changes the default tap highlight to be completely transparent in iOS.
-webkit-tap-highlight-color: rgba(0,0,0,0);
}
body {
- // Make the `body` use the `font-size-root`
font-family: $font-family-base;
font-size: $font-size-base;
+ font-weight: $font-weight-base;
line-height: $line-height-base;
// Go easy on the eyes and use something other than `#000` for text
color: $body-color;
@@ -111,12 +115,11 @@ p {
margin-bottom: 1rem;
}
-// Abbreviations and acronyms
+// Abbreviations
abbr[title],
// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257
abbr[data-original-title] {
cursor: help;
- border-bottom: 1px dotted $abbr-border-color;
}
address {
@@ -165,10 +168,6 @@ a {
color: $link-hover-color;
text-decoration: $link-hover-decoration;
}
-
- &:focus {
- @include tab-focus();
- }
}
// And undo these styles for placeholder links/named anchors (without href)
@@ -187,7 +186,7 @@ a:not([href]):not([tabindex]) {
}
&:focus {
- outline: none;
+ outline: 0;
}
}
@@ -335,8 +334,8 @@ input[type="month"] {
// Remove the default appearance of temporal inputs to avoid a Mobile Safari
// bug where setting a custom line-height prevents text from being vertically
// centered within the input.
- //
- // Bug report: https://github.com/twbs/bootstrap/issues/11266
+ // See https://bugs.webkit.org/show_bug.cgi?id=139848
+ // and https://github.com/twbs/bootstrap/issues/11266
-webkit-appearance: listbox;
}
@@ -346,9 +345,11 @@ textarea {
}
fieldset {
- // Chrome and Firefox set a `min-width: min-content;` on fieldsets,
- // so we reset that to ensure it behaves more like a standard block element.
- // See https://github.com/twbs/bootstrap/issues/12359.
+ // Browsers set a default `min-width: min-content;` on fieldsets,
+ // unlike e.g. `<div>`s, which have `min-width: 0;` by default.
+ // So we reset that to ensure fieldsets behave more like a standard block element.
+ // See https://github.com/twbs/bootstrap/issues/12359
+ // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements
min-width: 0;
// Reset the default outline behavior of fieldsets so they don't affect page layout.
padding: 0;
diff --git a/assets/stylesheets/bootstrap/_responsive-embed.scss b/assets/stylesheets/bootstrap/_responsive-embed.scss
index 2443219..d3362b6 100644
--- a/assets/stylesheets/bootstrap/_responsive-embed.scss
+++ b/assets/stylesheets/bootstrap/_responsive-embed.scss
@@ -3,10 +3,15 @@
.embed-responsive {
position: relative;
display: block;
- height: 0;
+ width: 100%;
padding: 0;
overflow: hidden;
+ &::before {
+ display: block;
+ content: "";
+ }
+
.embed-responsive-item,
iframe,
embed,
@@ -23,17 +28,25 @@
}
.embed-responsive-21by9 {
- padding-bottom: percentage(9 / 21);
+ &::before {
+ padding-top: percentage(9 / 21);
+ }
}
.embed-responsive-16by9 {
- padding-bottom: percentage(9 / 16);
+ &::before {
+ padding-top: percentage(9 / 16);
+ }
}
.embed-responsive-4by3 {
- padding-bottom: percentage(3 / 4);
+ &::before {
+ padding-top: percentage(3 / 4);
+ }
}
.embed-responsive-1by1 {
- padding-bottom: percentage(1 / 1);
+ &::before {
+ padding-top: percentage(1 / 1);
+ }
}
diff --git a/assets/stylesheets/bootstrap/_tables.scss b/assets/stylesheets/bootstrap/_tables.scss
index aeedf0b..47be2c5 100644
--- a/assets/stylesheets/bootstrap/_tables.scss
+++ b/assets/stylesheets/bootstrap/_tables.scss
@@ -105,26 +105,26 @@
.thead-inverse {
th {
- color: #fff;
- background-color: $gray-dark;
+ color: $table-inverse-color;
+ background-color: $table-inverse-bg;
}
}
.thead-default {
th {
- color: $gray;
- background-color: $gray-lighter;
+ color: $table-head-color;
+ background-color: $table-head-bg;
}
}
.table-inverse {
- color: $gray-lighter;
- background-color: $gray-dark;
+ color: $table-inverse-color;
+ background-color: $table-inverse-bg;
th,
td,
thead th {
- border-color: $gray;
+ border-color: $body-bg;
}
&.table-bordered {
@@ -136,61 +136,18 @@
// Responsive tables
//
-// Wrap your tables in `.table-responsive` and we'll make them mobile friendly
-// by enabling horizontal scrolling. Only applies <768px. Everything above that
+// Add `.table-responsive` to `.table`s and we'll make them mobile friendly by
+// enabling horizontal scrolling. Only applies <768px. Everything above that
// will display normally.
.table-responsive {
display: block;
width: 100%;
- min-height: 0%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)
overflow-x: auto;
+ -ms-overflow-style: -ms-autohiding-scrollbar; // See https://github.com/twbs/bootstrap/pull/10057
- // TODO: find out if we need this still.
- //
- // border: $table-border-width solid $table-border-color;
- // -ms-overflow-style: -ms-autohiding-scrollbar; // See https://github.com/twbs/bootstrap/pull/10057
-}
-
-
-.table-reflow {
- thead {
- float: left;
- }
-
- tbody {
- display: block;
- white-space: nowrap;
- }
-
- th,
- td {
- border-top: $table-border-width solid $table-border-color;
- border-left: $table-border-width solid $table-border-color;
-
- &:last-child {
- border-right: $table-border-width solid $table-border-color;
- }
- }
-
- thead,
- tbody,
- tfoot {
- &:last-child {
- tr:last-child th,
- tr:last-child td {
- border-bottom: $table-border-width solid $table-border-color;
- }
- }
- }
-
- tr {
- float: left;
-
- th,
- td {
- display: block !important;
- border: $table-border-width solid $table-border-color;
- }
+ // Prevent double border on horizontal scroll due to use of `display: block;`
+ &.table-bordered {
+ border: 0;
}
}
diff --git a/assets/stylesheets/bootstrap/_tags.scss b/assets/stylesheets/bootstrap/_tags.scss
deleted file mode 100644
index dee9ed9..0000000
--- a/assets/stylesheets/bootstrap/_tags.scss
+++ /dev/null
@@ -1,77 +0,0 @@
-// Base class
-//
-// Requires one of the contextual, color modifier classes for `color` and
-// `background-color`.
-
-.tag {
- display: inline-block;
- padding: $tag-padding-y $tag-padding-x;
- font-size: $tag-font-size;
- font-weight: $tag-font-weight;
- line-height: 1;
- color: $tag-color;
- text-align: center;
- white-space: nowrap;
- vertical-align: baseline;
- @include border-radius();
-
- // Empty tags collapse automatically
- &:empty {
- display: none;
- }
-}
-
-// Quick fix for tags in buttons
-.btn .tag {
- position: relative;
- top: -1px;
-}
-
-// scss-lint:disable QualifyingElement
-// Add hover effects, but only for links
-a.tag {
- @include hover-focus {
- color: $tag-link-hover-color;
- text-decoration: none;
- cursor: pointer;
- }
-}
-// scss-lint:enable QualifyingElement
-
-// Pill tags
-//
-// Make them extra rounded with a modifier to replace v3's badges.
-
-.tag-pill {
- padding-right: $tag-pill-padding-x;
- padding-left: $tag-pill-padding-x;
- @include border-radius($tag-pill-border-radius);
-}
-
-// Colors
-//
-// Contextual variations (linked tags get darker on :hover).
-
-.tag-default {
- @include tag-variant($tag-default-bg);
-}
-
-.tag-primary {
- @include tag-variant($tag-primary-bg);
-}
-
-.tag-success {
- @include tag-variant($tag-success-bg);
-}
-
-.tag-info {
- @include tag-variant($tag-info-bg);
-}
-
-.tag-warning {
- @include tag-variant($tag-warning-bg);
-}
-
-.tag-danger {
- @include tag-variant($tag-danger-bg);
-}
diff --git a/assets/stylesheets/bootstrap/_tooltip.scss b/assets/stylesheets/bootstrap/_tooltip.scss
index 57ba8cf..24e198d 100644
--- a/assets/stylesheets/bootstrap/_tooltip.scss
+++ b/assets/stylesheets/bootstrap/_tooltip.scss
@@ -11,7 +11,7 @@
word-wrap: break-word;
opacity: 0;
- &.in { opacity: $tooltip-opacity; }
+ &.show { opacity: $tooltip-opacity; }
&.tooltip-top,
&.bs-tether-element-attached-bottom {
diff --git a/assets/stylesheets/bootstrap/_animation.scss b/assets/stylesheets/bootstrap/_transitions.scss
index f0dfff8..86c04a5 100644
--- a/assets/stylesheets/bootstrap/_animation.scss
+++ b/assets/stylesheets/bootstrap/_transitions.scss
@@ -1,27 +1,27 @@
.fade {
opacity: 0;
- transition: opacity .15s linear;
+ @include transition($transition-fade);
- &.in {
+ &.show {
opacity: 1;
}
}
.collapse {
display: none;
- &.in {
+ &.show {
display: block;
}
}
tr {
- &.collapse.in {
+ &.collapse.show {
display: table-row;
}
}
tbody {
- &.collapse.in {
+ &.collapse.show {
display: table-row-group;
}
}
@@ -30,7 +30,5 @@ tbody {
position: relative;
height: 0;
overflow: hidden;
- transition-timing-function: ease;
- transition-duration: .35s;
- transition-property: height;
+ @include transition($transition-collapse);
}
diff --git a/assets/stylesheets/bootstrap/_type.scss b/assets/stylesheets/bootstrap/_type.scss
index ff71140..13a64b0 100644
--- a/assets/stylesheets/bootstrap/_type.scss
+++ b/assets/stylesheets/bootstrap/_type.scss
@@ -27,18 +27,22 @@ h6, .h6 { font-size: $font-size-h6; }
.display-1 {
font-size: $display1-size;
font-weight: $display1-weight;
+ line-height: $display-line-height;
}
.display-2 {
font-size: $display2-size;
font-weight: $display2-weight;
+ line-height: $display-line-height;
}
.display-3 {
font-size: $display3-size;
font-weight: $display3-weight;
+ line-height: $display-line-height;
}
.display-4 {
font-size: $display4-size;
font-weight: $display4-weight;
+ line-height: $display-line-height;
}
@@ -61,7 +65,7 @@ hr {
small,
.small {
font-size: $small-font-size;
- font-weight: normal;
+ font-weight: $font-weight-normal;
}
mark,
@@ -137,14 +141,3 @@ mark,
content: "\00A0 \2014"; // nbsp, em dash
}
}
-
-@if not $enable-flex {
- // Clean up some horizontal `<dl>`s built with grids
- // scss-lint:disable QualifyingElement
- dl.row {
- > dd + dt {
- clear: left;
- }
- }
- // scss-lint:enable QualifyingElement
-}
diff --git a/assets/stylesheets/bootstrap/_utilities.scss b/assets/stylesheets/bootstrap/_utilities.scss
index c63e506..7d08ff2 100644
--- a/assets/stylesheets/bootstrap/_utilities.scss
+++ b/assets/stylesheets/bootstrap/_utilities.scss
@@ -5,7 +5,9 @@
@import "utilities/display";
@import "utilities/flex";
@import "utilities/float";
+@import "utilities/position";
@import "utilities/screenreaders";
+@import "utilities/sizing";
@import "utilities/spacing";
@import "utilities/text";
@import "utilities/visibility";
diff --git a/assets/stylesheets/bootstrap/_variables.scss b/assets/stylesheets/bootstrap/_variables.scss
index 13432f2..36dc429 100644
--- a/assets/stylesheets/bootstrap/_variables.scss
+++ b/assets/stylesheets/bootstrap/_variables.scss
@@ -16,6 +16,30 @@
// Grid columns
// Fonts
// Components
+// Tables
+// Buttons
+// Forms
+// Dropdowns
+// Z-index master list
+// Navbar
+// Navs
+// Pagination
+// Jumbotron
+// Form states and alerts
+// Cards
+// Tooltips
+// Popovers
+// Badges
+// Modals
+// Alerts
+// Progress bars
+// List group
+// Image thumbnails
+// Figures
+// Breadcrumbs
+// Carousel
+// Close
+// Code
@mixin _assert-ascending($map, $map-name) {
$prev-key: null;
@@ -33,6 +57,31 @@
}
}
+// Replace `$search` with `$replace` in `$string`
+// @author Hugo Giraudel
+// @param {String} $string - Initial string
+// @param {String} $search - Substring to replace
+// @param {String} $replace ('') - New value
+// @return {String} - Updated string
+@function str-replace($string, $search, $replace: "") {
+ $index: str-index($string, $search);
+
+ @if $index {
+ @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);
+ }
+
+ @return $string;
+}
+
+@mixin _assert-starts-at-zero($map) {
+ $values: map-values($map);
+ $first-value: nth($values, 1);
+ @if $first-value != 0 {
+ @warn "First breakpoint in `$grid-breakpoints` must start at 0, but starts at #{$first-value}.";
+ }
+}
+
+
// General variable structure
//
// Variable format should follow the `$component-modifier-state-property` order.
@@ -42,17 +91,31 @@
//
// Grayscale and brand colors for use across Bootstrap.
-$gray-dark: #373a3c !default;
-$gray: #55595c !default;
-$gray-light: #818a91 !default;
+// Start with assigning color names to specific hex values.
+$white: #fff !default;
+$black: #000 !default;
+$red: #d9534f !default;
+$orange: #f0ad4e !default;
+$yellow: #ffd500 !default;
+$green: #5cb85c !default;
+$blue: #0275d8 !default;
+$teal: #5bc0de !default;
+$pink: #ff5b77 !default;
+$purple: #613d7c !default;
+
+// Create grayscale
+$gray-dark: #292b2c !default;
+$gray: #464a4c !default;
+$gray-light: #636c72 !default;
$gray-lighter: #eceeef !default;
$gray-lightest: #f7f7f9 !default;
-$brand-primary: #0275d8 !default;
-$brand-success: #5cb85c !default;
-$brand-info: #5bc0de !default;
-$brand-warning: #f0ad4e !default;
-$brand-danger: #d9534f !default;
+// Reassign color vars to semantic color scheme
+$brand-primary: $blue !default;
+$brand-success: $green !default;
+$brand-info: $teal !default;
+$brand-warning: $orange !default;
+$brand-danger: $red !default;
$brand-inverse: $gray-dark !default;
@@ -60,11 +123,10 @@ $brand-inverse: $gray-dark !default;
//
// Quickly modify global styling by enabling or disabling optional features.
-$enable-flex: false !default;
$enable-rounded: true !default;
$enable-shadows: false !default;
$enable-gradients: false !default;
-$enable-transitions: false !default;
+$enable-transitions: true !default;
$enable-hover-media-query: false !default;
$enable-grid-classes: true !default;
$enable-print-styles: true !default;
@@ -85,27 +147,44 @@ $spacers: (
y: 0
),
1: (
+ x: ($spacer-x * .25),
+ y: ($spacer-y * .25)
+ ),
+ 2: (
+ x: ($spacer-x * .5),
+ y: ($spacer-y * .5)
+ ),
+ 3: (
x: $spacer-x,
y: $spacer-y
),
- 2: (
+ 4: (
x: ($spacer-x * 1.5),
y: ($spacer-y * 1.5)
),
- 3: (
+ 5: (
x: ($spacer-x * 3),
y: ($spacer-y * 3)
)
) !default;
$border-width: 1px !default;
+// This variable affects the `.h-*` and `.w-*` classes.
+$sizes: (
+ 25: 25%,
+ 50: 50%,
+ 75: 75%,
+ 100: 100%
+) !default;
// Body
//
// Settings for the `<body>` element.
-$body-bg: #fff !default;
-$body-color: $gray-dark !default;
+$body-bg: $white !default;
+$body-color: $gray-dark !default;
+$inverse-bg: $gray-dark !default;
+$inverse-color: $gray-lighter !default;
// Links
@@ -131,6 +210,7 @@ $grid-breakpoints: (
xl: 1200px
) !default;
@include _assert-ascending($grid-breakpoints, "$grid-breakpoints");
+@include _assert-starts-at-zero($grid-breakpoints);
// Grid containers
@@ -160,23 +240,24 @@ $grid-gutter-widths: (
xl: $grid-gutter-width-base
) !default;
-// Typography
+// Fonts
//
// Font, line-height, and color for body text, headings, and more.
-$font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif !default;
+$font-family-sans-serif: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif !default;
$font-family-serif: Georgia, "Times New Roman", Times, serif !default;
$font-family-monospace: Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !default;
$font-family-base: $font-family-sans-serif !default;
-// Pixel value used to responsively scale all typography. Applied to the `<html>` element.
-$font-size-root: 16px !default;
-
-$font-size-base: 1rem !default;
+$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`
$font-size-lg: 1.25rem !default;
$font-size-sm: .875rem !default;
$font-size-xs: .75rem !default;
+$font-weight-normal: normal !default;
+$font-weight-bold: bold !default;
+
+$font-weight-base: $font-weight-normal !default;
$line-height-base: 1.5 !default;
$font-size-h1: 2.5rem !default;
@@ -186,22 +267,23 @@ $font-size-h4: 1.5rem !default;
$font-size-h5: 1.25rem !default;
$font-size-h6: 1rem !default;
-$display1-size: 6rem !default;
-$display2-size: 5.5rem !default;
-$display3-size: 4.5rem !default;
-$display4-size: 3.5rem !default;
-
-$display1-weight: 300 !default;
-$display2-weight: 300 !default;
-$display3-weight: 300 !default;
-$display4-weight: 300 !default;
-
$headings-margin-bottom: ($spacer / 2) !default;
$headings-font-family: inherit !default;
$headings-font-weight: 500 !default;
$headings-line-height: 1.1 !default;
$headings-color: inherit !default;
+$display1-size: 6rem !default;
+$display2-size: 5.5rem !default;
+$display3-size: 4.5rem !default;
+$display4-size: 3.5rem !default;
+
+$display1-weight: 300 !default;
+$display2-weight: 300 !default;
+$display3-weight: 300 !default;
+$display4-weight: 300 !default;
+$display-line-height: $headings-line-height !default;
+
$lead-font-size: 1.25rem !default;
$lead-font-weight: 300 !default;
@@ -216,15 +298,15 @@ $blockquote-font-size: ($font-size-base * 1.25) !default;
$blockquote-border-color: $gray-lighter !default;
$blockquote-border-width: .25rem !default;
-$hr-border-color: rgba(0,0,0,.1) !default;
+$hr-border-color: rgba($black,.1) !default;
$hr-border-width: $border-width !default;
$mark-padding: .2em !default;
-$dt-font-weight: bold !default;
+$dt-font-weight: $font-weight-bold !default;
-$kbd-box-shadow: inset 0 -.1rem 0 rgba(0,0,0,.25) !default;
-$nested-kbd-font-weight: bold !default;
+$kbd-box-shadow: inset 0 -.1rem 0 rgba($black,.25) !default;
+$nested-kbd-font-weight: $font-weight-bold !default;
$list-inline-padding: 5px !default;
@@ -240,11 +322,14 @@ $border-radius: .25rem !default;
$border-radius-lg: .3rem !default;
$border-radius-sm: .2rem !default;
-$component-active-color: #fff !default;
+$component-active-color: $white !default;
$component-active-bg: $brand-primary !default;
$caret-width: .3em !default;
-$caret-width-lg: $caret-width !default;
+
+$transition-base: all .2s ease-in-out !default;
+$transition-fade: opacity .15s linear !default;
+$transition-collapse: height .35s ease !default;
// Tables
@@ -255,10 +340,17 @@ $table-cell-padding: .75rem !default;
$table-sm-cell-padding: .3rem !default;
$table-bg: transparent !default;
-$table-bg-accent: rgba(0,0,0,.05) !default;
-$table-bg-hover: rgba(0,0,0,.075) !default;
+
+$table-inverse-bg: $gray-dark !default;
+$table-inverse-color: $body-bg !default;
+
+$table-bg-accent: rgba($black,.05) !default;
+$table-bg-hover: rgba($black,.075) !default;
$table-bg-active: $table-bg-hover !default;
+$table-head-bg: $gray-lighter !default;
+$table-head-color: $gray !default;
+
$table-border-width: $border-width !default;
$table-border-color: $gray-lighter !default;
@@ -270,31 +362,32 @@ $table-border-color: $gray-lighter !default;
$btn-padding-x: 1rem !default;
$btn-padding-y: .5rem !default;
$btn-line-height: 1.25 !default;
-$btn-font-weight: normal !default;
-$btn-box-shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075) !default;
-$btn-active-box-shadow: inset 0 3px 5px rgba(0,0,0,.125) !default;
+$btn-font-weight: $font-weight-normal !default;
+$btn-box-shadow: inset 0 1px 0 rgba($white,.15), 0 1px 1px rgba($black,.075) !default;
+$btn-focus-box-shadow: 0 0 0 2px rgba($brand-primary, .25) !default;
+$btn-active-box-shadow: inset 0 3px 5px rgba($black,.125) !default;
-$btn-primary-color: #fff !default;
+$btn-primary-color: $white !default;
$btn-primary-bg: $brand-primary !default;
$btn-primary-border: $btn-primary-bg !default;
$btn-secondary-color: $gray-dark !default;
-$btn-secondary-bg: #fff !default;
+$btn-secondary-bg: $white !default;
$btn-secondary-border: #ccc !default;
-$btn-info-color: #fff !default;
+$btn-info-color: $white !default;
$btn-info-bg: $brand-info !default;
$btn-info-border: $btn-info-bg !default;
-$btn-success-color: #fff !default;
+$btn-success-color: $white !default;
$btn-success-bg: $brand-success !default;
$btn-success-border: $btn-success-bg !default;
-$btn-warning-color: #fff !default;
+$btn-warning-color: $white !default;
$btn-warning-bg: $brand-warning !default;
$btn-warning-border: $btn-warning-bg !default;
-$btn-danger-color: #fff !default;
+$btn-danger-color: $white !default;
$btn-danger-bg: $brand-danger !default;
$btn-danger-border: $btn-danger-bg !default;
@@ -314,6 +407,8 @@ $btn-border-radius: $border-radius !default;
$btn-border-radius-lg: $border-radius-lg !default;
$btn-border-radius-sm: $border-radius-sm !default;
+$btn-transition: all .2s ease-in-out !default;
+
// Forms
@@ -321,24 +416,24 @@ $input-padding-x: .75rem !default;
$input-padding-y: .5rem !default;
$input-line-height: 1.25 !default;
-$input-bg: #fff !default;
+$input-bg: $white !default;
$input-bg-disabled: $gray-lighter !default;
$input-color: $gray !default;
-$input-border-color: rgba(0,0,0,.15) !default;
+$input-border-color: rgba($black,.15) !default;
$input-btn-border-width: $border-width !default; // For form controls and buttons
-$input-box-shadow: inset 0 1px 1px rgba(0,0,0,.075) !default;
+$input-box-shadow: inset 0 1px 1px rgba($black,.075) !default;
$input-border-radius: $border-radius !default;
$input-border-radius-lg: $border-radius-lg !default;
$input-border-radius-sm: $border-radius-sm !default;
$input-bg-focus: $input-bg !default;
-$input-border-focus: #66afe9 !default;
-$input-box-shadow-focus: $input-box-shadow, 0 0 8px rgba(102,175,233,.6) !default;
+$input-border-focus: lighten($brand-primary, 25%) !default;
+$input-box-shadow-focus: $input-box-shadow, rgba($input-border-focus, .6) !default;
$input-color-focus: $input-color !default;
-$input-color-placeholder: #999 !default;
+$input-color-placeholder: $gray-light !default;
$input-padding-x-sm: .5rem !default;
$input-padding-y-sm: .25rem !default;
@@ -346,10 +441,22 @@ $input-padding-y-sm: .25rem !default;
$input-padding-x-lg: 1.5rem !default;
$input-padding-y-lg: .75rem !default;
-$input-height: (($font-size-base * $line-height-base) + ($input-padding-y * 2)) !default;
+$input-height: (($font-size-base * $input-line-height) + ($input-padding-y * 2)) !default;
$input-height-lg: (($font-size-lg * $line-height-lg) + ($input-padding-y-lg * 2)) !default;
$input-height-sm: (($font-size-sm * $line-height-sm) + ($input-padding-y-sm * 2)) !default;
+$input-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s !default;
+
+$form-text-margin-top: .25rem !default;
+$form-feedback-margin-top: $form-text-margin-top !default;
+
+$form-check-margin-bottom: .5rem !default;
+$form-check-input-gutter: 1.25rem !default;
+$form-check-input-margin-y: .25rem !default;
+$form-check-input-margin-x: .25rem !default;
+
+$form-check-inline-margin-x: .75rem !default;
+
$form-group-margin-bottom: $spacer-y !default;
$input-group-addon-bg: $gray-lighter !default;
@@ -362,70 +469,72 @@ $custom-control-spacer-x: 1rem !default;
$custom-control-spacer-y: .25rem !default;
$custom-control-indicator-size: 1rem !default;
+$custom-control-indicator-margin-y: (($line-height-base * 1rem) - $custom-control-indicator-size) / -2 !default;
$custom-control-indicator-bg: #ddd !default;
$custom-control-indicator-bg-size: 50% 50% !default;
-$custom-control-indicator-box-shadow: inset 0 .25rem .25rem rgba(0,0,0,.1) !default;
+$custom-control-indicator-box-shadow: inset 0 .25rem .25rem rgba($black,.1) !default;
$custom-control-disabled-cursor: $cursor-disabled !default;
-$custom-control-disabled-indicator-bg: #eee !default;
-$custom-control-disabled-description-color: #767676 !default;
+$custom-control-disabled-indicator-bg: $gray-lighter !default;
+$custom-control-disabled-description-color: $gray-light !default;
-$custom-control-checked-indicator-color: #fff !default;
-$custom-control-checked-indicator-bg: #0074d9 !default;
+$custom-control-checked-indicator-color: $white !default;
+$custom-control-checked-indicator-bg: $brand-primary !default;
$custom-control-checked-indicator-box-shadow: none !default;
-$custom-control-focus-indicator-box-shadow: 0 0 0 .075rem #fff, 0 0 0 .2rem #0074d9 !default;
+$custom-control-focus-indicator-box-shadow: 0 0 0 1px $body-bg, 0 0 0 3px $brand-primary !default;
-$custom-control-active-indicator-color: #fff !default;
-$custom-control-active-indicator-bg: #84c6ff !default;
+$custom-control-active-indicator-color: $white !default;
+$custom-control-active-indicator-bg: lighten($brand-primary, 35%) !default;
$custom-control-active-indicator-box-shadow: none !default;
$custom-checkbox-radius: $border-radius !default;
-$custom-checkbox-checked-icon: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='#{$custom-control-checked-indicator-color}' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E") !default;
+$custom-checkbox-checked-icon: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='#{$custom-control-checked-indicator-color}' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E"), "#", "%23") !default;
-$custom-checkbox-indeterminate-bg: #0074d9 !default;
+$custom-checkbox-indeterminate-bg: $brand-primary !default;
$custom-checkbox-indeterminate-indicator-color: $custom-control-checked-indicator-color !default;
-$custom-checkbox-indeterminate-icon: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='#{$custom-checkbox-indeterminate-indicator-color}' d='M0 2h4'/%3E%3C/svg%3E") !default;
+$custom-checkbox-indeterminate-icon: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='#{$custom-checkbox-indeterminate-indicator-color}' d='M0 2h4'/%3E%3C/svg%3E"), "#", "%23") !default;
$custom-checkbox-indeterminate-box-shadow: none !default;
$custom-radio-radius: 50% !default;
-$custom-radio-checked-icon: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='#{$custom-control-checked-indicator-color}'/%3E%3C/svg%3E") !default;
+$custom-radio-checked-icon: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='#{$custom-control-checked-indicator-color}'/%3E%3C/svg%3E"), "#", "%23") !default;
$custom-select-padding-x: .75rem !default;
$custom-select-padding-y: .375rem !default;
-$custom-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator
-$custom-select-color: $input-color !default;
-$custom-select-disabled-color: $gray-light !default;
-$custom-select-bg: #fff !default;
+$custom-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator
+$custom-select-line-height: $input-line-height !default;
+$custom-select-color: $input-color !default;
+$custom-select-disabled-color: $gray-light !default;
+$custom-select-bg: $white !default;
$custom-select-disabled-bg: $gray-lighter !default;
$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions
$custom-select-indicator-color: #333 !default;
-$custom-select-indicator: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='#{$custom-select-indicator-color}' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") !default;
+$custom-select-indicator: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='#{$custom-select-indicator-color}' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E"), "#", "%23") !default;
$custom-select-border-width: $input-btn-border-width !default;
$custom-select-border-color: $input-border-color !default;
$custom-select-border-radius: $border-radius !default;
-$custom-select-focus-border-color: #51a7e8 !default;
-$custom-select-focus-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .075), 0 0 5px rgba(81, 167, 232, .5) !default;
+$custom-select-focus-border-color: lighten($brand-primary, 25%) !default;
+$custom-select-focus-box-shadow: inset 0 1px 2px rgba($black, .075), 0 0 5px rgba($custom-select-focus-border-color, .5) !default;
-$custom-select-sm-padding-y: .2rem !default;
-$custom-select-sm-font-size: 75% !default;
+$custom-select-sm-padding-y: .2rem !default;
+$custom-select-sm-font-size: 75% !default;
$custom-file-height: 2.5rem !default;
$custom-file-width: 14rem !default;
-$custom-file-focus-box-shadow: 0 0 0 .075rem #fff, 0 0 0 .2rem #0074d9 !default;
+$custom-file-focus-box-shadow: 0 0 0 .075rem $white, 0 0 0 .2rem $brand-primary !default;
$custom-file-padding-x: .5rem !default;
$custom-file-padding-y: 1rem !default;
$custom-file-line-height: 1.5 !default;
-$custom-file-color: #555 !default;
-$custom-file-bg: #fff !default;
+$custom-file-color: $gray !default;
+$custom-file-bg: $white !default;
$custom-file-border-width: $border-width !default;
-$custom-file-border-color: #ddd !default;
+$custom-file-border-color: $input-border-color !default;
$custom-file-border-radius: $border-radius !default;
-$custom-file-box-shadow: inset 0 .2rem .4rem rgba(0,0,0,.05) !default;
+$custom-file-box-shadow: inset 0 .2rem .4rem rgba($black,.05) !default;
$custom-file-button-color: $custom-file-color !default;
-$custom-file-button-bg: #eee !default;
+$custom-file-button-bg: $gray-lighter !default;
$custom-file-text: (
placeholder: (
en: "Choose file..."
@@ -438,13 +547,13 @@ $custom-file-text: (
// Form validation icons
$form-icon-success-color: $brand-success !default;
-$form-icon-success: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='#{$form-icon-success-color}' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E") !default;
+$form-icon-success: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='#{$form-icon-success-color}' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E"), "#", "%23") !default;
$form-icon-warning-color: $brand-warning !default;
-$form-icon-warning: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='#{$form-icon-warning-color}' d='M4.4 5.324h-.8v-2.46h.8zm0 1.42h-.8V5.89h.8zM3.76.63L.04 7.075c-.115.2.016.425.26.426h7.397c.242 0 .372-.226.258-.426C6.726 4.924 5.47 2.79 4.253.63c-.113-.174-.39-.174-.494 0z'/%3E%3C/svg%3E") !default;
+$form-icon-warning: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='#{$form-icon-warning-color}' d='M4.4 5.324h-.8v-2.46h.8zm0 1.42h-.8V5.89h.8zM3.76.63L.04 7.075c-.115.2.016.425.26.426h7.397c.242 0 .372-.226.258-.426C6.726 4.924 5.47 2.79 4.253.63c-.113-.174-.39-.174-.494 0z'/%3E%3C/svg%3E"), "#", "%23") !default;
$form-icon-danger-color: $brand-danger !default;
-$form-icon-danger: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{$form-icon-danger-color}' viewBox='-2 -2 7 7'%3E%3Cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3E%3Ccircle r='.5'/%3E%3Ccircle cx='3' r='.5'/%3E%3Ccircle cy='3' r='.5'/%3E%3Ccircle cx='3' cy='3' r='.5'/%3E%3C/svg%3E") !default;
+$form-icon-danger: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{$form-icon-danger-color}' viewBox='-2 -2 7 7'%3E%3Cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3E%3Ccircle r='.5'/%3E%3Ccircle cx='3' r='.5'/%3E%3Ccircle cy='3' r='.5'/%3E%3Ccircle cx='3' cy='3' r='.5'/%3E%3C/svg%3E"), "#", "%23") !default;
// Dropdowns
@@ -454,15 +563,15 @@ $form-icon-danger: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www
$dropdown-min-width: 10rem !default;
$dropdown-padding-y: .5rem !default;
$dropdown-margin-top: .125rem !default;
-$dropdown-bg: #fff !default;
-$dropdown-border-color: rgba(0,0,0,.15) !default;
+$dropdown-bg: $white !default;
+$dropdown-border-color: rgba($black,.15) !default;
$dropdown-border-width: $border-width !default;
-$dropdown-divider-bg: #e5e5e5 !default;
-$dropdown-box-shadow: 0 .5rem 1rem rgba(0,0,0,.175) !default;
+$dropdown-divider-bg: $gray-lighter !default;
+$dropdown-box-shadow: 0 .5rem 1rem rgba($black,.175) !default;
$dropdown-link-color: $gray-dark !default;
$dropdown-link-hover-color: darken($gray-dark, 5%) !default;
-$dropdown-link-hover-bg: #f5f5f5 !default;
+$dropdown-link-hover-bg: $gray-lightest !default;
$dropdown-link-active-color: $component-active-color !default;
$dropdown-link-active-bg: $component-active-bg !default;
@@ -480,14 +589,14 @@ $dropdown-header-color: $gray-light !default;
// of components dependent on the z-axis and are designed to all work together.
$zindex-dropdown-backdrop: 990 !default;
-$zindex-navbar: 1000 !default;
-$zindex-dropdown: 1000 !default;
-$zindex-popover: 1060 !default;
-$zindex-tooltip: 1070 !default;
-$zindex-navbar-fixed: 1030 !default;
-$zindex-navbar-sticky: 1030 !default;
-$zindex-modal-bg: 1040 !default;
-$zindex-modal: 1050 !default;
+$zindex-navbar: 1000 !default;
+$zindex-dropdown: 1000 !default;
+$zindex-fixed: 1030 !default;
+$zindex-sticky: 1030 !default;
+$zindex-modal-backdrop: 1040 !default;
+$zindex-modal: 1050 !default;
+$zindex-popover: 1060 !default;
+$zindex-tooltip: 1070 !default;
// Navbar
@@ -498,28 +607,24 @@ $navbar-padding-y: ($spacer / 2) !default;
$navbar-brand-padding-y: .25rem !default;
-$navbar-divider-padding-y: .425rem !default;
-
$navbar-toggler-padding-x: .75rem !default;
-$navbar-toggler-padding-y: .5rem !default;
+$navbar-toggler-padding-y: .25rem !default;
$navbar-toggler-font-size: $font-size-lg !default;
$navbar-toggler-border-radius: $btn-border-radius !default;
-$navbar-toggler-padding-x: .75rem !default;
-$navbar-toggler-padding-y: .5rem !default;
-
-$navbar-dark-color: rgba(255,255,255,.5) !default;
-$navbar-dark-hover-color: rgba(255,255,255,.75) !default;
-$navbar-dark-active-color: rgba(255,255,255,1) !default;
-$navbar-dark-disabled-color: rgba(255,255,255,.25) !default;
-$navbar-dark-toggler-bg: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='#{$navbar-dark-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 8h24M4 16h24M4 24h24'/%3E%3C/svg%3E") !default;
-$navbar-dark-toggler-border: rgba(255,255,255,.1) !default;
-
-$navbar-light-color: rgba(0,0,0,.5) !default;
-$navbar-light-hover-color: rgba(0,0,0,.7) !default;
-$navbar-light-active-color: rgba(0,0,0,.9) !default;
-$navbar-light-disabled-color: rgba(0,0,0,.3) !default;
-$navbar-light-toggler-bg: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='#{$navbar-light-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 8h24M4 16h24M4 24h24'/%3E%3C/svg%3E") !default;
-$navbar-light-toggler-border: rgba(0,0,0,.1) !default;
+
+$navbar-inverse-color: rgba($white,.5) !default;
+$navbar-inverse-hover-color: rgba($white,.75) !default;
+$navbar-inverse-active-color: rgba($white,1) !default;
+$navbar-inverse-disabled-color: rgba($white,.25) !default;
+$navbar-inverse-toggler-bg: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='#{$navbar-inverse-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 8h24M4 16h24M4 24h24'/%3E%3C/svg%3E"), "#", "%23") !default;
+$navbar-inverse-toggler-border: rgba($white,.1) !default;
+
+$navbar-light-color: rgba($black,.5) !default;
+$navbar-light-hover-color: rgba($black,.7) !default;
+$navbar-light-active-color: rgba($black,.9) !default;
+$navbar-light-disabled-color: rgba($black,.3) !default;
+$navbar-light-toggler-bg: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='#{$navbar-light-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 8h24M4 16h24M4 24h24'/%3E%3C/svg%3E"), "#", "%23") !default;
+$navbar-light-toggler-border: rgba($black,.1) !default;
// Navs
@@ -528,8 +633,6 @@ $nav-item-inline-spacer: 1rem !default;
$nav-link-padding: .5em 1em !default;
$nav-link-hover-bg: $gray-lighter !default;
$nav-disabled-link-color: $gray-light !default;
-$nav-disabled-link-hover-color: $gray-light !default;
-$nav-disabled-link-hover-bg: transparent !default;
$nav-tabs-border-color: #ddd !default;
$nav-tabs-border-width: $border-width !default;
@@ -550,14 +653,14 @@ $nav-pills-active-link-bg: $component-active-bg !default;
$pagination-padding-x: .75rem !default;
$pagination-padding-y: .5rem !default;
-$pagination-padding-x-sm: .75rem !default;
-$pagination-padding-y-sm: .275rem !default;
+$pagination-padding-x-sm: .5rem !default;
+$pagination-padding-y-sm: .25rem !default;
$pagination-padding-x-lg: 1.5rem !default;
$pagination-padding-y-lg: .75rem !default;
-
+$pagination-line-height: 1.25 !default;
$pagination-color: $link-color !default;
-$pagination-bg: #fff !default;
+$pagination-bg: $white !default;
$pagination-border-width: $border-width !default;
$pagination-border-color: #ddd !default;
@@ -565,12 +668,12 @@ $pagination-hover-color: $link-hover-color !default;
$pagination-hover-bg: $gray-lighter !default;
$pagination-hover-border: #ddd !default;
-$pagination-active-color: #fff !default;
+$pagination-active-color: $white !default;
$pagination-active-bg: $brand-primary !default;
$pagination-active-border: $brand-primary !default;
$pagination-disabled-color: $gray-light !default;
-$pagination-disabled-bg: #fff !default;
+$pagination-disabled-bg: $white !default;
$pagination-disabled-border: #ddd !default;
@@ -603,29 +706,32 @@ $state-danger-border: darken($state-danger-bg, 5%) !default;
// Cards
+
$card-spacer-x: 1.25rem !default;
$card-spacer-y: .75rem !default;
$card-border-width: 1px !default;
$card-border-radius: $border-radius !default;
-$card-border-color: rgba(0,0,0,.125) !default;
+$card-border-color: rgba($black,.125) !default;
$card-border-radius-inner: calc(#{$card-border-radius} - #{$card-border-width}) !default;
-$card-cap-bg: #f5f5f5 !default;
-$card-bg: #fff !default;
+$card-cap-bg: $gray-lightest !default;
+$card-bg: $white !default;
-$card-link-hover-color: #fff !default;
+$card-link-hover-color: $white !default;
$card-img-overlay-padding: 1.25rem !default;
-$card-deck-margin: .625rem !default;
+$card-deck-margin: ($grid-gutter-width-base / 2) !default;
-$card-columns-sm-up-column-gap: 1.25rem !default;
+$card-columns-count: 3 !default;
+$card-columns-gap: 1.25rem !default;
+$card-columns-margin: $card-spacer-y !default;
// Tooltips
$tooltip-max-width: 200px !default;
-$tooltip-color: #fff !default;
-$tooltip-bg: #000 !default;
+$tooltip-color: $white !default;
+$tooltip-bg: $black !default;
$tooltip-opacity: .9 !default;
$tooltip-padding-y: 3px !default;
$tooltip-padding-x: 8px !default;
@@ -638,11 +744,11 @@ $tooltip-arrow-color: $tooltip-bg !default;
// Popovers
$popover-inner-padding: 1px !default;
-$popover-bg: #fff !default;
+$popover-bg: $white !default;
$popover-max-width: 276px !default;
$popover-border-width: $border-width !default;
-$popover-border-color: rgba(0,0,0,.2) !default;
-$popover-box-shadow: 0 5px 10px rgba(0,0,0,.2) !default;
+$popover-border-color: rgba($black,.2) !default;
+$popover-box-shadow: 0 5px 10px rgba($black,.2) !default;
$popover-title-bg: darken($popover-bg, 3%) !default;
$popover-title-padding-x: 14px !default;
@@ -658,26 +764,27 @@ $popover-arrow-outer-width: ($popover-arrow-width + 1px) !default;
$popover-arrow-outer-color: fade-in($popover-border-color, .05) !default;
-// Tags
+// Badges
-$tag-default-bg: $gray-light !default;
-$tag-primary-bg: $brand-primary !default;
-$tag-success-bg: $brand-success !default;
-$tag-info-bg: $brand-info !default;
-$tag-warning-bg: $brand-warning !default;
-$tag-danger-bg: $brand-danger !default;
+$badge-default-bg: $gray-light !default;
+$badge-primary-bg: $brand-primary !default;
+$badge-success-bg: $brand-success !default;
+$badge-info-bg: $brand-info !default;
+$badge-warning-bg: $brand-warning !default;
+$badge-danger-bg: $brand-danger !default;
-$tag-color: #fff !default;
-$tag-link-hover-color: #fff !default;
-$tag-font-size: 75% !default;
-$tag-font-weight: bold !default;
-$tag-padding-x: .4em !default;
-$tag-padding-y: .25em !default;
+$badge-color: $white !default;
+$badge-link-hover-color: $white !default;
+$badge-font-size: 75% !default;
+$badge-font-weight: $font-weight-bold !default;
+$badge-padding-x: .4em !default;
+$badge-padding-y: .25em !default;
-$tag-pill-padding-x: .6em !default;
+$badge-pill-padding-x: .6em !default;
// Use a higher than normal value to ensure completely rounded edges when
// customizing padding or font-size on labels.
-$tag-pill-border-radius: 10rem !default;
+$badge-pill-border-radius: 10rem !default;
+
// Modals
@@ -687,26 +794,28 @@ $modal-inner-padding: 15px !default;
$modal-dialog-margin: 10px !default;
$modal-dialog-sm-up-margin-y: 30px !default;
-$modal-title-padding: 15px !default;
$modal-title-line-height: $line-height-base !default;
-$modal-content-bg: #fff !default;
-$modal-content-border-color: rgba(0,0,0,.2) !default;
+$modal-content-bg: $white !default;
+$modal-content-border-color: rgba($black,.2) !default;
$modal-content-border-width: $border-width !default;
-$modal-content-xs-box-shadow: 0 3px 9px rgba(0,0,0,.5) !default;
-$modal-content-sm-up-box-shadow: 0 5px 15px rgba(0,0,0,.5) !default;
+$modal-content-xs-box-shadow: 0 3px 9px rgba($black,.5) !default;
+$modal-content-sm-up-box-shadow: 0 5px 15px rgba($black,.5) !default;
-$modal-backdrop-bg: #000 !default;
+$modal-backdrop-bg: $black !default;
$modal-backdrop-opacity: .5 !default;
-$modal-header-border-color: #e5e5e5 !default;
+$modal-header-border-color: $gray-lighter !default;
$modal-footer-border-color: $modal-header-border-color !default;
$modal-header-border-width: $modal-content-border-width !default;
$modal-footer-border-width: $modal-header-border-width !default;
+$modal-header-padding: 15px !default;
-$modal-lg: 900px !default;
-$modal-md: 600px !default;
+$modal-lg: 800px !default;
+$modal-md: 500px !default;
$modal-sm: 300px !default;
+$modal-transition: transform .3s ease-out !default;
+
// Alerts
//
@@ -714,8 +823,9 @@ $modal-sm: 300px !default;
$alert-padding-x: 1.25rem !default;
$alert-padding-y: .75rem !default;
+$alert-margin-bottom: $spacer-y !default;
$alert-border-radius: $border-radius !default;
-$alert-link-font-weight: bold !default;
+$alert-link-font-weight: $font-weight-bold !default;
$alert-border-width: $border-width !default;
$alert-success-bg: $state-success-bg !default;
@@ -737,42 +847,42 @@ $alert-danger-border: $state-danger-border !default;
// Progress bars
-$progress-bg: #eee !default;
-$progress-bar-color: #0074d9 !default;
-$progress-border-radius: $border-radius !default;
-$progress-box-shadow: inset 0 .1rem .1rem rgba(0,0,0,.1) !default;
-
-$progress-bar-bg: $brand-primary !default;
-$progress-bar-success-bg: $brand-success !default;
-$progress-bar-warning-bg: $brand-warning !default;
-$progress-bar-danger-bg: $brand-danger !default;
-$progress-bar-info-bg: $brand-info !default;
-
+$progress-height: 1rem !default;
+$progress-font-size: .75rem !default;
+$progress-bg: $gray-lighter !default;
+$progress-border-radius: $border-radius !default;
+$progress-box-shadow: inset 0 .1rem .1rem rgba($black,.1) !default;
+$progress-bar-color: $white !default;
+$progress-bar-bg: $brand-primary !default;
+$progress-bar-animation-timing: 1s linear infinite !default;
// List group
-$list-group-bg: #fff !default;
-$list-group-border-color: #ddd !default;
-$list-group-border-width: $border-width !default;
-$list-group-border-radius: $border-radius !default;
+$list-group-color: $body-color !default;
+$list-group-bg: $white !default;
+$list-group-border-color: rgba($black,.125) !default;
+$list-group-border-width: $border-width !default;
+$list-group-border-radius: $border-radius !default;
+
+$list-group-item-padding-x: 1.25rem !default;
+$list-group-item-padding-y: .75rem !default;
-$list-group-hover-bg: #f5f5f5 !default;
-$list-group-active-color: $component-active-color !default;
-$list-group-active-bg: $component-active-bg !default;
-$list-group-active-border: $list-group-active-bg !default;
-$list-group-active-text-color: lighten($list-group-active-bg, 40%) !default;
+$list-group-hover-bg: $gray-lightest !default;
+$list-group-active-color: $component-active-color !default;
+$list-group-active-bg: $component-active-bg !default;
+$list-group-active-border: $list-group-active-bg !default;
+$list-group-active-text-color: lighten($list-group-active-bg, 50%) !default;
$list-group-disabled-color: $gray-light !default;
-$list-group-disabled-bg: $gray-lighter !default;
+$list-group-disabled-bg: $list-group-bg !default;
$list-group-disabled-text-color: $list-group-disabled-color !default;
-$list-group-link-color: #555 !default;
-$list-group-link-hover-color: $list-group-link-color !default;
-$list-group-link-heading-color: #333 !default;
+$list-group-link-color: $gray !default;
+$list-group-link-heading-color: $gray-dark !default;
+$list-group-link-hover-color: $list-group-link-color !default;
-$list-group-item-padding-x: 1.25rem !default;
-$list-group-item-padding-y: .75rem !default;
-$list-group-item-heading-margin-bottom: 5px !default;
+$list-group-link-active-color: $list-group-color !default;
+$list-group-link-active-bg: $gray-lighter !default;
// Image thumbnails
@@ -782,12 +892,14 @@ $thumbnail-bg: $body-bg !default;
$thumbnail-border-width: $border-width !default;
$thumbnail-border-color: #ddd !default;
$thumbnail-border-radius: $border-radius !default;
-$thumbnail-box-shadow: 0 1px 2px rgba(0,0,0,.075) !default;
+$thumbnail-box-shadow: 0 1px 2px rgba($black,.075) !default;
+$thumbnail-transition: all .2s ease-in-out !default;
// Figures
$figure-caption-font-size: 90% !default;
+$figure-caption-color: $gray-light !default;
// Breadcrumbs
@@ -802,42 +914,34 @@ $breadcrumb-active-color: $gray-light !default;
$breadcrumb-divider: "/" !default;
-// Media objects
-
-$media-margin-top: 15px !default;
-$media-heading-margin-bottom: 5px !default;
-$media-alignment-padding-x: 10px !default;
-
-
// Carousel
-$carousel-text-shadow: 0 1px 2px rgba(0,0,0,.6) !default;
-
-$carousel-control-color: #fff !default;
+$carousel-control-color: $white !default;
$carousel-control-width: 15% !default;
-$carousel-control-sm-up-size: 30px !default;
$carousel-control-opacity: .5 !default;
-$carousel-control-font-size: 20px !default;
-
-$carousel-indicators-width: 60% !default;
-$carousel-indicator-size: 10px !default;
-$carousel-indicator-active-size: 12px !default;
-$carousel-indicator-active-bg: #fff !default;
-$carousel-indicator-border-color: #fff !default;
+$carousel-indicator-width: 30px !default;
+$carousel-indicator-height: 3px !default;
+$carousel-indicator-spacer: 3px !default;
+$carousel-indicator-active-bg: $white !default;
$carousel-caption-width: 70% !default;
-$carousel-caption-sm-up-width: 60% !default;
-$carousel-caption-color: #fff !default;
+$carousel-caption-color: $white !default;
+
+$carousel-control-icon-width: 20px !default;
+
+$carousel-control-prev-icon-bg: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3E%3Cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E"), "#", "%23") !default;
+$carousel-control-next-icon-bg: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3E%3Cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E"), "#", "%23") !default;
-$carousel-icon-width: 20px !default;
+$carousel-transition: transform .6s ease-in-out !default;
// Close
-$close-font-weight: bold !default;
-$close-color: #000 !default;
-$close-text-shadow: 0 1px 0 #fff !default;
+$close-font-size: $font-size-base * 1.5 !default;
+$close-font-weight: $font-weight-bold !default;
+$close-color: $black !default;
+$close-text-shadow: 0 1px 0 $white !default;
// Code
@@ -846,12 +950,12 @@ $code-font-size: 90% !default;
$code-padding-x: .4rem !default;
$code-padding-y: .2rem !default;
$code-color: #bd4147 !default;
-$code-bg: #f7f7f9 !default;
+$code-bg: $gray-lightest !default;
-$kbd-color: #fff !default;
-$kbd-bg: #333 !default;
+$kbd-color: $white !default;
+$kbd-bg: $gray-dark !default;
-$pre-bg: #f7f7f9 !default;
+$pre-bg: $gray-lightest !default;
$pre-color: $gray-dark !default;
$pre-border-color: #ccc !default;
$pre-scrollable-max-height: 340px !default;
diff --git a/assets/stylesheets/bootstrap/mixins/_tag.scss b/assets/stylesheets/bootstrap/mixins/_badge.scss
index 900c54e..9fa44b6 100644
--- a/assets/stylesheets/bootstrap/mixins/_tag.scss
+++ b/assets/stylesheets/bootstrap/mixins/_badge.scss
@@ -1,6 +1,6 @@
-// Tags
+// Badges
-@mixin tag-variant($color) {
+@mixin badge-variant($color) {
background-color: $color;
&[href] {
diff --git a/assets/stylesheets/bootstrap/mixins/_breakpoints.scss b/assets/stylesheets/bootstrap/mixins/_breakpoints.scss
index a868833..6fd2e8e 100644
--- a/assets/stylesheets/bootstrap/mixins/_breakpoints.scss
+++ b/assets/stylesheets/bootstrap/mixins/_breakpoints.scss
@@ -2,7 +2,7 @@
//
// Breakpoints are defined as a map of (name: minimum width), order from small to large:
//
-// (xs: 0, sm: 544px, md: 768px)
+// (xs: 0, sm: 576px, md: 768px)
//
// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.
@@ -10,7 +10,7 @@
//
// >> breakpoint-next(sm)
// md
-// >> breakpoint-next(sm, (xs: 0, sm: 544px, md: 768px))
+// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px))
// md
// >> breakpoint-next(sm, $breakpoint-names: (xs sm md))
// md
@@ -21,8 +21,8 @@
// Minimum breakpoint width. Null for the smallest (first) breakpoint.
//
-// >> breakpoint-min(sm, (xs: 0, sm: 544px, md: 768px))
-// 544px
+// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px))
+// 576px
@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {
$min: map-get($breakpoints, $name);
@return if($min != 0, $min, null);
@@ -31,13 +31,24 @@
// Maximum breakpoint width. Null for the largest (last) breakpoint.
// The maximum value is calculated as the minimum of the next one less 0.1.
//
-// >> breakpoint-max(sm, (xs: 0, sm: 544px, md: 768px))
+// >> breakpoint-max(sm, (xs: 0, sm: 576px, md: 768px))
// 767px
@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {
$next: breakpoint-next($name, $breakpoints);
@return if($next, breakpoint-min($next, $breakpoints) - 1px, null);
}
+// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash infront.
+// Useful for making responsive utilities.
+//
+// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px))
+// "" (Returns a blank string)
+// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px))
+// "-sm"
+@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {
+ @return if(breakpoint-min($name, $breakpoints) == null, "", "-#{$name}");
+}
+
// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.
// Makes the @content apply to the given breakpoint and wider.
@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {
@@ -64,17 +75,6 @@
}
}
-// Media between the breakpoint's minimum and maximum widths.
-// No minimum for the smallest breakpoint, and no maximum for the largest one.
-// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.
-@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {
- @include media-breakpoint-up($name, $breakpoints) {
- @include media-breakpoint-down($name, $breakpoints) {
- @content;
- }
- }
-}
-
// Media that spans multiple breakpoint widths.
// Makes the @content apply between the min and max breakpoints
@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {
@@ -84,3 +84,12 @@
}
}
}
+
+// Media between the breakpoint's minimum and maximum widths.
+// No minimum for the smallest breakpoint, and no maximum for the largest one.
+// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.
+@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {
+ @include media-breakpoint-between($name, $name, $breakpoints) {
+ @content;
+ }
+}
diff --git a/assets/stylesheets/bootstrap/mixins/_buttons.scss b/assets/stylesheets/bootstrap/mixins/_buttons.scss
index 5196ab6..f9981e3 100644
--- a/assets/stylesheets/bootstrap/mixins/_buttons.scss
+++ b/assets/stylesheets/bootstrap/mixins/_buttons.scss
@@ -12,96 +12,69 @@
border-color: $border;
@include box-shadow($btn-box-shadow);
+ // Hover and focus styles are shared
@include hover {
color: $color;
background-color: $active-background;
- border-color: $active-border;
+ border-color: $active-border;
}
-
&:focus,
&.focus {
- color: $color;
- background-color: $active-background;
- border-color: $active-border;
+ // Avoid using mixin so we can pass custom focus shadow properly
+ @if $enable-shadows {
+ box-shadow: $btn-box-shadow, 0 0 0 2px rgba($border, .5);
+ } @else {
+ box-shadow: 0 0 0 2px rgba($border, .5);
+ }
+ }
+
+ // Disabled comes first so active can properly restyle
+ &.disabled,
+ &:disabled {
+ background-color: $background;
+ border-color: $border;
}
&:active,
&.active,
- .open > &.dropdown-toggle {
+ .show > &.dropdown-toggle {
color: $color;
background-color: $active-background;
- border-color: $active-border;
- // Remove the gradient for the pressed/active state
- background-image: none;
+ background-image: none; // Remove the gradient for the pressed/active state
+ border-color: $active-border;
@include box-shadow($btn-active-box-shadow);
-
- &:hover,
- &:focus,
- &.focus {
- color: $color;
- background-color: darken($background, 17%);
- border-color: darken($border, 25%);
- }
- }
-
- &.disabled,
- &:disabled {
- &:focus,
- &.focus {
- background-color: $background;
- border-color: $border;
- }
- @include hover {
- background-color: $background;
- border-color: $border;
- }
}
}
-@mixin button-outline-variant($color) {
+@mixin button-outline-variant($color, $color-hover: #fff) {
color: $color;
background-image: none;
background-color: transparent;
border-color: $color;
@include hover {
- color: #fff;
+ color: $color-hover;
background-color: $color;
- border-color: $color;
+ border-color: $color;
}
&:focus,
&.focus {
- color: #fff;
- background-color: $color;
- border-color: $color;
+ box-shadow: 0 0 0 2px rgba($color, .5);
+ }
+
+ &.disabled,
+ &:disabled {
+ color: $color;
+ background-color: transparent;
}
&:active,
&.active,
- .open > &.dropdown-toggle {
- color: #fff;
+ .show > &.dropdown-toggle {
+ color: $color-hover;
background-color: $color;
- border-color: $color;
-
- &:hover,
- &:focus,
- &.focus {
- color: #fff;
- background-color: darken($color, 17%);
- border-color: darken($color, 25%);
- }
- }
-
- &.disabled,
- &:disabled {
- &:focus,
- &.focus {
- border-color: lighten($color, 20%);
- }
- @include hover {
- border-color: lighten($color, 20%);
- }
+ border-color: $color;
}
}
diff --git a/assets/stylesheets/bootstrap/mixins/_cards.scss b/assets/stylesheets/bootstrap/mixins/_cards.scss
index 574349a..4b1232d 100644
--- a/assets/stylesheets/bootstrap/mixins/_cards.scss
+++ b/assets/stylesheets/bootstrap/mixins/_cards.scss
@@ -20,8 +20,11 @@
//
@mixin card-inverse {
+ color: rgba(255,255,255,.65);
+
.card-header,
.card-footer {
+ background-color: transparent;
border-color: rgba(255,255,255,.2);
}
.card-header,
diff --git a/assets/stylesheets/bootstrap/mixins/_clearfix.scss b/assets/stylesheets/bootstrap/mixins/_clearfix.scss
index d0ae125..b72cf27 100644
--- a/assets/stylesheets/bootstrap/mixins/_clearfix.scss
+++ b/assets/stylesheets/bootstrap/mixins/_clearfix.scss
@@ -1,7 +1,7 @@
@mixin clearfix() {
&::after {
+ display: block;
content: "";
- display: table;
clear: both;
}
}
diff --git a/assets/stylesheets/bootstrap/mixins/_float.scss b/assets/stylesheets/bootstrap/mixins/_float.scss
index b30cf14..b43116f 100644
--- a/assets/stylesheets/bootstrap/mixins/_float.scss
+++ b/assets/stylesheets/bootstrap/mixins/_float.scss
@@ -4,3 +4,6 @@
@mixin float-right {
float: right !important;
}
+@mixin float-none {
+ float: none !important;
+}
diff --git a/assets/stylesheets/bootstrap/mixins/_forms.scss b/assets/stylesheets/bootstrap/mixins/_forms.scss
index 39851b8..c8aea96 100644
--- a/assets/stylesheets/bootstrap/mixins/_forms.scss
+++ b/assets/stylesheets/bootstrap/mixins/_forms.scss
@@ -7,8 +7,8 @@
// Color the label and help text
.form-control-feedback,
.form-control-label,
+ .col-form-label,
.form-check-label,
- .form-check-inline,
.custom-control {
color: $color;
}
@@ -17,10 +17,8 @@
.form-control {
border-color: $color;
- @if $enable-rounded {
- &:focus {
- box-shadow: $input-box-shadow, 0 0 6px lighten($color, 20%);
- }
+ &:focus {
+ @include box-shadow($input-box-shadow, 0 0 6px lighten($color, 20%));
}
}
diff --git a/assets/stylesheets/bootstrap/mixins/_gradients.scss b/assets/stylesheets/bootstrap/mixins/_gradients.scss
index ac96efe..8bfd97c 100644
--- a/assets/stylesheets/bootstrap/mixins/_gradients.scss
+++ b/assets/stylesheets/bootstrap/mixins/_gradients.scss
@@ -3,21 +3,17 @@
// Horizontal gradient, from left to right
//
// Creates two color stops, start and end, by specifying a color and position for each color stop.
-// Color stops are not available in IE9.
@mixin gradient-x($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {
background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent);
background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1); // IE9
}
// Vertical gradient, from top to bottom
//
// Creates two color stops, start and end, by specifying a color and position for each color stop.
-// Color stops are not available in IE9.
@mixin gradient-y($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {
background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent);
background-repeat: repeat-x;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0); // IE9
}
@mixin gradient-directional($start-color: #555, $end-color: #333, $deg: 45deg) {
@@ -27,12 +23,10 @@
@mixin gradient-x-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {
background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);
background-repeat: no-repeat;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1); // IE9 gets no color-stop at all for proper fallback
}
@mixin gradient-y-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {
background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);
background-repeat: no-repeat;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0); // IE9 gets no color-stop at all for proper fallback
}
@mixin gradient-radial($inner-color: #555, $outer-color: #333) {
background-image: radial-gradient(circle, $inner-color, $outer-color);
@@ -40,4 +34,4 @@
}
@mixin gradient-striped($color: rgba(255,255,255,.15), $angle: 45deg) {
background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);
-} \ No newline at end of file
+}
diff --git a/assets/stylesheets/bootstrap/mixins/_grid-framework.scss b/assets/stylesheets/bootstrap/mixins/_grid-framework.scss
index 35ccd92..0aa814a 100644
--- a/assets/stylesheets/bootstrap/mixins/_grid-framework.scss
+++ b/assets/stylesheets/bootstrap/mixins/_grid-framework.scss
@@ -7,50 +7,46 @@
// Common properties for all breakpoints
%grid-column {
position: relative;
- // Prevent columns from collapsing when empty
- min-height: 1px;
-
- @if $enable-flex {
- width: 100%;
- }
+ width: 100%;
+ min-height: 1px; // Prevent columns from collapsing when empty
@include make-gutters($gutters);
}
- $breakpoint-counter: 0;
@each $breakpoint in map-keys($breakpoints) {
- $breakpoint-counter: ($breakpoint-counter + 1);
+ $infix: breakpoint-infix($breakpoint, $breakpoints);
// Allow columns to stretch full width below their breakpoints
- .col-#{$breakpoint} {
- @extend %grid-column;
- }
-
@for $i from 1 through $columns {
- .col-#{$breakpoint}-#{$i} {
+ .col#{$infix}-#{$i} {
@extend %grid-column;
}
}
+ .col#{$infix} {
+ @extend %grid-column;
+ }
@include media-breakpoint-up($breakpoint, $breakpoints) {
// Provide basic `.col-{bp}` classes for equal-width flexbox columns
- @if $enable-flex {
- .col-#{$breakpoint} {
- flex-basis: 0;
- flex-grow: 1;
- max-width: 100%;
- }
+ .col#{$infix} {
+ flex-basis: 0;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .col#{$infix}-auto {
+ flex: 0 0 auto;
+ width: auto;
}
@for $i from 1 through $columns {
- .col-#{$breakpoint}-#{$i} {
+ .col#{$infix}-#{$i} {
@include make-col($i, $columns);
}
}
@each $modifier in (pull, push) {
@for $i from 0 through $columns {
- .#{$modifier}-#{$breakpoint}-#{$i} {
+ .#{$modifier}#{$infix}-#{$i} {
@include make-col-modifier($modifier, $i, $columns)
}
}
@@ -58,8 +54,8 @@
// `$columns - 1` because offsetting by the width of an entire row isn't possible
@for $i from 0 through ($columns - 1) {
- @if $breakpoint-counter != 1 or $i != 0 { // Avoid emitting useless .offset-xs-0
- .offset-#{$breakpoint}-#{$i} {
+ @if not ($infix == "" and $i == 0) { // Avoid emitting useless .offset-xs-0
+ .offset#{$infix}-#{$i} {
@include make-col-modifier(offset, $i, $columns)
}
}
diff --git a/assets/stylesheets/bootstrap/mixins/_grid.scss b/assets/stylesheets/bootstrap/mixins/_grid.scss
index 88cbd24..9cd8c7b 100644
--- a/assets/stylesheets/bootstrap/mixins/_grid.scss
+++ b/assets/stylesheets/bootstrap/mixins/_grid.scss
@@ -2,13 +2,17 @@
//
// Generate semantic grid columns with these mixins.
-@mixin make-container($gutter: $grid-gutter-width-base) {
+@mixin make-container($gutters: $grid-gutter-widths) {
+ position: relative;
margin-left: auto;
margin-right: auto;
- padding-left: ($gutter / 2);
- padding-right: ($gutter / 2);
- @if not $enable-flex {
- @include clearfix();
+
+ @each $breakpoint in map-keys($gutters) {
+ @include media-breakpoint-up($breakpoint) {
+ $gutter: map-get($gutters, $breakpoint);
+ padding-right: ($gutter / 2);
+ padding-left: ($gutter / 2);
+ }
}
}
@@ -34,12 +38,8 @@
}
@mixin make-row($gutters: $grid-gutter-widths) {
- @if $enable-flex {
- display: flex;
- flex-wrap: wrap;
- } @else {
- @include clearfix();
- }
+ display: flex;
+ flex-wrap: wrap;
@each $breakpoint in map-keys($gutters) {
@include media-breakpoint-up($breakpoint) {
@@ -52,14 +52,11 @@
@mixin make-col-ready($gutters: $grid-gutter-widths) {
position: relative;
- min-height: 1px; // Prevent collapsing
-
// Prevent columns from becoming too narrow when at smaller grid tiers by
// always setting `width: 100%;`. This works because we use `flex` values
// later on to override this initial width.
- @if $enable-flex {
- width: 100%;
- }
+ width: 100%;
+ min-height: 1px; // Prevent collapsing
@each $breakpoint in map-keys($gutters) {
@include media-breakpoint-up($breakpoint) {
@@ -71,16 +68,12 @@
}
@mixin make-col($size, $columns: $grid-columns) {
- @if $enable-flex {
- flex: 0 0 percentage($size / $columns);
- // Add a `max-width` to ensure content within each column does not blow out
- // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari
- // do not appear to require this.
- max-width: percentage($size / $columns);
- } @else {
- float: left;
- width: percentage($size / $columns);
- }
+ flex: 0 0 percentage($size / $columns);
+ // width: percentage($size / $columns);
+ // Add a `max-width` to ensure content within each column does not blow out
+ // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari
+ // do not appear to require this.
+ max-width: percentage($size / $columns);
}
@mixin make-col-offset($size, $columns: $grid-columns) {
diff --git a/assets/stylesheets/bootstrap/mixins/_list-group.scss b/assets/stylesheets/bootstrap/mixins/_list-group.scss
index 81b0f16..3db5b09 100644
--- a/assets/stylesheets/bootstrap/mixins/_list-group.scss
+++ b/assets/stylesheets/bootstrap/mixins/_list-group.scss
@@ -20,11 +20,9 @@
}
&.active {
- @include plain-hover-focus {
- color: #fff;
- background-color: $color;
- border-color: $color;
- }
+ color: #fff;
+ background-color: $color;
+ border-color: $color;
}
}
}
diff --git a/assets/stylesheets/bootstrap/mixins/_progress.scss b/assets/stylesheets/bootstrap/mixins/_progress.scss
deleted file mode 100644
index 9622d79..0000000
--- a/assets/stylesheets/bootstrap/mixins/_progress.scss
+++ /dev/null
@@ -1,23 +0,0 @@
-// Progress bars
-
-@mixin progress-variant($color) {
- &[value]::-webkit-progress-value {
- background-color: $color;
- }
-
- &[value]::-moz-progress-bar {
- background-color: $color;
- }
-
- // IE10+, Microsoft Edge
- &[value]::-ms-fill {
- background-color: $color;
- }
-
- // IE9
- @media screen and (min-width:0\0) {
- .progress-bar {
- background-color: $color;
- }
- }
-}
diff --git a/assets/stylesheets/bootstrap/mixins/_reset-filter.scss b/assets/stylesheets/bootstrap/mixins/_reset-filter.scss
deleted file mode 100644
index 044b349..0000000
--- a/assets/stylesheets/bootstrap/mixins/_reset-filter.scss
+++ /dev/null
@@ -1,8 +0,0 @@
-// Reset filters for IE
-//
-// When you need to remove a gradient background, do not forget to use this to reset
-// the IE filter for IE9.
-
-@mixin reset-filter() {
- filter: "progid:DXImageTransform.Microsoft.gradient(enabled = false)";
-}
diff --git a/assets/stylesheets/bootstrap/mixins/_reset-text.scss b/assets/stylesheets/bootstrap/mixins/_reset-text.scss
index bb882f2..b952730 100644
--- a/assets/stylesheets/bootstrap/mixins/_reset-text.scss
+++ b/assets/stylesheets/bootstrap/mixins/_reset-text.scss
@@ -2,7 +2,7 @@
font-family: $font-family-base;
// We deliberately do NOT reset font-size or word-wrap.
font-style: normal;
- font-weight: normal;
+ font-weight: $font-weight-normal;
letter-spacing: normal;
line-break: auto;
line-height: $line-height-base;
diff --git a/assets/stylesheets/bootstrap/mixins/_tab-focus.scss b/assets/stylesheets/bootstrap/mixins/_tab-focus.scss
deleted file mode 100644
index f16ed64..0000000
--- a/assets/stylesheets/bootstrap/mixins/_tab-focus.scss
+++ /dev/null
@@ -1,9 +0,0 @@
-// WebKit-style focus
-
-@mixin tab-focus() {
- // WebKit-specific. Other browsers will keep their default outline style.
- // (Initially tried to also force default via `outline: initial`,
- // but that seems to erroneously remove the outline in Firefox altogether.)
- outline: 5px auto -webkit-focus-ring-color;
- outline-offset: -2px;
-}
diff --git a/assets/stylesheets/bootstrap/mixins/_transforms.scss b/assets/stylesheets/bootstrap/mixins/_transforms.scss
new file mode 100644
index 0000000..4005c9d
--- /dev/null
+++ b/assets/stylesheets/bootstrap/mixins/_transforms.scss
@@ -0,0 +1,14 @@
+// Applies the given styles only when the browser support CSS3 3D transforms.
+@mixin if-supports-3d-transforms() {
+ @media (-webkit-transform-3d) {
+ // Old Safari, Old Android
+ // http://caniuse.com/#feat=css-featurequeries
+ // https://developer.mozilla.org/en-US/docs/Web/CSS/@media/-webkit-transform-3d
+ @content;
+ }
+
+ @supports (transform: translate3d(0,0,0)) {
+ // The Proper Way: Using a CSS feature query
+ @content;
+ }
+}
diff --git a/assets/stylesheets/bootstrap/mixins/_visibility.scss b/assets/stylesheets/bootstrap/mixins/_visibility.scss
new file mode 100644
index 0000000..88c50b0
--- /dev/null
+++ b/assets/stylesheets/bootstrap/mixins/_visibility.scss
@@ -0,0 +1,5 @@
+// Visibility
+
+@mixin invisible {
+ visibility: hidden !important;
+}
diff --git a/assets/stylesheets/bootstrap/utilities/_align.scss b/assets/stylesheets/bootstrap/utilities/_align.scss
index 4886e05..4dbbbc2 100644
--- a/assets/stylesheets/bootstrap/utilities/_align.scss
+++ b/assets/stylesheets/bootstrap/utilities/_align.scss
@@ -1,6 +1,6 @@
-.align-baseline { vertical-align: baseline !important; } // Browser default
-.align-top { vertical-align: top !important; }
-.align-middle { vertical-align: middle !important; }
-.align-bottom { vertical-align: bottom !important; }
+.align-baseline { vertical-align: baseline !important; } // Browser default
+.align-top { vertical-align: top !important; }
+.align-middle { vertical-align: middle !important; }
+.align-bottom { vertical-align: bottom !important; }
.align-text-bottom { vertical-align: text-bottom !important; }
-.align-text-top { vertical-align: text-top !important; }
+.align-text-top { vertical-align: text-top !important; }
diff --git a/assets/stylesheets/bootstrap/utilities/_background.scss b/assets/stylesheets/bootstrap/utilities/_background.scss
index a81dcff..b9ac295 100644
--- a/assets/stylesheets/bootstrap/utilities/_background.scss
+++ b/assets/stylesheets/bootstrap/utilities/_background.scss
@@ -3,7 +3,7 @@
//
.bg-faded {
- background-color: $gray-lightest;
+ background-color: darken($body-bg, 3%);
}
@include bg-variant('.bg-primary', $brand-primary);
diff --git a/assets/stylesheets/bootstrap/utilities/_borders.scss b/assets/stylesheets/bootstrap/utilities/_borders.scss
index b2e70aa..b256881 100644
--- a/assets/stylesheets/bootstrap/utilities/_borders.scss
+++ b/assets/stylesheets/bootstrap/utilities/_borders.scss
@@ -1,9 +1,12 @@
//
-// Border-width
+// Border
//
-// TBD...?
-
+.border-0 { border: 0 !important; }
+.border-top-0 { border-top: 0 !important; }
+.border-right-0 { border-right: 0 !important; }
+.border-bottom-0 { border-bottom: 0 !important; }
+.border-left-0 { border-left: 0 !important; }
//
// Border-radius
@@ -28,3 +31,7 @@
.rounded-circle {
border-radius: 50%;
}
+
+.rounded-0 {
+ border-radius: 0;
+}
diff --git a/assets/stylesheets/bootstrap/utilities/_display.scss b/assets/stylesheets/bootstrap/utilities/_display.scss
index d74049b..ae942a6 100644
--- a/assets/stylesheets/bootstrap/utilities/_display.scss
+++ b/assets/stylesheets/bootstrap/utilities/_display.scss
@@ -2,12 +2,17 @@
// Display utilities
//
-.d-block {
- display: block !important;
-}
-.d-inline-block {
- display: inline-block !important;
-}
-.d-inline {
- display: inline !important;
+@each $breakpoint in map-keys($grid-breakpoints) {
+ @include media-breakpoint-up($breakpoint) {
+ $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
+
+ .d#{$infix}-none { display: none !important; }
+ .d#{$infix}-inline { display: inline !important; }
+ .d#{$infix}-inline-block { display: inline-block !important; }
+ .d#{$infix}-block { display: block !important; }
+ .d#{$infix}-table { display: table !important; }
+ .d#{$infix}-table-cell { display: table-cell !important; }
+ .d#{$infix}-flex { display: flex !important; }
+ .d#{$infix}-inline-flex { display: inline-flex !important; }
+ }
}
diff --git a/assets/stylesheets/bootstrap/utilities/_flex.scss b/assets/stylesheets/bootstrap/utilities/_flex.scss
index 502885a..1b98aaa 100644
--- a/assets/stylesheets/bootstrap/utilities/_flex.scss
+++ b/assets/stylesheets/bootstrap/utilities/_flex.scss
@@ -2,36 +2,47 @@
//
// Custom styles for additional flex alignment options.
-@if $enable-flex {
- @each $breakpoint in map-keys($grid-breakpoints) {
- // Flex column reordering
- @include media-breakpoint-up($breakpoint) {
- .flex-#{$breakpoint}-first { order: -1; }
- .flex-#{$breakpoint}-last { order: 1; }
- .flex-#{$breakpoint}-unordered { order: 0; }
- }
-
- // Alignment for every item
- @include media-breakpoint-up($breakpoint) {
- .flex-items-#{$breakpoint}-top { align-items: flex-start; }
- .flex-items-#{$breakpoint}-middle { align-items: center; }
- .flex-items-#{$breakpoint}-bottom { align-items: flex-end; }
- }
-
- // Alignment per item
- @include media-breakpoint-up($breakpoint) {
- .flex-#{$breakpoint}-top { align-self: flex-start; }
- .flex-#{$breakpoint}-middle { align-self: center; }
- .flex-#{$breakpoint}-bottom { align-self: flex-end; }
- }
-
- // Horizontal alignment of item
- @include media-breakpoint-up($breakpoint) {
- .flex-items-#{$breakpoint}-left { justify-content: flex-start; }
- .flex-items-#{$breakpoint}-center { justify-content: center; }
- .flex-items-#{$breakpoint}-right { justify-content: flex-end; }
- .flex-items-#{$breakpoint}-around { justify-content: space-around; }
- .flex-items-#{$breakpoint}-between { justify-content: space-between; }
- }
+@each $breakpoint in map-keys($grid-breakpoints) {
+ @include media-breakpoint-up($breakpoint) {
+ $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
+
+ .flex#{$infix}-first { order: -1; }
+ .flex#{$infix}-last { order: 1; }
+ .flex#{$infix}-unordered { order: 0; }
+
+ .flex#{$infix}-row { flex-direction: row !important; }
+ .flex#{$infix}-column { flex-direction: column !important; }
+ .flex#{$infix}-row-reverse { flex-direction: row-reverse !important; }
+ .flex#{$infix}-column-reverse { flex-direction: column-reverse !important; }
+
+ .flex#{$infix}-wrap { flex-wrap: wrap !important; }
+ .flex#{$infix}-nowrap { flex-wrap: nowrap !important; }
+ .flex#{$infix}-wrap-reverse { flex-wrap: wrap-reverse !important; }
+
+ .justify-content#{$infix}-start { justify-content: flex-start !important; }
+ .justify-content#{$infix}-end { justify-content: flex-end !important; }
+ .justify-content#{$infix}-center { justify-content: center !important; }
+ .justify-content#{$infix}-between { justify-content: space-between !important; }
+ .justify-content#{$infix}-around { justify-content: space-around !important; }
+
+ .align-items#{$infix}-start { align-items: flex-start !important; }
+ .align-items#{$infix}-end { align-items: flex-end !important; }
+ .align-items#{$infix}-center { align-items: center !important; }
+ .align-items#{$infix}-baseline { align-items: baseline !important; }
+ .align-items#{$infix}-stretch { align-items: stretch !important; }
+
+ .align-content#{$infix}-start { align-content: flex-start !important; }
+ .align-content#{$infix}-end { align-content: flex-end !important; }
+ .align-content#{$infix}-center { align-content: center !important; }
+ .align-content#{$infix}-between { align-content: space-between !important; }
+ .align-content#{$infix}-around { align-content: space-around !important; }
+ .align-content#{$infix}-stretch { align-content: stretch !important; }
+
+ .align-self#{$infix}-auto { align-self: auto !important; }
+ .align-self#{$infix}-start { align-self: flex-start !important; }
+ .align-self#{$infix}-end { align-self: flex-end !important; }
+ .align-self#{$infix}-center { align-self: center !important; }
+ .align-self#{$infix}-baseline { align-self: baseline !important; }
+ .align-self#{$infix}-stretch { align-self: stretch !important; }
}
}
diff --git a/assets/stylesheets/bootstrap/utilities/_float.scss b/assets/stylesheets/bootstrap/utilities/_float.scss
index eea34bf..01655e9 100644
--- a/assets/stylesheets/bootstrap/utilities/_float.scss
+++ b/assets/stylesheets/bootstrap/utilities/_float.scss
@@ -1,13 +1,9 @@
@each $breakpoint in map-keys($grid-breakpoints) {
@include media-breakpoint-up($breakpoint) {
- .float-#{$breakpoint}-left {
- @include float-left();
- }
- .float-#{$breakpoint}-right {
- @include float-right();
- }
- .float-#{$breakpoint}-none {
- float: none !important;
- }
+ $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
+
+ .float#{$infix}-left { @include float-left; }
+ .float#{$infix}-right { @include float-right; }
+ .float#{$infix}-none { @include float-none; }
}
}
diff --git a/assets/stylesheets/bootstrap/utilities/_position.scss b/assets/stylesheets/bootstrap/utilities/_position.scss
new file mode 100644
index 0000000..2cf08bf
--- /dev/null
+++ b/assets/stylesheets/bootstrap/utilities/_position.scss
@@ -0,0 +1,23 @@
+// Positioning
+
+.fixed-top {
+ position: fixed;
+ top: 0;
+ right: 0;
+ left: 0;
+ z-index: $zindex-fixed;
+}
+
+.fixed-bottom {
+ position: fixed;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: $zindex-fixed;
+}
+
+.sticky-top {
+ position: sticky;
+ top: 0;
+ z-index: $zindex-sticky;
+}
diff --git a/assets/stylesheets/bootstrap/utilities/_sizing.scss b/assets/stylesheets/bootstrap/utilities/_sizing.scss
new file mode 100644
index 0000000..a7dc3e4
--- /dev/null
+++ b/assets/stylesheets/bootstrap/utilities/_sizing.scss
@@ -0,0 +1,10 @@
+// Width and height
+
+@each $prop, $abbrev in (width: w, height: h) {
+ @each $size, $length in $sizes {
+ .#{$abbrev}-#{$size} { #{$prop}: $length !important; }
+ }
+}
+
+.mw-100 { max-width: 100% !important; }
+.mh-100 { max-height: 100% !important; }
diff --git a/assets/stylesheets/bootstrap/utilities/_spacing.scss b/assets/stylesheets/bootstrap/utilities/_spacing.scss
index 99c98f8..6056e2b 100644
--- a/assets/stylesheets/bootstrap/utilities/_spacing.scss
+++ b/assets/stylesheets/bootstrap/utilities/_spacing.scss
@@ -1,44 +1,43 @@
-// Width and height
-
-.w-100 { width: 100% !important; }
-.h-100 { height: 100% !important; }
-
// Margin and Padding
-.mx-auto {
- margin-right: auto !important;
- margin-left: auto !important;
-}
-
-@each $prop, $abbrev in (margin: m, padding: p) {
- @each $size, $lengths in $spacers {
- $length-x: map-get($lengths, x);
- $length-y: map-get($lengths, y);
-
- .#{$abbrev}-#{$size} { #{$prop}: $length-y $length-x !important; } // a = All sides
- .#{$abbrev}t-#{$size} { #{$prop}-top: $length-y !important; }
- .#{$abbrev}r-#{$size} { #{$prop}-right: $length-x !important; }
- .#{$abbrev}b-#{$size} { #{$prop}-bottom: $length-y !important; }
- .#{$abbrev}l-#{$size} { #{$prop}-left: $length-x !important; }
+@each $breakpoint in map-keys($grid-breakpoints) {
+ @include media-breakpoint-up($breakpoint) {
+ $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
+
+ @each $prop, $abbrev in (margin: m, padding: p) {
+ @each $size, $lengths in $spacers {
+ $length-x: map-get($lengths, x);
+ $length-y: map-get($lengths, y);
+
+ .#{$abbrev}#{$infix}-#{$size} { #{$prop}: $length-y $length-x !important; }
+ .#{$abbrev}t#{$infix}-#{$size} { #{$prop}-top: $length-y !important; }
+ .#{$abbrev}r#{$infix}-#{$size} { #{$prop}-right: $length-x !important; }
+ .#{$abbrev}b#{$infix}-#{$size} { #{$prop}-bottom: $length-y !important; }
+ .#{$abbrev}l#{$infix}-#{$size} { #{$prop}-left: $length-x !important; }
+ .#{$abbrev}x#{$infix}-#{$size} {
+ #{$prop}-right: $length-x !important;
+ #{$prop}-left: $length-x !important;
+ }
+ .#{$abbrev}y#{$infix}-#{$size} {
+ #{$prop}-top: $length-y !important;
+ #{$prop}-bottom: $length-y !important;
+ }
+ }
+ }
- // Axes
- .#{$abbrev}x-#{$size} {
- #{$prop}-right: $length-x !important;
- #{$prop}-left: $length-x !important;
+ // Some special margin utils
+ .m#{$infix}-auto { margin: auto !important; }
+ .mt#{$infix}-auto { margin-top: auto !important; }
+ .mr#{$infix}-auto { margin-right: auto !important; }
+ .mb#{$infix}-auto { margin-bottom: auto !important; }
+ .ml#{$infix}-auto { margin-left: auto !important; }
+ .mx#{$infix}-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
}
- .#{$abbrev}y-#{$size} {
- #{$prop}-top: $length-y !important;
- #{$prop}-bottom: $length-y !important;
+ .my#{$infix}-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
}
}
}
-
-// Positioning
-
-.pos-f-t {
- position: fixed;
- top: 0;
- right: 0;
- left: 0;
- z-index: $zindex-navbar-fixed;
-}
diff --git a/assets/stylesheets/bootstrap/utilities/_text.scss b/assets/stylesheets/bootstrap/utilities/_text.scss
index b4468e9..4ac9053 100644
--- a/assets/stylesheets/bootstrap/utilities/_text.scss
+++ b/assets/stylesheets/bootstrap/utilities/_text.scss
@@ -4,31 +4,33 @@
// Alignment
-.text-justify { text-align: justify !important; }
-.text-nowrap { white-space: nowrap !important; }
-.text-truncate { @include text-truncate; }
+.text-justify { text-align: justify !important; }
+.text-nowrap { white-space: nowrap !important; }
+.text-truncate { @include text-truncate; }
// Responsive alignment
@each $breakpoint in map-keys($grid-breakpoints) {
@include media-breakpoint-up($breakpoint) {
- .text-#{$breakpoint}-left { text-align: left !important; }
- .text-#{$breakpoint}-right { text-align: right !important; }
- .text-#{$breakpoint}-center { text-align: center !important; }
+ $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
+
+ .text#{$infix}-left { text-align: left !important; }
+ .text#{$infix}-right { text-align: right !important; }
+ .text#{$infix}-center { text-align: center !important; }
}
}
// Transformation
-.text-lowercase { text-transform: lowercase !important; }
-.text-uppercase { text-transform: uppercase !important; }
-.text-capitalize { text-transform: capitalize !important; }
+.text-lowercase { text-transform: lowercase !important; }
+.text-uppercase { text-transform: uppercase !important; }
+.text-capitalize { text-transform: capitalize !important; }
// Weight and italics
-.font-weight-normal { font-weight: normal; }
-.font-weight-bold { font-weight: bold; }
-.font-italic { font-style: italic; }
+.font-weight-normal { font-weight: $font-weight-normal; }
+.font-weight-bold { font-weight: $font-weight-bold; }
+.font-italic { font-style: italic; }
// Contextual colors
diff --git a/assets/stylesheets/bootstrap/utilities/_visibility.scss b/assets/stylesheets/bootstrap/utilities/_visibility.scss
index cdb1428..fcedc9c 100644
--- a/assets/stylesheets/bootstrap/utilities/_visibility.scss
+++ b/assets/stylesheets/bootstrap/utilities/_visibility.scss
@@ -3,7 +3,7 @@
//
.invisible {
- visibility: hidden !important;
+ @include invisible();
}
// Responsive visibility utilities